ZGlmZiAtLWdpdCBhL2x6bWEvQW5kcm9pZC5icCBiL2x6bWEvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQ1NGJhCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEgQEAKK3N1YmRpcnMgPSBbIkMiXQpkaWZmIC0tZ2l0IGEvbHptYS9BbmRyb2lkLm1rIGIvbHptYS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGQ5ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChjYWxsIGZpcnN0LW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQorCmRpZmYgLS1naXQgYS9sem1hL0FzbS9hcm0vN3pDcmNPcHQuYXNtIGIvbHptYS9Bc20vYXJtLzd6Q3JjT3B0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDA4ZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9Bc20vYXJtLzd6Q3JjT3B0LmFzbQpAQCAtMCwwICsxLDEwMCBAQAorCUNPREUzMg0KKw0KKwlFWFBPUlQJfENyY1VwZGF0ZVQ0QDE2fA0KKw0KKwlBUkVBCXwudGV4dHwsIENPREUsIEFSTQ0KKw0KKwlNQUNSTw0KKwlDUkMzMl9TVEVQXzENCisNCisJbGRyYiAgICByNCwgW3IxXSwgIzENCisJc3VicyAgICByMiwgcjIsICMxDQorCWVvciAgICAgcjQsIHI0LCByMA0KKwlhbmQgICAgIHI0LCByNCwgIzB4RkYNCisJbGRyICAgICByNCwgW3IzLCArcjQsIGxzbCAjMl0NCisJZW9yICAgICByMCwgcjQsIHIwLCBsc3IgIzgNCisNCisJTUVORA0KKw0KKw0KKwlNQUNSTw0KKwlDUkMzMl9TVEVQXzQgJFNUUkVBTV9XT1JEDQorCQ0KKwllb3IgICAgIHI3LCByNywgcjgNCisJZW9yICAgICByNywgcjcsIHI5DQorCWVvciAgICAgcjAsIHIwLCByNw0KKwllb3IgICAgIHIwLCByMCwgJFNUUkVBTV9XT1JEDQorCWxkciAgICAgJFNUUkVBTV9XT1JELCBbcjFdLCAjNA0KKwkNCisJYW5kICAgICByNywgcjAsICMweEZGDQorCWFuZCAgICAgcjgsIHIwLCAjMHhGRjAwDQorCWFuZCAgICAgcjksIHIwLCAjMHhGRjAwMDANCisJYW5kICAgICByMCwgcjAsICMweEZGMDAwMDAwDQorDQorCWxkciAgICAgcjcsIFtyNiwgK3I3LCBsc2wgIzJdDQorCWxkciAgICAgcjgsIFtyNSwgK3I4LCBsc3IgIzZdDQorCWxkciAgICAgcjksIFtyNCwgK3I5LCBsc3IgIzE0XQ0KKwlsZHIgICAgIHIwLCBbcjMsICtyMCwgbHNyICMyMl0NCisJDQorCU1FTkQNCisNCisNCit8Q3JjVXBkYXRlVDRAMTZ8IFBST0MNCisNCisJc3RtZGIgICBzcCEsIHtyNC1yMTEsIGxyfQ0KKwljbXAgICAgIHIyLCAjMA0KKwliZXEgICAgIHwkZmlufA0KKw0KK3wkdjF8DQorCXRzdCAgICAgcjEsICM3DQorCWJlcSAgICAgfCR2MnwNCisJQ1JDMzJfU1RFUF8xDQorCWJuZSAgICAgfCR2MXwNCisNCit8JHYyfA0KKwljbXAgICAgIHIyLCAjMTYNCisJYmxvICAgICB8JHYzfA0KKw0KKwlsZHIgICAgIHIxMCwgW3IxXSwgIzQNCisJbGRyICAgICByMTEsIFtyMV0sICM0DQorDQorCWFkZCAgICAgcjQsIHIzLCAjMHg0MDAgDQorCWFkZCAgICAgcjUsIHIzLCAjMHg4MDANCisJYWRkICAgICByNiwgcjMsICMweEMwMA0KKw0KKwltb3YgICAgIHI3LCAjMA0KKwltb3YgICAgIHI4LCAjMA0KKwltb3YgICAgIHI5LCAjMA0KKw0KKwlzdWIgICAgIHIyLCByMiwgIzE2DQorDQorfCRsb29wfA0KKwk7IHBsZCAgICAgW3IxLCAjMHg0MF0NCisNCisJQ1JDMzJfU1RFUF80IHIxMA0KKwlDUkMzMl9TVEVQXzQgcjExDQorDQorCXN1YnMgICAgcjIsIHIyLCAjOA0KKwliaHMgICAgIHwkbG9vcHwNCisNCisJc3ViICAgICByMSwgcjEsICM4DQorCWFkZCAgICAgcjIsIHIyLCAjMTYNCisNCisJZW9yICAgICByNywgcjcsIHI4DQorCWVvciAgICAgcjcsIHI3LCByOQ0KKwllb3IgICAgIHIwLCByMCwgcjcNCisNCit8JHYzfA0KKwljbXAgICAgIHIyLCAjMA0KKwliZXEgICAgIHwkZmlufA0KKw0KK3wkdjR8DQorCUNSQzMyX1NURVBfMQ0KKwlibmUgICAgIHwkdjR8DQorDQorfCRmaW58DQorCWxkbWlhICAgc3AhLCB7cjQtcjExLCBwY30NCisNCit8Q3JjVXBkYXRlVDRAMTZ8IEVORFANCisNCisJRU5EDQpkaWZmIC0tZ2l0IGEvbHptYS9Bc20veDg2Lzd6QXNtLmFzbSBiL2x6bWEvQXNtL3g4Ni83ekFzbS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhOWUzZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQXNtL3g4Ni83ekFzbS5hc20KQEAgLTAsMCArMSwxMDUgQEAKKzsgN3pBc20uYXNtIC0tIEFTTSBtYWNyb3MNCis7IDIwMTItMTItMzAgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4NCisNCitNWV9BU01fU1RBUlQgbWFjcm8NCisgIGlmZGVmIHg2NA0KKyAgICAuY29kZQ0KKyAgZWxzZQ0KKyAgICAuMzg2DQorICAgIC5tb2RlbCBmbGF0DQorICAgIF9URVhUJDAwIFNFR01FTlQgUEFSQSBQVUJMSUMgJ0NPREUnDQorICBlbmRpZg0KK2VuZG0NCisNCitNWV9QUk9DIG1hY3JvIG5hbWU6cmVxLCBudW1QYXJhbXM6cmVxDQorICBhbGlnbiAxNg0KKyAgcHJvY19udW1QYXJhbXMgPSBudW1QYXJhbXMNCisgIGlmZGVmIHg2NA0KKyAgICBwcm9jX25hbWUgZXF1IG5hbWUNCisgIGVsc2UNCisgICAgcHJvY19uYW1lIGVxdSBAQ2F0U3RyKEAsbmFtZSxALCAlbnVtUGFyYW1zICogNCkNCisgIGVuZGlmDQorICBwcm9jX25hbWUgUFJPQw0KK2VuZG0NCisNCitNWV9FTkRQIG1hY3JvDQorICBpZmRlZiB4NjQNCisgICAgcmV0DQorICBlbHNlDQorICAgIGlmIHByb2NfbnVtUGFyYW1zIExUIDMNCisgICAgICByZXQNCisgICAgZWxzZQ0KKyAgICAgIHJldCAocHJvY19udW1QYXJhbXMgLSAyKSAqIDQNCisgICAgZW5kaWYNCisgIGVuZGlmDQorICBwcm9jX25hbWUgRU5EUA0KK2VuZG0NCisNCitpZmRlZiB4NjQNCisgIFJFR19TSVpFIGVxdSA4DQorICBSRUdfTE9HQVJfU0laRSBlcXUgMw0KK2Vsc2UNCisgIFJFR19TSVpFIGVxdSA0DQorICBSRUdfTE9HQVJfU0laRSBlcXUgMg0KK2VuZGlmDQorDQorICB4MCBlcXUgRUFYDQorICB4MSBlcXUgRUNYDQorICB4MiBlcXUgRURYDQorICB4MyBlcXUgRUJYDQorICB4NCBlcXUgRVNQDQorICB4NSBlcXUgRUJQDQorICB4NiBlcXUgRVNJDQorICB4NyBlcXUgRURJDQorDQorICB4MF9MIGVxdSBBTA0KKyAgeDFfTCBlcXUgQ0wNCisgIHgyX0wgZXF1IERMDQorICB4M19MIGVxdSBCTA0KKw0KKyAgeDBfSCBlcXUgQUgNCisgIHgxX0ggZXF1IENIDQorICB4Ml9IIGVxdSBESA0KKyAgeDNfSCBlcXUgQkgNCisNCitpZmRlZiB4NjQNCisgIHIwIGVxdSBSQVgNCisgIHIxIGVxdSBSQ1gNCisgIHIyIGVxdSBSRFgNCisgIHIzIGVxdSBSQlgNCisgIHI0IGVxdSBSU1ANCisgIHI1IGVxdSBSQlANCisgIHI2IGVxdSBSU0kNCisgIHI3IGVxdSBSREkNCisgIHg4IGVxdSByOGQNCisgIHg5IGVxdSByOWQNCisgIHgxMCBlcXUgcjEwZA0KKyAgeDExIGVxdSByMTFkDQorICB4MTIgZXF1IHIxMmQNCisgIHgxMyBlcXUgcjEzZA0KKyAgeDE0IGVxdSByMTRkDQorICB4MTUgZXF1IHIxNWQNCitlbHNlDQorICByMCBlcXUgeDANCisgIHIxIGVxdSB4MQ0KKyAgcjIgZXF1IHgyDQorICByMyBlcXUgeDMNCisgIHI0IGVxdSB4NA0KKyAgcjUgZXF1IHg1DQorICByNiBlcXUgeDYNCisgIHI3IGVxdSB4Nw0KK2VuZGlmDQorDQorTVlfUFVTSF80X1JFR1MgbWFjcm8NCisgICAgcHVzaCAgICByMw0KKyAgICBwdXNoICAgIHI1DQorICAgIHB1c2ggICAgcjYNCisgICAgcHVzaCAgICByNw0KK2VuZG0NCisNCitNWV9QT1BfNF9SRUdTIG1hY3JvDQorICAgIHBvcCAgICAgcjcNCisgICAgcG9wICAgICByNg0KKyAgICBwb3AgICAgIHI1DQorICAgIHBvcCAgICAgcjMNCitlbmRtDQpkaWZmIC0tZ2l0IGEvbHptYS9Bc20veDg2Lzd6Q3JjT3B0LmFzbSBiL2x6bWEvQXNtL3g4Ni83ekNyY09wdC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlNTE3MQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQXNtL3g4Ni83ekNyY09wdC5hc20KQEAgLTAsMCArMSwxNDcgQEAKKzsgN3pDcmNPcHQuYXNtIC0tIENSQzMyIGNhbGN1bGF0aW9uIDogb3B0aW1pemVkIHZlcnNpb24NCis7IDIwMDktMTItMTIgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4NCisNCitpbmNsdWRlIDd6QXNtLmFzbQ0KKw0KK01ZX0FTTV9TVEFSVA0KKw0KK3JEICAgZXF1ICByMg0KK3JOICAgZXF1ICByNw0KKw0KK2lmZGVmIHg2NA0KKyAgICBudW1fVkFSICAgICBlcXUgcjgNCisgICAgdGFibGVfVkFSICAgZXF1IHI5DQorZWxzZQ0KKyAgICBkYXRhX3NpemUgICBlcXUgKFJFR19TSVpFICogNSkNCisgICAgY3JjX3RhYmxlICAgZXF1IChSRUdfU0laRSArIGRhdGFfc2l6ZSkNCisgICAgbnVtX1ZBUiAgICAgZXF1IFtyNCArIGRhdGFfc2l6ZV0NCisgICAgdGFibGVfVkFSICAgZXF1IFtyNCArIGNyY190YWJsZV0NCitlbmRpZg0KKw0KK1NSQ0RBVCAgZXF1ICByTiArIHJEICsgNCAqDQorDQorQ1JDIG1hY3JvIG9wOnJlcSwgZGVzdDpyZXEsIHNyYzpyZXEsIHQ6cmVxDQorICAgIG9wICAgICAgZGVzdCwgRFdPUkQgUFRSIFtyNSArIHNyYyAqIDQgKyAwNDAwaCAqIHRdDQorZW5kbQ0KKw0KK0NSQ19YT1IgbWFjcm8gZGVzdDpyZXEsIHNyYzpyZXEsIHQ6cmVxDQorICAgIENSQyB4b3IsIGRlc3QsIHNyYywgdA0KK2VuZG0NCisNCitDUkNfTU9WIG1hY3JvIGRlc3Q6cmVxLCBzcmM6cmVxLCB0OnJlcQ0KKyAgICBDUkMgbW92LCBkZXN0LCBzcmMsIHQNCitlbmRtDQorDQorQ1JDMWIgbWFjcm8NCisgICAgbW92enggICB4NiwgQllURSBQVFIgW3JEXQ0KKyAgICBpbmMgICAgIHJEDQorICAgIG1vdnp4ICAgeDMsIHgwX0wNCisgICAgeG9yICAgICB4NiwgeDMNCisgICAgc2hyICAgICB4MCwgOA0KKyAgICBDUkMgICAgIHhvciwgeDAsIHI2LCAwDQorICAgIGRlYyAgICAgck4NCitlbmRtDQorDQorTVlfUFJPTE9HIG1hY3JvIGNyY19lbmQ6cmVxDQorICAgIE1ZX1BVU0hfNF9SRUdTDQorICAgIA0KKyAgICBtb3YgICAgIHgwLCB4MQ0KKyAgICBtb3YgICAgIHJOLCBudW1fVkFSDQorICAgIG1vdiAgICAgcjUsIHRhYmxlX1ZBUg0KKyAgICB0ZXN0ICAgIHJOLCByTg0KKyAgICBqeiAgICAgIGNyY19lbmQNCisgIEBAOg0KKyAgICB0ZXN0ICAgIHJELCA3DQorICAgIGp6ICAgICAgQEYNCisgICAgQ1JDMWINCisgICAgam56ICAgICBAQg0KKyAgQEA6DQorICAgIGNtcCAgICAgck4sIDE2DQorICAgIGpiICAgICAgY3JjX2VuZA0KKyAgICBhZGQgICAgIHJOLCByRA0KKyAgICBtb3YgICAgIG51bV9WQVIsIHJODQorICAgIHN1YiAgICAgck4sIDgNCisgICAgYW5kICAgICByTiwgTk9UIDcNCisgICAgc3ViICAgICByRCwgck4NCisgICAgeG9yICAgICB4MCwgW1NSQ0RBVCAwXQ0KK2VuZG0NCisNCitNWV9FUElMT0cgbWFjcm8gY3JjX2VuZDpyZXENCisgICAgeG9yICAgICB4MCwgW1NSQ0RBVCAwXQ0KKyAgICBtb3YgICAgIHJELCByTg0KKyAgICBtb3YgICAgIHJOLCBudW1fVkFSDQorICAgIHN1YiAgICAgck4sIHJEDQorICBjcmNfZW5kOg0KKyAgICB0ZXN0ICAgIHJOLCByTg0KKyAgICBqeiAgICAgIEBGDQorICAgIENSQzFiDQorICAgIGptcCAgICAgY3JjX2VuZA0KKyAgQEA6DQorICAgIE1ZX1BPUF80X1JFR1MNCitlbmRtDQorDQorTVlfUFJPQyBDcmNVcGRhdGVUOCwgNA0KKyAgICBNWV9QUk9MT0cgY3JjX2VuZF84DQorICAgIG1vdiAgICAgeDEsIFtTUkNEQVQgMV0NCisgICAgYWxpZ24gMTYNCisgIG1haW5fbG9vcF84Og0KKyAgICBtb3YgICAgIHg2LCBbU1JDREFUIDJdDQorICAgIG1vdnp4ICAgeDMsIHgxX0wNCisgICAgQ1JDX1hPUiB4NiwgcjMsIDMNCisgICAgbW92enggICB4MywgeDFfSA0KKyAgICBDUkNfWE9SIHg2LCByMywgMg0KKyAgICBzaHIgICAgIHgxLCAxNg0KKyAgICBtb3Z6eCAgIHgzLCB4MV9MDQorICAgIG1vdnp4ICAgeDEsIHgxX0gNCisgICAgQ1JDX1hPUiB4NiwgcjMsIDENCisgICAgbW92enggICB4MywgeDBfTA0KKyAgICBDUkNfWE9SIHg2LCByMSwgMA0KKw0KKyAgICBtb3YgICAgIHgxLCBbU1JDREFUIDNdDQorICAgIENSQ19YT1IgeDYsIHIzLCA3DQorICAgIG1vdnp4ICAgeDMsIHgwX0gNCisgICAgc2hyICAgICB4MCwgMTYNCisgICAgQ1JDX1hPUiB4NiwgcjMsIDYNCisgICAgbW92enggICB4MywgeDBfTA0KKyAgICBDUkNfWE9SIHg2LCByMywgNQ0KKyAgICBtb3Z6eCAgIHgzLCB4MF9IDQorICAgIENSQ19NT1YgeDAsIHIzLCA0DQorICAgIHhvciAgICAgeDAsIHg2DQorICAgIGFkZCAgICAgckQsIDgNCisgICAgam56ICAgICBtYWluX2xvb3BfOA0KKw0KKyAgICBNWV9FUElMT0cgY3JjX2VuZF84DQorTVlfRU5EUA0KKw0KK01ZX1BST0MgQ3JjVXBkYXRlVDQsIDQNCisgICAgTVlfUFJPTE9HIGNyY19lbmRfNA0KKyAgICBhbGlnbiAxNg0KKyAgbWFpbl9sb29wXzQ6DQorICAgIG1vdnp4ICAgeDEsIHgwX0wNCisgICAgbW92enggICB4MywgeDBfSA0KKyAgICBzaHIgICAgIHgwLCAxNg0KKyAgICBtb3Z6eCAgIHg2LCB4MF9IDQorICAgIGFuZCAgICAgeDAsIDBGRmgNCisgICAgQ1JDX01PViB4MSwgcjEsIDMNCisgICAgeG9yICAgICB4MSwgW1NSQ0RBVCAxXQ0KKyAgICBDUkNfWE9SIHgxLCByMywgMg0KKyAgICBDUkNfWE9SIHgxLCByNiwgMA0KKyAgICBDUkNfWE9SIHgxLCByMCwgMQ0KKyANCisgICAgbW92enggICB4MCwgeDFfTA0KKyAgICBtb3Z6eCAgIHgzLCB4MV9IDQorICAgIHNociAgICAgeDEsIDE2DQorICAgIG1vdnp4ICAgeDYsIHgxX0gNCisgICAgYW5kICAgICB4MSwgMEZGaA0KKyAgICBDUkNfTU9WIHgwLCByMCwgMw0KKyAgICB4b3IgICAgIHgwLCBbU1JDREFUIDJdDQorICAgIENSQ19YT1IgeDAsIHIzLCAyDQorICAgIENSQ19YT1IgeDAsIHI2LCAwDQorICAgIENSQ19YT1IgeDAsIHIxLCAxDQorICAgIGFkZCAgICAgckQsIDgNCisgICAgam56ICAgICBtYWluX2xvb3BfNA0KKw0KKyAgICBNWV9FUElMT0cgY3JjX2VuZF80DQorTVlfRU5EUA0KKw0KK2VuZA0KZGlmZiAtLWdpdCBhL2x6bWEvQXNtL3g4Ni9BZXNPcHQuYXNtIGIvbHptYS9Bc20veDg2L0Flc09wdC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyZTQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQXNtL3g4Ni9BZXNPcHQuYXNtCkBAIC0wLDAgKzEsMjM3IEBACis7IEFlc09wdC5hc20gLS0gSW50ZWwncyBBRVMuDQorOyAyMDA5LTEyLTEyIDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluDQorDQoraW5jbHVkZSA3ekFzbS5hc20NCisNCitNWV9BU01fU1RBUlQNCisNCitpZm5kZWYgeDY0DQorICAgIC54bW0NCitlbmRpZg0KKw0KK2lmZGVmIHg2NA0KKyAgICBudW0gICAgIGVxdSByOA0KK2Vsc2UNCisgICAgbnVtICAgICBlcXUgW3I0ICsgUkVHX1NJWkUgKiA0XQ0KK2VuZGlmDQorDQorckQgZXF1IHIyDQorck4gZXF1IHIwDQorDQorTVlfUFJPTE9HIG1hY3JvIHJlZzpyZXENCisgICAgaWZkZWYgeDY0DQorICAgIG1vdmRxYSAgW3I0ICsgOF0sIHhtbTYNCisgICAgbW92ZHFhICBbcjQgKyA4ICsgMTZdLCB4bW03DQorICAgIGVuZGlmDQorDQorICAgIHB1c2ggICAgcjMNCisgICAgcHVzaCAgICByNQ0KKyAgICBwdXNoICAgIHI2DQorDQorICAgIG1vdiAgICAgck4sIG51bQ0KKyAgICBtb3YgICAgIHg2LCBbcjEgKyAxNl0NCisgICAgc2hsICAgICB4NiwgNQ0KKw0KKyAgICBtb3ZkcWEgIHJlZywgW3IxXQ0KKyAgICBhZGQgICAgIHIxLCAzMg0KK2VuZG0NCisNCitNWV9FUElMT0cgbWFjcm8NCisgICAgcG9wICAgICByNg0KKyAgICBwb3AgICAgIHI1DQorICAgIHBvcCAgICAgcjMNCisNCisgICAgaWZkZWYgeDY0DQorICAgIG1vdmRxYSAgeG1tNiwgW3I0ICsgOF0NCisgICAgbW92ZHFhICB4bW03LCBbcjQgKyA4ICsgMTZdDQorICAgIGVuZGlmDQorDQorICAgIE1ZX0VORFANCitlbmRtDQorDQord2F5cyBlcXUgNA0KK3dheXMxNiBlcXUgKHdheXMgKiAxNikNCisNCitPUF9XIG1hY3JvIG9wLCBvcDINCisgICAgaSA9IDANCisgICAgcmVwdCB3YXlzDQorICAgIG9wIEBDYXRTdHIoeG1tLCVpKSwgb3AyDQorICAgIGkgPSBpICsgMQ0KKyAgICBlbmRtDQorZW5kbQ0KKw0KK0xPQURfT1AgbWFjcm8gb3A6cmVxLCBvZmZzOnJlcQ0KKyAgICBvcCAgICAgIHhtbTAsIFtyMSArIHIzIG9mZnNdDQorZW5kbQ0KKyAgDQorTE9BRF9PUF9XIG1hY3JvIG9wOnJlcSwgb2ZmczpyZXENCisgICAgbW92ZHFhICB4bW03LCBbcjEgKyByMyBvZmZzXQ0KKyAgICBPUF9XICAgIG9wLCB4bW03DQorZW5kbQ0KKw0KKw0KKzsgLS0tLS0tLS0tLSBBRVMtQ0JDIERlY29kZSAtLS0tLS0tLS0tDQorDQorQ0JDX0RFQ19VUERBVEUgbWFjcm8gcmVnLCBvZmZzDQorICAgIHB4b3IgICAgcmVnLCB4bW02DQorICAgIG1vdmRxYSAgeG1tNiwgW3JEICsgb2Zmc10NCisgICAgbW92ZHFhICBbckQgKyBvZmZzXSwgcmVnDQorZW5kbQ0KKw0KK0RFQ09ERSBtYWNybyBvcDpyZXENCisgICAgb3AgICAgICBhZXNkZWMsICsxNg0KKyAgQEA6DQorICAgIG9wICAgICAgYWVzZGVjLCArMA0KKyAgICBvcCAgICAgIGFlc2RlYywgLTE2DQorICAgIHN1YiAgICAgeDMsIDMyDQorICAgIGpueiAgICAgQEINCisgICAgb3AgICAgICBhZXNkZWNsYXN0LCArMA0KK2VuZG0NCisNCitNWV9QUk9DIEFlc0NiY19EZWNvZGVfSW50ZWwsIDMNCisgICAgTVlfUFJPTE9HIHhtbTYNCisNCisgICAgc3ViICAgICB4NiwgMzINCisNCisgICAgam1wICAgICBjaGVjazINCisNCisgIGFsaWduIDE2DQorICBuZXh0QmxvY2tzMjoNCisgICAgbW92ICAgICB4MywgeDYNCisgICAgT1BfVyAgICBtb3ZkcWEsIFtyRCArIGkgKiAxNl0NCisgICAgTE9BRF9PUF9XICBweG9yLCArMzINCisgICAgREVDT0RFICBMT0FEX09QX1cNCisgICAgT1BfVyAgICBDQkNfREVDX1VQREFURSwgaSAqIDE2DQorICAgIGFkZCAgICAgckQsIHdheXMxNg0KKyAgY2hlY2syOg0KKyAgICBzdWIgICAgIHJOLCB3YXlzDQorICAgIGpuYyAgICAgbmV4dEJsb2NrczINCisNCisgICAgYWRkICAgICByTiwgd2F5cw0KKyAgICBqbXAgICAgIGNoZWNrDQorDQorICBuZXh0QmxvY2s6DQorICAgIG1vdiAgICAgeDMsIHg2DQorICAgIG1vdmRxYSAgeG1tMSwgW3JEXQ0KKyAgICBMT0FEX09QIG1vdmRxYSwgKzMyDQorICAgIHB4b3IgICAgeG1tMCwgeG1tMQ0KKyAgICBERUNPREUgIExPQURfT1ANCisgICAgcHhvciAgICB4bW0wLCB4bW02DQorICAgIG1vdmRxYSAgW3JEXSwgeG1tMA0KKyAgICBtb3ZkcWEgIHhtbTYsIHhtbTENCisgICAgYWRkICAgICByRCwgMTYNCisgIGNoZWNrOg0KKyAgICBzdWIgICAgIHJOLCAxDQorICAgIGpuYyAgICAgbmV4dEJsb2NrDQorDQorICAgIG1vdmRxYSAgW3IxIC0gMzJdLCB4bW02DQorICAgIE1ZX0VQSUxPRw0KKw0KKw0KKzsgLS0tLS0tLS0tLSBBRVMtQ0JDIEVuY29kZSAtLS0tLS0tLS0tDQorDQorRU5DT0RFIG1hY3JvIG9wOnJlcQ0KKyAgICBvcCAgICAgIGFlc2VuYywgLTE2DQorICBAQDoNCisgICAgb3AgICAgICBhZXNlbmMsICswDQorICAgIG9wICAgICAgYWVzZW5jLCArMTYNCisgICAgYWRkICAgICByMywgMzINCisgICAgam56ICAgICBAQg0KKyAgICBvcCAgICAgIGFlc2VuY2xhc3QsICswDQorZW5kbQ0KKw0KK01ZX1BST0MgQWVzQ2JjX0VuY29kZV9JbnRlbCwgMw0KKyAgICBNWV9QUk9MT0cgeG1tMA0KKw0KKyAgICBhZGQgICAgIHIxLCByNg0KKyAgICBuZWcgICAgIHI2DQorICAgIGFkZCAgICAgcjYsIDMyDQorDQorICAgIGptcCAgICAgY2hlY2tfZQ0KKw0KKyAgYWxpZ24gMTYNCisgIG5leHRCbG9ja19lOg0KKyAgICBtb3YgICAgIHIzLCByNg0KKyAgICBweG9yICAgIHhtbTAsIFtyRF0NCisgICAgcHhvciAgICB4bW0wLCBbcjEgKyByMyAtIDMyXQ0KKyAgICBFTkNPREUgIExPQURfT1ANCisgICAgbW92ZHFhICBbckRdLCB4bW0wDQorICAgIGFkZCAgICAgckQsIDE2DQorICBjaGVja19lOg0KKyAgICBzdWIgICAgIHJOLCAxDQorICAgIGpuYyAgICAgbmV4dEJsb2NrX2UNCisNCisgICAgbW92ZHFhICBbcjEgKyByNiAtIDY0XSwgeG1tMA0KKyAgICBNWV9FUElMT0cNCisNCisNCis7IC0tLS0tLS0tLS0gQUVTLUNUUiAtLS0tLS0tLS0tDQorDQorWE9SX1VQRF8xIG1hY3JvIHJlZywgb2Zmcw0KKyAgICBweG9yICAgIHJlZywgW3JEICsgb2Zmc10NCitlbmRtDQorDQorWE9SX1VQRF8yIG1hY3JvIHJlZywgb2Zmcw0KKyAgICBtb3ZkcWEgIFtyRCArIG9mZnNdLCByZWcNCitlbmRtDQorDQorTVlfUFJPQyBBZXNDdHJfQ29kZV9JbnRlbCwgMw0KKyAgICBNWV9QUk9MT0cgeG1tNg0KKw0KKyAgICBtb3YgICAgIHI1LCByNA0KKyAgICBzaHIgICAgIHI1LCA0DQorICAgIGRlYyAgICAgcjUNCisgICAgc2hsICAgICByNSwgNA0KKw0KKyAgICBtb3YgICAgIERXT1JEIFBUUiBbcjVdLCAxDQorICAgIG1vdiAgICAgRFdPUkQgUFRSIFtyNSArIDRdLCAwDQorICAgIG1vdiAgICAgRFdPUkQgUFRSIFtyNSArIDhdLCAwDQorICAgIG1vdiAgICAgRFdPUkQgUFRSIFtyNSArIDEyXSwgMA0KKyAgICANCisgICAgYWRkICAgICByMSwgcjYNCisgICAgbmVnICAgICByNg0KKyAgICBhZGQgICAgIHI2LCAzMg0KKw0KKyAgICBqbXAgICAgIGNoZWNrMl9jDQorDQorICBhbGlnbiAxNg0KKyAgbmV4dEJsb2NrczJfYzoNCisgICAgbW92ZHFhICB4bW03LCBbcjVdDQorDQorICAgIGkgPSAwDQorICAgIHJlcHQgd2F5cw0KKyAgICBwYWRkcSAgIHhtbTYsIHhtbTcNCisgICAgbW92ZHFhICBAQ2F0U3RyKHhtbSwlaSksIHhtbTYNCisgICAgaSA9IGkgKyAxDQorICAgIGVuZG0NCisNCisgICAgbW92ICAgICByMywgcjYNCisgICAgTE9BRF9PUF9XICBweG9yLCAtMzINCisgICAgRU5DT0RFICBMT0FEX09QX1cNCisgICAgT1BfVyAgICBYT1JfVVBEXzEsIGkgKiAxNg0KKyAgICBPUF9XICAgIFhPUl9VUERfMiwgaSAqIDE2DQorICAgIGFkZCAgICAgckQsIHdheXMxNg0KKyAgY2hlY2syX2M6DQorICAgIHN1YiAgICAgck4sIHdheXMNCisgICAgam5jICAgICBuZXh0QmxvY2tzMl9jDQorDQorICAgIGFkZCAgICAgck4sIHdheXMNCisgICAgam1wICAgICBjaGVja19jDQorDQorICBuZXh0QmxvY2tfYzoNCisgICAgcGFkZHEgICB4bW02LCBbcjVdDQorICAgIG1vdiAgICAgcjMsIHI2DQorICAgIG1vdmRxYSAgeG1tMCwgW3IxICsgcjMgLSAzMl0NCisgICAgcHhvciAgICB4bW0wLCB4bW02DQorICAgIEVOQ09ERSAgTE9BRF9PUA0KKyAgICBYT1JfVVBEXzEgeG1tMCwgMA0KKyAgICBYT1JfVVBEXzIgeG1tMCwgMA0KKyAgICBhZGQgICAgIHJELCAxNg0KKyAgY2hlY2tfYzoNCisgICAgc3ViICAgICByTiwgMQ0KKyAgICBqbmMgICAgIG5leHRCbG9ja19jDQorDQorICAgIG1vdmRxYSAgW3IxICsgcjYgLSA2NF0sIHhtbTYNCisgICAgTVlfRVBJTE9HDQorDQorZW5kDQpkaWZmIC0tZ2l0IGEvbHptYS9Bc20veDg2L1h6Q3JjNjRPcHQuYXNtIGIvbHptYS9Bc20veDg2L1h6Q3JjNjRPcHQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNmQ0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0FzbS94ODYvWHpDcmM2NE9wdC5hc20KQEAgLTAsMCArMSwyMDUgQEAKKzsgWHpDcmM2NE9wdC5hc20gLS0gQ1JDNjQgY2FsY3VsYXRpb24gOiBvcHRpbWl6ZWQgdmVyc2lvbg0KKzsgMjAxMS0wNi0yOCA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbg0KKw0KK2luY2x1ZGUgN3pBc20uYXNtDQorDQorTVlfQVNNX1NUQVJUDQorDQoraWZkZWYgeDY0DQorDQorICAgIHJEICAgZXF1ICByOQ0KKyAgICByTiAgIGVxdSAgcjEwDQorDQorICAgIG51bV9WQVIgICAgIGVxdSAgcjgNCisgICAgdGFibGVfVkFSICAgZXF1ICByOQ0KKw0KKyAgICBTUkNEQVQgIGVxdSAgck4gKyByRA0KKw0KK0NSQ19YT1IgbWFjcm8gZGVzdDpyZXEsIHNyYzpyZXEsIHQ6cmVxDQorICAgIHhvciAgICAgZGVzdCwgUVdPUkQgUFRSIFtyNSArIHNyYyAqIDggKyAwODAwaCAqIHRdDQorZW5kbQ0KKw0KK0NSQzFiIG1hY3JvDQorICAgIG1vdnp4ICAgeDYsIEJZVEUgUFRSIFtyRF0NCisgICAgaW5jICAgICByRA0KKyAgICBtb3Z6eCAgIHgzLCB4MF9MDQorICAgIHhvciAgICAgeDYsIHgzDQorICAgIHNociAgICAgcjAsIDgNCisgICAgQ1JDX1hPUiByMCwgcjYsIDANCisgICAgZGVjICAgICByTg0KK2VuZG0NCisNCitNWV9QUk9MT0cgbWFjcm8gY3JjX2VuZDpyZXENCisgICAgTVlfUFVTSF80X1JFR1MNCisgICAgDQorICAgIG1vdiAgICAgcjAsIHIxDQorICAgIG1vdiAgICAgck4sIG51bV9WQVINCisgICAgbW92ICAgICByNSwgdGFibGVfVkFSDQorICAgIG1vdiAgICAgckQsIHIyDQorICAgIHRlc3QgICAgck4sIHJODQorICAgIGp6ICAgICAgY3JjX2VuZA0KKyAgQEA6DQorICAgIHRlc3QgICAgckQsIDMNCisgICAganogICAgICBARg0KKyAgICBDUkMxYg0KKyAgICBqbnogICAgIEBCDQorICBAQDoNCisgICAgY21wICAgICByTiwgOA0KKyAgICBqYiAgICAgIGNyY19lbmQNCisgICAgYWRkICAgICByTiwgckQNCisgICAgbW92ICAgICBudW1fVkFSLCByTg0KKyAgICBzdWIgICAgIHJOLCA0DQorICAgIGFuZCAgICAgck4sIE5PVCAzDQorICAgIHN1YiAgICAgckQsIHJODQorICAgIG1vdiAgICAgeDEsIFtTUkNEQVRdDQorICAgIHhvciAgICAgcjAsIHIxDQorICAgIGFkZCAgICAgck4sIDQNCitlbmRtDQorDQorTVlfRVBJTE9HIG1hY3JvIGNyY19lbmQ6cmVxDQorICAgIHN1YiAgICAgck4sIDQNCisgICAgbW92ICAgICB4MSwgW1NSQ0RBVF0NCisgICAgeG9yICAgICByMCwgcjENCisgICAgbW92ICAgICByRCwgck4NCisgICAgbW92ICAgICByTiwgbnVtX1ZBUg0KKyAgICBzdWIgICAgIHJOLCByRA0KKyAgY3JjX2VuZDoNCisgICAgdGVzdCAgICByTiwgck4NCisgICAganogICAgICBARg0KKyAgICBDUkMxYg0KKyAgICBqbXAgICAgIGNyY19lbmQNCisgIEBAOg0KKyAgICBNWV9QT1BfNF9SRUdTDQorZW5kbQ0KKw0KK01ZX1BST0MgWHpDcmM2NFVwZGF0ZVQ0LCA0DQorICAgIE1ZX1BST0xPRyBjcmNfZW5kXzQNCisgICAgYWxpZ24gMTYNCisgIG1haW5fbG9vcF80Og0KKyAgICBtb3YgICAgIHgxLCBbU1JDREFUXQ0KKyAgICBtb3Z6eCAgIHgyLCB4MF9MDQorICAgIG1vdnp4ICAgeDMsIHgwX0gNCisgICAgc2hyICAgICByMCwgMTYNCisgICAgbW92enggICB4NiwgeDBfTA0KKyAgICBtb3Z6eCAgIHg3LCB4MF9IDQorICAgIHNociAgICAgcjAsIDE2DQorICAgIENSQ19YT1IgcjEsIHIyLCAzDQorICAgIENSQ19YT1IgcjAsIHIzLCAyDQorICAgIENSQ19YT1IgcjEsIHI2LCAxDQorICAgIENSQ19YT1IgcjAsIHI3LCAwDQorICAgIHhvciAgICAgcjAsIHIxDQorDQorICAgIGFkZCAgICAgckQsIDQNCisgICAgam56ICAgICBtYWluX2xvb3BfNA0KKw0KKyAgICBNWV9FUElMT0cgY3JjX2VuZF80DQorTVlfRU5EUA0KKw0KK2Vsc2UNCisNCisgICAgckQgICBlcXUgIHIxDQorICAgIHJOICAgZXF1ICByNw0KKw0KKyAgICBjcmNfdmFsICAgICBlcXUgKFJFR19TSVpFICogNSkNCisgICAgY3JjX3RhYmxlICAgZXF1ICg4ICsgY3JjX3ZhbCkNCisgICAgdGFibGVfVkFSICAgZXF1IFtyNCArIGNyY190YWJsZV0NCisgICAgbnVtX1ZBUiAgICAgZXF1IHRhYmxlX1ZBUg0KKw0KKw0KKyAgICBTUkNEQVQgIGVxdSAgck4gKyByRA0KKw0KK0NSQyBtYWNybyBvcDA6cmVxLCBvcDE6cmVxLCBkZXN0MDpyZXEsIGRlc3QxOnJlcSwgc3JjOnJlcSwgdDpyZXENCisgICAgb3AwICAgICBkZXN0MCwgRFdPUkQgUFRSIFtyNSArIHNyYyAqIDggKyAwODAwaCAqIHRdDQorICAgIG9wMSAgICAgZGVzdDEsIERXT1JEIFBUUiBbcjUgKyBzcmMgKiA4ICsgMDgwMGggKiB0ICsgNF0NCitlbmRtDQorDQorQ1JDX1hPUiBtYWNybyBkZXN0MDpyZXEsIGRlc3QxOnJlcSwgc3JjOnJlcSwgdDpyZXENCisgICAgQ1JDIHhvciwgeG9yLCBkZXN0MCwgZGVzdDEsIHNyYywgdA0KK2VuZG0NCisNCisNCitDUkMxYiBtYWNybw0KKyAgICBtb3Z6eCAgIHg2LCBCWVRFIFBUUiBbckRdDQorICAgIGluYyAgICAgckQNCisgICAgbW92enggICB4MywgeDBfTA0KKyAgICB4b3IgICAgIHg2LCB4Mw0KKyAgICBzaHJkICAgIHIwLCByMiwgOA0KKyAgICBzaHIgICAgIHIyLCA4DQorICAgIENSQ19YT1IgcjAsIHIyLCByNiwgMA0KKyAgICBkZWMgICAgIHJODQorZW5kbQ0KKw0KK01ZX1BST0xPRyBtYWNybyBjcmNfZW5kOnJlcQ0KKyAgICBNWV9QVVNIXzRfUkVHUw0KKyAgICANCisgICAgbW92ICAgICByTiwgcjINCisNCisgICAgbW92ICAgICB4MCwgW3I0ICsgY3JjX3ZhbF0NCisgICAgbW92ICAgICB4MiwgW3I0ICsgY3JjX3ZhbCArIDRdDQorICAgIG1vdiAgICAgcjUsIHRhYmxlX1ZBUg0KKyAgICB0ZXN0ICAgIHJOLCByTg0KKyAgICBqeiAgICAgIGNyY19lbmQNCisgIEBAOg0KKyAgICB0ZXN0ICAgIHJELCAzDQorICAgIGp6ICAgICAgQEYNCisgICAgQ1JDMWINCisgICAgam56ICAgICBAQg0KKyAgQEA6DQorICAgIGNtcCAgICAgck4sIDgNCisgICAgamIgICAgICBjcmNfZW5kDQorICAgIGFkZCAgICAgck4sIHJEDQorDQorICAgIG1vdiAgICAgbnVtX1ZBUiwgck4NCisNCisgICAgc3ViICAgICByTiwgNA0KKyAgICBhbmQgICAgIHJOLCBOT1QgMw0KKyAgICBzdWIgICAgIHJELCByTg0KKyAgICB4b3IgICAgIHIwLCBbU1JDREFUXQ0KKyAgICBhZGQgICAgIHJOLCA0DQorZW5kbQ0KKw0KK01ZX0VQSUxPRyBtYWNybyBjcmNfZW5kOnJlcQ0KKyAgICBzdWIgICAgIHJOLCA0DQorICAgIHhvciAgICAgcjAsIFtTUkNEQVRdDQorDQorICAgIG1vdiAgICAgckQsIHJODQorICAgIG1vdiAgICAgck4sIG51bV9WQVINCisgICAgc3ViICAgICByTiwgckQNCisgIGNyY19lbmQ6DQorICAgIHRlc3QgICAgck4sIHJODQorICAgIGp6ICAgICAgQEYNCisgICAgQ1JDMWINCisgICAgam1wICAgICBjcmNfZW5kDQorICBAQDoNCisgICAgTVlfUE9QXzRfUkVHUw0KK2VuZG0NCisNCitNWV9QUk9DIFh6Q3JjNjRVcGRhdGVUNCwgNQ0KKyAgICBNWV9QUk9MT0cgY3JjX2VuZF80DQorICAgIG1vdnp4ICAgeDYsIHgwX0wNCisgICAgYWxpZ24gMTYNCisgIG1haW5fbG9vcF80Og0KKyAgICBtb3YgICAgIHIzLCBbU1JDREFUXQ0KKyAgICB4b3IgICAgIHIzLCByMg0KKw0KKyAgICBDUkMgeG9yLCBtb3YsIHIzLCByMiwgcjYsIDMNCisgICAgbW92enggICB4NiwgeDBfSA0KKyAgICBzaHIgICAgIHIwLCAxNg0KKyAgICBDUkNfWE9SIHIzLCByMiwgcjYsIDINCisNCisgICAgbW92enggICB4NiwgeDBfTA0KKyAgICBtb3Z6eCAgIHgwLCB4MF9IDQorICAgIENSQ19YT1IgcjMsIHIyLCByNiwgMQ0KKyAgICBDUkNfWE9SIHIzLCByMiwgcjAsIDANCisgICAgbW92enggICB4NiwgeDNfTA0KKyAgICBtb3YgICAgIHIwLCByMw0KKw0KKyAgICBhZGQgICAgIHJELCA0DQorICAgIGpueiAgICAgbWFpbl9sb29wXzQNCisNCisgICAgTVlfRVBJTE9HIGNyY19lbmRfNA0KK01ZX0VORFANCisNCitlbmRpZg0KKw0KK2VuZA0KZGlmZiAtLWdpdCBhL2x6bWEvQy83ei5oIGIvbHptYS9DLzd6LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyNWY1MwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy83ei5oCkBAIC0wLDAgKzEsMjE2IEBACisvKiA3ei5oIC0tIDd6IGludGVyZmFjZQ0KKzIwMTMtMDEtMTggOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaWZuZGVmIF9fN1pfSA0KKyNkZWZpbmUgX183Wl9IDQorDQorI2luY2x1ZGUgIjd6VHlwZXMuaCINCisNCitFWFRFUk5fQ19CRUdJTg0KKw0KKyNkZWZpbmUgazd6U3RhcnRIZWFkZXJTaXplIDB4MjANCisjZGVmaW5lIGs3elNpZ25hdHVyZVNpemUgNg0KKw0KK2V4dGVybiBCeXRlIGs3elNpZ25hdHVyZVtrN3pTaWduYXR1cmVTaXplXTsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIGNvbnN0IEJ5dGUgKkRhdGE7DQorICBzaXplX3QgU2l6ZTsNCit9IENTekRhdGE7DQorDQorLyogQ1N6Q29kZXJJbmZvICYgQ1N6Rm9sZGVyIHN1cHBvcnQgb25seSBkZWZhdWx0IG1ldGhvZHMgKi8NCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIHNpemVfdCBQcm9wc09mZnNldDsNCisgIFVJbnQzMiBNZXRob2RJRDsNCisgIEJ5dGUgTnVtSW5TdHJlYW1zOw0KKyAgQnl0ZSBOdW1PdXRTdHJlYW1zOw0KKyAgQnl0ZSBQcm9wc1NpemU7DQorfSBDU3pDb2RlckluZm87DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBVSW50MzIgSW5JbmRleDsNCisgIFVJbnQzMiBPdXRJbmRleDsNCit9IENTekJpbmRQYWlyOw0KKw0KKyNkZWZpbmUgU1pfTlVNX0NPREVSU19JTl9GT0xERVJfTUFYIDQNCisjZGVmaW5lIFNaX05VTV9CSU5EU19JTl9GT0xERVJfTUFYIDMNCisjZGVmaW5lIFNaX05VTV9QQUNLX1NUUkVBTVNfSU5fRk9MREVSX01BWCA0DQorI2RlZmluZSBTWl9OVU1fQ09ERVJTX09VVF9TVFJFQU1TX0lOX0ZPTERFUl9NQVggNA0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgVUludDMyIE51bUNvZGVyczsNCisgIFVJbnQzMiBOdW1CaW5kUGFpcnM7DQorICBVSW50MzIgTnVtUGFja1N0cmVhbXM7DQorICBVSW50MzIgTWFpbk91dFN0cmVhbTsNCisgIFVJbnQzMiBQYWNrU3RyZWFtc1tTWl9OVU1fUEFDS19TVFJFQU1TX0lOX0ZPTERFUl9NQVhdOw0KKyAgQ1N6QmluZFBhaXIgQmluZFBhaXJzW1NaX05VTV9CSU5EU19JTl9GT0xERVJfTUFYXTsNCisgIENTekNvZGVySW5mbyBDb2RlcnNbU1pfTlVNX0NPREVSU19JTl9GT0xERVJfTUFYXTsNCisgIFVJbnQ2NCBDb2RlcnNVbnBhY2tTaXplc1tTWl9OVU1fQ09ERVJTX09VVF9TVFJFQU1TX0lOX0ZPTERFUl9NQVhdOw0KK30gQ1N6Rm9sZGVyOw0KKw0KKy8qDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBzaXplX3QgQ29kZXJzRGF0YU9mZnNldDsNCisgIHNpemVfdCBVbnBhY2tTaXplRGF0YU9mZnNldDsNCisgIC8vIFVJbnQzMiBTdGFydENvZGVyVW5wYWNrU2l6ZXNJbmRleDsNCisgIFVJbnQzMiBTdGFydFBhY2tTdHJlYW1JbmRleDsNCisgIC8vIFVJbnQzMiBJbmRleE9mTWFpbk91dFN0cmVhbTsNCit9IENTekZvbGRlcjI7DQorKi8NCisNCitTUmVzIFN6R2V0TmV4dEZvbGRlckl0ZW0oQ1N6Rm9sZGVyICpmLCBDU3pEYXRhICpzZCwgQ1N6RGF0YSAqc2RTaXplcyk7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBVSW50MzIgTG93Ow0KKyAgVUludDMyIEhpZ2g7DQorfSBDTnRmc0ZpbGVUaW1lOw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgQnl0ZSAqRGVmczsgLyogTVNCIDAgYml0IG51bWJlcmluZyAqLw0KKyAgVUludDMyICpWYWxzOw0KK30gQ1N6Qml0VWkzMnM7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBCeXRlICpEZWZzOyAvKiBNU0IgMCBiaXQgbnVtYmVyaW5nICovDQorICAvLyBVSW50NjQgKlZhbHM7DQorICBDTnRmc0ZpbGVUaW1lICpWYWxzOw0KK30gQ1N6Qml0VWk2NHM7DQorDQorI2RlZmluZSBTekJpdEFycmF5X0NoZWNrKHAsIGkpICgoKHApWyhpKSA+PiAzXSAmICgweDgwID4+ICgoaSkgJiA3KSkpICE9IDApDQorDQorI2RlZmluZSBTekJpdFdpdGhWYWxzX0NoZWNrKHAsIGkpICgocCktPkRlZnMgJiYgKChwKS0+RGVmc1soaSkgPj4gM10gJiAoMHg4MCA+PiAoKGkpICYgNykpKSAhPSAwKQ0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgVUludDMyIE51bVBhY2tTdHJlYW1zOw0KKyAgVUludDMyIE51bUZvbGRlcnM7DQorDQorICBVSW50NjQgKlBhY2tQb3NpdGlvbnM7IC8vIE51bVBhY2tTdHJlYW1zICsgMQ0KKyAgQ1N6Qml0VWkzMnMgRm9sZGVyQ1JDczsNCisNCisgIHNpemVfdCAqRm9Db2RlcnNPZmZzZXRzOw0KKyAgc2l6ZV90ICpGb1NpemVzT2Zmc2V0czsNCisgIC8vIFVJbnQzMiBTdGFydENvZGVyVW5wYWNrU2l6ZXNJbmRleDsNCisgIFVJbnQzMiAqRm9TdGFydFBhY2tTdHJlYW1JbmRleDsNCisNCisgIC8vIENTekZvbGRlcjIgKkZvbGRlcnM7ICAvLyArMSBpdGVtIGZvciBzdW0gdmFsdWVzDQorICBCeXRlICpDb2RlcnNEYXRhOw0KKyAgQnl0ZSAqVW5wYWNrU2l6ZXNEYXRhOw0KKyAgc2l6ZV90IFVucGFja1NpemVzRGF0YVNpemU7DQorICAvLyBVSW50NjQgKkNvZGVyVW5wYWNrU2l6ZXM7DQorfSBDU3pBcjsNCisNCisNCitTUmVzIFN6QXJfRGVjb2RlRm9sZGVyKGNvbnN0IENTekFyICpwLCBVSW50MzIgZm9sZGVySW5kZXgsDQorICAgIElMb29rSW5TdHJlYW0gKnN0cmVhbSwgVUludDY0IHN0YXJ0UG9zLA0KKyAgICBCeXRlICpvdXRCdWZmZXIsIHNpemVfdCBvdXRTaXplLA0KKyAgICBJU3pBbGxvYyAqYWxsb2NNYWluKTsNCisNCisvKg0KKyAgU3pFeHRyYWN0IGV4dHJhY3RzIGZpbGUgZnJvbSBhcmNoaXZlDQorDQorICAqb3V0QnVmZmVyIG11c3QgYmUgMCBiZWZvcmUgZmlyc3QgY2FsbCBmb3IgZWFjaCBuZXcgYXJjaGl2ZS4NCisNCisgIEV4dHJhY3RpbmcgY2FjaGU6DQorICAgIElmIHlvdSBuZWVkIHRvIGRlY29tcHJlc3MgbW9yZSB0aGFuIG9uZSBmaWxlLCB5b3UgY2FuIHNlbmQNCisgICAgdGhlc2UgdmFsdWVzIGZyb20gcHJldmlvdXMgY2FsbDoNCisgICAgICAqYmxvY2tJbmRleCwNCisgICAgICAqb3V0QnVmZmVyLA0KKyAgICAgICpvdXRCdWZmZXJTaXplDQorICAgIFlvdSBjYW4gY29uc2lkZXIgIipvdXRCdWZmZXIiIGFzIGNhY2hlIG9mIHNvbGlkIGJsb2NrLiBJZiB5b3VyIGFyY2hpdmUgaXMgc29saWQsDQorICAgIGl0IHdpbGwgaW5jcmVhc2UgZGVjb21wcmVzc2lvbiBzcGVlZC4NCisgIA0KKyAgICBJZiB5b3UgdXNlIGV4dGVybmFsIGZ1bmN0aW9uLCB5b3UgY2FuIGRlY2xhcmUgdGhlc2UgMyBjYWNoZSB2YXJpYWJsZXMNCisgICAgKGJsb2NrSW5kZXgsIG91dEJ1ZmZlciwgb3V0QnVmZmVyU2l6ZSkgYXMgc3RhdGljIGluIHRoYXQgZXh0ZXJuYWwgZnVuY3Rpb24uDQorICAgIA0KKyAgICBGcmVlICpvdXRCdWZmZXIgYW5kIHNldCAqb3V0QnVmZmVyIHRvIDAsIGlmIHlvdSB3YW50IHRvIGZsdXNoIGNhY2hlLg0KKyovDQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBDU3pBciBkYjsNCisNCisgIFVJbnQ2NCBzdGFydFBvc0FmdGVySGVhZGVyOw0KKyAgVUludDY0IGRhdGFQb3M7DQorICANCisgIFVJbnQzMiBOdW1GaWxlczsNCisNCisgIFVJbnQ2NCAqVW5wYWNrUG9zaXRpb25zOw0KKyAgLy8gQnl0ZSAqSXNFbXB0eUZpbGVzOw0KKyAgQnl0ZSAqSXNEaXJzOw0KKyAgQ1N6Qml0VWkzMnMgQ1JDczsNCisNCisgIENTekJpdFVpMzJzIEF0dHJpYnM7DQorICAvLyBDU3pCaXRVaTMycyBQYXJlbnRzOw0KKyAgQ1N6Qml0VWk2NHMgTVRpbWU7DQorICBDU3pCaXRVaTY0cyBDVGltZTsNCisNCisgIC8vIFVJbnQzMiAqRm9sZGVyU3RhcnRQYWNrU3RyZWFtSW5kZXg7DQorICBVSW50MzIgKkZvbGRlclN0YXJ0RmlsZUluZGV4OyAvLyArIDENCisgIFVJbnQzMiAqRmlsZUluZGV4VG9Gb2xkZXJJbmRleE1hcDsNCisNCisgIHNpemVfdCAqRmlsZU5hbWVPZmZzZXRzOyAvKiBpbiAyLWJ5dGUgc3RlcHMgKi8NCisgIEJ5dGUgKkZpbGVOYW1lczsgIC8qIFVURi0xNi1MRSAqLw0KK30gQ1N6QXJFeDsNCisNCisjZGVmaW5lIFN6QXJFeF9Jc0RpcihwLCBpKSAoU3pCaXRBcnJheV9DaGVjaygocCktPklzRGlycywgaSkpDQorDQorI2RlZmluZSBTekFyRXhfR2V0RmlsZVNpemUocCwgaSkgKChwKS0+VW5wYWNrUG9zaXRpb25zWyhpKSArIDFdIC0gKHApLT5VbnBhY2tQb3NpdGlvbnNbaV0pDQorDQordm9pZCBTekFyRXhfSW5pdChDU3pBckV4ICpwKTsNCit2b2lkIFN6QXJFeF9GcmVlKENTekFyRXggKnAsIElTekFsbG9jICphbGxvYyk7DQorVUludDY0IFN6QXJFeF9HZXRGb2xkZXJTdHJlYW1Qb3MoY29uc3QgQ1N6QXJFeCAqcCwgVUludDMyIGZvbGRlckluZGV4LCBVSW50MzIgaW5kZXhJbkZvbGRlcik7DQoraW50IFN6QXJFeF9HZXRGb2xkZXJGdWxsUGFja1NpemUoY29uc3QgQ1N6QXJFeCAqcCwgVUludDMyIGZvbGRlckluZGV4LCBVSW50NjQgKnJlc1NpemUpOw0KKw0KKy8qDQoraWYgZGVzdCA9PSBOVUxMLCB0aGUgcmV0dXJuIHZhbHVlIHNwZWNpZmllcyB0aGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgYnVmZmVyLA0KKyAgaW4gMTYtYml0IGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0aGUgbnVsbC10ZXJtaW5hdGluZyBjaGFyYWN0ZXIuDQoraWYgZGVzdCAhPSBOVUxMLCB0aGUgcmV0dXJuIHZhbHVlIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIDE2LWJpdCBjaGFyYWN0ZXJzIHRoYXQNCisgIGFyZSB3cml0dGVuIHRvIHRoZSBkZXN0LCBpbmNsdWRpbmcgdGhlIG51bGwtdGVybWluYXRpbmcgY2hhcmFjdGVyLiAqLw0KKw0KK3NpemVfdCBTekFyRXhfR2V0RmlsZU5hbWVVdGYxNihjb25zdCBDU3pBckV4ICpwLCBzaXplX3QgZmlsZUluZGV4LCBVSW50MTYgKmRlc3QpOw0KKw0KKy8qDQorc2l6ZV90IFN6QXJFeF9HZXRGdWxsTmFtZUxlbihjb25zdCBDU3pBckV4ICpwLCBzaXplX3QgZmlsZUluZGV4KTsNCitVSW50MTYgKlN6QXJFeF9HZXRGdWxsTmFtZVV0ZjE2X0JhY2soY29uc3QgQ1N6QXJFeCAqcCwgc2l6ZV90IGZpbGVJbmRleCwgVUludDE2ICpkZXN0KTsNCisqLw0KKw0KK1NSZXMgU3pBckV4X0V4dHJhY3QoDQorICAgIGNvbnN0IENTekFyRXggKmRiLA0KKyAgICBJTG9va0luU3RyZWFtICppblN0cmVhbSwNCisgICAgVUludDMyIGZpbGVJbmRleCwgICAgICAgICAvKiBpbmRleCBvZiBmaWxlICovDQorICAgIFVJbnQzMiAqYmxvY2tJbmRleCwgICAgICAgLyogaW5kZXggb2Ygc29saWQgYmxvY2sgKi8NCisgICAgQnl0ZSAqKm91dEJ1ZmZlciwgICAgICAgICAvKiBwb2ludGVyIHRvIHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlciAoYWxsb2NhdGVkIHdpdGggYWxsb2NNYWluKSAqLw0KKyAgICBzaXplX3QgKm91dEJ1ZmZlclNpemUsICAgIC8qIGJ1ZmZlciBzaXplIGZvciBvdXRwdXQgYnVmZmVyICovDQorICAgIHNpemVfdCAqb2Zmc2V0LCAgICAgICAgICAgLyogb2Zmc2V0IG9mIHN0cmVhbSBmb3IgcmVxdWlyZWQgZmlsZSBpbiAqb3V0QnVmZmVyICovDQorICAgIHNpemVfdCAqb3V0U2l6ZVByb2Nlc3NlZCwgLyogc2l6ZSBvZiBmaWxlIGluICpvdXRCdWZmZXIgKi8NCisgICAgSVN6QWxsb2MgKmFsbG9jTWFpbiwNCisgICAgSVN6QWxsb2MgKmFsbG9jVGVtcCk7DQorDQorDQorLyoNCitTekFyRXhfT3BlbiBFcnJvcnM6DQorU1pfRVJST1JfTk9fQVJDSElWRQ0KK1NaX0VSUk9SX0FSQ0hJVkUNCitTWl9FUlJPUl9VTlNVUFBPUlRFRA0KK1NaX0VSUk9SX01FTQ0KK1NaX0VSUk9SX0NSQw0KK1NaX0VSUk9SX0lOUFVUX0VPRg0KK1NaX0VSUk9SX0ZBSUwNCisqLw0KKw0KK1NSZXMgU3pBckV4X09wZW4oQ1N6QXJFeCAqcCwgSUxvb2tJblN0cmVhbSAqaW5TdHJlYW0sDQorICAgIElTekFsbG9jICphbGxvY01haW4sIElTekFsbG9jICphbGxvY1RlbXApOw0KKw0KK0VYVEVSTl9DX0VORA0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy83ekFsbG9jLmMgYi9sem1hL0MvN3pBbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODA3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvN3pBbGxvYy5jCkBAIC0wLDAgKzEsNzggQEAKKy8qIDd6QWxsb2MuYyAtLSBBbGxvY2F0aW9uIGZ1bmN0aW9ucw0KKzIwMTAtMTAtMjkgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiUHJlY29tcC5oIg0KKw0KKyNpbmNsdWRlICI3ekFsbG9jLmgiDQorDQorLyogI2RlZmluZSBfU1pfQUxMT0NfREVCVUcgKi8NCisvKiB1c2UgX1NaX0FMTE9DX0RFQlVHIHRvIGRlYnVnIGFsbG9jL2ZyZWUgb3BlcmF0aW9ucyAqLw0KKw0KKyNpZmRlZiBfU1pfQUxMT0NfREVCVUcNCisNCisjaWZkZWYgX1dJTjMyDQorI2luY2x1ZGUgPHdpbmRvd3MuaD4NCisjZW5kaWYNCisNCisjaW5jbHVkZSA8c3RkaW8uaD4NCitpbnQgZ19hbGxvY0NvdW50ID0gMDsNCitpbnQgZ19hbGxvY0NvdW50VGVtcCA9IDA7DQorDQorI2VuZGlmDQorDQordm9pZCAqU3pBbGxvYyh2b2lkICpwLCBzaXplX3Qgc2l6ZSkNCit7DQorICBwID0gcDsNCisgIGlmIChzaXplID09IDApDQorICAgIHJldHVybiAwOw0KKyAgI2lmZGVmIF9TWl9BTExPQ19ERUJVRw0KKyAgZnByaW50ZihzdGRlcnIsICJcbkFsbG9jICUxMGQgYnl0ZXM7IGNvdW50ID0gJTEwZCIsIHNpemUsIGdfYWxsb2NDb3VudCk7DQorICBnX2FsbG9jQ291bnQrKzsNCisgICNlbmRpZg0KKyAgcmV0dXJuIG1hbGxvYyhzaXplKTsNCit9DQorDQordm9pZCBTekZyZWUodm9pZCAqcCwgdm9pZCAqYWRkcmVzcykNCit7DQorICBwID0gcDsNCisgICNpZmRlZiBfU1pfQUxMT0NfREVCVUcNCisgIGlmIChhZGRyZXNzICE9IDApDQorICB7DQorICAgIGdfYWxsb2NDb3VudC0tOw0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuRnJlZTsgY291bnQgPSAlMTBkIiwgZ19hbGxvY0NvdW50KTsNCisgIH0NCisgICNlbmRpZg0KKyAgZnJlZShhZGRyZXNzKTsNCit9DQorDQordm9pZCAqU3pBbGxvY1RlbXAodm9pZCAqcCwgc2l6ZV90IHNpemUpDQorew0KKyAgcCA9IHA7DQorICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICByZXR1cm4gMDsNCisgICNpZmRlZiBfU1pfQUxMT0NfREVCVUcNCisgIGZwcmludGYoc3RkZXJyLCAiXG5BbGxvY190ZW1wICUxMGQgYnl0ZXM7ICBjb3VudCA9ICUxMGQiLCBzaXplLCBnX2FsbG9jQ291bnRUZW1wKTsNCisgIGdfYWxsb2NDb3VudFRlbXArKzsNCisgICNpZmRlZiBfV0lOMzINCisgIHJldHVybiBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZSk7DQorICAjZW5kaWYNCisgICNlbmRpZg0KKyAgcmV0dXJuIG1hbGxvYyhzaXplKTsNCit9DQorDQordm9pZCBTekZyZWVUZW1wKHZvaWQgKnAsIHZvaWQgKmFkZHJlc3MpDQorew0KKyAgcCA9IHA7DQorICAjaWZkZWYgX1NaX0FMTE9DX0RFQlVHDQorICBpZiAoYWRkcmVzcyAhPSAwKQ0KKyAgew0KKyAgICBnX2FsbG9jQ291bnRUZW1wLS07DQorICAgIGZwcmludGYoc3RkZXJyLCAiXG5GcmVlX3RlbXA7IGNvdW50ID0gJTEwZCIsIGdfYWxsb2NDb3VudFRlbXApOw0KKyAgfQ0KKyAgI2lmZGVmIF9XSU4zMg0KKyAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYWRkcmVzcyk7DQorICByZXR1cm47DQorICAjZW5kaWYNCisgICNlbmRpZg0KKyAgZnJlZShhZGRyZXNzKTsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DLzd6QWxsb2MuaCBiL2x6bWEvQy83ekFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwZjExNgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy83ekFsbG9jLmgKQEAgLTAsMCArMSwxNSBAQAorLyogN3pBbGxvYy5oIC0tIEFsbG9jYXRpb24gZnVuY3Rpb25zDQorMjAxMC0xMC0yOSA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpZm5kZWYgX183Wl9BTExPQ19IDQorI2RlZmluZSBfXzdaX0FMTE9DX0gNCisNCisjaW5jbHVkZSA8c3RkbGliLmg+DQorDQordm9pZCAqU3pBbGxvYyh2b2lkICpwLCBzaXplX3Qgc2l6ZSk7DQordm9pZCBTekZyZWUodm9pZCAqcCwgdm9pZCAqYWRkcmVzcyk7DQorDQordm9pZCAqU3pBbGxvY1RlbXAodm9pZCAqcCwgc2l6ZV90IHNpemUpOw0KK3ZvaWQgU3pGcmVlVGVtcCh2b2lkICpwLCB2b2lkICphZGRyZXNzKTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0MvN3pBcmNJbi5jIGIvbHptYS9DLzd6QXJjSW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQ0ZjZiCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DLzd6QXJjSW4uYwpAQCAtMCwwICsxLDE4MzkgQEAKKy8qIDd6QXJjSW4uYyAtLSA3eiBJbnB1dCBmdW5jdGlvbnMNCisyMDE0LTA2LTE2IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorDQorI2luY2x1ZGUgIjd6LmgiDQorI2luY2x1ZGUgIjd6QnVmLmgiDQorI2luY2x1ZGUgIjd6Q3JjLmgiDQorI2luY2x1ZGUgIkNwdUFyY2guaCINCisNCisjZGVmaW5lIE1ZX0FMTE9DKFQsIHAsIHNpemUsIGFsbG9jKSB7IGlmICgoc2l6ZSkgPT0gMCkgcCA9IDA7IGVsc2UgXA0KKyAgaWYgKChwID0gKFQgKilJQWxsb2NfQWxsb2MoYWxsb2MsIChzaXplKSAqIHNpemVvZihUKSkpID09IDApIHJldHVybiBTWl9FUlJPUl9NRU07IH0NCisNCisjZGVmaW5lIGs3ek1ham9yVmVyc2lvbiAwDQorDQorZW51bSBFSWRFbnVtDQorew0KKyAgazd6SWRFbmQsDQorICBrN3pJZEhlYWRlciwNCisgIGs3eklkQXJjaGl2ZVByb3BlcnRpZXMsDQorICBrN3pJZEFkZGl0aW9uYWxTdHJlYW1zSW5mbywNCisgIGs3eklkTWFpblN0cmVhbXNJbmZvLA0KKyAgazd6SWRGaWxlc0luZm8sDQorICBrN3pJZFBhY2tJbmZvLA0KKyAgazd6SWRVbnBhY2tJbmZvLA0KKyAgazd6SWRTdWJTdHJlYW1zSW5mbywNCisgIGs3eklkU2l6ZSwNCisgIGs3eklkQ1JDLA0KKyAgazd6SWRGb2xkZXIsDQorICBrN3pJZENvZGVyc1VucGFja1NpemUsDQorICBrN3pJZE51bVVucGFja1N0cmVhbSwNCisgIGs3eklkRW1wdHlTdHJlYW0sDQorICBrN3pJZEVtcHR5RmlsZSwNCisgIGs3eklkQW50aSwNCisgIGs3eklkTmFtZSwNCisgIGs3eklkQ1RpbWUsDQorICBrN3pJZEFUaW1lLA0KKyAgazd6SWRNVGltZSwNCisgIGs3eklkV2luQXR0cmliLA0KKyAgazd6SWRDb21tZW50LA0KKyAgazd6SWRFbmNvZGVkSGVhZGVyLA0KKyAgazd6SWRTdGFydFBvcywNCisgIGs3eklkRHVtbXkNCisgIC8vIGs3ek50U2VjdXJlLA0KKyAgLy8gazd6UGFyZW50LA0KKyAgLy8gazd6SXNSZWFsDQorfTsNCisNCitCeXRlIGs3elNpZ25hdHVyZVtrN3pTaWduYXR1cmVTaXplXSA9IHsnNycsICd6JywgMHhCQywgMHhBRiwgMHgyNywgMHgxQ307DQorDQorI2RlZmluZSBOVU1fRk9MREVSX0NPREVSU19NQVggMzINCisjZGVmaW5lIE5VTV9DT0RFUl9TVFJFQU1TX01BWCAzMg0KKw0KKy8qDQorc3RhdGljIGludCBTekZvbGRlcl9GaW5kQmluZFBhaXJGb3JJblN0cmVhbShjb25zdCBDU3pGb2xkZXIgKnAsIFVJbnQzMiBpblN0cmVhbUluZGV4KQ0KK3sNCisgIFVJbnQzMiBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHAtPk51bUJpbmRQYWlyczsgaSsrKQ0KKyAgICBpZiAocC0+QmluZFBhaXJzW2ldLkluSW5kZXggPT0gaW5TdHJlYW1JbmRleCkNCisgICAgICByZXR1cm4gaTsNCisgIHJldHVybiAtMTsNCit9DQorKi8NCisNCisjZGVmaW5lIFN6Qml0VWkzMnNfSW5pdChwKSB7IChwKS0+RGVmcyA9IDA7IChwKS0+VmFscyA9IDA7IH0NCisNCitzdGF0aWMgU1JlcyBTekJpdFVpMzJzX0FsbG9jKENTekJpdFVpMzJzICpwLCBzaXplX3QgbnVtLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgTVlfQUxMT0MoQnl0ZSwgcC0+RGVmcywgKG51bSArIDcpID4+IDMsIGFsbG9jKTsNCisgIE1ZX0FMTE9DKFVJbnQzMiwgcC0+VmFscywgbnVtLCBhbGxvYyk7DQorICByZXR1cm4gU1pfT0s7DQorfQ0KKw0KK3ZvaWQgU3pCaXRVaTMyc19GcmVlKENTekJpdFVpMzJzICpwLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgSUFsbG9jX0ZyZWUoYWxsb2MsIHAtPkRlZnMpOyBwLT5EZWZzID0gMDsNCisgIElBbGxvY19GcmVlKGFsbG9jLCBwLT5WYWxzKTsgcC0+VmFscyA9IDA7DQorfQ0KKw0KKyNkZWZpbmUgU3pCaXRVaTY0c19Jbml0KHApIHsgKHApLT5EZWZzID0gMDsgKHApLT5WYWxzID0gMDsgfQ0KKw0KK3ZvaWQgU3pCaXRVaTY0c19GcmVlKENTekJpdFVpNjRzICpwLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgSUFsbG9jX0ZyZWUoYWxsb2MsIHAtPkRlZnMpOyBwLT5EZWZzID0gMDsNCisgIElBbGxvY19GcmVlKGFsbG9jLCBwLT5WYWxzKTsgcC0+VmFscyA9IDA7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFN6QXJfSW5pdChDU3pBciAqcCkNCit7DQorICBwLT5OdW1QYWNrU3RyZWFtcyA9IDA7DQorICBwLT5OdW1Gb2xkZXJzID0gMDsNCisgIHAtPlBhY2tQb3NpdGlvbnMgPSAwOw0KKyAgU3pCaXRVaTMyc19Jbml0KCZwLT5Gb2xkZXJDUkNzKTsNCisgIC8vIHAtPkZvbGRlcnMgPSAwOw0KKyAgcC0+Rm9Db2RlcnNPZmZzZXRzID0gMDsNCisgIHAtPkZvU2l6ZXNPZmZzZXRzID0gMDsNCisgIHAtPkZvU3RhcnRQYWNrU3RyZWFtSW5kZXggPSAwOw0KKw0KKyAgcC0+Q29kZXJzRGF0YSA9IDA7DQorICAvLyBwLT5Db2RlclVucGFja1NpemVzID0gMDsNCisgIHAtPlVucGFja1NpemVzRGF0YSA9IDA7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFN6QXJfRnJlZShDU3pBciAqcCwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIElBbGxvY19GcmVlKGFsbG9jLCBwLT5VbnBhY2tTaXplc0RhdGEpOw0KKyAgSUFsbG9jX0ZyZWUoYWxsb2MsIHAtPkNvZGVyc0RhdGEpOw0KKyAgLy8gSUFsbG9jX0ZyZWUoYWxsb2MsIHAtPkNvZGVyVW5wYWNrU2l6ZXMpOw0KKw0KKyAgSUFsbG9jX0ZyZWUoYWxsb2MsIHAtPlBhY2tQb3NpdGlvbnMpOw0KKyANCisgIC8vIElBbGxvY19GcmVlKGFsbG9jLCBwLT5Gb2xkZXJzKTsNCisgIElBbGxvY19GcmVlKGFsbG9jLCBwLT5Gb0NvZGVyc09mZnNldHMpOw0KKyAgSUFsbG9jX0ZyZWUoYWxsb2MsIHAtPkZvU2l6ZXNPZmZzZXRzKTsNCisgIElBbGxvY19GcmVlKGFsbG9jLCBwLT5Gb1N0YXJ0UGFja1N0cmVhbUluZGV4KTsNCisgIA0KKyAgU3pCaXRVaTMyc19GcmVlKCZwLT5Gb2xkZXJDUkNzLCBhbGxvYyk7DQorDQorICBTekFyX0luaXQocCk7DQorfQ0KKw0KKw0KK3ZvaWQgU3pBckV4X0luaXQoQ1N6QXJFeCAqcCkNCit7DQorICBTekFyX0luaXQoJnAtPmRiKTsNCisgIHAtPk51bUZpbGVzID0gMDsNCisgIHAtPmRhdGFQb3MgPSAwOw0KKyAgLy8gcC0+RmlsZXMgPSAwOw0KKyAgcC0+VW5wYWNrUG9zaXRpb25zID0gMDsNCisgIC8vIHAtPklzRW1wdHlGaWxlcyA9IDA7DQorICBwLT5Jc0RpcnMgPSAwOw0KKyAgLy8gcC0+Rm9sZGVyU3RhcnRQYWNrU3RyZWFtSW5kZXggPSAwOw0KKyAgLy8gcC0+UGFja1N0cmVhbVN0YXJ0UG9zaXRpb25zID0gMDsNCisgIHAtPkZvbGRlclN0YXJ0RmlsZUluZGV4ID0gMDsNCisgIHAtPkZpbGVJbmRleFRvRm9sZGVySW5kZXhNYXAgPSAwOw0KKyAgcC0+RmlsZU5hbWVPZmZzZXRzID0gMDsNCisgIHAtPkZpbGVOYW1lcyA9IDA7DQorICBTekJpdFVpMzJzX0luaXQoJnAtPkNSQ3MpOw0KKyAgU3pCaXRVaTMyc19Jbml0KCZwLT5BdHRyaWJzKTsNCisgIC8vIFN6Qml0VWkzMnNfSW5pdCgmcC0+UGFyZW50cyk7DQorICBTekJpdFVpNjRzX0luaXQoJnAtPk1UaW1lKTsNCisgIFN6Qml0VWk2NHNfSW5pdCgmcC0+Q1RpbWUpOw0KK30NCisNCit2b2lkIFN6QXJFeF9GcmVlKENTekFyRXggKnAsIElTekFsbG9jICphbGxvYykNCit7DQorICAvLyBJQWxsb2NfRnJlZShhbGxvYywgcC0+Rm9sZGVyU3RhcnRQYWNrU3RyZWFtSW5kZXgpOw0KKyAgLy8gSUFsbG9jX0ZyZWUoYWxsb2MsIHAtPlBhY2tTdHJlYW1TdGFydFBvc2l0aW9ucyk7DQorICBJQWxsb2NfRnJlZShhbGxvYywgcC0+Rm9sZGVyU3RhcnRGaWxlSW5kZXgpOw0KKyAgSUFsbG9jX0ZyZWUoYWxsb2MsIHAtPkZpbGVJbmRleFRvRm9sZGVySW5kZXhNYXApOw0KKw0KKyAgSUFsbG9jX0ZyZWUoYWxsb2MsIHAtPkZpbGVOYW1lT2Zmc2V0cyk7DQorICBJQWxsb2NfRnJlZShhbGxvYywgcC0+RmlsZU5hbWVzKTsNCisNCisgIFN6Qml0VWk2NHNfRnJlZSgmcC0+Q1RpbWUsIGFsbG9jKTsNCisgIFN6Qml0VWk2NHNfRnJlZSgmcC0+TVRpbWUsIGFsbG9jKTsNCisgIFN6Qml0VWkzMnNfRnJlZSgmcC0+Q1JDcywgYWxsb2MpOw0KKyAgLy8gU3pCaXRVaTMyc19GcmVlKCZwLT5QYXJlbnRzLCBhbGxvYyk7DQorICBTekJpdFVpMzJzX0ZyZWUoJnAtPkF0dHJpYnMsIGFsbG9jKTsNCisgIElBbGxvY19GcmVlKGFsbG9jLCBwLT5Jc0RpcnMpOw0KKyAgLy8gSUFsbG9jX0ZyZWUoYWxsb2MsIHAtPklzRW1wdHlGaWxlcyk7DQorICBJQWxsb2NfRnJlZShhbGxvYywgcC0+VW5wYWNrUG9zaXRpb25zKTsNCisgIC8vIElBbGxvY19GcmVlKGFsbG9jLCBwLT5GaWxlcyk7DQorDQorICBTekFyX0ZyZWUoJnAtPmRiLCBhbGxvYyk7DQorICBTekFyRXhfSW5pdChwKTsNCit9DQorDQorc3RhdGljIGludCBUZXN0U2lnbmF0dXJlQ2FuZGlkYXRlKEJ5dGUgKnRlc3RCeXRlcykNCit7DQorICBzaXplX3QgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBrN3pTaWduYXR1cmVTaXplOyBpKyspDQorICAgIGlmICh0ZXN0Qnl0ZXNbaV0gIT0gazd6U2lnbmF0dXJlW2ldKQ0KKyAgICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIDE7DQorfQ0KKw0KKyNkZWZpbmUgU3pEYXRhX0NsZWFyKHApIHsgKHApLT5EYXRhID0gMDsgKHApLT5TaXplID0gMDsgfQ0KKw0KK3N0YXRpYyBTUmVzIFN6UmVhZEJ5dGUoQ1N6RGF0YSAqc2QsIEJ5dGUgKmIpDQorew0KKyAgaWYgKHNkLT5TaXplID09IDApDQorICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgc2QtPlNpemUtLTsNCisgICpiID0gKnNkLT5EYXRhKys7DQorICByZXR1cm4gU1pfT0s7DQorfQ0KKw0KKyNkZWZpbmUgU1pfUkVBRF9CWVRFX1NEKF9zZF8sIGRlc3QpIGlmICgoX3NkXyktPlNpemUgPT0gMCkgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7IChfc2RfKS0+U2l6ZS0tOyBkZXN0ID0gKihfc2RfKS0+RGF0YSsrOw0KKyNkZWZpbmUgU1pfUkVBRF9CWVRFKGRlc3QpIFNaX1JFQURfQllURV9TRChzZCwgZGVzdCkNCisjZGVmaW5lIFNaX1JFQURfQllURV8yKGRlc3QpIGlmIChzZC5TaXplID09IDApIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOyBzZC5TaXplLS07IGRlc3QgPSAqc2QuRGF0YSsrOw0KKw0KKyNkZWZpbmUgU0tJUF9EQVRBKHNkLCBzaXplKSB7IHNkLT5TaXplIC09IChzaXplX3QpKHNpemUpOyBzZC0+RGF0YSArPSAoc2l6ZV90KShzaXplKTsgfQ0KKyNkZWZpbmUgU0tJUF9EQVRBMihzZCwgc2l6ZSkgeyBzZC5TaXplIC09IChzaXplX3QpKHNpemUpOyBzZC5EYXRhICs9IChzaXplX3QpKHNpemUpOyB9DQorDQorI2RlZmluZSBTWl9SRUFEXzMyKGRlc3QpIGlmIChzZC5TaXplIDwgNCkgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7IFwNCisgICBkZXN0ID0gR2V0VWkzMihzZC5EYXRhKTsgU0tJUF9EQVRBMihzZCwgNCk7DQorDQorc3RhdGljIE1ZX05PX0lOTElORSBTUmVzIFJlYWROdW1iZXIoQ1N6RGF0YSAqc2QsIFVJbnQ2NCAqdmFsdWUpDQorew0KKyAgQnl0ZSBmaXJzdEJ5dGUsIG1hc2s7DQorICB1bnNpZ25lZCBpOw0KKyAgVUludDMyIHY7DQorDQorICBTWl9SRUFEX0JZVEUoZmlyc3RCeXRlKTsNCisgIGlmICgoZmlyc3RCeXRlICYgMHg4MCkgPT0gMCkNCisgIHsNCisgICAgKnZhbHVlID0gZmlyc3RCeXRlOw0KKyAgICByZXR1cm4gU1pfT0s7DQorICB9DQorICBTWl9SRUFEX0JZVEUodik7DQorICBpZiAoKGZpcnN0Qnl0ZSAmIDB4NDApID09IDApDQorICB7DQorICAgICp2YWx1ZSA9ICgoKFVJbnQzMilmaXJzdEJ5dGUgJiAweDNGKSA8PCA4KSB8IHY7DQorICAgIHJldHVybiBTWl9PSzsNCisgIH0NCisgIFNaX1JFQURfQllURShtYXNrKTsNCisgICp2YWx1ZSA9IHYgfCAoKFVJbnQzMiltYXNrIDw8IDgpOw0KKyAgbWFzayA9IDB4MjA7DQorICBmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQ0KKyAgew0KKyAgICBCeXRlIGI7DQorICAgIGlmICgoZmlyc3RCeXRlICYgbWFzaykgPT0gMCkNCisgICAgew0KKyAgICAgIFVJbnQ2NCBoaWdoUGFydCA9IGZpcnN0Qnl0ZSAmIChtYXNrIC0gMSk7DQorICAgICAgKnZhbHVlIHw9IChoaWdoUGFydCA8PCAoOCAqIGkpKTsNCisgICAgICByZXR1cm4gU1pfT0s7DQorICAgIH0NCisgICAgU1pfUkVBRF9CWVRFKGIpOw0KKyAgICAqdmFsdWUgfD0gKChVSW50NjQpYiA8PCAoOCAqIGkpKTsNCisgICAgbWFzayA+Pj0gMTsNCisgIH0NCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorLyoNCitzdGF0aWMgTVlfTk9fSU5MSU5FIGNvbnN0IEJ5dGUgKlN6UmVhZE51bWJlcnMoY29uc3QgQnl0ZSAqZGF0YSwgY29uc3QgQnl0ZSAqZGF0YUxpbSwgVUludDY0ICp2YWx1ZXMsIFVJbnQzMiBudW0pDQorew0KKyAgZm9yICg7IG51bSAhPSAwOyBudW0tLSkNCisgIHsNCisgICAgQnl0ZSBmaXJzdEJ5dGU7DQorICAgIEJ5dGUgbWFzazsNCisNCisgICAgdW5zaWduZWQgaTsNCisgICAgVUludDMyIHY7DQorICAgIFVJbnQ2NCB2YWx1ZTsNCisgICANCisgICAgaWYgKGRhdGEgPT0gZGF0YUxpbSkNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgZmlyc3RCeXRlID0gKmRhdGErKzsNCisNCisgICAgaWYgKChmaXJzdEJ5dGUgJiAweDgwKSA9PSAwKQ0KKyAgICB7DQorICAgICAgKnZhbHVlcysrID0gZmlyc3RCeXRlOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChkYXRhID09IGRhdGFMaW0pDQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIHYgPSAqZGF0YSsrOw0KKyAgICBpZiAoKGZpcnN0Qnl0ZSAmIDB4NDApID09IDApDQorICAgIHsNCisgICAgICAqdmFsdWVzKysgPSAoKChVSW50MzIpZmlyc3RCeXRlICYgMHgzRikgPDwgOCkgfCB2Ow0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChkYXRhID09IGRhdGFMaW0pDQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIHZhbHVlID0gdiB8ICgoVUludDMyKSpkYXRhKysgPDwgOCk7DQorICAgIG1hc2sgPSAweDIwOw0KKyAgICBmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQ0KKyAgICB7DQorICAgICAgaWYgKChmaXJzdEJ5dGUgJiBtYXNrKSA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgIFVJbnQ2NCBoaWdoUGFydCA9IGZpcnN0Qnl0ZSAmIChtYXNrIC0gMSk7DQorICAgICAgICB2YWx1ZSB8PSAoaGlnaFBhcnQgPDwgKDggKiBpKSk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaWYgKGRhdGEgPT0gZGF0YUxpbSkNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIHZhbHVlIHw9ICgoVUludDY0KSpkYXRhKysgPDwgKDggKiBpKSk7DQorICAgICAgbWFzayA+Pj0gMTsNCisgICAgfQ0KKyAgICAqdmFsdWVzKysgPSB2YWx1ZTsNCisgIH0NCisgIHJldHVybiBkYXRhOw0KK30NCisqLw0KKw0KK3N0YXRpYyBNWV9OT19JTkxJTkUgU1JlcyBTelJlYWROdW1iZXIzMihDU3pEYXRhICpzZCwgVUludDMyICp2YWx1ZSkNCit7DQorICBCeXRlIGZpcnN0Qnl0ZTsNCisgIFVJbnQ2NCB2YWx1ZTY0Ow0KKyAgaWYgKHNkLT5TaXplID09IDApDQorICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgZmlyc3RCeXRlID0gKnNkLT5EYXRhOw0KKyAgaWYgKChmaXJzdEJ5dGUgJiAweDgwKSA9PSAwKQ0KKyAgew0KKyAgICAqdmFsdWUgPSBmaXJzdEJ5dGU7DQorICAgIHNkLT5EYXRhKys7DQorICAgIHNkLT5TaXplLS07DQorICAgIHJldHVybiBTWl9PSzsNCisgIH0NCisgIFJJTk9LKFJlYWROdW1iZXIoc2QsICZ2YWx1ZTY0KSk7DQorICBpZiAodmFsdWU2NCA+PSAoVUludDMyKTB4ODAwMDAwMDAgLSAxKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICBpZiAodmFsdWU2NCA+PSAoKFVJbnQ2NCkoMSkgPDwgKChzaXplb2Yoc2l6ZV90KSAtIDEpICogOCArIDQpKSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKyAgKnZhbHVlID0gKFVJbnQzMil2YWx1ZTY0Ow0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCisjZGVmaW5lIFJlYWRJRChzZCwgdmFsdWUpIFJlYWROdW1iZXIoc2QsIHZhbHVlKQ0KKw0KK3N0YXRpYyBTUmVzIFNraXBEYXRhKENTekRhdGEgKnNkKQ0KK3sNCisgIFVJbnQ2NCBzaXplOw0KKyAgUklOT0soUmVhZE51bWJlcihzZCwgJnNpemUpKTsNCisgIGlmIChzaXplID4gc2QtPlNpemUpDQorICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgU0tJUF9EQVRBKHNkLCBzaXplKTsNCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorc3RhdGljIFNSZXMgV2FpdElkKENTekRhdGEgKnNkLCBVSW50NjQgaWQpDQorew0KKyAgZm9yICg7OykNCisgIHsNCisgICAgVUludDY0IHR5cGU7DQorICAgIFJJTk9LKFJlYWRJRChzZCwgJnR5cGUpKTsNCisgICAgaWYgKHR5cGUgPT0gaWQpDQorICAgICAgcmV0dXJuIFNaX09LOw0KKyAgICBpZiAodHlwZSA9PSBrN3pJZEVuZCkNCisgICAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgICAgUklOT0soU2tpcERhdGEoc2QpKTsNCisgIH0NCit9DQorDQorc3RhdGljIFNSZXMgUmVtZW1iZXJCaXRWZWN0b3IoQ1N6RGF0YSAqc2QsIFVJbnQzMiBudW1JdGVtcywgY29uc3QgQnl0ZSAqKnYpDQorew0KKyAgVUludDMyIG51bUJ5dGVzID0gKG51bUl0ZW1zICsgNykgPj4gMzsNCisgIGlmIChudW1CeXRlcyA+IHNkLT5TaXplKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgICp2ID0gc2QtPkRhdGE7DQorICBTS0lQX0RBVEEoc2QsIG51bUJ5dGVzKTsNCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorc3RhdGljIFVJbnQzMiBDb3VudERlZmluZWRCaXRzKGNvbnN0IEJ5dGUgKmJpdHMsIFVJbnQzMiBudW1JdGVtcykNCit7DQorICBCeXRlIGIgPSAwOw0KKyAgdW5zaWduZWQgbSA9IDA7DQorICBVSW50MzIgc3VtID0gMDsNCisgIGZvciAoOyBudW1JdGVtcyAhPSAwOyBudW1JdGVtcy0tKQ0KKyAgew0KKyAgICBpZiAobSA9PSAwKQ0KKyAgICB7DQorICAgICAgYiA9ICpiaXRzKys7DQorICAgICAgbSA9IDg7DQorICAgIH0NCisgICAgbS0tOw0KKyAgICBzdW0gKz0gKChiID4+IG0pICYgMSk7DQorICB9DQorICByZXR1cm4gc3VtIDsNCit9DQorDQorc3RhdGljIE1ZX05PX0lOTElORSBTUmVzIFJlYWRCaXRWZWN0b3IoQ1N6RGF0YSAqc2QsIFVJbnQzMiBudW1JdGVtcywgQnl0ZSAqKnYsIElTekFsbG9jICphbGxvYykNCit7DQorICBCeXRlIGFsbEFyZURlZmluZWQ7DQorICBVSW50MzIgaTsNCisgIEJ5dGUgKnYyOw0KKyAgVUludDMyIG51bUJ5dGVzID0gKG51bUl0ZW1zICsgNykgPj4gMzsNCisgIFJJTk9LKFN6UmVhZEJ5dGUoc2QsICZhbGxBcmVEZWZpbmVkKSk7DQorICBpZiAoYWxsQXJlRGVmaW5lZCA9PSAwKQ0KKyAgew0KKyAgICBpZiAobnVtQnl0ZXMgPiBzZC0+U2l6ZSkNCisgICAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgICAgTVlfQUxMT0MoQnl0ZSwgKnYsIG51bUJ5dGVzLCBhbGxvYyk7DQorICAgIG1lbWNweSgqdiwgc2QtPkRhdGEsIG51bUJ5dGVzKTsNCisgICAgU0tJUF9EQVRBKHNkLCBudW1CeXRlcyk7DQorICAgIHJldHVybiBTWl9PSzsNCisgIH0NCisgIE1ZX0FMTE9DKEJ5dGUsICp2LCBudW1CeXRlcywgYWxsb2MpOw0KKyAgdjIgPSAqdjsNCisgIGZvciAoaSA9IDA7IGkgPCBudW1CeXRlczsgaSsrKQ0KKyAgICB2MltpXSA9IDB4RkY7DQorICB7DQorICAgIHVuc2lnbmVkIG51bUJpdHMgPSAodW5zaWduZWQpbnVtSXRlbXMgJiA3Ow0KKyAgICBpZiAobnVtQml0cyAhPSAwKQ0KKyAgICAgIHYyW251bUJ5dGVzIC0gMV0gPSAoQnl0ZSkoKCgoVUludDMyKTEgPDwgbnVtQml0cykgLSAxKSA8PCAoOCAtIG51bUJpdHMpKTsNCisgIH0NCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorc3RhdGljIE1ZX05PX0lOTElORSBTUmVzIFJlYWRVaTMycyhDU3pEYXRhICpzZDIsIFVJbnQzMiBudW1JdGVtcywgQ1N6Qml0VWkzMnMgKmNyY3MsIElTekFsbG9jICphbGxvYykNCit7DQorICBVSW50MzIgaTsNCisgIENTekRhdGEgc2Q7DQorICBVSW50MzIgKnZhbHM7DQorICBjb25zdCBCeXRlICpkZWZzOw0KKyAgTVlfQUxMT0MoVUludDMyLCBjcmNzLT5WYWxzLCBudW1JdGVtcywgYWxsb2MpOw0KKyAgc2QgPSAqc2QyOw0KKyAgZGVmcyA9IGNyY3MtPkRlZnM7DQorICB2YWxzID0gY3Jjcy0+VmFsczsNCisgIGZvciAoaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKQ0KKyAgICBpZiAoU3pCaXRBcnJheV9DaGVjayhkZWZzLCBpKSkNCisgICAgew0KKyAgICAgIFNaX1JFQURfMzIodmFsc1tpXSk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAgIHZhbHNbaV0gPSAwOw0KKyAgKnNkMiA9IHNkOw0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCitzdGF0aWMgU1JlcyBSZWFkQml0VWkzMnMoQ1N6RGF0YSAqc2QsIFVJbnQzMiBudW1JdGVtcywgQ1N6Qml0VWkzMnMgKmNyY3MsIElTekFsbG9jICphbGxvYykNCit7DQorICBTekJpdFVpMzJzX0ZyZWUoY3JjcywgYWxsb2MpOw0KKyAgUklOT0soUmVhZEJpdFZlY3RvcihzZCwgbnVtSXRlbXMsICZjcmNzLT5EZWZzLCBhbGxvYykpOw0KKyAgcmV0dXJuIFJlYWRVaTMycyhzZCwgbnVtSXRlbXMsIGNyY3MsIGFsbG9jKTsNCit9DQorDQorc3RhdGljIFNSZXMgU2tpcEJpdFVpMzJzKENTekRhdGEgKnNkLCBVSW50MzIgbnVtSXRlbXMpDQorew0KKyAgQnl0ZSBhbGxBcmVEZWZpbmVkOw0KKyAgVUludDMyIG51bURlZmluZWQgPSBudW1JdGVtczsNCisgIFJJTk9LKFN6UmVhZEJ5dGUoc2QsICZhbGxBcmVEZWZpbmVkKSk7DQorICBpZiAoIWFsbEFyZURlZmluZWQpDQorICB7DQorICAgIHNpemVfdCBudW1CeXRlcyA9IChudW1JdGVtcyArIDcpID4+IDM7DQorICAgIGlmIChudW1CeXRlcyA+IHNkLT5TaXplKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgICBudW1EZWZpbmVkID0gQ291bnREZWZpbmVkQml0cyhzZC0+RGF0YSwgbnVtSXRlbXMpOw0KKyAgICBTS0lQX0RBVEEoc2QsIG51bUJ5dGVzKTsNCisgIH0NCisgIGlmIChudW1EZWZpbmVkID4gKHNkLT5TaXplID4+IDIpKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgIFNLSVBfREFUQShzZCwgKHNpemVfdCludW1EZWZpbmVkICogNCk7DQorICByZXR1cm4gU1pfT0s7DQorfQ0KKw0KK3N0YXRpYyBTUmVzIFJlYWRQYWNrSW5mbyhDU3pBciAqcCwgQ1N6RGF0YSAqc2QsIElTekFsbG9jICphbGxvYykNCit7DQorICBSSU5PSyhTelJlYWROdW1iZXIzMihzZCwgJnAtPk51bVBhY2tTdHJlYW1zKSk7DQorDQorICBSSU5PSyhXYWl0SWQoc2QsIGs3eklkU2l6ZSkpOw0KKyAgTVlfQUxMT0MoVUludDY0LCBwLT5QYWNrUG9zaXRpb25zLCAoc2l6ZV90KXAtPk51bVBhY2tTdHJlYW1zICsgMSwgYWxsb2MpOw0KKyAgew0KKyAgICBVSW50NjQgc3VtID0gMDsNCisgICAgVUludDMyIGk7DQorICAgIFVJbnQzMiBudW1QYWNrU3RyZWFtcyA9IHAtPk51bVBhY2tTdHJlYW1zOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGFja1N0cmVhbXM7IGkrKykNCisgICAgew0KKyAgICAgIFVJbnQ2NCBwYWNrU2l6ZTsNCisgICAgICBwLT5QYWNrUG9zaXRpb25zW2ldID0gc3VtOw0KKyAgICAgIFJJTk9LKFJlYWROdW1iZXIoc2QsICZwYWNrU2l6ZSkpOw0KKyAgICAgIHN1bSArPSBwYWNrU2l6ZTsNCisgICAgICBpZiAoc3VtIDwgcGFja1NpemUpDQorICAgICAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgICAgfQ0KKyAgICBwLT5QYWNrUG9zaXRpb25zW2ldID0gc3VtOw0KKyAgfQ0KKw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgVUludDY0IHR5cGU7DQorICAgIFJJTk9LKFJlYWRJRChzZCwgJnR5cGUpKTsNCisgICAgaWYgKHR5cGUgPT0gazd6SWRFbmQpDQorICAgICAgcmV0dXJuIFNaX09LOw0KKyAgICBpZiAodHlwZSA9PSBrN3pJZENSQykNCisgICAgew0KKyAgICAgIC8qIENSQyBvZiBwYWNrZWQgc3RyZWFtcyBpcyB1bnVzZWQgbm93ICovDQorICAgICAgUklOT0soU2tpcEJpdFVpMzJzKHNkLCBwLT5OdW1QYWNrU3RyZWFtcykpOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIFJJTk9LKFNraXBEYXRhKHNkKSk7DQorICB9DQorfQ0KKw0KKy8qDQorc3RhdGljIFNSZXMgU3pSZWFkU3dpdGNoKENTekRhdGEgKnNkKQ0KK3sNCisgIEJ5dGUgZXh0ZXJuYWw7DQorICBSSU5PSyhTelJlYWRCeXRlKHNkLCAmZXh0ZXJuYWwpKTsNCisgIHJldHVybiAoZXh0ZXJuYWwgPT0gMCkgPyBTWl9PSzogU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorfQ0KKyovDQorDQorI2RlZmluZSBTWl9OVU1fSU5fU1RSRUFNU19JTl9GT0xERVJfTUFYIDE2DQorDQorU1JlcyBTekdldE5leHRGb2xkZXJJdGVtKENTekZvbGRlciAqZiwgQ1N6RGF0YSAqc2QsIENTekRhdGEgKnNkU2l6ZXMpDQorew0KKyAgVUludDMyIG51bUNvZGVycywgbnVtQmluZFBhaXJzLCBudW1QYWNrU3RyZWFtcywgaTsNCisgIFVJbnQzMiBudW1JblN0cmVhbXMgPSAwLCBudW1PdXRTdHJlYW1zID0gMDsNCisgIGNvbnN0IEJ5dGUgKmRhdGFTdGFydCA9IHNkLT5EYXRhOw0KKyAgQnl0ZSBpblN0cmVhbVVzZWRbU1pfTlVNX0lOX1NUUkVBTVNfSU5fRk9MREVSX01BWF07DQorICANCisgIFJJTk9LKFN6UmVhZE51bWJlcjMyKHNkLCAmbnVtQ29kZXJzKSk7DQorICBpZiAobnVtQ29kZXJzID4gU1pfTlVNX0NPREVSU19JTl9GT0xERVJfTUFYKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICBmLT5OdW1Db2RlcnMgPSBudW1Db2RlcnM7DQorICANCisgIGZvciAoaSA9IDA7IGkgPCBudW1Db2RlcnM7IGkrKykNCisgIHsNCisgICAgQnl0ZSBtYWluQnl0ZTsNCisgICAgQ1N6Q29kZXJJbmZvICpjb2RlciA9IGYtPkNvZGVycyArIGk7DQorICAgIHVuc2lnbmVkIGlkU2l6ZSwgajsNCisgICAgVUludDY0IGlkOw0KKyAgICBSSU5PSyhTelJlYWRCeXRlKHNkLCAmbWFpbkJ5dGUpKTsNCisgICAgaWYgKChtYWluQnl0ZSAmIDB4QzApICE9IDApDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKyAgICBpZFNpemUgPSAodW5zaWduZWQpKG1haW5CeXRlICYgMHhGKTsNCisgICAgaWYgKGlkU2l6ZSA+IHNpemVvZihpZCkpDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKyAgICBpZiAoaWRTaXplID4gc2QtPlNpemUpDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorICAgIGlkID0gMDsNCisgICAgZm9yIChqID0gMDsgaiA8IGlkU2l6ZTsgaisrKQ0KKyAgICB7DQorICAgICAgaWQgPSAoKGlkIDw8IDgpIHwgKnNkLT5EYXRhKTsNCisgICAgICBzZC0+RGF0YSsrOw0KKyAgICAgIHNkLT5TaXplLS07DQorICAgIH0NCisgICAgaWYgKGlkID4gKFVJbnQzMikweEZGRkZGRkZGKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgICAgY29kZXItPk1ldGhvZElEID0gKFVJbnQzMilpZDsNCisgICAgDQorICAgIGNvZGVyLT5OdW1JblN0cmVhbXMgPSAxOw0KKyAgICBjb2Rlci0+TnVtT3V0U3RyZWFtcyA9IDE7DQorICAgIGNvZGVyLT5Qcm9wc09mZnNldCA9IDA7DQorICAgIGNvZGVyLT5Qcm9wc1NpemUgPSAwOw0KKyAgICANCisgICAgaWYgKChtYWluQnl0ZSAmIDB4MTApICE9IDApDQorICAgIHsNCisgICAgICBVSW50MzIgbnVtU3RyZWFtczsNCisgICAgICBSSU5PSyhTelJlYWROdW1iZXIzMihzZCwgJm51bVN0cmVhbXMpKTsNCisgICAgICBpZiAobnVtU3RyZWFtcyA+IE5VTV9DT0RFUl9TVFJFQU1TX01BWCkNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgICAgICBjb2Rlci0+TnVtSW5TdHJlYW1zID0gKEJ5dGUpbnVtU3RyZWFtczsNCisgICAgICBSSU5PSyhTelJlYWROdW1iZXIzMihzZCwgJm51bVN0cmVhbXMpKTsNCisgICAgICBpZiAobnVtU3RyZWFtcyA+IE5VTV9DT0RFUl9TVFJFQU1TX01BWCkNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgICAgICBjb2Rlci0+TnVtT3V0U3RyZWFtcyA9IChCeXRlKW51bVN0cmVhbXM7DQorICAgIH0NCisgICAgaWYgKChtYWluQnl0ZSAmIDB4MjApICE9IDApDQorICAgIHsNCisgICAgICBVSW50MzIgcHJvcHNTaXplID0gMDsNCisgICAgICBSSU5PSyhTelJlYWROdW1iZXIzMihzZCwgJnByb3BzU2l6ZSkpOw0KKyAgICAgIGlmIChwcm9wc1NpemUgPj0gMHg0MCkNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgICAgICBpZiAocHJvcHNTaXplID4gc2QtPlNpemUpDQorICAgICAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgICAgICBjb2Rlci0+UHJvcHNPZmZzZXQgPSBzZC0+RGF0YSAtIGRhdGFTdGFydDsNCisgICAgICBjb2Rlci0+UHJvcHNTaXplID0gKEJ5dGUpcHJvcHNTaXplOw0KKyAgICAgIHNkLT5EYXRhICs9IChzaXplX3QpcHJvcHNTaXplOw0KKyAgICAgIHNkLT5TaXplIC09IChzaXplX3QpcHJvcHNTaXplOw0KKyAgICB9DQorICAgIG51bUluU3RyZWFtcyArPSBjb2Rlci0+TnVtSW5TdHJlYW1zOw0KKyAgICBudW1PdXRTdHJlYW1zICs9IGNvZGVyLT5OdW1PdXRTdHJlYW1zOw0KKyAgfQ0KKw0KKyAgaWYgKG51bU91dFN0cmVhbXMgPT0gMCkNCisgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKw0KKyAgZi0+TnVtQmluZFBhaXJzID0gbnVtQmluZFBhaXJzID0gbnVtT3V0U3RyZWFtcyAtIDE7DQorICBpZiAobnVtSW5TdHJlYW1zIDwgbnVtQmluZFBhaXJzKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgIGlmIChudW1JblN0cmVhbXMgPiBTWl9OVU1fSU5fU1RSRUFNU19JTl9GT0xERVJfTUFYKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICBmLT5NYWluT3V0U3RyZWFtID0gMDsNCisgIGYtPk51bVBhY2tTdHJlYW1zID0gbnVtUGFja1N0cmVhbXMgPSBudW1JblN0cmVhbXMgLSBudW1CaW5kUGFpcnM7DQorICBpZiAobnVtUGFja1N0cmVhbXMgPiBTWl9OVU1fUEFDS19TVFJFQU1TX0lOX0ZPTERFUl9NQVgpDQorICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgIGZvciAoaSA9IDA7IGkgPCBudW1JblN0cmVhbXM7IGkrKykNCisgICAgaW5TdHJlYW1Vc2VkW2ldID0gRmFsc2U7DQorICBpZiAobnVtQmluZFBhaXJzICE9IDApDQorICB7DQorICAgIEJ5dGUgb3V0U3RyZWFtVXNlZFtTWl9OVU1fQ09ERVJTX09VVF9TVFJFQU1TX0lOX0ZPTERFUl9NQVhdOw0KKw0KKyAgICBpZiAobnVtQmluZFBhaXJzID4gU1pfTlVNX0JJTkRTX0lOX0ZPTERFUl9NQVgpDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtT3V0U3RyZWFtczsgaSsrKQ0KKyAgICAgIG91dFN0cmVhbVVzZWRbaV0gPSBGYWxzZTsNCisNCisgICAgZm9yIChpID0gMDsgaSA8IG51bUJpbmRQYWlyczsgaSsrKQ0KKyAgICB7DQorICAgICAgQ1N6QmluZFBhaXIgKmJwID0gZi0+QmluZFBhaXJzICsgaTsNCisgICAgICBSSU5PSyhTelJlYWROdW1iZXIzMihzZCwgJmJwLT5JbkluZGV4KSk7DQorICAgICAgaWYgKGJwLT5JbkluZGV4ID49IG51bUluU3RyZWFtcykNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgICAgIGluU3RyZWFtVXNlZFticC0+SW5JbmRleF0gPSBUcnVlOw0KKyAgICAgIFJJTk9LKFN6UmVhZE51bWJlcjMyKHNkLCAmYnAtPk91dEluZGV4KSk7DQorICAgICAgaWYgKGJwLT5PdXRJbmRleCA+PSBudW1JblN0cmVhbXMpDQorICAgICAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgICAgICBvdXRTdHJlYW1Vc2VkW2JwLT5PdXRJbmRleF0gPSBUcnVlOw0KKyAgICB9DQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1PdXRTdHJlYW1zOyBpKyspDQorICAgICAgaWYgKCFvdXRTdHJlYW1Vc2VkW2ldKQ0KKyAgICAgIHsNCisgICAgICAgIGYtPk1haW5PdXRTdHJlYW0gPSBpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICBpZiAoaSA9PSBudW1PdXRTdHJlYW1zKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgfQ0KKw0KKyAgaWYgKG51bVBhY2tTdHJlYW1zID09IDEpDQorICB7DQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1JblN0cmVhbXM7IGkrKykNCisgICAgICBpZiAoIWluU3RyZWFtVXNlZFtpXSkNCisgICAgICAgIGJyZWFrOw0KKyAgICBpZiAoaSA9PSBudW1JblN0cmVhbXMpDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorICAgIGYtPlBhY2tTdHJlYW1zWzBdID0gaTsNCisgIH0NCisgIGVsc2UNCisgICAgZm9yIChpID0gMDsgaSA8IG51bVBhY2tTdHJlYW1zOyBpKyspDQorICAgIHsNCisgICAgICBSSU5PSyhTelJlYWROdW1iZXIzMihzZCwgZi0+UGFja1N0cmVhbXMgKyBpKSk7DQorICAgIH0NCisNCisgIGZvciAoaSA9IDA7IGkgPCBudW1PdXRTdHJlYW1zOyBpKyspDQorICB7DQorICAgIFJJTk9LKFJlYWROdW1iZXIoc2RTaXplcywgZi0+Q29kZXJzVW5wYWNrU2l6ZXMgKyBpKSk7DQorICB9DQorICANCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorc3RhdGljIE1ZX05PX0lOTElORSBTUmVzIFNraXBOdW1iZXJzKENTekRhdGEgKnNkMiwgVUludDMyIG51bSkNCit7DQorICBDU3pEYXRhIHNkOw0KKyAgc2QgPSAqc2QyOw0KKyAgZm9yICg7IG51bSAhPSAwOyBudW0tLSkNCisgIHsNCisgICAgQnl0ZSBmaXJzdEJ5dGUsIG1hc2s7DQorICAgIHVuc2lnbmVkIGk7DQorICAgIFNaX1JFQURfQllURV8yKGZpcnN0Qnl0ZSk7DQorICAgIGlmICgoZmlyc3RCeXRlICYgMHg4MCkgPT0gMCkNCisgICAgICBjb250aW51ZTsNCisgICAgaWYgKChmaXJzdEJ5dGUgJiAweDQwKSA9PSAwKQ0KKyAgICB7DQorICAgICAgaWYgKHNkLlNpemUgPT0gMCkNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgICAgIHNkLlNpemUtLTsNCisgICAgICBzZC5EYXRhKys7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgbWFzayA9IDB4MjA7DQorICAgIGZvciAoaSA9IDI7IGkgPCA4ICYmIChmaXJzdEJ5dGUgJiBtYXNrKSAhPSAwOyBpKyspDQorICAgICAgbWFzayA+Pj0gMTsNCisgICAgaWYgKGkgPiBzZC5TaXplKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgICBTS0lQX0RBVEEyKHNkLCBpKTsNCisgIH0NCisgICpzZDIgPSBzZDsNCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorI2RlZmluZSBrX0luU3RyZWFtVXNlZF9NQVggNjQNCisjZGVmaW5lIGtfT3V0U3RyZWFtVXNlZF9NQVggNjQNCisNCitzdGF0aWMgU1JlcyBSZWFkVW5wYWNrSW5mbyhDU3pBciAqcCwNCisgICAgQ1N6RGF0YSAqc2QyLA0KKyAgICBVSW50MzIgbnVtRm9sZGVyc01heCwgY29uc3QgQ0J1ZiAqdGVtcEJ1ZnMsIFVJbnQzMiBudW1UZW1wQnVmcywNCisgICAgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIENTekRhdGEgc2Q7DQorICBCeXRlIGluU3RyZWFtVXNlZFtrX0luU3RyZWFtVXNlZF9NQVhdOw0KKyAgQnl0ZSBvdXRTdHJlYW1Vc2VkW2tfT3V0U3RyZWFtVXNlZF9NQVhdOw0KKyAgVUludDMyIGZvLCBudW1Gb2xkZXJzLCBudW1Db2RlcnNPdXRTdHJlYW1zLCBwYWNrU3RyZWFtSW5kZXg7DQorICBjb25zdCBCeXRlICpzdGFydEJ1ZlB0cjsNCisgIEJ5dGUgZXh0ZXJuYWw7DQorICANCisgIFJJTk9LKFdhaXRJZChzZDIsIGs3eklkRm9sZGVyKSk7DQorICBSSU5PSyhTelJlYWROdW1iZXIzMihzZDIsICZudW1Gb2xkZXJzKSk7DQorICBpZiAocC0+TnVtRm9sZGVycyA+IG51bUZvbGRlcnNNYXgpDQorICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgIHAtPk51bUZvbGRlcnMgPSBudW1Gb2xkZXJzOw0KKw0KKyAgU1pfUkVBRF9CWVRFX1NEKHNkMiwgZXh0ZXJuYWwpOw0KKyAgaWYgKGV4dGVybmFsID09IDApDQorICAgIHNkID0gKnNkMjsNCisgIGVsc2UNCisgIHsNCisgICAgVUludDMyIGluZGV4Ow0KKyAgICBTelJlYWROdW1iZXIzMihzZDIsICZpbmRleCk7DQorICAgIGlmIChpbmRleCA+PSBudW1UZW1wQnVmcykNCisgICAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgICAgc2QuRGF0YSA9IHRlbXBCdWZzW2luZGV4XS5kYXRhOw0KKyAgICBzZC5TaXplID0gdGVtcEJ1ZnNbaW5kZXhdLnNpemU7DQorICB9DQorICANCisgIE1ZX0FMTE9DKHNpemVfdCwgcC0+Rm9Db2RlcnNPZmZzZXRzLCAoc2l6ZV90KW51bUZvbGRlcnMgKyAxLCBhbGxvYyk7DQorICBNWV9BTExPQyhzaXplX3QsIHAtPkZvU2l6ZXNPZmZzZXRzLCAoc2l6ZV90KW51bUZvbGRlcnMgKyAxLCBhbGxvYyk7DQorICBNWV9BTExPQyhVSW50MzIsIHAtPkZvU3RhcnRQYWNrU3RyZWFtSW5kZXgsIChzaXplX3QpbnVtRm9sZGVycyArIDEsIGFsbG9jKTsNCisgIA0KKyAgc3RhcnRCdWZQdHIgPSBzZC5EYXRhOw0KKyAgDQorICBwYWNrU3RyZWFtSW5kZXggPSAwOw0KKyAgbnVtQ29kZXJzT3V0U3RyZWFtcyA9IDA7DQorDQorICBmb3IgKGZvID0gMDsgZm8gPCBudW1Gb2xkZXJzOyBmbysrKQ0KKyAgew0KKyAgICBVSW50MzIgbnVtQ29kZXJzLCBjaSwgbnVtSW5TdHJlYW1zID0gMCwgbnVtT3V0U3RyZWFtcyA9IDA7DQorICAgIA0KKyAgICBwLT5Gb0NvZGVyc09mZnNldHNbZm9dID0gc2QuRGF0YSAtIHN0YXJ0QnVmUHRyOw0KKyAgICBSSU5PSyhTelJlYWROdW1iZXIzMigmc2QsICZudW1Db2RlcnMpKTsNCisgICAgaWYgKG51bUNvZGVycyA+IE5VTV9GT0xERVJfQ09ERVJTX01BWCkNCisgICAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICAgIA0KKyAgICBmb3IgKGNpID0gMDsgY2kgPCBudW1Db2RlcnM7IGNpKyspDQorICAgIHsNCisgICAgICBCeXRlIG1haW5CeXRlOw0KKyAgICAgIHVuc2lnbmVkIGlkU2l6ZTsNCisgICAgICBVSW50MzIgY29kZXJJblN0cmVhbXMsIGNvZGVyT3V0U3RyZWFtczsNCisgICAgICANCisgICAgICBTWl9SRUFEX0JZVEVfMihtYWluQnl0ZSk7DQorICAgICAgaWYgKChtYWluQnl0ZSAmIDB4QzApICE9IDApDQorICAgICAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICAgICAgaWRTaXplID0gKG1haW5CeXRlICYgMHhGKTsNCisgICAgICBpZiAoaWRTaXplID4gOCkNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgICAgICBpZiAoaWRTaXplID4gc2QuU2l6ZSkNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgICAgIFNLSVBfREFUQTIoc2QsIGlkU2l6ZSk7DQorICAgICAgDQorICAgICAgY29kZXJJblN0cmVhbXMgPSAxOw0KKyAgICAgIGNvZGVyT3V0U3RyZWFtcyA9IDE7DQorICAgICAgaWYgKChtYWluQnl0ZSAmIDB4MTApICE9IDApDQorICAgICAgew0KKyAgICAgICAgUklOT0soU3pSZWFkTnVtYmVyMzIoJnNkLCAmY29kZXJJblN0cmVhbXMpKTsNCisgICAgICAgIFJJTk9LKFN6UmVhZE51bWJlcjMyKCZzZCwgJmNvZGVyT3V0U3RyZWFtcykpOw0KKyAgICAgICAgaWYgKGNvZGVySW5TdHJlYW1zID4gTlVNX0NPREVSX1NUUkVBTVNfTUFYIHx8DQorICAgICAgICAgICAgY29kZXJPdXRTdHJlYW1zID4gTlVNX0NPREVSX1NUUkVBTVNfTUFYKQ0KKyAgICAgICAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICAgICAgfQ0KKyAgICAgIG51bUluU3RyZWFtcyArPSBjb2RlckluU3RyZWFtczsNCisgICAgICBudW1PdXRTdHJlYW1zICs9IGNvZGVyT3V0U3RyZWFtczsNCisgICAgICBpZiAoKG1haW5CeXRlICYgMHgyMCkgIT0gMCkNCisgICAgICB7DQorICAgICAgICBVSW50MzIgcHJvcHNTaXplOw0KKyAgICAgICAgUklOT0soU3pSZWFkTnVtYmVyMzIoJnNkLCAmcHJvcHNTaXplKSk7DQorICAgICAgICBpZiAocHJvcHNTaXplID4gc2QuU2l6ZSkNCisgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorICAgICAgICBTS0lQX0RBVEEyKHNkLCBwcm9wc1NpemUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgew0KKyAgICAgIFVJbnQzMiBpbmRleE9mTWFpblN0cmVhbSA9IDA7DQorICAgICAgVUludDMyIG51bVBhY2tTdHJlYW1zID0gMTsNCisgICAgICBpZiAobnVtT3V0U3RyZWFtcyAhPSAxIHx8IG51bUluU3RyZWFtcyAhPSAxKQ0KKyAgICAgIHsNCisgICAgICAgIFVJbnQzMiBpOw0KKyAgICAgICAgVUludDMyIG51bUJpbmRQYWlycyA9IG51bU91dFN0cmVhbXMgLSAxOw0KKyAgICAgICAgaWYgKG51bU91dFN0cmVhbXMgPT0gMCB8fCBudW1JblN0cmVhbXMgPCBudW1CaW5kUGFpcnMpDQorICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgICAgICAgDQorICAgICAgICBpZiAobnVtSW5TdHJlYW1zID4ga19JblN0cmVhbVVzZWRfTUFYIHx8DQorICAgICAgICAgICAgbnVtT3V0U3RyZWFtcyA+IGtfT3V0U3RyZWFtVXNlZF9NQVgpDQorICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgICAgICAgIA0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUluU3RyZWFtczsgaSsrKQ0KKyAgICAgICAgICBpblN0cmVhbVVzZWRbaV0gPSBGYWxzZTsNCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1PdXRTdHJlYW1zOyBpKyspDQorICAgICAgICAgIG91dFN0cmVhbVVzZWRbaV0gPSBGYWxzZTsNCisgICAgICAgIA0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUJpbmRQYWlyczsgaSsrKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBVSW50MzIgaW5kZXg7DQorICAgICAgICAgIFJJTk9LKFN6UmVhZE51bWJlcjMyKCZzZCwgJmluZGV4KSk7DQorICAgICAgICAgIGlmIChpbmRleCA+PSBudW1JblN0cmVhbXMgfHwgaW5TdHJlYW1Vc2VkW2luZGV4XSkNCisgICAgICAgICAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgICAgICAgICAgaW5TdHJlYW1Vc2VkW2luZGV4XSA9IFRydWU7DQorICAgICAgICAgIFJJTk9LKFN6UmVhZE51bWJlcjMyKCZzZCwgJmluZGV4KSk7DQorICAgICAgICAgIGlmIChpbmRleCA+PSBudW1JblN0cmVhbXMgfHwgb3V0U3RyZWFtVXNlZFtpbmRleF0pDQorICAgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorICAgICAgICAgIG91dFN0cmVhbVVzZWRbaW5kZXhdID0gVHJ1ZTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgbnVtUGFja1N0cmVhbXMgPSBudW1JblN0cmVhbXMgLSBudW1CaW5kUGFpcnM7DQorICAgICAgICANCisgICAgICAgIGlmIChudW1QYWNrU3RyZWFtcyAhPSAxKQ0KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGFja1N0cmVhbXM7IGkrKykNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIFVJbnQzMiB0ZW1wOw0KKyAgICAgICAgICAgIFJJTk9LKFN6UmVhZE51bWJlcjMyKCZzZCwgJnRlbXApKTsNCisgICAgICAgICAgICBpZiAodGVtcCA+PSBudW1JblN0cmVhbXMpDQorICAgICAgICAgICAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1PdXRTdHJlYW1zOyBpKyspDQorICAgICAgICAgIGlmICghb3V0U3RyZWFtVXNlZFtpXSkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGluZGV4T2ZNYWluU3RyZWFtID0gaTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyANCisgICAgICAgIGlmIChpID09IG51bU91dFN0cmVhbXMpDQorICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgICAgIH0NCisgICAgICBwLT5Gb1N0YXJ0UGFja1N0cmVhbUluZGV4W2ZvXSA9IHBhY2tTdHJlYW1JbmRleDsNCisgICAgICBwLT5Gb1NpemVzT2Zmc2V0c1tmb10gPSAobnVtT3V0U3RyZWFtcyA8PCA4KSB8IGluZGV4T2ZNYWluU3RyZWFtOw0KKyAgICAgIG51bUNvZGVyc091dFN0cmVhbXMgKz0gbnVtT3V0U3RyZWFtczsNCisgICAgICBpZiAobnVtQ29kZXJzT3V0U3RyZWFtcyA8IG51bU91dFN0cmVhbXMpDQorICAgICAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICAgICAgcGFja1N0cmVhbUluZGV4ICs9IG51bVBhY2tTdHJlYW1zOw0KKyAgICAgIGlmIChwYWNrU3RyZWFtSW5kZXggPCBudW1QYWNrU3RyZWFtcykNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgICAgICBpZiAocGFja1N0cmVhbUluZGV4ID4gcC0+TnVtUGFja1N0cmVhbXMpDQorICAgICAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICB7DQorICAgIHNpemVfdCBkYXRhU2l6ZSA9IHNkLkRhdGEgLSBzdGFydEJ1ZlB0cjsNCisgICAgcC0+Rm9TdGFydFBhY2tTdHJlYW1JbmRleFtmb10gPSBwYWNrU3RyZWFtSW5kZXg7DQorICAgIHAtPkZvQ29kZXJzT2Zmc2V0c1tmb10gPSBkYXRhU2l6ZTsNCisgICAgTVlfQUxMT0MoQnl0ZSwgcC0+Q29kZXJzRGF0YSwgZGF0YVNpemUsIGFsbG9jKTsNCisgICAgbWVtY3B5KHAtPkNvZGVyc0RhdGEsIHN0YXJ0QnVmUHRyLCBkYXRhU2l6ZSk7DQorICB9DQorICANCisgIGlmIChleHRlcm5hbCAhPSAwKQ0KKyAgew0KKyAgICBpZiAoc2QuU2l6ZSAhPSAwKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgICBzZCA9ICpzZDI7DQorICB9DQorICANCisgIFJJTk9LKFdhaXRJZCgmc2QsIGs3eklkQ29kZXJzVW5wYWNrU2l6ZSkpOw0KKyAgDQorICAvLyBNWV9BTExPQyhVSW50NjQsIHAtPkNvZGVyVW5wYWNrU2l6ZXMsIChzaXplX3QpbnVtQ29kZXJzT3V0U3RyZWFtcywgYWxsb2MpOw0KKyAgew0KKyAgICBzaXplX3QgZGF0YVNpemUgPSBzZC5TaXplOw0KKyAgICAvKg0KKyAgICBVSW50MzIgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IG51bUNvZGVyc091dFN0cmVhbXM7IGkrKykNCisgICAgew0KKyAgICBSSU5PSyhSZWFkTnVtYmVyKCZzZCwgcC0+Q29kZXJVbnBhY2tTaXplcyArIGkpKTsNCisgICAgfQ0KKyAgICAqLw0KKyAgICBSSU5PSyhTa2lwTnVtYmVycygmc2QsIG51bUNvZGVyc091dFN0cmVhbXMpKTsNCisgICAgZGF0YVNpemUgLT0gc2QuU2l6ZTsNCisgICAgTVlfQUxMT0MoQnl0ZSwgcC0+VW5wYWNrU2l6ZXNEYXRhLCBkYXRhU2l6ZSwgYWxsb2MpOw0KKyAgICBtZW1jcHkocC0+VW5wYWNrU2l6ZXNEYXRhLCBzZC5EYXRhIC0gZGF0YVNpemUsIGRhdGFTaXplKTsNCisgICAgcC0+VW5wYWNrU2l6ZXNEYXRhU2l6ZSA9IGRhdGFTaXplOw0KKyAgICAvKg0KKyAgICBjb25zdCBCeXRlICpkYXRhID0gU3pSZWFkTnVtYmVycyhzZC5EYXRhLCBzZC5EYXRhICsgc2QuU2l6ZSwgcC0+Q29kZXJVbnBhY2tTaXplcywgbnVtQ29kZXJzT3V0U3RyZWFtcyk7DQorICAgIGlmIChkYXRhID09IE5VTEwpDQorICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgICBzZC5TaXplID0gc2QuRGF0YSArIHNkLlNpemUgLSBkYXRhOw0KKyAgICBzZC5EYXRhID0gZGF0YTsNCisgICAgKi8NCisgIH0NCisNCisgIGZvciAoOzspDQorICB7DQorICAgIFVJbnQ2NCB0eXBlOw0KKyAgICBSSU5PSyhSZWFkSUQoJnNkLCAmdHlwZSkpOw0KKyAgICBpZiAodHlwZSA9PSBrN3pJZEVuZCkNCisgICAgew0KKyAgICAgICpzZDIgPSBzZDsNCisgICAgICByZXR1cm4gU1pfT0s7DQorICAgIH0NCisgICAgaWYgKHR5cGUgPT0gazd6SWRDUkMpDQorICAgIHsNCisgICAgICBSSU5PSyhSZWFkQml0VWkzMnMoJnNkLCBudW1Gb2xkZXJzLCAmcC0+Rm9sZGVyQ1JDcywgYWxsb2MpKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBSSU5PSyhTa2lwRGF0YSgmc2QpKTsNCisgIH0NCit9DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBVSW50MzIgTnVtVG90YWxTdWJTdHJlYW1zOw0KKyAgVUludDMyIE51bVN1YkRpZ2VzdHM7DQorICBDU3pEYXRhIHNkTnVtU3ViU3RyZWFtczsNCisgIENTekRhdGEgc2RTaXplczsNCisgIENTekRhdGEgc2RDUkNzOw0KK30gQ1N1YlN0cmVhbUluZm87DQorDQorI2RlZmluZSBTelVpMzJJbmRleE1heCAoKChVSW50MzIpMSA8PCAzMSkgLSAyKQ0KKw0KK3N0YXRpYyBTUmVzIFJlYWRTdWJTdHJlYW1zSW5mbyhDU3pBciAqcCwgQ1N6RGF0YSAqc2QsIENTdWJTdHJlYW1JbmZvICpzc2kpDQorew0KKyAgVUludDY0IHR5cGUgPSAwOw0KKyAgVUludDMyIGk7DQorICBVSW50MzIgbnVtU3ViRGlnZXN0cyA9IDA7DQorICBVSW50MzIgbnVtRm9sZGVycyA9IHAtPk51bUZvbGRlcnM7DQorICBVSW50MzIgbnVtVW5wYWNrU3RyZWFtcyA9IG51bUZvbGRlcnM7DQorICBVSW50MzIgbnVtVW5wYWNrU2l6ZXNJbkRhdGEgPSAwOw0KKw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgUklOT0soUmVhZElEKHNkLCAmdHlwZSkpOw0KKyAgICBpZiAodHlwZSA9PSBrN3pJZE51bVVucGFja1N0cmVhbSkNCisgICAgew0KKyAgICAgIHNzaS0+c2ROdW1TdWJTdHJlYW1zLkRhdGEgPSBzZC0+RGF0YTsNCisgICAgICBudW1VbnBhY2tTdHJlYW1zID0gMDsNCisgICAgICBudW1TdWJEaWdlc3RzID0gMDsNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRm9sZGVyczsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgIFVJbnQzMiBudW1TdHJlYW1zOw0KKyAgICAgICAgUklOT0soU3pSZWFkTnVtYmVyMzIoc2QsICZudW1TdHJlYW1zKSk7DQorICAgICAgICBpZiAobnVtVW5wYWNrU3RyZWFtcyA+IG51bVVucGFja1N0cmVhbXMgKyBudW1TdHJlYW1zKQ0KKyAgICAgICAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICAgICAgICBudW1VbnBhY2tTdHJlYW1zICs9IG51bVN0cmVhbXM7DQorICAgICAgICBpZiAobnVtU3RyZWFtcyAhPSAwKQ0KKyAgICAgICAgICBudW1VbnBhY2tTaXplc0luRGF0YSArPSAobnVtU3RyZWFtcyAtIDEpOw0KKyAgICAgICAgaWYgKG51bVN0cmVhbXMgIT0gMSB8fCAhU3pCaXRXaXRoVmFsc19DaGVjaygmcC0+Rm9sZGVyQ1JDcywgaSkpDQorICAgICAgICAgIG51bVN1YkRpZ2VzdHMgKz0gbnVtU3RyZWFtczsNCisgICAgICB9DQorICAgICAgc3NpLT5zZE51bVN1YlN0cmVhbXMuU2l6ZSA9IHNkLT5EYXRhIC0gc3NpLT5zZE51bVN1YlN0cmVhbXMuRGF0YTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAodHlwZSA9PSBrN3pJZENSQyB8fCB0eXBlID09IGs3eklkU2l6ZSB8fCB0eXBlID09IGs3eklkRW5kKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBSSU5PSyhTa2lwRGF0YShzZCkpOw0KKyAgfQ0KKw0KKyAgaWYgKCFzc2ktPnNkTnVtU3ViU3RyZWFtcy5EYXRhKQ0KKyAgew0KKyAgICBudW1TdWJEaWdlc3RzID0gbnVtRm9sZGVyczsNCisgICAgaWYgKHAtPkZvbGRlckNSQ3MuRGVmcykNCisgICAgICBudW1TdWJEaWdlc3RzID0gbnVtRm9sZGVycyAtIENvdW50RGVmaW5lZEJpdHMocC0+Rm9sZGVyQ1JDcy5EZWZzLCBudW1Gb2xkZXJzKTsNCisgIH0NCisgIA0KKyAgc3NpLT5OdW1Ub3RhbFN1YlN0cmVhbXMgPSBudW1VbnBhY2tTdHJlYW1zOw0KKyAgc3NpLT5OdW1TdWJEaWdlc3RzID0gbnVtU3ViRGlnZXN0czsNCisNCisgIGlmICh0eXBlID09IGs3eklkU2l6ZSkNCisgIHsNCisgICAgc3NpLT5zZFNpemVzLkRhdGEgPSBzZC0+RGF0YTsNCisgICAgUklOT0soU2tpcE51bWJlcnMoc2QsIG51bVVucGFja1NpemVzSW5EYXRhKSk7DQorICAgIHNzaS0+c2RTaXplcy5TaXplID0gc2QtPkRhdGEgLSBzc2ktPnNkU2l6ZXMuRGF0YTsNCisgICAgUklOT0soUmVhZElEKHNkLCAmdHlwZSkpOw0KKyAgfQ0KKw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgaWYgKHR5cGUgPT0gazd6SWRFbmQpDQorICAgICAgcmV0dXJuIFNaX09LOw0KKyAgICBpZiAodHlwZSA9PSBrN3pJZENSQykNCisgICAgew0KKyAgICAgIHNzaS0+c2RDUkNzLkRhdGEgPSBzZC0+RGF0YTsNCisgICAgICBSSU5PSyhTa2lwQml0VWkzMnMoc2QsIG51bVN1YkRpZ2VzdHMpKTsNCisgICAgICBzc2ktPnNkQ1JDcy5TaXplID0gc2QtPkRhdGEgLSBzc2ktPnNkQ1JDcy5EYXRhOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIFJJTk9LKFNraXBEYXRhKHNkKSk7DQorICAgIH0NCisgICAgUklOT0soUmVhZElEKHNkLCAmdHlwZSkpOw0KKyAgfQ0KK30NCisNCitzdGF0aWMgU1JlcyBTelJlYWRTdHJlYW1zSW5mbyhDU3pBciAqcCwNCisgICAgQ1N6RGF0YSAqc2QsDQorICAgIFVJbnQzMiBudW1Gb2xkZXJzTWF4LCBjb25zdCBDQnVmICp0ZW1wQnVmcywgVUludDMyIG51bVRlbXBCdWZzLA0KKyAgICBVSW50NjQgKmRhdGFPZmZzZXQsDQorICAgIENTdWJTdHJlYW1JbmZvICpzc2ksDQorICAgIElTekFsbG9jICphbGxvYykNCit7DQorICBVSW50NjQgdHlwZTsNCisNCisgIFN6RGF0YV9DbGVhcigmc3NpLT5zZFNpemVzKTsNCisgIFN6RGF0YV9DbGVhcigmc3NpLT5zZENSQ3MpOw0KKyAgU3pEYXRhX0NsZWFyKCZzc2ktPnNkTnVtU3ViU3RyZWFtcyk7DQorDQorICAqZGF0YU9mZnNldCA9IDA7DQorICBSSU5PSyhSZWFkSUQoc2QsICZ0eXBlKSk7DQorICBpZiAodHlwZSA9PSBrN3pJZFBhY2tJbmZvKQ0KKyAgew0KKyAgICBSSU5PSyhSZWFkTnVtYmVyKHNkLCBkYXRhT2Zmc2V0KSk7DQorICAgIFJJTk9LKFJlYWRQYWNrSW5mbyhwLCBzZCwgYWxsb2MpKTsNCisgICAgUklOT0soUmVhZElEKHNkLCAmdHlwZSkpOw0KKyAgfQ0KKyAgaWYgKHR5cGUgPT0gazd6SWRVbnBhY2tJbmZvKQ0KKyAgew0KKyAgICBSSU5PSyhSZWFkVW5wYWNrSW5mbyhwLCBzZCwgbnVtRm9sZGVyc01heCwgdGVtcEJ1ZnMsIG51bVRlbXBCdWZzLCBhbGxvYykpOw0KKyAgICBSSU5PSyhSZWFkSUQoc2QsICZ0eXBlKSk7DQorICB9DQorICBpZiAodHlwZSA9PSBrN3pJZFN1YlN0cmVhbXNJbmZvKQ0KKyAgew0KKyAgICBSSU5PSyhSZWFkU3ViU3RyZWFtc0luZm8ocCwgc2QsIHNzaSkpOw0KKyAgICBSSU5PSyhSZWFkSUQoc2QsICZ0eXBlKSk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIHNzaS0+TnVtVG90YWxTdWJTdHJlYW1zID0gcC0+TnVtRm9sZGVyczsNCisgICAgLy8gc3NpLT5OdW1TdWJEaWdlc3RzID0gMDsNCisgIH0NCisNCisgIHJldHVybiAodHlwZSA9PSBrN3pJZEVuZCA/IFNaX09LIDogU1pfRVJST1JfVU5TVVBQT1JURUQpOw0KK30NCisNCitzdGF0aWMgU1JlcyBTelJlYWRBbmREZWNvZGVQYWNrZWRTdHJlYW1zKA0KKyAgICBJTG9va0luU3RyZWFtICppblN0cmVhbSwNCisgICAgQ1N6RGF0YSAqc2QsDQorICAgIENCdWYgKnRlbXBCdWZzLA0KKyAgICBVSW50MzIgbnVtRm9sZGVyc01heCwNCisgICAgVUludDY0IGJhc2VPZmZzZXQsDQorICAgIENTekFyICpwLA0KKyAgICBJU3pBbGxvYyAqYWxsb2NUZW1wKQ0KK3sNCisgIFVJbnQ2NCBkYXRhU3RhcnRQb3M7DQorICBVSW50MzIgZm87DQorICBDU3ViU3RyZWFtSW5mbyBzc2k7DQorICBDU3pEYXRhIHNkQ29kZXJzVW5wU2l6ZXM7DQorDQorICBSSU5PSyhTelJlYWRTdHJlYW1zSW5mbyhwLCBzZCwgbnVtRm9sZGVyc01heCwgTlVMTCwgMCwgJmRhdGFTdGFydFBvcywgJnNzaSwgYWxsb2NUZW1wKSk7DQorICANCisgIGRhdGFTdGFydFBvcyArPSBiYXNlT2Zmc2V0Ow0KKyAgaWYgKHAtPk51bUZvbGRlcnMgPT0gMCkNCisgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorIA0KKyAgc2RDb2RlcnNVbnBTaXplcy5EYXRhID0gcC0+VW5wYWNrU2l6ZXNEYXRhOw0KKyAgc2RDb2RlcnNVbnBTaXplcy5TaXplID0gcC0+VW5wYWNrU2l6ZXNEYXRhU2l6ZTsNCisgIGZvciAoZm8gPSAwOyBmbyA8IHAtPk51bUZvbGRlcnM7IGZvKyspDQorICAgIEJ1Zl9Jbml0KHRlbXBCdWZzICsgZm8pOw0KKyAgZm9yIChmbyA9IDA7IGZvIDwgcC0+TnVtRm9sZGVyczsgZm8rKykNCisgIHsNCisgICAgQ0J1ZiAqdGVtcEJ1ZiA9IHRlbXBCdWZzICsgZm87DQorICAgIC8vIGZvbGRlciA9IHAtPkZvbGRlcnM7DQorICAgIC8vIHVucGFja1NpemUgPSBTekFyX0dldEZvbGRlclVucGFja1NpemUocCwgMCk7DQorICAgIFVJbnQzMiBtaXggPSAoVUludDMyKXAtPkZvU2l6ZXNPZmZzZXRzW2ZvXTsNCisgICAgVUludDMyIG1haW5JbmRleCA9IG1peCAmIDB4RkY7DQorICAgIFVJbnQzMiBudW1PdXRTdHJlYW1zID0gbWl4ID4+IDg7DQorICAgIFVJbnQzMiBzaTsNCisgICAgVUludDY0IHVucGFja1NpemUgPSAwOw0KKyAgICBwLT5Gb1NpemVzT2Zmc2V0c1tmb10gPSBzZENvZGVyc1VucFNpemVzLkRhdGEgLSBwLT5VbnBhY2tTaXplc0RhdGE7DQorICAgIGZvciAoc2kgPSAwOyBzaSA8IG51bU91dFN0cmVhbXM7IHNpKyspDQorICAgIHsNCisgICAgICBVSW50NjQgY3VyU2l6ZTsNCisgICAgICBSSU5PSyhSZWFkTnVtYmVyKCZzZENvZGVyc1VucFNpemVzLCAmY3VyU2l6ZSkpOw0KKyAgICAgIGlmIChzaSA9PSBtYWluSW5kZXgpDQorICAgICAgew0KKyAgICAgICAgdW5wYWNrU2l6ZSA9IGN1clNpemU7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKHNpID09IG51bU91dFN0cmVhbXMpDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX0ZBSUw7DQorICAgIGlmICgoc2l6ZV90KXVucGFja1NpemUgIT0gdW5wYWNrU2l6ZSkNCisgICAgICByZXR1cm4gU1pfRVJST1JfTUVNOw0KKyAgICBpZiAoIUJ1Zl9DcmVhdGUodGVtcEJ1ZiwgKHNpemVfdCl1bnBhY2tTaXplLCBhbGxvY1RlbXApKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorICB9DQorICBwLT5Gb1NpemVzT2Zmc2V0c1tmb10gPSBzZENvZGVyc1VucFNpemVzLkRhdGEgLSBwLT5VbnBhY2tTaXplc0RhdGE7DQorICAgIA0KKyAgZm9yIChmbyA9IDA7IGZvIDwgcC0+TnVtRm9sZGVyczsgZm8rKykNCisgIHsNCisgICAgY29uc3QgQ0J1ZiAqdGVtcEJ1ZiA9IHRlbXBCdWZzICsgZm87DQorICAgIFJJTk9LKExvb2tJblN0cmVhbV9TZWVrVG8oaW5TdHJlYW0sIGRhdGFTdGFydFBvcykpOw0KKyAgICBSSU5PSyhTekFyX0RlY29kZUZvbGRlcihwLCBmbywgaW5TdHJlYW0sIGRhdGFTdGFydFBvcywgdGVtcEJ1Zi0+ZGF0YSwgdGVtcEJ1Zi0+c2l6ZSwgYWxsb2NUZW1wKSk7DQorICAgIGlmIChTekJpdFdpdGhWYWxzX0NoZWNrKCZwLT5Gb2xkZXJDUkNzLCBmbykpDQorICAgICAgaWYgKENyY0NhbGModGVtcEJ1Zi0+ZGF0YSwgdGVtcEJ1Zi0+c2l6ZSkgIT0gcC0+Rm9sZGVyQ1JDcy5WYWxzW2ZvXSkNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9DUkM7DQorICB9DQorICByZXR1cm4gU1pfT0s7DQorfQ0KKw0KK3N0YXRpYyBTUmVzIFN6UmVhZEZpbGVOYW1lcyhjb25zdCBCeXRlICpkYXRhLCBzaXplX3Qgc2l6ZSwgVUludDMyIG51bUZpbGVzLCBzaXplX3QgKm9mZnNldHMpDQorew0KKyAgc2l6ZV90IHBvcyA9IDA7DQorICAqb2Zmc2V0cysrID0gMDsNCisgIGlmIChudW1GaWxlcyA9PSAwKQ0KKyAgICByZXR1cm4gKHNpemUgPT0gMCkgPyBTWl9PSyA6IFNaX0VSUk9SX0FSQ0hJVkU7DQorICBpZiAoZGF0YVtzaXplIC0gMl0gIT0gMCB8fCBkYXRhW3NpemUgLSAxXSAhPSAwKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgIGRvDQorICB7DQorICAgIGNvbnN0IEJ5dGUgKnA7DQorICAgIGlmIChwb3MgPT0gc2l6ZSkNCisgICAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgICAgZm9yIChwID0gZGF0YSArIHBvczsNCisgICAgICAjaWZkZWYgX1dJTjMyDQorICAgICAgKihjb25zdCBVSW50MTYgKilwICE9IDANCisgICAgICAjZWxzZQ0KKyAgICAgIHBbMF0gIT0gMCB8fCBwWzFdICE9IDANCisgICAgICAjZW5kaWYNCisgICAgICA7IHAgKz0gMik7DQorICAgIHBvcyA9IHAgLSBkYXRhICsgMjsNCisgICAgKm9mZnNldHMrKyA9IChwb3MgPj4gMSk7DQorICB9DQorICB3aGlsZSAoLS1udW1GaWxlcyk7DQorICByZXR1cm4gKHBvcyA9PSBzaXplKSA/IFNaX09LIDogU1pfRVJST1JfQVJDSElWRTsNCit9DQorDQorc3RhdGljIE1ZX05PX0lOTElORSBTUmVzIFJlYWRUaW1lKENTekJpdFVpNjRzICpwLCBVSW50MzIgbnVtLA0KKyAgICBDU3pEYXRhICpzZDIsDQorICAgIGNvbnN0IENCdWYgKnRlbXBCdWZzLCBVSW50MzIgbnVtVGVtcEJ1ZnMsDQorICAgIElTekFsbG9jICphbGxvYykNCit7DQorICBDU3pEYXRhIHNkOw0KKyAgVUludDMyIGk7DQorICBDTnRmc0ZpbGVUaW1lICp2YWxzOw0KKyAgQnl0ZSAqZGVmczsNCisgIEJ5dGUgZXh0ZXJuYWw7DQorICBSSU5PSyhSZWFkQml0VmVjdG9yKHNkMiwgbnVtLCAmcC0+RGVmcywgYWxsb2MpKTsNCisgIFJJTk9LKFN6UmVhZEJ5dGUoc2QyLCAmZXh0ZXJuYWwpKTsNCisgIGlmIChleHRlcm5hbCA9PSAwKQ0KKyAgICBzZCA9ICpzZDI7DQorICBlbHNlDQorICB7DQorICAgIFVJbnQzMiBpbmRleDsNCisgICAgU3pSZWFkTnVtYmVyMzIoc2QyLCAmaW5kZXgpOw0KKyAgICBpZiAoaW5kZXggPj0gbnVtVGVtcEJ1ZnMpDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorICAgIHNkLkRhdGEgPSB0ZW1wQnVmc1tpbmRleF0uZGF0YTsNCisgICAgc2QuU2l6ZSA9IHRlbXBCdWZzW2luZGV4XS5zaXplOw0KKyAgfQ0KKyAgTVlfQUxMT0MoQ050ZnNGaWxlVGltZSwgcC0+VmFscywgbnVtLCBhbGxvYyk7DQorICB2YWxzID0gcC0+VmFsczsNCisgIGRlZnMgPSBwLT5EZWZzOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQ0KKyAgICBpZiAoU3pCaXRBcnJheV9DaGVjayhkZWZzLCBpKSkNCisgICAgew0KKyAgICAgIGlmIChzZC5TaXplIDwgOCkNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgICAgIHZhbHNbaV0uTG93ID0gR2V0VWkzMihzZC5EYXRhKTsNCisgICAgICB2YWxzW2ldLkhpZ2ggPSBHZXRVaTMyKHNkLkRhdGEgKyA0KTsNCisgICAgICBTS0lQX0RBVEEyKHNkLCA4KTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgdmFsc1tpXS5IaWdoID0gdmFsc1tpXS5Mb3cgPSAwOw0KKyAgaWYgKGV4dGVybmFsID09IDApDQorICAgICpzZDIgPSBzZDsNCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorI2RlZmluZSBOVU1fQURESVRJT05BTF9TVFJFQU1TX01BWCA4DQorDQorc3RhdGljIFNSZXMgU3pSZWFkSGVhZGVyMigNCisgICAgQ1N6QXJFeCAqcCwgICAvKiBhbGxvY01haW4gKi8NCisgICAgQ1N6RGF0YSAqc2QsDQorICAgIC8vIEJ5dGUgKiplbXB0eVN0cmVhbVZlY3RvciwgLyogYWxsb2NUZW1wICovDQorICAgIC8vIEJ5dGUgKiplbXB0eUZpbGVWZWN0b3IsICAgLyogYWxsb2NUZW1wICovDQorICAgIC8vIEJ5dGUgKipsd3RWZWN0b3IsICAgICAgICAgLyogYWxsb2NUZW1wICovDQorICAgIElMb29rSW5TdHJlYW0gKmluU3RyZWFtLA0KKyAgICBDQnVmICp0ZW1wQnVmcywNCisgICAgVUludDMyICpudW1UZW1wQnVmcywNCisgICAgSVN6QWxsb2MgKmFsbG9jTWFpbiwNCisgICAgSVN6QWxsb2MgKmFsbG9jVGVtcA0KKyAgICApDQorew0KKyAgVUludDY0IHR5cGU7DQorICBVSW50MzIgbnVtRmlsZXMgPSAwOw0KKyAgVUludDMyIG51bUVtcHR5U3RyZWFtcyA9IDA7DQorICBVSW50MzIgaTsNCisgIENTdWJTdHJlYW1JbmZvIHNzaTsNCisgIGNvbnN0IEJ5dGUgKmVtcHR5U3RyZWFtcyA9IDA7DQorICBjb25zdCBCeXRlICplbXB0eUZpbGVzID0gMDsNCisNCisgIFN6RGF0YV9DbGVhcigmc3NpLnNkU2l6ZXMpOw0KKyAgU3pEYXRhX0NsZWFyKCZzc2kuc2RDUkNzKTsNCisgIFN6RGF0YV9DbGVhcigmc3NpLnNkTnVtU3ViU3RyZWFtcyk7DQorDQorICBzc2kuTnVtU3ViRGlnZXN0cyA9IDA7DQorICBzc2kuTnVtVG90YWxTdWJTdHJlYW1zID0gMDsNCisNCisgIFJJTk9LKFJlYWRJRChzZCwgJnR5cGUpKTsNCisNCisgIGlmICh0eXBlID09IGs3eklkQXJjaGl2ZVByb3BlcnRpZXMpDQorICB7DQorICAgIGZvciAoOzspDQorICAgIHsNCisgICAgICBVSW50NjQgdHlwZTsNCisgICAgICBSSU5PSyhSZWFkSUQoc2QsICZ0eXBlKSk7DQorICAgICAgaWYgKHR5cGUgPT0gazd6SWRFbmQpDQorICAgICAgICBicmVhazsNCisgICAgICBSSU5PSyhTa2lwRGF0YShzZCkpOw0KKyAgICB9DQorICAgIFJJTk9LKFJlYWRJRChzZCwgJnR5cGUpKTsNCisgIH0NCisNCisgIC8vIGlmICh0eXBlID09IGs3eklkQWRkaXRpb25hbFN0cmVhbXNJbmZvKSAgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKw0KKyAgaWYgKHR5cGUgPT0gazd6SWRBZGRpdGlvbmFsU3RyZWFtc0luZm8pDQorICB7DQorICAgIENTekFyIHRlbXBBcjsNCisgICAgU1JlcyByZXM7DQorICAgIFVJbnQzMiBudW1UZW1wRm9sZGVyczsNCisgICAgDQorICAgIFN6QXJfSW5pdCgmdGVtcEFyKTsNCisgICAgcmVzID0gU3pSZWFkQW5kRGVjb2RlUGFja2VkU3RyZWFtcyhpblN0cmVhbSwgc2QsIHRlbXBCdWZzLCBOVU1fQURESVRJT05BTF9TVFJFQU1TX01BWCwNCisgICAgICAgIHAtPnN0YXJ0UG9zQWZ0ZXJIZWFkZXIsICZ0ZW1wQXIsIGFsbG9jVGVtcCk7DQorICAgIG51bVRlbXBGb2xkZXJzID0gdGVtcEFyLk51bUZvbGRlcnM7DQorICAgIFN6QXJfRnJlZSgmdGVtcEFyLCBhbGxvY1RlbXApOw0KKyAgICBpZiAocmVzICE9IFNaX09LKQ0KKyAgICAgIHJldHVybiByZXM7DQorICAgICpudW1UZW1wQnVmcyA9IG51bVRlbXBGb2xkZXJzOw0KKyAgICBSSU5PSyhSZWFkSUQoc2QsICZ0eXBlKSk7DQorICB9DQorDQorICBpZiAodHlwZSA9PSBrN3pJZE1haW5TdHJlYW1zSW5mbykNCisgIHsNCisgICAgUklOT0soU3pSZWFkU3RyZWFtc0luZm8oJnAtPmRiLCBzZCwgKFVJbnQzMikxIDw8IDMwLCB0ZW1wQnVmcywgKm51bVRlbXBCdWZzLA0KKyAgICAgICAgJnAtPmRhdGFQb3MsICZzc2ksIGFsbG9jTWFpbikpOw0KKyAgICBwLT5kYXRhUG9zICs9IHAtPnN0YXJ0UG9zQWZ0ZXJIZWFkZXI7DQorICAgIFJJTk9LKFJlYWRJRChzZCwgJnR5cGUpKTsNCisgIH0NCisNCisgIGlmICh0eXBlID09IGs3eklkRW5kKQ0KKyAgew0KKyAgICAvLyAqc2QyID0gc2Q7DQorICAgIHJldHVybiBTWl9PSzsNCisgIH0NCisgIGlmICh0eXBlICE9IGs3eklkRmlsZXNJbmZvKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgIA0KKyAgUklOT0soU3pSZWFkTnVtYmVyMzIoc2QsICZudW1GaWxlcykpOw0KKyAgcC0+TnVtRmlsZXMgPSBudW1GaWxlczsNCisNCisgIGZvciAoOzspDQorICB7DQorICAgIFVJbnQ2NCB0eXBlOw0KKyAgICBVSW50NjQgc2l6ZTsNCisgICAgUklOT0soUmVhZElEKHNkLCAmdHlwZSkpOw0KKyAgICBpZiAodHlwZSA9PSBrN3pJZEVuZCkNCisgICAgICBicmVhazsNCisgICAgUklOT0soUmVhZE51bWJlcihzZCwgJnNpemUpKTsNCisgICAgaWYgKHNpemUgPiBzZC0+U2l6ZSkNCisgICAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgICAgaWYgKChVSW50NjQpKGludCl0eXBlICE9IHR5cGUpDQorICAgIHsNCisgICAgICBTS0lQX0RBVEEoc2QsIHNpemUpOw0KKyAgICB9DQorICAgIGVsc2Ugc3dpdGNoKChpbnQpdHlwZSkNCisgICAgew0KKyAgICAgIGNhc2Ugazd6SWROYW1lOg0KKyAgICAgIHsNCisgICAgICAgIHNpemVfdCBuYW1lc1NpemU7DQorICAgICAgICBjb25zdCBCeXRlICpuYW1lc0RhdGE7DQorICAgICAgICBCeXRlIGV4dGVybmFsOw0KKw0KKyAgICAgICAgU1pfUkVBRF9CWVRFKGV4dGVybmFsKTsNCisgICAgICAgIGlmIChleHRlcm5hbCA9PSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBuYW1lc1NpemUgPSAoc2l6ZV90KXNpemUgLSAxOw0KKyAgICAgICAgICBuYW1lc0RhdGEgPSBzZC0+RGF0YTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgVUludDMyIGluZGV4Ow0KKyAgICAgICAgICBTelJlYWROdW1iZXIzMihzZCwgJmluZGV4KTsNCisgICAgICAgICAgaWYgKGluZGV4ID49ICpudW1UZW1wQnVmcykNCisgICAgICAgICAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgICAgICAgICAgbmFtZXNEYXRhID0gKHRlbXBCdWZzKVtpbmRleF0uZGF0YTsNCisgICAgICAgICAgbmFtZXNTaXplID0gKHRlbXBCdWZzKVtpbmRleF0uc2l6ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmICgobmFtZXNTaXplICYgMSkgIT0gMCkNCisgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorICAgICAgICBNWV9BTExPQyhCeXRlLCBwLT5GaWxlTmFtZXMsIG5hbWVzU2l6ZSwgYWxsb2NNYWluKTsNCisgICAgICAgIE1ZX0FMTE9DKHNpemVfdCwgcC0+RmlsZU5hbWVPZmZzZXRzLCBudW1GaWxlcyArIDEsIGFsbG9jTWFpbik7DQorICAgICAgICBtZW1jcHkocC0+RmlsZU5hbWVzLCBuYW1lc0RhdGEsIG5hbWVzU2l6ZSk7DQorICAgICAgICBSSU5PSyhTelJlYWRGaWxlTmFtZXMocC0+RmlsZU5hbWVzLCBuYW1lc1NpemUsIG51bUZpbGVzLCBwLT5GaWxlTmFtZU9mZnNldHMpKQ0KKyAgICAgICAgaWYgKGV4dGVybmFsID09IDApDQorICAgICAgICB7DQorICAgICAgICAgIFNLSVBfREFUQShzZCwgbmFtZXNTaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIGs3eklkRW1wdHlTdHJlYW06DQorICAgICAgew0KKyAgICAgICAgUklOT0soUmVtZW1iZXJCaXRWZWN0b3Ioc2QsIG51bUZpbGVzLCAmZW1wdHlTdHJlYW1zKSk7DQorICAgICAgICBudW1FbXB0eVN0cmVhbXMgPSBDb3VudERlZmluZWRCaXRzKGVtcHR5U3RyZWFtcywgbnVtRmlsZXMpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2Ugazd6SWRFbXB0eUZpbGU6DQorICAgICAgew0KKyAgICAgICAgUklOT0soUmVtZW1iZXJCaXRWZWN0b3Ioc2QsIG51bUVtcHR5U3RyZWFtcywgJmVtcHR5RmlsZXMpKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIGs3eklkV2luQXR0cmliOg0KKyAgICAgIHsNCisgICAgICAgIEJ5dGUgZXh0ZXJuYWw7DQorICAgICAgICBDU3pEYXRhIHNkU3dpdGNoOw0KKyAgICAgICAgQ1N6RGF0YSAqc2RQdHI7DQorICAgICAgICBTekJpdFVpMzJzX0ZyZWUoJnAtPkF0dHJpYnMsIGFsbG9jTWFpbik7DQorICAgICAgICBSSU5PSyhSZWFkQml0VmVjdG9yKHNkLCBudW1GaWxlcywgJnAtPkF0dHJpYnMuRGVmcywgYWxsb2NNYWluKSk7DQorDQorICAgICAgICBTWl9SRUFEX0JZVEUoZXh0ZXJuYWwpOw0KKyAgICAgICAgaWYgKGV4dGVybmFsID09IDApDQorICAgICAgICAgIHNkUHRyID0gc2Q7DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIFVJbnQzMiBpbmRleDsNCisgICAgICAgICAgU3pSZWFkTnVtYmVyMzIoc2QsICZpbmRleCk7DQorICAgICAgICAgIGlmIChpbmRleCA+PSAqbnVtVGVtcEJ1ZnMpDQorICAgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorICAgICAgICAgIHNkU3dpdGNoLkRhdGEgPSAodGVtcEJ1ZnMpW2luZGV4XS5kYXRhOw0KKyAgICAgICAgICBzZFN3aXRjaC5TaXplID0gKHRlbXBCdWZzKVtpbmRleF0uc2l6ZTsNCisgICAgICAgICAgc2RQdHIgPSAmc2RTd2l0Y2g7DQorICAgICAgICB9DQorICAgICAgICBSSU5PSyhSZWFkVWkzMnMoc2RQdHIsIG51bUZpbGVzLCAmcC0+QXR0cmlicywgYWxsb2NNYWluKSk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgLyoNCisgICAgICBjYXNlIGs3elBhcmVudDoNCisgICAgICB7DQorICAgICAgICBTekJpdFVpMzJzX0ZyZWUoJnAtPlBhcmVudHMsIGFsbG9jTWFpbik7DQorICAgICAgICBSSU5PSyhSZWFkQml0VmVjdG9yKHNkLCBudW1GaWxlcywgJnAtPlBhcmVudHMuRGVmcywgYWxsb2NNYWluKSk7DQorICAgICAgICBSSU5PSyhTelJlYWRTd2l0Y2goc2QpKTsNCisgICAgICAgIFJJTk9LKFJlYWRVaTMycyhzZCwgbnVtRmlsZXMsICZwLT5QYXJlbnRzLCBhbGxvY01haW4pKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICAqLw0KKyAgICAgIGNhc2Ugazd6SWRNVGltZTogUklOT0soUmVhZFRpbWUoJnAtPk1UaW1lLCBudW1GaWxlcywgc2QsIHRlbXBCdWZzLCAqbnVtVGVtcEJ1ZnMsIGFsbG9jTWFpbikpOyBicmVhazsNCisgICAgICBjYXNlIGs3eklkQ1RpbWU6IFJJTk9LKFJlYWRUaW1lKCZwLT5DVGltZSwgbnVtRmlsZXMsIHNkLCB0ZW1wQnVmcywgKm51bVRlbXBCdWZzLCBhbGxvY01haW4pKTsgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICB7DQorICAgICAgICBTS0lQX0RBVEEoc2QsIHNpemUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKG51bUZpbGVzIC0gbnVtRW1wdHlTdHJlYW1zICE9IHNzaS5OdW1Ub3RhbFN1YlN0cmVhbXMpDQorICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgVUludDY0IHR5cGU7DQorICAgIFJJTk9LKFJlYWRJRChzZCwgJnR5cGUpKTsNCisgICAgaWYgKHR5cGUgPT0gazd6SWRFbmQpDQorICAgICAgYnJlYWs7DQorICAgIFJJTk9LKFNraXBEYXRhKHNkKSk7DQorICB9DQorDQorICB7DQorICAgIFVJbnQzMiBlbXB0eUZpbGVJbmRleCA9IDA7DQorDQorICAgIFVJbnQzMiBmb2xkZXJJbmRleCA9IDA7DQorICAgIFVJbnQzMiBpbmRleEluRm9sZGVyID0gMDsNCisgICAgVUludDY0IHVucGFja1BvcyA9IDA7DQorICAgIGNvbnN0IEJ5dGUgKmRpZ2VzdHNEZWZzID0gMDsNCisgICAgY29uc3QgQnl0ZSAqZGlnZXN0c1ZhbHMgPSAwOw0KKyAgICBVSW50MzIgZGlnZXN0c1ZhbHNJbmRleCA9IDA7DQorICAgIFVJbnQzMiBkaWdlc3RJbmRleDsNCisgICAgQnl0ZSBhbGxEaWdlc3RzRGVmaW5lZCA9IDA7DQorICAgIFVJbnQzMiBjdXJOdW1TdWJTdHJlYW1zID0gKFVJbnQzMikoSW50MzIpLTE7DQorICAgIEJ5dGUgaXNEaXJNYXNrID0gMDsNCisgICAgQnl0ZSBjcmNNYXNrID0gMDsNCisgICAgQnl0ZSBtYXNrID0gMHg4MDsNCisgICAgLy8gc2l6ZV90IHVucFNpemVzT2Zmc2V0ID0gMDsNCisgICAgQ1N6RGF0YSBzZENvZGVyc1VucFNpemVzOw0KKyAgICBzZENvZGVyc1VucFNpemVzLkRhdGEgPSBwLT5kYi5VbnBhY2tTaXplc0RhdGE7DQorICAgIHNkQ29kZXJzVW5wU2l6ZXMuU2l6ZSA9IHAtPmRiLlVucGFja1NpemVzRGF0YVNpemU7DQorICAgIA0KKyAgICBNWV9BTExPQyhVSW50MzIsIHAtPkZvbGRlclN0YXJ0RmlsZUluZGV4LCBwLT5kYi5OdW1Gb2xkZXJzICsgMSwgYWxsb2NNYWluKTsNCisgICAgTVlfQUxMT0MoVUludDMyLCBwLT5GaWxlSW5kZXhUb0ZvbGRlckluZGV4TWFwLCBwLT5OdW1GaWxlcywgYWxsb2NNYWluKTsNCisgICAgTVlfQUxMT0MoVUludDY0LCBwLT5VbnBhY2tQb3NpdGlvbnMsIHAtPk51bUZpbGVzICsgMSwgYWxsb2NNYWluKTsNCisgICAgTVlfQUxMT0MoQnl0ZSwgcC0+SXNEaXJzLCAocC0+TnVtRmlsZXMgKyA3KSA+PiAzLCBhbGxvY01haW4pOw0KKw0KKyAgICBSSU5PSyhTekJpdFVpMzJzX0FsbG9jKCZwLT5DUkNzLCBwLT5OdW1GaWxlcywgYWxsb2NNYWluKSk7DQorDQorICAgIGlmIChzc2kuc2RDUkNzLlNpemUgIT0gMCkNCisgICAgew0KKyAgICAgIFJJTk9LKFN6UmVhZEJ5dGUoJnNzaS5zZENSQ3MsICZhbGxEaWdlc3RzRGVmaW5lZCkpOw0KKyAgICAgIGlmIChhbGxEaWdlc3RzRGVmaW5lZCkNCisgICAgICAgIGRpZ2VzdHNWYWxzID0gc3NpLnNkQ1JDcy5EYXRhOw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBzaXplX3QgbnVtQnl0ZXMgPSAoc3NpLk51bVN1YkRpZ2VzdHMgKyA3KSA+PiAzOw0KKyAgICAgICAgZGlnZXN0c0RlZnMgPSBzc2kuc2RDUkNzLkRhdGE7DQorICAgICAgICBkaWdlc3RzVmFscyA9IGRpZ2VzdHNEZWZzICsgbnVtQnl0ZXM7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIGRpZ2VzdEluZGV4ID0gMDsNCisgICAgZm9yIChpID0gMDsgaSA8IG51bUZpbGVzOyBpKyssIG1hc2sgPj49IDEpDQorICAgIHsNCisgICAgICBpZiAobWFzayA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgIFVJbnQzMiBieXRlSW5kZXggPSAoaSAtIDEpID4+IDM7DQorICAgICAgICBwLT5Jc0RpcnNbYnl0ZUluZGV4XSA9IGlzRGlyTWFzazsNCisgICAgICAgIHAtPkNSQ3MuRGVmc1tieXRlSW5kZXhdID0gY3JjTWFzazsNCisgICAgICAgIGlzRGlyTWFzayA9IDA7DQorICAgICAgICBjcmNNYXNrID0gMDsNCisgICAgICAgIG1hc2sgPSAweDgwOw0KKyAgICAgIH0NCisNCisgICAgICBwLT5VbnBhY2tQb3NpdGlvbnNbaV0gPSB1bnBhY2tQb3M7DQorICAgICAgcC0+Q1JDcy5WYWxzW2ldID0gMDsNCisgICAgICAvLyBwLT5DUkNzLkRlZnNbaV0gPSAwOw0KKyAgICAgIGlmIChlbXB0eVN0cmVhbXMgJiYgU3pCaXRBcnJheV9DaGVjayhlbXB0eVN0cmVhbXMgLCBpKSkNCisgICAgICB7DQorICAgICAgICBpZiAoIWVtcHR5RmlsZXMgfHwgIVN6Qml0QXJyYXlfQ2hlY2soZW1wdHlGaWxlcywgZW1wdHlGaWxlSW5kZXgpKQ0KKyAgICAgICAgICBpc0Rpck1hc2sgfD0gbWFzazsNCisgICAgICAgIGVtcHR5RmlsZUluZGV4Kys7DQorICAgICAgICBpZiAoaW5kZXhJbkZvbGRlciA9PSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBwLT5GaWxlSW5kZXhUb0ZvbGRlckluZGV4TWFwW2ldID0gKFVJbnQzMiktMTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChpbmRleEluRm9sZGVyID09IDApDQorICAgICAgew0KKyAgICAgICAgLyoNCisgICAgICAgIHYzLjEzIGluY29ycmVjdGx5IHdvcmtlZCB3aXRoIGVtcHR5IGZvbGRlcnMNCisgICAgICAgIHY0LjA3OiBMb29wIGZvciBza2lwcGluZyBlbXB0eSBmb2xkZXJzDQorICAgICAgICAqLw0KKyAgICAgICAgZm9yICg7OykNCisgICAgICAgIHsNCisgICAgICAgICAgaWYgKGZvbGRlckluZGV4ID49IHAtPmRiLk51bUZvbGRlcnMpDQorICAgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorICAgICAgICAgIHAtPkZvbGRlclN0YXJ0RmlsZUluZGV4W2ZvbGRlckluZGV4XSA9IGk7DQorICAgICAgICAgIGlmIChjdXJOdW1TdWJTdHJlYW1zID09IChVSW50MzIpKEludDMyKS0xKTsNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGN1ck51bVN1YlN0cmVhbXMgPSAxOw0KKyAgICAgICAgICAgIGlmIChzc2kuc2ROdW1TdWJTdHJlYW1zLkRhdGEgIT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICBSSU5PSyhTelJlYWROdW1iZXIzMigmc3NpLnNkTnVtU3ViU3RyZWFtcywgJmN1ck51bVN1YlN0cmVhbXMpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGN1ck51bVN1YlN0cmVhbXMgIT0gMCkNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY3VyTnVtU3ViU3RyZWFtcyA9IChVSW50MzIpKEludDMyKS0xOw0KKyAgICAgICAgICBmb2xkZXJJbmRleCsrOyAvLyBjaGVjayBpdA0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBwLT5GaWxlSW5kZXhUb0ZvbGRlckluZGV4TWFwW2ldID0gZm9sZGVySW5kZXg7DQorICAgICAgaWYgKGVtcHR5U3RyZWFtcyAmJiBTekJpdEFycmF5X0NoZWNrKGVtcHR5U3RyZWFtcyAsIGkpKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgDQorICAgICAgaW5kZXhJbkZvbGRlcisrOw0KKyAgICAgIGlmIChpbmRleEluRm9sZGVyID49IGN1ck51bVN1YlN0cmVhbXMpDQorICAgICAgew0KKyAgICAgICAgVUludDY0IGZvbGRlclVucGFja1NpemUgPSAwOw0KKyAgICAgICAgVUludDY0IHN0YXJ0Rm9sZGVyVW5wYWNrUG9zOw0KKyAgICAgICAgew0KKyAgICAgICAgICBVSW50MzIgbWl4ID0gKFVJbnQzMilwLT5kYi5Gb1NpemVzT2Zmc2V0c1tmb2xkZXJJbmRleF07DQorICAgICAgICAgIFVJbnQzMiBtYWluSW5kZXggPSBtaXggJiAweEZGOw0KKyAgICAgICAgICBVSW50MzIgbnVtT3V0U3RyZWFtcyA9IG1peCA+PiA4Ow0KKyAgICAgICAgICBVSW50MzIgc2k7DQorICAgICAgICAgIHAtPmRiLkZvU2l6ZXNPZmZzZXRzW2ZvbGRlckluZGV4XSA9IHNkQ29kZXJzVW5wU2l6ZXMuRGF0YSAtIHAtPmRiLlVucGFja1NpemVzRGF0YTsNCisgICAgICAgICAgZm9yIChzaSA9IDA7IHNpIDwgbnVtT3V0U3RyZWFtczsgc2krKykNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIFVJbnQ2NCBjdXJTaXplOw0KKyAgICAgICAgICAgIFJJTk9LKFJlYWROdW1iZXIoJnNkQ29kZXJzVW5wU2l6ZXMsICZjdXJTaXplKSk7DQorICAgICAgICAgICAgaWYgKHNpID09IG1haW5JbmRleCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICBmb2xkZXJVbnBhY2tTaXplID0gY3VyU2l6ZTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoc2kgPT0gbnVtT3V0U3RyZWFtcykNCisgICAgICAgICAgICByZXR1cm4gU1pfRVJST1JfRkFJTDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIFVJbnQ2NCBmb2xkZXJVbnBhY2tTaXplID0gU3pBcl9HZXRGb2xkZXJVbnBhY2tTaXplKCZwLT5kYiwgZm9sZGVySW5kZXgpOw0KKyAgICAgICAgc3RhcnRGb2xkZXJVbnBhY2tQb3MgPSBwLT5VbnBhY2tQb3NpdGlvbnNbcC0+Rm9sZGVyU3RhcnRGaWxlSW5kZXhbZm9sZGVySW5kZXhdXTsNCisgICAgICAgIGlmIChmb2xkZXJVbnBhY2tTaXplIDwgdW5wYWNrUG9zIC0gc3RhcnRGb2xkZXJVbnBhY2tQb3MpDQorICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgICAgICAgdW5wYWNrUG9zID0gc3RhcnRGb2xkZXJVbnBhY2tQb3MgKyBmb2xkZXJVbnBhY2tTaXplOw0KKw0KKyAgICAgICAgaWYgKGN1ck51bVN1YlN0cmVhbXMgPT0gMSAmJiBTekJpdFdpdGhWYWxzX0NoZWNrKCZwLT5kYi5Gb2xkZXJDUkNzLCBpKSkNCisgICAgICAgIHsNCisgICAgICAgICAgcC0+Q1JDcy5WYWxzW2ldID0gcC0+ZGIuRm9sZGVyQ1JDcy5WYWxzW2ZvbGRlckluZGV4XTsNCisgICAgICAgICAgY3JjTWFzayB8PSBtYXNrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSBpZiAoYWxsRGlnZXN0c0RlZmluZWQgfHwgKGRpZ2VzdHNEZWZzICYmIFN6Qml0QXJyYXlfQ2hlY2soZGlnZXN0c0RlZnMsIGRpZ2VzdEluZGV4KSkpDQorICAgICAgICB7DQorICAgICAgICAgIHAtPkNSQ3MuVmFsc1tpXSA9IEdldFVpMzIoZGlnZXN0c1ZhbHMgKyAoc2l6ZV90KWRpZ2VzdHNWYWxzSW5kZXggKiA0KTsNCisgICAgICAgICAgZGlnZXN0c1ZhbHNJbmRleCsrOw0KKyAgICAgICAgICBjcmNNYXNrIHw9IG1hc2s7DQorICAgICAgICB9DQorICAgICAgICBmb2xkZXJJbmRleCsrOw0KKyAgICAgICAgaW5kZXhJbkZvbGRlciA9IDA7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBVSW50NjQgdjsNCisgICAgICAgIFJJTk9LKFJlYWROdW1iZXIoJnNzaS5zZFNpemVzLCAmdikpOw0KKyAgICAgICAgdW5wYWNrUG9zICs9IHY7DQorICAgICAgICBpZiAoYWxsRGlnZXN0c0RlZmluZWQgfHwgKGRpZ2VzdHNEZWZzICYmIFN6Qml0QXJyYXlfQ2hlY2soZGlnZXN0c0RlZnMsIGRpZ2VzdEluZGV4KSkpDQorICAgICAgICB7DQorICAgICAgICAgIHAtPkNSQ3MuVmFsc1tpXSA9IEdldFVpMzIoZGlnZXN0c1ZhbHMgKyAoc2l6ZV90KWRpZ2VzdHNWYWxzSW5kZXggKiA0KTsNCisgICAgICAgICAgZGlnZXN0c1ZhbHNJbmRleCsrOw0KKyAgICAgICAgICBjcmNNYXNrIHw9IG1hc2s7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtYXNrICE9IDB4ODApDQorICAgIHsNCisgICAgICBVSW50MzIgYnl0ZUluZGV4ID0gKGkgLSAxKSA+PiAzOw0KKyAgICAgIHAtPklzRGlyc1tieXRlSW5kZXhdID0gaXNEaXJNYXNrOw0KKyAgICAgIHAtPkNSQ3MuRGVmc1tieXRlSW5kZXhdID0gY3JjTWFzazsNCisgICAgfQ0KKyAgICBwLT5VbnBhY2tQb3NpdGlvbnNbaV0gPSB1bnBhY2tQb3M7DQorICAgIHAtPkZvbGRlclN0YXJ0RmlsZUluZGV4W2ZvbGRlckluZGV4XSA9IGk7DQorICAgIHAtPmRiLkZvU2l6ZXNPZmZzZXRzW2ZvbGRlckluZGV4XSA9IHNkQ29kZXJzVW5wU2l6ZXMuRGF0YSAtIHAtPmRiLlVucGFja1NpemVzRGF0YTsNCisgIH0NCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorc3RhdGljIFNSZXMgU3pSZWFkSGVhZGVyKA0KKyAgICBDU3pBckV4ICpwLA0KKyAgICBDU3pEYXRhICpzZCwNCisgICAgSUxvb2tJblN0cmVhbSAqaW5TdHJlYW0sDQorICAgIElTekFsbG9jICphbGxvY01haW4NCisgICAgLElTekFsbG9jICphbGxvY1RlbXANCisgICAgKQ0KK3sNCisgIC8vIEJ5dGUgKmVtcHR5U3RyZWFtVmVjdG9yID0gMDsNCisgIC8vIEJ5dGUgKmVtcHR5RmlsZVZlY3RvciA9IDA7DQorICAvLyBCeXRlICpsd3RWZWN0b3IgPSAwOw0KKyAgVUludDMyIGk7DQorICBVSW50MzIgbnVtVGVtcEJ1ZnMgPSAwOw0KKyAgU1JlcyByZXM7DQorICBDQnVmIHRlbXBCdWZzW05VTV9BRERJVElPTkFMX1NUUkVBTVNfTUFYXTsNCisNCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fQURESVRJT05BTF9TVFJFQU1TX01BWDsgaSsrKQ0KKyAgICBCdWZfSW5pdCh0ZW1wQnVmcyArIGkpOw0KKyAgLy8gU3pCaXRVaTMyc19Jbml0KCZkaWdlc3RzKTsNCisgIA0KKyAgcmVzID0gU3pSZWFkSGVhZGVyMihwLCBzZCwNCisgICAgICAvLyAmZW1wdHlTdHJlYW1WZWN0b3IsDQorICAgICAgLy8gJmVtcHR5RmlsZVZlY3RvciwNCisgICAgICAvLyAmbHd0VmVjdG9yLA0KKyAgICAgIGluU3RyZWFtLA0KKyAgICAgIHRlbXBCdWZzLCAmbnVtVGVtcEJ1ZnMsDQorICAgICAgYWxsb2NNYWluLCBhbGxvY1RlbXANCisgICAgICApOw0KKyAgDQorICBmb3IgKGkgPSAwOyBpIDwgbnVtVGVtcEJ1ZnM7IGkrKykNCisgICAgQnVmX0ZyZWUodGVtcEJ1ZnMgKyBpLCBhbGxvY1RlbXApOw0KKw0KKyAgLy8gSUFsbG9jX0ZyZWUoYWxsb2NUZW1wLCBlbXB0eVN0cmVhbVZlY3Rvcik7DQorICAvLyBJQWxsb2NfRnJlZShhbGxvY1RlbXAsIGVtcHR5RmlsZVZlY3Rvcik7DQorICAvLyBJQWxsb2NfRnJlZShhbGxvY1RlbXAsIGx3dFZlY3Rvcik7DQorDQorICBSSU5PSyhyZXMpOw0KKyAgew0KKyAgICBpZiAoc2QtPlNpemUgIT0gMCkNCisgICAgICByZXR1cm4gU1pfRVJST1JfRkFJTDsNCisgIH0NCisNCisgIHJldHVybiByZXM7DQorfQ0KKw0KKy8qDQorc3RhdGljIFVJbnQ2NCBTekFyX0dldEZvbGRlclVucGFja1NpemUoY29uc3QgQ1N6QXIgKnAsIFVJbnQzMiBmb2xkZXJJbmRleCkNCit7DQorICBjb25zdCBDU3pGb2xkZXIyICpmID0gcC0+Rm9sZGVycyArIGZvbGRlckluZGV4Ow0KKw0KKyAgLy8gcmV0dXJuIHAtPkNvZGVyVW5wYWNrU2l6ZXNbZi0+U3RhcnRDb2RlclVucGFja1NpemVzSW5kZXggKyBmLT5JbmRleE9mTWFpbk91dFN0cmVhbV07DQorDQorICBVSW50MzIgc2k7DQorICBDU3pEYXRhIHNkQ29kZXJzVW5wU2l6ZXM7DQorICBzZENvZGVyc1VucFNpemVzLkRhdGEgPSBwLT5VbnBhY2tTaXplc0RhdGEgKyBmLT5VbnBhY2tTaXplRGF0YU9mZnNldDsNCisgIHNkQ29kZXJzVW5wU2l6ZXMuU2l6ZSA9IHAtPlVucGFja1NpemVzRGF0YVNpemUgLSBmLT5VbnBhY2tTaXplRGF0YU9mZnNldDsNCisgIGZvciAoc2kgPSAwOyBzaSA8IG51bU91dFN0cmVhbXM7IHNpKyspDQorICB7DQorICAgIFVJbnQ2NCBjdXJTaXplOw0KKyAgICBSZWFkTnVtYmVyKCZzZENvZGVyc1VucFNpemVzLCAmY3VyU2l6ZSk7DQorICAgIGlmIChzaSA9PSBtYWluSW5kZXgpDQorICAgICAgcmV0dXJuIGN1clNpemU7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorKi8NCisNCitzdGF0aWMgU1JlcyBTekFyRXhfT3BlbjIoDQorICAgIENTekFyRXggKnAsDQorICAgIElMb29rSW5TdHJlYW0gKmluU3RyZWFtLA0KKyAgICBJU3pBbGxvYyAqYWxsb2NNYWluLA0KKyAgICBJU3pBbGxvYyAqYWxsb2NUZW1wKQ0KK3sNCisgIEJ5dGUgaGVhZGVyW2s3elN0YXJ0SGVhZGVyU2l6ZV07DQorICBJbnQ2NCBzdGFydEFyY1BvczsNCisgIFVJbnQ2NCBuZXh0SGVhZGVyT2Zmc2V0LCBuZXh0SGVhZGVyU2l6ZTsNCisgIHNpemVfdCBuZXh0SGVhZGVyU2l6ZVQ7DQorICBVSW50MzIgbmV4dEhlYWRlckNSQzsNCisgIENCdWYgYnVmOw0KKyAgU1JlcyByZXM7DQorDQorICBzdGFydEFyY1BvcyA9IDA7DQorICBSSU5PSyhpblN0cmVhbS0+U2VlayhpblN0cmVhbSwgJnN0YXJ0QXJjUG9zLCBTWl9TRUVLX0NVUikpOw0KKw0KKyAgUklOT0soTG9va0luU3RyZWFtX1JlYWQyKGluU3RyZWFtLCBoZWFkZXIsIGs3elN0YXJ0SGVhZGVyU2l6ZSwgU1pfRVJST1JfTk9fQVJDSElWRSkpOw0KKw0KKyAgaWYgKCFUZXN0U2lnbmF0dXJlQ2FuZGlkYXRlKGhlYWRlcikpDQorICAgIHJldHVybiBTWl9FUlJPUl9OT19BUkNISVZFOw0KKyAgaWYgKGhlYWRlcls2XSAhPSBrN3pNYWpvclZlcnNpb24pDQorICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisNCisgIG5leHRIZWFkZXJPZmZzZXQgPSBHZXRVaTY0KGhlYWRlciArIDEyKTsNCisgIG5leHRIZWFkZXJTaXplID0gR2V0VWk2NChoZWFkZXIgKyAyMCk7DQorICBuZXh0SGVhZGVyQ1JDID0gR2V0VWkzMihoZWFkZXIgKyAyOCk7DQorDQorICBwLT5zdGFydFBvc0FmdGVySGVhZGVyID0gc3RhcnRBcmNQb3MgKyBrN3pTdGFydEhlYWRlclNpemU7DQorICANCisgIGlmIChDcmNDYWxjKGhlYWRlciArIDEyLCAyMCkgIT0gR2V0VWkzMihoZWFkZXIgKyA4KSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX0NSQzsNCisNCisgIG5leHRIZWFkZXJTaXplVCA9IChzaXplX3QpbmV4dEhlYWRlclNpemU7DQorICBpZiAobmV4dEhlYWRlclNpemVUICE9IG5leHRIZWFkZXJTaXplKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfTUVNOw0KKyAgaWYgKG5leHRIZWFkZXJTaXplVCA9PSAwKQ0KKyAgICByZXR1cm4gU1pfT0s7DQorICBpZiAobmV4dEhlYWRlck9mZnNldCA+IG5leHRIZWFkZXJPZmZzZXQgKyBuZXh0SGVhZGVyU2l6ZSB8fA0KKyAgICAgIG5leHRIZWFkZXJPZmZzZXQgPiBuZXh0SGVhZGVyT2Zmc2V0ICsgbmV4dEhlYWRlclNpemUgKyBrN3pTdGFydEhlYWRlclNpemUpDQorICAgIHJldHVybiBTWl9FUlJPUl9OT19BUkNISVZFOw0KKw0KKyAgew0KKyAgICBJbnQ2NCBwb3MgPSAwOw0KKyAgICBSSU5PSyhpblN0cmVhbS0+U2VlayhpblN0cmVhbSwgJnBvcywgU1pfU0VFS19FTkQpKTsNCisgICAgaWYgKChVSW50NjQpcG9zIDwgc3RhcnRBcmNQb3MgKyBuZXh0SGVhZGVyT2Zmc2V0IHx8DQorICAgICAgICAoVUludDY0KXBvcyA8IHN0YXJ0QXJjUG9zICsgazd6U3RhcnRIZWFkZXJTaXplICsgbmV4dEhlYWRlck9mZnNldCB8fA0KKyAgICAgICAgKFVJbnQ2NClwb3MgPCBzdGFydEFyY1BvcyArIGs3elN0YXJ0SGVhZGVyU2l6ZSArIG5leHRIZWFkZXJPZmZzZXQgKyBuZXh0SGVhZGVyU2l6ZSkNCisgICAgICByZXR1cm4gU1pfRVJST1JfSU5QVVRfRU9GOw0KKyAgfQ0KKw0KKyAgUklOT0soTG9va0luU3RyZWFtX1NlZWtUbyhpblN0cmVhbSwgc3RhcnRBcmNQb3MgKyBrN3pTdGFydEhlYWRlclNpemUgKyBuZXh0SGVhZGVyT2Zmc2V0KSk7DQorDQorICBpZiAoIUJ1Zl9DcmVhdGUoJmJ1ZiwgbmV4dEhlYWRlclNpemVULCBhbGxvY1RlbXApKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfTUVNOw0KKw0KKyAgcmVzID0gTG9va0luU3RyZWFtX1JlYWQoaW5TdHJlYW0sIGJ1Zi5kYXRhLCBuZXh0SGVhZGVyU2l6ZVQpOw0KKyAgaWYgKHJlcyA9PSBTWl9PSykNCisgIHsNCisgICAgcmVzID0gU1pfRVJST1JfQVJDSElWRTsNCisgICAgaWYgKENyY0NhbGMoYnVmLmRhdGEsIG5leHRIZWFkZXJTaXplVCkgPT0gbmV4dEhlYWRlckNSQykNCisgICAgew0KKyAgICAgIENTekRhdGEgc2Q7DQorICAgICAgVUludDY0IHR5cGU7DQorICAgICAgc2QuRGF0YSA9IGJ1Zi5kYXRhOw0KKyAgICAgIHNkLlNpemUgPSBidWYuc2l6ZTsNCisgICAgICByZXMgPSBSZWFkSUQoJnNkLCAmdHlwZSk7DQorICAgICAgaWYgKHJlcyA9PSBTWl9PSyAmJiB0eXBlID09IGs3eklkRW5jb2RlZEhlYWRlcikNCisgICAgICB7DQorICAgICAgICBDU3pBciB0ZW1wQXI7DQorICAgICAgICBDQnVmIHRlbXBCdWY7DQorICAgICAgICBCdWZfSW5pdCgmdGVtcEJ1Zik7DQorICAgICAgICANCisgICAgICAgIFN6QXJfSW5pdCgmdGVtcEFyKTsNCisgICAgICAgIHJlcyA9IFN6UmVhZEFuZERlY29kZVBhY2tlZFN0cmVhbXMoaW5TdHJlYW0sICZzZCwgJnRlbXBCdWYsIDEsIHAtPnN0YXJ0UG9zQWZ0ZXJIZWFkZXIsICZ0ZW1wQXIsIGFsbG9jVGVtcCk7DQorICAgICAgICBTekFyX0ZyZWUoJnRlbXBBciwgYWxsb2NUZW1wKTsNCisgICAgICAgDQorICAgICAgICBpZiAocmVzICE9IFNaX09LKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBCdWZfRnJlZSgmdGVtcEJ1ZiwgYWxsb2NUZW1wKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgQnVmX0ZyZWUoJmJ1ZiwgYWxsb2NUZW1wKTsNCisgICAgICAgICAgYnVmLmRhdGEgPSB0ZW1wQnVmLmRhdGE7DQorICAgICAgICAgIGJ1Zi5zaXplID0gdGVtcEJ1Zi5zaXplOw0KKyAgICAgICAgICBzZC5EYXRhID0gYnVmLmRhdGE7DQorICAgICAgICAgIHNkLlNpemUgPSBidWYuc2l6ZTsNCisgICAgICAgICAgcmVzID0gUmVhZElEKCZzZCwgJnR5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAocmVzID09IFNaX09LKQ0KKyAgICAgIHsNCisgICAgICAgIGlmICh0eXBlID09IGs3eklkSGVhZGVyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBDU3pEYXRhIHNkMjsNCisgICAgICAgICAgaW50IHR0dDsNCisgICAgICAgICAgZm9yICh0dHQgPSAwOyB0dHQgPCAxOyB0dHQrKykNCisgICAgICAgICAgLy8gZm9yICh0dHQgPSAwOyB0dHQgPCA0MDAwMDsgdHR0KyspDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBTekFyRXhfRnJlZShwLCBhbGxvY01haW4pOw0KKyAgICAgICAgICAgIHNkMiA9IHNkOw0KKyAgICAgICAgICAgIHJlcyA9IFN6UmVhZEhlYWRlcihwLCAmc2QyLCBpblN0cmVhbSwgYWxsb2NNYWluLCBhbGxvY1RlbXANCisgICAgICAgICAgICAgICk7DQorICAgICAgICAgICAgaWYgKHJlcyAhPSBTWl9PSykNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorDQorICAgICAgICAgIC8vIHJlcyA9IFN6UmVhZEhlYWRlcihwLCAmc2QsIGFsbG9jTWFpbiwgYWxsb2NUZW1wKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgICAgcmVzID0gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBCdWZfRnJlZSgmYnVmLCBhbGxvY1RlbXApOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorLy8gI2luY2x1ZGUgPHN0ZGlvLmg+DQorDQorU1JlcyBTekFyRXhfT3BlbihDU3pBckV4ICpwLCBJTG9va0luU3RyZWFtICppblN0cmVhbSwNCisgICAgSVN6QWxsb2MgKmFsbG9jTWFpbiwgSVN6QWxsb2MgKmFsbG9jVGVtcCkNCit7DQorICBTUmVzIHJlcyA9IFN6QXJFeF9PcGVuMihwLCBpblN0cmVhbSwgYWxsb2NNYWluLCBhbGxvY1RlbXApOw0KKyAgaWYgKHJlcyAhPSBTWl9PSykNCisgICAgU3pBckV4X0ZyZWUocCwgYWxsb2NNYWluKTsNCisgIC8vIHByaW50ZiAoIlxucnJyPSVkXG4iLCBycnIpOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorU1JlcyBTekFyRXhfRXh0cmFjdCgNCisgICAgY29uc3QgQ1N6QXJFeCAqcCwNCisgICAgSUxvb2tJblN0cmVhbSAqaW5TdHJlYW0sDQorICAgIFVJbnQzMiBmaWxlSW5kZXgsDQorICAgIFVJbnQzMiAqYmxvY2tJbmRleCwNCisgICAgQnl0ZSAqKnRlbXBCdWYsDQorICAgIHNpemVfdCAqb3V0QnVmZmVyU2l6ZSwNCisgICAgc2l6ZV90ICpvZmZzZXQsDQorICAgIHNpemVfdCAqb3V0U2l6ZVByb2Nlc3NlZCwNCisgICAgSVN6QWxsb2MgKmFsbG9jTWFpbiwNCisgICAgSVN6QWxsb2MgKmFsbG9jVGVtcCkNCit7DQorICBVSW50MzIgZm9sZGVySW5kZXggPSBwLT5GaWxlSW5kZXhUb0ZvbGRlckluZGV4TWFwW2ZpbGVJbmRleF07DQorICBTUmVzIHJlcyA9IFNaX09LOw0KKyAgKm9mZnNldCA9IDA7DQorICAqb3V0U2l6ZVByb2Nlc3NlZCA9IDA7DQorICBpZiAoZm9sZGVySW5kZXggPT0gKFVJbnQzMiktMSkNCisgIHsNCisgICAgSUFsbG9jX0ZyZWUoYWxsb2NNYWluLCAqdGVtcEJ1Zik7DQorICAgICpibG9ja0luZGV4ID0gZm9sZGVySW5kZXg7DQorICAgICp0ZW1wQnVmID0gMDsNCisgICAgKm91dEJ1ZmZlclNpemUgPSAwOw0KKyAgICByZXR1cm4gU1pfT0s7DQorICB9DQorDQorICBpZiAoKnRlbXBCdWYgPT0gMCB8fCAqYmxvY2tJbmRleCAhPSBmb2xkZXJJbmRleCkNCisgIHsNCisgICAgLy8gVUludDY0IHVucGFja1NpemVTcGVjID0gU3pBcl9HZXRGb2xkZXJVbnBhY2tTaXplKCZwLT5kYiwgZm9sZGVySW5kZXgpOw0KKyAgICBVSW50NjQgdW5wYWNrU2l6ZVNwZWMgPQ0KKyAgICAgICAgcC0+VW5wYWNrUG9zaXRpb25zW3AtPkZvbGRlclN0YXJ0RmlsZUluZGV4W2ZvbGRlckluZGV4ICsgMV1dIC0NCisgICAgICAgIHAtPlVucGFja1Bvc2l0aW9uc1twLT5Gb2xkZXJTdGFydEZpbGVJbmRleFtmb2xkZXJJbmRleF1dOw0KKyAgICBzaXplX3QgdW5wYWNrU2l6ZSA9IChzaXplX3QpdW5wYWNrU2l6ZVNwZWM7DQorDQorICAgIGlmICh1bnBhY2tTaXplICE9IHVucGFja1NpemVTcGVjKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorICAgICpibG9ja0luZGV4ID0gZm9sZGVySW5kZXg7DQorICAgIElBbGxvY19GcmVlKGFsbG9jTWFpbiwgKnRlbXBCdWYpOw0KKyAgICAqdGVtcEJ1ZiA9IDA7DQorICAgIA0KKyAgICAvLyBSSU5PSyhMb29rSW5TdHJlYW1fU2Vla1RvKGluU3RyZWFtLCBzdGFydE9mZnNldCkpOw0KKyAgICANCisgICAgaWYgKHJlcyA9PSBTWl9PSykNCisgICAgew0KKyAgICAgICpvdXRCdWZmZXJTaXplID0gdW5wYWNrU2l6ZTsNCisgICAgICBpZiAodW5wYWNrU2l6ZSAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgICp0ZW1wQnVmID0gKEJ5dGUgKilJQWxsb2NfQWxsb2MoYWxsb2NNYWluLCB1bnBhY2tTaXplKTsNCisgICAgICAgIGlmICgqdGVtcEJ1ZiA9PSAwKQ0KKyAgICAgICAgICByZXMgPSBTWl9FUlJPUl9NRU07DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXMgPT0gU1pfT0spDQorICAgICAgew0KKyAgICAgICAgcmVzID0gU3pBcl9EZWNvZGVGb2xkZXIoJnAtPmRiLCBmb2xkZXJJbmRleCwNCisgICAgICAgICAgaW5TdHJlYW0sDQorICAgICAgICAgIHAtPmRhdGFQb3MsDQorICAgICAgICAgICp0ZW1wQnVmLCB1bnBhY2tTaXplLCBhbGxvY1RlbXApOw0KKyAgICAgICAgaWYgKHJlcyA9PSBTWl9PSykNCisgICAgICAgIHsNCisgICAgICAgICAgaWYgKFN6Qml0V2l0aFZhbHNfQ2hlY2soJnAtPmRiLkZvbGRlckNSQ3MsIGZvbGRlckluZGV4KSkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChDcmNDYWxjKCp0ZW1wQnVmLCB1bnBhY2tTaXplKSAhPSBwLT5kYi5Gb2xkZXJDUkNzLlZhbHNbZm9sZGVySW5kZXhdKQ0KKyAgICAgICAgICAgICAgcmVzID0gU1pfRVJST1JfQ1JDOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAocmVzID09IFNaX09LKQ0KKyAgew0KKyAgICBVSW50NjQgdW5wYWNrUG9zID0gcC0+VW5wYWNrUG9zaXRpb25zW2ZpbGVJbmRleF07DQorICAgICpvZmZzZXQgPSAoc2l6ZV90KSh1bnBhY2tQb3MgLSBwLT5VbnBhY2tQb3NpdGlvbnNbcC0+Rm9sZGVyU3RhcnRGaWxlSW5kZXhbZm9sZGVySW5kZXhdXSk7DQorICAgICpvdXRTaXplUHJvY2Vzc2VkID0gKHNpemVfdCkocC0+VW5wYWNrUG9zaXRpb25zW2ZpbGVJbmRleCArIDFdIC0gdW5wYWNrUG9zKTsNCisgICAgaWYgKCpvZmZzZXQgKyAqb3V0U2l6ZVByb2Nlc3NlZCA+ICpvdXRCdWZmZXJTaXplKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9GQUlMOw0KKyAgICBpZiAoU3pCaXRXaXRoVmFsc19DaGVjaygmcC0+Q1JDcywgZmlsZUluZGV4KSAmJiBDcmNDYWxjKCp0ZW1wQnVmICsgKm9mZnNldCwgKm91dFNpemVQcm9jZXNzZWQpICE9IHAtPkNSQ3MuVmFsc1tmaWxlSW5kZXhdKQ0KKyAgICAgIHJlcyA9IFNaX0VSUk9SX0NSQzsNCisgIH0NCisgIHJldHVybiByZXM7DQorfQ0KKw0KKw0KK3NpemVfdCBTekFyRXhfR2V0RmlsZU5hbWVVdGYxNihjb25zdCBDU3pBckV4ICpwLCBzaXplX3QgZmlsZUluZGV4LCBVSW50MTYgKmRlc3QpDQorew0KKyAgc2l6ZV90IG9mZnMgPSBwLT5GaWxlTmFtZU9mZnNldHNbZmlsZUluZGV4XTsNCisgIHNpemVfdCBsZW4gPSBwLT5GaWxlTmFtZU9mZnNldHNbZmlsZUluZGV4ICsgMV0gLSBvZmZzOw0KKyAgaWYgKGRlc3QgIT0gMCkNCisgIHsNCisgICAgc2l6ZV90IGk7DQorICAgIGNvbnN0IEJ5dGUgKnNyYyA9IHAtPkZpbGVOYW1lcyArIG9mZnMgKiAyOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspDQorICAgICAgZGVzdFtpXSA9IEdldFVpMTYoc3JjICsgaSAqIDIpOw0KKyAgfQ0KKyAgcmV0dXJuIGxlbjsNCit9DQorDQorLyoNCitzaXplX3QgU3pBckV4X0dldEZ1bGxOYW1lTGVuKGNvbnN0IENTekFyRXggKnAsIHNpemVfdCBmaWxlSW5kZXgpDQorew0KKyAgc2l6ZV90IGxlbjsNCisgIGlmICghcC0+RmlsZU5hbWVPZmZzZXRzKQ0KKyAgICByZXR1cm4gMTsNCisgIGxlbiA9IDA7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBVSW50MzIgcGFyZW50ID0gKFVJbnQzMikoSW50MzIpLTE7DQorICAgIGxlbiArPSBwLT5GaWxlTmFtZU9mZnNldHNbZmlsZUluZGV4ICsgMV0gLSBwLT5GaWxlTmFtZU9mZnNldHNbZmlsZUluZGV4XTsNCisgICAgaWYgU3pCaXRXaXRoVmFsc19DaGVjaygmcC0+UGFyZW50cywgZmlsZUluZGV4KQ0KKyAgICAgIHBhcmVudCA9IHAtPlBhcmVudHMuVmFsc1tmaWxlSW5kZXhdOw0KKyAgICBpZiAocGFyZW50ID09IChVSW50MzIpKEludDMyKS0xKQ0KKyAgICAgIHJldHVybiBsZW47DQorICAgIGZpbGVJbmRleCA9IHBhcmVudDsNCisgIH0NCit9DQorDQorVUludDE2ICpTekFyRXhfR2V0RnVsbE5hbWVVdGYxNl9CYWNrKGNvbnN0IENTekFyRXggKnAsIHNpemVfdCBmaWxlSW5kZXgsIFVJbnQxNiAqZGVzdCkNCit7DQorICBCb29sIG5lZWRTbGFzaDsNCisgIGlmICghcC0+RmlsZU5hbWVPZmZzZXRzKQ0KKyAgew0KKyAgICAqKC0tZGVzdCkgPSAwOw0KKyAgICByZXR1cm4gZGVzdDsNCisgIH0NCisgIG5lZWRTbGFzaCA9IEZhbHNlOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgVUludDMyIHBhcmVudCA9IChVSW50MzIpKEludDMyKS0xOw0KKyAgICBzaXplX3QgY3VyTGVuID0gcC0+RmlsZU5hbWVPZmZzZXRzW2ZpbGVJbmRleCArIDFdIC0gcC0+RmlsZU5hbWVPZmZzZXRzW2ZpbGVJbmRleF07DQorICAgIFN6QXJFeF9HZXRGaWxlTmFtZVV0ZjE2KHAsIGZpbGVJbmRleCwgZGVzdCAtIGN1ckxlbik7DQorICAgIGlmIChuZWVkU2xhc2gpDQorICAgICAgKihkZXN0IC0gMSkgPSAnLyc7DQorICAgIG5lZWRTbGFzaCA9IFRydWU7DQorICAgIGRlc3QgLT0gY3VyTGVuOw0KKw0KKyAgICBpZiBTekJpdFdpdGhWYWxzX0NoZWNrKCZwLT5QYXJlbnRzLCBmaWxlSW5kZXgpDQorICAgICAgcGFyZW50ID0gcC0+UGFyZW50cy5WYWxzW2ZpbGVJbmRleF07DQorICAgIGlmIChwYXJlbnQgPT0gKFVJbnQzMikoSW50MzIpLTEpDQorICAgICAgcmV0dXJuIGRlc3Q7DQorICAgIGZpbGVJbmRleCA9IHBhcmVudDsNCisgIH0NCit9DQorKi8NCmRpZmYgLS1naXQgYS9sem1hL0MvN3pCdWYuYyBiL2x6bWEvQy83ekJ1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYWMxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvN3pCdWYuYwpAQCAtMCwwICsxLDM2IEBACisvKiA3ekJ1Zi5jIC0tIEJ5dGUgQnVmZmVyDQorMjAxMy0wMS0yMSA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlICJQcmVjb21wLmgiDQorDQorI2luY2x1ZGUgIjd6QnVmLmgiDQorDQordm9pZCBCdWZfSW5pdChDQnVmICpwKQ0KK3sNCisgIHAtPmRhdGEgPSAwOw0KKyAgcC0+c2l6ZSA9IDA7DQorfQ0KKw0KK2ludCBCdWZfQ3JlYXRlKENCdWYgKnAsIHNpemVfdCBzaXplLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgcC0+c2l6ZSA9IDA7DQorICBpZiAoc2l6ZSA9PSAwKQ0KKyAgew0KKyAgICBwLT5kYXRhID0gMDsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBwLT5kYXRhID0gKEJ5dGUgKilhbGxvYy0+QWxsb2MoYWxsb2MsIHNpemUpOw0KKyAgaWYgKHAtPmRhdGEgIT0gMCkNCisgIHsNCisgICAgcC0+c2l6ZSA9IHNpemU7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3ZvaWQgQnVmX0ZyZWUoQ0J1ZiAqcCwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIGFsbG9jLT5GcmVlKGFsbG9jLCBwLT5kYXRhKTsNCisgIHAtPmRhdGEgPSAwOw0KKyAgcC0+c2l6ZSA9IDA7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy83ekJ1Zi5oIGIvbHptYS9DLzd6QnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmOTIxOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy83ekJ1Zi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIDd6QnVmLmggLS0gQnl0ZSBCdWZmZXINCisyMDEzLTAxLTE4IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2lmbmRlZiBfXzdaX0JVRl9IDQorI2RlZmluZSBfXzdaX0JVRl9IDQorDQorI2luY2x1ZGUgIjd6VHlwZXMuaCINCisNCitFWFRFUk5fQ19CRUdJTg0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgQnl0ZSAqZGF0YTsNCisgIHNpemVfdCBzaXplOw0KK30gQ0J1ZjsNCisNCit2b2lkIEJ1Zl9Jbml0KENCdWYgKnApOw0KK2ludCBCdWZfQ3JlYXRlKENCdWYgKnAsIHNpemVfdCBzaXplLCBJU3pBbGxvYyAqYWxsb2MpOw0KK3ZvaWQgQnVmX0ZyZWUoQ0J1ZiAqcCwgSVN6QWxsb2MgKmFsbG9jKTsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIEJ5dGUgKmRhdGE7DQorICBzaXplX3Qgc2l6ZTsNCisgIHNpemVfdCBwb3M7DQorfSBDRHluQnVmOw0KKw0KK3ZvaWQgRHluQnVmX0NvbnN0cnVjdChDRHluQnVmICpwKTsNCit2b2lkIER5bkJ1Zl9TZWVrVG9CZWcoQ0R5bkJ1ZiAqcCk7DQoraW50IER5bkJ1Zl9Xcml0ZShDRHluQnVmICpwLCBjb25zdCBCeXRlICpidWYsIHNpemVfdCBzaXplLCBJU3pBbGxvYyAqYWxsb2MpOw0KK3ZvaWQgRHluQnVmX0ZyZWUoQ0R5bkJ1ZiAqcCwgSVN6QWxsb2MgKmFsbG9jKTsNCisNCitFWFRFUk5fQ19FTkQNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0MvN3pCdWYyLmMgYi9sem1hL0MvN3pCdWYyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzMzc5NgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy83ekJ1ZjIuYwpAQCAtMCwwICsxLDQ4IEBACisvKiA3ekJ1ZjIuYyAtLSBCeXRlIEJ1ZmZlcg0KKzIwMTMtMTEtMTIgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiUHJlY29tcC5oIg0KKw0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisNCisjaW5jbHVkZSAiN3pCdWYuaCINCisNCit2b2lkIER5bkJ1Zl9Db25zdHJ1Y3QoQ0R5bkJ1ZiAqcCkNCit7DQorICBwLT5kYXRhID0gMDsNCisgIHAtPnNpemUgPSAwOw0KKyAgcC0+cG9zID0gMDsNCit9DQorDQordm9pZCBEeW5CdWZfU2Vla1RvQmVnKENEeW5CdWYgKnApDQorew0KKyAgcC0+cG9zID0gMDsNCit9DQorDQoraW50IER5bkJ1Zl9Xcml0ZShDRHluQnVmICpwLCBjb25zdCBCeXRlICpidWYsIHNpemVfdCBzaXplLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgaWYgKHNpemUgPiBwLT5zaXplIC0gcC0+cG9zKQ0KKyAgew0KKyAgICBzaXplX3QgbmV3U2l6ZSA9IHAtPnBvcyArIHNpemU7DQorICAgIEJ5dGUgKmRhdGE7DQorICAgIG5ld1NpemUgKz0gbmV3U2l6ZSAvIDQ7DQorICAgIGRhdGEgPSAoQnl0ZSAqKWFsbG9jLT5BbGxvYyhhbGxvYywgbmV3U2l6ZSk7DQorICAgIGlmIChkYXRhID09IDApDQorICAgICAgcmV0dXJuIDA7DQorICAgIHAtPnNpemUgPSBuZXdTaXplOw0KKyAgICBtZW1jcHkoZGF0YSwgcC0+ZGF0YSwgcC0+cG9zKTsNCisgICAgYWxsb2MtPkZyZWUoYWxsb2MsIHAtPmRhdGEpOw0KKyAgICBwLT5kYXRhID0gZGF0YTsNCisgIH0NCisgIG1lbWNweShwLT5kYXRhICsgcC0+cG9zLCBidWYsIHNpemUpOw0KKyAgcC0+cG9zICs9IHNpemU7DQorICByZXR1cm4gMTsNCit9DQorDQordm9pZCBEeW5CdWZfRnJlZShDRHluQnVmICpwLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgYWxsb2MtPkZyZWUoYWxsb2MsIHAtPmRhdGEpOw0KKyAgcC0+ZGF0YSA9IDA7DQorICBwLT5zaXplID0gMDsNCisgIHAtPnBvcyA9IDA7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy83ekNyYy5jIGIvbHptYS9DLzd6Q3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxZDRkMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy83ekNyYy5jCkBAIC0wLDAgKzEsODUgQEAKKy8qIDd6Q3JjLmMgLS0gQ1JDMzIgaW5pdA0KKzIwMTMtMTEtMTIgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiUHJlY29tcC5oIg0KKw0KKyNpbmNsdWRlICI3ekNyYy5oIg0KKyNpbmNsdWRlICJDcHVBcmNoLmgiDQorDQorI2RlZmluZSBrQ3JjUG9seSAweEVEQjg4MzIwDQorDQorI2lmZGVmIE1ZX0NQVV9YODZfT1JfQU1ENjQNCisgICNkZWZpbmUgQ1JDX05VTV9UQUJMRVMgOA0KKyAgVUludDMyIE1ZX0ZBU1RfQ0FMTCBDcmNVcGRhdGVUOChVSW50MzIgdiwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGNvbnN0IFVJbnQzMiAqdGFibGUpOw0KKyNlbGlmIGRlZmluZWQoTVlfQ1BVX0xFKQ0KKyAgI2RlZmluZSBDUkNfTlVNX1RBQkxFUyA0DQorI2Vsc2UNCisgICNkZWZpbmUgQ1JDX05VTV9UQUJMRVMgNQ0KKyAgI2RlZmluZSBDUkNfVUlOVDMyX1NXQVAodikgKCh2ID4+IDI0KSB8ICgodiA+PiA4KSAmIDB4RkYwMCkgfCAoKHYgPDwgOCkgJiAweEZGMDAwMCkgfCAodiA8PCAyNCkpDQorICBVSW50MzIgTVlfRkFTVF9DQUxMIENyY1VwZGF0ZVQxX0JlVDQoVUludDMyIHYsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBjb25zdCBVSW50MzIgKnRhYmxlKTsNCisjZW5kaWYNCisNCisjaWZuZGVmIE1ZX0NQVV9CRQ0KKyAgVUludDMyIE1ZX0ZBU1RfQ0FMTCBDcmNVcGRhdGVUNChVSW50MzIgdiwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGNvbnN0IFVJbnQzMiAqdGFibGUpOw0KKyNlbmRpZg0KKw0KK3R5cGVkZWYgVUludDMyIChNWV9GQVNUX0NBTEwgKkNSQ19GVU5DKShVSW50MzIgdiwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGNvbnN0IFVJbnQzMiAqdGFibGUpOw0KKw0KK0NSQ19GVU5DIGdfQ3JjVXBkYXRlOw0KK1VJbnQzMiBnX0NyY1RhYmxlWzI1NiAqIENSQ19OVU1fVEFCTEVTXTsNCisNCitVSW50MzIgTVlfRkFTVF9DQUxMIENyY1VwZGF0ZShVSW50MzIgdiwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpDQorew0KKyAgcmV0dXJuIGdfQ3JjVXBkYXRlKHYsIGRhdGEsIHNpemUsIGdfQ3JjVGFibGUpOw0KK30NCisNCitVSW50MzIgTVlfRkFTVF9DQUxMIENyY0NhbGMoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpDQorew0KKyAgcmV0dXJuIGdfQ3JjVXBkYXRlKENSQ19JTklUX1ZBTCwgZGF0YSwgc2l6ZSwgZ19DcmNUYWJsZSkgXiBDUkNfSU5JVF9WQUw7DQorfQ0KKw0KK3ZvaWQgTVlfRkFTVF9DQUxMIENyY0dlbmVyYXRlVGFibGUoKQ0KK3sNCisgIFVJbnQzMiBpOw0KKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQ0KKyAgew0KKyAgICBVSW50MzIgciA9IGk7DQorICAgIHVuc2lnbmVkIGo7DQorICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspDQorICAgICAgciA9IChyID4+IDEpIF4gKGtDcmNQb2x5ICYgfigociAmIDEpIC0gMSkpOw0KKyAgICBnX0NyY1RhYmxlW2ldID0gcjsNCisgIH0NCisgIGZvciAoOyBpIDwgMjU2ICogQ1JDX05VTV9UQUJMRVM7IGkrKykNCisgIHsNCisgICAgVUludDMyIHIgPSBnX0NyY1RhYmxlW2kgLSAyNTZdOw0KKyAgICBnX0NyY1RhYmxlW2ldID0gZ19DcmNUYWJsZVtyICYgMHhGRl0gXiAociA+PiA4KTsNCisgIH0NCisgIA0KKyAgI2lmZGVmIE1ZX0NQVV9MRQ0KKw0KKyAgZ19DcmNVcGRhdGUgPSBDcmNVcGRhdGVUNDsNCisgIA0KKyAgI2lmIENSQ19OVU1fVEFCTEVTID09IDgNCisgIGlmICghQ1BVX0lzX0luT3JkZXIoKSkNCisgICAgZ19DcmNVcGRhdGUgPSBDcmNVcGRhdGVUODsNCisgICNlbmRpZg0KKw0KKyAgI2Vsc2UNCisgIHsNCisgICAgI2lmbmRlZiBNWV9DUFVfQkUNCisgICAgVUludDMyIGsgPSAxOw0KKyAgICBpZiAoKihjb25zdCBCeXRlICopJmsgPT0gMSkNCisgICAgICBnX0NyY1VwZGF0ZSA9IENyY1VwZGF0ZVQ0Ow0KKyAgICBlbHNlDQorICAgICNlbmRpZg0KKyAgICB7DQorICAgICAgZm9yIChpID0gMjU2ICogQ1JDX05VTV9UQUJMRVMgLSAxOyBpID49IDI1NjsgaS0tKQ0KKyAgICAgIHsNCisgICAgICAgIFVJbnQzMiB4ID0gZ19DcmNUYWJsZVtpIC0gMjU2XTsNCisgICAgICAgIGdfQ3JjVGFibGVbaV0gPSBDUkNfVUlOVDMyX1NXQVAoeCk7DQorICAgICAgfQ0KKyAgICAgIGdfQ3JjVXBkYXRlID0gQ3JjVXBkYXRlVDFfQmVUNDsNCisgICAgfQ0KKyAgfQ0KKyAgI2VuZGlmDQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy83ekNyYy5oIGIvbHptYS9DLzd6Q3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwNDU5NAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy83ekNyYy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIDd6Q3JjLmggLS0gQ1JDMzIgY2FsY3VsYXRpb24NCisyMDEzLTAxLTE4IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2lmbmRlZiBfXzdaX0NSQ19IDQorI2RlZmluZSBfXzdaX0NSQ19IDQorDQorI2luY2x1ZGUgIjd6VHlwZXMuaCINCisNCitFWFRFUk5fQ19CRUdJTg0KKw0KK2V4dGVybiBVSW50MzIgZ19DcmNUYWJsZVtdOw0KKw0KKy8qIENhbGwgQ3JjR2VuZXJhdGVUYWJsZSBvbmUgdGltZSBiZWZvcmUgb3RoZXIgQ1JDIGZ1bmN0aW9ucyAqLw0KK3ZvaWQgTVlfRkFTVF9DQUxMIENyY0dlbmVyYXRlVGFibGUodm9pZCk7DQorDQorI2RlZmluZSBDUkNfSU5JVF9WQUwgMHhGRkZGRkZGRg0KKyNkZWZpbmUgQ1JDX0dFVF9ESUdFU1QoY3JjKSAoKGNyYykgXiBDUkNfSU5JVF9WQUwpDQorI2RlZmluZSBDUkNfVVBEQVRFX0JZVEUoY3JjLCBiKSAoZ19DcmNUYWJsZVsoKGNyYykgXiAoYikpICYgMHhGRl0gXiAoKGNyYykgPj4gOCkpDQorDQorVUludDMyIE1ZX0ZBU1RfQ0FMTCBDcmNVcGRhdGUoVUludDMyIGNyYywgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOw0KK1VJbnQzMiBNWV9GQVNUX0NBTEwgQ3JjQ2FsYyhjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7DQorDQorRVhURVJOX0NfRU5EDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DLzd6Q3JjT3B0LmMgYi9sem1hL0MvN3pDcmNPcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGIwMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DLzd6Q3JjT3B0LmMKQEAgLTAsMCArMSw2NiBAQAorLyogN3pDcmNPcHQuYyAtLSBDUkMzMiBjYWxjdWxhdGlvbg0KKzIwMTMtMTEtMTIgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiUHJlY29tcC5oIg0KKw0KKyNpbmNsdWRlICJDcHVBcmNoLmgiDQorDQorI2RlZmluZSBDUkNfVVBEQVRFX0JZVEVfMihjcmMsIGIpICh0YWJsZVsoKGNyYykgXiAoYikpICYgMHhGRl0gXiAoKGNyYykgPj4gOCkpDQorDQorI2lmbmRlZiBNWV9DUFVfQkUNCisNCitVSW50MzIgTVlfRkFTVF9DQUxMIENyY1VwZGF0ZVQ0KFVJbnQzMiB2LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgY29uc3QgVUludDMyICp0YWJsZSkNCit7DQorICBjb25zdCBCeXRlICpwID0gKGNvbnN0IEJ5dGUgKilkYXRhOw0KKyAgZm9yICg7IHNpemUgPiAwICYmICgodW5zaWduZWQpKHB0cmRpZmZfdClwICYgMykgIT0gMDsgc2l6ZS0tLCBwKyspDQorICAgIHYgPSBDUkNfVVBEQVRFX0JZVEVfMih2LCAqcCk7DQorICBmb3IgKDsgc2l6ZSA+PSA0OyBzaXplIC09IDQsIHAgKz0gNCkNCisgIHsNCisgICAgdiBePSAqKGNvbnN0IFVJbnQzMiAqKXA7DQorICAgIHYgPQ0KKyAgICAgIHRhYmxlWzB4MzAwICsgKHYgJiAweEZGKV0gXg0KKyAgICAgIHRhYmxlWzB4MjAwICsgKCh2ID4+IDgpICYgMHhGRildIF4NCisgICAgICB0YWJsZVsweDEwMCArICgodiA+PiAxNikgJiAweEZGKV0gXg0KKyAgICAgIHRhYmxlWzB4MDAwICsgKCh2ID4+IDI0KSldOw0KKyAgfQ0KKyAgZm9yICg7IHNpemUgPiAwOyBzaXplLS0sIHArKykNCisgICAgdiA9IENSQ19VUERBVEVfQllURV8yKHYsICpwKTsNCisgIHJldHVybiB2Ow0KK30NCisNCitVSW50MzIgTVlfRkFTVF9DQUxMIENyY1VwZGF0ZVQ4KFVJbnQzMiB2LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgY29uc3QgVUludDMyICp0YWJsZSkNCit7DQorICByZXR1cm4gQ3JjVXBkYXRlVDQodiwgZGF0YSwgc2l6ZSwgdGFibGUpOw0KK30NCisNCisjZW5kaWYNCisNCisNCisjaWZuZGVmIE1ZX0NQVV9MRQ0KKw0KKyNkZWZpbmUgQ1JDX1VJTlQzMl9TV0FQKHYpICgodiA+PiAyNCkgfCAoKHYgPj4gOCkgJiAweEZGMDApIHwgKCh2IDw8IDgpICYgMHhGRjAwMDApIHwgKHYgPDwgMjQpKQ0KKw0KK1VJbnQzMiBNWV9GQVNUX0NBTEwgQ3JjVXBkYXRlVDFfQmVUNChVSW50MzIgdiwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGNvbnN0IFVJbnQzMiAqdGFibGUpDQorew0KKyAgY29uc3QgQnl0ZSAqcCA9IChjb25zdCBCeXRlICopZGF0YTsNCisgIGZvciAoOyBzaXplID4gMCAmJiAoKHVuc2lnbmVkKShwdHJkaWZmX3QpcCAmIDMpICE9IDA7IHNpemUtLSwgcCsrKQ0KKyAgICB2ID0gQ1JDX1VQREFURV9CWVRFXzIodiwgKnApOw0KKyAgdiA9IENSQ19VSU5UMzJfU1dBUCh2KTsNCisgIHRhYmxlICs9IDB4MTAwOw0KKyAgZm9yICg7IHNpemUgPj0gNDsgc2l6ZSAtPSA0LCBwICs9IDQpDQorICB7DQorICAgIHYgXj0gKihjb25zdCBVSW50MzIgKilwOw0KKyAgICB2ID0NCisgICAgICB0YWJsZVsweDAwMCArICh2ICYgMHhGRildIF4NCisgICAgICB0YWJsZVsweDEwMCArICgodiA+PiA4KSAmIDB4RkYpXSBeDQorICAgICAgdGFibGVbMHgyMDAgKyAoKHYgPj4gMTYpICYgMHhGRildIF4NCisgICAgICB0YWJsZVsweDMwMCArICgodiA+PiAyNCkpXTsNCisgIH0NCisgIHRhYmxlIC09IDB4MTAwOw0KKyAgdiA9IENSQ19VSU5UMzJfU1dBUCh2KTsNCisgIGZvciAoOyBzaXplID4gMDsgc2l6ZS0tLCBwKyspDQorICAgIHYgPSBDUkNfVVBEQVRFX0JZVEVfMih2LCAqcCk7DQorICByZXR1cm4gdjsNCit9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DLzd6RGVjLmMgYi9sem1hL0MvN3pEZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzM2M2E1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DLzd6RGVjLmMKQEAgLTAsMCArMSw0OTMgQEAKKy8qIDd6RGVjLmMgLS0gRGVjb2RpbmcgZnJvbSA3eiBmb2xkZXINCisyMDE0LTA2LTE2IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorDQorLyogI2RlZmluZSBfN1pJUF9QUE1EX1NVUFBQT1JUICovDQorDQorI2luY2x1ZGUgIjd6LmgiDQorDQorI2luY2x1ZGUgIkJjajIuaCINCisjaW5jbHVkZSAiQnJhLmgiDQorI2luY2x1ZGUgIkNwdUFyY2guaCINCisjaW5jbHVkZSAiTHptYURlYy5oIg0KKyNpbmNsdWRlICJMem1hMkRlYy5oIg0KKyNpZmRlZiBfN1pJUF9QUE1EX1NVUFBQT1JUDQorI2luY2x1ZGUgIlBwbWQ3LmgiDQorI2VuZGlmDQorDQorI2RlZmluZSBrX0NvcHkgMA0KKyNkZWZpbmUga19MWk1BMiAweDIxDQorI2RlZmluZSBrX0xaTUEgIDB4MzAxMDENCisjZGVmaW5lIGtfQkNKICAgMHgwMzAzMDEwMw0KKyNkZWZpbmUga19QUEMgICAweDAzMDMwMjA1DQorI2RlZmluZSBrX0FSTSAgIDB4MDMwMzA1MDENCisjZGVmaW5lIGtfQVJNVCAgMHgwMzAzMDcwMQ0KKyNkZWZpbmUga19TUEFSQyAweDAzMDMwODA1DQorI2RlZmluZSBrX0JDSjIgIDB4MDMwMzAxMUINCisNCisjaWZkZWYgXzdaSVBfUFBNRF9TVVBQUE9SVA0KKw0KKyNkZWZpbmUga19QUE1EIDB4MzA0MDENCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIElCeXRlSW4gcDsNCisgIGNvbnN0IEJ5dGUgKmN1cjsNCisgIGNvbnN0IEJ5dGUgKmVuZDsNCisgIGNvbnN0IEJ5dGUgKmJlZ2luOw0KKyAgVUludDY0IHByb2Nlc3NlZDsNCisgIEJvb2wgZXh0cmE7DQorICBTUmVzIHJlczsNCisgIElMb29rSW5TdHJlYW0gKmluU3RyZWFtOw0KK30gQ0J5dGVJblRvTG9vazsNCisNCitzdGF0aWMgQnl0ZSBSZWFkQnl0ZSh2b2lkICpwcCkNCit7DQorICBDQnl0ZUluVG9Mb29rICpwID0gKENCeXRlSW5Ub0xvb2sgKilwcDsNCisgIGlmIChwLT5jdXIgIT0gcC0+ZW5kKQ0KKyAgICByZXR1cm4gKnAtPmN1cisrOw0KKyAgaWYgKHAtPnJlcyA9PSBTWl9PSykNCisgIHsNCisgICAgc2l6ZV90IHNpemUgPSBwLT5jdXIgLSBwLT5iZWdpbjsNCisgICAgcC0+cHJvY2Vzc2VkICs9IHNpemU7DQorICAgIHAtPnJlcyA9IHAtPmluU3RyZWFtLT5Ta2lwKHAtPmluU3RyZWFtLCBzaXplKTsNCisgICAgc2l6ZSA9ICgxIDw8IDI1KTsNCisgICAgcC0+cmVzID0gcC0+aW5TdHJlYW0tPkxvb2socC0+aW5TdHJlYW0sIChjb25zdCB2b2lkICoqKSZwLT5iZWdpbiwgJnNpemUpOw0KKyAgICBwLT5jdXIgPSBwLT5iZWdpbjsNCisgICAgcC0+ZW5kID0gcC0+YmVnaW4gKyBzaXplOw0KKyAgICBpZiAoc2l6ZSAhPSAwKQ0KKyAgICAgIHJldHVybiAqcC0+Y3VyKys7Ow0KKyAgfQ0KKyAgcC0+ZXh0cmEgPSBUcnVlOw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBTUmVzIFN6RGVjb2RlUHBtZChjb25zdCBCeXRlICpwcm9wcywgdW5zaWduZWQgcHJvcHNTaXplLCBVSW50NjQgaW5TaXplLCBJTG9va0luU3RyZWFtICppblN0cmVhbSwNCisgICAgQnl0ZSAqb3V0QnVmZmVyLCBTaXplVCBvdXRTaXplLCBJU3pBbGxvYyAqYWxsb2NNYWluKQ0KK3sNCisgIENQcG1kNyBwcG1kOw0KKyAgQ0J5dGVJblRvTG9vayBzOw0KKyAgU1JlcyByZXMgPSBTWl9PSzsNCisNCisgIHMucC5SZWFkID0gUmVhZEJ5dGU7DQorICBzLmluU3RyZWFtID0gaW5TdHJlYW07DQorICBzLmJlZ2luID0gcy5lbmQgPSBzLmN1ciA9IE5VTEw7DQorICBzLmV4dHJhID0gRmFsc2U7DQorICBzLnJlcyA9IFNaX09LOw0KKyAgcy5wcm9jZXNzZWQgPSAwOw0KKw0KKyAgaWYgKHByb3BzU2l6ZSAhPSA1KQ0KKyAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorDQorICB7DQorICAgIHVuc2lnbmVkIG9yZGVyID0gcHJvcHNbMF07DQorICAgIFVJbnQzMiBtZW1TaXplID0gR2V0VWkzMihwcm9wcyArIDEpOw0KKyAgICBpZiAob3JkZXIgPCBQUE1EN19NSU5fT1JERVIgfHwNCisgICAgICAgIG9yZGVyID4gUFBNRDdfTUFYX09SREVSIHx8DQorICAgICAgICBtZW1TaXplIDwgUFBNRDdfTUlOX01FTV9TSVpFIHx8DQorICAgICAgICBtZW1TaXplID4gUFBNRDdfTUFYX01FTV9TSVpFKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgICAgUHBtZDdfQ29uc3RydWN0KCZwcG1kKTsNCisgICAgaWYgKCFQcG1kN19BbGxvYygmcHBtZCwgbWVtU2l6ZSwgYWxsb2NNYWluKSkNCisgICAgICByZXR1cm4gU1pfRVJST1JfTUVNOw0KKyAgICBQcG1kN19Jbml0KCZwcG1kLCBvcmRlcik7DQorICB9DQorICB7DQorICAgIENQcG1kN3pfUmFuZ2VEZWMgcmM7DQorICAgIFBwbWQ3el9SYW5nZURlY19DcmVhdGVWVGFibGUoJnJjKTsNCisgICAgcmMuU3RyZWFtID0gJnMucDsNCisgICAgaWYgKCFQcG1kN3pfUmFuZ2VEZWNfSW5pdCgmcmMpKQ0KKyAgICAgIHJlcyA9IFNaX0VSUk9SX0RBVEE7DQorICAgIGVsc2UgaWYgKHMuZXh0cmEpDQorICAgICAgcmVzID0gKHMucmVzICE9IFNaX09LID8gcy5yZXMgOiBTWl9FUlJPUl9EQVRBKTsNCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgU2l6ZVQgaTsNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0U2l6ZTsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgIGludCBzeW0gPSBQcG1kN19EZWNvZGVTeW1ib2woJnBwbWQsICZyYy5wKTsNCisgICAgICAgIGlmIChzLmV4dHJhIHx8IHN5bSA8IDApDQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgb3V0QnVmZmVyW2ldID0gKEJ5dGUpc3ltOw0KKyAgICAgIH0NCisgICAgICBpZiAoaSAhPSBvdXRTaXplKQ0KKyAgICAgICAgcmVzID0gKHMucmVzICE9IFNaX09LID8gcy5yZXMgOiBTWl9FUlJPUl9EQVRBKTsNCisgICAgICBlbHNlIGlmIChzLnByb2Nlc3NlZCArIChzLmN1ciAtIHMuYmVnaW4pICE9IGluU2l6ZSB8fCAhUHBtZDd6X1JhbmdlRGVjX0lzRmluaXNoZWRPSygmcmMpKQ0KKyAgICAgICAgcmVzID0gU1pfRVJST1JfREFUQTsNCisgICAgfQ0KKyAgfQ0KKyAgUHBtZDdfRnJlZSgmcHBtZCwgYWxsb2NNYWluKTsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KKyNlbmRpZg0KKw0KKw0KK3N0YXRpYyBTUmVzIFN6RGVjb2RlTHptYShjb25zdCBCeXRlICpwcm9wcywgdW5zaWduZWQgcHJvcHNTaXplLCBVSW50NjQgaW5TaXplLCBJTG9va0luU3RyZWFtICppblN0cmVhbSwNCisgICAgQnl0ZSAqb3V0QnVmZmVyLCBTaXplVCBvdXRTaXplLCBJU3pBbGxvYyAqYWxsb2NNYWluKQ0KK3sNCisgIENMem1hRGVjIHN0YXRlOw0KKyAgU1JlcyByZXMgPSBTWl9PSzsNCisNCisgIEx6bWFEZWNfQ29uc3RydWN0KCZzdGF0ZSk7DQorICBSSU5PSyhMem1hRGVjX0FsbG9jYXRlUHJvYnMoJnN0YXRlLCBwcm9wcywgcHJvcHNTaXplLCBhbGxvY01haW4pKTsNCisgIHN0YXRlLmRpYyA9IG91dEJ1ZmZlcjsNCisgIHN0YXRlLmRpY0J1ZlNpemUgPSBvdXRTaXplOw0KKyAgTHptYURlY19Jbml0KCZzdGF0ZSk7DQorDQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBCeXRlICppbkJ1ZiA9IE5VTEw7DQorICAgIHNpemVfdCBsb29rYWhlYWQgPSAoMSA8PCAxOCk7DQorICAgIGlmIChsb29rYWhlYWQgPiBpblNpemUpDQorICAgICAgbG9va2FoZWFkID0gKHNpemVfdClpblNpemU7DQorICAgIHJlcyA9IGluU3RyZWFtLT5Mb29rKCh2b2lkICopaW5TdHJlYW0sIChjb25zdCB2b2lkICoqKSZpbkJ1ZiwgJmxvb2thaGVhZCk7DQorICAgIGlmIChyZXMgIT0gU1pfT0spDQorICAgICAgYnJlYWs7DQorDQorICAgIHsNCisgICAgICBTaXplVCBpblByb2Nlc3NlZCA9IChTaXplVClsb29rYWhlYWQsIGRpY1BvcyA9IHN0YXRlLmRpY1BvczsNCisgICAgICBFTHptYVN0YXR1cyBzdGF0dXM7DQorICAgICAgcmVzID0gTHptYURlY19EZWNvZGVUb0RpYygmc3RhdGUsIG91dFNpemUsIGluQnVmLCAmaW5Qcm9jZXNzZWQsIExaTUFfRklOSVNIX0VORCwgJnN0YXR1cyk7DQorICAgICAgbG9va2FoZWFkIC09IGluUHJvY2Vzc2VkOw0KKyAgICAgIGluU2l6ZSAtPSBpblByb2Nlc3NlZDsNCisgICAgICBpZiAocmVzICE9IFNaX09LKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgaWYgKHN0YXRlLmRpY1BvcyA9PSBzdGF0ZS5kaWNCdWZTaXplIHx8IChpblByb2Nlc3NlZCA9PSAwICYmIGRpY1BvcyA9PSBzdGF0ZS5kaWNQb3MpKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChzdGF0ZS5kaWNCdWZTaXplICE9IG91dFNpemUgfHwgbG9va2FoZWFkICE9IDAgfHwNCisgICAgICAgICAgICAoc3RhdHVzICE9IExaTUFfU1RBVFVTX0ZJTklTSEVEX1dJVEhfTUFSSyAmJg0KKyAgICAgICAgICAgICBzdGF0dXMgIT0gTFpNQV9TVEFUVVNfTUFZQkVfRklOSVNIRURfV0lUSE9VVF9NQVJLKSkNCisgICAgICAgICAgcmVzID0gU1pfRVJST1JfREFUQTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICByZXMgPSBpblN0cmVhbS0+U2tpcCgodm9pZCAqKWluU3RyZWFtLCBpblByb2Nlc3NlZCk7DQorICAgICAgaWYgKHJlcyAhPSBTWl9PSykNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorDQorICBMem1hRGVjX0ZyZWVQcm9icygmc3RhdGUsIGFsbG9jTWFpbik7DQorICByZXR1cm4gcmVzOw0KK30NCisNCitzdGF0aWMgU1JlcyBTekRlY29kZUx6bWEyKGNvbnN0IEJ5dGUgKnByb3BzLCB1bnNpZ25lZCBwcm9wc1NpemUsIFVJbnQ2NCBpblNpemUsIElMb29rSW5TdHJlYW0gKmluU3RyZWFtLA0KKyAgICBCeXRlICpvdXRCdWZmZXIsIFNpemVUIG91dFNpemUsIElTekFsbG9jICphbGxvY01haW4pDQorew0KKyAgQ0x6bWEyRGVjIHN0YXRlOw0KKyAgU1JlcyByZXMgPSBTWl9PSzsNCisNCisgIEx6bWEyRGVjX0NvbnN0cnVjdCgmc3RhdGUpOw0KKyAgaWYgKHByb3BzU2l6ZSAhPSAxKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfREFUQTsNCisgIFJJTk9LKEx6bWEyRGVjX0FsbG9jYXRlUHJvYnMoJnN0YXRlLCBwcm9wc1swXSwgYWxsb2NNYWluKSk7DQorICBzdGF0ZS5kZWNvZGVyLmRpYyA9IG91dEJ1ZmZlcjsNCisgIHN0YXRlLmRlY29kZXIuZGljQnVmU2l6ZSA9IG91dFNpemU7DQorICBMem1hMkRlY19Jbml0KCZzdGF0ZSk7DQorDQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBCeXRlICppbkJ1ZiA9IE5VTEw7DQorICAgIHNpemVfdCBsb29rYWhlYWQgPSAoMSA8PCAxOCk7DQorICAgIGlmIChsb29rYWhlYWQgPiBpblNpemUpDQorICAgICAgbG9va2FoZWFkID0gKHNpemVfdClpblNpemU7DQorICAgIHJlcyA9IGluU3RyZWFtLT5Mb29rKCh2b2lkICopaW5TdHJlYW0sIChjb25zdCB2b2lkICoqKSZpbkJ1ZiwgJmxvb2thaGVhZCk7DQorICAgIGlmIChyZXMgIT0gU1pfT0spDQorICAgICAgYnJlYWs7DQorDQorICAgIHsNCisgICAgICBTaXplVCBpblByb2Nlc3NlZCA9IChTaXplVClsb29rYWhlYWQsIGRpY1BvcyA9IHN0YXRlLmRlY29kZXIuZGljUG9zOw0KKyAgICAgIEVMem1hU3RhdHVzIHN0YXR1czsNCisgICAgICByZXMgPSBMem1hMkRlY19EZWNvZGVUb0RpYygmc3RhdGUsIG91dFNpemUsIGluQnVmLCAmaW5Qcm9jZXNzZWQsIExaTUFfRklOSVNIX0VORCwgJnN0YXR1cyk7DQorICAgICAgbG9va2FoZWFkIC09IGluUHJvY2Vzc2VkOw0KKyAgICAgIGluU2l6ZSAtPSBpblByb2Nlc3NlZDsNCisgICAgICBpZiAocmVzICE9IFNaX09LKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgaWYgKHN0YXRlLmRlY29kZXIuZGljUG9zID09IHN0YXRlLmRlY29kZXIuZGljQnVmU2l6ZSB8fCAoaW5Qcm9jZXNzZWQgPT0gMCAmJiBkaWNQb3MgPT0gc3RhdGUuZGVjb2Rlci5kaWNQb3MpKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChzdGF0ZS5kZWNvZGVyLmRpY0J1ZlNpemUgIT0gb3V0U2l6ZSB8fCBsb29rYWhlYWQgIT0gMCB8fA0KKyAgICAgICAgICAgIChzdGF0dXMgIT0gTFpNQV9TVEFUVVNfRklOSVNIRURfV0lUSF9NQVJLKSkNCisgICAgICAgICAgcmVzID0gU1pfRVJST1JfREFUQTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICByZXMgPSBpblN0cmVhbS0+U2tpcCgodm9pZCAqKWluU3RyZWFtLCBpblByb2Nlc3NlZCk7DQorICAgICAgaWYgKHJlcyAhPSBTWl9PSykNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorDQorICBMem1hMkRlY19GcmVlUHJvYnMoJnN0YXRlLCBhbGxvY01haW4pOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorc3RhdGljIFNSZXMgU3pEZWNvZGVDb3B5KFVJbnQ2NCBpblNpemUsIElMb29rSW5TdHJlYW0gKmluU3RyZWFtLCBCeXRlICpvdXRCdWZmZXIpDQorew0KKyAgd2hpbGUgKGluU2l6ZSA+IDApDQorICB7DQorICAgIHZvaWQgKmluQnVmOw0KKyAgICBzaXplX3QgY3VyU2l6ZSA9ICgxIDw8IDE4KTsNCisgICAgaWYgKGN1clNpemUgPiBpblNpemUpDQorICAgICAgY3VyU2l6ZSA9IChzaXplX3QpaW5TaXplOw0KKyAgICBSSU5PSyhpblN0cmVhbS0+TG9vaygodm9pZCAqKWluU3RyZWFtLCAoY29uc3Qgdm9pZCAqKikmaW5CdWYsICZjdXJTaXplKSk7DQorICAgIGlmIChjdXJTaXplID09IDApDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX0lOUFVUX0VPRjsNCisgICAgbWVtY3B5KG91dEJ1ZmZlciwgaW5CdWYsIGN1clNpemUpOw0KKyAgICBvdXRCdWZmZXIgKz0gY3VyU2l6ZTsNCisgICAgaW5TaXplIC09IGN1clNpemU7DQorICAgIFJJTk9LKGluU3RyZWFtLT5Ta2lwKCh2b2lkICopaW5TdHJlYW0sIGN1clNpemUpKTsNCisgIH0NCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorc3RhdGljIEJvb2wgSVNfTUFJTl9NRVRIT0QoVUludDMyIG0pDQorew0KKyAgc3dpdGNoIChtKQ0KKyAgew0KKyAgICBjYXNlIGtfQ29weToNCisgICAgY2FzZSBrX0xaTUE6DQorICAgIGNhc2Uga19MWk1BMjoNCisgICAgI2lmZGVmIF83WklQX1BQTURfU1VQUFBPUlQNCisgICAgY2FzZSBrX1BQTUQ6DQorICAgICNlbmRpZg0KKyAgICAgIHJldHVybiBUcnVlOw0KKyAgfQ0KKyAgcmV0dXJuIEZhbHNlOw0KK30NCisNCitzdGF0aWMgQm9vbCBJU19TVVBQT1JURURfQ09ERVIoY29uc3QgQ1N6Q29kZXJJbmZvICpjKQ0KK3sNCisgIHJldHVybg0KKyAgICAgIGMtPk51bUluU3RyZWFtcyA9PSAxICYmDQorICAgICAgYy0+TnVtT3V0U3RyZWFtcyA9PSAxICYmDQorICAgICAgLyogYy0+TWV0aG9kSUQgPD0gKFVJbnQzMikweEZGRkZGRkZGICYmICovDQorICAgICAgSVNfTUFJTl9NRVRIT0QoKFVJbnQzMiljLT5NZXRob2RJRCk7DQorfQ0KKw0KKyNkZWZpbmUgSVNfQkNKMihjKSAoKGMpLT5NZXRob2RJRCA9PSBrX0JDSjIgJiYgKGMpLT5OdW1JblN0cmVhbXMgPT0gNCAmJiAoYyktPk51bU91dFN0cmVhbXMgPT0gMSkNCisNCitzdGF0aWMgU1JlcyBDaGVja1N1cHBvcnRlZEZvbGRlcihjb25zdCBDU3pGb2xkZXIgKmYpDQorew0KKyAgaWYgKGYtPk51bUNvZGVycyA8IDEgfHwgZi0+TnVtQ29kZXJzID4gNCkNCisgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKyAgaWYgKCFJU19TVVBQT1JURURfQ09ERVIoJmYtPkNvZGVyc1swXSkpDQorICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgIGlmIChmLT5OdW1Db2RlcnMgPT0gMSkNCisgIHsNCisgICAgaWYgKGYtPk51bVBhY2tTdHJlYW1zICE9IDEgfHwgZi0+UGFja1N0cmVhbXNbMF0gIT0gMCB8fCBmLT5OdW1CaW5kUGFpcnMgIT0gMCkNCisgICAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICAgIHJldHVybiBTWl9PSzsNCisgIH0NCisgIGlmIChmLT5OdW1Db2RlcnMgPT0gMikNCisgIHsNCisgICAgY29uc3QgQ1N6Q29kZXJJbmZvICpjID0gJmYtPkNvZGVyc1sxXTsNCisgICAgaWYgKA0KKyAgICAgICAgLyogYy0+TWV0aG9kSUQgPiAoVUludDMyKTB4RkZGRkZGRkYgfHwgKi8NCisgICAgICAgIGMtPk51bUluU3RyZWFtcyAhPSAxIHx8DQorICAgICAgICBjLT5OdW1PdXRTdHJlYW1zICE9IDEgfHwNCisgICAgICAgIGYtPk51bVBhY2tTdHJlYW1zICE9IDEgfHwNCisgICAgICAgIGYtPlBhY2tTdHJlYW1zWzBdICE9IDAgfHwNCisgICAgICAgIGYtPk51bUJpbmRQYWlycyAhPSAxIHx8DQorICAgICAgICBmLT5CaW5kUGFpcnNbMF0uSW5JbmRleCAhPSAxIHx8DQorICAgICAgICBmLT5CaW5kUGFpcnNbMF0uT3V0SW5kZXggIT0gMCkNCisgICAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICAgIHN3aXRjaCAoKFVJbnQzMiljLT5NZXRob2RJRCkNCisgICAgew0KKyAgICAgIGNhc2Uga19CQ0o6DQorICAgICAgY2FzZSBrX0FSTToNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICAgIH0NCisgICAgcmV0dXJuIFNaX09LOw0KKyAgfQ0KKyAgaWYgKGYtPk51bUNvZGVycyA9PSA0KQ0KKyAgew0KKyAgICBpZiAoIUlTX1NVUFBPUlRFRF9DT0RFUigmZi0+Q29kZXJzWzFdKSB8fA0KKyAgICAgICAgIUlTX1NVUFBPUlRFRF9DT0RFUigmZi0+Q29kZXJzWzJdKSB8fA0KKyAgICAgICAgIUlTX0JDSjIoJmYtPkNvZGVyc1szXSkpDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKyAgICBpZiAoZi0+TnVtUGFja1N0cmVhbXMgIT0gNCB8fA0KKyAgICAgICAgZi0+UGFja1N0cmVhbXNbMF0gIT0gMiB8fA0KKyAgICAgICAgZi0+UGFja1N0cmVhbXNbMV0gIT0gNiB8fA0KKyAgICAgICAgZi0+UGFja1N0cmVhbXNbMl0gIT0gMSB8fA0KKyAgICAgICAgZi0+UGFja1N0cmVhbXNbM10gIT0gMCB8fA0KKyAgICAgICAgZi0+TnVtQmluZFBhaXJzICE9IDMgfHwNCisgICAgICAgIGYtPkJpbmRQYWlyc1swXS5JbkluZGV4ICE9IDUgfHwgZi0+QmluZFBhaXJzWzBdLk91dEluZGV4ICE9IDAgfHwNCisgICAgICAgIGYtPkJpbmRQYWlyc1sxXS5JbkluZGV4ICE9IDQgfHwgZi0+QmluZFBhaXJzWzFdLk91dEluZGV4ICE9IDEgfHwNCisgICAgICAgIGYtPkJpbmRQYWlyc1syXS5JbkluZGV4ICE9IDMgfHwgZi0+QmluZFBhaXJzWzJdLk91dEluZGV4ICE9IDIpDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKyAgICByZXR1cm4gU1pfT0s7DQorICB9DQorICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorfQ0KKw0KKyNkZWZpbmUgQ0FTRV9CUkFfQ09OVihpc2EpIGNhc2Uga18gIyMgaXNhOiBpc2EgIyMgX0NvbnZlcnQob3V0QnVmZmVyLCBvdXRTaXplLCAwLCAwKTsgYnJlYWs7DQorDQorc3RhdGljIFNSZXMgU3pGb2xkZXJfRGVjb2RlMihjb25zdCBDU3pGb2xkZXIgKmZvbGRlciwNCisgICAgY29uc3QgQnl0ZSAqcHJvcHNEYXRhLA0KKyAgICBjb25zdCBVSW50NjQgKnVucGFja1NpemVzLA0KKyAgICBjb25zdCBVSW50NjQgKnBhY2tQb3NpdGlvbnMsDQorICAgIElMb29rSW5TdHJlYW0gKmluU3RyZWFtLCBVSW50NjQgc3RhcnRQb3MsDQorICAgIEJ5dGUgKm91dEJ1ZmZlciwgU2l6ZVQgb3V0U2l6ZSwgSVN6QWxsb2MgKmFsbG9jTWFpbiwNCisgICAgQnl0ZSAqdGVtcEJ1ZltdKQ0KK3sNCisgIFVJbnQzMiBjaTsNCisgIFNpemVUIHRlbXBTaXplc1szXSA9IHsgMCwgMCwgMH07DQorICBTaXplVCB0ZW1wU2l6ZTMgPSAwOw0KKyAgQnl0ZSAqdGVtcEJ1ZjMgPSAwOw0KKw0KKyAgUklOT0soQ2hlY2tTdXBwb3J0ZWRGb2xkZXIoZm9sZGVyKSk7DQorDQorICBmb3IgKGNpID0gMDsgY2kgPCBmb2xkZXItPk51bUNvZGVyczsgY2krKykNCisgIHsNCisgICAgY29uc3QgQ1N6Q29kZXJJbmZvICpjb2RlciA9ICZmb2xkZXItPkNvZGVyc1tjaV07DQorDQorICAgIGlmIChJU19NQUlOX01FVEhPRCgoVUludDMyKWNvZGVyLT5NZXRob2RJRCkpDQorICAgIHsNCisgICAgICBVSW50MzIgc2kgPSAwOw0KKyAgICAgIFVJbnQ2NCBvZmZzZXQ7DQorICAgICAgVUludDY0IGluU2l6ZTsNCisgICAgICBCeXRlICpvdXRCdWZDdXIgPSBvdXRCdWZmZXI7DQorICAgICAgU2l6ZVQgb3V0U2l6ZUN1ciA9IG91dFNpemU7DQorICAgICAgaWYgKGZvbGRlci0+TnVtQ29kZXJzID09IDQpDQorICAgICAgew0KKyAgICAgICAgVUludDMyIGluZGljZXNbXSA9IHsgMywgMiwgMCB9Ow0KKyAgICAgICAgVUludDY0IHVucGFja1NpemUgPSB1bnBhY2tTaXplc1tjaV07DQorICAgICAgICBzaSA9IGluZGljZXNbY2ldOw0KKyAgICAgICAgaWYgKGNpIDwgMikNCisgICAgICAgIHsNCisgICAgICAgICAgQnl0ZSAqdGVtcDsNCisgICAgICAgICAgb3V0U2l6ZUN1ciA9IChTaXplVCl1bnBhY2tTaXplOw0KKyAgICAgICAgICBpZiAob3V0U2l6ZUN1ciAhPSB1bnBhY2tTaXplKQ0KKyAgICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorICAgICAgICAgIHRlbXAgPSAoQnl0ZSAqKUlBbGxvY19BbGxvYyhhbGxvY01haW4sIG91dFNpemVDdXIpOw0KKyAgICAgICAgICBpZiAodGVtcCA9PSAwICYmIG91dFNpemVDdXIgIT0gMCkNCisgICAgICAgICAgICByZXR1cm4gU1pfRVJST1JfTUVNOw0KKyAgICAgICAgICBvdXRCdWZDdXIgPSB0ZW1wQnVmWzEgLSBjaV0gPSB0ZW1wOw0KKyAgICAgICAgICB0ZW1wU2l6ZXNbMSAtIGNpXSA9IG91dFNpemVDdXI7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIGlmIChjaSA9PSAyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAodW5wYWNrU2l6ZSA+IG91dFNpemUpIC8qIGNoZWNrIGl0ICovDQorICAgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX1BBUkFNOw0KKyAgICAgICAgICB0ZW1wQnVmMyA9IG91dEJ1ZkN1ciA9IG91dEJ1ZmZlciArIChvdXRTaXplIC0gKHNpemVfdCl1bnBhY2tTaXplKTsNCisgICAgICAgICAgdGVtcFNpemUzID0gb3V0U2l6ZUN1ciA9IChTaXplVCl1bnBhY2tTaXplOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICAgICAgfQ0KKyAgICAgIG9mZnNldCA9IHBhY2tQb3NpdGlvbnNbc2ldOw0KKyAgICAgIGluU2l6ZSA9IHBhY2tQb3NpdGlvbnNbc2kgKyAxXSAtIG9mZnNldDsNCisgICAgICBSSU5PSyhMb29rSW5TdHJlYW1fU2Vla1RvKGluU3RyZWFtLCBzdGFydFBvcyArIG9mZnNldCkpOw0KKw0KKyAgICAgIGlmIChjb2Rlci0+TWV0aG9kSUQgPT0ga19Db3B5KQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChpblNpemUgIT0gb3V0U2l6ZUN1cikgLyogY2hlY2sgaXQgKi8NCisgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX0RBVEE7DQorICAgICAgICBSSU5PSyhTekRlY29kZUNvcHkoaW5TaXplLCBpblN0cmVhbSwgb3V0QnVmQ3VyKSk7DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKGNvZGVyLT5NZXRob2RJRCA9PSBrX0xaTUEpDQorICAgICAgew0KKyAgICAgICAgUklOT0soU3pEZWNvZGVMem1hKHByb3BzRGF0YSArIGNvZGVyLT5Qcm9wc09mZnNldCwgY29kZXItPlByb3BzU2l6ZSwgaW5TaXplLCBpblN0cmVhbSwgb3V0QnVmQ3VyLCBvdXRTaXplQ3VyLCBhbGxvY01haW4pKTsNCisgICAgICB9DQorICAgICAgZWxzZSBpZiAoY29kZXItPk1ldGhvZElEID09IGtfTFpNQTIpDQorICAgICAgew0KKyAgICAgICAgUklOT0soU3pEZWNvZGVMem1hMihwcm9wc0RhdGEgKyBjb2Rlci0+UHJvcHNPZmZzZXQsIGNvZGVyLT5Qcm9wc1NpemUsIGluU2l6ZSwgaW5TdHJlYW0sIG91dEJ1ZkN1ciwgb3V0U2l6ZUN1ciwgYWxsb2NNYWluKSk7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAjaWZkZWYgXzdaSVBfUFBNRF9TVVBQUE9SVA0KKyAgICAgICAgUklOT0soU3pEZWNvZGVQcG1kKHByb3BzRGF0YSArIGNvZGVyLT5Qcm9wc09mZnNldCwgY29kZXItPlByb3BzU2l6ZSwgaW5TaXplLCBpblN0cmVhbSwgb3V0QnVmQ3VyLCBvdXRTaXplQ3VyLCBhbGxvY01haW4pKTsNCisgICAgICAgICNlbHNlDQorICAgICAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICAgICAgICAjZW5kaWYNCisgICAgICB9DQorICAgIH0NCisgICAgZWxzZSBpZiAoY29kZXItPk1ldGhvZElEID09IGtfQkNKMikNCisgICAgew0KKyAgICAgIFVJbnQ2NCBvZmZzZXQgPSBwYWNrUG9zaXRpb25zWzFdOw0KKyAgICAgIFVJbnQ2NCBzM1NpemUgPSBwYWNrUG9zaXRpb25zWzJdIC0gb2Zmc2V0Ow0KKyAgICAgIFNSZXMgcmVzOw0KKyAgICAgIGlmIChjaSAhPSAzKQ0KKyAgICAgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKyAgICAgIFJJTk9LKExvb2tJblN0cmVhbV9TZWVrVG8oaW5TdHJlYW0sIHN0YXJ0UG9zICsgb2Zmc2V0KSk7DQorICAgICAgdGVtcFNpemVzWzJdID0gKFNpemVUKXMzU2l6ZTsNCisgICAgICBpZiAodGVtcFNpemVzWzJdICE9IHMzU2l6ZSkNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorICAgICAgdGVtcEJ1ZlsyXSA9IChCeXRlICopSUFsbG9jX0FsbG9jKGFsbG9jTWFpbiwgdGVtcFNpemVzWzJdKTsNCisgICAgICBpZiAodGVtcEJ1ZlsyXSA9PSAwICYmIHRlbXBTaXplc1syXSAhPSAwKQ0KKyAgICAgICAgcmV0dXJuIFNaX0VSUk9SX01FTTsNCisgICAgICByZXMgPSBTekRlY29kZUNvcHkoczNTaXplLCBpblN0cmVhbSwgdGVtcEJ1ZlsyXSk7DQorICAgICAgUklOT0socmVzKQ0KKw0KKyAgICAgIHJlcyA9IEJjajJfRGVjb2RlKA0KKyAgICAgICAgICB0ZW1wQnVmMywgdGVtcFNpemUzLA0KKyAgICAgICAgICB0ZW1wQnVmWzBdLCB0ZW1wU2l6ZXNbMF0sDQorICAgICAgICAgIHRlbXBCdWZbMV0sIHRlbXBTaXplc1sxXSwNCisgICAgICAgICAgdGVtcEJ1ZlsyXSwgdGVtcFNpemVzWzJdLA0KKyAgICAgICAgICBvdXRCdWZmZXIsIG91dFNpemUpOw0KKyAgICAgIFJJTk9LKHJlcykNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBpZiAoY2kgIT0gMSkNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgICAgICBzd2l0Y2ggKGNvZGVyLT5NZXRob2RJRCkNCisgICAgICB7DQorICAgICAgICBjYXNlIGtfQkNKOg0KKyAgICAgICAgew0KKyAgICAgICAgICBVSW50MzIgc3RhdGU7DQorICAgICAgICAgIHg4Nl9Db252ZXJ0X0luaXQoc3RhdGUpOw0KKyAgICAgICAgICB4ODZfQ29udmVydChvdXRCdWZmZXIsIG91dFNpemUsIDAsICZzdGF0ZSwgMCk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0FTRV9CUkFfQ09OVihBUk0pDQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gU1pfT0s7DQorfQ0KKw0KK1NSZXMgU3pBcl9EZWNvZGVGb2xkZXIoY29uc3QgQ1N6QXIgKnAsIFVJbnQzMiBmb2xkZXJJbmRleCwNCisgICAgSUxvb2tJblN0cmVhbSAqaW5TdHJlYW0sIFVJbnQ2NCBzdGFydFBvcywNCisgICAgQnl0ZSAqb3V0QnVmZmVyLCBzaXplX3Qgb3V0U2l6ZSwNCisgICAgSVN6QWxsb2MgKmFsbG9jTWFpbikNCit7DQorICBTUmVzIHJlczsNCisgIENTekZvbGRlciBmb2xkZXI7DQorICBDU3pEYXRhIHNkOw0KKyAgQ1N6RGF0YSBzZFNpemVzOw0KKyAgDQorICBjb25zdCBCeXRlICpkYXRhID0gcC0+Q29kZXJzRGF0YSArIHAtPkZvQ29kZXJzT2Zmc2V0c1tmb2xkZXJJbmRleF07DQorICBzZC5EYXRhID0gZGF0YTsNCisgIHNkLlNpemUgPSBwLT5Gb0NvZGVyc09mZnNldHNbZm9sZGVySW5kZXggKyAxXSAtIHAtPkZvQ29kZXJzT2Zmc2V0c1tmb2xkZXJJbmRleF07DQorICANCisgIHNkU2l6ZXMuRGF0YSA9IHAtPlVucGFja1NpemVzRGF0YSArIHAtPkZvU2l6ZXNPZmZzZXRzW2ZvbGRlckluZGV4XTsNCisgIHNkU2l6ZXMuU2l6ZSA9DQorICAgICAgcC0+Rm9TaXplc09mZnNldHNbZm9sZGVySW5kZXggKyAxXSAtDQorICAgICAgcC0+Rm9TaXplc09mZnNldHNbZm9sZGVySW5kZXhdOw0KKw0KKyAgcmVzID0gU3pHZXROZXh0Rm9sZGVySXRlbSgmZm9sZGVyLCAmc2QsICZzZFNpemVzKTsNCisgIA0KKyAgaWYgKHJlcyAhPSBTWl9PSykNCisgICAgcmV0dXJuIHJlczsNCisNCisgIGlmIChzZC5TaXplICE9IDAgfHwgb3V0U2l6ZSAhPSBmb2xkZXIuQ29kZXJzVW5wYWNrU2l6ZXNbZm9sZGVyLk1haW5PdXRTdHJlYW1dKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfRkFJTDsNCisgIHsNCisgICAgaW50IGk7DQorICAgIEJ5dGUgKnRlbXBCdWZbM10gPSB7IDAsIDAsIDB9Ow0KKyAgICByZXMgPSBTekZvbGRlcl9EZWNvZGUyKCZmb2xkZXIsIGRhdGEsIGZvbGRlci5Db2RlcnNVbnBhY2tTaXplcywNCisgICAgICAgIHAtPlBhY2tQb3NpdGlvbnMgKyBwLT5Gb1N0YXJ0UGFja1N0cmVhbUluZGV4W2ZvbGRlckluZGV4XSwNCisgICAgICAgIGluU3RyZWFtLCBzdGFydFBvcywNCisgICAgICAgIG91dEJ1ZmZlciwgKFNpemVUKW91dFNpemUsIGFsbG9jTWFpbiwgdGVtcEJ1Zik7DQorICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspDQorICAgICAgSUFsbG9jX0ZyZWUoYWxsb2NNYWluLCB0ZW1wQnVmW2ldKTsNCisgICAgcmV0dXJuIHJlczsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DLzd6RmlsZS5jIGIvbHptYS9DLzd6RmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZmU3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvN3pGaWxlLmMKQEAgLTAsMCArMSwyODYgQEAKKy8qIDd6RmlsZS5jIC0tIEZpbGUgSU8NCisyMDA5LTExLTI0IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSAiN3pGaWxlLmgiDQorDQorI2lmbmRlZiBVU0VfV0lORE9XU19GSUxFDQorDQorI2lmbmRlZiBVTkRFUl9DRQ0KKyNpbmNsdWRlIDxlcnJuby5oPg0KKyNlbmRpZg0KKw0KKyNlbHNlDQorDQorLyoNCisgICBSZWFkRmlsZSBhbmQgV3JpdGVGaWxlIGZ1bmN0aW9ucyBpbiBXaW5kb3dzIGhhdmUgQlVHOg0KKyAgIElmIHlvdSBSZWFkIG9yIFdyaXRlIDY0TUIgb3IgbW9yZSAocHJvYmFibHkgbWluX2ZhaWx1cmVfc2l6ZSA9IDY0TUIgLSAzMktCICsgMSkNCisgICBmcm9tL3RvIE5ldHdvcmsgZmlsZSwgaXQgcmV0dXJucyBFUlJPUl9OT19TWVNURU1fUkVTT1VSQ0VTDQorICAgKEluc3VmZmljaWVudCBzeXN0ZW0gcmVzb3VyY2VzIGV4aXN0IHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0ZWQgc2VydmljZSkuDQorICAgUHJvYmFibHkgaW4gc29tZSB2ZXJzaW9uIG9mIFdpbmRvd3MgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggb3RoZXIgc2l6ZXM6DQorICAgZm9yIDMyIE1CIChtYXliZSBhbHNvIGZvciAxNiBNQikuDQorICAgQW5kIG1lc3NhZ2UgY2FuIGJlICJOZXR3b3JrIGNvbm5lY3Rpb24gd2FzIGxvc3QiDQorKi8NCisNCisjZGVmaW5lIGtDaHVua1NpemVNYXggKDEgPDwgMjIpDQorDQorI2VuZGlmDQorDQordm9pZCBGaWxlX0NvbnN0cnVjdChDU3pGaWxlICpwKQ0KK3sNCisgICNpZmRlZiBVU0VfV0lORE9XU19GSUxFDQorICBwLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsNCisgICNlbHNlDQorICBwLT5maWxlID0gTlVMTDsNCisgICNlbmRpZg0KK30NCisNCisjaWYgIWRlZmluZWQoVU5ERVJfQ0UpIHx8ICFkZWZpbmVkKFVTRV9XSU5ET1dTX0ZJTEUpDQorc3RhdGljIFdSZXMgRmlsZV9PcGVuKENTekZpbGUgKnAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCB3cml0ZU1vZGUpDQorew0KKyAgI2lmZGVmIFVTRV9XSU5ET1dTX0ZJTEUNCisgIHAtPmhhbmRsZSA9IENyZWF0ZUZpbGVBKG5hbWUsDQorICAgICAgd3JpdGVNb2RlID8gR0VORVJJQ19XUklURSA6IEdFTkVSSUNfUkVBRCwNCisgICAgICBGSUxFX1NIQVJFX1JFQUQsIE5VTEwsDQorICAgICAgd3JpdGVNb2RlID8gQ1JFQVRFX0FMV0FZUyA6IE9QRU5fRVhJU1RJTkcsDQorICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsNCisgIHJldHVybiAocC0+aGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSA/IDAgOiBHZXRMYXN0RXJyb3IoKTsNCisgICNlbHNlDQorICBwLT5maWxlID0gZm9wZW4obmFtZSwgd3JpdGVNb2RlID8gIndiKyIgOiAicmIiKTsNCisgIHJldHVybiAocC0+ZmlsZSAhPSAwKSA/IDAgOg0KKyAgICAjaWZkZWYgVU5ERVJfQ0UNCisgICAgMjsgLyogRU5PRU5UICovDQorICAgICNlbHNlDQorICAgIGVycm5vOw0KKyAgICAjZW5kaWYNCisgICNlbmRpZg0KK30NCisNCitXUmVzIEluRmlsZV9PcGVuKENTekZpbGUgKnAsIGNvbnN0IGNoYXIgKm5hbWUpIHsgcmV0dXJuIEZpbGVfT3BlbihwLCBuYW1lLCAwKTsgfQ0KK1dSZXMgT3V0RmlsZV9PcGVuKENTekZpbGUgKnAsIGNvbnN0IGNoYXIgKm5hbWUpIHsgcmV0dXJuIEZpbGVfT3BlbihwLCBuYW1lLCAxKTsgfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBVU0VfV0lORE9XU19GSUxFDQorc3RhdGljIFdSZXMgRmlsZV9PcGVuVyhDU3pGaWxlICpwLCBjb25zdCBXQ0hBUiAqbmFtZSwgaW50IHdyaXRlTW9kZSkNCit7DQorICBwLT5oYW5kbGUgPSBDcmVhdGVGaWxlVyhuYW1lLA0KKyAgICAgIHdyaXRlTW9kZSA/IEdFTkVSSUNfV1JJVEUgOiBHRU5FUklDX1JFQUQsDQorICAgICAgRklMRV9TSEFSRV9SRUFELCBOVUxMLA0KKyAgICAgIHdyaXRlTW9kZSA/IENSRUFURV9BTFdBWVMgOiBPUEVOX0VYSVNUSU5HLA0KKyAgICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7DQorICByZXR1cm4gKHAtPmhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgPyAwIDogR2V0TGFzdEVycm9yKCk7DQorfQ0KK1dSZXMgSW5GaWxlX09wZW5XKENTekZpbGUgKnAsIGNvbnN0IFdDSEFSICpuYW1lKSB7IHJldHVybiBGaWxlX09wZW5XKHAsIG5hbWUsIDApOyB9DQorV1JlcyBPdXRGaWxlX09wZW5XKENTekZpbGUgKnAsIGNvbnN0IFdDSEFSICpuYW1lKSB7IHJldHVybiBGaWxlX09wZW5XKHAsIG5hbWUsIDEpOyB9DQorI2VuZGlmDQorDQorV1JlcyBGaWxlX0Nsb3NlKENTekZpbGUgKnApDQorew0KKyAgI2lmZGVmIFVTRV9XSU5ET1dTX0ZJTEUNCisgIGlmIChwLT5oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpDQorICB7DQorICAgIGlmICghQ2xvc2VIYW5kbGUocC0+aGFuZGxlKSkNCisgICAgICByZXR1cm4gR2V0TGFzdEVycm9yKCk7DQorICAgIHAtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOw0KKyAgfQ0KKyAgI2Vsc2UNCisgIGlmIChwLT5maWxlICE9IE5VTEwpDQorICB7DQorICAgIGludCByZXMgPSBmY2xvc2UocC0+ZmlsZSk7DQorICAgIGlmIChyZXMgIT0gMCkNCisgICAgICByZXR1cm4gcmVzOw0KKyAgICBwLT5maWxlID0gTlVMTDsNCisgIH0NCisgICNlbmRpZg0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK1dSZXMgRmlsZV9SZWFkKENTekZpbGUgKnAsIHZvaWQgKmRhdGEsIHNpemVfdCAqc2l6ZSkNCit7DQorICBzaXplX3Qgb3JpZ2luYWxTaXplID0gKnNpemU7DQorICBpZiAob3JpZ2luYWxTaXplID09IDApDQorICAgIHJldHVybiAwOw0KKw0KKyAgI2lmZGVmIFVTRV9XSU5ET1dTX0ZJTEUNCisNCisgICpzaXplID0gMDsNCisgIGRvDQorICB7DQorICAgIERXT1JEIGN1clNpemUgPSAob3JpZ2luYWxTaXplID4ga0NodW5rU2l6ZU1heCkgPyBrQ2h1bmtTaXplTWF4IDogKERXT1JEKW9yaWdpbmFsU2l6ZTsNCisgICAgRFdPUkQgcHJvY2Vzc2VkID0gMDsNCisgICAgQk9PTCByZXMgPSBSZWFkRmlsZShwLT5oYW5kbGUsIGRhdGEsIGN1clNpemUsICZwcm9jZXNzZWQsIE5VTEwpOw0KKyAgICBkYXRhID0gKHZvaWQgKikoKEJ5dGUgKilkYXRhICsgcHJvY2Vzc2VkKTsNCisgICAgb3JpZ2luYWxTaXplIC09IHByb2Nlc3NlZDsNCisgICAgKnNpemUgKz0gcHJvY2Vzc2VkOw0KKyAgICBpZiAoIXJlcykNCisgICAgICByZXR1cm4gR2V0TGFzdEVycm9yKCk7DQorICAgIGlmIChwcm9jZXNzZWQgPT0gMCkNCisgICAgICBicmVhazsNCisgIH0NCisgIHdoaWxlIChvcmlnaW5hbFNpemUgPiAwKTsNCisgIHJldHVybiAwOw0KKw0KKyAgI2Vsc2UNCisgIA0KKyAgKnNpemUgPSBmcmVhZChkYXRhLCAxLCBvcmlnaW5hbFNpemUsIHAtPmZpbGUpOw0KKyAgaWYgKCpzaXplID09IG9yaWdpbmFsU2l6ZSkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gZmVycm9yKHAtPmZpbGUpOw0KKyAgDQorICAjZW5kaWYNCit9DQorDQorV1JlcyBGaWxlX1dyaXRlKENTekZpbGUgKnAsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCAqc2l6ZSkNCit7DQorICBzaXplX3Qgb3JpZ2luYWxTaXplID0gKnNpemU7DQorICBpZiAob3JpZ2luYWxTaXplID09IDApDQorICAgIHJldHVybiAwOw0KKyAgDQorICAjaWZkZWYgVVNFX1dJTkRPV1NfRklMRQ0KKw0KKyAgKnNpemUgPSAwOw0KKyAgZG8NCisgIHsNCisgICAgRFdPUkQgY3VyU2l6ZSA9IChvcmlnaW5hbFNpemUgPiBrQ2h1bmtTaXplTWF4KSA/IGtDaHVua1NpemVNYXggOiAoRFdPUkQpb3JpZ2luYWxTaXplOw0KKyAgICBEV09SRCBwcm9jZXNzZWQgPSAwOw0KKyAgICBCT09MIHJlcyA9IFdyaXRlRmlsZShwLT5oYW5kbGUsIGRhdGEsIGN1clNpemUsICZwcm9jZXNzZWQsIE5VTEwpOw0KKyAgICBkYXRhID0gKHZvaWQgKikoKEJ5dGUgKilkYXRhICsgcHJvY2Vzc2VkKTsNCisgICAgb3JpZ2luYWxTaXplIC09IHByb2Nlc3NlZDsNCisgICAgKnNpemUgKz0gcHJvY2Vzc2VkOw0KKyAgICBpZiAoIXJlcykNCisgICAgICByZXR1cm4gR2V0TGFzdEVycm9yKCk7DQorICAgIGlmIChwcm9jZXNzZWQgPT0gMCkNCisgICAgICBicmVhazsNCisgIH0NCisgIHdoaWxlIChvcmlnaW5hbFNpemUgPiAwKTsNCisgIHJldHVybiAwOw0KKw0KKyAgI2Vsc2UNCisNCisgICpzaXplID0gZndyaXRlKGRhdGEsIDEsIG9yaWdpbmFsU2l6ZSwgcC0+ZmlsZSk7DQorICBpZiAoKnNpemUgPT0gb3JpZ2luYWxTaXplKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBmZXJyb3IocC0+ZmlsZSk7DQorICANCisgICNlbmRpZg0KK30NCisNCitXUmVzIEZpbGVfU2VlayhDU3pGaWxlICpwLCBJbnQ2NCAqcG9zLCBFU3pTZWVrIG9yaWdpbikNCit7DQorICAjaWZkZWYgVVNFX1dJTkRPV1NfRklMRQ0KKw0KKyAgTEFSR0VfSU5URUdFUiB2YWx1ZTsNCisgIERXT1JEIG1vdmVNZXRob2Q7DQorICB2YWx1ZS5Mb3dQYXJ0ID0gKERXT1JEKSpwb3M7DQorICB2YWx1ZS5IaWdoUGFydCA9IChMT05HKSgoVUludDY0KSpwb3MgPj4gMTYgPj4gMTYpOyAvKiBmb3IgY2FzZSB3aGVuIFVJbnQ2NCBpcyAzMi1iaXQgb25seSAqLw0KKyAgc3dpdGNoIChvcmlnaW4pDQorICB7DQorICAgIGNhc2UgU1pfU0VFS19TRVQ6IG1vdmVNZXRob2QgPSBGSUxFX0JFR0lOOyBicmVhazsNCisgICAgY2FzZSBTWl9TRUVLX0NVUjogbW92ZU1ldGhvZCA9IEZJTEVfQ1VSUkVOVDsgYnJlYWs7DQorICAgIGNhc2UgU1pfU0VFS19FTkQ6IG1vdmVNZXRob2QgPSBGSUxFX0VORDsgYnJlYWs7DQorICAgIGRlZmF1bHQ6IHJldHVybiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsNCisgIH0NCisgIHZhbHVlLkxvd1BhcnQgPSBTZXRGaWxlUG9pbnRlcihwLT5oYW5kbGUsIHZhbHVlLkxvd1BhcnQsICZ2YWx1ZS5IaWdoUGFydCwgbW92ZU1ldGhvZCk7DQorICBpZiAodmFsdWUuTG93UGFydCA9PSAweEZGRkZGRkZGKQ0KKyAgew0KKyAgICBXUmVzIHJlcyA9IEdldExhc3RFcnJvcigpOw0KKyAgICBpZiAocmVzICE9IE5PX0VSUk9SKQ0KKyAgICAgIHJldHVybiByZXM7DQorICB9DQorICAqcG9zID0gKChJbnQ2NCl2YWx1ZS5IaWdoUGFydCA8PCAzMikgfCB2YWx1ZS5Mb3dQYXJ0Ow0KKyAgcmV0dXJuIDA7DQorDQorICAjZWxzZQ0KKyAgDQorICBpbnQgbW92ZU1ldGhvZDsNCisgIGludCByZXM7DQorICBzd2l0Y2ggKG9yaWdpbikNCisgIHsNCisgICAgY2FzZSBTWl9TRUVLX1NFVDogbW92ZU1ldGhvZCA9IFNFRUtfU0VUOyBicmVhazsNCisgICAgY2FzZSBTWl9TRUVLX0NVUjogbW92ZU1ldGhvZCA9IFNFRUtfQ1VSOyBicmVhazsNCisgICAgY2FzZSBTWl9TRUVLX0VORDogbW92ZU1ldGhvZCA9IFNFRUtfRU5EOyBicmVhazsNCisgICAgZGVmYXVsdDogcmV0dXJuIDE7DQorICB9DQorICByZXMgPSBmc2VlayhwLT5maWxlLCAobG9uZykqcG9zLCBtb3ZlTWV0aG9kKTsNCisgICpwb3MgPSBmdGVsbChwLT5maWxlKTsNCisgIHJldHVybiByZXM7DQorICANCisgICNlbmRpZg0KK30NCisNCitXUmVzIEZpbGVfR2V0TGVuZ3RoKENTekZpbGUgKnAsIFVJbnQ2NCAqbGVuZ3RoKQ0KK3sNCisgICNpZmRlZiBVU0VfV0lORE9XU19GSUxFDQorICANCisgIERXT1JEIHNpemVIaWdoOw0KKyAgRFdPUkQgc2l6ZUxvdyA9IEdldEZpbGVTaXplKHAtPmhhbmRsZSwgJnNpemVIaWdoKTsNCisgIGlmIChzaXplTG93ID09IDB4RkZGRkZGRkYpDQorICB7DQorICAgIERXT1JEIHJlcyA9IEdldExhc3RFcnJvcigpOw0KKyAgICBpZiAocmVzICE9IE5PX0VSUk9SKQ0KKyAgICAgIHJldHVybiByZXM7DQorICB9DQorICAqbGVuZ3RoID0gKCgoVUludDY0KXNpemVIaWdoKSA8PCAzMikgKyBzaXplTG93Ow0KKyAgcmV0dXJuIDA7DQorICANCisgICNlbHNlDQorICANCisgIGxvbmcgcG9zID0gZnRlbGwocC0+ZmlsZSk7DQorICBpbnQgcmVzID0gZnNlZWsocC0+ZmlsZSwgMCwgU0VFS19FTkQpOw0KKyAgKmxlbmd0aCA9IGZ0ZWxsKHAtPmZpbGUpOw0KKyAgZnNlZWsocC0+ZmlsZSwgcG9zLCBTRUVLX1NFVCk7DQorICByZXR1cm4gcmVzOw0KKyAgDQorICAjZW5kaWYNCit9DQorDQorDQorLyogLS0tLS0tLS0tLSBGaWxlU2VxSW5TdHJlYW0gLS0tLS0tLS0tLSAqLw0KKw0KK3N0YXRpYyBTUmVzIEZpbGVTZXFJblN0cmVhbV9SZWFkKHZvaWQgKnBwLCB2b2lkICpidWYsIHNpemVfdCAqc2l6ZSkNCit7DQorICBDRmlsZVNlcUluU3RyZWFtICpwID0gKENGaWxlU2VxSW5TdHJlYW0gKilwcDsNCisgIHJldHVybiBGaWxlX1JlYWQoJnAtPmZpbGUsIGJ1Ziwgc2l6ZSkgPT0gMCA/IFNaX09LIDogU1pfRVJST1JfUkVBRDsNCit9DQorDQordm9pZCBGaWxlU2VxSW5TdHJlYW1fQ3JlYXRlVlRhYmxlKENGaWxlU2VxSW5TdHJlYW0gKnApDQorew0KKyAgcC0+cy5SZWFkID0gRmlsZVNlcUluU3RyZWFtX1JlYWQ7DQorfQ0KKw0KKw0KKy8qIC0tLS0tLS0tLS0gRmlsZUluU3RyZWFtIC0tLS0tLS0tLS0gKi8NCisNCitzdGF0aWMgU1JlcyBGaWxlSW5TdHJlYW1fUmVhZCh2b2lkICpwcCwgdm9pZCAqYnVmLCBzaXplX3QgKnNpemUpDQorew0KKyAgQ0ZpbGVJblN0cmVhbSAqcCA9IChDRmlsZUluU3RyZWFtICopcHA7DQorICByZXR1cm4gKEZpbGVfUmVhZCgmcC0+ZmlsZSwgYnVmLCBzaXplKSA9PSAwKSA/IFNaX09LIDogU1pfRVJST1JfUkVBRDsNCit9DQorDQorc3RhdGljIFNSZXMgRmlsZUluU3RyZWFtX1NlZWsodm9pZCAqcHAsIEludDY0ICpwb3MsIEVTelNlZWsgb3JpZ2luKQ0KK3sNCisgIENGaWxlSW5TdHJlYW0gKnAgPSAoQ0ZpbGVJblN0cmVhbSAqKXBwOw0KKyAgcmV0dXJuIEZpbGVfU2VlaygmcC0+ZmlsZSwgcG9zLCBvcmlnaW4pOw0KK30NCisNCit2b2lkIEZpbGVJblN0cmVhbV9DcmVhdGVWVGFibGUoQ0ZpbGVJblN0cmVhbSAqcCkNCit7DQorICBwLT5zLlJlYWQgPSBGaWxlSW5TdHJlYW1fUmVhZDsNCisgIHAtPnMuU2VlayA9IEZpbGVJblN0cmVhbV9TZWVrOw0KK30NCisNCisNCisvKiAtLS0tLS0tLS0tIEZpbGVPdXRTdHJlYW0gLS0tLS0tLS0tLSAqLw0KKw0KK3N0YXRpYyBzaXplX3QgRmlsZU91dFN0cmVhbV9Xcml0ZSh2b2lkICpwcCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpDQorew0KKyAgQ0ZpbGVPdXRTdHJlYW0gKnAgPSAoQ0ZpbGVPdXRTdHJlYW0gKilwcDsNCisgIEZpbGVfV3JpdGUoJnAtPmZpbGUsIGRhdGEsICZzaXplKTsNCisgIHJldHVybiBzaXplOw0KK30NCisNCit2b2lkIEZpbGVPdXRTdHJlYW1fQ3JlYXRlVlRhYmxlKENGaWxlT3V0U3RyZWFtICpwKQ0KK3sNCisgIHAtPnMuV3JpdGUgPSBGaWxlT3V0U3RyZWFtX1dyaXRlOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0MvN3pGaWxlLmggYi9sem1hL0MvN3pGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyYTE5MgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy83ekZpbGUuaApAQCAtMCwwICsxLDgzIEBACisvKiA3ekZpbGUuaCAtLSBGaWxlIElPDQorMjAxMy0wMS0xOCA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpZm5kZWYgX183Wl9GSUxFX0gNCisjZGVmaW5lIF9fN1pfRklMRV9IDQorDQorI2lmZGVmIF9XSU4zMg0KKyNkZWZpbmUgVVNFX1dJTkRPV1NfRklMRQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBVU0VfV0lORE9XU19GSUxFDQorI2luY2x1ZGUgPHdpbmRvd3MuaD4NCisjZWxzZQ0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICI3elR5cGVzLmgiDQorDQorRVhURVJOX0NfQkVHSU4NCisNCisvKiAtLS0tLS0tLS0tIEZpbGUgLS0tLS0tLS0tLSAqLw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgI2lmZGVmIFVTRV9XSU5ET1dTX0ZJTEUNCisgIEhBTkRMRSBoYW5kbGU7DQorICAjZWxzZQ0KKyAgRklMRSAqZmlsZTsNCisgICNlbmRpZg0KK30gQ1N6RmlsZTsNCisNCit2b2lkIEZpbGVfQ29uc3RydWN0KENTekZpbGUgKnApOw0KKyNpZiAhZGVmaW5lZChVTkRFUl9DRSkgfHwgIWRlZmluZWQoVVNFX1dJTkRPV1NfRklMRSkNCitXUmVzIEluRmlsZV9PcGVuKENTekZpbGUgKnAsIGNvbnN0IGNoYXIgKm5hbWUpOw0KK1dSZXMgT3V0RmlsZV9PcGVuKENTekZpbGUgKnAsIGNvbnN0IGNoYXIgKm5hbWUpOw0KKyNlbmRpZg0KKyNpZmRlZiBVU0VfV0lORE9XU19GSUxFDQorV1JlcyBJbkZpbGVfT3BlblcoQ1N6RmlsZSAqcCwgY29uc3QgV0NIQVIgKm5hbWUpOw0KK1dSZXMgT3V0RmlsZV9PcGVuVyhDU3pGaWxlICpwLCBjb25zdCBXQ0hBUiAqbmFtZSk7DQorI2VuZGlmDQorV1JlcyBGaWxlX0Nsb3NlKENTekZpbGUgKnApOw0KKw0KKy8qIHJlYWRzIG1heCgqc2l6ZSwgcmVtYWluIGZpbGUncyBzaXplKSBieXRlcyAqLw0KK1dSZXMgRmlsZV9SZWFkKENTekZpbGUgKnAsIHZvaWQgKmRhdGEsIHNpemVfdCAqc2l6ZSk7DQorDQorLyogd3JpdGVzICpzaXplIGJ5dGVzICovDQorV1JlcyBGaWxlX1dyaXRlKENTekZpbGUgKnAsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCAqc2l6ZSk7DQorDQorV1JlcyBGaWxlX1NlZWsoQ1N6RmlsZSAqcCwgSW50NjQgKnBvcywgRVN6U2VlayBvcmlnaW4pOw0KK1dSZXMgRmlsZV9HZXRMZW5ndGgoQ1N6RmlsZSAqcCwgVUludDY0ICpsZW5ndGgpOw0KKw0KKw0KKy8qIC0tLS0tLS0tLS0gRmlsZUluU3RyZWFtIC0tLS0tLS0tLS0gKi8NCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIElTZXFJblN0cmVhbSBzOw0KKyAgQ1N6RmlsZSBmaWxlOw0KK30gQ0ZpbGVTZXFJblN0cmVhbTsNCisNCit2b2lkIEZpbGVTZXFJblN0cmVhbV9DcmVhdGVWVGFibGUoQ0ZpbGVTZXFJblN0cmVhbSAqcCk7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBJU2Vla0luU3RyZWFtIHM7DQorICBDU3pGaWxlIGZpbGU7DQorfSBDRmlsZUluU3RyZWFtOw0KKw0KK3ZvaWQgRmlsZUluU3RyZWFtX0NyZWF0ZVZUYWJsZShDRmlsZUluU3RyZWFtICpwKTsNCisNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIElTZXFPdXRTdHJlYW0gczsNCisgIENTekZpbGUgZmlsZTsNCit9IENGaWxlT3V0U3RyZWFtOw0KKw0KK3ZvaWQgRmlsZU91dFN0cmVhbV9DcmVhdGVWVGFibGUoQ0ZpbGVPdXRTdHJlYW0gKnApOw0KKw0KK0VYVEVSTl9DX0VORA0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy83elN0cmVhbS5jIGIvbHptYS9DLzd6U3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5MmQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy83elN0cmVhbS5jCkBAIC0wLDAgKzEsMTcxIEBACisvKiA3elN0cmVhbS5jIC0tIDd6IFN0cmVhbSBmdW5jdGlvbnMNCisyMDEzLTExLTEyIDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorDQorI2luY2x1ZGUgIjd6VHlwZXMuaCINCisNCitTUmVzIFNlcUluU3RyZWFtX1JlYWQyKElTZXFJblN0cmVhbSAqc3RyZWFtLCB2b2lkICpidWYsIHNpemVfdCBzaXplLCBTUmVzIGVycm9yVHlwZSkNCit7DQorICB3aGlsZSAoc2l6ZSAhPSAwKQ0KKyAgew0KKyAgICBzaXplX3QgcHJvY2Vzc2VkID0gc2l6ZTsNCisgICAgUklOT0soc3RyZWFtLT5SZWFkKHN0cmVhbSwgYnVmLCAmcHJvY2Vzc2VkKSk7DQorICAgIGlmIChwcm9jZXNzZWQgPT0gMCkNCisgICAgICByZXR1cm4gZXJyb3JUeXBlOw0KKyAgICBidWYgPSAodm9pZCAqKSgoQnl0ZSAqKWJ1ZiArIHByb2Nlc3NlZCk7DQorICAgIHNpemUgLT0gcHJvY2Vzc2VkOw0KKyAgfQ0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCitTUmVzIFNlcUluU3RyZWFtX1JlYWQoSVNlcUluU3RyZWFtICpzdHJlYW0sIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpDQorew0KKyAgcmV0dXJuIFNlcUluU3RyZWFtX1JlYWQyKHN0cmVhbSwgYnVmLCBzaXplLCBTWl9FUlJPUl9JTlBVVF9FT0YpOw0KK30NCisNCitTUmVzIFNlcUluU3RyZWFtX1JlYWRCeXRlKElTZXFJblN0cmVhbSAqc3RyZWFtLCBCeXRlICpidWYpDQorew0KKyAgc2l6ZV90IHByb2Nlc3NlZCA9IDE7DQorICBSSU5PSyhzdHJlYW0tPlJlYWQoc3RyZWFtLCBidWYsICZwcm9jZXNzZWQpKTsNCisgIHJldHVybiAocHJvY2Vzc2VkID09IDEpID8gU1pfT0sgOiBTWl9FUlJPUl9JTlBVVF9FT0Y7DQorfQ0KKw0KK1NSZXMgTG9va0luU3RyZWFtX1NlZWtUbyhJTG9va0luU3RyZWFtICpzdHJlYW0sIFVJbnQ2NCBvZmZzZXQpDQorew0KKyAgSW50NjQgdCA9IG9mZnNldDsNCisgIHJldHVybiBzdHJlYW0tPlNlZWsoc3RyZWFtLCAmdCwgU1pfU0VFS19TRVQpOw0KK30NCisNCitTUmVzIExvb2tJblN0cmVhbV9Mb29rUmVhZChJTG9va0luU3RyZWFtICpzdHJlYW0sIHZvaWQgKmJ1Ziwgc2l6ZV90ICpzaXplKQ0KK3sNCisgIGNvbnN0IHZvaWQgKmxvb2tCdWY7DQorICBpZiAoKnNpemUgPT0gMCkNCisgICAgcmV0dXJuIFNaX09LOw0KKyAgUklOT0soc3RyZWFtLT5Mb29rKHN0cmVhbSwgJmxvb2tCdWYsIHNpemUpKTsNCisgIG1lbWNweShidWYsIGxvb2tCdWYsICpzaXplKTsNCisgIHJldHVybiBzdHJlYW0tPlNraXAoc3RyZWFtLCAqc2l6ZSk7DQorfQ0KKw0KK1NSZXMgTG9va0luU3RyZWFtX1JlYWQyKElMb29rSW5TdHJlYW0gKnN0cmVhbSwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSwgU1JlcyBlcnJvclR5cGUpDQorew0KKyAgd2hpbGUgKHNpemUgIT0gMCkNCisgIHsNCisgICAgc2l6ZV90IHByb2Nlc3NlZCA9IHNpemU7DQorICAgIFJJTk9LKHN0cmVhbS0+UmVhZChzdHJlYW0sIGJ1ZiwgJnByb2Nlc3NlZCkpOw0KKyAgICBpZiAocHJvY2Vzc2VkID09IDApDQorICAgICAgcmV0dXJuIGVycm9yVHlwZTsNCisgICAgYnVmID0gKHZvaWQgKikoKEJ5dGUgKilidWYgKyBwcm9jZXNzZWQpOw0KKyAgICBzaXplIC09IHByb2Nlc3NlZDsNCisgIH0NCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorU1JlcyBMb29rSW5TdHJlYW1fUmVhZChJTG9va0luU3RyZWFtICpzdHJlYW0sIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpDQorew0KKyAgcmV0dXJuIExvb2tJblN0cmVhbV9SZWFkMihzdHJlYW0sIGJ1Ziwgc2l6ZSwgU1pfRVJST1JfSU5QVVRfRU9GKTsNCit9DQorDQorc3RhdGljIFNSZXMgTG9va1RvUmVhZF9Mb29rX0xvb2thaGVhZCh2b2lkICpwcCwgY29uc3Qgdm9pZCAqKmJ1Ziwgc2l6ZV90ICpzaXplKQ0KK3sNCisgIFNSZXMgcmVzID0gU1pfT0s7DQorICBDTG9va1RvUmVhZCAqcCA9IChDTG9va1RvUmVhZCAqKXBwOw0KKyAgc2l6ZV90IHNpemUyID0gcC0+c2l6ZSAtIHAtPnBvczsNCisgIGlmIChzaXplMiA9PSAwICYmICpzaXplID4gMCkNCisgIHsNCisgICAgcC0+cG9zID0gMDsNCisgICAgc2l6ZTIgPSBMb29rVG9SZWFkX0JVRl9TSVpFOw0KKyAgICByZXMgPSBwLT5yZWFsU3RyZWFtLT5SZWFkKHAtPnJlYWxTdHJlYW0sIHAtPmJ1ZiwgJnNpemUyKTsNCisgICAgcC0+c2l6ZSA9IHNpemUyOw0KKyAgfQ0KKyAgaWYgKHNpemUyIDwgKnNpemUpDQorICAgICpzaXplID0gc2l6ZTI7DQorICAqYnVmID0gcC0+YnVmICsgcC0+cG9zOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorc3RhdGljIFNSZXMgTG9va1RvUmVhZF9Mb29rX0V4YWN0KHZvaWQgKnBwLCBjb25zdCB2b2lkICoqYnVmLCBzaXplX3QgKnNpemUpDQorew0KKyAgU1JlcyByZXMgPSBTWl9PSzsNCisgIENMb29rVG9SZWFkICpwID0gKENMb29rVG9SZWFkICopcHA7DQorICBzaXplX3Qgc2l6ZTIgPSBwLT5zaXplIC0gcC0+cG9zOw0KKyAgaWYgKHNpemUyID09IDAgJiYgKnNpemUgPiAwKQ0KKyAgew0KKyAgICBwLT5wb3MgPSAwOw0KKyAgICBpZiAoKnNpemUgPiBMb29rVG9SZWFkX0JVRl9TSVpFKQ0KKyAgICAgICpzaXplID0gTG9va1RvUmVhZF9CVUZfU0laRTsNCisgICAgcmVzID0gcC0+cmVhbFN0cmVhbS0+UmVhZChwLT5yZWFsU3RyZWFtLCBwLT5idWYsIHNpemUpOw0KKyAgICBzaXplMiA9IHAtPnNpemUgPSAqc2l6ZTsNCisgIH0NCisgIGlmIChzaXplMiA8ICpzaXplKQ0KKyAgICAqc2l6ZSA9IHNpemUyOw0KKyAgKmJ1ZiA9IHAtPmJ1ZiArIHAtPnBvczsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK3N0YXRpYyBTUmVzIExvb2tUb1JlYWRfU2tpcCh2b2lkICpwcCwgc2l6ZV90IG9mZnNldCkNCit7DQorICBDTG9va1RvUmVhZCAqcCA9IChDTG9va1RvUmVhZCAqKXBwOw0KKyAgcC0+cG9zICs9IG9mZnNldDsNCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorc3RhdGljIFNSZXMgTG9va1RvUmVhZF9SZWFkKHZvaWQgKnBwLCB2b2lkICpidWYsIHNpemVfdCAqc2l6ZSkNCit7DQorICBDTG9va1RvUmVhZCAqcCA9IChDTG9va1RvUmVhZCAqKXBwOw0KKyAgc2l6ZV90IHJlbSA9IHAtPnNpemUgLSBwLT5wb3M7DQorICBpZiAocmVtID09IDApDQorICAgIHJldHVybiBwLT5yZWFsU3RyZWFtLT5SZWFkKHAtPnJlYWxTdHJlYW0sIGJ1Ziwgc2l6ZSk7DQorICBpZiAocmVtID4gKnNpemUpDQorICAgIHJlbSA9ICpzaXplOw0KKyAgbWVtY3B5KGJ1ZiwgcC0+YnVmICsgcC0+cG9zLCByZW0pOw0KKyAgcC0+cG9zICs9IHJlbTsNCisgICpzaXplID0gcmVtOw0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCitzdGF0aWMgU1JlcyBMb29rVG9SZWFkX1NlZWsodm9pZCAqcHAsIEludDY0ICpwb3MsIEVTelNlZWsgb3JpZ2luKQ0KK3sNCisgIENMb29rVG9SZWFkICpwID0gKENMb29rVG9SZWFkICopcHA7DQorICBwLT5wb3MgPSBwLT5zaXplID0gMDsNCisgIHJldHVybiBwLT5yZWFsU3RyZWFtLT5TZWVrKHAtPnJlYWxTdHJlYW0sIHBvcywgb3JpZ2luKTsNCit9DQorDQordm9pZCBMb29rVG9SZWFkX0NyZWF0ZVZUYWJsZShDTG9va1RvUmVhZCAqcCwgaW50IGxvb2thaGVhZCkNCit7DQorICBwLT5zLkxvb2sgPSBsb29rYWhlYWQgPw0KKyAgICAgIExvb2tUb1JlYWRfTG9va19Mb29rYWhlYWQgOg0KKyAgICAgIExvb2tUb1JlYWRfTG9va19FeGFjdDsNCisgIHAtPnMuU2tpcCA9IExvb2tUb1JlYWRfU2tpcDsNCisgIHAtPnMuUmVhZCA9IExvb2tUb1JlYWRfUmVhZDsNCisgIHAtPnMuU2VlayA9IExvb2tUb1JlYWRfU2VlazsNCit9DQorDQordm9pZCBMb29rVG9SZWFkX0luaXQoQ0xvb2tUb1JlYWQgKnApDQorew0KKyAgcC0+cG9zID0gcC0+c2l6ZSA9IDA7DQorfQ0KKw0KK3N0YXRpYyBTUmVzIFNlY1RvTG9va19SZWFkKHZvaWQgKnBwLCB2b2lkICpidWYsIHNpemVfdCAqc2l6ZSkNCit7DQorICBDU2VjVG9Mb29rICpwID0gKENTZWNUb0xvb2sgKilwcDsNCisgIHJldHVybiBMb29rSW5TdHJlYW1fTG9va1JlYWQocC0+cmVhbFN0cmVhbSwgYnVmLCBzaXplKTsNCit9DQorDQordm9pZCBTZWNUb0xvb2tfQ3JlYXRlVlRhYmxlKENTZWNUb0xvb2sgKnApDQorew0KKyAgcC0+cy5SZWFkID0gU2VjVG9Mb29rX1JlYWQ7DQorfQ0KKw0KK3N0YXRpYyBTUmVzIFNlY1RvUmVhZF9SZWFkKHZvaWQgKnBwLCB2b2lkICpidWYsIHNpemVfdCAqc2l6ZSkNCit7DQorICBDU2VjVG9SZWFkICpwID0gKENTZWNUb1JlYWQgKilwcDsNCisgIHJldHVybiBwLT5yZWFsU3RyZWFtLT5SZWFkKHAtPnJlYWxTdHJlYW0sIGJ1Ziwgc2l6ZSk7DQorfQ0KKw0KK3ZvaWQgU2VjVG9SZWFkX0NyZWF0ZVZUYWJsZShDU2VjVG9SZWFkICpwKQ0KK3sNCisgIHAtPnMuUmVhZCA9IFNlY1RvUmVhZF9SZWFkOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0MvN3pUeXBlcy5oIGIvbHptYS9DLzd6VHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDMwNDdiCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DLzd6VHlwZXMuaApAQCAtMCwwICsxLDI1NiBAQAorLyogN3pUeXBlcy5oIC0tIEJhc2ljIHR5cGVzDQorMjAxMy0xMS0xMiA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpZm5kZWYgX183Wl9UWVBFU19IDQorI2RlZmluZSBfXzdaX1RZUEVTX0gNCisNCisjaWZkZWYgX1dJTjMyDQorLyogI2luY2x1ZGUgPHdpbmRvd3MuaD4gKi8NCisjZW5kaWYNCisNCisjaW5jbHVkZSA8c3RkZGVmLmg+DQorDQorI2lmbmRlZiBFWFRFUk5fQ19CRUdJTg0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KKyNkZWZpbmUgRVhURVJOX0NfQkVHSU4gZXh0ZXJuICJDIiB7DQorI2RlZmluZSBFWFRFUk5fQ19FTkQgfQ0KKyNlbHNlDQorI2RlZmluZSBFWFRFUk5fQ19CRUdJTg0KKyNkZWZpbmUgRVhURVJOX0NfRU5EDQorI2VuZGlmDQorI2VuZGlmDQorDQorRVhURVJOX0NfQkVHSU4NCisNCisjZGVmaW5lIFNaX09LIDANCisNCisjZGVmaW5lIFNaX0VSUk9SX0RBVEEgMQ0KKyNkZWZpbmUgU1pfRVJST1JfTUVNIDINCisjZGVmaW5lIFNaX0VSUk9SX0NSQyAzDQorI2RlZmluZSBTWl9FUlJPUl9VTlNVUFBPUlRFRCA0DQorI2RlZmluZSBTWl9FUlJPUl9QQVJBTSA1DQorI2RlZmluZSBTWl9FUlJPUl9JTlBVVF9FT0YgNg0KKyNkZWZpbmUgU1pfRVJST1JfT1VUUFVUX0VPRiA3DQorI2RlZmluZSBTWl9FUlJPUl9SRUFEIDgNCisjZGVmaW5lIFNaX0VSUk9SX1dSSVRFIDkNCisjZGVmaW5lIFNaX0VSUk9SX1BST0dSRVNTIDEwDQorI2RlZmluZSBTWl9FUlJPUl9GQUlMIDExDQorI2RlZmluZSBTWl9FUlJPUl9USFJFQUQgMTINCisNCisjZGVmaW5lIFNaX0VSUk9SX0FSQ0hJVkUgMTYNCisjZGVmaW5lIFNaX0VSUk9SX05PX0FSQ0hJVkUgMTcNCisNCit0eXBlZGVmIGludCBTUmVzOw0KKw0KKyNpZmRlZiBfV0lOMzINCisvKiB0eXBlZGVmIERXT1JEIFdSZXM7ICovDQordHlwZWRlZiB1bnNpZ25lZCBXUmVzOw0KKyNlbHNlDQordHlwZWRlZiBpbnQgV1JlczsNCisjZW5kaWYNCisNCisjaWZuZGVmIFJJTk9LDQorI2RlZmluZSBSSU5PSyh4KSB7IGludCBfX3Jlc3VsdF9fID0gKHgpOyBpZiAoX19yZXN1bHRfXyAhPSAwKSByZXR1cm4gX19yZXN1bHRfXzsgfQ0KKyNlbmRpZg0KKw0KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBCeXRlOw0KK3R5cGVkZWYgc2hvcnQgSW50MTY7DQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVSW50MTY7DQorDQorI2lmZGVmIF9MWk1BX1VJTlQzMl9JU19VTE9ORw0KK3R5cGVkZWYgbG9uZyBJbnQzMjsNCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUludDMyOw0KKyNlbHNlDQordHlwZWRlZiBpbnQgSW50MzI7DQordHlwZWRlZiB1bnNpZ25lZCBpbnQgVUludDMyOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBfU1pfTk9fSU5UXzY0DQorDQorLyogZGVmaW5lIF9TWl9OT19JTlRfNjQsIGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBzdXBwb3J0IDY0LWJpdCBpbnRlZ2Vycy4NCisgICBOT1RFUzogU29tZSBjb2RlIHdpbGwgd29yayBpbmNvcnJlY3RseSBpbiB0aGF0IGNhc2UhICovDQorDQordHlwZWRlZiBsb25nIEludDY0Ow0KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVSW50NjQ7DQorDQorI2Vsc2UNCisNCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pDQordHlwZWRlZiBfX2ludDY0IEludDY0Ow0KK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBVSW50NjQ7DQorI2RlZmluZSBVSU5UNjRfQ09OU1Qobikgbg0KKyNlbHNlDQordHlwZWRlZiBsb25nIGxvbmcgaW50IEludDY0Ow0KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCBVSW50NjQ7DQorI2RlZmluZSBVSU5UNjRfQ09OU1QobikgbiAjIyBVTEwNCisjZW5kaWYNCisNCisjZW5kaWYNCisNCisjaWZkZWYgX0xaTUFfTk9fU1lTVEVNX1NJWkVfVA0KK3R5cGVkZWYgVUludDMyIFNpemVUOw0KKyNlbHNlDQordHlwZWRlZiBzaXplX3QgU2l6ZVQ7DQorI2VuZGlmDQorDQordHlwZWRlZiBpbnQgQm9vbDsNCisjZGVmaW5lIFRydWUgMQ0KKyNkZWZpbmUgRmFsc2UgMA0KKw0KKw0KKyNpZmRlZiBfV0lOMzINCisjZGVmaW5lIE1ZX1NURF9DQUxMIF9fc3RkY2FsbA0KKyNlbHNlDQorI2RlZmluZSBNWV9TVERfQ0FMTA0KKyNlbmRpZg0KKw0KKyNpZmRlZiBfTVNDX1ZFUg0KKw0KKyNpZiBfTVNDX1ZFUiA+PSAxMzAwDQorI2RlZmluZSBNWV9OT19JTkxJTkUgX19kZWNsc3BlYyhub2lubGluZSkNCisjZWxzZQ0KKyNkZWZpbmUgTVlfTk9fSU5MSU5FDQorI2VuZGlmDQorDQorI2RlZmluZSBNWV9DREVDTCBfX2NkZWNsDQorI2RlZmluZSBNWV9GQVNUX0NBTEwgX19mYXN0Y2FsbA0KKw0KKyNlbHNlDQorDQorI2RlZmluZSBNWV9OT19JTkxJTkUNCisjZGVmaW5lIE1ZX0NERUNMDQorI2RlZmluZSBNWV9GQVNUX0NBTEwNCisNCisjZW5kaWYNCisNCisNCisvKiBUaGUgZm9sbG93aW5nIGludGVyZmFjZXMgdXNlIGZpcnN0IHBhcmFtZXRlciBhcyBwb2ludGVyIHRvIHN0cnVjdHVyZSAqLw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgQnl0ZSAoKlJlYWQpKHZvaWQgKnApOyAvKiByZWFkcyBvbmUgYnl0ZSwgcmV0dXJucyAwIGluIGNhc2Ugb2YgRU9GIG9yIGVycm9yICovDQorfSBJQnl0ZUluOw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgdm9pZCAoKldyaXRlKSh2b2lkICpwLCBCeXRlIGIpOw0KK30gSUJ5dGVPdXQ7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBTUmVzICgqUmVhZCkodm9pZCAqcCwgdm9pZCAqYnVmLCBzaXplX3QgKnNpemUpOw0KKyAgICAvKiBpZiAoaW5wdXQoKnNpemUpICE9IDAgJiYgb3V0cHV0KCpzaXplKSA9PSAwKSBtZWFucyBlbmRfb2Zfc3RyZWFtLg0KKyAgICAgICAob3V0cHV0KCpzaXplKSA8IGlucHV0KCpzaXplKSkgaXMgYWxsb3dlZCAqLw0KK30gSVNlcUluU3RyZWFtOw0KKw0KKy8qIGl0IGNhbiByZXR1cm4gU1pfRVJST1JfSU5QVVRfRU9GICovDQorU1JlcyBTZXFJblN0cmVhbV9SZWFkKElTZXFJblN0cmVhbSAqc3RyZWFtLCB2b2lkICpidWYsIHNpemVfdCBzaXplKTsNCitTUmVzIFNlcUluU3RyZWFtX1JlYWQyKElTZXFJblN0cmVhbSAqc3RyZWFtLCB2b2lkICpidWYsIHNpemVfdCBzaXplLCBTUmVzIGVycm9yVHlwZSk7DQorU1JlcyBTZXFJblN0cmVhbV9SZWFkQnl0ZShJU2VxSW5TdHJlYW0gKnN0cmVhbSwgQnl0ZSAqYnVmKTsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIHNpemVfdCAoKldyaXRlKSh2b2lkICpwLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKTsNCisgICAgLyogUmV0dXJuczogcmVzdWx0IC0gdGhlIG51bWJlciBvZiBhY3R1YWxseSB3cml0dGVuIGJ5dGVzLg0KKyAgICAgICAocmVzdWx0IDwgc2l6ZSkgbWVhbnMgZXJyb3IgKi8NCit9IElTZXFPdXRTdHJlYW07DQorDQordHlwZWRlZiBlbnVtDQorew0KKyAgU1pfU0VFS19TRVQgPSAwLA0KKyAgU1pfU0VFS19DVVIgPSAxLA0KKyAgU1pfU0VFS19FTkQgPSAyDQorfSBFU3pTZWVrOw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgU1JlcyAoKlJlYWQpKHZvaWQgKnAsIHZvaWQgKmJ1Ziwgc2l6ZV90ICpzaXplKTsgIC8qIHNhbWUgYXMgSVNlcUluU3RyZWFtOjpSZWFkICovDQorICBTUmVzICgqU2Vlaykodm9pZCAqcCwgSW50NjQgKnBvcywgRVN6U2VlayBvcmlnaW4pOw0KK30gSVNlZWtJblN0cmVhbTsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIFNSZXMgKCpMb29rKSh2b2lkICpwLCBjb25zdCB2b2lkICoqYnVmLCBzaXplX3QgKnNpemUpOw0KKyAgICAvKiBpZiAoaW5wdXQoKnNpemUpICE9IDAgJiYgb3V0cHV0KCpzaXplKSA9PSAwKSBtZWFucyBlbmRfb2Zfc3RyZWFtLg0KKyAgICAgICAob3V0cHV0KCpzaXplKSA+IGlucHV0KCpzaXplKSkgaXMgbm90IGFsbG93ZWQNCisgICAgICAgKG91dHB1dCgqc2l6ZSkgPCBpbnB1dCgqc2l6ZSkpIGlzIGFsbG93ZWQgKi8NCisgIFNSZXMgKCpTa2lwKSh2b2lkICpwLCBzaXplX3Qgb2Zmc2V0KTsNCisgICAgLyogb2Zmc2V0IG11c3QgYmUgPD0gb3V0cHV0KCpzaXplKSBvZiBMb29rICovDQorDQorICBTUmVzICgqUmVhZCkodm9pZCAqcCwgdm9pZCAqYnVmLCBzaXplX3QgKnNpemUpOw0KKyAgICAvKiByZWFkcyBkaXJlY3RseSAod2l0aG91dCBidWZmZXIpLiBJdCdzIHNhbWUgYXMgSVNlcUluU3RyZWFtOjpSZWFkICovDQorICBTUmVzICgqU2Vlaykodm9pZCAqcCwgSW50NjQgKnBvcywgRVN6U2VlayBvcmlnaW4pOw0KK30gSUxvb2tJblN0cmVhbTsNCisNCitTUmVzIExvb2tJblN0cmVhbV9Mb29rUmVhZChJTG9va0luU3RyZWFtICpzdHJlYW0sIHZvaWQgKmJ1Ziwgc2l6ZV90ICpzaXplKTsNCitTUmVzIExvb2tJblN0cmVhbV9TZWVrVG8oSUxvb2tJblN0cmVhbSAqc3RyZWFtLCBVSW50NjQgb2Zmc2V0KTsNCisNCisvKiByZWFkcyB2aWEgSUxvb2tJblN0cmVhbTo6UmVhZCAqLw0KK1NSZXMgTG9va0luU3RyZWFtX1JlYWQyKElMb29rSW5TdHJlYW0gKnN0cmVhbSwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSwgU1JlcyBlcnJvclR5cGUpOw0KK1NSZXMgTG9va0luU3RyZWFtX1JlYWQoSUxvb2tJblN0cmVhbSAqc3RyZWFtLCB2b2lkICpidWYsIHNpemVfdCBzaXplKTsNCisNCisjZGVmaW5lIExvb2tUb1JlYWRfQlVGX1NJWkUgKDEgPDwgMTQpDQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBJTG9va0luU3RyZWFtIHM7DQorICBJU2Vla0luU3RyZWFtICpyZWFsU3RyZWFtOw0KKyAgc2l6ZV90IHBvczsNCisgIHNpemVfdCBzaXplOw0KKyAgQnl0ZSBidWZbTG9va1RvUmVhZF9CVUZfU0laRV07DQorfSBDTG9va1RvUmVhZDsNCisNCit2b2lkIExvb2tUb1JlYWRfQ3JlYXRlVlRhYmxlKENMb29rVG9SZWFkICpwLCBpbnQgbG9va2FoZWFkKTsNCit2b2lkIExvb2tUb1JlYWRfSW5pdChDTG9va1RvUmVhZCAqcCk7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBJU2VxSW5TdHJlYW0gczsNCisgIElMb29rSW5TdHJlYW0gKnJlYWxTdHJlYW07DQorfSBDU2VjVG9Mb29rOw0KKw0KK3ZvaWQgU2VjVG9Mb29rX0NyZWF0ZVZUYWJsZShDU2VjVG9Mb29rICpwKTsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIElTZXFJblN0cmVhbSBzOw0KKyAgSUxvb2tJblN0cmVhbSAqcmVhbFN0cmVhbTsNCit9IENTZWNUb1JlYWQ7DQorDQordm9pZCBTZWNUb1JlYWRfQ3JlYXRlVlRhYmxlKENTZWNUb1JlYWQgKnApOw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgU1JlcyAoKlByb2dyZXNzKSh2b2lkICpwLCBVSW50NjQgaW5TaXplLCBVSW50NjQgb3V0U2l6ZSk7DQorICAgIC8qIFJldHVybnM6IHJlc3VsdC4gKHJlc3VsdCAhPSBTWl9PSykgbWVhbnMgYnJlYWsuDQorICAgICAgIFZhbHVlIChVSW50NjQpKEludDY0KS0xIGZvciBzaXplIG1lYW5zIHVua25vd24gdmFsdWUuICovDQorfSBJQ29tcHJlc3NQcm9ncmVzczsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIHZvaWQgKigqQWxsb2MpKHZvaWQgKnAsIHNpemVfdCBzaXplKTsNCisgIHZvaWQgKCpGcmVlKSh2b2lkICpwLCB2b2lkICphZGRyZXNzKTsgLyogYWRkcmVzcyBjYW4gYmUgMCAqLw0KK30gSVN6QWxsb2M7DQorDQorI2RlZmluZSBJQWxsb2NfQWxsb2MocCwgc2l6ZSkgKHApLT5BbGxvYygocCksIHNpemUpDQorI2RlZmluZSBJQWxsb2NfRnJlZShwLCBhKSAocCktPkZyZWUoKHApLCBhKQ0KKw0KKyNpZmRlZiBfV0lOMzINCisNCisjZGVmaW5lIENIQVJfUEFUSF9TRVBBUkFUT1IgJ1xcJw0KKyNkZWZpbmUgV0NIQVJfUEFUSF9TRVBBUkFUT1IgTCdcXCcNCisjZGVmaW5lIFNUUklOR19QQVRIX1NFUEFSQVRPUiAiXFwiDQorI2RlZmluZSBXU1RSSU5HX1BBVEhfU0VQQVJBVE9SIEwiXFwiDQorDQorI2Vsc2UNCisNCisjZGVmaW5lIENIQVJfUEFUSF9TRVBBUkFUT1IgJy8nDQorI2RlZmluZSBXQ0hBUl9QQVRIX1NFUEFSQVRPUiBMJy8nDQorI2RlZmluZSBTVFJJTkdfUEFUSF9TRVBBUkFUT1IgIi8iDQorI2RlZmluZSBXU1RSSU5HX1BBVEhfU0VQQVJBVE9SIEwiLyINCisNCisjZW5kaWYNCisNCitFWFRFUk5fQ19FTkQNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0MvN3pWZXJzaW9uLmggYi9sem1hL0MvN3pWZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlZGQzMAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy83elZlcnNpb24uaApAQCAtMCwwICsxLDEwIEBACisjZGVmaW5lIE1ZX1ZFUl9NQUpPUiA5DQorI2RlZmluZSBNWV9WRVJfTUlOT1IgMzgNCisjZGVmaW5lIE1ZX1ZFUl9CVUlMRCAwMA0KKyNkZWZpbmUgTVlfVkVSU0lPTiAiOS4zOCBiZXRhIg0KKy8vICNkZWZpbmUgTVlfN1pJUF9WRVJTSU9OICI5LjM4Ig0KKyNkZWZpbmUgTVlfREFURSAiMjAxNS0wMS0wMyINCisjdW5kZWYgTVlfQ09QWVJJR0hUDQorI3VuZGVmIE1ZX1ZFUlNJT05fQ09QWVJJR0hUX0RBVEUNCisjZGVmaW5lIE1ZX0NPUFlSSUdIVCAiOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4iDQorI2RlZmluZSBNWV9WRVJTSU9OX0NPUFlSSUdIVF9EQVRFIE1ZX1ZFUlNJT04gIiAiIE1ZX0NPUFlSSUdIVCAiIDogIiBNWV9EQVRFDQpkaWZmIC0tZ2l0IGEvbHptYS9DLzd6VmVyc2lvbi5yYyBiL2x6bWEvQy83elZlcnNpb24ucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkMjZkZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy83elZlcnNpb24ucmMKQEAgLTAsMCArMSw1NSBAQAorI2RlZmluZSBNWV9WU19GRklfRklMRUZMQUdTTUFTSyAgMHgwMDAwMDAzRkwNCisjZGVmaW5lIE1ZX1ZPU19OVF9XSU5ET1dTMzIgIDB4MDAwNDAwMDRMDQorI2RlZmluZSBNWV9WT1NfQ0VfV0lORE9XUzMyICAweDAwMDUwMDA0TA0KKw0KKyNkZWZpbmUgTVlfVkZUX0FQUCAgMHgwMDAwMDAwMUwNCisjZGVmaW5lIE1ZX1ZGVF9ETEwgIDB4MDAwMDAwMDJMDQorDQorLy8gI2luY2x1ZGUgPFdpblZlci5oPg0KKw0KKyNpZm5kZWYgTVlfVkVSU0lPTg0KKyNpbmNsdWRlICI3elZlcnNpb24uaCINCisjZW5kaWYNCisNCisjZGVmaW5lIE1ZX1ZFUiBNWV9WRVJfTUFKT1IsTVlfVkVSX01JTk9SLE1ZX1ZFUl9CVUlMRCwwDQorDQorI2lmZGVmIERFQlVHDQorI2RlZmluZSBEQkdfRkwgVlNfRkZfREVCVUcNCisjZWxzZQ0KKyNkZWZpbmUgREJHX0ZMIDANCisjZW5kaWYNCisNCisjZGVmaW5lIE1ZX1ZFUlNJT05fSU5GTyhmaWxlVHlwZSwgZGVzY3IsIGludE5hbWUsIG9yaWdOYW1lKSAgXA0KK0xBTkdVQUdFIDksIDEgXA0KKzEgVkVSU0lPTklORk8gXA0KKyAgRklMRVZFUlNJT04gTVlfVkVSIFwNCisgIFBST0RVQ1RWRVJTSU9OIE1ZX1ZFUiBcDQorICBGSUxFRkxBR1NNQVNLIE1ZX1ZTX0ZGSV9GSUxFRkxBR1NNQVNLIFwNCisgIEZJTEVGTEFHUyBEQkdfRkwgXA0KKyAgRklMRU9TIE1ZX1ZPU19OVF9XSU5ET1dTMzIgXA0KKyAgRklMRVRZUEUgZmlsZVR5cGUgXA0KKyAgRklMRVNVQlRZUEUgMHgwTCBcDQorQkVHSU4gXA0KKyAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iIFwNCisgICAgQkVHSU4gIFwNCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCIgXA0KKyAgICAgICAgQkVHSU4gXA0KKyAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJJZ29yIFBhdmxvdiIgXA0KKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCBkZXNjciBcDQorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgTVlfVkVSU0lPTiAgXA0KKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCBpbnROYW1lIFwNCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCBNWV9DT1BZUklHSFQgXA0KKyAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgb3JpZ05hbWUgXA0KKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICI3LVppcCIgXA0KKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsIE1ZX1ZFUlNJT04gXA0KKyAgICAgICAgRU5EIFwNCisgICAgRU5EIFwNCisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIiBcDQorICAgIEJFR0lOIFwNCisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjAwIFwNCisgICAgRU5EIFwNCitFTkQNCisNCisjZGVmaW5lIE1ZX1ZFUlNJT05fSU5GT19BUFAoZGVzY3IsIGludE5hbWUpIE1ZX1ZFUlNJT05fSU5GTyhNWV9WRlRfQVBQLCBkZXNjciwgaW50TmFtZSwgaW50TmFtZSAiLmV4ZSIpDQorDQorI2RlZmluZSBNWV9WRVJTSU9OX0lORk9fRExMKGRlc2NyLCBpbnROYW1lKSBNWV9WRVJTSU9OX0lORk8oTVlfVkZUX0RMTCwgZGVzY3IsIGludE5hbWUsIGludE5hbWUgIi5kbGwiKQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9BZXMuYyBiL2x6bWEvQy9BZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmJmOWQzCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL0Flcy5jCkBAIC0wLDAgKzEsMjg0IEBACisvKiBBZXMuYyAtLSBBRVMgZW5jcnlwdGlvbiAvIGRlY3J5cHRpb24NCisyMDEzLTExLTEyIDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSAiQWVzLmgiDQorI2luY2x1ZGUgIkNwdUFyY2guaCINCisNCitzdGF0aWMgVUludDMyIFRbMjU2ICogNF07DQorc3RhdGljIEJ5dGUgU2JveFsyNTZdID0gew0KKyAgMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwgMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwNCisgIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsIDB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsDQorICAweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjLCAweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1LA0KKyAgMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwgMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwNCisgIDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsIDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsDQorICAweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViLCAweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmLA0KKyAgMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwgMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwNCisgIDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsIDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsDQorICAweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3LCAweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczLA0KKyAgMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwgMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwNCisgIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsIDB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksDQorICAweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5LCAweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4LA0KKyAgMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwgMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwNCisgIDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsIDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsDQorICAweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0LCAweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmLA0KKyAgMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwgMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNn07DQorDQordm9pZCBNWV9GQVNUX0NBTEwgQWVzQ2JjX0VuY29kZShVSW50MzIgKml2QWVzLCBCeXRlICpkYXRhLCBzaXplX3QgbnVtQmxvY2tzKTsNCit2b2lkIE1ZX0ZBU1RfQ0FMTCBBZXNDYmNfRGVjb2RlKFVJbnQzMiAqaXZBZXMsIEJ5dGUgKmRhdGEsIHNpemVfdCBudW1CbG9ja3MpOw0KK3ZvaWQgTVlfRkFTVF9DQUxMIEFlc0N0cl9Db2RlKFVJbnQzMiAqaXZBZXMsIEJ5dGUgKmRhdGEsIHNpemVfdCBudW1CbG9ja3MpOw0KKw0KK3ZvaWQgTVlfRkFTVF9DQUxMIEFlc0NiY19FbmNvZGVfSW50ZWwoVUludDMyICppdkFlcywgQnl0ZSAqZGF0YSwgc2l6ZV90IG51bUJsb2Nrcyk7DQordm9pZCBNWV9GQVNUX0NBTEwgQWVzQ2JjX0RlY29kZV9JbnRlbChVSW50MzIgKml2QWVzLCBCeXRlICpkYXRhLCBzaXplX3QgbnVtQmxvY2tzKTsNCit2b2lkIE1ZX0ZBU1RfQ0FMTCBBZXNDdHJfQ29kZV9JbnRlbChVSW50MzIgKml2QWVzLCBCeXRlICpkYXRhLCBzaXplX3QgbnVtQmxvY2tzKTsNCisNCitBRVNfQ09ERV9GVU5DIGdfQWVzQ2JjX0VuY29kZTsNCitBRVNfQ09ERV9GVU5DIGdfQWVzQ2JjX0RlY29kZTsNCitBRVNfQ09ERV9GVU5DIGdfQWVzQ3RyX0NvZGU7DQorDQorc3RhdGljIFVJbnQzMiBEWzI1NiAqIDRdOw0KK3N0YXRpYyBCeXRlIEludlNbMjU2XTsNCisNCitzdGF0aWMgQnl0ZSBSY29uWzExXSA9IHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiB9Ow0KKw0KKyNkZWZpbmUgeHRpbWUoeCkgKCgoKHgpIDw8IDEpIF4gKCgoeCkgJiAweDgwKSAhPSAwID8gMHgxQiA6IDApKSAmIDB4RkYpDQorDQorI2RlZmluZSBVaTMyKGEwLCBhMSwgYTIsIGEzKSAoKFVJbnQzMikoYTApIHwgKChVSW50MzIpKGExKSA8PCA4KSB8ICgoVUludDMyKShhMikgPDwgMTYpIHwgKChVSW50MzIpKGEzKSA8PCAyNCkpDQorDQorI2RlZmluZSBnYjAoeCkgKCAoeCkgICAgICAgICAgJiAweEZGKQ0KKyNkZWZpbmUgZ2IxKHgpICgoKHgpID4+ICggOCkpICYgMHhGRikNCisjZGVmaW5lIGdiMih4KSAoKCh4KSA+PiAoMTYpKSAmIDB4RkYpDQorI2RlZmluZSBnYjMoeCkgKCgoeCkgPj4gKDI0KSkgJiAweEZGKQ0KKw0KK3ZvaWQgQWVzR2VuVGFibGVzKHZvaWQpDQorew0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykNCisgICAgSW52U1tTYm94W2ldXSA9IChCeXRlKWk7DQorICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspDQorICB7DQorICAgIHsNCisgICAgICBVSW50MzIgYTEgPSBTYm94W2ldOw0KKyAgICAgIFVJbnQzMiBhMiA9IHh0aW1lKGExKTsNCisgICAgICBVSW50MzIgYTMgPSBhMiBeIGExOw0KKyAgICAgIFRbICAgICAgICBpXSA9IFVpMzIoYTIsIGExLCBhMSwgYTMpOw0KKyAgICAgIFRbMHgxMDAgKyBpXSA9IFVpMzIoYTMsIGEyLCBhMSwgYTEpOw0KKyAgICAgIFRbMHgyMDAgKyBpXSA9IFVpMzIoYTEsIGEzLCBhMiwgYTEpOw0KKyAgICAgIFRbMHgzMDAgKyBpXSA9IFVpMzIoYTEsIGExLCBhMywgYTIpOw0KKyAgICB9DQorICAgIHsNCisgICAgICBVSW50MzIgYTEgPSBJbnZTW2ldOw0KKyAgICAgIFVJbnQzMiBhMiA9IHh0aW1lKGExKTsNCisgICAgICBVSW50MzIgYTQgPSB4dGltZShhMik7DQorICAgICAgVUludDMyIGE4ID0geHRpbWUoYTQpOw0KKyAgICAgIFVJbnQzMiBhOSA9IGE4IF4gYTE7DQorICAgICAgVUludDMyIGFCID0gYTggXiBhMiBeIGExOw0KKyAgICAgIFVJbnQzMiBhRCA9IGE4IF4gYTQgXiBhMTsNCisgICAgICBVSW50MzIgYUUgPSBhOCBeIGE0IF4gYTI7DQorICAgICAgRFsgICAgICAgIGldID0gVWkzMihhRSwgYTksIGFELCBhQik7DQorICAgICAgRFsweDEwMCArIGldID0gVWkzMihhQiwgYUUsIGE5LCBhRCk7DQorICAgICAgRFsweDIwMCArIGldID0gVWkzMihhRCwgYUIsIGFFLCBhOSk7DQorICAgICAgRFsweDMwMCArIGldID0gVWkzMihhOSwgYUQsIGFCLCBhRSk7DQorICAgIH0NCisgIH0NCisgIGdfQWVzQ2JjX0VuY29kZSA9IEFlc0NiY19FbmNvZGU7DQorICBnX0Flc0NiY19EZWNvZGUgPSBBZXNDYmNfRGVjb2RlOw0KKyAgZ19BZXNDdHJfQ29kZSA9IEFlc0N0cl9Db2RlOw0KKyAgI2lmZGVmIE1ZX0NQVV9YODZfT1JfQU1ENjQNCisgIGlmIChDUFVfSXNfQWVzX1N1cHBvcnRlZCgpKQ0KKyAgew0KKyAgICBnX0Flc0NiY19FbmNvZGUgPSBBZXNDYmNfRW5jb2RlX0ludGVsOw0KKyAgICBnX0Flc0NiY19EZWNvZGUgPSBBZXNDYmNfRGVjb2RlX0ludGVsOw0KKyAgICBnX0Flc0N0cl9Db2RlID0gQWVzQ3RyX0NvZGVfSW50ZWw7DQorICB9DQorICAjZW5kaWYNCit9DQorDQorI2RlZmluZSBIVChpLCB4LCBzKSAoVCArICh4IDw8IDgpKVtnYiAjIyB4KHNbKGkgKyB4KSAmIDNdKV0NCisjZGVmaW5lIEhUNChtLCBpLCBzLCBwKSBtW2ldID0gXA0KKyAgICBIVChpLCAwLCBzKSBeIFwNCisgICAgSFQoaSwgMSwgcykgXiBcDQorICAgIEhUKGksIDIsIHMpIF4gXA0KKyAgICBIVChpLCAzLCBzKSBeIHdbcCArIGldDQorLyogc3VjaCBvcmRlciAoMjAzMSkgaW4gSFQxNiBpcyBmb3IgVkM2L0s4IHNwZWVkIG9wdGltaXphdGlvbikgKi8NCisjZGVmaW5lIEhUMTYobSwgcywgcCkgXA0KKyAgICBIVDQobSwgMiwgcywgcCk7IFwNCisgICAgSFQ0KG0sIDAsIHMsIHApOyBcDQorICAgIEhUNChtLCAzLCBzLCBwKTsgXA0KKyAgICBIVDQobSwgMSwgcywgcCk7IFwNCisNCisjZGVmaW5lIEZUKGksIHgpIFNib3hbZ2IgIyMgeChtWyhpICsgeCkgJiAzXSldDQorI2RlZmluZSBGVDQoaSkgZGVzdFtpXSA9IFVpMzIoRlQoaSwgMCksIEZUKGksIDEpLCBGVChpLCAyKSwgRlQoaSwgMykpIF4gd1tpXTsNCisNCisjZGVmaW5lIEhEKGksIHgsIHMpIChEICsgKHggPDwgOCkpW2diICMjIHgoc1soaSAtIHgpICYgM10pXQ0KKyNkZWZpbmUgSEQ0KG0sIGksIHMsIHApIG1baV0gPSBcDQorICAgIEhEKGksIDAsIHMpIF4gXA0KKyAgICBIRChpLCAxLCBzKSBeIFwNCisgICAgSEQoaSwgMiwgcykgXiBcDQorICAgIEhEKGksIDMsIHMpIF4gd1twICsgaV07DQorLyogc3VjaCBvcmRlciAoMDIzMSkgaW4gSEQxNiBpcyBmb3IgVkM2L0s4IHNwZWVkIG9wdGltaXphdGlvbikgKi8NCisjZGVmaW5lIEhEMTYobSwgcywgcCkgXA0KKyAgICBIRDQobSwgMCwgcywgcCk7IFwNCisgICAgSEQ0KG0sIDIsIHMsIHApOyBcDQorICAgIEhENChtLCAzLCBzLCBwKTsgXA0KKyAgICBIRDQobSwgMSwgcywgcCk7IFwNCisNCisjZGVmaW5lIEZEKGksIHgpIEludlNbZ2IgIyMgeChtWyhpIC0geCkgJiAzXSldDQorI2RlZmluZSBGRDQoaSkgZGVzdFtpXSA9IFVpMzIoRkQoaSwgMCksIEZEKGksIDEpLCBGRChpLCAyKSwgRkQoaSwgMykpIF4gd1tpXTsNCisNCit2b2lkIE1ZX0ZBU1RfQ0FMTCBBZXNfU2V0S2V5X0VuYyhVSW50MzIgKncsIGNvbnN0IEJ5dGUgKmtleSwgdW5zaWduZWQga2V5U2l6ZSkNCit7DQorICB1bnNpZ25lZCBpLCB3U2l6ZTsNCisgIHdTaXplID0ga2V5U2l6ZSArIDI4Ow0KKyAga2V5U2l6ZSAvPSA0Ow0KKyAgd1swXSA9ICgoVUludDMyKWtleVNpemUgLyAyKSArIDM7DQorICB3ICs9IDQ7DQorDQorICBmb3IgKGkgPSAwOyBpIDwga2V5U2l6ZTsgaSsrLCBrZXkgKz0gNCkNCisgICAgd1tpXSA9IEdldFVpMzIoa2V5KTsNCisNCisgIGZvciAoOyBpIDwgd1NpemU7IGkrKykNCisgIHsNCisgICAgVUludDMyIHQgPSB3W2kgLSAxXTsNCisgICAgdW5zaWduZWQgcmVtID0gaSAlIGtleVNpemU7DQorICAgIGlmIChyZW0gPT0gMCkNCisgICAgICB0ID0gVWkzMihTYm94W2diMSh0KV0gXiBSY29uW2kgLyBrZXlTaXplXSwgU2JveFtnYjIodCldLCBTYm94W2diMyh0KV0sIFNib3hbZ2IwKHQpXSk7DQorICAgIGVsc2UgaWYgKGtleVNpemUgPiA2ICYmIHJlbSA9PSA0KQ0KKyAgICAgIHQgPSBVaTMyKFNib3hbZ2IwKHQpXSwgU2JveFtnYjEodCldLCBTYm94W2diMih0KV0sIFNib3hbZ2IzKHQpXSk7DQorICAgIHdbaV0gPSB3W2kgLSBrZXlTaXplXSBeIHQ7DQorICB9DQorfQ0KKw0KK3ZvaWQgTVlfRkFTVF9DQUxMIEFlc19TZXRLZXlfRGVjKFVJbnQzMiAqdywgY29uc3QgQnl0ZSAqa2V5LCB1bnNpZ25lZCBrZXlTaXplKQ0KK3sNCisgIHVuc2lnbmVkIGksIG51bTsNCisgIEFlc19TZXRLZXlfRW5jKHcsIGtleSwga2V5U2l6ZSk7DQorICBudW0gPSBrZXlTaXplICsgMjA7DQorICB3ICs9IDg7DQorICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspDQorICB7DQorICAgIFVJbnQzMiByID0gd1tpXTsNCisgICAgd1tpXSA9DQorICAgICAgRFsgICAgICAgIFNib3hbZ2IwKHIpXV0gXg0KKyAgICAgIERbMHgxMDAgKyBTYm94W2diMShyKV1dIF4NCisgICAgICBEWzB4MjAwICsgU2JveFtnYjIocildXSBeDQorICAgICAgRFsweDMwMCArIFNib3hbZ2IzKHIpXV07DQorICB9DQorfQ0KKw0KKy8qIEFlc19FbmNvZGUgYW5kIEFlc19EZWNvZGUgZnVuY3Rpb25zIHdvcmsgd2l0aCBsaXR0bGUtZW5kaWFuIHdvcmRzLg0KKyAgc3JjIGFuZCBkZXN0IGFyZSBwb2ludGVycyB0byA0IFVJbnQzMiB3b3Jkcy4NCisgIGFyYyBhbmQgZGVzdCBjYW4gcG9pbnQgdG8gc2FtZSBibG9jayAqLw0KKw0KK3N0YXRpYyB2b2lkIEFlc19FbmNvZGUoY29uc3QgVUludDMyICp3LCBVSW50MzIgKmRlc3QsIGNvbnN0IFVJbnQzMiAqc3JjKQ0KK3sNCisgIFVJbnQzMiBzWzRdOw0KKyAgVUludDMyIG1bNF07DQorICBVSW50MzIgbnVtUm91bmRzMiA9IHdbMF07DQorICB3ICs9IDQ7DQorICBzWzBdID0gc3JjWzBdIF4gd1swXTsNCisgIHNbMV0gPSBzcmNbMV0gXiB3WzFdOw0KKyAgc1syXSA9IHNyY1syXSBeIHdbMl07DQorICBzWzNdID0gc3JjWzNdIF4gd1szXTsNCisgIHcgKz0gNDsNCisgIGZvciAoOzspDQorICB7DQorICAgIEhUMTYobSwgcywgMCk7DQorICAgIGlmICgtLW51bVJvdW5kczIgPT0gMCkNCisgICAgICBicmVhazsNCisgICAgSFQxNihzLCBtLCA0KTsNCisgICAgdyArPSA4Ow0KKyAgfQ0KKyAgdyArPSA0Ow0KKyAgRlQ0KDApOyBGVDQoMSk7IEZUNCgyKTsgRlQ0KDMpOw0KK30NCisNCitzdGF0aWMgdm9pZCBBZXNfRGVjb2RlKGNvbnN0IFVJbnQzMiAqdywgVUludDMyICpkZXN0LCBjb25zdCBVSW50MzIgKnNyYykNCit7DQorICBVSW50MzIgc1s0XTsNCisgIFVJbnQzMiBtWzRdOw0KKyAgVUludDMyIG51bVJvdW5kczIgPSB3WzBdOw0KKyAgdyArPSA0ICsgbnVtUm91bmRzMiAqIDg7DQorICBzWzBdID0gc3JjWzBdIF4gd1swXTsNCisgIHNbMV0gPSBzcmNbMV0gXiB3WzFdOw0KKyAgc1syXSA9IHNyY1syXSBeIHdbMl07DQorICBzWzNdID0gc3JjWzNdIF4gd1szXTsNCisgIGZvciAoOzspDQorICB7DQorICAgIHcgLT0gODsNCisgICAgSEQxNihtLCBzLCA0KTsNCisgICAgaWYgKC0tbnVtUm91bmRzMiA9PSAwKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBIRDE2KHMsIG0sIDApOw0KKyAgfQ0KKyAgRkQ0KDApOyBGRDQoMSk7IEZENCgyKTsgRkQ0KDMpOw0KK30NCisNCit2b2lkIEFlc0NiY19Jbml0KFVJbnQzMiAqcCwgY29uc3QgQnl0ZSAqaXYpDQorew0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspDQorICAgIHBbaV0gPSBHZXRVaTMyKGl2ICsgaSAqIDQpOw0KK30NCisNCit2b2lkIE1ZX0ZBU1RfQ0FMTCBBZXNDYmNfRW5jb2RlKFVJbnQzMiAqcCwgQnl0ZSAqZGF0YSwgc2l6ZV90IG51bUJsb2NrcykNCit7DQorICBmb3IgKDsgbnVtQmxvY2tzICE9IDA7IG51bUJsb2Nrcy0tLCBkYXRhICs9IEFFU19CTE9DS19TSVpFKQ0KKyAgew0KKyAgICBwWzBdIF49IEdldFVpMzIoZGF0YSk7DQorICAgIHBbMV0gXj0gR2V0VWkzMihkYXRhICsgNCk7DQorICAgIHBbMl0gXj0gR2V0VWkzMihkYXRhICsgOCk7DQorICAgIHBbM10gXj0gR2V0VWkzMihkYXRhICsgMTIpOw0KKyAgICANCisgICAgQWVzX0VuY29kZShwICsgNCwgcCwgcCk7DQorICAgIA0KKyAgICBTZXRVaTMyKGRhdGEsICAgICAgcFswXSk7DQorICAgIFNldFVpMzIoZGF0YSArIDQsICBwWzFdKTsNCisgICAgU2V0VWkzMihkYXRhICsgOCwgIHBbMl0pOw0KKyAgICBTZXRVaTMyKGRhdGEgKyAxMiwgcFszXSk7DQorICB9DQorfQ0KKw0KK3ZvaWQgTVlfRkFTVF9DQUxMIEFlc0NiY19EZWNvZGUoVUludDMyICpwLCBCeXRlICpkYXRhLCBzaXplX3QgbnVtQmxvY2tzKQ0KK3sNCisgIFVJbnQzMiBpbls0XSwgb3V0WzRdOw0KKyAgZm9yICg7IG51bUJsb2NrcyAhPSAwOyBudW1CbG9ja3MtLSwgZGF0YSArPSBBRVNfQkxPQ0tfU0laRSkNCisgIHsNCisgICAgaW5bMF0gPSBHZXRVaTMyKGRhdGEpOw0KKyAgICBpblsxXSA9IEdldFVpMzIoZGF0YSArIDQpOw0KKyAgICBpblsyXSA9IEdldFVpMzIoZGF0YSArIDgpOw0KKyAgICBpblszXSA9IEdldFVpMzIoZGF0YSArIDEyKTsNCisNCisgICAgQWVzX0RlY29kZShwICsgNCwgb3V0LCBpbik7DQorDQorICAgIFNldFVpMzIoZGF0YSwgICAgICBwWzBdIF4gb3V0WzBdKTsNCisgICAgU2V0VWkzMihkYXRhICsgNCwgIHBbMV0gXiBvdXRbMV0pOw0KKyAgICBTZXRVaTMyKGRhdGEgKyA4LCAgcFsyXSBeIG91dFsyXSk7DQorICAgIFNldFVpMzIoZGF0YSArIDEyLCBwWzNdIF4gb3V0WzNdKTsNCisgICAgDQorICAgIHBbMF0gPSBpblswXTsNCisgICAgcFsxXSA9IGluWzFdOw0KKyAgICBwWzJdID0gaW5bMl07DQorICAgIHBbM10gPSBpblszXTsNCisgIH0NCit9DQorDQordm9pZCBNWV9GQVNUX0NBTEwgQWVzQ3RyX0NvZGUoVUludDMyICpwLCBCeXRlICpkYXRhLCBzaXplX3QgbnVtQmxvY2tzKQ0KK3sNCisgIGZvciAoOyBudW1CbG9ja3MgIT0gMDsgbnVtQmxvY2tzLS0pDQorICB7DQorICAgIFVJbnQzMiB0ZW1wWzRdOw0KKyAgICBCeXRlIGJ1ZlsxNl07DQorICAgIGludCBpOw0KKyAgICBpZiAoKytwWzBdID09IDApDQorICAgICAgcFsxXSsrOw0KKyAgICBBZXNfRW5jb2RlKHAgKyA0LCB0ZW1wLCBwKTsNCisgICAgU2V0VWkzMihidWYsICAgICAgdGVtcFswXSk7DQorICAgIFNldFVpMzIoYnVmICsgNCwgIHRlbXBbMV0pOw0KKyAgICBTZXRVaTMyKGJ1ZiArIDgsICB0ZW1wWzJdKTsNCisgICAgU2V0VWkzMihidWYgKyAxMiwgdGVtcFszXSk7DQorICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQ0KKyAgICAgICpkYXRhKysgXj0gYnVmW2ldOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9sem1hL0MvQWVzLmggYi9sem1hL0MvQWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxZTk3OQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9BZXMuaApAQCAtMCwwICsxLDM4IEBACisvKiBBZXMuaCAtLSBBRVMgZW5jcnlwdGlvbiAvIGRlY3J5cHRpb24NCisyMDEzLTAxLTE4IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2lmbmRlZiBfX0FFU19IDQorI2RlZmluZSBfX0FFU19IDQorDQorI2luY2x1ZGUgIjd6VHlwZXMuaCINCisNCitFWFRFUk5fQ19CRUdJTg0KKw0KKyNkZWZpbmUgQUVTX0JMT0NLX1NJWkUgMTYNCisNCisvKiBDYWxsIEFlc0dlblRhYmxlcyBvbmUgdGltZSBiZWZvcmUgb3RoZXIgQUVTIGZ1bmN0aW9ucyAqLw0KK3ZvaWQgQWVzR2VuVGFibGVzKHZvaWQpOw0KKw0KKy8qIFVJbnQzMiBwb2ludGVycyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZCAqLw0KKw0KKy8qIDE2LWJ5dGUgKDQgKiAzMi1iaXQgd29yZHMpIGJsb2NrczogMSAoSVYpICsgMSAoa2V5TW9kZSkgKyAxNSAoQUVTLTI1NiByb3VuZEtleXMpICovDQorI2RlZmluZSBBRVNfTlVNX0lWTVJLX1dPUkRTICgoMSArIDEgKyAxNSkgKiA0KQ0KKw0KKy8qIGFlcyAtIDE2LWJ5dGUgYWxpZ25lZCBwb2ludGVyIHRvIGtleU1vZGUrcm91bmRLZXlzIHNlcXVlbmNlICovDQorLyoga2V5U2l6ZSA9IDE2IG9yIDI0IG9yIDMyIChieXRlcykgKi8NCit0eXBlZGVmIHZvaWQgKE1ZX0ZBU1RfQ0FMTCAqQUVTX1NFVF9LRVlfRlVOQykoVUludDMyICphZXMsIGNvbnN0IEJ5dGUgKmtleSwgdW5zaWduZWQga2V5U2l6ZSk7DQordm9pZCBNWV9GQVNUX0NBTEwgQWVzX1NldEtleV9FbmMoVUludDMyICphZXMsIGNvbnN0IEJ5dGUgKmtleSwgdW5zaWduZWQga2V5U2l6ZSk7DQordm9pZCBNWV9GQVNUX0NBTEwgQWVzX1NldEtleV9EZWMoVUludDMyICphZXMsIGNvbnN0IEJ5dGUgKmtleSwgdW5zaWduZWQga2V5U2l6ZSk7DQorDQorLyogaXZBZXMgLSAxNi1ieXRlIGFsaWduZWQgcG9pbnRlciB0byBpditrZXlNb2RlK3JvdW5kS2V5cyBzZXF1ZW5jZTogVUludDMyW0FFU19OVU1fSVZNUktfV09SRFNdICovDQordm9pZCBBZXNDYmNfSW5pdChVSW50MzIgKml2QWVzLCBjb25zdCBCeXRlICppdik7IC8qIGl2IHNpemUgaXMgQUVTX0JMT0NLX1NJWkUgKi8NCisvKiBkYXRhIC0gMTYtYnl0ZSBhbGlnbmVkIHBvaW50ZXIgdG8gZGF0YSAqLw0KKy8qIG51bUJsb2NrcyAtIHRoZSBudW1iZXIgb2YgMTYtYnl0ZSBibG9ja3MgaW4gZGF0YSBhcnJheSAqLw0KK3R5cGVkZWYgdm9pZCAoTVlfRkFTVF9DQUxMICpBRVNfQ09ERV9GVU5DKShVSW50MzIgKml2QWVzLCBCeXRlICpkYXRhLCBzaXplX3QgbnVtQmxvY2tzKTsNCitleHRlcm4gQUVTX0NPREVfRlVOQyBnX0Flc0NiY19FbmNvZGU7DQorZXh0ZXJuIEFFU19DT0RFX0ZVTkMgZ19BZXNDYmNfRGVjb2RlOw0KK2V4dGVybiBBRVNfQ09ERV9GVU5DIGdfQWVzQ3RyX0NvZGU7DQorDQorRVhURVJOX0NfRU5EDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DL0Flc09wdC5jIGIvbHptYS9DL0Flc09wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZDRkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvQWVzT3B0LmMKQEAgLTAsMCArMSwxODQgQEAKKy8qIEFlc09wdC5jIC0tIEludGVsJ3MgQUVTDQorMjAxMy0xMS0xMiA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlICJQcmVjb21wLmgiDQorDQorI2luY2x1ZGUgIkNwdUFyY2guaCINCisNCisjaWZkZWYgTVlfQ1BVX1g4Nl9PUl9BTUQ2NA0KKyNpZiBfTVNDX1ZFUiA+PSAxNTAwDQorI2RlZmluZSBVU0VfSU5URUxfQUVTDQorI2VuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIFVTRV9JTlRFTF9BRVMNCisNCisjaW5jbHVkZSA8d21taW50cmluLmg+DQorDQordm9pZCBNWV9GQVNUX0NBTEwgQWVzQ2JjX0VuY29kZV9JbnRlbChfX20xMjhpICpwLCBfX20xMjhpICpkYXRhLCBzaXplX3QgbnVtQmxvY2tzKQ0KK3sNCisgIF9fbTEyOGkgbSA9ICpwOw0KKyAgZm9yICg7IG51bUJsb2NrcyAhPSAwOyBudW1CbG9ja3MtLSwgZGF0YSsrKQ0KKyAgew0KKyAgICBVSW50MzIgbnVtUm91bmRzMiA9ICooY29uc3QgVUludDMyICopKHAgKyAxKSAtIDE7DQorICAgIGNvbnN0IF9fbTEyOGkgKncgPSBwICsgMzsNCisgICAgbSA9IF9tbV94b3Jfc2kxMjgobSwgKmRhdGEpOw0KKyAgICBtID0gX21tX3hvcl9zaTEyOChtLCBwWzJdKTsNCisgICAgZG8NCisgICAgew0KKyAgICAgIG0gPSBfbW1fYWVzZW5jX3NpMTI4KG0sIHdbMF0pOw0KKyAgICAgIG0gPSBfbW1fYWVzZW5jX3NpMTI4KG0sIHdbMV0pOw0KKyAgICAgIHcgKz0gMjsNCisgICAgfQ0KKyAgICB3aGlsZSAoLS1udW1Sb3VuZHMyICE9IDApOw0KKyAgICBtID0gX21tX2Flc2VuY19zaTEyOChtLCB3WzBdKTsNCisgICAgbSA9IF9tbV9hZXNlbmNsYXN0X3NpMTI4KG0sIHdbMV0pOw0KKyAgICAqZGF0YSA9IG07DQorICB9DQorICAqcCA9IG07DQorfQ0KKw0KKyNkZWZpbmUgTlVNX1dBWVMgMw0KKw0KKyNkZWZpbmUgQUVTX09QX1cob3AsIG4pIHsgXA0KKyAgICBjb25zdCBfX20xMjhpIHQgPSB3W25dOyBcDQorICAgIG0wID0gb3AobTAsIHQpOyBcDQorICAgIG0xID0gb3AobTEsIHQpOyBcDQorICAgIG0yID0gb3AobTIsIHQpOyBcDQorICAgIH0NCisNCisjZGVmaW5lIEFFU19ERUMobikgQUVTX09QX1coX21tX2Flc2RlY19zaTEyOCwgbikNCisjZGVmaW5lIEFFU19ERUNfTEFTVChuKSBBRVNfT1BfVyhfbW1fYWVzZGVjbGFzdF9zaTEyOCwgbikNCisjZGVmaW5lIEFFU19FTkMobikgQUVTX09QX1coX21tX2Flc2VuY19zaTEyOCwgbikNCisjZGVmaW5lIEFFU19FTkNfTEFTVChuKSBBRVNfT1BfVyhfbW1fYWVzZW5jbGFzdF9zaTEyOCwgbikNCisNCit2b2lkIE1ZX0ZBU1RfQ0FMTCBBZXNDYmNfRGVjb2RlX0ludGVsKF9fbTEyOGkgKnAsIF9fbTEyOGkgKmRhdGEsIHNpemVfdCBudW1CbG9ja3MpDQorew0KKyAgX19tMTI4aSBpdiA9ICpwOw0KKyAgZm9yICg7IG51bUJsb2NrcyA+PSBOVU1fV0FZUzsgbnVtQmxvY2tzIC09IE5VTV9XQVlTLCBkYXRhICs9IE5VTV9XQVlTKQ0KKyAgew0KKyAgICBVSW50MzIgbnVtUm91bmRzMiA9ICooY29uc3QgVUludDMyICopKHAgKyAxKTsNCisgICAgY29uc3QgX19tMTI4aSAqdyA9IHAgKyBudW1Sb3VuZHMyICogMjsNCisgICAgX19tMTI4aSBtMCwgbTEsIG0yOw0KKyAgICB7DQorICAgICAgY29uc3QgX19tMTI4aSB0ID0gd1syXTsNCisgICAgICBtMCA9IF9tbV94b3Jfc2kxMjgodCwgZGF0YVswXSk7DQorICAgICAgbTEgPSBfbW1feG9yX3NpMTI4KHQsIGRhdGFbMV0pOw0KKyAgICAgIG0yID0gX21tX3hvcl9zaTEyOCh0LCBkYXRhWzJdKTsNCisgICAgfQ0KKyAgICBudW1Sb3VuZHMyLS07DQorICAgIGRvDQorICAgIHsNCisgICAgICBBRVNfREVDKDEpDQorICAgICAgQUVTX0RFQygwKQ0KKyAgICAgIHcgLT0gMjsNCisgICAgfQ0KKyAgICB3aGlsZSAoLS1udW1Sb3VuZHMyICE9IDApOw0KKyAgICBBRVNfREVDKDEpDQorICAgIEFFU19ERUNfTEFTVCgwKQ0KKw0KKyAgICB7DQorICAgICAgX19tMTI4aSB0Ow0KKyAgICAgIHQgPSBfbW1feG9yX3NpMTI4KG0wLCBpdik7IGl2ID0gZGF0YVswXTsgZGF0YVswXSA9IHQ7DQorICAgICAgdCA9IF9tbV94b3Jfc2kxMjgobTEsIGl2KTsgaXYgPSBkYXRhWzFdOyBkYXRhWzFdID0gdDsNCisgICAgICB0ID0gX21tX3hvcl9zaTEyOChtMiwgaXYpOyBpdiA9IGRhdGFbMl07IGRhdGFbMl0gPSB0Ow0KKyAgICB9DQorICB9DQorICBmb3IgKDsgbnVtQmxvY2tzICE9IDA7IG51bUJsb2Nrcy0tLCBkYXRhKyspDQorICB7DQorICAgIFVJbnQzMiBudW1Sb3VuZHMyID0gKihjb25zdCBVSW50MzIgKikocCArIDEpOw0KKyAgICBjb25zdCBfX20xMjhpICp3ID0gcCArIG51bVJvdW5kczIgKiAyOw0KKyAgICBfX20xMjhpIG0gPSBfbW1feG9yX3NpMTI4KHdbMl0sICpkYXRhKTsNCisgICAgbnVtUm91bmRzMi0tOw0KKyAgICBkbw0KKyAgICB7DQorICAgICAgbSA9IF9tbV9hZXNkZWNfc2kxMjgobSwgd1sxXSk7DQorICAgICAgbSA9IF9tbV9hZXNkZWNfc2kxMjgobSwgd1swXSk7DQorICAgICAgdyAtPSAyOw0KKyAgICB9DQorICAgIHdoaWxlICgtLW51bVJvdW5kczIgIT0gMCk7DQorICAgIG0gPSBfbW1fYWVzZGVjX3NpMTI4KG0sIHdbMV0pOw0KKyAgICBtID0gX21tX2Flc2RlY2xhc3Rfc2kxMjgobSwgd1swXSk7DQorDQorICAgIG0gPSBfbW1feG9yX3NpMTI4KG0sIGl2KTsNCisgICAgaXYgPSAqZGF0YTsNCisgICAgKmRhdGEgPSBtOw0KKyAgfQ0KKyAgKnAgPSBpdjsNCit9DQorDQordm9pZCBNWV9GQVNUX0NBTEwgQWVzQ3RyX0NvZGVfSW50ZWwoX19tMTI4aSAqcCwgX19tMTI4aSAqZGF0YSwgc2l6ZV90IG51bUJsb2NrcykNCit7DQorICBfX20xMjhpIGN0ciA9ICpwOw0KKyAgX19tMTI4aSBvbmU7DQorICBvbmUubTEyOGlfdTY0WzBdID0gMTsNCisgIG9uZS5tMTI4aV91NjRbMV0gPSAwOw0KKyAgZm9yICg7IG51bUJsb2NrcyA+PSBOVU1fV0FZUzsgbnVtQmxvY2tzIC09IE5VTV9XQVlTLCBkYXRhICs9IE5VTV9XQVlTKQ0KKyAgew0KKyAgICBVSW50MzIgbnVtUm91bmRzMiA9ICooY29uc3QgVUludDMyICopKHAgKyAxKSAtIDE7DQorICAgIGNvbnN0IF9fbTEyOGkgKncgPSBwOw0KKyAgICBfX20xMjhpIG0wLCBtMSwgbTI7DQorICAgIHsNCisgICAgICBjb25zdCBfX20xMjhpIHQgPSB3WzJdOw0KKyAgICAgIGN0ciA9IF9tbV9hZGRfZXBpNjQoY3RyLCBvbmUpOyBtMCA9IF9tbV94b3Jfc2kxMjgoY3RyLCB0KTsNCisgICAgICBjdHIgPSBfbW1fYWRkX2VwaTY0KGN0ciwgb25lKTsgbTEgPSBfbW1feG9yX3NpMTI4KGN0ciwgdCk7DQorICAgICAgY3RyID0gX21tX2FkZF9lcGk2NChjdHIsIG9uZSk7IG0yID0gX21tX3hvcl9zaTEyOChjdHIsIHQpOw0KKyAgICB9DQorICAgIHcgKz0gMzsNCisgICAgZG8NCisgICAgew0KKyAgICAgIEFFU19FTkMoMCkNCisgICAgICBBRVNfRU5DKDEpDQorICAgICAgdyArPSAyOw0KKyAgICB9DQorICAgIHdoaWxlICgtLW51bVJvdW5kczIgIT0gMCk7DQorICAgIEFFU19FTkMoMCkNCisgICAgQUVTX0VOQ19MQVNUKDEpDQorICAgIGRhdGFbMF0gPSBfbW1feG9yX3NpMTI4KGRhdGFbMF0sIG0wKTsNCisgICAgZGF0YVsxXSA9IF9tbV94b3Jfc2kxMjgoZGF0YVsxXSwgbTEpOw0KKyAgICBkYXRhWzJdID0gX21tX3hvcl9zaTEyOChkYXRhWzJdLCBtMik7DQorICB9DQorICBmb3IgKDsgbnVtQmxvY2tzICE9IDA7IG51bUJsb2Nrcy0tLCBkYXRhKyspDQorICB7DQorICAgIFVJbnQzMiBudW1Sb3VuZHMyID0gKihjb25zdCBVSW50MzIgKikocCArIDEpIC0gMTsNCisgICAgY29uc3QgX19tMTI4aSAqdyA9IHA7DQorICAgIF9fbTEyOGkgbTsNCisgICAgY3RyID0gX21tX2FkZF9lcGk2NChjdHIsIG9uZSk7DQorICAgIG0gPSBfbW1feG9yX3NpMTI4KGN0ciwgcFsyXSk7DQorICAgIHcgKz0gMzsNCisgICAgZG8NCisgICAgew0KKyAgICAgIG0gPSBfbW1fYWVzZW5jX3NpMTI4KG0sIHdbMF0pOw0KKyAgICAgIG0gPSBfbW1fYWVzZW5jX3NpMTI4KG0sIHdbMV0pOw0KKyAgICAgIHcgKz0gMjsNCisgICAgfQ0KKyAgICB3aGlsZSAoLS1udW1Sb3VuZHMyICE9IDApOw0KKyAgICBtID0gX21tX2Flc2VuY19zaTEyOChtLCB3WzBdKTsNCisgICAgbSA9IF9tbV9hZXNlbmNsYXN0X3NpMTI4KG0sIHdbMV0pOw0KKyAgICAqZGF0YSA9IF9tbV94b3Jfc2kxMjgoKmRhdGEsIG0pOw0KKyAgfQ0KKyAgKnAgPSBjdHI7DQorfQ0KKw0KKyNlbHNlDQorDQordm9pZCBNWV9GQVNUX0NBTEwgQWVzQ2JjX0VuY29kZShVSW50MzIgKml2QWVzLCBCeXRlICpkYXRhLCBzaXplX3QgbnVtQmxvY2tzKTsNCit2b2lkIE1ZX0ZBU1RfQ0FMTCBBZXNDYmNfRGVjb2RlKFVJbnQzMiAqaXZBZXMsIEJ5dGUgKmRhdGEsIHNpemVfdCBudW1CbG9ja3MpOw0KK3ZvaWQgTVlfRkFTVF9DQUxMIEFlc0N0cl9Db2RlKFVJbnQzMiAqaXZBZXMsIEJ5dGUgKmRhdGEsIHNpemVfdCBudW1CbG9ja3MpOw0KKw0KK3ZvaWQgTVlfRkFTVF9DQUxMIEFlc0NiY19FbmNvZGVfSW50ZWwoVUludDMyICpwLCBCeXRlICpkYXRhLCBzaXplX3QgbnVtQmxvY2tzKQ0KK3sNCisgIEFlc0NiY19FbmNvZGUocCwgZGF0YSwgbnVtQmxvY2tzKTsNCit9DQorDQordm9pZCBNWV9GQVNUX0NBTEwgQWVzQ2JjX0RlY29kZV9JbnRlbChVSW50MzIgKnAsIEJ5dGUgKmRhdGEsIHNpemVfdCBudW1CbG9ja3MpDQorew0KKyAgQWVzQ2JjX0RlY29kZShwLCBkYXRhLCBudW1CbG9ja3MpOw0KK30NCisNCit2b2lkIE1ZX0ZBU1RfQ0FMTCBBZXNDdHJfQ29kZV9JbnRlbChVSW50MzIgKnAsIEJ5dGUgKmRhdGEsIHNpemVfdCBudW1CbG9ja3MpDQorew0KKyAgQWVzQ3RyX0NvZGUocCwgZGF0YSwgbnVtQmxvY2tzKTsNCit9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DL0FsbG9jLmMgYi9sem1hL0MvQWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTI4MzlhCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL0FsbG9jLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qIEFsbG9jLmMgLS0gTWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zDQorMjAxMy0xMS0xMiA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlICJQcmVjb21wLmgiDQorDQorI2lmZGVmIF9XSU4zMg0KKyNpbmNsdWRlIDx3aW5kb3dzLmg+DQorI2VuZGlmDQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKw0KKyNpbmNsdWRlICJBbGxvYy5oIg0KKw0KKy8qICNkZWZpbmUgX1NaX0FMTE9DX0RFQlVHICovDQorDQorLyogdXNlIF9TWl9BTExPQ19ERUJVRyB0byBkZWJ1ZyBhbGxvYy9mcmVlIG9wZXJhdGlvbnMgKi8NCisjaWZkZWYgX1NaX0FMTE9DX0RFQlVHDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQoraW50IGdfYWxsb2NDb3VudCA9IDA7DQoraW50IGdfYWxsb2NDb3VudE1pZCA9IDA7DQoraW50IGdfYWxsb2NDb3VudEJpZyA9IDA7DQorI2VuZGlmDQorDQordm9pZCAqTXlBbGxvYyhzaXplX3Qgc2l6ZSkNCit7DQorICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICByZXR1cm4gMDsNCisgICNpZmRlZiBfU1pfQUxMT0NfREVCVUcNCisgIHsNCisgICAgdm9pZCAqcCA9IG1hbGxvYyhzaXplKTsNCisgICAgZnByaW50ZihzdGRlcnIsICJcbkFsbG9jICUxMGQgYnl0ZXMsIGNvdW50ID0gJTEwZCwgIGFkZHIgPSAlOFgiLCBzaXplLCBnX2FsbG9jQ291bnQrKywgKHVuc2lnbmVkKXApOw0KKyAgICByZXR1cm4gcDsNCisgIH0NCisgICNlbHNlDQorICByZXR1cm4gbWFsbG9jKHNpemUpOw0KKyAgI2VuZGlmDQorfQ0KKw0KK3ZvaWQgTXlGcmVlKHZvaWQgKmFkZHJlc3MpDQorew0KKyAgI2lmZGVmIF9TWl9BTExPQ19ERUJVRw0KKyAgaWYgKGFkZHJlc3MgIT0gMCkNCisgICAgZnByaW50ZihzdGRlcnIsICJcbkZyZWU7IGNvdW50ID0gJTEwZCwgIGFkZHIgPSAlOFgiLCAtLWdfYWxsb2NDb3VudCwgKHVuc2lnbmVkKWFkZHJlc3MpOw0KKyAgI2VuZGlmDQorICBmcmVlKGFkZHJlc3MpOw0KK30NCisNCisjaWZkZWYgX1dJTjMyDQorDQordm9pZCAqTWlkQWxsb2Moc2l6ZV90IHNpemUpDQorew0KKyAgaWYgKHNpemUgPT0gMCkNCisgICAgcmV0dXJuIDA7DQorICAjaWZkZWYgX1NaX0FMTE9DX0RFQlVHDQorICBmcHJpbnRmKHN0ZGVyciwgIlxuQWxsb2NfTWlkICUxMGQgYnl0ZXM7ICBjb3VudCA9ICUxMGQiLCBzaXplLCBnX2FsbG9jQ291bnRNaWQrKyk7DQorICAjZW5kaWYNCisgIHJldHVybiBWaXJ0dWFsQWxsb2MoMCwgc2l6ZSwgTUVNX0NPTU1JVCwgUEFHRV9SRUFEV1JJVEUpOw0KK30NCisNCit2b2lkIE1pZEZyZWUodm9pZCAqYWRkcmVzcykNCit7DQorICAjaWZkZWYgX1NaX0FMTE9DX0RFQlVHDQorICBpZiAoYWRkcmVzcyAhPSAwKQ0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuRnJlZV9NaWQ7IGNvdW50ID0gJTEwZCIsIC0tZ19hbGxvY0NvdW50TWlkKTsNCisgICNlbmRpZg0KKyAgaWYgKGFkZHJlc3MgPT0gMCkNCisgICAgcmV0dXJuOw0KKyAgVmlydHVhbEZyZWUoYWRkcmVzcywgMCwgTUVNX1JFTEVBU0UpOw0KK30NCisNCisjaWZuZGVmIE1FTV9MQVJHRV9QQUdFUw0KKyN1bmRlZiBfN1pJUF9MQVJHRV9QQUdFUw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBfN1pJUF9MQVJHRV9QQUdFUw0KK1NJWkVfVCBnX0xhcmdlUGFnZVNpemUgPSAwOw0KK3R5cGVkZWYgU0laRV9UIChXSU5BUEkgKkdldExhcmdlUGFnZU1pbmltdW1QKSgpOw0KKyNlbmRpZg0KKw0KK3ZvaWQgU2V0TGFyZ2VQYWdlU2l6ZSgpDQorew0KKyAgI2lmZGVmIF83WklQX0xBUkdFX1BBR0VTDQorICBTSVpFX1Qgc2l6ZSA9IDA7DQorICBHZXRMYXJnZVBhZ2VNaW5pbXVtUCBsYXJnZVBhZ2VNaW5pbXVtID0gKEdldExhcmdlUGFnZU1pbmltdW1QKQ0KKyAgICAgICAgR2V0UHJvY0FkZHJlc3MoR2V0TW9kdWxlSGFuZGxlKFRFWFQoImtlcm5lbDMyLmRsbCIpKSwgIkdldExhcmdlUGFnZU1pbmltdW0iKTsNCisgIGlmIChsYXJnZVBhZ2VNaW5pbXVtID09IDApDQorICAgIHJldHVybjsNCisgIHNpemUgPSBsYXJnZVBhZ2VNaW5pbXVtKCk7DQorICBpZiAoc2l6ZSA9PSAwIHx8IChzaXplICYgKHNpemUgLSAxKSkgIT0gMCkNCisgICAgcmV0dXJuOw0KKyAgZ19MYXJnZVBhZ2VTaXplID0gc2l6ZTsNCisgICNlbmRpZg0KK30NCisNCisNCit2b2lkICpCaWdBbGxvYyhzaXplX3Qgc2l6ZSkNCit7DQorICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICByZXR1cm4gMDsNCisgICNpZmRlZiBfU1pfQUxMT0NfREVCVUcNCisgIGZwcmludGYoc3RkZXJyLCAiXG5BbGxvY19CaWcgJTEwZCBieXRlczsgIGNvdW50ID0gJTEwZCIsIHNpemUsIGdfYWxsb2NDb3VudEJpZysrKTsNCisgICNlbmRpZg0KKyAgDQorICAjaWZkZWYgXzdaSVBfTEFSR0VfUEFHRVMNCisgIGlmIChnX0xhcmdlUGFnZVNpemUgIT0gMCAmJiBnX0xhcmdlUGFnZVNpemUgPD0gKDEgPDwgMzApICYmIHNpemUgPj0gKDEgPDwgMTgpKQ0KKyAgew0KKyAgICB2b2lkICpyZXMgPSBWaXJ0dWFsQWxsb2MoMCwgKHNpemUgKyBnX0xhcmdlUGFnZVNpemUgLSAxKSAmICh+KGdfTGFyZ2VQYWdlU2l6ZSAtIDEpKSwNCisgICAgICAgIE1FTV9DT01NSVQgfCBNRU1fTEFSR0VfUEFHRVMsIFBBR0VfUkVBRFdSSVRFKTsNCisgICAgaWYgKHJlcyAhPSAwKQ0KKyAgICAgIHJldHVybiByZXM7DQorICB9DQorICAjZW5kaWYNCisgIHJldHVybiBWaXJ0dWFsQWxsb2MoMCwgc2l6ZSwgTUVNX0NPTU1JVCwgUEFHRV9SRUFEV1JJVEUpOw0KK30NCisNCit2b2lkIEJpZ0ZyZWUodm9pZCAqYWRkcmVzcykNCit7DQorICAjaWZkZWYgX1NaX0FMTE9DX0RFQlVHDQorICBpZiAoYWRkcmVzcyAhPSAwKQ0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuRnJlZV9CaWc7IGNvdW50ID0gJTEwZCIsIC0tZ19hbGxvY0NvdW50QmlnKTsNCisgICNlbmRpZg0KKyAgDQorICBpZiAoYWRkcmVzcyA9PSAwKQ0KKyAgICByZXR1cm47DQorICBWaXJ0dWFsRnJlZShhZGRyZXNzLCAwLCBNRU1fUkVMRUFTRSk7DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy9BbGxvYy5oIGIvbHptYS9DL0FsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzZjAzNAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9BbGxvYy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIEFsbG9jLmggLS0gTWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zDQorMjAwOS0wMi0wNyA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpZm5kZWYgX19DT01NT05fQUxMT0NfSA0KKyNkZWZpbmUgX19DT01NT05fQUxMT0NfSA0KKw0KKyNpbmNsdWRlIDxzdGRkZWYuaD4NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisNCit2b2lkICpNeUFsbG9jKHNpemVfdCBzaXplKTsNCit2b2lkIE15RnJlZSh2b2lkICphZGRyZXNzKTsNCisNCisjaWZkZWYgX1dJTjMyDQorDQordm9pZCBTZXRMYXJnZVBhZ2VTaXplKCk7DQorDQordm9pZCAqTWlkQWxsb2Moc2l6ZV90IHNpemUpOw0KK3ZvaWQgTWlkRnJlZSh2b2lkICphZGRyZXNzKTsNCit2b2lkICpCaWdBbGxvYyhzaXplX3Qgc2l6ZSk7DQordm9pZCBCaWdGcmVlKHZvaWQgKmFkZHJlc3MpOw0KKw0KKyNlbHNlDQorDQorI2RlZmluZSBNaWRBbGxvYyhzaXplKSBNeUFsbG9jKHNpemUpDQorI2RlZmluZSBNaWRGcmVlKGFkZHJlc3MpIE15RnJlZShhZGRyZXNzKQ0KKyNkZWZpbmUgQmlnQWxsb2Moc2l6ZSkgTXlBbGxvYyhzaXplKQ0KKyNkZWZpbmUgQmlnRnJlZShhZGRyZXNzKSBNeUZyZWUoYWRkcmVzcykNCisNCisjZW5kaWYNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DL0FuZHJvaWQuYnAgYi9sem1hL0MvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTcxYmYzCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlibHptYSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgc2RrX3ZlcnNpb246ICI5IiwKKyAgICBzdGw6ICJub25lIiwKKworICAgIGNmbGFnczogWyItRF83WklQX1NUIiwgIi1Xbm8tZW1wdHktYm9keSJdLAorICAgIGNsYW5nX2NmbGFnczogWyItV25vLXNlbGYtYXNzaWduIl0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIjd6QWxsb2MuYyIsCisgICAgICAgICI3ekFyY0luLmMiLAorICAgICAgICAiN3pCdWYyLmMiLAorICAgICAgICAiN3pCdWYuYyIsCisgICAgICAgICI3ekNyYy5jIiwKKyAgICAgICAgIjd6Q3JjT3B0LmMiLAorICAgICAgICAiN3pEZWMuYyIsCisgICAgICAgICI3ekZpbGUuYyIsCisgICAgICAgICI3elN0cmVhbS5jIiwKKyAgICAgICAgIkFlcy5jIiwKKyAgICAgICAgIkFlc09wdC5jIiwKKyAgICAgICAgIkFsbG9jLmMiLAorICAgICAgICAiQmNqMi5jIiwKKyAgICAgICAgIkJyYTg2LmMiLAorICAgICAgICAiQnJhLmMiLAorICAgICAgICAiQnJhSUE2NC5jIiwKKyAgICAgICAgIkNwdUFyY2guYyIsCisgICAgICAgICJEZWx0YS5jIiwKKyAgICAgICAgIkx6RmluZC5jIiwKKyAgICAgICAgIkx6bWEyRGVjLmMiLAorICAgICAgICAiTHptYTJFbmMuYyIsCisgICAgICAgICJMem1hODZEZWMuYyIsCisgICAgICAgICJMem1hODZFbmMuYyIsCisgICAgICAgICJMem1hRGVjLmMiLAorICAgICAgICAiTHptYUVuYy5jIiwKKyAgICAgICAgIkx6bWFMaWIuYyIsCisgICAgICAgICJQcG1kNy5jIiwKKyAgICAgICAgIlBwbWQ3RGVjLmMiLAorICAgICAgICAiUHBtZDdFbmMuYyIsCisgICAgICAgICJTaGEyNTYuYyIsCisgICAgICAgICJTb3J0LmMiLAorICAgICAgICAiWHouYyIsCisgICAgICAgICJYekNyYzY0LmMiLAorICAgICAgICAiWHpDcmM2NE9wdC5jIiwKKyAgICAgICAgIlh6RGVjLmMiLAorICAgICAgICAiWHpFbmMuYyIsCisgICAgICAgICJYekluLmMiLAorICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgd2luZG93czogeworICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbHptYS9DL0JjajIuYyBiL2x6bWEvQy9CY2oyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0Y2EwYwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9CY2oyLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qIEJjajIuYyAtLSBDb252ZXJ0ZXIgZm9yIHg4NiBjb2RlIChCQ0oyKQ0KKzIwMDgtMTAtMDQgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiUHJlY29tcC5oIg0KKw0KKyNpbmNsdWRlICJCY2oyLmgiDQorDQorI2lmZGVmIF9MWk1BX1BST0IzMg0KKyNkZWZpbmUgQ1Byb2IgVUludDMyDQorI2Vsc2UNCisjZGVmaW5lIENQcm9iIFVJbnQxNg0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgSXNKY2MoYjAsIGIxKSAoKGIwKSA9PSAweDBGICYmICgoYjEpICYgMHhGMCkgPT0gMHg4MCkNCisjZGVmaW5lIElzSihiMCwgYjEpICgoYjEgJiAweEZFKSA9PSAweEU4IHx8IElzSmNjKGIwLCBiMSkpDQorDQorI2RlZmluZSBrTnVtVG9wQml0cyAyNA0KKyNkZWZpbmUga1RvcFZhbHVlICgoVUludDMyKTEgPDwga051bVRvcEJpdHMpDQorDQorI2RlZmluZSBrTnVtQml0TW9kZWxUb3RhbEJpdHMgMTENCisjZGVmaW5lIGtCaXRNb2RlbFRvdGFsICgxIDw8IGtOdW1CaXRNb2RlbFRvdGFsQml0cykNCisjZGVmaW5lIGtOdW1Nb3ZlQml0cyA1DQorDQorI2RlZmluZSBSQ19SRUFEX0JZVEUgKCpidWZmZXIrKykNCisjZGVmaW5lIFJDX1RFU1QgeyBpZiAoYnVmZmVyID09IGJ1ZmZlckxpbSkgcmV0dXJuIFNaX0VSUk9SX0RBVEE7IH0NCisjZGVmaW5lIFJDX0lOSVQyIGNvZGUgPSAwOyByYW5nZSA9IDB4RkZGRkZGRkY7IFwNCisgIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsgUkNfVEVTVDsgY29kZSA9IChjb2RlIDw8IDgpIHwgUkNfUkVBRF9CWVRFOyB9fQ0KKw0KKyNkZWZpbmUgTk9STUFMSVpFIGlmIChyYW5nZSA8IGtUb3BWYWx1ZSkgeyBSQ19URVNUOyByYW5nZSA8PD0gODsgY29kZSA9IChjb2RlIDw8IDgpIHwgUkNfUkVBRF9CWVRFOyB9DQorDQorI2RlZmluZSBJRl9CSVRfMChwKSB0dHQgPSAqKHApOyBib3VuZCA9IChyYW5nZSA+PiBrTnVtQml0TW9kZWxUb3RhbEJpdHMpICogdHR0OyBpZiAoY29kZSA8IGJvdW5kKQ0KKyNkZWZpbmUgVVBEQVRFXzAocCkgcmFuZ2UgPSBib3VuZDsgKihwKSA9IChDUHJvYikodHR0ICsgKChrQml0TW9kZWxUb3RhbCAtIHR0dCkgPj4ga051bU1vdmVCaXRzKSk7IE5PUk1BTElaRTsNCisjZGVmaW5lIFVQREFURV8xKHApIHJhbmdlIC09IGJvdW5kOyBjb2RlIC09IGJvdW5kOyAqKHApID0gKENQcm9iKSh0dHQgLSAodHR0ID4+IGtOdW1Nb3ZlQml0cykpOyBOT1JNQUxJWkU7DQorDQoraW50IEJjajJfRGVjb2RlKA0KKyAgICBjb25zdCBCeXRlICpidWYwLCBTaXplVCBzaXplMCwNCisgICAgY29uc3QgQnl0ZSAqYnVmMSwgU2l6ZVQgc2l6ZTEsDQorICAgIGNvbnN0IEJ5dGUgKmJ1ZjIsIFNpemVUIHNpemUyLA0KKyAgICBjb25zdCBCeXRlICpidWYzLCBTaXplVCBzaXplMywNCisgICAgQnl0ZSAqb3V0QnVmLCBTaXplVCBvdXRTaXplKQ0KK3sNCisgIENQcm9iIHBbMjU2ICsgMl07DQorICBTaXplVCBpblBvcyA9IDAsIG91dFBvcyA9IDA7DQorDQorICBjb25zdCBCeXRlICpidWZmZXIsICpidWZmZXJMaW07DQorICBVSW50MzIgcmFuZ2UsIGNvZGU7DQorICBCeXRlIHByZXZCeXRlID0gMDsNCisNCisgIHVuc2lnbmVkIGludCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihwKSAvIHNpemVvZihwWzBdKTsgaSsrKQ0KKyAgICBwW2ldID0ga0JpdE1vZGVsVG90YWwgPj4gMTsNCisNCisgIGJ1ZmZlciA9IGJ1ZjM7DQorICBidWZmZXJMaW0gPSBidWZmZXIgKyBzaXplMzsNCisgIFJDX0lOSVQyDQorDQorICBpZiAob3V0U2l6ZSA9PSAwKQ0KKyAgICByZXR1cm4gU1pfT0s7DQorDQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBCeXRlIGI7DQorICAgIENQcm9iICpwcm9iOw0KKyAgICBVSW50MzIgYm91bmQ7DQorICAgIFVJbnQzMiB0dHQ7DQorDQorICAgIFNpemVUIGxpbWl0ID0gc2l6ZTAgLSBpblBvczsNCisgICAgaWYgKG91dFNpemUgLSBvdXRQb3MgPCBsaW1pdCkNCisgICAgICBsaW1pdCA9IG91dFNpemUgLSBvdXRQb3M7DQorICAgIHdoaWxlIChsaW1pdCAhPSAwKQ0KKyAgICB7DQorICAgICAgQnl0ZSBiID0gYnVmMFtpblBvc107DQorICAgICAgb3V0QnVmW291dFBvcysrXSA9IGI7DQorICAgICAgaWYgKElzSihwcmV2Qnl0ZSwgYikpDQorICAgICAgICBicmVhazsNCisgICAgICBpblBvcysrOw0KKyAgICAgIHByZXZCeXRlID0gYjsNCisgICAgICBsaW1pdC0tOw0KKyAgICB9DQorDQorICAgIGlmIChsaW1pdCA9PSAwIHx8IG91dFBvcyA9PSBvdXRTaXplKQ0KKyAgICAgIGJyZWFrOw0KKw0KKyAgICBiID0gYnVmMFtpblBvcysrXTsNCisNCisgICAgaWYgKGIgPT0gMHhFOCkNCisgICAgICBwcm9iID0gcCArIHByZXZCeXRlOw0KKyAgICBlbHNlIGlmIChiID09IDB4RTkpDQorICAgICAgcHJvYiA9IHAgKyAyNTY7DQorICAgIGVsc2UNCisgICAgICBwcm9iID0gcCArIDI1NzsNCisNCisgICAgSUZfQklUXzAocHJvYikNCisgICAgew0KKyAgICAgIFVQREFURV8wKHByb2IpDQorICAgICAgcHJldkJ5dGUgPSBiOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIFVJbnQzMiBkZXN0Ow0KKyAgICAgIGNvbnN0IEJ5dGUgKnY7DQorICAgICAgVVBEQVRFXzEocHJvYikNCisgICAgICBpZiAoYiA9PSAweEU4KQ0KKyAgICAgIHsNCisgICAgICAgIHYgPSBidWYxOw0KKyAgICAgICAgaWYgKHNpemUxIDwgNCkNCisgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX0RBVEE7DQorICAgICAgICBidWYxICs9IDQ7DQorICAgICAgICBzaXplMSAtPSA0Ow0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgdiA9IGJ1ZjI7DQorICAgICAgICBpZiAoc2l6ZTIgPCA0KQ0KKyAgICAgICAgICByZXR1cm4gU1pfRVJST1JfREFUQTsNCisgICAgICAgIGJ1ZjIgKz0gNDsNCisgICAgICAgIHNpemUyIC09IDQ7DQorICAgICAgfQ0KKyAgICAgIGRlc3QgPSAoKChVSW50MzIpdlswXSA8PCAyNCkgfCAoKFVJbnQzMil2WzFdIDw8IDE2KSB8DQorICAgICAgICAgICgoVUludDMyKXZbMl0gPDwgOCkgfCAoKFVJbnQzMil2WzNdKSkgLSAoKFVJbnQzMilvdXRQb3MgKyA0KTsNCisgICAgICBvdXRCdWZbb3V0UG9zKytdID0gKEJ5dGUpZGVzdDsNCisgICAgICBpZiAob3V0UG9zID09IG91dFNpemUpDQorICAgICAgICBicmVhazsNCisgICAgICBvdXRCdWZbb3V0UG9zKytdID0gKEJ5dGUpKGRlc3QgPj4gOCk7DQorICAgICAgaWYgKG91dFBvcyA9PSBvdXRTaXplKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgb3V0QnVmW291dFBvcysrXSA9IChCeXRlKShkZXN0ID4+IDE2KTsNCisgICAgICBpZiAob3V0UG9zID09IG91dFNpemUpDQorICAgICAgICBicmVhazsNCisgICAgICBvdXRCdWZbb3V0UG9zKytdID0gcHJldkJ5dGUgPSAoQnl0ZSkoZGVzdCA+PiAyNCk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAob3V0UG9zID09IG91dFNpemUpID8gU1pfT0sgOiBTWl9FUlJPUl9EQVRBOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0MvQmNqMi5oIGIvbHptYS9DL0JjajIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODMwNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL0JjajIuaApAQCAtMCwwICsxLDM0IEBACisvKiBCY2oyLmggLS0gQ29udmVydGVyIGZvciB4ODYgY29kZSAoQkNKMikNCisyMDEzLTAxLTE4IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2lmbmRlZiBfX0JDSjJfSA0KKyNkZWZpbmUgX19CQ0oyX0gNCisNCisjaW5jbHVkZSAiN3pUeXBlcy5oIg0KKw0KK0VYVEVSTl9DX0JFR0lODQorDQorLyoNCitDb25kaXRpb25zOg0KKyAgb3V0U2l6ZSA8PSBGdWxsT3V0cHV0U2l6ZSwNCisgIHdoZXJlIEZ1bGxPdXRwdXRTaXplIGlzIGZ1bGwgc2l6ZSBvZiBvdXRwdXQgc3RyZWFtIG9mIHg4Nl8yIGZpbHRlci4NCisNCitJZiBidWYwIG92ZXJsYXBzIG91dEJ1ZiwgdGhlcmUgYXJlIHR3byByZXF1aXJlZCBjb25kaXRpb25zOg0KKyAgMSkgKGJ1ZjAgPj0gb3V0QnVmKQ0KKyAgMikgKGJ1ZjAgKyBzaXplMCA+PSBvdXRCdWYgKyBGdWxsT3V0cHV0U2l6ZSkuDQorDQorUmV0dXJuczoNCisgIFNaX09LDQorICBTWl9FUlJPUl9EQVRBIC0gRGF0YSBlcnJvcg0KKyovDQorDQoraW50IEJjajJfRGVjb2RlKA0KKyAgICBjb25zdCBCeXRlICpidWYwLCBTaXplVCBzaXplMCwNCisgICAgY29uc3QgQnl0ZSAqYnVmMSwgU2l6ZVQgc2l6ZTEsDQorICAgIGNvbnN0IEJ5dGUgKmJ1ZjIsIFNpemVUIHNpemUyLA0KKyAgICBjb25zdCBCeXRlICpidWYzLCBTaXplVCBzaXplMywNCisgICAgQnl0ZSAqb3V0QnVmLCBTaXplVCBvdXRTaXplKTsNCisNCitFWFRFUk5fQ19FTkQNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0MvQnJhLmMgYi9sem1hL0MvQnJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2ODEwYwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9CcmEuYwpAQCAtMCwwICsxLDEzNSBAQAorLyogQnJhLmMgLS0gQ29udmVydGVycyBmb3IgUklTQyBjb2RlDQorMjAxMC0wNC0xNiA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlICJQcmVjb21wLmgiDQorDQorI2luY2x1ZGUgIkJyYS5oIg0KKw0KK1NpemVUIEFSTV9Db252ZXJ0KEJ5dGUgKmRhdGEsIFNpemVUIHNpemUsIFVJbnQzMiBpcCwgaW50IGVuY29kaW5nKQ0KK3sNCisgIFNpemVUIGk7DQorICBpZiAoc2l6ZSA8IDQpDQorICAgIHJldHVybiAwOw0KKyAgc2l6ZSAtPSA0Ow0KKyAgaXAgKz0gODsNCisgIGZvciAoaSA9IDA7IGkgPD0gc2l6ZTsgaSArPSA0KQ0KKyAgew0KKyAgICBpZiAoZGF0YVtpICsgM10gPT0gMHhFQikNCisgICAgew0KKyAgICAgIFVJbnQzMiBkZXN0Ow0KKyAgICAgIFVJbnQzMiBzcmMgPSAoKFVJbnQzMilkYXRhW2kgKyAyXSA8PCAxNikgfCAoKFVJbnQzMilkYXRhW2kgKyAxXSA8PCA4KSB8IChkYXRhW2kgKyAwXSk7DQorICAgICAgc3JjIDw8PSAyOw0KKyAgICAgIGlmIChlbmNvZGluZykNCisgICAgICAgIGRlc3QgPSBpcCArIChVSW50MzIpaSArIHNyYzsNCisgICAgICBlbHNlDQorICAgICAgICBkZXN0ID0gc3JjIC0gKGlwICsgKFVJbnQzMilpKTsNCisgICAgICBkZXN0ID4+PSAyOw0KKyAgICAgIGRhdGFbaSArIDJdID0gKEJ5dGUpKGRlc3QgPj4gMTYpOw0KKyAgICAgIGRhdGFbaSArIDFdID0gKEJ5dGUpKGRlc3QgPj4gOCk7DQorICAgICAgZGF0YVtpICsgMF0gPSAoQnl0ZSlkZXN0Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gaTsNCit9DQorDQorU2l6ZVQgQVJNVF9Db252ZXJ0KEJ5dGUgKmRhdGEsIFNpemVUIHNpemUsIFVJbnQzMiBpcCwgaW50IGVuY29kaW5nKQ0KK3sNCisgIFNpemVUIGk7DQorICBpZiAoc2l6ZSA8IDQpDQorICAgIHJldHVybiAwOw0KKyAgc2l6ZSAtPSA0Ow0KKyAgaXAgKz0gNDsNCisgIGZvciAoaSA9IDA7IGkgPD0gc2l6ZTsgaSArPSAyKQ0KKyAgew0KKyAgICBpZiAoKGRhdGFbaSArIDFdICYgMHhGOCkgPT0gMHhGMCAmJg0KKyAgICAgICAgKGRhdGFbaSArIDNdICYgMHhGOCkgPT0gMHhGOCkNCisgICAgew0KKyAgICAgIFVJbnQzMiBkZXN0Ow0KKyAgICAgIFVJbnQzMiBzcmMgPQ0KKyAgICAgICAgKCgoVUludDMyKWRhdGFbaSArIDFdICYgMHg3KSA8PCAxOSkgfA0KKyAgICAgICAgKChVSW50MzIpZGF0YVtpICsgMF0gPDwgMTEpIHwNCisgICAgICAgICgoKFVJbnQzMilkYXRhW2kgKyAzXSAmIDB4NykgPDwgOCkgfA0KKyAgICAgICAgKGRhdGFbaSArIDJdKTsNCisgICAgICANCisgICAgICBzcmMgPDw9IDE7DQorICAgICAgaWYgKGVuY29kaW5nKQ0KKyAgICAgICAgZGVzdCA9IGlwICsgKFVJbnQzMilpICsgc3JjOw0KKyAgICAgIGVsc2UNCisgICAgICAgIGRlc3QgPSBzcmMgLSAoaXAgKyAoVUludDMyKWkpOw0KKyAgICAgIGRlc3QgPj49IDE7DQorICAgICAgDQorICAgICAgZGF0YVtpICsgMV0gPSAoQnl0ZSkoMHhGMCB8ICgoZGVzdCA+PiAxOSkgJiAweDcpKTsNCisgICAgICBkYXRhW2kgKyAwXSA9IChCeXRlKShkZXN0ID4+IDExKTsNCisgICAgICBkYXRhW2kgKyAzXSA9IChCeXRlKSgweEY4IHwgKChkZXN0ID4+IDgpICYgMHg3KSk7DQorICAgICAgZGF0YVtpICsgMl0gPSAoQnl0ZSlkZXN0Ow0KKyAgICAgIGkgKz0gMjsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGk7DQorfQ0KKw0KK1NpemVUIFBQQ19Db252ZXJ0KEJ5dGUgKmRhdGEsIFNpemVUIHNpemUsIFVJbnQzMiBpcCwgaW50IGVuY29kaW5nKQ0KK3sNCisgIFNpemVUIGk7DQorICBpZiAoc2l6ZSA8IDQpDQorICAgIHJldHVybiAwOw0KKyAgc2l6ZSAtPSA0Ow0KKyAgZm9yIChpID0gMDsgaSA8PSBzaXplOyBpICs9IDQpDQorICB7DQorICAgIGlmICgoZGF0YVtpXSA+PiAyKSA9PSAweDEyICYmIChkYXRhW2kgKyAzXSAmIDMpID09IDEpDQorICAgIHsNCisgICAgICBVSW50MzIgc3JjID0gKChVSW50MzIpKGRhdGFbaSArIDBdICYgMykgPDwgMjQpIHwNCisgICAgICAgICgoVUludDMyKWRhdGFbaSArIDFdIDw8IDE2KSB8DQorICAgICAgICAoKFVJbnQzMilkYXRhW2kgKyAyXSA8PCA4KSB8DQorICAgICAgICAoKFVJbnQzMilkYXRhW2kgKyAzXSAmICh+MykpOw0KKyAgICAgIA0KKyAgICAgIFVJbnQzMiBkZXN0Ow0KKyAgICAgIGlmIChlbmNvZGluZykNCisgICAgICAgIGRlc3QgPSBpcCArIChVSW50MzIpaSArIHNyYzsNCisgICAgICBlbHNlDQorICAgICAgICBkZXN0ID0gc3JjIC0gKGlwICsgKFVJbnQzMilpKTsNCisgICAgICBkYXRhW2kgKyAwXSA9IChCeXRlKSgweDQ4IHwgKChkZXN0ID4+IDI0KSAmICAweDMpKTsNCisgICAgICBkYXRhW2kgKyAxXSA9IChCeXRlKShkZXN0ID4+IDE2KTsNCisgICAgICBkYXRhW2kgKyAyXSA9IChCeXRlKShkZXN0ID4+IDgpOw0KKyAgICAgIGRhdGFbaSArIDNdICY9IDB4MzsNCisgICAgICBkYXRhW2kgKyAzXSB8PSBkZXN0Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gaTsNCit9DQorDQorU2l6ZVQgU1BBUkNfQ29udmVydChCeXRlICpkYXRhLCBTaXplVCBzaXplLCBVSW50MzIgaXAsIGludCBlbmNvZGluZykNCit7DQorICBVSW50MzIgaTsNCisgIGlmIChzaXplIDwgNCkNCisgICAgcmV0dXJuIDA7DQorICBzaXplIC09IDQ7DQorICBmb3IgKGkgPSAwOyBpIDw9IHNpemU7IGkgKz0gNCkNCisgIHsNCisgICAgaWYgKChkYXRhW2ldID09IDB4NDAgJiYgKGRhdGFbaSArIDFdICYgMHhDMCkgPT0gMHgwMCkgfHwNCisgICAgICAgIChkYXRhW2ldID09IDB4N0YgJiYgKGRhdGFbaSArIDFdICYgMHhDMCkgPT0gMHhDMCkpDQorICAgIHsNCisgICAgICBVSW50MzIgc3JjID0NCisgICAgICAgICgoVUludDMyKWRhdGFbaSArIDBdIDw8IDI0KSB8DQorICAgICAgICAoKFVJbnQzMilkYXRhW2kgKyAxXSA8PCAxNikgfA0KKyAgICAgICAgKChVSW50MzIpZGF0YVtpICsgMl0gPDwgOCkgfA0KKyAgICAgICAgKChVSW50MzIpZGF0YVtpICsgM10pOw0KKyAgICAgIFVJbnQzMiBkZXN0Ow0KKyAgICAgIA0KKyAgICAgIHNyYyA8PD0gMjsNCisgICAgICBpZiAoZW5jb2RpbmcpDQorICAgICAgICBkZXN0ID0gaXAgKyBpICsgc3JjOw0KKyAgICAgIGVsc2UNCisgICAgICAgIGRlc3QgPSBzcmMgLSAoaXAgKyBpKTsNCisgICAgICBkZXN0ID4+PSAyOw0KKyAgICAgIA0KKyAgICAgIGRlc3QgPSAoKCgwIC0gKChkZXN0ID4+IDIyKSAmIDEpKSA8PCAyMikgJiAweDNGRkZGRkZGKSB8IChkZXN0ICYgMHgzRkZGRkYpIHwgMHg0MDAwMDAwMDsNCisNCisgICAgICBkYXRhW2kgKyAwXSA9IChCeXRlKShkZXN0ID4+IDI0KTsNCisgICAgICBkYXRhW2kgKyAxXSA9IChCeXRlKShkZXN0ID4+IDE2KTsNCisgICAgICBkYXRhW2kgKyAyXSA9IChCeXRlKShkZXN0ID4+IDgpOw0KKyAgICAgIGRhdGFbaSArIDNdID0gKEJ5dGUpZGVzdDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGk7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9CcmEuaCBiL2x6bWEvQy9CcmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmE4ZGNlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL0JyYS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qIEJyYS5oIC0tIEJyYW5jaCBjb252ZXJ0ZXJzIGZvciBleGVjdXRhYmxlcw0KKzIwMTMtMDEtMTggOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaWZuZGVmIF9fQlJBX0gNCisjZGVmaW5lIF9fQlJBX0gNCisNCisjaW5jbHVkZSAiN3pUeXBlcy5oIg0KKw0KK0VYVEVSTl9DX0JFR0lODQorDQorLyoNCitUaGVzZSBmdW5jdGlvbnMgY29udmVydCByZWxhdGl2ZSBhZGRyZXNzZXMgdG8gYWJzb2x1dGUgYWRkcmVzc2VzDQoraW4gQ0FMTCBpbnN0cnVjdGlvbnMgdG8gaW5jcmVhc2UgdGhlIGNvbXByZXNzaW9uIHJhdGlvLg0KKyAgDQorICBJbjoNCisgICAgZGF0YSAgICAgLSBkYXRhIGJ1ZmZlcg0KKyAgICBzaXplICAgICAtIHNpemUgb2YgZGF0YQ0KKyAgICBpcCAgICAgICAtIGN1cnJlbnQgdmlydHVhbCBJbnN0cnVjdGlvbiBQaW50ZXIgKElQKSB2YWx1ZQ0KKyAgICBzdGF0ZSAgICAtIHN0YXRlIHZhcmlhYmxlIGZvciB4ODYgY29udmVydGVyDQorICAgIGVuY29kaW5nIC0gMCAoZm9yIGRlY29kaW5nKSwgMSAoZm9yIGVuY29kaW5nKQ0KKyAgDQorICBPdXQ6DQorICAgIHN0YXRlICAgIC0gc3RhdGUgdmFyaWFibGUgZm9yIHg4NiBjb252ZXJ0ZXINCisNCisgIFJldHVybnM6DQorICAgIFRoZSBudW1iZXIgb2YgcHJvY2Vzc2VkIGJ5dGVzLiBJZiB5b3UgY2FsbCB0aGVzZSBmdW5jdGlvbnMgd2l0aCBtdWx0aXBsZSBjYWxscywNCisgICAgeW91IG11c3Qgc3RhcnQgbmV4dCBjYWxsIHdpdGggZmlyc3QgYnl0ZSBhZnRlciBibG9jayBvZiBwcm9jZXNzZWQgYnl0ZXMuDQorICANCisgIFR5cGUgICBFbmRpYW4gIEFsaWdubWVudCAgTG9va0FoZWFkDQorICANCisgIHg4NiAgICBsaXR0bGUgICAgICAxICAgICAgICAgIDQNCisgIEFSTVQgICBsaXR0bGUgICAgICAyICAgICAgICAgIDINCisgIEFSTSAgICBsaXR0bGUgICAgICA0ICAgICAgICAgIDANCisgIFBQQyAgICAgYmlnICAgICAgICA0ICAgICAgICAgIDANCisgIFNQQVJDICAgYmlnICAgICAgICA0ICAgICAgICAgIDANCisgIElBNjQgICBsaXR0bGUgICAgIDE2ICAgICAgICAgIDANCisNCisgIHNpemUgbXVzdCBiZSA+PSBBbGlnbm1lbnQgKyBMb29rQWhlYWQsIGlmIGl0J3Mgbm90IGxhc3QgYmxvY2suDQorICBJZiAoc2l6ZSA8IEFsaWdubWVudCArIExvb2tBaGVhZCksIGNvbnZlcnRlciByZXR1cm5zIDAuDQorDQorICBFeGFtcGxlOg0KKw0KKyAgICBVSW50MzIgaXAgPSAwOw0KKyAgICBmb3IgKCkNCisgICAgew0KKyAgICAgIDsgc2l6ZSBtdXN0IGJlID49IEFsaWdubWVudCArIExvb2tBaGVhZCwgaWYgaXQncyBub3QgbGFzdCBibG9jaw0KKyAgICAgIFNpemVUIHByb2Nlc3NlZCA9IENvbnZlcnQoZGF0YSwgc2l6ZSwgaXAsIDEpOw0KKyAgICAgIGRhdGEgKz0gcHJvY2Vzc2VkOw0KKyAgICAgIHNpemUgLT0gcHJvY2Vzc2VkOw0KKyAgICAgIGlwICs9IHByb2Nlc3NlZDsNCisgICAgfQ0KKyovDQorDQorI2RlZmluZSB4ODZfQ29udmVydF9Jbml0KHN0YXRlKSB7IHN0YXRlID0gMDsgfQ0KK1NpemVUIHg4Nl9Db252ZXJ0KEJ5dGUgKmRhdGEsIFNpemVUIHNpemUsIFVJbnQzMiBpcCwgVUludDMyICpzdGF0ZSwgaW50IGVuY29kaW5nKTsNCitTaXplVCBBUk1fQ29udmVydChCeXRlICpkYXRhLCBTaXplVCBzaXplLCBVSW50MzIgaXAsIGludCBlbmNvZGluZyk7DQorU2l6ZVQgQVJNVF9Db252ZXJ0KEJ5dGUgKmRhdGEsIFNpemVUIHNpemUsIFVJbnQzMiBpcCwgaW50IGVuY29kaW5nKTsNCitTaXplVCBQUENfQ29udmVydChCeXRlICpkYXRhLCBTaXplVCBzaXplLCBVSW50MzIgaXAsIGludCBlbmNvZGluZyk7DQorU2l6ZVQgU1BBUkNfQ29udmVydChCeXRlICpkYXRhLCBTaXplVCBzaXplLCBVSW50MzIgaXAsIGludCBlbmNvZGluZyk7DQorU2l6ZVQgSUE2NF9Db252ZXJ0KEJ5dGUgKmRhdGEsIFNpemVUIHNpemUsIFVJbnQzMiBpcCwgaW50IGVuY29kaW5nKTsNCisNCitFWFRFUk5fQ19FTkQNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0MvQnJhODYuYyBiL2x6bWEvQy9CcmE4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDNlZDQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvQnJhODYuYwpAQCAtMCwwICsxLDgyIEBACisvKiBCcmE4Ni5jIC0tIENvbnZlcnRlciBmb3IgeDg2IGNvZGUgKEJDSikNCisyMDEzLTExLTEyIDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSAiQnJhLmgiDQorDQorI2RlZmluZSBUZXN0ODZNU0J5dGUoYikgKCgoKGIpICsgMSkgJiAweEZFKSA9PSAwKQ0KKw0KK1NpemVUIHg4Nl9Db252ZXJ0KEJ5dGUgKmRhdGEsIFNpemVUIHNpemUsIFVJbnQzMiBpcCwgVUludDMyICpzdGF0ZSwgaW50IGVuY29kaW5nKQ0KK3sNCisgIFNpemVUIHBvcyA9IDA7DQorICBVSW50MzIgbWFzayA9ICpzdGF0ZSAmIDc7DQorICBpZiAoc2l6ZSA8IDUpDQorICAgIHJldHVybiAwOw0KKyAgc2l6ZSAtPSA0Ow0KKyAgaXAgKz0gNTsNCisNCisgIGZvciAoOzspDQorICB7DQorICAgIEJ5dGUgKnAgPSBkYXRhICsgcG9zOw0KKyAgICBjb25zdCBCeXRlICpsaW1pdCA9IGRhdGEgKyBzaXplOw0KKyAgICBmb3IgKDsgcCA8IGxpbWl0OyBwKyspDQorICAgICAgaWYgKCgqcCAmIDB4RkUpID09IDB4RTgpDQorICAgICAgICBicmVhazsNCisNCisgICAgew0KKyAgICAgIFNpemVUIGQgPSAoU2l6ZVQpKHAgLSBkYXRhIC0gcG9zKTsNCisgICAgICBwb3MgPSAoU2l6ZVQpKHAgLSBkYXRhKTsNCisgICAgICBpZiAocCA+PSBsaW1pdCkNCisgICAgICB7DQorICAgICAgICAqc3RhdGUgPSAoZCA+IDIgPyAwIDogbWFzayA+PiAodW5zaWduZWQpZCk7DQorICAgICAgICByZXR1cm4gcG9zOw0KKyAgICAgIH0NCisgICAgICBpZiAoZCA+IDIpDQorICAgICAgICBtYXNrID0gMDsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgbWFzayA+Pj0gKHVuc2lnbmVkKWQ7DQorICAgICAgICBpZiAobWFzayAhPSAwICYmIChtYXNrID4gNCB8fCBtYXNrID09IDMgfHwgVGVzdDg2TVNCeXRlKHBbKG1hc2sgPj4gMSkgKyAxXSkpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBtYXNrID0gKG1hc2sgPj4gMSkgfCA0Ow0KKyAgICAgICAgICBwb3MrKzsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIGlmIChUZXN0ODZNU0J5dGUocFs0XSkpDQorICAgIHsNCisgICAgICBVSW50MzIgdiA9ICgoVUludDMyKXBbNF0gPDwgMjQpIHwgKChVSW50MzIpcFszXSA8PCAxNikgfCAoKFVJbnQzMilwWzJdIDw8IDgpIHwgKChVSW50MzIpcFsxXSk7DQorICAgICAgVUludDMyIGN1ciA9IGlwICsgKFVJbnQzMilwb3M7DQorICAgICAgcG9zICs9IDU7DQorICAgICAgaWYgKGVuY29kaW5nKQ0KKyAgICAgICAgdiArPSBjdXI7DQorICAgICAgZWxzZQ0KKyAgICAgICAgdiAtPSBjdXI7DQorICAgICAgaWYgKG1hc2sgIT0gMCkNCisgICAgICB7DQorICAgICAgICB1bnNpZ25lZCBzaCA9IChtYXNrICYgNikgPDwgMjsNCisgICAgICAgIGlmIChUZXN0ODZNU0J5dGUoKEJ5dGUpKHYgPj4gc2gpKSkNCisgICAgICAgIHsNCisgICAgICAgICAgdiBePSAoKChVSW50MzIpMHgxMDAgPDwgc2gpIC0gMSk7DQorICAgICAgICAgIGlmIChlbmNvZGluZykNCisgICAgICAgICAgICB2ICs9IGN1cjsNCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHYgLT0gY3VyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbWFzayA9IDA7DQorICAgICAgfQ0KKyAgICAgIHBbMV0gPSAoQnl0ZSl2Ow0KKyAgICAgIHBbMl0gPSAoQnl0ZSkodiA+PiA4KTsNCisgICAgICBwWzNdID0gKEJ5dGUpKHYgPj4gMTYpOw0KKyAgICAgIHBbNF0gPSAoQnl0ZSkoMCAtICgodiA+PiAyNCkgJiAxKSk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgbWFzayA9IChtYXNrID4+IDEpIHwgNDsNCisgICAgICBwb3MrKzsNCisgICAgfQ0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9sem1hL0MvQnJhSUE2NC5jIGIvbHptYS9DL0JyYUlBNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTM4MzBjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL0JyYUlBNjQuYwpAQCAtMCwwICsxLDY5IEBACisvKiBCcmFJQTY0LmMgLS0gQ29udmVydGVyIGZvciBJQS02NCBjb2RlDQorMjAxMy0xMS0xMiA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlICJQcmVjb21wLmgiDQorDQorI2luY2x1ZGUgIkJyYS5oIg0KKw0KK3N0YXRpYyBjb25zdCBCeXRlIGtCcmFuY2hUYWJsZVszMl0gPQ0KK3sNCisgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsDQorICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KKyAgNCwgNCwgNiwgNiwgMCwgMCwgNywgNywNCisgIDQsIDQsIDAsIDAsIDQsIDQsIDAsIDANCit9Ow0KKw0KK1NpemVUIElBNjRfQ29udmVydChCeXRlICpkYXRhLCBTaXplVCBzaXplLCBVSW50MzIgaXAsIGludCBlbmNvZGluZykNCit7DQorICBTaXplVCBpOw0KKyAgaWYgKHNpemUgPCAxNikNCisgICAgcmV0dXJuIDA7DQorICBzaXplIC09IDE2Ow0KKyAgZm9yIChpID0gMDsgaSA8PSBzaXplOyBpICs9IDE2KQ0KKyAgew0KKyAgICBVSW50MzIgaW5zdHJUZW1wbGF0ZSA9IGRhdGFbaV0gJiAweDFGOw0KKyAgICBVSW50MzIgbWFzayA9IGtCcmFuY2hUYWJsZVtpbnN0clRlbXBsYXRlXTsNCisgICAgVUludDMyIGJpdFBvcyA9IDU7DQorICAgIGludCBzbG90Ow0KKyAgICBmb3IgKHNsb3QgPSAwOyBzbG90IDwgMzsgc2xvdCsrLCBiaXRQb3MgKz0gNDEpDQorICAgIHsNCisgICAgICBVSW50MzIgYnl0ZVBvcywgYml0UmVzOw0KKyAgICAgIFVJbnQ2NCBpbnN0cnVjdGlvbiwgaW5zdE5vcm07DQorICAgICAgaW50IGo7DQorICAgICAgaWYgKCgobWFzayA+PiBzbG90KSAmIDEpID09IDApDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBieXRlUG9zID0gKGJpdFBvcyA+PiAzKTsNCisgICAgICBiaXRSZXMgPSBiaXRQb3MgJiAweDc7DQorICAgICAgaW5zdHJ1Y3Rpb24gPSAwOw0KKyAgICAgIGZvciAoaiA9IDA7IGogPCA2OyBqKyspDQorICAgICAgICBpbnN0cnVjdGlvbiArPSAoVUludDY0KWRhdGFbaSArIGogKyBieXRlUG9zXSA8PCAoOCAqIGopOw0KKw0KKyAgICAgIGluc3ROb3JtID0gaW5zdHJ1Y3Rpb24gPj4gYml0UmVzOw0KKyAgICAgIGlmICgoKGluc3ROb3JtID4+IDM3KSAmIDB4RikgPT0gMHg1ICYmICgoaW5zdE5vcm0gPj4gOSkgJiAweDcpID09IDApDQorICAgICAgew0KKyAgICAgICAgVUludDMyIHNyYyA9IChVSW50MzIpKChpbnN0Tm9ybSA+PiAxMykgJiAweEZGRkZGKTsNCisgICAgICAgIFVJbnQzMiBkZXN0Ow0KKyAgICAgICAgc3JjIHw9ICgoVUludDMyKShpbnN0Tm9ybSA+PiAzNikgJiAxKSA8PCAyMDsNCisgICAgICAgIA0KKyAgICAgICAgc3JjIDw8PSA0Ow0KKyAgICAgICAgDQorICAgICAgICBpZiAoZW5jb2RpbmcpDQorICAgICAgICAgIGRlc3QgPSBpcCArIChVSW50MzIpaSArIHNyYzsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgZGVzdCA9IHNyYyAtIChpcCArIChVSW50MzIpaSk7DQorICAgICAgICANCisgICAgICAgIGRlc3QgPj49IDQ7DQorICAgICAgICANCisgICAgICAgIGluc3ROb3JtICY9IH4oKFVJbnQ2NCkoMHg4RkZGRkYpIDw8IDEzKTsNCisgICAgICAgIGluc3ROb3JtIHw9ICgoVUludDY0KShkZXN0ICYgMHhGRkZGRikgPDwgMTMpOw0KKyAgICAgICAgaW5zdE5vcm0gfD0gKChVSW50NjQpKGRlc3QgJiAweDEwMDAwMCkgPDwgKDM2IC0gMjApKTsNCisgICAgICAgIA0KKyAgICAgICAgaW5zdHJ1Y3Rpb24gJj0gKDEgPDwgYml0UmVzKSAtIDE7DQorICAgICAgICBpbnN0cnVjdGlvbiB8PSAoaW5zdE5vcm0gPDwgYml0UmVzKTsNCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA2OyBqKyspDQorICAgICAgICAgIGRhdGFbaSArIGogKyBieXRlUG9zXSA9IChCeXRlKShpbnN0cnVjdGlvbiA+PiAoOCAqIGopKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0MvQ29tcGlsZXIuaCBiL2x6bWEvQy9Db21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzY2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvQ29tcGlsZXIuaApAQCAtMCwwICsxLDI4IEBACisvKiBDb21waWxlci5oIC0tIENvbXBpbGVyIHlwZXMNCisyMDEzLTExLTEyIDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2lmbmRlZiBfXzdaX0NPTVBJTEVSX0gNCisjZGVmaW5lIF9fN1pfQ09NUElMRVJfSA0KKw0KKyNpZmRlZiBfTVNDX1ZFUg0KKw0KKyAgI2lmZGVmIFVOREVSX0NFDQorICAgICNkZWZpbmUgUlBDX05PX1dJTkRPV1NfSA0KKyAgICAvKiAjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQxMTUpIC8vICdfUlBDX0FTWU5DX1NUQVRFJyA6IG5hbWVkIHR5cGUgZGVmaW5pdGlvbiBpbiBwYXJlbnRoZXNlcyAqLw0KKyAgICAjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQyMDEpIC8vIG5vbnN0YW5kYXJkIGV4dGVuc2lvbiB1c2VkIDogbmFtZWxlc3Mgc3RydWN0L3VuaW9uDQorICAgICNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDIxNCkgLy8gbm9uc3RhbmRhcmQgZXh0ZW5zaW9uIHVzZWQgOiBiaXQgZmllbGQgdHlwZXMgb3RoZXIgdGhhbiBpbnQNCisgICNlbmRpZg0KKw0KKyAgI2lmIF9NU0NfVkVSID49IDEzMDANCisgICAgI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0OTk2KSAvLyBUaGlzIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIG1heSBiZSB1bnNhZmUNCisgICNlbHNlDQorICAgICNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDUxMSkgLy8gY29weSBjb25zdHJ1Y3RvciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkDQorICAgICNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDUxMikgLy8gYXNzaWdubWVudCBvcGVyYXRvciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkDQorICAgICNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDcwMikgLy8gdW5yZWFjaGFibGUgY29kZQ0KKyAgICAjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ3MTApIC8vIG5vdCBpbmxpbmVkDQorICAgICNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDc4NikgLy8gaWRlbnRpZmllciB3YXMgdHJ1bmNhdGVkIHRvICcyNTUnIGNoYXJhY3RlcnMgaW4gdGhlIGRlYnVnIGluZm9ybWF0aW9uDQorICAjZW5kaWYNCisNCisjZW5kaWYNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0MvQ3B1QXJjaC5jIGIvbHptYS9DL0NwdUFyY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGFjMGMyCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL0NwdUFyY2guYwpAQCAtMCwwICsxLDE5MCBAQAorLyogQ3B1QXJjaC5jIC0tIENQVSBzcGVjaWZpYyBjb2RlDQorMjAxMi0wNS0yOTogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSAiQ3B1QXJjaC5oIg0KKw0KKyNpZmRlZiBNWV9DUFVfWDg2X09SX0FNRDY0DQorDQorI2lmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChNWV9DUFVfQU1ENjQpKSB8fCBkZWZpbmVkKF9fR05VQ19fKQ0KKyNkZWZpbmUgVVNFX0FTTQ0KKyNlbmRpZg0KKw0KKyNpZiAhZGVmaW5lZChVU0VfQVNNKSAmJiBfTVNDX1ZFUiA+PSAxNTAwDQorI2luY2x1ZGUgPGludHJpbi5oPg0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFVTRV9BU00pICYmICFkZWZpbmVkKE1ZX0NQVV9BTUQ2NCkNCitzdGF0aWMgVUludDMyIENoZWNrRmxhZyhVSW50MzIgZmxhZykNCit7DQorICAjaWZkZWYgX01TQ19WRVINCisgIF9fYXNtIHB1c2hmZDsNCisgIF9fYXNtIHBvcCBFQVg7DQorICBfX2FzbSBtb3YgRURYLCBFQVg7DQorICBfX2FzbSB4b3IgRUFYLCBmbGFnOw0KKyAgX19hc20gcHVzaCBFQVg7DQorICBfX2FzbSBwb3BmZDsNCisgIF9fYXNtIHB1c2hmZDsNCisgIF9fYXNtIHBvcCBFQVg7DQorICBfX2FzbSB4b3IgRUFYLCBFRFg7DQorICBfX2FzbSBwdXNoIEVEWDsNCisgIF9fYXNtIHBvcGZkOw0KKyAgX19hc20gYW5kIGZsYWcsIEVBWDsNCisgICNlbHNlDQorICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoDQorICAgICJwdXNoZlxuXHQiDQorICAgICJwb3AgICUlRUFYXG5cdCINCisgICAgIm1vdmwgJSVFQVgsJSVFRFhcblx0Ig0KKyAgICAieG9ybCAlMCwlJUVBWFxuXHQiDQorICAgICJwdXNoICUlRUFYXG5cdCINCisgICAgInBvcGZcblx0Ig0KKyAgICAicHVzaGZcblx0Ig0KKyAgICAicG9wICAlJUVBWFxuXHQiDQorICAgICJ4b3JsICUlRURYLCUlRUFYXG5cdCINCisgICAgInB1c2ggJSVFRFhcblx0Ig0KKyAgICAicG9wZlxuXHQiDQorICAgICJhbmRsICUlRUFYLCAlMFxuXHQiOg0KKyAgICAiPWMiIChmbGFnKSA6ICJjIiAoZmxhZykpOw0KKyAgI2VuZGlmDQorICByZXR1cm4gZmxhZzsNCit9DQorI2RlZmluZSBDSEVDS19DUFVJRF9JU19TVVBQT1JURUQgaWYgKENoZWNrRmxhZygxIDw8IDE4KSA9PSAwIHx8IENoZWNrRmxhZygxIDw8IDIxKSA9PSAwKSByZXR1cm4gRmFsc2U7DQorI2Vsc2UNCisjZGVmaW5lIENIRUNLX0NQVUlEX0lTX1NVUFBPUlRFRA0KKyNlbmRpZg0KKw0KK3N0YXRpYyB2b2lkIE15Q1BVSUQoVUludDMyIGZ1bmN0aW9uLCBVSW50MzIgKmEsIFVJbnQzMiAqYiwgVUludDMyICpjLCBVSW50MzIgKmQpDQorew0KKyAgI2lmZGVmIFVTRV9BU00NCisNCisgICNpZmRlZiBfTVNDX1ZFUg0KKw0KKyAgVUludDMyIGEyLCBiMiwgYzIsIGQyOw0KKyAgX19hc20geG9yIEVCWCwgRUJYOw0KKyAgX19hc20geG9yIEVDWCwgRUNYOw0KKyAgX19hc20geG9yIEVEWCwgRURYOw0KKyAgX19hc20gbW92IEVBWCwgZnVuY3Rpb247DQorICBfX2FzbSBjcHVpZDsNCisgIF9fYXNtIG1vdiBhMiwgRUFYOw0KKyAgX19hc20gbW92IGIyLCBFQlg7DQorICBfX2FzbSBtb3YgYzIsIEVDWDsNCisgIF9fYXNtIG1vdiBkMiwgRURYOw0KKw0KKyAgKmEgPSBhMjsNCisgICpiID0gYjI7DQorICAqYyA9IGMyOw0KKyAgKmQgPSBkMjsNCisNCisgICNlbHNlDQorDQorICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoDQorICAjaWYgZGVmaW5lZChNWV9DUFVfWDg2KSAmJiBkZWZpbmVkKF9fUElDX18pDQorICAgICJtb3YgJSVlYngsICUlZWRpOyINCisgICAgImNwdWlkOyINCisgICAgInhjaGdsICUlZWJ4LCAlJWVkaTsiDQorICAgIDogIj1hIiAoKmEpICwNCisgICAgICAiPUQiICgqYikgLA0KKyAgI2Vsc2UNCisgICAgImNwdWlkIg0KKyAgICA6ICI9YSIgKCphKSAsDQorICAgICAgIj1iIiAoKmIpICwNCisgICNlbmRpZg0KKyAgICAgICI9YyIgKCpjKSAsDQorICAgICAgIj1kIiAoKmQpDQorICAgIDogIjAiIChmdW5jdGlvbikpIDsNCisNCisgICNlbmRpZg0KKyAgDQorICAjZWxzZQ0KKw0KKyAgaW50IENQVUluZm9bNF07DQorICBfX2NwdWlkKENQVUluZm8sIGZ1bmN0aW9uKTsNCisgICphID0gQ1BVSW5mb1swXTsNCisgICpiID0gQ1BVSW5mb1sxXTsNCisgICpjID0gQ1BVSW5mb1syXTsNCisgICpkID0gQ1BVSW5mb1szXTsNCisNCisgICNlbmRpZg0KK30NCisNCitCb29sIHg4NmNwdWlkX0NoZWNrQW5kUmVhZChDeDg2Y3B1aWQgKnApDQorew0KKyAgQ0hFQ0tfQ1BVSURfSVNfU1VQUE9SVEVEDQorICBNeUNQVUlEKDAsICZwLT5tYXhGdW5jLCAmcC0+dmVuZG9yWzBdLCAmcC0+dmVuZG9yWzJdLCAmcC0+dmVuZG9yWzFdKTsNCisgIE15Q1BVSUQoMSwgJnAtPnZlciwgJnAtPmIsICZwLT5jLCAmcC0+ZCk7DQorICByZXR1cm4gVHJ1ZTsNCit9DQorDQorc3RhdGljIFVJbnQzMiBrVmVuZG9yc1tdWzNdID0NCit7DQorICB7IDB4NzU2RTY1NDcsIDB4NDk2NTZFNjksIDB4NkM2NTc0NkV9LA0KKyAgeyAweDY4NzQ3NTQxLCAweDY5NzQ2RTY1LCAweDQ0NEQ0MTYzfSwNCisgIHsgMHg3NDZFNjU0MywgMHg0ODcyNzU2MSwgMHg3MzZDNzU2MX0NCit9Ow0KKw0KK2ludCB4ODZjcHVpZF9HZXRGaXJtKGNvbnN0IEN4ODZjcHVpZCAqcCkNCit7DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihrVmVuZG9ycykgLyBzaXplb2Yoa1ZlbmRvcnNbaV0pOyBpKyspDQorICB7DQorICAgIGNvbnN0IFVJbnQzMiAqdiA9IGtWZW5kb3JzW2ldOw0KKyAgICBpZiAodlswXSA9PSBwLT52ZW5kb3JbMF0gJiYNCisgICAgICAgIHZbMV0gPT0gcC0+dmVuZG9yWzFdICYmDQorICAgICAgICB2WzJdID09IHAtPnZlbmRvclsyXSkNCisgICAgICByZXR1cm4gKGludClpOw0KKyAgfQ0KKyAgcmV0dXJuIC0xOw0KK30NCisNCitCb29sIENQVV9Jc19Jbk9yZGVyKCkNCit7DQorICBDeDg2Y3B1aWQgcDsNCisgIGludCBmaXJtOw0KKyAgVUludDMyIGZhbWlseSwgbW9kZWw7DQorICBpZiAoIXg4NmNwdWlkX0NoZWNrQW5kUmVhZCgmcCkpDQorICAgIHJldHVybiBUcnVlOw0KKyAgZmFtaWx5ID0geDg2Y3B1aWRfR2V0RmFtaWx5KCZwKTsNCisgIG1vZGVsID0geDg2Y3B1aWRfR2V0TW9kZWwoJnApOw0KKyAgZmlybSA9IHg4NmNwdWlkX0dldEZpcm0oJnApOw0KKyAgc3dpdGNoIChmaXJtKQ0KKyAgew0KKyAgICBjYXNlIENQVV9GSVJNX0lOVEVMOiByZXR1cm4gKGZhbWlseSA8IDYgfHwgKGZhbWlseSA9PSA2ICYmICgNCisgICAgICAgIC8qIEF0b20gQ1BVICovDQorICAgICAgICAgICBtb2RlbCA9PSAweDEwMEMgIC8qIDQ1IG5tLCBONHh4LCBENHh4LCBONXh4LCBENXh4LCAyMzAsIDMzMCAqLw0KKyAgICAgICAgfHwgbW9kZWwgPT0gMHgyMDA2ICAvKiA0NSBubSwgWjZ4eCAqLw0KKyAgICAgICAgfHwgbW9kZWwgPT0gMHgyMDA3ICAvKiAzMiBubSwgWjI0NjAgKi8NCisgICAgICAgIHx8IG1vZGVsID09IDB4MzAwNSAgLyogMzIgbm0sIFoyNzYwICovDQorICAgICAgICB8fCBtb2RlbCA9PSAweDMwMDYgIC8qIDMyIG5tLCBOMnh4eCwgRDJ4eHggKi8NCisgICAgICAgICkpKTsNCisgICAgY2FzZSBDUFVfRklSTV9BTUQ6IHJldHVybiAoZmFtaWx5IDwgNSB8fCAoZmFtaWx5ID09IDUgJiYgKG1vZGVsIDwgNiB8fCBtb2RlbCA9PSAweEEpKSk7DQorICAgIGNhc2UgQ1BVX0ZJUk1fVklBOiByZXR1cm4gKGZhbWlseSA8IDYgfHwgKGZhbWlseSA9PSA2ICYmIG1vZGVsIDwgMHhGKSk7DQorICB9DQorICByZXR1cm4gVHJ1ZTsNCit9DQorDQorI2lmICFkZWZpbmVkKE1ZX0NQVV9BTUQ2NCkgJiYgZGVmaW5lZChfV0lOMzIpDQorI2luY2x1ZGUgPHdpbmRvd3MuaD4NCitzdGF0aWMgQm9vbCBDUFVfU3lzX0lzX1NTRV9TdXBwb3J0ZWQoKQ0KK3sNCisgIE9TVkVSU0lPTklORk8gdmk7DQorICB2aS5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKHZpKTsNCisgIGlmICghR2V0VmVyc2lvbkV4KCZ2aSkpDQorICAgIHJldHVybiBGYWxzZTsNCisgIHJldHVybiAodmkuZHdNYWpvclZlcnNpb24gPj0gNSk7DQorfQ0KKyNkZWZpbmUgQ0hFQ0tfU1lTX1NTRV9TVVBQT1JUIGlmICghQ1BVX1N5c19Jc19TU0VfU3VwcG9ydGVkKCkpIHJldHVybiBGYWxzZTsNCisjZWxzZQ0KKyNkZWZpbmUgQ0hFQ0tfU1lTX1NTRV9TVVBQT1JUDQorI2VuZGlmDQorDQorQm9vbCBDUFVfSXNfQWVzX1N1cHBvcnRlZCgpDQorew0KKyAgQ3g4NmNwdWlkIHA7DQorICBDSEVDS19TWVNfU1NFX1NVUFBPUlQNCisgIGlmICgheDg2Y3B1aWRfQ2hlY2tBbmRSZWFkKCZwKSkNCisgICAgcmV0dXJuIEZhbHNlOw0KKyAgcmV0dXJuIChwLmMgPj4gMjUpICYgMTsNCit9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DL0NwdUFyY2guaCBiL2x6bWEvQy9DcHVBcmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxNjIwNQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9DcHVBcmNoLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qIENwdUFyY2guaCAtLSBDUFUgc3BlY2lmaWMgY29kZQ0KKzIwMTMtMTEtMTI6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpZm5kZWYgX19DUFVfQVJDSF9IDQorI2RlZmluZSBfX0NQVV9BUkNIX0gNCisNCisjaW5jbHVkZSAiN3pUeXBlcy5oIg0KKw0KK0VYVEVSTl9DX0JFR0lODQorDQorLyoNCitNWV9DUFVfTEUgbWVhbnMgdGhhdCBDUFUgaXMgTElUVExFIEVORElBTi4NCitJZiBNWV9DUFVfTEUgaXMgbm90IGRlZmluZWQsIHdlIGRvbid0IGtub3cgYWJvdXQgdGhhdCBwcm9wZXJ0eSBvZiBwbGF0Zm9ybSAoaXQgY2FuIGJlIExJVFRMRSBFTkRJQU4pLg0KKw0KK01ZX0NQVV9MRV9VTkFMSUdOIG1lYW5zIHRoYXQgQ1BVIGlzIExJVFRMRSBFTkRJQU4gYW5kIENQVSBzdXBwb3J0cyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzLg0KK0lmIE1ZX0NQVV9MRV9VTkFMSUdOIGlzIG5vdCBkZWZpbmVkLCB3ZSBkb24ndCBrbm93IGFib3V0IHRoZXNlIHByb3BlcnRpZXMgb2YgcGxhdGZvcm0uDQorKi8NCisNCisjaWYgZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fQU1ENjQpIHx8IGRlZmluZWQoX194ODZfNjRfXykNCisjZGVmaW5lIE1ZX0NQVV9BTUQ2NA0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKE1ZX0NQVV9BTUQ2NCkgfHwgZGVmaW5lZChfTV9JQTY0KQ0KKyNkZWZpbmUgTVlfQ1BVXzY0QklUDQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChfX2kzODZfXykNCisjZGVmaW5lIE1ZX0NQVV9YODYNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChNWV9DUFVfWDg2KSB8fCBkZWZpbmVkKE1ZX0NQVV9BTUQ2NCkNCisjZGVmaW5lIE1ZX0NQVV9YODZfT1JfQU1ENjQNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChNWV9DUFVfWDg2KSB8fCBkZWZpbmVkKF9NX0FSTSkNCisjZGVmaW5lIE1ZX0NQVV8zMkJJVA0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChfTV9BUk0pDQorI2RlZmluZSBNWV9DUFVfQVJNX0xFDQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKF9NX0lBNjQpDQorI2RlZmluZSBNWV9DUFVfSUE2NF9MRQ0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKE1ZX0NQVV9YODZfT1JfQU1ENjQpDQorI2RlZmluZSBNWV9DUFVfTEVfVU5BTElHTg0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKE1ZX0NQVV9YODZfT1JfQU1ENjQpIHx8IGRlZmluZWQoTVlfQ1BVX0FSTV9MRSkgIHx8IGRlZmluZWQoTVlfQ1BVX0lBNjRfTEUpIHx8IGRlZmluZWQoX19BUk1FTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMX18pIHx8IGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX18pDQorI2RlZmluZSBNWV9DUFVfTEUNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fXykgfHwgZGVmaW5lZChfX202OGtfXykgfHwgIGRlZmluZWQoX19BUk1FQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCX18pDQorI2RlZmluZSBNWV9DUFVfQkUNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChNWV9DUFVfTEUpICYmIGRlZmluZWQoTVlfQ1BVX0JFKQ0KK1N0b3BfQ29tcGlsaW5nX0JhZF9FbmRpYW4NCisjZW5kaWYNCisNCisjaWZkZWYgTVlfQ1BVX0xFX1VOQUxJR04NCisNCisjZGVmaW5lIEdldFVpMTYocCkgKCooY29uc3QgVUludDE2ICopKGNvbnN0IHZvaWQgKikocCkpDQorI2RlZmluZSBHZXRVaTMyKHApICgqKGNvbnN0IFVJbnQzMiAqKShjb25zdCB2b2lkICopKHApKQ0KKyNkZWZpbmUgR2V0VWk2NChwKSAoKihjb25zdCBVSW50NjQgKikoY29uc3Qgdm9pZCAqKShwKSkNCisjZGVmaW5lIFNldFVpMTYocCwgZCkgKihVSW50MTYgKikocCkgPSAoZCk7DQorI2RlZmluZSBTZXRVaTMyKHAsIGQpICooVUludDMyICopKHApID0gKGQpOw0KKyNkZWZpbmUgU2V0VWk2NChwLCBkKSAqKFVJbnQ2NCAqKShwKSA9IChkKTsNCisNCisjZWxzZQ0KKw0KKyNkZWZpbmUgR2V0VWkxNihwKSAoKChjb25zdCBCeXRlICopKHApKVswXSB8ICgoVUludDE2KSgoY29uc3QgQnl0ZSAqKShwKSlbMV0gPDwgOCkpDQorDQorI2RlZmluZSBHZXRVaTMyKHApICggXA0KKyAgICAgICAgICAgICAoKGNvbnN0IEJ5dGUgKikocCkpWzBdICAgICAgICB8IFwNCisgICAgKChVSW50MzIpKChjb25zdCBCeXRlICopKHApKVsxXSA8PCAgOCkgfCBcDQorICAgICgoVUludDMyKSgoY29uc3QgQnl0ZSAqKShwKSlbMl0gPDwgMTYpIHwgXA0KKyAgICAoKFVJbnQzMikoKGNvbnN0IEJ5dGUgKikocCkpWzNdIDw8IDI0KSkNCisNCisjZGVmaW5lIEdldFVpNjQocCkgKEdldFVpMzIocCkgfCAoKFVJbnQ2NClHZXRVaTMyKCgoY29uc3QgQnl0ZSAqKShwKSkgKyA0KSA8PCAzMikpDQorDQorI2RlZmluZSBTZXRVaTE2KHAsIGQpIHsgVUludDMyIF94XyA9IChkKTsgXA0KKyAgICAoKEJ5dGUgKikocCkpWzBdID0gKEJ5dGUpX3hfOyBcDQorICAgICgoQnl0ZSAqKShwKSlbMV0gPSAoQnl0ZSkoX3hfID4+IDgpOyB9DQorDQorI2RlZmluZSBTZXRVaTMyKHAsIGQpIHsgVUludDMyIF94XyA9IChkKTsgXA0KKyAgICAoKEJ5dGUgKikocCkpWzBdID0gKEJ5dGUpX3hfOyBcDQorICAgICgoQnl0ZSAqKShwKSlbMV0gPSAoQnl0ZSkoX3hfID4+IDgpOyBcDQorICAgICgoQnl0ZSAqKShwKSlbMl0gPSAoQnl0ZSkoX3hfID4+IDE2KTsgXA0KKyAgICAoKEJ5dGUgKikocCkpWzNdID0gKEJ5dGUpKF94XyA+PiAyNCk7IH0NCisNCisjZGVmaW5lIFNldFVpNjQocCwgZCkgeyBVSW50NjQgX3g2NF8gPSAoZCk7IFwNCisgICAgU2V0VWkzMihwLCAoVUludDMyKV94NjRfKTsgXA0KKyAgICBTZXRVaTMyKCgoQnl0ZSAqKShwKSkgKyA0LCAoVUludDMyKShfeDY0XyA+PiAzMikpOyB9DQorDQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoTVlfQ1BVX0xFX1VOQUxJR04pICYmIGRlZmluZWQoX1dJTjY0KSAmJiAoX01TQ19WRVIgPj0gMTMwMCkNCisNCisjaW5jbHVkZSA8c3RkbGliLmg+DQorDQorI3ByYWdtYSBpbnRyaW5zaWMoX2J5dGVzd2FwX3Vsb25nKQ0KKyNwcmFnbWEgaW50cmluc2ljKF9ieXRlc3dhcF91aW50NjQpDQorI2RlZmluZSBHZXRCZTMyKHApIF9ieXRlc3dhcF91bG9uZygqKGNvbnN0IFVJbnQzMiAqKShjb25zdCBCeXRlICopKHApKQ0KKyNkZWZpbmUgR2V0QmU2NChwKSBfYnl0ZXN3YXBfdWludDY0KCooY29uc3QgVUludDY0ICopKGNvbnN0IEJ5dGUgKikocCkpDQorDQorI2Vsc2UNCisNCisjZGVmaW5lIEdldEJlMzIocCkgKCBcDQorICAgICgoVUludDMyKSgoY29uc3QgQnl0ZSAqKShwKSlbMF0gPDwgMjQpIHwgXA0KKyAgICAoKFVJbnQzMikoKGNvbnN0IEJ5dGUgKikocCkpWzFdIDw8IDE2KSB8IFwNCisgICAgKChVSW50MzIpKChjb25zdCBCeXRlICopKHApKVsyXSA8PCAgOCkgfCBcDQorICAgICAgICAgICAgICgoY29uc3QgQnl0ZSAqKShwKSlbM10gKQ0KKw0KKyNkZWZpbmUgR2V0QmU2NChwKSAoKChVSW50NjQpR2V0QmUzMihwKSA8PCAzMikgfCBHZXRCZTMyKCgoY29uc3QgQnl0ZSAqKShwKSkgKyA0KSkNCisNCisjZW5kaWYNCisNCisjZGVmaW5lIEdldEJlMTYocCkgKChVSW50MTYpKCgoVUludDE2KSgoY29uc3QgQnl0ZSAqKShwKSlbMF0gPDwgOCkgfCAoKGNvbnN0IEJ5dGUgKikocCkpWzFdKSkNCisNCisNCisjaWZkZWYgTVlfQ1BVX1g4Nl9PUl9BTUQ2NA0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgVUludDMyIG1heEZ1bmM7DQorICBVSW50MzIgdmVuZG9yWzNdOw0KKyAgVUludDMyIHZlcjsNCisgIFVJbnQzMiBiOw0KKyAgVUludDMyIGM7DQorICBVSW50MzIgZDsNCit9IEN4ODZjcHVpZDsNCisNCitlbnVtDQorew0KKyAgQ1BVX0ZJUk1fSU5URUwsDQorICBDUFVfRklSTV9BTUQsDQorICBDUFVfRklSTV9WSUENCit9Ow0KKw0KK0Jvb2wgeDg2Y3B1aWRfQ2hlY2tBbmRSZWFkKEN4ODZjcHVpZCAqcCk7DQoraW50IHg4NmNwdWlkX0dldEZpcm0oY29uc3QgQ3g4NmNwdWlkICpwKTsNCisNCisjZGVmaW5lIHg4NmNwdWlkX0dldEZhbWlseShwKSAoKChwKS0+dmVyID4+IDgpICYgMHhGRjAwRikNCisjZGVmaW5lIHg4NmNwdWlkX0dldE1vZGVsKHApICgoKHApLT52ZXIgPj4gNCkgJiAweEYwMEYpDQorI2RlZmluZSB4ODZjcHVpZF9HZXRTdGVwcGluZyhwKSAoKHApLT52ZXIgJiAweEYpDQorDQorQm9vbCBDUFVfSXNfSW5PcmRlcigpOw0KK0Jvb2wgQ1BVX0lzX0Flc19TdXBwb3J0ZWQoKTsNCisNCisjZW5kaWYNCisNCitFWFRFUk5fQ19FTkQNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0MvRGVsdGEuYyBiL2x6bWEvQy9EZWx0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmJlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvRGVsdGEuYwpAQCAtMCwwICsxLDY0IEBACisvKiBEZWx0YS5jIC0tIERlbHRhIGNvbnZlcnRlcg0KKzIwMDktMDUtMjYgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiUHJlY29tcC5oIg0KKw0KKyNpbmNsdWRlICJEZWx0YS5oIg0KKw0KK3ZvaWQgRGVsdGFfSW5pdChCeXRlICpzdGF0ZSkNCit7DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IERFTFRBX1NUQVRFX1NJWkU7IGkrKykNCisgICAgc3RhdGVbaV0gPSAwOw0KK30NCisNCitzdGF0aWMgdm9pZCBNeU1lbUNweShCeXRlICpkZXN0LCBjb25zdCBCeXRlICpzcmMsIHVuc2lnbmVkIHNpemUpDQorew0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspDQorICAgIGRlc3RbaV0gPSBzcmNbaV07DQorfQ0KKw0KK3ZvaWQgRGVsdGFfRW5jb2RlKEJ5dGUgKnN0YXRlLCB1bnNpZ25lZCBkZWx0YSwgQnl0ZSAqZGF0YSwgU2l6ZVQgc2l6ZSkNCit7DQorICBCeXRlIGJ1ZltERUxUQV9TVEFURV9TSVpFXTsNCisgIHVuc2lnbmVkIGogPSAwOw0KKyAgTXlNZW1DcHkoYnVmLCBzdGF0ZSwgZGVsdGEpOw0KKyAgew0KKyAgICBTaXplVCBpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTspDQorICAgIHsNCisgICAgICBmb3IgKGogPSAwOyBqIDwgZGVsdGEgJiYgaSA8IHNpemU7IGkrKywgaisrKQ0KKyAgICAgIHsNCisgICAgICAgIEJ5dGUgYiA9IGRhdGFbaV07DQorICAgICAgICBkYXRhW2ldID0gKEJ5dGUpKGIgLSBidWZbal0pOw0KKyAgICAgICAgYnVmW2pdID0gYjsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChqID09IGRlbHRhKQ0KKyAgICBqID0gMDsNCisgIE15TWVtQ3B5KHN0YXRlLCBidWYgKyBqLCBkZWx0YSAtIGopOw0KKyAgTXlNZW1DcHkoc3RhdGUgKyBkZWx0YSAtIGosIGJ1Ziwgaik7DQorfQ0KKw0KK3ZvaWQgRGVsdGFfRGVjb2RlKEJ5dGUgKnN0YXRlLCB1bnNpZ25lZCBkZWx0YSwgQnl0ZSAqZGF0YSwgU2l6ZVQgc2l6ZSkNCit7DQorICBCeXRlIGJ1ZltERUxUQV9TVEFURV9TSVpFXTsNCisgIHVuc2lnbmVkIGogPSAwOw0KKyAgTXlNZW1DcHkoYnVmLCBzdGF0ZSwgZGVsdGEpOw0KKyAgew0KKyAgICBTaXplVCBpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTspDQorICAgIHsNCisgICAgICBmb3IgKGogPSAwOyBqIDwgZGVsdGEgJiYgaSA8IHNpemU7IGkrKywgaisrKQ0KKyAgICAgIHsNCisgICAgICAgIGJ1ZltqXSA9IGRhdGFbaV0gPSAoQnl0ZSkoYnVmW2pdICsgZGF0YVtpXSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoaiA9PSBkZWx0YSkNCisgICAgaiA9IDA7DQorICBNeU1lbUNweShzdGF0ZSwgYnVmICsgaiwgZGVsdGEgLSBqKTsNCisgIE15TWVtQ3B5KHN0YXRlICsgZGVsdGEgLSBqLCBidWYsIGopOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0MvRGVsdGEuaCBiL2x6bWEvQy9EZWx0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OWQ1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvRGVsdGEuaApAQCAtMCwwICsxLDE5IEBACisvKiBEZWx0YS5oIC0tIERlbHRhIGNvbnZlcnRlcg0KKzIwMTMtMDEtMTggOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaWZuZGVmIF9fREVMVEFfSA0KKyNkZWZpbmUgX19ERUxUQV9IDQorDQorI2luY2x1ZGUgIjd6VHlwZXMuaCINCisNCitFWFRFUk5fQ19CRUdJTg0KKw0KKyNkZWZpbmUgREVMVEFfU1RBVEVfU0laRSAyNTYNCisNCit2b2lkIERlbHRhX0luaXQoQnl0ZSAqc3RhdGUpOw0KK3ZvaWQgRGVsdGFfRW5jb2RlKEJ5dGUgKnN0YXRlLCB1bnNpZ25lZCBkZWx0YSwgQnl0ZSAqZGF0YSwgU2l6ZVQgc2l6ZSk7DQordm9pZCBEZWx0YV9EZWNvZGUoQnl0ZSAqc3RhdGUsIHVuc2lnbmVkIGRlbHRhLCBCeXRlICpkYXRhLCBTaXplVCBzaXplKTsNCisNCitFWFRFUk5fQ19FTkQNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0MvTHpGaW5kLmMgYi9sem1hL0MvTHpGaW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3OTg2NwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9MekZpbmQuYwpAQCAtMCwwICsxLDc2MyBAQAorLyogTHpGaW5kLmMgLS0gTWF0Y2ggZmluZGVyIGZvciBMWiBhbGdvcml0aG1zDQorMjAwOS0wNC0yMiA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlICJQcmVjb21wLmgiDQorDQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKw0KKyNpbmNsdWRlICJMekZpbmQuaCINCisjaW5jbHVkZSAiTHpIYXNoLmgiDQorDQorI2RlZmluZSBrRW1wdHlIYXNoVmFsdWUgMA0KKyNkZWZpbmUga01heFZhbEZvck5vcm1hbGl6ZSAoKFVJbnQzMikweEZGRkZGRkZGKQ0KKyNkZWZpbmUga05vcm1hbGl6ZVN0ZXBNaW4gKDEgPDwgMTApIC8qIGl0IG11c3QgYmUgcG93ZXIgb2YgMiAqLw0KKyNkZWZpbmUga05vcm1hbGl6ZU1hc2sgKH4oa05vcm1hbGl6ZVN0ZXBNaW4gLSAxKSkNCisjZGVmaW5lIGtNYXhIaXN0b3J5U2l6ZSAoKFVJbnQzMikzIDw8IDMwKQ0KKw0KKyNkZWZpbmUga1N0YXJ0TWF4TGVuIDMNCisNCitzdGF0aWMgdm9pZCBMekluV2luZG93X0ZyZWUoQ01hdGNoRmluZGVyICpwLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgaWYgKCFwLT5kaXJlY3RJbnB1dCkNCisgIHsNCisgICAgYWxsb2MtPkZyZWUoYWxsb2MsIHAtPmJ1ZmZlckJhc2UpOw0KKyAgICBwLT5idWZmZXJCYXNlID0gMDsNCisgIH0NCit9DQorDQorLyoga2VlcFNpemVCZWZvcmUgKyBrZWVwU2l6ZUFmdGVyICsga2VlcFNpemVSZXNlcnYgbXVzdCBiZSA8IDRHKSAqLw0KKw0KK3N0YXRpYyBpbnQgTHpJbldpbmRvd19DcmVhdGUoQ01hdGNoRmluZGVyICpwLCBVSW50MzIga2VlcFNpemVSZXNlcnYsIElTekFsbG9jICphbGxvYykNCit7DQorICBVSW50MzIgYmxvY2tTaXplID0gcC0+a2VlcFNpemVCZWZvcmUgKyBwLT5rZWVwU2l6ZUFmdGVyICsga2VlcFNpemVSZXNlcnY7DQorICBpZiAocC0+ZGlyZWN0SW5wdXQpDQorICB7DQorICAgIHAtPmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBpZiAocC0+YnVmZmVyQmFzZSA9PSAwIHx8IHAtPmJsb2NrU2l6ZSAhPSBibG9ja1NpemUpDQorICB7DQorICAgIEx6SW5XaW5kb3dfRnJlZShwLCBhbGxvYyk7DQorICAgIHAtPmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsNCisgICAgcC0+YnVmZmVyQmFzZSA9IChCeXRlICopYWxsb2MtPkFsbG9jKGFsbG9jLCAoc2l6ZV90KWJsb2NrU2l6ZSk7DQorICB9DQorICByZXR1cm4gKHAtPmJ1ZmZlckJhc2UgIT0gMCk7DQorfQ0KKw0KK0J5dGUgKk1hdGNoRmluZGVyX0dldFBvaW50ZXJUb0N1cnJlbnRQb3MoQ01hdGNoRmluZGVyICpwKSB7IHJldHVybiBwLT5idWZmZXI7IH0NCitCeXRlIE1hdGNoRmluZGVyX0dldEluZGV4Qnl0ZShDTWF0Y2hGaW5kZXIgKnAsIEludDMyIGluZGV4KSB7IHJldHVybiBwLT5idWZmZXJbaW5kZXhdOyB9DQorDQorVUludDMyIE1hdGNoRmluZGVyX0dldE51bUF2YWlsYWJsZUJ5dGVzKENNYXRjaEZpbmRlciAqcCkgeyByZXR1cm4gcC0+c3RyZWFtUG9zIC0gcC0+cG9zOyB9DQorDQordm9pZCBNYXRjaEZpbmRlcl9SZWR1Y2VPZmZzZXRzKENNYXRjaEZpbmRlciAqcCwgVUludDMyIHN1YlZhbHVlKQ0KK3sNCisgIHAtPnBvc0xpbWl0IC09IHN1YlZhbHVlOw0KKyAgcC0+cG9zIC09IHN1YlZhbHVlOw0KKyAgcC0+c3RyZWFtUG9zIC09IHN1YlZhbHVlOw0KK30NCisNCitzdGF0aWMgdm9pZCBNYXRjaEZpbmRlcl9SZWFkQmxvY2soQ01hdGNoRmluZGVyICpwKQ0KK3sNCisgIGlmIChwLT5zdHJlYW1FbmRXYXNSZWFjaGVkIHx8IHAtPnJlc3VsdCAhPSBTWl9PSykNCisgICAgcmV0dXJuOw0KKyAgaWYgKHAtPmRpcmVjdElucHV0KQ0KKyAgew0KKyAgICBVSW50MzIgY3VyU2l6ZSA9IDB4RkZGRkZGRkYgLSBwLT5zdHJlYW1Qb3M7DQorICAgIGlmIChjdXJTaXplID4gcC0+ZGlyZWN0SW5wdXRSZW0pDQorICAgICAgY3VyU2l6ZSA9IChVSW50MzIpcC0+ZGlyZWN0SW5wdXRSZW07DQorICAgIHAtPmRpcmVjdElucHV0UmVtIC09IGN1clNpemU7DQorICAgIHAtPnN0cmVhbVBvcyArPSBjdXJTaXplOw0KKyAgICBpZiAocC0+ZGlyZWN0SW5wdXRSZW0gPT0gMCkNCisgICAgICBwLT5zdHJlYW1FbmRXYXNSZWFjaGVkID0gMTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgZm9yICg7OykNCisgIHsNCisgICAgQnl0ZSAqZGVzdCA9IHAtPmJ1ZmZlciArIChwLT5zdHJlYW1Qb3MgLSBwLT5wb3MpOw0KKyAgICBzaXplX3Qgc2l6ZSA9IChwLT5idWZmZXJCYXNlICsgcC0+YmxvY2tTaXplIC0gZGVzdCk7DQorICAgIGlmIChzaXplID09IDApDQorICAgICAgcmV0dXJuOw0KKyAgICBwLT5yZXN1bHQgPSBwLT5zdHJlYW0tPlJlYWQocC0+c3RyZWFtLCBkZXN0LCAmc2l6ZSk7DQorICAgIGlmIChwLT5yZXN1bHQgIT0gU1pfT0spDQorICAgICAgcmV0dXJuOw0KKyAgICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICB7DQorICAgICAgcC0+c3RyZWFtRW5kV2FzUmVhY2hlZCA9IDE7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHAtPnN0cmVhbVBvcyArPSAoVUludDMyKXNpemU7DQorICAgIGlmIChwLT5zdHJlYW1Qb3MgLSBwLT5wb3MgPiBwLT5rZWVwU2l6ZUFmdGVyKQ0KKyAgICAgIHJldHVybjsNCisgIH0NCit9DQorDQordm9pZCBNYXRjaEZpbmRlcl9Nb3ZlQmxvY2soQ01hdGNoRmluZGVyICpwKQ0KK3sNCisgIG1lbW1vdmUocC0+YnVmZmVyQmFzZSwNCisgICAgcC0+YnVmZmVyIC0gcC0+a2VlcFNpemVCZWZvcmUsDQorICAgIChzaXplX3QpKHAtPnN0cmVhbVBvcyAtIHAtPnBvcyArIHAtPmtlZXBTaXplQmVmb3JlKSk7DQorICBwLT5idWZmZXIgPSBwLT5idWZmZXJCYXNlICsgcC0+a2VlcFNpemVCZWZvcmU7DQorfQ0KKw0KK2ludCBNYXRjaEZpbmRlcl9OZWVkTW92ZShDTWF0Y2hGaW5kZXIgKnApDQorew0KKyAgaWYgKHAtPmRpcmVjdElucHV0KQ0KKyAgICByZXR1cm4gMDsNCisgIC8qIGlmIChwLT5zdHJlYW1FbmRXYXNSZWFjaGVkKSByZXR1cm4gMDsgKi8NCisgIHJldHVybiAoKHNpemVfdCkocC0+YnVmZmVyQmFzZSArIHAtPmJsb2NrU2l6ZSAtIHAtPmJ1ZmZlcikgPD0gcC0+a2VlcFNpemVBZnRlcik7DQorfQ0KKw0KK3ZvaWQgTWF0Y2hGaW5kZXJfUmVhZElmUmVxdWlyZWQoQ01hdGNoRmluZGVyICpwKQ0KK3sNCisgIGlmIChwLT5zdHJlYW1FbmRXYXNSZWFjaGVkKQ0KKyAgICByZXR1cm47DQorICBpZiAocC0+a2VlcFNpemVBZnRlciA+PSBwLT5zdHJlYW1Qb3MgLSBwLT5wb3MpDQorICAgIE1hdGNoRmluZGVyX1JlYWRCbG9jayhwKTsNCit9DQorDQorc3RhdGljIHZvaWQgTWF0Y2hGaW5kZXJfQ2hlY2tBbmRNb3ZlQW5kUmVhZChDTWF0Y2hGaW5kZXIgKnApDQorew0KKyAgaWYgKE1hdGNoRmluZGVyX05lZWRNb3ZlKHApKQ0KKyAgICBNYXRjaEZpbmRlcl9Nb3ZlQmxvY2socCk7DQorICBNYXRjaEZpbmRlcl9SZWFkQmxvY2socCk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIE1hdGNoRmluZGVyX1NldERlZmF1bHRTZXR0aW5ncyhDTWF0Y2hGaW5kZXIgKnApDQorew0KKyAgcC0+Y3V0VmFsdWUgPSAzMjsNCisgIHAtPmJ0TW9kZSA9IDE7DQorICBwLT5udW1IYXNoQnl0ZXMgPSA0Ow0KKyAgcC0+YmlnSGFzaCA9IDA7DQorfQ0KKw0KKyNkZWZpbmUga0NyY1BvbHkgMHhFREI4ODMyMA0KKw0KK3ZvaWQgTWF0Y2hGaW5kZXJfQ29uc3RydWN0KENNYXRjaEZpbmRlciAqcCkNCit7DQorICBVSW50MzIgaTsNCisgIHAtPmJ1ZmZlckJhc2UgPSAwOw0KKyAgcC0+ZGlyZWN0SW5wdXQgPSAwOw0KKyAgcC0+aGFzaCA9IDA7DQorICBNYXRjaEZpbmRlcl9TZXREZWZhdWx0U2V0dGluZ3MocCk7DQorDQorICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspDQorICB7DQorICAgIFVJbnQzMiByID0gaTsNCisgICAgaW50IGo7DQorICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspDQorICAgICAgciA9IChyID4+IDEpIF4gKGtDcmNQb2x5ICYgfigociAmIDEpIC0gMSkpOw0KKyAgICBwLT5jcmNbaV0gPSByOw0KKyAgfQ0KK30NCisNCitzdGF0aWMgdm9pZCBNYXRjaEZpbmRlcl9GcmVlVGhpc0NsYXNzTWVtb3J5KENNYXRjaEZpbmRlciAqcCwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIGFsbG9jLT5GcmVlKGFsbG9jLCBwLT5oYXNoKTsNCisgIHAtPmhhc2ggPSAwOw0KK30NCisNCit2b2lkIE1hdGNoRmluZGVyX0ZyZWUoQ01hdGNoRmluZGVyICpwLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgTWF0Y2hGaW5kZXJfRnJlZVRoaXNDbGFzc01lbW9yeShwLCBhbGxvYyk7DQorICBMekluV2luZG93X0ZyZWUocCwgYWxsb2MpOw0KK30NCisNCitzdGF0aWMgQ0x6UmVmKiBBbGxvY1JlZnMoVUludDMyIG51bSwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIHNpemVfdCBzaXplSW5CeXRlcyA9IChzaXplX3QpbnVtICogc2l6ZW9mKENMelJlZik7DQorICBpZiAoc2l6ZUluQnl0ZXMgLyBzaXplb2YoQ0x6UmVmKSAhPSBudW0pDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIChDTHpSZWYgKilhbGxvYy0+QWxsb2MoYWxsb2MsIHNpemVJbkJ5dGVzKTsNCit9DQorDQoraW50IE1hdGNoRmluZGVyX0NyZWF0ZShDTWF0Y2hGaW5kZXIgKnAsIFVJbnQzMiBoaXN0b3J5U2l6ZSwNCisgICAgVUludDMyIGtlZXBBZGRCdWZmZXJCZWZvcmUsIFVJbnQzMiBtYXRjaE1heExlbiwgVUludDMyIGtlZXBBZGRCdWZmZXJBZnRlciwNCisgICAgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIFVJbnQzMiBzaXplUmVzZXJ2Ow0KKyAgaWYgKGhpc3RvcnlTaXplID4ga01heEhpc3RvcnlTaXplKQ0KKyAgew0KKyAgICBNYXRjaEZpbmRlcl9GcmVlKHAsIGFsbG9jKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBzaXplUmVzZXJ2ID0gaGlzdG9yeVNpemUgPj4gMTsNCisgIGlmIChoaXN0b3J5U2l6ZSA+ICgoVUludDMyKTIgPDwgMzApKQ0KKyAgICBzaXplUmVzZXJ2ID0gaGlzdG9yeVNpemUgPj4gMjsNCisgIHNpemVSZXNlcnYgKz0gKGtlZXBBZGRCdWZmZXJCZWZvcmUgKyBtYXRjaE1heExlbiArIGtlZXBBZGRCdWZmZXJBZnRlcikgLyAyICsgKDEgPDwgMTkpOw0KKw0KKyAgcC0+a2VlcFNpemVCZWZvcmUgPSBoaXN0b3J5U2l6ZSArIGtlZXBBZGRCdWZmZXJCZWZvcmUgKyAxOw0KKyAgcC0+a2VlcFNpemVBZnRlciA9IG1hdGNoTWF4TGVuICsga2VlcEFkZEJ1ZmZlckFmdGVyOw0KKyAgLyogd2UgbmVlZCBvbmUgYWRkaXRpb25hbCBieXRlLCBzaW5jZSB3ZSB1c2UgTW92ZUJsb2NrIGFmdGVyIHBvcysrIGFuZCBiZWZvcmUgZGljdGlvbmFyeSB1c2luZyAqLw0KKyAgaWYgKEx6SW5XaW5kb3dfQ3JlYXRlKHAsIHNpemVSZXNlcnYsIGFsbG9jKSkNCisgIHsNCisgICAgVUludDMyIG5ld0N5Y2xpY0J1ZmZlclNpemUgPSBoaXN0b3J5U2l6ZSArIDE7DQorICAgIFVJbnQzMiBoczsNCisgICAgcC0+bWF0Y2hNYXhMZW4gPSBtYXRjaE1heExlbjsNCisgICAgew0KKyAgICAgIHAtPmZpeGVkSGFzaFNpemUgPSAwOw0KKyAgICAgIGlmIChwLT5udW1IYXNoQnl0ZXMgPT0gMikNCisgICAgICAgIGhzID0gKDEgPDwgMTYpIC0gMTsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgaHMgPSBoaXN0b3J5U2l6ZSAtIDE7DQorICAgICAgICBocyB8PSAoaHMgPj4gMSk7DQorICAgICAgICBocyB8PSAoaHMgPj4gMik7DQorICAgICAgICBocyB8PSAoaHMgPj4gNCk7DQorICAgICAgICBocyB8PSAoaHMgPj4gOCk7DQorICAgICAgICBocyA+Pj0gMTsNCisgICAgICAgIGhzIHw9IDB4RkZGRjsgLyogZG9uJ3QgY2hhbmdlIGl0ISBJdCdzIHJlcXVpcmVkIGZvciBEZWZsYXRlICovDQorICAgICAgICBpZiAoaHMgPiAoMSA8PCAyNCkpDQorICAgICAgICB7DQorICAgICAgICAgIGlmIChwLT5udW1IYXNoQnl0ZXMgPT0gMykNCisgICAgICAgICAgICBocyA9ICgxIDw8IDI0KSAtIDE7DQorICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBocyA+Pj0gMTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcC0+aGFzaE1hc2sgPSBoczsNCisgICAgICBocysrOw0KKyAgICAgIGlmIChwLT5udW1IYXNoQnl0ZXMgPiAyKSBwLT5maXhlZEhhc2hTaXplICs9IGtIYXNoMlNpemU7DQorICAgICAgaWYgKHAtPm51bUhhc2hCeXRlcyA+IDMpIHAtPmZpeGVkSGFzaFNpemUgKz0ga0hhc2gzU2l6ZTsNCisgICAgICBpZiAocC0+bnVtSGFzaEJ5dGVzID4gNCkgcC0+Zml4ZWRIYXNoU2l6ZSArPSBrSGFzaDRTaXplOw0KKyAgICAgIGhzICs9IHAtPmZpeGVkSGFzaFNpemU7DQorICAgIH0NCisNCisgICAgew0KKyAgICAgIFVJbnQzMiBwcmV2U2l6ZSA9IHAtPmhhc2hTaXplU3VtICsgcC0+bnVtU29uczsNCisgICAgICBVSW50MzIgbmV3U2l6ZTsNCisgICAgICBwLT5oaXN0b3J5U2l6ZSA9IGhpc3RvcnlTaXplOw0KKyAgICAgIHAtPmhhc2hTaXplU3VtID0gaHM7DQorICAgICAgcC0+Y3ljbGljQnVmZmVyU2l6ZSA9IG5ld0N5Y2xpY0J1ZmZlclNpemU7DQorICAgICAgcC0+bnVtU29ucyA9IChwLT5idE1vZGUgPyBuZXdDeWNsaWNCdWZmZXJTaXplICogMiA6IG5ld0N5Y2xpY0J1ZmZlclNpemUpOw0KKyAgICAgIG5ld1NpemUgPSBwLT5oYXNoU2l6ZVN1bSArIHAtPm51bVNvbnM7DQorICAgICAgaWYgKHAtPmhhc2ggIT0gMCAmJiBwcmV2U2l6ZSA9PSBuZXdTaXplKQ0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgTWF0Y2hGaW5kZXJfRnJlZVRoaXNDbGFzc01lbW9yeShwLCBhbGxvYyk7DQorICAgICAgcC0+aGFzaCA9IEFsbG9jUmVmcyhuZXdTaXplLCBhbGxvYyk7DQorICAgICAgaWYgKHAtPmhhc2ggIT0gMCkNCisgICAgICB7DQorICAgICAgICBwLT5zb24gPSBwLT5oYXNoICsgcC0+aGFzaFNpemVTdW07DQorICAgICAgICByZXR1cm4gMTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIE1hdGNoRmluZGVyX0ZyZWUocCwgYWxsb2MpOw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIE1hdGNoRmluZGVyX1NldExpbWl0cyhDTWF0Y2hGaW5kZXIgKnApDQorew0KKyAgVUludDMyIGxpbWl0ID0ga01heFZhbEZvck5vcm1hbGl6ZSAtIHAtPnBvczsNCisgIFVJbnQzMiBsaW1pdDIgPSBwLT5jeWNsaWNCdWZmZXJTaXplIC0gcC0+Y3ljbGljQnVmZmVyUG9zOw0KKyAgaWYgKGxpbWl0MiA8IGxpbWl0KQ0KKyAgICBsaW1pdCA9IGxpbWl0MjsNCisgIGxpbWl0MiA9IHAtPnN0cmVhbVBvcyAtIHAtPnBvczsNCisgIGlmIChsaW1pdDIgPD0gcC0+a2VlcFNpemVBZnRlcikNCisgIHsNCisgICAgaWYgKGxpbWl0MiA+IDApDQorICAgICAgbGltaXQyID0gMTsNCisgIH0NCisgIGVsc2UNCisgICAgbGltaXQyIC09IHAtPmtlZXBTaXplQWZ0ZXI7DQorICBpZiAobGltaXQyIDwgbGltaXQpDQorICAgIGxpbWl0ID0gbGltaXQyOw0KKyAgew0KKyAgICBVSW50MzIgbGVuTGltaXQgPSBwLT5zdHJlYW1Qb3MgLSBwLT5wb3M7DQorICAgIGlmIChsZW5MaW1pdCA+IHAtPm1hdGNoTWF4TGVuKQ0KKyAgICAgIGxlbkxpbWl0ID0gcC0+bWF0Y2hNYXhMZW47DQorICAgIHAtPmxlbkxpbWl0ID0gbGVuTGltaXQ7DQorICB9DQorICBwLT5wb3NMaW1pdCA9IHAtPnBvcyArIGxpbWl0Ow0KK30NCisNCit2b2lkIE1hdGNoRmluZGVyX0luaXQoQ01hdGNoRmluZGVyICpwKQ0KK3sNCisgIFVJbnQzMiBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHAtPmhhc2hTaXplU3VtOyBpKyspDQorICAgIHAtPmhhc2hbaV0gPSBrRW1wdHlIYXNoVmFsdWU7DQorICBwLT5jeWNsaWNCdWZmZXJQb3MgPSAwOw0KKyAgcC0+YnVmZmVyID0gcC0+YnVmZmVyQmFzZTsNCisgIHAtPnBvcyA9IHAtPnN0cmVhbVBvcyA9IHAtPmN5Y2xpY0J1ZmZlclNpemU7DQorICBwLT5yZXN1bHQgPSBTWl9PSzsNCisgIHAtPnN0cmVhbUVuZFdhc1JlYWNoZWQgPSAwOw0KKyAgTWF0Y2hGaW5kZXJfUmVhZEJsb2NrKHApOw0KKyAgTWF0Y2hGaW5kZXJfU2V0TGltaXRzKHApOw0KK30NCisNCitzdGF0aWMgVUludDMyIE1hdGNoRmluZGVyX0dldFN1YlZhbHVlKENNYXRjaEZpbmRlciAqcCkNCit7DQorICByZXR1cm4gKHAtPnBvcyAtIHAtPmhpc3RvcnlTaXplIC0gMSkgJiBrTm9ybWFsaXplTWFzazsNCit9DQorDQordm9pZCBNYXRjaEZpbmRlcl9Ob3JtYWxpemUzKFVJbnQzMiBzdWJWYWx1ZSwgQ0x6UmVmICppdGVtcywgVUludDMyIG51bUl0ZW1zKQ0KK3sNCisgIFVJbnQzMiBpOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bUl0ZW1zOyBpKyspDQorICB7DQorICAgIFVJbnQzMiB2YWx1ZSA9IGl0ZW1zW2ldOw0KKyAgICBpZiAodmFsdWUgPD0gc3ViVmFsdWUpDQorICAgICAgdmFsdWUgPSBrRW1wdHlIYXNoVmFsdWU7DQorICAgIGVsc2UNCisgICAgICB2YWx1ZSAtPSBzdWJWYWx1ZTsNCisgICAgaXRlbXNbaV0gPSB2YWx1ZTsNCisgIH0NCit9DQorDQorc3RhdGljIHZvaWQgTWF0Y2hGaW5kZXJfTm9ybWFsaXplKENNYXRjaEZpbmRlciAqcCkNCit7DQorICBVSW50MzIgc3ViVmFsdWUgPSBNYXRjaEZpbmRlcl9HZXRTdWJWYWx1ZShwKTsNCisgIE1hdGNoRmluZGVyX05vcm1hbGl6ZTMoc3ViVmFsdWUsIHAtPmhhc2gsIHAtPmhhc2hTaXplU3VtICsgcC0+bnVtU29ucyk7DQorICBNYXRjaEZpbmRlcl9SZWR1Y2VPZmZzZXRzKHAsIHN1YlZhbHVlKTsNCit9DQorDQorc3RhdGljIHZvaWQgTWF0Y2hGaW5kZXJfQ2hlY2tMaW1pdHMoQ01hdGNoRmluZGVyICpwKQ0KK3sNCisgIGlmIChwLT5wb3MgPT0ga01heFZhbEZvck5vcm1hbGl6ZSkNCisgICAgTWF0Y2hGaW5kZXJfTm9ybWFsaXplKHApOw0KKyAgaWYgKCFwLT5zdHJlYW1FbmRXYXNSZWFjaGVkICYmIHAtPmtlZXBTaXplQWZ0ZXIgPT0gcC0+c3RyZWFtUG9zIC0gcC0+cG9zKQ0KKyAgICBNYXRjaEZpbmRlcl9DaGVja0FuZE1vdmVBbmRSZWFkKHApOw0KKyAgaWYgKHAtPmN5Y2xpY0J1ZmZlclBvcyA9PSBwLT5jeWNsaWNCdWZmZXJTaXplKQ0KKyAgICBwLT5jeWNsaWNCdWZmZXJQb3MgPSAwOw0KKyAgTWF0Y2hGaW5kZXJfU2V0TGltaXRzKHApOw0KK30NCisNCitzdGF0aWMgVUludDMyICogSGNfR2V0TWF0Y2hlc1NwZWMoVUludDMyIGxlbkxpbWl0LCBVSW50MzIgY3VyTWF0Y2gsIFVJbnQzMiBwb3MsIGNvbnN0IEJ5dGUgKmN1ciwgQ0x6UmVmICpzb24sDQorICAgIFVJbnQzMiBfY3ljbGljQnVmZmVyUG9zLCBVSW50MzIgX2N5Y2xpY0J1ZmZlclNpemUsIFVJbnQzMiBjdXRWYWx1ZSwNCisgICAgVUludDMyICpkaXN0YW5jZXMsIFVJbnQzMiBtYXhMZW4pDQorew0KKyAgc29uW19jeWNsaWNCdWZmZXJQb3NdID0gY3VyTWF0Y2g7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBVSW50MzIgZGVsdGEgPSBwb3MgLSBjdXJNYXRjaDsNCisgICAgaWYgKGN1dFZhbHVlLS0gPT0gMCB8fCBkZWx0YSA+PSBfY3ljbGljQnVmZmVyU2l6ZSkNCisgICAgICByZXR1cm4gZGlzdGFuY2VzOw0KKyAgICB7DQorICAgICAgY29uc3QgQnl0ZSAqcGIgPSBjdXIgLSBkZWx0YTsNCisgICAgICBjdXJNYXRjaCA9IHNvbltfY3ljbGljQnVmZmVyUG9zIC0gZGVsdGEgKyAoKGRlbHRhID4gX2N5Y2xpY0J1ZmZlclBvcykgPyBfY3ljbGljQnVmZmVyU2l6ZSA6IDApXTsNCisgICAgICBpZiAocGJbbWF4TGVuXSA9PSBjdXJbbWF4TGVuXSAmJiAqcGIgPT0gKmN1cikNCisgICAgICB7DQorICAgICAgICBVSW50MzIgbGVuID0gMDsNCisgICAgICAgIHdoaWxlICgrK2xlbiAhPSBsZW5MaW1pdCkNCisgICAgICAgICAgaWYgKHBiW2xlbl0gIT0gY3VyW2xlbl0pDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBpZiAobWF4TGVuIDwgbGVuKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAqZGlzdGFuY2VzKysgPSBtYXhMZW4gPSBsZW47DQorICAgICAgICAgICpkaXN0YW5jZXMrKyA9IGRlbHRhIC0gMTsNCisgICAgICAgICAgaWYgKGxlbiA9PSBsZW5MaW1pdCkNCisgICAgICAgICAgICByZXR1cm4gZGlzdGFuY2VzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCisNCitVSW50MzIgKiBHZXRNYXRjaGVzU3BlYzEoVUludDMyIGxlbkxpbWl0LCBVSW50MzIgY3VyTWF0Y2gsIFVJbnQzMiBwb3MsIGNvbnN0IEJ5dGUgKmN1ciwgQ0x6UmVmICpzb24sDQorICAgIFVJbnQzMiBfY3ljbGljQnVmZmVyUG9zLCBVSW50MzIgX2N5Y2xpY0J1ZmZlclNpemUsIFVJbnQzMiBjdXRWYWx1ZSwNCisgICAgVUludDMyICpkaXN0YW5jZXMsIFVJbnQzMiBtYXhMZW4pDQorew0KKyAgQ0x6UmVmICpwdHIwID0gc29uICsgKF9jeWNsaWNCdWZmZXJQb3MgPDwgMSkgKyAxOw0KKyAgQ0x6UmVmICpwdHIxID0gc29uICsgKF9jeWNsaWNCdWZmZXJQb3MgPDwgMSk7DQorICBVSW50MzIgbGVuMCA9IDAsIGxlbjEgPSAwOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgVUludDMyIGRlbHRhID0gcG9zIC0gY3VyTWF0Y2g7DQorICAgIGlmIChjdXRWYWx1ZS0tID09IDAgfHwgZGVsdGEgPj0gX2N5Y2xpY0J1ZmZlclNpemUpDQorICAgIHsNCisgICAgICAqcHRyMCA9ICpwdHIxID0ga0VtcHR5SGFzaFZhbHVlOw0KKyAgICAgIHJldHVybiBkaXN0YW5jZXM7DQorICAgIH0NCisgICAgew0KKyAgICAgIENMelJlZiAqcGFpciA9IHNvbiArICgoX2N5Y2xpY0J1ZmZlclBvcyAtIGRlbHRhICsgKChkZWx0YSA+IF9jeWNsaWNCdWZmZXJQb3MpID8gX2N5Y2xpY0J1ZmZlclNpemUgOiAwKSkgPDwgMSk7DQorICAgICAgY29uc3QgQnl0ZSAqcGIgPSBjdXIgLSBkZWx0YTsNCisgICAgICBVSW50MzIgbGVuID0gKGxlbjAgPCBsZW4xID8gbGVuMCA6IGxlbjEpOw0KKyAgICAgIGlmIChwYltsZW5dID09IGN1cltsZW5dKQ0KKyAgICAgIHsNCisgICAgICAgIGlmICgrK2xlbiAhPSBsZW5MaW1pdCAmJiBwYltsZW5dID09IGN1cltsZW5dKQ0KKyAgICAgICAgICB3aGlsZSAoKytsZW4gIT0gbGVuTGltaXQpDQorICAgICAgICAgICAgaWYgKHBiW2xlbl0gIT0gY3VyW2xlbl0pDQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGlmIChtYXhMZW4gPCBsZW4pDQorICAgICAgICB7DQorICAgICAgICAgICpkaXN0YW5jZXMrKyA9IG1heExlbiA9IGxlbjsNCisgICAgICAgICAgKmRpc3RhbmNlcysrID0gZGVsdGEgLSAxOw0KKyAgICAgICAgICBpZiAobGVuID09IGxlbkxpbWl0KQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgKnB0cjEgPSBwYWlyWzBdOw0KKyAgICAgICAgICAgICpwdHIwID0gcGFpclsxXTsNCisgICAgICAgICAgICByZXR1cm4gZGlzdGFuY2VzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChwYltsZW5dIDwgY3VyW2xlbl0pDQorICAgICAgew0KKyAgICAgICAgKnB0cjEgPSBjdXJNYXRjaDsNCisgICAgICAgIHB0cjEgPSBwYWlyICsgMTsNCisgICAgICAgIGN1ck1hdGNoID0gKnB0cjE7DQorICAgICAgICBsZW4xID0gbGVuOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgKnB0cjAgPSBjdXJNYXRjaDsNCisgICAgICAgIHB0cjAgPSBwYWlyOw0KKyAgICAgICAgY3VyTWF0Y2ggPSAqcHRyMDsNCisgICAgICAgIGxlbjAgPSBsZW47DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFNraXBNYXRjaGVzU3BlYyhVSW50MzIgbGVuTGltaXQsIFVJbnQzMiBjdXJNYXRjaCwgVUludDMyIHBvcywgY29uc3QgQnl0ZSAqY3VyLCBDTHpSZWYgKnNvbiwNCisgICAgVUludDMyIF9jeWNsaWNCdWZmZXJQb3MsIFVJbnQzMiBfY3ljbGljQnVmZmVyU2l6ZSwgVUludDMyIGN1dFZhbHVlKQ0KK3sNCisgIENMelJlZiAqcHRyMCA9IHNvbiArIChfY3ljbGljQnVmZmVyUG9zIDw8IDEpICsgMTsNCisgIENMelJlZiAqcHRyMSA9IHNvbiArIChfY3ljbGljQnVmZmVyUG9zIDw8IDEpOw0KKyAgVUludDMyIGxlbjAgPSAwLCBsZW4xID0gMDsNCisgIGZvciAoOzspDQorICB7DQorICAgIFVJbnQzMiBkZWx0YSA9IHBvcyAtIGN1ck1hdGNoOw0KKyAgICBpZiAoY3V0VmFsdWUtLSA9PSAwIHx8IGRlbHRhID49IF9jeWNsaWNCdWZmZXJTaXplKQ0KKyAgICB7DQorICAgICAgKnB0cjAgPSAqcHRyMSA9IGtFbXB0eUhhc2hWYWx1ZTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgew0KKyAgICAgIENMelJlZiAqcGFpciA9IHNvbiArICgoX2N5Y2xpY0J1ZmZlclBvcyAtIGRlbHRhICsgKChkZWx0YSA+IF9jeWNsaWNCdWZmZXJQb3MpID8gX2N5Y2xpY0J1ZmZlclNpemUgOiAwKSkgPDwgMSk7DQorICAgICAgY29uc3QgQnl0ZSAqcGIgPSBjdXIgLSBkZWx0YTsNCisgICAgICBVSW50MzIgbGVuID0gKGxlbjAgPCBsZW4xID8gbGVuMCA6IGxlbjEpOw0KKyAgICAgIGlmIChwYltsZW5dID09IGN1cltsZW5dKQ0KKyAgICAgIHsNCisgICAgICAgIHdoaWxlICgrK2xlbiAhPSBsZW5MaW1pdCkNCisgICAgICAgICAgaWYgKHBiW2xlbl0gIT0gY3VyW2xlbl0pDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB7DQorICAgICAgICAgIGlmIChsZW4gPT0gbGVuTGltaXQpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICAqcHRyMSA9IHBhaXJbMF07DQorICAgICAgICAgICAgKnB0cjAgPSBwYWlyWzFdOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAocGJbbGVuXSA8IGN1cltsZW5dKQ0KKyAgICAgIHsNCisgICAgICAgICpwdHIxID0gY3VyTWF0Y2g7DQorICAgICAgICBwdHIxID0gcGFpciArIDE7DQorICAgICAgICBjdXJNYXRjaCA9ICpwdHIxOw0KKyAgICAgICAgbGVuMSA9IGxlbjsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgICpwdHIwID0gY3VyTWF0Y2g7DQorICAgICAgICBwdHIwID0gcGFpcjsNCisgICAgICAgIGN1ck1hdGNoID0gKnB0cjA7DQorICAgICAgICBsZW4wID0gbGVuOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCisNCisjZGVmaW5lIE1PVkVfUE9TIFwNCisgICsrcC0+Y3ljbGljQnVmZmVyUG9zOyBcDQorICBwLT5idWZmZXIrKzsgXA0KKyAgaWYgKCsrcC0+cG9zID09IHAtPnBvc0xpbWl0KSBNYXRjaEZpbmRlcl9DaGVja0xpbWl0cyhwKTsNCisNCisjZGVmaW5lIE1PVkVfUE9TX1JFVCBNT1ZFX1BPUyByZXR1cm4gb2Zmc2V0Ow0KKw0KK3N0YXRpYyB2b2lkIE1hdGNoRmluZGVyX01vdmVQb3MoQ01hdGNoRmluZGVyICpwKSB7IE1PVkVfUE9TOyB9DQorDQorI2RlZmluZSBHRVRfTUFUQ0hFU19IRUFERVIyKG1pbkxlbiwgcmV0X29wKSBcDQorICBVSW50MzIgbGVuTGltaXQ7IFVJbnQzMiBoYXNoVmFsdWU7IGNvbnN0IEJ5dGUgKmN1cjsgVUludDMyIGN1ck1hdGNoOyBcDQorICBsZW5MaW1pdCA9IHAtPmxlbkxpbWl0OyB7IGlmIChsZW5MaW1pdCA8IG1pbkxlbikgeyBNYXRjaEZpbmRlcl9Nb3ZlUG9zKHApOyByZXRfb3A7IH19IFwNCisgIGN1ciA9IHAtPmJ1ZmZlcjsNCisNCisjZGVmaW5lIEdFVF9NQVRDSEVTX0hFQURFUihtaW5MZW4pIEdFVF9NQVRDSEVTX0hFQURFUjIobWluTGVuLCByZXR1cm4gMCkNCisjZGVmaW5lIFNLSVBfSEVBREVSKG1pbkxlbikgICAgICAgIEdFVF9NQVRDSEVTX0hFQURFUjIobWluTGVuLCBjb250aW51ZSkNCisNCisjZGVmaW5lIE1GX1BBUkFNUyhwKSBwLT5wb3MsIHAtPmJ1ZmZlciwgcC0+c29uLCBwLT5jeWNsaWNCdWZmZXJQb3MsIHAtPmN5Y2xpY0J1ZmZlclNpemUsIHAtPmN1dFZhbHVlDQorDQorI2RlZmluZSBHRVRfTUFUQ0hFU19GT09URVIob2Zmc2V0LCBtYXhMZW4pIFwNCisgIG9mZnNldCA9IChVSW50MzIpKEdldE1hdGNoZXNTcGVjMShsZW5MaW1pdCwgY3VyTWF0Y2gsIE1GX1BBUkFNUyhwKSwgXA0KKyAgZGlzdGFuY2VzICsgb2Zmc2V0LCBtYXhMZW4pIC0gZGlzdGFuY2VzKTsgTU9WRV9QT1NfUkVUOw0KKw0KKyNkZWZpbmUgU0tJUF9GT09URVIgXA0KKyAgU2tpcE1hdGNoZXNTcGVjKGxlbkxpbWl0LCBjdXJNYXRjaCwgTUZfUEFSQU1TKHApKTsgTU9WRV9QT1M7DQorDQorc3RhdGljIFVJbnQzMiBCdDJfTWF0Y2hGaW5kZXJfR2V0TWF0Y2hlcyhDTWF0Y2hGaW5kZXIgKnAsIFVJbnQzMiAqZGlzdGFuY2VzKQ0KK3sNCisgIFVJbnQzMiBvZmZzZXQ7DQorICBHRVRfTUFUQ0hFU19IRUFERVIoMikNCisgIEhBU0gyX0NBTEM7DQorICBjdXJNYXRjaCA9IHAtPmhhc2hbaGFzaFZhbHVlXTsNCisgIHAtPmhhc2hbaGFzaFZhbHVlXSA9IHAtPnBvczsNCisgIG9mZnNldCA9IDA7DQorICBHRVRfTUFUQ0hFU19GT09URVIob2Zmc2V0LCAxKQ0KK30NCisNCitVSW50MzIgQnQzWmlwX01hdGNoRmluZGVyX0dldE1hdGNoZXMoQ01hdGNoRmluZGVyICpwLCBVSW50MzIgKmRpc3RhbmNlcykNCit7DQorICBVSW50MzIgb2Zmc2V0Ow0KKyAgR0VUX01BVENIRVNfSEVBREVSKDMpDQorICBIQVNIX1pJUF9DQUxDOw0KKyAgY3VyTWF0Y2ggPSBwLT5oYXNoW2hhc2hWYWx1ZV07DQorICBwLT5oYXNoW2hhc2hWYWx1ZV0gPSBwLT5wb3M7DQorICBvZmZzZXQgPSAwOw0KKyAgR0VUX01BVENIRVNfRk9PVEVSKG9mZnNldCwgMikNCit9DQorDQorc3RhdGljIFVJbnQzMiBCdDNfTWF0Y2hGaW5kZXJfR2V0TWF0Y2hlcyhDTWF0Y2hGaW5kZXIgKnAsIFVJbnQzMiAqZGlzdGFuY2VzKQ0KK3sNCisgIFVJbnQzMiBoYXNoMlZhbHVlLCBkZWx0YTIsIG1heExlbiwgb2Zmc2V0Ow0KKyAgR0VUX01BVENIRVNfSEVBREVSKDMpDQorDQorICBIQVNIM19DQUxDOw0KKw0KKyAgZGVsdGEyID0gcC0+cG9zIC0gcC0+aGFzaFtoYXNoMlZhbHVlXTsNCisgIGN1ck1hdGNoID0gcC0+aGFzaFtrRml4M0hhc2hTaXplICsgaGFzaFZhbHVlXTsNCisgIA0KKyAgcC0+aGFzaFtoYXNoMlZhbHVlXSA9DQorICBwLT5oYXNoW2tGaXgzSGFzaFNpemUgKyBoYXNoVmFsdWVdID0gcC0+cG9zOw0KKw0KKw0KKyAgbWF4TGVuID0gMjsNCisgIG9mZnNldCA9IDA7DQorICBpZiAoZGVsdGEyIDwgcC0+Y3ljbGljQnVmZmVyU2l6ZSAmJiAqKGN1ciAtIGRlbHRhMikgPT0gKmN1cikNCisgIHsNCisgICAgZm9yICg7IG1heExlbiAhPSBsZW5MaW1pdDsgbWF4TGVuKyspDQorICAgICAgaWYgKGN1clsocHRyZGlmZl90KW1heExlbiAtIGRlbHRhMl0gIT0gY3VyW21heExlbl0pDQorICAgICAgICBicmVhazsNCisgICAgZGlzdGFuY2VzWzBdID0gbWF4TGVuOw0KKyAgICBkaXN0YW5jZXNbMV0gPSBkZWx0YTIgLSAxOw0KKyAgICBvZmZzZXQgPSAyOw0KKyAgICBpZiAobWF4TGVuID09IGxlbkxpbWl0KQ0KKyAgICB7DQorICAgICAgU2tpcE1hdGNoZXNTcGVjKGxlbkxpbWl0LCBjdXJNYXRjaCwgTUZfUEFSQU1TKHApKTsNCisgICAgICBNT1ZFX1BPU19SRVQ7DQorICAgIH0NCisgIH0NCisgIEdFVF9NQVRDSEVTX0ZPT1RFUihvZmZzZXQsIG1heExlbikNCit9DQorDQorc3RhdGljIFVJbnQzMiBCdDRfTWF0Y2hGaW5kZXJfR2V0TWF0Y2hlcyhDTWF0Y2hGaW5kZXIgKnAsIFVJbnQzMiAqZGlzdGFuY2VzKQ0KK3sNCisgIFVJbnQzMiBoYXNoMlZhbHVlLCBoYXNoM1ZhbHVlLCBkZWx0YTIsIGRlbHRhMywgbWF4TGVuLCBvZmZzZXQ7DQorICBHRVRfTUFUQ0hFU19IRUFERVIoNCkNCisNCisgIEhBU0g0X0NBTEM7DQorDQorICBkZWx0YTIgPSBwLT5wb3MgLSBwLT5oYXNoWyAgICAgICAgICAgICAgICBoYXNoMlZhbHVlXTsNCisgIGRlbHRhMyA9IHAtPnBvcyAtIHAtPmhhc2hba0ZpeDNIYXNoU2l6ZSArIGhhc2gzVmFsdWVdOw0KKyAgY3VyTWF0Y2ggPSBwLT5oYXNoW2tGaXg0SGFzaFNpemUgKyBoYXNoVmFsdWVdOw0KKyAgDQorICBwLT5oYXNoWyAgICAgICAgICAgICAgICBoYXNoMlZhbHVlXSA9DQorICBwLT5oYXNoW2tGaXgzSGFzaFNpemUgKyBoYXNoM1ZhbHVlXSA9DQorICBwLT5oYXNoW2tGaXg0SGFzaFNpemUgKyBoYXNoVmFsdWVdID0gcC0+cG9zOw0KKw0KKyAgbWF4TGVuID0gMTsNCisgIG9mZnNldCA9IDA7DQorICBpZiAoZGVsdGEyIDwgcC0+Y3ljbGljQnVmZmVyU2l6ZSAmJiAqKGN1ciAtIGRlbHRhMikgPT0gKmN1cikNCisgIHsNCisgICAgZGlzdGFuY2VzWzBdID0gbWF4TGVuID0gMjsNCisgICAgZGlzdGFuY2VzWzFdID0gZGVsdGEyIC0gMTsNCisgICAgb2Zmc2V0ID0gMjsNCisgIH0NCisgIGlmIChkZWx0YTIgIT0gZGVsdGEzICYmIGRlbHRhMyA8IHAtPmN5Y2xpY0J1ZmZlclNpemUgJiYgKihjdXIgLSBkZWx0YTMpID09ICpjdXIpDQorICB7DQorICAgIG1heExlbiA9IDM7DQorICAgIGRpc3RhbmNlc1tvZmZzZXQgKyAxXSA9IGRlbHRhMyAtIDE7DQorICAgIG9mZnNldCArPSAyOw0KKyAgICBkZWx0YTIgPSBkZWx0YTM7DQorICB9DQorICBpZiAob2Zmc2V0ICE9IDApDQorICB7DQorICAgIGZvciAoOyBtYXhMZW4gIT0gbGVuTGltaXQ7IG1heExlbisrKQ0KKyAgICAgIGlmIChjdXJbKHB0cmRpZmZfdCltYXhMZW4gLSBkZWx0YTJdICE9IGN1clttYXhMZW5dKQ0KKyAgICAgICAgYnJlYWs7DQorICAgIGRpc3RhbmNlc1tvZmZzZXQgLSAyXSA9IG1heExlbjsNCisgICAgaWYgKG1heExlbiA9PSBsZW5MaW1pdCkNCisgICAgew0KKyAgICAgIFNraXBNYXRjaGVzU3BlYyhsZW5MaW1pdCwgY3VyTWF0Y2gsIE1GX1BBUkFNUyhwKSk7DQorICAgICAgTU9WRV9QT1NfUkVUOw0KKyAgICB9DQorICB9DQorICBpZiAobWF4TGVuIDwgMykNCisgICAgbWF4TGVuID0gMzsNCisgIEdFVF9NQVRDSEVTX0ZPT1RFUihvZmZzZXQsIG1heExlbikNCit9DQorDQorc3RhdGljIFVJbnQzMiBIYzRfTWF0Y2hGaW5kZXJfR2V0TWF0Y2hlcyhDTWF0Y2hGaW5kZXIgKnAsIFVJbnQzMiAqZGlzdGFuY2VzKQ0KK3sNCisgIFVJbnQzMiBoYXNoMlZhbHVlLCBoYXNoM1ZhbHVlLCBkZWx0YTIsIGRlbHRhMywgbWF4TGVuLCBvZmZzZXQ7DQorICBHRVRfTUFUQ0hFU19IRUFERVIoNCkNCisNCisgIEhBU0g0X0NBTEM7DQorDQorICBkZWx0YTIgPSBwLT5wb3MgLSBwLT5oYXNoWyAgICAgICAgICAgICAgICBoYXNoMlZhbHVlXTsNCisgIGRlbHRhMyA9IHAtPnBvcyAtIHAtPmhhc2hba0ZpeDNIYXNoU2l6ZSArIGhhc2gzVmFsdWVdOw0KKyAgY3VyTWF0Y2ggPSBwLT5oYXNoW2tGaXg0SGFzaFNpemUgKyBoYXNoVmFsdWVdOw0KKw0KKyAgcC0+aGFzaFsgICAgICAgICAgICAgICAgaGFzaDJWYWx1ZV0gPQ0KKyAgcC0+aGFzaFtrRml4M0hhc2hTaXplICsgaGFzaDNWYWx1ZV0gPQ0KKyAgcC0+aGFzaFtrRml4NEhhc2hTaXplICsgaGFzaFZhbHVlXSA9IHAtPnBvczsNCisNCisgIG1heExlbiA9IDE7DQorICBvZmZzZXQgPSAwOw0KKyAgaWYgKGRlbHRhMiA8IHAtPmN5Y2xpY0J1ZmZlclNpemUgJiYgKihjdXIgLSBkZWx0YTIpID09ICpjdXIpDQorICB7DQorICAgIGRpc3RhbmNlc1swXSA9IG1heExlbiA9IDI7DQorICAgIGRpc3RhbmNlc1sxXSA9IGRlbHRhMiAtIDE7DQorICAgIG9mZnNldCA9IDI7DQorICB9DQorICBpZiAoZGVsdGEyICE9IGRlbHRhMyAmJiBkZWx0YTMgPCBwLT5jeWNsaWNCdWZmZXJTaXplICYmICooY3VyIC0gZGVsdGEzKSA9PSAqY3VyKQ0KKyAgew0KKyAgICBtYXhMZW4gPSAzOw0KKyAgICBkaXN0YW5jZXNbb2Zmc2V0ICsgMV0gPSBkZWx0YTMgLSAxOw0KKyAgICBvZmZzZXQgKz0gMjsNCisgICAgZGVsdGEyID0gZGVsdGEzOw0KKyAgfQ0KKyAgaWYgKG9mZnNldCAhPSAwKQ0KKyAgew0KKyAgICBmb3IgKDsgbWF4TGVuICE9IGxlbkxpbWl0OyBtYXhMZW4rKykNCisgICAgICBpZiAoY3VyWyhwdHJkaWZmX3QpbWF4TGVuIC0gZGVsdGEyXSAhPSBjdXJbbWF4TGVuXSkNCisgICAgICAgIGJyZWFrOw0KKyAgICBkaXN0YW5jZXNbb2Zmc2V0IC0gMl0gPSBtYXhMZW47DQorICAgIGlmIChtYXhMZW4gPT0gbGVuTGltaXQpDQorICAgIHsNCisgICAgICBwLT5zb25bcC0+Y3ljbGljQnVmZmVyUG9zXSA9IGN1ck1hdGNoOw0KKyAgICAgIE1PVkVfUE9TX1JFVDsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1heExlbiA8IDMpDQorICAgIG1heExlbiA9IDM7DQorICBvZmZzZXQgPSAoVUludDMyKShIY19HZXRNYXRjaGVzU3BlYyhsZW5MaW1pdCwgY3VyTWF0Y2gsIE1GX1BBUkFNUyhwKSwNCisgICAgZGlzdGFuY2VzICsgb2Zmc2V0LCBtYXhMZW4pIC0gKGRpc3RhbmNlcykpOw0KKyAgTU9WRV9QT1NfUkVUDQorfQ0KKw0KK1VJbnQzMiBIYzNaaXBfTWF0Y2hGaW5kZXJfR2V0TWF0Y2hlcyhDTWF0Y2hGaW5kZXIgKnAsIFVJbnQzMiAqZGlzdGFuY2VzKQ0KK3sNCisgIFVJbnQzMiBvZmZzZXQ7DQorICBHRVRfTUFUQ0hFU19IRUFERVIoMykNCisgIEhBU0hfWklQX0NBTEM7DQorICBjdXJNYXRjaCA9IHAtPmhhc2hbaGFzaFZhbHVlXTsNCisgIHAtPmhhc2hbaGFzaFZhbHVlXSA9IHAtPnBvczsNCisgIG9mZnNldCA9IChVSW50MzIpKEhjX0dldE1hdGNoZXNTcGVjKGxlbkxpbWl0LCBjdXJNYXRjaCwgTUZfUEFSQU1TKHApLA0KKyAgICBkaXN0YW5jZXMsIDIpIC0gKGRpc3RhbmNlcykpOw0KKyAgTU9WRV9QT1NfUkVUDQorfQ0KKw0KK3N0YXRpYyB2b2lkIEJ0Ml9NYXRjaEZpbmRlcl9Ta2lwKENNYXRjaEZpbmRlciAqcCwgVUludDMyIG51bSkNCit7DQorICBkbw0KKyAgew0KKyAgICBTS0lQX0hFQURFUigyKQ0KKyAgICBIQVNIMl9DQUxDOw0KKyAgICBjdXJNYXRjaCA9IHAtPmhhc2hbaGFzaFZhbHVlXTsNCisgICAgcC0+aGFzaFtoYXNoVmFsdWVdID0gcC0+cG9zOw0KKyAgICBTS0lQX0ZPT1RFUg0KKyAgfQ0KKyAgd2hpbGUgKC0tbnVtICE9IDApOw0KK30NCisNCit2b2lkIEJ0M1ppcF9NYXRjaEZpbmRlcl9Ta2lwKENNYXRjaEZpbmRlciAqcCwgVUludDMyIG51bSkNCit7DQorICBkbw0KKyAgew0KKyAgICBTS0lQX0hFQURFUigzKQ0KKyAgICBIQVNIX1pJUF9DQUxDOw0KKyAgICBjdXJNYXRjaCA9IHAtPmhhc2hbaGFzaFZhbHVlXTsNCisgICAgcC0+aGFzaFtoYXNoVmFsdWVdID0gcC0+cG9zOw0KKyAgICBTS0lQX0ZPT1RFUg0KKyAgfQ0KKyAgd2hpbGUgKC0tbnVtICE9IDApOw0KK30NCisNCitzdGF0aWMgdm9pZCBCdDNfTWF0Y2hGaW5kZXJfU2tpcChDTWF0Y2hGaW5kZXIgKnAsIFVJbnQzMiBudW0pDQorew0KKyAgZG8NCisgIHsNCisgICAgVUludDMyIGhhc2gyVmFsdWU7DQorICAgIFNLSVBfSEVBREVSKDMpDQorICAgIEhBU0gzX0NBTEM7DQorICAgIGN1ck1hdGNoID0gcC0+aGFzaFtrRml4M0hhc2hTaXplICsgaGFzaFZhbHVlXTsNCisgICAgcC0+aGFzaFtoYXNoMlZhbHVlXSA9DQorICAgIHAtPmhhc2hba0ZpeDNIYXNoU2l6ZSArIGhhc2hWYWx1ZV0gPSBwLT5wb3M7DQorICAgIFNLSVBfRk9PVEVSDQorICB9DQorICB3aGlsZSAoLS1udW0gIT0gMCk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIEJ0NF9NYXRjaEZpbmRlcl9Ta2lwKENNYXRjaEZpbmRlciAqcCwgVUludDMyIG51bSkNCit7DQorICBkbw0KKyAgew0KKyAgICBVSW50MzIgaGFzaDJWYWx1ZSwgaGFzaDNWYWx1ZTsNCisgICAgU0tJUF9IRUFERVIoNCkNCisgICAgSEFTSDRfQ0FMQzsNCisgICAgY3VyTWF0Y2ggPSBwLT5oYXNoW2tGaXg0SGFzaFNpemUgKyBoYXNoVmFsdWVdOw0KKyAgICBwLT5oYXNoWyAgICAgICAgICAgICAgICBoYXNoMlZhbHVlXSA9DQorICAgIHAtPmhhc2hba0ZpeDNIYXNoU2l6ZSArIGhhc2gzVmFsdWVdID0gcC0+cG9zOw0KKyAgICBwLT5oYXNoW2tGaXg0SGFzaFNpemUgKyBoYXNoVmFsdWVdID0gcC0+cG9zOw0KKyAgICBTS0lQX0ZPT1RFUg0KKyAgfQ0KKyAgd2hpbGUgKC0tbnVtICE9IDApOw0KK30NCisNCitzdGF0aWMgdm9pZCBIYzRfTWF0Y2hGaW5kZXJfU2tpcChDTWF0Y2hGaW5kZXIgKnAsIFVJbnQzMiBudW0pDQorew0KKyAgZG8NCisgIHsNCisgICAgVUludDMyIGhhc2gyVmFsdWUsIGhhc2gzVmFsdWU7DQorICAgIFNLSVBfSEVBREVSKDQpDQorICAgIEhBU0g0X0NBTEM7DQorICAgIGN1ck1hdGNoID0gcC0+aGFzaFtrRml4NEhhc2hTaXplICsgaGFzaFZhbHVlXTsNCisgICAgcC0+aGFzaFsgICAgICAgICAgICAgICAgaGFzaDJWYWx1ZV0gPQ0KKyAgICBwLT5oYXNoW2tGaXgzSGFzaFNpemUgKyBoYXNoM1ZhbHVlXSA9DQorICAgIHAtPmhhc2hba0ZpeDRIYXNoU2l6ZSArIGhhc2hWYWx1ZV0gPSBwLT5wb3M7DQorICAgIHAtPnNvbltwLT5jeWNsaWNCdWZmZXJQb3NdID0gY3VyTWF0Y2g7DQorICAgIE1PVkVfUE9TDQorICB9DQorICB3aGlsZSAoLS1udW0gIT0gMCk7DQorfQ0KKw0KK3ZvaWQgSGMzWmlwX01hdGNoRmluZGVyX1NraXAoQ01hdGNoRmluZGVyICpwLCBVSW50MzIgbnVtKQ0KK3sNCisgIGRvDQorICB7DQorICAgIFNLSVBfSEVBREVSKDMpDQorICAgIEhBU0hfWklQX0NBTEM7DQorICAgIGN1ck1hdGNoID0gcC0+aGFzaFtoYXNoVmFsdWVdOw0KKyAgICBwLT5oYXNoW2hhc2hWYWx1ZV0gPSBwLT5wb3M7DQorICAgIHAtPnNvbltwLT5jeWNsaWNCdWZmZXJQb3NdID0gY3VyTWF0Y2g7DQorICAgIE1PVkVfUE9TDQorICB9DQorICB3aGlsZSAoLS1udW0gIT0gMCk7DQorfQ0KKw0KK3ZvaWQgTWF0Y2hGaW5kZXJfQ3JlYXRlVlRhYmxlKENNYXRjaEZpbmRlciAqcCwgSU1hdGNoRmluZGVyICp2VGFibGUpDQorew0KKyAgdlRhYmxlLT5Jbml0ID0gKE1mX0luaXRfRnVuYylNYXRjaEZpbmRlcl9Jbml0Ow0KKyAgdlRhYmxlLT5HZXRJbmRleEJ5dGUgPSAoTWZfR2V0SW5kZXhCeXRlX0Z1bmMpTWF0Y2hGaW5kZXJfR2V0SW5kZXhCeXRlOw0KKyAgdlRhYmxlLT5HZXROdW1BdmFpbGFibGVCeXRlcyA9IChNZl9HZXROdW1BdmFpbGFibGVCeXRlc19GdW5jKU1hdGNoRmluZGVyX0dldE51bUF2YWlsYWJsZUJ5dGVzOw0KKyAgdlRhYmxlLT5HZXRQb2ludGVyVG9DdXJyZW50UG9zID0gKE1mX0dldFBvaW50ZXJUb0N1cnJlbnRQb3NfRnVuYylNYXRjaEZpbmRlcl9HZXRQb2ludGVyVG9DdXJyZW50UG9zOw0KKyAgaWYgKCFwLT5idE1vZGUpDQorICB7DQorICAgIHZUYWJsZS0+R2V0TWF0Y2hlcyA9IChNZl9HZXRNYXRjaGVzX0Z1bmMpSGM0X01hdGNoRmluZGVyX0dldE1hdGNoZXM7DQorICAgIHZUYWJsZS0+U2tpcCA9IChNZl9Ta2lwX0Z1bmMpSGM0X01hdGNoRmluZGVyX1NraXA7DQorICB9DQorICBlbHNlIGlmIChwLT5udW1IYXNoQnl0ZXMgPT0gMikNCisgIHsNCisgICAgdlRhYmxlLT5HZXRNYXRjaGVzID0gKE1mX0dldE1hdGNoZXNfRnVuYylCdDJfTWF0Y2hGaW5kZXJfR2V0TWF0Y2hlczsNCisgICAgdlRhYmxlLT5Ta2lwID0gKE1mX1NraXBfRnVuYylCdDJfTWF0Y2hGaW5kZXJfU2tpcDsNCisgIH0NCisgIGVsc2UgaWYgKHAtPm51bUhhc2hCeXRlcyA9PSAzKQ0KKyAgew0KKyAgICB2VGFibGUtPkdldE1hdGNoZXMgPSAoTWZfR2V0TWF0Y2hlc19GdW5jKUJ0M19NYXRjaEZpbmRlcl9HZXRNYXRjaGVzOw0KKyAgICB2VGFibGUtPlNraXAgPSAoTWZfU2tpcF9GdW5jKUJ0M19NYXRjaEZpbmRlcl9Ta2lwOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICB2VGFibGUtPkdldE1hdGNoZXMgPSAoTWZfR2V0TWF0Y2hlc19GdW5jKUJ0NF9NYXRjaEZpbmRlcl9HZXRNYXRjaGVzOw0KKyAgICB2VGFibGUtPlNraXAgPSAoTWZfU2tpcF9GdW5jKUJ0NF9NYXRjaEZpbmRlcl9Ta2lwOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9sem1hL0MvTHpGaW5kLmggYi9sem1hL0MvTHpGaW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkNTAwMAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9MekZpbmQuaApAQCAtMCwwICsxLDExMSBAQAorLyogTHpGaW5kLmggLS0gTWF0Y2ggZmluZGVyIGZvciBMWiBhbGdvcml0aG1zDQorMjAxMy0wMS0xOCA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpZm5kZWYgX19MWl9GSU5EX0gNCisjZGVmaW5lIF9fTFpfRklORF9IDQorDQorI2luY2x1ZGUgIjd6VHlwZXMuaCINCisNCitFWFRFUk5fQ19CRUdJTg0KKw0KK3R5cGVkZWYgVUludDMyIENMelJlZjsNCisNCit0eXBlZGVmIHN0cnVjdCBfQ01hdGNoRmluZGVyDQorew0KKyAgQnl0ZSAqYnVmZmVyOw0KKyAgVUludDMyIHBvczsNCisgIFVJbnQzMiBwb3NMaW1pdDsNCisgIFVJbnQzMiBzdHJlYW1Qb3M7DQorICBVSW50MzIgbGVuTGltaXQ7DQorDQorICBVSW50MzIgY3ljbGljQnVmZmVyUG9zOw0KKyAgVUludDMyIGN5Y2xpY0J1ZmZlclNpemU7IC8qIGl0IG11c3QgYmUgPSAoaGlzdG9yeVNpemUgKyAxKSAqLw0KKw0KKyAgVUludDMyIG1hdGNoTWF4TGVuOw0KKyAgQ0x6UmVmICpoYXNoOw0KKyAgQ0x6UmVmICpzb247DQorICBVSW50MzIgaGFzaE1hc2s7DQorICBVSW50MzIgY3V0VmFsdWU7DQorDQorICBCeXRlICpidWZmZXJCYXNlOw0KKyAgSVNlcUluU3RyZWFtICpzdHJlYW07DQorICBpbnQgc3RyZWFtRW5kV2FzUmVhY2hlZDsNCisNCisgIFVJbnQzMiBibG9ja1NpemU7DQorICBVSW50MzIga2VlcFNpemVCZWZvcmU7DQorICBVSW50MzIga2VlcFNpemVBZnRlcjsNCisNCisgIFVJbnQzMiBudW1IYXNoQnl0ZXM7DQorICBpbnQgZGlyZWN0SW5wdXQ7DQorICBzaXplX3QgZGlyZWN0SW5wdXRSZW07DQorICBpbnQgYnRNb2RlOw0KKyAgaW50IGJpZ0hhc2g7DQorICBVSW50MzIgaGlzdG9yeVNpemU7DQorICBVSW50MzIgZml4ZWRIYXNoU2l6ZTsNCisgIFVJbnQzMiBoYXNoU2l6ZVN1bTsNCisgIFVJbnQzMiBudW1Tb25zOw0KKyAgU1JlcyByZXN1bHQ7DQorICBVSW50MzIgY3JjWzI1Nl07DQorfSBDTWF0Y2hGaW5kZXI7DQorDQorI2RlZmluZSBJbmxpbmVfTWF0Y2hGaW5kZXJfR2V0UG9pbnRlclRvQ3VycmVudFBvcyhwKSAoKHApLT5idWZmZXIpDQorI2RlZmluZSBJbmxpbmVfTWF0Y2hGaW5kZXJfR2V0SW5kZXhCeXRlKHAsIGluZGV4KSAoKHApLT5idWZmZXJbKEludDMyKShpbmRleCldKQ0KKw0KKyNkZWZpbmUgSW5saW5lX01hdGNoRmluZGVyX0dldE51bUF2YWlsYWJsZUJ5dGVzKHApICgocCktPnN0cmVhbVBvcyAtIChwKS0+cG9zKQ0KKw0KK2ludCBNYXRjaEZpbmRlcl9OZWVkTW92ZShDTWF0Y2hGaW5kZXIgKnApOw0KK0J5dGUgKk1hdGNoRmluZGVyX0dldFBvaW50ZXJUb0N1cnJlbnRQb3MoQ01hdGNoRmluZGVyICpwKTsNCit2b2lkIE1hdGNoRmluZGVyX01vdmVCbG9jayhDTWF0Y2hGaW5kZXIgKnApOw0KK3ZvaWQgTWF0Y2hGaW5kZXJfUmVhZElmUmVxdWlyZWQoQ01hdGNoRmluZGVyICpwKTsNCisNCit2b2lkIE1hdGNoRmluZGVyX0NvbnN0cnVjdChDTWF0Y2hGaW5kZXIgKnApOw0KKw0KKy8qIENvbmRpdGlvbnM6DQorICAgICBoaXN0b3J5U2l6ZSA8PSAzIEdCDQorICAgICBrZWVwQWRkQnVmZmVyQmVmb3JlICsgbWF0Y2hNYXhMZW4gKyBrZWVwQWRkQnVmZmVyQWZ0ZXIgPCA1MTFNQg0KKyovDQoraW50IE1hdGNoRmluZGVyX0NyZWF0ZShDTWF0Y2hGaW5kZXIgKnAsIFVJbnQzMiBoaXN0b3J5U2l6ZSwNCisgICAgVUludDMyIGtlZXBBZGRCdWZmZXJCZWZvcmUsIFVJbnQzMiBtYXRjaE1heExlbiwgVUludDMyIGtlZXBBZGRCdWZmZXJBZnRlciwNCisgICAgSVN6QWxsb2MgKmFsbG9jKTsNCit2b2lkIE1hdGNoRmluZGVyX0ZyZWUoQ01hdGNoRmluZGVyICpwLCBJU3pBbGxvYyAqYWxsb2MpOw0KK3ZvaWQgTWF0Y2hGaW5kZXJfTm9ybWFsaXplMyhVSW50MzIgc3ViVmFsdWUsIENMelJlZiAqaXRlbXMsIFVJbnQzMiBudW1JdGVtcyk7DQordm9pZCBNYXRjaEZpbmRlcl9SZWR1Y2VPZmZzZXRzKENNYXRjaEZpbmRlciAqcCwgVUludDMyIHN1YlZhbHVlKTsNCisNCitVSW50MzIgKiBHZXRNYXRjaGVzU3BlYzEoVUludDMyIGxlbkxpbWl0LCBVSW50MzIgY3VyTWF0Y2gsIFVJbnQzMiBwb3MsIGNvbnN0IEJ5dGUgKmJ1ZmZlciwgQ0x6UmVmICpzb24sDQorICAgIFVJbnQzMiBfY3ljbGljQnVmZmVyUG9zLCBVSW50MzIgX2N5Y2xpY0J1ZmZlclNpemUsIFVJbnQzMiBfY3V0VmFsdWUsDQorICAgIFVJbnQzMiAqZGlzdGFuY2VzLCBVSW50MzIgbWF4TGVuKTsNCisNCisvKg0KK0NvbmRpdGlvbnM6DQorICBNZl9HZXROdW1BdmFpbGFibGVCeXRlc19GdW5jIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBlYWNoIE1mX0dldE1hdGNoTGVuX0Z1bmMuDQorICBNZl9HZXRQb2ludGVyVG9DdXJyZW50UG9zX0Z1bmMncyByZXN1bHQgbXVzdCBiZSB1c2VkIG9ubHkgYmVmb3JlIGFueSBvdGhlciBmdW5jdGlvbg0KKyovDQorDQordHlwZWRlZiB2b2lkICgqTWZfSW5pdF9GdW5jKSh2b2lkICpvYmplY3QpOw0KK3R5cGVkZWYgQnl0ZSAoKk1mX0dldEluZGV4Qnl0ZV9GdW5jKSh2b2lkICpvYmplY3QsIEludDMyIGluZGV4KTsNCit0eXBlZGVmIFVJbnQzMiAoKk1mX0dldE51bUF2YWlsYWJsZUJ5dGVzX0Z1bmMpKHZvaWQgKm9iamVjdCk7DQordHlwZWRlZiBjb25zdCBCeXRlICogKCpNZl9HZXRQb2ludGVyVG9DdXJyZW50UG9zX0Z1bmMpKHZvaWQgKm9iamVjdCk7DQordHlwZWRlZiBVSW50MzIgKCpNZl9HZXRNYXRjaGVzX0Z1bmMpKHZvaWQgKm9iamVjdCwgVUludDMyICpkaXN0YW5jZXMpOw0KK3R5cGVkZWYgdm9pZCAoKk1mX1NraXBfRnVuYykodm9pZCAqb2JqZWN0LCBVSW50MzIpOw0KKw0KK3R5cGVkZWYgc3RydWN0IF9JTWF0Y2hGaW5kZXINCit7DQorICBNZl9Jbml0X0Z1bmMgSW5pdDsNCisgIE1mX0dldEluZGV4Qnl0ZV9GdW5jIEdldEluZGV4Qnl0ZTsNCisgIE1mX0dldE51bUF2YWlsYWJsZUJ5dGVzX0Z1bmMgR2V0TnVtQXZhaWxhYmxlQnl0ZXM7DQorICBNZl9HZXRQb2ludGVyVG9DdXJyZW50UG9zX0Z1bmMgR2V0UG9pbnRlclRvQ3VycmVudFBvczsNCisgIE1mX0dldE1hdGNoZXNfRnVuYyBHZXRNYXRjaGVzOw0KKyAgTWZfU2tpcF9GdW5jIFNraXA7DQorfSBJTWF0Y2hGaW5kZXI7DQorDQordm9pZCBNYXRjaEZpbmRlcl9DcmVhdGVWVGFibGUoQ01hdGNoRmluZGVyICpwLCBJTWF0Y2hGaW5kZXIgKnZUYWJsZSk7DQorDQordm9pZCBNYXRjaEZpbmRlcl9Jbml0KENNYXRjaEZpbmRlciAqcCk7DQorVUludDMyIEJ0M1ppcF9NYXRjaEZpbmRlcl9HZXRNYXRjaGVzKENNYXRjaEZpbmRlciAqcCwgVUludDMyICpkaXN0YW5jZXMpOw0KK1VJbnQzMiBIYzNaaXBfTWF0Y2hGaW5kZXJfR2V0TWF0Y2hlcyhDTWF0Y2hGaW5kZXIgKnAsIFVJbnQzMiAqZGlzdGFuY2VzKTsNCit2b2lkIEJ0M1ppcF9NYXRjaEZpbmRlcl9Ta2lwKENNYXRjaEZpbmRlciAqcCwgVUludDMyIG51bSk7DQordm9pZCBIYzNaaXBfTWF0Y2hGaW5kZXJfU2tpcChDTWF0Y2hGaW5kZXIgKnAsIFVJbnQzMiBudW0pOw0KKw0KK0VYVEVSTl9DX0VORA0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy9MekZpbmRNdC5jIGIvbHptYS9DL0x6RmluZE10LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1NmQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9MekZpbmRNdC5jCkBAIC0wLDAgKzEsNzk0IEBACisvKiBMekZpbmRNdC5jIC0tIG11bHRpdGhyZWFkZWQgTWF0Y2ggZmluZGVyIGZvciBMWiBhbGdvcml0aG1zDQorMjAxNC0xMi0yOSA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlICJQcmVjb21wLmgiDQorDQorI2luY2x1ZGUgIkx6SGFzaC5oIg0KKw0KKyNpbmNsdWRlICJMekZpbmRNdC5oIg0KKw0KK3ZvaWQgTXRTeW5jX0NvbnN0cnVjdChDTXRTeW5jICpwKQ0KK3sNCisgIHAtPndhc0NyZWF0ZWQgPSBGYWxzZTsNCisgIHAtPmNzV2FzSW5pdGlhbGl6ZWQgPSBGYWxzZTsNCisgIHAtPmNzV2FzRW50ZXJlZCA9IEZhbHNlOw0KKyAgVGhyZWFkX0NvbnN0cnVjdCgmcC0+dGhyZWFkKTsNCisgIEV2ZW50X0NvbnN0cnVjdCgmcC0+Y2FuU3RhcnQpOw0KKyAgRXZlbnRfQ29uc3RydWN0KCZwLT53YXNTdGFydGVkKTsNCisgIEV2ZW50X0NvbnN0cnVjdCgmcC0+d2FzU3RvcHBlZCk7DQorICBTZW1hcGhvcmVfQ29uc3RydWN0KCZwLT5mcmVlU2VtYXBob3JlKTsNCisgIFNlbWFwaG9yZV9Db25zdHJ1Y3QoJnAtPmZpbGxlZFNlbWFwaG9yZSk7DQorfQ0KKw0KK3ZvaWQgTXRTeW5jX0dldE5leHRCbG9jayhDTXRTeW5jICpwKQ0KK3sNCisgIGlmIChwLT5uZWVkU3RhcnQpDQorICB7DQorICAgIHAtPm51bVByb2Nlc3NlZEJsb2NrcyA9IDE7DQorICAgIHAtPm5lZWRTdGFydCA9IEZhbHNlOw0KKyAgICBwLT5zdG9wV3JpdGluZyA9IEZhbHNlOw0KKyAgICBwLT5leGl0ID0gRmFsc2U7DQorICAgIEV2ZW50X1Jlc2V0KCZwLT53YXNTdGFydGVkKTsNCisgICAgRXZlbnRfUmVzZXQoJnAtPndhc1N0b3BwZWQpOw0KKw0KKyAgICBFdmVudF9TZXQoJnAtPmNhblN0YXJ0KTsNCisgICAgRXZlbnRfV2FpdCgmcC0+d2FzU3RhcnRlZCk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIENyaXRpY2FsU2VjdGlvbl9MZWF2ZSgmcC0+Y3MpOw0KKyAgICBwLT5jc1dhc0VudGVyZWQgPSBGYWxzZTsNCisgICAgcC0+bnVtUHJvY2Vzc2VkQmxvY2tzKys7DQorICAgIFNlbWFwaG9yZV9SZWxlYXNlMSgmcC0+ZnJlZVNlbWFwaG9yZSk7DQorICB9DQorICBTZW1hcGhvcmVfV2FpdCgmcC0+ZmlsbGVkU2VtYXBob3JlKTsNCisgIENyaXRpY2FsU2VjdGlvbl9FbnRlcigmcC0+Y3MpOw0KKyAgcC0+Y3NXYXNFbnRlcmVkID0gVHJ1ZTsNCit9DQorDQorLyogTXRTeW5jX1N0b3BXcml0aW5nIG11c3QgYmUgY2FsbGVkIGlmIFdyaXRpbmcgd2FzIHN0YXJ0ZWQgKi8NCisNCit2b2lkIE10U3luY19TdG9wV3JpdGluZyhDTXRTeW5jICpwKQ0KK3sNCisgIFVJbnQzMiBteU51bUJsb2NrcyA9IHAtPm51bVByb2Nlc3NlZEJsb2NrczsNCisgIGlmICghVGhyZWFkX1dhc0NyZWF0ZWQoJnAtPnRocmVhZCkgfHwgcC0+bmVlZFN0YXJ0KQ0KKyAgICByZXR1cm47DQorICBwLT5zdG9wV3JpdGluZyA9IFRydWU7DQorICBpZiAocC0+Y3NXYXNFbnRlcmVkKQ0KKyAgew0KKyAgICBDcml0aWNhbFNlY3Rpb25fTGVhdmUoJnAtPmNzKTsNCisgICAgcC0+Y3NXYXNFbnRlcmVkID0gRmFsc2U7DQorICB9DQorICBTZW1hcGhvcmVfUmVsZWFzZTEoJnAtPmZyZWVTZW1hcGhvcmUpOw0KKyANCisgIEV2ZW50X1dhaXQoJnAtPndhc1N0b3BwZWQpOw0KKw0KKyAgd2hpbGUgKG15TnVtQmxvY2tzKysgIT0gcC0+bnVtUHJvY2Vzc2VkQmxvY2tzKQ0KKyAgew0KKyAgICBTZW1hcGhvcmVfV2FpdCgmcC0+ZmlsbGVkU2VtYXBob3JlKTsNCisgICAgU2VtYXBob3JlX1JlbGVhc2UxKCZwLT5mcmVlU2VtYXBob3JlKTsNCisgIH0NCisgIHAtPm5lZWRTdGFydCA9IFRydWU7DQorfQ0KKw0KK3ZvaWQgTXRTeW5jX0Rlc3RydWN0KENNdFN5bmMgKnApDQorew0KKyAgaWYgKFRocmVhZF9XYXNDcmVhdGVkKCZwLT50aHJlYWQpKQ0KKyAgew0KKyAgICBNdFN5bmNfU3RvcFdyaXRpbmcocCk7DQorICAgIHAtPmV4aXQgPSBUcnVlOw0KKyAgICBpZiAocC0+bmVlZFN0YXJ0KQ0KKyAgICAgIEV2ZW50X1NldCgmcC0+Y2FuU3RhcnQpOw0KKyAgICBUaHJlYWRfV2FpdCgmcC0+dGhyZWFkKTsNCisgICAgVGhyZWFkX0Nsb3NlKCZwLT50aHJlYWQpOw0KKyAgfQ0KKyAgaWYgKHAtPmNzV2FzSW5pdGlhbGl6ZWQpDQorICB7DQorICAgIENyaXRpY2FsU2VjdGlvbl9EZWxldGUoJnAtPmNzKTsNCisgICAgcC0+Y3NXYXNJbml0aWFsaXplZCA9IEZhbHNlOw0KKyAgfQ0KKw0KKyAgRXZlbnRfQ2xvc2UoJnAtPmNhblN0YXJ0KTsNCisgIEV2ZW50X0Nsb3NlKCZwLT53YXNTdGFydGVkKTsNCisgIEV2ZW50X0Nsb3NlKCZwLT53YXNTdG9wcGVkKTsNCisgIFNlbWFwaG9yZV9DbG9zZSgmcC0+ZnJlZVNlbWFwaG9yZSk7DQorICBTZW1hcGhvcmVfQ2xvc2UoJnAtPmZpbGxlZFNlbWFwaG9yZSk7DQorDQorICBwLT53YXNDcmVhdGVkID0gRmFsc2U7DQorfQ0KKw0KKyNkZWZpbmUgUklOT0tfVEhSRUFEKHgpIHsgaWYgKCh4KSAhPSAwKSByZXR1cm4gU1pfRVJST1JfVEhSRUFEOyB9DQorDQorc3RhdGljIFNSZXMgTXRTeW5jX0NyZWF0ZTIoQ010U3luYyAqcCwgVEhSRUFEX0ZVTkNfVFlQRSBzdGFydEFkZHJlc3MsIHZvaWQgKm9iaiwgVUludDMyIG51bUJsb2NrcykNCit7DQorICBpZiAocC0+d2FzQ3JlYXRlZCkNCisgICAgcmV0dXJuIFNaX09LOw0KKw0KKyAgUklOT0tfVEhSRUFEKENyaXRpY2FsU2VjdGlvbl9Jbml0KCZwLT5jcykpOw0KKyAgcC0+Y3NXYXNJbml0aWFsaXplZCA9IFRydWU7DQorDQorICBSSU5PS19USFJFQUQoQXV0b1Jlc2V0RXZlbnRfQ3JlYXRlTm90U2lnbmFsZWQoJnAtPmNhblN0YXJ0KSk7DQorICBSSU5PS19USFJFQUQoQXV0b1Jlc2V0RXZlbnRfQ3JlYXRlTm90U2lnbmFsZWQoJnAtPndhc1N0YXJ0ZWQpKTsNCisgIFJJTk9LX1RIUkVBRChBdXRvUmVzZXRFdmVudF9DcmVhdGVOb3RTaWduYWxlZCgmcC0+d2FzU3RvcHBlZCkpOw0KKyAgDQorICBSSU5PS19USFJFQUQoU2VtYXBob3JlX0NyZWF0ZSgmcC0+ZnJlZVNlbWFwaG9yZSwgbnVtQmxvY2tzLCBudW1CbG9ja3MpKTsNCisgIFJJTk9LX1RIUkVBRChTZW1hcGhvcmVfQ3JlYXRlKCZwLT5maWxsZWRTZW1hcGhvcmUsIDAsIG51bUJsb2NrcykpOw0KKw0KKyAgcC0+bmVlZFN0YXJ0ID0gVHJ1ZTsNCisgIA0KKyAgUklOT0tfVEhSRUFEKFRocmVhZF9DcmVhdGUoJnAtPnRocmVhZCwgc3RhcnRBZGRyZXNzLCBvYmopKTsNCisgIHAtPndhc0NyZWF0ZWQgPSBUcnVlOw0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCitzdGF0aWMgU1JlcyBNdFN5bmNfQ3JlYXRlKENNdFN5bmMgKnAsIFRIUkVBRF9GVU5DX1RZUEUgc3RhcnRBZGRyZXNzLCB2b2lkICpvYmosIFVJbnQzMiBudW1CbG9ja3MpDQorew0KKyAgU1JlcyByZXMgPSBNdFN5bmNfQ3JlYXRlMihwLCBzdGFydEFkZHJlc3MsIG9iaiwgbnVtQmxvY2tzKTsNCisgIGlmIChyZXMgIT0gU1pfT0spDQorICAgIE10U3luY19EZXN0cnVjdChwKTsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK3ZvaWQgTXRTeW5jX0luaXQoQ010U3luYyAqcCkgeyBwLT5uZWVkU3RhcnQgPSBUcnVlOyB9DQorDQorI2RlZmluZSBrTXRNYXhWYWxGb3JOb3JtYWxpemUgMHhGRkZGRkZGRg0KKw0KKyNkZWZpbmUgREVGX0dldEhlYWRzMihuYW1lLCB2LCBhY3Rpb24pIFwNCitzdGF0aWMgdm9pZCBHZXRIZWFkcyAjIyBuYW1lKGNvbnN0IEJ5dGUgKnAsIFVJbnQzMiBwb3MsIFwNCitVSW50MzIgKmhhc2gsIFVJbnQzMiBoYXNoTWFzaywgVUludDMyICpoZWFkcywgVUludDMyIG51bUhlYWRzLCBjb25zdCBVSW50MzIgKmNyYykgXA0KK3sgYWN0aW9uOyBmb3IgKDsgbnVtSGVhZHMgIT0gMDsgbnVtSGVhZHMtLSkgeyBcDQorY29uc3QgVUludDMyIHZhbHVlID0gKHYpOyBwKys7ICpoZWFkcysrID0gcG9zIC0gaGFzaFt2YWx1ZV07IGhhc2hbdmFsdWVdID0gcG9zKys7ICB9IH0NCisNCisjZGVmaW5lIERFRl9HZXRIZWFkcyhuYW1lLCB2KSBERUZfR2V0SGVhZHMyKG5hbWUsIHYsIDspDQorDQorREVGX0dldEhlYWRzMigyLCAgKHBbMF0gfCAoKFVJbnQzMilwWzFdIDw8IDgpKSwgaGFzaE1hc2sgPSBoYXNoTWFzazsgY3JjID0gY3JjOyApDQorREVGX0dldEhlYWRzKDMsICAoY3JjW3BbMF1dIF4gcFsxXSBeICgoVUludDMyKXBbMl0gPDwgOCkpICYgaGFzaE1hc2spDQorREVGX0dldEhlYWRzKDQsICAoY3JjW3BbMF1dIF4gcFsxXSBeICgoVUludDMyKXBbMl0gPDwgOCkgXiAoY3JjW3BbM11dIDw8IDUpKSAmIGhhc2hNYXNrKQ0KK0RFRl9HZXRIZWFkcyg0YiwgKGNyY1twWzBdXSBeIHBbMV0gXiAoKFVJbnQzMilwWzJdIDw8IDgpIF4gKChVSW50MzIpcFszXSA8PCAxNikpICYgaGFzaE1hc2spDQorLyogREVGX0dldEhlYWRzKDUsICAoY3JjW3BbMF1dIF4gcFsxXSBeICgoVUludDMyKXBbMl0gPDwgOCkgXiAoY3JjW3BbM11dIDw8IDUpIF4gKGNyY1twWzRdXSA8PCAzKSkgJiBoYXNoTWFzaykgKi8NCisNCit2b2lkIEhhc2hUaHJlYWRGdW5jKENNYXRjaEZpbmRlck10ICptdCkNCit7DQorICBDTXRTeW5jICpwID0gJm10LT5oYXNoU3luYzsNCisgIGZvciAoOzspDQorICB7DQorICAgIFVJbnQzMiBudW1Qcm9jZXNzZWRCbG9ja3MgPSAwOw0KKyAgICBFdmVudF9XYWl0KCZwLT5jYW5TdGFydCk7DQorICAgIEV2ZW50X1NldCgmcC0+d2FzU3RhcnRlZCk7DQorICAgIGZvciAoOzspDQorICAgIHsNCisgICAgICBpZiAocC0+ZXhpdCkNCisgICAgICAgIHJldHVybjsNCisgICAgICBpZiAocC0+c3RvcFdyaXRpbmcpDQorICAgICAgew0KKyAgICAgICAgcC0+bnVtUHJvY2Vzc2VkQmxvY2tzID0gbnVtUHJvY2Vzc2VkQmxvY2tzOw0KKyAgICAgICAgRXZlbnRfU2V0KCZwLT53YXNTdG9wcGVkKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisNCisgICAgICB7DQorICAgICAgICBDTWF0Y2hGaW5kZXIgKm1mID0gbXQtPk1hdGNoRmluZGVyOw0KKyAgICAgICAgaWYgKE1hdGNoRmluZGVyX05lZWRNb3ZlKG1mKSkNCisgICAgICAgIHsNCisgICAgICAgICAgQ3JpdGljYWxTZWN0aW9uX0VudGVyKCZtdC0+YnRTeW5jLmNzKTsNCisgICAgICAgICAgQ3JpdGljYWxTZWN0aW9uX0VudGVyKCZtdC0+aGFzaFN5bmMuY3MpOw0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgY29uc3QgQnl0ZSAqYmVmb3JlUHRyID0gTWF0Y2hGaW5kZXJfR2V0UG9pbnRlclRvQ3VycmVudFBvcyhtZik7DQorICAgICAgICAgICAgY29uc3QgQnl0ZSAqYWZ0ZXJQdHI7DQorICAgICAgICAgICAgTWF0Y2hGaW5kZXJfTW92ZUJsb2NrKG1mKTsNCisgICAgICAgICAgICBhZnRlclB0ciA9IE1hdGNoRmluZGVyX0dldFBvaW50ZXJUb0N1cnJlbnRQb3MobWYpOw0KKyAgICAgICAgICAgIG10LT5wb2ludGVyVG9DdXJQb3MgLT0gYmVmb3JlUHRyIC0gYWZ0ZXJQdHI7DQorICAgICAgICAgICAgbXQtPmJ1ZmZlciAtPSBiZWZvcmVQdHIgLSBhZnRlclB0cjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBDcml0aWNhbFNlY3Rpb25fTGVhdmUoJm10LT5idFN5bmMuY3MpOw0KKyAgICAgICAgICBDcml0aWNhbFNlY3Rpb25fTGVhdmUoJm10LT5oYXNoU3luYy5jcyk7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgU2VtYXBob3JlX1dhaXQoJnAtPmZyZWVTZW1hcGhvcmUpOw0KKw0KKyAgICAgICAgTWF0Y2hGaW5kZXJfUmVhZElmUmVxdWlyZWQobWYpOw0KKyAgICAgICAgaWYgKG1mLT5wb3MgPiAoa010TWF4VmFsRm9yTm9ybWFsaXplIC0ga010SGFzaEJsb2NrU2l6ZSkpDQorICAgICAgICB7DQorICAgICAgICAgIFVJbnQzMiBzdWJWYWx1ZSA9IChtZi0+cG9zIC0gbWYtPmhpc3RvcnlTaXplIC0gMSk7DQorICAgICAgICAgIE1hdGNoRmluZGVyX1JlZHVjZU9mZnNldHMobWYsIHN1YlZhbHVlKTsNCisgICAgICAgICAgTWF0Y2hGaW5kZXJfTm9ybWFsaXplMyhzdWJWYWx1ZSwgbWYtPmhhc2ggKyBtZi0+Zml4ZWRIYXNoU2l6ZSwgbWYtPmhhc2hNYXNrICsgMSk7DQorICAgICAgICB9DQorICAgICAgICB7DQorICAgICAgICAgIFVJbnQzMiAqaGVhZHMgPSBtdC0+aGFzaEJ1ZiArICgobnVtUHJvY2Vzc2VkQmxvY2tzKyspICYga010SGFzaE51bUJsb2Nrc01hc2spICoga010SGFzaEJsb2NrU2l6ZTsNCisgICAgICAgICAgVUludDMyIG51bSA9IG1mLT5zdHJlYW1Qb3MgLSBtZi0+cG9zOw0KKyAgICAgICAgICBoZWFkc1swXSA9IDI7DQorICAgICAgICAgIGhlYWRzWzFdID0gbnVtOw0KKyAgICAgICAgICBpZiAobnVtID49IG1mLT5udW1IYXNoQnl0ZXMpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBudW0gPSBudW0gLSBtZi0+bnVtSGFzaEJ5dGVzICsgMTsNCisgICAgICAgICAgICBpZiAobnVtID4ga010SGFzaEJsb2NrU2l6ZSAtIDIpDQorICAgICAgICAgICAgICBudW0gPSBrTXRIYXNoQmxvY2tTaXplIC0gMjsNCisgICAgICAgICAgICBtdC0+R2V0SGVhZHNGdW5jKG1mLT5idWZmZXIsIG1mLT5wb3MsIG1mLT5oYXNoICsgbWYtPmZpeGVkSGFzaFNpemUsIG1mLT5oYXNoTWFzaywgaGVhZHMgKyAyLCBudW0sIG1mLT5jcmMpOw0KKyAgICAgICAgICAgIGhlYWRzWzBdICs9IG51bTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBtZi0+cG9zICs9IG51bTsNCisgICAgICAgICAgbWYtPmJ1ZmZlciArPSBudW07DQorICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIFNlbWFwaG9yZV9SZWxlYXNlMSgmcC0+ZmlsbGVkU2VtYXBob3JlKTsNCisgICAgfQ0KKyAgfQ0KK30NCisNCit2b2lkIE1hdGNoRmluZGVyTXRfR2V0TmV4dEJsb2NrX0hhc2goQ01hdGNoRmluZGVyTXQgKnApDQorew0KKyAgTXRTeW5jX0dldE5leHRCbG9jaygmcC0+aGFzaFN5bmMpOw0KKyAgcC0+aGFzaEJ1ZlBvc0xpbWl0ID0gcC0+aGFzaEJ1ZlBvcyA9ICgocC0+aGFzaFN5bmMubnVtUHJvY2Vzc2VkQmxvY2tzIC0gMSkgJiBrTXRIYXNoTnVtQmxvY2tzTWFzaykgKiBrTXRIYXNoQmxvY2tTaXplOw0KKyAgcC0+aGFzaEJ1ZlBvc0xpbWl0ICs9IHAtPmhhc2hCdWZbcC0+aGFzaEJ1ZlBvcysrXTsNCisgIHAtPmhhc2hOdW1BdmFpbCA9IHAtPmhhc2hCdWZbcC0+aGFzaEJ1ZlBvcysrXTsNCit9DQorDQorI2RlZmluZSBrRW1wdHlIYXNoVmFsdWUgMA0KKw0KKy8qICNkZWZpbmUgTUZNVF9HTV9JTkxJTkUgKi8NCisNCisjaWZkZWYgTUZNVF9HTV9JTkxJTkUNCisNCisjZGVmaW5lIE5PX0lOTElORSBNWV9GQVNUX0NBTEwNCisNCitJbnQzMiBOT19JTkxJTkUgR2V0TWF0Y2hlc1NwZWNOKFVJbnQzMiBsZW5MaW1pdCwgVUludDMyIHBvcywgY29uc3QgQnl0ZSAqY3VyLCBDTHpSZWYgKnNvbiwNCisgICAgVUludDMyIF9jeWNsaWNCdWZmZXJQb3MsIFVJbnQzMiBfY3ljbGljQnVmZmVyU2l6ZSwgVUludDMyIF9jdXRWYWx1ZSwNCisgICAgVUludDMyICpfZGlzdGFuY2VzLCBVSW50MzIgX21heExlbiwgY29uc3QgVUludDMyICpoYXNoLCBJbnQzMiBsaW1pdCwgVUludDMyIHNpemUsIFVJbnQzMiAqcG9zUmVzKQ0KK3sNCisgIGRvDQorICB7DQorICBVSW50MzIgKmRpc3RhbmNlcyA9IF9kaXN0YW5jZXMgKyAxOw0KKyAgVUludDMyIGN1ck1hdGNoID0gcG9zIC0gKmhhc2grKzsNCisNCisgIENMelJlZiAqcHRyMCA9IHNvbiArIChfY3ljbGljQnVmZmVyUG9zIDw8IDEpICsgMTsNCisgIENMelJlZiAqcHRyMSA9IHNvbiArIChfY3ljbGljQnVmZmVyUG9zIDw8IDEpOw0KKyAgVUludDMyIGxlbjAgPSAwLCBsZW4xID0gMDsNCisgIFVJbnQzMiBjdXRWYWx1ZSA9IF9jdXRWYWx1ZTsNCisgIFVJbnQzMiBtYXhMZW4gPSBfbWF4TGVuOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgVUludDMyIGRlbHRhID0gcG9zIC0gY3VyTWF0Y2g7DQorICAgIGlmIChjdXRWYWx1ZS0tID09IDAgfHwgZGVsdGEgPj0gX2N5Y2xpY0J1ZmZlclNpemUpDQorICAgIHsNCisgICAgICAqcHRyMCA9ICpwdHIxID0ga0VtcHR5SGFzaFZhbHVlOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHsNCisgICAgICBDTHpSZWYgKnBhaXIgPSBzb24gKyAoKF9jeWNsaWNCdWZmZXJQb3MgLSBkZWx0YSArICgoZGVsdGEgPiBfY3ljbGljQnVmZmVyUG9zKSA/IF9jeWNsaWNCdWZmZXJTaXplIDogMCkpIDw8IDEpOw0KKyAgICAgIGNvbnN0IEJ5dGUgKnBiID0gY3VyIC0gZGVsdGE7DQorICAgICAgVUludDMyIGxlbiA9IChsZW4wIDwgbGVuMSA/IGxlbjAgOiBsZW4xKTsNCisgICAgICBpZiAocGJbbGVuXSA9PSBjdXJbbGVuXSkNCisgICAgICB7DQorICAgICAgICBpZiAoKytsZW4gIT0gbGVuTGltaXQgJiYgcGJbbGVuXSA9PSBjdXJbbGVuXSkNCisgICAgICAgICAgd2hpbGUgKCsrbGVuICE9IGxlbkxpbWl0KQ0KKyAgICAgICAgICAgIGlmIChwYltsZW5dICE9IGN1cltsZW5dKQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBpZiAobWF4TGVuIDwgbGVuKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAqZGlzdGFuY2VzKysgPSBtYXhMZW4gPSBsZW47DQorICAgICAgICAgICpkaXN0YW5jZXMrKyA9IGRlbHRhIC0gMTsNCisgICAgICAgICAgaWYgKGxlbiA9PSBsZW5MaW1pdCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgICpwdHIxID0gcGFpclswXTsNCisgICAgICAgICAgICAqcHRyMCA9IHBhaXJbMV07DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKHBiW2xlbl0gPCBjdXJbbGVuXSkNCisgICAgICB7DQorICAgICAgICAqcHRyMSA9IGN1ck1hdGNoOw0KKyAgICAgICAgcHRyMSA9IHBhaXIgKyAxOw0KKyAgICAgICAgY3VyTWF0Y2ggPSAqcHRyMTsNCisgICAgICAgIGxlbjEgPSBsZW47DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICAqcHRyMCA9IGN1ck1hdGNoOw0KKyAgICAgICAgcHRyMCA9IHBhaXI7DQorICAgICAgICBjdXJNYXRjaCA9ICpwdHIwOw0KKyAgICAgICAgbGVuMCA9IGxlbjsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHBvcysrOw0KKyAgX2N5Y2xpY0J1ZmZlclBvcysrOw0KKyAgY3VyKys7DQorICB7DQorICAgIFVJbnQzMiBudW0gPSAoVUludDMyKShkaXN0YW5jZXMgLSBfZGlzdGFuY2VzKTsNCisgICAgKl9kaXN0YW5jZXMgPSBudW0gLSAxOw0KKyAgICBfZGlzdGFuY2VzICs9IG51bTsNCisgICAgbGltaXQgLT0gbnVtOw0KKyAgfQ0KKyAgfQ0KKyAgd2hpbGUgKGxpbWl0ID4gMCAmJiAtLXNpemUgIT0gMCk7DQorICAqcG9zUmVzID0gcG9zOw0KKyAgcmV0dXJuIGxpbWl0Ow0KK30NCisNCisjZW5kaWYNCisNCit2b2lkIEJ0R2V0TWF0Y2hlcyhDTWF0Y2hGaW5kZXJNdCAqcCwgVUludDMyICpkaXN0YW5jZXMpDQorew0KKyAgVUludDMyIG51bVByb2Nlc3NlZCA9IDA7DQorICBVSW50MzIgY3VyUG9zID0gMjsNCisgIFVJbnQzMiBsaW1pdCA9IGtNdEJ0QmxvY2tTaXplIC0gKHAtPm1hdGNoTWF4TGVuICogMik7DQorICBkaXN0YW5jZXNbMV0gPSBwLT5oYXNoTnVtQXZhaWw7DQorICB3aGlsZSAoY3VyUG9zIDwgbGltaXQpDQorICB7DQorICAgIGlmIChwLT5oYXNoQnVmUG9zID09IHAtPmhhc2hCdWZQb3NMaW1pdCkNCisgICAgew0KKyAgICAgIE1hdGNoRmluZGVyTXRfR2V0TmV4dEJsb2NrX0hhc2gocCk7DQorICAgICAgZGlzdGFuY2VzWzFdID0gbnVtUHJvY2Vzc2VkICsgcC0+aGFzaE51bUF2YWlsOw0KKyAgICAgIGlmIChwLT5oYXNoTnVtQXZhaWwgPj0gcC0+bnVtSGFzaEJ5dGVzKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgZm9yICg7IHAtPmhhc2hOdW1BdmFpbCAhPSAwOyBwLT5oYXNoTnVtQXZhaWwtLSkNCisgICAgICAgIGRpc3RhbmNlc1tjdXJQb3MrK10gPSAwOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHsNCisgICAgICBVSW50MzIgc2l6ZSA9IHAtPmhhc2hCdWZQb3NMaW1pdCAtIHAtPmhhc2hCdWZQb3M7DQorICAgICAgVUludDMyIGxlbkxpbWl0ID0gcC0+bWF0Y2hNYXhMZW47DQorICAgICAgVUludDMyIHBvcyA9IHAtPnBvczsNCisgICAgICBVSW50MzIgY3ljbGljQnVmZmVyUG9zID0gcC0+Y3ljbGljQnVmZmVyUG9zOw0KKyAgICAgIGlmIChsZW5MaW1pdCA+PSBwLT5oYXNoTnVtQXZhaWwpDQorICAgICAgICBsZW5MaW1pdCA9IHAtPmhhc2hOdW1BdmFpbDsNCisgICAgICB7DQorICAgICAgICBVSW50MzIgc2l6ZTIgPSBwLT5oYXNoTnVtQXZhaWwgLSBsZW5MaW1pdCArIDE7DQorICAgICAgICBpZiAoc2l6ZTIgPCBzaXplKQ0KKyAgICAgICAgICBzaXplID0gc2l6ZTI7DQorICAgICAgICBzaXplMiA9IHAtPmN5Y2xpY0J1ZmZlclNpemUgLSBjeWNsaWNCdWZmZXJQb3M7DQorICAgICAgICBpZiAoc2l6ZTIgPCBzaXplKQ0KKyAgICAgICAgICBzaXplID0gc2l6ZTI7DQorICAgICAgfQ0KKyAgICAgICNpZm5kZWYgTUZNVF9HTV9JTkxJTkUNCisgICAgICB3aGlsZSAoY3VyUG9zIDwgbGltaXQgJiYgc2l6ZS0tICE9IDApDQorICAgICAgew0KKyAgICAgICAgVUludDMyICpzdGFydERpc3RhbmNlcyA9IGRpc3RhbmNlcyArIGN1clBvczsNCisgICAgICAgIFVJbnQzMiBudW0gPSAoVUludDMyKShHZXRNYXRjaGVzU3BlYzEobGVuTGltaXQsIHBvcyAtIHAtPmhhc2hCdWZbcC0+aGFzaEJ1ZlBvcysrXSwNCisgICAgICAgICAgcG9zLCBwLT5idWZmZXIsIHAtPnNvbiwgY3ljbGljQnVmZmVyUG9zLCBwLT5jeWNsaWNCdWZmZXJTaXplLCBwLT5jdXRWYWx1ZSwNCisgICAgICAgICAgc3RhcnREaXN0YW5jZXMgKyAxLCBwLT5udW1IYXNoQnl0ZXMgLSAxKSAtIHN0YXJ0RGlzdGFuY2VzKTsNCisgICAgICAgICpzdGFydERpc3RhbmNlcyA9IG51bSAtIDE7DQorICAgICAgICBjdXJQb3MgKz0gbnVtOw0KKyAgICAgICAgY3ljbGljQnVmZmVyUG9zKys7DQorICAgICAgICBwb3MrKzsNCisgICAgICAgIHAtPmJ1ZmZlcisrOw0KKyAgICAgIH0NCisgICAgICAjZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIFVJbnQzMiBwb3NSZXM7DQorICAgICAgICBjdXJQb3MgPSBsaW1pdCAtIEdldE1hdGNoZXNTcGVjTihsZW5MaW1pdCwgcG9zLCBwLT5idWZmZXIsIHAtPnNvbiwgY3ljbGljQnVmZmVyUG9zLCBwLT5jeWNsaWNCdWZmZXJTaXplLCBwLT5jdXRWYWx1ZSwNCisgICAgICAgICAgZGlzdGFuY2VzICsgY3VyUG9zLCBwLT5udW1IYXNoQnl0ZXMgLSAxLCBwLT5oYXNoQnVmICsgcC0+aGFzaEJ1ZlBvcywgKEludDMyKShsaW1pdCAtIGN1clBvcykgLCBzaXplLCAmcG9zUmVzKTsNCisgICAgICAgIHAtPmhhc2hCdWZQb3MgKz0gcG9zUmVzIC0gcG9zOw0KKyAgICAgICAgY3ljbGljQnVmZmVyUG9zICs9IHBvc1JlcyAtIHBvczsNCisgICAgICAgIHAtPmJ1ZmZlciArPSBwb3NSZXMgLSBwb3M7DQorICAgICAgICBwb3MgPSBwb3NSZXM7DQorICAgICAgfQ0KKyAgICAgICNlbmRpZg0KKw0KKyAgICAgIG51bVByb2Nlc3NlZCArPSBwb3MgLSBwLT5wb3M7DQorICAgICAgcC0+aGFzaE51bUF2YWlsIC09IHBvcyAtIHAtPnBvczsNCisgICAgICBwLT5wb3MgPSBwb3M7DQorICAgICAgaWYgKGN5Y2xpY0J1ZmZlclBvcyA9PSBwLT5jeWNsaWNCdWZmZXJTaXplKQ0KKyAgICAgICAgY3ljbGljQnVmZmVyUG9zID0gMDsNCisgICAgICBwLT5jeWNsaWNCdWZmZXJQb3MgPSBjeWNsaWNCdWZmZXJQb3M7DQorICAgIH0NCisgIH0NCisgIGRpc3RhbmNlc1swXSA9IGN1clBvczsNCit9DQorDQordm9pZCBCdEZpbGxCbG9jayhDTWF0Y2hGaW5kZXJNdCAqcCwgVUludDMyIGdsb2JhbEJsb2NrSW5kZXgpDQorew0KKyAgQ010U3luYyAqc3luYyA9ICZwLT5oYXNoU3luYzsNCisgIGlmICghc3luYy0+bmVlZFN0YXJ0KQ0KKyAgew0KKyAgICBDcml0aWNhbFNlY3Rpb25fRW50ZXIoJnN5bmMtPmNzKTsNCisgICAgc3luYy0+Y3NXYXNFbnRlcmVkID0gVHJ1ZTsNCisgIH0NCisgIA0KKyAgQnRHZXRNYXRjaGVzKHAsIHAtPmJ0QnVmICsgKGdsb2JhbEJsb2NrSW5kZXggJiBrTXRCdE51bUJsb2Nrc01hc2spICoga010QnRCbG9ja1NpemUpOw0KKw0KKyAgaWYgKHAtPnBvcyA+IGtNdE1heFZhbEZvck5vcm1hbGl6ZSAtIGtNdEJ0QmxvY2tTaXplKQ0KKyAgew0KKyAgICBVSW50MzIgc3ViVmFsdWUgPSBwLT5wb3MgLSBwLT5jeWNsaWNCdWZmZXJTaXplOw0KKyAgICBNYXRjaEZpbmRlcl9Ob3JtYWxpemUzKHN1YlZhbHVlLCBwLT5zb24sIHAtPmN5Y2xpY0J1ZmZlclNpemUgKiAyKTsNCisgICAgcC0+cG9zIC09IHN1YlZhbHVlOw0KKyAgfQ0KKw0KKyAgaWYgKCFzeW5jLT5uZWVkU3RhcnQpDQorICB7DQorICAgIENyaXRpY2FsU2VjdGlvbl9MZWF2ZSgmc3luYy0+Y3MpOw0KKyAgICBzeW5jLT5jc1dhc0VudGVyZWQgPSBGYWxzZTsNCisgIH0NCit9DQorDQordm9pZCBCdFRocmVhZEZ1bmMoQ01hdGNoRmluZGVyTXQgKm10KQ0KK3sNCisgIENNdFN5bmMgKnAgPSAmbXQtPmJ0U3luYzsNCisgIGZvciAoOzspDQorICB7DQorICAgIFVJbnQzMiBibG9ja0luZGV4ID0gMDsNCisgICAgRXZlbnRfV2FpdCgmcC0+Y2FuU3RhcnQpOw0KKyAgICBFdmVudF9TZXQoJnAtPndhc1N0YXJ0ZWQpOw0KKyAgICBmb3IgKDs7KQ0KKyAgICB7DQorICAgICAgaWYgKHAtPmV4aXQpDQorICAgICAgICByZXR1cm47DQorICAgICAgaWYgKHAtPnN0b3BXcml0aW5nKQ0KKyAgICAgIHsNCisgICAgICAgIHAtPm51bVByb2Nlc3NlZEJsb2NrcyA9IGJsb2NrSW5kZXg7DQorICAgICAgICBNdFN5bmNfU3RvcFdyaXRpbmcoJm10LT5oYXNoU3luYyk7DQorICAgICAgICBFdmVudF9TZXQoJnAtPndhc1N0b3BwZWQpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIFNlbWFwaG9yZV9XYWl0KCZwLT5mcmVlU2VtYXBob3JlKTsNCisgICAgICBCdEZpbGxCbG9jayhtdCwgYmxvY2tJbmRleCsrKTsNCisgICAgICBTZW1hcGhvcmVfUmVsZWFzZTEoJnAtPmZpbGxlZFNlbWFwaG9yZSk7DQorICAgIH0NCisgIH0NCit9DQorDQordm9pZCBNYXRjaEZpbmRlck10X0NvbnN0cnVjdChDTWF0Y2hGaW5kZXJNdCAqcCkNCit7DQorICBwLT5oYXNoQnVmID0gMDsNCisgIE10U3luY19Db25zdHJ1Y3QoJnAtPmhhc2hTeW5jKTsNCisgIE10U3luY19Db25zdHJ1Y3QoJnAtPmJ0U3luYyk7DQorfQ0KKw0KK3ZvaWQgTWF0Y2hGaW5kZXJNdF9GcmVlTWVtKENNYXRjaEZpbmRlck10ICpwLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgYWxsb2MtPkZyZWUoYWxsb2MsIHAtPmhhc2hCdWYpOw0KKyAgcC0+aGFzaEJ1ZiA9IDA7DQorfQ0KKw0KK3ZvaWQgTWF0Y2hGaW5kZXJNdF9EZXN0cnVjdChDTWF0Y2hGaW5kZXJNdCAqcCwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIE10U3luY19EZXN0cnVjdCgmcC0+aGFzaFN5bmMpOw0KKyAgTXRTeW5jX0Rlc3RydWN0KCZwLT5idFN5bmMpOw0KKyAgTWF0Y2hGaW5kZXJNdF9GcmVlTWVtKHAsIGFsbG9jKTsNCit9DQorDQorI2RlZmluZSBrSGFzaEJ1ZmZlclNpemUgKGtNdEhhc2hCbG9ja1NpemUgKiBrTXRIYXNoTnVtQmxvY2tzKQ0KKyNkZWZpbmUga0J0QnVmZmVyU2l6ZSAoa010QnRCbG9ja1NpemUgKiBrTXRCdE51bUJsb2NrcykNCisNCitzdGF0aWMgVEhSRUFEX0ZVTkNfUkVUX1RZUEUgVEhSRUFEX0ZVTkNfQ0FMTF9UWVBFIEhhc2hUaHJlYWRGdW5jMih2b2lkICpwKSB7IEhhc2hUaHJlYWRGdW5jKChDTWF0Y2hGaW5kZXJNdCAqKXApOyAgcmV0dXJuIDA7IH0NCitzdGF0aWMgVEhSRUFEX0ZVTkNfUkVUX1RZUEUgVEhSRUFEX0ZVTkNfQ0FMTF9UWVBFIEJ0VGhyZWFkRnVuYzIodm9pZCAqcCkNCit7DQorICBCeXRlIGFsbG9jYUR1bW15WzB4MTgwXTsNCisgIGFsbG9jYUR1bW15WzBdID0gMDsNCisgIGFsbG9jYUR1bW15WzFdID0gYWxsb2NhRHVtbXlbMF07DQorICBCdFRocmVhZEZ1bmMoKENNYXRjaEZpbmRlck10ICopcCk7DQorICByZXR1cm4gMDsNCit9DQorDQorU1JlcyBNYXRjaEZpbmRlck10X0NyZWF0ZShDTWF0Y2hGaW5kZXJNdCAqcCwgVUludDMyIGhpc3RvcnlTaXplLCBVSW50MzIga2VlcEFkZEJ1ZmZlckJlZm9yZSwNCisgICAgVUludDMyIG1hdGNoTWF4TGVuLCBVSW50MzIga2VlcEFkZEJ1ZmZlckFmdGVyLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgQ01hdGNoRmluZGVyICptZiA9IHAtPk1hdGNoRmluZGVyOw0KKyAgcC0+aGlzdG9yeVNpemUgPSBoaXN0b3J5U2l6ZTsNCisgIGlmIChrTXRCdEJsb2NrU2l6ZSA8PSBtYXRjaE1heExlbiAqIDQpDQorICAgIHJldHVybiBTWl9FUlJPUl9QQVJBTTsNCisgIGlmIChwLT5oYXNoQnVmID09IDApDQorICB7DQorICAgIHAtPmhhc2hCdWYgPSAoVUludDMyICopYWxsb2MtPkFsbG9jKGFsbG9jLCAoa0hhc2hCdWZmZXJTaXplICsga0J0QnVmZmVyU2l6ZSkgKiBzaXplb2YoVUludDMyKSk7DQorICAgIGlmIChwLT5oYXNoQnVmID09IDApDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX01FTTsNCisgICAgcC0+YnRCdWYgPSBwLT5oYXNoQnVmICsga0hhc2hCdWZmZXJTaXplOw0KKyAgfQ0KKyAga2VlcEFkZEJ1ZmZlckJlZm9yZSArPSAoa0hhc2hCdWZmZXJTaXplICsga0J0QnVmZmVyU2l6ZSk7DQorICBrZWVwQWRkQnVmZmVyQWZ0ZXIgKz0ga010SGFzaEJsb2NrU2l6ZTsNCisgIGlmICghTWF0Y2hGaW5kZXJfQ3JlYXRlKG1mLCBoaXN0b3J5U2l6ZSwga2VlcEFkZEJ1ZmZlckJlZm9yZSwgbWF0Y2hNYXhMZW4sIGtlZXBBZGRCdWZmZXJBZnRlciwgYWxsb2MpKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfTUVNOw0KKw0KKyAgUklOT0soTXRTeW5jX0NyZWF0ZSgmcC0+aGFzaFN5bmMsIEhhc2hUaHJlYWRGdW5jMiwgcCwga010SGFzaE51bUJsb2NrcykpOw0KKyAgUklOT0soTXRTeW5jX0NyZWF0ZSgmcC0+YnRTeW5jLCBCdFRocmVhZEZ1bmMyLCBwLCBrTXRCdE51bUJsb2NrcykpOw0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCisvKiBDYWxsIGl0IGFmdGVyIFJlbGVhc2VTdHJlYW0gLyBTZXRTdHJlYW0gKi8NCit2b2lkIE1hdGNoRmluZGVyTXRfSW5pdChDTWF0Y2hGaW5kZXJNdCAqcCkNCit7DQorICBDTWF0Y2hGaW5kZXIgKm1mID0gcC0+TWF0Y2hGaW5kZXI7DQorICBwLT5idEJ1ZlBvcyA9IHAtPmJ0QnVmUG9zTGltaXQgPSAwOw0KKyAgcC0+aGFzaEJ1ZlBvcyA9IHAtPmhhc2hCdWZQb3NMaW1pdCA9IDA7DQorICBNYXRjaEZpbmRlcl9Jbml0KG1mKTsNCisgIHAtPnBvaW50ZXJUb0N1clBvcyA9IE1hdGNoRmluZGVyX0dldFBvaW50ZXJUb0N1cnJlbnRQb3MobWYpOw0KKyAgcC0+YnROdW1BdmFpbEJ5dGVzID0gMDsNCisgIHAtPmx6UG9zID0gcC0+aGlzdG9yeVNpemUgKyAxOw0KKw0KKyAgcC0+aGFzaCA9IG1mLT5oYXNoOw0KKyAgcC0+Zml4ZWRIYXNoU2l6ZSA9IG1mLT5maXhlZEhhc2hTaXplOw0KKyAgcC0+Y3JjID0gbWYtPmNyYzsNCisNCisgIHAtPnNvbiA9IG1mLT5zb247DQorICBwLT5tYXRjaE1heExlbiA9IG1mLT5tYXRjaE1heExlbjsNCisgIHAtPm51bUhhc2hCeXRlcyA9IG1mLT5udW1IYXNoQnl0ZXM7DQorICBwLT5wb3MgPSBtZi0+cG9zOw0KKyAgcC0+YnVmZmVyID0gbWYtPmJ1ZmZlcjsNCisgIHAtPmN5Y2xpY0J1ZmZlclBvcyA9IG1mLT5jeWNsaWNCdWZmZXJQb3M7DQorICBwLT5jeWNsaWNCdWZmZXJTaXplID0gbWYtPmN5Y2xpY0J1ZmZlclNpemU7DQorICBwLT5jdXRWYWx1ZSA9IG1mLT5jdXRWYWx1ZTsNCit9DQorDQorLyogUmVsZWFzZVN0cmVhbSBpcyByZXF1aXJlZCB0byBmaW5pc2ggbXVsdGl0aHJlYWRpbmcgKi8NCit2b2lkIE1hdGNoRmluZGVyTXRfUmVsZWFzZVN0cmVhbShDTWF0Y2hGaW5kZXJNdCAqcCkNCit7DQorICBNdFN5bmNfU3RvcFdyaXRpbmcoJnAtPmJ0U3luYyk7DQorICAvKiBwLT5NYXRjaEZpbmRlci0+UmVsZWFzZVN0cmVhbSgpOyAqLw0KK30NCisNCit2b2lkIE1hdGNoRmluZGVyTXRfTm9ybWFsaXplKENNYXRjaEZpbmRlck10ICpwKQ0KK3sNCisgIE1hdGNoRmluZGVyX05vcm1hbGl6ZTMocC0+bHpQb3MgLSBwLT5oaXN0b3J5U2l6ZSAtIDEsIHAtPmhhc2gsIHAtPmZpeGVkSGFzaFNpemUpOw0KKyAgcC0+bHpQb3MgPSBwLT5oaXN0b3J5U2l6ZSArIDE7DQorfQ0KKw0KK3ZvaWQgTWF0Y2hGaW5kZXJNdF9HZXROZXh0QmxvY2tfQnQoQ01hdGNoRmluZGVyTXQgKnApDQorew0KKyAgVUludDMyIGJsb2NrSW5kZXg7DQorICBNdFN5bmNfR2V0TmV4dEJsb2NrKCZwLT5idFN5bmMpOw0KKyAgYmxvY2tJbmRleCA9ICgocC0+YnRTeW5jLm51bVByb2Nlc3NlZEJsb2NrcyAtIDEpICYga010QnROdW1CbG9ja3NNYXNrKTsNCisgIHAtPmJ0QnVmUG9zTGltaXQgPSBwLT5idEJ1ZlBvcyA9IGJsb2NrSW5kZXggKiBrTXRCdEJsb2NrU2l6ZTsNCisgIHAtPmJ0QnVmUG9zTGltaXQgKz0gcC0+YnRCdWZbcC0+YnRCdWZQb3MrK107DQorICBwLT5idE51bUF2YWlsQnl0ZXMgPSBwLT5idEJ1ZltwLT5idEJ1ZlBvcysrXTsNCisgIGlmIChwLT5selBvcyA+PSBrTXRNYXhWYWxGb3JOb3JtYWxpemUgLSBrTXRCdEJsb2NrU2l6ZSkNCisgICAgTWF0Y2hGaW5kZXJNdF9Ob3JtYWxpemUocCk7DQorfQ0KKw0KK2NvbnN0IEJ5dGUgKiBNYXRjaEZpbmRlck10X0dldFBvaW50ZXJUb0N1cnJlbnRQb3MoQ01hdGNoRmluZGVyTXQgKnApDQorew0KKyAgcmV0dXJuIHAtPnBvaW50ZXJUb0N1clBvczsNCit9DQorDQorI2RlZmluZSBHRVRfTkVYVF9CTE9DS19JRl9SRVFVSVJFRCBpZiAocC0+YnRCdWZQb3MgPT0gcC0+YnRCdWZQb3NMaW1pdCkgTWF0Y2hGaW5kZXJNdF9HZXROZXh0QmxvY2tfQnQocCk7DQorDQorVUludDMyIE1hdGNoRmluZGVyTXRfR2V0TnVtQXZhaWxhYmxlQnl0ZXMoQ01hdGNoRmluZGVyTXQgKnApDQorew0KKyAgR0VUX05FWFRfQkxPQ0tfSUZfUkVRVUlSRUQ7DQorICByZXR1cm4gcC0+YnROdW1BdmFpbEJ5dGVzOw0KK30NCisNCitCeXRlIE1hdGNoRmluZGVyTXRfR2V0SW5kZXhCeXRlKENNYXRjaEZpbmRlck10ICpwLCBJbnQzMiBpbmRleCkNCit7DQorICByZXR1cm4gcC0+cG9pbnRlclRvQ3VyUG9zW2luZGV4XTsNCit9DQorDQorVUludDMyICogTWl4TWF0Y2hlczIoQ01hdGNoRmluZGVyTXQgKnAsIFVJbnQzMiBtYXRjaE1pblBvcywgVUludDMyICpkaXN0YW5jZXMpDQorew0KKyAgVUludDMyIGhhc2gyVmFsdWUsIGN1ck1hdGNoMjsNCisgIFVJbnQzMiAqaGFzaCA9IHAtPmhhc2g7DQorICBjb25zdCBCeXRlICpjdXIgPSBwLT5wb2ludGVyVG9DdXJQb3M7DQorICBVSW50MzIgbHpQb3MgPSBwLT5selBvczsNCisgIE1UX0hBU0gyX0NBTEMNCisgICAgICANCisgIGN1ck1hdGNoMiA9IGhhc2hbaGFzaDJWYWx1ZV07DQorICBoYXNoW2hhc2gyVmFsdWVdID0gbHpQb3M7DQorDQorICBpZiAoY3VyTWF0Y2gyID49IG1hdGNoTWluUG9zKQ0KKyAgICBpZiAoY3VyWyhwdHJkaWZmX3QpY3VyTWF0Y2gyIC0gbHpQb3NdID09IGN1clswXSkNCisgICAgew0KKyAgICAgICpkaXN0YW5jZXMrKyA9IDI7DQorICAgICAgKmRpc3RhbmNlcysrID0gbHpQb3MgLSBjdXJNYXRjaDIgLSAxOw0KKyAgICB9DQorICByZXR1cm4gZGlzdGFuY2VzOw0KK30NCisNCitVSW50MzIgKiBNaXhNYXRjaGVzMyhDTWF0Y2hGaW5kZXJNdCAqcCwgVUludDMyIG1hdGNoTWluUG9zLCBVSW50MzIgKmRpc3RhbmNlcykNCit7DQorICBVSW50MzIgaGFzaDJWYWx1ZSwgaGFzaDNWYWx1ZSwgY3VyTWF0Y2gyLCBjdXJNYXRjaDM7DQorICBVSW50MzIgKmhhc2ggPSBwLT5oYXNoOw0KKyAgY29uc3QgQnl0ZSAqY3VyID0gcC0+cG9pbnRlclRvQ3VyUG9zOw0KKyAgVUludDMyIGx6UG9zID0gcC0+bHpQb3M7DQorICBNVF9IQVNIM19DQUxDDQorDQorICBjdXJNYXRjaDIgPSBoYXNoWyAgICAgICAgICAgICAgICBoYXNoMlZhbHVlXTsNCisgIGN1ck1hdGNoMyA9IGhhc2hba0ZpeDNIYXNoU2l6ZSArIGhhc2gzVmFsdWVdOw0KKyAgDQorICBoYXNoWyAgICAgICAgICAgICAgICBoYXNoMlZhbHVlXSA9DQorICBoYXNoW2tGaXgzSGFzaFNpemUgKyBoYXNoM1ZhbHVlXSA9DQorICAgIGx6UG9zOw0KKw0KKyAgaWYgKGN1ck1hdGNoMiA+PSBtYXRjaE1pblBvcyAmJiBjdXJbKHB0cmRpZmZfdCljdXJNYXRjaDIgLSBselBvc10gPT0gY3VyWzBdKQ0KKyAgew0KKyAgICBkaXN0YW5jZXNbMV0gPSBselBvcyAtIGN1ck1hdGNoMiAtIDE7DQorICAgIGlmIChjdXJbKHB0cmRpZmZfdCljdXJNYXRjaDIgLSBselBvcyArIDJdID09IGN1clsyXSkNCisgICAgew0KKyAgICAgIGRpc3RhbmNlc1swXSA9IDM7DQorICAgICAgcmV0dXJuIGRpc3RhbmNlcyArIDI7DQorICAgIH0NCisgICAgZGlzdGFuY2VzWzBdID0gMjsNCisgICAgZGlzdGFuY2VzICs9IDI7DQorICB9DQorICBpZiAoY3VyTWF0Y2gzID49IG1hdGNoTWluUG9zICYmIGN1clsocHRyZGlmZl90KWN1ck1hdGNoMyAtIGx6UG9zXSA9PSBjdXJbMF0pDQorICB7DQorICAgICpkaXN0YW5jZXMrKyA9IDM7DQorICAgICpkaXN0YW5jZXMrKyA9IGx6UG9zIC0gY3VyTWF0Y2gzIC0gMTsNCisgIH0NCisgIHJldHVybiBkaXN0YW5jZXM7DQorfQ0KKw0KKy8qDQorVUludDMyICpNaXhNYXRjaGVzNChDTWF0Y2hGaW5kZXJNdCAqcCwgVUludDMyIG1hdGNoTWluUG9zLCBVSW50MzIgKmRpc3RhbmNlcykNCit7DQorICBVSW50MzIgaGFzaDJWYWx1ZSwgaGFzaDNWYWx1ZSwgaGFzaDRWYWx1ZSwgY3VyTWF0Y2gyLCBjdXJNYXRjaDMsIGN1ck1hdGNoNDsNCisgIFVJbnQzMiAqaGFzaCA9IHAtPmhhc2g7DQorICBjb25zdCBCeXRlICpjdXIgPSBwLT5wb2ludGVyVG9DdXJQb3M7DQorICBVSW50MzIgbHpQb3MgPSBwLT5selBvczsNCisgIE1UX0hBU0g0X0NBTEMNCisgICAgICANCisgIGN1ck1hdGNoMiA9IGhhc2hbICAgICAgICAgICAgICAgIGhhc2gyVmFsdWVdOw0KKyAgY3VyTWF0Y2gzID0gaGFzaFtrRml4M0hhc2hTaXplICsgaGFzaDNWYWx1ZV07DQorICBjdXJNYXRjaDQgPSBoYXNoW2tGaXg0SGFzaFNpemUgKyBoYXNoNFZhbHVlXTsNCisgIA0KKyAgaGFzaFsgICAgICAgICAgICAgICAgaGFzaDJWYWx1ZV0gPQ0KKyAgaGFzaFtrRml4M0hhc2hTaXplICsgaGFzaDNWYWx1ZV0gPQ0KKyAgaGFzaFtrRml4NEhhc2hTaXplICsgaGFzaDRWYWx1ZV0gPQ0KKyAgICBselBvczsNCisNCisgIGlmIChjdXJNYXRjaDIgPj0gbWF0Y2hNaW5Qb3MgJiYgY3VyWyhwdHJkaWZmX3QpY3VyTWF0Y2gyIC0gbHpQb3NdID09IGN1clswXSkNCisgIHsNCisgICAgZGlzdGFuY2VzWzFdID0gbHpQb3MgLSBjdXJNYXRjaDIgLSAxOw0KKyAgICBpZiAoY3VyWyhwdHJkaWZmX3QpY3VyTWF0Y2gyIC0gbHpQb3MgKyAyXSA9PSBjdXJbMl0pDQorICAgIHsNCisgICAgICBkaXN0YW5jZXNbMF0gPSAgKGN1clsocHRyZGlmZl90KWN1ck1hdGNoMiAtIGx6UG9zICsgM10gPT0gY3VyWzNdKSA/IDQgOiAzOw0KKyAgICAgIHJldHVybiBkaXN0YW5jZXMgKyAyOw0KKyAgICB9DQorICAgIGRpc3RhbmNlc1swXSA9IDI7DQorICAgIGRpc3RhbmNlcyArPSAyOw0KKyAgfQ0KKyAgaWYgKGN1ck1hdGNoMyA+PSBtYXRjaE1pblBvcyAmJiBjdXJbKHB0cmRpZmZfdCljdXJNYXRjaDMgLSBselBvc10gPT0gY3VyWzBdKQ0KKyAgew0KKyAgICBkaXN0YW5jZXNbMV0gPSBselBvcyAtIGN1ck1hdGNoMyAtIDE7DQorICAgIGlmIChjdXJbKHB0cmRpZmZfdCljdXJNYXRjaDMgLSBselBvcyArIDNdID09IGN1clszXSkNCisgICAgew0KKyAgICAgIGRpc3RhbmNlc1swXSA9IDQ7DQorICAgICAgcmV0dXJuIGRpc3RhbmNlcyArIDI7DQorICAgIH0NCisgICAgZGlzdGFuY2VzWzBdID0gMzsNCisgICAgZGlzdGFuY2VzICs9IDI7DQorICB9DQorDQorICBpZiAoY3VyTWF0Y2g0ID49IG1hdGNoTWluUG9zKQ0KKyAgICBpZiAoDQorICAgICAgY3VyWyhwdHJkaWZmX3QpY3VyTWF0Y2g0IC0gbHpQb3NdID09IGN1clswXSAmJg0KKyAgICAgIGN1clsocHRyZGlmZl90KWN1ck1hdGNoNCAtIGx6UG9zICsgM10gPT0gY3VyWzNdDQorICAgICAgKQ0KKyAgICB7DQorICAgICAgKmRpc3RhbmNlcysrID0gNDsNCisgICAgICAqZGlzdGFuY2VzKysgPSBselBvcyAtIGN1ck1hdGNoNCAtIDE7DQorICAgIH0NCisgIHJldHVybiBkaXN0YW5jZXM7DQorfQ0KKyovDQorDQorI2RlZmluZSBJTkNSRUFTRV9MWl9QT1MgcC0+bHpQb3MrKzsgcC0+cG9pbnRlclRvQ3VyUG9zKys7DQorDQorVUludDMyIE1hdGNoRmluZGVyTXQyX0dldE1hdGNoZXMoQ01hdGNoRmluZGVyTXQgKnAsIFVJbnQzMiAqZGlzdGFuY2VzKQ0KK3sNCisgIGNvbnN0IFVJbnQzMiAqYnRCdWYgPSBwLT5idEJ1ZiArIHAtPmJ0QnVmUG9zOw0KKyAgVUludDMyIGxlbiA9ICpidEJ1ZisrOw0KKyAgcC0+YnRCdWZQb3MgKz0gMSArIGxlbjsNCisgIHAtPmJ0TnVtQXZhaWxCeXRlcy0tOw0KKyAgew0KKyAgICBVSW50MzIgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAyKQ0KKyAgICB7DQorICAgICAgKmRpc3RhbmNlcysrID0gKmJ0QnVmKys7DQorICAgICAgKmRpc3RhbmNlcysrID0gKmJ0QnVmKys7DQorICAgIH0NCisgIH0NCisgIElOQ1JFQVNFX0xaX1BPUw0KKyAgcmV0dXJuIGxlbjsNCit9DQorDQorVUludDMyIE1hdGNoRmluZGVyTXRfR2V0TWF0Y2hlcyhDTWF0Y2hGaW5kZXJNdCAqcCwgVUludDMyICpkaXN0YW5jZXMpDQorew0KKyAgY29uc3QgVUludDMyICpidEJ1ZiA9IHAtPmJ0QnVmICsgcC0+YnRCdWZQb3M7DQorICBVSW50MzIgbGVuID0gKmJ0QnVmKys7DQorICBwLT5idEJ1ZlBvcyArPSAxICsgbGVuOw0KKw0KKyAgaWYgKGxlbiA9PSAwKQ0KKyAgew0KKyAgICBpZiAocC0+YnROdW1BdmFpbEJ5dGVzLS0gPj0gNCkNCisgICAgICBsZW4gPSAoVUludDMyKShwLT5NaXhNYXRjaGVzRnVuYyhwLCBwLT5selBvcyAtIHAtPmhpc3RvcnlTaXplLCBkaXN0YW5jZXMpIC0gKGRpc3RhbmNlcykpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICAvKiBDb25kaXRpb246IHRoZXJlIGFyZSBtYXRjaGVzIGluIGJ0QnVmIHdpdGggbGVuZ3RoIDwgcC0+bnVtSGFzaEJ5dGVzICovDQorICAgIFVJbnQzMiAqZGlzdGFuY2VzMjsNCisgICAgcC0+YnROdW1BdmFpbEJ5dGVzLS07DQorICAgIGRpc3RhbmNlczIgPSBwLT5NaXhNYXRjaGVzRnVuYyhwLCBwLT5selBvcyAtIGJ0QnVmWzFdLCBkaXN0YW5jZXMpOw0KKyAgICBkbw0KKyAgICB7DQorICAgICAgKmRpc3RhbmNlczIrKyA9ICpidEJ1ZisrOw0KKyAgICAgICpkaXN0YW5jZXMyKysgPSAqYnRCdWYrKzsNCisgICAgfQ0KKyAgICB3aGlsZSAoKGxlbiAtPSAyKSAhPSAwKTsNCisgICAgbGVuICA9IChVSW50MzIpKGRpc3RhbmNlczIgLSAoZGlzdGFuY2VzKSk7DQorICB9DQorICBJTkNSRUFTRV9MWl9QT1MNCisgIHJldHVybiBsZW47DQorfQ0KKw0KKyNkZWZpbmUgU0tJUF9IRUFERVIyX01UICBkbyB7IEdFVF9ORVhUX0JMT0NLX0lGX1JFUVVJUkVEDQorI2RlZmluZSBTS0lQX0hFQURFUl9NVChuKSBTS0lQX0hFQURFUjJfTVQgaWYgKHAtPmJ0TnVtQXZhaWxCeXRlcy0tID49IChuKSkgeyBjb25zdCBCeXRlICpjdXIgPSBwLT5wb2ludGVyVG9DdXJQb3M7IFVJbnQzMiAqaGFzaCA9IHAtPmhhc2g7DQorI2RlZmluZSBTS0lQX0ZPT1RFUl9NVCB9IElOQ1JFQVNFX0xaX1BPUyBwLT5idEJ1ZlBvcyArPSBwLT5idEJ1ZltwLT5idEJ1ZlBvc10gKyAxOyB9IHdoaWxlICgtLW51bSAhPSAwKTsNCisNCit2b2lkIE1hdGNoRmluZGVyTXQwX1NraXAoQ01hdGNoRmluZGVyTXQgKnAsIFVJbnQzMiBudW0pDQorew0KKyAgU0tJUF9IRUFERVIyX01UIHsgcC0+YnROdW1BdmFpbEJ5dGVzLS07DQorICBTS0lQX0ZPT1RFUl9NVA0KK30NCisNCit2b2lkIE1hdGNoRmluZGVyTXQyX1NraXAoQ01hdGNoRmluZGVyTXQgKnAsIFVJbnQzMiBudW0pDQorew0KKyAgU0tJUF9IRUFERVJfTVQoMikNCisgICAgICBVSW50MzIgaGFzaDJWYWx1ZTsNCisgICAgICBNVF9IQVNIMl9DQUxDDQorICAgICAgaGFzaFtoYXNoMlZhbHVlXSA9IHAtPmx6UG9zOw0KKyAgU0tJUF9GT09URVJfTVQNCit9DQorDQordm9pZCBNYXRjaEZpbmRlck10M19Ta2lwKENNYXRjaEZpbmRlck10ICpwLCBVSW50MzIgbnVtKQ0KK3sNCisgIFNLSVBfSEVBREVSX01UKDMpDQorICAgICAgVUludDMyIGhhc2gyVmFsdWUsIGhhc2gzVmFsdWU7DQorICAgICAgTVRfSEFTSDNfQ0FMQw0KKyAgICAgIGhhc2hba0ZpeDNIYXNoU2l6ZSArIGhhc2gzVmFsdWVdID0NCisgICAgICBoYXNoWyAgICAgICAgICAgICAgICBoYXNoMlZhbHVlXSA9DQorICAgICAgICBwLT5selBvczsNCisgIFNLSVBfRk9PVEVSX01UDQorfQ0KKw0KKy8qDQordm9pZCBNYXRjaEZpbmRlck10NF9Ta2lwKENNYXRjaEZpbmRlck10ICpwLCBVSW50MzIgbnVtKQ0KK3sNCisgIFNLSVBfSEVBREVSX01UKDQpDQorICAgICAgVUludDMyIGhhc2gyVmFsdWUsIGhhc2gzVmFsdWUsIGhhc2g0VmFsdWU7DQorICAgICAgTVRfSEFTSDRfQ0FMQw0KKyAgICAgIGhhc2hba0ZpeDRIYXNoU2l6ZSArIGhhc2g0VmFsdWVdID0NCisgICAgICBoYXNoW2tGaXgzSGFzaFNpemUgKyBoYXNoM1ZhbHVlXSA9DQorICAgICAgaGFzaFsgICAgICAgICAgICAgICAgaGFzaDJWYWx1ZV0gPQ0KKyAgICAgICAgcC0+bHpQb3M7DQorICBTS0lQX0ZPT1RFUl9NVA0KK30NCisqLw0KKw0KK3ZvaWQgTWF0Y2hGaW5kZXJNdF9DcmVhdGVWVGFibGUoQ01hdGNoRmluZGVyTXQgKnAsIElNYXRjaEZpbmRlciAqdlRhYmxlKQ0KK3sNCisgIHZUYWJsZS0+SW5pdCA9IChNZl9Jbml0X0Z1bmMpTWF0Y2hGaW5kZXJNdF9Jbml0Ow0KKyAgdlRhYmxlLT5HZXRJbmRleEJ5dGUgPSAoTWZfR2V0SW5kZXhCeXRlX0Z1bmMpTWF0Y2hGaW5kZXJNdF9HZXRJbmRleEJ5dGU7DQorICB2VGFibGUtPkdldE51bUF2YWlsYWJsZUJ5dGVzID0gKE1mX0dldE51bUF2YWlsYWJsZUJ5dGVzX0Z1bmMpTWF0Y2hGaW5kZXJNdF9HZXROdW1BdmFpbGFibGVCeXRlczsNCisgIHZUYWJsZS0+R2V0UG9pbnRlclRvQ3VycmVudFBvcyA9IChNZl9HZXRQb2ludGVyVG9DdXJyZW50UG9zX0Z1bmMpTWF0Y2hGaW5kZXJNdF9HZXRQb2ludGVyVG9DdXJyZW50UG9zOw0KKyAgdlRhYmxlLT5HZXRNYXRjaGVzID0gKE1mX0dldE1hdGNoZXNfRnVuYylNYXRjaEZpbmRlck10X0dldE1hdGNoZXM7DQorICBzd2l0Y2gocC0+TWF0Y2hGaW5kZXItPm51bUhhc2hCeXRlcykNCisgIHsNCisgICAgY2FzZSAyOg0KKyAgICAgIHAtPkdldEhlYWRzRnVuYyA9IEdldEhlYWRzMjsNCisgICAgICBwLT5NaXhNYXRjaGVzRnVuYyA9IChNZl9NaXhfTWF0Y2hlcykwOw0KKyAgICAgIHZUYWJsZS0+U2tpcCA9IChNZl9Ta2lwX0Z1bmMpTWF0Y2hGaW5kZXJNdDBfU2tpcDsNCisgICAgICB2VGFibGUtPkdldE1hdGNoZXMgPSAoTWZfR2V0TWF0Y2hlc19GdW5jKU1hdGNoRmluZGVyTXQyX0dldE1hdGNoZXM7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzoNCisgICAgICBwLT5HZXRIZWFkc0Z1bmMgPSBHZXRIZWFkczM7DQorICAgICAgcC0+TWl4TWF0Y2hlc0Z1bmMgPSAoTWZfTWl4X01hdGNoZXMpTWl4TWF0Y2hlczI7DQorICAgICAgdlRhYmxlLT5Ta2lwID0gKE1mX1NraXBfRnVuYylNYXRjaEZpbmRlck10Ml9Ta2lwOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAvKiBjYXNlIDQ6ICovDQorICAgICAgcC0+R2V0SGVhZHNGdW5jID0gcC0+TWF0Y2hGaW5kZXItPmJpZ0hhc2ggPyBHZXRIZWFkczRiIDogR2V0SGVhZHM0Ow0KKyAgICAgIC8qIHAtPkdldEhlYWRzRnVuYyA9IEdldEhlYWRzNDsgKi8NCisgICAgICBwLT5NaXhNYXRjaGVzRnVuYyA9IChNZl9NaXhfTWF0Y2hlcylNaXhNYXRjaGVzMzsNCisgICAgICB2VGFibGUtPlNraXAgPSAoTWZfU2tpcF9GdW5jKU1hdGNoRmluZGVyTXQzX1NraXA7DQorICAgICAgYnJlYWs7DQorICAgIC8qDQorICAgIGRlZmF1bHQ6DQorICAgICAgcC0+R2V0SGVhZHNGdW5jID0gR2V0SGVhZHM1Ow0KKyAgICAgIHAtPk1peE1hdGNoZXNGdW5jID0gKE1mX01peF9NYXRjaGVzKU1peE1hdGNoZXM0Ow0KKyAgICAgIHZUYWJsZS0+U2tpcCA9IChNZl9Ta2lwX0Z1bmMpTWF0Y2hGaW5kZXJNdDRfU2tpcDsNCisgICAgICBicmVhazsNCisgICAgKi8NCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DL0x6RmluZE10LmggYi9sem1hL0MvTHpGaW5kTXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjBkODdjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL0x6RmluZE10LmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qIEx6RmluZE10LmggLS0gbXVsdGl0aHJlYWRlZCBNYXRjaCBmaW5kZXIgZm9yIExaIGFsZ29yaXRobXMNCisyMDEzLTAxLTE4IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2lmbmRlZiBfX0xaX0ZJTkRfTVRfSA0KKyNkZWZpbmUgX19MWl9GSU5EX01UX0gNCisNCisjaW5jbHVkZSAiTHpGaW5kLmgiDQorI2luY2x1ZGUgIlRocmVhZHMuaCINCisNCitFWFRFUk5fQ19CRUdJTg0KKw0KKyNkZWZpbmUga010SGFzaEJsb2NrU2l6ZSAoMSA8PCAxMykNCisjZGVmaW5lIGtNdEhhc2hOdW1CbG9ja3MgKDEgPDwgMykNCisjZGVmaW5lIGtNdEhhc2hOdW1CbG9ja3NNYXNrIChrTXRIYXNoTnVtQmxvY2tzIC0gMSkNCisNCisjZGVmaW5lIGtNdEJ0QmxvY2tTaXplICgxIDw8IDE0KQ0KKyNkZWZpbmUga010QnROdW1CbG9ja3MgKDEgPDwgNikNCisjZGVmaW5lIGtNdEJ0TnVtQmxvY2tzTWFzayAoa010QnROdW1CbG9ja3MgLSAxKQ0KKw0KK3R5cGVkZWYgc3RydWN0IF9DTXRTeW5jDQorew0KKyAgQm9vbCB3YXNDcmVhdGVkOw0KKyAgQm9vbCBuZWVkU3RhcnQ7DQorICBCb29sIGV4aXQ7DQorICBCb29sIHN0b3BXcml0aW5nOw0KKw0KKyAgQ1RocmVhZCB0aHJlYWQ7DQorICBDQXV0b1Jlc2V0RXZlbnQgY2FuU3RhcnQ7DQorICBDQXV0b1Jlc2V0RXZlbnQgd2FzU3RhcnRlZDsNCisgIENBdXRvUmVzZXRFdmVudCB3YXNTdG9wcGVkOw0KKyAgQ1NlbWFwaG9yZSBmcmVlU2VtYXBob3JlOw0KKyAgQ1NlbWFwaG9yZSBmaWxsZWRTZW1hcGhvcmU7DQorICBCb29sIGNzV2FzSW5pdGlhbGl6ZWQ7DQorICBCb29sIGNzV2FzRW50ZXJlZDsNCisgIENDcml0aWNhbFNlY3Rpb24gY3M7DQorICBVSW50MzIgbnVtUHJvY2Vzc2VkQmxvY2tzOw0KK30gQ010U3luYzsNCisNCit0eXBlZGVmIFVJbnQzMiAqICgqTWZfTWl4X01hdGNoZXMpKHZvaWQgKnAsIFVJbnQzMiBtYXRjaE1pblBvcywgVUludDMyICpkaXN0YW5jZXMpOw0KKw0KKy8qIGtNdENhY2hlTGluZUR1bW15IG11c3QgYmUgPj0gc2l6ZV9vZl9DUFVfY2FjaGVfbGluZSAqLw0KKyNkZWZpbmUga010Q2FjaGVMaW5lRHVtbXkgMTI4DQorDQordHlwZWRlZiB2b2lkICgqTWZfR2V0SGVhZHMpKGNvbnN0IEJ5dGUgKmJ1ZmZlciwgVUludDMyIHBvcywNCisgIFVJbnQzMiAqaGFzaCwgVUludDMyIGhhc2hNYXNrLCBVSW50MzIgKmhlYWRzLCBVSW50MzIgbnVtSGVhZHMsIGNvbnN0IFVJbnQzMiAqY3JjKTsNCisNCit0eXBlZGVmIHN0cnVjdCBfQ01hdGNoRmluZGVyTXQNCit7DQorICAvKiBMWiAqLw0KKyAgY29uc3QgQnl0ZSAqcG9pbnRlclRvQ3VyUG9zOw0KKyAgVUludDMyICpidEJ1ZjsNCisgIFVJbnQzMiBidEJ1ZlBvczsNCisgIFVJbnQzMiBidEJ1ZlBvc0xpbWl0Ow0KKyAgVUludDMyIGx6UG9zOw0KKyAgVUludDMyIGJ0TnVtQXZhaWxCeXRlczsNCisNCisgIFVJbnQzMiAqaGFzaDsNCisgIFVJbnQzMiBmaXhlZEhhc2hTaXplOw0KKyAgVUludDMyIGhpc3RvcnlTaXplOw0KKyAgY29uc3QgVUludDMyICpjcmM7DQorDQorICBNZl9NaXhfTWF0Y2hlcyBNaXhNYXRjaGVzRnVuYzsNCisgIA0KKyAgLyogTFogKyBCVCAqLw0KKyAgQ010U3luYyBidFN5bmM7DQorICBCeXRlIGJ0RHVtbXlba010Q2FjaGVMaW5lRHVtbXldOw0KKw0KKyAgLyogQlQgKi8NCisgIFVJbnQzMiAqaGFzaEJ1ZjsNCisgIFVJbnQzMiBoYXNoQnVmUG9zOw0KKyAgVUludDMyIGhhc2hCdWZQb3NMaW1pdDsNCisgIFVJbnQzMiBoYXNoTnVtQXZhaWw7DQorDQorICBDTHpSZWYgKnNvbjsNCisgIFVJbnQzMiBtYXRjaE1heExlbjsNCisgIFVJbnQzMiBudW1IYXNoQnl0ZXM7DQorICBVSW50MzIgcG9zOw0KKyAgQnl0ZSAqYnVmZmVyOw0KKyAgVUludDMyIGN5Y2xpY0J1ZmZlclBvczsNCisgIFVJbnQzMiBjeWNsaWNCdWZmZXJTaXplOyAvKiBpdCBtdXN0IGJlIGhpc3RvcnlTaXplICsgMSAqLw0KKyAgVUludDMyIGN1dFZhbHVlOw0KKw0KKyAgLyogQlQgKyBIYXNoICovDQorICBDTXRTeW5jIGhhc2hTeW5jOw0KKyAgLyogQnl0ZSBoYXNoRHVtbXlba010Q2FjaGVMaW5lRHVtbXldOyAqLw0KKyAgDQorICAvKiBIYXNoICovDQorICBNZl9HZXRIZWFkcyBHZXRIZWFkc0Z1bmM7DQorICBDTWF0Y2hGaW5kZXIgKk1hdGNoRmluZGVyOw0KK30gQ01hdGNoRmluZGVyTXQ7DQorDQordm9pZCBNYXRjaEZpbmRlck10X0NvbnN0cnVjdChDTWF0Y2hGaW5kZXJNdCAqcCk7DQordm9pZCBNYXRjaEZpbmRlck10X0Rlc3RydWN0KENNYXRjaEZpbmRlck10ICpwLCBJU3pBbGxvYyAqYWxsb2MpOw0KK1NSZXMgTWF0Y2hGaW5kZXJNdF9DcmVhdGUoQ01hdGNoRmluZGVyTXQgKnAsIFVJbnQzMiBoaXN0b3J5U2l6ZSwgVUludDMyIGtlZXBBZGRCdWZmZXJCZWZvcmUsDQorICAgIFVJbnQzMiBtYXRjaE1heExlbiwgVUludDMyIGtlZXBBZGRCdWZmZXJBZnRlciwgSVN6QWxsb2MgKmFsbG9jKTsNCit2b2lkIE1hdGNoRmluZGVyTXRfQ3JlYXRlVlRhYmxlKENNYXRjaEZpbmRlck10ICpwLCBJTWF0Y2hGaW5kZXIgKnZUYWJsZSk7DQordm9pZCBNYXRjaEZpbmRlck10X1JlbGVhc2VTdHJlYW0oQ01hdGNoRmluZGVyTXQgKnApOw0KKw0KK0VYVEVSTl9DX0VORA0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy9Mekhhc2guaCBiL2x6bWEvQy9Mekhhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmYwZTNjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL0x6SGFzaC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIEx6SGFzaC5oIC0tIEhBU0ggZnVuY3Rpb25zIGZvciBMWiBhbGdvcml0aG1zDQorMjAwOS0wMi0wNyA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpZm5kZWYgX19MWl9IQVNIX0gNCisjZGVmaW5lIF9fTFpfSEFTSF9IDQorDQorI2RlZmluZSBrSGFzaDJTaXplICgxIDw8IDEwKQ0KKyNkZWZpbmUga0hhc2gzU2l6ZSAoMSA8PCAxNikNCisjZGVmaW5lIGtIYXNoNFNpemUgKDEgPDwgMjApDQorDQorI2RlZmluZSBrRml4M0hhc2hTaXplIChrSGFzaDJTaXplKQ0KKyNkZWZpbmUga0ZpeDRIYXNoU2l6ZSAoa0hhc2gyU2l6ZSArIGtIYXNoM1NpemUpDQorI2RlZmluZSBrRml4NUhhc2hTaXplIChrSGFzaDJTaXplICsga0hhc2gzU2l6ZSArIGtIYXNoNFNpemUpDQorDQorI2RlZmluZSBIQVNIMl9DQUxDIGhhc2hWYWx1ZSA9IGN1clswXSB8ICgoVUludDMyKWN1clsxXSA8PCA4KTsNCisNCisjZGVmaW5lIEhBU0gzX0NBTEMgeyBcDQorICBVSW50MzIgdGVtcCA9IHAtPmNyY1tjdXJbMF1dIF4gY3VyWzFdOyBcDQorICBoYXNoMlZhbHVlID0gdGVtcCAmIChrSGFzaDJTaXplIC0gMSk7IFwNCisgIGhhc2hWYWx1ZSA9ICh0ZW1wIF4gKChVSW50MzIpY3VyWzJdIDw8IDgpKSAmIHAtPmhhc2hNYXNrOyB9DQorDQorI2RlZmluZSBIQVNINF9DQUxDIHsgXA0KKyAgVUludDMyIHRlbXAgPSBwLT5jcmNbY3VyWzBdXSBeIGN1clsxXTsgXA0KKyAgaGFzaDJWYWx1ZSA9IHRlbXAgJiAoa0hhc2gyU2l6ZSAtIDEpOyBcDQorICBoYXNoM1ZhbHVlID0gKHRlbXAgXiAoKFVJbnQzMiljdXJbMl0gPDwgOCkpICYgKGtIYXNoM1NpemUgLSAxKTsgXA0KKyAgaGFzaFZhbHVlID0gKHRlbXAgXiAoKFVJbnQzMiljdXJbMl0gPDwgOCkgXiAocC0+Y3JjW2N1clszXV0gPDwgNSkpICYgcC0+aGFzaE1hc2s7IH0NCisNCisjZGVmaW5lIEhBU0g1X0NBTEMgeyBcDQorICBVSW50MzIgdGVtcCA9IHAtPmNyY1tjdXJbMF1dIF4gY3VyWzFdOyBcDQorICBoYXNoMlZhbHVlID0gdGVtcCAmIChrSGFzaDJTaXplIC0gMSk7IFwNCisgIGhhc2gzVmFsdWUgPSAodGVtcCBeICgoVUludDMyKWN1clsyXSA8PCA4KSkgJiAoa0hhc2gzU2l6ZSAtIDEpOyBcDQorICBoYXNoNFZhbHVlID0gKHRlbXAgXiAoKFVJbnQzMiljdXJbMl0gPDwgOCkgXiAocC0+Y3JjW2N1clszXV0gPDwgNSkpOyBcDQorICBoYXNoVmFsdWUgPSAoaGFzaDRWYWx1ZSBeIChwLT5jcmNbY3VyWzRdXSA8PCAzKSkgJiBwLT5oYXNoTWFzazsgXA0KKyAgaGFzaDRWYWx1ZSAmPSAoa0hhc2g0U2l6ZSAtIDEpOyB9DQorDQorLyogI2RlZmluZSBIQVNIX1pJUF9DQUxDIGhhc2hWYWx1ZSA9ICgoY3VyWzBdIHwgKChVSW50MzIpY3VyWzFdIDw8IDgpKSBeIHAtPmNyY1tjdXJbMl1dKSAmIDB4RkZGRjsgKi8NCisjZGVmaW5lIEhBU0hfWklQX0NBTEMgaGFzaFZhbHVlID0gKChjdXJbMl0gfCAoKFVJbnQzMiljdXJbMF0gPDwgOCkpIF4gcC0+Y3JjW2N1clsxXV0pICYgMHhGRkZGOw0KKw0KKw0KKyNkZWZpbmUgTVRfSEFTSDJfQ0FMQyBcDQorICBoYXNoMlZhbHVlID0gKHAtPmNyY1tjdXJbMF1dIF4gY3VyWzFdKSAmIChrSGFzaDJTaXplIC0gMSk7DQorDQorI2RlZmluZSBNVF9IQVNIM19DQUxDIHsgXA0KKyAgVUludDMyIHRlbXAgPSBwLT5jcmNbY3VyWzBdXSBeIGN1clsxXTsgXA0KKyAgaGFzaDJWYWx1ZSA9IHRlbXAgJiAoa0hhc2gyU2l6ZSAtIDEpOyBcDQorICBoYXNoM1ZhbHVlID0gKHRlbXAgXiAoKFVJbnQzMiljdXJbMl0gPDwgOCkpICYgKGtIYXNoM1NpemUgLSAxKTsgfQ0KKw0KKyNkZWZpbmUgTVRfSEFTSDRfQ0FMQyB7IFwNCisgIFVJbnQzMiB0ZW1wID0gcC0+Y3JjW2N1clswXV0gXiBjdXJbMV07IFwNCisgIGhhc2gyVmFsdWUgPSB0ZW1wICYgKGtIYXNoMlNpemUgLSAxKTsgXA0KKyAgaGFzaDNWYWx1ZSA9ICh0ZW1wIF4gKChVSW50MzIpY3VyWzJdIDw8IDgpKSAmIChrSGFzaDNTaXplIC0gMSk7IFwNCisgIGhhc2g0VmFsdWUgPSAodGVtcCBeICgoVUludDMyKWN1clsyXSA8PCA4KSBeIChwLT5jcmNbY3VyWzNdXSA8PCA1KSkgJiAoa0hhc2g0U2l6ZSAtIDEpOyB9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DL0x6bWEyRGVjLmMgYi9sem1hL0MvTHptYTJEZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDkxNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL0x6bWEyRGVjLmMKQEAgLTAsMCArMSwzNTIgQEAKKy8qIEx6bWEyRGVjLmMgLS0gTFpNQTIgRGVjb2Rlcg0KKzIwMTAtMTItMTUgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisvKiAjZGVmaW5lIFNIT1dfREVCVUdfSU5GTyAqLw0KKw0KKyNpbmNsdWRlICJQcmVjb21wLmgiDQorDQorI2lmZGVmIFNIT1dfREVCVUdfSU5GTw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisNCisjaW5jbHVkZSAiTHptYTJEZWMuaCINCisNCisvKg0KKzAwMDAwMDAwICAtICBFT1MNCiswMDAwMDAwMSBVIFUgIC0gIFVuY29tcHJlc3NlZCBSZXNldCBEaWMNCiswMDAwMDAxMCBVIFUgIC0gIFVuY29tcHJlc3NlZCBObyBSZXNldA0KKzEwMHV1dXV1IFUgVSBQIFAgIC0gIExaTUEgbm8gcmVzZXQNCisxMDF1dXV1dSBVIFUgUCBQICAtICBMWk1BIHJlc2V0IHN0YXRlDQorMTEwdXV1dXUgVSBVIFAgUCBTICAtICBMWk1BIHJlc2V0IHN0YXRlICsgbmV3IHByb3ANCisxMTF1dXV1dSBVIFUgUCBQIFMgIC0gIExaTUEgcmVzZXQgc3RhdGUgKyBuZXcgcHJvcCArIHJlc2V0IGRpYw0KKw0KKyAgdSwgVSAtIFVucGFjayBTaXplDQorICBQIC0gUGFjayBTaXplDQorICBTIC0gUHJvcHMNCisqLw0KKw0KKyNkZWZpbmUgTFpNQTJfQ09OVFJPTF9MWk1BICgxIDw8IDcpDQorI2RlZmluZSBMWk1BMl9DT05UUk9MX0NPUFlfTk9fUkVTRVQgMg0KKyNkZWZpbmUgTFpNQTJfQ09OVFJPTF9DT1BZX1JFU0VUX0RJQyAxDQorI2RlZmluZSBMWk1BMl9DT05UUk9MX0VPRiAwDQorDQorI2RlZmluZSBMWk1BMl9JU19VTkNPTVBSRVNTRURfU1RBVEUocCkgKCgocCktPmNvbnRyb2wgJiBMWk1BMl9DT05UUk9MX0xaTUEpID09IDApDQorDQorI2RlZmluZSBMWk1BMl9HRVRfTFpNQV9NT0RFKHApICgoKHApLT5jb250cm9sID4+IDUpICYgMykNCisjZGVmaW5lIExaTUEyX0lTX1RIRVJFX1BST1AobW9kZSkgKChtb2RlKSA+PSAyKQ0KKw0KKyNkZWZpbmUgTFpNQTJfTENMUF9NQVggNA0KKyNkZWZpbmUgTFpNQTJfRElDX1NJWkVfRlJPTV9QUk9QKHApICgoKFVJbnQzMikyIHwgKChwKSAmIDEpKSA8PCAoKHApIC8gMiArIDExKSkNCisNCisjaWZkZWYgU0hPV19ERUJVR19JTkZPDQorI2RlZmluZSBQUkYoeCkgeA0KKyNlbHNlDQorI2RlZmluZSBQUkYoeCkNCisjZW5kaWYNCisNCit0eXBlZGVmIGVudW0NCit7DQorICBMWk1BMl9TVEFURV9DT05UUk9MLA0KKyAgTFpNQTJfU1RBVEVfVU5QQUNLMCwNCisgIExaTUEyX1NUQVRFX1VOUEFDSzEsDQorICBMWk1BMl9TVEFURV9QQUNLMCwNCisgIExaTUEyX1NUQVRFX1BBQ0sxLA0KKyAgTFpNQTJfU1RBVEVfUFJPUCwNCisgIExaTUEyX1NUQVRFX0RBVEEsDQorICBMWk1BMl9TVEFURV9EQVRBX0NPTlQsDQorICBMWk1BMl9TVEFURV9GSU5JU0hFRCwNCisgIExaTUEyX1NUQVRFX0VSUk9SDQorfSBFTHptYTJTdGF0ZTsNCisNCitzdGF0aWMgU1JlcyBMem1hMkRlY19HZXRPbGRQcm9wcyhCeXRlIHByb3AsIEJ5dGUgKnByb3BzKQ0KK3sNCisgIFVJbnQzMiBkaWNTaXplOw0KKyAgaWYgKHByb3AgPiA0MCkNCisgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKyAgZGljU2l6ZSA9IChwcm9wID09IDQwKSA/IDB4RkZGRkZGRkYgOiBMWk1BMl9ESUNfU0laRV9GUk9NX1BST1AocHJvcCk7DQorICBwcm9wc1swXSA9IChCeXRlKUxaTUEyX0xDTFBfTUFYOw0KKyAgcHJvcHNbMV0gPSAoQnl0ZSkoZGljU2l6ZSk7DQorICBwcm9wc1syXSA9IChCeXRlKShkaWNTaXplID4+IDgpOw0KKyAgcHJvcHNbM10gPSAoQnl0ZSkoZGljU2l6ZSA+PiAxNik7DQorICBwcm9wc1s0XSA9IChCeXRlKShkaWNTaXplID4+IDI0KTsNCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorU1JlcyBMem1hMkRlY19BbGxvY2F0ZVByb2JzKENMem1hMkRlYyAqcCwgQnl0ZSBwcm9wLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgQnl0ZSBwcm9wc1tMWk1BX1BST1BTX1NJWkVdOw0KKyAgUklOT0soTHptYTJEZWNfR2V0T2xkUHJvcHMocHJvcCwgcHJvcHMpKTsNCisgIHJldHVybiBMem1hRGVjX0FsbG9jYXRlUHJvYnMoJnAtPmRlY29kZXIsIHByb3BzLCBMWk1BX1BST1BTX1NJWkUsIGFsbG9jKTsNCit9DQorDQorU1JlcyBMem1hMkRlY19BbGxvY2F0ZShDTHptYTJEZWMgKnAsIEJ5dGUgcHJvcCwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIEJ5dGUgcHJvcHNbTFpNQV9QUk9QU19TSVpFXTsNCisgIFJJTk9LKEx6bWEyRGVjX0dldE9sZFByb3BzKHByb3AsIHByb3BzKSk7DQorICByZXR1cm4gTHptYURlY19BbGxvY2F0ZSgmcC0+ZGVjb2RlciwgcHJvcHMsIExaTUFfUFJPUFNfU0laRSwgYWxsb2MpOw0KK30NCisNCit2b2lkIEx6bWEyRGVjX0luaXQoQ0x6bWEyRGVjICpwKQ0KK3sNCisgIHAtPnN0YXRlID0gTFpNQTJfU1RBVEVfQ09OVFJPTDsNCisgIHAtPm5lZWRJbml0RGljID0gVHJ1ZTsNCisgIHAtPm5lZWRJbml0U3RhdGUgPSBUcnVlOw0KKyAgcC0+bmVlZEluaXRQcm9wID0gVHJ1ZTsNCisgIEx6bWFEZWNfSW5pdCgmcC0+ZGVjb2Rlcik7DQorfQ0KKw0KK3N0YXRpYyBFTHptYTJTdGF0ZSBMem1hMkRlY19VcGRhdGVTdGF0ZShDTHptYTJEZWMgKnAsIEJ5dGUgYikNCit7DQorICBzd2l0Y2gocC0+c3RhdGUpDQorICB7DQorICAgIGNhc2UgTFpNQTJfU1RBVEVfQ09OVFJPTDoNCisgICAgICBwLT5jb250cm9sID0gYjsNCisgICAgICBQUkYocHJpbnRmKCJcbiAlNFggIiwgcC0+ZGVjb2Rlci5kaWNQb3MpKTsNCisgICAgICBQUkYocHJpbnRmKCIgJTJYIiwgYikpOw0KKyAgICAgIGlmIChwLT5jb250cm9sID09IDApDQorICAgICAgICByZXR1cm4gTFpNQTJfU1RBVEVfRklOSVNIRUQ7DQorICAgICAgaWYgKExaTUEyX0lTX1VOQ09NUFJFU1NFRF9TVEFURShwKSkNCisgICAgICB7DQorICAgICAgICBpZiAoKHAtPmNvbnRyb2wgJiAweDdGKSA+IDIpDQorICAgICAgICAgIHJldHVybiBMWk1BMl9TVEFURV9FUlJPUjsNCisgICAgICAgIHAtPnVucGFja1NpemUgPSAwOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgICBwLT51bnBhY2tTaXplID0gKFVJbnQzMikocC0+Y29udHJvbCAmIDB4MUYpIDw8IDE2Ow0KKyAgICAgIHJldHVybiBMWk1BMl9TVEFURV9VTlBBQ0swOw0KKyAgICANCisgICAgY2FzZSBMWk1BMl9TVEFURV9VTlBBQ0swOg0KKyAgICAgIHAtPnVucGFja1NpemUgfD0gKFVJbnQzMiliIDw8IDg7DQorICAgICAgcmV0dXJuIExaTUEyX1NUQVRFX1VOUEFDSzE7DQorICAgIA0KKyAgICBjYXNlIExaTUEyX1NUQVRFX1VOUEFDSzE6DQorICAgICAgcC0+dW5wYWNrU2l6ZSB8PSAoVUludDMyKWI7DQorICAgICAgcC0+dW5wYWNrU2l6ZSsrOw0KKyAgICAgIFBSRihwcmludGYoIiAlOGQiLCBwLT51bnBhY2tTaXplKSk7DQorICAgICAgcmV0dXJuIChMWk1BMl9JU19VTkNPTVBSRVNTRURfU1RBVEUocCkpID8gTFpNQTJfU1RBVEVfREFUQSA6IExaTUEyX1NUQVRFX1BBQ0swOw0KKyAgICANCisgICAgY2FzZSBMWk1BMl9TVEFURV9QQUNLMDoNCisgICAgICBwLT5wYWNrU2l6ZSA9IChVSW50MzIpYiA8PCA4Ow0KKyAgICAgIHJldHVybiBMWk1BMl9TVEFURV9QQUNLMTsNCisNCisgICAgY2FzZSBMWk1BMl9TVEFURV9QQUNLMToNCisgICAgICBwLT5wYWNrU2l6ZSB8PSAoVUludDMyKWI7DQorICAgICAgcC0+cGFja1NpemUrKzsNCisgICAgICBQUkYocHJpbnRmKCIgJThkIiwgcC0+cGFja1NpemUpKTsNCisgICAgICByZXR1cm4gTFpNQTJfSVNfVEhFUkVfUFJPUChMWk1BMl9HRVRfTFpNQV9NT0RFKHApKSA/IExaTUEyX1NUQVRFX1BST1A6DQorICAgICAgICAocC0+bmVlZEluaXRQcm9wID8gTFpNQTJfU1RBVEVfRVJST1IgOiBMWk1BMl9TVEFURV9EQVRBKTsNCisNCisgICAgY2FzZSBMWk1BMl9TVEFURV9QUk9QOg0KKyAgICB7DQorICAgICAgaW50IGxjLCBscDsNCisgICAgICBpZiAoYiA+PSAoOSAqIDUgKiA1KSkNCisgICAgICAgIHJldHVybiBMWk1BMl9TVEFURV9FUlJPUjsNCisgICAgICBsYyA9IGIgJSA5Ow0KKyAgICAgIGIgLz0gOTsNCisgICAgICBwLT5kZWNvZGVyLnByb3AucGIgPSBiIC8gNTsNCisgICAgICBscCA9IGIgJSA1Ow0KKyAgICAgIGlmIChsYyArIGxwID4gTFpNQTJfTENMUF9NQVgpDQorICAgICAgICByZXR1cm4gTFpNQTJfU1RBVEVfRVJST1I7DQorICAgICAgcC0+ZGVjb2Rlci5wcm9wLmxjID0gbGM7DQorICAgICAgcC0+ZGVjb2Rlci5wcm9wLmxwID0gbHA7DQorICAgICAgcC0+bmVlZEluaXRQcm9wID0gRmFsc2U7DQorICAgICAgcmV0dXJuIExaTUEyX1NUQVRFX0RBVEE7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBMWk1BMl9TVEFURV9FUlJPUjsNCit9DQorDQorc3RhdGljIHZvaWQgTHptYURlY19VcGRhdGVXaXRoVW5jb21wcmVzc2VkKENMem1hRGVjICpwLCBjb25zdCBCeXRlICpzcmMsIFNpemVUIHNpemUpDQorew0KKyAgbWVtY3B5KHAtPmRpYyArIHAtPmRpY1Bvcywgc3JjLCBzaXplKTsNCisgIHAtPmRpY1BvcyArPSBzaXplOw0KKyAgaWYgKHAtPmNoZWNrRGljU2l6ZSA9PSAwICYmIHAtPnByb3AuZGljU2l6ZSAtIHAtPnByb2Nlc3NlZFBvcyA8PSBzaXplKQ0KKyAgICBwLT5jaGVja0RpY1NpemUgPSBwLT5wcm9wLmRpY1NpemU7DQorICBwLT5wcm9jZXNzZWRQb3MgKz0gKFVJbnQzMilzaXplOw0KK30NCisNCit2b2lkIEx6bWFEZWNfSW5pdERpY0FuZFN0YXRlKENMem1hRGVjICpwLCBCb29sIGluaXREaWMsIEJvb2wgaW5pdFN0YXRlKTsNCisNCitTUmVzIEx6bWEyRGVjX0RlY29kZVRvRGljKENMem1hMkRlYyAqcCwgU2l6ZVQgZGljTGltaXQsDQorICAgIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbiwgRUx6bWFGaW5pc2hNb2RlIGZpbmlzaE1vZGUsIEVMem1hU3RhdHVzICpzdGF0dXMpDQorew0KKyAgU2l6ZVQgaW5TaXplID0gKnNyY0xlbjsNCisgICpzcmNMZW4gPSAwOw0KKyAgKnN0YXR1cyA9IExaTUFfU1RBVFVTX05PVF9TUEVDSUZJRUQ7DQorDQorICB3aGlsZSAocC0+c3RhdGUgIT0gTFpNQTJfU1RBVEVfRklOSVNIRUQpDQorICB7DQorICAgIFNpemVUIGRpY1BvcyA9IHAtPmRlY29kZXIuZGljUG9zOw0KKyAgICBpZiAocC0+c3RhdGUgPT0gTFpNQTJfU1RBVEVfRVJST1IpDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX0RBVEE7DQorICAgIGlmIChkaWNQb3MgPT0gZGljTGltaXQgJiYgZmluaXNoTW9kZSA9PSBMWk1BX0ZJTklTSF9BTlkpDQorICAgIHsNCisgICAgICAqc3RhdHVzID0gTFpNQV9TVEFUVVNfTk9UX0ZJTklTSEVEOw0KKyAgICAgIHJldHVybiBTWl9PSzsNCisgICAgfQ0KKyAgICBpZiAocC0+c3RhdGUgIT0gTFpNQTJfU1RBVEVfREFUQSAmJiBwLT5zdGF0ZSAhPSBMWk1BMl9TVEFURV9EQVRBX0NPTlQpDQorICAgIHsNCisgICAgICBpZiAoKnNyY0xlbiA9PSBpblNpemUpDQorICAgICAgew0KKyAgICAgICAgKnN0YXR1cyA9IExaTUFfU1RBVFVTX05FRURTX01PUkVfSU5QVVQ7DQorICAgICAgICByZXR1cm4gU1pfT0s7DQorICAgICAgfQ0KKyAgICAgICgqc3JjTGVuKSsrOw0KKyAgICAgIHAtPnN0YXRlID0gTHptYTJEZWNfVXBkYXRlU3RhdGUocCwgKnNyYysrKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICB7DQorICAgICAgU2l6ZVQgZGVzdFNpemVDdXIgPSBkaWNMaW1pdCAtIGRpY1BvczsNCisgICAgICBTaXplVCBzcmNTaXplQ3VyID0gaW5TaXplIC0gKnNyY0xlbjsNCisgICAgICBFTHptYUZpbmlzaE1vZGUgY3VyRmluaXNoTW9kZSA9IExaTUFfRklOSVNIX0FOWTsNCisgICAgICANCisgICAgICBpZiAocC0+dW5wYWNrU2l6ZSA8PSBkZXN0U2l6ZUN1cikNCisgICAgICB7DQorICAgICAgICBkZXN0U2l6ZUN1ciA9IChTaXplVClwLT51bnBhY2tTaXplOw0KKyAgICAgICAgY3VyRmluaXNoTW9kZSA9IExaTUFfRklOSVNIX0VORDsNCisgICAgICB9DQorDQorICAgICAgaWYgKExaTUEyX0lTX1VOQ09NUFJFU1NFRF9TVEFURShwKSkNCisgICAgICB7DQorICAgICAgICBpZiAoKnNyY0xlbiA9PSBpblNpemUpDQorICAgICAgICB7DQorICAgICAgICAgICpzdGF0dXMgPSBMWk1BX1NUQVRVU19ORUVEU19NT1JFX0lOUFVUOw0KKyAgICAgICAgICByZXR1cm4gU1pfT0s7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAocC0+c3RhdGUgPT0gTFpNQTJfU1RBVEVfREFUQSkNCisgICAgICAgIHsNCisgICAgICAgICAgQm9vbCBpbml0RGljID0gKHAtPmNvbnRyb2wgPT0gTFpNQTJfQ09OVFJPTF9DT1BZX1JFU0VUX0RJQyk7DQorICAgICAgICAgIGlmIChpbml0RGljKQ0KKyAgICAgICAgICAgIHAtPm5lZWRJbml0UHJvcCA9IHAtPm5lZWRJbml0U3RhdGUgPSBUcnVlOw0KKyAgICAgICAgICBlbHNlIGlmIChwLT5uZWVkSW5pdERpYykNCisgICAgICAgICAgICByZXR1cm4gU1pfRVJST1JfREFUQTsNCisgICAgICAgICAgcC0+bmVlZEluaXREaWMgPSBGYWxzZTsNCisgICAgICAgICAgTHptYURlY19Jbml0RGljQW5kU3RhdGUoJnAtPmRlY29kZXIsIGluaXREaWMsIEZhbHNlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChzcmNTaXplQ3VyID4gZGVzdFNpemVDdXIpDQorICAgICAgICAgIHNyY1NpemVDdXIgPSBkZXN0U2l6ZUN1cjsNCisNCisgICAgICAgIGlmIChzcmNTaXplQ3VyID09IDApDQorICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9EQVRBOw0KKw0KKyAgICAgICAgTHptYURlY19VcGRhdGVXaXRoVW5jb21wcmVzc2VkKCZwLT5kZWNvZGVyLCBzcmMsIHNyY1NpemVDdXIpOw0KKw0KKyAgICAgICAgc3JjICs9IHNyY1NpemVDdXI7DQorICAgICAgICAqc3JjTGVuICs9IHNyY1NpemVDdXI7DQorICAgICAgICBwLT51bnBhY2tTaXplIC09IChVSW50MzIpc3JjU2l6ZUN1cjsNCisgICAgICAgIHAtPnN0YXRlID0gKHAtPnVucGFja1NpemUgPT0gMCkgPyBMWk1BMl9TVEFURV9DT05UUk9MIDogTFpNQTJfU1RBVEVfREFUQV9DT05UOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgU2l6ZVQgb3V0U2l6ZVByb2Nlc3NlZDsNCisgICAgICAgIFNSZXMgcmVzOw0KKw0KKyAgICAgICAgaWYgKHAtPnN0YXRlID09IExaTUEyX1NUQVRFX0RBVEEpDQorICAgICAgICB7DQorICAgICAgICAgIGludCBtb2RlID0gTFpNQTJfR0VUX0xaTUFfTU9ERShwKTsNCisgICAgICAgICAgQm9vbCBpbml0RGljID0gKG1vZGUgPT0gMyk7DQorICAgICAgICAgIEJvb2wgaW5pdFN0YXRlID0gKG1vZGUgPiAwKTsNCisgICAgICAgICAgaWYgKCghaW5pdERpYyAmJiBwLT5uZWVkSW5pdERpYykgfHwgKCFpbml0U3RhdGUgJiYgcC0+bmVlZEluaXRTdGF0ZSkpDQorICAgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX0RBVEE7DQorICAgICAgICAgIA0KKyAgICAgICAgICBMem1hRGVjX0luaXREaWNBbmRTdGF0ZSgmcC0+ZGVjb2RlciwgaW5pdERpYywgaW5pdFN0YXRlKTsNCisgICAgICAgICAgcC0+bmVlZEluaXREaWMgPSBGYWxzZTsNCisgICAgICAgICAgcC0+bmVlZEluaXRTdGF0ZSA9IEZhbHNlOw0KKyAgICAgICAgICBwLT5zdGF0ZSA9IExaTUEyX1NUQVRFX0RBVEFfQ09OVDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChzcmNTaXplQ3VyID4gcC0+cGFja1NpemUpDQorICAgICAgICAgIHNyY1NpemVDdXIgPSAoU2l6ZVQpcC0+cGFja1NpemU7DQorICAgICAgICAgIA0KKyAgICAgICAgcmVzID0gTHptYURlY19EZWNvZGVUb0RpYygmcC0+ZGVjb2RlciwgZGljUG9zICsgZGVzdFNpemVDdXIsIHNyYywgJnNyY1NpemVDdXIsIGN1ckZpbmlzaE1vZGUsIHN0YXR1cyk7DQorICAgICAgICANCisgICAgICAgIHNyYyArPSBzcmNTaXplQ3VyOw0KKyAgICAgICAgKnNyY0xlbiArPSBzcmNTaXplQ3VyOw0KKyAgICAgICAgcC0+cGFja1NpemUgLT0gKFVJbnQzMilzcmNTaXplQ3VyOw0KKw0KKyAgICAgICAgb3V0U2l6ZVByb2Nlc3NlZCA9IHAtPmRlY29kZXIuZGljUG9zIC0gZGljUG9zOw0KKyAgICAgICAgcC0+dW5wYWNrU2l6ZSAtPSAoVUludDMyKW91dFNpemVQcm9jZXNzZWQ7DQorDQorICAgICAgICBSSU5PSyhyZXMpOw0KKyAgICAgICAgaWYgKCpzdGF0dXMgPT0gTFpNQV9TVEFUVVNfTkVFRFNfTU9SRV9JTlBVVCkNCisgICAgICAgICAgcmV0dXJuIHJlczsNCisNCisgICAgICAgIGlmIChzcmNTaXplQ3VyID09IDAgJiYgb3V0U2l6ZVByb2Nlc3NlZCA9PSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAoKnN0YXR1cyAhPSBMWk1BX1NUQVRVU19NQVlCRV9GSU5JU0hFRF9XSVRIT1VUX01BUksgfHwNCisgICAgICAgICAgICAgIHAtPnVucGFja1NpemUgIT0gMCB8fCBwLT5wYWNrU2l6ZSAhPSAwKQ0KKyAgICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9EQVRBOw0KKyAgICAgICAgICBwLT5zdGF0ZSA9IExaTUEyX1NUQVRFX0NPTlRST0w7DQorICAgICAgICB9DQorICAgICAgICBpZiAoKnN0YXR1cyA9PSBMWk1BX1NUQVRVU19NQVlCRV9GSU5JU0hFRF9XSVRIT1VUX01BUkspDQorICAgICAgICAgICpzdGF0dXMgPSBMWk1BX1NUQVRVU19OT1RfRklOSVNIRUQ7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICAqc3RhdHVzID0gTFpNQV9TVEFUVVNfRklOSVNIRURfV0lUSF9NQVJLOw0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCitTUmVzIEx6bWEyRGVjX0RlY29kZVRvQnVmKENMem1hMkRlYyAqcCwgQnl0ZSAqZGVzdCwgU2l6ZVQgKmRlc3RMZW4sIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbiwgRUx6bWFGaW5pc2hNb2RlIGZpbmlzaE1vZGUsIEVMem1hU3RhdHVzICpzdGF0dXMpDQorew0KKyAgU2l6ZVQgb3V0U2l6ZSA9ICpkZXN0TGVuLCBpblNpemUgPSAqc3JjTGVuOw0KKyAgKnNyY0xlbiA9ICpkZXN0TGVuID0gMDsNCisgIGZvciAoOzspDQorICB7DQorICAgIFNpemVUIHNyY1NpemVDdXIgPSBpblNpemUsIG91dFNpemVDdXIsIGRpY1BvczsNCisgICAgRUx6bWFGaW5pc2hNb2RlIGN1ckZpbmlzaE1vZGU7DQorICAgIFNSZXMgcmVzOw0KKyAgICBpZiAocC0+ZGVjb2Rlci5kaWNQb3MgPT0gcC0+ZGVjb2Rlci5kaWNCdWZTaXplKQ0KKyAgICAgIHAtPmRlY29kZXIuZGljUG9zID0gMDsNCisgICAgZGljUG9zID0gcC0+ZGVjb2Rlci5kaWNQb3M7DQorICAgIGlmIChvdXRTaXplID4gcC0+ZGVjb2Rlci5kaWNCdWZTaXplIC0gZGljUG9zKQ0KKyAgICB7DQorICAgICAgb3V0U2l6ZUN1ciA9IHAtPmRlY29kZXIuZGljQnVmU2l6ZTsNCisgICAgICBjdXJGaW5pc2hNb2RlID0gTFpNQV9GSU5JU0hfQU5ZOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIG91dFNpemVDdXIgPSBkaWNQb3MgKyBvdXRTaXplOw0KKyAgICAgIGN1ckZpbmlzaE1vZGUgPSBmaW5pc2hNb2RlOw0KKyAgICB9DQorDQorICAgIHJlcyA9IEx6bWEyRGVjX0RlY29kZVRvRGljKHAsIG91dFNpemVDdXIsIHNyYywgJnNyY1NpemVDdXIsIGN1ckZpbmlzaE1vZGUsIHN0YXR1cyk7DQorICAgIHNyYyArPSBzcmNTaXplQ3VyOw0KKyAgICBpblNpemUgLT0gc3JjU2l6ZUN1cjsNCisgICAgKnNyY0xlbiArPSBzcmNTaXplQ3VyOw0KKyAgICBvdXRTaXplQ3VyID0gcC0+ZGVjb2Rlci5kaWNQb3MgLSBkaWNQb3M7DQorICAgIG1lbWNweShkZXN0LCBwLT5kZWNvZGVyLmRpYyArIGRpY1Bvcywgb3V0U2l6ZUN1cik7DQorICAgIGRlc3QgKz0gb3V0U2l6ZUN1cjsNCisgICAgb3V0U2l6ZSAtPSBvdXRTaXplQ3VyOw0KKyAgICAqZGVzdExlbiArPSBvdXRTaXplQ3VyOw0KKyAgICBpZiAocmVzICE9IDApDQorICAgICAgcmV0dXJuIHJlczsNCisgICAgaWYgKG91dFNpemVDdXIgPT0gMCB8fCBvdXRTaXplID09IDApDQorICAgICAgcmV0dXJuIFNaX09LOw0KKyAgfQ0KK30NCisNCitTUmVzIEx6bWEyRGVjb2RlKEJ5dGUgKmRlc3QsIFNpemVUICpkZXN0TGVuLCBjb25zdCBCeXRlICpzcmMsIFNpemVUICpzcmNMZW4sDQorICAgIEJ5dGUgcHJvcCwgRUx6bWFGaW5pc2hNb2RlIGZpbmlzaE1vZGUsIEVMem1hU3RhdHVzICpzdGF0dXMsIElTekFsbG9jICphbGxvYykNCit7DQorICBDTHptYTJEZWMgcDsNCisgIFNSZXMgcmVzOw0KKyAgU2l6ZVQgb3V0U2l6ZSA9ICpkZXN0TGVuLCBpblNpemUgPSAqc3JjTGVuOw0KKyAgKmRlc3RMZW4gPSAqc3JjTGVuID0gMDsNCisgICpzdGF0dXMgPSBMWk1BX1NUQVRVU19OT1RfU1BFQ0lGSUVEOw0KKyAgTHptYTJEZWNfQ29uc3RydWN0KCZwKTsNCisgIFJJTk9LKEx6bWEyRGVjX0FsbG9jYXRlUHJvYnMoJnAsIHByb3AsIGFsbG9jKSk7DQorICBwLmRlY29kZXIuZGljID0gZGVzdDsNCisgIHAuZGVjb2Rlci5kaWNCdWZTaXplID0gb3V0U2l6ZTsNCisgIEx6bWEyRGVjX0luaXQoJnApOw0KKyAgKnNyY0xlbiA9IGluU2l6ZTsNCisgIHJlcyA9IEx6bWEyRGVjX0RlY29kZVRvRGljKCZwLCBvdXRTaXplLCBzcmMsIHNyY0xlbiwgZmluaXNoTW9kZSwgc3RhdHVzKTsNCisgICpkZXN0TGVuID0gcC5kZWNvZGVyLmRpY1BvczsNCisgIGlmIChyZXMgPT0gU1pfT0sgJiYgKnN0YXR1cyA9PSBMWk1BX1NUQVRVU19ORUVEU19NT1JFX0lOUFVUKQ0KKyAgICByZXMgPSBTWl9FUlJPUl9JTlBVVF9FT0Y7DQorICBMem1hMkRlY19GcmVlUHJvYnMoJnAsIGFsbG9jKTsNCisgIHJldHVybiByZXM7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9Mem1hMkRlYy5oIGIvbHptYS9DL0x6bWEyRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1NDUyMwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9Mem1hMkRlYy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIEx6bWEyRGVjLmggLS0gTFpNQTIgRGVjb2Rlcg0KKzIwMTMtMDEtMTggOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaWZuZGVmIF9fTFpNQTJfREVDX0gNCisjZGVmaW5lIF9fTFpNQTJfREVDX0gNCisNCisjaW5jbHVkZSAiTHptYURlYy5oIg0KKw0KK0VYVEVSTl9DX0JFR0lODQorDQorLyogLS0tLS0tLS0tLSBTdGF0ZSBJbnRlcmZhY2UgLS0tLS0tLS0tLSAqLw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgQ0x6bWFEZWMgZGVjb2RlcjsNCisgIFVJbnQzMiBwYWNrU2l6ZTsNCisgIFVJbnQzMiB1bnBhY2tTaXplOw0KKyAgaW50IHN0YXRlOw0KKyAgQnl0ZSBjb250cm9sOw0KKyAgQm9vbCBuZWVkSW5pdERpYzsNCisgIEJvb2wgbmVlZEluaXRTdGF0ZTsNCisgIEJvb2wgbmVlZEluaXRQcm9wOw0KK30gQ0x6bWEyRGVjOw0KKw0KKyNkZWZpbmUgTHptYTJEZWNfQ29uc3RydWN0KHApIEx6bWFEZWNfQ29uc3RydWN0KCYocCktPmRlY29kZXIpDQorI2RlZmluZSBMem1hMkRlY19GcmVlUHJvYnMocCwgYWxsb2MpIEx6bWFEZWNfRnJlZVByb2JzKCYocCktPmRlY29kZXIsIGFsbG9jKTsNCisjZGVmaW5lIEx6bWEyRGVjX0ZyZWUocCwgYWxsb2MpIEx6bWFEZWNfRnJlZSgmKHApLT5kZWNvZGVyLCBhbGxvYyk7DQorDQorU1JlcyBMem1hMkRlY19BbGxvY2F0ZVByb2JzKENMem1hMkRlYyAqcCwgQnl0ZSBwcm9wLCBJU3pBbGxvYyAqYWxsb2MpOw0KK1NSZXMgTHptYTJEZWNfQWxsb2NhdGUoQ0x6bWEyRGVjICpwLCBCeXRlIHByb3AsIElTekFsbG9jICphbGxvYyk7DQordm9pZCBMem1hMkRlY19Jbml0KENMem1hMkRlYyAqcCk7DQorDQorDQorLyoNCitmaW5pc2hNb2RlOg0KKyAgSXQgaGFzIG1lYW5pbmcgb25seSBpZiB0aGUgZGVjb2RpbmcgcmVhY2hlcyBvdXRwdXQgbGltaXQgKCpkZXN0TGVuIG9yIGRpY0xpbWl0KS4NCisgIExaTUFfRklOSVNIX0FOWSAtIHVzZSBzbWFsbGVzdCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMNCisgIExaTUFfRklOSVNIX0VORCAtIHJlYWQgRW5kT2ZTdHJlYW0gbWFya2VyIGFmdGVyIGRlY29kaW5nDQorDQorUmV0dXJuczoNCisgIFNaX09LDQorICAgIHN0YXR1czoNCisgICAgICBMWk1BX1NUQVRVU19GSU5JU0hFRF9XSVRIX01BUksNCisgICAgICBMWk1BX1NUQVRVU19OT1RfRklOSVNIRUQNCisgICAgICBMWk1BX1NUQVRVU19ORUVEU19NT1JFX0lOUFVUDQorICBTWl9FUlJPUl9EQVRBIC0gRGF0YSBlcnJvcg0KKyovDQorDQorU1JlcyBMem1hMkRlY19EZWNvZGVUb0RpYyhDTHptYTJEZWMgKnAsIFNpemVUIGRpY0xpbWl0LA0KKyAgICBjb25zdCBCeXRlICpzcmMsIFNpemVUICpzcmNMZW4sIEVMem1hRmluaXNoTW9kZSBmaW5pc2hNb2RlLCBFTHptYVN0YXR1cyAqc3RhdHVzKTsNCisNCitTUmVzIEx6bWEyRGVjX0RlY29kZVRvQnVmKENMem1hMkRlYyAqcCwgQnl0ZSAqZGVzdCwgU2l6ZVQgKmRlc3RMZW4sDQorICAgIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbiwgRUx6bWFGaW5pc2hNb2RlIGZpbmlzaE1vZGUsIEVMem1hU3RhdHVzICpzdGF0dXMpOw0KKw0KKw0KKy8qIC0tLS0tLS0tLS0gT25lIENhbGwgSW50ZXJmYWNlIC0tLS0tLS0tLS0gKi8NCisNCisvKg0KK2ZpbmlzaE1vZGU6DQorICBJdCBoYXMgbWVhbmluZyBvbmx5IGlmIHRoZSBkZWNvZGluZyByZWFjaGVzIG91dHB1dCBsaW1pdCAoKmRlc3RMZW4pLg0KKyAgTFpNQV9GSU5JU0hfQU5ZIC0gdXNlIHNtYWxsZXN0IG51bWJlciBvZiBpbnB1dCBieXRlcw0KKyAgTFpNQV9GSU5JU0hfRU5EIC0gcmVhZCBFbmRPZlN0cmVhbSBtYXJrZXIgYWZ0ZXIgZGVjb2RpbmcNCisNCitSZXR1cm5zOg0KKyAgU1pfT0sNCisgICAgc3RhdHVzOg0KKyAgICAgIExaTUFfU1RBVFVTX0ZJTklTSEVEX1dJVEhfTUFSSw0KKyAgICAgIExaTUFfU1RBVFVTX05PVF9GSU5JU0hFRA0KKyAgU1pfRVJST1JfREFUQSAtIERhdGEgZXJyb3INCisgIFNaX0VSUk9SX01FTSAgLSBNZW1vcnkgYWxsb2NhdGlvbiBlcnJvcg0KKyAgU1pfRVJST1JfVU5TVVBQT1JURUQgLSBVbnN1cHBvcnRlZCBwcm9wZXJ0aWVzDQorICBTWl9FUlJPUl9JTlBVVF9FT0YgLSBJdCBuZWVkcyBtb3JlIGJ5dGVzIGluIGlucHV0IGJ1ZmZlciAoc3JjKS4NCisqLw0KKw0KK1NSZXMgTHptYTJEZWNvZGUoQnl0ZSAqZGVzdCwgU2l6ZVQgKmRlc3RMZW4sIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbiwNCisgICAgQnl0ZSBwcm9wLCBFTHptYUZpbmlzaE1vZGUgZmluaXNoTW9kZSwgRUx6bWFTdGF0dXMgKnN0YXR1cywgSVN6QWxsb2MgKmFsbG9jKTsNCisNCitFWFRFUk5fQ19FTkQNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0MvTHptYTJFbmMuYyBiL2x6bWEvQy9Mem1hMkVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YTk3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvTHptYTJFbmMuYwpAQCAtMCwwICsxLDQ5MyBAQAorLyogTHptYTJFbmMuYyAtLSBMWk1BMiBFbmNvZGVyDQorMjAxMi0wNi0xOSA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlICJQcmVjb21wLmgiDQorDQorLyogI2luY2x1ZGUgPHN0ZGlvLmg+ICovDQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKw0KKy8qICNkZWZpbmUgXzdaSVBfU1QgKi8NCisNCisjaW5jbHVkZSAiTHptYTJFbmMuaCINCisNCisjaWZuZGVmIF83WklQX1NUDQorI2luY2x1ZGUgIk10Q29kZXIuaCINCisjZWxzZQ0KKyNkZWZpbmUgTlVNX01UX0NPREVSX1RIUkVBRFNfTUFYIDENCisjZW5kaWYNCisNCisjZGVmaW5lIExaTUEyX0NPTlRST0xfTFpNQSAoMSA8PCA3KQ0KKyNkZWZpbmUgTFpNQTJfQ09OVFJPTF9DT1BZX05PX1JFU0VUIDINCisjZGVmaW5lIExaTUEyX0NPTlRST0xfQ09QWV9SRVNFVF9ESUMgMQ0KKyNkZWZpbmUgTFpNQTJfQ09OVFJPTF9FT0YgMA0KKw0KKyNkZWZpbmUgTFpNQTJfTENMUF9NQVggNA0KKw0KKyNkZWZpbmUgTFpNQTJfRElDX1NJWkVfRlJPTV9QUk9QKHApICgoKFVJbnQzMikyIHwgKChwKSAmIDEpKSA8PCAoKHApIC8gMiArIDExKSkNCisNCisjZGVmaW5lIExaTUEyX1BBQ0tfU0laRV9NQVggKDEgPDwgMTYpDQorI2RlZmluZSBMWk1BMl9DT1BZX0NIVU5LX1NJWkUgTFpNQTJfUEFDS19TSVpFX01BWA0KKyNkZWZpbmUgTFpNQTJfVU5QQUNLX1NJWkVfTUFYICgxIDw8IDIxKQ0KKyNkZWZpbmUgTFpNQTJfS0VFUF9XSU5ET1dfU0laRSBMWk1BMl9VTlBBQ0tfU0laRV9NQVgNCisNCisjZGVmaW5lIExaTUEyX0NIVU5LX1NJWkVfQ09NUFJFU1NFRF9NQVggKCgxIDw8IDE2KSArIDE2KQ0KKw0KKw0KKyNkZWZpbmUgUFJGKHgpIC8qIHggKi8NCisNCisvKiAtLS0tLS0tLS0tIENMem1hMkVuY0ludCAtLS0tLS0tLS0tICovDQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBDTHptYUVuY0hhbmRsZSBlbmM7DQorICBVSW50NjQgc3JjUG9zOw0KKyAgQnl0ZSBwcm9wczsNCisgIEJvb2wgbmVlZEluaXRTdGF0ZTsNCisgIEJvb2wgbmVlZEluaXRQcm9wOw0KK30gQ0x6bWEyRW5jSW50Ow0KKw0KK3N0YXRpYyBTUmVzIEx6bWEyRW5jSW50X0luaXQoQ0x6bWEyRW5jSW50ICpwLCBjb25zdCBDTHptYTJFbmNQcm9wcyAqcHJvcHMpDQorew0KKyAgQnl0ZSBwcm9wc0VuY29kZWRbTFpNQV9QUk9QU19TSVpFXTsNCisgIFNpemVUIHByb3BzU2l6ZSA9IExaTUFfUFJPUFNfU0laRTsNCisgIFJJTk9LKEx6bWFFbmNfU2V0UHJvcHMocC0+ZW5jLCAmcHJvcHMtPmx6bWFQcm9wcykpOw0KKyAgUklOT0soTHptYUVuY19Xcml0ZVByb3BlcnRpZXMocC0+ZW5jLCBwcm9wc0VuY29kZWQsICZwcm9wc1NpemUpKTsNCisgIHAtPnNyY1BvcyA9IDA7DQorICBwLT5wcm9wcyA9IHByb3BzRW5jb2RlZFswXTsNCisgIHAtPm5lZWRJbml0U3RhdGUgPSBUcnVlOw0KKyAgcC0+bmVlZEluaXRQcm9wID0gVHJ1ZTsNCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorU1JlcyBMem1hRW5jX1ByZXBhcmVGb3JMem1hMihDTHptYUVuY0hhbmRsZSBwcCwgSVNlcUluU3RyZWFtICppblN0cmVhbSwgVUludDMyIGtlZXBXaW5kb3dTaXplLA0KKyAgICBJU3pBbGxvYyAqYWxsb2MsIElTekFsbG9jICphbGxvY0JpZyk7DQorU1JlcyBMem1hRW5jX01lbVByZXBhcmUoQ0x6bWFFbmNIYW5kbGUgcHAsIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgc3JjTGVuLA0KKyAgICBVSW50MzIga2VlcFdpbmRvd1NpemUsIElTekFsbG9jICphbGxvYywgSVN6QWxsb2MgKmFsbG9jQmlnKTsNCitTUmVzIEx6bWFFbmNfQ29kZU9uZU1lbUJsb2NrKENMem1hRW5jSGFuZGxlIHBwLCBCb29sIHJlSW5pdCwNCisgICAgQnl0ZSAqZGVzdCwgc2l6ZV90ICpkZXN0TGVuLCBVSW50MzIgZGVzaXJlZFBhY2tTaXplLCBVSW50MzIgKnVucGFja1NpemUpOw0KK2NvbnN0IEJ5dGUgKkx6bWFFbmNfR2V0Q3VyQnVmKENMem1hRW5jSGFuZGxlIHBwKTsNCit2b2lkIEx6bWFFbmNfRmluaXNoKENMem1hRW5jSGFuZGxlIHBwKTsNCit2b2lkIEx6bWFFbmNfU2F2ZVN0YXRlKENMem1hRW5jSGFuZGxlIHBwKTsNCit2b2lkIEx6bWFFbmNfUmVzdG9yZVN0YXRlKENMem1hRW5jSGFuZGxlIHBwKTsNCisNCisNCitzdGF0aWMgU1JlcyBMem1hMkVuY0ludF9FbmNvZGVTdWJibG9jayhDTHptYTJFbmNJbnQgKnAsIEJ5dGUgKm91dEJ1ZiwNCisgICAgc2l6ZV90ICpwYWNrU2l6ZVJlcywgSVNlcU91dFN0cmVhbSAqb3V0U3RyZWFtKQ0KK3sNCisgIHNpemVfdCBwYWNrU2l6ZUxpbWl0ID0gKnBhY2tTaXplUmVzOw0KKyAgc2l6ZV90IHBhY2tTaXplID0gcGFja1NpemVMaW1pdDsNCisgIFVJbnQzMiB1bnBhY2tTaXplID0gTFpNQTJfVU5QQUNLX1NJWkVfTUFYOw0KKyAgdW5zaWduZWQgbHpIZWFkZXJTaXplID0gNSArIChwLT5uZWVkSW5pdFByb3AgPyAxIDogMCk7DQorICBCb29sIHVzZUNvcHlCbG9jazsNCisgIFNSZXMgcmVzOw0KKw0KKyAgKnBhY2tTaXplUmVzID0gMDsNCisgIGlmIChwYWNrU2l6ZSA8IGx6SGVhZGVyU2l6ZSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX09VVFBVVF9FT0Y7DQorICBwYWNrU2l6ZSAtPSBsekhlYWRlclNpemU7DQorICANCisgIEx6bWFFbmNfU2F2ZVN0YXRlKHAtPmVuYyk7DQorICByZXMgPSBMem1hRW5jX0NvZGVPbmVNZW1CbG9jayhwLT5lbmMsIHAtPm5lZWRJbml0U3RhdGUsDQorICAgICAgb3V0QnVmICsgbHpIZWFkZXJTaXplLCAmcGFja1NpemUsIExaTUEyX1BBQ0tfU0laRV9NQVgsICZ1bnBhY2tTaXplKTsNCisgIA0KKyAgUFJGKHByaW50ZigiXG5wYWNrU2l6ZSA9ICU3ZCB1bnBhY2tTaXplID0gJTdkICAiLCBwYWNrU2l6ZSwgdW5wYWNrU2l6ZSkpOw0KKw0KKyAgaWYgKHVucGFja1NpemUgPT0gMCkNCisgICAgcmV0dXJuIHJlczsNCisNCisgIGlmIChyZXMgPT0gU1pfT0spDQorICAgIHVzZUNvcHlCbG9jayA9IChwYWNrU2l6ZSArIDIgPj0gdW5wYWNrU2l6ZSB8fCBwYWNrU2l6ZSA+ICgxIDw8IDE2KSk7DQorICBlbHNlDQorICB7DQorICAgIGlmIChyZXMgIT0gU1pfRVJST1JfT1VUUFVUX0VPRikNCisgICAgICByZXR1cm4gcmVzOw0KKyAgICByZXMgPSBTWl9PSzsNCisgICAgdXNlQ29weUJsb2NrID0gVHJ1ZTsNCisgIH0NCisNCisgIGlmICh1c2VDb3B5QmxvY2spDQorICB7DQorICAgIHNpemVfdCBkZXN0UG9zID0gMDsNCisgICAgUFJGKHByaW50ZigiIyMjIyMjIyMjIyMjIyMjIyMgQ09QWSAgICAgICAgICAgIikpOw0KKyAgICB3aGlsZSAodW5wYWNrU2l6ZSA+IDApDQorICAgIHsNCisgICAgICBVSW50MzIgdSA9ICh1bnBhY2tTaXplIDwgTFpNQTJfQ09QWV9DSFVOS19TSVpFKSA/IHVucGFja1NpemUgOiBMWk1BMl9DT1BZX0NIVU5LX1NJWkU7DQorICAgICAgaWYgKHBhY2tTaXplTGltaXQgLSBkZXN0UG9zIDwgdSArIDMpDQorICAgICAgICByZXR1cm4gU1pfRVJST1JfT1VUUFVUX0VPRjsNCisgICAgICBvdXRCdWZbZGVzdFBvcysrXSA9IChCeXRlKShwLT5zcmNQb3MgPT0gMCA/IExaTUEyX0NPTlRST0xfQ09QWV9SRVNFVF9ESUMgOiBMWk1BMl9DT05UUk9MX0NPUFlfTk9fUkVTRVQpOw0KKyAgICAgIG91dEJ1ZltkZXN0UG9zKytdID0gKEJ5dGUpKCh1IC0gMSkgPj4gOCk7DQorICAgICAgb3V0QnVmW2Rlc3RQb3MrK10gPSAoQnl0ZSkodSAtIDEpOw0KKyAgICAgIG1lbWNweShvdXRCdWYgKyBkZXN0UG9zLCBMem1hRW5jX0dldEN1ckJ1ZihwLT5lbmMpIC0gdW5wYWNrU2l6ZSwgdSk7DQorICAgICAgdW5wYWNrU2l6ZSAtPSB1Ow0KKyAgICAgIGRlc3RQb3MgKz0gdTsNCisgICAgICBwLT5zcmNQb3MgKz0gdTsNCisgICAgICBpZiAob3V0U3RyZWFtKQ0KKyAgICAgIHsNCisgICAgICAgICpwYWNrU2l6ZVJlcyArPSBkZXN0UG9zOw0KKyAgICAgICAgaWYgKG91dFN0cmVhbS0+V3JpdGUob3V0U3RyZWFtLCBvdXRCdWYsIGRlc3RQb3MpICE9IGRlc3RQb3MpDQorICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9XUklURTsNCisgICAgICAgIGRlc3RQb3MgPSAwOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgICAqcGFja1NpemVSZXMgPSBkZXN0UG9zOw0KKyAgICAgIC8qIG5lZWRJbml0U3RhdGUgPSBUcnVlOyAqLw0KKyAgICB9DQorICAgIEx6bWFFbmNfUmVzdG9yZVN0YXRlKHAtPmVuYyk7DQorICAgIHJldHVybiBTWl9PSzsNCisgIH0NCisgIHsNCisgICAgc2l6ZV90IGRlc3RQb3MgPSAwOw0KKyAgICBVSW50MzIgdSA9IHVucGFja1NpemUgLSAxOw0KKyAgICBVSW50MzIgcG0gPSAoVUludDMyKShwYWNrU2l6ZSAtIDEpOw0KKyAgICB1bnNpZ25lZCBtb2RlID0gKHAtPnNyY1BvcyA9PSAwKSA/IDMgOiAocC0+bmVlZEluaXRTdGF0ZSA/IChwLT5uZWVkSW5pdFByb3AgPyAyIDogMSkgOiAwKTsNCisNCisgICAgUFJGKHByaW50ZigiICAgICAgICAgICAgICAgIikpOw0KKw0KKyAgICBvdXRCdWZbZGVzdFBvcysrXSA9IChCeXRlKShMWk1BMl9DT05UUk9MX0xaTUEgfCAobW9kZSA8PCA1KSB8ICgodSA+PiAxNikgJiAweDFGKSk7DQorICAgIG91dEJ1ZltkZXN0UG9zKytdID0gKEJ5dGUpKHUgPj4gOCk7DQorICAgIG91dEJ1ZltkZXN0UG9zKytdID0gKEJ5dGUpdTsNCisgICAgb3V0QnVmW2Rlc3RQb3MrK10gPSAoQnl0ZSkocG0gPj4gOCk7DQorICAgIG91dEJ1ZltkZXN0UG9zKytdID0gKEJ5dGUpcG07DQorICAgIA0KKyAgICBpZiAocC0+bmVlZEluaXRQcm9wKQ0KKyAgICAgIG91dEJ1ZltkZXN0UG9zKytdID0gcC0+cHJvcHM7DQorICAgIA0KKyAgICBwLT5uZWVkSW5pdFByb3AgPSBGYWxzZTsNCisgICAgcC0+bmVlZEluaXRTdGF0ZSA9IEZhbHNlOw0KKyAgICBkZXN0UG9zICs9IHBhY2tTaXplOw0KKyAgICBwLT5zcmNQb3MgKz0gdW5wYWNrU2l6ZTsNCisNCisgICAgaWYgKG91dFN0cmVhbSkNCisgICAgICBpZiAob3V0U3RyZWFtLT5Xcml0ZShvdXRTdHJlYW0sIG91dEJ1ZiwgZGVzdFBvcykgIT0gZGVzdFBvcykNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9XUklURTsNCisgICAgKnBhY2tTaXplUmVzID0gZGVzdFBvczsNCisgICAgcmV0dXJuIFNaX09LOw0KKyAgfQ0KK30NCisNCisvKiAtLS0tLS0tLS0tIEx6bWEyIFByb3BzIC0tLS0tLS0tLS0gKi8NCisNCit2b2lkIEx6bWEyRW5jUHJvcHNfSW5pdChDTHptYTJFbmNQcm9wcyAqcCkNCit7DQorICBMem1hRW5jUHJvcHNfSW5pdCgmcC0+bHptYVByb3BzKTsNCisgIHAtPm51bVRvdGFsVGhyZWFkcyA9IC0xOw0KKyAgcC0+bnVtQmxvY2tUaHJlYWRzID0gLTE7DQorICBwLT5ibG9ja1NpemUgPSAwOw0KK30NCisNCit2b2lkIEx6bWEyRW5jUHJvcHNfTm9ybWFsaXplKENMem1hMkVuY1Byb3BzICpwKQ0KK3sNCisgIGludCB0MSwgdDFuLCB0MiwgdDM7DQorICB7DQorICAgIENMem1hRW5jUHJvcHMgbHptYVByb3BzID0gcC0+bHptYVByb3BzOw0KKyAgICBMem1hRW5jUHJvcHNfTm9ybWFsaXplKCZsem1hUHJvcHMpOw0KKyAgICB0MW4gPSBsem1hUHJvcHMubnVtVGhyZWFkczsNCisgIH0NCisNCisgIHQxID0gcC0+bHptYVByb3BzLm51bVRocmVhZHM7DQorICB0MiA9IHAtPm51bUJsb2NrVGhyZWFkczsNCisgIHQzID0gcC0+bnVtVG90YWxUaHJlYWRzOw0KKw0KKyAgaWYgKHQyID4gTlVNX01UX0NPREVSX1RIUkVBRFNfTUFYKQ0KKyAgICB0MiA9IE5VTV9NVF9DT0RFUl9USFJFQURTX01BWDsNCisNCisgIGlmICh0MyA8PSAwKQ0KKyAgew0KKyAgICBpZiAodDIgPD0gMCkNCisgICAgICB0MiA9IDE7DQorICAgIHQzID0gdDFuICogdDI7DQorICB9DQorICBlbHNlIGlmICh0MiA8PSAwKQ0KKyAgew0KKyAgICB0MiA9IHQzIC8gdDFuOw0KKyAgICBpZiAodDIgPT0gMCkNCisgICAgew0KKyAgICAgIHQxID0gMTsNCisgICAgICB0MiA9IHQzOw0KKyAgICB9DQorICAgIGlmICh0MiA+IE5VTV9NVF9DT0RFUl9USFJFQURTX01BWCkNCisgICAgICB0MiA9IE5VTV9NVF9DT0RFUl9USFJFQURTX01BWDsNCisgIH0NCisgIGVsc2UgaWYgKHQxIDw9IDApDQorICB7DQorICAgIHQxID0gdDMgLyB0MjsNCisgICAgaWYgKHQxID09IDApDQorICAgICAgdDEgPSAxOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgICB0MyA9IHQxbiAqIHQyOw0KKw0KKyAgcC0+bHptYVByb3BzLm51bVRocmVhZHMgPSB0MTsNCisNCisgIEx6bWFFbmNQcm9wc19Ob3JtYWxpemUoJnAtPmx6bWFQcm9wcyk7DQorDQorICBpZiAocC0+YmxvY2tTaXplID09IDApDQorICB7DQorICAgIFVJbnQzMiBkaWN0U2l6ZSA9IHAtPmx6bWFQcm9wcy5kaWN0U2l6ZTsNCisgICAgVUludDY0IGJsb2NrU2l6ZSA9IChVSW50NjQpZGljdFNpemUgPDwgMjsNCisgICAgY29uc3QgVUludDMyIGtNaW5TaXplID0gKFVJbnQzMikxIDw8IDIwOw0KKyAgICBjb25zdCBVSW50MzIga01heFNpemUgPSAoVUludDMyKTEgPDwgMjg7DQorICAgIGlmIChibG9ja1NpemUgPCBrTWluU2l6ZSkgYmxvY2tTaXplID0ga01pblNpemU7DQorICAgIGlmIChibG9ja1NpemUgPiBrTWF4U2l6ZSkgYmxvY2tTaXplID0ga01heFNpemU7DQorICAgIGlmIChibG9ja1NpemUgPCBkaWN0U2l6ZSkgYmxvY2tTaXplID0gZGljdFNpemU7DQorICAgIHAtPmJsb2NrU2l6ZSA9IChzaXplX3QpYmxvY2tTaXplOw0KKyAgfQ0KKyAgaWYgKHQyID4gMSkNCisgIHsNCisgICAgVUludDY0IHRlbXAgPSBwLT5sem1hUHJvcHMucmVkdWNlU2l6ZSArIHAtPmJsb2NrU2l6ZSAtIDE7DQorICAgIGlmICh0ZW1wID4gcC0+bHptYVByb3BzLnJlZHVjZVNpemUpDQorICAgIHsNCisgICAgICBVSW50NjQgbnVtQmxvY2tzID0gdGVtcCAvIHAtPmJsb2NrU2l6ZTsNCisgICAgICBpZiAobnVtQmxvY2tzIDwgdDIpDQorICAgICAgew0KKyAgICAgICAgdDIgPSAoVUludDMyKW51bUJsb2NrczsNCisgICAgICAgIHQzID0gdDEgKiB0MjsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHAtPm51bUJsb2NrVGhyZWFkcyA9IHQyOw0KKyAgcC0+bnVtVG90YWxUaHJlYWRzID0gdDM7DQorfQ0KKw0KK3N0YXRpYyBTUmVzIFByb2dyZXNzKElDb21wcmVzc1Byb2dyZXNzICpwLCBVSW50NjQgaW5TaXplLCBVSW50NjQgb3V0U2l6ZSkNCit7DQorICByZXR1cm4gKHAgJiYgcC0+UHJvZ3Jlc3MocCwgaW5TaXplLCBvdXRTaXplKSAhPSBTWl9PSykgPyBTWl9FUlJPUl9QUk9HUkVTUyA6IFNaX09LOw0KK30NCisNCisvKiAtLS0tLS0tLS0tIEx6bWEyIC0tLS0tLS0tLS0gKi8NCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIEJ5dGUgcHJvcEVuY29kZWQ7DQorICBDTHptYTJFbmNQcm9wcyBwcm9wczsNCisgIA0KKyAgQnl0ZSAqb3V0QnVmOw0KKw0KKyAgSVN6QWxsb2MgKmFsbG9jOw0KKyAgSVN6QWxsb2MgKmFsbG9jQmlnOw0KKw0KKyAgQ0x6bWEyRW5jSW50IGNvZGVyc1tOVU1fTVRfQ09ERVJfVEhSRUFEU19NQVhdOw0KKw0KKyAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgQ010Q29kZXIgbXRDb2RlcjsNCisgICNlbmRpZg0KKw0KK30gQ0x6bWEyRW5jOw0KKw0KKw0KKy8qIC0tLS0tLS0tLS0gTHptYTJFbmNUaHJlYWQgLS0tLS0tLS0tLSAqLw0KKw0KK3N0YXRpYyBTUmVzIEx6bWEyRW5jX0VuY29kZU10MShDTHptYTJFbmNJbnQgKnAsIENMem1hMkVuYyAqbWFpbkVuY29kZXIsDQorICBJU2VxT3V0U3RyZWFtICpvdXRTdHJlYW0sIElTZXFJblN0cmVhbSAqaW5TdHJlYW0sIElDb21wcmVzc1Byb2dyZXNzICpwcm9ncmVzcykNCit7DQorICBVSW50NjQgcGFja1RvdGFsID0gMDsNCisgIFNSZXMgcmVzID0gU1pfT0s7DQorDQorICBpZiAobWFpbkVuY29kZXItPm91dEJ1ZiA9PSAwKQ0KKyAgew0KKyAgICBtYWluRW5jb2Rlci0+b3V0QnVmID0gKEJ5dGUgKilJQWxsb2NfQWxsb2MobWFpbkVuY29kZXItPmFsbG9jLCBMWk1BMl9DSFVOS19TSVpFX0NPTVBSRVNTRURfTUFYKTsNCisgICAgaWYgKG1haW5FbmNvZGVyLT5vdXRCdWYgPT0gMCkNCisgICAgICByZXR1cm4gU1pfRVJST1JfTUVNOw0KKyAgfQ0KKyAgUklOT0soTHptYTJFbmNJbnRfSW5pdChwLCAmbWFpbkVuY29kZXItPnByb3BzKSk7DQorICBSSU5PSyhMem1hRW5jX1ByZXBhcmVGb3JMem1hMihwLT5lbmMsIGluU3RyZWFtLCBMWk1BMl9LRUVQX1dJTkRPV19TSVpFLA0KKyAgICAgIG1haW5FbmNvZGVyLT5hbGxvYywgbWFpbkVuY29kZXItPmFsbG9jQmlnKSk7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBzaXplX3QgcGFja1NpemUgPSBMWk1BMl9DSFVOS19TSVpFX0NPTVBSRVNTRURfTUFYOw0KKyAgICByZXMgPSBMem1hMkVuY0ludF9FbmNvZGVTdWJibG9jayhwLCBtYWluRW5jb2Rlci0+b3V0QnVmLCAmcGFja1NpemUsIG91dFN0cmVhbSk7DQorICAgIGlmIChyZXMgIT0gU1pfT0spDQorICAgICAgYnJlYWs7DQorICAgIHBhY2tUb3RhbCArPSBwYWNrU2l6ZTsNCisgICAgcmVzID0gUHJvZ3Jlc3MocHJvZ3Jlc3MsIHAtPnNyY1BvcywgcGFja1RvdGFsKTsNCisgICAgaWYgKHJlcyAhPSBTWl9PSykNCisgICAgICBicmVhazsNCisgICAgaWYgKHBhY2tTaXplID09IDApDQorICAgICAgYnJlYWs7DQorICB9DQorICBMem1hRW5jX0ZpbmlzaChwLT5lbmMpOw0KKyAgaWYgKHJlcyA9PSBTWl9PSykNCisgIHsNCisgICAgQnl0ZSBiID0gMDsNCisgICAgaWYgKG91dFN0cmVhbS0+V3JpdGUob3V0U3RyZWFtLCAmYiwgMSkgIT0gMSkNCisgICAgICByZXR1cm4gU1pfRVJST1JfV1JJVEU7DQorICB9DQorICByZXR1cm4gcmVzOw0KK30NCisNCisjaWZuZGVmIF83WklQX1NUDQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBJTXRDb2RlckNhbGxiYWNrIGZ1bmNUYWJsZTsNCisgIENMem1hMkVuYyAqbHptYTJFbmM7DQorfSBDTXRDYWxsYmFja0ltcDsNCisNCitzdGF0aWMgU1JlcyBNdENhbGxiYWNrSW1wX0NvZGUodm9pZCAqcHAsIHVuc2lnbmVkIGluZGV4LCBCeXRlICpkZXN0LCBzaXplX3QgKmRlc3RTaXplLA0KKyAgICAgIGNvbnN0IEJ5dGUgKnNyYywgc2l6ZV90IHNyY1NpemUsIGludCBmaW5pc2hlZCkNCit7DQorICBDTXRDYWxsYmFja0ltcCAqaW1wID0gKENNdENhbGxiYWNrSW1wICopcHA7DQorICBDTHptYTJFbmMgKm1haW5FbmNvZGVyID0gaW1wLT5sem1hMkVuYzsNCisgIENMem1hMkVuY0ludCAqcCA9ICZtYWluRW5jb2Rlci0+Y29kZXJzW2luZGV4XTsNCisNCisgIFNSZXMgcmVzID0gU1pfT0s7DQorICB7DQorICAgIHNpemVfdCBkZXN0TGltID0gKmRlc3RTaXplOw0KKyAgICAqZGVzdFNpemUgPSAwOw0KKw0KKyAgICBpZiAoc3JjU2l6ZSAhPSAwKQ0KKyAgICB7DQorICAgICAgUklOT0soTHptYTJFbmNJbnRfSW5pdChwLCAmbWFpbkVuY29kZXItPnByb3BzKSk7DQorICAgICANCisgICAgICBSSU5PSyhMem1hRW5jX01lbVByZXBhcmUocC0+ZW5jLCBzcmMsIHNyY1NpemUsIExaTUEyX0tFRVBfV0lORE9XX1NJWkUsDQorICAgICAgICAgIG1haW5FbmNvZGVyLT5hbGxvYywgbWFpbkVuY29kZXItPmFsbG9jQmlnKSk7DQorICAgICANCisgICAgICB3aGlsZSAocC0+c3JjUG9zIDwgc3JjU2l6ZSkNCisgICAgICB7DQorICAgICAgICBzaXplX3QgcGFja1NpemUgPSBkZXN0TGltIC0gKmRlc3RTaXplOw0KKyAgICAgICAgcmVzID0gTHptYTJFbmNJbnRfRW5jb2RlU3ViYmxvY2socCwgZGVzdCArICpkZXN0U2l6ZSwgJnBhY2tTaXplLCBOVUxMKTsNCisgICAgICAgIGlmIChyZXMgIT0gU1pfT0spDQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgKmRlc3RTaXplICs9IHBhY2tTaXplOw0KKw0KKyAgICAgICAgaWYgKHBhY2tTaXplID09IDApDQorICAgICAgICB7DQorICAgICAgICAgIHJlcyA9IFNaX0VSUk9SX0ZBSUw7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKE10UHJvZ3Jlc3NfU2V0KCZtYWluRW5jb2Rlci0+bXRDb2Rlci5tdFByb2dyZXNzLCBpbmRleCwgcC0+c3JjUG9zLCAqZGVzdFNpemUpICE9IFNaX09LKQ0KKyAgICAgICAgew0KKyAgICAgICAgICByZXMgPSBTWl9FUlJPUl9QUk9HUkVTUzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIEx6bWFFbmNfRmluaXNoKHAtPmVuYyk7DQorICAgICAgaWYgKHJlcyAhPSBTWl9PSykNCisgICAgICAgIHJldHVybiByZXM7DQorICAgIH0NCisgICAgaWYgKGZpbmlzaGVkKQ0KKyAgICB7DQorICAgICAgaWYgKCpkZXN0U2l6ZSA9PSBkZXN0TGltKQ0KKyAgICAgICAgcmV0dXJuIFNaX0VSUk9SX09VVFBVVF9FT0Y7DQorICAgICAgZGVzdFsoKmRlc3RTaXplKSsrXSA9IDA7DQorICAgIH0NCisgIH0NCisgIHJldHVybiByZXM7DQorfQ0KKw0KKyNlbmRpZg0KKw0KKy8qIC0tLS0tLS0tLS0gTHptYTJFbmMgLS0tLS0tLS0tLSAqLw0KKw0KK0NMem1hMkVuY0hhbmRsZSBMem1hMkVuY19DcmVhdGUoSVN6QWxsb2MgKmFsbG9jLCBJU3pBbGxvYyAqYWxsb2NCaWcpDQorew0KKyAgQ0x6bWEyRW5jICpwID0gKENMem1hMkVuYyAqKWFsbG9jLT5BbGxvYyhhbGxvYywgc2l6ZW9mKENMem1hMkVuYykpOw0KKyAgaWYgKHAgPT0gMCkNCisgICAgcmV0dXJuIE5VTEw7DQorICBMem1hMkVuY1Byb3BzX0luaXQoJnAtPnByb3BzKTsNCisgIEx6bWEyRW5jUHJvcHNfTm9ybWFsaXplKCZwLT5wcm9wcyk7DQorICBwLT5vdXRCdWYgPSAwOw0KKyAgcC0+YWxsb2MgPSBhbGxvYzsNCisgIHAtPmFsbG9jQmlnID0gYWxsb2NCaWc7DQorICB7DQorICAgIHVuc2lnbmVkIGk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTVRfQ09ERVJfVEhSRUFEU19NQVg7IGkrKykNCisgICAgICBwLT5jb2RlcnNbaV0uZW5jID0gMDsNCisgIH0NCisgICNpZm5kZWYgXzdaSVBfU1QNCisgIE10Q29kZXJfQ29uc3RydWN0KCZwLT5tdENvZGVyKTsNCisgICNlbmRpZg0KKw0KKyAgcmV0dXJuIHA7DQorfQ0KKw0KK3ZvaWQgTHptYTJFbmNfRGVzdHJveShDTHptYTJFbmNIYW5kbGUgcHApDQorew0KKyAgQ0x6bWEyRW5jICpwID0gKENMem1hMkVuYyAqKXBwOw0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fTVRfQ09ERVJfVEhSRUFEU19NQVg7IGkrKykNCisgIHsNCisgICAgQ0x6bWEyRW5jSW50ICp0ID0gJnAtPmNvZGVyc1tpXTsNCisgICAgaWYgKHQtPmVuYykNCisgICAgew0KKyAgICAgIEx6bWFFbmNfRGVzdHJveSh0LT5lbmMsIHAtPmFsbG9jLCBwLT5hbGxvY0JpZyk7DQorICAgICAgdC0+ZW5jID0gMDsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgTXRDb2Rlcl9EZXN0cnVjdCgmcC0+bXRDb2Rlcik7DQorICAjZW5kaWYNCisNCisgIElBbGxvY19GcmVlKHAtPmFsbG9jLCBwLT5vdXRCdWYpOw0KKyAgSUFsbG9jX0ZyZWUocC0+YWxsb2MsIHBwKTsNCit9DQorDQorU1JlcyBMem1hMkVuY19TZXRQcm9wcyhDTHptYTJFbmNIYW5kbGUgcHAsIGNvbnN0IENMem1hMkVuY1Byb3BzICpwcm9wcykNCit7DQorICBDTHptYTJFbmMgKnAgPSAoQ0x6bWEyRW5jICopcHA7DQorICBDTHptYUVuY1Byb3BzIGx6bWFQcm9wcyA9IHByb3BzLT5sem1hUHJvcHM7DQorICBMem1hRW5jUHJvcHNfTm9ybWFsaXplKCZsem1hUHJvcHMpOw0KKyAgaWYgKGx6bWFQcm9wcy5sYyArIGx6bWFQcm9wcy5scCA+IExaTUEyX0xDTFBfTUFYKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfUEFSQU07DQorICBwLT5wcm9wcyA9ICpwcm9wczsNCisgIEx6bWEyRW5jUHJvcHNfTm9ybWFsaXplKCZwLT5wcm9wcyk7DQorICByZXR1cm4gU1pfT0s7DQorfQ0KKw0KK0J5dGUgTHptYTJFbmNfV3JpdGVQcm9wZXJ0aWVzKENMem1hMkVuY0hhbmRsZSBwcCkNCit7DQorICBDTHptYTJFbmMgKnAgPSAoQ0x6bWEyRW5jICopcHA7DQorICB1bnNpZ25lZCBpOw0KKyAgVUludDMyIGRpY1NpemUgPSBMem1hRW5jUHJvcHNfR2V0RGljdFNpemUoJnAtPnByb3BzLmx6bWFQcm9wcyk7DQorICBmb3IgKGkgPSAwOyBpIDwgNDA7IGkrKykNCisgICAgaWYgKGRpY1NpemUgPD0gTFpNQTJfRElDX1NJWkVfRlJPTV9QUk9QKGkpKQ0KKyAgICAgIGJyZWFrOw0KKyAgcmV0dXJuIChCeXRlKWk7DQorfQ0KKw0KK1NSZXMgTHptYTJFbmNfRW5jb2RlKENMem1hMkVuY0hhbmRsZSBwcCwNCisgICAgSVNlcU91dFN0cmVhbSAqb3V0U3RyZWFtLCBJU2VxSW5TdHJlYW0gKmluU3RyZWFtLCBJQ29tcHJlc3NQcm9ncmVzcyAqcHJvZ3Jlc3MpDQorew0KKyAgQ0x6bWEyRW5jICpwID0gKENMem1hMkVuYyAqKXBwOw0KKyAgaW50IGk7DQorDQorICBmb3IgKGkgPSAwOyBpIDwgcC0+cHJvcHMubnVtQmxvY2tUaHJlYWRzOyBpKyspDQorICB7DQorICAgIENMem1hMkVuY0ludCAqdCA9ICZwLT5jb2RlcnNbaV07DQorICAgIGlmICh0LT5lbmMgPT0gTlVMTCkNCisgICAgew0KKyAgICAgIHQtPmVuYyA9IEx6bWFFbmNfQ3JlYXRlKHAtPmFsbG9jKTsNCisgICAgICBpZiAodC0+ZW5jID09IE5VTEwpDQorICAgICAgICByZXR1cm4gU1pfRVJST1JfTUVNOw0KKyAgICB9DQorICB9DQorDQorICAjaWZuZGVmIF83WklQX1NUDQorICBpZiAocC0+cHJvcHMubnVtQmxvY2tUaHJlYWRzIDw9IDEpDQorICAjZW5kaWYNCisgICAgcmV0dXJuIEx6bWEyRW5jX0VuY29kZU10MSgmcC0+Y29kZXJzWzBdLCBwLCBvdXRTdHJlYW0sIGluU3RyZWFtLCBwcm9ncmVzcyk7DQorDQorICAjaWZuZGVmIF83WklQX1NUDQorDQorICB7DQorICAgIENNdENhbGxiYWNrSW1wIG10Q2FsbGJhY2s7DQorDQorICAgIG10Q2FsbGJhY2suZnVuY1RhYmxlLkNvZGUgPSBNdENhbGxiYWNrSW1wX0NvZGU7DQorICAgIG10Q2FsbGJhY2subHptYTJFbmMgPSBwOw0KKyAgICANCisgICAgcC0+bXRDb2Rlci5wcm9ncmVzcyA9IHByb2dyZXNzOw0KKyAgICBwLT5tdENvZGVyLmluU3RyZWFtID0gaW5TdHJlYW07DQorICAgIHAtPm10Q29kZXIub3V0U3RyZWFtID0gb3V0U3RyZWFtOw0KKyAgICBwLT5tdENvZGVyLmFsbG9jID0gcC0+YWxsb2M7DQorICAgIHAtPm10Q29kZXIubXRDYWxsYmFjayA9ICZtdENhbGxiYWNrLmZ1bmNUYWJsZTsNCisNCisgICAgcC0+bXRDb2Rlci5ibG9ja1NpemUgPSBwLT5wcm9wcy5ibG9ja1NpemU7DQorICAgIHAtPm10Q29kZXIuZGVzdEJsb2NrU2l6ZSA9IHAtPnByb3BzLmJsb2NrU2l6ZSArIChwLT5wcm9wcy5ibG9ja1NpemUgPj4gMTApICsgMTY7DQorICAgIHAtPm10Q29kZXIubnVtVGhyZWFkcyA9IHAtPnByb3BzLm51bUJsb2NrVGhyZWFkczsNCisgICAgDQorICAgIHJldHVybiBNdENvZGVyX0NvZGUoJnAtPm10Q29kZXIpOw0KKyAgfQ0KKyAgI2VuZGlmDQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9Mem1hMkVuYy5oIGIvbHptYS9DL0x6bWEyRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxMTc4YQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9Mem1hMkVuYy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qIEx6bWEyRW5jLmggLS0gTFpNQTIgRW5jb2Rlcg0KKzIwMTMtMDEtMTggOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaWZuZGVmIF9fTFpNQTJfRU5DX0gNCisjZGVmaW5lIF9fTFpNQTJfRU5DX0gNCisNCisjaW5jbHVkZSAiTHptYUVuYy5oIg0KKw0KK0VYVEVSTl9DX0JFR0lODQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBDTHptYUVuY1Byb3BzIGx6bWFQcm9wczsNCisgIHNpemVfdCBibG9ja1NpemU7DQorICBpbnQgbnVtQmxvY2tUaHJlYWRzOw0KKyAgaW50IG51bVRvdGFsVGhyZWFkczsNCit9IENMem1hMkVuY1Byb3BzOw0KKw0KK3ZvaWQgTHptYTJFbmNQcm9wc19Jbml0KENMem1hMkVuY1Byb3BzICpwKTsNCit2b2lkIEx6bWEyRW5jUHJvcHNfTm9ybWFsaXplKENMem1hMkVuY1Byb3BzICpwKTsNCisNCisvKiAtLS0tLS0tLS0tIENMem1hRW5jMkhhbmRsZSBJbnRlcmZhY2UgLS0tLS0tLS0tLSAqLw0KKw0KKy8qIEx6bWEyRW5jXyogZnVuY3Rpb25zIGNhbiByZXR1cm4gdGhlIGZvbGxvd2luZyBleGl0IGNvZGVzOg0KK1JldHVybnM6DQorICBTWl9PSyAgICAgICAgICAgLSBPSw0KKyAgU1pfRVJST1JfTUVNICAgIC0gTWVtb3J5IGFsbG9jYXRpb24gZXJyb3INCisgIFNaX0VSUk9SX1BBUkFNICAtIEluY29ycmVjdCBwYXJhbWF0ZXIgaW4gcHJvcHMNCisgIFNaX0VSUk9SX1dSSVRFICAtIFdyaXRlIGNhbGxiYWNrIGVycm9yDQorICBTWl9FUlJPUl9QUk9HUkVTUyAtIHNvbWUgYnJlYWsgZnJvbSBwcm9ncmVzcyBjYWxsYmFjaw0KKyAgU1pfRVJST1JfVEhSRUFEIC0gZXJyb3JzIGluIG11bHRpdGhyZWFkaW5nIGZ1bmN0aW9ucyAob25seSBmb3IgTXQgdmVyc2lvbikNCisqLw0KKw0KK3R5cGVkZWYgdm9pZCAqIENMem1hMkVuY0hhbmRsZTsNCisNCitDTHptYTJFbmNIYW5kbGUgTHptYTJFbmNfQ3JlYXRlKElTekFsbG9jICphbGxvYywgSVN6QWxsb2MgKmFsbG9jQmlnKTsNCit2b2lkIEx6bWEyRW5jX0Rlc3Ryb3koQ0x6bWEyRW5jSGFuZGxlIHApOw0KK1NSZXMgTHptYTJFbmNfU2V0UHJvcHMoQ0x6bWEyRW5jSGFuZGxlIHAsIGNvbnN0IENMem1hMkVuY1Byb3BzICpwcm9wcyk7DQorQnl0ZSBMem1hMkVuY19Xcml0ZVByb3BlcnRpZXMoQ0x6bWEyRW5jSGFuZGxlIHApOw0KK1NSZXMgTHptYTJFbmNfRW5jb2RlKENMem1hMkVuY0hhbmRsZSBwLA0KKyAgICBJU2VxT3V0U3RyZWFtICpvdXRTdHJlYW0sIElTZXFJblN0cmVhbSAqaW5TdHJlYW0sIElDb21wcmVzc1Byb2dyZXNzICpwcm9ncmVzcyk7DQorDQorLyogLS0tLS0tLS0tLSBPbmUgQ2FsbCBJbnRlcmZhY2UgLS0tLS0tLS0tLSAqLw0KKw0KKy8qIEx6bWEyRW5jb2RlDQorUmV0dXJuIGNvZGU6DQorICBTWl9PSyAgICAgICAgICAgICAgIC0gT0sNCisgIFNaX0VSUk9SX01FTSAgICAgICAgLSBNZW1vcnkgYWxsb2NhdGlvbiBlcnJvcg0KKyAgU1pfRVJST1JfUEFSQU0gICAgICAtIEluY29ycmVjdCBwYXJhbWF0ZXINCisgIFNaX0VSUk9SX09VVFBVVF9FT0YgLSBvdXRwdXQgYnVmZmVyIG92ZXJmbG93DQorICBTWl9FUlJPUl9USFJFQUQgICAgIC0gZXJyb3JzIGluIG11bHRpdGhyZWFkaW5nIGZ1bmN0aW9ucyAob25seSBmb3IgTXQgdmVyc2lvbikNCisqLw0KKw0KKy8qDQorU1JlcyBMem1hMkVuY29kZShCeXRlICpkZXN0LCBTaXplVCAqZGVzdExlbiwgY29uc3QgQnl0ZSAqc3JjLCBTaXplVCBzcmNMZW4sDQorICAgIGNvbnN0IENMem1hRW5jUHJvcHMgKnByb3BzLCBCeXRlICpwcm9wc0VuY29kZWQsIGludCB3cml0ZUVuZE1hcmssDQorICAgIElDb21wcmVzc1Byb2dyZXNzICpwcm9ncmVzcywgSVN6QWxsb2MgKmFsbG9jLCBJU3pBbGxvYyAqYWxsb2NCaWcpOw0KKyovDQorDQorRVhURVJOX0NfRU5EDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DL0x6bWE4Ni5oIGIvbHptYS9DL0x6bWE4Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMDU3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvTHptYTg2LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qIEx6bWE4Ni5oIC0tIExaTUEgKyB4ODYgKEJDSikgRmlsdGVyDQorMjAxMy0wMS0xOCA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpZm5kZWYgX19MWk1BODZfSA0KKyNkZWZpbmUgX19MWk1BODZfSA0KKw0KKyNpbmNsdWRlICI3elR5cGVzLmgiDQorDQorRVhURVJOX0NfQkVHSU4NCisNCisjZGVmaW5lIExaTUE4Nl9TSVpFX09GRlNFVCAoMSArIDUpDQorI2RlZmluZSBMWk1BODZfSEVBREVSX1NJWkUgKExaTUE4Nl9TSVpFX09GRlNFVCArIDgpDQorDQorLyoNCitJdCdzIGFuIGV4YW1wbGUgZm9yIExaTUEgKyB4ODYgRmlsdGVyIHVzZS4NCitZb3UgY2FuIHVzZSAubHptYTg2IGV4dGVuc2lvbiwgaWYgeW91IHdyaXRlIHRoYXQgc3RyZWFtIHRvIGZpbGUuDQorLmx6bWE4NiBoZWFkZXIgYWRkcyBvbmUgYWRkaXRpb25hbCBieXRlIHRvIHN0YW5kYXJkIC5sem1hIGhlYWRlci4NCisubHptYTg2IGhlYWRlciAoMTQgYnl0ZXMpOg0KKyAgT2Zmc2V0IFNpemUgIERlc2NyaXB0aW9uDQorICAgIDAgICAgIDEgICAgPSAwIC0gbm8gZmlsdGVyLCBwdXJlIExaTUENCisgICAgICAgICAgICAgICA9IDEgLSB4ODYgZmlsdGVyICsgTFpNQQ0KKyAgICAxICAgICAxICAgIGxjLCBscCBhbmQgcGIgaW4gZW5jb2RlZCBmb3JtDQorICAgIDIgICAgIDQgICAgZGljdFNpemUgKGxpdHRsZSBlbmRpYW4pDQorICAgIDYgICAgIDggICAgdW5jb21wcmVzc2VkIHNpemUgKGxpdHRsZSBlbmRpYW4pDQorDQorDQorTHptYTg2X0VuY29kZQ0KKy0tLS0tLS0tLS0tLS0NCitsZXZlbCAtIGNvbXByZXNzaW9uIGxldmVsOiAwIDw9IGxldmVsIDw9IDksIHRoZSBkZWZhdWx0IHZhbHVlIGZvciAibGV2ZWwiIGlzIDUuDQorDQorZGljdFNpemUgLSBUaGUgZGljdGlvbmFyeSBzaXplIGluIGJ5dGVzLiBUaGUgbWF4aW11bSB2YWx1ZSBpcw0KKyAgICAgICAgMTI4IE1CID0gKDEgPDwgMjcpIGJ5dGVzIGZvciAzMi1iaXQgdmVyc2lvbg0KKyAgICAgICAgICAxIEdCID0gKDEgPDwgMzApIGJ5dGVzIGZvciA2NC1iaXQgdmVyc2lvbg0KKyAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTYgTUIgPSAoMSA8PCAyNCkgYnl0ZXMsIGZvciBsZXZlbCA9IDUuDQorICAgICBJdCdzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgZGljdGlvbmFyeSB0aGF0IGlzIGxhcmdlciB0aGFuIDQgS0IgYW5kDQorICAgICB0aGF0IGNhbiBiZSBjYWxjdWxhdGVkIGFzICgxIDw8IE4pIG9yICgzIDw8IE4pIHNpemVzLg0KKyAgICAgRm9yIGJldHRlciBjb21wcmVzc2lvbiByYXRpbyBkaWN0U2l6ZSBtdXN0IGJlID49IGluU2l6ZS4NCisNCitmaWx0ZXJNb2RlOg0KKyAgICBTWl9GSUxURVJfTk8gICAtIG5vIEZpbHRlcg0KKyAgICBTWl9GSUxURVJfWUVTICAtIHg4NiBGaWx0ZXINCisgICAgU1pfRklMVEVSX0FVVE8gLSBpdCB0cmllcyBib3RoIGFsdGVybmF0aXZlcyB0byBzZWxlY3QgYmVzdC4NCisgICAgICAgICAgICAgIEVuY29kZXIgd2lsbCB1c2UgMiBvciAzIHBhc3NlczoNCisgICAgICAgICAgICAgIDIgcGFzc2VzIHdoZW4gRklMVEVSX05PIHByb3ZpZGVzIGJldHRlciBjb21wcmVzc2lvbi4NCisgICAgICAgICAgICAgIDMgcGFzc2VzIHdoZW4gRklMVEVSX1lFUyBwcm92aWRlcyBiZXR0ZXIgY29tcHJlc3Npb24uDQorDQorTHptYTg2RW5jb2RlIGFsbG9jYXRlcyBEYXRhIHdpdGggTXlBbGxvYyBmdW5jdGlvbnMuDQorUkFNIFJlcXVpcmVtZW50cyBmb3IgY29tcHJlc3Npbmc6DQorICBSYW1TaXplID0gZGljdGlvbmFyeVNpemUgKiAxMS41ICsgNk1CICsgRmlsdGVyQmxvY2tTaXplDQorICAgICAgZmlsdGVyTW9kZSAgICAgRmlsdGVyQmxvY2tTaXplDQorICAgICBTWl9GSUxURVJfTk8gICAgICAgICAwDQorICAgICBTWl9GSUxURVJfWUVTICAgICAgaW5TaXplDQorICAgICBTWl9GSUxURVJfQVVUTyAgICAgaW5TaXplDQorDQorDQorUmV0dXJuIGNvZGU6DQorICBTWl9PSyAgICAgICAgICAgICAgIC0gT0sNCisgIFNaX0VSUk9SX01FTSAgICAgICAgLSBNZW1vcnkgYWxsb2NhdGlvbiBlcnJvcg0KKyAgU1pfRVJST1JfUEFSQU0gICAgICAtIEluY29ycmVjdCBwYXJhbWF0ZXINCisgIFNaX0VSUk9SX09VVFBVVF9FT0YgLSBvdXRwdXQgYnVmZmVyIG92ZXJmbG93DQorICBTWl9FUlJPUl9USFJFQUQgICAgIC0gZXJyb3JzIGluIG11bHRpdGhyZWFkaW5nIGZ1bmN0aW9ucyAob25seSBmb3IgTXQgdmVyc2lvbikNCisqLw0KKw0KK2VudW0gRVN6RmlsdGVyTW9kZQ0KK3sNCisgIFNaX0ZJTFRFUl9OTywNCisgIFNaX0ZJTFRFUl9ZRVMsDQorICBTWl9GSUxURVJfQVVUTw0KK307DQorDQorU1JlcyBMem1hODZfRW5jb2RlKEJ5dGUgKmRlc3QsIHNpemVfdCAqZGVzdExlbiwgY29uc3QgQnl0ZSAqc3JjLCBzaXplX3Qgc3JjTGVuLA0KKyAgICBpbnQgbGV2ZWwsIFVJbnQzMiBkaWN0U2l6ZSwgaW50IGZpbHRlck1vZGUpOw0KKw0KKw0KKy8qDQorTHptYTg2X0dldFVucGFja1NpemU6DQorICBJbjoNCisgICAgc3JjICAgICAgLSBpbnB1dCBkYXRhDQorICAgIHNyY0xlbiAgIC0gaW5wdXQgZGF0YSBzaXplDQorICBPdXQ6DQorICAgIHVucGFja1NpemUgLSBzaXplIG9mIHVuY29tcHJlc3NlZCBzdHJlYW0NCisgIFJldHVybiBjb2RlOg0KKyAgICBTWl9PSyAgICAgICAgICAgICAgIC0gT0sNCisgICAgU1pfRVJST1JfSU5QVVRfRU9GICAtIEVycm9yIGluIGhlYWRlcnMNCisqLw0KKw0KK1NSZXMgTHptYTg2X0dldFVucGFja1NpemUoY29uc3QgQnl0ZSAqc3JjLCBTaXplVCBzcmNMZW4sIFVJbnQ2NCAqdW5wYWNrU2l6ZSk7DQorDQorLyoNCitMem1hODZfRGVjb2RlOg0KKyAgSW46DQorICAgIGRlc3QgICAgIC0gb3V0cHV0IGRhdGENCisgICAgZGVzdExlbiAgLSBvdXRwdXQgZGF0YSBzaXplDQorICAgIHNyYyAgICAgIC0gaW5wdXQgZGF0YQ0KKyAgICBzcmNMZW4gICAtIGlucHV0IGRhdGEgc2l6ZQ0KKyAgT3V0Og0KKyAgICBkZXN0TGVuICAtIHByb2Nlc3NlZCBvdXRwdXQgc2l6ZQ0KKyAgICBzcmNMZW4gICAtIHByb2Nlc3NlZCBpbnB1dCBzaXplDQorICBSZXR1cm4gY29kZToNCisgICAgU1pfT0sgICAgICAgICAgIC0gT0sNCisgICAgU1pfRVJST1JfREFUQSAgLSBEYXRhIGVycm9yDQorICAgIFNaX0VSUk9SX01FTSAgIC0gTWVtb3J5IGFsbG9jYXRpb24gZXJyb3INCisgICAgU1pfRVJST1JfVU5TVVBQT1JURUQgLSB1bnN1cHBvcnRlZCBmaWxlDQorICAgIFNaX0VSUk9SX0lOUFVUX0VPRiAtIGl0IG5lZWRzIG1vcmUgYnl0ZXMgaW4gaW5wdXQgYnVmZmVyDQorKi8NCisNCitTUmVzIEx6bWE4Nl9EZWNvZGUoQnl0ZSAqZGVzdCwgU2l6ZVQgKmRlc3RMZW4sIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbik7DQorDQorRVhURVJOX0NfRU5EDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DL0x6bWE4NkRlYy5jIGIvbHptYS9DL0x6bWE4NkRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MGE0NDcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvTHptYTg2RGVjLmMKQEAgLTAsMCArMSw1NiBAQAorLyogTHptYTg2RGVjLmMgLS0gTFpNQSArIHg4NiAoQkNKKSBGaWx0ZXIgRGVjb2Rlcg0KKzIwMDktMDgtMTQgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiTHptYTg2LmgiDQorDQorI2luY2x1ZGUgIkFsbG9jLmgiDQorI2luY2x1ZGUgIkJyYS5oIg0KKyNpbmNsdWRlICJMem1hRGVjLmgiDQorDQorc3RhdGljIHZvaWQgKlN6QWxsb2Modm9pZCAqcCwgc2l6ZV90IHNpemUpIHsgcCA9IHA7IHJldHVybiBNeUFsbG9jKHNpemUpOyB9DQorc3RhdGljIHZvaWQgU3pGcmVlKHZvaWQgKnAsIHZvaWQgKmFkZHJlc3MpIHsgcCA9IHA7IE15RnJlZShhZGRyZXNzKTsgfQ0KKw0KK1NSZXMgTHptYTg2X0dldFVucGFja1NpemUoY29uc3QgQnl0ZSAqc3JjLCBTaXplVCBzcmNMZW4sIFVJbnQ2NCAqdW5wYWNrU2l6ZSkNCit7DQorICB1bnNpZ25lZCBpOw0KKyAgaWYgKHNyY0xlbiA8IExaTUE4Nl9IRUFERVJfU0laRSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX0lOUFVUX0VPRjsNCisgICp1bnBhY2tTaXplID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoVUludDY0KTsgaSsrKQ0KKyAgICAqdW5wYWNrU2l6ZSArPSAoKFVJbnQ2NClzcmNbTFpNQTg2X1NJWkVfT0ZGU0VUICsgaV0pIDw8ICg4ICogaSk7DQorICByZXR1cm4gU1pfT0s7DQorfQ0KKw0KK1NSZXMgTHptYTg2X0RlY29kZShCeXRlICpkZXN0LCBTaXplVCAqZGVzdExlbiwgY29uc3QgQnl0ZSAqc3JjLCBTaXplVCAqc3JjTGVuKQ0KK3sNCisgIElTekFsbG9jIGdfQWxsb2MgPSB7IFN6QWxsb2MsIFN6RnJlZSB9Ow0KKyAgU1JlcyByZXM7DQorICBpbnQgdXNlRmlsdGVyOw0KKyAgU2l6ZVQgaW5TaXplUHVyZTsNCisgIEVMem1hU3RhdHVzIHN0YXR1czsNCisNCisgIGlmICgqc3JjTGVuIDwgTFpNQTg2X0hFQURFUl9TSVpFKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfSU5QVVRfRU9GOw0KKw0KKyAgdXNlRmlsdGVyID0gc3JjWzBdOw0KKw0KKyAgaWYgKHVzZUZpbHRlciA+IDEpDQorICB7DQorICAgICpkZXN0TGVuID0gMDsNCisgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKyAgfQ0KKw0KKyAgaW5TaXplUHVyZSA9ICpzcmNMZW4gLSBMWk1BODZfSEVBREVSX1NJWkU7DQorICByZXMgPSBMem1hRGVjb2RlKGRlc3QsIGRlc3RMZW4sIHNyYyArIExaTUE4Nl9IRUFERVJfU0laRSwgJmluU2l6ZVB1cmUsDQorICAgICAgc3JjICsgMSwgTFpNQV9QUk9QU19TSVpFLCBMWk1BX0ZJTklTSF9BTlksICZzdGF0dXMsICZnX0FsbG9jKTsNCisgICpzcmNMZW4gPSBpblNpemVQdXJlICsgTFpNQTg2X0hFQURFUl9TSVpFOw0KKyAgaWYgKHJlcyAhPSBTWl9PSykNCisgICAgcmV0dXJuIHJlczsNCisgIGlmICh1c2VGaWx0ZXIgPT0gMSkNCisgIHsNCisgICAgVUludDMyIHg4NlN0YXRlOw0KKyAgICB4ODZfQ29udmVydF9Jbml0KHg4NlN0YXRlKTsNCisgICAgeDg2X0NvbnZlcnQoZGVzdCwgKmRlc3RMZW4sIDAsICZ4ODZTdGF0ZSwgMCk7DQorICB9DQorICByZXR1cm4gU1pfT0s7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9Mem1hODZFbmMuYyBiL2x6bWEvQy9Mem1hODZFbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWI0ODhjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL0x6bWE4NkVuYy5jCkBAIC0wLDAgKzEsMTA4IEBACisvKiBMem1hODZFbmMuYyAtLSBMWk1BICsgeDg2IChCQ0opIEZpbHRlciBFbmNvZGVyDQorMjAwOS0wOC0xNCA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisNCisjaW5jbHVkZSAiTHptYTg2LmgiDQorDQorI2luY2x1ZGUgIkFsbG9jLmgiDQorI2luY2x1ZGUgIkJyYS5oIg0KKyNpbmNsdWRlICJMem1hRW5jLmgiDQorDQorI2RlZmluZSBTWkVfT1VUX09WRVJGTE9XIFNaRV9EQVRBX0VSUk9SDQorDQorc3RhdGljIHZvaWQgKlN6QWxsb2Modm9pZCAqcCwgc2l6ZV90IHNpemUpIHsgcCA9IHA7IHJldHVybiBNeUFsbG9jKHNpemUpOyB9DQorc3RhdGljIHZvaWQgU3pGcmVlKHZvaWQgKnAsIHZvaWQgKmFkZHJlc3MpIHsgcCA9IHA7IE15RnJlZShhZGRyZXNzKTsgfQ0KKw0KK2ludCBMem1hODZfRW5jb2RlKEJ5dGUgKmRlc3QsIHNpemVfdCAqZGVzdExlbiwgY29uc3QgQnl0ZSAqc3JjLCBzaXplX3Qgc3JjTGVuLA0KKyAgICBpbnQgbGV2ZWwsIFVJbnQzMiBkaWN0U2l6ZSwgaW50IGZpbHRlck1vZGUpDQorew0KKyAgSVN6QWxsb2MgZ19BbGxvYyA9IHsgU3pBbGxvYywgU3pGcmVlIH07DQorICBzaXplX3Qgb3V0U2l6ZTIgPSAqZGVzdExlbjsNCisgIEJ5dGUgKmZpbHRlcmVkU3RyZWFtOw0KKyAgQm9vbCB1c2VGaWx0ZXI7DQorICBpbnQgbWFpblJlc3VsdCA9IFNaX0VSUk9SX09VVFBVVF9FT0Y7DQorICBDTHptYUVuY1Byb3BzIHByb3BzOw0KKyAgTHptYUVuY1Byb3BzX0luaXQoJnByb3BzKTsNCisgIHByb3BzLmxldmVsID0gbGV2ZWw7DQorICBwcm9wcy5kaWN0U2l6ZSA9IGRpY3RTaXplOw0KKyAgDQorICAqZGVzdExlbiA9IDA7DQorICBpZiAob3V0U2l6ZTIgPCBMWk1BODZfSEVBREVSX1NJWkUpDQorICAgIHJldHVybiBTWl9FUlJPUl9PVVRQVVRfRU9GOw0KKw0KKyAgew0KKyAgICBpbnQgaTsNCisgICAgVUludDY0IHQgPSBzcmNMZW47DQorICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyssIHQgPj49IDgpDQorICAgICAgZGVzdFtMWk1BODZfU0laRV9PRkZTRVQgKyBpXSA9IChCeXRlKXQ7DQorICB9DQorDQorICBmaWx0ZXJlZFN0cmVhbSA9IDA7DQorICB1c2VGaWx0ZXIgPSAoZmlsdGVyTW9kZSAhPSBTWl9GSUxURVJfTk8pOw0KKyAgaWYgKHVzZUZpbHRlcikNCisgIHsNCisgICAgaWYgKHNyY0xlbiAhPSAwKQ0KKyAgICB7DQorICAgICAgZmlsdGVyZWRTdHJlYW0gPSAoQnl0ZSAqKU15QWxsb2Moc3JjTGVuKTsNCisgICAgICBpZiAoZmlsdGVyZWRTdHJlYW0gPT0gMCkNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorICAgICAgbWVtY3B5KGZpbHRlcmVkU3RyZWFtLCBzcmMsIHNyY0xlbik7DQorICAgIH0NCisgICAgew0KKyAgICAgIFVJbnQzMiB4ODZTdGF0ZTsNCisgICAgICB4ODZfQ29udmVydF9Jbml0KHg4NlN0YXRlKTsNCisgICAgICB4ODZfQ29udmVydChmaWx0ZXJlZFN0cmVhbSwgc3JjTGVuLCAwLCAmeDg2U3RhdGUsIDEpOw0KKyAgICB9DQorICB9DQorDQorICB7DQorICAgIHNpemVfdCBtaW5TaXplID0gMDsNCisgICAgQm9vbCBiZXN0SXNGaWx0ZXJlZCA9IEZhbHNlOw0KKw0KKyAgICAvKiBwYXNzZXMgZm9yIFNaX0ZJTFRFUl9BVVRPOg0KKyAgICAgICAgMCAtIEJDSiArIExaTUENCisgICAgICAgIDEgLSBMWk1BDQorICAgICAgICAyIC0gQkNKICsgTFpNQSBhZ2FpYW4sIGlmIHBhc3MgMCAoQkNKICsgTFpNQSkgaXMgYmV0dGVyLg0KKyAgICAqLw0KKyAgICBpbnQgbnVtUGFzc2VzID0gKGZpbHRlck1vZGUgPT0gU1pfRklMVEVSX0FVVE8pID8gMyA6IDE7DQorDQorICAgIGludCBpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGFzc2VzOyBpKyspDQorICAgIHsNCisgICAgICBzaXplX3Qgb3V0U2l6ZVByb2Nlc3NlZCA9IG91dFNpemUyIC0gTFpNQTg2X0hFQURFUl9TSVpFOw0KKyAgICAgIHNpemVfdCBvdXRQcm9wc1NpemUgPSA1Ow0KKyAgICAgIFNSZXMgY3VyUmVzOw0KKyAgICAgIEJvb2wgY3VyTW9kZUlzRmlsdGVyZWQgPSAobnVtUGFzc2VzID4gMSAmJiBpID09IG51bVBhc3NlcyAtIDEpOw0KKyAgICAgIGlmIChjdXJNb2RlSXNGaWx0ZXJlZCAmJiAhYmVzdElzRmlsdGVyZWQpDQorICAgICAgICBicmVhazsNCisgICAgICBpZiAodXNlRmlsdGVyICYmIGkgPT0gMCkNCisgICAgICAgIGN1ck1vZGVJc0ZpbHRlcmVkID0gVHJ1ZTsNCisgICAgICANCisgICAgICBjdXJSZXMgPSBMem1hRW5jb2RlKGRlc3QgKyBMWk1BODZfSEVBREVSX1NJWkUsICZvdXRTaXplUHJvY2Vzc2VkLA0KKyAgICAgICAgICBjdXJNb2RlSXNGaWx0ZXJlZCA/IGZpbHRlcmVkU3RyZWFtIDogc3JjLCBzcmNMZW4sDQorICAgICAgICAgICZwcm9wcywgZGVzdCArIDEsICZvdXRQcm9wc1NpemUsIDAsDQorICAgICAgICAgIE5VTEwsICZnX0FsbG9jLCAmZ19BbGxvYyk7DQorICAgICAgDQorICAgICAgaWYgKGN1clJlcyAhPSBTWl9FUlJPUl9PVVRQVVRfRU9GKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChjdXJSZXMgIT0gU1pfT0spDQorICAgICAgICB7DQorICAgICAgICAgIG1haW5SZXN1bHQgPSBjdXJSZXM7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG91dFNpemVQcm9jZXNzZWQgPD0gbWluU2l6ZSB8fCBtYWluUmVzdWx0ICE9IFNaX09LKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBtaW5TaXplID0gb3V0U2l6ZVByb2Nlc3NlZDsNCisgICAgICAgICAgYmVzdElzRmlsdGVyZWQgPSBjdXJNb2RlSXNGaWx0ZXJlZDsNCisgICAgICAgICAgbWFpblJlc3VsdCA9IFNaX09LOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBkZXN0WzBdID0gKEJ5dGUpKGJlc3RJc0ZpbHRlcmVkID8gMSA6IDApOw0KKyAgICAqZGVzdExlbiA9IExaTUE4Nl9IRUFERVJfU0laRSArIG1pblNpemU7DQorICB9DQorICBpZiAodXNlRmlsdGVyKQ0KKyAgICBNeUZyZWUoZmlsdGVyZWRTdHJlYW0pOw0KKyAgcmV0dXJuIG1haW5SZXN1bHQ7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9Mem1hRGVjLmMgYi9sem1hL0MvTHptYURlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Y2Q5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvTHptYURlYy5jCkBAIC0wLDAgKzEsMTAyNSBAQAorLyogTHptYURlYy5jIC0tIExaTUEgRGVjb2Rlcg0KKzIwMTUtMDEtMDEgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiUHJlY29tcC5oIg0KKw0KKyNpbmNsdWRlICJMem1hRGVjLmgiDQorDQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKw0KKyNkZWZpbmUga051bVRvcEJpdHMgMjQNCisjZGVmaW5lIGtUb3BWYWx1ZSAoKFVJbnQzMikxIDw8IGtOdW1Ub3BCaXRzKQ0KKw0KKyNkZWZpbmUga051bUJpdE1vZGVsVG90YWxCaXRzIDExDQorI2RlZmluZSBrQml0TW9kZWxUb3RhbCAoMSA8PCBrTnVtQml0TW9kZWxUb3RhbEJpdHMpDQorI2RlZmluZSBrTnVtTW92ZUJpdHMgNQ0KKw0KKyNkZWZpbmUgUkNfSU5JVF9TSVpFIDUNCisNCisjZGVmaW5lIE5PUk1BTElaRSBpZiAocmFuZ2UgPCBrVG9wVmFsdWUpIHsgcmFuZ2UgPDw9IDg7IGNvZGUgPSAoY29kZSA8PCA4KSB8ICgqYnVmKyspOyB9DQorDQorI2RlZmluZSBJRl9CSVRfMChwKSB0dHQgPSAqKHApOyBOT1JNQUxJWkU7IGJvdW5kID0gKHJhbmdlID4+IGtOdW1CaXRNb2RlbFRvdGFsQml0cykgKiB0dHQ7IGlmIChjb2RlIDwgYm91bmQpDQorI2RlZmluZSBVUERBVEVfMChwKSByYW5nZSA9IGJvdW5kOyAqKHApID0gKENMem1hUHJvYikodHR0ICsgKChrQml0TW9kZWxUb3RhbCAtIHR0dCkgPj4ga051bU1vdmVCaXRzKSk7DQorI2RlZmluZSBVUERBVEVfMShwKSByYW5nZSAtPSBib3VuZDsgY29kZSAtPSBib3VuZDsgKihwKSA9IChDTHptYVByb2IpKHR0dCAtICh0dHQgPj4ga051bU1vdmVCaXRzKSk7DQorI2RlZmluZSBHRVRfQklUMihwLCBpLCBBMCwgQTEpIElGX0JJVF8wKHApIFwNCisgIHsgVVBEQVRFXzAocCk7IGkgPSAoaSArIGkpOyBBMDsgfSBlbHNlIFwNCisgIHsgVVBEQVRFXzEocCk7IGkgPSAoaSArIGkpICsgMTsgQTE7IH0NCisjZGVmaW5lIEdFVF9CSVQocCwgaSkgR0VUX0JJVDIocCwgaSwgOyAsIDspDQorDQorI2RlZmluZSBUUkVFX0dFVF9CSVQocHJvYnMsIGkpIHsgR0VUX0JJVCgocHJvYnMgKyBpKSwgaSk7IH0NCisjZGVmaW5lIFRSRUVfREVDT0RFKHByb2JzLCBsaW1pdCwgaSkgXA0KKyAgeyBpID0gMTsgZG8geyBUUkVFX0dFVF9CSVQocHJvYnMsIGkpOyB9IHdoaWxlIChpIDwgbGltaXQpOyBpIC09IGxpbWl0OyB9DQorDQorLyogI2RlZmluZSBfTFpNQV9TSVpFX09QVCAqLw0KKw0KKyNpZmRlZiBfTFpNQV9TSVpFX09QVA0KKyNkZWZpbmUgVFJFRV82X0RFQ09ERShwcm9icywgaSkgVFJFRV9ERUNPREUocHJvYnMsICgxIDw8IDYpLCBpKQ0KKyNlbHNlDQorI2RlZmluZSBUUkVFXzZfREVDT0RFKHByb2JzLCBpKSBcDQorICB7IGkgPSAxOyBcDQorICBUUkVFX0dFVF9CSVQocHJvYnMsIGkpOyBcDQorICBUUkVFX0dFVF9CSVQocHJvYnMsIGkpOyBcDQorICBUUkVFX0dFVF9CSVQocHJvYnMsIGkpOyBcDQorICBUUkVFX0dFVF9CSVQocHJvYnMsIGkpOyBcDQorICBUUkVFX0dFVF9CSVQocHJvYnMsIGkpOyBcDQorICBUUkVFX0dFVF9CSVQocHJvYnMsIGkpOyBcDQorICBpIC09IDB4NDA7IH0NCisjZW5kaWYNCisNCisjZGVmaW5lIE5PUk1BTF9MSVRFUl9ERUMgR0VUX0JJVChwcm9iICsgc3ltYm9sLCBzeW1ib2wpDQorI2RlZmluZSBNQVRDSEVEX0xJVEVSX0RFQyBcDQorICBtYXRjaEJ5dGUgPDw9IDE7IFwNCisgIGJpdCA9IChtYXRjaEJ5dGUgJiBvZmZzKTsgXA0KKyAgcHJvYkxpdCA9IHByb2IgKyBvZmZzICsgYml0ICsgc3ltYm9sOyBcDQorICBHRVRfQklUMihwcm9iTGl0LCBzeW1ib2wsIG9mZnMgJj0gfmJpdCwgb2ZmcyAmPSBiaXQpDQorDQorI2RlZmluZSBOT1JNQUxJWkVfQ0hFQ0sgaWYgKHJhbmdlIDwga1RvcFZhbHVlKSB7IGlmIChidWYgPj0gYnVmTGltaXQpIHJldHVybiBEVU1NWV9FUlJPUjsgcmFuZ2UgPDw9IDg7IGNvZGUgPSAoY29kZSA8PCA4KSB8ICgqYnVmKyspOyB9DQorDQorI2RlZmluZSBJRl9CSVRfMF9DSEVDSyhwKSB0dHQgPSAqKHApOyBOT1JNQUxJWkVfQ0hFQ0s7IGJvdW5kID0gKHJhbmdlID4+IGtOdW1CaXRNb2RlbFRvdGFsQml0cykgKiB0dHQ7IGlmIChjb2RlIDwgYm91bmQpDQorI2RlZmluZSBVUERBVEVfMF9DSEVDSyByYW5nZSA9IGJvdW5kOw0KKyNkZWZpbmUgVVBEQVRFXzFfQ0hFQ0sgcmFuZ2UgLT0gYm91bmQ7IGNvZGUgLT0gYm91bmQ7DQorI2RlZmluZSBHRVRfQklUMl9DSEVDSyhwLCBpLCBBMCwgQTEpIElGX0JJVF8wX0NIRUNLKHApIFwNCisgIHsgVVBEQVRFXzBfQ0hFQ0s7IGkgPSAoaSArIGkpOyBBMDsgfSBlbHNlIFwNCisgIHsgVVBEQVRFXzFfQ0hFQ0s7IGkgPSAoaSArIGkpICsgMTsgQTE7IH0NCisjZGVmaW5lIEdFVF9CSVRfQ0hFQ0socCwgaSkgR0VUX0JJVDJfQ0hFQ0socCwgaSwgOyAsIDspDQorI2RlZmluZSBUUkVFX0RFQ09ERV9DSEVDSyhwcm9icywgbGltaXQsIGkpIFwNCisgIHsgaSA9IDE7IGRvIHsgR0VUX0JJVF9DSEVDSyhwcm9icyArIGksIGkpIH0gd2hpbGUgKGkgPCBsaW1pdCk7IGkgLT0gbGltaXQ7IH0NCisNCisNCisjZGVmaW5lIGtOdW1Qb3NCaXRzTWF4IDQNCisjZGVmaW5lIGtOdW1Qb3NTdGF0ZXNNYXggKDEgPDwga051bVBvc0JpdHNNYXgpDQorDQorI2RlZmluZSBrTGVuTnVtTG93Qml0cyAzDQorI2RlZmluZSBrTGVuTnVtTG93U3ltYm9scyAoMSA8PCBrTGVuTnVtTG93Qml0cykNCisjZGVmaW5lIGtMZW5OdW1NaWRCaXRzIDMNCisjZGVmaW5lIGtMZW5OdW1NaWRTeW1ib2xzICgxIDw8IGtMZW5OdW1NaWRCaXRzKQ0KKyNkZWZpbmUga0xlbk51bUhpZ2hCaXRzIDgNCisjZGVmaW5lIGtMZW5OdW1IaWdoU3ltYm9scyAoMSA8PCBrTGVuTnVtSGlnaEJpdHMpDQorDQorI2RlZmluZSBMZW5DaG9pY2UgMA0KKyNkZWZpbmUgTGVuQ2hvaWNlMiAoTGVuQ2hvaWNlICsgMSkNCisjZGVmaW5lIExlbkxvdyAoTGVuQ2hvaWNlMiArIDEpDQorI2RlZmluZSBMZW5NaWQgKExlbkxvdyArIChrTnVtUG9zU3RhdGVzTWF4IDw8IGtMZW5OdW1Mb3dCaXRzKSkNCisjZGVmaW5lIExlbkhpZ2ggKExlbk1pZCArIChrTnVtUG9zU3RhdGVzTWF4IDw8IGtMZW5OdW1NaWRCaXRzKSkNCisjZGVmaW5lIGtOdW1MZW5Qcm9icyAoTGVuSGlnaCArIGtMZW5OdW1IaWdoU3ltYm9scykNCisNCisNCisjZGVmaW5lIGtOdW1TdGF0ZXMgMTINCisjZGVmaW5lIGtOdW1MaXRTdGF0ZXMgNw0KKw0KKyNkZWZpbmUga1N0YXJ0UG9zTW9kZWxJbmRleCA0DQorI2RlZmluZSBrRW5kUG9zTW9kZWxJbmRleCAxNA0KKyNkZWZpbmUga051bUZ1bGxEaXN0YW5jZXMgKDEgPDwgKGtFbmRQb3NNb2RlbEluZGV4ID4+IDEpKQ0KKw0KKyNkZWZpbmUga051bVBvc1Nsb3RCaXRzIDYNCisjZGVmaW5lIGtOdW1MZW5Ub1Bvc1N0YXRlcyA0DQorDQorI2RlZmluZSBrTnVtQWxpZ25CaXRzIDQNCisjZGVmaW5lIGtBbGlnblRhYmxlU2l6ZSAoMSA8PCBrTnVtQWxpZ25CaXRzKQ0KKw0KKyNkZWZpbmUga01hdGNoTWluTGVuIDINCisjZGVmaW5lIGtNYXRjaFNwZWNMZW5TdGFydCAoa01hdGNoTWluTGVuICsga0xlbk51bUxvd1N5bWJvbHMgKyBrTGVuTnVtTWlkU3ltYm9scyArIGtMZW5OdW1IaWdoU3ltYm9scykNCisNCisjZGVmaW5lIElzTWF0Y2ggMA0KKyNkZWZpbmUgSXNSZXAgKElzTWF0Y2ggKyAoa051bVN0YXRlcyA8PCBrTnVtUG9zQml0c01heCkpDQorI2RlZmluZSBJc1JlcEcwIChJc1JlcCArIGtOdW1TdGF0ZXMpDQorI2RlZmluZSBJc1JlcEcxIChJc1JlcEcwICsga051bVN0YXRlcykNCisjZGVmaW5lIElzUmVwRzIgKElzUmVwRzEgKyBrTnVtU3RhdGVzKQ0KKyNkZWZpbmUgSXNSZXAwTG9uZyAoSXNSZXBHMiArIGtOdW1TdGF0ZXMpDQorI2RlZmluZSBQb3NTbG90IChJc1JlcDBMb25nICsgKGtOdW1TdGF0ZXMgPDwga051bVBvc0JpdHNNYXgpKQ0KKyNkZWZpbmUgU3BlY1BvcyAoUG9zU2xvdCArIChrTnVtTGVuVG9Qb3NTdGF0ZXMgPDwga051bVBvc1Nsb3RCaXRzKSkNCisjZGVmaW5lIEFsaWduIChTcGVjUG9zICsga051bUZ1bGxEaXN0YW5jZXMgLSBrRW5kUG9zTW9kZWxJbmRleCkNCisjZGVmaW5lIExlbkNvZGVyIChBbGlnbiArIGtBbGlnblRhYmxlU2l6ZSkNCisjZGVmaW5lIFJlcExlbkNvZGVyIChMZW5Db2RlciArIGtOdW1MZW5Qcm9icykNCisjZGVmaW5lIExpdGVyYWwgKFJlcExlbkNvZGVyICsga051bUxlblByb2JzKQ0KKw0KKyNkZWZpbmUgTFpNQV9CQVNFX1NJWkUgMTg0Ng0KKyNkZWZpbmUgTFpNQV9MSVRfU0laRSA3NjgNCisNCisjZGVmaW5lIEx6bWFQcm9wc19HZXROdW1Qcm9icyhwKSAoKFVJbnQzMilMWk1BX0JBU0VfU0laRSArIChMWk1BX0xJVF9TSVpFIDw8ICgocCktPmxjICsgKHApLT5scCkpKQ0KKw0KKyNpZiBMaXRlcmFsICE9IExaTUFfQkFTRV9TSVpFDQorU3RvcENvbXBpbGluZ0R1ZUJVRw0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgTFpNQV9ESUNfTUlOICgxIDw8IDEyKQ0KKw0KKy8qIEZpcnN0IExaTUEtc3ltYm9sIGlzIGFsd2F5cyBkZWNvZGVkLg0KK0FuZCBpdCBkZWNvZGVzIG5ldyBMWk1BLXN5bWJvbHMgd2hpbGUgKGJ1ZiA8IGJ1ZkxpbWl0KSwgYnV0ICJidWYiIGlzIHdpdGhvdXQgbGFzdCBub3JtYWxpemF0aW9uDQorT3V0Og0KKyAgUmVzdWx0Og0KKyAgICBTWl9PSyAtIE9LDQorICAgIFNaX0VSUk9SX0RBVEEgLSBFcnJvcg0KKyAgcC0+cmVtYWluTGVuOg0KKyAgICA8IGtNYXRjaFNwZWNMZW5TdGFydCA6IG5vcm1hbCByZW1haW4NCisgICAgPSBrTWF0Y2hTcGVjTGVuU3RhcnQgOiBmaW5pc2hlZA0KKyAgICA9IGtNYXRjaFNwZWNMZW5TdGFydCArIDEgOiBGbHVzaCBtYXJrZXINCisgICAgPSBrTWF0Y2hTcGVjTGVuU3RhcnQgKyAyIDogU3RhdGUgSW5pdCBNYXJrZXINCisqLw0KKw0KK3N0YXRpYyBpbnQgTVlfRkFTVF9DQUxMIEx6bWFEZWNfRGVjb2RlUmVhbChDTHptYURlYyAqcCwgU2l6ZVQgbGltaXQsIGNvbnN0IEJ5dGUgKmJ1ZkxpbWl0KQ0KK3sNCisgIENMem1hUHJvYiAqcHJvYnMgPSBwLT5wcm9iczsNCisNCisgIHVuc2lnbmVkIHN0YXRlID0gcC0+c3RhdGU7DQorICBVSW50MzIgcmVwMCA9IHAtPnJlcHNbMF0sIHJlcDEgPSBwLT5yZXBzWzFdLCByZXAyID0gcC0+cmVwc1syXSwgcmVwMyA9IHAtPnJlcHNbM107DQorICB1bnNpZ25lZCBwYk1hc2sgPSAoKHVuc2lnbmVkKTEgPDwgKHAtPnByb3AucGIpKSAtIDE7DQorICB1bnNpZ25lZCBscE1hc2sgPSAoKHVuc2lnbmVkKTEgPDwgKHAtPnByb3AubHApKSAtIDE7DQorICB1bnNpZ25lZCBsYyA9IHAtPnByb3AubGM7DQorDQorICBCeXRlICpkaWMgPSBwLT5kaWM7DQorICBTaXplVCBkaWNCdWZTaXplID0gcC0+ZGljQnVmU2l6ZTsNCisgIFNpemVUIGRpY1BvcyA9IHAtPmRpY1BvczsNCisgIA0KKyAgVUludDMyIHByb2Nlc3NlZFBvcyA9IHAtPnByb2Nlc3NlZFBvczsNCisgIFVJbnQzMiBjaGVja0RpY1NpemUgPSBwLT5jaGVja0RpY1NpemU7DQorICB1bnNpZ25lZCBsZW4gPSAwOw0KKw0KKyAgY29uc3QgQnl0ZSAqYnVmID0gcC0+YnVmOw0KKyAgVUludDMyIHJhbmdlID0gcC0+cmFuZ2U7DQorICBVSW50MzIgY29kZSA9IHAtPmNvZGU7DQorDQorICBkbw0KKyAgew0KKyAgICBDTHptYVByb2IgKnByb2I7DQorICAgIFVJbnQzMiBib3VuZDsNCisgICAgdW5zaWduZWQgdHR0Ow0KKyAgICB1bnNpZ25lZCBwb3NTdGF0ZSA9IHByb2Nlc3NlZFBvcyAmIHBiTWFzazsNCisNCisgICAgcHJvYiA9IHByb2JzICsgSXNNYXRjaCArIChzdGF0ZSA8PCBrTnVtUG9zQml0c01heCkgKyBwb3NTdGF0ZTsNCisgICAgSUZfQklUXzAocHJvYikNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIHN5bWJvbDsNCisgICAgICBVUERBVEVfMChwcm9iKTsNCisgICAgICBwcm9iID0gcHJvYnMgKyBMaXRlcmFsOw0KKyAgICAgIGlmIChjaGVja0RpY1NpemUgIT0gMCB8fCBwcm9jZXNzZWRQb3MgIT0gMCkNCisgICAgICAgIHByb2IgKz0gKExaTUFfTElUX1NJWkUgKiAoKChwcm9jZXNzZWRQb3MgJiBscE1hc2spIDw8IGxjKSArDQorICAgICAgICAoZGljWyhkaWNQb3MgPT0gMCA/IGRpY0J1ZlNpemUgOiBkaWNQb3MpIC0gMV0gPj4gKDggLSBsYykpKSk7DQorDQorICAgICAgaWYgKHN0YXRlIDwga051bUxpdFN0YXRlcykNCisgICAgICB7DQorICAgICAgICBzdGF0ZSAtPSAoc3RhdGUgPCA0KSA/IHN0YXRlIDogMzsNCisgICAgICAgIHN5bWJvbCA9IDE7DQorICAgICAgICAjaWZkZWYgX0xaTUFfU0laRV9PUFQNCisgICAgICAgIGRvIHsgTk9STUFMX0xJVEVSX0RFQyB9IHdoaWxlIChzeW1ib2wgPCAweDEwMCk7DQorICAgICAgICAjZWxzZQ0KKyAgICAgICAgTk9STUFMX0xJVEVSX0RFQw0KKyAgICAgICAgTk9STUFMX0xJVEVSX0RFQw0KKyAgICAgICAgTk9STUFMX0xJVEVSX0RFQw0KKyAgICAgICAgTk9STUFMX0xJVEVSX0RFQw0KKyAgICAgICAgTk9STUFMX0xJVEVSX0RFQw0KKyAgICAgICAgTk9STUFMX0xJVEVSX0RFQw0KKyAgICAgICAgTk9STUFMX0xJVEVSX0RFQw0KKyAgICAgICAgTk9STUFMX0xJVEVSX0RFQw0KKyAgICAgICAgI2VuZGlmDQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICB1bnNpZ25lZCBtYXRjaEJ5dGUgPSBkaWNbKGRpY1BvcyAtIHJlcDApICsgKChkaWNQb3MgPCByZXAwKSA/IGRpY0J1ZlNpemUgOiAwKV07DQorICAgICAgICB1bnNpZ25lZCBvZmZzID0gMHgxMDA7DQorICAgICAgICBzdGF0ZSAtPSAoc3RhdGUgPCAxMCkgPyAzIDogNjsNCisgICAgICAgIHN5bWJvbCA9IDE7DQorICAgICAgICAjaWZkZWYgX0xaTUFfU0laRV9PUFQNCisgICAgICAgIGRvDQorICAgICAgICB7DQorICAgICAgICAgIHVuc2lnbmVkIGJpdDsNCisgICAgICAgICAgQ0x6bWFQcm9iICpwcm9iTGl0Ow0KKyAgICAgICAgICBNQVRDSEVEX0xJVEVSX0RFQw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKHN5bWJvbCA8IDB4MTAwKTsNCisgICAgICAgICNlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIHVuc2lnbmVkIGJpdDsNCisgICAgICAgICAgQ0x6bWFQcm9iICpwcm9iTGl0Ow0KKyAgICAgICAgICBNQVRDSEVEX0xJVEVSX0RFQw0KKyAgICAgICAgICBNQVRDSEVEX0xJVEVSX0RFQw0KKyAgICAgICAgICBNQVRDSEVEX0xJVEVSX0RFQw0KKyAgICAgICAgICBNQVRDSEVEX0xJVEVSX0RFQw0KKyAgICAgICAgICBNQVRDSEVEX0xJVEVSX0RFQw0KKyAgICAgICAgICBNQVRDSEVEX0xJVEVSX0RFQw0KKyAgICAgICAgICBNQVRDSEVEX0xJVEVSX0RFQw0KKyAgICAgICAgICBNQVRDSEVEX0xJVEVSX0RFQw0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZGlmDQorICAgICAgfQ0KKyAgICAgIGRpY1tkaWNQb3MrK10gPSAoQnl0ZSlzeW1ib2w7DQorICAgICAgcHJvY2Vzc2VkUG9zKys7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgVVBEQVRFXzEocHJvYik7DQorICAgICAgcHJvYiA9IHByb2JzICsgSXNSZXAgKyBzdGF0ZTsNCisgICAgICBJRl9CSVRfMChwcm9iKQ0KKyAgICAgIHsNCisgICAgICAgIFVQREFURV8wKHByb2IpOw0KKyAgICAgICAgc3RhdGUgKz0ga051bVN0YXRlczsNCisgICAgICAgIHByb2IgPSBwcm9icyArIExlbkNvZGVyOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgVVBEQVRFXzEocHJvYik7DQorICAgICAgICBpZiAoY2hlY2tEaWNTaXplID09IDAgJiYgcHJvY2Vzc2VkUG9zID09IDApDQorICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9EQVRBOw0KKyAgICAgICAgcHJvYiA9IHByb2JzICsgSXNSZXBHMCArIHN0YXRlOw0KKyAgICAgICAgSUZfQklUXzAocHJvYikNCisgICAgICAgIHsNCisgICAgICAgICAgVVBEQVRFXzAocHJvYik7DQorICAgICAgICAgIHByb2IgPSBwcm9icyArIElzUmVwMExvbmcgKyAoc3RhdGUgPDwga051bVBvc0JpdHNNYXgpICsgcG9zU3RhdGU7DQorICAgICAgICAgIElGX0JJVF8wKHByb2IpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBVUERBVEVfMChwcm9iKTsNCisgICAgICAgICAgICBkaWNbZGljUG9zXSA9IGRpY1soZGljUG9zIC0gcmVwMCkgKyAoKGRpY1BvcyA8IHJlcDApID8gZGljQnVmU2l6ZSA6IDApXTsNCisgICAgICAgICAgICBkaWNQb3MrKzsNCisgICAgICAgICAgICBwcm9jZXNzZWRQb3MrKzsNCisgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlIDwga051bUxpdFN0YXRlcyA/IDkgOiAxMTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBVUERBVEVfMShwcm9iKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgVUludDMyIGRpc3RhbmNlOw0KKyAgICAgICAgICBVUERBVEVfMShwcm9iKTsNCisgICAgICAgICAgcHJvYiA9IHByb2JzICsgSXNSZXBHMSArIHN0YXRlOw0KKyAgICAgICAgICBJRl9CSVRfMChwcm9iKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgVVBEQVRFXzAocHJvYik7DQorICAgICAgICAgICAgZGlzdGFuY2UgPSByZXAxOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGVsc2UNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIFVQREFURV8xKHByb2IpOw0KKyAgICAgICAgICAgIHByb2IgPSBwcm9icyArIElzUmVwRzIgKyBzdGF0ZTsNCisgICAgICAgICAgICBJRl9CSVRfMChwcm9iKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIFVQREFURV8wKHByb2IpOw0KKyAgICAgICAgICAgICAgZGlzdGFuY2UgPSByZXAyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgVVBEQVRFXzEocHJvYik7DQorICAgICAgICAgICAgICBkaXN0YW5jZSA9IHJlcDM7DQorICAgICAgICAgICAgICByZXAzID0gcmVwMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmVwMiA9IHJlcDE7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcmVwMSA9IHJlcDA7DQorICAgICAgICAgIHJlcDAgPSBkaXN0YW5jZTsNCisgICAgICAgIH0NCisgICAgICAgIHN0YXRlID0gc3RhdGUgPCBrTnVtTGl0U3RhdGVzID8gOCA6IDExOw0KKyAgICAgICAgcHJvYiA9IHByb2JzICsgUmVwTGVuQ29kZXI7DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIHVuc2lnbmVkIGxpbWl0LCBvZmZzZXQ7DQorICAgICAgICBDTHptYVByb2IgKnByb2JMZW4gPSBwcm9iICsgTGVuQ2hvaWNlOw0KKyAgICAgICAgSUZfQklUXzAocHJvYkxlbikNCisgICAgICAgIHsNCisgICAgICAgICAgVVBEQVRFXzAocHJvYkxlbik7DQorICAgICAgICAgIHByb2JMZW4gPSBwcm9iICsgTGVuTG93ICsgKHBvc1N0YXRlIDw8IGtMZW5OdW1Mb3dCaXRzKTsNCisgICAgICAgICAgb2Zmc2V0ID0gMDsNCisgICAgICAgICAgbGltaXQgPSAoMSA8PCBrTGVuTnVtTG93Qml0cyk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIFVQREFURV8xKHByb2JMZW4pOw0KKyAgICAgICAgICBwcm9iTGVuID0gcHJvYiArIExlbkNob2ljZTI7DQorICAgICAgICAgIElGX0JJVF8wKHByb2JMZW4pDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBVUERBVEVfMChwcm9iTGVuKTsNCisgICAgICAgICAgICBwcm9iTGVuID0gcHJvYiArIExlbk1pZCArIChwb3NTdGF0ZSA8PCBrTGVuTnVtTWlkQml0cyk7DQorICAgICAgICAgICAgb2Zmc2V0ID0ga0xlbk51bUxvd1N5bWJvbHM7DQorICAgICAgICAgICAgbGltaXQgPSAoMSA8PCBrTGVuTnVtTWlkQml0cyk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgVVBEQVRFXzEocHJvYkxlbik7DQorICAgICAgICAgICAgcHJvYkxlbiA9IHByb2IgKyBMZW5IaWdoOw0KKyAgICAgICAgICAgIG9mZnNldCA9IGtMZW5OdW1Mb3dTeW1ib2xzICsga0xlbk51bU1pZFN5bWJvbHM7DQorICAgICAgICAgICAgbGltaXQgPSAoMSA8PCBrTGVuTnVtSGlnaEJpdHMpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBUUkVFX0RFQ09ERShwcm9iTGVuLCBsaW1pdCwgbGVuKTsNCisgICAgICAgIGxlbiArPSBvZmZzZXQ7DQorICAgICAgfQ0KKw0KKyAgICAgIGlmIChzdGF0ZSA+PSBrTnVtU3RhdGVzKQ0KKyAgICAgIHsNCisgICAgICAgIFVJbnQzMiBkaXN0YW5jZTsNCisgICAgICAgIHByb2IgPSBwcm9icyArIFBvc1Nsb3QgKw0KKyAgICAgICAgICAgICgobGVuIDwga051bUxlblRvUG9zU3RhdGVzID8gbGVuIDoga051bUxlblRvUG9zU3RhdGVzIC0gMSkgPDwga051bVBvc1Nsb3RCaXRzKTsNCisgICAgICAgIFRSRUVfNl9ERUNPREUocHJvYiwgZGlzdGFuY2UpOw0KKyAgICAgICAgaWYgKGRpc3RhbmNlID49IGtTdGFydFBvc01vZGVsSW5kZXgpDQorICAgICAgICB7DQorICAgICAgICAgIHVuc2lnbmVkIHBvc1Nsb3QgPSAodW5zaWduZWQpZGlzdGFuY2U7DQorICAgICAgICAgIGludCBudW1EaXJlY3RCaXRzID0gKGludCkoKChkaXN0YW5jZSA+PiAxKSAtIDEpKTsNCisgICAgICAgICAgZGlzdGFuY2UgPSAoMiB8IChkaXN0YW5jZSAmIDEpKTsNCisgICAgICAgICAgaWYgKHBvc1Nsb3QgPCBrRW5kUG9zTW9kZWxJbmRleCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGRpc3RhbmNlIDw8PSBudW1EaXJlY3RCaXRzOw0KKyAgICAgICAgICAgIHByb2IgPSBwcm9icyArIFNwZWNQb3MgKyBkaXN0YW5jZSAtIHBvc1Nsb3QgLSAxOw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIFVJbnQzMiBtYXNrID0gMTsNCisgICAgICAgICAgICAgIHVuc2lnbmVkIGkgPSAxOw0KKyAgICAgICAgICAgICAgZG8NCisgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgR0VUX0JJVDIocHJvYiArIGksIGksIDsgLCBkaXN0YW5jZSB8PSBtYXNrKTsNCisgICAgICAgICAgICAgICAgbWFzayA8PD0gMTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHdoaWxlICgtLW51bURpcmVjdEJpdHMgIT0gMCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIGVsc2UNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIG51bURpcmVjdEJpdHMgLT0ga051bUFsaWduQml0czsNCisgICAgICAgICAgICBkbw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIE5PUk1BTElaRQ0KKyAgICAgICAgICAgICAgcmFuZ2UgPj49IDE7DQorICAgICAgICAgICAgICANCisgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgVUludDMyIHQ7DQorICAgICAgICAgICAgICAgIGNvZGUgLT0gcmFuZ2U7DQorICAgICAgICAgICAgICAgIHQgPSAoMCAtICgoVUludDMyKWNvZGUgPj4gMzEpKTsgLyogKFVJbnQzMikoKEludDMyKWNvZGUgPj4gMzEpICovDQorICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gKGRpc3RhbmNlIDw8IDEpICsgKHQgKyAxKTsNCisgICAgICAgICAgICAgICAgY29kZSArPSByYW5nZSAmIHQ7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAvKg0KKyAgICAgICAgICAgICAgZGlzdGFuY2UgPDw9IDE7DQorICAgICAgICAgICAgICBpZiAoY29kZSA+PSByYW5nZSkNCisgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgY29kZSAtPSByYW5nZTsNCisgICAgICAgICAgICAgICAgZGlzdGFuY2UgfD0gMTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICovDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdoaWxlICgtLW51bURpcmVjdEJpdHMgIT0gMCk7DQorICAgICAgICAgICAgcHJvYiA9IHByb2JzICsgQWxpZ247DQorICAgICAgICAgICAgZGlzdGFuY2UgPDw9IGtOdW1BbGlnbkJpdHM7DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgdW5zaWduZWQgaSA9IDE7DQorICAgICAgICAgICAgICBHRVRfQklUMihwcm9iICsgaSwgaSwgOyAsIGRpc3RhbmNlIHw9IDEpOw0KKyAgICAgICAgICAgICAgR0VUX0JJVDIocHJvYiArIGksIGksIDsgLCBkaXN0YW5jZSB8PSAyKTsNCisgICAgICAgICAgICAgIEdFVF9CSVQyKHByb2IgKyBpLCBpLCA7ICwgZGlzdGFuY2UgfD0gNCk7DQorICAgICAgICAgICAgICBHRVRfQklUMihwcm9iICsgaSwgaSwgOyAsIGRpc3RhbmNlIHw9IDgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPT0gKFVJbnQzMikweEZGRkZGRkZGKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIGxlbiArPSBrTWF0Y2hTcGVjTGVuU3RhcnQ7DQorICAgICAgICAgICAgICBzdGF0ZSAtPSBrTnVtU3RhdGVzOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXAzID0gcmVwMjsNCisgICAgICAgIHJlcDIgPSByZXAxOw0KKyAgICAgICAgcmVwMSA9IHJlcDA7DQorICAgICAgICByZXAwID0gZGlzdGFuY2UgKyAxOw0KKyAgICAgICAgaWYgKGNoZWNrRGljU2l6ZSA9PSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAoZGlzdGFuY2UgPj0gcHJvY2Vzc2VkUG9zKQ0KKyAgICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9EQVRBOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSBpZiAoZGlzdGFuY2UgPj0gY2hlY2tEaWNTaXplKQ0KKyAgICAgICAgICByZXR1cm4gU1pfRVJST1JfREFUQTsNCisgICAgICAgIHN0YXRlID0gKHN0YXRlIDwga051bVN0YXRlcyArIGtOdW1MaXRTdGF0ZXMpID8ga051bUxpdFN0YXRlcyA6IGtOdW1MaXRTdGF0ZXMgKyAzOw0KKyAgICAgIH0NCisNCisgICAgICBsZW4gKz0ga01hdGNoTWluTGVuOw0KKw0KKyAgICAgIGlmIChsaW1pdCA9PSBkaWNQb3MpDQorICAgICAgICByZXR1cm4gU1pfRVJST1JfREFUQTsNCisgICAgICB7DQorICAgICAgICBTaXplVCByZW0gPSBsaW1pdCAtIGRpY1BvczsNCisgICAgICAgIHVuc2lnbmVkIGN1ckxlbiA9ICgocmVtIDwgbGVuKSA/ICh1bnNpZ25lZClyZW0gOiBsZW4pOw0KKyAgICAgICAgU2l6ZVQgcG9zID0gKGRpY1BvcyAtIHJlcDApICsgKChkaWNQb3MgPCByZXAwKSA/IGRpY0J1ZlNpemUgOiAwKTsNCisNCisgICAgICAgIHByb2Nlc3NlZFBvcyArPSBjdXJMZW47DQorDQorICAgICAgICBsZW4gLT0gY3VyTGVuOw0KKyAgICAgICAgaWYgKHBvcyArIGN1ckxlbiA8PSBkaWNCdWZTaXplKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBCeXRlICpkZXN0ID0gZGljICsgZGljUG9zOw0KKyAgICAgICAgICBwdHJkaWZmX3Qgc3JjID0gKHB0cmRpZmZfdClwb3MgLSAocHRyZGlmZl90KWRpY1BvczsNCisgICAgICAgICAgY29uc3QgQnl0ZSAqbGltID0gZGVzdCArIGN1ckxlbjsNCisgICAgICAgICAgZGljUG9zICs9IGN1ckxlbjsNCisgICAgICAgICAgZG8NCisgICAgICAgICAgICAqKGRlc3QpID0gKEJ5dGUpKihkZXN0ICsgc3JjKTsNCisgICAgICAgICAgd2hpbGUgKCsrZGVzdCAhPSBsaW0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICBkbw0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgZGljW2RpY1BvcysrXSA9IGRpY1twb3NdOw0KKyAgICAgICAgICAgIGlmICgrK3BvcyA9PSBkaWNCdWZTaXplKQ0KKyAgICAgICAgICAgICAgcG9zID0gMDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB3aGlsZSAoLS1jdXJMZW4gIT0gMCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICB3aGlsZSAoZGljUG9zIDwgbGltaXQgJiYgYnVmIDwgYnVmTGltaXQpOw0KKyAgTk9STUFMSVpFOw0KKyAgcC0+YnVmID0gYnVmOw0KKyAgcC0+cmFuZ2UgPSByYW5nZTsNCisgIHAtPmNvZGUgPSBjb2RlOw0KKyAgcC0+cmVtYWluTGVuID0gbGVuOw0KKyAgcC0+ZGljUG9zID0gZGljUG9zOw0KKyAgcC0+cHJvY2Vzc2VkUG9zID0gcHJvY2Vzc2VkUG9zOw0KKyAgcC0+cmVwc1swXSA9IHJlcDA7DQorICBwLT5yZXBzWzFdID0gcmVwMTsNCisgIHAtPnJlcHNbMl0gPSByZXAyOw0KKyAgcC0+cmVwc1szXSA9IHJlcDM7DQorICBwLT5zdGF0ZSA9IHN0YXRlOw0KKw0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCitzdGF0aWMgdm9pZCBNWV9GQVNUX0NBTEwgTHptYURlY19Xcml0ZVJlbShDTHptYURlYyAqcCwgU2l6ZVQgbGltaXQpDQorew0KKyAgaWYgKHAtPnJlbWFpbkxlbiAhPSAwICYmIHAtPnJlbWFpbkxlbiA8IGtNYXRjaFNwZWNMZW5TdGFydCkNCisgIHsNCisgICAgQnl0ZSAqZGljID0gcC0+ZGljOw0KKyAgICBTaXplVCBkaWNQb3MgPSBwLT5kaWNQb3M7DQorICAgIFNpemVUIGRpY0J1ZlNpemUgPSBwLT5kaWNCdWZTaXplOw0KKyAgICB1bnNpZ25lZCBsZW4gPSBwLT5yZW1haW5MZW47DQorICAgIFVJbnQzMiByZXAwID0gcC0+cmVwc1swXTsNCisgICAgaWYgKGxpbWl0IC0gZGljUG9zIDwgbGVuKQ0KKyAgICAgIGxlbiA9ICh1bnNpZ25lZCkobGltaXQgLSBkaWNQb3MpOw0KKw0KKyAgICBpZiAocC0+Y2hlY2tEaWNTaXplID09IDAgJiYgcC0+cHJvcC5kaWNTaXplIC0gcC0+cHJvY2Vzc2VkUG9zIDw9IGxlbikNCisgICAgICBwLT5jaGVja0RpY1NpemUgPSBwLT5wcm9wLmRpY1NpemU7DQorDQorICAgIHAtPnByb2Nlc3NlZFBvcyArPSBsZW47DQorICAgIHAtPnJlbWFpbkxlbiAtPSBsZW47DQorICAgIHdoaWxlIChsZW4gIT0gMCkNCisgICAgew0KKyAgICAgIGxlbi0tOw0KKyAgICAgIGRpY1tkaWNQb3NdID0gZGljWyhkaWNQb3MgLSByZXAwKSArICgoZGljUG9zIDwgcmVwMCkgPyBkaWNCdWZTaXplIDogMCldOw0KKyAgICAgIGRpY1BvcysrOw0KKyAgICB9DQorICAgIHAtPmRpY1BvcyA9IGRpY1BvczsNCisgIH0NCit9DQorDQorc3RhdGljIGludCBNWV9GQVNUX0NBTEwgTHptYURlY19EZWNvZGVSZWFsMihDTHptYURlYyAqcCwgU2l6ZVQgbGltaXQsIGNvbnN0IEJ5dGUgKmJ1ZkxpbWl0KQ0KK3sNCisgIGRvDQorICB7DQorICAgIFNpemVUIGxpbWl0MiA9IGxpbWl0Ow0KKyAgICBpZiAocC0+Y2hlY2tEaWNTaXplID09IDApDQorICAgIHsNCisgICAgICBVSW50MzIgcmVtID0gcC0+cHJvcC5kaWNTaXplIC0gcC0+cHJvY2Vzc2VkUG9zOw0KKyAgICAgIGlmIChsaW1pdCAtIHAtPmRpY1BvcyA+IHJlbSkNCisgICAgICAgIGxpbWl0MiA9IHAtPmRpY1BvcyArIHJlbTsNCisgICAgfQ0KKyAgICBSSU5PSyhMem1hRGVjX0RlY29kZVJlYWwocCwgbGltaXQyLCBidWZMaW1pdCkpOw0KKyAgICBpZiAocC0+cHJvY2Vzc2VkUG9zID49IHAtPnByb3AuZGljU2l6ZSkNCisgICAgICBwLT5jaGVja0RpY1NpemUgPSBwLT5wcm9wLmRpY1NpemU7DQorICAgIEx6bWFEZWNfV3JpdGVSZW0ocCwgbGltaXQpOw0KKyAgfQ0KKyAgd2hpbGUgKHAtPmRpY1BvcyA8IGxpbWl0ICYmIHAtPmJ1ZiA8IGJ1ZkxpbWl0ICYmIHAtPnJlbWFpbkxlbiA8IGtNYXRjaFNwZWNMZW5TdGFydCk7DQorDQorICBpZiAocC0+cmVtYWluTGVuID4ga01hdGNoU3BlY0xlblN0YXJ0KQ0KKyAgew0KKyAgICBwLT5yZW1haW5MZW4gPSBrTWF0Y2hTcGVjTGVuU3RhcnQ7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorDQordHlwZWRlZiBlbnVtDQorew0KKyAgRFVNTVlfRVJST1IsIC8qIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IHN0cmVhbSAqLw0KKyAgRFVNTVlfTElULA0KKyAgRFVNTVlfTUFUQ0gsDQorICBEVU1NWV9SRVANCit9IEVMem1hRHVtbXk7DQorDQorc3RhdGljIEVMem1hRHVtbXkgTHptYURlY19UcnlEdW1teShjb25zdCBDTHptYURlYyAqcCwgY29uc3QgQnl0ZSAqYnVmLCBTaXplVCBpblNpemUpDQorew0KKyAgVUludDMyIHJhbmdlID0gcC0+cmFuZ2U7DQorICBVSW50MzIgY29kZSA9IHAtPmNvZGU7DQorICBjb25zdCBCeXRlICpidWZMaW1pdCA9IGJ1ZiArIGluU2l6ZTsNCisgIENMem1hUHJvYiAqcHJvYnMgPSBwLT5wcm9iczsNCisgIHVuc2lnbmVkIHN0YXRlID0gcC0+c3RhdGU7DQorICBFTHptYUR1bW15IHJlczsNCisNCisgIHsNCisgICAgQ0x6bWFQcm9iICpwcm9iOw0KKyAgICBVSW50MzIgYm91bmQ7DQorICAgIHVuc2lnbmVkIHR0dDsNCisgICAgdW5zaWduZWQgcG9zU3RhdGUgPSAocC0+cHJvY2Vzc2VkUG9zKSAmICgoMSA8PCBwLT5wcm9wLnBiKSAtIDEpOw0KKw0KKyAgICBwcm9iID0gcHJvYnMgKyBJc01hdGNoICsgKHN0YXRlIDw8IGtOdW1Qb3NCaXRzTWF4KSArIHBvc1N0YXRlOw0KKyAgICBJRl9CSVRfMF9DSEVDSyhwcm9iKQ0KKyAgICB7DQorICAgICAgVVBEQVRFXzBfQ0hFQ0sNCisNCisgICAgICAvKiBpZiAoYnVmTGltaXQgLSBidWYgPj0gNykgcmV0dXJuIERVTU1ZX0xJVDsgKi8NCisNCisgICAgICBwcm9iID0gcHJvYnMgKyBMaXRlcmFsOw0KKyAgICAgIGlmIChwLT5jaGVja0RpY1NpemUgIT0gMCB8fCBwLT5wcm9jZXNzZWRQb3MgIT0gMCkNCisgICAgICAgIHByb2IgKz0gKExaTUFfTElUX1NJWkUgKg0KKyAgICAgICAgICAoKCgocC0+cHJvY2Vzc2VkUG9zKSAmICgoMSA8PCAocC0+cHJvcC5scCkpIC0gMSkpIDw8IHAtPnByb3AubGMpICsNCisgICAgICAgICAgKHAtPmRpY1socC0+ZGljUG9zID09IDAgPyBwLT5kaWNCdWZTaXplIDogcC0+ZGljUG9zKSAtIDFdID4+ICg4IC0gcC0+cHJvcC5sYykpKSk7DQorDQorICAgICAgaWYgKHN0YXRlIDwga051bUxpdFN0YXRlcykNCisgICAgICB7DQorICAgICAgICB1bnNpZ25lZCBzeW1ib2wgPSAxOw0KKyAgICAgICAgZG8geyBHRVRfQklUX0NIRUNLKHByb2IgKyBzeW1ib2wsIHN5bWJvbCkgfSB3aGlsZSAoc3ltYm9sIDwgMHgxMDApOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgdW5zaWduZWQgbWF0Y2hCeXRlID0gcC0+ZGljW3AtPmRpY1BvcyAtIHAtPnJlcHNbMF0gKw0KKyAgICAgICAgICAgICgocC0+ZGljUG9zIDwgcC0+cmVwc1swXSkgPyBwLT5kaWNCdWZTaXplIDogMCldOw0KKyAgICAgICAgdW5zaWduZWQgb2ZmcyA9IDB4MTAwOw0KKyAgICAgICAgdW5zaWduZWQgc3ltYm9sID0gMTsNCisgICAgICAgIGRvDQorICAgICAgICB7DQorICAgICAgICAgIHVuc2lnbmVkIGJpdDsNCisgICAgICAgICAgQ0x6bWFQcm9iICpwcm9iTGl0Ow0KKyAgICAgICAgICBtYXRjaEJ5dGUgPDw9IDE7DQorICAgICAgICAgIGJpdCA9IChtYXRjaEJ5dGUgJiBvZmZzKTsNCisgICAgICAgICAgcHJvYkxpdCA9IHByb2IgKyBvZmZzICsgYml0ICsgc3ltYm9sOw0KKyAgICAgICAgICBHRVRfQklUMl9DSEVDSyhwcm9iTGl0LCBzeW1ib2wsIG9mZnMgJj0gfmJpdCwgb2ZmcyAmPSBiaXQpDQorICAgICAgICB9DQorICAgICAgICB3aGlsZSAoc3ltYm9sIDwgMHgxMDApOw0KKyAgICAgIH0NCisgICAgICByZXMgPSBEVU1NWV9MSVQ7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgdW5zaWduZWQgbGVuOw0KKyAgICAgIFVQREFURV8xX0NIRUNLOw0KKw0KKyAgICAgIHByb2IgPSBwcm9icyArIElzUmVwICsgc3RhdGU7DQorICAgICAgSUZfQklUXzBfQ0hFQ0socHJvYikNCisgICAgICB7DQorICAgICAgICBVUERBVEVfMF9DSEVDSzsNCisgICAgICAgIHN0YXRlID0gMDsNCisgICAgICAgIHByb2IgPSBwcm9icyArIExlbkNvZGVyOw0KKyAgICAgICAgcmVzID0gRFVNTVlfTUFUQ0g7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBVUERBVEVfMV9DSEVDSzsNCisgICAgICAgIHJlcyA9IERVTU1ZX1JFUDsNCisgICAgICAgIHByb2IgPSBwcm9icyArIElzUmVwRzAgKyBzdGF0ZTsNCisgICAgICAgIElGX0JJVF8wX0NIRUNLKHByb2IpDQorICAgICAgICB7DQorICAgICAgICAgIFVQREFURV8wX0NIRUNLOw0KKyAgICAgICAgICBwcm9iID0gcHJvYnMgKyBJc1JlcDBMb25nICsgKHN0YXRlIDw8IGtOdW1Qb3NCaXRzTWF4KSArIHBvc1N0YXRlOw0KKyAgICAgICAgICBJRl9CSVRfMF9DSEVDSyhwcm9iKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgVVBEQVRFXzBfQ0hFQ0s7DQorICAgICAgICAgICAgTk9STUFMSVpFX0NIRUNLOw0KKyAgICAgICAgICAgIHJldHVybiBEVU1NWV9SRVA7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgVVBEQVRFXzFfQ0hFQ0s7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgVVBEQVRFXzFfQ0hFQ0s7DQorICAgICAgICAgIHByb2IgPSBwcm9icyArIElzUmVwRzEgKyBzdGF0ZTsNCisgICAgICAgICAgSUZfQklUXzBfQ0hFQ0socHJvYikNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIFVQREFURV8wX0NIRUNLOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGVsc2UNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIFVQREFURV8xX0NIRUNLOw0KKyAgICAgICAgICAgIHByb2IgPSBwcm9icyArIElzUmVwRzIgKyBzdGF0ZTsNCisgICAgICAgICAgICBJRl9CSVRfMF9DSEVDSyhwcm9iKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIFVQREFURV8wX0NIRUNLOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgVVBEQVRFXzFfQ0hFQ0s7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzdGF0ZSA9IGtOdW1TdGF0ZXM7DQorICAgICAgICBwcm9iID0gcHJvYnMgKyBSZXBMZW5Db2RlcjsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgdW5zaWduZWQgbGltaXQsIG9mZnNldDsNCisgICAgICAgIENMem1hUHJvYiAqcHJvYkxlbiA9IHByb2IgKyBMZW5DaG9pY2U7DQorICAgICAgICBJRl9CSVRfMF9DSEVDSyhwcm9iTGVuKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBVUERBVEVfMF9DSEVDSzsNCisgICAgICAgICAgcHJvYkxlbiA9IHByb2IgKyBMZW5Mb3cgKyAocG9zU3RhdGUgPDwga0xlbk51bUxvd0JpdHMpOw0KKyAgICAgICAgICBvZmZzZXQgPSAwOw0KKyAgICAgICAgICBsaW1pdCA9IDEgPDwga0xlbk51bUxvd0JpdHM7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIFVQREFURV8xX0NIRUNLOw0KKyAgICAgICAgICBwcm9iTGVuID0gcHJvYiArIExlbkNob2ljZTI7DQorICAgICAgICAgIElGX0JJVF8wX0NIRUNLKHByb2JMZW4pDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBVUERBVEVfMF9DSEVDSzsNCisgICAgICAgICAgICBwcm9iTGVuID0gcHJvYiArIExlbk1pZCArIChwb3NTdGF0ZSA8PCBrTGVuTnVtTWlkQml0cyk7DQorICAgICAgICAgICAgb2Zmc2V0ID0ga0xlbk51bUxvd1N5bWJvbHM7DQorICAgICAgICAgICAgbGltaXQgPSAxIDw8IGtMZW5OdW1NaWRCaXRzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGVsc2UNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIFVQREFURV8xX0NIRUNLOw0KKyAgICAgICAgICAgIHByb2JMZW4gPSBwcm9iICsgTGVuSGlnaDsNCisgICAgICAgICAgICBvZmZzZXQgPSBrTGVuTnVtTG93U3ltYm9scyArIGtMZW5OdW1NaWRTeW1ib2xzOw0KKyAgICAgICAgICAgIGxpbWl0ID0gMSA8PCBrTGVuTnVtSGlnaEJpdHM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIFRSRUVfREVDT0RFX0NIRUNLKHByb2JMZW4sIGxpbWl0LCBsZW4pOw0KKyAgICAgICAgbGVuICs9IG9mZnNldDsNCisgICAgICB9DQorDQorICAgICAgaWYgKHN0YXRlIDwgNCkNCisgICAgICB7DQorICAgICAgICB1bnNpZ25lZCBwb3NTbG90Ow0KKyAgICAgICAgcHJvYiA9IHByb2JzICsgUG9zU2xvdCArDQorICAgICAgICAgICAgKChsZW4gPCBrTnVtTGVuVG9Qb3NTdGF0ZXMgPyBsZW4gOiBrTnVtTGVuVG9Qb3NTdGF0ZXMgLSAxKSA8PA0KKyAgICAgICAgICAgIGtOdW1Qb3NTbG90Qml0cyk7DQorICAgICAgICBUUkVFX0RFQ09ERV9DSEVDSyhwcm9iLCAxIDw8IGtOdW1Qb3NTbG90Qml0cywgcG9zU2xvdCk7DQorICAgICAgICBpZiAocG9zU2xvdCA+PSBrU3RhcnRQb3NNb2RlbEluZGV4KQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpbnQgbnVtRGlyZWN0Qml0cyA9ICgocG9zU2xvdCA+PiAxKSAtIDEpOw0KKw0KKyAgICAgICAgICAvKiBpZiAoYnVmTGltaXQgLSBidWYgPj0gOCkgcmV0dXJuIERVTU1ZX01BVENIOyAqLw0KKw0KKyAgICAgICAgICBpZiAocG9zU2xvdCA8IGtFbmRQb3NNb2RlbEluZGV4KQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgcHJvYiA9IHByb2JzICsgU3BlY1BvcyArICgoMiB8IChwb3NTbG90ICYgMSkpIDw8IG51bURpcmVjdEJpdHMpIC0gcG9zU2xvdCAtIDE7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgbnVtRGlyZWN0Qml0cyAtPSBrTnVtQWxpZ25CaXRzOw0KKyAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgTk9STUFMSVpFX0NIRUNLDQorICAgICAgICAgICAgICByYW5nZSA+Pj0gMTsNCisgICAgICAgICAgICAgIGNvZGUgLT0gcmFuZ2UgJiAoKChjb2RlIC0gcmFuZ2UpID4+IDMxKSAtIDEpOw0KKyAgICAgICAgICAgICAgLyogaWYgKGNvZGUgPj0gcmFuZ2UpIGNvZGUgLT0gcmFuZ2U7ICovDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdoaWxlICgtLW51bURpcmVjdEJpdHMgIT0gMCk7DQorICAgICAgICAgICAgcHJvYiA9IHByb2JzICsgQWxpZ247DQorICAgICAgICAgICAgbnVtRGlyZWN0Qml0cyA9IGtOdW1BbGlnbkJpdHM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgew0KKyAgICAgICAgICAgIHVuc2lnbmVkIGkgPSAxOw0KKyAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgR0VUX0JJVF9DSEVDSyhwcm9iICsgaSwgaSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdoaWxlICgtLW51bURpcmVjdEJpdHMgIT0gMCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIE5PUk1BTElaRV9DSEVDSzsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KKw0KK3N0YXRpYyB2b2lkIEx6bWFEZWNfSW5pdFJjKENMem1hRGVjICpwLCBjb25zdCBCeXRlICpkYXRhKQ0KK3sNCisgIHAtPmNvZGUgPSAoKFVJbnQzMilkYXRhWzFdIDw8IDI0KSB8ICgoVUludDMyKWRhdGFbMl0gPDwgMTYpIHwgKChVSW50MzIpZGF0YVszXSA8PCA4KSB8ICgoVUludDMyKWRhdGFbNF0pOw0KKyAgcC0+cmFuZ2UgPSAweEZGRkZGRkZGOw0KKyAgcC0+bmVlZEZsdXNoID0gMDsNCit9DQorDQordm9pZCBMem1hRGVjX0luaXREaWNBbmRTdGF0ZShDTHptYURlYyAqcCwgQm9vbCBpbml0RGljLCBCb29sIGluaXRTdGF0ZSkNCit7DQorICBwLT5uZWVkRmx1c2ggPSAxOw0KKyAgcC0+cmVtYWluTGVuID0gMDsNCisgIHAtPnRlbXBCdWZTaXplID0gMDsNCisNCisgIGlmIChpbml0RGljKQ0KKyAgew0KKyAgICBwLT5wcm9jZXNzZWRQb3MgPSAwOw0KKyAgICBwLT5jaGVja0RpY1NpemUgPSAwOw0KKyAgICBwLT5uZWVkSW5pdFN0YXRlID0gMTsNCisgIH0NCisgIGlmIChpbml0U3RhdGUpDQorICAgIHAtPm5lZWRJbml0U3RhdGUgPSAxOw0KK30NCisNCit2b2lkIEx6bWFEZWNfSW5pdChDTHptYURlYyAqcCkNCit7DQorICBwLT5kaWNQb3MgPSAwOw0KKyAgTHptYURlY19Jbml0RGljQW5kU3RhdGUocCwgVHJ1ZSwgVHJ1ZSk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIEx6bWFEZWNfSW5pdFN0YXRlUmVhbChDTHptYURlYyAqcCkNCit7DQorICBVSW50MzIgbnVtUHJvYnMgPSBMaXRlcmFsICsgKChVSW50MzIpTFpNQV9MSVRfU0laRSA8PCAocC0+cHJvcC5sYyArIHAtPnByb3AubHApKTsNCisgIFVJbnQzMiBpOw0KKyAgQ0x6bWFQcm9iICpwcm9icyA9IHAtPnByb2JzOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bVByb2JzOyBpKyspDQorICAgIHByb2JzW2ldID0ga0JpdE1vZGVsVG90YWwgPj4gMTsNCisgIHAtPnJlcHNbMF0gPSBwLT5yZXBzWzFdID0gcC0+cmVwc1syXSA9IHAtPnJlcHNbM10gPSAxOw0KKyAgcC0+c3RhdGUgPSAwOw0KKyAgcC0+bmVlZEluaXRTdGF0ZSA9IDA7DQorfQ0KKw0KK1NSZXMgTHptYURlY19EZWNvZGVUb0RpYyhDTHptYURlYyAqcCwgU2l6ZVQgZGljTGltaXQsIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbiwNCisgICAgRUx6bWFGaW5pc2hNb2RlIGZpbmlzaE1vZGUsIEVMem1hU3RhdHVzICpzdGF0dXMpDQorew0KKyAgU2l6ZVQgaW5TaXplID0gKnNyY0xlbjsNCisgICgqc3JjTGVuKSA9IDA7DQorICBMem1hRGVjX1dyaXRlUmVtKHAsIGRpY0xpbWl0KTsNCisgIA0KKyAgKnN0YXR1cyA9IExaTUFfU1RBVFVTX05PVF9TUEVDSUZJRUQ7DQorDQorICB3aGlsZSAocC0+cmVtYWluTGVuICE9IGtNYXRjaFNwZWNMZW5TdGFydCkNCisgIHsNCisgICAgICBpbnQgY2hlY2tFbmRNYXJrTm93Ow0KKw0KKyAgICAgIGlmIChwLT5uZWVkRmx1c2ggIT0gMCkNCisgICAgICB7DQorICAgICAgICBmb3IgKDsgaW5TaXplID4gMCAmJiBwLT50ZW1wQnVmU2l6ZSA8IFJDX0lOSVRfU0laRTsgKCpzcmNMZW4pKyssIGluU2l6ZS0tKQ0KKyAgICAgICAgICBwLT50ZW1wQnVmW3AtPnRlbXBCdWZTaXplKytdID0gKnNyYysrOw0KKyAgICAgICAgaWYgKHAtPnRlbXBCdWZTaXplIDwgUkNfSU5JVF9TSVpFKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAqc3RhdHVzID0gTFpNQV9TVEFUVVNfTkVFRFNfTU9SRV9JTlBVVDsNCisgICAgICAgICAgcmV0dXJuIFNaX09LOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHAtPnRlbXBCdWZbMF0gIT0gMCkNCisgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX0RBVEE7DQorDQorICAgICAgICBMem1hRGVjX0luaXRSYyhwLCBwLT50ZW1wQnVmKTsNCisgICAgICAgIHAtPnRlbXBCdWZTaXplID0gMDsNCisgICAgICB9DQorDQorICAgICAgY2hlY2tFbmRNYXJrTm93ID0gMDsNCisgICAgICBpZiAocC0+ZGljUG9zID49IGRpY0xpbWl0KQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChwLT5yZW1haW5MZW4gPT0gMCAmJiBwLT5jb2RlID09IDApDQorICAgICAgICB7DQorICAgICAgICAgICpzdGF0dXMgPSBMWk1BX1NUQVRVU19NQVlCRV9GSU5JU0hFRF9XSVRIT1VUX01BUks7DQorICAgICAgICAgIHJldHVybiBTWl9PSzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChmaW5pc2hNb2RlID09IExaTUFfRklOSVNIX0FOWSkNCisgICAgICAgIHsNCisgICAgICAgICAgKnN0YXR1cyA9IExaTUFfU1RBVFVTX05PVF9GSU5JU0hFRDsNCisgICAgICAgICAgcmV0dXJuIFNaX09LOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHAtPnJlbWFpbkxlbiAhPSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAqc3RhdHVzID0gTFpNQV9TVEFUVVNfTk9UX0ZJTklTSEVEOw0KKyAgICAgICAgICByZXR1cm4gU1pfRVJST1JfREFUQTsNCisgICAgICAgIH0NCisgICAgICAgIGNoZWNrRW5kTWFya05vdyA9IDE7DQorICAgICAgfQ0KKw0KKyAgICAgIGlmIChwLT5uZWVkSW5pdFN0YXRlKQ0KKyAgICAgICAgTHptYURlY19Jbml0U3RhdGVSZWFsKHApOw0KKyAgDQorICAgICAgaWYgKHAtPnRlbXBCdWZTaXplID09IDApDQorICAgICAgew0KKyAgICAgICAgU2l6ZVQgcHJvY2Vzc2VkOw0KKyAgICAgICAgY29uc3QgQnl0ZSAqYnVmTGltaXQ7DQorICAgICAgICBpZiAoaW5TaXplIDwgTFpNQV9SRVFVSVJFRF9JTlBVVF9NQVggfHwgY2hlY2tFbmRNYXJrTm93KQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpbnQgZHVtbXlSZXMgPSBMem1hRGVjX1RyeUR1bW15KHAsIHNyYywgaW5TaXplKTsNCisgICAgICAgICAgaWYgKGR1bW15UmVzID09IERVTU1ZX0VSUk9SKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgbWVtY3B5KHAtPnRlbXBCdWYsIHNyYywgaW5TaXplKTsNCisgICAgICAgICAgICBwLT50ZW1wQnVmU2l6ZSA9ICh1bnNpZ25lZClpblNpemU7DQorICAgICAgICAgICAgKCpzcmNMZW4pICs9IGluU2l6ZTsNCisgICAgICAgICAgICAqc3RhdHVzID0gTFpNQV9TVEFUVVNfTkVFRFNfTU9SRV9JTlBVVDsNCisgICAgICAgICAgICByZXR1cm4gU1pfT0s7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGNoZWNrRW5kTWFya05vdyAmJiBkdW1teVJlcyAhPSBEVU1NWV9NQVRDSCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgICpzdGF0dXMgPSBMWk1BX1NUQVRVU19OT1RfRklOSVNIRUQ7DQorICAgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX0RBVEE7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnVmTGltaXQgPSBzcmM7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICAgIGJ1ZkxpbWl0ID0gc3JjICsgaW5TaXplIC0gTFpNQV9SRVFVSVJFRF9JTlBVVF9NQVg7DQorICAgICAgICBwLT5idWYgPSBzcmM7DQorICAgICAgICBpZiAoTHptYURlY19EZWNvZGVSZWFsMihwLCBkaWNMaW1pdCwgYnVmTGltaXQpICE9IDApDQorICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9EQVRBOw0KKyAgICAgICAgcHJvY2Vzc2VkID0gKFNpemVUKShwLT5idWYgLSBzcmMpOw0KKyAgICAgICAgKCpzcmNMZW4pICs9IHByb2Nlc3NlZDsNCisgICAgICAgIHNyYyArPSBwcm9jZXNzZWQ7DQorICAgICAgICBpblNpemUgLT0gcHJvY2Vzc2VkOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgdW5zaWduZWQgcmVtID0gcC0+dGVtcEJ1ZlNpemUsIGxvb2tBaGVhZCA9IDA7DQorICAgICAgICB3aGlsZSAocmVtIDwgTFpNQV9SRVFVSVJFRF9JTlBVVF9NQVggJiYgbG9va0FoZWFkIDwgaW5TaXplKQ0KKyAgICAgICAgICBwLT50ZW1wQnVmW3JlbSsrXSA9IHNyY1tsb29rQWhlYWQrK107DQorICAgICAgICBwLT50ZW1wQnVmU2l6ZSA9IHJlbTsNCisgICAgICAgIGlmIChyZW0gPCBMWk1BX1JFUVVJUkVEX0lOUFVUX01BWCB8fCBjaGVja0VuZE1hcmtOb3cpDQorICAgICAgICB7DQorICAgICAgICAgIGludCBkdW1teVJlcyA9IEx6bWFEZWNfVHJ5RHVtbXkocCwgcC0+dGVtcEJ1ZiwgcmVtKTsNCisgICAgICAgICAgaWYgKGR1bW15UmVzID09IERVTU1ZX0VSUk9SKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgKCpzcmNMZW4pICs9IGxvb2tBaGVhZDsNCisgICAgICAgICAgICAqc3RhdHVzID0gTFpNQV9TVEFUVVNfTkVFRFNfTU9SRV9JTlBVVDsNCisgICAgICAgICAgICByZXR1cm4gU1pfT0s7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGNoZWNrRW5kTWFya05vdyAmJiBkdW1teVJlcyAhPSBEVU1NWV9NQVRDSCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgICpzdGF0dXMgPSBMWk1BX1NUQVRVU19OT1RfRklOSVNIRUQ7DQorICAgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX0RBVEE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHAtPmJ1ZiA9IHAtPnRlbXBCdWY7DQorICAgICAgICBpZiAoTHptYURlY19EZWNvZGVSZWFsMihwLCBkaWNMaW1pdCwgcC0+YnVmKSAhPSAwKQ0KKyAgICAgICAgICByZXR1cm4gU1pfRVJST1JfREFUQTsNCisgICAgICAgIGxvb2tBaGVhZCAtPSAocmVtIC0gKHVuc2lnbmVkKShwLT5idWYgLSBwLT50ZW1wQnVmKSk7DQorICAgICAgICAoKnNyY0xlbikgKz0gbG9va0FoZWFkOw0KKyAgICAgICAgc3JjICs9IGxvb2tBaGVhZDsNCisgICAgICAgIGluU2l6ZSAtPSBsb29rQWhlYWQ7DQorICAgICAgICBwLT50ZW1wQnVmU2l6ZSA9IDA7DQorICAgICAgfQ0KKyAgfQ0KKyAgaWYgKHAtPmNvZGUgPT0gMCkNCisgICAgKnN0YXR1cyA9IExaTUFfU1RBVFVTX0ZJTklTSEVEX1dJVEhfTUFSSzsNCisgIHJldHVybiAocC0+Y29kZSA9PSAwKSA/IFNaX09LIDogU1pfRVJST1JfREFUQTsNCit9DQorDQorU1JlcyBMem1hRGVjX0RlY29kZVRvQnVmKENMem1hRGVjICpwLCBCeXRlICpkZXN0LCBTaXplVCAqZGVzdExlbiwgY29uc3QgQnl0ZSAqc3JjLCBTaXplVCAqc3JjTGVuLCBFTHptYUZpbmlzaE1vZGUgZmluaXNoTW9kZSwgRUx6bWFTdGF0dXMgKnN0YXR1cykNCit7DQorICBTaXplVCBvdXRTaXplID0gKmRlc3RMZW47DQorICBTaXplVCBpblNpemUgPSAqc3JjTGVuOw0KKyAgKnNyY0xlbiA9ICpkZXN0TGVuID0gMDsNCisgIGZvciAoOzspDQorICB7DQorICAgIFNpemVUIGluU2l6ZUN1ciA9IGluU2l6ZSwgb3V0U2l6ZUN1ciwgZGljUG9zOw0KKyAgICBFTHptYUZpbmlzaE1vZGUgY3VyRmluaXNoTW9kZTsNCisgICAgU1JlcyByZXM7DQorICAgIGlmIChwLT5kaWNQb3MgPT0gcC0+ZGljQnVmU2l6ZSkNCisgICAgICBwLT5kaWNQb3MgPSAwOw0KKyAgICBkaWNQb3MgPSBwLT5kaWNQb3M7DQorICAgIGlmIChvdXRTaXplID4gcC0+ZGljQnVmU2l6ZSAtIGRpY1BvcykNCisgICAgew0KKyAgICAgIG91dFNpemVDdXIgPSBwLT5kaWNCdWZTaXplOw0KKyAgICAgIGN1ckZpbmlzaE1vZGUgPSBMWk1BX0ZJTklTSF9BTlk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgb3V0U2l6ZUN1ciA9IGRpY1BvcyArIG91dFNpemU7DQorICAgICAgY3VyRmluaXNoTW9kZSA9IGZpbmlzaE1vZGU7DQorICAgIH0NCisNCisgICAgcmVzID0gTHptYURlY19EZWNvZGVUb0RpYyhwLCBvdXRTaXplQ3VyLCBzcmMsICZpblNpemVDdXIsIGN1ckZpbmlzaE1vZGUsIHN0YXR1cyk7DQorICAgIHNyYyArPSBpblNpemVDdXI7DQorICAgIGluU2l6ZSAtPSBpblNpemVDdXI7DQorICAgICpzcmNMZW4gKz0gaW5TaXplQ3VyOw0KKyAgICBvdXRTaXplQ3VyID0gcC0+ZGljUG9zIC0gZGljUG9zOw0KKyAgICBtZW1jcHkoZGVzdCwgcC0+ZGljICsgZGljUG9zLCBvdXRTaXplQ3VyKTsNCisgICAgZGVzdCArPSBvdXRTaXplQ3VyOw0KKyAgICBvdXRTaXplIC09IG91dFNpemVDdXI7DQorICAgICpkZXN0TGVuICs9IG91dFNpemVDdXI7DQorICAgIGlmIChyZXMgIT0gMCkNCisgICAgICByZXR1cm4gcmVzOw0KKyAgICBpZiAob3V0U2l6ZUN1ciA9PSAwIHx8IG91dFNpemUgPT0gMCkNCisgICAgICByZXR1cm4gU1pfT0s7DQorICB9DQorfQ0KKw0KK3ZvaWQgTHptYURlY19GcmVlUHJvYnMoQ0x6bWFEZWMgKnAsIElTekFsbG9jICphbGxvYykNCit7DQorICBhbGxvYy0+RnJlZShhbGxvYywgcC0+cHJvYnMpOw0KKyAgcC0+cHJvYnMgPSAwOw0KK30NCisNCitzdGF0aWMgdm9pZCBMem1hRGVjX0ZyZWVEaWN0KENMem1hRGVjICpwLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgYWxsb2MtPkZyZWUoYWxsb2MsIHAtPmRpYyk7DQorICBwLT5kaWMgPSAwOw0KK30NCisNCit2b2lkIEx6bWFEZWNfRnJlZShDTHptYURlYyAqcCwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIEx6bWFEZWNfRnJlZVByb2JzKHAsIGFsbG9jKTsNCisgIEx6bWFEZWNfRnJlZURpY3QocCwgYWxsb2MpOw0KK30NCisNCitTUmVzIEx6bWFQcm9wc19EZWNvZGUoQ0x6bWFQcm9wcyAqcCwgY29uc3QgQnl0ZSAqZGF0YSwgdW5zaWduZWQgc2l6ZSkNCit7DQorICBVSW50MzIgZGljU2l6ZTsNCisgIEJ5dGUgZDsNCisgIA0KKyAgaWYgKHNpemUgPCBMWk1BX1BST1BTX1NJWkUpDQorICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgIGVsc2UNCisgICAgZGljU2l6ZSA9IGRhdGFbMV0gfCAoKFVJbnQzMilkYXRhWzJdIDw8IDgpIHwgKChVSW50MzIpZGF0YVszXSA8PCAxNikgfCAoKFVJbnQzMilkYXRhWzRdIDw8IDI0KTsNCisgDQorICBpZiAoZGljU2l6ZSA8IExaTUFfRElDX01JTikNCisgICAgZGljU2l6ZSA9IExaTUFfRElDX01JTjsNCisgIHAtPmRpY1NpemUgPSBkaWNTaXplOw0KKw0KKyAgZCA9IGRhdGFbMF07DQorICBpZiAoZCA+PSAoOSAqIDUgKiA1KSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKw0KKyAgcC0+bGMgPSBkICUgOTsNCisgIGQgLz0gOTsNCisgIHAtPnBiID0gZCAvIDU7DQorICBwLT5scCA9IGQgJSA1Ow0KKw0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCitzdGF0aWMgU1JlcyBMem1hRGVjX0FsbG9jYXRlUHJvYnMyKENMem1hRGVjICpwLCBjb25zdCBDTHptYVByb3BzICpwcm9wTmV3LCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgVUludDMyIG51bVByb2JzID0gTHptYVByb3BzX0dldE51bVByb2JzKHByb3BOZXcpOw0KKyAgaWYgKHAtPnByb2JzID09IDAgfHwgbnVtUHJvYnMgIT0gcC0+bnVtUHJvYnMpDQorICB7DQorICAgIEx6bWFEZWNfRnJlZVByb2JzKHAsIGFsbG9jKTsNCisgICAgcC0+cHJvYnMgPSAoQ0x6bWFQcm9iICopYWxsb2MtPkFsbG9jKGFsbG9jLCBudW1Qcm9icyAqIHNpemVvZihDTHptYVByb2IpKTsNCisgICAgcC0+bnVtUHJvYnMgPSBudW1Qcm9iczsNCisgICAgaWYgKHAtPnByb2JzID09IDApDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX01FTTsNCisgIH0NCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorU1JlcyBMem1hRGVjX0FsbG9jYXRlUHJvYnMoQ0x6bWFEZWMgKnAsIGNvbnN0IEJ5dGUgKnByb3BzLCB1bnNpZ25lZCBwcm9wc1NpemUsIElTekFsbG9jICphbGxvYykNCit7DQorICBDTHptYVByb3BzIHByb3BOZXc7DQorICBSSU5PSyhMem1hUHJvcHNfRGVjb2RlKCZwcm9wTmV3LCBwcm9wcywgcHJvcHNTaXplKSk7DQorICBSSU5PSyhMem1hRGVjX0FsbG9jYXRlUHJvYnMyKHAsICZwcm9wTmV3LCBhbGxvYykpOw0KKyAgcC0+cHJvcCA9IHByb3BOZXc7DQorICByZXR1cm4gU1pfT0s7DQorfQ0KKw0KK1NSZXMgTHptYURlY19BbGxvY2F0ZShDTHptYURlYyAqcCwgY29uc3QgQnl0ZSAqcHJvcHMsIHVuc2lnbmVkIHByb3BzU2l6ZSwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIENMem1hUHJvcHMgcHJvcE5ldzsNCisgIFNpemVUIGRpY0J1ZlNpemU7DQorICBSSU5PSyhMem1hUHJvcHNfRGVjb2RlKCZwcm9wTmV3LCBwcm9wcywgcHJvcHNTaXplKSk7DQorICBSSU5PSyhMem1hRGVjX0FsbG9jYXRlUHJvYnMyKHAsICZwcm9wTmV3LCBhbGxvYykpOw0KKyAgZGljQnVmU2l6ZSA9IHByb3BOZXcuZGljU2l6ZTsNCisgIGlmIChwLT5kaWMgPT0gMCB8fCBkaWNCdWZTaXplICE9IHAtPmRpY0J1ZlNpemUpDQorICB7DQorICAgIEx6bWFEZWNfRnJlZURpY3QocCwgYWxsb2MpOw0KKyAgICBwLT5kaWMgPSAoQnl0ZSAqKWFsbG9jLT5BbGxvYyhhbGxvYywgZGljQnVmU2l6ZSk7DQorICAgIGlmIChwLT5kaWMgPT0gMCkNCisgICAgew0KKyAgICAgIEx6bWFEZWNfRnJlZVByb2JzKHAsIGFsbG9jKTsNCisgICAgICByZXR1cm4gU1pfRVJST1JfTUVNOw0KKyAgICB9DQorICB9DQorICBwLT5kaWNCdWZTaXplID0gZGljQnVmU2l6ZTsNCisgIHAtPnByb3AgPSBwcm9wTmV3Ow0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCitTUmVzIEx6bWFEZWNvZGUoQnl0ZSAqZGVzdCwgU2l6ZVQgKmRlc3RMZW4sIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbiwNCisgICAgY29uc3QgQnl0ZSAqcHJvcERhdGEsIHVuc2lnbmVkIHByb3BTaXplLCBFTHptYUZpbmlzaE1vZGUgZmluaXNoTW9kZSwNCisgICAgRUx6bWFTdGF0dXMgKnN0YXR1cywgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIENMem1hRGVjIHA7DQorICBTUmVzIHJlczsNCisgIFNpemVUIG91dFNpemUgPSAqZGVzdExlbiwgaW5TaXplID0gKnNyY0xlbjsNCisgICpkZXN0TGVuID0gKnNyY0xlbiA9IDA7DQorICAqc3RhdHVzID0gTFpNQV9TVEFUVVNfTk9UX1NQRUNJRklFRDsNCisgIGlmIChpblNpemUgPCBSQ19JTklUX1NJWkUpDQorICAgIHJldHVybiBTWl9FUlJPUl9JTlBVVF9FT0Y7DQorICBMem1hRGVjX0NvbnN0cnVjdCgmcCk7DQorICBSSU5PSyhMem1hRGVjX0FsbG9jYXRlUHJvYnMoJnAsIHByb3BEYXRhLCBwcm9wU2l6ZSwgYWxsb2MpKTsNCisgIHAuZGljID0gZGVzdDsNCisgIHAuZGljQnVmU2l6ZSA9IG91dFNpemU7DQorICBMem1hRGVjX0luaXQoJnApOw0KKyAgKnNyY0xlbiA9IGluU2l6ZTsNCisgIHJlcyA9IEx6bWFEZWNfRGVjb2RlVG9EaWMoJnAsIG91dFNpemUsIHNyYywgc3JjTGVuLCBmaW5pc2hNb2RlLCBzdGF0dXMpOw0KKyAgKmRlc3RMZW4gPSBwLmRpY1BvczsNCisgIGlmIChyZXMgPT0gU1pfT0sgJiYgKnN0YXR1cyA9PSBMWk1BX1NUQVRVU19ORUVEU19NT1JFX0lOUFVUKQ0KKyAgICByZXMgPSBTWl9FUlJPUl9JTlBVVF9FT0Y7DQorICBMem1hRGVjX0ZyZWVQcm9icygmcCwgYWxsb2MpOw0KKyAgcmV0dXJuIHJlczsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DL0x6bWFEZWMuaCBiL2x6bWEvQy9Mem1hRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzM2FiZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9Mem1hRGVjLmgKQEAgLTAsMCArMSwyMjcgQEAKKy8qIEx6bWFEZWMuaCAtLSBMWk1BIERlY29kZXINCisyMDEzLTAxLTE4IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2lmbmRlZiBfX0xaTUFfREVDX0gNCisjZGVmaW5lIF9fTFpNQV9ERUNfSA0KKw0KKyNpbmNsdWRlICI3elR5cGVzLmgiDQorDQorRVhURVJOX0NfQkVHSU4NCisNCisvKiAjZGVmaW5lIF9MWk1BX1BST0IzMiAqLw0KKy8qIF9MWk1BX1BST0IzMiBjYW4gaW5jcmVhc2UgdGhlIHNwZWVkIG9uIHNvbWUgQ1BVcywNCisgICBidXQgbWVtb3J5IHVzYWdlIGZvciBDTHptYURlYzo6cHJvYnMgd2lsbCBiZSBkb3VibGVkIGluIHRoYXQgY2FzZSAqLw0KKw0KKyNpZmRlZiBfTFpNQV9QUk9CMzINCisjZGVmaW5lIENMem1hUHJvYiBVSW50MzINCisjZWxzZQ0KKyNkZWZpbmUgQ0x6bWFQcm9iIFVJbnQxNg0KKyNlbmRpZg0KKw0KKw0KKy8qIC0tLS0tLS0tLS0gTFpNQSBQcm9wZXJ0aWVzIC0tLS0tLS0tLS0gKi8NCisNCisjZGVmaW5lIExaTUFfUFJPUFNfU0laRSA1DQorDQordHlwZWRlZiBzdHJ1Y3QgX0NMem1hUHJvcHMNCit7DQorICB1bnNpZ25lZCBsYywgbHAsIHBiOw0KKyAgVUludDMyIGRpY1NpemU7DQorfSBDTHptYVByb3BzOw0KKw0KKy8qIEx6bWFQcm9wc19EZWNvZGUgLSBkZWNvZGVzIHByb3BlcnRpZXMNCitSZXR1cm5zOg0KKyAgU1pfT0sNCisgIFNaX0VSUk9SX1VOU1VQUE9SVEVEIC0gVW5zdXBwb3J0ZWQgcHJvcGVydGllcw0KKyovDQorDQorU1JlcyBMem1hUHJvcHNfRGVjb2RlKENMem1hUHJvcHMgKnAsIGNvbnN0IEJ5dGUgKmRhdGEsIHVuc2lnbmVkIHNpemUpOw0KKw0KKw0KKy8qIC0tLS0tLS0tLS0gTFpNQSBEZWNvZGVyIHN0YXRlIC0tLS0tLS0tLS0gKi8NCisNCisvKiBMWk1BX1JFUVVJUkVEX0lOUFVUX01BWCA9IG51bWJlciBvZiByZXF1aXJlZCBpbnB1dCBieXRlcyBmb3Igd29yc3QgY2FzZS4NCisgICBOdW0gYml0cyA9IGxvZzIoKDJeMTEgLyAzMSkgXiAyMikgKyAyNiA8IDEzNCArIDI2ID0gMTYwOyAqLw0KKw0KKyNkZWZpbmUgTFpNQV9SRVFVSVJFRF9JTlBVVF9NQVggMjANCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIENMem1hUHJvcHMgcHJvcDsNCisgIENMem1hUHJvYiAqcHJvYnM7DQorICBCeXRlICpkaWM7DQorICBjb25zdCBCeXRlICpidWY7DQorICBVSW50MzIgcmFuZ2UsIGNvZGU7DQorICBTaXplVCBkaWNQb3M7DQorICBTaXplVCBkaWNCdWZTaXplOw0KKyAgVUludDMyIHByb2Nlc3NlZFBvczsNCisgIFVJbnQzMiBjaGVja0RpY1NpemU7DQorICB1bnNpZ25lZCBzdGF0ZTsNCisgIFVJbnQzMiByZXBzWzRdOw0KKyAgdW5zaWduZWQgcmVtYWluTGVuOw0KKyAgaW50IG5lZWRGbHVzaDsNCisgIGludCBuZWVkSW5pdFN0YXRlOw0KKyAgVUludDMyIG51bVByb2JzOw0KKyAgdW5zaWduZWQgdGVtcEJ1ZlNpemU7DQorICBCeXRlIHRlbXBCdWZbTFpNQV9SRVFVSVJFRF9JTlBVVF9NQVhdOw0KK30gQ0x6bWFEZWM7DQorDQorI2RlZmluZSBMem1hRGVjX0NvbnN0cnVjdChwKSB7IChwKS0+ZGljID0gMDsgKHApLT5wcm9icyA9IDA7IH0NCisNCit2b2lkIEx6bWFEZWNfSW5pdChDTHptYURlYyAqcCk7DQorDQorLyogVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBMWk1BIHN0cmVhbXM6DQorICAgICAwKSBTdHJlYW0gd2l0aCBlbmQgbWFyay4gVGhhdCBlbmQgbWFyayBhZGRzIGFib3V0IDYgYnl0ZXMgdG8gY29tcHJlc3NlZCBzaXplLg0KKyAgICAgMSkgU3RyZWFtIHdpdGhvdXQgZW5kIG1hcmsuIFlvdSBtdXN0IGtub3cgZXhhY3QgdW5jb21wcmVzc2VkIHNpemUgdG8gZGVjb21wcmVzcyBzdWNoIHN0cmVhbS4gKi8NCisNCit0eXBlZGVmIGVudW0NCit7DQorICBMWk1BX0ZJTklTSF9BTlksICAgLyogZmluaXNoIGF0IGFueSBwb2ludCAqLw0KKyAgTFpNQV9GSU5JU0hfRU5EICAgIC8qIGJsb2NrIG11c3QgYmUgZmluaXNoZWQgYXQgdGhlIGVuZCAqLw0KK30gRUx6bWFGaW5pc2hNb2RlOw0KKw0KKy8qIEVMem1hRmluaXNoTW9kZSBoYXMgbWVhbmluZyBvbmx5IGlmIHRoZSBkZWNvZGluZyByZWFjaGVzIG91dHB1dCBsaW1pdCAhISENCisNCisgICBZb3UgbXVzdCB1c2UgTFpNQV9GSU5JU0hfRU5ELCB3aGVuIHlvdSBrbm93IHRoYXQgY3VycmVudCBvdXRwdXQgYnVmZmVyDQorICAgY292ZXJzIGxhc3QgYnl0ZXMgb2YgYmxvY2suIEluIG90aGVyIGNhc2VzIHlvdSBtdXN0IHVzZSBMWk1BX0ZJTklTSF9BTlkuDQorDQorICAgSWYgTFpNQSBkZWNvZGVyIHNlZXMgZW5kIG1hcmtlciBiZWZvcmUgcmVhY2hpbmcgb3V0cHV0IGxpbWl0LCBpdCByZXR1cm5zIFNaX09LLA0KKyAgIGFuZCBvdXRwdXQgdmFsdWUgb2YgZGVzdExlbiB3aWxsIGJlIGxlc3MgdGhhbiBvdXRwdXQgYnVmZmVyIHNpemUgbGltaXQuDQorICAgWW91IGNhbiBjaGVjayBzdGF0dXMgcmVzdWx0IGFsc28uDQorDQorICAgWW91IGNhbiB1c2UgbXVsdGlwbGUgY2hlY2tzIHRvIHRlc3QgZGF0YSBpbnRlZ3JpdHkgYWZ0ZXIgZnVsbCBkZWNvbXByZXNzaW9uOg0KKyAgICAgMSkgQ2hlY2sgUmVzdWx0IGFuZCAic3RhdHVzIiB2YXJpYWJsZS4NCisgICAgIDIpIENoZWNrIHRoYXQgb3V0cHV0KGRlc3RMZW4pID0gdW5jb21wcmVzc2VkU2l6ZSwgaWYgeW91IGtub3cgcmVhbCB1bmNvbXByZXNzZWRTaXplLg0KKyAgICAgMykgQ2hlY2sgdGhhdCBvdXRwdXQoc3JjTGVuKSA9IGNvbXByZXNzZWRTaXplLCBpZiB5b3Uga25vdyByZWFsIGNvbXByZXNzZWRTaXplLg0KKyAgICAgICAgWW91IG11c3QgdXNlIGNvcnJlY3QgZmluaXNoIG1vZGUgaW4gdGhhdCBjYXNlLiAqLw0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgIExaTUFfU1RBVFVTX05PVF9TUEVDSUZJRUQsICAgICAgICAgICAgICAgLyogdXNlIG1haW4gZXJyb3IgY29kZSBpbnN0ZWFkICovDQorICBMWk1BX1NUQVRVU19GSU5JU0hFRF9XSVRIX01BUkssICAgICAgICAgIC8qIHN0cmVhbSB3YXMgZmluaXNoZWQgd2l0aCBlbmQgbWFyay4gKi8NCisgIExaTUFfU1RBVFVTX05PVF9GSU5JU0hFRCwgICAgICAgICAgICAgICAgLyogc3RyZWFtIHdhcyBub3QgZmluaXNoZWQgKi8NCisgIExaTUFfU1RBVFVTX05FRURTX01PUkVfSU5QVVQsICAgICAgICAgICAgLyogeW91IG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGJ5dGVzICovDQorICBMWk1BX1NUQVRVU19NQVlCRV9GSU5JU0hFRF9XSVRIT1VUX01BUksgIC8qIHRoZXJlIGlzIHByb2JhYmlsaXR5IHRoYXQgc3RyZWFtIHdhcyBmaW5pc2hlZCB3aXRob3V0IGVuZCBtYXJrICovDQorfSBFTHptYVN0YXR1czsNCisNCisvKiBFTHptYVN0YXR1cyBpcyB1c2VkIG9ubHkgYXMgb3V0cHV0IHZhbHVlIGZvciBmdW5jdGlvbiBjYWxsICovDQorDQorDQorLyogLS0tLS0tLS0tLSBJbnRlcmZhY2VzIC0tLS0tLS0tLS0gKi8NCisNCisvKiBUaGVyZSBhcmUgMyBsZXZlbHMgb2YgaW50ZXJmYWNlczoNCisgICAgIDEpIERpY3Rpb25hcnkgSW50ZXJmYWNlDQorICAgICAyKSBCdWZmZXIgSW50ZXJmYWNlDQorICAgICAzKSBPbmUgQ2FsbCBJbnRlcmZhY2UNCisgICBZb3UgY2FuIHNlbGVjdCBhbnkgb2YgdGhlc2UgaW50ZXJmYWNlcywgYnV0IGRvbid0IG1peCBmdW5jdGlvbnMgZnJvbSBkaWZmZXJlbnQNCisgICBncm91cHMgZm9yIHNhbWUgb2JqZWN0LiAqLw0KKw0KKw0KKy8qIFRoZXJlIGFyZSB0d28gdmFyaWFudHMgdG8gYWxsb2NhdGUgc3RhdGUgZm9yIERpY3Rpb25hcnkgSW50ZXJmYWNlOg0KKyAgICAgMSkgTHptYURlY19BbGxvY2F0ZSAvIEx6bWFEZWNfRnJlZQ0KKyAgICAgMikgTHptYURlY19BbGxvY2F0ZVByb2JzIC8gTHptYURlY19GcmVlUHJvYnMNCisgICBZb3UgY2FuIHVzZSB2YXJpYW50IDIsIGlmIHlvdSBzZXQgZGljdGlvbmFyeSBidWZmZXIgbWFudWFsbHkuDQorICAgRm9yIEJ1ZmZlciBJbnRlcmZhY2UgeW91IG11c3QgYWx3YXlzIHVzZSB2YXJpYW50IDEuDQorDQorTHptYURlY19BbGxvY2F0ZSogY2FuIHJldHVybjoNCisgIFNaX09LDQorICBTWl9FUlJPUl9NRU0gICAgICAgICAtIE1lbW9yeSBhbGxvY2F0aW9uIGVycm9yDQorICBTWl9FUlJPUl9VTlNVUFBPUlRFRCAtIFVuc3VwcG9ydGVkIHByb3BlcnRpZXMNCisqLw0KKyAgIA0KK1NSZXMgTHptYURlY19BbGxvY2F0ZVByb2JzKENMem1hRGVjICpwLCBjb25zdCBCeXRlICpwcm9wcywgdW5zaWduZWQgcHJvcHNTaXplLCBJU3pBbGxvYyAqYWxsb2MpOw0KK3ZvaWQgTHptYURlY19GcmVlUHJvYnMoQ0x6bWFEZWMgKnAsIElTekFsbG9jICphbGxvYyk7DQorDQorU1JlcyBMem1hRGVjX0FsbG9jYXRlKENMem1hRGVjICpzdGF0ZSwgY29uc3QgQnl0ZSAqcHJvcCwgdW5zaWduZWQgcHJvcHNTaXplLCBJU3pBbGxvYyAqYWxsb2MpOw0KK3ZvaWQgTHptYURlY19GcmVlKENMem1hRGVjICpzdGF0ZSwgSVN6QWxsb2MgKmFsbG9jKTsNCisNCisvKiAtLS0tLS0tLS0tIERpY3Rpb25hcnkgSW50ZXJmYWNlIC0tLS0tLS0tLS0gKi8NCisNCisvKiBZb3UgY2FuIHVzZSBpdCwgaWYgeW91IHdhbnQgdG8gZWxpbWluYXRlIHRoZSBvdmVyaGVhZCBmb3IgZGF0YSBjb3B5aW5nIGZyb20NCisgICBkaWN0aW9uYXJ5IHRvIHNvbWUgb3RoZXIgZXh0ZXJuYWwgYnVmZmVyLg0KKyAgIFlvdSBtdXN0IHdvcmsgd2l0aCBDTHptYURlYyB2YXJpYWJsZXMgZGlyZWN0bHkgaW4gdGhpcyBpbnRlcmZhY2UuDQorDQorICAgU1RFUFM6DQorICAgICBMem1hRGVjX0NvbnN0cigpDQorICAgICBMem1hRGVjX0FsbG9jYXRlKCkNCisgICAgIGZvciAoZWFjaCBuZXcgc3RyZWFtKQ0KKyAgICAgew0KKyAgICAgICBMem1hRGVjX0luaXQoKQ0KKyAgICAgICB3aGlsZSAoaXQgbmVlZHMgbW9yZSBkZWNvbXByZXNzaW9uKQ0KKyAgICAgICB7DQorICAgICAgICAgTHptYURlY19EZWNvZGVUb0RpYygpDQorICAgICAgICAgdXNlIGRhdGEgZnJvbSBDTHptYURlYzo6ZGljIGFuZCB1cGRhdGUgQ0x6bWFEZWM6OmRpY1Bvcw0KKyAgICAgICB9DQorICAgICB9DQorICAgICBMem1hRGVjX0ZyZWUoKQ0KKyovDQorDQorLyogTHptYURlY19EZWNvZGVUb0RpYw0KKyAgIA0KKyAgIFRoZSBkZWNvZGluZyB0byBpbnRlcm5hbCBkaWN0aW9uYXJ5IGJ1ZmZlciAoQ0x6bWFEZWM6OmRpYykuDQorICAgWW91IG11c3QgbWFudWFsbHkgdXBkYXRlIENMem1hRGVjOjpkaWNQb3MsIGlmIGl0IHJlYWNoZXMgQ0x6bWFEZWM6OmRpY0J1ZlNpemUgISEhDQorDQorZmluaXNoTW9kZToNCisgIEl0IGhhcyBtZWFuaW5nIG9ubHkgaWYgdGhlIGRlY29kaW5nIHJlYWNoZXMgb3V0cHV0IGxpbWl0IChkaWNMaW1pdCkuDQorICBMWk1BX0ZJTklTSF9BTlkgLSBEZWNvZGUganVzdCBkaWNMaW1pdCBieXRlcy4NCisgIExaTUFfRklOSVNIX0VORCAtIFN0cmVhbSBtdXN0IGJlIGZpbmlzaGVkIGFmdGVyIGRpY0xpbWl0Lg0KKw0KK1JldHVybnM6DQorICBTWl9PSw0KKyAgICBzdGF0dXM6DQorICAgICAgTFpNQV9TVEFUVVNfRklOSVNIRURfV0lUSF9NQVJLDQorICAgICAgTFpNQV9TVEFUVVNfTk9UX0ZJTklTSEVEDQorICAgICAgTFpNQV9TVEFUVVNfTkVFRFNfTU9SRV9JTlBVVA0KKyAgICAgIExaTUFfU1RBVFVTX01BWUJFX0ZJTklTSEVEX1dJVEhPVVRfTUFSSw0KKyAgU1pfRVJST1JfREFUQSAtIERhdGEgZXJyb3INCisqLw0KKw0KK1NSZXMgTHptYURlY19EZWNvZGVUb0RpYyhDTHptYURlYyAqcCwgU2l6ZVQgZGljTGltaXQsDQorICAgIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbiwgRUx6bWFGaW5pc2hNb2RlIGZpbmlzaE1vZGUsIEVMem1hU3RhdHVzICpzdGF0dXMpOw0KKw0KKw0KKy8qIC0tLS0tLS0tLS0gQnVmZmVyIEludGVyZmFjZSAtLS0tLS0tLS0tICovDQorDQorLyogSXQncyB6bGliLWxpa2UgaW50ZXJmYWNlLg0KKyAgIFNlZSBMem1hRGVjX0RlY29kZVRvRGljIGRlc2NyaXB0aW9uIGZvciBpbmZvcm1hdGlvbiBhYm91dCBTVEVQUyBhbmQgcmV0dXJuIHJlc3VsdHMsDQorICAgYnV0IHlvdSBtdXN0IHVzZSBMem1hRGVjX0RlY29kZVRvQnVmIGluc3RlYWQgb2YgTHptYURlY19EZWNvZGVUb0RpYyBhbmQgeW91IGRvbid0IG5lZWQNCisgICB0byB3b3JrIHdpdGggQ0x6bWFEZWMgdmFyaWFibGVzIG1hbnVhbGx5Lg0KKw0KK2ZpbmlzaE1vZGU6DQorICBJdCBoYXMgbWVhbmluZyBvbmx5IGlmIHRoZSBkZWNvZGluZyByZWFjaGVzIG91dHB1dCBsaW1pdCAoKmRlc3RMZW4pLg0KKyAgTFpNQV9GSU5JU0hfQU5ZIC0gRGVjb2RlIGp1c3QgZGVzdExlbiBieXRlcy4NCisgIExaTUFfRklOSVNIX0VORCAtIFN0cmVhbSBtdXN0IGJlIGZpbmlzaGVkIGFmdGVyICgqZGVzdExlbikuDQorKi8NCisNCitTUmVzIEx6bWFEZWNfRGVjb2RlVG9CdWYoQ0x6bWFEZWMgKnAsIEJ5dGUgKmRlc3QsIFNpemVUICpkZXN0TGVuLA0KKyAgICBjb25zdCBCeXRlICpzcmMsIFNpemVUICpzcmNMZW4sIEVMem1hRmluaXNoTW9kZSBmaW5pc2hNb2RlLCBFTHptYVN0YXR1cyAqc3RhdHVzKTsNCisNCisNCisvKiAtLS0tLS0tLS0tIE9uZSBDYWxsIEludGVyZmFjZSAtLS0tLS0tLS0tICovDQorDQorLyogTHptYURlY29kZQ0KKw0KK2ZpbmlzaE1vZGU6DQorICBJdCBoYXMgbWVhbmluZyBvbmx5IGlmIHRoZSBkZWNvZGluZyByZWFjaGVzIG91dHB1dCBsaW1pdCAoKmRlc3RMZW4pLg0KKyAgTFpNQV9GSU5JU0hfQU5ZIC0gRGVjb2RlIGp1c3QgZGVzdExlbiBieXRlcy4NCisgIExaTUFfRklOSVNIX0VORCAtIFN0cmVhbSBtdXN0IGJlIGZpbmlzaGVkIGFmdGVyICgqZGVzdExlbikuDQorDQorUmV0dXJuczoNCisgIFNaX09LDQorICAgIHN0YXR1czoNCisgICAgICBMWk1BX1NUQVRVU19GSU5JU0hFRF9XSVRIX01BUksNCisgICAgICBMWk1BX1NUQVRVU19OT1RfRklOSVNIRUQNCisgICAgICBMWk1BX1NUQVRVU19NQVlCRV9GSU5JU0hFRF9XSVRIT1VUX01BUksNCisgIFNaX0VSUk9SX0RBVEEgLSBEYXRhIGVycm9yDQorICBTWl9FUlJPUl9NRU0gIC0gTWVtb3J5IGFsbG9jYXRpb24gZXJyb3INCisgIFNaX0VSUk9SX1VOU1VQUE9SVEVEIC0gVW5zdXBwb3J0ZWQgcHJvcGVydGllcw0KKyAgU1pfRVJST1JfSU5QVVRfRU9GIC0gSXQgbmVlZHMgbW9yZSBieXRlcyBpbiBpbnB1dCBidWZmZXIgKHNyYykuDQorKi8NCisNCitTUmVzIEx6bWFEZWNvZGUoQnl0ZSAqZGVzdCwgU2l6ZVQgKmRlc3RMZW4sIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbiwNCisgICAgY29uc3QgQnl0ZSAqcHJvcERhdGEsIHVuc2lnbmVkIHByb3BTaXplLCBFTHptYUZpbmlzaE1vZGUgZmluaXNoTW9kZSwNCisgICAgRUx6bWFTdGF0dXMgKnN0YXR1cywgSVN6QWxsb2MgKmFsbG9jKTsNCisNCitFWFRFUk5fQ19FTkQNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0MvTHptYUVuYy5jIGIvbHptYS9DL0x6bWFFbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGVlNmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL0x6bWFFbmMuYwpAQCAtMCwwICsxLDIyNzggQEAKKy8qIEx6bWFFbmMuYyAtLSBMWk1BIEVuY29kZXINCisyMDE0LTEyLTI5IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorDQorLyogI2RlZmluZSBTSE9XX1NUQVQgKi8NCisvKiAjZGVmaW5lIFNIT1dfU1RBVDIgKi8NCisNCisjaWYgZGVmaW5lZChTSE9XX1NUQVQpIHx8IGRlZmluZWQoU0hPV19TVEFUMikNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjZW5kaWYNCisNCisjaW5jbHVkZSAiTHptYUVuYy5oIg0KKw0KKyNpbmNsdWRlICJMekZpbmQuaCINCisjaWZuZGVmIF83WklQX1NUDQorI2luY2x1ZGUgIkx6RmluZE10LmgiDQorI2VuZGlmDQorDQorI2lmZGVmIFNIT1dfU1RBVA0KK3N0YXRpYyB1bnNpZ25lZCBnX1NUQVRfT0ZGU0VUID0gMDsNCisjZW5kaWYNCisNCisjZGVmaW5lIGtCbG9ja1NpemVNYXggKCgxIDw8IExaTUFfTlVNX0JMT0NLX1NJWkVfQklUUykgLSAxKQ0KKw0KKyNkZWZpbmUga0Jsb2NrU2l6ZSAoOSA8PCAxMCkNCisjZGVmaW5lIGtVbnBhY2tCbG9ja1NpemUgKDEgPDwgMTgpDQorI2RlZmluZSBrTWF0Y2hBcnJheVNpemUgKDEgPDwgMjEpDQorI2RlZmluZSBrTWF0Y2hSZWNvcmRNYXhTaXplICgoTFpNQV9NQVRDSF9MRU5fTUFYICogMiArIDMpICogTFpNQV9NQVRDSF9MRU5fTUFYKQ0KKw0KKyNkZWZpbmUga051bU1heERpcmVjdEJpdHMgKDMxKQ0KKw0KKyNkZWZpbmUga051bVRvcEJpdHMgMjQNCisjZGVmaW5lIGtUb3BWYWx1ZSAoKFVJbnQzMikxIDw8IGtOdW1Ub3BCaXRzKQ0KKw0KKyNkZWZpbmUga051bUJpdE1vZGVsVG90YWxCaXRzIDExDQorI2RlZmluZSBrQml0TW9kZWxUb3RhbCAoMSA8PCBrTnVtQml0TW9kZWxUb3RhbEJpdHMpDQorI2RlZmluZSBrTnVtTW92ZUJpdHMgNQ0KKyNkZWZpbmUga1Byb2JJbml0VmFsdWUgKGtCaXRNb2RlbFRvdGFsID4+IDEpDQorDQorI2RlZmluZSBrTnVtTW92ZVJlZHVjaW5nQml0cyA0DQorI2RlZmluZSBrTnVtQml0UHJpY2VTaGlmdEJpdHMgNA0KKyNkZWZpbmUga0JpdFByaWNlICgxIDw8IGtOdW1CaXRQcmljZVNoaWZ0Qml0cykNCisNCit2b2lkIEx6bWFFbmNQcm9wc19Jbml0KENMem1hRW5jUHJvcHMgKnApDQorew0KKyAgcC0+bGV2ZWwgPSA1Ow0KKyAgcC0+ZGljdFNpemUgPSBwLT5tYyA9IDA7DQorICBwLT5yZWR1Y2VTaXplID0gKFVJbnQ2NCkoSW50NjQpLTE7DQorICBwLT5sYyA9IHAtPmxwID0gcC0+cGIgPSBwLT5hbGdvID0gcC0+ZmIgPSBwLT5idE1vZGUgPSBwLT5udW1IYXNoQnl0ZXMgPSBwLT5udW1UaHJlYWRzID0gLTE7DQorICBwLT53cml0ZUVuZE1hcmsgPSAwOw0KK30NCisNCit2b2lkIEx6bWFFbmNQcm9wc19Ob3JtYWxpemUoQ0x6bWFFbmNQcm9wcyAqcCkNCit7DQorICBpbnQgbGV2ZWwgPSBwLT5sZXZlbDsNCisgIGlmIChsZXZlbCA8IDApIGxldmVsID0gNTsNCisgIHAtPmxldmVsID0gbGV2ZWw7DQorICBpZiAocC0+ZGljdFNpemUgPT0gMCkgcC0+ZGljdFNpemUgPSAobGV2ZWwgPD0gNSA/ICgxIDw8IChsZXZlbCAqIDIgKyAxNCkpIDogKGxldmVsID09IDYgPyAoMSA8PCAyNSkgOiAoMSA8PCAyNikpKTsNCisgIGlmIChwLT5kaWN0U2l6ZSA+IHAtPnJlZHVjZVNpemUpDQorICB7DQorICAgIHVuc2lnbmVkIGk7DQorICAgIGZvciAoaSA9IDExOyBpIDw9IDMwOyBpKyspDQorICAgIHsNCisgICAgICBpZiAoKFVJbnQzMilwLT5yZWR1Y2VTaXplIDw9ICgoVUludDMyKTIgPDwgaSkpIHsgcC0+ZGljdFNpemUgPSAoKFVJbnQzMikyIDw8IGkpOyBicmVhazsgfQ0KKyAgICAgIGlmICgoVUludDMyKXAtPnJlZHVjZVNpemUgPD0gKChVSW50MzIpMyA8PCBpKSkgeyBwLT5kaWN0U2l6ZSA9ICgoVUludDMyKTMgPDwgaSk7IGJyZWFrOyB9DQorICAgIH0NCisgIH0NCisgIGlmIChwLT5sYyA8IDApIHAtPmxjID0gMzsNCisgIGlmIChwLT5scCA8IDApIHAtPmxwID0gMDsNCisgIGlmIChwLT5wYiA8IDApIHAtPnBiID0gMjsNCisgIGlmIChwLT5hbGdvIDwgMCkgcC0+YWxnbyA9IChsZXZlbCA8IDUgPyAwIDogMSk7DQorICBpZiAocC0+ZmIgPCAwKSBwLT5mYiA9IChsZXZlbCA8IDcgPyAzMiA6IDY0KTsNCisgIGlmIChwLT5idE1vZGUgPCAwKSBwLT5idE1vZGUgPSAocC0+YWxnbyA9PSAwID8gMCA6IDEpOw0KKyAgaWYgKHAtPm51bUhhc2hCeXRlcyA8IDApIHAtPm51bUhhc2hCeXRlcyA9IDQ7DQorICBpZiAocC0+bWMgPT0gMCkgIHAtPm1jID0gKDE2ICsgKHAtPmZiID4+IDEpKSA+PiAocC0+YnRNb2RlID8gMCA6IDEpOw0KKyAgaWYgKHAtPm51bVRocmVhZHMgPCAwKQ0KKyAgICBwLT5udW1UaHJlYWRzID0NCisgICAgICAjaWZuZGVmIF83WklQX1NUDQorICAgICAgKChwLT5idE1vZGUgJiYgcC0+YWxnbykgPyAyIDogMSk7DQorICAgICAgI2Vsc2UNCisgICAgICAxOw0KKyAgICAgICNlbmRpZg0KK30NCisNCitVSW50MzIgTHptYUVuY1Byb3BzX0dldERpY3RTaXplKGNvbnN0IENMem1hRW5jUHJvcHMgKnByb3BzMikNCit7DQorICBDTHptYUVuY1Byb3BzIHByb3BzID0gKnByb3BzMjsNCisgIEx6bWFFbmNQcm9wc19Ob3JtYWxpemUoJnByb3BzKTsNCisgIHJldHVybiBwcm9wcy5kaWN0U2l6ZTsNCit9DQorDQorLyogI2RlZmluZSBMWk1BX0xPR19CU1IgKi8NCisvKiBEZWZpbmUgaXQgZm9yIEludGVsJ3MgQ1BVICovDQorDQorDQorI2lmZGVmIExaTUFfTE9HX0JTUg0KKw0KKyNkZWZpbmUga0RpY0xvZ1NpemVNYXhDb21wcmVzcyAzMA0KKw0KKyNkZWZpbmUgQlNSMl9SRVQocG9zLCByZXMpIHsgdW5zaWduZWQgbG9uZyBpOyBfQml0U2NhblJldmVyc2UoJmksIChwb3MpKTsgcmVzID0gKGkgKyBpKSArICgocG9zID4+IChpIC0gMSkpICYgMSk7IH0NCisNCitVSW50MzIgR2V0UG9zU2xvdDEoVUludDMyIHBvcykNCit7DQorICBVSW50MzIgcmVzOw0KKyAgQlNSMl9SRVQocG9zLCByZXMpOw0KKyAgcmV0dXJuIHJlczsNCit9DQorI2RlZmluZSBHZXRQb3NTbG90Mihwb3MsIHJlcykgeyBCU1IyX1JFVChwb3MsIHJlcyk7IH0NCisjZGVmaW5lIEdldFBvc1Nsb3QocG9zLCByZXMpIHsgaWYgKHBvcyA8IDIpIHJlcyA9IHBvczsgZWxzZSBCU1IyX1JFVChwb3MsIHJlcyk7IH0NCisNCisjZWxzZQ0KKw0KKyNkZWZpbmUga051bUxvZ0JpdHMgKDkgKyAoaW50KXNpemVvZihzaXplX3QpIC8gMikNCisjZGVmaW5lIGtEaWNMb2dTaXplTWF4Q29tcHJlc3MgKChrTnVtTG9nQml0cyAtIDEpICogMiArIDcpDQorDQordm9pZCBMem1hRW5jX0Zhc3RQb3NJbml0KEJ5dGUgKmdfRmFzdFBvcykNCit7DQorICBpbnQgYyA9IDIsIHNsb3RGYXN0Ow0KKyAgZ19GYXN0UG9zWzBdID0gMDsNCisgIGdfRmFzdFBvc1sxXSA9IDE7DQorICANCisgIGZvciAoc2xvdEZhc3QgPSAyOyBzbG90RmFzdCA8IGtOdW1Mb2dCaXRzICogMjsgc2xvdEZhc3QrKykNCisgIHsNCisgICAgVUludDMyIGsgPSAoMSA8PCAoKHNsb3RGYXN0ID4+IDEpIC0gMSkpOw0KKyAgICBVSW50MzIgajsNCisgICAgZm9yIChqID0gMDsgaiA8IGs7IGorKywgYysrKQ0KKyAgICAgIGdfRmFzdFBvc1tjXSA9IChCeXRlKXNsb3RGYXN0Ow0KKyAgfQ0KK30NCisNCisjZGVmaW5lIEJTUjJfUkVUKHBvcywgcmVzKSB7IFVJbnQzMiBpID0gNiArICgoa051bUxvZ0JpdHMgLSAxKSAmIFwNCisgICgwIC0gKCgoKChVSW50MzIpMSA8PCAoa051bUxvZ0JpdHMgKyA2KSkgLSAxKSAtIHBvcykgPj4gMzEpKSk7IFwNCisgIHJlcyA9IHAtPmdfRmFzdFBvc1twb3MgPj4gaV0gKyAoaSAqIDIpOyB9DQorLyoNCisjZGVmaW5lIEJTUjJfUkVUKHBvcywgcmVzKSB7IHJlcyA9IChwb3MgPCAoMSA8PCAoa051bUxvZ0JpdHMgKyA2KSkpID8gXA0KKyAgcC0+Z19GYXN0UG9zW3BvcyA+PiA2XSArIDEyIDogXA0KKyAgcC0+Z19GYXN0UG9zW3BvcyA+PiAoNiArIGtOdW1Mb2dCaXRzIC0gMSldICsgKDYgKyAoa051bUxvZ0JpdHMgLSAxKSkgKiAyOyB9DQorKi8NCisNCisjZGVmaW5lIEdldFBvc1Nsb3QxKHBvcykgcC0+Z19GYXN0UG9zW3Bvc10NCisjZGVmaW5lIEdldFBvc1Nsb3QyKHBvcywgcmVzKSB7IEJTUjJfUkVUKHBvcywgcmVzKTsgfQ0KKyNkZWZpbmUgR2V0UG9zU2xvdChwb3MsIHJlcykgeyBpZiAocG9zIDwga051bUZ1bGxEaXN0YW5jZXMpIHJlcyA9IHAtPmdfRmFzdFBvc1twb3NdOyBlbHNlIEJTUjJfUkVUKHBvcywgcmVzKTsgfQ0KKw0KKyNlbmRpZg0KKw0KKw0KKyNkZWZpbmUgTFpNQV9OVU1fUkVQUyA0DQorDQordHlwZWRlZiB1bnNpZ25lZCBDU3RhdGU7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBVSW50MzIgcHJpY2U7DQorDQorICBDU3RhdGUgc3RhdGU7DQorICBpbnQgcHJldjFJc0NoYXI7DQorICBpbnQgcHJldjI7DQorDQorICBVSW50MzIgcG9zUHJldjI7DQorICBVSW50MzIgYmFja1ByZXYyOw0KKw0KKyAgVUludDMyIHBvc1ByZXY7DQorICBVSW50MzIgYmFja1ByZXY7DQorICBVSW50MzIgYmFja3NbTFpNQV9OVU1fUkVQU107DQorfSBDT3B0aW1hbDsNCisNCisjZGVmaW5lIGtOdW1PcHRzICgxIDw8IDEyKQ0KKw0KKyNkZWZpbmUga051bUxlblRvUG9zU3RhdGVzIDQNCisjZGVmaW5lIGtOdW1Qb3NTbG90Qml0cyA2DQorI2RlZmluZSBrRGljTG9nU2l6ZU1pbiAwDQorI2RlZmluZSBrRGljTG9nU2l6ZU1heCAzMg0KKyNkZWZpbmUga0Rpc3RUYWJsZVNpemVNYXggKGtEaWNMb2dTaXplTWF4ICogMikNCisNCisNCisjZGVmaW5lIGtOdW1BbGlnbkJpdHMgNA0KKyNkZWZpbmUga0FsaWduVGFibGVTaXplICgxIDw8IGtOdW1BbGlnbkJpdHMpDQorI2RlZmluZSBrQWxpZ25NYXNrIChrQWxpZ25UYWJsZVNpemUgLSAxKQ0KKw0KKyNkZWZpbmUga1N0YXJ0UG9zTW9kZWxJbmRleCA0DQorI2RlZmluZSBrRW5kUG9zTW9kZWxJbmRleCAxNA0KKyNkZWZpbmUga051bVBvc01vZGVscyAoa0VuZFBvc01vZGVsSW5kZXggLSBrU3RhcnRQb3NNb2RlbEluZGV4KQ0KKw0KKyNkZWZpbmUga051bUZ1bGxEaXN0YW5jZXMgKDEgPDwgKGtFbmRQb3NNb2RlbEluZGV4ID4+IDEpKQ0KKw0KKyNpZmRlZiBfTFpNQV9QUk9CMzINCisjZGVmaW5lIENMem1hUHJvYiBVSW50MzINCisjZWxzZQ0KKyNkZWZpbmUgQ0x6bWFQcm9iIFVJbnQxNg0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgTFpNQV9QQl9NQVggNA0KKyNkZWZpbmUgTFpNQV9MQ19NQVggOA0KKyNkZWZpbmUgTFpNQV9MUF9NQVggNA0KKw0KKyNkZWZpbmUgTFpNQV9OVU1fUEJfU1RBVEVTX01BWCAoMSA8PCBMWk1BX1BCX01BWCkNCisNCisNCisjZGVmaW5lIGtMZW5OdW1Mb3dCaXRzIDMNCisjZGVmaW5lIGtMZW5OdW1Mb3dTeW1ib2xzICgxIDw8IGtMZW5OdW1Mb3dCaXRzKQ0KKyNkZWZpbmUga0xlbk51bU1pZEJpdHMgMw0KKyNkZWZpbmUga0xlbk51bU1pZFN5bWJvbHMgKDEgPDwga0xlbk51bU1pZEJpdHMpDQorI2RlZmluZSBrTGVuTnVtSGlnaEJpdHMgOA0KKyNkZWZpbmUga0xlbk51bUhpZ2hTeW1ib2xzICgxIDw8IGtMZW5OdW1IaWdoQml0cykNCisNCisjZGVmaW5lIGtMZW5OdW1TeW1ib2xzVG90YWwgKGtMZW5OdW1Mb3dTeW1ib2xzICsga0xlbk51bU1pZFN5bWJvbHMgKyBrTGVuTnVtSGlnaFN5bWJvbHMpDQorDQorI2RlZmluZSBMWk1BX01BVENIX0xFTl9NSU4gMg0KKyNkZWZpbmUgTFpNQV9NQVRDSF9MRU5fTUFYIChMWk1BX01BVENIX0xFTl9NSU4gKyBrTGVuTnVtU3ltYm9sc1RvdGFsIC0gMSkNCisNCisjZGVmaW5lIGtOdW1TdGF0ZXMgMTINCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIENMem1hUHJvYiBjaG9pY2U7DQorICBDTHptYVByb2IgY2hvaWNlMjsNCisgIENMem1hUHJvYiBsb3dbTFpNQV9OVU1fUEJfU1RBVEVTX01BWCA8PCBrTGVuTnVtTG93Qml0c107DQorICBDTHptYVByb2IgbWlkW0xaTUFfTlVNX1BCX1NUQVRFU19NQVggPDwga0xlbk51bU1pZEJpdHNdOw0KKyAgQ0x6bWFQcm9iIGhpZ2hba0xlbk51bUhpZ2hTeW1ib2xzXTsNCit9IENMZW5FbmM7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBDTGVuRW5jIHA7DQorICBVSW50MzIgcHJpY2VzW0xaTUFfTlVNX1BCX1NUQVRFU19NQVhdW2tMZW5OdW1TeW1ib2xzVG90YWxdOw0KKyAgVUludDMyIHRhYmxlU2l6ZTsNCisgIFVJbnQzMiBjb3VudGVyc1tMWk1BX05VTV9QQl9TVEFURVNfTUFYXTsNCit9IENMZW5QcmljZUVuYzsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIFVJbnQzMiByYW5nZTsNCisgIEJ5dGUgY2FjaGU7DQorICBVSW50NjQgbG93Ow0KKyAgVUludDY0IGNhY2hlU2l6ZTsNCisgIEJ5dGUgKmJ1ZjsNCisgIEJ5dGUgKmJ1ZkxpbTsNCisgIEJ5dGUgKmJ1ZkJhc2U7DQorICBJU2VxT3V0U3RyZWFtICpvdXRTdHJlYW07DQorICBVSW50NjQgcHJvY2Vzc2VkOw0KKyAgU1JlcyByZXM7DQorfSBDUmFuZ2VFbmM7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBDTHptYVByb2IgKmxpdFByb2JzOw0KKw0KKyAgQ0x6bWFQcm9iIGlzTWF0Y2hba051bVN0YXRlc11bTFpNQV9OVU1fUEJfU1RBVEVTX01BWF07DQorICBDTHptYVByb2IgaXNSZXBba051bVN0YXRlc107DQorICBDTHptYVByb2IgaXNSZXBHMFtrTnVtU3RhdGVzXTsNCisgIENMem1hUHJvYiBpc1JlcEcxW2tOdW1TdGF0ZXNdOw0KKyAgQ0x6bWFQcm9iIGlzUmVwRzJba051bVN0YXRlc107DQorICBDTHptYVByb2IgaXNSZXAwTG9uZ1trTnVtU3RhdGVzXVtMWk1BX05VTV9QQl9TVEFURVNfTUFYXTsNCisNCisgIENMem1hUHJvYiBwb3NTbG90RW5jb2RlcltrTnVtTGVuVG9Qb3NTdGF0ZXNdWzEgPDwga051bVBvc1Nsb3RCaXRzXTsNCisgIENMem1hUHJvYiBwb3NFbmNvZGVyc1trTnVtRnVsbERpc3RhbmNlcyAtIGtFbmRQb3NNb2RlbEluZGV4XTsNCisgIENMem1hUHJvYiBwb3NBbGlnbkVuY29kZXJbMSA8PCBrTnVtQWxpZ25CaXRzXTsNCisgIA0KKyAgQ0xlblByaWNlRW5jIGxlbkVuYzsNCisgIENMZW5QcmljZUVuYyByZXBMZW5FbmM7DQorDQorICBVSW50MzIgcmVwc1tMWk1BX05VTV9SRVBTXTsNCisgIFVJbnQzMiBzdGF0ZTsNCit9IENTYXZlU3RhdGU7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBJTWF0Y2hGaW5kZXIgbWF0Y2hGaW5kZXI7DQorICB2b2lkICptYXRjaEZpbmRlck9iajsNCisNCisgICNpZm5kZWYgXzdaSVBfU1QNCisgIEJvb2wgbXRNb2RlOw0KKyAgQ01hdGNoRmluZGVyTXQgbWF0Y2hGaW5kZXJNdDsNCisgICNlbmRpZg0KKw0KKyAgQ01hdGNoRmluZGVyIG1hdGNoRmluZGVyQmFzZTsNCisNCisgICNpZm5kZWYgXzdaSVBfU1QNCisgIEJ5dGUgcGFkWzEyOF07DQorICAjZW5kaWYNCisgIA0KKyAgVUludDMyIG9wdGltdW1FbmRJbmRleDsNCisgIFVJbnQzMiBvcHRpbXVtQ3VycmVudEluZGV4Ow0KKw0KKyAgVUludDMyIGxvbmdlc3RNYXRjaExlbmd0aDsNCisgIFVJbnQzMiBudW1QYWlyczsNCisgIFVJbnQzMiBudW1BdmFpbDsNCisgIENPcHRpbWFsIG9wdFtrTnVtT3B0c107DQorICANCisgICNpZm5kZWYgTFpNQV9MT0dfQlNSDQorICBCeXRlIGdfRmFzdFBvc1sxIDw8IGtOdW1Mb2dCaXRzXTsNCisgICNlbmRpZg0KKw0KKyAgVUludDMyIFByb2JQcmljZXNba0JpdE1vZGVsVG90YWwgPj4ga051bU1vdmVSZWR1Y2luZ0JpdHNdOw0KKyAgVUludDMyIG1hdGNoZXNbTFpNQV9NQVRDSF9MRU5fTUFYICogMiArIDIgKyAxXTsNCisgIFVJbnQzMiBudW1GYXN0Qnl0ZXM7DQorICBVSW50MzIgYWRkaXRpb25hbE9mZnNldDsNCisgIFVJbnQzMiByZXBzW0xaTUFfTlVNX1JFUFNdOw0KKyAgVUludDMyIHN0YXRlOw0KKw0KKyAgVUludDMyIHBvc1Nsb3RQcmljZXNba051bUxlblRvUG9zU3RhdGVzXVtrRGlzdFRhYmxlU2l6ZU1heF07DQorICBVSW50MzIgZGlzdGFuY2VzUHJpY2VzW2tOdW1MZW5Ub1Bvc1N0YXRlc11ba051bUZ1bGxEaXN0YW5jZXNdOw0KKyAgVUludDMyIGFsaWduUHJpY2VzW2tBbGlnblRhYmxlU2l6ZV07DQorICBVSW50MzIgYWxpZ25QcmljZUNvdW50Ow0KKw0KKyAgVUludDMyIGRpc3RUYWJsZVNpemU7DQorDQorICB1bnNpZ25lZCBsYywgbHAsIHBiOw0KKyAgdW5zaWduZWQgbHBNYXNrLCBwYk1hc2s7DQorDQorICBDTHptYVByb2IgKmxpdFByb2JzOw0KKw0KKyAgQ0x6bWFQcm9iIGlzTWF0Y2hba051bVN0YXRlc11bTFpNQV9OVU1fUEJfU1RBVEVTX01BWF07DQorICBDTHptYVByb2IgaXNSZXBba051bVN0YXRlc107DQorICBDTHptYVByb2IgaXNSZXBHMFtrTnVtU3RhdGVzXTsNCisgIENMem1hUHJvYiBpc1JlcEcxW2tOdW1TdGF0ZXNdOw0KKyAgQ0x6bWFQcm9iIGlzUmVwRzJba051bVN0YXRlc107DQorICBDTHptYVByb2IgaXNSZXAwTG9uZ1trTnVtU3RhdGVzXVtMWk1BX05VTV9QQl9TVEFURVNfTUFYXTsNCisNCisgIENMem1hUHJvYiBwb3NTbG90RW5jb2RlcltrTnVtTGVuVG9Qb3NTdGF0ZXNdWzEgPDwga051bVBvc1Nsb3RCaXRzXTsNCisgIENMem1hUHJvYiBwb3NFbmNvZGVyc1trTnVtRnVsbERpc3RhbmNlcyAtIGtFbmRQb3NNb2RlbEluZGV4XTsNCisgIENMem1hUHJvYiBwb3NBbGlnbkVuY29kZXJbMSA8PCBrTnVtQWxpZ25CaXRzXTsNCisgIA0KKyAgQ0xlblByaWNlRW5jIGxlbkVuYzsNCisgIENMZW5QcmljZUVuYyByZXBMZW5FbmM7DQorDQorICB1bnNpZ25lZCBsY2xwOw0KKw0KKyAgQm9vbCBmYXN0TW9kZTsNCisgIA0KKyAgQ1JhbmdlRW5jIHJjOw0KKw0KKyAgQm9vbCB3cml0ZUVuZE1hcms7DQorICBVSW50NjQgbm93UG9zNjQ7DQorICBVSW50MzIgbWF0Y2hQcmljZUNvdW50Ow0KKyAgQm9vbCBmaW5pc2hlZDsNCisgIEJvb2wgbXVsdGlUaHJlYWQ7DQorDQorICBTUmVzIHJlc3VsdDsNCisgIFVJbnQzMiBkaWN0U2l6ZTsNCisNCisgIGludCBuZWVkSW5pdDsNCisNCisgIENTYXZlU3RhdGUgc2F2ZVN0YXRlOw0KK30gQ0x6bWFFbmM7DQorDQordm9pZCBMem1hRW5jX1NhdmVTdGF0ZShDTHptYUVuY0hhbmRsZSBwcCkNCit7DQorICBDTHptYUVuYyAqcCA9IChDTHptYUVuYyAqKXBwOw0KKyAgQ1NhdmVTdGF0ZSAqZGVzdCA9ICZwLT5zYXZlU3RhdGU7DQorICBpbnQgaTsNCisgIGRlc3QtPmxlbkVuYyA9IHAtPmxlbkVuYzsNCisgIGRlc3QtPnJlcExlbkVuYyA9IHAtPnJlcExlbkVuYzsNCisgIGRlc3QtPnN0YXRlID0gcC0+c3RhdGU7DQorDQorICBmb3IgKGkgPSAwOyBpIDwga051bVN0YXRlczsgaSsrKQ0KKyAgew0KKyAgICBtZW1jcHkoZGVzdC0+aXNNYXRjaFtpXSwgcC0+aXNNYXRjaFtpXSwgc2l6ZW9mKHAtPmlzTWF0Y2hbaV0pKTsNCisgICAgbWVtY3B5KGRlc3QtPmlzUmVwMExvbmdbaV0sIHAtPmlzUmVwMExvbmdbaV0sIHNpemVvZihwLT5pc1JlcDBMb25nW2ldKSk7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwga051bUxlblRvUG9zU3RhdGVzOyBpKyspDQorICAgIG1lbWNweShkZXN0LT5wb3NTbG90RW5jb2RlcltpXSwgcC0+cG9zU2xvdEVuY29kZXJbaV0sIHNpemVvZihwLT5wb3NTbG90RW5jb2RlcltpXSkpOw0KKyAgbWVtY3B5KGRlc3QtPmlzUmVwLCBwLT5pc1JlcCwgc2l6ZW9mKHAtPmlzUmVwKSk7DQorICBtZW1jcHkoZGVzdC0+aXNSZXBHMCwgcC0+aXNSZXBHMCwgc2l6ZW9mKHAtPmlzUmVwRzApKTsNCisgIG1lbWNweShkZXN0LT5pc1JlcEcxLCBwLT5pc1JlcEcxLCBzaXplb2YocC0+aXNSZXBHMSkpOw0KKyAgbWVtY3B5KGRlc3QtPmlzUmVwRzIsIHAtPmlzUmVwRzIsIHNpemVvZihwLT5pc1JlcEcyKSk7DQorICBtZW1jcHkoZGVzdC0+cG9zRW5jb2RlcnMsIHAtPnBvc0VuY29kZXJzLCBzaXplb2YocC0+cG9zRW5jb2RlcnMpKTsNCisgIG1lbWNweShkZXN0LT5wb3NBbGlnbkVuY29kZXIsIHAtPnBvc0FsaWduRW5jb2Rlciwgc2l6ZW9mKHAtPnBvc0FsaWduRW5jb2RlcikpOw0KKyAgbWVtY3B5KGRlc3QtPnJlcHMsIHAtPnJlcHMsIHNpemVvZihwLT5yZXBzKSk7DQorICBtZW1jcHkoZGVzdC0+bGl0UHJvYnMsIHAtPmxpdFByb2JzLCAoMHgzMDAgPDwgcC0+bGNscCkgKiBzaXplb2YoQ0x6bWFQcm9iKSk7DQorfQ0KKw0KK3ZvaWQgTHptYUVuY19SZXN0b3JlU3RhdGUoQ0x6bWFFbmNIYW5kbGUgcHApDQorew0KKyAgQ0x6bWFFbmMgKmRlc3QgPSAoQ0x6bWFFbmMgKilwcDsNCisgIGNvbnN0IENTYXZlU3RhdGUgKnAgPSAmZGVzdC0+c2F2ZVN0YXRlOw0KKyAgaW50IGk7DQorICBkZXN0LT5sZW5FbmMgPSBwLT5sZW5FbmM7DQorICBkZXN0LT5yZXBMZW5FbmMgPSBwLT5yZXBMZW5FbmM7DQorICBkZXN0LT5zdGF0ZSA9IHAtPnN0YXRlOw0KKw0KKyAgZm9yIChpID0gMDsgaSA8IGtOdW1TdGF0ZXM7IGkrKykNCisgIHsNCisgICAgbWVtY3B5KGRlc3QtPmlzTWF0Y2hbaV0sIHAtPmlzTWF0Y2hbaV0sIHNpemVvZihwLT5pc01hdGNoW2ldKSk7DQorICAgIG1lbWNweShkZXN0LT5pc1JlcDBMb25nW2ldLCBwLT5pc1JlcDBMb25nW2ldLCBzaXplb2YocC0+aXNSZXAwTG9uZ1tpXSkpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IGtOdW1MZW5Ub1Bvc1N0YXRlczsgaSsrKQ0KKyAgICBtZW1jcHkoZGVzdC0+cG9zU2xvdEVuY29kZXJbaV0sIHAtPnBvc1Nsb3RFbmNvZGVyW2ldLCBzaXplb2YocC0+cG9zU2xvdEVuY29kZXJbaV0pKTsNCisgIG1lbWNweShkZXN0LT5pc1JlcCwgcC0+aXNSZXAsIHNpemVvZihwLT5pc1JlcCkpOw0KKyAgbWVtY3B5KGRlc3QtPmlzUmVwRzAsIHAtPmlzUmVwRzAsIHNpemVvZihwLT5pc1JlcEcwKSk7DQorICBtZW1jcHkoZGVzdC0+aXNSZXBHMSwgcC0+aXNSZXBHMSwgc2l6ZW9mKHAtPmlzUmVwRzEpKTsNCisgIG1lbWNweShkZXN0LT5pc1JlcEcyLCBwLT5pc1JlcEcyLCBzaXplb2YocC0+aXNSZXBHMikpOw0KKyAgbWVtY3B5KGRlc3QtPnBvc0VuY29kZXJzLCBwLT5wb3NFbmNvZGVycywgc2l6ZW9mKHAtPnBvc0VuY29kZXJzKSk7DQorICBtZW1jcHkoZGVzdC0+cG9zQWxpZ25FbmNvZGVyLCBwLT5wb3NBbGlnbkVuY29kZXIsIHNpemVvZihwLT5wb3NBbGlnbkVuY29kZXIpKTsNCisgIG1lbWNweShkZXN0LT5yZXBzLCBwLT5yZXBzLCBzaXplb2YocC0+cmVwcykpOw0KKyAgbWVtY3B5KGRlc3QtPmxpdFByb2JzLCBwLT5saXRQcm9icywgKDB4MzAwIDw8IGRlc3QtPmxjbHApICogc2l6ZW9mKENMem1hUHJvYikpOw0KK30NCisNCitTUmVzIEx6bWFFbmNfU2V0UHJvcHMoQ0x6bWFFbmNIYW5kbGUgcHAsIGNvbnN0IENMem1hRW5jUHJvcHMgKnByb3BzMikNCit7DQorICBDTHptYUVuYyAqcCA9IChDTHptYUVuYyAqKXBwOw0KKyAgQ0x6bWFFbmNQcm9wcyBwcm9wcyA9ICpwcm9wczI7DQorICBMem1hRW5jUHJvcHNfTm9ybWFsaXplKCZwcm9wcyk7DQorDQorICBpZiAocHJvcHMubGMgPiBMWk1BX0xDX01BWCB8fCBwcm9wcy5scCA+IExaTUFfTFBfTUFYIHx8IHByb3BzLnBiID4gTFpNQV9QQl9NQVggfHwNCisgICAgICBwcm9wcy5kaWN0U2l6ZSA+ICgoVUludDMyKTEgPDwga0RpY0xvZ1NpemVNYXhDb21wcmVzcykgfHwgcHJvcHMuZGljdFNpemUgPiAoKFVJbnQzMikxIDw8IDMwKSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX1BBUkFNOw0KKyAgcC0+ZGljdFNpemUgPSBwcm9wcy5kaWN0U2l6ZTsNCisgIHsNCisgICAgdW5zaWduZWQgZmIgPSBwcm9wcy5mYjsNCisgICAgaWYgKGZiIDwgNSkNCisgICAgICBmYiA9IDU7DQorICAgIGlmIChmYiA+IExaTUFfTUFUQ0hfTEVOX01BWCkNCisgICAgICBmYiA9IExaTUFfTUFUQ0hfTEVOX01BWDsNCisgICAgcC0+bnVtRmFzdEJ5dGVzID0gZmI7DQorICB9DQorICBwLT5sYyA9IHByb3BzLmxjOw0KKyAgcC0+bHAgPSBwcm9wcy5scDsNCisgIHAtPnBiID0gcHJvcHMucGI7DQorICBwLT5mYXN0TW9kZSA9IChwcm9wcy5hbGdvID09IDApOw0KKyAgcC0+bWF0Y2hGaW5kZXJCYXNlLmJ0TW9kZSA9IHByb3BzLmJ0TW9kZTsNCisgIHsNCisgICAgVUludDMyIG51bUhhc2hCeXRlcyA9IDQ7DQorICAgIGlmIChwcm9wcy5idE1vZGUpDQorICAgIHsNCisgICAgICBpZiAocHJvcHMubnVtSGFzaEJ5dGVzIDwgMikNCisgICAgICAgIG51bUhhc2hCeXRlcyA9IDI7DQorICAgICAgZWxzZSBpZiAocHJvcHMubnVtSGFzaEJ5dGVzIDwgNCkNCisgICAgICAgIG51bUhhc2hCeXRlcyA9IHByb3BzLm51bUhhc2hCeXRlczsNCisgICAgfQ0KKyAgICBwLT5tYXRjaEZpbmRlckJhc2UubnVtSGFzaEJ5dGVzID0gbnVtSGFzaEJ5dGVzOw0KKyAgfQ0KKw0KKyAgcC0+bWF0Y2hGaW5kZXJCYXNlLmN1dFZhbHVlID0gcHJvcHMubWM7DQorDQorICBwLT53cml0ZUVuZE1hcmsgPSBwcm9wcy53cml0ZUVuZE1hcms7DQorDQorICAjaWZuZGVmIF83WklQX1NUDQorICAvKg0KKyAgaWYgKG5ld011bHRpVGhyZWFkICE9IF9tdWx0aVRocmVhZCkNCisgIHsNCisgICAgUmVsZWFzZU1hdGNoRmluZGVyKCk7DQorICAgIF9tdWx0aVRocmVhZCA9IG5ld011bHRpVGhyZWFkOw0KKyAgfQ0KKyAgKi8NCisgIHAtPm11bHRpVGhyZWFkID0gKHByb3BzLm51bVRocmVhZHMgPiAxKTsNCisgICNlbmRpZg0KKw0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCitzdGF0aWMgY29uc3QgaW50IGtMaXRlcmFsTmV4dFN0YXRlc1trTnVtU3RhdGVzXSA9IHswLCAwLCAwLCAwLCAxLCAyLCAzLCA0LCAgNSwgIDYsICAgNCwgNX07DQorc3RhdGljIGNvbnN0IGludCBrTWF0Y2hOZXh0U3RhdGVzW2tOdW1TdGF0ZXNdICAgPSB7NywgNywgNywgNywgNywgNywgNywgMTAsIDEwLCAxMCwgMTAsIDEwfTsNCitzdGF0aWMgY29uc3QgaW50IGtSZXBOZXh0U3RhdGVzW2tOdW1TdGF0ZXNdICAgICA9IHs4LCA4LCA4LCA4LCA4LCA4LCA4LCAxMSwgMTEsIDExLCAxMSwgMTF9Ow0KK3N0YXRpYyBjb25zdCBpbnQga1Nob3J0UmVwTmV4dFN0YXRlc1trTnVtU3RhdGVzXT0gezksIDksIDksIDksIDksIDksIDksIDExLCAxMSwgMTEsIDExLCAxMX07DQorDQorI2RlZmluZSBJc0NoYXJTdGF0ZShzKSAoKHMpIDwgNykNCisNCisjZGVmaW5lIEdldExlblRvUG9zU3RhdGUobGVuKSAoKChsZW4pIDwga051bUxlblRvUG9zU3RhdGVzICsgMSkgPyAobGVuKSAtIDIgOiBrTnVtTGVuVG9Qb3NTdGF0ZXMgLSAxKQ0KKw0KKyNkZWZpbmUga0luZmluaXR5UHJpY2UgKDEgPDwgMzApDQorDQorc3RhdGljIHZvaWQgUmFuZ2VFbmNfQ29uc3RydWN0KENSYW5nZUVuYyAqcCkNCit7DQorICBwLT5vdXRTdHJlYW0gPSAwOw0KKyAgcC0+YnVmQmFzZSA9IDA7DQorfQ0KKw0KKyNkZWZpbmUgUmFuZ2VFbmNfR2V0UHJvY2Vzc2VkKHApICgocCktPnByb2Nlc3NlZCArICgocCktPmJ1ZiAtIChwKS0+YnVmQmFzZSkgKyAocCktPmNhY2hlU2l6ZSkNCisNCisjZGVmaW5lIFJDX0JVRl9TSVpFICgxIDw8IDE2KQ0KK3N0YXRpYyBpbnQgUmFuZ2VFbmNfQWxsb2MoQ1JhbmdlRW5jICpwLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgaWYgKHAtPmJ1ZkJhc2UgPT0gMCkNCisgIHsNCisgICAgcC0+YnVmQmFzZSA9IChCeXRlICopYWxsb2MtPkFsbG9jKGFsbG9jLCBSQ19CVUZfU0laRSk7DQorICAgIGlmIChwLT5idWZCYXNlID09IDApDQorICAgICAgcmV0dXJuIDA7DQorICAgIHAtPmJ1ZkxpbSA9IHAtPmJ1ZkJhc2UgKyBSQ19CVUZfU0laRTsNCisgIH0NCisgIHJldHVybiAxOw0KK30NCisNCitzdGF0aWMgdm9pZCBSYW5nZUVuY19GcmVlKENSYW5nZUVuYyAqcCwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIGFsbG9jLT5GcmVlKGFsbG9jLCBwLT5idWZCYXNlKTsNCisgIHAtPmJ1ZkJhc2UgPSAwOw0KK30NCisNCitzdGF0aWMgdm9pZCBSYW5nZUVuY19Jbml0KENSYW5nZUVuYyAqcCkNCit7DQorICAvKiBTdHJlYW0uSW5pdCgpOyAqLw0KKyAgcC0+bG93ID0gMDsNCisgIHAtPnJhbmdlID0gMHhGRkZGRkZGRjsNCisgIHAtPmNhY2hlU2l6ZSA9IDE7DQorICBwLT5jYWNoZSA9IDA7DQorDQorICBwLT5idWYgPSBwLT5idWZCYXNlOw0KKw0KKyAgcC0+cHJvY2Vzc2VkID0gMDsNCisgIHAtPnJlcyA9IFNaX09LOw0KK30NCisNCitzdGF0aWMgdm9pZCBSYW5nZUVuY19GbHVzaFN0cmVhbShDUmFuZ2VFbmMgKnApDQorew0KKyAgc2l6ZV90IG51bTsNCisgIGlmIChwLT5yZXMgIT0gU1pfT0spDQorICAgIHJldHVybjsNCisgIG51bSA9IHAtPmJ1ZiAtIHAtPmJ1ZkJhc2U7DQorICBpZiAobnVtICE9IHAtPm91dFN0cmVhbS0+V3JpdGUocC0+b3V0U3RyZWFtLCBwLT5idWZCYXNlLCBudW0pKQ0KKyAgICBwLT5yZXMgPSBTWl9FUlJPUl9XUklURTsNCisgIHAtPnByb2Nlc3NlZCArPSBudW07DQorICBwLT5idWYgPSBwLT5idWZCYXNlOw0KK30NCisNCitzdGF0aWMgdm9pZCBNWV9GQVNUX0NBTEwgUmFuZ2VFbmNfU2hpZnRMb3coQ1JhbmdlRW5jICpwKQ0KK3sNCisgIGlmICgoVUludDMyKXAtPmxvdyA8IChVSW50MzIpMHhGRjAwMDAwMCB8fCAodW5zaWduZWQpKHAtPmxvdyA+PiAzMikgIT0gMCkNCisgIHsNCisgICAgQnl0ZSB0ZW1wID0gcC0+Y2FjaGU7DQorICAgIGRvDQorICAgIHsNCisgICAgICBCeXRlICpidWYgPSBwLT5idWY7DQorICAgICAgKmJ1ZisrID0gKEJ5dGUpKHRlbXAgKyAoQnl0ZSkocC0+bG93ID4+IDMyKSk7DQorICAgICAgcC0+YnVmID0gYnVmOw0KKyAgICAgIGlmIChidWYgPT0gcC0+YnVmTGltKQ0KKyAgICAgICAgUmFuZ2VFbmNfRmx1c2hTdHJlYW0ocCk7DQorICAgICAgdGVtcCA9IDB4RkY7DQorICAgIH0NCisgICAgd2hpbGUgKC0tcC0+Y2FjaGVTaXplICE9IDApOw0KKyAgICBwLT5jYWNoZSA9IChCeXRlKSgoVUludDMyKXAtPmxvdyA+PiAyNCk7DQorICB9DQorICBwLT5jYWNoZVNpemUrKzsNCisgIHAtPmxvdyA9IChVSW50MzIpcC0+bG93IDw8IDg7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFJhbmdlRW5jX0ZsdXNoRGF0YShDUmFuZ2VFbmMgKnApDQorew0KKyAgaW50IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQ0KKyAgICBSYW5nZUVuY19TaGlmdExvdyhwKTsNCit9DQorDQorc3RhdGljIHZvaWQgUmFuZ2VFbmNfRW5jb2RlRGlyZWN0Qml0cyhDUmFuZ2VFbmMgKnAsIFVJbnQzMiB2YWx1ZSwgdW5zaWduZWQgbnVtQml0cykNCit7DQorICBkbw0KKyAgew0KKyAgICBwLT5yYW5nZSA+Pj0gMTsNCisgICAgcC0+bG93ICs9IHAtPnJhbmdlICYgKDAgLSAoKHZhbHVlID4+IC0tbnVtQml0cykgJiAxKSk7DQorICAgIGlmIChwLT5yYW5nZSA8IGtUb3BWYWx1ZSkNCisgICAgew0KKyAgICAgIHAtPnJhbmdlIDw8PSA4Ow0KKyAgICAgIFJhbmdlRW5jX1NoaWZ0TG93KHApOw0KKyAgICB9DQorICB9DQorICB3aGlsZSAobnVtQml0cyAhPSAwKTsNCit9DQorDQorc3RhdGljIHZvaWQgUmFuZ2VFbmNfRW5jb2RlQml0KENSYW5nZUVuYyAqcCwgQ0x6bWFQcm9iICpwcm9iLCBVSW50MzIgc3ltYm9sKQ0KK3sNCisgIFVJbnQzMiB0dHQgPSAqcHJvYjsNCisgIFVJbnQzMiBuZXdCb3VuZCA9IChwLT5yYW5nZSA+PiBrTnVtQml0TW9kZWxUb3RhbEJpdHMpICogdHR0Ow0KKyAgaWYgKHN5bWJvbCA9PSAwKQ0KKyAgew0KKyAgICBwLT5yYW5nZSA9IG5ld0JvdW5kOw0KKyAgICB0dHQgKz0gKGtCaXRNb2RlbFRvdGFsIC0gdHR0KSA+PiBrTnVtTW92ZUJpdHM7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIHAtPmxvdyArPSBuZXdCb3VuZDsNCisgICAgcC0+cmFuZ2UgLT0gbmV3Qm91bmQ7DQorICAgIHR0dCAtPSB0dHQgPj4ga051bU1vdmVCaXRzOw0KKyAgfQ0KKyAgKnByb2IgPSAoQ0x6bWFQcm9iKXR0dDsNCisgIGlmIChwLT5yYW5nZSA8IGtUb3BWYWx1ZSkNCisgIHsNCisgICAgcC0+cmFuZ2UgPDw9IDg7DQorICAgIFJhbmdlRW5jX1NoaWZ0TG93KHApOw0KKyAgfQ0KK30NCisNCitzdGF0aWMgdm9pZCBMaXRFbmNfRW5jb2RlKENSYW5nZUVuYyAqcCwgQ0x6bWFQcm9iICpwcm9icywgVUludDMyIHN5bWJvbCkNCit7DQorICBzeW1ib2wgfD0gMHgxMDA7DQorICBkbw0KKyAgew0KKyAgICBSYW5nZUVuY19FbmNvZGVCaXQocCwgcHJvYnMgKyAoc3ltYm9sID4+IDgpLCAoc3ltYm9sID4+IDcpICYgMSk7DQorICAgIHN5bWJvbCA8PD0gMTsNCisgIH0NCisgIHdoaWxlIChzeW1ib2wgPCAweDEwMDAwKTsNCit9DQorDQorc3RhdGljIHZvaWQgTGl0RW5jX0VuY29kZU1hdGNoZWQoQ1JhbmdlRW5jICpwLCBDTHptYVByb2IgKnByb2JzLCBVSW50MzIgc3ltYm9sLCBVSW50MzIgbWF0Y2hCeXRlKQ0KK3sNCisgIFVJbnQzMiBvZmZzID0gMHgxMDA7DQorICBzeW1ib2wgfD0gMHgxMDA7DQorICBkbw0KKyAgew0KKyAgICBtYXRjaEJ5dGUgPDw9IDE7DQorICAgIFJhbmdlRW5jX0VuY29kZUJpdChwLCBwcm9icyArIChvZmZzICsgKG1hdGNoQnl0ZSAmIG9mZnMpICsgKHN5bWJvbCA+PiA4KSksIChzeW1ib2wgPj4gNykgJiAxKTsNCisgICAgc3ltYm9sIDw8PSAxOw0KKyAgICBvZmZzICY9IH4obWF0Y2hCeXRlIF4gc3ltYm9sKTsNCisgIH0NCisgIHdoaWxlIChzeW1ib2wgPCAweDEwMDAwKTsNCit9DQorDQordm9pZCBMem1hRW5jX0luaXRQcmljZVRhYmxlcyhVSW50MzIgKlByb2JQcmljZXMpDQorew0KKyAgVUludDMyIGk7DQorICBmb3IgKGkgPSAoMSA8PCBrTnVtTW92ZVJlZHVjaW5nQml0cykgLyAyOyBpIDwga0JpdE1vZGVsVG90YWw7IGkgKz0gKDEgPDwga051bU1vdmVSZWR1Y2luZ0JpdHMpKQ0KKyAgew0KKyAgICBjb25zdCBpbnQga0N5Y2xlc0JpdHMgPSBrTnVtQml0UHJpY2VTaGlmdEJpdHM7DQorICAgIFVJbnQzMiB3ID0gaTsNCisgICAgVUludDMyIGJpdENvdW50ID0gMDsNCisgICAgaW50IGo7DQorICAgIGZvciAoaiA9IDA7IGogPCBrQ3ljbGVzQml0czsgaisrKQ0KKyAgICB7DQorICAgICAgdyA9IHcgKiB3Ow0KKyAgICAgIGJpdENvdW50IDw8PSAxOw0KKyAgICAgIHdoaWxlICh3ID49ICgoVUludDMyKTEgPDwgMTYpKQ0KKyAgICAgIHsNCisgICAgICAgIHcgPj49IDE7DQorICAgICAgICBiaXRDb3VudCsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBQcm9iUHJpY2VzW2kgPj4ga051bU1vdmVSZWR1Y2luZ0JpdHNdID0gKChrTnVtQml0TW9kZWxUb3RhbEJpdHMgPDwga0N5Y2xlc0JpdHMpIC0gMTUgLSBiaXRDb3VudCk7DQorICB9DQorfQ0KKw0KKw0KKyNkZWZpbmUgR0VUX1BSSUNFKHByb2IsIHN5bWJvbCkgXA0KKyAgcC0+UHJvYlByaWNlc1soKHByb2IpIF4gKCgoLShpbnQpKHN5bWJvbCkpKSAmIChrQml0TW9kZWxUb3RhbCAtIDEpKSkgPj4ga051bU1vdmVSZWR1Y2luZ0JpdHNdOw0KKw0KKyNkZWZpbmUgR0VUX1BSSUNFYShwcm9iLCBzeW1ib2wpIFwNCisgIFByb2JQcmljZXNbKChwcm9iKSBeICgoLSgoaW50KShzeW1ib2wpKSkgJiAoa0JpdE1vZGVsVG90YWwgLSAxKSkpID4+IGtOdW1Nb3ZlUmVkdWNpbmdCaXRzXTsNCisNCisjZGVmaW5lIEdFVF9QUklDRV8wKHByb2IpIHAtPlByb2JQcmljZXNbKHByb2IpID4+IGtOdW1Nb3ZlUmVkdWNpbmdCaXRzXQ0KKyNkZWZpbmUgR0VUX1BSSUNFXzEocHJvYikgcC0+UHJvYlByaWNlc1soKHByb2IpIF4gKGtCaXRNb2RlbFRvdGFsIC0gMSkpID4+IGtOdW1Nb3ZlUmVkdWNpbmdCaXRzXQ0KKw0KKyNkZWZpbmUgR0VUX1BSSUNFXzBhKHByb2IpIFByb2JQcmljZXNbKHByb2IpID4+IGtOdW1Nb3ZlUmVkdWNpbmdCaXRzXQ0KKyNkZWZpbmUgR0VUX1BSSUNFXzFhKHByb2IpIFByb2JQcmljZXNbKChwcm9iKSBeIChrQml0TW9kZWxUb3RhbCAtIDEpKSA+PiBrTnVtTW92ZVJlZHVjaW5nQml0c10NCisNCitzdGF0aWMgVUludDMyIExpdEVuY19HZXRQcmljZShjb25zdCBDTHptYVByb2IgKnByb2JzLCBVSW50MzIgc3ltYm9sLCBVSW50MzIgKlByb2JQcmljZXMpDQorew0KKyAgVUludDMyIHByaWNlID0gMDsNCisgIHN5bWJvbCB8PSAweDEwMDsNCisgIGRvDQorICB7DQorICAgIHByaWNlICs9IEdFVF9QUklDRWEocHJvYnNbc3ltYm9sID4+IDhdLCAoc3ltYm9sID4+IDcpICYgMSk7DQorICAgIHN5bWJvbCA8PD0gMTsNCisgIH0NCisgIHdoaWxlIChzeW1ib2wgPCAweDEwMDAwKTsNCisgIHJldHVybiBwcmljZTsNCit9DQorDQorc3RhdGljIFVJbnQzMiBMaXRFbmNfR2V0UHJpY2VNYXRjaGVkKGNvbnN0IENMem1hUHJvYiAqcHJvYnMsIFVJbnQzMiBzeW1ib2wsIFVJbnQzMiBtYXRjaEJ5dGUsIFVJbnQzMiAqUHJvYlByaWNlcykNCit7DQorICBVSW50MzIgcHJpY2UgPSAwOw0KKyAgVUludDMyIG9mZnMgPSAweDEwMDsNCisgIHN5bWJvbCB8PSAweDEwMDsNCisgIGRvDQorICB7DQorICAgIG1hdGNoQnl0ZSA8PD0gMTsNCisgICAgcHJpY2UgKz0gR0VUX1BSSUNFYShwcm9ic1tvZmZzICsgKG1hdGNoQnl0ZSAmIG9mZnMpICsgKHN5bWJvbCA+PiA4KV0sIChzeW1ib2wgPj4gNykgJiAxKTsNCisgICAgc3ltYm9sIDw8PSAxOw0KKyAgICBvZmZzICY9IH4obWF0Y2hCeXRlIF4gc3ltYm9sKTsNCisgIH0NCisgIHdoaWxlIChzeW1ib2wgPCAweDEwMDAwKTsNCisgIHJldHVybiBwcmljZTsNCit9DQorDQorDQorc3RhdGljIHZvaWQgUmNUcmVlX0VuY29kZShDUmFuZ2VFbmMgKnJjLCBDTHptYVByb2IgKnByb2JzLCBpbnQgbnVtQml0TGV2ZWxzLCBVSW50MzIgc3ltYm9sKQ0KK3sNCisgIFVJbnQzMiBtID0gMTsNCisgIGludCBpOw0KKyAgZm9yIChpID0gbnVtQml0TGV2ZWxzOyBpICE9IDA7KQ0KKyAgew0KKyAgICBVSW50MzIgYml0Ow0KKyAgICBpLS07DQorICAgIGJpdCA9IChzeW1ib2wgPj4gaSkgJiAxOw0KKyAgICBSYW5nZUVuY19FbmNvZGVCaXQocmMsIHByb2JzICsgbSwgYml0KTsNCisgICAgbSA9IChtIDw8IDEpIHwgYml0Ow0KKyAgfQ0KK30NCisNCitzdGF0aWMgdm9pZCBSY1RyZWVfUmV2ZXJzZUVuY29kZShDUmFuZ2VFbmMgKnJjLCBDTHptYVByb2IgKnByb2JzLCBpbnQgbnVtQml0TGV2ZWxzLCBVSW50MzIgc3ltYm9sKQ0KK3sNCisgIFVJbnQzMiBtID0gMTsNCisgIGludCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bUJpdExldmVsczsgaSsrKQ0KKyAgew0KKyAgICBVSW50MzIgYml0ID0gc3ltYm9sICYgMTsNCisgICAgUmFuZ2VFbmNfRW5jb2RlQml0KHJjLCBwcm9icyArIG0sIGJpdCk7DQorICAgIG0gPSAobSA8PCAxKSB8IGJpdDsNCisgICAgc3ltYm9sID4+PSAxOw0KKyAgfQ0KK30NCisNCitzdGF0aWMgVUludDMyIFJjVHJlZV9HZXRQcmljZShjb25zdCBDTHptYVByb2IgKnByb2JzLCBpbnQgbnVtQml0TGV2ZWxzLCBVSW50MzIgc3ltYm9sLCBVSW50MzIgKlByb2JQcmljZXMpDQorew0KKyAgVUludDMyIHByaWNlID0gMDsNCisgIHN5bWJvbCB8PSAoMSA8PCBudW1CaXRMZXZlbHMpOw0KKyAgd2hpbGUgKHN5bWJvbCAhPSAxKQ0KKyAgew0KKyAgICBwcmljZSArPSBHRVRfUFJJQ0VhKHByb2JzW3N5bWJvbCA+PiAxXSwgc3ltYm9sICYgMSk7DQorICAgIHN5bWJvbCA+Pj0gMTsNCisgIH0NCisgIHJldHVybiBwcmljZTsNCit9DQorDQorc3RhdGljIFVJbnQzMiBSY1RyZWVfUmV2ZXJzZUdldFByaWNlKGNvbnN0IENMem1hUHJvYiAqcHJvYnMsIGludCBudW1CaXRMZXZlbHMsIFVJbnQzMiBzeW1ib2wsIFVJbnQzMiAqUHJvYlByaWNlcykNCit7DQorICBVSW50MzIgcHJpY2UgPSAwOw0KKyAgVUludDMyIG0gPSAxOw0KKyAgaW50IGk7DQorICBmb3IgKGkgPSBudW1CaXRMZXZlbHM7IGkgIT0gMDsgaS0tKQ0KKyAgew0KKyAgICBVSW50MzIgYml0ID0gc3ltYm9sICYgMTsNCisgICAgc3ltYm9sID4+PSAxOw0KKyAgICBwcmljZSArPSBHRVRfUFJJQ0VhKHByb2JzW21dLCBiaXQpOw0KKyAgICBtID0gKG0gPDwgMSkgfCBiaXQ7DQorICB9DQorICByZXR1cm4gcHJpY2U7DQorfQ0KKw0KKw0KK3N0YXRpYyB2b2lkIExlbkVuY19Jbml0KENMZW5FbmMgKnApDQorew0KKyAgdW5zaWduZWQgaTsNCisgIHAtPmNob2ljZSA9IHAtPmNob2ljZTIgPSBrUHJvYkluaXRWYWx1ZTsNCisgIGZvciAoaSA9IDA7IGkgPCAoTFpNQV9OVU1fUEJfU1RBVEVTX01BWCA8PCBrTGVuTnVtTG93Qml0cyk7IGkrKykNCisgICAgcC0+bG93W2ldID0ga1Byb2JJbml0VmFsdWU7DQorICBmb3IgKGkgPSAwOyBpIDwgKExaTUFfTlVNX1BCX1NUQVRFU19NQVggPDwga0xlbk51bU1pZEJpdHMpOyBpKyspDQorICAgIHAtPm1pZFtpXSA9IGtQcm9iSW5pdFZhbHVlOw0KKyAgZm9yIChpID0gMDsgaSA8IGtMZW5OdW1IaWdoU3ltYm9sczsgaSsrKQ0KKyAgICBwLT5oaWdoW2ldID0ga1Byb2JJbml0VmFsdWU7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIExlbkVuY19FbmNvZGUoQ0xlbkVuYyAqcCwgQ1JhbmdlRW5jICpyYywgVUludDMyIHN5bWJvbCwgVUludDMyIHBvc1N0YXRlKQ0KK3sNCisgIGlmIChzeW1ib2wgPCBrTGVuTnVtTG93U3ltYm9scykNCisgIHsNCisgICAgUmFuZ2VFbmNfRW5jb2RlQml0KHJjLCAmcC0+Y2hvaWNlLCAwKTsNCisgICAgUmNUcmVlX0VuY29kZShyYywgcC0+bG93ICsgKHBvc1N0YXRlIDw8IGtMZW5OdW1Mb3dCaXRzKSwga0xlbk51bUxvd0JpdHMsIHN5bWJvbCk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIFJhbmdlRW5jX0VuY29kZUJpdChyYywgJnAtPmNob2ljZSwgMSk7DQorICAgIGlmIChzeW1ib2wgPCBrTGVuTnVtTG93U3ltYm9scyArIGtMZW5OdW1NaWRTeW1ib2xzKQ0KKyAgICB7DQorICAgICAgUmFuZ2VFbmNfRW5jb2RlQml0KHJjLCAmcC0+Y2hvaWNlMiwgMCk7DQorICAgICAgUmNUcmVlX0VuY29kZShyYywgcC0+bWlkICsgKHBvc1N0YXRlIDw8IGtMZW5OdW1NaWRCaXRzKSwga0xlbk51bU1pZEJpdHMsIHN5bWJvbCAtIGtMZW5OdW1Mb3dTeW1ib2xzKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBSYW5nZUVuY19FbmNvZGVCaXQocmMsICZwLT5jaG9pY2UyLCAxKTsNCisgICAgICBSY1RyZWVfRW5jb2RlKHJjLCBwLT5oaWdoLCBrTGVuTnVtSGlnaEJpdHMsIHN5bWJvbCAtIGtMZW5OdW1Mb3dTeW1ib2xzIC0ga0xlbk51bU1pZFN5bWJvbHMpOw0KKyAgICB9DQorICB9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIExlbkVuY19TZXRQcmljZXMoQ0xlbkVuYyAqcCwgVUludDMyIHBvc1N0YXRlLCBVSW50MzIgbnVtU3ltYm9scywgVUludDMyICpwcmljZXMsIFVJbnQzMiAqUHJvYlByaWNlcykNCit7DQorICBVSW50MzIgYTAgPSBHRVRfUFJJQ0VfMGEocC0+Y2hvaWNlKTsNCisgIFVJbnQzMiBhMSA9IEdFVF9QUklDRV8xYShwLT5jaG9pY2UpOw0KKyAgVUludDMyIGIwID0gYTEgKyBHRVRfUFJJQ0VfMGEocC0+Y2hvaWNlMik7DQorICBVSW50MzIgYjEgPSBhMSArIEdFVF9QUklDRV8xYShwLT5jaG9pY2UyKTsNCisgIFVJbnQzMiBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBrTGVuTnVtTG93U3ltYm9sczsgaSsrKQ0KKyAgew0KKyAgICBpZiAoaSA+PSBudW1TeW1ib2xzKQ0KKyAgICAgIHJldHVybjsNCisgICAgcHJpY2VzW2ldID0gYTAgKyBSY1RyZWVfR2V0UHJpY2UocC0+bG93ICsgKHBvc1N0YXRlIDw8IGtMZW5OdW1Mb3dCaXRzKSwga0xlbk51bUxvd0JpdHMsIGksIFByb2JQcmljZXMpOw0KKyAgfQ0KKyAgZm9yICg7IGkgPCBrTGVuTnVtTG93U3ltYm9scyArIGtMZW5OdW1NaWRTeW1ib2xzOyBpKyspDQorICB7DQorICAgIGlmIChpID49IG51bVN5bWJvbHMpDQorICAgICAgcmV0dXJuOw0KKyAgICBwcmljZXNbaV0gPSBiMCArIFJjVHJlZV9HZXRQcmljZShwLT5taWQgKyAocG9zU3RhdGUgPDwga0xlbk51bU1pZEJpdHMpLCBrTGVuTnVtTWlkQml0cywgaSAtIGtMZW5OdW1Mb3dTeW1ib2xzLCBQcm9iUHJpY2VzKTsNCisgIH0NCisgIGZvciAoOyBpIDwgbnVtU3ltYm9sczsgaSsrKQ0KKyAgICBwcmljZXNbaV0gPSBiMSArIFJjVHJlZV9HZXRQcmljZShwLT5oaWdoLCBrTGVuTnVtSGlnaEJpdHMsIGkgLSBrTGVuTnVtTG93U3ltYm9scyAtIGtMZW5OdW1NaWRTeW1ib2xzLCBQcm9iUHJpY2VzKTsNCit9DQorDQorc3RhdGljIHZvaWQgTVlfRkFTVF9DQUxMIExlblByaWNlRW5jX1VwZGF0ZVRhYmxlKENMZW5QcmljZUVuYyAqcCwgVUludDMyIHBvc1N0YXRlLCBVSW50MzIgKlByb2JQcmljZXMpDQorew0KKyAgTGVuRW5jX1NldFByaWNlcygmcC0+cCwgcG9zU3RhdGUsIHAtPnRhYmxlU2l6ZSwgcC0+cHJpY2VzW3Bvc1N0YXRlXSwgUHJvYlByaWNlcyk7DQorICBwLT5jb3VudGVyc1twb3NTdGF0ZV0gPSBwLT50YWJsZVNpemU7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIExlblByaWNlRW5jX1VwZGF0ZVRhYmxlcyhDTGVuUHJpY2VFbmMgKnAsIFVJbnQzMiBudW1Qb3NTdGF0ZXMsIFVJbnQzMiAqUHJvYlByaWNlcykNCit7DQorICBVSW50MzIgcG9zU3RhdGU7DQorICBmb3IgKHBvc1N0YXRlID0gMDsgcG9zU3RhdGUgPCBudW1Qb3NTdGF0ZXM7IHBvc1N0YXRlKyspDQorICAgIExlblByaWNlRW5jX1VwZGF0ZVRhYmxlKHAsIHBvc1N0YXRlLCBQcm9iUHJpY2VzKTsNCit9DQorDQorc3RhdGljIHZvaWQgTGVuRW5jX0VuY29kZTIoQ0xlblByaWNlRW5jICpwLCBDUmFuZ2VFbmMgKnJjLCBVSW50MzIgc3ltYm9sLCBVSW50MzIgcG9zU3RhdGUsIEJvb2wgdXBkYXRlUHJpY2UsIFVJbnQzMiAqUHJvYlByaWNlcykNCit7DQorICBMZW5FbmNfRW5jb2RlKCZwLT5wLCByYywgc3ltYm9sLCBwb3NTdGF0ZSk7DQorICBpZiAodXBkYXRlUHJpY2UpDQorICAgIGlmICgtLXAtPmNvdW50ZXJzW3Bvc1N0YXRlXSA9PSAwKQ0KKyAgICAgIExlblByaWNlRW5jX1VwZGF0ZVRhYmxlKHAsIHBvc1N0YXRlLCBQcm9iUHJpY2VzKTsNCit9DQorDQorDQorDQorDQorc3RhdGljIHZvaWQgTW92ZVBvcyhDTHptYUVuYyAqcCwgVUludDMyIG51bSkNCit7DQorICAjaWZkZWYgU0hPV19TVEFUDQorICBnX1NUQVRfT0ZGU0VUICs9IG51bTsNCisgIHByaW50ZigiXG4gTW92ZVBvcyAlZCIsIG51bSk7DQorICAjZW5kaWYNCisgIA0KKyAgaWYgKG51bSAhPSAwKQ0KKyAgew0KKyAgICBwLT5hZGRpdGlvbmFsT2Zmc2V0ICs9IG51bTsNCisgICAgcC0+bWF0Y2hGaW5kZXIuU2tpcChwLT5tYXRjaEZpbmRlck9iaiwgbnVtKTsNCisgIH0NCit9DQorDQorc3RhdGljIFVJbnQzMiBSZWFkTWF0Y2hEaXN0YW5jZXMoQ0x6bWFFbmMgKnAsIFVJbnQzMiAqbnVtRGlzdGFuY2VQYWlyc1JlcykNCit7DQorICBVSW50MzIgbGVuUmVzID0gMCwgbnVtUGFpcnM7DQorICBwLT5udW1BdmFpbCA9IHAtPm1hdGNoRmluZGVyLkdldE51bUF2YWlsYWJsZUJ5dGVzKHAtPm1hdGNoRmluZGVyT2JqKTsNCisgIG51bVBhaXJzID0gcC0+bWF0Y2hGaW5kZXIuR2V0TWF0Y2hlcyhwLT5tYXRjaEZpbmRlck9iaiwgcC0+bWF0Y2hlcyk7DQorICANCisgICNpZmRlZiBTSE9XX1NUQVQNCisgIHByaW50ZigiXG4gaSA9ICVkIG51bVBhaXJzID0gJWQgICAgIiwgZ19TVEFUX09GRlNFVCwgbnVtUGFpcnMgLyAyKTsNCisgIGdfU1RBVF9PRkZTRVQrKzsNCisgIHsNCisgICAgVUludDMyIGk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1QYWlyczsgaSArPSAyKQ0KKyAgICAgIHByaW50ZigiJTJkICU2ZCAgIHwgIiwgcC0+bWF0Y2hlc1tpXSwgcC0+bWF0Y2hlc1tpICsgMV0pOw0KKyAgfQ0KKyAgI2VuZGlmDQorICANCisgIGlmIChudW1QYWlycyA+IDApDQorICB7DQorICAgIGxlblJlcyA9IHAtPm1hdGNoZXNbbnVtUGFpcnMgLSAyXTsNCisgICAgaWYgKGxlblJlcyA9PSBwLT5udW1GYXN0Qnl0ZXMpDQorICAgIHsNCisgICAgICBjb25zdCBCeXRlICpwYnkgPSBwLT5tYXRjaEZpbmRlci5HZXRQb2ludGVyVG9DdXJyZW50UG9zKHAtPm1hdGNoRmluZGVyT2JqKSAtIDE7DQorICAgICAgVUludDMyIGRpc3RhbmNlID0gcC0+bWF0Y2hlc1tudW1QYWlycyAtIDFdICsgMTsNCisgICAgICBVSW50MzIgbnVtQXZhaWwgPSBwLT5udW1BdmFpbDsNCisgICAgICBpZiAobnVtQXZhaWwgPiBMWk1BX01BVENIX0xFTl9NQVgpDQorICAgICAgICBudW1BdmFpbCA9IExaTUFfTUFUQ0hfTEVOX01BWDsNCisgICAgICB7DQorICAgICAgICBjb25zdCBCeXRlICpwYnkyID0gcGJ5IC0gZGlzdGFuY2U7DQorICAgICAgICBmb3IgKDsgbGVuUmVzIDwgbnVtQXZhaWwgJiYgcGJ5W2xlblJlc10gPT0gcGJ5MltsZW5SZXNdOyBsZW5SZXMrKyk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBwLT5hZGRpdGlvbmFsT2Zmc2V0Kys7DQorICAqbnVtRGlzdGFuY2VQYWlyc1JlcyA9IG51bVBhaXJzOw0KKyAgcmV0dXJuIGxlblJlczsNCit9DQorDQorDQorI2RlZmluZSBNYWtlQXNDaGFyKHApIChwKS0+YmFja1ByZXYgPSAoVUludDMyKSgtMSk7IChwKS0+cHJldjFJc0NoYXIgPSBGYWxzZTsNCisjZGVmaW5lIE1ha2VBc1Nob3J0UmVwKHApIChwKS0+YmFja1ByZXYgPSAwOyAocCktPnByZXYxSXNDaGFyID0gRmFsc2U7DQorI2RlZmluZSBJc1Nob3J0UmVwKHApICgocCktPmJhY2tQcmV2ID09IDApDQorDQorc3RhdGljIFVJbnQzMiBHZXRSZXBMZW4xUHJpY2UoQ0x6bWFFbmMgKnAsIFVJbnQzMiBzdGF0ZSwgVUludDMyIHBvc1N0YXRlKQ0KK3sNCisgIHJldHVybg0KKyAgICBHRVRfUFJJQ0VfMChwLT5pc1JlcEcwW3N0YXRlXSkgKw0KKyAgICBHRVRfUFJJQ0VfMChwLT5pc1JlcDBMb25nW3N0YXRlXVtwb3NTdGF0ZV0pOw0KK30NCisNCitzdGF0aWMgVUludDMyIEdldFB1cmVSZXBQcmljZShDTHptYUVuYyAqcCwgVUludDMyIHJlcEluZGV4LCBVSW50MzIgc3RhdGUsIFVJbnQzMiBwb3NTdGF0ZSkNCit7DQorICBVSW50MzIgcHJpY2U7DQorICBpZiAocmVwSW5kZXggPT0gMCkNCisgIHsNCisgICAgcHJpY2UgPSBHRVRfUFJJQ0VfMChwLT5pc1JlcEcwW3N0YXRlXSk7DQorICAgIHByaWNlICs9IEdFVF9QUklDRV8xKHAtPmlzUmVwMExvbmdbc3RhdGVdW3Bvc1N0YXRlXSk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIHByaWNlID0gR0VUX1BSSUNFXzEocC0+aXNSZXBHMFtzdGF0ZV0pOw0KKyAgICBpZiAocmVwSW5kZXggPT0gMSkNCisgICAgICBwcmljZSArPSBHRVRfUFJJQ0VfMChwLT5pc1JlcEcxW3N0YXRlXSk7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIHByaWNlICs9IEdFVF9QUklDRV8xKHAtPmlzUmVwRzFbc3RhdGVdKTsNCisgICAgICBwcmljZSArPSBHRVRfUFJJQ0UocC0+aXNSZXBHMltzdGF0ZV0sIHJlcEluZGV4IC0gMik7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBwcmljZTsNCit9DQorDQorc3RhdGljIFVJbnQzMiBHZXRSZXBQcmljZShDTHptYUVuYyAqcCwgVUludDMyIHJlcEluZGV4LCBVSW50MzIgbGVuLCBVSW50MzIgc3RhdGUsIFVJbnQzMiBwb3NTdGF0ZSkNCit7DQorICByZXR1cm4gcC0+cmVwTGVuRW5jLnByaWNlc1twb3NTdGF0ZV1bbGVuIC0gTFpNQV9NQVRDSF9MRU5fTUlOXSArDQorICAgIEdldFB1cmVSZXBQcmljZShwLCByZXBJbmRleCwgc3RhdGUsIHBvc1N0YXRlKTsNCit9DQorDQorc3RhdGljIFVJbnQzMiBCYWNrd2FyZChDTHptYUVuYyAqcCwgVUludDMyICpiYWNrUmVzLCBVSW50MzIgY3VyKQ0KK3sNCisgIFVJbnQzMiBwb3NNZW0gPSBwLT5vcHRbY3VyXS5wb3NQcmV2Ow0KKyAgVUludDMyIGJhY2tNZW0gPSBwLT5vcHRbY3VyXS5iYWNrUHJldjsNCisgIHAtPm9wdGltdW1FbmRJbmRleCA9IGN1cjsNCisgIGRvDQorICB7DQorICAgIGlmIChwLT5vcHRbY3VyXS5wcmV2MUlzQ2hhcikNCisgICAgew0KKyAgICAgIE1ha2VBc0NoYXIoJnAtPm9wdFtwb3NNZW1dKQ0KKyAgICAgIHAtPm9wdFtwb3NNZW1dLnBvc1ByZXYgPSBwb3NNZW0gLSAxOw0KKyAgICAgIGlmIChwLT5vcHRbY3VyXS5wcmV2MikNCisgICAgICB7DQorICAgICAgICBwLT5vcHRbcG9zTWVtIC0gMV0ucHJldjFJc0NoYXIgPSBGYWxzZTsNCisgICAgICAgIHAtPm9wdFtwb3NNZW0gLSAxXS5wb3NQcmV2ID0gcC0+b3B0W2N1cl0ucG9zUHJldjI7DQorICAgICAgICBwLT5vcHRbcG9zTWVtIC0gMV0uYmFja1ByZXYgPSBwLT5vcHRbY3VyXS5iYWNrUHJldjI7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHsNCisgICAgICBVSW50MzIgcG9zUHJldiA9IHBvc01lbTsNCisgICAgICBVSW50MzIgYmFja0N1ciA9IGJhY2tNZW07DQorICAgICAgDQorICAgICAgYmFja01lbSA9IHAtPm9wdFtwb3NQcmV2XS5iYWNrUHJldjsNCisgICAgICBwb3NNZW0gPSBwLT5vcHRbcG9zUHJldl0ucG9zUHJldjsNCisgICAgICANCisgICAgICBwLT5vcHRbcG9zUHJldl0uYmFja1ByZXYgPSBiYWNrQ3VyOw0KKyAgICAgIHAtPm9wdFtwb3NQcmV2XS5wb3NQcmV2ID0gY3VyOw0KKyAgICAgIGN1ciA9IHBvc1ByZXY7DQorICAgIH0NCisgIH0NCisgIHdoaWxlIChjdXIgIT0gMCk7DQorICAqYmFja1JlcyA9IHAtPm9wdFswXS5iYWNrUHJldjsNCisgIHAtPm9wdGltdW1DdXJyZW50SW5kZXggID0gcC0+b3B0WzBdLnBvc1ByZXY7DQorICByZXR1cm4gcC0+b3B0aW11bUN1cnJlbnRJbmRleDsNCit9DQorDQorI2RlZmluZSBMSVRfUFJPQlMocG9zLCBwcmV2Qnl0ZSkgKHAtPmxpdFByb2JzICsgKCgoKHBvcykgJiBwLT5scE1hc2spIDw8IHAtPmxjKSArICgocHJldkJ5dGUpID4+ICg4IC0gcC0+bGMpKSkgKiAweDMwMCkNCisNCitzdGF0aWMgVUludDMyIEdldE9wdGltdW0oQ0x6bWFFbmMgKnAsIFVJbnQzMiBwb3NpdGlvbiwgVUludDMyICpiYWNrUmVzKQ0KK3sNCisgIFVJbnQzMiBudW1BdmFpbCwgbWFpbkxlbiwgbnVtUGFpcnMsIHJlcE1heEluZGV4LCBpLCBwb3NTdGF0ZSwgbGVuRW5kLCBsZW4sIGN1cjsNCisgIFVJbnQzMiBtYXRjaFByaWNlLCByZXBNYXRjaFByaWNlLCBub3JtYWxNYXRjaFByaWNlOw0KKyAgVUludDMyIHJlcHNbTFpNQV9OVU1fUkVQU10sIHJlcExlbnNbTFpNQV9OVU1fUkVQU107DQorICBVSW50MzIgKm1hdGNoZXM7DQorICBjb25zdCBCeXRlICpkYXRhOw0KKyAgQnl0ZSBjdXJCeXRlLCBtYXRjaEJ5dGU7DQorICBpZiAocC0+b3B0aW11bUVuZEluZGV4ICE9IHAtPm9wdGltdW1DdXJyZW50SW5kZXgpDQorICB7DQorICAgIGNvbnN0IENPcHRpbWFsICpvcHQgPSAmcC0+b3B0W3AtPm9wdGltdW1DdXJyZW50SW5kZXhdOw0KKyAgICBVSW50MzIgbGVuUmVzID0gb3B0LT5wb3NQcmV2IC0gcC0+b3B0aW11bUN1cnJlbnRJbmRleDsNCisgICAgKmJhY2tSZXMgPSBvcHQtPmJhY2tQcmV2Ow0KKyAgICBwLT5vcHRpbXVtQ3VycmVudEluZGV4ID0gb3B0LT5wb3NQcmV2Ow0KKyAgICByZXR1cm4gbGVuUmVzOw0KKyAgfQ0KKyAgcC0+b3B0aW11bUN1cnJlbnRJbmRleCA9IHAtPm9wdGltdW1FbmRJbmRleCA9IDA7DQorICANCisgIGlmIChwLT5hZGRpdGlvbmFsT2Zmc2V0ID09IDApDQorICAgIG1haW5MZW4gPSBSZWFkTWF0Y2hEaXN0YW5jZXMocCwgJm51bVBhaXJzKTsNCisgIGVsc2UNCisgIHsNCisgICAgbWFpbkxlbiA9IHAtPmxvbmdlc3RNYXRjaExlbmd0aDsNCisgICAgbnVtUGFpcnMgPSBwLT5udW1QYWlyczsNCisgIH0NCisNCisgIG51bUF2YWlsID0gcC0+bnVtQXZhaWw7DQorICBpZiAobnVtQXZhaWwgPCAyKQ0KKyAgew0KKyAgICAqYmFja1JlcyA9IChVSW50MzIpKC0xKTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBpZiAobnVtQXZhaWwgPiBMWk1BX01BVENIX0xFTl9NQVgpDQorICAgIG51bUF2YWlsID0gTFpNQV9NQVRDSF9MRU5fTUFYOw0KKw0KKyAgZGF0YSA9IHAtPm1hdGNoRmluZGVyLkdldFBvaW50ZXJUb0N1cnJlbnRQb3MocC0+bWF0Y2hGaW5kZXJPYmopIC0gMTsNCisgIHJlcE1heEluZGV4ID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBMWk1BX05VTV9SRVBTOyBpKyspDQorICB7DQorICAgIFVJbnQzMiBsZW5UZXN0Ow0KKyAgICBjb25zdCBCeXRlICpkYXRhMjsNCisgICAgcmVwc1tpXSA9IHAtPnJlcHNbaV07DQorICAgIGRhdGEyID0gZGF0YSAtIChyZXBzW2ldICsgMSk7DQorICAgIGlmIChkYXRhWzBdICE9IGRhdGEyWzBdIHx8IGRhdGFbMV0gIT0gZGF0YTJbMV0pDQorICAgIHsNCisgICAgICByZXBMZW5zW2ldID0gMDsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBmb3IgKGxlblRlc3QgPSAyOyBsZW5UZXN0IDwgbnVtQXZhaWwgJiYgZGF0YVtsZW5UZXN0XSA9PSBkYXRhMltsZW5UZXN0XTsgbGVuVGVzdCsrKTsNCisgICAgcmVwTGVuc1tpXSA9IGxlblRlc3Q7DQorICAgIGlmIChsZW5UZXN0ID4gcmVwTGVuc1tyZXBNYXhJbmRleF0pDQorICAgICAgcmVwTWF4SW5kZXggPSBpOw0KKyAgfQ0KKyAgaWYgKHJlcExlbnNbcmVwTWF4SW5kZXhdID49IHAtPm51bUZhc3RCeXRlcykNCisgIHsNCisgICAgVUludDMyIGxlblJlczsNCisgICAgKmJhY2tSZXMgPSByZXBNYXhJbmRleDsNCisgICAgbGVuUmVzID0gcmVwTGVuc1tyZXBNYXhJbmRleF07DQorICAgIE1vdmVQb3MocCwgbGVuUmVzIC0gMSk7DQorICAgIHJldHVybiBsZW5SZXM7DQorICB9DQorDQorICBtYXRjaGVzID0gcC0+bWF0Y2hlczsNCisgIGlmIChtYWluTGVuID49IHAtPm51bUZhc3RCeXRlcykNCisgIHsNCisgICAgKmJhY2tSZXMgPSBtYXRjaGVzW251bVBhaXJzIC0gMV0gKyBMWk1BX05VTV9SRVBTOw0KKyAgICBNb3ZlUG9zKHAsIG1haW5MZW4gLSAxKTsNCisgICAgcmV0dXJuIG1haW5MZW47DQorICB9DQorICBjdXJCeXRlID0gKmRhdGE7DQorICBtYXRjaEJ5dGUgPSAqKGRhdGEgLSAocmVwc1swXSArIDEpKTsNCisNCisgIGlmIChtYWluTGVuIDwgMiAmJiBjdXJCeXRlICE9IG1hdGNoQnl0ZSAmJiByZXBMZW5zW3JlcE1heEluZGV4XSA8IDIpDQorICB7DQorICAgICpiYWNrUmVzID0gKFVJbnQzMiktMTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorDQorICBwLT5vcHRbMF0uc3RhdGUgPSAoQ1N0YXRlKXAtPnN0YXRlOw0KKw0KKyAgcG9zU3RhdGUgPSAocG9zaXRpb24gJiBwLT5wYk1hc2spOw0KKw0KKyAgew0KKyAgICBjb25zdCBDTHptYVByb2IgKnByb2JzID0gTElUX1BST0JTKHBvc2l0aW9uLCAqKGRhdGEgLSAxKSk7DQorICAgIHAtPm9wdFsxXS5wcmljZSA9IEdFVF9QUklDRV8wKHAtPmlzTWF0Y2hbcC0+c3RhdGVdW3Bvc1N0YXRlXSkgKw0KKyAgICAgICAgKCFJc0NoYXJTdGF0ZShwLT5zdGF0ZSkgPw0KKyAgICAgICAgICBMaXRFbmNfR2V0UHJpY2VNYXRjaGVkKHByb2JzLCBjdXJCeXRlLCBtYXRjaEJ5dGUsIHAtPlByb2JQcmljZXMpIDoNCisgICAgICAgICAgTGl0RW5jX0dldFByaWNlKHByb2JzLCBjdXJCeXRlLCBwLT5Qcm9iUHJpY2VzKSk7DQorICB9DQorDQorICBNYWtlQXNDaGFyKCZwLT5vcHRbMV0pOw0KKw0KKyAgbWF0Y2hQcmljZSA9IEdFVF9QUklDRV8xKHAtPmlzTWF0Y2hbcC0+c3RhdGVdW3Bvc1N0YXRlXSk7DQorICByZXBNYXRjaFByaWNlID0gbWF0Y2hQcmljZSArIEdFVF9QUklDRV8xKHAtPmlzUmVwW3AtPnN0YXRlXSk7DQorDQorICBpZiAobWF0Y2hCeXRlID09IGN1ckJ5dGUpDQorICB7DQorICAgIFVJbnQzMiBzaG9ydFJlcFByaWNlID0gcmVwTWF0Y2hQcmljZSArIEdldFJlcExlbjFQcmljZShwLCBwLT5zdGF0ZSwgcG9zU3RhdGUpOw0KKyAgICBpZiAoc2hvcnRSZXBQcmljZSA8IHAtPm9wdFsxXS5wcmljZSkNCisgICAgew0KKyAgICAgIHAtPm9wdFsxXS5wcmljZSA9IHNob3J0UmVwUHJpY2U7DQorICAgICAgTWFrZUFzU2hvcnRSZXAoJnAtPm9wdFsxXSk7DQorICAgIH0NCisgIH0NCisgIGxlbkVuZCA9ICgobWFpbkxlbiA+PSByZXBMZW5zW3JlcE1heEluZGV4XSkgPyBtYWluTGVuIDogcmVwTGVuc1tyZXBNYXhJbmRleF0pOw0KKw0KKyAgaWYgKGxlbkVuZCA8IDIpDQorICB7DQorICAgICpiYWNrUmVzID0gcC0+b3B0WzFdLmJhY2tQcmV2Ow0KKyAgICByZXR1cm4gMTsNCisgIH0NCisNCisgIHAtPm9wdFsxXS5wb3NQcmV2ID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBMWk1BX05VTV9SRVBTOyBpKyspDQorICAgIHAtPm9wdFswXS5iYWNrc1tpXSA9IHJlcHNbaV07DQorDQorICBsZW4gPSBsZW5FbmQ7DQorICBkbw0KKyAgICBwLT5vcHRbbGVuLS1dLnByaWNlID0ga0luZmluaXR5UHJpY2U7DQorICB3aGlsZSAobGVuID49IDIpOw0KKw0KKyAgZm9yIChpID0gMDsgaSA8IExaTUFfTlVNX1JFUFM7IGkrKykNCisgIHsNCisgICAgVUludDMyIHJlcExlbiA9IHJlcExlbnNbaV07DQorICAgIFVJbnQzMiBwcmljZTsNCisgICAgaWYgKHJlcExlbiA8IDIpDQorICAgICAgY29udGludWU7DQorICAgIHByaWNlID0gcmVwTWF0Y2hQcmljZSArIEdldFB1cmVSZXBQcmljZShwLCBpLCBwLT5zdGF0ZSwgcG9zU3RhdGUpOw0KKyAgICBkbw0KKyAgICB7DQorICAgICAgVUludDMyIGN1ckFuZExlblByaWNlID0gcHJpY2UgKyBwLT5yZXBMZW5FbmMucHJpY2VzW3Bvc1N0YXRlXVtyZXBMZW4gLSAyXTsNCisgICAgICBDT3B0aW1hbCAqb3B0ID0gJnAtPm9wdFtyZXBMZW5dOw0KKyAgICAgIGlmIChjdXJBbmRMZW5QcmljZSA8IG9wdC0+cHJpY2UpDQorICAgICAgew0KKyAgICAgICAgb3B0LT5wcmljZSA9IGN1ckFuZExlblByaWNlOw0KKyAgICAgICAgb3B0LT5wb3NQcmV2ID0gMDsNCisgICAgICAgIG9wdC0+YmFja1ByZXYgPSBpOw0KKyAgICAgICAgb3B0LT5wcmV2MUlzQ2hhciA9IEZhbHNlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICB3aGlsZSAoLS1yZXBMZW4gPj0gMik7DQorICB9DQorDQorICBub3JtYWxNYXRjaFByaWNlID0gbWF0Y2hQcmljZSArIEdFVF9QUklDRV8wKHAtPmlzUmVwW3AtPnN0YXRlXSk7DQorDQorICBsZW4gPSAoKHJlcExlbnNbMF0gPj0gMikgPyByZXBMZW5zWzBdICsgMSA6IDIpOw0KKyAgaWYgKGxlbiA8PSBtYWluTGVuKQ0KKyAgew0KKyAgICBVSW50MzIgb2ZmcyA9IDA7DQorICAgIHdoaWxlIChsZW4gPiBtYXRjaGVzW29mZnNdKQ0KKyAgICAgIG9mZnMgKz0gMjsNCisgICAgZm9yICg7IDsgbGVuKyspDQorICAgIHsNCisgICAgICBDT3B0aW1hbCAqb3B0Ow0KKyAgICAgIFVJbnQzMiBkaXN0YW5jZSA9IG1hdGNoZXNbb2ZmcyArIDFdOw0KKw0KKyAgICAgIFVJbnQzMiBjdXJBbmRMZW5QcmljZSA9IG5vcm1hbE1hdGNoUHJpY2UgKyBwLT5sZW5FbmMucHJpY2VzW3Bvc1N0YXRlXVtsZW4gLSBMWk1BX01BVENIX0xFTl9NSU5dOw0KKyAgICAgIFVJbnQzMiBsZW5Ub1Bvc1N0YXRlID0gR2V0TGVuVG9Qb3NTdGF0ZShsZW4pOw0KKyAgICAgIGlmIChkaXN0YW5jZSA8IGtOdW1GdWxsRGlzdGFuY2VzKQ0KKyAgICAgICAgY3VyQW5kTGVuUHJpY2UgKz0gcC0+ZGlzdGFuY2VzUHJpY2VzW2xlblRvUG9zU3RhdGVdW2Rpc3RhbmNlXTsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgVUludDMyIHNsb3Q7DQorICAgICAgICBHZXRQb3NTbG90MihkaXN0YW5jZSwgc2xvdCk7DQorICAgICAgICBjdXJBbmRMZW5QcmljZSArPSBwLT5hbGlnblByaWNlc1tkaXN0YW5jZSAmIGtBbGlnbk1hc2tdICsgcC0+cG9zU2xvdFByaWNlc1tsZW5Ub1Bvc1N0YXRlXVtzbG90XTsNCisgICAgICB9DQorICAgICAgb3B0ID0gJnAtPm9wdFtsZW5dOw0KKyAgICAgIGlmIChjdXJBbmRMZW5QcmljZSA8IG9wdC0+cHJpY2UpDQorICAgICAgew0KKyAgICAgICAgb3B0LT5wcmljZSA9IGN1ckFuZExlblByaWNlOw0KKyAgICAgICAgb3B0LT5wb3NQcmV2ID0gMDsNCisgICAgICAgIG9wdC0+YmFja1ByZXYgPSBkaXN0YW5jZSArIExaTUFfTlVNX1JFUFM7DQorICAgICAgICBvcHQtPnByZXYxSXNDaGFyID0gRmFsc2U7DQorICAgICAgfQ0KKyAgICAgIGlmIChsZW4gPT0gbWF0Y2hlc1tvZmZzXSkNCisgICAgICB7DQorICAgICAgICBvZmZzICs9IDI7DQorICAgICAgICBpZiAob2ZmcyA9PSBudW1QYWlycykNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBjdXIgPSAwOw0KKw0KKyAgICAjaWZkZWYgU0hPV19TVEFUMg0KKyAgICBpZiAocG9zaXRpb24gPj0gMCkNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIGk7DQorICAgICAgcHJpbnRmKCJcbiBwb3MgPSAlNFgiLCBwb3NpdGlvbik7DQorICAgICAgZm9yIChpID0gY3VyOyBpIDw9IGxlbkVuZDsgaSsrKQ0KKyAgICAgIHByaW50ZigiXG5wcmljZVslNFhdID0gJWQiLCBwb3NpdGlvbiAtIGN1ciArIGksIHAtPm9wdFtpXS5wcmljZSk7DQorICAgIH0NCisgICAgI2VuZGlmDQorDQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBVSW50MzIgbnVtQXZhaWxGdWxsLCBuZXdMZW4sIG51bVBhaXJzLCBwb3NQcmV2LCBzdGF0ZSwgcG9zU3RhdGUsIHN0YXJ0TGVuOw0KKyAgICBVSW50MzIgY3VyUHJpY2UsIGN1ckFuZDFQcmljZSwgbWF0Y2hQcmljZSwgcmVwTWF0Y2hQcmljZTsNCisgICAgQm9vbCBuZXh0SXNDaGFyOw0KKyAgICBCeXRlIGN1ckJ5dGUsIG1hdGNoQnl0ZTsNCisgICAgY29uc3QgQnl0ZSAqZGF0YTsNCisgICAgQ09wdGltYWwgKmN1ck9wdDsNCisgICAgQ09wdGltYWwgKm5leHRPcHQ7DQorDQorICAgIGN1cisrOw0KKyAgICBpZiAoY3VyID09IGxlbkVuZCkNCisgICAgICByZXR1cm4gQmFja3dhcmQocCwgYmFja1JlcywgY3VyKTsNCisNCisgICAgbmV3TGVuID0gUmVhZE1hdGNoRGlzdGFuY2VzKHAsICZudW1QYWlycyk7DQorICAgIGlmIChuZXdMZW4gPj0gcC0+bnVtRmFzdEJ5dGVzKQ0KKyAgICB7DQorICAgICAgcC0+bnVtUGFpcnMgPSBudW1QYWlyczsNCisgICAgICBwLT5sb25nZXN0TWF0Y2hMZW5ndGggPSBuZXdMZW47DQorICAgICAgcmV0dXJuIEJhY2t3YXJkKHAsIGJhY2tSZXMsIGN1cik7DQorICAgIH0NCisgICAgcG9zaXRpb24rKzsNCisgICAgY3VyT3B0ID0gJnAtPm9wdFtjdXJdOw0KKyAgICBwb3NQcmV2ID0gY3VyT3B0LT5wb3NQcmV2Ow0KKyAgICBpZiAoY3VyT3B0LT5wcmV2MUlzQ2hhcikNCisgICAgew0KKyAgICAgIHBvc1ByZXYtLTsNCisgICAgICBpZiAoY3VyT3B0LT5wcmV2MikNCisgICAgICB7DQorICAgICAgICBzdGF0ZSA9IHAtPm9wdFtjdXJPcHQtPnBvc1ByZXYyXS5zdGF0ZTsNCisgICAgICAgIGlmIChjdXJPcHQtPmJhY2tQcmV2MiA8IExaTUFfTlVNX1JFUFMpDQorICAgICAgICAgIHN0YXRlID0ga1JlcE5leHRTdGF0ZXNbc3RhdGVdOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICBzdGF0ZSA9IGtNYXRjaE5leHRTdGF0ZXNbc3RhdGVdOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgICBzdGF0ZSA9IHAtPm9wdFtwb3NQcmV2XS5zdGF0ZTsNCisgICAgICBzdGF0ZSA9IGtMaXRlcmFsTmV4dFN0YXRlc1tzdGF0ZV07DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAgIHN0YXRlID0gcC0+b3B0W3Bvc1ByZXZdLnN0YXRlOw0KKyAgICBpZiAocG9zUHJldiA9PSBjdXIgLSAxKQ0KKyAgICB7DQorICAgICAgaWYgKElzU2hvcnRSZXAoY3VyT3B0KSkNCisgICAgICAgIHN0YXRlID0ga1Nob3J0UmVwTmV4dFN0YXRlc1tzdGF0ZV07DQorICAgICAgZWxzZQ0KKyAgICAgICAgc3RhdGUgPSBrTGl0ZXJhbE5leHRTdGF0ZXNbc3RhdGVdOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIFVJbnQzMiBwb3M7DQorICAgICAgY29uc3QgQ09wdGltYWwgKnByZXZPcHQ7DQorICAgICAgaWYgKGN1ck9wdC0+cHJldjFJc0NoYXIgJiYgY3VyT3B0LT5wcmV2MikNCisgICAgICB7DQorICAgICAgICBwb3NQcmV2ID0gY3VyT3B0LT5wb3NQcmV2MjsNCisgICAgICAgIHBvcyA9IGN1ck9wdC0+YmFja1ByZXYyOw0KKyAgICAgICAgc3RhdGUgPSBrUmVwTmV4dFN0YXRlc1tzdGF0ZV07DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBwb3MgPSBjdXJPcHQtPmJhY2tQcmV2Ow0KKyAgICAgICAgaWYgKHBvcyA8IExaTUFfTlVNX1JFUFMpDQorICAgICAgICAgIHN0YXRlID0ga1JlcE5leHRTdGF0ZXNbc3RhdGVdOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICBzdGF0ZSA9IGtNYXRjaE5leHRTdGF0ZXNbc3RhdGVdOw0KKyAgICAgIH0NCisgICAgICBwcmV2T3B0ID0gJnAtPm9wdFtwb3NQcmV2XTsNCisgICAgICBpZiAocG9zIDwgTFpNQV9OVU1fUkVQUykNCisgICAgICB7DQorICAgICAgICBVSW50MzIgaTsNCisgICAgICAgIHJlcHNbMF0gPSBwcmV2T3B0LT5iYWNrc1twb3NdOw0KKyAgICAgICAgZm9yIChpID0gMTsgaSA8PSBwb3M7IGkrKykNCisgICAgICAgICAgcmVwc1tpXSA9IHByZXZPcHQtPmJhY2tzW2kgLSAxXTsNCisgICAgICAgIGZvciAoOyBpIDwgTFpNQV9OVU1fUkVQUzsgaSsrKQ0KKyAgICAgICAgICByZXBzW2ldID0gcHJldk9wdC0+YmFja3NbaV07DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBVSW50MzIgaTsNCisgICAgICAgIHJlcHNbMF0gPSAocG9zIC0gTFpNQV9OVU1fUkVQUyk7DQorICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTFpNQV9OVU1fUkVQUzsgaSsrKQ0KKyAgICAgICAgICByZXBzW2ldID0gcHJldk9wdC0+YmFja3NbaSAtIDFdOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBjdXJPcHQtPnN0YXRlID0gKENTdGF0ZSlzdGF0ZTsNCisNCisgICAgY3VyT3B0LT5iYWNrc1swXSA9IHJlcHNbMF07DQorICAgIGN1ck9wdC0+YmFja3NbMV0gPSByZXBzWzFdOw0KKyAgICBjdXJPcHQtPmJhY2tzWzJdID0gcmVwc1syXTsNCisgICAgY3VyT3B0LT5iYWNrc1szXSA9IHJlcHNbM107DQorDQorICAgIGN1clByaWNlID0gY3VyT3B0LT5wcmljZTsNCisgICAgbmV4dElzQ2hhciA9IEZhbHNlOw0KKyAgICBkYXRhID0gcC0+bWF0Y2hGaW5kZXIuR2V0UG9pbnRlclRvQ3VycmVudFBvcyhwLT5tYXRjaEZpbmRlck9iaikgLSAxOw0KKyAgICBjdXJCeXRlID0gKmRhdGE7DQorICAgIG1hdGNoQnl0ZSA9ICooZGF0YSAtIChyZXBzWzBdICsgMSkpOw0KKw0KKyAgICBwb3NTdGF0ZSA9IChwb3NpdGlvbiAmIHAtPnBiTWFzayk7DQorDQorICAgIGN1ckFuZDFQcmljZSA9IGN1clByaWNlICsgR0VUX1BSSUNFXzAocC0+aXNNYXRjaFtzdGF0ZV1bcG9zU3RhdGVdKTsNCisgICAgew0KKyAgICAgIGNvbnN0IENMem1hUHJvYiAqcHJvYnMgPSBMSVRfUFJPQlMocG9zaXRpb24sICooZGF0YSAtIDEpKTsNCisgICAgICBjdXJBbmQxUHJpY2UgKz0NCisgICAgICAgICghSXNDaGFyU3RhdGUoc3RhdGUpID8NCisgICAgICAgICAgTGl0RW5jX0dldFByaWNlTWF0Y2hlZChwcm9icywgY3VyQnl0ZSwgbWF0Y2hCeXRlLCBwLT5Qcm9iUHJpY2VzKSA6DQorICAgICAgICAgIExpdEVuY19HZXRQcmljZShwcm9icywgY3VyQnl0ZSwgcC0+UHJvYlByaWNlcykpOw0KKyAgICB9DQorDQorICAgIG5leHRPcHQgPSAmcC0+b3B0W2N1ciArIDFdOw0KKw0KKyAgICBpZiAoY3VyQW5kMVByaWNlIDwgbmV4dE9wdC0+cHJpY2UpDQorICAgIHsNCisgICAgICBuZXh0T3B0LT5wcmljZSA9IGN1ckFuZDFQcmljZTsNCisgICAgICBuZXh0T3B0LT5wb3NQcmV2ID0gY3VyOw0KKyAgICAgIE1ha2VBc0NoYXIobmV4dE9wdCk7DQorICAgICAgbmV4dElzQ2hhciA9IFRydWU7DQorICAgIH0NCisNCisgICAgbWF0Y2hQcmljZSA9IGN1clByaWNlICsgR0VUX1BSSUNFXzEocC0+aXNNYXRjaFtzdGF0ZV1bcG9zU3RhdGVdKTsNCisgICAgcmVwTWF0Y2hQcmljZSA9IG1hdGNoUHJpY2UgKyBHRVRfUFJJQ0VfMShwLT5pc1JlcFtzdGF0ZV0pOw0KKyAgICANCisgICAgaWYgKG1hdGNoQnl0ZSA9PSBjdXJCeXRlICYmICEobmV4dE9wdC0+cG9zUHJldiA8IGN1ciAmJiBuZXh0T3B0LT5iYWNrUHJldiA9PSAwKSkNCisgICAgew0KKyAgICAgIFVJbnQzMiBzaG9ydFJlcFByaWNlID0gcmVwTWF0Y2hQcmljZSArIEdldFJlcExlbjFQcmljZShwLCBzdGF0ZSwgcG9zU3RhdGUpOw0KKyAgICAgIGlmIChzaG9ydFJlcFByaWNlIDw9IG5leHRPcHQtPnByaWNlKQ0KKyAgICAgIHsNCisgICAgICAgIG5leHRPcHQtPnByaWNlID0gc2hvcnRSZXBQcmljZTsNCisgICAgICAgIG5leHRPcHQtPnBvc1ByZXYgPSBjdXI7DQorICAgICAgICBNYWtlQXNTaG9ydFJlcChuZXh0T3B0KTsNCisgICAgICAgIG5leHRJc0NoYXIgPSBUcnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBudW1BdmFpbEZ1bGwgPSBwLT5udW1BdmFpbDsNCisgICAgew0KKyAgICAgIFVJbnQzMiB0ZW1wID0ga051bU9wdHMgLSAxIC0gY3VyOw0KKyAgICAgIGlmICh0ZW1wIDwgbnVtQXZhaWxGdWxsKQ0KKyAgICAgICAgbnVtQXZhaWxGdWxsID0gdGVtcDsNCisgICAgfQ0KKw0KKyAgICBpZiAobnVtQXZhaWxGdWxsIDwgMikNCisgICAgICBjb250aW51ZTsNCisgICAgbnVtQXZhaWwgPSAobnVtQXZhaWxGdWxsIDw9IHAtPm51bUZhc3RCeXRlcyA/IG51bUF2YWlsRnVsbCA6IHAtPm51bUZhc3RCeXRlcyk7DQorDQorICAgIGlmICghbmV4dElzQ2hhciAmJiBtYXRjaEJ5dGUgIT0gY3VyQnl0ZSkgLyogc3BlZWQgb3B0aW1pemF0aW9uICovDQorICAgIHsNCisgICAgICAvKiB0cnkgTGl0ZXJhbCArIHJlcDAgKi8NCisgICAgICBVSW50MzIgdGVtcDsNCisgICAgICBVSW50MzIgbGVuVGVzdDI7DQorICAgICAgY29uc3QgQnl0ZSAqZGF0YTIgPSBkYXRhIC0gKHJlcHNbMF0gKyAxKTsNCisgICAgICBVSW50MzIgbGltaXQgPSBwLT5udW1GYXN0Qnl0ZXMgKyAxOw0KKyAgICAgIGlmIChsaW1pdCA+IG51bUF2YWlsRnVsbCkNCisgICAgICAgIGxpbWl0ID0gbnVtQXZhaWxGdWxsOw0KKw0KKyAgICAgIGZvciAodGVtcCA9IDE7IHRlbXAgPCBsaW1pdCAmJiBkYXRhW3RlbXBdID09IGRhdGEyW3RlbXBdOyB0ZW1wKyspOw0KKyAgICAgIGxlblRlc3QyID0gdGVtcCAtIDE7DQorICAgICAgaWYgKGxlblRlc3QyID49IDIpDQorICAgICAgew0KKyAgICAgICAgVUludDMyIHN0YXRlMiA9IGtMaXRlcmFsTmV4dFN0YXRlc1tzdGF0ZV07DQorICAgICAgICBVSW50MzIgcG9zU3RhdGVOZXh0ID0gKHBvc2l0aW9uICsgMSkgJiBwLT5wYk1hc2s7DQorICAgICAgICBVSW50MzIgbmV4dFJlcE1hdGNoUHJpY2UgPSBjdXJBbmQxUHJpY2UgKw0KKyAgICAgICAgICAgIEdFVF9QUklDRV8xKHAtPmlzTWF0Y2hbc3RhdGUyXVtwb3NTdGF0ZU5leHRdKSArDQorICAgICAgICAgICAgR0VUX1BSSUNFXzEocC0+aXNSZXBbc3RhdGUyXSk7DQorICAgICAgICAvKiBmb3IgKDsgbGVuVGVzdDIgPj0gMjsgbGVuVGVzdDItLSkgKi8NCisgICAgICAgIHsNCisgICAgICAgICAgVUludDMyIGN1ckFuZExlblByaWNlOw0KKyAgICAgICAgICBDT3B0aW1hbCAqb3B0Ow0KKyAgICAgICAgICBVSW50MzIgb2Zmc2V0ID0gY3VyICsgMSArIGxlblRlc3QyOw0KKyAgICAgICAgICB3aGlsZSAobGVuRW5kIDwgb2Zmc2V0KQ0KKyAgICAgICAgICAgIHAtPm9wdFsrK2xlbkVuZF0ucHJpY2UgPSBrSW5maW5pdHlQcmljZTsNCisgICAgICAgICAgY3VyQW5kTGVuUHJpY2UgPSBuZXh0UmVwTWF0Y2hQcmljZSArIEdldFJlcFByaWNlKHAsIDAsIGxlblRlc3QyLCBzdGF0ZTIsIHBvc1N0YXRlTmV4dCk7DQorICAgICAgICAgIG9wdCA9ICZwLT5vcHRbb2Zmc2V0XTsNCisgICAgICAgICAgaWYgKGN1ckFuZExlblByaWNlIDwgb3B0LT5wcmljZSkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIG9wdC0+cHJpY2UgPSBjdXJBbmRMZW5QcmljZTsNCisgICAgICAgICAgICBvcHQtPnBvc1ByZXYgPSBjdXIgKyAxOw0KKyAgICAgICAgICAgIG9wdC0+YmFja1ByZXYgPSAwOw0KKyAgICAgICAgICAgIG9wdC0+cHJldjFJc0NoYXIgPSBUcnVlOw0KKyAgICAgICAgICAgIG9wdC0+cHJldjIgPSBGYWxzZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgc3RhcnRMZW4gPSAyOyAvKiBzcGVlZCBvcHRpbWl6YXRpb24gKi8NCisgICAgew0KKyAgICBVSW50MzIgcmVwSW5kZXg7DQorICAgIGZvciAocmVwSW5kZXggPSAwOyByZXBJbmRleCA8IExaTUFfTlVNX1JFUFM7IHJlcEluZGV4KyspDQorICAgIHsNCisgICAgICBVSW50MzIgbGVuVGVzdDsNCisgICAgICBVSW50MzIgbGVuVGVzdFRlbXA7DQorICAgICAgVUludDMyIHByaWNlOw0KKyAgICAgIGNvbnN0IEJ5dGUgKmRhdGEyID0gZGF0YSAtIChyZXBzW3JlcEluZGV4XSArIDEpOw0KKyAgICAgIGlmIChkYXRhWzBdICE9IGRhdGEyWzBdIHx8IGRhdGFbMV0gIT0gZGF0YTJbMV0pDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBmb3IgKGxlblRlc3QgPSAyOyBsZW5UZXN0IDwgbnVtQXZhaWwgJiYgZGF0YVtsZW5UZXN0XSA9PSBkYXRhMltsZW5UZXN0XTsgbGVuVGVzdCsrKTsNCisgICAgICB3aGlsZSAobGVuRW5kIDwgY3VyICsgbGVuVGVzdCkNCisgICAgICAgIHAtPm9wdFsrK2xlbkVuZF0ucHJpY2UgPSBrSW5maW5pdHlQcmljZTsNCisgICAgICBsZW5UZXN0VGVtcCA9IGxlblRlc3Q7DQorICAgICAgcHJpY2UgPSByZXBNYXRjaFByaWNlICsgR2V0UHVyZVJlcFByaWNlKHAsIHJlcEluZGV4LCBzdGF0ZSwgcG9zU3RhdGUpOw0KKyAgICAgIGRvDQorICAgICAgew0KKyAgICAgICAgVUludDMyIGN1ckFuZExlblByaWNlID0gcHJpY2UgKyBwLT5yZXBMZW5FbmMucHJpY2VzW3Bvc1N0YXRlXVtsZW5UZXN0IC0gMl07DQorICAgICAgICBDT3B0aW1hbCAqb3B0ID0gJnAtPm9wdFtjdXIgKyBsZW5UZXN0XTsNCisgICAgICAgIGlmIChjdXJBbmRMZW5QcmljZSA8IG9wdC0+cHJpY2UpDQorICAgICAgICB7DQorICAgICAgICAgIG9wdC0+cHJpY2UgPSBjdXJBbmRMZW5QcmljZTsNCisgICAgICAgICAgb3B0LT5wb3NQcmV2ID0gY3VyOw0KKyAgICAgICAgICBvcHQtPmJhY2tQcmV2ID0gcmVwSW5kZXg7DQorICAgICAgICAgIG9wdC0+cHJldjFJc0NoYXIgPSBGYWxzZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgd2hpbGUgKC0tbGVuVGVzdCA+PSAyKTsNCisgICAgICBsZW5UZXN0ID0gbGVuVGVzdFRlbXA7DQorICAgICAgDQorICAgICAgaWYgKHJlcEluZGV4ID09IDApDQorICAgICAgICBzdGFydExlbiA9IGxlblRlc3QgKyAxOw0KKyAgICAgICAgDQorICAgICAgLyogaWYgKF9tYXhNb2RlKSAqLw0KKyAgICAgICAgew0KKyAgICAgICAgICBVSW50MzIgbGVuVGVzdDIgPSBsZW5UZXN0ICsgMTsNCisgICAgICAgICAgVUludDMyIGxpbWl0ID0gbGVuVGVzdDIgKyBwLT5udW1GYXN0Qnl0ZXM7DQorICAgICAgICAgIFVJbnQzMiBuZXh0UmVwTWF0Y2hQcmljZTsNCisgICAgICAgICAgaWYgKGxpbWl0ID4gbnVtQXZhaWxGdWxsKQ0KKyAgICAgICAgICAgIGxpbWl0ID0gbnVtQXZhaWxGdWxsOw0KKyAgICAgICAgICBmb3IgKDsgbGVuVGVzdDIgPCBsaW1pdCAmJiBkYXRhW2xlblRlc3QyXSA9PSBkYXRhMltsZW5UZXN0Ml07IGxlblRlc3QyKyspOw0KKyAgICAgICAgICBsZW5UZXN0MiAtPSBsZW5UZXN0ICsgMTsNCisgICAgICAgICAgaWYgKGxlblRlc3QyID49IDIpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBVSW50MzIgc3RhdGUyID0ga1JlcE5leHRTdGF0ZXNbc3RhdGVdOw0KKyAgICAgICAgICAgIFVJbnQzMiBwb3NTdGF0ZU5leHQgPSAocG9zaXRpb24gKyBsZW5UZXN0KSAmIHAtPnBiTWFzazsNCisgICAgICAgICAgICBVSW50MzIgY3VyQW5kTGVuQ2hhclByaWNlID0NCisgICAgICAgICAgICAgICAgcHJpY2UgKyBwLT5yZXBMZW5FbmMucHJpY2VzW3Bvc1N0YXRlXVtsZW5UZXN0IC0gMl0gKw0KKyAgICAgICAgICAgICAgICBHRVRfUFJJQ0VfMChwLT5pc01hdGNoW3N0YXRlMl1bcG9zU3RhdGVOZXh0XSkgKw0KKyAgICAgICAgICAgICAgICBMaXRFbmNfR2V0UHJpY2VNYXRjaGVkKExJVF9QUk9CUyhwb3NpdGlvbiArIGxlblRlc3QsIGRhdGFbbGVuVGVzdCAtIDFdKSwNCisgICAgICAgICAgICAgICAgICAgIGRhdGFbbGVuVGVzdF0sIGRhdGEyW2xlblRlc3RdLCBwLT5Qcm9iUHJpY2VzKTsNCisgICAgICAgICAgICBzdGF0ZTIgPSBrTGl0ZXJhbE5leHRTdGF0ZXNbc3RhdGUyXTsNCisgICAgICAgICAgICBwb3NTdGF0ZU5leHQgPSAocG9zaXRpb24gKyBsZW5UZXN0ICsgMSkgJiBwLT5wYk1hc2s7DQorICAgICAgICAgICAgbmV4dFJlcE1hdGNoUHJpY2UgPSBjdXJBbmRMZW5DaGFyUHJpY2UgKw0KKyAgICAgICAgICAgICAgICBHRVRfUFJJQ0VfMShwLT5pc01hdGNoW3N0YXRlMl1bcG9zU3RhdGVOZXh0XSkgKw0KKyAgICAgICAgICAgICAgICBHRVRfUFJJQ0VfMShwLT5pc1JlcFtzdGF0ZTJdKTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICAvKiBmb3IgKDsgbGVuVGVzdDIgPj0gMjsgbGVuVGVzdDItLSkgKi8NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICBVSW50MzIgY3VyQW5kTGVuUHJpY2U7DQorICAgICAgICAgICAgICBDT3B0aW1hbCAqb3B0Ow0KKyAgICAgICAgICAgICAgVUludDMyIG9mZnNldCA9IGN1ciArIGxlblRlc3QgKyAxICsgbGVuVGVzdDI7DQorICAgICAgICAgICAgICB3aGlsZSAobGVuRW5kIDwgb2Zmc2V0KQ0KKyAgICAgICAgICAgICAgICBwLT5vcHRbKytsZW5FbmRdLnByaWNlID0ga0luZmluaXR5UHJpY2U7DQorICAgICAgICAgICAgICBjdXJBbmRMZW5QcmljZSA9IG5leHRSZXBNYXRjaFByaWNlICsgR2V0UmVwUHJpY2UocCwgMCwgbGVuVGVzdDIsIHN0YXRlMiwgcG9zU3RhdGVOZXh0KTsNCisgICAgICAgICAgICAgIG9wdCA9ICZwLT5vcHRbb2Zmc2V0XTsNCisgICAgICAgICAgICAgIGlmIChjdXJBbmRMZW5QcmljZSA8IG9wdC0+cHJpY2UpDQorICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIG9wdC0+cHJpY2UgPSBjdXJBbmRMZW5QcmljZTsNCisgICAgICAgICAgICAgICAgb3B0LT5wb3NQcmV2ID0gY3VyICsgbGVuVGVzdCArIDE7DQorICAgICAgICAgICAgICAgIG9wdC0+YmFja1ByZXYgPSAwOw0KKyAgICAgICAgICAgICAgICBvcHQtPnByZXYxSXNDaGFyID0gVHJ1ZTsNCisgICAgICAgICAgICAgICAgb3B0LT5wcmV2MiA9IFRydWU7DQorICAgICAgICAgICAgICAgIG9wdC0+cG9zUHJldjIgPSBjdXI7DQorICAgICAgICAgICAgICAgIG9wdC0+YmFja1ByZXYyID0gcmVwSW5kZXg7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgfQ0KKyAgICAvKiBmb3IgKFVJbnQzMiBsZW5UZXN0ID0gMjsgbGVuVGVzdCA8PSBuZXdMZW47IGxlblRlc3QrKykgKi8NCisgICAgaWYgKG5ld0xlbiA+IG51bUF2YWlsKQ0KKyAgICB7DQorICAgICAgbmV3TGVuID0gbnVtQXZhaWw7DQorICAgICAgZm9yIChudW1QYWlycyA9IDA7IG5ld0xlbiA+IG1hdGNoZXNbbnVtUGFpcnNdOyBudW1QYWlycyArPSAyKTsNCisgICAgICBtYXRjaGVzW251bVBhaXJzXSA9IG5ld0xlbjsNCisgICAgICBudW1QYWlycyArPSAyOw0KKyAgICB9DQorICAgIGlmIChuZXdMZW4gPj0gc3RhcnRMZW4pDQorICAgIHsNCisgICAgICBVSW50MzIgbm9ybWFsTWF0Y2hQcmljZSA9IG1hdGNoUHJpY2UgKyBHRVRfUFJJQ0VfMChwLT5pc1JlcFtzdGF0ZV0pOw0KKyAgICAgIFVJbnQzMiBvZmZzLCBjdXJCYWNrLCBwb3NTbG90Ow0KKyAgICAgIFVJbnQzMiBsZW5UZXN0Ow0KKyAgICAgIHdoaWxlIChsZW5FbmQgPCBjdXIgKyBuZXdMZW4pDQorICAgICAgICBwLT5vcHRbKytsZW5FbmRdLnByaWNlID0ga0luZmluaXR5UHJpY2U7DQorDQorICAgICAgb2ZmcyA9IDA7DQorICAgICAgd2hpbGUgKHN0YXJ0TGVuID4gbWF0Y2hlc1tvZmZzXSkNCisgICAgICAgIG9mZnMgKz0gMjsNCisgICAgICBjdXJCYWNrID0gbWF0Y2hlc1tvZmZzICsgMV07DQorICAgICAgR2V0UG9zU2xvdDIoY3VyQmFjaywgcG9zU2xvdCk7DQorICAgICAgZm9yIChsZW5UZXN0ID0gLyoyKi8gc3RhcnRMZW47IDsgbGVuVGVzdCsrKQ0KKyAgICAgIHsNCisgICAgICAgIFVJbnQzMiBjdXJBbmRMZW5QcmljZSA9IG5vcm1hbE1hdGNoUHJpY2UgKyBwLT5sZW5FbmMucHJpY2VzW3Bvc1N0YXRlXVtsZW5UZXN0IC0gTFpNQV9NQVRDSF9MRU5fTUlOXTsNCisgICAgICAgIFVJbnQzMiBsZW5Ub1Bvc1N0YXRlID0gR2V0TGVuVG9Qb3NTdGF0ZShsZW5UZXN0KTsNCisgICAgICAgIENPcHRpbWFsICpvcHQ7DQorICAgICAgICBpZiAoY3VyQmFjayA8IGtOdW1GdWxsRGlzdGFuY2VzKQ0KKyAgICAgICAgICBjdXJBbmRMZW5QcmljZSArPSBwLT5kaXN0YW5jZXNQcmljZXNbbGVuVG9Qb3NTdGF0ZV1bY3VyQmFja107DQorICAgICAgICBlbHNlDQorICAgICAgICAgIGN1ckFuZExlblByaWNlICs9IHAtPnBvc1Nsb3RQcmljZXNbbGVuVG9Qb3NTdGF0ZV1bcG9zU2xvdF0gKyBwLT5hbGlnblByaWNlc1tjdXJCYWNrICYga0FsaWduTWFza107DQorICAgICAgICANCisgICAgICAgIG9wdCA9ICZwLT5vcHRbY3VyICsgbGVuVGVzdF07DQorICAgICAgICBpZiAoY3VyQW5kTGVuUHJpY2UgPCBvcHQtPnByaWNlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBvcHQtPnByaWNlID0gY3VyQW5kTGVuUHJpY2U7DQorICAgICAgICAgIG9wdC0+cG9zUHJldiA9IGN1cjsNCisgICAgICAgICAgb3B0LT5iYWNrUHJldiA9IGN1ckJhY2sgKyBMWk1BX05VTV9SRVBTOw0KKyAgICAgICAgICBvcHQtPnByZXYxSXNDaGFyID0gRmFsc2U7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoLypfbWF4TW9kZSAmJiAqL2xlblRlc3QgPT0gbWF0Y2hlc1tvZmZzXSkNCisgICAgICAgIHsNCisgICAgICAgICAgLyogVHJ5IE1hdGNoICsgTGl0ZXJhbCArIFJlcDAgKi8NCisgICAgICAgICAgY29uc3QgQnl0ZSAqZGF0YTIgPSBkYXRhIC0gKGN1ckJhY2sgKyAxKTsNCisgICAgICAgICAgVUludDMyIGxlblRlc3QyID0gbGVuVGVzdCArIDE7DQorICAgICAgICAgIFVJbnQzMiBsaW1pdCA9IGxlblRlc3QyICsgcC0+bnVtRmFzdEJ5dGVzOw0KKyAgICAgICAgICBVSW50MzIgbmV4dFJlcE1hdGNoUHJpY2U7DQorICAgICAgICAgIGlmIChsaW1pdCA+IG51bUF2YWlsRnVsbCkNCisgICAgICAgICAgICBsaW1pdCA9IG51bUF2YWlsRnVsbDsNCisgICAgICAgICAgZm9yICg7IGxlblRlc3QyIDwgbGltaXQgJiYgZGF0YVtsZW5UZXN0Ml0gPT0gZGF0YTJbbGVuVGVzdDJdOyBsZW5UZXN0MisrKTsNCisgICAgICAgICAgbGVuVGVzdDIgLT0gbGVuVGVzdCArIDE7DQorICAgICAgICAgIGlmIChsZW5UZXN0MiA+PSAyKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgVUludDMyIHN0YXRlMiA9IGtNYXRjaE5leHRTdGF0ZXNbc3RhdGVdOw0KKyAgICAgICAgICAgIFVJbnQzMiBwb3NTdGF0ZU5leHQgPSAocG9zaXRpb24gKyBsZW5UZXN0KSAmIHAtPnBiTWFzazsNCisgICAgICAgICAgICBVSW50MzIgY3VyQW5kTGVuQ2hhclByaWNlID0gY3VyQW5kTGVuUHJpY2UgKw0KKyAgICAgICAgICAgICAgICBHRVRfUFJJQ0VfMChwLT5pc01hdGNoW3N0YXRlMl1bcG9zU3RhdGVOZXh0XSkgKw0KKyAgICAgICAgICAgICAgICBMaXRFbmNfR2V0UHJpY2VNYXRjaGVkKExJVF9QUk9CUyhwb3NpdGlvbiArIGxlblRlc3QsIGRhdGFbbGVuVGVzdCAtIDFdKSwNCisgICAgICAgICAgICAgICAgICAgIGRhdGFbbGVuVGVzdF0sIGRhdGEyW2xlblRlc3RdLCBwLT5Qcm9iUHJpY2VzKTsNCisgICAgICAgICAgICBzdGF0ZTIgPSBrTGl0ZXJhbE5leHRTdGF0ZXNbc3RhdGUyXTsNCisgICAgICAgICAgICBwb3NTdGF0ZU5leHQgPSAocG9zU3RhdGVOZXh0ICsgMSkgJiBwLT5wYk1hc2s7DQorICAgICAgICAgICAgbmV4dFJlcE1hdGNoUHJpY2UgPSBjdXJBbmRMZW5DaGFyUHJpY2UgKw0KKyAgICAgICAgICAgICAgICBHRVRfUFJJQ0VfMShwLT5pc01hdGNoW3N0YXRlMl1bcG9zU3RhdGVOZXh0XSkgKw0KKyAgICAgICAgICAgICAgICBHRVRfUFJJQ0VfMShwLT5pc1JlcFtzdGF0ZTJdKTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICAvKiBmb3IgKDsgbGVuVGVzdDIgPj0gMjsgbGVuVGVzdDItLSkgKi8NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICBVSW50MzIgb2Zmc2V0ID0gY3VyICsgbGVuVGVzdCArIDEgKyBsZW5UZXN0MjsNCisgICAgICAgICAgICAgIFVJbnQzMiBjdXJBbmRMZW5QcmljZTsNCisgICAgICAgICAgICAgIENPcHRpbWFsICpvcHQ7DQorICAgICAgICAgICAgICB3aGlsZSAobGVuRW5kIDwgb2Zmc2V0KQ0KKyAgICAgICAgICAgICAgICBwLT5vcHRbKytsZW5FbmRdLnByaWNlID0ga0luZmluaXR5UHJpY2U7DQorICAgICAgICAgICAgICBjdXJBbmRMZW5QcmljZSA9IG5leHRSZXBNYXRjaFByaWNlICsgR2V0UmVwUHJpY2UocCwgMCwgbGVuVGVzdDIsIHN0YXRlMiwgcG9zU3RhdGVOZXh0KTsNCisgICAgICAgICAgICAgIG9wdCA9ICZwLT5vcHRbb2Zmc2V0XTsNCisgICAgICAgICAgICAgIGlmIChjdXJBbmRMZW5QcmljZSA8IG9wdC0+cHJpY2UpDQorICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIG9wdC0+cHJpY2UgPSBjdXJBbmRMZW5QcmljZTsNCisgICAgICAgICAgICAgICAgb3B0LT5wb3NQcmV2ID0gY3VyICsgbGVuVGVzdCArIDE7DQorICAgICAgICAgICAgICAgIG9wdC0+YmFja1ByZXYgPSAwOw0KKyAgICAgICAgICAgICAgICBvcHQtPnByZXYxSXNDaGFyID0gVHJ1ZTsNCisgICAgICAgICAgICAgICAgb3B0LT5wcmV2MiA9IFRydWU7DQorICAgICAgICAgICAgICAgIG9wdC0+cG9zUHJldjIgPSBjdXI7DQorICAgICAgICAgICAgICAgIG9wdC0+YmFja1ByZXYyID0gY3VyQmFjayArIExaTUFfTlVNX1JFUFM7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIG9mZnMgKz0gMjsNCisgICAgICAgICAgaWYgKG9mZnMgPT0gbnVtUGFpcnMpDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGN1ckJhY2sgPSBtYXRjaGVzW29mZnMgKyAxXTsNCisgICAgICAgICAgaWYgKGN1ckJhY2sgPj0ga051bUZ1bGxEaXN0YW5jZXMpDQorICAgICAgICAgICAgR2V0UG9zU2xvdDIoY3VyQmFjaywgcG9zU2xvdCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KKw0KKyNkZWZpbmUgQ2hhbmdlUGFpcihzbWFsbERpc3QsIGJpZ0Rpc3QpICgoKGJpZ0Rpc3QpID4+IDcpID4gKHNtYWxsRGlzdCkpDQorDQorc3RhdGljIFVJbnQzMiBHZXRPcHRpbXVtRmFzdChDTHptYUVuYyAqcCwgVUludDMyICpiYWNrUmVzKQ0KK3sNCisgIFVJbnQzMiBudW1BdmFpbCwgbWFpbkxlbiwgbWFpbkRpc3QsIG51bVBhaXJzLCByZXBJbmRleCwgcmVwTGVuLCBpOw0KKyAgY29uc3QgQnl0ZSAqZGF0YTsNCisgIGNvbnN0IFVJbnQzMiAqbWF0Y2hlczsNCisNCisgIGlmIChwLT5hZGRpdGlvbmFsT2Zmc2V0ID09IDApDQorICAgIG1haW5MZW4gPSBSZWFkTWF0Y2hEaXN0YW5jZXMocCwgJm51bVBhaXJzKTsNCisgIGVsc2UNCisgIHsNCisgICAgbWFpbkxlbiA9IHAtPmxvbmdlc3RNYXRjaExlbmd0aDsNCisgICAgbnVtUGFpcnMgPSBwLT5udW1QYWlyczsNCisgIH0NCisNCisgIG51bUF2YWlsID0gcC0+bnVtQXZhaWw7DQorICAqYmFja1JlcyA9IChVSW50MzIpLTE7DQorICBpZiAobnVtQXZhaWwgPCAyKQ0KKyAgICByZXR1cm4gMTsNCisgIGlmIChudW1BdmFpbCA+IExaTUFfTUFUQ0hfTEVOX01BWCkNCisgICAgbnVtQXZhaWwgPSBMWk1BX01BVENIX0xFTl9NQVg7DQorICBkYXRhID0gcC0+bWF0Y2hGaW5kZXIuR2V0UG9pbnRlclRvQ3VycmVudFBvcyhwLT5tYXRjaEZpbmRlck9iaikgLSAxOw0KKw0KKyAgcmVwTGVuID0gcmVwSW5kZXggPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IExaTUFfTlVNX1JFUFM7IGkrKykNCisgIHsNCisgICAgVUludDMyIGxlbjsNCisgICAgY29uc3QgQnl0ZSAqZGF0YTIgPSBkYXRhIC0gKHAtPnJlcHNbaV0gKyAxKTsNCisgICAgaWYgKGRhdGFbMF0gIT0gZGF0YTJbMF0gfHwgZGF0YVsxXSAhPSBkYXRhMlsxXSkNCisgICAgICBjb250aW51ZTsNCisgICAgZm9yIChsZW4gPSAyOyBsZW4gPCBudW1BdmFpbCAmJiBkYXRhW2xlbl0gPT0gZGF0YTJbbGVuXTsgbGVuKyspOw0KKyAgICBpZiAobGVuID49IHAtPm51bUZhc3RCeXRlcykNCisgICAgew0KKyAgICAgICpiYWNrUmVzID0gaTsNCisgICAgICBNb3ZlUG9zKHAsIGxlbiAtIDEpOw0KKyAgICAgIHJldHVybiBsZW47DQorICAgIH0NCisgICAgaWYgKGxlbiA+IHJlcExlbikNCisgICAgew0KKyAgICAgIHJlcEluZGV4ID0gaTsNCisgICAgICByZXBMZW4gPSBsZW47DQorICAgIH0NCisgIH0NCisNCisgIG1hdGNoZXMgPSBwLT5tYXRjaGVzOw0KKyAgaWYgKG1haW5MZW4gPj0gcC0+bnVtRmFzdEJ5dGVzKQ0KKyAgew0KKyAgICAqYmFja1JlcyA9IG1hdGNoZXNbbnVtUGFpcnMgLSAxXSArIExaTUFfTlVNX1JFUFM7DQorICAgIE1vdmVQb3MocCwgbWFpbkxlbiAtIDEpOw0KKyAgICByZXR1cm4gbWFpbkxlbjsNCisgIH0NCisNCisgIG1haW5EaXN0ID0gMDsgLyogZm9yIEdDQyAqLw0KKyAgaWYgKG1haW5MZW4gPj0gMikNCisgIHsNCisgICAgbWFpbkRpc3QgPSBtYXRjaGVzW251bVBhaXJzIC0gMV07DQorICAgIHdoaWxlIChudW1QYWlycyA+IDIgJiYgbWFpbkxlbiA9PSBtYXRjaGVzW251bVBhaXJzIC0gNF0gKyAxKQ0KKyAgICB7DQorICAgICAgaWYgKCFDaGFuZ2VQYWlyKG1hdGNoZXNbbnVtUGFpcnMgLSAzXSwgbWFpbkRpc3QpKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgbnVtUGFpcnMgLT0gMjsNCisgICAgICBtYWluTGVuID0gbWF0Y2hlc1tudW1QYWlycyAtIDJdOw0KKyAgICAgIG1haW5EaXN0ID0gbWF0Y2hlc1tudW1QYWlycyAtIDFdOw0KKyAgICB9DQorICAgIGlmIChtYWluTGVuID09IDIgJiYgbWFpbkRpc3QgPj0gMHg4MCkNCisgICAgICBtYWluTGVuID0gMTsNCisgIH0NCisNCisgIGlmIChyZXBMZW4gPj0gMiAmJiAoDQorICAgICAgICAocmVwTGVuICsgMSA+PSBtYWluTGVuKSB8fA0KKyAgICAgICAgKHJlcExlbiArIDIgPj0gbWFpbkxlbiAmJiBtYWluRGlzdCA+PSAoMSA8PCA5KSkgfHwNCisgICAgICAgIChyZXBMZW4gKyAzID49IG1haW5MZW4gJiYgbWFpbkRpc3QgPj0gKDEgPDwgMTUpKSkpDQorICB7DQorICAgICpiYWNrUmVzID0gcmVwSW5kZXg7DQorICAgIE1vdmVQb3MocCwgcmVwTGVuIC0gMSk7DQorICAgIHJldHVybiByZXBMZW47DQorICB9DQorICANCisgIGlmIChtYWluTGVuIDwgMiB8fCBudW1BdmFpbCA8PSAyKQ0KKyAgICByZXR1cm4gMTsNCisNCisgIHAtPmxvbmdlc3RNYXRjaExlbmd0aCA9IFJlYWRNYXRjaERpc3RhbmNlcyhwLCAmcC0+bnVtUGFpcnMpOw0KKyAgaWYgKHAtPmxvbmdlc3RNYXRjaExlbmd0aCA+PSAyKQ0KKyAgew0KKyAgICBVSW50MzIgbmV3RGlzdGFuY2UgPSBtYXRjaGVzW3AtPm51bVBhaXJzIC0gMV07DQorICAgIGlmICgocC0+bG9uZ2VzdE1hdGNoTGVuZ3RoID49IG1haW5MZW4gJiYgbmV3RGlzdGFuY2UgPCBtYWluRGlzdCkgfHwNCisgICAgICAgIChwLT5sb25nZXN0TWF0Y2hMZW5ndGggPT0gbWFpbkxlbiArIDEgJiYgIUNoYW5nZVBhaXIobWFpbkRpc3QsIG5ld0Rpc3RhbmNlKSkgfHwNCisgICAgICAgIChwLT5sb25nZXN0TWF0Y2hMZW5ndGggPiBtYWluTGVuICsgMSkgfHwNCisgICAgICAgIChwLT5sb25nZXN0TWF0Y2hMZW5ndGggKyAxID49IG1haW5MZW4gJiYgbWFpbkxlbiA+PSAzICYmIENoYW5nZVBhaXIobmV3RGlzdGFuY2UsIG1haW5EaXN0KSkpDQorICAgICAgcmV0dXJuIDE7DQorICB9DQorICANCisgIGRhdGEgPSBwLT5tYXRjaEZpbmRlci5HZXRQb2ludGVyVG9DdXJyZW50UG9zKHAtPm1hdGNoRmluZGVyT2JqKSAtIDE7DQorICBmb3IgKGkgPSAwOyBpIDwgTFpNQV9OVU1fUkVQUzsgaSsrKQ0KKyAgew0KKyAgICBVSW50MzIgbGVuLCBsaW1pdDsNCisgICAgY29uc3QgQnl0ZSAqZGF0YTIgPSBkYXRhIC0gKHAtPnJlcHNbaV0gKyAxKTsNCisgICAgaWYgKGRhdGFbMF0gIT0gZGF0YTJbMF0gfHwgZGF0YVsxXSAhPSBkYXRhMlsxXSkNCisgICAgICBjb250aW51ZTsNCisgICAgbGltaXQgPSBtYWluTGVuIC0gMTsNCisgICAgZm9yIChsZW4gPSAyOyBsZW4gPCBsaW1pdCAmJiBkYXRhW2xlbl0gPT0gZGF0YTJbbGVuXTsgbGVuKyspOw0KKyAgICBpZiAobGVuID49IGxpbWl0KQ0KKyAgICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgKmJhY2tSZXMgPSBtYWluRGlzdCArIExaTUFfTlVNX1JFUFM7DQorICBNb3ZlUG9zKHAsIG1haW5MZW4gLSAyKTsNCisgIHJldHVybiBtYWluTGVuOw0KK30NCisNCitzdGF0aWMgdm9pZCBXcml0ZUVuZE1hcmtlcihDTHptYUVuYyAqcCwgVUludDMyIHBvc1N0YXRlKQ0KK3sNCisgIFVJbnQzMiBsZW47DQorICBSYW5nZUVuY19FbmNvZGVCaXQoJnAtPnJjLCAmcC0+aXNNYXRjaFtwLT5zdGF0ZV1bcG9zU3RhdGVdLCAxKTsNCisgIFJhbmdlRW5jX0VuY29kZUJpdCgmcC0+cmMsICZwLT5pc1JlcFtwLT5zdGF0ZV0sIDApOw0KKyAgcC0+c3RhdGUgPSBrTWF0Y2hOZXh0U3RhdGVzW3AtPnN0YXRlXTsNCisgIGxlbiA9IExaTUFfTUFUQ0hfTEVOX01JTjsNCisgIExlbkVuY19FbmNvZGUyKCZwLT5sZW5FbmMsICZwLT5yYywgbGVuIC0gTFpNQV9NQVRDSF9MRU5fTUlOLCBwb3NTdGF0ZSwgIXAtPmZhc3RNb2RlLCBwLT5Qcm9iUHJpY2VzKTsNCisgIFJjVHJlZV9FbmNvZGUoJnAtPnJjLCBwLT5wb3NTbG90RW5jb2RlcltHZXRMZW5Ub1Bvc1N0YXRlKGxlbildLCBrTnVtUG9zU2xvdEJpdHMsICgxIDw8IGtOdW1Qb3NTbG90Qml0cykgLSAxKTsNCisgIFJhbmdlRW5jX0VuY29kZURpcmVjdEJpdHMoJnAtPnJjLCAoKChVSW50MzIpMSA8PCAzMCkgLSAxKSA+PiBrTnVtQWxpZ25CaXRzLCAzMCAtIGtOdW1BbGlnbkJpdHMpOw0KKyAgUmNUcmVlX1JldmVyc2VFbmNvZGUoJnAtPnJjLCBwLT5wb3NBbGlnbkVuY29kZXIsIGtOdW1BbGlnbkJpdHMsIGtBbGlnbk1hc2spOw0KK30NCisNCitzdGF0aWMgU1JlcyBDaGVja0Vycm9ycyhDTHptYUVuYyAqcCkNCit7DQorICBpZiAocC0+cmVzdWx0ICE9IFNaX09LKQ0KKyAgICByZXR1cm4gcC0+cmVzdWx0Ow0KKyAgaWYgKHAtPnJjLnJlcyAhPSBTWl9PSykNCisgICAgcC0+cmVzdWx0ID0gU1pfRVJST1JfV1JJVEU7DQorICBpZiAocC0+bWF0Y2hGaW5kZXJCYXNlLnJlc3VsdCAhPSBTWl9PSykNCisgICAgcC0+cmVzdWx0ID0gU1pfRVJST1JfUkVBRDsNCisgIGlmIChwLT5yZXN1bHQgIT0gU1pfT0spDQorICAgIHAtPmZpbmlzaGVkID0gVHJ1ZTsNCisgIHJldHVybiBwLT5yZXN1bHQ7DQorfQ0KKw0KK3N0YXRpYyBTUmVzIEZsdXNoKENMem1hRW5jICpwLCBVSW50MzIgbm93UG9zKQ0KK3sNCisgIC8qIFJlbGVhc2VNRlN0cmVhbSgpOyAqLw0KKyAgcC0+ZmluaXNoZWQgPSBUcnVlOw0KKyAgaWYgKHAtPndyaXRlRW5kTWFyaykNCisgICAgV3JpdGVFbmRNYXJrZXIocCwgbm93UG9zICYgcC0+cGJNYXNrKTsNCisgIFJhbmdlRW5jX0ZsdXNoRGF0YSgmcC0+cmMpOw0KKyAgUmFuZ2VFbmNfRmx1c2hTdHJlYW0oJnAtPnJjKTsNCisgIHJldHVybiBDaGVja0Vycm9ycyhwKTsNCit9DQorDQorc3RhdGljIHZvaWQgRmlsbEFsaWduUHJpY2VzKENMem1hRW5jICpwKQ0KK3sNCisgIFVJbnQzMiBpOw0KKyAgZm9yIChpID0gMDsgaSA8IGtBbGlnblRhYmxlU2l6ZTsgaSsrKQ0KKyAgICBwLT5hbGlnblByaWNlc1tpXSA9IFJjVHJlZV9SZXZlcnNlR2V0UHJpY2UocC0+cG9zQWxpZ25FbmNvZGVyLCBrTnVtQWxpZ25CaXRzLCBpLCBwLT5Qcm9iUHJpY2VzKTsNCisgIHAtPmFsaWduUHJpY2VDb3VudCA9IDA7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIEZpbGxEaXN0YW5jZXNQcmljZXMoQ0x6bWFFbmMgKnApDQorew0KKyAgVUludDMyIHRlbXBQcmljZXNba051bUZ1bGxEaXN0YW5jZXNdOw0KKyAgVUludDMyIGksIGxlblRvUG9zU3RhdGU7DQorICBmb3IgKGkgPSBrU3RhcnRQb3NNb2RlbEluZGV4OyBpIDwga051bUZ1bGxEaXN0YW5jZXM7IGkrKykNCisgIHsNCisgICAgVUludDMyIHBvc1Nsb3QgPSBHZXRQb3NTbG90MShpKTsNCisgICAgVUludDMyIGZvb3RlckJpdHMgPSAoKHBvc1Nsb3QgPj4gMSkgLSAxKTsNCisgICAgVUludDMyIGJhc2UgPSAoKDIgfCAocG9zU2xvdCAmIDEpKSA8PCBmb290ZXJCaXRzKTsNCisgICAgdGVtcFByaWNlc1tpXSA9IFJjVHJlZV9SZXZlcnNlR2V0UHJpY2UocC0+cG9zRW5jb2RlcnMgKyBiYXNlIC0gcG9zU2xvdCAtIDEsIGZvb3RlckJpdHMsIGkgLSBiYXNlLCBwLT5Qcm9iUHJpY2VzKTsNCisgIH0NCisNCisgIGZvciAobGVuVG9Qb3NTdGF0ZSA9IDA7IGxlblRvUG9zU3RhdGUgPCBrTnVtTGVuVG9Qb3NTdGF0ZXM7IGxlblRvUG9zU3RhdGUrKykNCisgIHsNCisgICAgVUludDMyIHBvc1Nsb3Q7DQorICAgIGNvbnN0IENMem1hUHJvYiAqZW5jb2RlciA9IHAtPnBvc1Nsb3RFbmNvZGVyW2xlblRvUG9zU3RhdGVdOw0KKyAgICBVSW50MzIgKnBvc1Nsb3RQcmljZXMgPSBwLT5wb3NTbG90UHJpY2VzW2xlblRvUG9zU3RhdGVdOw0KKyAgICBmb3IgKHBvc1Nsb3QgPSAwOyBwb3NTbG90IDwgcC0+ZGlzdFRhYmxlU2l6ZTsgcG9zU2xvdCsrKQ0KKyAgICAgIHBvc1Nsb3RQcmljZXNbcG9zU2xvdF0gPSBSY1RyZWVfR2V0UHJpY2UoZW5jb2Rlciwga051bVBvc1Nsb3RCaXRzLCBwb3NTbG90LCBwLT5Qcm9iUHJpY2VzKTsNCisgICAgZm9yIChwb3NTbG90ID0ga0VuZFBvc01vZGVsSW5kZXg7IHBvc1Nsb3QgPCBwLT5kaXN0VGFibGVTaXplOyBwb3NTbG90KyspDQorICAgICAgcG9zU2xvdFByaWNlc1twb3NTbG90XSArPSAoKCgocG9zU2xvdCA+PiAxKSAtIDEpIC0ga051bUFsaWduQml0cykgPDwga051bUJpdFByaWNlU2hpZnRCaXRzKTsNCisNCisgICAgew0KKyAgICAgIFVJbnQzMiAqZGlzdGFuY2VzUHJpY2VzID0gcC0+ZGlzdGFuY2VzUHJpY2VzW2xlblRvUG9zU3RhdGVdOw0KKyAgICAgIFVJbnQzMiBpOw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBrU3RhcnRQb3NNb2RlbEluZGV4OyBpKyspDQorICAgICAgICBkaXN0YW5jZXNQcmljZXNbaV0gPSBwb3NTbG90UHJpY2VzW2ldOw0KKyAgICAgIGZvciAoOyBpIDwga051bUZ1bGxEaXN0YW5jZXM7IGkrKykNCisgICAgICAgIGRpc3RhbmNlc1ByaWNlc1tpXSA9IHBvc1Nsb3RQcmljZXNbR2V0UG9zU2xvdDEoaSldICsgdGVtcFByaWNlc1tpXTsNCisgICAgfQ0KKyAgfQ0KKyAgcC0+bWF0Y2hQcmljZUNvdW50ID0gMDsNCit9DQorDQordm9pZCBMem1hRW5jX0NvbnN0cnVjdChDTHptYUVuYyAqcCkNCit7DQorICBSYW5nZUVuY19Db25zdHJ1Y3QoJnAtPnJjKTsNCisgIE1hdGNoRmluZGVyX0NvbnN0cnVjdCgmcC0+bWF0Y2hGaW5kZXJCYXNlKTsNCisgICNpZm5kZWYgXzdaSVBfU1QNCisgIE1hdGNoRmluZGVyTXRfQ29uc3RydWN0KCZwLT5tYXRjaEZpbmRlck10KTsNCisgIHAtPm1hdGNoRmluZGVyTXQuTWF0Y2hGaW5kZXIgPSAmcC0+bWF0Y2hGaW5kZXJCYXNlOw0KKyAgI2VuZGlmDQorDQorICB7DQorICAgIENMem1hRW5jUHJvcHMgcHJvcHM7DQorICAgIEx6bWFFbmNQcm9wc19Jbml0KCZwcm9wcyk7DQorICAgIEx6bWFFbmNfU2V0UHJvcHMocCwgJnByb3BzKTsNCisgIH0NCisNCisgICNpZm5kZWYgTFpNQV9MT0dfQlNSDQorICBMem1hRW5jX0Zhc3RQb3NJbml0KHAtPmdfRmFzdFBvcyk7DQorICAjZW5kaWYNCisNCisgIEx6bWFFbmNfSW5pdFByaWNlVGFibGVzKHAtPlByb2JQcmljZXMpOw0KKyAgcC0+bGl0UHJvYnMgPSAwOw0KKyAgcC0+c2F2ZVN0YXRlLmxpdFByb2JzID0gMDsNCit9DQorDQorQ0x6bWFFbmNIYW5kbGUgTHptYUVuY19DcmVhdGUoSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIHZvaWQgKnA7DQorICBwID0gYWxsb2MtPkFsbG9jKGFsbG9jLCBzaXplb2YoQ0x6bWFFbmMpKTsNCisgIGlmIChwICE9IDApDQorICAgIEx6bWFFbmNfQ29uc3RydWN0KChDTHptYUVuYyAqKXApOw0KKyAgcmV0dXJuIHA7DQorfQ0KKw0KK3ZvaWQgTHptYUVuY19GcmVlTGl0cyhDTHptYUVuYyAqcCwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIGFsbG9jLT5GcmVlKGFsbG9jLCBwLT5saXRQcm9icyk7DQorICBhbGxvYy0+RnJlZShhbGxvYywgcC0+c2F2ZVN0YXRlLmxpdFByb2JzKTsNCisgIHAtPmxpdFByb2JzID0gMDsNCisgIHAtPnNhdmVTdGF0ZS5saXRQcm9icyA9IDA7DQorfQ0KKw0KK3ZvaWQgTHptYUVuY19EZXN0cnVjdChDTHptYUVuYyAqcCwgSVN6QWxsb2MgKmFsbG9jLCBJU3pBbGxvYyAqYWxsb2NCaWcpDQorew0KKyAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgTWF0Y2hGaW5kZXJNdF9EZXN0cnVjdCgmcC0+bWF0Y2hGaW5kZXJNdCwgYWxsb2NCaWcpOw0KKyAgI2VuZGlmDQorICBNYXRjaEZpbmRlcl9GcmVlKCZwLT5tYXRjaEZpbmRlckJhc2UsIGFsbG9jQmlnKTsNCisgIEx6bWFFbmNfRnJlZUxpdHMocCwgYWxsb2MpOw0KKyAgUmFuZ2VFbmNfRnJlZSgmcC0+cmMsIGFsbG9jKTsNCit9DQorDQordm9pZCBMem1hRW5jX0Rlc3Ryb3koQ0x6bWFFbmNIYW5kbGUgcCwgSVN6QWxsb2MgKmFsbG9jLCBJU3pBbGxvYyAqYWxsb2NCaWcpDQorew0KKyAgTHptYUVuY19EZXN0cnVjdCgoQ0x6bWFFbmMgKilwLCBhbGxvYywgYWxsb2NCaWcpOw0KKyAgYWxsb2MtPkZyZWUoYWxsb2MsIHApOw0KK30NCisNCitzdGF0aWMgU1JlcyBMem1hRW5jX0NvZGVPbmVCbG9jayhDTHptYUVuYyAqcCwgQm9vbCB1c2VMaW1pdHMsIFVJbnQzMiBtYXhQYWNrU2l6ZSwgVUludDMyIG1heFVucGFja1NpemUpDQorew0KKyAgVUludDMyIG5vd1BvczMyLCBzdGFydFBvczMyOw0KKyAgaWYgKHAtPm5lZWRJbml0KQ0KKyAgew0KKyAgICBwLT5tYXRjaEZpbmRlci5Jbml0KHAtPm1hdGNoRmluZGVyT2JqKTsNCisgICAgcC0+bmVlZEluaXQgPSAwOw0KKyAgfQ0KKw0KKyAgaWYgKHAtPmZpbmlzaGVkKQ0KKyAgICByZXR1cm4gcC0+cmVzdWx0Ow0KKyAgUklOT0soQ2hlY2tFcnJvcnMocCkpOw0KKw0KKyAgbm93UG9zMzIgPSAoVUludDMyKXAtPm5vd1BvczY0Ow0KKyAgc3RhcnRQb3MzMiA9IG5vd1BvczMyOw0KKw0KKyAgaWYgKHAtPm5vd1BvczY0ID09IDApDQorICB7DQorICAgIFVJbnQzMiBudW1QYWlyczsNCisgICAgQnl0ZSBjdXJCeXRlOw0KKyAgICBpZiAocC0+bWF0Y2hGaW5kZXIuR2V0TnVtQXZhaWxhYmxlQnl0ZXMocC0+bWF0Y2hGaW5kZXJPYmopID09IDApDQorICAgICAgcmV0dXJuIEZsdXNoKHAsIG5vd1BvczMyKTsNCisgICAgUmVhZE1hdGNoRGlzdGFuY2VzKHAsICZudW1QYWlycyk7DQorICAgIFJhbmdlRW5jX0VuY29kZUJpdCgmcC0+cmMsICZwLT5pc01hdGNoW3AtPnN0YXRlXVswXSwgMCk7DQorICAgIHAtPnN0YXRlID0ga0xpdGVyYWxOZXh0U3RhdGVzW3AtPnN0YXRlXTsNCisgICAgY3VyQnl0ZSA9IHAtPm1hdGNoRmluZGVyLkdldEluZGV4Qnl0ZShwLT5tYXRjaEZpbmRlck9iaiwgMCAtIHAtPmFkZGl0aW9uYWxPZmZzZXQpOw0KKyAgICBMaXRFbmNfRW5jb2RlKCZwLT5yYywgcC0+bGl0UHJvYnMsIGN1ckJ5dGUpOw0KKyAgICBwLT5hZGRpdGlvbmFsT2Zmc2V0LS07DQorICAgIG5vd1BvczMyKys7DQorICB9DQorDQorICBpZiAocC0+bWF0Y2hGaW5kZXIuR2V0TnVtQXZhaWxhYmxlQnl0ZXMocC0+bWF0Y2hGaW5kZXJPYmopICE9IDApDQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBVSW50MzIgcG9zLCBsZW4sIHBvc1N0YXRlOw0KKw0KKyAgICBpZiAocC0+ZmFzdE1vZGUpDQorICAgICAgbGVuID0gR2V0T3B0aW11bUZhc3QocCwgJnBvcyk7DQorICAgIGVsc2UNCisgICAgICBsZW4gPSBHZXRPcHRpbXVtKHAsIG5vd1BvczMyLCAmcG9zKTsNCisNCisgICAgI2lmZGVmIFNIT1dfU1RBVDINCisgICAgcHJpbnRmKCJcbiBwb3MgPSAlNFgsICAgbGVuID0gJWQgICBwb3MgPSAlZCIsIG5vd1BvczMyLCBsZW4sIHBvcyk7DQorICAgICNlbmRpZg0KKw0KKyAgICBwb3NTdGF0ZSA9IG5vd1BvczMyICYgcC0+cGJNYXNrOw0KKyAgICBpZiAobGVuID09IDEgJiYgcG9zID09IChVSW50MzIpLTEpDQorICAgIHsNCisgICAgICBCeXRlIGN1ckJ5dGU7DQorICAgICAgQ0x6bWFQcm9iICpwcm9iczsNCisgICAgICBjb25zdCBCeXRlICpkYXRhOw0KKw0KKyAgICAgIFJhbmdlRW5jX0VuY29kZUJpdCgmcC0+cmMsICZwLT5pc01hdGNoW3AtPnN0YXRlXVtwb3NTdGF0ZV0sIDApOw0KKyAgICAgIGRhdGEgPSBwLT5tYXRjaEZpbmRlci5HZXRQb2ludGVyVG9DdXJyZW50UG9zKHAtPm1hdGNoRmluZGVyT2JqKSAtIHAtPmFkZGl0aW9uYWxPZmZzZXQ7DQorICAgICAgY3VyQnl0ZSA9ICpkYXRhOw0KKyAgICAgIHByb2JzID0gTElUX1BST0JTKG5vd1BvczMyLCAqKGRhdGEgLSAxKSk7DQorICAgICAgaWYgKElzQ2hhclN0YXRlKHAtPnN0YXRlKSkNCisgICAgICAgIExpdEVuY19FbmNvZGUoJnAtPnJjLCBwcm9icywgY3VyQnl0ZSk7DQorICAgICAgZWxzZQ0KKyAgICAgICAgTGl0RW5jX0VuY29kZU1hdGNoZWQoJnAtPnJjLCBwcm9icywgY3VyQnl0ZSwgKihkYXRhIC0gcC0+cmVwc1swXSAtIDEpKTsNCisgICAgICBwLT5zdGF0ZSA9IGtMaXRlcmFsTmV4dFN0YXRlc1twLT5zdGF0ZV07DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgUmFuZ2VFbmNfRW5jb2RlQml0KCZwLT5yYywgJnAtPmlzTWF0Y2hbcC0+c3RhdGVdW3Bvc1N0YXRlXSwgMSk7DQorICAgICAgaWYgKHBvcyA8IExaTUFfTlVNX1JFUFMpDQorICAgICAgew0KKyAgICAgICAgUmFuZ2VFbmNfRW5jb2RlQml0KCZwLT5yYywgJnAtPmlzUmVwW3AtPnN0YXRlXSwgMSk7DQorICAgICAgICBpZiAocG9zID09IDApDQorICAgICAgICB7DQorICAgICAgICAgIFJhbmdlRW5jX0VuY29kZUJpdCgmcC0+cmMsICZwLT5pc1JlcEcwW3AtPnN0YXRlXSwgMCk7DQorICAgICAgICAgIFJhbmdlRW5jX0VuY29kZUJpdCgmcC0+cmMsICZwLT5pc1JlcDBMb25nW3AtPnN0YXRlXVtwb3NTdGF0ZV0sICgobGVuID09IDEpID8gMCA6IDEpKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgVUludDMyIGRpc3RhbmNlID0gcC0+cmVwc1twb3NdOw0KKyAgICAgICAgICBSYW5nZUVuY19FbmNvZGVCaXQoJnAtPnJjLCAmcC0+aXNSZXBHMFtwLT5zdGF0ZV0sIDEpOw0KKyAgICAgICAgICBpZiAocG9zID09IDEpDQorICAgICAgICAgICAgUmFuZ2VFbmNfRW5jb2RlQml0KCZwLT5yYywgJnAtPmlzUmVwRzFbcC0+c3RhdGVdLCAwKTsNCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgUmFuZ2VFbmNfRW5jb2RlQml0KCZwLT5yYywgJnAtPmlzUmVwRzFbcC0+c3RhdGVdLCAxKTsNCisgICAgICAgICAgICBSYW5nZUVuY19FbmNvZGVCaXQoJnAtPnJjLCAmcC0+aXNSZXBHMltwLT5zdGF0ZV0sIHBvcyAtIDIpOw0KKyAgICAgICAgICAgIGlmIChwb3MgPT0gMykNCisgICAgICAgICAgICAgIHAtPnJlcHNbM10gPSBwLT5yZXBzWzJdOw0KKyAgICAgICAgICAgIHAtPnJlcHNbMl0gPSBwLT5yZXBzWzFdOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHAtPnJlcHNbMV0gPSBwLT5yZXBzWzBdOw0KKyAgICAgICAgICBwLT5yZXBzWzBdID0gZGlzdGFuY2U7DQorICAgICAgICB9DQorICAgICAgICBpZiAobGVuID09IDEpDQorICAgICAgICAgIHAtPnN0YXRlID0ga1Nob3J0UmVwTmV4dFN0YXRlc1twLT5zdGF0ZV07DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIExlbkVuY19FbmNvZGUyKCZwLT5yZXBMZW5FbmMsICZwLT5yYywgbGVuIC0gTFpNQV9NQVRDSF9MRU5fTUlOLCBwb3NTdGF0ZSwgIXAtPmZhc3RNb2RlLCBwLT5Qcm9iUHJpY2VzKTsNCisgICAgICAgICAgcC0+c3RhdGUgPSBrUmVwTmV4dFN0YXRlc1twLT5zdGF0ZV07DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBVSW50MzIgcG9zU2xvdDsNCisgICAgICAgIFJhbmdlRW5jX0VuY29kZUJpdCgmcC0+cmMsICZwLT5pc1JlcFtwLT5zdGF0ZV0sIDApOw0KKyAgICAgICAgcC0+c3RhdGUgPSBrTWF0Y2hOZXh0U3RhdGVzW3AtPnN0YXRlXTsNCisgICAgICAgIExlbkVuY19FbmNvZGUyKCZwLT5sZW5FbmMsICZwLT5yYywgbGVuIC0gTFpNQV9NQVRDSF9MRU5fTUlOLCBwb3NTdGF0ZSwgIXAtPmZhc3RNb2RlLCBwLT5Qcm9iUHJpY2VzKTsNCisgICAgICAgIHBvcyAtPSBMWk1BX05VTV9SRVBTOw0KKyAgICAgICAgR2V0UG9zU2xvdChwb3MsIHBvc1Nsb3QpOw0KKyAgICAgICAgUmNUcmVlX0VuY29kZSgmcC0+cmMsIHAtPnBvc1Nsb3RFbmNvZGVyW0dldExlblRvUG9zU3RhdGUobGVuKV0sIGtOdW1Qb3NTbG90Qml0cywgcG9zU2xvdCk7DQorICAgICAgICANCisgICAgICAgIGlmIChwb3NTbG90ID49IGtTdGFydFBvc01vZGVsSW5kZXgpDQorICAgICAgICB7DQorICAgICAgICAgIFVJbnQzMiBmb290ZXJCaXRzID0gKChwb3NTbG90ID4+IDEpIC0gMSk7DQorICAgICAgICAgIFVJbnQzMiBiYXNlID0gKCgyIHwgKHBvc1Nsb3QgJiAxKSkgPDwgZm9vdGVyQml0cyk7DQorICAgICAgICAgIFVJbnQzMiBwb3NSZWR1Y2VkID0gcG9zIC0gYmFzZTsNCisNCisgICAgICAgICAgaWYgKHBvc1Nsb3QgPCBrRW5kUG9zTW9kZWxJbmRleCkNCisgICAgICAgICAgICBSY1RyZWVfUmV2ZXJzZUVuY29kZSgmcC0+cmMsIHAtPnBvc0VuY29kZXJzICsgYmFzZSAtIHBvc1Nsb3QgLSAxLCBmb290ZXJCaXRzLCBwb3NSZWR1Y2VkKTsNCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgUmFuZ2VFbmNfRW5jb2RlRGlyZWN0Qml0cygmcC0+cmMsIHBvc1JlZHVjZWQgPj4ga051bUFsaWduQml0cywgZm9vdGVyQml0cyAtIGtOdW1BbGlnbkJpdHMpOw0KKyAgICAgICAgICAgIFJjVHJlZV9SZXZlcnNlRW5jb2RlKCZwLT5yYywgcC0+cG9zQWxpZ25FbmNvZGVyLCBrTnVtQWxpZ25CaXRzLCBwb3NSZWR1Y2VkICYga0FsaWduTWFzayk7DQorICAgICAgICAgICAgcC0+YWxpZ25QcmljZUNvdW50Kys7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHAtPnJlcHNbM10gPSBwLT5yZXBzWzJdOw0KKyAgICAgICAgcC0+cmVwc1syXSA9IHAtPnJlcHNbMV07DQorICAgICAgICBwLT5yZXBzWzFdID0gcC0+cmVwc1swXTsNCisgICAgICAgIHAtPnJlcHNbMF0gPSBwb3M7DQorICAgICAgICBwLT5tYXRjaFByaWNlQ291bnQrKzsNCisgICAgICB9DQorICAgIH0NCisgICAgcC0+YWRkaXRpb25hbE9mZnNldCAtPSBsZW47DQorICAgIG5vd1BvczMyICs9IGxlbjsNCisgICAgaWYgKHAtPmFkZGl0aW9uYWxPZmZzZXQgPT0gMCkNCisgICAgew0KKyAgICAgIFVJbnQzMiBwcm9jZXNzZWQ7DQorICAgICAgaWYgKCFwLT5mYXN0TW9kZSkNCisgICAgICB7DQorICAgICAgICBpZiAocC0+bWF0Y2hQcmljZUNvdW50ID49ICgxIDw8IDcpKQ0KKyAgICAgICAgICBGaWxsRGlzdGFuY2VzUHJpY2VzKHApOw0KKyAgICAgICAgaWYgKHAtPmFsaWduUHJpY2VDb3VudCA+PSBrQWxpZ25UYWJsZVNpemUpDQorICAgICAgICAgIEZpbGxBbGlnblByaWNlcyhwKTsNCisgICAgICB9DQorICAgICAgaWYgKHAtPm1hdGNoRmluZGVyLkdldE51bUF2YWlsYWJsZUJ5dGVzKHAtPm1hdGNoRmluZGVyT2JqKSA9PSAwKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgcHJvY2Vzc2VkID0gbm93UG9zMzIgLSBzdGFydFBvczMyOw0KKyAgICAgIGlmICh1c2VMaW1pdHMpDQorICAgICAgew0KKyAgICAgICAgaWYgKHByb2Nlc3NlZCArIGtOdW1PcHRzICsgMzAwID49IG1heFVucGFja1NpemUgfHwNCisgICAgICAgICAgICBSYW5nZUVuY19HZXRQcm9jZXNzZWQoJnAtPnJjKSArIGtOdW1PcHRzICogMiA+PSBtYXhQYWNrU2l6ZSkNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKHByb2Nlc3NlZCA+PSAoMSA8PCAxNSkpDQorICAgICAgew0KKyAgICAgICAgcC0+bm93UG9zNjQgKz0gbm93UG9zMzIgLSBzdGFydFBvczMyOw0KKyAgICAgICAgcmV0dXJuIENoZWNrRXJyb3JzKHApOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcC0+bm93UG9zNjQgKz0gbm93UG9zMzIgLSBzdGFydFBvczMyOw0KKyAgcmV0dXJuIEZsdXNoKHAsIG5vd1BvczMyKTsNCit9DQorDQorI2RlZmluZSBrQmlnSGFzaERpY0xpbWl0ICgoVUludDMyKTEgPDwgMjQpDQorDQorc3RhdGljIFNSZXMgTHptYUVuY19BbGxvYyhDTHptYUVuYyAqcCwgVUludDMyIGtlZXBXaW5kb3dTaXplLCBJU3pBbGxvYyAqYWxsb2MsIElTekFsbG9jICphbGxvY0JpZykNCit7DQorICBVSW50MzIgYmVmb3JlU2l6ZSA9IGtOdW1PcHRzOw0KKyAgaWYgKCFSYW5nZUVuY19BbGxvYygmcC0+cmMsIGFsbG9jKSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX01FTTsNCisgICNpZm5kZWYgXzdaSVBfU1QNCisgIHAtPm10TW9kZSA9IChwLT5tdWx0aVRocmVhZCAmJiAhcC0+ZmFzdE1vZGUgJiYgKHAtPm1hdGNoRmluZGVyQmFzZS5idE1vZGUgIT0gMCkpOw0KKyAgI2VuZGlmDQorDQorICB7DQorICAgIHVuc2lnbmVkIGxjbHAgPSBwLT5sYyArIHAtPmxwOw0KKyAgICBpZiAocC0+bGl0UHJvYnMgPT0gMCB8fCBwLT5zYXZlU3RhdGUubGl0UHJvYnMgPT0gMCB8fCBwLT5sY2xwICE9IGxjbHApDQorICAgIHsNCisgICAgICBMem1hRW5jX0ZyZWVMaXRzKHAsIGFsbG9jKTsNCisgICAgICBwLT5saXRQcm9icyA9IChDTHptYVByb2IgKilhbGxvYy0+QWxsb2MoYWxsb2MsICgweDMwMCA8PCBsY2xwKSAqIHNpemVvZihDTHptYVByb2IpKTsNCisgICAgICBwLT5zYXZlU3RhdGUubGl0UHJvYnMgPSAoQ0x6bWFQcm9iICopYWxsb2MtPkFsbG9jKGFsbG9jLCAoMHgzMDAgPDwgbGNscCkgKiBzaXplb2YoQ0x6bWFQcm9iKSk7DQorICAgICAgaWYgKHAtPmxpdFByb2JzID09IDAgfHwgcC0+c2F2ZVN0YXRlLmxpdFByb2JzID09IDApDQorICAgICAgew0KKyAgICAgICAgTHptYUVuY19GcmVlTGl0cyhwLCBhbGxvYyk7DQorICAgICAgICByZXR1cm4gU1pfRVJST1JfTUVNOw0KKyAgICAgIH0NCisgICAgICBwLT5sY2xwID0gbGNscDsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgcC0+bWF0Y2hGaW5kZXJCYXNlLmJpZ0hhc2ggPSAocC0+ZGljdFNpemUgPiBrQmlnSGFzaERpY0xpbWl0KTsNCisNCisgIGlmIChiZWZvcmVTaXplICsgcC0+ZGljdFNpemUgPCBrZWVwV2luZG93U2l6ZSkNCisgICAgYmVmb3JlU2l6ZSA9IGtlZXBXaW5kb3dTaXplIC0gcC0+ZGljdFNpemU7DQorDQorICAjaWZuZGVmIF83WklQX1NUDQorICBpZiAocC0+bXRNb2RlKQ0KKyAgew0KKyAgICBSSU5PSyhNYXRjaEZpbmRlck10X0NyZWF0ZSgmcC0+bWF0Y2hGaW5kZXJNdCwgcC0+ZGljdFNpemUsIGJlZm9yZVNpemUsIHAtPm51bUZhc3RCeXRlcywgTFpNQV9NQVRDSF9MRU5fTUFYLCBhbGxvY0JpZykpOw0KKyAgICBwLT5tYXRjaEZpbmRlck9iaiA9ICZwLT5tYXRjaEZpbmRlck10Ow0KKyAgICBNYXRjaEZpbmRlck10X0NyZWF0ZVZUYWJsZSgmcC0+bWF0Y2hGaW5kZXJNdCwgJnAtPm1hdGNoRmluZGVyKTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBpZiAoIU1hdGNoRmluZGVyX0NyZWF0ZSgmcC0+bWF0Y2hGaW5kZXJCYXNlLCBwLT5kaWN0U2l6ZSwgYmVmb3JlU2l6ZSwgcC0+bnVtRmFzdEJ5dGVzLCBMWk1BX01BVENIX0xFTl9NQVgsIGFsbG9jQmlnKSkNCisgICAgICByZXR1cm4gU1pfRVJST1JfTUVNOw0KKyAgICBwLT5tYXRjaEZpbmRlck9iaiA9ICZwLT5tYXRjaEZpbmRlckJhc2U7DQorICAgIE1hdGNoRmluZGVyX0NyZWF0ZVZUYWJsZSgmcC0+bWF0Y2hGaW5kZXJCYXNlLCAmcC0+bWF0Y2hGaW5kZXIpOw0KKyAgfQ0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCit2b2lkIEx6bWFFbmNfSW5pdChDTHptYUVuYyAqcCkNCit7DQorICBVSW50MzIgaTsNCisgIHAtPnN0YXRlID0gMDsNCisgIGZvciAoaSA9IDAgOyBpIDwgTFpNQV9OVU1fUkVQUzsgaSsrKQ0KKyAgICBwLT5yZXBzW2ldID0gMDsNCisNCisgIFJhbmdlRW5jX0luaXQoJnAtPnJjKTsNCisNCisNCisgIGZvciAoaSA9IDA7IGkgPCBrTnVtU3RhdGVzOyBpKyspDQorICB7DQorICAgIFVJbnQzMiBqOw0KKyAgICBmb3IgKGogPSAwOyBqIDwgTFpNQV9OVU1fUEJfU1RBVEVTX01BWDsgaisrKQ0KKyAgICB7DQorICAgICAgcC0+aXNNYXRjaFtpXVtqXSA9IGtQcm9iSW5pdFZhbHVlOw0KKyAgICAgIHAtPmlzUmVwMExvbmdbaV1bal0gPSBrUHJvYkluaXRWYWx1ZTsNCisgICAgfQ0KKyAgICBwLT5pc1JlcFtpXSA9IGtQcm9iSW5pdFZhbHVlOw0KKyAgICBwLT5pc1JlcEcwW2ldID0ga1Byb2JJbml0VmFsdWU7DQorICAgIHAtPmlzUmVwRzFbaV0gPSBrUHJvYkluaXRWYWx1ZTsNCisgICAgcC0+aXNSZXBHMltpXSA9IGtQcm9iSW5pdFZhbHVlOw0KKyAgfQ0KKw0KKyAgew0KKyAgICBVSW50MzIgbnVtID0gMHgzMDAgPDwgKHAtPmxwICsgcC0+bGMpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspDQorICAgICAgcC0+bGl0UHJvYnNbaV0gPSBrUHJvYkluaXRWYWx1ZTsNCisgIH0NCisNCisgIHsNCisgICAgZm9yIChpID0gMDsgaSA8IGtOdW1MZW5Ub1Bvc1N0YXRlczsgaSsrKQ0KKyAgICB7DQorICAgICAgQ0x6bWFQcm9iICpwcm9icyA9IHAtPnBvc1Nsb3RFbmNvZGVyW2ldOw0KKyAgICAgIFVJbnQzMiBqOw0KKyAgICAgIGZvciAoaiA9IDA7IGogPCAoMSA8PCBrTnVtUG9zU2xvdEJpdHMpOyBqKyspDQorICAgICAgICBwcm9ic1tqXSA9IGtQcm9iSW5pdFZhbHVlOw0KKyAgICB9DQorICB9DQorICB7DQorICAgIGZvciAoaSA9IDA7IGkgPCBrTnVtRnVsbERpc3RhbmNlcyAtIGtFbmRQb3NNb2RlbEluZGV4OyBpKyspDQorICAgICAgcC0+cG9zRW5jb2RlcnNbaV0gPSBrUHJvYkluaXRWYWx1ZTsNCisgIH0NCisNCisgIExlbkVuY19Jbml0KCZwLT5sZW5FbmMucCk7DQorICBMZW5FbmNfSW5pdCgmcC0+cmVwTGVuRW5jLnApOw0KKw0KKyAgZm9yIChpID0gMDsgaSA8ICgxIDw8IGtOdW1BbGlnbkJpdHMpOyBpKyspDQorICAgIHAtPnBvc0FsaWduRW5jb2RlcltpXSA9IGtQcm9iSW5pdFZhbHVlOw0KKw0KKyAgcC0+b3B0aW11bUVuZEluZGV4ID0gMDsNCisgIHAtPm9wdGltdW1DdXJyZW50SW5kZXggPSAwOw0KKyAgcC0+YWRkaXRpb25hbE9mZnNldCA9IDA7DQorDQorICBwLT5wYk1hc2sgPSAoMSA8PCBwLT5wYikgLSAxOw0KKyAgcC0+bHBNYXNrID0gKDEgPDwgcC0+bHApIC0gMTsNCit9DQorDQordm9pZCBMem1hRW5jX0luaXRQcmljZXMoQ0x6bWFFbmMgKnApDQorew0KKyAgaWYgKCFwLT5mYXN0TW9kZSkNCisgIHsNCisgICAgRmlsbERpc3RhbmNlc1ByaWNlcyhwKTsNCisgICAgRmlsbEFsaWduUHJpY2VzKHApOw0KKyAgfQ0KKw0KKyAgcC0+bGVuRW5jLnRhYmxlU2l6ZSA9DQorICBwLT5yZXBMZW5FbmMudGFibGVTaXplID0NCisgICAgICBwLT5udW1GYXN0Qnl0ZXMgKyAxIC0gTFpNQV9NQVRDSF9MRU5fTUlOOw0KKyAgTGVuUHJpY2VFbmNfVXBkYXRlVGFibGVzKCZwLT5sZW5FbmMsIDEgPDwgcC0+cGIsIHAtPlByb2JQcmljZXMpOw0KKyAgTGVuUHJpY2VFbmNfVXBkYXRlVGFibGVzKCZwLT5yZXBMZW5FbmMsIDEgPDwgcC0+cGIsIHAtPlByb2JQcmljZXMpOw0KK30NCisNCitzdGF0aWMgU1JlcyBMem1hRW5jX0FsbG9jQW5kSW5pdChDTHptYUVuYyAqcCwgVUludDMyIGtlZXBXaW5kb3dTaXplLCBJU3pBbGxvYyAqYWxsb2MsIElTekFsbG9jICphbGxvY0JpZykNCit7DQorICBVSW50MzIgaTsNCisgIGZvciAoaSA9IDA7IGkgPCAoVUludDMyKWtEaWNMb2dTaXplTWF4Q29tcHJlc3M7IGkrKykNCisgICAgaWYgKHAtPmRpY3RTaXplIDw9ICgoVUludDMyKTEgPDwgaSkpDQorICAgICAgYnJlYWs7DQorICBwLT5kaXN0VGFibGVTaXplID0gaSAqIDI7DQorDQorICBwLT5maW5pc2hlZCA9IEZhbHNlOw0KKyAgcC0+cmVzdWx0ID0gU1pfT0s7DQorICBSSU5PSyhMem1hRW5jX0FsbG9jKHAsIGtlZXBXaW5kb3dTaXplLCBhbGxvYywgYWxsb2NCaWcpKTsNCisgIEx6bWFFbmNfSW5pdChwKTsNCisgIEx6bWFFbmNfSW5pdFByaWNlcyhwKTsNCisgIHAtPm5vd1BvczY0ID0gMDsNCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorc3RhdGljIFNSZXMgTHptYUVuY19QcmVwYXJlKENMem1hRW5jSGFuZGxlIHBwLCBJU2VxT3V0U3RyZWFtICpvdXRTdHJlYW0sIElTZXFJblN0cmVhbSAqaW5TdHJlYW0sDQorICAgIElTekFsbG9jICphbGxvYywgSVN6QWxsb2MgKmFsbG9jQmlnKQ0KK3sNCisgIENMem1hRW5jICpwID0gKENMem1hRW5jICopcHA7DQorICBwLT5tYXRjaEZpbmRlckJhc2Uuc3RyZWFtID0gaW5TdHJlYW07DQorICBwLT5uZWVkSW5pdCA9IDE7DQorICBwLT5yYy5vdXRTdHJlYW0gPSBvdXRTdHJlYW07DQorICByZXR1cm4gTHptYUVuY19BbGxvY0FuZEluaXQocCwgMCwgYWxsb2MsIGFsbG9jQmlnKTsNCit9DQorDQorU1JlcyBMem1hRW5jX1ByZXBhcmVGb3JMem1hMihDTHptYUVuY0hhbmRsZSBwcCwNCisgICAgSVNlcUluU3RyZWFtICppblN0cmVhbSwgVUludDMyIGtlZXBXaW5kb3dTaXplLA0KKyAgICBJU3pBbGxvYyAqYWxsb2MsIElTekFsbG9jICphbGxvY0JpZykNCit7DQorICBDTHptYUVuYyAqcCA9IChDTHptYUVuYyAqKXBwOw0KKyAgcC0+bWF0Y2hGaW5kZXJCYXNlLnN0cmVhbSA9IGluU3RyZWFtOw0KKyAgcC0+bmVlZEluaXQgPSAxOw0KKyAgcmV0dXJuIEx6bWFFbmNfQWxsb2NBbmRJbml0KHAsIGtlZXBXaW5kb3dTaXplLCBhbGxvYywgYWxsb2NCaWcpOw0KK30NCisNCitzdGF0aWMgdm9pZCBMem1hRW5jX1NldElucHV0QnVmKENMem1hRW5jICpwLCBjb25zdCBCeXRlICpzcmMsIFNpemVUIHNyY0xlbikNCit7DQorICBwLT5tYXRjaEZpbmRlckJhc2UuZGlyZWN0SW5wdXQgPSAxOw0KKyAgcC0+bWF0Y2hGaW5kZXJCYXNlLmJ1ZmZlckJhc2UgPSAoQnl0ZSAqKXNyYzsNCisgIHAtPm1hdGNoRmluZGVyQmFzZS5kaXJlY3RJbnB1dFJlbSA9IHNyY0xlbjsNCit9DQorDQorU1JlcyBMem1hRW5jX01lbVByZXBhcmUoQ0x6bWFFbmNIYW5kbGUgcHAsIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgc3JjTGVuLA0KKyAgICBVSW50MzIga2VlcFdpbmRvd1NpemUsIElTekFsbG9jICphbGxvYywgSVN6QWxsb2MgKmFsbG9jQmlnKQ0KK3sNCisgIENMem1hRW5jICpwID0gKENMem1hRW5jICopcHA7DQorICBMem1hRW5jX1NldElucHV0QnVmKHAsIHNyYywgc3JjTGVuKTsNCisgIHAtPm5lZWRJbml0ID0gMTsNCisNCisgIHJldHVybiBMem1hRW5jX0FsbG9jQW5kSW5pdChwLCBrZWVwV2luZG93U2l6ZSwgYWxsb2MsIGFsbG9jQmlnKTsNCit9DQorDQordm9pZCBMem1hRW5jX0ZpbmlzaChDTHptYUVuY0hhbmRsZSBwcCkNCit7DQorICAjaWZuZGVmIF83WklQX1NUDQorICBDTHptYUVuYyAqcCA9IChDTHptYUVuYyAqKXBwOw0KKyAgaWYgKHAtPm10TW9kZSkNCisgICAgTWF0Y2hGaW5kZXJNdF9SZWxlYXNlU3RyZWFtKCZwLT5tYXRjaEZpbmRlck10KTsNCisgICNlbHNlDQorICBwcCA9IHBwOw0KKyAgI2VuZGlmDQorfQ0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgSVNlcU91dFN0cmVhbSBmdW5jVGFibGU7DQorICBCeXRlICpkYXRhOw0KKyAgU2l6ZVQgcmVtOw0KKyAgQm9vbCBvdmVyZmxvdzsNCit9IENTZXFPdXRTdHJlYW1CdWY7DQorDQorc3RhdGljIHNpemVfdCBNeVdyaXRlKHZvaWQgKnBwLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkNCit7DQorICBDU2VxT3V0U3RyZWFtQnVmICpwID0gKENTZXFPdXRTdHJlYW1CdWYgKilwcDsNCisgIGlmIChwLT5yZW0gPCBzaXplKQ0KKyAgew0KKyAgICBzaXplID0gcC0+cmVtOw0KKyAgICBwLT5vdmVyZmxvdyA9IFRydWU7DQorICB9DQorICBtZW1jcHkocC0+ZGF0YSwgZGF0YSwgc2l6ZSk7DQorICBwLT5yZW0gLT0gc2l6ZTsNCisgIHAtPmRhdGEgKz0gc2l6ZTsNCisgIHJldHVybiBzaXplOw0KK30NCisNCisNCitVSW50MzIgTHptYUVuY19HZXROdW1BdmFpbGFibGVCeXRlcyhDTHptYUVuY0hhbmRsZSBwcCkNCit7DQorICBjb25zdCBDTHptYUVuYyAqcCA9IChDTHptYUVuYyAqKXBwOw0KKyAgcmV0dXJuIHAtPm1hdGNoRmluZGVyLkdldE51bUF2YWlsYWJsZUJ5dGVzKHAtPm1hdGNoRmluZGVyT2JqKTsNCit9DQorDQorY29uc3QgQnl0ZSAqTHptYUVuY19HZXRDdXJCdWYoQ0x6bWFFbmNIYW5kbGUgcHApDQorew0KKyAgY29uc3QgQ0x6bWFFbmMgKnAgPSAoQ0x6bWFFbmMgKilwcDsNCisgIHJldHVybiBwLT5tYXRjaEZpbmRlci5HZXRQb2ludGVyVG9DdXJyZW50UG9zKHAtPm1hdGNoRmluZGVyT2JqKSAtIHAtPmFkZGl0aW9uYWxPZmZzZXQ7DQorfQ0KKw0KK1NSZXMgTHptYUVuY19Db2RlT25lTWVtQmxvY2soQ0x6bWFFbmNIYW5kbGUgcHAsIEJvb2wgcmVJbml0LA0KKyAgICBCeXRlICpkZXN0LCBzaXplX3QgKmRlc3RMZW4sIFVJbnQzMiBkZXNpcmVkUGFja1NpemUsIFVJbnQzMiAqdW5wYWNrU2l6ZSkNCit7DQorICBDTHptYUVuYyAqcCA9IChDTHptYUVuYyAqKXBwOw0KKyAgVUludDY0IG5vd1BvczY0Ow0KKyAgU1JlcyByZXM7DQorICBDU2VxT3V0U3RyZWFtQnVmIG91dFN0cmVhbTsNCisNCisgIG91dFN0cmVhbS5mdW5jVGFibGUuV3JpdGUgPSBNeVdyaXRlOw0KKyAgb3V0U3RyZWFtLmRhdGEgPSBkZXN0Ow0KKyAgb3V0U3RyZWFtLnJlbSA9ICpkZXN0TGVuOw0KKyAgb3V0U3RyZWFtLm92ZXJmbG93ID0gRmFsc2U7DQorDQorICBwLT53cml0ZUVuZE1hcmsgPSBGYWxzZTsNCisgIHAtPmZpbmlzaGVkID0gRmFsc2U7DQorICBwLT5yZXN1bHQgPSBTWl9PSzsNCisNCisgIGlmIChyZUluaXQpDQorICAgIEx6bWFFbmNfSW5pdChwKTsNCisgIEx6bWFFbmNfSW5pdFByaWNlcyhwKTsNCisgIG5vd1BvczY0ID0gcC0+bm93UG9zNjQ7DQorICBSYW5nZUVuY19Jbml0KCZwLT5yYyk7DQorICBwLT5yYy5vdXRTdHJlYW0gPSAmb3V0U3RyZWFtLmZ1bmNUYWJsZTsNCisNCisgIHJlcyA9IEx6bWFFbmNfQ29kZU9uZUJsb2NrKHAsIFRydWUsIGRlc2lyZWRQYWNrU2l6ZSwgKnVucGFja1NpemUpOw0KKyAgDQorICAqdW5wYWNrU2l6ZSA9IChVSW50MzIpKHAtPm5vd1BvczY0IC0gbm93UG9zNjQpOw0KKyAgKmRlc3RMZW4gLT0gb3V0U3RyZWFtLnJlbTsNCisgIGlmIChvdXRTdHJlYW0ub3ZlcmZsb3cpDQorICAgIHJldHVybiBTWl9FUlJPUl9PVVRQVVRfRU9GOw0KKw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorc3RhdGljIFNSZXMgTHptYUVuY19FbmNvZGUyKENMem1hRW5jICpwLCBJQ29tcHJlc3NQcm9ncmVzcyAqcHJvZ3Jlc3MpDQorew0KKyAgU1JlcyByZXMgPSBTWl9PSzsNCisNCisgICNpZm5kZWYgXzdaSVBfU1QNCisgIEJ5dGUgYWxsb2NhRHVtbXlbMHgzMDBdOw0KKyAgYWxsb2NhRHVtbXlbMF0gPSAwOw0KKyAgYWxsb2NhRHVtbXlbMV0gPSBhbGxvY2FEdW1teVswXTsNCisgICNlbmRpZg0KKw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgcmVzID0gTHptYUVuY19Db2RlT25lQmxvY2socCwgRmFsc2UsIDAsIDApOw0KKyAgICBpZiAocmVzICE9IFNaX09LIHx8IHAtPmZpbmlzaGVkICE9IDApDQorICAgICAgYnJlYWs7DQorICAgIGlmIChwcm9ncmVzcyAhPSAwKQ0KKyAgICB7DQorICAgICAgcmVzID0gcHJvZ3Jlc3MtPlByb2dyZXNzKHByb2dyZXNzLCBwLT5ub3dQb3M2NCwgUmFuZ2VFbmNfR2V0UHJvY2Vzc2VkKCZwLT5yYykpOw0KKyAgICAgIGlmIChyZXMgIT0gU1pfT0spDQorICAgICAgew0KKyAgICAgICAgcmVzID0gU1pfRVJST1JfUFJPR1JFU1M7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIEx6bWFFbmNfRmluaXNoKHApOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorU1JlcyBMem1hRW5jX0VuY29kZShDTHptYUVuY0hhbmRsZSBwcCwgSVNlcU91dFN0cmVhbSAqb3V0U3RyZWFtLCBJU2VxSW5TdHJlYW0gKmluU3RyZWFtLCBJQ29tcHJlc3NQcm9ncmVzcyAqcHJvZ3Jlc3MsDQorICAgIElTekFsbG9jICphbGxvYywgSVN6QWxsb2MgKmFsbG9jQmlnKQ0KK3sNCisgIFJJTk9LKEx6bWFFbmNfUHJlcGFyZShwcCwgb3V0U3RyZWFtLCBpblN0cmVhbSwgYWxsb2MsIGFsbG9jQmlnKSk7DQorICByZXR1cm4gTHptYUVuY19FbmNvZGUyKChDTHptYUVuYyAqKXBwLCBwcm9ncmVzcyk7DQorfQ0KKw0KK1NSZXMgTHptYUVuY19Xcml0ZVByb3BlcnRpZXMoQ0x6bWFFbmNIYW5kbGUgcHAsIEJ5dGUgKnByb3BzLCBTaXplVCAqc2l6ZSkNCit7DQorICBDTHptYUVuYyAqcCA9IChDTHptYUVuYyAqKXBwOw0KKyAgaW50IGk7DQorICBVSW50MzIgZGljdFNpemUgPSBwLT5kaWN0U2l6ZTsNCisgIGlmICgqc2l6ZSA8IExaTUFfUFJPUFNfU0laRSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX1BBUkFNOw0KKyAgKnNpemUgPSBMWk1BX1BST1BTX1NJWkU7DQorICBwcm9wc1swXSA9IChCeXRlKSgocC0+cGIgKiA1ICsgcC0+bHApICogOSArIHAtPmxjKTsNCisNCisgIGZvciAoaSA9IDExOyBpIDw9IDMwOyBpKyspDQorICB7DQorICAgIGlmIChkaWN0U2l6ZSA8PSAoKFVJbnQzMikyIDw8IGkpKQ0KKyAgICB7DQorICAgICAgZGljdFNpemUgPSAoMiA8PCBpKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoZGljdFNpemUgPD0gKChVSW50MzIpMyA8PCBpKSkNCisgICAgew0KKyAgICAgIGRpY3RTaXplID0gKDMgPDwgaSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisNCisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspDQorICAgIHByb3BzWzEgKyBpXSA9IChCeXRlKShkaWN0U2l6ZSA+PiAoOCAqIGkpKTsNCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorU1JlcyBMem1hRW5jX01lbUVuY29kZShDTHptYUVuY0hhbmRsZSBwcCwgQnl0ZSAqZGVzdCwgU2l6ZVQgKmRlc3RMZW4sIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgc3JjTGVuLA0KKyAgICBpbnQgd3JpdGVFbmRNYXJrLCBJQ29tcHJlc3NQcm9ncmVzcyAqcHJvZ3Jlc3MsIElTekFsbG9jICphbGxvYywgSVN6QWxsb2MgKmFsbG9jQmlnKQ0KK3sNCisgIFNSZXMgcmVzOw0KKyAgQ0x6bWFFbmMgKnAgPSAoQ0x6bWFFbmMgKilwcDsNCisNCisgIENTZXFPdXRTdHJlYW1CdWYgb3V0U3RyZWFtOw0KKw0KKyAgTHptYUVuY19TZXRJbnB1dEJ1ZihwLCBzcmMsIHNyY0xlbik7DQorDQorICBvdXRTdHJlYW0uZnVuY1RhYmxlLldyaXRlID0gTXlXcml0ZTsNCisgIG91dFN0cmVhbS5kYXRhID0gZGVzdDsNCisgIG91dFN0cmVhbS5yZW0gPSAqZGVzdExlbjsNCisgIG91dFN0cmVhbS5vdmVyZmxvdyA9IEZhbHNlOw0KKw0KKyAgcC0+d3JpdGVFbmRNYXJrID0gd3JpdGVFbmRNYXJrOw0KKw0KKyAgcC0+cmMub3V0U3RyZWFtID0gJm91dFN0cmVhbS5mdW5jVGFibGU7DQorICByZXMgPSBMem1hRW5jX01lbVByZXBhcmUocHAsIHNyYywgc3JjTGVuLCAwLCBhbGxvYywgYWxsb2NCaWcpOw0KKyAgaWYgKHJlcyA9PSBTWl9PSykNCisgICAgcmVzID0gTHptYUVuY19FbmNvZGUyKHAsIHByb2dyZXNzKTsNCisNCisgICpkZXN0TGVuIC09IG91dFN0cmVhbS5yZW07DQorICBpZiAob3V0U3RyZWFtLm92ZXJmbG93KQ0KKyAgICByZXR1cm4gU1pfRVJST1JfT1VUUFVUX0VPRjsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK1NSZXMgTHptYUVuY29kZShCeXRlICpkZXN0LCBTaXplVCAqZGVzdExlbiwgY29uc3QgQnl0ZSAqc3JjLCBTaXplVCBzcmNMZW4sDQorICAgIGNvbnN0IENMem1hRW5jUHJvcHMgKnByb3BzLCBCeXRlICpwcm9wc0VuY29kZWQsIFNpemVUICpwcm9wc1NpemUsIGludCB3cml0ZUVuZE1hcmssDQorICAgIElDb21wcmVzc1Byb2dyZXNzICpwcm9ncmVzcywgSVN6QWxsb2MgKmFsbG9jLCBJU3pBbGxvYyAqYWxsb2NCaWcpDQorew0KKyAgQ0x6bWFFbmMgKnAgPSAoQ0x6bWFFbmMgKilMem1hRW5jX0NyZWF0ZShhbGxvYyk7DQorICBTUmVzIHJlczsNCisgIGlmIChwID09IDApDQorICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorDQorICByZXMgPSBMem1hRW5jX1NldFByb3BzKHAsIHByb3BzKTsNCisgIGlmIChyZXMgPT0gU1pfT0spDQorICB7DQorICAgIHJlcyA9IEx6bWFFbmNfV3JpdGVQcm9wZXJ0aWVzKHAsIHByb3BzRW5jb2RlZCwgcHJvcHNTaXplKTsNCisgICAgaWYgKHJlcyA9PSBTWl9PSykNCisgICAgICByZXMgPSBMem1hRW5jX01lbUVuY29kZShwLCBkZXN0LCBkZXN0TGVuLCBzcmMsIHNyY0xlbiwNCisgICAgICAgICAgd3JpdGVFbmRNYXJrLCBwcm9ncmVzcywgYWxsb2MsIGFsbG9jQmlnKTsNCisgIH0NCisNCisgIEx6bWFFbmNfRGVzdHJveShwLCBhbGxvYywgYWxsb2NCaWcpOw0KKyAgcmV0dXJuIHJlczsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DL0x6bWFFbmMuaCBiL2x6bWEvQy9Mem1hRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4MDZiNAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9Mem1hRW5jLmgKQEAgLTAsMCArMSw3OCBAQAorLyogIEx6bWFFbmMuaCAtLSBMWk1BIEVuY29kZXINCisyMDEzLTAxLTE4IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2lmbmRlZiBfX0xaTUFfRU5DX0gNCisjZGVmaW5lIF9fTFpNQV9FTkNfSA0KKw0KKyNpbmNsdWRlICI3elR5cGVzLmgiDQorDQorRVhURVJOX0NfQkVHSU4NCisNCisjZGVmaW5lIExaTUFfUFJPUFNfU0laRSA1DQorDQordHlwZWRlZiBzdHJ1Y3QgX0NMem1hRW5jUHJvcHMNCit7DQorICBpbnQgbGV2ZWw7ICAgICAgIC8qICAwIDw9IGxldmVsIDw9IDkgKi8NCisgIFVJbnQzMiBkaWN0U2l6ZTsgLyogKDEgPDwgMTIpIDw9IGRpY3RTaXplIDw9ICgxIDw8IDI3KSBmb3IgMzItYml0IHZlcnNpb24NCisgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTIpIDw9IGRpY3RTaXplIDw9ICgxIDw8IDMwKSBmb3IgNjQtYml0IHZlcnNpb24NCisgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgPSAoMSA8PCAyNCkgKi8NCisgIFVJbnQ2NCByZWR1Y2VTaXplOyAvKiBlc3RpbWF0ZWQgc2l6ZSBvZiBkYXRhIHRoYXQgd2lsbCBiZSBjb21wcmVzc2VkLiBkZWZhdWx0ID0gMHhGRkZGRkZGRi4NCisgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGVyIHVzZXMgdGhpcyB2YWx1ZSB0byByZWR1Y2UgZGljdGlvbmFyeSBzaXplICovDQorICBpbnQgbGM7ICAgICAgICAgIC8qIDAgPD0gbGMgPD0gOCwgZGVmYXVsdCA9IDMgKi8NCisgIGludCBscDsgICAgICAgICAgLyogMCA8PSBscCA8PSA0LCBkZWZhdWx0ID0gMCAqLw0KKyAgaW50IHBiOyAgICAgICAgICAvKiAwIDw9IHBiIDw9IDQsIGRlZmF1bHQgPSAyICovDQorICBpbnQgYWxnbzsgICAgICAgIC8qIDAgLSBmYXN0LCAxIC0gbm9ybWFsLCBkZWZhdWx0ID0gMSAqLw0KKyAgaW50IGZiOyAgICAgICAgICAvKiA1IDw9IGZiIDw9IDI3MywgZGVmYXVsdCA9IDMyICovDQorICBpbnQgYnRNb2RlOyAgICAgIC8qIDAgLSBoYXNoQ2hhaW4gTW9kZSwgMSAtIGJpblRyZWUgbW9kZSAtIG5vcm1hbCwgZGVmYXVsdCA9IDEgKi8NCisgIGludCBudW1IYXNoQnl0ZXM7IC8qIDIsIDMgb3IgNCwgZGVmYXVsdCA9IDQgKi8NCisgIFVJbnQzMiBtYzsgICAgICAgIC8qIDEgPD0gbWMgPD0gKDEgPDwgMzApLCBkZWZhdWx0ID0gMzIgKi8NCisgIHVuc2lnbmVkIHdyaXRlRW5kTWFyazsgIC8qIDAgLSBkbyBub3Qgd3JpdGUgRU9QTSwgMSAtIHdyaXRlIEVPUE0sIGRlZmF1bHQgPSAwICovDQorICBpbnQgbnVtVGhyZWFkczsgIC8qIDEgb3IgMiwgZGVmYXVsdCA9IDIgKi8NCit9IENMem1hRW5jUHJvcHM7DQorDQordm9pZCBMem1hRW5jUHJvcHNfSW5pdChDTHptYUVuY1Byb3BzICpwKTsNCit2b2lkIEx6bWFFbmNQcm9wc19Ob3JtYWxpemUoQ0x6bWFFbmNQcm9wcyAqcCk7DQorVUludDMyIEx6bWFFbmNQcm9wc19HZXREaWN0U2l6ZShjb25zdCBDTHptYUVuY1Byb3BzICpwcm9wczIpOw0KKw0KKw0KKy8qIC0tLS0tLS0tLS0gQ0x6bWFFbmNIYW5kbGUgSW50ZXJmYWNlIC0tLS0tLS0tLS0gKi8NCisNCisvKiBMem1hRW5jXyogZnVuY3Rpb25zIGNhbiByZXR1cm4gdGhlIGZvbGxvd2luZyBleGl0IGNvZGVzOg0KK1JldHVybnM6DQorICBTWl9PSyAgICAgICAgICAgLSBPSw0KKyAgU1pfRVJST1JfTUVNICAgIC0gTWVtb3J5IGFsbG9jYXRpb24gZXJyb3INCisgIFNaX0VSUk9SX1BBUkFNICAtIEluY29ycmVjdCBwYXJhbWF0ZXIgaW4gcHJvcHMNCisgIFNaX0VSUk9SX1dSSVRFICAtIFdyaXRlIGNhbGxiYWNrIGVycm9yLg0KKyAgU1pfRVJST1JfUFJPR1JFU1MgLSBzb21lIGJyZWFrIGZyb20gcHJvZ3Jlc3MgY2FsbGJhY2sNCisgIFNaX0VSUk9SX1RIUkVBRCAtIGVycm9ycyBpbiBtdWx0aXRocmVhZGluZyBmdW5jdGlvbnMgKG9ubHkgZm9yIE10IHZlcnNpb24pDQorKi8NCisNCit0eXBlZGVmIHZvaWQgKiBDTHptYUVuY0hhbmRsZTsNCisNCitDTHptYUVuY0hhbmRsZSBMem1hRW5jX0NyZWF0ZShJU3pBbGxvYyAqYWxsb2MpOw0KK3ZvaWQgTHptYUVuY19EZXN0cm95KENMem1hRW5jSGFuZGxlIHAsIElTekFsbG9jICphbGxvYywgSVN6QWxsb2MgKmFsbG9jQmlnKTsNCitTUmVzIEx6bWFFbmNfU2V0UHJvcHMoQ0x6bWFFbmNIYW5kbGUgcCwgY29uc3QgQ0x6bWFFbmNQcm9wcyAqcHJvcHMpOw0KK1NSZXMgTHptYUVuY19Xcml0ZVByb3BlcnRpZXMoQ0x6bWFFbmNIYW5kbGUgcCwgQnl0ZSAqcHJvcGVydGllcywgU2l6ZVQgKnNpemUpOw0KK1NSZXMgTHptYUVuY19FbmNvZGUoQ0x6bWFFbmNIYW5kbGUgcCwgSVNlcU91dFN0cmVhbSAqb3V0U3RyZWFtLCBJU2VxSW5TdHJlYW0gKmluU3RyZWFtLA0KKyAgICBJQ29tcHJlc3NQcm9ncmVzcyAqcHJvZ3Jlc3MsIElTekFsbG9jICphbGxvYywgSVN6QWxsb2MgKmFsbG9jQmlnKTsNCitTUmVzIEx6bWFFbmNfTWVtRW5jb2RlKENMem1hRW5jSGFuZGxlIHAsIEJ5dGUgKmRlc3QsIFNpemVUICpkZXN0TGVuLCBjb25zdCBCeXRlICpzcmMsIFNpemVUIHNyY0xlbiwNCisgICAgaW50IHdyaXRlRW5kTWFyaywgSUNvbXByZXNzUHJvZ3Jlc3MgKnByb2dyZXNzLCBJU3pBbGxvYyAqYWxsb2MsIElTekFsbG9jICphbGxvY0JpZyk7DQorDQorLyogLS0tLS0tLS0tLSBPbmUgQ2FsbCBJbnRlcmZhY2UgLS0tLS0tLS0tLSAqLw0KKw0KKy8qIEx6bWFFbmNvZGUNCitSZXR1cm4gY29kZToNCisgIFNaX09LICAgICAgICAgICAgICAgLSBPSw0KKyAgU1pfRVJST1JfTUVNICAgICAgICAtIE1lbW9yeSBhbGxvY2F0aW9uIGVycm9yDQorICBTWl9FUlJPUl9QQVJBTSAgICAgIC0gSW5jb3JyZWN0IHBhcmFtYXRlcg0KKyAgU1pfRVJST1JfT1VUUFVUX0VPRiAtIG91dHB1dCBidWZmZXIgb3ZlcmZsb3cNCisgIFNaX0VSUk9SX1RIUkVBRCAgICAgLSBlcnJvcnMgaW4gbXVsdGl0aHJlYWRpbmcgZnVuY3Rpb25zIChvbmx5IGZvciBNdCB2ZXJzaW9uKQ0KKyovDQorDQorU1JlcyBMem1hRW5jb2RlKEJ5dGUgKmRlc3QsIFNpemVUICpkZXN0TGVuLCBjb25zdCBCeXRlICpzcmMsIFNpemVUIHNyY0xlbiwNCisgICAgY29uc3QgQ0x6bWFFbmNQcm9wcyAqcHJvcHMsIEJ5dGUgKnByb3BzRW5jb2RlZCwgU2l6ZVQgKnByb3BzU2l6ZSwgaW50IHdyaXRlRW5kTWFyaywNCisgICAgSUNvbXByZXNzUHJvZ3Jlc3MgKnByb2dyZXNzLCBJU3pBbGxvYyAqYWxsb2MsIElTekFsbG9jICphbGxvY0JpZyk7DQorDQorRVhURVJOX0NfRU5EDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DL0x6bWFMaWIuYyBiL2x6bWEvQy9Mem1hTGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzY2Y0MAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9Mem1hTGliLmMKQEAgLTAsMCArMSw0NiBAQAorLyogTHptYUxpYi5jIC0tIExaTUEgbGlicmFyeSB3cmFwcGVyDQorMjAwOC0wOC0wNQ0KK0lnb3IgUGF2bG92DQorUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlICJMem1hRW5jLmgiDQorI2luY2x1ZGUgIkx6bWFEZWMuaCINCisjaW5jbHVkZSAiQWxsb2MuaCINCisjaW5jbHVkZSAiTHptYUxpYi5oIg0KKw0KK3N0YXRpYyB2b2lkICpTekFsbG9jKHZvaWQgKnAsIHNpemVfdCBzaXplKSB7IHAgPSBwOyByZXR1cm4gTXlBbGxvYyhzaXplKTsgfQ0KK3N0YXRpYyB2b2lkIFN6RnJlZSh2b2lkICpwLCB2b2lkICphZGRyZXNzKSB7IHAgPSBwOyBNeUZyZWUoYWRkcmVzcyk7IH0NCitzdGF0aWMgSVN6QWxsb2MgZ19BbGxvYyA9IHsgU3pBbGxvYywgU3pGcmVlIH07DQorDQorTVlfU1REQVBJIEx6bWFDb21wcmVzcyh1bnNpZ25lZCBjaGFyICpkZXN0LCBzaXplX3QgICpkZXN0TGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHNpemVfdCAgc3JjTGVuLA0KKyAgdW5zaWduZWQgY2hhciAqb3V0UHJvcHMsIHNpemVfdCAqb3V0UHJvcHNTaXplLA0KKyAgaW50IGxldmVsLCAvKiAwIDw9IGxldmVsIDw9IDksIGRlZmF1bHQgPSA1ICovDQorICB1bnNpZ25lZCBkaWN0U2l6ZSwgLyogdXNlICgxIDw8IE4pIG9yICgzIDw8IE4pLiA0IEtCIDwgZGljdFNpemUgPD0gMTI4IE1CICovDQorICBpbnQgbGMsIC8qIDAgPD0gbGMgPD0gOCwgZGVmYXVsdCA9IDMgICovDQorICBpbnQgbHAsIC8qIDAgPD0gbHAgPD0gNCwgZGVmYXVsdCA9IDAgICovDQorICBpbnQgcGIsIC8qIDAgPD0gcGIgPD0gNCwgZGVmYXVsdCA9IDIgICovDQorICBpbnQgZmIsICAvKiA1IDw9IGZiIDw9IDI3MywgZGVmYXVsdCA9IDMyICovDQorICBpbnQgbnVtVGhyZWFkcyAvKiAxIG9yIDIsIGRlZmF1bHQgPSAyICovDQorKQ0KK3sNCisgIENMem1hRW5jUHJvcHMgcHJvcHM7DQorICBMem1hRW5jUHJvcHNfSW5pdCgmcHJvcHMpOw0KKyAgcHJvcHMubGV2ZWwgPSBsZXZlbDsNCisgIHByb3BzLmRpY3RTaXplID0gZGljdFNpemU7DQorICBwcm9wcy5sYyA9IGxjOw0KKyAgcHJvcHMubHAgPSBscDsNCisgIHByb3BzLnBiID0gcGI7DQorICBwcm9wcy5mYiA9IGZiOw0KKyAgcHJvcHMubnVtVGhyZWFkcyA9IG51bVRocmVhZHM7DQorDQorICByZXR1cm4gTHptYUVuY29kZShkZXN0LCBkZXN0TGVuLCBzcmMsIHNyY0xlbiwgJnByb3BzLCBvdXRQcm9wcywgb3V0UHJvcHNTaXplLCAwLA0KKyAgICAgIE5VTEwsICZnX0FsbG9jLCAmZ19BbGxvYyk7DQorfQ0KKw0KKw0KK01ZX1NUREFQSSBMem1hVW5jb21wcmVzcyh1bnNpZ25lZCBjaGFyICpkZXN0LCBzaXplX3QgICpkZXN0TGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHNpemVfdCAgKnNyY0xlbiwNCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnByb3BzLCBzaXplX3QgcHJvcHNTaXplKQ0KK3sNCisgIEVMem1hU3RhdHVzIHN0YXR1czsNCisgIHJldHVybiBMem1hRGVjb2RlKGRlc3QsIGRlc3RMZW4sIHNyYywgc3JjTGVuLCBwcm9wcywgKHVuc2lnbmVkKXByb3BzU2l6ZSwgTFpNQV9GSU5JU0hfQU5ZLCAmc3RhdHVzLCAmZ19BbGxvYyk7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9Mem1hTGliLmggYi9sem1hL0MvTHptYUxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzVlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvTHptYUxpYi5oCkBAIC0wLDAgKzEsMTMxIEBACisvKiBMem1hTGliLmggLS0gTFpNQSBsaWJyYXJ5IGludGVyZmFjZQ0KKzIwMTMtMDEtMTggOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaWZuZGVmIF9fTFpNQV9MSUJfSA0KKyNkZWZpbmUgX19MWk1BX0xJQl9IDQorDQorI2luY2x1ZGUgIjd6VHlwZXMuaCINCisNCitFWFRFUk5fQ19CRUdJTg0KKw0KKyNkZWZpbmUgTVlfU1REQVBJIGludCBNWV9TVERfQ0FMTA0KKw0KKyNkZWZpbmUgTFpNQV9QUk9QU19TSVpFIDUNCisNCisvKg0KK1JBTSByZXF1aXJlbWVudHMgZm9yIExaTUE6DQorICBmb3IgY29tcHJlc3Npb246ICAgKGRpY3RTaXplICogMTEuNSArIDYgTUIpICsgc3RhdGVfc2l6ZQ0KKyAgZm9yIGRlY29tcHJlc3Npb246IGRpY3RTaXplICsgc3RhdGVfc2l6ZQ0KKyAgICBzdGF0ZV9zaXplID0gKDQgKyAoMS41IDw8IChsYyArIGxwKSkpIEtCDQorICAgIGJ5IGRlZmF1bHQgKGxjPTMsIGxwPTApLCBzdGF0ZV9zaXplID0gMTYgS0IuDQorDQorTFpNQSBwcm9wZXJ0aWVzICg1IGJ5dGVzKSBmb3JtYXQNCisgICAgT2Zmc2V0IFNpemUgIERlc2NyaXB0aW9uDQorICAgICAgMCAgICAgMSAgICBsYywgbHAgYW5kIHBiIGluIGVuY29kZWQgZm9ybS4NCisgICAgICAxICAgICA0ICAgIGRpY3RTaXplIChsaXR0bGUgZW5kaWFuKS4NCisqLw0KKw0KKy8qDQorTHptYUNvbXByZXNzDQorLS0tLS0tLS0tLS0tDQorDQorb3V0UHJvcHNTaXplIC0NCisgICAgIEluOiAgdGhlIHBvaW50ZXIgdG8gdGhlIHNpemUgb2Ygb3V0UHJvcHMgYnVmZmVyOyAqb3V0UHJvcHNTaXplID0gTFpNQV9QUk9QU19TSVpFID0gNS4NCisgICAgIE91dDogdGhlIHBvaW50ZXIgdG8gdGhlIHNpemUgb2Ygd3JpdHRlbiBwcm9wZXJ0aWVzIGluIG91dFByb3BzIGJ1ZmZlcjsgKm91dFByb3BzU2l6ZSA9IExaTUFfUFJPUFNfU0laRSA9IDUuDQorDQorICBMWk1BIEVuY29kZXIgd2lsbCB1c2UgZGVmdWx0IHZhbHVlcyBmb3IgYW55IHBhcmFtZXRlciwgaWYgaXQgaXMNCisgIC0xICBmb3IgYW55IGZyb206IGxldmVsLCBsb2MsIGxwLCBwYiwgZmIsIG51bVRocmVhZHMNCisgICAwICBmb3IgZGljdFNpemUNCisgIA0KK2xldmVsIC0gY29tcHJlc3Npb24gbGV2ZWw6IDAgPD0gbGV2ZWwgPD0gOTsNCisNCisgIGxldmVsIGRpY3RTaXplIGFsZ28gIGZiDQorICAgIDA6ICAgIDE2IEtCICAgMCAgICAzMg0KKyAgICAxOiAgICA2NCBLQiAgIDAgICAgMzINCisgICAgMjogICAyNTYgS0IgICAwICAgIDMyDQorICAgIDM6ICAgICAxIE1CICAgMCAgICAzMg0KKyAgICA0OiAgICAgNCBNQiAgIDAgICAgMzINCisgICAgNTogICAgMTYgTUIgICAxICAgIDMyDQorICAgIDY6ICAgIDMyIE1CICAgMSAgICAzMg0KKyAgICA3KzogICA2NCBNQiAgIDEgICAgNjQNCisgDQorICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgImxldmVsIiBpcyA1Lg0KKw0KKyAgYWxnbyA9IDAgbWVhbnMgZmFzdCBtZXRob2QNCisgIGFsZ28gPSAxIG1lYW5zIG5vcm1hbCBtZXRob2QNCisNCitkaWN0U2l6ZSAtIFRoZSBkaWN0aW9uYXJ5IHNpemUgaW4gYnl0ZXMuIFRoZSBtYXhpbXVtIHZhbHVlIGlzDQorICAgICAgICAxMjggTUIgPSAoMSA8PCAyNykgYnl0ZXMgZm9yIDMyLWJpdCB2ZXJzaW9uDQorICAgICAgICAgIDEgR0IgPSAoMSA8PCAzMCkgYnl0ZXMgZm9yIDY0LWJpdCB2ZXJzaW9uDQorICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNiBNQiA9ICgxIDw8IDI0KSBieXRlcy4NCisgICAgIEl0J3MgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBkaWN0aW9uYXJ5IHRoYXQgaXMgbGFyZ2VyIHRoYW4gNCBLQiBhbmQNCisgICAgIHRoYXQgY2FuIGJlIGNhbGN1bGF0ZWQgYXMgKDEgPDwgTikgb3IgKDMgPDwgTikgc2l6ZXMuDQorDQorbGMgLSBUaGUgbnVtYmVyIG9mIGxpdGVyYWwgY29udGV4dCBiaXRzIChoaWdoIGJpdHMgb2YgcHJldmlvdXMgbGl0ZXJhbCkuDQorICAgICBJdCBjYW4gYmUgaW4gdGhlIHJhbmdlIGZyb20gMCB0byA4LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzLg0KKyAgICAgU29tZXRpbWVzIGxjPTQgZ2l2ZXMgdGhlIGdhaW4gZm9yIGJpZyBmaWxlcy4NCisNCitscCAtIFRoZSBudW1iZXIgb2YgbGl0ZXJhbCBwb3MgYml0cyAobG93IGJpdHMgb2YgY3VycmVudCBwb3NpdGlvbiBmb3IgbGl0ZXJhbHMpLg0KKyAgICAgSXQgY2FuIGJlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gNC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4NCisgICAgIFRoZSBscCBzd2l0Y2ggaXMgaW50ZW5kZWQgZm9yIHBlcmlvZGljYWwgZGF0YSB3aGVuIHRoZSBwZXJpb2QgaXMgZXF1YWwgdG8gMl5scC4NCisgICAgIEZvciBleGFtcGxlLCBmb3IgMzItYml0ICg0IGJ5dGVzKSBwZXJpb2RpY2FsIGRhdGEgeW91IGNhbiB1c2UgbHA9Mi4gT2Z0ZW4gaXQncw0KKyAgICAgYmV0dGVyIHRvIHNldCBsYz0wLCBpZiB5b3UgY2hhbmdlIGxwIHN3aXRjaC4NCisNCitwYiAtIFRoZSBudW1iZXIgb2YgcG9zIGJpdHMgKGxvdyBiaXRzIG9mIGN1cnJlbnQgcG9zaXRpb24pLg0KKyAgICAgSXQgY2FuIGJlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gNC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMi4NCisgICAgIFRoZSBwYiBzd2l0Y2ggaXMgaW50ZW5kZWQgZm9yIHBlcmlvZGljYWwgZGF0YSB3aGVuIHRoZSBwZXJpb2QgaXMgZXF1YWwgMl5wYi4NCisNCitmYiAtIFdvcmQgc2l6ZSAodGhlIG51bWJlciBvZiBmYXN0IGJ5dGVzKS4NCisgICAgIEl0IGNhbiBiZSBpbiB0aGUgcmFuZ2UgZnJvbSA1IHRvIDI3My4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMzIuDQorICAgICBVc3VhbGx5LCBhIGJpZyBudW1iZXIgZ2l2ZXMgYSBsaXR0bGUgYml0IGJldHRlciBjb21wcmVzc2lvbiByYXRpbyBhbmQNCisgICAgIHNsb3dlciBjb21wcmVzc2lvbiBwcm9jZXNzLg0KKw0KK251bVRocmVhZHMgLSBUaGUgbnVtYmVyIG9mIHRoZXJlYWRzLiAxIG9yIDIuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDIuDQorICAgICBGYXN0IG1vZGUgKGFsZ28gPSAwKSBjYW4gdXNlIG9ubHkgMSB0aHJlYWQuDQorDQorT3V0Og0KKyAgZGVzdExlbiAgLSBwcm9jZXNzZWQgb3V0cHV0IHNpemUNCitSZXR1cm5zOg0KKyAgU1pfT0sgICAgICAgICAgICAgICAtIE9LDQorICBTWl9FUlJPUl9NRU0gICAgICAgIC0gTWVtb3J5IGFsbG9jYXRpb24gZXJyb3INCisgIFNaX0VSUk9SX1BBUkFNICAgICAgLSBJbmNvcnJlY3QgcGFyYW1hdGVyDQorICBTWl9FUlJPUl9PVVRQVVRfRU9GIC0gb3V0cHV0IGJ1ZmZlciBvdmVyZmxvdw0KKyAgU1pfRVJST1JfVEhSRUFEICAgICAtIGVycm9ycyBpbiBtdWx0aXRocmVhZGluZyBmdW5jdGlvbnMgKG9ubHkgZm9yIE10IHZlcnNpb24pDQorKi8NCisNCitNWV9TVERBUEkgTHptYUNvbXByZXNzKHVuc2lnbmVkIGNoYXIgKmRlc3QsIHNpemVfdCAqZGVzdExlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBzaXplX3Qgc3JjTGVuLA0KKyAgdW5zaWduZWQgY2hhciAqb3V0UHJvcHMsIHNpemVfdCAqb3V0UHJvcHNTaXplLCAvKiAqb3V0UHJvcHNTaXplIG11c3QgYmUgPSA1ICovDQorICBpbnQgbGV2ZWwsICAgICAgLyogMCA8PSBsZXZlbCA8PSA5LCBkZWZhdWx0ID0gNSAqLw0KKyAgdW5zaWduZWQgZGljdFNpemUsICAvKiBkZWZhdWx0ID0gKDEgPDwgMjQpICovDQorICBpbnQgbGMsICAgICAgICAvKiAwIDw9IGxjIDw9IDgsIGRlZmF1bHQgPSAzICAqLw0KKyAgaW50IGxwLCAgICAgICAgLyogMCA8PSBscCA8PSA0LCBkZWZhdWx0ID0gMCAgKi8NCisgIGludCBwYiwgICAgICAgIC8qIDAgPD0gcGIgPD0gNCwgZGVmYXVsdCA9IDIgICovDQorICBpbnQgZmIsICAgICAgICAvKiA1IDw9IGZiIDw9IDI3MywgZGVmYXVsdCA9IDMyICovDQorICBpbnQgbnVtVGhyZWFkcyAvKiAxIG9yIDIsIGRlZmF1bHQgPSAyICovDQorICApOw0KKw0KKy8qDQorTHptYVVuY29tcHJlc3MNCistLS0tLS0tLS0tLS0tLQ0KK0luOg0KKyAgZGVzdCAgICAgLSBvdXRwdXQgZGF0YQ0KKyAgZGVzdExlbiAgLSBvdXRwdXQgZGF0YSBzaXplDQorICBzcmMgICAgICAtIGlucHV0IGRhdGENCisgIHNyY0xlbiAgIC0gaW5wdXQgZGF0YSBzaXplDQorT3V0Og0KKyAgZGVzdExlbiAgLSBwcm9jZXNzZWQgb3V0cHV0IHNpemUNCisgIHNyY0xlbiAgIC0gcHJvY2Vzc2VkIGlucHV0IHNpemUNCitSZXR1cm5zOg0KKyAgU1pfT0sgICAgICAgICAgICAgICAgLSBPSw0KKyAgU1pfRVJST1JfREFUQSAgICAgICAgLSBEYXRhIGVycm9yDQorICBTWl9FUlJPUl9NRU0gICAgICAgICAtIE1lbW9yeSBhbGxvY2F0aW9uIGFycm9yDQorICBTWl9FUlJPUl9VTlNVUFBPUlRFRCAtIFVuc3VwcG9ydGVkIHByb3BlcnRpZXMNCisgIFNaX0VSUk9SX0lOUFVUX0VPRiAgIC0gaXQgbmVlZHMgbW9yZSBieXRlcyBpbiBpbnB1dCBidWZmZXIgKHNyYykNCisqLw0KKw0KK01ZX1NUREFQSSBMem1hVW5jb21wcmVzcyh1bnNpZ25lZCBjaGFyICpkZXN0LCBzaXplX3QgKmRlc3RMZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgU2l6ZVQgKnNyY0xlbiwNCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnByb3BzLCBzaXplX3QgcHJvcHNTaXplKTsNCisNCitFWFRFUk5fQ19FTkQNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0MvTXRDb2Rlci5jIGIvbHptYS9DL010Q29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDNiNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL010Q29kZXIuYwpAQCAtMCwwICsxLDMyOSBAQAorLyogTXRDb2Rlci5jIC0tIE11bHRpLXRocmVhZCBDb2Rlcg0KKzIwMTAtMDktMjQgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiUHJlY29tcC5oIg0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKw0KKyNpbmNsdWRlICJNdENvZGVyLmgiDQorDQordm9pZCBMb29wVGhyZWFkX0NvbnN0cnVjdChDTG9vcFRocmVhZCAqcCkNCit7DQorICBUaHJlYWRfQ29uc3RydWN0KCZwLT50aHJlYWQpOw0KKyAgRXZlbnRfQ29uc3RydWN0KCZwLT5zdGFydEV2ZW50KTsNCisgIEV2ZW50X0NvbnN0cnVjdCgmcC0+ZmluaXNoZWRFdmVudCk7DQorfQ0KKw0KK3ZvaWQgTG9vcFRocmVhZF9DbG9zZShDTG9vcFRocmVhZCAqcCkNCit7DQorICBUaHJlYWRfQ2xvc2UoJnAtPnRocmVhZCk7DQorICBFdmVudF9DbG9zZSgmcC0+c3RhcnRFdmVudCk7DQorICBFdmVudF9DbG9zZSgmcC0+ZmluaXNoZWRFdmVudCk7DQorfQ0KKw0KK3N0YXRpYyBUSFJFQURfRlVOQ19SRVRfVFlQRSBUSFJFQURfRlVOQ19DQUxMX1RZUEUgTG9vcFRocmVhZEZ1bmModm9pZCAqcHApDQorew0KKyAgQ0xvb3BUaHJlYWQgKnAgPSAoQ0xvb3BUaHJlYWQgKilwcDsNCisgIGZvciAoOzspDQorICB7DQorICAgIGlmIChFdmVudF9XYWl0KCZwLT5zdGFydEV2ZW50KSAhPSAwKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9USFJFQUQ7DQorICAgIGlmIChwLT5zdG9wKQ0KKyAgICAgIHJldHVybiAwOw0KKyAgICBwLT5yZXMgPSBwLT5mdW5jKHAtPnBhcmFtKTsNCisgICAgaWYgKEV2ZW50X1NldCgmcC0+ZmluaXNoZWRFdmVudCkgIT0gMCkNCisgICAgICByZXR1cm4gU1pfRVJST1JfVEhSRUFEOw0KKyAgfQ0KK30NCisNCitXUmVzIExvb3BUaHJlYWRfQ3JlYXRlKENMb29wVGhyZWFkICpwKQ0KK3sNCisgIHAtPnN0b3AgPSAwOw0KKyAgUklOT0soQXV0b1Jlc2V0RXZlbnRfQ3JlYXRlTm90U2lnbmFsZWQoJnAtPnN0YXJ0RXZlbnQpKTsNCisgIFJJTk9LKEF1dG9SZXNldEV2ZW50X0NyZWF0ZU5vdFNpZ25hbGVkKCZwLT5maW5pc2hlZEV2ZW50KSk7DQorICByZXR1cm4gVGhyZWFkX0NyZWF0ZSgmcC0+dGhyZWFkLCBMb29wVGhyZWFkRnVuYywgcCk7DQorfQ0KKw0KK1dSZXMgTG9vcFRocmVhZF9TdG9wQW5kV2FpdChDTG9vcFRocmVhZCAqcCkNCit7DQorICBwLT5zdG9wID0gMTsNCisgIGlmIChFdmVudF9TZXQoJnAtPnN0YXJ0RXZlbnQpICE9IDApDQorICAgIHJldHVybiBTWl9FUlJPUl9USFJFQUQ7DQorICByZXR1cm4gVGhyZWFkX1dhaXQoJnAtPnRocmVhZCk7DQorfQ0KKw0KK1dSZXMgTG9vcFRocmVhZF9TdGFydFN1YlRocmVhZChDTG9vcFRocmVhZCAqcCkgeyByZXR1cm4gRXZlbnRfU2V0KCZwLT5zdGFydEV2ZW50KTsgfQ0KK1dSZXMgTG9vcFRocmVhZF9XYWl0U3ViVGhyZWFkKENMb29wVGhyZWFkICpwKSB7IHJldHVybiBFdmVudF9XYWl0KCZwLT5maW5pc2hlZEV2ZW50KTsgfQ0KKw0KK3N0YXRpYyBTUmVzIFByb2dyZXNzKElDb21wcmVzc1Byb2dyZXNzICpwLCBVSW50NjQgaW5TaXplLCBVSW50NjQgb3V0U2l6ZSkNCit7DQorICByZXR1cm4gKHAgJiYgcC0+UHJvZ3Jlc3MocCwgaW5TaXplLCBvdXRTaXplKSAhPSBTWl9PSykgPyBTWl9FUlJPUl9QUk9HUkVTUyA6IFNaX09LOw0KK30NCisNCitzdGF0aWMgdm9pZCBNdFByb2dyZXNzX0luaXQoQ010UHJvZ3Jlc3MgKnAsIElDb21wcmVzc1Byb2dyZXNzICpwcm9ncmVzcykNCit7DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9NVF9DT0RFUl9USFJFQURTX01BWDsgaSsrKQ0KKyAgICBwLT5pblNpemVzW2ldID0gcC0+b3V0U2l6ZXNbaV0gPSAwOw0KKyAgcC0+dG90YWxJblNpemUgPSBwLT50b3RhbE91dFNpemUgPSAwOw0KKyAgcC0+cHJvZ3Jlc3MgPSBwcm9ncmVzczsNCisgIHAtPnJlcyA9IFNaX09LOw0KK30NCisNCitzdGF0aWMgdm9pZCBNdFByb2dyZXNzX1JlaW5pdChDTXRQcm9ncmVzcyAqcCwgdW5zaWduZWQgaW5kZXgpDQorew0KKyAgcC0+aW5TaXplc1tpbmRleF0gPSAwOw0KKyAgcC0+b3V0U2l6ZXNbaW5kZXhdID0gMDsNCit9DQorDQorI2RlZmluZSBVUERBVEVfUFJPR1JFU1Moc2l6ZSwgcHJldiwgdG90YWwpIFwNCisgIGlmIChzaXplICE9IChVSW50NjQpKEludDY0KS0xKSB7IHRvdGFsICs9IHNpemUgLSBwcmV2OyBwcmV2ID0gc2l6ZTsgfQ0KKw0KK1NSZXMgTXRQcm9ncmVzc19TZXQoQ010UHJvZ3Jlc3MgKnAsIHVuc2lnbmVkIGluZGV4LCBVSW50NjQgaW5TaXplLCBVSW50NjQgb3V0U2l6ZSkNCit7DQorICBTUmVzIHJlczsNCisgIENyaXRpY2FsU2VjdGlvbl9FbnRlcigmcC0+Y3MpOw0KKyAgVVBEQVRFX1BST0dSRVNTKGluU2l6ZSwgcC0+aW5TaXplc1tpbmRleF0sIHAtPnRvdGFsSW5TaXplKQ0KKyAgVVBEQVRFX1BST0dSRVNTKG91dFNpemUsIHAtPm91dFNpemVzW2luZGV4XSwgcC0+dG90YWxPdXRTaXplKQ0KKyAgaWYgKHAtPnJlcyA9PSBTWl9PSykNCisgICAgcC0+cmVzID0gUHJvZ3Jlc3MocC0+cHJvZ3Jlc3MsIHAtPnRvdGFsSW5TaXplLCBwLT50b3RhbE91dFNpemUpOw0KKyAgcmVzID0gcC0+cmVzOw0KKyAgQ3JpdGljYWxTZWN0aW9uX0xlYXZlKCZwLT5jcyk7DQorICByZXR1cm4gcmVzOw0KK30NCisNCitzdGF0aWMgdm9pZCBNdFByb2dyZXNzX1NldEVycm9yKENNdFByb2dyZXNzICpwLCBTUmVzIHJlcykNCit7DQorICBDcml0aWNhbFNlY3Rpb25fRW50ZXIoJnAtPmNzKTsNCisgIGlmIChwLT5yZXMgPT0gU1pfT0spDQorICAgIHAtPnJlcyA9IHJlczsNCisgIENyaXRpY2FsU2VjdGlvbl9MZWF2ZSgmcC0+Y3MpOw0KK30NCisNCitzdGF0aWMgdm9pZCBNdENvZGVyX1NldEVycm9yKENNdENvZGVyKiBwLCBTUmVzIHJlcykNCit7DQorICBDcml0aWNhbFNlY3Rpb25fRW50ZXIoJnAtPmNzKTsNCisgIGlmIChwLT5yZXMgPT0gU1pfT0spDQorICAgIHAtPnJlcyA9IHJlczsNCisgIENyaXRpY2FsU2VjdGlvbl9MZWF2ZSgmcC0+Y3MpOw0KK30NCisNCisvKiAtLS0tLS0tLS0tIE10VGhyZWFkIC0tLS0tLS0tLS0gKi8NCisNCit2b2lkIENNdFRocmVhZF9Db25zdHJ1Y3QoQ010VGhyZWFkICpwLCBDTXRDb2RlciAqbXRDb2RlcikNCit7DQorICBwLT5tdENvZGVyID0gbXRDb2RlcjsNCisgIHAtPm91dEJ1ZiA9IDA7DQorICBwLT5pbkJ1ZiA9IDA7DQorICBFdmVudF9Db25zdHJ1Y3QoJnAtPmNhblJlYWQpOw0KKyAgRXZlbnRfQ29uc3RydWN0KCZwLT5jYW5Xcml0ZSk7DQorICBMb29wVGhyZWFkX0NvbnN0cnVjdCgmcC0+dGhyZWFkKTsNCit9DQorDQorI2RlZmluZSBSSU5PS19USFJFQUQoeCkgeyBpZigoeCkgIT0gMCkgcmV0dXJuIFNaX0VSUk9SX1RIUkVBRDsgfQ0KKw0KK3N0YXRpYyB2b2lkIENNdFRocmVhZF9DbG9zZUV2ZW50cyhDTXRUaHJlYWQgKnApDQorew0KKyAgRXZlbnRfQ2xvc2UoJnAtPmNhblJlYWQpOw0KKyAgRXZlbnRfQ2xvc2UoJnAtPmNhbldyaXRlKTsNCit9DQorDQorc3RhdGljIHZvaWQgQ010VGhyZWFkX0Rlc3RydWN0KENNdFRocmVhZCAqcCkNCit7DQorICBDTXRUaHJlYWRfQ2xvc2VFdmVudHMocCk7DQorDQorICBpZiAoVGhyZWFkX1dhc0NyZWF0ZWQoJnAtPnRocmVhZC50aHJlYWQpKQ0KKyAgew0KKyAgICBMb29wVGhyZWFkX1N0b3BBbmRXYWl0KCZwLT50aHJlYWQpOw0KKyAgICBMb29wVGhyZWFkX0Nsb3NlKCZwLT50aHJlYWQpOw0KKyAgfQ0KKw0KKyAgaWYgKHAtPm10Q29kZXItPmFsbG9jKQ0KKyAgICBJQWxsb2NfRnJlZShwLT5tdENvZGVyLT5hbGxvYywgcC0+b3V0QnVmKTsNCisgIHAtPm91dEJ1ZiA9IDA7DQorDQorICBpZiAocC0+bXRDb2Rlci0+YWxsb2MpDQorICAgIElBbGxvY19GcmVlKHAtPm10Q29kZXItPmFsbG9jLCBwLT5pbkJ1Zik7DQorICBwLT5pbkJ1ZiA9IDA7DQorfQ0KKw0KKyNkZWZpbmUgTVlfQlVGX0FMTE9DKGJ1Ziwgc2l6ZSwgbmV3U2l6ZSkgXA0KKyAgaWYgKGJ1ZiA9PSAwIHx8IHNpemUgIT0gbmV3U2l6ZSkgXA0KKyAgeyBJQWxsb2NfRnJlZShwLT5tdENvZGVyLT5hbGxvYywgYnVmKTsgXA0KKyAgICBzaXplID0gbmV3U2l6ZTsgYnVmID0gKEJ5dGUgKilJQWxsb2NfQWxsb2MocC0+bXRDb2Rlci0+YWxsb2MsIHNpemUpOyBcDQorICAgIGlmIChidWYgPT0gMCkgcmV0dXJuIFNaX0VSUk9SX01FTTsgfQ0KKw0KK3N0YXRpYyBTUmVzIENNdFRocmVhZF9QcmVwYXJlKENNdFRocmVhZCAqcCkNCit7DQorICBNWV9CVUZfQUxMT0MocC0+aW5CdWYsIHAtPmluQnVmU2l6ZSwgcC0+bXRDb2Rlci0+YmxvY2tTaXplKQ0KKyAgTVlfQlVGX0FMTE9DKHAtPm91dEJ1ZiwgcC0+b3V0QnVmU2l6ZSwgcC0+bXRDb2Rlci0+ZGVzdEJsb2NrU2l6ZSkNCisNCisgIHAtPnN0b3BSZWFkaW5nID0gRmFsc2U7DQorICBwLT5zdG9wV3JpdGluZyA9IEZhbHNlOw0KKyAgUklOT0tfVEhSRUFEKEF1dG9SZXNldEV2ZW50X0NyZWF0ZU5vdFNpZ25hbGVkKCZwLT5jYW5SZWFkKSk7DQorICBSSU5PS19USFJFQUQoQXV0b1Jlc2V0RXZlbnRfQ3JlYXRlTm90U2lnbmFsZWQoJnAtPmNhbldyaXRlKSk7DQorDQorICByZXR1cm4gU1pfT0s7DQorfQ0KKw0KK3N0YXRpYyBTUmVzIEZ1bGxSZWFkKElTZXFJblN0cmVhbSAqc3RyZWFtLCBCeXRlICpkYXRhLCBzaXplX3QgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgc2l6ZV90IHNpemUgPSAqcHJvY2Vzc2VkU2l6ZTsNCisgICpwcm9jZXNzZWRTaXplID0gMDsNCisgIHdoaWxlIChzaXplICE9IDApDQorICB7DQorICAgIHNpemVfdCBjdXJTaXplID0gc2l6ZTsNCisgICAgU1JlcyByZXMgPSBzdHJlYW0tPlJlYWQoc3RyZWFtLCBkYXRhLCAmY3VyU2l6ZSk7DQorICAgICpwcm9jZXNzZWRTaXplICs9IGN1clNpemU7DQorICAgIGRhdGEgKz0gY3VyU2l6ZTsNCisgICAgc2l6ZSAtPSBjdXJTaXplOw0KKyAgICBSSU5PSyhyZXMpOw0KKyAgICBpZiAoY3VyU2l6ZSA9PSAwKQ0KKyAgICAgIHJldHVybiBTWl9PSzsNCisgIH0NCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorI2RlZmluZSBHRVRfTkVYVF9USFJFQUQocCkgJnAtPm10Q29kZXItPnRocmVhZHNbcC0+aW5kZXggPT0gcC0+bXRDb2Rlci0+bnVtVGhyZWFkcyAgLSAxID8gMCA6IHAtPmluZGV4ICsgMV0NCisNCitzdGF0aWMgU1JlcyBNdFRocmVhZF9Qcm9jZXNzKENNdFRocmVhZCAqcCwgQm9vbCAqc3RvcCkNCit7DQorICBDTXRUaHJlYWQgKm5leHQ7DQorICAqc3RvcCA9IFRydWU7DQorICBpZiAoRXZlbnRfV2FpdCgmcC0+Y2FuUmVhZCkgIT0gMCkNCisgICAgcmV0dXJuIFNaX0VSUk9SX1RIUkVBRDsNCisgIA0KKyAgbmV4dCA9IEdFVF9ORVhUX1RIUkVBRChwKTsNCisgIA0KKyAgaWYgKHAtPnN0b3BSZWFkaW5nKQ0KKyAgew0KKyAgICBuZXh0LT5zdG9wUmVhZGluZyA9IFRydWU7DQorICAgIHJldHVybiBFdmVudF9TZXQoJm5leHQtPmNhblJlYWQpID09IDAgPyBTWl9PSyA6IFNaX0VSUk9SX1RIUkVBRDsNCisgIH0NCisNCisgIHsNCisgICAgc2l6ZV90IHNpemUgPSBwLT5tdENvZGVyLT5ibG9ja1NpemU7DQorICAgIHNpemVfdCBkZXN0U2l6ZSA9IHAtPm91dEJ1ZlNpemU7DQorDQorICAgIFJJTk9LKEZ1bGxSZWFkKHAtPm10Q29kZXItPmluU3RyZWFtLCBwLT5pbkJ1ZiwgJnNpemUpKTsNCisgICAgbmV4dC0+c3RvcFJlYWRpbmcgPSAqc3RvcCA9IChzaXplICE9IHAtPm10Q29kZXItPmJsb2NrU2l6ZSk7DQorICAgIGlmIChFdmVudF9TZXQoJm5leHQtPmNhblJlYWQpICE9IDApDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX1RIUkVBRDsNCisNCisgICAgUklOT0socC0+bXRDb2Rlci0+bXRDYWxsYmFjay0+Q29kZShwLT5tdENvZGVyLT5tdENhbGxiYWNrLCBwLT5pbmRleCwNCisgICAgICAgIHAtPm91dEJ1ZiwgJmRlc3RTaXplLCBwLT5pbkJ1Ziwgc2l6ZSwgKnN0b3ApKTsNCisNCisgICAgTXRQcm9ncmVzc19SZWluaXQoJnAtPm10Q29kZXItPm10UHJvZ3Jlc3MsIHAtPmluZGV4KTsNCisNCisgICAgaWYgKEV2ZW50X1dhaXQoJnAtPmNhbldyaXRlKSAhPSAwKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9USFJFQUQ7DQorICAgIGlmIChwLT5zdG9wV3JpdGluZykNCisgICAgICByZXR1cm4gU1pfRVJST1JfRkFJTDsNCisgICAgaWYgKHAtPm10Q29kZXItPm91dFN0cmVhbS0+V3JpdGUocC0+bXRDb2Rlci0+b3V0U3RyZWFtLCBwLT5vdXRCdWYsIGRlc3RTaXplKSAhPSBkZXN0U2l6ZSkNCisgICAgICByZXR1cm4gU1pfRVJST1JfV1JJVEU7DQorICAgIHJldHVybiBFdmVudF9TZXQoJm5leHQtPmNhbldyaXRlKSA9PSAwID8gU1pfT0sgOiBTWl9FUlJPUl9USFJFQUQ7DQorICB9DQorfQ0KKw0KK3N0YXRpYyBUSFJFQURfRlVOQ19SRVRfVFlQRSBUSFJFQURfRlVOQ19DQUxMX1RZUEUgVGhyZWFkRnVuYyh2b2lkICpwcCkNCit7DQorICBDTXRUaHJlYWQgKnAgPSAoQ010VGhyZWFkICopcHA7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBCb29sIHN0b3A7DQorICAgIENNdFRocmVhZCAqbmV4dCA9IEdFVF9ORVhUX1RIUkVBRChwKTsNCisgICAgU1JlcyByZXMgPSBNdFRocmVhZF9Qcm9jZXNzKHAsICZzdG9wKTsNCisgICAgaWYgKHJlcyAhPSBTWl9PSykNCisgICAgew0KKyAgICAgIE10Q29kZXJfU2V0RXJyb3IocC0+bXRDb2RlciwgcmVzKTsNCisgICAgICBNdFByb2dyZXNzX1NldEVycm9yKCZwLT5tdENvZGVyLT5tdFByb2dyZXNzLCByZXMpOw0KKyAgICAgIG5leHQtPnN0b3BSZWFkaW5nID0gVHJ1ZTsNCisgICAgICBuZXh0LT5zdG9wV3JpdGluZyA9IFRydWU7DQorICAgICAgRXZlbnRfU2V0KCZuZXh0LT5jYW5SZWFkKTsNCisgICAgICBFdmVudF9TZXQoJm5leHQtPmNhbldyaXRlKTsNCisgICAgICByZXR1cm4gcmVzOw0KKyAgICB9DQorICAgIGlmIChzdG9wKQ0KKyAgICAgIHJldHVybiAwOw0KKyAgfQ0KK30NCisNCit2b2lkIE10Q29kZXJfQ29uc3RydWN0KENNdENvZGVyKiBwKQ0KK3sNCisgIHVuc2lnbmVkIGk7DQorICBwLT5hbGxvYyA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgTlVNX01UX0NPREVSX1RIUkVBRFNfTUFYOyBpKyspDQorICB7DQorICAgIENNdFRocmVhZCAqdCA9ICZwLT50aHJlYWRzW2ldOw0KKyAgICB0LT5pbmRleCA9IGk7DQorICAgIENNdFRocmVhZF9Db25zdHJ1Y3QodCwgcCk7DQorICB9DQorICBDcml0aWNhbFNlY3Rpb25fSW5pdCgmcC0+Y3MpOw0KKyAgQ3JpdGljYWxTZWN0aW9uX0luaXQoJnAtPm10UHJvZ3Jlc3MuY3MpOw0KK30NCisNCit2b2lkIE10Q29kZXJfRGVzdHJ1Y3QoQ010Q29kZXIqIHApDQorew0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fTVRfQ09ERVJfVEhSRUFEU19NQVg7IGkrKykNCisgICAgQ010VGhyZWFkX0Rlc3RydWN0KCZwLT50aHJlYWRzW2ldKTsNCisgIENyaXRpY2FsU2VjdGlvbl9EZWxldGUoJnAtPmNzKTsNCisgIENyaXRpY2FsU2VjdGlvbl9EZWxldGUoJnAtPm10UHJvZ3Jlc3MuY3MpOw0KK30NCisNCitTUmVzIE10Q29kZXJfQ29kZShDTXRDb2RlciAqcCkNCit7DQorICB1bnNpZ25lZCBpLCBudW1UaHJlYWRzID0gcC0+bnVtVGhyZWFkczsNCisgIFNSZXMgcmVzID0gU1pfT0s7DQorICBwLT5yZXMgPSBTWl9PSzsNCisNCisgIE10UHJvZ3Jlc3NfSW5pdCgmcC0+bXRQcm9ncmVzcywgcC0+cHJvZ3Jlc3MpOw0KKw0KKyAgZm9yIChpID0gMDsgaSA8IG51bVRocmVhZHM7IGkrKykNCisgIHsNCisgICAgUklOT0soQ010VGhyZWFkX1ByZXBhcmUoJnAtPnRocmVhZHNbaV0pKTsNCisgIH0NCisNCisgIGZvciAoaSA9IDA7IGkgPCBudW1UaHJlYWRzOyBpKyspDQorICB7DQorICAgIENNdFRocmVhZCAqdCA9ICZwLT50aHJlYWRzW2ldOw0KKyAgICBDTG9vcFRocmVhZCAqbHQgPSAmdC0+dGhyZWFkOw0KKw0KKyAgICBpZiAoIVRocmVhZF9XYXNDcmVhdGVkKCZsdC0+dGhyZWFkKSkNCisgICAgew0KKyAgICAgIGx0LT5mdW5jID0gVGhyZWFkRnVuYzsNCisgICAgICBsdC0+cGFyYW0gPSB0Ow0KKw0KKyAgICAgIGlmIChMb29wVGhyZWFkX0NyZWF0ZShsdCkgIT0gU1pfT0spDQorICAgICAgew0KKyAgICAgICAgcmVzID0gU1pfRVJST1JfVEhSRUFEOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBpZiAocmVzID09IFNaX09LKQ0KKyAgew0KKyAgICB1bnNpZ25lZCBqOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGhyZWFkczsgaSsrKQ0KKyAgICB7DQorICAgICAgQ010VGhyZWFkICp0ID0gJnAtPnRocmVhZHNbaV07DQorICAgICAgaWYgKExvb3BUaHJlYWRfU3RhcnRTdWJUaHJlYWQoJnQtPnRocmVhZCkgIT0gU1pfT0spDQorICAgICAgew0KKyAgICAgICAgcmVzID0gU1pfRVJST1JfVEhSRUFEOw0KKyAgICAgICAgcC0+dGhyZWFkc1swXS5zdG9wUmVhZGluZyA9IFRydWU7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisNCisgICAgRXZlbnRfU2V0KCZwLT50aHJlYWRzWzBdLmNhbldyaXRlKTsNCisgICAgRXZlbnRfU2V0KCZwLT50aHJlYWRzWzBdLmNhblJlYWQpOw0KKw0KKyAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQ0KKyAgICAgIExvb3BUaHJlYWRfV2FpdFN1YlRocmVhZCgmcC0+dGhyZWFkc1tqXS50aHJlYWQpOw0KKyAgfQ0KKw0KKyAgZm9yIChpID0gMDsgaSA8IG51bVRocmVhZHM7IGkrKykNCisgICAgQ010VGhyZWFkX0Nsb3NlRXZlbnRzKCZwLT50aHJlYWRzW2ldKTsNCisgIHJldHVybiAocmVzID09IFNaX09LKSA/IHAtPnJlcyA6IHJlczsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DL010Q29kZXIuaCBiL2x6bWEvQy9NdENvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1MjA4ZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9NdENvZGVyLmgKQEAgLTAsMCArMSw5OCBAQAorLyogTXRDb2Rlci5oIC0tIE11bHRpLXRocmVhZCBDb2Rlcg0KKzIwMDktMTEtMTkgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaWZuZGVmIF9fTVRfQ09ERVJfSA0KKyNkZWZpbmUgX19NVF9DT0RFUl9IDQorDQorI2luY2x1ZGUgIlRocmVhZHMuaCINCisNCitFWFRFUk5fQ19CRUdJTg0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgQ1RocmVhZCB0aHJlYWQ7DQorICBDQXV0b1Jlc2V0RXZlbnQgc3RhcnRFdmVudDsNCisgIENBdXRvUmVzZXRFdmVudCBmaW5pc2hlZEV2ZW50Ow0KKyAgaW50IHN0b3A7DQorICANCisgIFRIUkVBRF9GVU5DX1RZUEUgZnVuYzsNCisgIExQVk9JRCBwYXJhbTsNCisgIFRIUkVBRF9GVU5DX1JFVF9UWVBFIHJlczsNCit9IENMb29wVGhyZWFkOw0KKw0KK3ZvaWQgTG9vcFRocmVhZF9Db25zdHJ1Y3QoQ0xvb3BUaHJlYWQgKnApOw0KK3ZvaWQgTG9vcFRocmVhZF9DbG9zZShDTG9vcFRocmVhZCAqcCk7DQorV1JlcyBMb29wVGhyZWFkX0NyZWF0ZShDTG9vcFRocmVhZCAqcCk7DQorV1JlcyBMb29wVGhyZWFkX1N0b3BBbmRXYWl0KENMb29wVGhyZWFkICpwKTsNCitXUmVzIExvb3BUaHJlYWRfU3RhcnRTdWJUaHJlYWQoQ0xvb3BUaHJlYWQgKnApOw0KK1dSZXMgTG9vcFRocmVhZF9XYWl0U3ViVGhyZWFkKENMb29wVGhyZWFkICpwKTsNCisNCisjaWZuZGVmIF83WklQX1NUDQorI2RlZmluZSBOVU1fTVRfQ09ERVJfVEhSRUFEU19NQVggMzINCisjZWxzZQ0KKyNkZWZpbmUgTlVNX01UX0NPREVSX1RIUkVBRFNfTUFYIDENCisjZW5kaWYNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIFVJbnQ2NCB0b3RhbEluU2l6ZTsNCisgIFVJbnQ2NCB0b3RhbE91dFNpemU7DQorICBJQ29tcHJlc3NQcm9ncmVzcyAqcHJvZ3Jlc3M7DQorICBTUmVzIHJlczsNCisgIENDcml0aWNhbFNlY3Rpb24gY3M7DQorICBVSW50NjQgaW5TaXplc1tOVU1fTVRfQ09ERVJfVEhSRUFEU19NQVhdOw0KKyAgVUludDY0IG91dFNpemVzW05VTV9NVF9DT0RFUl9USFJFQURTX01BWF07DQorfSBDTXRQcm9ncmVzczsNCisNCitTUmVzIE10UHJvZ3Jlc3NfU2V0KENNdFByb2dyZXNzICpwLCB1bnNpZ25lZCBpbmRleCwgVUludDY0IGluU2l6ZSwgVUludDY0IG91dFNpemUpOw0KKw0KK3N0cnVjdCBfQ010Q29kZXI7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBzdHJ1Y3QgX0NNdENvZGVyICptdENvZGVyOw0KKyAgQnl0ZSAqb3V0QnVmOw0KKyAgc2l6ZV90IG91dEJ1ZlNpemU7DQorICBCeXRlICppbkJ1ZjsNCisgIHNpemVfdCBpbkJ1ZlNpemU7DQorICB1bnNpZ25lZCBpbmRleDsNCisgIENMb29wVGhyZWFkIHRocmVhZDsNCisNCisgIEJvb2wgc3RvcFJlYWRpbmc7DQorICBCb29sIHN0b3BXcml0aW5nOw0KKyAgQ0F1dG9SZXNldEV2ZW50IGNhblJlYWQ7DQorICBDQXV0b1Jlc2V0RXZlbnQgY2FuV3JpdGU7DQorfSBDTXRUaHJlYWQ7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBTUmVzICgqQ29kZSkodm9pZCAqcCwgdW5zaWduZWQgaW5kZXgsIEJ5dGUgKmRlc3QsIHNpemVfdCAqZGVzdFNpemUsDQorICAgICAgY29uc3QgQnl0ZSAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgaW50IGZpbmlzaGVkKTsNCit9IElNdENvZGVyQ2FsbGJhY2s7DQorDQordHlwZWRlZiBzdHJ1Y3QgX0NNdENvZGVyDQorew0KKyAgc2l6ZV90IGJsb2NrU2l6ZTsNCisgIHNpemVfdCBkZXN0QmxvY2tTaXplOw0KKyAgdW5zaWduZWQgbnVtVGhyZWFkczsNCisgIA0KKyAgSVNlcUluU3RyZWFtICppblN0cmVhbTsNCisgIElTZXFPdXRTdHJlYW0gKm91dFN0cmVhbTsNCisgIElDb21wcmVzc1Byb2dyZXNzICpwcm9ncmVzczsNCisgIElTekFsbG9jICphbGxvYzsNCisNCisgIElNdENvZGVyQ2FsbGJhY2sgKm10Q2FsbGJhY2s7DQorICBDQ3JpdGljYWxTZWN0aW9uIGNzOw0KKyAgU1JlcyByZXM7DQorDQorICBDTXRQcm9ncmVzcyBtdFByb2dyZXNzOw0KKyAgQ010VGhyZWFkIHRocmVhZHNbTlVNX01UX0NPREVSX1RIUkVBRFNfTUFYXTsNCit9IENNdENvZGVyOw0KKw0KK3ZvaWQgTXRDb2Rlcl9Db25zdHJ1Y3QoQ010Q29kZXIqIHApOw0KK3ZvaWQgTXRDb2Rlcl9EZXN0cnVjdChDTXRDb2RlciogcCk7DQorU1JlcyBNdENvZGVyX0NvZGUoQ010Q29kZXIgKnApOw0KKw0KK0VYVEVSTl9DX0VORA0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy9QcG1kLmggYi9sem1hL0MvUHBtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1Y2UyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvUHBtZC5oCkBAIC0wLDAgKzEsODUgQEAKKy8qIFBwbWQuaCAtLSBQUE1EIGNvZGVjIGNvbW1vbiBjb2RlDQorMjAxMy0wMS0xOCA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbg0KK1RoaXMgY29kZSBpcyBiYXNlZCBvbiBQUE1kIHZhci5IICgyMDAxKTogRG1pdHJ5IFNoa2FyaW4gOiBQdWJsaWMgZG9tYWluICovDQorDQorI2lmbmRlZiBfX1BQTURfSA0KKyNkZWZpbmUgX19QUE1EX0gNCisNCisjaW5jbHVkZSAiQ3B1QXJjaC5oIg0KKw0KK0VYVEVSTl9DX0JFR0lODQorDQorI2lmZGVmIE1ZX0NQVV8zMkJJVA0KKyAgI2RlZmluZSBQUE1EXzMyQklUDQorI2VuZGlmDQorDQorI2RlZmluZSBQUE1EX0lOVF9CSVRTIDcNCisjZGVmaW5lIFBQTURfUEVSSU9EX0JJVFMgNw0KKyNkZWZpbmUgUFBNRF9CSU5fU0NBTEUgKDEgPDwgKFBQTURfSU5UX0JJVFMgKyBQUE1EX1BFUklPRF9CSVRTKSkNCisNCisjZGVmaW5lIFBQTURfR0VUX01FQU5fU1BFQyhzdW1tLCBzaGlmdCwgcm91bmQpICgoKHN1bW0pICsgKDEgPDwgKChzaGlmdCkgLSAocm91bmQpKSkpID4+IChzaGlmdCkpDQorI2RlZmluZSBQUE1EX0dFVF9NRUFOKHN1bW0pIFBQTURfR0VUX01FQU5fU1BFQygoc3VtbSksIFBQTURfUEVSSU9EX0JJVFMsIDIpDQorI2RlZmluZSBQUE1EX1VQREFURV9QUk9CXzAocHJvYikgKChwcm9iKSArICgxIDw8IFBQTURfSU5UX0JJVFMpIC0gUFBNRF9HRVRfTUVBTihwcm9iKSkNCisjZGVmaW5lIFBQTURfVVBEQVRFX1BST0JfMShwcm9iKSAoKHByb2IpIC0gUFBNRF9HRVRfTUVBTihwcm9iKSkNCisNCisjZGVmaW5lIFBQTURfTjEgNA0KKyNkZWZpbmUgUFBNRF9OMiA0DQorI2RlZmluZSBQUE1EX04zIDQNCisjZGVmaW5lIFBQTURfTjQgKCgxMjggKyAzIC0gMSAqIFBQTURfTjEgLSAyICogUFBNRF9OMiAtIDMgKiBQUE1EX04zKSAvIDQpDQorI2RlZmluZSBQUE1EX05VTV9JTkRFWEVTIChQUE1EX04xICsgUFBNRF9OMiArIFBQTURfTjMgKyBQUE1EX040KQ0KKw0KKyNwcmFnbWEgcGFjayhwdXNoLCAxKQ0KKy8qIE1vc3QgY29tcGlsZXJzIHdvcmtzIE9LIGhlcmUgZXZlbiB3aXRob3V0ICNwcmFnbWEgcGFjayhwdXNoLCAxKSwgYnV0IHNvbWUgR0NDIGNvbXBpbGVycyBuZWVkIGl0LiAqLw0KKw0KKy8qIFNFRS1jb250ZXh0cyBmb3IgUFBNLWNvbnRleHRzIHdpdGggbWFza2VkIHN5bWJvbHMgKi8NCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIFVJbnQxNiBTdW1tOyAvKiBGcmVxICovDQorICBCeXRlIFNoaWZ0OyAgLyogU3BlZWQgb2YgRnJlcSBjaGFuZ2U7IGxvdyBTaGlmdCBpcyBmb3IgZmFzdCBjaGFuZ2UgKi8NCisgIEJ5dGUgQ291bnQ7ICAvKiBDb3VudCB0byBuZXh0IGNoYW5nZSBvZiBTaGlmdCAqLw0KK30gQ1BwbWRfU2VlOw0KKw0KKyNkZWZpbmUgUHBtZF9TZWVfVXBkYXRlKHApICBpZiAoKHApLT5TaGlmdCA8IFBQTURfUEVSSU9EX0JJVFMgJiYgLS0ocCktPkNvdW50ID09IDApIFwNCisgICAgeyAocCktPlN1bW0gPDw9IDE7IChwKS0+Q291bnQgPSAoQnl0ZSkoMyA8PCAocCktPlNoaWZ0KyspOyB9DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBCeXRlIFN5bWJvbDsNCisgIEJ5dGUgRnJlcTsNCisgIFVJbnQxNiBTdWNjZXNzb3JMb3c7DQorICBVSW50MTYgU3VjY2Vzc29ySGlnaDsNCit9IENQcG1kX1N0YXRlOw0KKw0KKyNwcmFnbWEgcGFjayhwb3ApDQorDQordHlwZWRlZg0KKyAgI2lmZGVmIFBQTURfMzJCSVQNCisgICAgQ1BwbWRfU3RhdGUgKg0KKyAgI2Vsc2UNCisgICAgVUludDMyDQorICAjZW5kaWYNCisgIENQcG1kX1N0YXRlX1JlZjsNCisNCit0eXBlZGVmDQorICAjaWZkZWYgUFBNRF8zMkJJVA0KKyAgICB2b2lkICoNCisgICNlbHNlDQorICAgIFVJbnQzMg0KKyAgI2VuZGlmDQorICBDUHBtZF9Wb2lkX1JlZjsNCisNCit0eXBlZGVmDQorICAjaWZkZWYgUFBNRF8zMkJJVA0KKyAgICBCeXRlICoNCisgICNlbHNlDQorICAgIFVJbnQzMg0KKyAgI2VuZGlmDQorICBDUHBtZF9CeXRlX1JlZjsNCisNCisjZGVmaW5lIFBQTURfU2V0QWxsQml0c0luMjU2Qnl0ZXMocCkgXA0KKyAgeyB1bnNpZ25lZCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2IC8gc2l6ZW9mKHBbMF0pOyBpICs9IDgpIHsgXA0KKyAgcFtpKzddID0gcFtpKzZdID0gcFtpKzVdID0gcFtpKzRdID0gcFtpKzNdID0gcFtpKzJdID0gcFtpKzFdID0gcFtpKzBdID0gfihzaXplX3QpMDsgfX0NCisNCitFWFRFUk5fQ19FTkQNCisgDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DL1BwbWQ3LmMgYi9sem1hL0MvUHBtZDcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OThjMTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL1BwbWQ3LmMKQEAgLTAsMCArMSw3MTAgQEAKKy8qIFBwbWQ3LmMgLS0gUFBNZEggY29kZWMNCisyMDEwLTAzLTEyIDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluDQorVGhpcyBjb2RlIGlzIGJhc2VkIG9uIFBQTWQgdmFyLkggKDIwMDEpOiBEbWl0cnkgU2hrYXJpbiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiUHJlY29tcC5oIg0KKw0KKyNpbmNsdWRlIDxtZW1vcnkuaD4NCisNCisjaW5jbHVkZSAiUHBtZDcuaCINCisNCitjb25zdCBCeXRlIFBQTUQ3X2tFeHBFc2NhcGVbMTZdID0geyAyNSwgMTQsIDksIDcsIDUsIDUsIDQsIDQsIDQsIDMsIDMsIDMsIDIsIDIsIDIsIDIgfTsNCitzdGF0aWMgY29uc3QgVUludDE2IGtJbml0QmluRXNjW10gPSB7IDB4M0NERCwgMHgxRjNGLCAweDU5QkYsIDB4NDhGMywgMHg2NEExLCAweDVBQkMsIDB4NjYzMiwgMHg2MDUxfTsNCisNCisjZGVmaW5lIE1BWF9GUkVRIDEyNA0KKyNkZWZpbmUgVU5JVF9TSVpFIDEyDQorDQorI2RlZmluZSBVMkIobnUpICgoVUludDMyKShudSkgKiBVTklUX1NJWkUpDQorI2RlZmluZSBVMkkobnUpIChwLT5Vbml0czJJbmR4WyhudSkgLSAxXSkNCisjZGVmaW5lIEkyVShpbmR4KSAocC0+SW5keDJVbml0c1tpbmR4XSkNCisNCisjaWZkZWYgUFBNRF8zMkJJVA0KKyAgI2RlZmluZSBSRUYocHRyKSAocHRyKQ0KKyNlbHNlDQorICAjZGVmaW5lIFJFRihwdHIpICgoVUludDMyKSgoQnl0ZSAqKShwdHIpIC0gKHApLT5CYXNlKSkNCisjZW5kaWYNCisNCisjZGVmaW5lIFNUQVRTX1JFRihwdHIpICgoQ1BwbWRfU3RhdGVfUmVmKVJFRihwdHIpKQ0KKw0KKyNkZWZpbmUgQ1RYKHJlZikgKChDUHBtZDdfQ29udGV4dCAqKVBwbWQ3X0dldENvbnRleHQocCwgcmVmKSkNCisjZGVmaW5lIFNUQVRTKGN0eCkgUHBtZDdfR2V0U3RhdHMocCwgY3R4KQ0KKyNkZWZpbmUgT05FX1NUQVRFKGN0eCkgUHBtZDdDb250ZXh0X09uZVN0YXRlKGN0eCkNCisjZGVmaW5lIFNVRkZJWChjdHgpIENUWCgoY3R4KS0+U3VmZml4KQ0KKw0KK3R5cGVkZWYgQ1BwbWQ3X0NvbnRleHQgKiBDVFhfUFRSOw0KKw0KK3N0cnVjdCBDUHBtZDdfTm9kZV87DQorDQordHlwZWRlZg0KKyAgI2lmZGVmIFBQTURfMzJCSVQNCisgICAgc3RydWN0IENQcG1kN19Ob2RlXyAqDQorICAjZWxzZQ0KKyAgICBVSW50MzINCisgICNlbmRpZg0KKyAgQ1BwbWQ3X05vZGVfUmVmOw0KKw0KK3R5cGVkZWYgc3RydWN0IENQcG1kN19Ob2RlXw0KK3sNCisgIFVJbnQxNiBTdGFtcDsgLyogbXVzdCBiZSBhdCBvZmZzZXQgMCBhcyBDUHBtZDdfQ29udGV4dDo6TnVtU3RhdHMuIFN0YW1wPTAgbWVhbnMgZnJlZSAqLw0KKyAgVUludDE2IE5VOw0KKyAgQ1BwbWQ3X05vZGVfUmVmIE5leHQ7IC8qIG11c3QgYmUgYXQgb2Zmc2V0ID49IDQgKi8NCisgIENQcG1kN19Ob2RlX1JlZiBQcmV2Ow0KK30gQ1BwbWQ3X05vZGU7DQorDQorI2lmZGVmIFBQTURfMzJCSVQNCisgICNkZWZpbmUgTk9ERShwdHIpIChwdHIpDQorI2Vsc2UNCisgICNkZWZpbmUgTk9ERShvZmZzKSAoKENQcG1kN19Ob2RlICopKHAtPkJhc2UgKyAob2ZmcykpKQ0KKyNlbmRpZg0KKw0KK3ZvaWQgUHBtZDdfQ29uc3RydWN0KENQcG1kNyAqcCkNCit7DQorICB1bnNpZ25lZCBpLCBrLCBtOw0KKw0KKyAgcC0+QmFzZSA9IDA7DQorDQorICBmb3IgKGkgPSAwLCBrID0gMDsgaSA8IFBQTURfTlVNX0lOREVYRVM7IGkrKykNCisgIHsNCisgICAgdW5zaWduZWQgc3RlcCA9IChpID49IDEyID8gNCA6IChpID4+IDIpICsgMSk7DQorICAgIGRvIHsgcC0+VW5pdHMySW5keFtrKytdID0gKEJ5dGUpaTsgfSB3aGlsZSgtLXN0ZXApOw0KKyAgICBwLT5JbmR4MlVuaXRzW2ldID0gKEJ5dGUpazsNCisgIH0NCisNCisgIHAtPk5TMkJTSW5keFswXSA9ICgwIDw8IDEpOw0KKyAgcC0+TlMyQlNJbmR4WzFdID0gKDEgPDwgMSk7DQorICBtZW1zZXQocC0+TlMyQlNJbmR4ICsgMiwgKDIgPDwgMSksIDkpOw0KKyAgbWVtc2V0KHAtPk5TMkJTSW5keCArIDExLCAoMyA8PCAxKSwgMjU2IC0gMTEpOw0KKw0KKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykNCisgICAgcC0+TlMySW5keFtpXSA9IChCeXRlKWk7DQorICBmb3IgKG0gPSBpLCBrID0gMTsgaSA8IDI1NjsgaSsrKQ0KKyAgew0KKyAgICBwLT5OUzJJbmR4W2ldID0gKEJ5dGUpbTsNCisgICAgaWYgKC0tayA9PSAwKQ0KKyAgICAgIGsgPSAoKyttKSAtIDI7DQorICB9DQorDQorICBtZW1zZXQocC0+SEIyRmxhZywgMCwgMHg0MCk7DQorICBtZW1zZXQocC0+SEIyRmxhZyArIDB4NDAsIDgsIDB4MTAwIC0gMHg0MCk7DQorfQ0KKw0KK3ZvaWQgUHBtZDdfRnJlZShDUHBtZDcgKnAsIElTekFsbG9jICphbGxvYykNCit7DQorICBhbGxvYy0+RnJlZShhbGxvYywgcC0+QmFzZSk7DQorICBwLT5TaXplID0gMDsNCisgIHAtPkJhc2UgPSAwOw0KK30NCisNCitCb29sIFBwbWQ3X0FsbG9jKENQcG1kNyAqcCwgVUludDMyIHNpemUsIElTekFsbG9jICphbGxvYykNCit7DQorICBpZiAocC0+QmFzZSA9PSAwIHx8IHAtPlNpemUgIT0gc2l6ZSkNCisgIHsNCisgICAgUHBtZDdfRnJlZShwLCBhbGxvYyk7DQorICAgIHAtPkFsaWduT2Zmc2V0ID0NCisgICAgICAjaWZkZWYgUFBNRF8zMkJJVA0KKyAgICAgICAgKDQgLSBzaXplKSAmIDM7DQorICAgICAgI2Vsc2UNCisgICAgICAgIDQgLSAoc2l6ZSAmIDMpOw0KKyAgICAgICNlbmRpZg0KKyAgICBpZiAoKHAtPkJhc2UgPSAoQnl0ZSAqKWFsbG9jLT5BbGxvYyhhbGxvYywgcC0+QWxpZ25PZmZzZXQgKyBzaXplDQorICAgICAgICAjaWZuZGVmIFBQTURfMzJCSVQNCisgICAgICAgICsgVU5JVF9TSVpFDQorICAgICAgICAjZW5kaWYNCisgICAgICAgICkpID09IDApDQorICAgICAgcmV0dXJuIEZhbHNlOw0KKyAgICBwLT5TaXplID0gc2l6ZTsNCisgIH0NCisgIHJldHVybiBUcnVlOw0KK30NCisNCitzdGF0aWMgdm9pZCBJbnNlcnROb2RlKENQcG1kNyAqcCwgdm9pZCAqbm9kZSwgdW5zaWduZWQgaW5keCkNCit7DQorICAqKChDUHBtZF9Wb2lkX1JlZiAqKW5vZGUpID0gcC0+RnJlZUxpc3RbaW5keF07DQorICBwLT5GcmVlTGlzdFtpbmR4XSA9IFJFRihub2RlKTsNCit9DQorDQorc3RhdGljIHZvaWQgKlJlbW92ZU5vZGUoQ1BwbWQ3ICpwLCB1bnNpZ25lZCBpbmR4KQ0KK3sNCisgIENQcG1kX1ZvaWRfUmVmICpub2RlID0gKENQcG1kX1ZvaWRfUmVmICopUHBtZDdfR2V0UHRyKHAsIHAtPkZyZWVMaXN0W2luZHhdKTsNCisgIHAtPkZyZWVMaXN0W2luZHhdID0gKm5vZGU7DQorICByZXR1cm4gbm9kZTsNCit9DQorDQorc3RhdGljIHZvaWQgU3BsaXRCbG9jayhDUHBtZDcgKnAsIHZvaWQgKnB0ciwgdW5zaWduZWQgb2xkSW5keCwgdW5zaWduZWQgbmV3SW5keCkNCit7DQorICB1bnNpZ25lZCBpLCBudSA9IEkyVShvbGRJbmR4KSAtIEkyVShuZXdJbmR4KTsNCisgIHB0ciA9IChCeXRlICopcHRyICsgVTJCKEkyVShuZXdJbmR4KSk7DQorICBpZiAoSTJVKGkgPSBVMkkobnUpKSAhPSBudSkNCisgIHsNCisgICAgdW5zaWduZWQgayA9IEkyVSgtLWkpOw0KKyAgICBJbnNlcnROb2RlKHAsICgoQnl0ZSAqKXB0cikgKyBVMkIoayksIG51IC0gayAtIDEpOw0KKyAgfQ0KKyAgSW5zZXJ0Tm9kZShwLCBwdHIsIGkpOw0KK30NCisNCitzdGF0aWMgdm9pZCBHbHVlRnJlZUJsb2NrcyhDUHBtZDcgKnApDQorew0KKyAgI2lmZGVmIFBQTURfMzJCSVQNCisgIENQcG1kN19Ob2RlIGhlYWRJdGVtOw0KKyAgQ1BwbWQ3X05vZGVfUmVmIGhlYWQgPSAmaGVhZEl0ZW07DQorICAjZWxzZQ0KKyAgQ1BwbWQ3X05vZGVfUmVmIGhlYWQgPSBwLT5BbGlnbk9mZnNldCArIHAtPlNpemU7DQorICAjZW5kaWYNCisgIA0KKyAgQ1BwbWQ3X05vZGVfUmVmIG4gPSBoZWFkOw0KKyAgdW5zaWduZWQgaTsNCisNCisgIHAtPkdsdWVDb3VudCA9IDI1NTsNCisNCisgIC8qIGNyZWF0ZSBkb3VibHktbGlua2VkIGxpc3Qgb2YgZnJlZSBibG9ja3MgKi8NCisgIGZvciAoaSA9IDA7IGkgPCBQUE1EX05VTV9JTkRFWEVTOyBpKyspDQorICB7DQorICAgIFVJbnQxNiBudSA9IEkyVShpKTsNCisgICAgQ1BwbWQ3X05vZGVfUmVmIG5leHQgPSAoQ1BwbWQ3X05vZGVfUmVmKXAtPkZyZWVMaXN0W2ldOw0KKyAgICBwLT5GcmVlTGlzdFtpXSA9IDA7DQorICAgIHdoaWxlIChuZXh0ICE9IDApDQorICAgIHsNCisgICAgICBDUHBtZDdfTm9kZSAqbm9kZSA9IE5PREUobmV4dCk7DQorICAgICAgbm9kZS0+TmV4dCA9IG47DQorICAgICAgbiA9IE5PREUobiktPlByZXYgPSBuZXh0Ow0KKyAgICAgIG5leHQgPSAqKGNvbnN0IENQcG1kN19Ob2RlX1JlZiAqKW5vZGU7DQorICAgICAgbm9kZS0+U3RhbXAgPSAwOw0KKyAgICAgIG5vZGUtPk5VID0gKFVJbnQxNiludTsNCisgICAgfQ0KKyAgfQ0KKyAgTk9ERShoZWFkKS0+U3RhbXAgPSAxOw0KKyAgTk9ERShoZWFkKS0+TmV4dCA9IG47DQorICBOT0RFKG4pLT5QcmV2ID0gaGVhZDsNCisgIGlmIChwLT5Mb1VuaXQgIT0gcC0+SGlVbml0KQ0KKyAgICAoKENQcG1kN19Ob2RlICopcC0+TG9Vbml0KS0+U3RhbXAgPSAxOw0KKyAgDQorICAvKiBHbHVlIGZyZWUgYmxvY2tzICovDQorICB3aGlsZSAobiAhPSBoZWFkKQ0KKyAgew0KKyAgICBDUHBtZDdfTm9kZSAqbm9kZSA9IE5PREUobik7DQorICAgIFVJbnQzMiBudSA9IChVSW50MzIpbm9kZS0+TlU7DQorICAgIGZvciAoOzspDQorICAgIHsNCisgICAgICBDUHBtZDdfTm9kZSAqbm9kZTIgPSBOT0RFKG4pICsgbnU7DQorICAgICAgbnUgKz0gbm9kZTItPk5VOw0KKyAgICAgIGlmIChub2RlMi0+U3RhbXAgIT0gMCB8fCBudSA+PSAweDEwMDAwKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgTk9ERShub2RlMi0+UHJldiktPk5leHQgPSBub2RlMi0+TmV4dDsNCisgICAgICBOT0RFKG5vZGUyLT5OZXh0KS0+UHJldiA9IG5vZGUyLT5QcmV2Ow0KKyAgICAgIG5vZGUtPk5VID0gKFVJbnQxNiludTsNCisgICAgfQ0KKyAgICBuID0gbm9kZS0+TmV4dDsNCisgIH0NCisgIA0KKyAgLyogRmlsbCBsaXN0cyBvZiBmcmVlIGJsb2NrcyAqLw0KKyAgZm9yIChuID0gTk9ERShoZWFkKS0+TmV4dDsgbiAhPSBoZWFkOykNCisgIHsNCisgICAgQ1BwbWQ3X05vZGUgKm5vZGUgPSBOT0RFKG4pOw0KKyAgICB1bnNpZ25lZCBudTsNCisgICAgQ1BwbWQ3X05vZGVfUmVmIG5leHQgPSBub2RlLT5OZXh0Ow0KKyAgICBmb3IgKG51ID0gbm9kZS0+TlU7IG51ID4gMTI4OyBudSAtPSAxMjgsIG5vZGUgKz0gMTI4KQ0KKyAgICAgIEluc2VydE5vZGUocCwgbm9kZSwgUFBNRF9OVU1fSU5ERVhFUyAtIDEpOw0KKyAgICBpZiAoSTJVKGkgPSBVMkkobnUpKSAhPSBudSkNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIGsgPSBJMlUoLS1pKTsNCisgICAgICBJbnNlcnROb2RlKHAsIG5vZGUgKyBrLCBudSAtIGsgLSAxKTsNCisgICAgfQ0KKyAgICBJbnNlcnROb2RlKHAsIG5vZGUsIGkpOw0KKyAgICBuID0gbmV4dDsNCisgIH0NCit9DQorDQorc3RhdGljIHZvaWQgKkFsbG9jVW5pdHNSYXJlKENQcG1kNyAqcCwgdW5zaWduZWQgaW5keCkNCit7DQorICB1bnNpZ25lZCBpOw0KKyAgdm9pZCAqcmV0VmFsOw0KKyAgaWYgKHAtPkdsdWVDb3VudCA9PSAwKQ0KKyAgew0KKyAgICBHbHVlRnJlZUJsb2NrcyhwKTsNCisgICAgaWYgKHAtPkZyZWVMaXN0W2luZHhdICE9IDApDQorICAgICAgcmV0dXJuIFJlbW92ZU5vZGUocCwgaW5keCk7DQorICB9DQorICBpID0gaW5keDsNCisgIGRvDQorICB7DQorICAgIGlmICgrK2kgPT0gUFBNRF9OVU1fSU5ERVhFUykNCisgICAgew0KKyAgICAgIFVJbnQzMiBudW1CeXRlcyA9IFUyQihJMlUoaW5keCkpOw0KKyAgICAgIHAtPkdsdWVDb3VudC0tOw0KKyAgICAgIHJldHVybiAoKFVJbnQzMikocC0+VW5pdHNTdGFydCAtIHAtPlRleHQpID4gbnVtQnl0ZXMpID8gKHAtPlVuaXRzU3RhcnQgLT0gbnVtQnl0ZXMpIDogKE5VTEwpOw0KKyAgICB9DQorICB9DQorICB3aGlsZSAocC0+RnJlZUxpc3RbaV0gPT0gMCk7DQorICByZXRWYWwgPSBSZW1vdmVOb2RlKHAsIGkpOw0KKyAgU3BsaXRCbG9jayhwLCByZXRWYWwsIGksIGluZHgpOw0KKyAgcmV0dXJuIHJldFZhbDsNCit9DQorDQorc3RhdGljIHZvaWQgKkFsbG9jVW5pdHMoQ1BwbWQ3ICpwLCB1bnNpZ25lZCBpbmR4KQ0KK3sNCisgIFVJbnQzMiBudW1CeXRlczsNCisgIGlmIChwLT5GcmVlTGlzdFtpbmR4XSAhPSAwKQ0KKyAgICByZXR1cm4gUmVtb3ZlTm9kZShwLCBpbmR4KTsNCisgIG51bUJ5dGVzID0gVTJCKEkyVShpbmR4KSk7DQorICBpZiAobnVtQnl0ZXMgPD0gKFVJbnQzMikocC0+SGlVbml0IC0gcC0+TG9Vbml0KSkNCisgIHsNCisgICAgdm9pZCAqcmV0VmFsID0gcC0+TG9Vbml0Ow0KKyAgICBwLT5Mb1VuaXQgKz0gbnVtQnl0ZXM7DQorICAgIHJldHVybiByZXRWYWw7DQorICB9DQorICByZXR1cm4gQWxsb2NVbml0c1JhcmUocCwgaW5keCk7DQorfQ0KKw0KKyNkZWZpbmUgTXlNZW0xMkNweShkZXN0LCBzcmMsIG51bSkgXA0KKyAgeyBVSW50MzIgKmQgPSAoVUludDMyICopZGVzdDsgY29uc3QgVUludDMyICpzID0gKGNvbnN0IFVJbnQzMiAqKXNyYzsgVUludDMyIG4gPSBudW07IFwNCisgICAgZG8geyBkWzBdID0gc1swXTsgZFsxXSA9IHNbMV07IGRbMl0gPSBzWzJdOyBzICs9IDM7IGQgKz0gMzsgfSB3aGlsZSgtLW4pOyB9DQorDQorc3RhdGljIHZvaWQgKlNocmlua1VuaXRzKENQcG1kNyAqcCwgdm9pZCAqb2xkUHRyLCB1bnNpZ25lZCBvbGROVSwgdW5zaWduZWQgbmV3TlUpDQorew0KKyAgdW5zaWduZWQgaTAgPSBVMkkob2xkTlUpOw0KKyAgdW5zaWduZWQgaTEgPSBVMkkobmV3TlUpOw0KKyAgaWYgKGkwID09IGkxKQ0KKyAgICByZXR1cm4gb2xkUHRyOw0KKyAgaWYgKHAtPkZyZWVMaXN0W2kxXSAhPSAwKQ0KKyAgew0KKyAgICB2b2lkICpwdHIgPSBSZW1vdmVOb2RlKHAsIGkxKTsNCisgICAgTXlNZW0xMkNweShwdHIsIG9sZFB0ciwgbmV3TlUpOw0KKyAgICBJbnNlcnROb2RlKHAsIG9sZFB0ciwgaTApOw0KKyAgICByZXR1cm4gcHRyOw0KKyAgfQ0KKyAgU3BsaXRCbG9jayhwLCBvbGRQdHIsIGkwLCBpMSk7DQorICByZXR1cm4gb2xkUHRyOw0KK30NCisNCisjZGVmaW5lIFNVQ0NFU1NPUihwKSAoKENQcG1kX1ZvaWRfUmVmKSgocCktPlN1Y2Nlc3NvckxvdyB8ICgoVUludDMyKShwKS0+U3VjY2Vzc29ySGlnaCA8PCAxNikpKQ0KKw0KK3N0YXRpYyB2b2lkIFNldFN1Y2Nlc3NvcihDUHBtZF9TdGF0ZSAqcCwgQ1BwbWRfVm9pZF9SZWYgdikNCit7DQorICAocCktPlN1Y2Nlc3NvckxvdyA9IChVSW50MTYpKChVSW50MzIpKHYpICYgMHhGRkZGKTsNCisgIChwKS0+U3VjY2Vzc29ySGlnaCA9IChVSW50MTYpKCgoVUludDMyKSh2KSA+PiAxNikgJiAweEZGRkYpOw0KK30NCisNCitzdGF0aWMgdm9pZCBSZXN0YXJ0TW9kZWwoQ1BwbWQ3ICpwKQ0KK3sNCisgIHVuc2lnbmVkIGksIGssIG07DQorDQorICBtZW1zZXQocC0+RnJlZUxpc3QsIDAsIHNpemVvZihwLT5GcmVlTGlzdCkpOw0KKyAgcC0+VGV4dCA9IHAtPkJhc2UgKyBwLT5BbGlnbk9mZnNldDsNCisgIHAtPkhpVW5pdCA9IHAtPlRleHQgKyBwLT5TaXplOw0KKyAgcC0+TG9Vbml0ID0gcC0+VW5pdHNTdGFydCA9IHAtPkhpVW5pdCAtIHAtPlNpemUgLyA4IC8gVU5JVF9TSVpFICogNyAqIFVOSVRfU0laRTsNCisgIHAtPkdsdWVDb3VudCA9IDA7DQorDQorICBwLT5PcmRlckZhbGwgPSBwLT5NYXhPcmRlcjsNCisgIHAtPlJ1bkxlbmd0aCA9IHAtPkluaXRSTCA9IC0oSW50MzIpKChwLT5NYXhPcmRlciA8IDEyKSA/IHAtPk1heE9yZGVyIDogMTIpIC0gMTsNCisgIHAtPlByZXZTdWNjZXNzID0gMDsNCisNCisgIHAtPk1pbkNvbnRleHQgPSBwLT5NYXhDb250ZXh0ID0gKENUWF9QVFIpKHAtPkhpVW5pdCAtPSBVTklUX1NJWkUpOyAvKiBBbGxvY0NvbnRleHQocCk7ICovDQorICBwLT5NaW5Db250ZXh0LT5TdWZmaXggPSAwOw0KKyAgcC0+TWluQ29udGV4dC0+TnVtU3RhdHMgPSAyNTY7DQorICBwLT5NaW5Db250ZXh0LT5TdW1tRnJlcSA9IDI1NiArIDE7DQorICBwLT5Gb3VuZFN0YXRlID0gKENQcG1kX1N0YXRlICopcC0+TG9Vbml0OyAvKiBBbGxvY1VuaXRzKHAsIFBQTURfTlVNX0lOREVYRVMgLSAxKTsgKi8NCisgIHAtPkxvVW5pdCArPSBVMkIoMjU2IC8gMik7DQorICBwLT5NaW5Db250ZXh0LT5TdGF0cyA9IFJFRihwLT5Gb3VuZFN0YXRlKTsNCisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykNCisgIHsNCisgICAgQ1BwbWRfU3RhdGUgKnMgPSAmcC0+Rm91bmRTdGF0ZVtpXTsNCisgICAgcy0+U3ltYm9sID0gKEJ5dGUpaTsNCisgICAgcy0+RnJlcSA9IDE7DQorICAgIFNldFN1Y2Nlc3NvcihzLCAwKTsNCisgIH0NCisNCisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykNCisgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykNCisgICAgew0KKyAgICAgIFVJbnQxNiAqZGVzdCA9IHAtPkJpblN1bW1baV0gKyBrOw0KKyAgICAgIFVJbnQxNiB2YWwgPSAoVUludDE2KShQUE1EX0JJTl9TQ0FMRSAtIGtJbml0QmluRXNjW2tdIC8gKGkgKyAyKSk7DQorICAgICAgZm9yIChtID0gMDsgbSA8IDY0OyBtICs9IDgpDQorICAgICAgICBkZXN0W21dID0gdmFsOw0KKyAgICB9DQorICANCisgIGZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKQ0KKyAgICBmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykNCisgICAgew0KKyAgICAgIENQcG1kX1NlZSAqcyA9ICZwLT5TZWVbaV1ba107DQorICAgICAgcy0+U3VtbSA9IChVSW50MTYpKCg1ICogaSArIDEwKSA8PCAocy0+U2hpZnQgPSBQUE1EX1BFUklPRF9CSVRTIC0gNCkpOw0KKyAgICAgIHMtPkNvdW50ID0gNDsNCisgICAgfQ0KK30NCisNCit2b2lkIFBwbWQ3X0luaXQoQ1BwbWQ3ICpwLCB1bnNpZ25lZCBtYXhPcmRlcikNCit7DQorICBwLT5NYXhPcmRlciA9IG1heE9yZGVyOw0KKyAgUmVzdGFydE1vZGVsKHApOw0KKyAgcC0+RHVtbXlTZWUuU2hpZnQgPSBQUE1EX1BFUklPRF9CSVRTOw0KKyAgcC0+RHVtbXlTZWUuU3VtbSA9IDA7IC8qIHVudXNlZCAqLw0KKyAgcC0+RHVtbXlTZWUuQ291bnQgPSA2NDsgLyogdW51c2VkICovDQorfQ0KKw0KK3N0YXRpYyBDVFhfUFRSIENyZWF0ZVN1Y2Nlc3NvcnMoQ1BwbWQ3ICpwLCBCb29sIHNraXApDQorew0KKyAgQ1BwbWRfU3RhdGUgdXBTdGF0ZTsNCisgIENUWF9QVFIgYyA9IHAtPk1pbkNvbnRleHQ7DQorICBDUHBtZF9CeXRlX1JlZiB1cEJyYW5jaCA9IChDUHBtZF9CeXRlX1JlZilTVUNDRVNTT1IocC0+Rm91bmRTdGF0ZSk7DQorICBDUHBtZF9TdGF0ZSAqcHNbUFBNRDdfTUFYX09SREVSXTsNCisgIHVuc2lnbmVkIG51bVBzID0gMDsNCisgIA0KKyAgaWYgKCFza2lwKQ0KKyAgICBwc1tudW1QcysrXSA9IHAtPkZvdW5kU3RhdGU7DQorICANCisgIHdoaWxlIChjLT5TdWZmaXgpDQorICB7DQorICAgIENQcG1kX1ZvaWRfUmVmIHN1Y2Nlc3NvcjsNCisgICAgQ1BwbWRfU3RhdGUgKnM7DQorICAgIGMgPSBTVUZGSVgoYyk7DQorICAgIGlmIChjLT5OdW1TdGF0cyAhPSAxKQ0KKyAgICB7DQorICAgICAgZm9yIChzID0gU1RBVFMoYyk7IHMtPlN5bWJvbCAhPSBwLT5Gb3VuZFN0YXRlLT5TeW1ib2w7IHMrKyk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAgIHMgPSBPTkVfU1RBVEUoYyk7DQorICAgIHN1Y2Nlc3NvciA9IFNVQ0NFU1NPUihzKTsNCisgICAgaWYgKHN1Y2Nlc3NvciAhPSB1cEJyYW5jaCkNCisgICAgew0KKyAgICAgIGMgPSBDVFgoc3VjY2Vzc29yKTsNCisgICAgICBpZiAobnVtUHMgPT0gMCkNCisgICAgICAgIHJldHVybiBjOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHBzW251bVBzKytdID0gczsNCisgIH0NCisgIA0KKyAgdXBTdGF0ZS5TeW1ib2wgPSAqKGNvbnN0IEJ5dGUgKilQcG1kN19HZXRQdHIocCwgdXBCcmFuY2gpOw0KKyAgU2V0U3VjY2Vzc29yKCZ1cFN0YXRlLCB1cEJyYW5jaCArIDEpOw0KKyAgDQorICBpZiAoYy0+TnVtU3RhdHMgPT0gMSkNCisgICAgdXBTdGF0ZS5GcmVxID0gT05FX1NUQVRFKGMpLT5GcmVxOw0KKyAgZWxzZQ0KKyAgew0KKyAgICBVSW50MzIgY2YsIHMwOw0KKyAgICBDUHBtZF9TdGF0ZSAqczsNCisgICAgZm9yIChzID0gU1RBVFMoYyk7IHMtPlN5bWJvbCAhPSB1cFN0YXRlLlN5bWJvbDsgcysrKTsNCisgICAgY2YgPSBzLT5GcmVxIC0gMTsNCisgICAgczAgPSBjLT5TdW1tRnJlcSAtIGMtPk51bVN0YXRzIC0gY2Y7DQorICAgIHVwU3RhdGUuRnJlcSA9IChCeXRlKSgxICsgKCgyICogY2YgPD0gczApID8gKDUgKiBjZiA+IHMwKSA6ICgoMiAqIGNmICsgMyAqIHMwIC0gMSkgLyAoMiAqIHMwKSkpKTsNCisgIH0NCisNCisgIGRvDQorICB7DQorICAgIC8qIENyZWF0ZSBDaGlsZCAqLw0KKyAgICBDVFhfUFRSIGMxOyAvKiA9IEFsbG9jQ29udGV4dChwKTsgKi8NCisgICAgaWYgKHAtPkhpVW5pdCAhPSBwLT5Mb1VuaXQpDQorICAgICAgYzEgPSAoQ1RYX1BUUikocC0+SGlVbml0IC09IFVOSVRfU0laRSk7DQorICAgIGVsc2UgaWYgKHAtPkZyZWVMaXN0WzBdICE9IDApDQorICAgICAgYzEgPSAoQ1RYX1BUUilSZW1vdmVOb2RlKHAsIDApOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBjMSA9IChDVFhfUFRSKUFsbG9jVW5pdHNSYXJlKHAsIDApOw0KKyAgICAgIGlmICghYzEpDQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBjMS0+TnVtU3RhdHMgPSAxOw0KKyAgICAqT05FX1NUQVRFKGMxKSA9IHVwU3RhdGU7DQorICAgIGMxLT5TdWZmaXggPSBSRUYoYyk7DQorICAgIFNldFN1Y2Nlc3Nvcihwc1stLW51bVBzXSwgUkVGKGMxKSk7DQorICAgIGMgPSBjMTsNCisgIH0NCisgIHdoaWxlIChudW1QcyAhPSAwKTsNCisgIA0KKyAgcmV0dXJuIGM7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFN3YXBTdGF0ZXMoQ1BwbWRfU3RhdGUgKnQxLCBDUHBtZF9TdGF0ZSAqdDIpDQorew0KKyAgQ1BwbWRfU3RhdGUgdG1wID0gKnQxOw0KKyAgKnQxID0gKnQyOw0KKyAgKnQyID0gdG1wOw0KK30NCisNCitzdGF0aWMgdm9pZCBVcGRhdGVNb2RlbChDUHBtZDcgKnApDQorew0KKyAgQ1BwbWRfVm9pZF9SZWYgc3VjY2Vzc29yLCBmU3VjY2Vzc29yID0gU1VDQ0VTU09SKHAtPkZvdW5kU3RhdGUpOw0KKyAgQ1RYX1BUUiBjOw0KKyAgdW5zaWduZWQgczAsIG5zOw0KKyAgDQorICBpZiAocC0+Rm91bmRTdGF0ZS0+RnJlcSA8IE1BWF9GUkVRIC8gNCAmJiBwLT5NaW5Db250ZXh0LT5TdWZmaXggIT0gMCkNCisgIHsNCisgICAgYyA9IFNVRkZJWChwLT5NaW5Db250ZXh0KTsNCisgICAgDQorICAgIGlmIChjLT5OdW1TdGF0cyA9PSAxKQ0KKyAgICB7DQorICAgICAgQ1BwbWRfU3RhdGUgKnMgPSBPTkVfU1RBVEUoYyk7DQorICAgICAgaWYgKHMtPkZyZXEgPCAzMikNCisgICAgICAgIHMtPkZyZXErKzsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBDUHBtZF9TdGF0ZSAqcyA9IFNUQVRTKGMpOw0KKyAgICAgIGlmIChzLT5TeW1ib2wgIT0gcC0+Rm91bmRTdGF0ZS0+U3ltYm9sKQ0KKyAgICAgIHsNCisgICAgICAgIGRvIHsgcysrOyB9IHdoaWxlIChzLT5TeW1ib2wgIT0gcC0+Rm91bmRTdGF0ZS0+U3ltYm9sKTsNCisgICAgICAgIGlmIChzWzBdLkZyZXEgPj0gc1stMV0uRnJlcSkNCisgICAgICAgIHsNCisgICAgICAgICAgU3dhcFN0YXRlcygmc1swXSwgJnNbLTFdKTsNCisgICAgICAgICAgcy0tOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAocy0+RnJlcSA8IE1BWF9GUkVRIC0gOSkNCisgICAgICB7DQorICAgICAgICBzLT5GcmVxICs9IDI7DQorICAgICAgICBjLT5TdW1tRnJlcSArPSAyOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKHAtPk9yZGVyRmFsbCA9PSAwKQ0KKyAgew0KKyAgICBwLT5NaW5Db250ZXh0ID0gcC0+TWF4Q29udGV4dCA9IENyZWF0ZVN1Y2Nlc3NvcnMocCwgVHJ1ZSk7DQorICAgIGlmIChwLT5NaW5Db250ZXh0ID09IDApDQorICAgIHsNCisgICAgICBSZXN0YXJ0TW9kZWwocCk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFNldFN1Y2Nlc3NvcihwLT5Gb3VuZFN0YXRlLCBSRUYocC0+TWluQ29udGV4dCkpOw0KKyAgICByZXR1cm47DQorICB9DQorICANCisgICpwLT5UZXh0KysgPSBwLT5Gb3VuZFN0YXRlLT5TeW1ib2w7DQorICBzdWNjZXNzb3IgPSBSRUYocC0+VGV4dCk7DQorICBpZiAocC0+VGV4dCA+PSBwLT5Vbml0c1N0YXJ0KQ0KKyAgew0KKyAgICBSZXN0YXJ0TW9kZWwocCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIA0KKyAgaWYgKGZTdWNjZXNzb3IpDQorICB7DQorICAgIGlmIChmU3VjY2Vzc29yIDw9IHN1Y2Nlc3NvcikNCisgICAgew0KKyAgICAgIENUWF9QVFIgY3MgPSBDcmVhdGVTdWNjZXNzb3JzKHAsIEZhbHNlKTsNCisgICAgICBpZiAoY3MgPT0gTlVMTCkNCisgICAgICB7DQorICAgICAgICBSZXN0YXJ0TW9kZWwocCk7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIGZTdWNjZXNzb3IgPSBSRUYoY3MpOw0KKyAgICB9DQorICAgIGlmICgtLXAtPk9yZGVyRmFsbCA9PSAwKQ0KKyAgICB7DQorICAgICAgc3VjY2Vzc29yID0gZlN1Y2Nlc3NvcjsNCisgICAgICBwLT5UZXh0IC09IChwLT5NYXhDb250ZXh0ICE9IHAtPk1pbkNvbnRleHQpOw0KKyAgICB9DQorICB9DQorICBlbHNlDQorICB7DQorICAgIFNldFN1Y2Nlc3NvcihwLT5Gb3VuZFN0YXRlLCBzdWNjZXNzb3IpOw0KKyAgICBmU3VjY2Vzc29yID0gUkVGKHAtPk1pbkNvbnRleHQpOw0KKyAgfQ0KKyAgDQorICBzMCA9IHAtPk1pbkNvbnRleHQtPlN1bW1GcmVxIC0gKG5zID0gcC0+TWluQ29udGV4dC0+TnVtU3RhdHMpIC0gKHAtPkZvdW5kU3RhdGUtPkZyZXEgLSAxKTsNCisgIA0KKyAgZm9yIChjID0gcC0+TWF4Q29udGV4dDsgYyAhPSBwLT5NaW5Db250ZXh0OyBjID0gU1VGRklYKGMpKQ0KKyAgew0KKyAgICB1bnNpZ25lZCBuczE7DQorICAgIFVJbnQzMiBjZiwgc2Y7DQorICAgIGlmICgobnMxID0gYy0+TnVtU3RhdHMpICE9IDEpDQorICAgIHsNCisgICAgICBpZiAoKG5zMSAmIDEpID09IDApDQorICAgICAgew0KKyAgICAgICAgLyogRXhwYW5kIGZvciBvbmUgVU5JVCAqLw0KKyAgICAgICAgdW5zaWduZWQgb2xkTlUgPSBuczEgPj4gMTsNCisgICAgICAgIHVuc2lnbmVkIGkgPSBVMkkob2xkTlUpOw0KKyAgICAgICAgaWYgKGkgIT0gVTJJKG9sZE5VICsgMSkpDQorICAgICAgICB7DQorICAgICAgICAgIHZvaWQgKnB0ciA9IEFsbG9jVW5pdHMocCwgaSArIDEpOw0KKyAgICAgICAgICB2b2lkICpvbGRQdHI7DQorICAgICAgICAgIGlmICghcHRyKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgUmVzdGFydE1vZGVsKHApOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBvbGRQdHIgPSBTVEFUUyhjKTsNCisgICAgICAgICAgTXlNZW0xMkNweShwdHIsIG9sZFB0ciwgb2xkTlUpOw0KKyAgICAgICAgICBJbnNlcnROb2RlKHAsIG9sZFB0ciwgaSk7DQorICAgICAgICAgIGMtPlN0YXRzID0gU1RBVFNfUkVGKHB0cik7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGMtPlN1bW1GcmVxID0gKFVJbnQxNikoYy0+U3VtbUZyZXEgKyAoMiAqIG5zMSA8IG5zKSArIDIgKiAoKDQgKiBuczEgPD0gbnMpICYgKGMtPlN1bW1GcmVxIDw9IDggKiBuczEpKSk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgQ1BwbWRfU3RhdGUgKnMgPSAoQ1BwbWRfU3RhdGUqKUFsbG9jVW5pdHMocCwgMCk7DQorICAgICAgaWYgKCFzKQ0KKyAgICAgIHsNCisgICAgICAgIFJlc3RhcnRNb2RlbChwKTsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgKnMgPSAqT05FX1NUQVRFKGMpOw0KKyAgICAgIGMtPlN0YXRzID0gUkVGKHMpOw0KKyAgICAgIGlmIChzLT5GcmVxIDwgTUFYX0ZSRVEgLyA0IC0gMSkNCisgICAgICAgIHMtPkZyZXEgPDw9IDE7DQorICAgICAgZWxzZQ0KKyAgICAgICAgcy0+RnJlcSA9IE1BWF9GUkVRIC0gNDsNCisgICAgICBjLT5TdW1tRnJlcSA9IChVSW50MTYpKHMtPkZyZXEgKyBwLT5Jbml0RXNjICsgKG5zID4gMykpOw0KKyAgICB9DQorICAgIGNmID0gMiAqIChVSW50MzIpcC0+Rm91bmRTdGF0ZS0+RnJlcSAqIChjLT5TdW1tRnJlcSArIDYpOw0KKyAgICBzZiA9IChVSW50MzIpczAgKyBjLT5TdW1tRnJlcTsNCisgICAgaWYgKGNmIDwgNiAqIHNmKQ0KKyAgICB7DQorICAgICAgY2YgPSAxICsgKGNmID4gc2YpICsgKGNmID49IDQgKiBzZik7DQorICAgICAgYy0+U3VtbUZyZXEgKz0gMzsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBjZiA9IDQgKyAoY2YgPj0gOSAqIHNmKSArIChjZiA+PSAxMiAqIHNmKSArIChjZiA+PSAxNSAqIHNmKTsNCisgICAgICBjLT5TdW1tRnJlcSA9IChVSW50MTYpKGMtPlN1bW1GcmVxICsgY2YpOw0KKyAgICB9DQorICAgIHsNCisgICAgICBDUHBtZF9TdGF0ZSAqcyA9IFNUQVRTKGMpICsgbnMxOw0KKyAgICAgIFNldFN1Y2Nlc3NvcihzLCBzdWNjZXNzb3IpOw0KKyAgICAgIHMtPlN5bWJvbCA9IHAtPkZvdW5kU3RhdGUtPlN5bWJvbDsNCisgICAgICBzLT5GcmVxID0gKEJ5dGUpY2Y7DQorICAgICAgYy0+TnVtU3RhdHMgPSAoVUludDE2KShuczEgKyAxKTsNCisgICAgfQ0KKyAgfQ0KKyAgcC0+TWF4Q29udGV4dCA9IHAtPk1pbkNvbnRleHQgPSBDVFgoZlN1Y2Nlc3Nvcik7DQorfQ0KKyAgDQorc3RhdGljIHZvaWQgUmVzY2FsZShDUHBtZDcgKnApDQorew0KKyAgdW5zaWduZWQgaSwgYWRkZXIsIHN1bUZyZXEsIGVzY0ZyZXE7DQorICBDUHBtZF9TdGF0ZSAqc3RhdHMgPSBTVEFUUyhwLT5NaW5Db250ZXh0KTsNCisgIENQcG1kX1N0YXRlICpzID0gcC0+Rm91bmRTdGF0ZTsNCisgIHsNCisgICAgQ1BwbWRfU3RhdGUgdG1wID0gKnM7DQorICAgIGZvciAoOyBzICE9IHN0YXRzOyBzLS0pDQorICAgICAgc1swXSA9IHNbLTFdOw0KKyAgICAqcyA9IHRtcDsNCisgIH0NCisgIGVzY0ZyZXEgPSBwLT5NaW5Db250ZXh0LT5TdW1tRnJlcSAtIHMtPkZyZXE7DQorICBzLT5GcmVxICs9IDQ7DQorICBhZGRlciA9IChwLT5PcmRlckZhbGwgIT0gMCk7DQorICBzLT5GcmVxID0gKEJ5dGUpKChzLT5GcmVxICsgYWRkZXIpID4+IDEpOw0KKyAgc3VtRnJlcSA9IHMtPkZyZXE7DQorICANCisgIGkgPSBwLT5NaW5Db250ZXh0LT5OdW1TdGF0cyAtIDE7DQorICBkbw0KKyAgew0KKyAgICBlc2NGcmVxIC09ICgrK3MpLT5GcmVxOw0KKyAgICBzLT5GcmVxID0gKEJ5dGUpKChzLT5GcmVxICsgYWRkZXIpID4+IDEpOw0KKyAgICBzdW1GcmVxICs9IHMtPkZyZXE7DQorICAgIGlmIChzWzBdLkZyZXEgPiBzWy0xXS5GcmVxKQ0KKyAgICB7DQorICAgICAgQ1BwbWRfU3RhdGUgKnMxID0gczsNCisgICAgICBDUHBtZF9TdGF0ZSB0bXAgPSAqczE7DQorICAgICAgZG8NCisgICAgICAgIHMxWzBdID0gczFbLTFdOw0KKyAgICAgIHdoaWxlICgtLXMxICE9IHN0YXRzICYmIHRtcC5GcmVxID4gczFbLTFdLkZyZXEpOw0KKyAgICAgICpzMSA9IHRtcDsNCisgICAgfQ0KKyAgfQ0KKyAgd2hpbGUgKC0taSk7DQorICANCisgIGlmIChzLT5GcmVxID09IDApDQorICB7DQorICAgIHVuc2lnbmVkIG51bVN0YXRzID0gcC0+TWluQ29udGV4dC0+TnVtU3RhdHM7DQorICAgIHVuc2lnbmVkIG4wLCBuMTsNCisgICAgZG8geyBpKys7IH0gd2hpbGUgKCgtLXMpLT5GcmVxID09IDApOw0KKyAgICBlc2NGcmVxICs9IGk7DQorICAgIHAtPk1pbkNvbnRleHQtPk51bVN0YXRzID0gKFVJbnQxNikocC0+TWluQ29udGV4dC0+TnVtU3RhdHMgLSBpKTsNCisgICAgaWYgKHAtPk1pbkNvbnRleHQtPk51bVN0YXRzID09IDEpDQorICAgIHsNCisgICAgICBDUHBtZF9TdGF0ZSB0bXAgPSAqc3RhdHM7DQorICAgICAgZG8NCisgICAgICB7DQorICAgICAgICB0bXAuRnJlcSA9IChCeXRlKSh0bXAuRnJlcSAtICh0bXAuRnJlcSA+PiAxKSk7DQorICAgICAgICBlc2NGcmVxID4+PSAxOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAoZXNjRnJlcSA+IDEpOw0KKyAgICAgIEluc2VydE5vZGUocCwgc3RhdHMsIFUySSgoKG51bVN0YXRzICsgMSkgPj4gMSkpKTsNCisgICAgICAqKHAtPkZvdW5kU3RhdGUgPSBPTkVfU1RBVEUocC0+TWluQ29udGV4dCkpID0gdG1wOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBuMCA9IChudW1TdGF0cyArIDEpID4+IDE7DQorICAgIG4xID0gKHAtPk1pbkNvbnRleHQtPk51bVN0YXRzICsgMSkgPj4gMTsNCisgICAgaWYgKG4wICE9IG4xKQ0KKyAgICAgIHAtPk1pbkNvbnRleHQtPlN0YXRzID0gU1RBVFNfUkVGKFNocmlua1VuaXRzKHAsIHN0YXRzLCBuMCwgbjEpKTsNCisgIH0NCisgIHAtPk1pbkNvbnRleHQtPlN1bW1GcmVxID0gKFVJbnQxNikoc3VtRnJlcSArIGVzY0ZyZXEgLSAoZXNjRnJlcSA+PiAxKSk7DQorICBwLT5Gb3VuZFN0YXRlID0gU1RBVFMocC0+TWluQ29udGV4dCk7DQorfQ0KKw0KK0NQcG1kX1NlZSAqUHBtZDdfTWFrZUVzY0ZyZXEoQ1BwbWQ3ICpwLCB1bnNpZ25lZCBudW1NYXNrZWQsIFVJbnQzMiAqZXNjRnJlcSkNCit7DQorICBDUHBtZF9TZWUgKnNlZTsNCisgIHVuc2lnbmVkIG5vbk1hc2tlZCA9IHAtPk1pbkNvbnRleHQtPk51bVN0YXRzIC0gbnVtTWFza2VkOw0KKyAgaWYgKHAtPk1pbkNvbnRleHQtPk51bVN0YXRzICE9IDI1NikNCisgIHsNCisgICAgc2VlID0gcC0+U2VlW3AtPk5TMkluZHhbbm9uTWFza2VkIC0gMV1dICsNCisgICAgICAgIChub25NYXNrZWQgPCAodW5zaWduZWQpU1VGRklYKHAtPk1pbkNvbnRleHQpLT5OdW1TdGF0cyAtIHAtPk1pbkNvbnRleHQtPk51bVN0YXRzKSArDQorICAgICAgICAyICogKHAtPk1pbkNvbnRleHQtPlN1bW1GcmVxIDwgMTEgKiBwLT5NaW5Db250ZXh0LT5OdW1TdGF0cykgKw0KKyAgICAgICAgNCAqIChudW1NYXNrZWQgPiBub25NYXNrZWQpICsNCisgICAgICAgIHAtPkhpQml0c0ZsYWc7DQorICAgIHsNCisgICAgICB1bnNpZ25lZCByID0gKHNlZS0+U3VtbSA+PiBzZWUtPlNoaWZ0KTsNCisgICAgICBzZWUtPlN1bW0gPSAoVUludDE2KShzZWUtPlN1bW0gLSByKTsNCisgICAgICAqZXNjRnJlcSA9IHIgKyAociA9PSAwKTsNCisgICAgfQ0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBzZWUgPSAmcC0+RHVtbXlTZWU7DQorICAgICplc2NGcmVxID0gMTsNCisgIH0NCisgIHJldHVybiBzZWU7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIE5leHRDb250ZXh0KENQcG1kNyAqcCkNCit7DQorICBDVFhfUFRSIGMgPSBDVFgoU1VDQ0VTU09SKHAtPkZvdW5kU3RhdGUpKTsNCisgIGlmIChwLT5PcmRlckZhbGwgPT0gMCAmJiAoQnl0ZSAqKWMgPiBwLT5UZXh0KQ0KKyAgICBwLT5NaW5Db250ZXh0ID0gcC0+TWF4Q29udGV4dCA9IGM7DQorICBlbHNlDQorICAgIFVwZGF0ZU1vZGVsKHApOw0KK30NCisNCit2b2lkIFBwbWQ3X1VwZGF0ZTEoQ1BwbWQ3ICpwKQ0KK3sNCisgIENQcG1kX1N0YXRlICpzID0gcC0+Rm91bmRTdGF0ZTsNCisgIHMtPkZyZXEgKz0gNDsNCisgIHAtPk1pbkNvbnRleHQtPlN1bW1GcmVxICs9IDQ7DQorICBpZiAoc1swXS5GcmVxID4gc1stMV0uRnJlcSkNCisgIHsNCisgICAgU3dhcFN0YXRlcygmc1swXSwgJnNbLTFdKTsNCisgICAgcC0+Rm91bmRTdGF0ZSA9IC0tczsNCisgICAgaWYgKHMtPkZyZXEgPiBNQVhfRlJFUSkNCisgICAgICBSZXNjYWxlKHApOw0KKyAgfQ0KKyAgTmV4dENvbnRleHQocCk7DQorfQ0KKw0KK3ZvaWQgUHBtZDdfVXBkYXRlMV8wKENQcG1kNyAqcCkNCit7DQorICBwLT5QcmV2U3VjY2VzcyA9ICgyICogcC0+Rm91bmRTdGF0ZS0+RnJlcSA+IHAtPk1pbkNvbnRleHQtPlN1bW1GcmVxKTsNCisgIHAtPlJ1bkxlbmd0aCArPSBwLT5QcmV2U3VjY2VzczsNCisgIHAtPk1pbkNvbnRleHQtPlN1bW1GcmVxICs9IDQ7DQorICBpZiAoKHAtPkZvdW5kU3RhdGUtPkZyZXEgKz0gNCkgPiBNQVhfRlJFUSkNCisgICAgUmVzY2FsZShwKTsNCisgIE5leHRDb250ZXh0KHApOw0KK30NCisNCit2b2lkIFBwbWQ3X1VwZGF0ZUJpbihDUHBtZDcgKnApDQorew0KKyAgcC0+Rm91bmRTdGF0ZS0+RnJlcSA9IChCeXRlKShwLT5Gb3VuZFN0YXRlLT5GcmVxICsgKHAtPkZvdW5kU3RhdGUtPkZyZXEgPCAxMjggPyAxOiAwKSk7DQorICBwLT5QcmV2U3VjY2VzcyA9IDE7DQorICBwLT5SdW5MZW5ndGgrKzsNCisgIE5leHRDb250ZXh0KHApOw0KK30NCisNCit2b2lkIFBwbWQ3X1VwZGF0ZTIoQ1BwbWQ3ICpwKQ0KK3sNCisgIHAtPk1pbkNvbnRleHQtPlN1bW1GcmVxICs9IDQ7DQorICBpZiAoKHAtPkZvdW5kU3RhdGUtPkZyZXEgKz0gNCkgPiBNQVhfRlJFUSkNCisgICAgUmVzY2FsZShwKTsNCisgIHAtPlJ1bkxlbmd0aCA9IHAtPkluaXRSTDsNCisgIFVwZGF0ZU1vZGVsKHApOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0MvUHBtZDcuaCBiL2x6bWEvQy9QcG1kNy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTgxZWIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvUHBtZDcuaApAQCAtMCwwICsxLDE0MCBAQAorLyogUHBtZDcuaCAtLSBQUE1kSCBjb21wcmVzc2lvbiBjb2RlYw0KKzIwMTAtMDMtMTIgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4NCitUaGlzIGNvZGUgaXMgYmFzZWQgb24gUFBNZCB2YXIuSCAoMjAwMSk6IERtaXRyeSBTaGthcmluIDogUHVibGljIGRvbWFpbiAqLw0KKw0KKy8qIFRoaXMgY29kZSBzdXBwb3J0cyB2aXJ0dWFsIFJhbmdlRGVjb2RlciBhbmQgaW5jbHVkZXMgdGhlIGltcGxlbWVudGF0aW9uDQorb2YgUmFuZ2VDb2RlciBmcm9tIDd6LCBpbnN0ZWFkIG9mIFJhbmdlQ29kZXIgZnJvbSBvcmlnaW5hbCBQUE1kIHZhci5ILg0KK0lmIHlvdSBuZWVkIHRoZSBjb21wYXRpYmlsaXR5IHdpdGggb3JpZ2luYWwgUFBNZCB2YXIuSCwgeW91IGNhbiB1c2UgZXh0ZXJuYWwgUmFuZ2VEZWNvZGVyICovDQorDQorI2lmbmRlZiBfX1BQTUQ3X0gNCisjZGVmaW5lIF9fUFBNRDdfSA0KKw0KKyNpbmNsdWRlICJQcG1kLmgiDQorDQorRVhURVJOX0NfQkVHSU4NCisNCisjZGVmaW5lIFBQTUQ3X01JTl9PUkRFUiAyDQorI2RlZmluZSBQUE1EN19NQVhfT1JERVIgNjQNCisNCisjZGVmaW5lIFBQTUQ3X01JTl9NRU1fU0laRSAoMSA8PCAxMSkNCisjZGVmaW5lIFBQTUQ3X01BWF9NRU1fU0laRSAoMHhGRkZGRkZGRiAtIDEyICogMykNCisNCitzdHJ1Y3QgQ1BwbWQ3X0NvbnRleHRfOw0KKw0KK3R5cGVkZWYNCisgICNpZmRlZiBQUE1EXzMyQklUDQorICAgIHN0cnVjdCBDUHBtZDdfQ29udGV4dF8gKg0KKyAgI2Vsc2UNCisgICAgVUludDMyDQorICAjZW5kaWYNCisgIENQcG1kN19Db250ZXh0X1JlZjsNCisNCit0eXBlZGVmIHN0cnVjdCBDUHBtZDdfQ29udGV4dF8NCit7DQorICBVSW50MTYgTnVtU3RhdHM7DQorICBVSW50MTYgU3VtbUZyZXE7DQorICBDUHBtZF9TdGF0ZV9SZWYgU3RhdHM7DQorICBDUHBtZDdfQ29udGV4dF9SZWYgU3VmZml4Ow0KK30gQ1BwbWQ3X0NvbnRleHQ7DQorDQorI2RlZmluZSBQcG1kN0NvbnRleHRfT25lU3RhdGUocCkgKChDUHBtZF9TdGF0ZSAqKSYocCktPlN1bW1GcmVxKQ0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgQ1BwbWQ3X0NvbnRleHQgKk1pbkNvbnRleHQsICpNYXhDb250ZXh0Ow0KKyAgQ1BwbWRfU3RhdGUgKkZvdW5kU3RhdGU7DQorICB1bnNpZ25lZCBPcmRlckZhbGwsIEluaXRFc2MsIFByZXZTdWNjZXNzLCBNYXhPcmRlciwgSGlCaXRzRmxhZzsNCisgIEludDMyIFJ1bkxlbmd0aCwgSW5pdFJMOyAvKiBtdXN0IGJlIDMyLWJpdCBhdCBsZWFzdCAqLw0KKw0KKyAgVUludDMyIFNpemU7DQorICBVSW50MzIgR2x1ZUNvdW50Ow0KKyAgQnl0ZSAqQmFzZSwgKkxvVW5pdCwgKkhpVW5pdCwgKlRleHQsICpVbml0c1N0YXJ0Ow0KKyAgVUludDMyIEFsaWduT2Zmc2V0Ow0KKw0KKyAgQnl0ZSBJbmR4MlVuaXRzW1BQTURfTlVNX0lOREVYRVNdOw0KKyAgQnl0ZSBVbml0czJJbmR4WzEyOF07DQorICBDUHBtZF9Wb2lkX1JlZiBGcmVlTGlzdFtQUE1EX05VTV9JTkRFWEVTXTsNCisgIEJ5dGUgTlMySW5keFsyNTZdLCBOUzJCU0luZHhbMjU2XSwgSEIyRmxhZ1syNTZdOw0KKyAgQ1BwbWRfU2VlIER1bW15U2VlLCBTZWVbMjVdWzE2XTsNCisgIFVJbnQxNiBCaW5TdW1tWzEyOF1bNjRdOw0KK30gQ1BwbWQ3Ow0KKw0KK3ZvaWQgUHBtZDdfQ29uc3RydWN0KENQcG1kNyAqcCk7DQorQm9vbCBQcG1kN19BbGxvYyhDUHBtZDcgKnAsIFVJbnQzMiBzaXplLCBJU3pBbGxvYyAqYWxsb2MpOw0KK3ZvaWQgUHBtZDdfRnJlZShDUHBtZDcgKnAsIElTekFsbG9jICphbGxvYyk7DQordm9pZCBQcG1kN19Jbml0KENQcG1kNyAqcCwgdW5zaWduZWQgbWF4T3JkZXIpOw0KKyNkZWZpbmUgUHBtZDdfV2FzQWxsb2NhdGVkKHApICgocCktPkJhc2UgIT0gTlVMTCkNCisNCisNCisvKiAtLS0tLS0tLS0tIEludGVybmFsIEZ1bmN0aW9ucyAtLS0tLS0tLS0tICovDQorDQorZXh0ZXJuIGNvbnN0IEJ5dGUgUFBNRDdfa0V4cEVzY2FwZVsxNl07DQorDQorI2lmZGVmIFBQTURfMzJCSVQNCisgICNkZWZpbmUgUHBtZDdfR2V0UHRyKHAsIHB0cikgKHB0cikNCisgICNkZWZpbmUgUHBtZDdfR2V0Q29udGV4dChwLCBwdHIpIChwdHIpDQorICAjZGVmaW5lIFBwbWQ3X0dldFN0YXRzKHAsIGN0eCkgKChjdHgpLT5TdGF0cykNCisjZWxzZQ0KKyAgI2RlZmluZSBQcG1kN19HZXRQdHIocCwgb2ZmcykgKCh2b2lkICopKChwKS0+QmFzZSArIChvZmZzKSkpDQorICAjZGVmaW5lIFBwbWQ3X0dldENvbnRleHQocCwgb2ZmcykgKChDUHBtZDdfQ29udGV4dCAqKVBwbWQ3X0dldFB0cigocCksIChvZmZzKSkpDQorICAjZGVmaW5lIFBwbWQ3X0dldFN0YXRzKHAsIGN0eCkgKChDUHBtZF9TdGF0ZSAqKVBwbWQ3X0dldFB0cigocCksICgoY3R4KS0+U3RhdHMpKSkNCisjZW5kaWYNCisNCit2b2lkIFBwbWQ3X1VwZGF0ZTEoQ1BwbWQ3ICpwKTsNCit2b2lkIFBwbWQ3X1VwZGF0ZTFfMChDUHBtZDcgKnApOw0KK3ZvaWQgUHBtZDdfVXBkYXRlMihDUHBtZDcgKnApOw0KK3ZvaWQgUHBtZDdfVXBkYXRlQmluKENQcG1kNyAqcCk7DQorDQorI2RlZmluZSBQcG1kN19HZXRCaW5TdW1tKHApIFwNCisgICAgJnAtPkJpblN1bW1bUHBtZDdDb250ZXh0X09uZVN0YXRlKHAtPk1pbkNvbnRleHQpLT5GcmVxIC0gMV1bcC0+UHJldlN1Y2Nlc3MgKyBcDQorICAgIHAtPk5TMkJTSW5keFtQcG1kN19HZXRDb250ZXh0KHAsIHAtPk1pbkNvbnRleHQtPlN1ZmZpeCktPk51bVN0YXRzIC0gMV0gKyBcDQorICAgIChwLT5IaUJpdHNGbGFnID0gcC0+SEIyRmxhZ1twLT5Gb3VuZFN0YXRlLT5TeW1ib2xdKSArIFwNCisgICAgMiAqIHAtPkhCMkZsYWdbUHBtZDdDb250ZXh0X09uZVN0YXRlKHAtPk1pbkNvbnRleHQpLT5TeW1ib2xdICsgXA0KKyAgICAoKHAtPlJ1bkxlbmd0aCA+PiAyNikgJiAweDIwKV0NCisNCitDUHBtZF9TZWUgKlBwbWQ3X01ha2VFc2NGcmVxKENQcG1kNyAqcCwgdW5zaWduZWQgbnVtTWFza2VkLCBVSW50MzIgKnNjYWxlKTsNCisNCisNCisvKiAtLS0tLS0tLS0tIERlY29kZSAtLS0tLS0tLS0tICovDQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBVSW50MzIgKCpHZXRUaHJlc2hvbGQpKHZvaWQgKnAsIFVJbnQzMiB0b3RhbCk7DQorICB2b2lkICgqRGVjb2RlKSh2b2lkICpwLCBVSW50MzIgc3RhcnQsIFVJbnQzMiBzaXplKTsNCisgIFVJbnQzMiAoKkRlY29kZUJpdCkodm9pZCAqcCwgVUludDMyIHNpemUwKTsNCit9IElQcG1kN19SYW5nZURlYzsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIElQcG1kN19SYW5nZURlYyBwOw0KKyAgVUludDMyIFJhbmdlOw0KKyAgVUludDMyIENvZGU7DQorICBJQnl0ZUluICpTdHJlYW07DQorfSBDUHBtZDd6X1JhbmdlRGVjOw0KKw0KK3ZvaWQgUHBtZDd6X1JhbmdlRGVjX0NyZWF0ZVZUYWJsZShDUHBtZDd6X1JhbmdlRGVjICpwKTsNCitCb29sIFBwbWQ3el9SYW5nZURlY19Jbml0KENQcG1kN3pfUmFuZ2VEZWMgKnApOw0KKyNkZWZpbmUgUHBtZDd6X1JhbmdlRGVjX0lzRmluaXNoZWRPSyhwKSAoKHApLT5Db2RlID09IDApDQorDQoraW50IFBwbWQ3X0RlY29kZVN5bWJvbChDUHBtZDcgKnAsIElQcG1kN19SYW5nZURlYyAqcmMpOw0KKw0KKw0KKy8qIC0tLS0tLS0tLS0gRW5jb2RlIC0tLS0tLS0tLS0gKi8NCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIFVJbnQ2NCBMb3c7DQorICBVSW50MzIgUmFuZ2U7DQorICBCeXRlIENhY2hlOw0KKyAgVUludDY0IENhY2hlU2l6ZTsNCisgIElCeXRlT3V0ICpTdHJlYW07DQorfSBDUHBtZDd6X1JhbmdlRW5jOw0KKw0KK3ZvaWQgUHBtZDd6X1JhbmdlRW5jX0luaXQoQ1BwbWQ3el9SYW5nZUVuYyAqcCk7DQordm9pZCBQcG1kN3pfUmFuZ2VFbmNfRmx1c2hEYXRhKENQcG1kN3pfUmFuZ2VFbmMgKnApOw0KKw0KK3ZvaWQgUHBtZDdfRW5jb2RlU3ltYm9sKENQcG1kNyAqcCwgQ1BwbWQ3el9SYW5nZUVuYyAqcmMsIGludCBzeW1ib2wpOw0KKw0KK0VYVEVSTl9DX0VORA0KKyANCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0MvUHBtZDdEZWMuYyBiL2x6bWEvQy9QcG1kN0RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDFkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvUHBtZDdEZWMuYwpAQCAtMCwwICsxLDE4OSBAQAorLyogUHBtZDdEZWMuYyAtLSBQUE1kSCBEZWNvZGVyDQorMjAxMC0wMy0xMiA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbg0KK1RoaXMgY29kZSBpcyBiYXNlZCBvbiBQUE1kIHZhci5IICgyMDAxKTogRG1pdHJ5IFNoa2FyaW4gOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSAiUHBtZDcuaCINCisNCisjZGVmaW5lIGtUb3BWYWx1ZSAoMSA8PCAyNCkNCisNCitCb29sIFBwbWQ3el9SYW5nZURlY19Jbml0KENQcG1kN3pfUmFuZ2VEZWMgKnApDQorew0KKyAgdW5zaWduZWQgaTsNCisgIHAtPkNvZGUgPSAwOw0KKyAgcC0+UmFuZ2UgPSAweEZGRkZGRkZGOw0KKyAgaWYgKHAtPlN0cmVhbS0+UmVhZCgodm9pZCAqKXAtPlN0cmVhbSkgIT0gMCkNCisgICAgcmV0dXJuIEZhbHNlOw0KKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykNCisgICAgcC0+Q29kZSA9IChwLT5Db2RlIDw8IDgpIHwgcC0+U3RyZWFtLT5SZWFkKCh2b2lkICopcC0+U3RyZWFtKTsNCisgIHJldHVybiAocC0+Q29kZSA8IDB4RkZGRkZGRkYpOw0KK30NCisNCitzdGF0aWMgVUludDMyIFJhbmdlX0dldFRocmVzaG9sZCh2b2lkICpwcCwgVUludDMyIHRvdGFsKQ0KK3sNCisgIENQcG1kN3pfUmFuZ2VEZWMgKnAgPSAoQ1BwbWQ3el9SYW5nZURlYyAqKXBwOw0KKyAgcmV0dXJuIChwLT5Db2RlKSAvIChwLT5SYW5nZSAvPSB0b3RhbCk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFJhbmdlX05vcm1hbGl6ZShDUHBtZDd6X1JhbmdlRGVjICpwKQ0KK3sNCisgIGlmIChwLT5SYW5nZSA8IGtUb3BWYWx1ZSkNCisgIHsNCisgICAgcC0+Q29kZSA9IChwLT5Db2RlIDw8IDgpIHwgcC0+U3RyZWFtLT5SZWFkKCh2b2lkICopcC0+U3RyZWFtKTsNCisgICAgcC0+UmFuZ2UgPDw9IDg7DQorICAgIGlmIChwLT5SYW5nZSA8IGtUb3BWYWx1ZSkNCisgICAgew0KKyAgICAgIHAtPkNvZGUgPSAocC0+Q29kZSA8PCA4KSB8IHAtPlN0cmVhbS0+UmVhZCgodm9pZCAqKXAtPlN0cmVhbSk7DQorICAgICAgcC0+UmFuZ2UgPDw9IDg7DQorICAgIH0NCisgIH0NCit9DQorDQorc3RhdGljIHZvaWQgUmFuZ2VfRGVjb2RlKHZvaWQgKnBwLCBVSW50MzIgc3RhcnQsIFVJbnQzMiBzaXplKQ0KK3sNCisgIENQcG1kN3pfUmFuZ2VEZWMgKnAgPSAoQ1BwbWQ3el9SYW5nZURlYyAqKXBwOw0KKyAgcC0+Q29kZSAtPSBzdGFydCAqIHAtPlJhbmdlOw0KKyAgcC0+UmFuZ2UgKj0gc2l6ZTsNCisgIFJhbmdlX05vcm1hbGl6ZShwKTsNCit9DQorDQorc3RhdGljIFVJbnQzMiBSYW5nZV9EZWNvZGVCaXQodm9pZCAqcHAsIFVJbnQzMiBzaXplMCkNCit7DQorICBDUHBtZDd6X1JhbmdlRGVjICpwID0gKENQcG1kN3pfUmFuZ2VEZWMgKilwcDsNCisgIFVJbnQzMiBuZXdCb3VuZCA9IChwLT5SYW5nZSA+PiAxNCkgKiBzaXplMDsNCisgIFVJbnQzMiBzeW1ib2w7DQorICBpZiAocC0+Q29kZSA8IG5ld0JvdW5kKQ0KKyAgew0KKyAgICBzeW1ib2wgPSAwOw0KKyAgICBwLT5SYW5nZSA9IG5ld0JvdW5kOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBzeW1ib2wgPSAxOw0KKyAgICBwLT5Db2RlIC09IG5ld0JvdW5kOw0KKyAgICBwLT5SYW5nZSAtPSBuZXdCb3VuZDsNCisgIH0NCisgIFJhbmdlX05vcm1hbGl6ZShwKTsNCisgIHJldHVybiBzeW1ib2w7DQorfQ0KKw0KK3ZvaWQgUHBtZDd6X1JhbmdlRGVjX0NyZWF0ZVZUYWJsZShDUHBtZDd6X1JhbmdlRGVjICpwKQ0KK3sNCisgIHAtPnAuR2V0VGhyZXNob2xkID0gUmFuZ2VfR2V0VGhyZXNob2xkOw0KKyAgcC0+cC5EZWNvZGUgPSBSYW5nZV9EZWNvZGU7DQorICBwLT5wLkRlY29kZUJpdCA9IFJhbmdlX0RlY29kZUJpdDsNCit9DQorDQorDQorI2RlZmluZSBNQVNLKHN5bSkgKChzaWduZWQgY2hhciAqKWNoYXJNYXNrKVtzeW1dDQorDQoraW50IFBwbWQ3X0RlY29kZVN5bWJvbChDUHBtZDcgKnAsIElQcG1kN19SYW5nZURlYyAqcmMpDQorew0KKyAgc2l6ZV90IGNoYXJNYXNrWzI1NiAvIHNpemVvZihzaXplX3QpXTsNCisgIGlmIChwLT5NaW5Db250ZXh0LT5OdW1TdGF0cyAhPSAxKQ0KKyAgew0KKyAgICBDUHBtZF9TdGF0ZSAqcyA9IFBwbWQ3X0dldFN0YXRzKHAsIHAtPk1pbkNvbnRleHQpOw0KKyAgICB1bnNpZ25lZCBpOw0KKyAgICBVSW50MzIgY291bnQsIGhpQ250Ow0KKyAgICBpZiAoKGNvdW50ID0gcmMtPkdldFRocmVzaG9sZChyYywgcC0+TWluQ29udGV4dC0+U3VtbUZyZXEpKSA8IChoaUNudCA9IHMtPkZyZXEpKQ0KKyAgICB7DQorICAgICAgQnl0ZSBzeW1ib2w7DQorICAgICAgcmMtPkRlY29kZShyYywgMCwgcy0+RnJlcSk7DQorICAgICAgcC0+Rm91bmRTdGF0ZSA9IHM7DQorICAgICAgc3ltYm9sID0gcy0+U3ltYm9sOw0KKyAgICAgIFBwbWQ3X1VwZGF0ZTFfMChwKTsNCisgICAgICByZXR1cm4gc3ltYm9sOw0KKyAgICB9DQorICAgIHAtPlByZXZTdWNjZXNzID0gMDsNCisgICAgaSA9IHAtPk1pbkNvbnRleHQtPk51bVN0YXRzIC0gMTsNCisgICAgZG8NCisgICAgew0KKyAgICAgIGlmICgoaGlDbnQgKz0gKCsrcyktPkZyZXEpID4gY291bnQpDQorICAgICAgew0KKyAgICAgICAgQnl0ZSBzeW1ib2w7DQorICAgICAgICByYy0+RGVjb2RlKHJjLCBoaUNudCAtIHMtPkZyZXEsIHMtPkZyZXEpOw0KKyAgICAgICAgcC0+Rm91bmRTdGF0ZSA9IHM7DQorICAgICAgICBzeW1ib2wgPSBzLT5TeW1ib2w7DQorICAgICAgICBQcG1kN19VcGRhdGUxKHApOw0KKyAgICAgICAgcmV0dXJuIHN5bWJvbDsNCisgICAgICB9DQorICAgIH0NCisgICAgd2hpbGUgKC0taSk7DQorICAgIGlmIChjb3VudCA+PSBwLT5NaW5Db250ZXh0LT5TdW1tRnJlcSkNCisgICAgICByZXR1cm4gLTI7DQorICAgIHAtPkhpQml0c0ZsYWcgPSBwLT5IQjJGbGFnW3AtPkZvdW5kU3RhdGUtPlN5bWJvbF07DQorICAgIHJjLT5EZWNvZGUocmMsIGhpQ250LCBwLT5NaW5Db250ZXh0LT5TdW1tRnJlcSAtIGhpQ250KTsNCisgICAgUFBNRF9TZXRBbGxCaXRzSW4yNTZCeXRlcyhjaGFyTWFzayk7DQorICAgIE1BU0socy0+U3ltYm9sKSA9IDA7DQorICAgIGkgPSBwLT5NaW5Db250ZXh0LT5OdW1TdGF0cyAtIDE7DQorICAgIGRvIHsgTUFTSygoLS1zKS0+U3ltYm9sKSA9IDA7IH0gd2hpbGUgKC0taSk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIFVJbnQxNiAqcHJvYiA9IFBwbWQ3X0dldEJpblN1bW0ocCk7DQorICAgIGlmIChyYy0+RGVjb2RlQml0KHJjLCAqcHJvYikgPT0gMCkNCisgICAgew0KKyAgICAgIEJ5dGUgc3ltYm9sOw0KKyAgICAgICpwcm9iID0gKFVJbnQxNilQUE1EX1VQREFURV9QUk9CXzAoKnByb2IpOw0KKyAgICAgIHN5bWJvbCA9IChwLT5Gb3VuZFN0YXRlID0gUHBtZDdDb250ZXh0X09uZVN0YXRlKHAtPk1pbkNvbnRleHQpKS0+U3ltYm9sOw0KKyAgICAgIFBwbWQ3X1VwZGF0ZUJpbihwKTsNCisgICAgICByZXR1cm4gc3ltYm9sOw0KKyAgICB9DQorICAgICpwcm9iID0gKFVJbnQxNilQUE1EX1VQREFURV9QUk9CXzEoKnByb2IpOw0KKyAgICBwLT5Jbml0RXNjID0gUFBNRDdfa0V4cEVzY2FwZVsqcHJvYiA+PiAxMF07DQorICAgIFBQTURfU2V0QWxsQml0c0luMjU2Qnl0ZXMoY2hhck1hc2spOw0KKyAgICBNQVNLKFBwbWQ3Q29udGV4dF9PbmVTdGF0ZShwLT5NaW5Db250ZXh0KS0+U3ltYm9sKSA9IDA7DQorICAgIHAtPlByZXZTdWNjZXNzID0gMDsNCisgIH0NCisgIGZvciAoOzspDQorICB7DQorICAgIENQcG1kX1N0YXRlICpwc1syNTZdLCAqczsNCisgICAgVUludDMyIGZyZXFTdW0sIGNvdW50LCBoaUNudDsNCisgICAgQ1BwbWRfU2VlICpzZWU7DQorICAgIHVuc2lnbmVkIGksIG51bSwgbnVtTWFza2VkID0gcC0+TWluQ29udGV4dC0+TnVtU3RhdHM7DQorICAgIGRvDQorICAgIHsNCisgICAgICBwLT5PcmRlckZhbGwrKzsNCisgICAgICBpZiAoIXAtPk1pbkNvbnRleHQtPlN1ZmZpeCkNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgICBwLT5NaW5Db250ZXh0ID0gUHBtZDdfR2V0Q29udGV4dChwLCBwLT5NaW5Db250ZXh0LT5TdWZmaXgpOw0KKyAgICB9DQorICAgIHdoaWxlIChwLT5NaW5Db250ZXh0LT5OdW1TdGF0cyA9PSBudW1NYXNrZWQpOw0KKyAgICBoaUNudCA9IDA7DQorICAgIHMgPSBQcG1kN19HZXRTdGF0cyhwLCBwLT5NaW5Db250ZXh0KTsNCisgICAgaSA9IDA7DQorICAgIG51bSA9IHAtPk1pbkNvbnRleHQtPk51bVN0YXRzIC0gbnVtTWFza2VkOw0KKyAgICBkbw0KKyAgICB7DQorICAgICAgaW50IGsgPSAoaW50KShNQVNLKHMtPlN5bWJvbCkpOw0KKyAgICAgIGhpQ250ICs9IChzLT5GcmVxICYgayk7DQorICAgICAgcHNbaV0gPSBzKys7DQorICAgICAgaSAtPSBrOw0KKyAgICB9DQorICAgIHdoaWxlIChpICE9IG51bSk7DQorICAgIA0KKyAgICBzZWUgPSBQcG1kN19NYWtlRXNjRnJlcShwLCBudW1NYXNrZWQsICZmcmVxU3VtKTsNCisgICAgZnJlcVN1bSArPSBoaUNudDsNCisgICAgY291bnQgPSByYy0+R2V0VGhyZXNob2xkKHJjLCBmcmVxU3VtKTsNCisgICAgDQorICAgIGlmIChjb3VudCA8IGhpQ250KQ0KKyAgICB7DQorICAgICAgQnl0ZSBzeW1ib2w7DQorICAgICAgQ1BwbWRfU3RhdGUgKipwcHMgPSBwczsNCisgICAgICBmb3IgKGhpQ250ID0gMDsgKGhpQ250ICs9ICgqcHBzKS0+RnJlcSkgPD0gY291bnQ7IHBwcysrKTsNCisgICAgICBzID0gKnBwczsNCisgICAgICByYy0+RGVjb2RlKHJjLCBoaUNudCAtIHMtPkZyZXEsIHMtPkZyZXEpOw0KKyAgICAgIFBwbWRfU2VlX1VwZGF0ZShzZWUpOw0KKyAgICAgIHAtPkZvdW5kU3RhdGUgPSBzOw0KKyAgICAgIHN5bWJvbCA9IHMtPlN5bWJvbDsNCisgICAgICBQcG1kN19VcGRhdGUyKHApOw0KKyAgICAgIHJldHVybiBzeW1ib2w7DQorICAgIH0NCisgICAgaWYgKGNvdW50ID49IGZyZXFTdW0pDQorICAgICAgcmV0dXJuIC0yOw0KKyAgICByYy0+RGVjb2RlKHJjLCBoaUNudCwgZnJlcVN1bSAtIGhpQ250KTsNCisgICAgc2VlLT5TdW1tID0gKFVJbnQxNikoc2VlLT5TdW1tICsgZnJlcVN1bSk7DQorICAgIGRvIHsgTUFTSyhwc1stLWldLT5TeW1ib2wpID0gMDsgfSB3aGlsZSAoaSAhPSAwKTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DL1BwbWQ3RW5jLmMgYi9sem1hL0MvUHBtZDdFbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODJlYTkwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL1BwbWQ3RW5jLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qIFBwbWQ3RW5jLmMgLS0gUFBNZEggRW5jb2Rlcg0KKzIwMTAtMDMtMTIgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4NCitUaGlzIGNvZGUgaXMgYmFzZWQgb24gUFBNZCB2YXIuSCAoMjAwMSk6IERtaXRyeSBTaGthcmluIDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlICJQcmVjb21wLmgiDQorDQorI2luY2x1ZGUgIlBwbWQ3LmgiDQorDQorI2RlZmluZSBrVG9wVmFsdWUgKDEgPDwgMjQpDQorDQordm9pZCBQcG1kN3pfUmFuZ2VFbmNfSW5pdChDUHBtZDd6X1JhbmdlRW5jICpwKQ0KK3sNCisgIHAtPkxvdyA9IDA7DQorICBwLT5SYW5nZSA9IDB4RkZGRkZGRkY7DQorICBwLT5DYWNoZSA9IDA7DQorICBwLT5DYWNoZVNpemUgPSAxOw0KK30NCisNCitzdGF0aWMgdm9pZCBSYW5nZUVuY19TaGlmdExvdyhDUHBtZDd6X1JhbmdlRW5jICpwKQ0KK3sNCisgIGlmICgoVUludDMyKXAtPkxvdyA8IChVSW50MzIpMHhGRjAwMDAwMCB8fCAodW5zaWduZWQpKHAtPkxvdyA+PiAzMikgIT0gMCkNCisgIHsNCisgICAgQnl0ZSB0ZW1wID0gcC0+Q2FjaGU7DQorICAgIGRvDQorICAgIHsNCisgICAgICBwLT5TdHJlYW0tPldyaXRlKHAtPlN0cmVhbSwgKEJ5dGUpKHRlbXAgKyAoQnl0ZSkocC0+TG93ID4+IDMyKSkpOw0KKyAgICAgIHRlbXAgPSAweEZGOw0KKyAgICB9DQorICAgIHdoaWxlKC0tcC0+Q2FjaGVTaXplICE9IDApOw0KKyAgICBwLT5DYWNoZSA9IChCeXRlKSgoVUludDMyKXAtPkxvdyA+PiAyNCk7DQorICB9DQorICBwLT5DYWNoZVNpemUrKzsNCisgIHAtPkxvdyA9IChVSW50MzIpcC0+TG93IDw8IDg7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFJhbmdlRW5jX0VuY29kZShDUHBtZDd6X1JhbmdlRW5jICpwLCBVSW50MzIgc3RhcnQsIFVJbnQzMiBzaXplLCBVSW50MzIgdG90YWwpDQorew0KKyAgcC0+TG93ICs9IHN0YXJ0ICogKHAtPlJhbmdlIC89IHRvdGFsKTsNCisgIHAtPlJhbmdlICo9IHNpemU7DQorICB3aGlsZSAocC0+UmFuZ2UgPCBrVG9wVmFsdWUpDQorICB7DQorICAgIHAtPlJhbmdlIDw8PSA4Ow0KKyAgICBSYW5nZUVuY19TaGlmdExvdyhwKTsNCisgIH0NCit9DQorDQorc3RhdGljIHZvaWQgUmFuZ2VFbmNfRW5jb2RlQml0XzAoQ1BwbWQ3el9SYW5nZUVuYyAqcCwgVUludDMyIHNpemUwKQ0KK3sNCisgIHAtPlJhbmdlID0gKHAtPlJhbmdlID4+IDE0KSAqIHNpemUwOw0KKyAgd2hpbGUgKHAtPlJhbmdlIDwga1RvcFZhbHVlKQ0KKyAgew0KKyAgICBwLT5SYW5nZSA8PD0gODsNCisgICAgUmFuZ2VFbmNfU2hpZnRMb3cocCk7DQorICB9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFJhbmdlRW5jX0VuY29kZUJpdF8xKENQcG1kN3pfUmFuZ2VFbmMgKnAsIFVJbnQzMiBzaXplMCkNCit7DQorICBVSW50MzIgbmV3Qm91bmQgPSAocC0+UmFuZ2UgPj4gMTQpICogc2l6ZTA7DQorICBwLT5Mb3cgKz0gbmV3Qm91bmQ7DQorICBwLT5SYW5nZSAtPSBuZXdCb3VuZDsNCisgIHdoaWxlIChwLT5SYW5nZSA8IGtUb3BWYWx1ZSkNCisgIHsNCisgICAgcC0+UmFuZ2UgPDw9IDg7DQorICAgIFJhbmdlRW5jX1NoaWZ0TG93KHApOw0KKyAgfQ0KK30NCisNCit2b2lkIFBwbWQ3el9SYW5nZUVuY19GbHVzaERhdGEoQ1BwbWQ3el9SYW5nZUVuYyAqcCkNCit7DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykNCisgICAgUmFuZ2VFbmNfU2hpZnRMb3cocCk7DQorfQ0KKw0KKw0KKyNkZWZpbmUgTUFTSyhzeW0pICgoc2lnbmVkIGNoYXIgKiljaGFyTWFzaylbc3ltXQ0KKw0KK3ZvaWQgUHBtZDdfRW5jb2RlU3ltYm9sKENQcG1kNyAqcCwgQ1BwbWQ3el9SYW5nZUVuYyAqcmMsIGludCBzeW1ib2wpDQorew0KKyAgc2l6ZV90IGNoYXJNYXNrWzI1NiAvIHNpemVvZihzaXplX3QpXTsNCisgIGlmIChwLT5NaW5Db250ZXh0LT5OdW1TdGF0cyAhPSAxKQ0KKyAgew0KKyAgICBDUHBtZF9TdGF0ZSAqcyA9IFBwbWQ3X0dldFN0YXRzKHAsIHAtPk1pbkNvbnRleHQpOw0KKyAgICBVSW50MzIgc3VtOw0KKyAgICB1bnNpZ25lZCBpOw0KKyAgICBpZiAocy0+U3ltYm9sID09IHN5bWJvbCkNCisgICAgew0KKyAgICAgIFJhbmdlRW5jX0VuY29kZShyYywgMCwgcy0+RnJlcSwgcC0+TWluQ29udGV4dC0+U3VtbUZyZXEpOw0KKyAgICAgIHAtPkZvdW5kU3RhdGUgPSBzOw0KKyAgICAgIFBwbWQ3X1VwZGF0ZTFfMChwKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcC0+UHJldlN1Y2Nlc3MgPSAwOw0KKyAgICBzdW0gPSBzLT5GcmVxOw0KKyAgICBpID0gcC0+TWluQ29udGV4dC0+TnVtU3RhdHMgLSAxOw0KKyAgICBkbw0KKyAgICB7DQorICAgICAgaWYgKCgrK3MpLT5TeW1ib2wgPT0gc3ltYm9sKQ0KKyAgICAgIHsNCisgICAgICAgIFJhbmdlRW5jX0VuY29kZShyYywgc3VtLCBzLT5GcmVxLCBwLT5NaW5Db250ZXh0LT5TdW1tRnJlcSk7DQorICAgICAgICBwLT5Gb3VuZFN0YXRlID0gczsNCisgICAgICAgIFBwbWQ3X1VwZGF0ZTEocCk7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIHN1bSArPSBzLT5GcmVxOw0KKyAgICB9DQorICAgIHdoaWxlICgtLWkpOw0KKyAgICANCisgICAgcC0+SGlCaXRzRmxhZyA9IHAtPkhCMkZsYWdbcC0+Rm91bmRTdGF0ZS0+U3ltYm9sXTsNCisgICAgUFBNRF9TZXRBbGxCaXRzSW4yNTZCeXRlcyhjaGFyTWFzayk7DQorICAgIE1BU0socy0+U3ltYm9sKSA9IDA7DQorICAgIGkgPSBwLT5NaW5Db250ZXh0LT5OdW1TdGF0cyAtIDE7DQorICAgIGRvIHsgTUFTSygoLS1zKS0+U3ltYm9sKSA9IDA7IH0gd2hpbGUgKC0taSk7DQorICAgIFJhbmdlRW5jX0VuY29kZShyYywgc3VtLCBwLT5NaW5Db250ZXh0LT5TdW1tRnJlcSAtIHN1bSwgcC0+TWluQ29udGV4dC0+U3VtbUZyZXEpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBVSW50MTYgKnByb2IgPSBQcG1kN19HZXRCaW5TdW1tKHApOw0KKyAgICBDUHBtZF9TdGF0ZSAqcyA9IFBwbWQ3Q29udGV4dF9PbmVTdGF0ZShwLT5NaW5Db250ZXh0KTsNCisgICAgaWYgKHMtPlN5bWJvbCA9PSBzeW1ib2wpDQorICAgIHsNCisgICAgICBSYW5nZUVuY19FbmNvZGVCaXRfMChyYywgKnByb2IpOw0KKyAgICAgICpwcm9iID0gKFVJbnQxNilQUE1EX1VQREFURV9QUk9CXzAoKnByb2IpOw0KKyAgICAgIHAtPkZvdW5kU3RhdGUgPSBzOw0KKyAgICAgIFBwbWQ3X1VwZGF0ZUJpbihwKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgUmFuZ2VFbmNfRW5jb2RlQml0XzEocmMsICpwcm9iKTsNCisgICAgICAqcHJvYiA9IChVSW50MTYpUFBNRF9VUERBVEVfUFJPQl8xKCpwcm9iKTsNCisgICAgICBwLT5Jbml0RXNjID0gUFBNRDdfa0V4cEVzY2FwZVsqcHJvYiA+PiAxMF07DQorICAgICAgUFBNRF9TZXRBbGxCaXRzSW4yNTZCeXRlcyhjaGFyTWFzayk7DQorICAgICAgTUFTSyhzLT5TeW1ib2wpID0gMDsNCisgICAgICBwLT5QcmV2U3VjY2VzcyA9IDA7DQorICAgIH0NCisgIH0NCisgIGZvciAoOzspDQorICB7DQorICAgIFVJbnQzMiBlc2NGcmVxOw0KKyAgICBDUHBtZF9TZWUgKnNlZTsNCisgICAgQ1BwbWRfU3RhdGUgKnM7DQorICAgIFVJbnQzMiBzdW07DQorICAgIHVuc2lnbmVkIGksIG51bU1hc2tlZCA9IHAtPk1pbkNvbnRleHQtPk51bVN0YXRzOw0KKyAgICBkbw0KKyAgICB7DQorICAgICAgcC0+T3JkZXJGYWxsKys7DQorICAgICAgaWYgKCFwLT5NaW5Db250ZXh0LT5TdWZmaXgpDQorICAgICAgICByZXR1cm47IC8qIEVuZE1hcmtlciAoc3ltYm9sID0gLTEpICovDQorICAgICAgcC0+TWluQ29udGV4dCA9IFBwbWQ3X0dldENvbnRleHQocCwgcC0+TWluQ29udGV4dC0+U3VmZml4KTsNCisgICAgfQ0KKyAgICB3aGlsZSAocC0+TWluQ29udGV4dC0+TnVtU3RhdHMgPT0gbnVtTWFza2VkKTsNCisgICAgDQorICAgIHNlZSA9IFBwbWQ3X01ha2VFc2NGcmVxKHAsIG51bU1hc2tlZCwgJmVzY0ZyZXEpOw0KKyAgICBzID0gUHBtZDdfR2V0U3RhdHMocCwgcC0+TWluQ29udGV4dCk7DQorICAgIHN1bSA9IDA7DQorICAgIGkgPSBwLT5NaW5Db250ZXh0LT5OdW1TdGF0czsNCisgICAgZG8NCisgICAgew0KKyAgICAgIGludCBjdXIgPSBzLT5TeW1ib2w7DQorICAgICAgaWYgKGN1ciA9PSBzeW1ib2wpDQorICAgICAgew0KKyAgICAgICAgVUludDMyIGxvdyA9IHN1bTsNCisgICAgICAgIENQcG1kX1N0YXRlICpzMSA9IHM7DQorICAgICAgICBkbw0KKyAgICAgICAgew0KKyAgICAgICAgICBzdW0gKz0gKHMtPkZyZXEgJiAoaW50KShNQVNLKHMtPlN5bWJvbCkpKTsNCisgICAgICAgICAgcysrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKC0taSk7DQorICAgICAgICBSYW5nZUVuY19FbmNvZGUocmMsIGxvdywgczEtPkZyZXEsIHN1bSArIGVzY0ZyZXEpOw0KKyAgICAgICAgUHBtZF9TZWVfVXBkYXRlKHNlZSk7DQorICAgICAgICBwLT5Gb3VuZFN0YXRlID0gczE7DQorICAgICAgICBQcG1kN19VcGRhdGUyKHApOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBzdW0gKz0gKHMtPkZyZXEgJiAoaW50KShNQVNLKGN1cikpKTsNCisgICAgICBNQVNLKGN1cikgPSAwOw0KKyAgICAgIHMrKzsNCisgICAgfQ0KKyAgICB3aGlsZSAoLS1pKTsNCisgICAgDQorICAgIFJhbmdlRW5jX0VuY29kZShyYywgc3VtLCBlc2NGcmVxLCBzdW0gKyBlc2NGcmVxKTsNCisgICAgc2VlLT5TdW1tID0gKFVJbnQxNikoc2VlLT5TdW1tICsgc3VtICsgZXNjRnJlcSk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9QcmVjb21wLmggYi9sem1hL0MvUHJlY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYjU4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvUHJlY29tcC5oCkBAIC0wLDAgKzEsMTAgQEAKKy8qIFByZWNvbXAuaCAtLSBTdGRBZngNCisyMDEzLTExLTEyIDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2lmbmRlZiBfXzdaX1BSRUNPTVBfSA0KKyNkZWZpbmUgX183Wl9QUkVDT01QX0gNCisNCisjaW5jbHVkZSAiQ29tcGlsZXIuaCINCisvKiAjaW5jbHVkZSAiN3pUeXBlcy5oIiAqLw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy9Sb3RhdGVEZWZzLmggYi9sem1hL0MvUm90YXRlRGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkN2QxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvUm90YXRlRGVmcy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIFJvdGF0ZURlZnMuaCAtLSBSb3RhdGUgZnVuY3Rpb25zDQorMjAxMy0xMS0xMiA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpZm5kZWYgX19ST1RBVEVfREVGU19IDQorI2RlZmluZSBfX1JPVEFURV9ERUZTX0gNCisNCisjaWZkZWYgX01TQ19WRVINCisNCisjaW5jbHVkZSA8c3RkbGliLmg+DQorDQorLy8gI2lmIChfTVNDX1ZFUiA+PSAxMjAwKQ0KKyNwcmFnbWEgaW50cmluc2ljKF9yb3RsKQ0KKyNwcmFnbWEgaW50cmluc2ljKF9yb3RyKQ0KKy8vICNlbmRpZg0KKw0KKyNkZWZpbmUgcm90bEZpeGVkKHgsIG4pIF9yb3RsKCh4KSwgKG4pKQ0KKyNkZWZpbmUgcm90ckZpeGVkKHgsIG4pIF9yb3RyKCh4KSwgKG4pKQ0KKw0KKyNlbHNlDQorDQorI2RlZmluZSByb3RsRml4ZWQoeCwgbikgKCgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDMyIC0gKG4pKSkpDQorI2RlZmluZSByb3RyRml4ZWQoeCwgbikgKCgoeCkgPj4gKG4pKSB8ICgoeCkgPDwgKDMyIC0gKG4pKSkpDQorDQorI2VuZGlmDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DL1NoYTI1Ni5jIGIvbHptYS9DL1NoYTI1Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMjA4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvU2hhMjU2LmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qIENyeXB0by9TaGEyNTYuYyAtLSBTSEEtMjU2IEhhc2gNCisyMDEwLTA2LTExIDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluDQorVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHB1YmxpYyBkb21haW4gY29kZSBmcm9tIFdlaSBEYWkncyBDcnlwdG8rKyBsaWJyYXJ5LiAqLw0KKw0KKyNpbmNsdWRlICJQcmVjb21wLmgiDQorDQorI2luY2x1ZGUgIlJvdGF0ZURlZnMuaCINCisjaW5jbHVkZSAiU2hhMjU2LmgiDQorDQorLyogZGVmaW5lIGl0IGZvciBzcGVlZCBvcHRpbWl6YXRpb24gKi8NCisvKiAjZGVmaW5lIF9TSEEyNTZfVU5ST0xMICovDQorLyogI2RlZmluZSBfU0hBMjU2X1VOUk9MTDIgKi8NCisNCit2b2lkIFNoYTI1Nl9Jbml0KENTaGEyNTYgKnApDQorew0KKyAgcC0+c3RhdGVbMF0gPSAweDZhMDllNjY3Ow0KKyAgcC0+c3RhdGVbMV0gPSAweGJiNjdhZTg1Ow0KKyAgcC0+c3RhdGVbMl0gPSAweDNjNmVmMzcyOw0KKyAgcC0+c3RhdGVbM10gPSAweGE1NGZmNTNhOw0KKyAgcC0+c3RhdGVbNF0gPSAweDUxMGU1MjdmOw0KKyAgcC0+c3RhdGVbNV0gPSAweDliMDU2ODhjOw0KKyAgcC0+c3RhdGVbNl0gPSAweDFmODNkOWFiOw0KKyAgcC0+c3RhdGVbN10gPSAweDViZTBjZDE5Ow0KKyAgcC0+Y291bnQgPSAwOw0KK30NCisNCisjZGVmaW5lIFMwKHgpIChyb3RyRml4ZWQoeCwgMikgXiByb3RyRml4ZWQoeCwxMykgXiByb3RyRml4ZWQoeCwgMjIpKQ0KKyNkZWZpbmUgUzEoeCkgKHJvdHJGaXhlZCh4LCA2KSBeIHJvdHJGaXhlZCh4LDExKSBeIHJvdHJGaXhlZCh4LCAyNSkpDQorI2RlZmluZSBzMCh4KSAocm90ckZpeGVkKHgsIDcpIF4gcm90ckZpeGVkKHgsMTgpIF4gKHggPj4gMykpDQorI2RlZmluZSBzMSh4KSAocm90ckZpeGVkKHgsMTcpIF4gcm90ckZpeGVkKHgsMTkpIF4gKHggPj4gMTApKQ0KKw0KKyNkZWZpbmUgYmxrMChpKSAoV1tpXSA9IGRhdGFbaV0pDQorI2RlZmluZSBibGsyKGkpIChXW2kmMTVdICs9IHMxKFdbKGktMikmMTVdKSArIFdbKGktNykmMTVdICsgczAoV1soaS0xNSkmMTVdKSkNCisNCisjZGVmaW5lIENoKHgseSx6KSAoel4oeCYoeV56KSkpDQorI2RlZmluZSBNYWooeCx5LHopICgoeCZ5KXwoeiYoeHx5KSkpDQorDQorI2RlZmluZSBhKGkpIFRbKDAtKGkpKSY3XQ0KKyNkZWZpbmUgYihpKSBUWygxLShpKSkmN10NCisjZGVmaW5lIGMoaSkgVFsoMi0oaSkpJjddDQorI2RlZmluZSBkKGkpIFRbKDMtKGkpKSY3XQ0KKyNkZWZpbmUgZShpKSBUWyg0LShpKSkmN10NCisjZGVmaW5lIGYoaSkgVFsoNS0oaSkpJjddDQorI2RlZmluZSBnKGkpIFRbKDYtKGkpKSY3XQ0KKyNkZWZpbmUgaChpKSBUWyg3LShpKSkmN10NCisNCisNCisjaWZkZWYgX1NIQTI1Nl9VTlJPTEwyDQorDQorI2RlZmluZSBSKGEsYixjLGQsZSxmLGcsaCwgaSkgaCArPSBTMShlKSArIENoKGUsZixnKSArIEtbaStqXSArIChqP2JsazIoaSk6YmxrMChpKSk7XA0KKyAgZCArPSBoOyBoICs9IFMwKGEpICsgTWFqKGEsIGIsIGMpDQorDQorI2RlZmluZSBSWF84KGkpIFwNCisgIFIoYSxiLGMsZCxlLGYsZyxoLCBpKTsgXA0KKyAgUihoLGEsYixjLGQsZSxmLGcsIGkrMSk7IFwNCisgIFIoZyxoLGEsYixjLGQsZSxmLCBpKzIpOyBcDQorICBSKGYsZyxoLGEsYixjLGQsZSwgaSszKTsgXA0KKyAgUihlLGYsZyxoLGEsYixjLGQsIGkrNCk7IFwNCisgIFIoZCxlLGYsZyxoLGEsYixjLCBpKzUpOyBcDQorICBSKGMsZCxlLGYsZyxoLGEsYiwgaSs2KTsgXA0KKyAgUihiLGMsZCxlLGYsZyxoLGEsIGkrNykNCisNCisjZWxzZQ0KKw0KKyNkZWZpbmUgUihpKSBoKGkpICs9IFMxKGUoaSkpICsgQ2goZShpKSxmKGkpLGcoaSkpICsgS1tpK2pdICsgKGo/YmxrMihpKTpibGswKGkpKTtcDQorICBkKGkpICs9IGgoaSk7IGgoaSkgKz0gUzAoYShpKSkgKyBNYWooYShpKSwgYihpKSwgYyhpKSkNCisNCisjaWZkZWYgX1NIQTI1Nl9VTlJPTEwNCisNCisjZGVmaW5lIFJYXzgoaSkgUihpKzApOyBSKGkrMSk7IFIoaSsyKTsgUihpKzMpOyBSKGkrNCk7IFIoaSs1KTsgUihpKzYpOyBSKGkrNyk7DQorDQorI2VuZGlmDQorDQorI2VuZGlmDQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBLWzY0XSA9IHsNCisgIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsDQorICAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LA0KKyAgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywNCisgIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsDQorICAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLA0KKyAgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSwNCisgIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsDQorICAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LA0KKyAgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMywNCisgIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsDQorICAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLA0KKyAgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCwNCisgIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsDQorICAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLA0KKyAgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCwNCisgIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjINCit9Ow0KKw0KK3N0YXRpYyB2b2lkIFNoYTI1Nl9UcmFuc2Zvcm0oVUludDMyICpzdGF0ZSwgY29uc3QgVUludDMyICpkYXRhKQ0KK3sNCisgIFVJbnQzMiBXWzE2XTsNCisgIHVuc2lnbmVkIGo7DQorICAjaWZkZWYgX1NIQTI1Nl9VTlJPTEwyDQorICBVSW50MzIgYSxiLGMsZCxlLGYsZyxoOw0KKyAgYSA9IHN0YXRlWzBdOw0KKyAgYiA9IHN0YXRlWzFdOw0KKyAgYyA9IHN0YXRlWzJdOw0KKyAgZCA9IHN0YXRlWzNdOw0KKyAgZSA9IHN0YXRlWzRdOw0KKyAgZiA9IHN0YXRlWzVdOw0KKyAgZyA9IHN0YXRlWzZdOw0KKyAgaCA9IHN0YXRlWzddOw0KKyAgI2Vsc2UNCisgIFVJbnQzMiBUWzhdOw0KKyAgZm9yIChqID0gMDsgaiA8IDg7IGorKykNCisgICAgVFtqXSA9IHN0YXRlW2pdOw0KKyAgI2VuZGlmDQorDQorICBmb3IgKGogPSAwOyBqIDwgNjQ7IGogKz0gMTYpDQorICB7DQorICAgICNpZiBkZWZpbmVkKF9TSEEyNTZfVU5ST0xMKSB8fCBkZWZpbmVkKF9TSEEyNTZfVU5ST0xMMikNCisgICAgUlhfOCgwKTsgUlhfOCg4KTsNCisgICAgI2Vsc2UNCisgICAgdW5zaWduZWQgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsgUihpKTsgfQ0KKyAgICAjZW5kaWYNCisgIH0NCisNCisgICNpZmRlZiBfU0hBMjU2X1VOUk9MTDINCisgIHN0YXRlWzBdICs9IGE7DQorICBzdGF0ZVsxXSArPSBiOw0KKyAgc3RhdGVbMl0gKz0gYzsNCisgIHN0YXRlWzNdICs9IGQ7DQorICBzdGF0ZVs0XSArPSBlOw0KKyAgc3RhdGVbNV0gKz0gZjsNCisgIHN0YXRlWzZdICs9IGc7DQorICBzdGF0ZVs3XSArPSBoOw0KKyAgI2Vsc2UNCisgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspDQorICAgIHN0YXRlW2pdICs9IFRbal07DQorICAjZW5kaWYNCisgIA0KKyAgLyogV2lwZSB2YXJpYWJsZXMgKi8NCisgIC8qIG1lbXNldChXLCAwLCBzaXplb2YoVykpOyAqLw0KKyAgLyogbWVtc2V0KFQsIDAsIHNpemVvZihUKSk7ICovDQorfQ0KKw0KKyN1bmRlZiBTMA0KKyN1bmRlZiBTMQ0KKyN1bmRlZiBzMA0KKyN1bmRlZiBzMQ0KKw0KK3N0YXRpYyB2b2lkIFNoYTI1Nl9Xcml0ZUJ5dGVCbG9jayhDU2hhMjU2ICpwKQ0KK3sNCisgIFVJbnQzMiBkYXRhMzJbMTZdOw0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQ0KKyAgICBkYXRhMzJbaV0gPQ0KKyAgICAgICgoVUludDMyKShwLT5idWZmZXJbaSAqIDQgICAgXSkgPDwgMjQpICsNCisgICAgICAoKFVJbnQzMikocC0+YnVmZmVyW2kgKiA0ICsgMV0pIDw8IDE2KSArDQorICAgICAgKChVSW50MzIpKHAtPmJ1ZmZlcltpICogNCArIDJdKSA8PCAgOCkgKw0KKyAgICAgICgoVUludDMyKShwLT5idWZmZXJbaSAqIDQgKyAzXSkpOw0KKyAgU2hhMjU2X1RyYW5zZm9ybShwLT5zdGF0ZSwgZGF0YTMyKTsNCit9DQorDQordm9pZCBTaGEyNTZfVXBkYXRlKENTaGEyNTYgKnAsIGNvbnN0IEJ5dGUgKmRhdGEsIHNpemVfdCBzaXplKQ0KK3sNCisgIFVJbnQzMiBjdXJCdWZmZXJQb3MgPSAoVUludDMyKXAtPmNvdW50ICYgMHgzRjsNCisgIHdoaWxlIChzaXplID4gMCkNCisgIHsNCisgICAgcC0+YnVmZmVyW2N1ckJ1ZmZlclBvcysrXSA9ICpkYXRhKys7DQorICAgIHAtPmNvdW50Kys7DQorICAgIHNpemUtLTsNCisgICAgaWYgKGN1ckJ1ZmZlclBvcyA9PSA2NCkNCisgICAgew0KKyAgICAgIGN1ckJ1ZmZlclBvcyA9IDA7DQorICAgICAgU2hhMjU2X1dyaXRlQnl0ZUJsb2NrKHApOw0KKyAgICB9DQorICB9DQorfQ0KKw0KK3ZvaWQgU2hhMjU2X0ZpbmFsKENTaGEyNTYgKnAsIEJ5dGUgKmRpZ2VzdCkNCit7DQorICBVSW50NjQgbGVuSW5CaXRzID0gKHAtPmNvdW50IDw8IDMpOw0KKyAgVUludDMyIGN1ckJ1ZmZlclBvcyA9IChVSW50MzIpcC0+Y291bnQgJiAweDNGOw0KKyAgdW5zaWduZWQgaTsNCisgIHAtPmJ1ZmZlcltjdXJCdWZmZXJQb3MrK10gPSAweDgwOw0KKyAgd2hpbGUgKGN1ckJ1ZmZlclBvcyAhPSAoNjQgLSA4KSkNCisgIHsNCisgICAgY3VyQnVmZmVyUG9zICY9IDB4M0Y7DQorICAgIGlmIChjdXJCdWZmZXJQb3MgPT0gMCkNCisgICAgICBTaGEyNTZfV3JpdGVCeXRlQmxvY2socCk7DQorICAgIHAtPmJ1ZmZlcltjdXJCdWZmZXJQb3MrK10gPSAwOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykNCisgIHsNCisgICAgcC0+YnVmZmVyW2N1ckJ1ZmZlclBvcysrXSA9IChCeXRlKShsZW5JbkJpdHMgPj4gNTYpOw0KKyAgICBsZW5JbkJpdHMgPDw9IDg7DQorICB9DQorICBTaGEyNTZfV3JpdGVCeXRlQmxvY2socCk7DQorDQorICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQ0KKyAgew0KKyAgICAqZGlnZXN0KysgPSAoQnl0ZSkocC0+c3RhdGVbaV0gPj4gMjQpOw0KKyAgICAqZGlnZXN0KysgPSAoQnl0ZSkocC0+c3RhdGVbaV0gPj4gMTYpOw0KKyAgICAqZGlnZXN0KysgPSAoQnl0ZSkocC0+c3RhdGVbaV0gPj4gOCk7DQorICAgICpkaWdlc3QrKyA9IChCeXRlKShwLT5zdGF0ZVtpXSk7DQorICB9DQorICBTaGEyNTZfSW5pdChwKTsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DL1NoYTI1Ni5oIGIvbHptYS9DL1NoYTI1Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTdjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvU2hhMjU2LmgKQEAgLTAsMCArMSwyNiBAQAorLyogU2hhMjU2LmggLS0gU0hBLTI1NiBIYXNoDQorMjAxMy0wMS0xOCA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpZm5kZWYgX19DUllQVE9fU0hBMjU2X0gNCisjZGVmaW5lIF9fQ1JZUFRPX1NIQTI1Nl9IDQorDQorI2luY2x1ZGUgIjd6VHlwZXMuaCINCisNCitFWFRFUk5fQ19CRUdJTg0KKw0KKyNkZWZpbmUgU0hBMjU2X0RJR0VTVF9TSVpFIDMyDQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBVSW50MzIgc3RhdGVbOF07DQorICBVSW50NjQgY291bnQ7DQorICBCeXRlIGJ1ZmZlcls2NF07DQorfSBDU2hhMjU2Ow0KKw0KK3ZvaWQgU2hhMjU2X0luaXQoQ1NoYTI1NiAqcCk7DQordm9pZCBTaGEyNTZfVXBkYXRlKENTaGEyNTYgKnAsIGNvbnN0IEJ5dGUgKmRhdGEsIHNpemVfdCBzaXplKTsNCit2b2lkIFNoYTI1Nl9GaW5hbChDU2hhMjU2ICpwLCBCeXRlICpkaWdlc3QpOw0KKw0KK0VYVEVSTl9DX0VORA0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy9Tb3J0LmMgYi9sem1hL0MvU29ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZGNiZjAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvU29ydC5jCkBAIC0wLDAgKzEsMTQxIEBACisvKiBTb3J0LmMgLS0gU29ydCBmdW5jdGlvbnMNCisyMDE0LTA0LTA1IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSAiU29ydC5oIg0KKw0KKyNkZWZpbmUgSGVhcFNvcnREb3duKHAsIGssIHNpemUsIHRlbXApIFwNCisgIHsgZm9yICg7OykgeyBcDQorICAgIHNpemVfdCBzID0gKGsgPDwgMSk7IFwNCisgICAgaWYgKHMgPiBzaXplKSBicmVhazsgXA0KKyAgICBpZiAocyA8IHNpemUgJiYgcFtzICsgMV0gPiBwW3NdKSBzKys7IFwNCisgICAgaWYgKHRlbXAgPj0gcFtzXSkgYnJlYWs7IFwNCisgICAgcFtrXSA9IHBbc107IGsgPSBzOyBcDQorICB9IHBba10gPSB0ZW1wOyB9DQorDQordm9pZCBIZWFwU29ydChVSW50MzIgKnAsIHNpemVfdCBzaXplKQ0KK3sNCisgIGlmIChzaXplIDw9IDEpDQorICAgIHJldHVybjsNCisgIHAtLTsNCisgIHsNCisgICAgc2l6ZV90IGkgPSBzaXplIC8gMjsNCisgICAgZG8NCisgICAgew0KKyAgICAgIFVJbnQzMiB0ZW1wID0gcFtpXTsNCisgICAgICBzaXplX3QgayA9IGk7DQorICAgICAgSGVhcFNvcnREb3duKHAsIGssIHNpemUsIHRlbXApDQorICAgIH0NCisgICAgd2hpbGUgKC0taSAhPSAwKTsNCisgIH0NCisgIC8qDQorICBkbw0KKyAgew0KKyAgICBzaXplX3QgayA9IDE7DQorICAgIFVJbnQzMiB0ZW1wID0gcFtzaXplXTsNCisgICAgcFtzaXplLS1dID0gcFsxXTsNCisgICAgSGVhcFNvcnREb3duKHAsIGssIHNpemUsIHRlbXApDQorICB9DQorICB3aGlsZSAoc2l6ZSA+IDEpOw0KKyAgKi8NCisgIHdoaWxlIChzaXplID4gMykNCisgIHsNCisgICAgVUludDMyIHRlbXAgPSBwW3NpemVdOw0KKyAgICBzaXplX3QgayA9IChwWzNdID4gcFsyXSkgPyAzIDogMjsNCisgICAgcFtzaXplLS1dID0gcFsxXTsNCisgICAgcFsxXSA9IHBba107DQorICAgIEhlYXBTb3J0RG93bihwLCBrLCBzaXplLCB0ZW1wKQ0KKyAgfQ0KKyAgew0KKyAgICBVSW50MzIgdGVtcCA9IHBbc2l6ZV07DQorICAgIHBbc2l6ZV0gPSBwWzFdOw0KKyAgICBpZiAoc2l6ZSA+IDIgJiYgcFsyXSA8IHRlbXApDQorICAgIHsNCisgICAgICBwWzFdID0gcFsyXTsNCisgICAgICBwWzJdID0gdGVtcDsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgcFsxXSA9IHRlbXA7DQorICB9DQorfQ0KKw0KK3ZvaWQgSGVhcFNvcnQ2NChVSW50NjQgKnAsIHNpemVfdCBzaXplKQ0KK3sNCisgIGlmIChzaXplIDw9IDEpDQorICAgIHJldHVybjsNCisgIHAtLTsNCisgIHsNCisgICAgc2l6ZV90IGkgPSBzaXplIC8gMjsNCisgICAgZG8NCisgICAgew0KKyAgICAgIFVJbnQ2NCB0ZW1wID0gcFtpXTsNCisgICAgICBzaXplX3QgayA9IGk7DQorICAgICAgSGVhcFNvcnREb3duKHAsIGssIHNpemUsIHRlbXApDQorICAgIH0NCisgICAgd2hpbGUgKC0taSAhPSAwKTsNCisgIH0NCisgIC8qDQorICBkbw0KKyAgew0KKyAgICBzaXplX3QgayA9IDE7DQorICAgIFVJbnQ2NCB0ZW1wID0gcFtzaXplXTsNCisgICAgcFtzaXplLS1dID0gcFsxXTsNCisgICAgSGVhcFNvcnREb3duKHAsIGssIHNpemUsIHRlbXApDQorICB9DQorICB3aGlsZSAoc2l6ZSA+IDEpOw0KKyAgKi8NCisgIHdoaWxlIChzaXplID4gMykNCisgIHsNCisgICAgVUludDY0IHRlbXAgPSBwW3NpemVdOw0KKyAgICBzaXplX3QgayA9IChwWzNdID4gcFsyXSkgPyAzIDogMjsNCisgICAgcFtzaXplLS1dID0gcFsxXTsNCisgICAgcFsxXSA9IHBba107DQorICAgIEhlYXBTb3J0RG93bihwLCBrLCBzaXplLCB0ZW1wKQ0KKyAgfQ0KKyAgew0KKyAgICBVSW50NjQgdGVtcCA9IHBbc2l6ZV07DQorICAgIHBbc2l6ZV0gPSBwWzFdOw0KKyAgICBpZiAoc2l6ZSA+IDIgJiYgcFsyXSA8IHRlbXApDQorICAgIHsNCisgICAgICBwWzFdID0gcFsyXTsNCisgICAgICBwWzJdID0gdGVtcDsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgcFsxXSA9IHRlbXA7DQorICB9DQorfQ0KKw0KKy8qDQorI2RlZmluZSBIZWFwU29ydFJlZkRvd24ocCwgdmFscywgbiwgc2l6ZSwgdGVtcCkgXA0KKyAgeyBzaXplX3QgayA9IG47IFVJbnQzMiB2YWwgPSB2YWxzW3RlbXBdOyBmb3IgKDs7KSB7IFwNCisgICAgc2l6ZV90IHMgPSAoayA8PCAxKTsgXA0KKyAgICBpZiAocyA+IHNpemUpIGJyZWFrOyBcDQorICAgIGlmIChzIDwgc2l6ZSAmJiB2YWxzW3BbcyArIDFdXSA+IHZhbHNbcFtzXV0pIHMrKzsgXA0KKyAgICBpZiAodmFsID49IHZhbHNbcFtzXV0pIGJyZWFrOyBcDQorICAgIHBba10gPSBwW3NdOyBrID0gczsgXA0KKyAgfSBwW2tdID0gdGVtcDsgfQ0KKw0KK3ZvaWQgSGVhcFNvcnRSZWYoVUludDMyICpwLCBVSW50MzIgKnZhbHMsIHNpemVfdCBzaXplKQ0KK3sNCisgIGlmIChzaXplIDw9IDEpDQorICAgIHJldHVybjsNCisgIHAtLTsNCisgIHsNCisgICAgc2l6ZV90IGkgPSBzaXplIC8gMjsNCisgICAgZG8NCisgICAgew0KKyAgICAgIFVJbnQzMiB0ZW1wID0gcFtpXTsNCisgICAgICBIZWFwU29ydFJlZkRvd24ocCwgdmFscywgaSwgc2l6ZSwgdGVtcCk7DQorICAgIH0NCisgICAgd2hpbGUgKC0taSAhPSAwKTsNCisgIH0NCisgIGRvDQorICB7DQorICAgIFVJbnQzMiB0ZW1wID0gcFtzaXplXTsNCisgICAgcFtzaXplLS1dID0gcFsxXTsNCisgICAgSGVhcFNvcnRSZWZEb3duKHAsIHZhbHMsIDEsIHNpemUsIHRlbXApOw0KKyAgfQ0KKyAgd2hpbGUgKHNpemUgPiAxKTsNCit9DQorKi8NCmRpZmYgLS1naXQgYS9sem1hL0MvU29ydC5oIGIvbHptYS9DL1NvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjA5ZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL1NvcnQuaApAQCAtMCwwICsxLDE4IEBACisvKiBTb3J0LmggLS0gU29ydCBmdW5jdGlvbnMNCisyMDE0LTA0LTA1IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2lmbmRlZiBfXzdaX1NPUlRfSA0KKyNkZWZpbmUgX183Wl9TT1JUX0gNCisNCisjaW5jbHVkZSAiN3pUeXBlcy5oIg0KKw0KK0VYVEVSTl9DX0JFR0lODQorDQordm9pZCBIZWFwU29ydChVSW50MzIgKnAsIHNpemVfdCBzaXplKTsNCit2b2lkIEhlYXBTb3J0NjQoVUludDY0ICpwLCBzaXplX3Qgc2l6ZSk7DQorDQorLyogdm9pZCBIZWFwU29ydFJlZihVSW50MzIgKnAsIFVJbnQzMiAqdmFscywgc2l6ZV90IHNpemUpOyAqLw0KKw0KK0VYVEVSTl9DX0VORA0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy9UaHJlYWRzLmMgYi9sem1hL0MvVGhyZWFkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YmExZTgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvVGhyZWFkcy5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qIFRocmVhZHMuYyAtLSBtdWx0aXRocmVhZGluZyBsaWJyYXJ5DQorMjAxMy0xMS0xMiA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlICJQcmVjb21wLmgiDQorDQorI2lmbmRlZiBfV0lOMzJfV0NFDQorI2luY2x1ZGUgPHByb2Nlc3MuaD4NCisjZW5kaWYNCisNCisjaW5jbHVkZSAiVGhyZWFkcy5oIg0KKw0KK3N0YXRpYyBXUmVzIEdldEVycm9yKCkNCit7DQorICBEV09SRCByZXMgPSBHZXRMYXN0RXJyb3IoKTsNCisgIHJldHVybiAocmVzKSA/IChXUmVzKShyZXMpIDogMTsNCit9DQorDQorV1JlcyBIYW5kbGVUb1dSZXMoSEFORExFIGgpIHsgcmV0dXJuIChoICE9IDApID8gMCA6IEdldEVycm9yKCk7IH0NCitXUmVzIEJPT0xUb1dSZXMoQk9PTCB2KSB7IHJldHVybiB2ID8gMCA6IEdldEVycm9yKCk7IH0NCisNCitXUmVzIEhhbmRsZVB0cl9DbG9zZShIQU5ETEUgKnApDQorew0KKyAgaWYgKCpwICE9IE5VTEwpDQorICAgIGlmICghQ2xvc2VIYW5kbGUoKnApKQ0KKyAgICAgIHJldHVybiBHZXRFcnJvcigpOw0KKyAgKnAgPSBOVUxMOw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK1dSZXMgSGFuZGxlX1dhaXRPYmplY3QoSEFORExFIGgpIHsgcmV0dXJuIChXUmVzKVdhaXRGb3JTaW5nbGVPYmplY3QoaCwgSU5GSU5JVEUpOyB9DQorDQorV1JlcyBUaHJlYWRfQ3JlYXRlKENUaHJlYWQgKnAsIFRIUkVBRF9GVU5DX1RZUEUgZnVuYywgTFBWT0lEIHBhcmFtKQ0KK3sNCisgIC8qIFdpbmRvd3MgTWUvOTgvOTU6IHRocmVhZElkIHBhcmFtZXRlciBtYXkgbm90IGJlIE5VTEwgaW4gX2JlZ2ludGhyZWFkZXgvQ3JlYXRlVGhyZWFkIGZ1bmN0aW9ucyAqLw0KKyAgDQorICAjaWZkZWYgVU5ERVJfQ0UNCisgIA0KKyAgRFdPUkQgdGhyZWFkSWQ7DQorICAqcCA9IENyZWF0ZVRocmVhZCgwLCAwLCBmdW5jLCBwYXJhbSwgMCwgJnRocmVhZElkKTsNCisNCisgICNlbHNlDQorDQorICB1bnNpZ25lZCB0aHJlYWRJZDsNCisgICpwID0gKEhBTkRMRSlfYmVnaW50aHJlYWRleChOVUxMLCAwLCBmdW5jLCBwYXJhbSwgMCwgJnRocmVhZElkKTsNCisgICANCisgICNlbmRpZg0KKw0KKyAgLyogbWF5YmUgd2UgbXVzdCB1c2UgZXJybm8gaGVyZSwgYnV0IHByb2JhYmx5IEdldExhc3RFcnJvcigpIGlzIGFsc28gT0suICovDQorICByZXR1cm4gSGFuZGxlVG9XUmVzKCpwKTsNCit9DQorDQorV1JlcyBFdmVudF9DcmVhdGUoQ0V2ZW50ICpwLCBCT09MIG1hbnVhbFJlc2V0LCBpbnQgc2lnbmFsZWQpDQorew0KKyAgKnAgPSBDcmVhdGVFdmVudChOVUxMLCBtYW51YWxSZXNldCwgKHNpZ25hbGVkID8gVFJVRSA6IEZBTFNFKSwgTlVMTCk7DQorICByZXR1cm4gSGFuZGxlVG9XUmVzKCpwKTsNCit9DQorDQorV1JlcyBFdmVudF9TZXQoQ0V2ZW50ICpwKSB7IHJldHVybiBCT09MVG9XUmVzKFNldEV2ZW50KCpwKSk7IH0NCitXUmVzIEV2ZW50X1Jlc2V0KENFdmVudCAqcCkgeyByZXR1cm4gQk9PTFRvV1JlcyhSZXNldEV2ZW50KCpwKSk7IH0NCisNCitXUmVzIE1hbnVhbFJlc2V0RXZlbnRfQ3JlYXRlKENNYW51YWxSZXNldEV2ZW50ICpwLCBpbnQgc2lnbmFsZWQpIHsgcmV0dXJuIEV2ZW50X0NyZWF0ZShwLCBUUlVFLCBzaWduYWxlZCk7IH0NCitXUmVzIEF1dG9SZXNldEV2ZW50X0NyZWF0ZShDQXV0b1Jlc2V0RXZlbnQgKnAsIGludCBzaWduYWxlZCkgeyByZXR1cm4gRXZlbnRfQ3JlYXRlKHAsIEZBTFNFLCBzaWduYWxlZCk7IH0NCitXUmVzIE1hbnVhbFJlc2V0RXZlbnRfQ3JlYXRlTm90U2lnbmFsZWQoQ01hbnVhbFJlc2V0RXZlbnQgKnApIHsgcmV0dXJuIE1hbnVhbFJlc2V0RXZlbnRfQ3JlYXRlKHAsIDApOyB9DQorV1JlcyBBdXRvUmVzZXRFdmVudF9DcmVhdGVOb3RTaWduYWxlZChDQXV0b1Jlc2V0RXZlbnQgKnApIHsgcmV0dXJuIEF1dG9SZXNldEV2ZW50X0NyZWF0ZShwLCAwKTsgfQ0KKw0KKw0KK1dSZXMgU2VtYXBob3JlX0NyZWF0ZShDU2VtYXBob3JlICpwLCBVSW50MzIgaW5pdENvdW50LCBVSW50MzIgbWF4Q291bnQpDQorew0KKyAgKnAgPSBDcmVhdGVTZW1hcGhvcmUoTlVMTCwgKExPTkcpaW5pdENvdW50LCAoTE9ORyltYXhDb3VudCwgTlVMTCk7DQorICByZXR1cm4gSGFuZGxlVG9XUmVzKCpwKTsNCit9DQorDQorc3RhdGljIFdSZXMgU2VtYXBob3JlX1JlbGVhc2UoQ1NlbWFwaG9yZSAqcCwgTE9ORyByZWxlYXNlQ291bnQsIExPTkcgKnByZXZpb3VzQ291bnQpDQorICB7IHJldHVybiBCT09MVG9XUmVzKFJlbGVhc2VTZW1hcGhvcmUoKnAsIHJlbGVhc2VDb3VudCwgcHJldmlvdXNDb3VudCkpOyB9DQorV1JlcyBTZW1hcGhvcmVfUmVsZWFzZU4oQ1NlbWFwaG9yZSAqcCwgVUludDMyIG51bSkNCisgIHsgcmV0dXJuIFNlbWFwaG9yZV9SZWxlYXNlKHAsIChMT05HKW51bSwgTlVMTCk7IH0NCitXUmVzIFNlbWFwaG9yZV9SZWxlYXNlMShDU2VtYXBob3JlICpwKSB7IHJldHVybiBTZW1hcGhvcmVfUmVsZWFzZU4ocCwgMSk7IH0NCisNCitXUmVzIENyaXRpY2FsU2VjdGlvbl9Jbml0KENDcml0aWNhbFNlY3Rpb24gKnApDQorew0KKyAgLyogSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiBjYW4gcmFpc2Ugb25seSBTVEFUVVNfTk9fTUVNT1JZIGV4Y2VwdGlvbiAqLw0KKyAgI2lmZGVmIF9NU0NfVkVSDQorICBfX3RyeQ0KKyAgI2VuZGlmDQorICB7DQorICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24ocCk7DQorICAgIC8qIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQocCwgMCk7ICovDQorICB9DQorICAjaWZkZWYgX01TQ19WRVINCisgIF9fZXhjZXB0IChFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSKSB7IHJldHVybiAxOyB9DQorICAjZW5kaWYNCisgIHJldHVybiAwOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0MvVGhyZWFkcy5oIGIvbHptYS9DL1RocmVhZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI3MjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL1RocmVhZHMuaApAQCAtMCwwICsxLDY3IEBACisvKiBUaHJlYWRzLmggLS0gbXVsdGl0aHJlYWRpbmcgbGlicmFyeQ0KKzIwMTMtMTEtMTIgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaWZuZGVmIF9fN1pfVEhSRUFEU19IDQorI2RlZmluZSBfXzdaX1RIUkVBRFNfSA0KKw0KKyNpZmRlZiBfV0lOMzINCisjaW5jbHVkZSA8d2luZG93cy5oPg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICI3elR5cGVzLmgiDQorDQorRVhURVJOX0NfQkVHSU4NCisNCitXUmVzIEhhbmRsZVB0cl9DbG9zZShIQU5ETEUgKmgpOw0KK1dSZXMgSGFuZGxlX1dhaXRPYmplY3QoSEFORExFIGgpOw0KKw0KK3R5cGVkZWYgSEFORExFIENUaHJlYWQ7DQorI2RlZmluZSBUaHJlYWRfQ29uc3RydWN0KHApICoocCkgPSBOVUxMDQorI2RlZmluZSBUaHJlYWRfV2FzQ3JlYXRlZChwKSAoKihwKSAhPSBOVUxMKQ0KKyNkZWZpbmUgVGhyZWFkX0Nsb3NlKHApIEhhbmRsZVB0cl9DbG9zZShwKQ0KKyNkZWZpbmUgVGhyZWFkX1dhaXQocCkgSGFuZGxlX1dhaXRPYmplY3QoKihwKSkNCisNCit0eXBlZGVmDQorI2lmZGVmIFVOREVSX0NFDQorICBEV09SRA0KKyNlbHNlDQorICB1bnNpZ25lZA0KKyNlbmRpZg0KKyAgVEhSRUFEX0ZVTkNfUkVUX1RZUEU7DQorDQorI2RlZmluZSBUSFJFQURfRlVOQ19DQUxMX1RZUEUgTVlfU1REX0NBTEwNCisjZGVmaW5lIFRIUkVBRF9GVU5DX0RFQ0wgVEhSRUFEX0ZVTkNfUkVUX1RZUEUgVEhSRUFEX0ZVTkNfQ0FMTF9UWVBFDQordHlwZWRlZiBUSFJFQURfRlVOQ19SRVRfVFlQRSAoVEhSRUFEX0ZVTkNfQ0FMTF9UWVBFICogVEhSRUFEX0ZVTkNfVFlQRSkodm9pZCAqKTsNCitXUmVzIFRocmVhZF9DcmVhdGUoQ1RocmVhZCAqcCwgVEhSRUFEX0ZVTkNfVFlQRSBmdW5jLCBMUFZPSUQgcGFyYW0pOw0KKw0KK3R5cGVkZWYgSEFORExFIENFdmVudDsNCit0eXBlZGVmIENFdmVudCBDQXV0b1Jlc2V0RXZlbnQ7DQordHlwZWRlZiBDRXZlbnQgQ01hbnVhbFJlc2V0RXZlbnQ7DQorI2RlZmluZSBFdmVudF9Db25zdHJ1Y3QocCkgKihwKSA9IE5VTEwNCisjZGVmaW5lIEV2ZW50X0lzQ3JlYXRlZChwKSAoKihwKSAhPSBOVUxMKQ0KKyNkZWZpbmUgRXZlbnRfQ2xvc2UocCkgSGFuZGxlUHRyX0Nsb3NlKHApDQorI2RlZmluZSBFdmVudF9XYWl0KHApIEhhbmRsZV9XYWl0T2JqZWN0KCoocCkpDQorV1JlcyBFdmVudF9TZXQoQ0V2ZW50ICpwKTsNCitXUmVzIEV2ZW50X1Jlc2V0KENFdmVudCAqcCk7DQorV1JlcyBNYW51YWxSZXNldEV2ZW50X0NyZWF0ZShDTWFudWFsUmVzZXRFdmVudCAqcCwgaW50IHNpZ25hbGVkKTsNCitXUmVzIE1hbnVhbFJlc2V0RXZlbnRfQ3JlYXRlTm90U2lnbmFsZWQoQ01hbnVhbFJlc2V0RXZlbnQgKnApOw0KK1dSZXMgQXV0b1Jlc2V0RXZlbnRfQ3JlYXRlKENBdXRvUmVzZXRFdmVudCAqcCwgaW50IHNpZ25hbGVkKTsNCitXUmVzIEF1dG9SZXNldEV2ZW50X0NyZWF0ZU5vdFNpZ25hbGVkKENBdXRvUmVzZXRFdmVudCAqcCk7DQorDQordHlwZWRlZiBIQU5ETEUgQ1NlbWFwaG9yZTsNCisjZGVmaW5lIFNlbWFwaG9yZV9Db25zdHJ1Y3QocCkgKCpwKSA9IE5VTEwNCisjZGVmaW5lIFNlbWFwaG9yZV9DbG9zZShwKSBIYW5kbGVQdHJfQ2xvc2UocCkNCisjZGVmaW5lIFNlbWFwaG9yZV9XYWl0KHApIEhhbmRsZV9XYWl0T2JqZWN0KCoocCkpDQorV1JlcyBTZW1hcGhvcmVfQ3JlYXRlKENTZW1hcGhvcmUgKnAsIFVJbnQzMiBpbml0Q291bnQsIFVJbnQzMiBtYXhDb3VudCk7DQorV1JlcyBTZW1hcGhvcmVfUmVsZWFzZU4oQ1NlbWFwaG9yZSAqcCwgVUludDMyIG51bSk7DQorV1JlcyBTZW1hcGhvcmVfUmVsZWFzZTEoQ1NlbWFwaG9yZSAqcCk7DQorDQordHlwZWRlZiBDUklUSUNBTF9TRUNUSU9OIENDcml0aWNhbFNlY3Rpb247DQorV1JlcyBDcml0aWNhbFNlY3Rpb25fSW5pdChDQ3JpdGljYWxTZWN0aW9uICpwKTsNCisjZGVmaW5lIENyaXRpY2FsU2VjdGlvbl9EZWxldGUocCkgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKHApDQorI2RlZmluZSBDcml0aWNhbFNlY3Rpb25fRW50ZXIocCkgRW50ZXJDcml0aWNhbFNlY3Rpb24ocCkNCisjZGVmaW5lIENyaXRpY2FsU2VjdGlvbl9MZWF2ZShwKSBMZWF2ZUNyaXRpY2FsU2VjdGlvbihwKQ0KKw0KK0VYVEVSTl9DX0VORA0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy9VdGlsLzd6Lzd6LmRzcCBiL2x6bWEvQy9VdGlsLzd6Lzd6LmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzEyMmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL1V0aWwvN3ovN3ouZHNwCkBAIC0wLDAgKzEsMjI5IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Ijd6IiAtIFBhY2thZ2UgT3duZXI9PDQ+DQorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgKiogRE8gTk9UIEVESVQgKioNCisNCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMNCisNCitDRkc9N3ogLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiN3oubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIjd6Lm1hayIgQ0ZHPSI3eiAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICI3eiAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgIjd6IC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIjd6IC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzQgL1dYIC9HWCAvTzIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX0NPTlNPTEUiIC9EICJfVU5JQ09ERSIgL0QgIlVOSUNPREUiIC9GQXMgL1l1IlByZWNvbXAuaCIgL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MTkgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MTkgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYgL291dDoiYzpcdXRpbFw3ekRlYy5leGUiIC9vcHQ6Tk9XSU45OA0KKyMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICI3eiAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XNCAvV1ggL0dtIC9HWCAvWkkgL09kIC9EICJfREVCVUciIC9EICJfU1pfQUxMT0NfREVCVUcyIiAvRCAiX1NaX05PX0lOVF82NF9BIiAvRCAiV0lOMzIiIC9EICJfQ09OU09MRSIgL0QgIl9VTklDT0RFIiAvRCAiVU5JQ09ERSIgL1l1IlByZWNvbXAuaCIgL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDE5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDE5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJjOlx1dGlsXDd6RGVjLmV4ZSIgL3BkYnR5cGU6c2VwdA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiN3ogLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAiN3ogLSBXaW4zMiBEZWJ1ZyINCisjIEJlZ2luIEdyb3VwICJDb21tb24iDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3ei5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXDd6QWxsb2MuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3ekFsbG9jLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cN3pBcmNJbi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXDd6QnVmLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cN3pCdWYuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3ekNyYy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXDd6Q3JjLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cN3pDcmNPcHQuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3ekRlYy5jDQorIyBBREQgQ1BQIC9EICJfN1pJUF9QUE1EX1NVUFBQT1JUIg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3ekZpbGUuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3ekZpbGUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3elN0cmVhbS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXDd6VHlwZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxCY2oyLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQmNqMi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEJyYS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEJyYS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEJyYTg2LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ3B1QXJjaC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENwdUFyY2guaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxMem1hMkRlYy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEx6bWEyRGVjLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cTHptYURlYy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEx6bWFEZWMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxQcG1kLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cUHBtZDcuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxQcG1kNy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFBwbWQ3RGVjLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiU3BlYyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXBpbGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxQcmVjb21wLmMNCisjIEFERCBDUFAgL1ljIlByZWNvbXAuaCINCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxQcmVjb21wLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXDd6TWFpbi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBUYXJnZXQNCisjIEVuZCBQcm9qZWN0DQpkaWZmIC0tZ2l0IGEvbHptYS9DL1V0aWwvN3ovN3ouZHN3IGIvbHptYS9DL1V0aWwvN3ovN3ouZHN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDg5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvVXRpbC83ei83ei5kc3cKQEAgLTAsMCArMSwyOSBAQAorTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gV29ya3NwYWNlIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjIFdBUk5JTkc6IERPIE5PVCBFRElUIE9SIERFTEVURSBUSElTIFdPUktTUEFDRSBGSUxFIQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitQcm9qZWN0OiAiN3oiPS5cN3ouZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK0dsb2JhbDoNCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDM+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KZGlmZiAtLWdpdCBhL2x6bWEvQy9VdGlsLzd6Lzd6TWFpbi5jIGIvbHptYS9DL1V0aWwvN3ovN3pNYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2YTdmZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9VdGlsLzd6Lzd6TWFpbi5jCkBAIC0wLDAgKzEsNTQ2IEBACisvKiA3ek1haW4uYyAtIFRlc3QgYXBwbGljYXRpb24gZm9yIDd6IERlY29kZXINCisyMDE1LTAxLTAyIDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorDQorI2luY2x1ZGUgIi4uLy4uLzd6LmgiDQorI2luY2x1ZGUgIi4uLy4uLzd6QWxsb2MuaCINCisjaW5jbHVkZSAiLi4vLi4vN3pCdWYuaCINCisjaW5jbHVkZSAiLi4vLi4vN3pDcmMuaCINCisjaW5jbHVkZSAiLi4vLi4vN3pGaWxlLmgiDQorI2luY2x1ZGUgIi4uLy4uLzd6VmVyc2lvbi5oIg0KKw0KKyNpZm5kZWYgVVNFX1dJTkRPV1NfRklMRQ0KKy8qIGZvciBta2RpciAqLw0KKyNpZmRlZiBfV0lOMzINCisjaW5jbHVkZSA8ZGlyZWN0Lmg+DQorI2Vsc2UNCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4NCisjaW5jbHVkZSA8ZXJybm8uaD4NCisjZW5kaWYNCisjZW5kaWYNCisNCitzdGF0aWMgSVN6QWxsb2MgZ19BbGxvYyA9IHsgU3pBbGxvYywgU3pGcmVlIH07DQorDQorc3RhdGljIGludCBCdWZfRW5zdXJlU2l6ZShDQnVmICpkZXN0LCBzaXplX3Qgc2l6ZSkNCit7DQorICBpZiAoZGVzdC0+c2l6ZSA+PSBzaXplKQ0KKyAgICByZXR1cm4gMTsNCisgIEJ1Zl9GcmVlKGRlc3QsICZnX0FsbG9jKTsNCisgIHJldHVybiBCdWZfQ3JlYXRlKGRlc3QsIHNpemUsICZnX0FsbG9jKTsNCit9DQorDQorI2lmbmRlZiBfV0lOMzINCisNCitzdGF0aWMgQnl0ZSBrVXRmOExpbWl0c1s1XSA9IHsgMHhDMCwgMHhFMCwgMHhGMCwgMHhGOCwgMHhGQyB9Ow0KKw0KK3N0YXRpYyBCb29sIFV0ZjE2X1RvX1V0ZjgoQnl0ZSAqZGVzdCwgc2l6ZV90ICpkZXN0TGVuLCBjb25zdCBVSW50MTYgKnNyYywgc2l6ZV90IHNyY0xlbikNCit7DQorICBzaXplX3QgZGVzdFBvcyA9IDAsIHNyY1BvcyA9IDA7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICB1bnNpZ25lZCBudW1BZGRzOw0KKyAgICBVSW50MzIgdmFsdWU7DQorICAgIGlmIChzcmNQb3MgPT0gc3JjTGVuKQ0KKyAgICB7DQorICAgICAgKmRlc3RMZW4gPSBkZXN0UG9zOw0KKyAgICAgIHJldHVybiBUcnVlOw0KKyAgICB9DQorICAgIHZhbHVlID0gc3JjW3NyY1BvcysrXTsNCisgICAgaWYgKHZhbHVlIDwgMHg4MCkNCisgICAgew0KKyAgICAgIGlmIChkZXN0KQ0KKyAgICAgICAgZGVzdFtkZXN0UG9zXSA9IChjaGFyKXZhbHVlOw0KKyAgICAgIGRlc3RQb3MrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDwgMHhFMDAwKQ0KKyAgICB7DQorICAgICAgVUludDMyIGMyOw0KKyAgICAgIGlmICh2YWx1ZSA+PSAweERDMDAgfHwgc3JjUG9zID09IHNyY0xlbikNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGMyID0gc3JjW3NyY1BvcysrXTsNCisgICAgICBpZiAoYzIgPCAweERDMDAgfHwgYzIgPj0gMHhFMDAwKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgdmFsdWUgPSAoKCh2YWx1ZSAtIDB4RDgwMCkgPDwgMTApIHwgKGMyIC0gMHhEQzAwKSkgKyAweDEwMDAwOw0KKyAgICB9DQorICAgIGZvciAobnVtQWRkcyA9IDE7IG51bUFkZHMgPCA1OyBudW1BZGRzKyspDQorICAgICAgaWYgKHZhbHVlIDwgKCgoVUludDMyKTEpIDw8IChudW1BZGRzICogNSArIDYpKSkNCisgICAgICAgIGJyZWFrOw0KKyAgICBpZiAoZGVzdCkNCisgICAgICBkZXN0W2Rlc3RQb3NdID0gKGNoYXIpKGtVdGY4TGltaXRzW251bUFkZHMgLSAxXSArICh2YWx1ZSA+PiAoNiAqIG51bUFkZHMpKSk7DQorICAgIGRlc3RQb3MrKzsNCisgICAgZG8NCisgICAgew0KKyAgICAgIG51bUFkZHMtLTsNCisgICAgICBpZiAoZGVzdCkNCisgICAgICAgIGRlc3RbZGVzdFBvc10gPSAoY2hhcikoMHg4MCArICgodmFsdWUgPj4gKDYgKiBudW1BZGRzKSkgJiAweDNGKSk7DQorICAgICAgZGVzdFBvcysrOw0KKyAgICB9DQorICAgIHdoaWxlIChudW1BZGRzICE9IDApOw0KKyAgfQ0KKyAgKmRlc3RMZW4gPSBkZXN0UG9zOw0KKyAgcmV0dXJuIEZhbHNlOw0KK30NCisNCitzdGF0aWMgU1JlcyBVdGYxNl9Ub19VdGY4QnVmKENCdWYgKmRlc3QsIGNvbnN0IFVJbnQxNiAqc3JjLCBzaXplX3Qgc3JjTGVuKQ0KK3sNCisgIHNpemVfdCBkZXN0TGVuID0gMDsNCisgIEJvb2wgcmVzOw0KKyAgVXRmMTZfVG9fVXRmOChOVUxMLCAmZGVzdExlbiwgc3JjLCBzcmNMZW4pOw0KKyAgZGVzdExlbiArPSAxOw0KKyAgaWYgKCFCdWZfRW5zdXJlU2l6ZShkZXN0LCBkZXN0TGVuKSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX01FTTsNCisgIHJlcyA9IFV0ZjE2X1RvX1V0ZjgoZGVzdC0+ZGF0YSwgJmRlc3RMZW4sIHNyYywgc3JjTGVuKTsNCisgIGRlc3QtPmRhdGFbZGVzdExlbl0gPSAwOw0KKyAgcmV0dXJuIHJlcyA/IFNaX09LIDogU1pfRVJST1JfRkFJTDsNCit9DQorDQorI2VuZGlmDQorDQorc3RhdGljIFNSZXMgVXRmMTZfVG9fQ2hhcihDQnVmICpidWYsIGNvbnN0IFVJbnQxNiAqcw0KKyAgICAjaWZkZWYgX1dJTjMyDQorICAgICwgVUlOVCBjb2RlUGFnZQ0KKyAgICAjZW5kaWYNCisgICAgKQ0KK3sNCisgIHVuc2lnbmVkIGxlbiA9IDA7DQorICBmb3IgKGxlbiA9IDA7IHNbbGVuXSAhPSAwOyBsZW4rKyk7DQorDQorICAjaWZkZWYgX1dJTjMyDQorICB7DQorICAgIHVuc2lnbmVkIHNpemUgPSBsZW4gKiAzICsgMTAwOw0KKyAgICBpZiAoIUJ1Zl9FbnN1cmVTaXplKGJ1Ziwgc2l6ZSkpDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX01FTTsNCisgICAgew0KKyAgICAgIGJ1Zi0+ZGF0YVswXSA9IDA7DQorICAgICAgaWYgKGxlbiAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgIGNoYXIgZGVmYXVsdENoYXIgPSAnXyc7DQorICAgICAgICBCT09MIGRlZlVzZWQ7DQorICAgICAgICB1bnNpZ25lZCBudW1DaGFycyA9IDA7DQorICAgICAgICBudW1DaGFycyA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZVBhZ2UsIDAsIHMsIGxlbiwgKGNoYXIgKilidWYtPmRhdGEsIHNpemUsICZkZWZhdWx0Q2hhciwgJmRlZlVzZWQpOw0KKyAgICAgICAgaWYgKG51bUNoYXJzID09IDAgfHwgbnVtQ2hhcnMgPj0gc2l6ZSkNCisgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX0ZBSUw7DQorICAgICAgICBidWYtPmRhdGFbbnVtQ2hhcnNdID0gMDsNCisgICAgICB9DQorICAgICAgcmV0dXJuIFNaX09LOw0KKyAgICB9DQorICB9DQorICAjZWxzZQ0KKyAgcmV0dXJuIFV0ZjE2X1RvX1V0ZjhCdWYoYnVmLCBzLCBsZW4pOw0KKyAgI2VuZGlmDQorfQ0KKw0KKyNpZmRlZiBfV0lOMzINCisgICNpZm5kZWYgVVNFX1dJTkRPV1NfRklMRQ0KKyAgICBzdGF0aWMgVUlOVCBnX0ZpbGVDb2RlUGFnZSA9IENQX0FDUDsNCisgICNlbmRpZg0KKyAgI2RlZmluZSBNWV9GSUxFX0NPREVfUEFHRV9QQVJBTSAsZ19GaWxlQ29kZVBhZ2UNCisjZWxzZQ0KKyAgI2RlZmluZSBNWV9GSUxFX0NPREVfUEFHRV9QQVJBTQ0KKyNlbmRpZg0KKw0KK3N0YXRpYyBXUmVzIE15Q3JlYXRlRGlyKGNvbnN0IFVJbnQxNiAqbmFtZSkNCit7DQorICAjaWZkZWYgVVNFX1dJTkRPV1NfRklMRQ0KKyAgDQorICByZXR1cm4gQ3JlYXRlRGlyZWN0b3J5VyhuYW1lLCBOVUxMKSA/IDAgOiBHZXRMYXN0RXJyb3IoKTsNCisgIA0KKyAgI2Vsc2UNCisNCisgIENCdWYgYnVmOw0KKyAgV1JlcyByZXM7DQorICBCdWZfSW5pdCgmYnVmKTsNCisgIFJJTk9LKFV0ZjE2X1RvX0NoYXIoJmJ1ZiwgbmFtZSBNWV9GSUxFX0NPREVfUEFHRV9QQVJBTSkpOw0KKw0KKyAgcmVzID0NCisgICNpZmRlZiBfV0lOMzINCisgIF9ta2RpcigoY29uc3QgY2hhciAqKWJ1Zi5kYXRhKQ0KKyAgI2Vsc2UNCisgIG1rZGlyKChjb25zdCBjaGFyICopYnVmLmRhdGEsIDA3NzcpDQorICAjZW5kaWYNCisgID09IDAgPyAwIDogZXJybm87DQorICBCdWZfRnJlZSgmYnVmLCAmZ19BbGxvYyk7DQorICByZXR1cm4gcmVzOw0KKyAgDQorICAjZW5kaWYNCit9DQorDQorc3RhdGljIFdSZXMgT3V0RmlsZV9PcGVuVXRmMTYoQ1N6RmlsZSAqcCwgY29uc3QgVUludDE2ICpuYW1lKQ0KK3sNCisgICNpZmRlZiBVU0VfV0lORE9XU19GSUxFDQorICByZXR1cm4gT3V0RmlsZV9PcGVuVyhwLCBuYW1lKTsNCisgICNlbHNlDQorICBDQnVmIGJ1ZjsNCisgIFdSZXMgcmVzOw0KKyAgQnVmX0luaXQoJmJ1Zik7DQorICBSSU5PSyhVdGYxNl9Ub19DaGFyKCZidWYsIG5hbWUgTVlfRklMRV9DT0RFX1BBR0VfUEFSQU0pKTsNCisgIHJlcyA9IE91dEZpbGVfT3BlbihwLCAoY29uc3QgY2hhciAqKWJ1Zi5kYXRhKTsNCisgIEJ1Zl9GcmVlKCZidWYsICZnX0FsbG9jKTsNCisgIHJldHVybiByZXM7DQorICAjZW5kaWYNCit9DQorDQorc3RhdGljIFNSZXMgUHJpbnRTdHJpbmcoY29uc3QgVUludDE2ICpzKQ0KK3sNCisgIENCdWYgYnVmOw0KKyAgU1JlcyByZXM7DQorICBCdWZfSW5pdCgmYnVmKTsNCisgIHJlcyA9IFV0ZjE2X1RvX0NoYXIoJmJ1Ziwgcw0KKyAgICAgICNpZmRlZiBfV0lOMzINCisgICAgICAsIENQX09FTUNQDQorICAgICAgI2VuZGlmDQorICAgICAgKTsNCisgIGlmIChyZXMgPT0gU1pfT0spDQorICAgIGZwdXRzKChjb25zdCBjaGFyICopYnVmLmRhdGEsIHN0ZG91dCk7DQorICBCdWZfRnJlZSgmYnVmLCAmZ19BbGxvYyk7DQorICByZXR1cm4gcmVzOw0KK30NCisNCitzdGF0aWMgdm9pZCBVSW50NjRUb1N0cihVSW50NjQgdmFsdWUsIGNoYXIgKnMpDQorew0KKyAgY2hhciB0ZW1wWzMyXTsNCisgIGludCBwb3MgPSAwOw0KKyAgZG8NCisgIHsNCisgICAgdGVtcFtwb3MrK10gPSAoY2hhcikoJzAnICsgKHVuc2lnbmVkKSh2YWx1ZSAlIDEwKSk7DQorICAgIHZhbHVlIC89IDEwOw0KKyAgfQ0KKyAgd2hpbGUgKHZhbHVlICE9IDApOw0KKyAgZG8NCisgICAgKnMrKyA9IHRlbXBbLS1wb3NdOw0KKyAgd2hpbGUgKHBvcyk7DQorICAqcyA9ICdcMCc7DQorfQ0KKw0KK3N0YXRpYyBjaGFyICpVSW50VG9TdHIoY2hhciAqcywgdW5zaWduZWQgdmFsdWUsIGludCBudW1EaWdpdHMpDQorew0KKyAgY2hhciB0ZW1wWzE2XTsNCisgIGludCBwb3MgPSAwOw0KKyAgZG8NCisgICAgdGVtcFtwb3MrK10gPSAoY2hhcikoJzAnICsgKHZhbHVlICUgMTApKTsNCisgIHdoaWxlICh2YWx1ZSAvPSAxMCk7DQorICBmb3IgKG51bURpZ2l0cyAtPSBwb3M7IG51bURpZ2l0cyA+IDA7IG51bURpZ2l0cy0tKQ0KKyAgICAqcysrID0gJzAnOw0KKyAgZG8NCisgICAgKnMrKyA9IHRlbXBbLS1wb3NdOw0KKyAgd2hpbGUgKHBvcyk7DQorICAqcyA9ICdcMCc7DQorICByZXR1cm4gczsNCit9DQorDQorc3RhdGljIHZvaWQgVUludFRvU3RyXzIoY2hhciAqcywgdW5zaWduZWQgdmFsdWUpDQorew0KKyAgc1swXSA9IChjaGFyKSgnMCcgKyAodmFsdWUgLyAxMCkpOw0KKyAgc1sxXSA9IChjaGFyKSgnMCcgKyAodmFsdWUgJSAxMCkpOw0KK30NCisNCisjZGVmaW5lIFBFUklPRF80ICg0ICogMzY1ICsgMSkNCisjZGVmaW5lIFBFUklPRF8xMDAgKFBFUklPRF80ICogMjUgLSAxKQ0KKyNkZWZpbmUgUEVSSU9EXzQwMCAoUEVSSU9EXzEwMCAqIDQgKyAxKQ0KKw0KK3N0YXRpYyB2b2lkIENvbnZlcnRGaWxlVGltZVRvU3RyaW5nKGNvbnN0IENOdGZzRmlsZVRpbWUgKm50LCBjaGFyICpzKQ0KK3sNCisgIHVuc2lnbmVkIHllYXIsIG1vbiwgaG91ciwgbWluLCBzZWM7DQorICBCeXRlIG1zW10gPSB7IDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEgfTsNCisgIHVuc2lnbmVkIHQ7DQorICBVSW50MzIgdjsNCisgIFVJbnQ2NCB2NjQgPSBudC0+TG93IHwgKChVSW50NjQpbnQtPkhpZ2ggPDwgMzIpOw0KKyAgdjY0IC89IDEwMDAwMDAwOw0KKyAgc2VjID0gKHVuc2lnbmVkKSh2NjQgJSA2MCk7IHY2NCAvPSA2MDsNCisgIG1pbiA9ICh1bnNpZ25lZCkodjY0ICUgNjApOyB2NjQgLz0gNjA7DQorICBob3VyID0gKHVuc2lnbmVkKSh2NjQgJSAyNCk7IHY2NCAvPSAyNDsNCisNCisgIHYgPSAoVUludDMyKXY2NDsNCisNCisgIHllYXIgPSAodW5zaWduZWQpKDE2MDEgKyB2IC8gUEVSSU9EXzQwMCAqIDQwMCk7DQorICB2ICU9IFBFUklPRF80MDA7DQorDQorICB0ID0gdiAvIFBFUklPRF8xMDA7IGlmICh0ID09ICA0KSB0ID0gIDM7IHllYXIgKz0gdCAqIDEwMDsgdiAtPSB0ICogUEVSSU9EXzEwMDsNCisgIHQgPSB2IC8gUEVSSU9EXzQ7ICAgaWYgKHQgPT0gMjUpIHQgPSAyNDsgeWVhciArPSB0ICogNDsgICB2IC09IHQgKiBQRVJJT0RfNDsNCisgIHQgPSB2IC8gMzY1OyAgICAgICAgaWYgKHQgPT0gIDQpIHQgPSAgMzsgeWVhciArPSB0OyAgICAgICB2IC09IHQgKiAzNjU7DQorDQorICBpZiAoeWVhciAlIDQgPT0gMCAmJiAoeWVhciAlIDEwMCAhPSAwIHx8IHllYXIgJSA0MDAgPT0gMCkpDQorICAgIG1zWzFdID0gMjk7DQorICBmb3IgKG1vbiA9IDA7OyBtb24rKykNCisgIHsNCisgICAgdW5zaWduZWQgcyA9IG1zW21vbl07DQorICAgIGlmICh2IDwgcykNCisgICAgICBicmVhazsNCisgICAgdiAtPSBzOw0KKyAgfQ0KKyAgcyA9IFVJbnRUb1N0cihzLCB5ZWFyLCA0KTsgKnMrKyA9ICctJzsNCisgIFVJbnRUb1N0cl8yKHMsIG1vbiArIDEpOyBzWzJdID0gJy0nOyBzICs9IDM7DQorICBVSW50VG9TdHJfMihzLCAodW5zaWduZWQpdiArIDEpOyBzWzJdID0gJyAnOyBzICs9IDM7DQorICBVSW50VG9TdHJfMihzLCBob3VyKTsgc1syXSA9ICc6JzsgcyArPSAzOw0KKyAgVUludFRvU3RyXzIocywgbWluKTsgc1syXSA9ICc6JzsgcyArPSAzOw0KKyAgVUludFRvU3RyXzIocywgc2VjKTsgc1syXSA9IDA7DQorfQ0KKw0KK3ZvaWQgUHJpbnRFcnJvcihjb25zdCBjaGFyICpzeikNCit7DQorICBwcmludGYoIlxuRVJST1I6ICVzXG4iLCBzeik7DQorfQ0KKw0KKyNpZmRlZiBVU0VfV0lORE9XU19GSUxFDQorc3RhdGljIHZvaWQgR2V0QXR0cmliU3RyaW5nKFVJbnQzMiB3YSwgQm9vbCBpc0RpciwgY2hhciAqcykNCit7DQorICBzWzBdID0gKGNoYXIpKCgod2EgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpICE9IDAgfHwgaXNEaXIpID8gJ0QnIDogJy4nKTsNCisgIHNbMV0gPSAoY2hhcikoKCh3YSAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZICkgIT0gMCkgPyAnUic6ICcuJyk7DQorICBzWzJdID0gKGNoYXIpKCgod2EgJiBGSUxFX0FUVFJJQlVURV9ISURERU4gICApICE9IDApID8gJ0gnOiAnLicpOw0KKyAgc1szXSA9IChjaGFyKSgoKHdhICYgRklMRV9BVFRSSUJVVEVfU1lTVEVNICAgKSAhPSAwKSA/ICdTJzogJy4nKTsNCisgIHNbNF0gPSAoY2hhcikoKCh3YSAmIEZJTEVfQVRUUklCVVRFX0FSQ0hJVkUgICkgIT0gMCkgPyAnQSc6ICcuJyk7DQorICBzWzVdID0gJ1wwJzsNCit9DQorI2Vsc2UNCitzdGF0aWMgdm9pZCBHZXRBdHRyaWJTdHJpbmcoVUludDMyLCBCb29sLCBjaGFyICpzKQ0KK3sNCisgIHNbMF0gPSAnXDAnOw0KK30NCisjZW5kaWYNCisNCisvLyAjZGVmaW5lIE5VTV9QQVJFTlRTX01BWCAxMjgNCisNCitpbnQgTVlfQ0RFQ0wgbWFpbihpbnQgbnVtYXJncywgY2hhciAqYXJnc1tdKQ0KK3sNCisgIENGaWxlSW5TdHJlYW0gYXJjaGl2ZVN0cmVhbTsNCisgIENMb29rVG9SZWFkIGxvb2tTdHJlYW07DQorICBDU3pBckV4IGRiOw0KKyAgU1JlcyByZXM7DQorICBJU3pBbGxvYyBhbGxvY0ltcDsNCisgIElTekFsbG9jIGFsbG9jVGVtcEltcDsNCisgIFVJbnQxNiAqdGVtcCA9IE5VTEw7DQorICBzaXplX3QgdGVtcFNpemUgPSAwOw0KKyAgLy8gVUludDMyIHBhcmVudHNbTlVNX1BBUkVOVFNfTUFYXTsNCisNCisgIHByaW50ZigiXG43eiBBTlNJLUMgRGVjb2RlciAiIE1ZX1ZFUlNJT05fQ09QWVJJR0hUX0RBVEUgIlxuXG4iKTsNCisgIGlmIChudW1hcmdzID09IDEpDQorICB7DQorICAgIHByaW50ZigNCisgICAgICAiVXNhZ2U6IDd6RGVjIDxjb21tYW5kPiA8YXJjaGl2ZV9uYW1lPlxuXG4iDQorICAgICAgIjxDb21tYW5kcz5cbiINCisgICAgICAiICBlOiBFeHRyYWN0IGZpbGVzIGZyb20gYXJjaGl2ZSAod2l0aG91dCB1c2luZyBkaXJlY3RvcnkgbmFtZXMpXG4iDQorICAgICAgIiAgbDogTGlzdCBjb250ZW50cyBvZiBhcmNoaXZlXG4iDQorICAgICAgIiAgdDogVGVzdCBpbnRlZ3JpdHkgb2YgYXJjaGl2ZVxuIg0KKyAgICAgICIgIHg6IGVYdHJhY3QgZmlsZXMgd2l0aCBmdWxsIHBhdGhzXG4iKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAobnVtYXJncyA8IDMpDQorICB7DQorICAgIFByaW50RXJyb3IoImluY29ycmVjdCBjb21tYW5kIik7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKw0KKyAgI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChVU0VfV0lORE9XU19GSUxFKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkNCisgIGdfRmlsZUNvZGVQYWdlID0gQXJlRmlsZUFwaXNBTlNJKCkgPyBDUF9BQ1AgOiBDUF9PRU1DUDsNCisgICNlbmRpZg0KKw0KKyAgYWxsb2NJbXAuQWxsb2MgPSBTekFsbG9jOw0KKyAgYWxsb2NJbXAuRnJlZSA9IFN6RnJlZTsNCisNCisgIGFsbG9jVGVtcEltcC5BbGxvYyA9IFN6QWxsb2NUZW1wOw0KKyAgYWxsb2NUZW1wSW1wLkZyZWUgPSBTekZyZWVUZW1wOw0KKw0KKyAgI2lmZGVmIFVOREVSX0NFDQorICBpZiAoSW5GaWxlX09wZW5XKCZhcmNoaXZlU3RyZWFtLmZpbGUsIEwiXHRlc3QuN3oiKSkNCisgICNlbHNlDQorICBpZiAoSW5GaWxlX09wZW4oJmFyY2hpdmVTdHJlYW0uZmlsZSwgYXJnc1syXSkpDQorICAjZW5kaWYNCisgIHsNCisgICAgUHJpbnRFcnJvcigiY2FuIG5vdCBvcGVuIGlucHV0IGZpbGUiKTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorDQorICBGaWxlSW5TdHJlYW1fQ3JlYXRlVlRhYmxlKCZhcmNoaXZlU3RyZWFtKTsNCisgIExvb2tUb1JlYWRfQ3JlYXRlVlRhYmxlKCZsb29rU3RyZWFtLCBGYWxzZSk7DQorICANCisgIGxvb2tTdHJlYW0ucmVhbFN0cmVhbSA9ICZhcmNoaXZlU3RyZWFtLnM7DQorICBMb29rVG9SZWFkX0luaXQoJmxvb2tTdHJlYW0pOw0KKw0KKyAgQ3JjR2VuZXJhdGVUYWJsZSgpOw0KKw0KKyAgU3pBckV4X0luaXQoJmRiKTsNCisgIHJlcyA9IFN6QXJFeF9PcGVuKCZkYiwgJmxvb2tTdHJlYW0ucywgJmFsbG9jSW1wLCAmYWxsb2NUZW1wSW1wKTsNCisgIGlmIChyZXMgPT0gU1pfT0spDQorICB7DQorICAgIGNoYXIgKmNvbW1hbmQgPSBhcmdzWzFdOw0KKyAgICBpbnQgbGlzdENvbW1hbmQgPSAwLCB0ZXN0Q29tbWFuZCA9IDAsIGZ1bGxQYXRocyA9IDA7DQorICAgIGlmIChzdHJjbXAoY29tbWFuZCwgImwiKSA9PSAwKSBsaXN0Q29tbWFuZCA9IDE7DQorICAgIGVsc2UgaWYgKHN0cmNtcChjb21tYW5kLCAidCIpID09IDApIHRlc3RDb21tYW5kID0gMTsNCisgICAgZWxzZSBpZiAoc3RyY21wKGNvbW1hbmQsICJlIikgPT0gMCkgeyB9DQorICAgIGVsc2UgaWYgKHN0cmNtcChjb21tYW5kLCAieCIpID09IDApIHsgZnVsbFBhdGhzID0gMTsgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBQcmludEVycm9yKCJpbmNvcnJlY3QgY29tbWFuZCIpOw0KKyAgICAgIHJlcyA9IFNaX0VSUk9SX0ZBSUw7DQorICAgIH0NCisNCisgICAgaWYgKHJlcyA9PSBTWl9PSykNCisgICAgew0KKyAgICAgIFVJbnQzMiBpOw0KKw0KKyAgICAgIC8qDQorICAgICAgaWYgeW91IG5lZWQgY2FjaGUsIHVzZSB0aGVzZSAzIHZhcmlhYmxlcy4NCisgICAgICBpZiB5b3UgdXNlIGV4dGVybmFsIGZ1bmN0aW9uLCB5b3UgY2FuIG1ha2UgdGhlc2UgdmFyaWFibGUgYXMgc3RhdGljLg0KKyAgICAgICovDQorICAgICAgVUludDMyIGJsb2NrSW5kZXggPSAweEZGRkZGRkZGOyAvKiBpdCBjYW4gaGF2ZSBhbnkgdmFsdWUgYmVmb3JlIGZpcnN0IGNhbGwgKGlmIG91dEJ1ZmZlciA9IDApICovDQorICAgICAgQnl0ZSAqb3V0QnVmZmVyID0gMDsgLyogaXQgbXVzdCBiZSAwIGJlZm9yZSBmaXJzdCBjYWxsIGZvciBlYWNoIG5ldyBhcmNoaXZlLiAqLw0KKyAgICAgIHNpemVfdCBvdXRCdWZmZXJTaXplID0gMDsgIC8qIGl0IGNhbiBoYXZlIGFueSB2YWx1ZSBiZWZvcmUgZmlyc3QgY2FsbCAoaWYgb3V0QnVmZmVyID0gMCkgKi8NCisNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZGIuTnVtRmlsZXM7IGkrKykNCisgICAgICB7DQorICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsNCisgICAgICAgIHNpemVfdCBvdXRTaXplUHJvY2Vzc2VkID0gMDsNCisgICAgICAgIC8vIGNvbnN0IENTekZpbGVJdGVtICpmID0gZGIuRmlsZXMgKyBpOw0KKyAgICAgICAgc2l6ZV90IGxlbjsNCisgICAgICAgIGludCBpc0RpciA9IFN6QXJFeF9Jc0RpcigmZGIsIGkpOw0KKyAgICAgICAgaWYgKGxpc3RDb21tYW5kID09IDAgJiYgaXNEaXIgJiYgIWZ1bGxQYXRocykNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICBsZW4gPSBTekFyRXhfR2V0RmlsZU5hbWVVdGYxNigmZGIsIGksIE5VTEwpOw0KKyAgICAgICAgLy8gbGVuID0gU3pBckV4X0dldEZ1bGxOYW1lTGVuKCZkYiwgaSk7DQorDQorICAgICAgICBpZiAobGVuID4gdGVtcFNpemUpDQorICAgICAgICB7DQorICAgICAgICAgIFN6RnJlZShOVUxMLCB0ZW1wKTsNCisgICAgICAgICAgdGVtcFNpemUgPSBsZW47DQorICAgICAgICAgIHRlbXAgPSAoVUludDE2ICopU3pBbGxvYyhOVUxMLCB0ZW1wU2l6ZSAqIHNpemVvZih0ZW1wWzBdKSk7DQorICAgICAgICAgIGlmICghdGVtcCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIHJlcyA9IFNaX0VSUk9SX01FTTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgU3pBckV4X0dldEZpbGVOYW1lVXRmMTYoJmRiLCBpLCB0ZW1wKTsNCisgICAgICAgIC8qDQorICAgICAgICBpZiAoU3pBckV4X0dldEZ1bGxOYW1lVXRmMTZfQmFjaygmZGIsIGksIHRlbXAgKyBsZW4pICE9IHRlbXApDQorICAgICAgICB7DQorICAgICAgICAgIHJlcyA9IFNaX0VSUk9SX0ZBSUw7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKi8NCisNCisgICAgICAgIGlmIChsaXN0Q29tbWFuZCkNCisgICAgICAgIHsNCisgICAgICAgICAgY2hhciBhdHRyWzhdLCBzWzMyXSwgdFszMl07DQorICAgICAgICAgIFVJbnQ2NCBmaWxlU2l6ZTsNCisNCisgICAgICAgICAgR2V0QXR0cmliU3RyaW5nKFN6Qml0V2l0aFZhbHNfQ2hlY2soJmRiLkF0dHJpYnMsIGkpID8gZGIuQXR0cmlicy5WYWxzW2ldIDogMCwgaXNEaXIsIGF0dHIpOw0KKw0KKyAgICAgICAgICBmaWxlU2l6ZSA9IFN6QXJFeF9HZXRGaWxlU2l6ZSgmZGIsIGkpOw0KKyAgICAgICAgICBVSW50NjRUb1N0cihmaWxlU2l6ZSwgcyk7DQorICAgICAgICAgIGlmIChTekJpdFdpdGhWYWxzX0NoZWNrKCZkYi5NVGltZSwgaSkpDQorICAgICAgICAgICAgQ29udmVydEZpbGVUaW1lVG9TdHJpbmcoJmRiLk1UaW1lLlZhbHNbaV0sIHQpOw0KKyAgICAgICAgICBlbHNlDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBzaXplX3QgajsNCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTk7IGorKykNCisgICAgICAgICAgICAgIHRbal0gPSAnICc7DQorICAgICAgICAgICAgdFtqXSA9ICdcMCc7DQorICAgICAgICAgIH0NCisgICAgICAgICAgDQorICAgICAgICAgIHByaW50ZigiJXMgJXMgJTEwcyAgIiwgdCwgYXR0ciwgcyk7DQorICAgICAgICAgIHJlcyA9IFByaW50U3RyaW5nKHRlbXApOw0KKyAgICAgICAgICBpZiAocmVzICE9IFNaX09LKQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBpZiAoaXNEaXIpDQorICAgICAgICAgICAgcHJpbnRmKCIvIik7DQorICAgICAgICAgIHByaW50ZigiXG4iKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBmcHV0cyh0ZXN0Q29tbWFuZCA/DQorICAgICAgICAgICAgIlRlc3RpbmcgICAgIjoNCisgICAgICAgICAgICAiRXh0cmFjdGluZyAiLA0KKyAgICAgICAgICAgIHN0ZG91dCk7DQorICAgICAgICByZXMgPSBQcmludFN0cmluZyh0ZW1wKTsNCisgICAgICAgIGlmIChyZXMgIT0gU1pfT0spDQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgaWYgKGlzRGlyKQ0KKyAgICAgICAgICBwcmludGYoIi8iKTsNCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgcmVzID0gU3pBckV4X0V4dHJhY3QoJmRiLCAmbG9va1N0cmVhbS5zLCBpLA0KKyAgICAgICAgICAgICAgJmJsb2NrSW5kZXgsICZvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplLA0KKyAgICAgICAgICAgICAgJm9mZnNldCwgJm91dFNpemVQcm9jZXNzZWQsDQorICAgICAgICAgICAgICAmYWxsb2NJbXAsICZhbGxvY1RlbXBJbXApOw0KKyAgICAgICAgICBpZiAocmVzICE9IFNaX09LKQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCF0ZXN0Q29tbWFuZCkNCisgICAgICAgIHsNCisgICAgICAgICAgQ1N6RmlsZSBvdXRGaWxlOw0KKyAgICAgICAgICBzaXplX3QgcHJvY2Vzc2VkU2l6ZTsNCisgICAgICAgICAgc2l6ZV90IGo7DQorICAgICAgICAgIFVJbnQxNiAqbmFtZSA9IChVSW50MTYgKil0ZW1wOw0KKyAgICAgICAgICBjb25zdCBVSW50MTYgKmRlc3RQYXRoID0gKGNvbnN0IFVJbnQxNiAqKW5hbWU7DQorICAgICAgICAgIGZvciAoaiA9IDA7IG5hbWVbal0gIT0gMDsgaisrKQ0KKyAgICAgICAgICAgIGlmIChuYW1lW2pdID09ICcvJykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICBpZiAoZnVsbFBhdGhzKQ0KKyAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBuYW1lW2pdID0gMDsNCisgICAgICAgICAgICAgICAgTXlDcmVhdGVEaXIobmFtZSk7DQorICAgICAgICAgICAgICAgIG5hbWVbal0gPSBDSEFSX1BBVEhfU0VQQVJBVE9SOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICBkZXN0UGF0aCA9IG5hbWUgKyBqICsgMTsNCisgICAgICAgICAgICB9DQorICAgIA0KKyAgICAgICAgICBpZiAoaXNEaXIpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBNeUNyZWF0ZURpcihkZXN0UGF0aCk7DQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGVsc2UgaWYgKE91dEZpbGVfT3BlblV0ZjE2KCZvdXRGaWxlLCBkZXN0UGF0aCkpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBQcmludEVycm9yKCJjYW4gbm90IG9wZW4gb3V0cHV0IGZpbGUiKTsNCisgICAgICAgICAgICByZXMgPSBTWl9FUlJPUl9GQUlMOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHByb2Nlc3NlZFNpemUgPSBvdXRTaXplUHJvY2Vzc2VkOw0KKyAgICAgICAgICBpZiAoRmlsZV9Xcml0ZSgmb3V0RmlsZSwgb3V0QnVmZmVyICsgb2Zmc2V0LCAmcHJvY2Vzc2VkU2l6ZSkgIT0gMCB8fCBwcm9jZXNzZWRTaXplICE9IG91dFNpemVQcm9jZXNzZWQpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBQcmludEVycm9yKCJjYW4gbm90IHdyaXRlIG91dHB1dCBmaWxlIik7DQorICAgICAgICAgICAgcmVzID0gU1pfRVJST1JfRkFJTDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoRmlsZV9DbG9zZSgmb3V0RmlsZSkpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBQcmludEVycm9yKCJjYW4gbm90IGNsb3NlIG91dHB1dCBmaWxlIik7DQorICAgICAgICAgICAgcmVzID0gU1pfRVJST1JfRkFJTDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICAjaWZkZWYgVVNFX1dJTkRPV1NfRklMRQ0KKyAgICAgICAgICBpZiAoU3pCaXRXaXRoVmFsc19DaGVjaygmZGIuQXR0cmlicywgaSkpDQorICAgICAgICAgICAgU2V0RmlsZUF0dHJpYnV0ZXNXKGRlc3RQYXRoLCBkYi5BdHRyaWJzLlZhbHNbaV0pOw0KKyAgICAgICAgICAjZW5kaWYNCisgICAgICAgIH0NCisgICAgICAgIHByaW50ZigiXG4iKTsNCisgICAgICB9DQorICAgICAgSUFsbG9jX0ZyZWUoJmFsbG9jSW1wLCBvdXRCdWZmZXIpOw0KKyAgICB9DQorICB9DQorICBTekFyRXhfRnJlZSgmZGIsICZhbGxvY0ltcCk7DQorICBTekZyZWUoTlVMTCwgdGVtcCk7DQorDQorICBGaWxlX0Nsb3NlKCZhcmNoaXZlU3RyZWFtLmZpbGUpOw0KKyAgaWYgKHJlcyA9PSBTWl9PSykNCisgIHsNCisgICAgcHJpbnRmKCJcbkV2ZXJ5dGhpbmcgaXMgT2tcbiIpOw0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmIChyZXMgPT0gU1pfRVJST1JfVU5TVVBQT1JURUQpDQorICAgIFByaW50RXJyb3IoImRlY29kZXIgZG9lc24ndCBzdXBwb3J0IHRoaXMgYXJjaGl2ZSIpOw0KKyAgZWxzZSBpZiAocmVzID09IFNaX0VSUk9SX01FTSkNCisgICAgUHJpbnRFcnJvcigiY2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkiKTsNCisgIGVsc2UgaWYgKHJlcyA9PSBTWl9FUlJPUl9DUkMpDQorICAgIFByaW50RXJyb3IoIkNSQyBlcnJvciIpOw0KKyAgZWxzZQ0KKyAgICBwcmludGYoIlxuRVJST1IgIyVkXG4iLCByZXMpOw0KKyAgcmV0dXJuIDE7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9VdGlsLzd6L1ByZWNvbXAuYyBiL2x6bWEvQy9VdGlsLzd6L1ByZWNvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGI2MGY4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL1V0aWwvN3ovUHJlY29tcC5jCkBAIC0wLDAgKzEsNCBAQAorLyogUHJlY29tcC5jIC0tIFN0ZEFmeA0KKzIwMTMtMDEtMjEgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiUHJlY29tcC5oIg0KZGlmZiAtLWdpdCBhL2x6bWEvQy9VdGlsLzd6L1ByZWNvbXAuaCBiL2x6bWEvQy9VdGlsLzd6L1ByZWNvbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjM5OGQwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL1V0aWwvN3ovUHJlY29tcC5oCkBAIC0wLDAgKzEsMTAgQEAKKy8qIFByZWNvbXAuaCAtLSBTdGRBZngNCisyMDEzLTA2LTE2IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2lmbmRlZiBfXzdaX1BSRUNPTVBfSA0KKyNkZWZpbmUgX183Wl9QUkVDT01QX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tcGlsZXIuaCINCisjaW5jbHVkZSAiLi4vLi4vN3pUeXBlcy5oIg0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy9VdGlsLzd6L21ha2VmaWxlIGIvbHptYS9DL1V0aWwvN3ovbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlNmY2OAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9VdGlsLzd6L21ha2VmaWxlCkBAIC0wLDAgKzEsMzkgQEAKKyMgTVlfU1RBVElDX0xJTks9MQ0KK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtRF83WklQX1BQTURfU1VQUFBPUlQNCisNCitQUk9HID0gN3pEZWMuZXhlDQorDQorQ19PQkpTID0gXA0KKyAgJE9cN3pBbGxvYy5vYmogXA0KKyAgJE9cN3pCdWYub2JqIFwNCisgICRPXDd6Q3JjLm9iaiBcDQorICAkT1w3ekNyY09wdC5vYmogXA0KKyAgJE9cN3pGaWxlLm9iaiBcDQorICAkT1w3ekRlYy5vYmogXA0KKyAgJE9cN3pBcmNJbi5vYmogXA0KKyAgJE9cN3pTdHJlYW0ub2JqIFwNCisgICRPXEJjajIub2JqIFwNCisgICRPXEJyYS5vYmogXA0KKyAgJE9cQnJhODYub2JqIFwNCisgICRPXENwdUFyY2gub2JqIFwNCisgICRPXEx6bWEyRGVjLm9iaiBcDQorICAkT1xMem1hRGVjLm9iaiBcDQorICAkT1xQcG1kNy5vYmogXA0KKyAgJE9cUHBtZDdEZWMub2JqIFwNCisNCis3Wl9PQkpTID0gXA0KKyAgJE9cN3pNYWluLm9iaiBcDQorDQorT0JKUyA9IFwNCisgICRPXFByZWNvbXAub2JqIFwNCisgICQoN1pfT0JKUykgXA0KKyAgJChDX09CSlMpIFwNCisNCishaW5jbHVkZSAiLi4vLi4vLi4vQ1BQL0J1aWxkLm1hayINCisNCiskKDdaX09CSlMpOiAkKCpCKS5jDQorCSQoQ0NPTVBMX1VTRSkNCiskKENfT0JKUyk6IC4uLy4uLyQoKkIpLmMNCisJJChDQ09NUExfVVNFKQ0KKyRPXFByZWNvbXAub2JqOiBQcmVjb21wLmMNCisJJChDQ09NUExfUENIKQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9VdGlsLzd6L21ha2VmaWxlLmdjYyBiL2x6bWEvQy9VdGlsLzd6L21ha2VmaWxlLmdjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2M1OWNhCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL1V0aWwvN3ovbWFrZWZpbGUuZ2NjCkBAIC0wLDAgKzEsNzAgQEAKK1BST0cgPSA3ekRlYw0KK0NYWCA9IGcrKw0KK0xJQiA9DQorUk0gPSBybSAtZg0KK0NGTEFHUyA9IC1jIC1PMiAtV2FsbA0KKw0KK09CSlMgPSA3ek1haW4ubyA3ekFsbG9jLm8gN3pBcmNJbi5vIDd6QnVmLm8gN3pCdWYyLm8gN3pDcmMubyA3ekNyY09wdC5vIDd6RGVjLm8gQ3B1QXJjaC5vIEx6bWFEZWMubyBMem1hMkRlYy5vIEJyYS5vIEJyYTg2Lm8gQmNqMi5vIFBwbWQ3Lm8gUHBtZDdEZWMubyA3ekZpbGUubyA3elN0cmVhbS5vDQorDQorYWxsOiAkKFBST0cpDQorDQorJChQUk9HKTogJChPQkpTKQ0KKwkkKENYWCkgLW8gJChQUk9HKSAkKExERkxBR1MpICQoT0JKUykgJChMSUIpDQorDQorN3pNYWluLm86IDd6TWFpbi5jDQorCSQoQ1hYKSAkKENGTEFHUykgN3pNYWluLmMNCisNCis3ekFsbG9jLm86IC4uLy4uLzd6QWxsb2MuYw0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uLzd6QWxsb2MuYw0KKw0KKzd6QXJjSW4ubzogLi4vLi4vN3pBcmNJbi5jDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vN3pBcmNJbi5jDQorDQorN3pCdWYubzogLi4vLi4vN3pCdWYuYw0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uLzd6QnVmLmMNCisNCis3ekJ1ZjIubzogLi4vLi4vN3pCdWYyLmMNCisJJChDWFgpICQoQ0ZMQUdTKSAuLi8uLi83ekJ1ZjIuYw0KKw0KKzd6Q3JjLm86IC4uLy4uLzd6Q3JjLmMNCisJJChDWFgpICQoQ0ZMQUdTKSAuLi8uLi83ekNyYy5jDQorDQorN3pDcmNPcHQubzogLi4vLi4vN3pDcmMuYw0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uLzd6Q3JjT3B0LmMNCisNCis3ekRlYy5vOiAuLi8uLi83ekRlYy5jDQorCSQoQ1hYKSAkKENGTEFHUykgLURfN1pJUF9QUE1EX1NVUFBQT1JUIC4uLy4uLzd6RGVjLmMNCisNCitDcHVBcmNoLm86IC4uLy4uL0NwdUFyY2guYw0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uL0NwdUFyY2guYw0KKw0KK0x6bWFEZWMubzogLi4vLi4vTHptYURlYy5jDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vTHptYURlYy5jDQorDQorTHptYTJEZWMubzogLi4vLi4vTHptYTJEZWMuYw0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uL0x6bWEyRGVjLmMNCisNCitCcmEubzogLi4vLi4vQnJhLmMNCisJJChDWFgpICQoQ0ZMQUdTKSAuLi8uLi9CcmEuYw0KKw0KK0JyYTg2Lm86IC4uLy4uL0JyYTg2LmMNCisJJChDWFgpICQoQ0ZMQUdTKSAuLi8uLi9CcmE4Ni5jDQorDQorQmNqMi5vOiAuLi8uLi9CY2oyLmMNCisJJChDWFgpICQoQ0ZMQUdTKSAuLi8uLi9CY2oyLmMNCisNCitQcG1kNy5vOiAuLi8uLi9QcG1kNy5jDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vUHBtZDcuYw0KKw0KK1BwbWQ3RGVjLm86IC4uLy4uL1BwbWQ3RGVjLmMNCisJJChDWFgpICQoQ0ZMQUdTKSAuLi8uLi9QcG1kN0RlYy5jDQorDQorN3pGaWxlLm86IC4uLy4uLzd6RmlsZS5jDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vN3pGaWxlLmMNCisNCis3elN0cmVhbS5vOiAuLi8uLi83elN0cmVhbS5jDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vN3pTdHJlYW0uYw0KKw0KK2NsZWFuOg0KKwktJChSTSkgJChQUk9HKSAkKE9CSlMpDQorDQpkaWZmIC0tZ2l0IGEvbHptYS9DL1V0aWwvTHptYS9Mem1hVXRpbC5jIGIvbHptYS9DL1V0aWwvTHptYS9Mem1hVXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjU5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvVXRpbC9Mem1hL0x6bWFVdGlsLmMKQEAgLTAsMCArMSwyNTQgQEAKKy8qIEx6bWFVdGlsLmMgLS0gVGVzdCBhcHBsaWNhdGlvbiBmb3IgTFpNQSBjb21wcmVzc2lvbg0KKzIwMTQtMTItMzEgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiLi4vLi4vUHJlY29tcC5oIg0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorDQorI2luY2x1ZGUgIi4uLy4uL0FsbG9jLmgiDQorI2luY2x1ZGUgIi4uLy4uLzd6RmlsZS5oIg0KKyNpbmNsdWRlICIuLi8uLi83elZlcnNpb24uaCINCisjaW5jbHVkZSAiLi4vLi4vTHptYURlYy5oIg0KKyNpbmNsdWRlICIuLi8uLi9Mem1hRW5jLmgiDQorDQorY29uc3QgY2hhciAqa0NhbnRSZWFkTWVzc2FnZSA9ICJDYW4gbm90IHJlYWQgaW5wdXQgZmlsZSI7DQorY29uc3QgY2hhciAqa0NhbnRXcml0ZU1lc3NhZ2UgPSAiQ2FuIG5vdCB3cml0ZSBvdXRwdXQgZmlsZSI7DQorY29uc3QgY2hhciAqa0NhbnRBbGxvY2F0ZU1lc3NhZ2UgPSAiQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkiOw0KK2NvbnN0IGNoYXIgKmtEYXRhRXJyb3JNZXNzYWdlID0gIkRhdGEgZXJyb3IiOw0KKw0KK3N0YXRpYyB2b2lkICpTekFsbG9jKHZvaWQgKnAsIHNpemVfdCBzaXplKSB7IHAgPSBwOyByZXR1cm4gTXlBbGxvYyhzaXplKTsgfQ0KK3N0YXRpYyB2b2lkIFN6RnJlZSh2b2lkICpwLCB2b2lkICphZGRyZXNzKSB7IHAgPSBwOyBNeUZyZWUoYWRkcmVzcyk7IH0NCitzdGF0aWMgSVN6QWxsb2MgZ19BbGxvYyA9IHsgU3pBbGxvYywgU3pGcmVlIH07DQorDQordm9pZCBQcmludEhlbHAoY2hhciAqYnVmZmVyKQ0KK3sNCisgIHN0cmNhdChidWZmZXIsICJcbkxaTUEgVXRpbGl0eSAiIE1ZX1ZFUlNJT05fQ09QWVJJR0hUX0RBVEUgIlxuIg0KKyAgICAgICJcblVzYWdlOiAgbHptYSA8ZXxkPiBpbnB1dEZpbGUgb3V0cHV0RmlsZVxuIg0KKyAgICAgICAgICAgICAiICBlOiBlbmNvZGUgZmlsZVxuIg0KKyAgICAgICAgICAgICAiICBkOiBkZWNvZGUgZmlsZVxuIik7DQorfQ0KKw0KK2ludCBQcmludEVycm9yKGNoYXIgKmJ1ZmZlciwgY29uc3QgY2hhciAqbWVzc2FnZSkNCit7DQorICBzdHJjYXQoYnVmZmVyLCAiXG5FcnJvcjogIik7DQorICBzdHJjYXQoYnVmZmVyLCBtZXNzYWdlKTsNCisgIHN0cmNhdChidWZmZXIsICJcbiIpOw0KKyAgcmV0dXJuIDE7DQorfQ0KKw0KK2ludCBQcmludEVycm9yTnVtYmVyKGNoYXIgKmJ1ZmZlciwgU1JlcyB2YWwpDQorew0KKyAgc3ByaW50ZihidWZmZXIgKyBzdHJsZW4oYnVmZmVyKSwgIlxuRXJyb3IgY29kZTogJXhcbiIsICh1bnNpZ25lZCl2YWwpOw0KKyAgcmV0dXJuIDE7DQorfQ0KKw0KK2ludCBQcmludFVzZXJFcnJvcihjaGFyICpidWZmZXIpDQorew0KKyAgcmV0dXJuIFByaW50RXJyb3IoYnVmZmVyLCAiSW5jb3JyZWN0IGNvbW1hbmQiKTsNCit9DQorDQorI2RlZmluZSBJTl9CVUZfU0laRSAoMSA8PCAxNikNCisjZGVmaW5lIE9VVF9CVUZfU0laRSAoMSA8PCAxNikNCisNCitzdGF0aWMgU1JlcyBEZWNvZGUyKENMem1hRGVjICpzdGF0ZSwgSVNlcU91dFN0cmVhbSAqb3V0U3RyZWFtLCBJU2VxSW5TdHJlYW0gKmluU3RyZWFtLA0KKyAgICBVSW50NjQgdW5wYWNrU2l6ZSkNCit7DQorICBpbnQgdGhlcmVJc1NpemUgPSAodW5wYWNrU2l6ZSAhPSAoVUludDY0KShJbnQ2NCktMSk7DQorICBCeXRlIGluQnVmW0lOX0JVRl9TSVpFXTsNCisgIEJ5dGUgb3V0QnVmW09VVF9CVUZfU0laRV07DQorICBzaXplX3QgaW5Qb3MgPSAwLCBpblNpemUgPSAwLCBvdXRQb3MgPSAwOw0KKyAgTHptYURlY19Jbml0KHN0YXRlKTsNCisgIGZvciAoOzspDQorICB7DQorICAgIGlmIChpblBvcyA9PSBpblNpemUpDQorICAgIHsNCisgICAgICBpblNpemUgPSBJTl9CVUZfU0laRTsNCisgICAgICBSSU5PSyhpblN0cmVhbS0+UmVhZChpblN0cmVhbSwgaW5CdWYsICZpblNpemUpKTsNCisgICAgICBpblBvcyA9IDA7DQorICAgIH0NCisgICAgew0KKyAgICAgIFNSZXMgcmVzOw0KKyAgICAgIFNpemVUIGluUHJvY2Vzc2VkID0gaW5TaXplIC0gaW5Qb3M7DQorICAgICAgU2l6ZVQgb3V0UHJvY2Vzc2VkID0gT1VUX0JVRl9TSVpFIC0gb3V0UG9zOw0KKyAgICAgIEVMem1hRmluaXNoTW9kZSBmaW5pc2hNb2RlID0gTFpNQV9GSU5JU0hfQU5ZOw0KKyAgICAgIEVMem1hU3RhdHVzIHN0YXR1czsNCisgICAgICBpZiAodGhlcmVJc1NpemUgJiYgb3V0UHJvY2Vzc2VkID4gdW5wYWNrU2l6ZSkNCisgICAgICB7DQorICAgICAgICBvdXRQcm9jZXNzZWQgPSAoU2l6ZVQpdW5wYWNrU2l6ZTsNCisgICAgICAgIGZpbmlzaE1vZGUgPSBMWk1BX0ZJTklTSF9FTkQ7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHJlcyA9IEx6bWFEZWNfRGVjb2RlVG9CdWYoc3RhdGUsIG91dEJ1ZiArIG91dFBvcywgJm91dFByb2Nlc3NlZCwNCisgICAgICAgIGluQnVmICsgaW5Qb3MsICZpblByb2Nlc3NlZCwgZmluaXNoTW9kZSwgJnN0YXR1cyk7DQorICAgICAgaW5Qb3MgKz0gaW5Qcm9jZXNzZWQ7DQorICAgICAgb3V0UG9zICs9IG91dFByb2Nlc3NlZDsNCisgICAgICB1bnBhY2tTaXplIC09IG91dFByb2Nlc3NlZDsNCisgICAgICANCisgICAgICBpZiAob3V0U3RyZWFtKQ0KKyAgICAgICAgaWYgKG91dFN0cmVhbS0+V3JpdGUob3V0U3RyZWFtLCBvdXRCdWYsIG91dFBvcykgIT0gb3V0UG9zKQ0KKyAgICAgICAgICByZXR1cm4gU1pfRVJST1JfV1JJVEU7DQorICAgICAgICANCisgICAgICBvdXRQb3MgPSAwOw0KKyAgICAgIA0KKyAgICAgIGlmIChyZXMgIT0gU1pfT0sgfHwgKHRoZXJlSXNTaXplICYmIHVucGFja1NpemUgPT0gMCkpDQorICAgICAgICByZXR1cm4gcmVzOw0KKyAgICAgIA0KKyAgICAgIGlmIChpblByb2Nlc3NlZCA9PSAwICYmIG91dFByb2Nlc3NlZCA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgIGlmICh0aGVyZUlzU2l6ZSB8fCBzdGF0dXMgIT0gTFpNQV9TVEFUVVNfRklOSVNIRURfV0lUSF9NQVJLKQ0KKyAgICAgICAgICByZXR1cm4gU1pfRVJST1JfREFUQTsNCisgICAgICAgIHJldHVybiByZXM7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KKw0KK3N0YXRpYyBTUmVzIERlY29kZShJU2VxT3V0U3RyZWFtICpvdXRTdHJlYW0sIElTZXFJblN0cmVhbSAqaW5TdHJlYW0pDQorew0KKyAgVUludDY0IHVucGFja1NpemU7DQorICBpbnQgaTsNCisgIFNSZXMgcmVzID0gMDsNCisNCisgIENMem1hRGVjIHN0YXRlOw0KKw0KKyAgLyogaGVhZGVyOiA1IGJ5dGVzIG9mIExaTUEgcHJvcGVydGllcyBhbmQgOCBieXRlcyBvZiB1bmNvbXByZXNzZWQgc2l6ZSAqLw0KKyAgdW5zaWduZWQgY2hhciBoZWFkZXJbTFpNQV9QUk9QU19TSVpFICsgOF07DQorDQorICAvKiBSZWFkIGFuZCBwYXJzZSBoZWFkZXIgKi8NCisNCisgIFJJTk9LKFNlcUluU3RyZWFtX1JlYWQoaW5TdHJlYW0sIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpKTsNCisNCisgIHVucGFja1NpemUgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykNCisgICAgdW5wYWNrU2l6ZSArPSAoVUludDY0KWhlYWRlcltMWk1BX1BST1BTX1NJWkUgKyBpXSA8PCAoaSAqIDgpOw0KKw0KKyAgTHptYURlY19Db25zdHJ1Y3QoJnN0YXRlKTsNCisgIFJJTk9LKEx6bWFEZWNfQWxsb2NhdGUoJnN0YXRlLCBoZWFkZXIsIExaTUFfUFJPUFNfU0laRSwgJmdfQWxsb2MpKTsNCisgIHJlcyA9IERlY29kZTIoJnN0YXRlLCBvdXRTdHJlYW0sIGluU3RyZWFtLCB1bnBhY2tTaXplKTsNCisgIEx6bWFEZWNfRnJlZSgmc3RhdGUsICZnX0FsbG9jKTsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK3N0YXRpYyBTUmVzIEVuY29kZShJU2VxT3V0U3RyZWFtICpvdXRTdHJlYW0sIElTZXFJblN0cmVhbSAqaW5TdHJlYW0sIFVJbnQ2NCBmaWxlU2l6ZSwgY2hhciAqcnMpDQorew0KKyAgQ0x6bWFFbmNIYW5kbGUgZW5jOw0KKyAgU1JlcyByZXM7DQorICBDTHptYUVuY1Byb3BzIHByb3BzOw0KKw0KKyAgcnMgPSByczsNCisNCisgIGVuYyA9IEx6bWFFbmNfQ3JlYXRlKCZnX0FsbG9jKTsNCisgIGlmIChlbmMgPT0gMCkNCisgICAgcmV0dXJuIFNaX0VSUk9SX01FTTsNCisNCisgIEx6bWFFbmNQcm9wc19Jbml0KCZwcm9wcyk7DQorICByZXMgPSBMem1hRW5jX1NldFByb3BzKGVuYywgJnByb3BzKTsNCisNCisgIGlmIChyZXMgPT0gU1pfT0spDQorICB7DQorICAgIEJ5dGUgaGVhZGVyW0xaTUFfUFJPUFNfU0laRSArIDhdOw0KKyAgICBzaXplX3QgaGVhZGVyU2l6ZSA9IExaTUFfUFJPUFNfU0laRTsNCisgICAgaW50IGk7DQorDQorICAgIHJlcyA9IEx6bWFFbmNfV3JpdGVQcm9wZXJ0aWVzKGVuYywgaGVhZGVyLCAmaGVhZGVyU2l6ZSk7DQorICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspDQorICAgICAgaGVhZGVyW2hlYWRlclNpemUrK10gPSAoQnl0ZSkoZmlsZVNpemUgPj4gKDggKiBpKSk7DQorICAgIGlmIChvdXRTdHJlYW0tPldyaXRlKG91dFN0cmVhbSwgaGVhZGVyLCBoZWFkZXJTaXplKSAhPSBoZWFkZXJTaXplKQ0KKyAgICAgIHJlcyA9IFNaX0VSUk9SX1dSSVRFOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBpZiAocmVzID09IFNaX09LKQ0KKyAgICAgICAgcmVzID0gTHptYUVuY19FbmNvZGUoZW5jLCBvdXRTdHJlYW0sIGluU3RyZWFtLCBOVUxMLCAmZ19BbGxvYywgJmdfQWxsb2MpOw0KKyAgICB9DQorICB9DQorICBMem1hRW5jX0Rlc3Ryb3koZW5jLCAmZ19BbGxvYywgJmdfQWxsb2MpOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQoraW50IG1haW4yKGludCBudW1BcmdzLCBjb25zdCBjaGFyICphcmdzW10sIGNoYXIgKnJzKQ0KK3sNCisgIENGaWxlU2VxSW5TdHJlYW0gaW5TdHJlYW07DQorICBDRmlsZU91dFN0cmVhbSBvdXRTdHJlYW07DQorICBjaGFyIGM7DQorICBpbnQgcmVzOw0KKyAgaW50IGVuY29kZU1vZGU7DQorICBCb29sIHVzZU91dEZpbGUgPSBGYWxzZTsNCisNCisgIEZpbGVTZXFJblN0cmVhbV9DcmVhdGVWVGFibGUoJmluU3RyZWFtKTsNCisgIEZpbGVfQ29uc3RydWN0KCZpblN0cmVhbS5maWxlKTsNCisNCisgIEZpbGVPdXRTdHJlYW1fQ3JlYXRlVlRhYmxlKCZvdXRTdHJlYW0pOw0KKyAgRmlsZV9Db25zdHJ1Y3QoJm91dFN0cmVhbS5maWxlKTsNCisNCisgIGlmIChudW1BcmdzID09IDEpDQorICB7DQorICAgIFByaW50SGVscChycyk7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKw0KKyAgaWYgKG51bUFyZ3MgPCAzIHx8IG51bUFyZ3MgPiA0IHx8IHN0cmxlbihhcmdzWzFdKSAhPSAxKQ0KKyAgICByZXR1cm4gUHJpbnRVc2VyRXJyb3IocnMpOw0KKw0KKyAgYyA9IGFyZ3NbMV1bMF07DQorICBlbmNvZGVNb2RlID0gKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKTsNCisgIGlmICghZW5jb2RlTW9kZSAmJiBjICE9ICdkJyAmJiBjICE9ICdEJykNCisgICAgcmV0dXJuIFByaW50VXNlckVycm9yKHJzKTsNCisNCisgIHsNCisgICAgc2l6ZV90IHQ0ID0gc2l6ZW9mKFVJbnQzMik7DQorICAgIHNpemVfdCB0OCA9IHNpemVvZihVSW50NjQpOw0KKyAgICBpZiAodDQgIT0gNCB8fCB0OCAhPSA4KQ0KKyAgICAgIHJldHVybiBQcmludEVycm9yKHJzLCAiSW5jb3JyZWN0IFVJbnQzMiBvciBVSW50NjQiKTsNCisgIH0NCisNCisgIGlmIChJbkZpbGVfT3BlbigmaW5TdHJlYW0uZmlsZSwgYXJnc1syXSkgIT0gMCkNCisgICAgcmV0dXJuIFByaW50RXJyb3IocnMsICJDYW4gbm90IG9wZW4gaW5wdXQgZmlsZSIpOw0KKw0KKyAgaWYgKG51bUFyZ3MgPiAzKQ0KKyAgew0KKyAgICB1c2VPdXRGaWxlID0gVHJ1ZTsNCisgICAgaWYgKE91dEZpbGVfT3Blbigmb3V0U3RyZWFtLmZpbGUsIGFyZ3NbM10pICE9IDApDQorICAgICAgcmV0dXJuIFByaW50RXJyb3IocnMsICJDYW4gbm90IG9wZW4gb3V0cHV0IGZpbGUiKTsNCisgIH0NCisgIGVsc2UgaWYgKGVuY29kZU1vZGUpDQorICAgIFByaW50VXNlckVycm9yKHJzKTsNCisNCisgIGlmIChlbmNvZGVNb2RlKQ0KKyAgew0KKyAgICBVSW50NjQgZmlsZVNpemU7DQorICAgIEZpbGVfR2V0TGVuZ3RoKCZpblN0cmVhbS5maWxlLCAmZmlsZVNpemUpOw0KKyAgICByZXMgPSBFbmNvZGUoJm91dFN0cmVhbS5zLCAmaW5TdHJlYW0ucywgZmlsZVNpemUsIHJzKTsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgcmVzID0gRGVjb2RlKCZvdXRTdHJlYW0ucywgdXNlT3V0RmlsZSA/ICZpblN0cmVhbS5zIDogTlVMTCk7DQorICB9DQorDQorICBpZiAodXNlT3V0RmlsZSkNCisgICAgRmlsZV9DbG9zZSgmb3V0U3RyZWFtLmZpbGUpOw0KKyAgRmlsZV9DbG9zZSgmaW5TdHJlYW0uZmlsZSk7DQorDQorICBpZiAocmVzICE9IFNaX09LKQ0KKyAgew0KKyAgICBpZiAocmVzID09IFNaX0VSUk9SX01FTSkNCisgICAgICByZXR1cm4gUHJpbnRFcnJvcihycywga0NhbnRBbGxvY2F0ZU1lc3NhZ2UpOw0KKyAgICBlbHNlIGlmIChyZXMgPT0gU1pfRVJST1JfREFUQSkNCisgICAgICByZXR1cm4gUHJpbnRFcnJvcihycywga0RhdGFFcnJvck1lc3NhZ2UpOw0KKyAgICBlbHNlIGlmIChyZXMgPT0gU1pfRVJST1JfV1JJVEUpDQorICAgICAgcmV0dXJuIFByaW50RXJyb3IocnMsIGtDYW50V3JpdGVNZXNzYWdlKTsNCisgICAgZWxzZSBpZiAocmVzID09IFNaX0VSUk9SX1JFQUQpDQorICAgICAgcmV0dXJuIFByaW50RXJyb3IocnMsIGtDYW50UmVhZE1lc3NhZ2UpOw0KKyAgICByZXR1cm4gUHJpbnRFcnJvck51bWJlcihycywgcmVzKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCitpbnQgTVlfQ0RFQ0wgbWFpbihpbnQgbnVtQXJncywgY29uc3QgY2hhciAqYXJnc1tdKQ0KK3sNCisgIGNoYXIgcnNbODAwXSA9IHsgMCB9Ow0KKyAgaW50IHJlcyA9IG1haW4yKG51bUFyZ3MsIGFyZ3MsIHJzKTsNCisgIGZwdXRzKHJzLCBzdGRvdXQpOw0KKyAgcmV0dXJuIHJlczsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DL1V0aWwvTHptYS9Mem1hVXRpbC5kc3AgYi9sem1hL0MvVXRpbC9Mem1hL0x6bWFVdGlsLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjFmMGNiCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL1V0aWwvTHptYS9Mem1hVXRpbC5kc3AKQEAgLTAsMCArMSwxNjggQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iTHptYVV0aWwiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz1Mem1hVXRpbCAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJMem1hVXRpbC5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiTHptYVV0aWwubWFrIiBDRkc9Ikx6bWFVdGlsIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgIkx6bWFVdGlsIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAiTHptYVV0aWwgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiTHptYVV0aWwgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XNCAvV1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWA0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDE5IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDE5IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2IC9vdXQ6ImM6XHV0aWxcN2x6bWEuZXhlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJMem1hVXRpbCAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1c0IC9XWCAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvRkQgL0daIC9jDQorIyBTVUJUUkFDVCBDUFAgL1lYDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MTkgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MTkgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6ImM6XHV0aWxcN2x6bWEuZXhlIiAvcGRidHlwZTpzZXB0DQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJMem1hVXRpbCAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJMem1hVXRpbCAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cN3pGaWxlLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cN3pGaWxlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cN3pTdHJlYW0uYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3elZlcnNpb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBbGxvYy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFsbG9jLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ3B1QXJjaC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEx6RmluZC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEx6RmluZC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEx6RmluZE10LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cTHpGaW5kTXQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxMekhhc2guaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxMem1hRGVjLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cTHptYURlYy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEx6bWFFbmMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxMem1hRW5jLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxMem1hVXRpbC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFRocmVhZHMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxUaHJlYWRzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVHlwZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2x6bWEvQy9VdGlsL0x6bWEvTHptYVV0aWwuZHN3IGIvbHptYS9DL1V0aWwvTHptYS9Mem1hVXRpbC5kc3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzNTQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9VdGlsL0x6bWEvTHptYVV0aWwuZHN3CkBAIC0wLDAgKzEsMjkgQEAKK01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSENCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIkx6bWFVdGlsIj0uXEx6bWFVdGlsLmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitHbG9iYWw6DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTwzPg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCmRpZmYgLS1naXQgYS9sem1hL0MvVXRpbC9Mem1hL21ha2VmaWxlIGIvbHptYS9DL1V0aWwvTHptYS9tYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjgyNWYyCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL1V0aWwvTHptYS9tYWtlZmlsZQpAQCAtMCwwICsxLDI4IEBACisjIE1ZX1NUQVRJQ19MSU5LPTENCitQUk9HID0gTFpNQWMuZXhlDQorDQorQ0ZMQUdTID0gJChDRkxBR1MpIFwNCisNCitMSUJfT0JKUyA9IFwNCisgICRPXEx6bWFVdGlsLm9iaiBcDQorDQorQ19PQkpTID0gXA0KKyAgJE9cQWxsb2Mub2JqIFwNCisgICRPXEx6RmluZC5vYmogXA0KKyAgJE9cTHpGaW5kTXQub2JqIFwNCisgICRPXEx6bWFEZWMub2JqIFwNCisgICRPXEx6bWFFbmMub2JqIFwNCisgICRPXDd6RmlsZS5vYmogXA0KKyAgJE9cN3pTdHJlYW0ub2JqIFwNCisgICRPXFRocmVhZHMub2JqIFwNCisNCitPQkpTID0gXA0KKyAgJChMSUJfT0JKUykgXA0KKyAgJChDX09CSlMpIFwNCisNCishaW5jbHVkZSAiLi4vLi4vLi4vQ1BQL0J1aWxkLm1hayINCisNCiskKExJQl9PQkpTKTogJCgqQikuYw0KKwkkKENPTVBMX08yKQ0KKyQoQ19PQkpTKTogLi4vLi4vJCgqQikuYw0KKwkkKENPTVBMX08yKQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9VdGlsL0x6bWEvbWFrZWZpbGUuZ2NjIGIvbHptYS9DL1V0aWwvTHptYS9tYWtlZmlsZS5nY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhNzJiYgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9VdGlsL0x6bWEvbWFrZWZpbGUuZ2NjCkBAIC0wLDAgKzEsNDQgQEAKK1BST0cgPSBsem1hDQorQ1hYID0gZysrDQorTElCID0NCitSTSA9IHJtIC1mDQorQ0ZMQUdTID0gLWMgLU8yIC1XYWxsIC1EXzdaSVBfU1QNCisNCitPQkpTID0gXA0KKyAgTHptYVV0aWwubyBcDQorICBBbGxvYy5vIFwNCisgIEx6RmluZC5vIFwNCisgIEx6bWFEZWMubyBcDQorICBMem1hRW5jLm8gXA0KKyAgN3pGaWxlLm8gXA0KKyAgN3pTdHJlYW0ubyBcDQorDQorDQorYWxsOiAkKFBST0cpDQorDQorJChQUk9HKTogJChPQkpTKQ0KKwkkKENYWCkgLW8gJChQUk9HKSAkKExERkxBR1MpICQoT0JKUykgJChMSUIpICQoTElCMikNCisNCitMem1hVXRpbC5vOiBMem1hVXRpbC5jDQorCSQoQ1hYKSAkKENGTEFHUykgTHptYVV0aWwuYw0KKw0KK0FsbG9jLm86IC4uLy4uL0FsbG9jLmMNCisJJChDWFgpICQoQ0ZMQUdTKSAuLi8uLi9BbGxvYy5jDQorDQorTHpGaW5kLm86IC4uLy4uL0x6RmluZC5jDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vTHpGaW5kLmMNCisNCitMem1hRGVjLm86IC4uLy4uL0x6bWFEZWMuYw0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uL0x6bWFEZWMuYw0KKw0KK0x6bWFFbmMubzogLi4vLi4vTHptYUVuYy5jDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vTHptYUVuYy5jDQorDQorN3pGaWxlLm86IC4uLy4uLzd6RmlsZS5jDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vN3pGaWxlLmMNCisNCis3elN0cmVhbS5vOiAuLi8uLi83elN0cmVhbS5jDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vN3pTdHJlYW0uYw0KKw0KK2NsZWFuOg0KKwktJChSTSkgJChQUk9HKSAkKE9CSlMpDQpkaWZmIC0tZ2l0IGEvbHptYS9DL1V0aWwvTHptYUxpYi9Mem1hTGliLmRlZiBiL2x6bWEvQy9VdGlsL0x6bWFMaWIvTHptYUxpYi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiOTU5NwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9VdGlsL0x6bWFMaWIvTHptYUxpYi5kZWYKQEAgLTAsMCArMSw0IEBACitFWFBPUlRTDQorICBMem1hQ29tcHJlc3MNCisgIEx6bWFVbmNvbXByZXNzDQorDQpkaWZmIC0tZ2l0IGEvbHptYS9DL1V0aWwvTHptYUxpYi9Mem1hTGliLmRzcCBiL2x6bWEvQy9VdGlsL0x6bWFMaWIvTHptYUxpYi5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0Yzk4MQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9VdGlsL0x6bWFMaWIvTHptYUxpYi5kc3AKQEAgLTAsMCArMSwxNzggQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iTHptYUxpYiIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMg0KKw0KK0NGRz1Mem1hTGliIC0gV2luMzIgRGVidWcNCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIkx6bWFMaWIubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIkx6bWFMaWIubWFrIiBDRkc9Ikx6bWFMaWIgLSBXaW4zMiBEZWJ1ZyINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAiTHptYUxpYiAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJMem1hTGliIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK01UTD1taWRsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJMem1hTGliIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiTFpNQUxJQl9FWFBPUlRTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL0dyIC9NVCAvVzMgL08yIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiTFpNQUxJQl9FWFBPUlRTIiAvRkQgL2MNCisjIFNVQlRSQUNUIENQUCAvWVgNCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MTkgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MTkgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4NiAvb3V0OiJDOlxVdGlsXExaTUEuZGxsIiAvb3B0Ok5PV0lOOTgNCisjIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiTHptYUxpYiAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiTFpNQUxJQl9FWFBPUlRTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvWkkgL09kIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJfVVNSRExMIiAvRCAiTFpNQUxJQl9FWFBPUlRTIiAvRCAiQ09NUFJFU1NfTUZfTVQiIC9GRCAvR1ogL2MNCisjIFNVQlRSQUNUIENQUCAvWVgNCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MTkgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MTkgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiQzpcVXRpbFxMWk1BLmRsbCIgL3BkYnR5cGU6c2VwdA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiTHptYUxpYiAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJMem1hTGliIC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiU3BlYyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cTHptYUxpYi5kZWYNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxMem1hTGliRXhwb3J0cy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cN3pUeXBlcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFsbG9jLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQWxsb2MuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxJU3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cTHpGaW5kLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cTHpGaW5kLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cTHpGaW5kTXQuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxMekZpbmRNdC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEx6SGFzaC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEx6bWFEZWMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxMem1hRGVjLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cTHptYUVuYy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEx6bWFFbmMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxMem1hTGliLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cTHptYUxpYi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5ccmVzb3VyY2UucmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVGhyZWFkcy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFRocmVhZHMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2x6bWEvQy9VdGlsL0x6bWFMaWIvTHptYUxpYi5kc3cgYi9sem1hL0MvVXRpbC9Mem1hTGliL0x6bWFMaWIuZHN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YzU1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvVXRpbC9Mem1hTGliL0x6bWFMaWIuZHN3CkBAIC0wLDAgKzEsMjkgQEAKK01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSENCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIkx6bWFMaWIiPS5cTHptYUxpYi5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorR2xvYmFsOg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08Mz4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQpkaWZmIC0tZ2l0IGEvbHptYS9DL1V0aWwvTHptYUxpYi9Mem1hTGliRXhwb3J0cy5jIGIvbHptYS9DL1V0aWwvTHptYUxpYi9Mem1hTGliRXhwb3J0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MzQ1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvVXRpbC9Mem1hTGliL0x6bWFMaWJFeHBvcnRzLmMKQEAgLTAsMCArMSwxMiBAQAorLyogTHptYUxpYkV4cG9ydHMuYyAtLSBMWk1BIGxpYnJhcnkgRExMIEVudHJ5IHBvaW50DQorMjAwOC0xMC0wNCA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlIDx3aW5kb3dzLmg+DQorDQorQk9PTCBXSU5BUEkgRGxsTWFpbihISU5TVEFOQ0UgaEluc3RhbmNlLCBEV09SRCBkd1JlYXNvbiwgTFBWT0lEIGxwUmVzZXJ2ZWQpDQorew0KKyAgaEluc3RhbmNlID0gaEluc3RhbmNlOw0KKyAgZHdSZWFzb24gPSBkd1JlYXNvbjsNCisgIGxwUmVzZXJ2ZWQgPSBscFJlc2VydmVkOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9VdGlsL0x6bWFMaWIvbWFrZWZpbGUgYi9sem1hL0MvVXRpbC9Mem1hTGliL21ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjMxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvVXRpbC9Mem1hTGliL21ha2VmaWxlCkBAIC0wLDAgKzEsMzQgQEAKK01ZX1NUQVRJQ19MSU5LPTENCitTTElCID0gc0xaTUEubGliDQorUFJPRyA9IExaTUEuZGxsDQorU0xJQlBBVEggPSAkT1wkKFNMSUIpDQorDQorREVGX0ZJTEUgPSBMem1hTGliLmRlZg0KK0NGTEFHUyA9ICQoQ0ZMQUdTKSBcDQorDQorTElCX09CSlMgPSBcDQorICAkT1xMem1hTGliRXhwb3J0cy5vYmogXA0KKw0KK0NfT0JKUyA9IFwNCisgICRPXEFsbG9jLm9iaiBcDQorICAkT1xMekZpbmQub2JqIFwNCisgICRPXEx6RmluZE10Lm9iaiBcDQorICAkT1xMem1hRGVjLm9iaiBcDQorICAkT1xMem1hRW5jLm9iaiBcDQorICAkT1xMem1hTGliLm9iaiBcDQorICAkT1xUaHJlYWRzLm9iaiBcDQorDQorT0JKUyA9IFwNCisgICQoTElCX09CSlMpIFwNCisgICQoQ19PQkpTKSBcDQorICAkT1xyZXNvdXJjZS5yZXMNCisNCishaW5jbHVkZSAiLi4vLi4vLi4vQ1BQL0J1aWxkLm1hayINCisNCiskKFNMSUJQQVRIKTogJE8gJChPQkpTKQ0KKwlsaWIgLW91dDokKFNMSUJQQVRIKSAkKE9CSlMpICQoTElCUykNCisNCiskKExJQl9PQkpTKTogJCgqQikuYw0KKwkkKENPTVBMX08yKQ0KKyQoQ19PQkpTKTogLi4vLi4vJCgqQikuYw0KKwkkKENPTVBMX08yKQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9VdGlsL0x6bWFMaWIvcmVzb3VyY2UucmMgYi9sem1hL0MvVXRpbC9Mem1hTGliL3Jlc291cmNlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NWUzZjMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvVXRpbC9Mem1hTGliL3Jlc291cmNlLnJjCkBAIC0wLDAgKzEsMyBAQAorI2luY2x1ZGUgIi4uLy4uLzd6VmVyc2lvbi5yYyINCisNCitNWV9WRVJTSU9OX0lORk9fRExMKCJMWk1BIGxpYnJhcnkiLCAiTFpNQSIpDQpkaWZmIC0tZ2l0IGEvbHptYS9DL1V0aWwvU2Z4U2V0dXAvUHJlY29tcC5jIGIvbHptYS9DL1V0aWwvU2Z4U2V0dXAvUHJlY29tcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YjYwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvVXRpbC9TZnhTZXR1cC9QcmVjb21wLmMKQEAgLTAsMCArMSw0IEBACisvKiBQcmVjb21wLmMgLS0gU3RkQWZ4DQorMjAxMy0wMS0yMSA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpbmNsdWRlICJQcmVjb21wLmgiDQpkaWZmIC0tZ2l0IGEvbHptYS9DL1V0aWwvU2Z4U2V0dXAvUHJlY29tcC5oIGIvbHptYS9DL1V0aWwvU2Z4U2V0dXAvUHJlY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMzk4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvVXRpbC9TZnhTZXR1cC9QcmVjb21wLmgKQEAgLTAsMCArMSwxMCBAQAorLyogUHJlY29tcC5oIC0tIFN0ZEFmeA0KKzIwMTMtMDYtMTYgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaWZuZGVmIF9fN1pfUFJFQ09NUF9IDQorI2RlZmluZSBfXzdaX1BSRUNPTVBfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21waWxlci5oIg0KKyNpbmNsdWRlICIuLi8uLi83elR5cGVzLmgiDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DL1V0aWwvU2Z4U2V0dXAvU2Z4U2V0dXAuYyBiL2x6bWEvQy9VdGlsL1NmeFNldHVwL1NmeFNldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxNGU0MwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9VdGlsL1NmeFNldHVwL1NmeFNldHVwLmMKQEAgLTAsMCArMSw2MTcgQEAKKy8qIFNmeFNldHVwLmMgLSA3eiBTRlggU2V0dXANCisyMDE0LTEyLTA3IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaWZuZGVmIFVOSUNPREUNCisjZGVmaW5lIFVOSUNPREUNCisjZW5kaWYNCisNCisjaWZuZGVmIF9VTklDT0RFDQorI2RlZmluZSBfVU5JQ09ERQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBfQ09OU09MRQ0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICIuLi8uLi83ei5oIg0KKyNpbmNsdWRlICIuLi8uLi83ekFsbG9jLmgiDQorI2luY2x1ZGUgIi4uLy4uLzd6Q3JjLmgiDQorI2luY2x1ZGUgIi4uLy4uLzd6RmlsZS5oIg0KKyNpbmNsdWRlICIuLi8uLi9DcHVBcmNoLmgiDQorDQorI2RlZmluZSBrX0VYRV9FeHRJbmRleCAyDQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtFeHRzW10gPQ0KK3sNCisgICAgImJhdCINCisgICwgImNtZCINCisgICwgImV4ZSINCisgICwgImluZiINCisgICwgIm1zaSINCisgICNpZmRlZiBVTkRFUl9DRQ0KKyAgLCAiY2FiIg0KKyAgI2VuZGlmDQorICAsICJodG1sIg0KKyAgLCAiaHRtIg0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtOYW1lc1tdID0NCit7DQorICAgICJzZXR1cCINCisgICwgImluc3RhbGwiDQorICAsICJydW4iDQorICAsICJzdGFydCINCit9Ow0KKw0KK3N0YXRpYyB1bnNpZ25lZCBGaW5kRXh0KGNvbnN0IHdjaGFyX3QgKnMsIHVuc2lnbmVkICpleHRMZW4pDQorew0KKyAgdW5zaWduZWQgbGVuID0gKHVuc2lnbmVkKXdjc2xlbihzKTsNCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSBsZW47IGkgPiAwOyBpLS0pDQorICB7DQorICAgIGlmIChzW2kgLSAxXSA9PSAnLicpDQorICAgIHsNCisgICAgICAqZXh0TGVuID0gbGVuIC0gaTsNCisgICAgICByZXR1cm4gaSAtIDE7DQorICAgIH0NCisgIH0NCisgICpleHRMZW4gPSAwOw0KKyAgcmV0dXJuIGxlbjsNCit9DQorDQorI2RlZmluZSBNQUtFX0NIQVJfVVBQRVIoYykgKCgoKGMpID49ICdhJyAmJiAoYykgPD0gJ3onKSA/IChjKSAtPSAweDIwIDogKGMpKSkNCisNCitzdGF0aWMgdW5zaWduZWQgRmluZEl0ZW0oY29uc3QgY2hhciAqKml0ZW1zLCB1bnNpZ25lZCBudW0sIGNvbnN0IHdjaGFyX3QgKnMsIHVuc2lnbmVkIGxlbikNCit7DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCBjaGFyICppdGVtID0gaXRlbXNbaV07DQorICAgIHVuc2lnbmVkIGl0ZW1MZW4gPSAodW5zaWduZWQpc3RybGVuKGl0ZW0pOw0KKyAgICB1bnNpZ25lZCBqOw0KKyAgICBpZiAobGVuICE9IGl0ZW1MZW4pDQorICAgICAgY29udGludWU7DQorICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIGMgPSBpdGVtW2pdOw0KKyAgICAgIGlmIChjICE9IHNbal0gJiYgTUFLRV9DSEFSX1VQUEVSKGMpICE9IHNbal0pDQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoaiA9PSBsZW4pDQorICAgICAgcmV0dXJuIGk7DQorICB9DQorICByZXR1cm4gaTsNCit9DQorDQorI2lmZGVmIF9DT05TT0xFDQorc3RhdGljIEJPT0wgV0lOQVBJIEhhbmRsZXJSb3V0aW5lKERXT1JEIGN0cmxUeXBlKQ0KK3sNCisgIGN0cmxUeXBlID0gY3RybFR5cGU7DQorICByZXR1cm4gVFJVRTsNCit9DQorI2VuZGlmDQorDQorc3RhdGljIHZvaWQgUHJpbnRFcnJvck1lc3NhZ2UoY29uc3QgY2hhciAqbWVzc2FnZSkNCit7DQorICAjaWZkZWYgX0NPTlNPTEUNCisgIHByaW50ZigiXG43LVppcCBFcnJvcjogJXNcbiIsIG1lc3NhZ2UpOw0KKyAgI2Vsc2UNCisgICNpZmRlZiBVTkRFUl9DRQ0KKyAgV0NIQVIgbWVzc2FnZVdbMjU2ICsgNF07DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IDI1NiAmJiBtZXNzYWdlW2ldICE9IDA7IGkrKykNCisgICAgbWVzc2FnZVdbaV0gPSBtZXNzYWdlW2ldOw0KKyAgbWVzc2FnZVdbaV0gPSAwOw0KKyAgTWVzc2FnZUJveFcoMCwgbWVzc2FnZVcsIEwiNy1aaXAgRXJyb3IiLCBNQl9JQ09ORVJST1IpOw0KKyAgI2Vsc2UNCisgIE1lc3NhZ2VCb3hBKDAsIG1lc3NhZ2UsICI3LVppcCBFcnJvciIsIE1CX0lDT05FUlJPUik7DQorICAjZW5kaWYNCisgICNlbmRpZg0KK30NCisNCitzdGF0aWMgV1JlcyBNeUNyZWF0ZURpcihjb25zdCBXQ0hBUiAqbmFtZSkNCit7DQorICByZXR1cm4gQ3JlYXRlRGlyZWN0b3J5VyhuYW1lLCBOVUxMKSA/IDAgOiBHZXRMYXN0RXJyb3IoKTsNCit9DQorDQorI2lmZGVmIFVOREVSX0NFDQorI2RlZmluZSBrQnVmZmVyU2l6ZSAoMSA8PCAxMykNCisjZWxzZQ0KKyNkZWZpbmUga0J1ZmZlclNpemUgKDEgPDwgMTUpDQorI2VuZGlmDQorDQorI2RlZmluZSBrU2lnbmF0dXJlU2VhcmNoTGltaXQgKDEgPDwgMjIpDQorDQorc3RhdGljIEJvb2wgRmluZFNpZ25hdHVyZShDU3pGaWxlICpzdHJlYW0sIFVJbnQ2NCAqcmVzUG9zKQ0KK3sNCisgIEJ5dGUgYnVmW2tCdWZmZXJTaXplXTsNCisgIHNpemVfdCBudW1QcmV2Qnl0ZXMgPSAwOw0KKyAgKnJlc1BvcyA9IDA7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBzaXplX3QgcHJvY2Vzc2VkLCBwb3M7DQorICAgIGlmICgqcmVzUG9zID4ga1NpZ25hdHVyZVNlYXJjaExpbWl0KQ0KKyAgICAgIHJldHVybiBGYWxzZTsNCisgICAgcHJvY2Vzc2VkID0ga0J1ZmZlclNpemUgLSBudW1QcmV2Qnl0ZXM7DQorICAgIGlmIChGaWxlX1JlYWQoc3RyZWFtLCBidWYgKyBudW1QcmV2Qnl0ZXMsICZwcm9jZXNzZWQpICE9IDApDQorICAgICAgcmV0dXJuIEZhbHNlOw0KKyAgICBwcm9jZXNzZWQgKz0gbnVtUHJldkJ5dGVzOw0KKyAgICBpZiAocHJvY2Vzc2VkIDwgazd6U3RhcnRIZWFkZXJTaXplIHx8DQorICAgICAgICAocHJvY2Vzc2VkID09IGs3elN0YXJ0SGVhZGVyU2l6ZSAmJiBudW1QcmV2Qnl0ZXMgIT0gMCkpDQorICAgICAgcmV0dXJuIEZhbHNlOw0KKyAgICBwcm9jZXNzZWQgLT0gazd6U3RhcnRIZWFkZXJTaXplOw0KKyAgICBmb3IgKHBvcyA9IDA7IHBvcyA8PSBwcm9jZXNzZWQ7IHBvcysrKQ0KKyAgICB7DQorICAgICAgZm9yICg7IGJ1Zltwb3NdICE9ICc3JyAmJiBwb3MgPD0gcHJvY2Vzc2VkOyBwb3MrKyk7DQorICAgICAgaWYgKHBvcyA+IHByb2Nlc3NlZCkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGlmIChtZW1jbXAoYnVmICsgcG9zLCBrN3pTaWduYXR1cmUsIGs3elNpZ25hdHVyZVNpemUpID09IDApDQorICAgICAgICBpZiAoQ3JjQ2FsYyhidWYgKyBwb3MgKyAxMiwgMjApID09IEdldFVpMzIoYnVmICsgcG9zICsgOCkpDQorICAgICAgICB7DQorICAgICAgICAgICpyZXNQb3MgKz0gcG9zOw0KKyAgICAgICAgICByZXR1cm4gVHJ1ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICAqcmVzUG9zICs9IHByb2Nlc3NlZDsNCisgICAgbnVtUHJldkJ5dGVzID0gazd6U3RhcnRIZWFkZXJTaXplOw0KKyAgICBtZW1tb3ZlKGJ1ZiwgYnVmICsgcHJvY2Vzc2VkLCBrN3pTdGFydEhlYWRlclNpemUpOw0KKyAgfQ0KK30NCisNCitzdGF0aWMgQm9vbCBEb2VzRmlsZU9yRGlyRXhpc3QoY29uc3QgV0NIQVIgKnBhdGgpDQorew0KKyAgV0lOMzJfRklORF9EQVRBVyBmZDsNCisgIEhBTkRMRSBoYW5kbGU7DQorICBoYW5kbGUgPSBGaW5kRmlyc3RGaWxlVyhwYXRoLCAmZmQpOw0KKyAgaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkNCisgICAgcmV0dXJuIEZhbHNlOw0KKyAgRmluZENsb3NlKGhhbmRsZSk7DQorICByZXR1cm4gVHJ1ZTsNCit9DQorDQorc3RhdGljIFdSZXMgUmVtb3ZlRGlyV2l0aFN1Ykl0ZW1zKFdDSEFSICpwYXRoKQ0KK3sNCisgIFdJTjMyX0ZJTkRfREFUQVcgZmQ7DQorICBIQU5ETEUgaGFuZGxlOw0KKyAgV1JlcyByZXMgPSAwOw0KKyAgc2l6ZV90IGxlbiA9IHdjc2xlbihwYXRoKTsNCisgIHdjc2NweShwYXRoICsgbGVuLCBMIioiKTsNCisgIGhhbmRsZSA9IEZpbmRGaXJzdEZpbGVXKHBhdGgsICZmZCk7DQorICBwYXRoW2xlbl0gPSBMJ1wwJzsNCisgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpDQorICAgIHJldHVybiBHZXRMYXN0RXJyb3IoKTsNCisgIGZvciAoOzspDQorICB7DQorICAgIGlmICh3Y3NjbXAoZmQuY0ZpbGVOYW1lLCBMIi4iKSAhPSAwICYmDQorICAgICAgICB3Y3NjbXAoZmQuY0ZpbGVOYW1lLCBMIi4uIikgIT0gMCkNCisgICAgew0KKyAgICAgIHdjc2NweShwYXRoICsgbGVuLCBmZC5jRmlsZU5hbWUpOw0KKyAgICAgIGlmICgoZmQuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgIT0gMCkNCisgICAgICB7DQorICAgICAgICB3Y3NjYXQocGF0aCwgV1NUUklOR19QQVRIX1NFUEFSQVRPUik7DQorICAgICAgICByZXMgPSBSZW1vdmVEaXJXaXRoU3ViSXRlbXMocGF0aCk7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBTZXRGaWxlQXR0cmlidXRlc1cocGF0aCwgMCk7DQorICAgICAgICBpZiAoRGVsZXRlRmlsZVcocGF0aCkgPT0gMCkNCisgICAgICAgICAgcmVzID0gR2V0TGFzdEVycm9yKCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXMgIT0gMCkNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmICghRmluZE5leHRGaWxlVyhoYW5kbGUsICZmZCkpDQorICAgIHsNCisgICAgICByZXMgPSBHZXRMYXN0RXJyb3IoKTsNCisgICAgICBpZiAocmVzID09IEVSUk9SX05PX01PUkVfRklMRVMpDQorICAgICAgICByZXMgPSAwOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBwYXRoW2xlbl0gPSBMJ1wwJzsNCisgIEZpbmRDbG9zZShoYW5kbGUpOw0KKyAgaWYgKHJlcyA9PSAwKQ0KKyAgew0KKyAgICBpZiAoIVJlbW92ZURpcmVjdG9yeVcocGF0aCkpDQorICAgICAgcmVzID0gR2V0TGFzdEVycm9yKCk7DQorICB9DQorICByZXR1cm4gcmVzOw0KK30NCisNCisjaWZkZWYgX0NPTlNPTEUNCitpbnQgTVlfQ0RFQ0wgbWFpbigpDQorI2Vsc2UNCitpbnQgQVBJRU5UUlkgV2luTWFpbihISU5TVEFOQ0UgaEluc3RhbmNlLCBISU5TVEFOQ0UgaFByZXZJbnN0YW5jZSwNCisgICNpZmRlZiBVTkRFUl9DRQ0KKyAgTFBXU1RSDQorICAjZWxzZQ0KKyAgTFBTVFINCisgICNlbmRpZg0KKyAgbHBDbWRMaW5lLCBpbnQgbkNtZFNob3cpDQorI2VuZGlmDQorew0KKyAgQ0ZpbGVJblN0cmVhbSBhcmNoaXZlU3RyZWFtOw0KKyAgQ0xvb2tUb1JlYWQgbG9va1N0cmVhbTsNCisgIENTekFyRXggZGI7DQorICBTUmVzIHJlcyA9IFNaX09LOw0KKyAgSVN6QWxsb2MgYWxsb2NJbXA7DQorICBJU3pBbGxvYyBhbGxvY1RlbXBJbXA7DQorICBXQ0hBUiBzZnhQYXRoW01BWF9QQVRIICsgMl07DQorICBXQ0hBUiBwYXRoW01BWF9QQVRIICogMyArIDJdOw0KKyAgI2lmbmRlZiBVTkRFUl9DRQ0KKyAgV0NIQVIgd29ya0N1ckRpcltNQVhfUEFUSCArIDMyXTsNCisgICNlbmRpZg0KKyAgc2l6ZV90IHBhdGhMZW47DQorICBEV09SRCB3aW5SZXM7DQorICBjb25zdCB3Y2hhcl90ICpjbWRMaW5lUGFyYW1zOw0KKyAgY29uc3QgY2hhciAqZXJyb3JNZXNzYWdlID0gTlVMTDsNCisgIEJvb2wgdXNlU2hlbGxFeGVjdXRlID0gVHJ1ZTsNCisNCisgICNpZmRlZiBfQ09OU09MRQ0KKyAgU2V0Q29uc29sZUN0cmxIYW5kbGVyKEhhbmRsZXJSb3V0aW5lLCBUUlVFKTsNCisgICNlbHNlDQorICBoSW5zdGFuY2UgPSBoSW5zdGFuY2U7DQorICBoUHJldkluc3RhbmNlID0gaFByZXZJbnN0YW5jZTsNCisgIGxwQ21kTGluZSA9IGxwQ21kTGluZTsNCisgIG5DbWRTaG93ID0gbkNtZFNob3c7DQorICAjZW5kaWYNCisNCisgIENyY0dlbmVyYXRlVGFibGUoKTsNCisNCisgIGFsbG9jSW1wLkFsbG9jID0gU3pBbGxvYzsNCisgIGFsbG9jSW1wLkZyZWUgPSBTekZyZWU7DQorDQorICBhbGxvY1RlbXBJbXAuQWxsb2MgPSBTekFsbG9jVGVtcDsNCisgIGFsbG9jVGVtcEltcC5GcmVlID0gU3pGcmVlVGVtcDsNCisNCisgIEZpbGVJblN0cmVhbV9DcmVhdGVWVGFibGUoJmFyY2hpdmVTdHJlYW0pOw0KKyAgTG9va1RvUmVhZF9DcmVhdGVWVGFibGUoJmxvb2tTdHJlYW0sIEZhbHNlKTsNCisgDQorICB3aW5SZXMgPSBHZXRNb2R1bGVGaWxlTmFtZVcoTlVMTCwgc2Z4UGF0aCwgTUFYX1BBVEgpOw0KKyAgaWYgKHdpblJlcyA9PSAwIHx8IHdpblJlcyA+IE1BWF9QQVRIKQ0KKyAgICByZXR1cm4gMTsNCisgIHsNCisgICAgY21kTGluZVBhcmFtcyA9IEdldENvbW1hbmRMaW5lVygpOw0KKyAgICAjaWZuZGVmIFVOREVSX0NFDQorICAgIHsNCisgICAgICBCb29sIHF1b3RlTW9kZSA9IEZhbHNlOw0KKyAgICAgIGZvciAoOzsgY21kTGluZVBhcmFtcysrKQ0KKyAgICAgIHsNCisgICAgICAgIHdjaGFyX3QgYyA9ICpjbWRMaW5lUGFyYW1zOw0KKyAgICAgICAgaWYgKGMgPT0gTCdcIicpDQorICAgICAgICAgIHF1b3RlTW9kZSA9ICFxdW90ZU1vZGU7DQorICAgICAgICBlbHNlIGlmIChjID09IDAgfHwgKGMgPT0gTCcgJyAmJiAhcXVvdGVNb2RlKSkNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgICNlbmRpZg0KKyAgfQ0KKw0KKyAgew0KKyAgICB1bnNpZ25lZCBpOw0KKyAgICBEV09SRCBkOw0KKyAgICB3aW5SZXMgPSBHZXRUZW1wUGF0aFcoTUFYX1BBVEgsIHBhdGgpOw0KKyAgICBpZiAod2luUmVzID09IDAgfHwgd2luUmVzID4gTUFYX1BBVEgpDQorICAgICAgcmV0dXJuIDE7DQorICAgIHBhdGhMZW4gPSB3Y3NsZW4ocGF0aCk7DQorICAgIGQgPSAoR2V0VGlja0NvdW50KCkgPDwgMTIpIF4gKEdldEN1cnJlbnRUaHJlYWRJZCgpIDw8IDE0KSBeIEdldEN1cnJlbnRQcm9jZXNzSWQoKTsNCisgICAgDQorICAgIGZvciAoaSA9IDA7OyBpKyssIGQgKz0gR2V0VGlja0NvdW50KCkpDQorICAgIHsNCisgICAgICBpZiAoaSA+PSAxMDApDQorICAgICAgew0KKyAgICAgICAgcmVzID0gU1pfRVJST1JfRkFJTDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICB3Y3NjcHkocGF0aCArIHBhdGhMZW4sIEwiN3oiKTsNCisNCisgICAgICB7DQorICAgICAgICB3Y2hhcl90ICpzID0gcGF0aCArIHdjc2xlbihwYXRoKTsNCisgICAgICAgIFVJbnQzMiB2YWx1ZSA9IGQ7DQorICAgICAgICB1bnNpZ25lZCBrOw0KKyAgICAgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykNCisgICAgICAgIHsNCisgICAgICAgICAgdW5zaWduZWQgdCA9IHZhbHVlICYgMHhGOw0KKyAgICAgICAgICB2YWx1ZSA+Pj0gNDsNCisgICAgICAgICAgc1s3IC0ga10gPSAoY2hhcikoKHQgPCAxMCkgPyAoJzAnICsgdCkgOiAoJ0EnICsgKHQgLSAxMCkpKTsNCisgICAgICAgIH0NCisgICAgICAgIHNba10gPSAnXDAnOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAoRG9lc0ZpbGVPckRpckV4aXN0KHBhdGgpKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgaWYgKENyZWF0ZURpcmVjdG9yeVcocGF0aCwgTlVMTCkpDQorICAgICAgew0KKyAgICAgICAgd2NzY2F0KHBhdGgsIFdTVFJJTkdfUEFUSF9TRVBBUkFUT1IpOw0KKyAgICAgICAgcGF0aExlbiA9IHdjc2xlbihwYXRoKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpZiAoR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfQUxSRUFEWV9FWElTVFMpDQorICAgICAgew0KKyAgICAgICAgcmVzID0gU1pfRVJST1JfRkFJTDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgI2lmbmRlZiBVTkRFUl9DRQ0KKyAgICB3Y3NjcHkod29ya0N1ckRpciwgcGF0aCk7DQorICAgICNlbmRpZg0KKyAgICBpZiAocmVzICE9IFNaX09LKQ0KKyAgICAgIGVycm9yTWVzc2FnZSA9ICJDYW4ndCBjcmVhdGUgdGVtcCBmb2xkZXIiOw0KKyAgfQ0KKw0KKyAgaWYgKHJlcyAhPSBTWl9PSykNCisgIHsNCisgICAgaWYgKCFlcnJvck1lc3NhZ2UpDQorICAgICAgZXJyb3JNZXNzYWdlID0gIkVycm9yIjsNCisgICAgUHJpbnRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorDQorICBpZiAoSW5GaWxlX09wZW5XKCZhcmNoaXZlU3RyZWFtLmZpbGUsIHNmeFBhdGgpICE9IDApDQorICB7DQorICAgIGVycm9yTWVzc2FnZSA9ICJjYW4gbm90IG9wZW4gaW5wdXQgZmlsZSI7DQorICAgIHJlcyA9IFNaX0VSUk9SX0ZBSUw7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIFVJbnQ2NCBwb3MgPSAwOw0KKyAgICBpZiAoIUZpbmRTaWduYXR1cmUoJmFyY2hpdmVTdHJlYW0uZmlsZSwgJnBvcykpDQorICAgICAgcmVzID0gU1pfRVJST1JfRkFJTDsNCisgICAgZWxzZSBpZiAoRmlsZV9TZWVrKCZhcmNoaXZlU3RyZWFtLmZpbGUsIChJbnQ2NCAqKSZwb3MsIFNaX1NFRUtfU0VUKSAhPSAwKQ0KKyAgICAgIHJlcyA9IFNaX0VSUk9SX0ZBSUw7DQorICAgIGlmIChyZXMgIT0gMCkNCisgICAgICBlcnJvck1lc3NhZ2UgPSAiQ2FuJ3QgZmluZCA3eiBhcmNoaXZlIjsNCisgIH0NCisNCisgIGlmIChyZXMgPT0gU1pfT0spDQorICB7DQorICAgIGxvb2tTdHJlYW0ucmVhbFN0cmVhbSA9ICZhcmNoaXZlU3RyZWFtLnM7DQorICAgIExvb2tUb1JlYWRfSW5pdCgmbG9va1N0cmVhbSk7DQorICB9DQorDQorICBTekFyRXhfSW5pdCgmZGIpOw0KKyAgaWYgKHJlcyA9PSBTWl9PSykNCisgIHsNCisgICAgcmVzID0gU3pBckV4X09wZW4oJmRiLCAmbG9va1N0cmVhbS5zLCAmYWxsb2NJbXAsICZhbGxvY1RlbXBJbXApOw0KKyAgfQ0KKyAgDQorICBpZiAocmVzID09IFNaX09LKQ0KKyAgew0KKyAgICBVSW50MzIgZXhlY3V0ZUZpbGVJbmRleCA9IChVSW50MzIpKEludDMyKS0xOw0KKyAgICBVSW50MzIgbWluUHJpY2UgPSAxIDw8IDMwOw0KKyAgICBVSW50MzIgaTsNCisgICAgVUludDMyIGJsb2NrSW5kZXggPSAweEZGRkZGRkZGOyAvKiBpdCBjYW4gaGF2ZSBhbnkgdmFsdWUgYmVmb3JlIGZpcnN0IGNhbGwgKGlmIG91dEJ1ZmZlciA9IDApICovDQorICAgIEJ5dGUgKm91dEJ1ZmZlciA9IDA7IC8qIGl0IG11c3QgYmUgMCBiZWZvcmUgZmlyc3QgY2FsbCBmb3IgZWFjaCBuZXcgYXJjaGl2ZS4gKi8NCisgICAgc2l6ZV90IG91dEJ1ZmZlclNpemUgPSAwOyAgLyogaXQgY2FuIGhhdmUgYW55IHZhbHVlIGJlZm9yZSBmaXJzdCBjYWxsIChpZiBvdXRCdWZmZXIgPSAwKSAqLw0KKyAgICANCisgICAgZm9yIChpID0gMDsgaSA8IGRiLk51bUZpbGVzOyBpKyspDQorICAgIHsNCisgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsNCisgICAgICBzaXplX3Qgb3V0U2l6ZVByb2Nlc3NlZCA9IDA7DQorICAgICAgc2l6ZV90IGxlbjsNCisgICAgICBXQ0hBUiAqdGVtcDsNCisgICAgICBsZW4gPSBTekFyRXhfR2V0RmlsZU5hbWVVdGYxNigmZGIsIGksIE5VTEwpOw0KKyAgICAgIA0KKyAgICAgIGlmIChsZW4gPj0gTUFYX1BBVEgpDQorICAgICAgew0KKyAgICAgICAgcmVzID0gU1pfRVJST1JfRkFJTDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICB0ZW1wID0gcGF0aCArIHBhdGhMZW47DQorICAgICAgDQorICAgICAgU3pBckV4X0dldEZpbGVOYW1lVXRmMTYoJmRiLCBpLCB0ZW1wKTsNCisgICAgICB7DQorICAgICAgICByZXMgPSBTekFyRXhfRXh0cmFjdCgmZGIsICZsb29rU3RyZWFtLnMsIGksDQorICAgICAgICAgICZibG9ja0luZGV4LCAmb3V0QnVmZmVyLCAmb3V0QnVmZmVyU2l6ZSwNCisgICAgICAgICAgJm9mZnNldCwgJm91dFNpemVQcm9jZXNzZWQsDQorICAgICAgICAgICZhbGxvY0ltcCwgJmFsbG9jVGVtcEltcCk7DQorICAgICAgICBpZiAocmVzICE9IFNaX09LKQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgQ1N6RmlsZSBvdXRGaWxlOw0KKyAgICAgICAgc2l6ZV90IHByb2Nlc3NlZFNpemU7DQorICAgICAgICBzaXplX3QgajsNCisgICAgICAgIHNpemVfdCBuYW1lU3RhcnRQb3MgPSAwOw0KKyAgICAgICAgZm9yIChqID0gMDsgdGVtcFtqXSAhPSAwOyBqKyspDQorICAgICAgICB7DQorICAgICAgICAgIGlmICh0ZW1wW2pdID09ICcvJykNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIHRlbXBbal0gPSAwOw0KKyAgICAgICAgICAgIE15Q3JlYXRlRGlyKHBhdGgpOw0KKyAgICAgICAgICAgIHRlbXBbal0gPSBDSEFSX1BBVEhfU0VQQVJBVE9SOw0KKyAgICAgICAgICAgIG5hbWVTdGFydFBvcyA9IGogKyAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoU3pBckV4X0lzRGlyKCZkYiwgaSkpDQorICAgICAgICB7DQorICAgICAgICAgIE15Q3JlYXRlRGlyKHBhdGgpOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgdW5zaWduZWQgZXh0TGVuOw0KKyAgICAgICAgICBjb25zdCBXQ0hBUiAqbmFtZSA9IHRlbXAgKyBuYW1lU3RhcnRQb3M7DQorICAgICAgICAgIHVuc2lnbmVkIGxlbiA9ICh1bnNpZ25lZCl3Y3NsZW4obmFtZSk7DQorICAgICAgICAgIHVuc2lnbmVkIG5hbWVMZW4gPSBGaW5kRXh0KHRlbXAgKyBuYW1lU3RhcnRQb3MsICZleHRMZW4pOw0KKyAgICAgICAgICB1bnNpZ25lZCBleHRQcmljZSA9IEZpbmRJdGVtKGtFeHRzLCBzaXplb2Yoa0V4dHMpIC8gc2l6ZW9mKGtFeHRzWzBdKSwgbmFtZSArIGxlbiAtIGV4dExlbiwgZXh0TGVuKTsNCisgICAgICAgICAgdW5zaWduZWQgbmFtZVByaWNlID0gRmluZEl0ZW0oa05hbWVzLCBzaXplb2Yoa05hbWVzKSAvIHNpemVvZihrTmFtZXNbMF0pLCBuYW1lLCBuYW1lTGVuKTsNCisNCisgICAgICAgICAgdW5zaWduZWQgcHJpY2UgPSBuYW1lUHJpY2UgKyBleHRQcmljZSAqIDY0ICsgKG5hbWVTdGFydFBvcyA9PSAwID8gMCA6ICgxIDw8IDEyKSk7DQorICAgICAgICAgIGlmIChtaW5QcmljZSA+IHByaWNlKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgbWluUHJpY2UgPSBwcmljZTsNCisgICAgICAgICAgICBleGVjdXRlRmlsZUluZGV4ID0gaTsNCisgICAgICAgICAgICB1c2VTaGVsbEV4ZWN1dGUgPSAoZXh0UHJpY2UgIT0ga19FWEVfRXh0SW5kZXgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgDQorICAgICAgICAgIGlmIChEb2VzRmlsZU9yRGlyRXhpc3QocGF0aCkpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAiRHVwbGljYXRlIGZpbGUiOw0KKyAgICAgICAgICAgIHJlcyA9IFNaX0VSUk9SX0ZBSUw7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKE91dEZpbGVfT3BlblcoJm91dEZpbGUsIHBhdGgpKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gIkNhbid0IG9wZW4gb3V0cHV0IGZpbGUiOw0KKyAgICAgICAgICAgIHJlcyA9IFNaX0VSUk9SX0ZBSUw7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgIA0KKyAgICAgICAgcHJvY2Vzc2VkU2l6ZSA9IG91dFNpemVQcm9jZXNzZWQ7DQorICAgICAgICBpZiAoRmlsZV9Xcml0ZSgmb3V0RmlsZSwgb3V0QnVmZmVyICsgb2Zmc2V0LCAmcHJvY2Vzc2VkU2l6ZSkgIT0gMCB8fCBwcm9jZXNzZWRTaXplICE9IG91dFNpemVQcm9jZXNzZWQpDQorICAgICAgICB7DQorICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICJDYW4ndCB3cml0ZSBvdXRwdXQgZmlsZSI7DQorICAgICAgICAgIHJlcyA9IFNaX0VSUk9SX0ZBSUw7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgICNpZmRlZiBVU0VfV0lORE9XU19GSUxFDQorICAgICAgICBpZiAoU3pCaXRXaXRoVmFsc19DaGVjaygmZGIuTVRpbWUsIGkpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBjb25zdCBDTnRmc0ZpbGVUaW1lICp0ID0gZGIuTVRpbWUuVmFscyArIGk7DQorICAgICAgICAgIEZJTEVUSU1FIG1UaW1lOw0KKyAgICAgICAgICBtVGltZS5kd0xvd0RhdGVUaW1lID0gdC0+TG93Ow0KKyAgICAgICAgICBtVGltZS5kd0hpZ2hEYXRlVGltZSA9IHQtPkhpZ2g7DQorICAgICAgICAgIFNldEZpbGVUaW1lKG91dEZpbGUuaGFuZGxlLCBOVUxMLCBOVUxMLCAmbVRpbWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZGlmDQorICAgICAgICANCisgICAgICAgIHsNCisgICAgICAgICAgU1JlcyByZXMyID0gRmlsZV9DbG9zZSgmb3V0RmlsZSk7DQorICAgICAgICAgIGlmIChyZXMgIT0gU1pfT0spDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGlmIChyZXMyICE9IFNaX09LKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgcmVzID0gcmVzMjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgI2lmZGVmIFVTRV9XSU5ET1dTX0ZJTEUNCisgICAgICAgIGlmIChTekJpdFdpdGhWYWxzX0NoZWNrKCZkYi5BdHRyaWJzLCBpKSkNCisgICAgICAgICAgU2V0RmlsZUF0dHJpYnV0ZXNXKHBhdGgsIGRiLkF0dHJpYnMuVmFsc1tpXSk7DQorICAgICAgICAjZW5kaWYNCisgICAgICB9DQorICAgIH0NCisNCisgICAgaWYgKHJlcyA9PSBTWl9PSykNCisgICAgew0KKyAgICAgIGlmIChleGVjdXRlRmlsZUluZGV4ID09IChVSW50MzIpKEludDMyKS0xKQ0KKyAgICAgIHsNCisgICAgICAgIGVycm9yTWVzc2FnZSA9ICJUaGVyZSBpcyBubyBmaWxlIHRvIGV4ZWN1dGUiOw0KKyAgICAgICAgcmVzID0gU1pfRVJST1JfRkFJTDsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIFdDSEFSICp0ZW1wID0gcGF0aCArIHBhdGhMZW47DQorICAgICAgICBVSW50MzIgajsNCisgICAgICAgIFN6QXJFeF9HZXRGaWxlTmFtZVV0ZjE2KCZkYiwgZXhlY3V0ZUZpbGVJbmRleCwgdGVtcCk7DQorICAgICAgICBmb3IgKGogPSAwOyB0ZW1wW2pdICE9IDA7IGorKykNCisgICAgICAgICAgaWYgKHRlbXBbal0gPT0gJy8nKQ0KKyAgICAgICAgICAgIHRlbXBbal0gPSBDSEFSX1BBVEhfU0VQQVJBVE9SOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBJQWxsb2NfRnJlZSgmYWxsb2NJbXAsIG91dEJ1ZmZlcik7DQorICB9DQorICBTekFyRXhfRnJlZSgmZGIsICZhbGxvY0ltcCk7DQorDQorICBGaWxlX0Nsb3NlKCZhcmNoaXZlU3RyZWFtLmZpbGUpOw0KKw0KKyAgaWYgKHJlcyA9PSBTWl9PSykNCisgIHsNCisgICAgSEFORExFIGhQcm9jZXNzID0gMDsNCisgICAgDQorICAgICNpZm5kZWYgVU5ERVJfQ0UNCisgICAgV0NIQVIgb2xkQ3VyRGlyW01BWF9QQVRIICsgMl07DQorICAgIG9sZEN1ckRpclswXSA9IDA7DQorICAgIHsNCisgICAgICBEV09SRCBuZWVkTGVuID0gR2V0Q3VycmVudERpcmVjdG9yeShNQVhfUEFUSCArIDEsIG9sZEN1ckRpcik7DQorICAgICAgaWYgKG5lZWRMZW4gPT0gMCB8fCBuZWVkTGVuID4gTUFYX1BBVEgpDQorICAgICAgICBvbGRDdXJEaXJbMF0gPSAwOw0KKyAgICAgIFNldEN1cnJlbnREaXJlY3Rvcnkod29ya0N1ckRpcik7DQorICAgIH0NCisgICAgI2VuZGlmDQorICAgIA0KKyAgICBpZiAodXNlU2hlbGxFeGVjdXRlKQ0KKyAgICB7DQorICAgICAgU0hFTExFWEVDVVRFSU5GTyBlaTsNCisgICAgICBVSU5UMzIgZXhlY3V0ZVJlczsNCisgICAgICBCT09MIHN1Y2Nlc3M7DQorICAgICAgDQorICAgICAgbWVtc2V0KCZlaSwgMCwgc2l6ZW9mKGVpKSk7DQorICAgICAgZWkuY2JTaXplID0gc2l6ZW9mKGVpKTsNCisgICAgICBlaS5scEZpbGUgPSBwYXRoOw0KKyAgICAgIGVpLmZNYXNrID0gU0VFX01BU0tfTk9DTE9TRVBST0NFU1MNCisgICAgICAgICAgI2lmbmRlZiBVTkRFUl9DRQ0KKyAgICAgICAgICB8IFNFRV9NQVNLX0ZMQUdfRERFV0FJVA0KKyAgICAgICAgICAjZW5kaWYNCisgICAgICAgICAgLyogfCBTRUVfTUFTS19OT19DT05TT0xFICovDQorICAgICAgICAgIDsNCisgICAgICBpZiAod2NzbGVuKGNtZExpbmVQYXJhbXMpICE9IDApDQorICAgICAgICBlaS5scFBhcmFtZXRlcnMgPSBjbWRMaW5lUGFyYW1zOw0KKyAgICAgIGVpLm5TaG93ID0gU1dfU0hPV05PUk1BTDsgLyogU1dfSElERTsgKi8NCisgICAgICBzdWNjZXNzID0gU2hlbGxFeGVjdXRlRXgoJmVpKTsNCisgICAgICBleGVjdXRlUmVzID0gKFVJTlQzMikoVUlOVF9QVFIpZWkuaEluc3RBcHA7DQorICAgICAgaWYgKCFzdWNjZXNzIHx8IChleGVjdXRlUmVzIDw9IDMyICYmIGV4ZWN1dGVSZXMgIT0gMCkpICAvKiBleGVjdXRlUmVzID0gMCBpbiBXaW5kb3dzIENFICovDQorICAgICAgICByZXMgPSBTWl9FUlJPUl9GQUlMOw0KKyAgICAgIGVsc2UNCisgICAgICAgIGhQcm9jZXNzID0gZWkuaFByb2Nlc3M7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgU1RBUlRVUElORk9XIHNpOw0KKyAgICAgIFBST0NFU1NfSU5GT1JNQVRJT04gcGk7DQorICAgICAgV0NIQVIgY21kTGluZVtNQVhfUEFUSCAqIDNdOw0KKw0KKyAgICAgIHdjc2NweShjbWRMaW5lLCBwYXRoKTsNCisgICAgICB3Y3NjYXQoY21kTGluZSwgY21kTGluZVBhcmFtcyk7DQorICAgICAgbWVtc2V0KCZzaSwgMCwgc2l6ZW9mKHNpKSk7DQorICAgICAgc2kuY2IgPSBzaXplb2Yoc2kpOw0KKyAgICAgIGlmIChDcmVhdGVQcm9jZXNzVyhOVUxMLCBjbWRMaW5lLCBOVUxMLCBOVUxMLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCwgJnNpLCAmcGkpID09IDApDQorICAgICAgICByZXMgPSBTWl9FUlJPUl9GQUlMOw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBDbG9zZUhhbmRsZShwaS5oVGhyZWFkKTsNCisgICAgICAgIGhQcm9jZXNzID0gcGkuaFByb2Nlc3M7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBpZiAoaFByb2Nlc3MgIT0gMCkNCisgICAgew0KKyAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoaFByb2Nlc3MsIElORklOSVRFKTsNCisgICAgICBDbG9zZUhhbmRsZShoUHJvY2Vzcyk7DQorICAgIH0NCisgICAgDQorICAgICNpZm5kZWYgVU5ERVJfQ0UNCisgICAgU2V0Q3VycmVudERpcmVjdG9yeShvbGRDdXJEaXIpOw0KKyAgICAjZW5kaWYNCisgIH0NCisNCisgIHBhdGhbcGF0aExlbl0gPSBMJ1wwJzsNCisgIFJlbW92ZURpcldpdGhTdWJJdGVtcyhwYXRoKTsNCisNCisgIGlmIChyZXMgPT0gU1pfT0spDQorICAgIHJldHVybiAwOw0KKyAgDQorICB7DQorICAgIGlmIChyZXMgPT0gU1pfRVJST1JfVU5TVVBQT1JURUQpDQorICAgICAgZXJyb3JNZXNzYWdlID0gIkRlY29kZXIgZG9lc24ndCBzdXBwb3J0IHRoaXMgYXJjaGl2ZSI7DQorICAgIGVsc2UgaWYgKHJlcyA9PSBTWl9FUlJPUl9NRU0pDQorICAgICAgZXJyb3JNZXNzYWdlID0gIkNhbid0IGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeSI7DQorICAgIGVsc2UgaWYgKHJlcyA9PSBTWl9FUlJPUl9DUkMpDQorICAgICAgZXJyb3JNZXNzYWdlID0gIkNSQyBlcnJvciI7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGlmICghZXJyb3JNZXNzYWdlKQ0KKyAgICAgICAgZXJyb3JNZXNzYWdlID0gIkVSUk9SIjsNCisgICAgfQ0KKyAgICBpZiAoZXJyb3JNZXNzYWdlKQ0KKyAgICAgIFByaW50RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7DQorICB9DQorICByZXR1cm4gMTsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DL1V0aWwvU2Z4U2V0dXAvU2Z4U2V0dXAuZHNwIGIvbHptYS9DL1V0aWwvU2Z4U2V0dXAvU2Z4U2V0dXAuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNWZkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvVXRpbC9TZnhTZXR1cC9TZnhTZXR1cC5kc3AKQEAgLTAsMCArMSwyMTEgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iU2Z4U2V0dXAiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIiAweDAxMDENCisNCitDRkc9U2Z4U2V0dXAgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiU2Z4U2V0dXAubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIlNmeFNldHVwLm1hayIgQ0ZHPSJTZnhTZXR1cCAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJTZnhTZXR1cCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJTZnhTZXR1cCAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitNVEw9bWlkbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiU2Z4U2V0dXAgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XNCAvV1ggL0dYIC9PMiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9VTklDT0RFIiAvRCAiVU5JQ09ERSIgL1l1IlByZWNvbXAuaCIgL0ZEIC9jDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDE5IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDE5IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNmeFNldHVwIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL1c0IC9XWCAvR20gL0dYIC9aSSAvT2QgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJfVU5JQ09ERSIgL0QgIlVOSUNPREUiIC9ZdSJQcmVjb21wLmgiIC9GRCAvR1ogL2MNCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MTkgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MTkgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgIlNmeFNldHVwIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgIlNmeFNldHVwIC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiQ29tbW9uIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cN3ouaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3ekFsbG9jLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cN3pBbGxvYy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXDd6QXJjSW4uYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3ekJ1Zi5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXDd6QnVmLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cN3pDcmMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3ekNyYy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXDd6Q3JjT3B0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cN3pEZWMuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3ekZpbGUuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3ekZpbGUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlw3elN0cmVhbS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXDd6VHlwZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxCY2oyLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQmNqMi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEJyYS5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEJyYS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEJyYTg2LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ3B1QXJjaC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENwdUFyY2guaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxMem1hMkRlYy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEx6bWEyRGVjLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cTHptYURlYy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEx6bWFEZWMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJTcGVjIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxQcmVjb21wLmMNCisjIEFERCBDUFAgL1ljIlByZWNvbXAuaCINCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxQcmVjb21wLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNmeFNldHVwLmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9sem1hL0MvVXRpbC9TZnhTZXR1cC9TZnhTZXR1cC5kc3cgYi9sem1hL0MvVXRpbC9TZnhTZXR1cC9TZnhTZXR1cC5kc3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4ZmNkZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9VdGlsL1NmeFNldHVwL1NmeFNldHVwLmRzdwpAQCAtMCwwICsxLDI5IEBACitNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgV0FSTklORzogRE8gTk9UIEVESVQgT1IgREVMRVRFIFRISVMgV09SS1NQQUNFIEZJTEUhDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJTZnhTZXR1cCI9LlxTZnhTZXR1cC5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorR2xvYmFsOg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08Mz4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQpkaWZmIC0tZ2l0IGEvbHptYS9DL1V0aWwvU2Z4U2V0dXAvbWFrZWZpbGUgYi9sem1hL0MvVXRpbC9TZnhTZXR1cC9tYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzk4NzhhCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL1V0aWwvU2Z4U2V0dXAvbWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorUFJPRyA9IDd6UzIuc2Z4DQorDQorQ19PQkpTID0gXA0KKyAgJE9cN3pBbGxvYy5vYmogXA0KKyAgJE9cN3pBcmNJbi5vYmogXA0KKyAgJE9cN3pCdWYub2JqIFwNCisgICRPXDd6QnVmMi5vYmogXA0KKyAgJE9cN3pDcmMub2JqIFwNCisgICRPXDd6Q3JjT3B0Lm9iaiBcDQorICAkT1w3ekZpbGUub2JqIFwNCisgICRPXDd6RGVjLm9iaiBcDQorICAkT1w3elN0cmVhbS5vYmogXA0KKyAgJE9cQmNqMi5vYmogXA0KKyAgJE9cQnJhLm9iaiBcDQorICAkT1xCcmE4Ni5vYmogXA0KKyAgJE9cQ3B1QXJjaC5vYmogXA0KKyAgJE9cTHptYTJEZWMub2JqIFwNCisgICRPXEx6bWFEZWMub2JqIFwNCisNCis3Wl9PQkpTID0gXA0KKyAgJE9cU2Z4U2V0dXAub2JqIFwNCisNCitPQkpTID0gXA0KKyAgJCg3Wl9PQkpTKSBcDQorICAkKENfT0JKUykgXA0KKyAgJE9ccmVzb3VyY2UucmVzDQorDQorIWluY2x1ZGUgIi4uLy4uLy4uL0NQUC9CdWlsZC5tYWsiDQorDQorJCg3Wl9PQkpTKTogJCgqQikuYw0KKwkkKENPTVBMX08xKQ0KKyQoQ19PQkpTKTogLi4vLi4vJCgqQikuYw0KKwkkKENPTVBMX08xKQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9VdGlsL1NmeFNldHVwL21ha2VmaWxlX2NvbiBiL2x6bWEvQy9VdGlsL1NmeFNldHVwL21ha2VmaWxlX2NvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGJiYjFmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL1V0aWwvU2Z4U2V0dXAvbWFrZWZpbGVfY29uCkBAIC0wLDAgKzEsMzQgQEAKK1BST0cgPSA3elMyY29uLnNmeA0KK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtRF9DT05TT0xFDQorDQorQ19PQkpTID0gXA0KKyAgJE9cN3pBbGxvYy5vYmogXA0KKyAgJE9cN3pBcmNJbi5vYmogXA0KKyAgJE9cN3pCdWYub2JqIFwNCisgICRPXDd6QnVmMi5vYmogXA0KKyAgJE9cN3pDcmMub2JqIFwNCisgICRPXDd6Q3JjT3B0Lm9iaiBcDQorICAkT1w3ekZpbGUub2JqIFwNCisgICRPXDd6RGVjLm9iaiBcDQorICAkT1w3elN0cmVhbS5vYmogXA0KKyAgJE9cQmNqMi5vYmogXA0KKyAgJE9cQnJhLm9iaiBcDQorICAkT1xCcmE4Ni5vYmogXA0KKyAgJE9cQ3B1QXJjaC5vYmogXA0KKyAgJE9cTHptYTJEZWMub2JqIFwNCisgICRPXEx6bWFEZWMub2JqIFwNCisNCis3Wl9PQkpTID0gXA0KKyAgJE9cU2Z4U2V0dXAub2JqIFwNCisNCitPQkpTID0gXA0KKyAgJCg3Wl9PQkpTKSBcDQorICAkKENfT0JKUykgXA0KKyAgJE9ccmVzb3VyY2UucmVzDQorDQorIWluY2x1ZGUgIi4uLy4uLy4uL0NQUC9CdWlsZC5tYWsiDQorDQorJCg3Wl9PQkpTKTogJCgqQikuYw0KKwkkKENPTVBMX08xKQ0KKyQoQ19PQkpTKTogLi4vLi4vJCgqQikuYw0KKwkkKENPTVBMX08xKQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9VdGlsL1NmeFNldHVwL3Jlc291cmNlLnJjIGIvbHptYS9DL1V0aWwvU2Z4U2V0dXAvcmVzb3VyY2UucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmNGUyYwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9VdGlsL1NmeFNldHVwL3Jlc291cmNlLnJjCkBAIC0wLDAgKzEsNSBAQAorI2luY2x1ZGUgIi4uLy4uLzd6VmVyc2lvbi5yYyINCisNCitNWV9WRVJTSU9OX0lORk9fQVBQKCI3eiBTZXR1cCBTRlggc21hbGwiLCAiN3pTMi5zZngiKQ0KKw0KKzEgIElDT04gInNldHVwLmljbyINCmRpZmYgLS1naXQgYS9sem1hL0MvVXRpbC9TZnhTZXR1cC9zZXR1cC5pY28gYi9sem1hL0MvVXRpbC9TZnhTZXR1cC9zZXR1cC5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiNmNhOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9VdGlsL1NmeFNldHVwL3NldHVwLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sem1hL0MvWHouYyBiL2x6bWEvQy9Yei5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YjVjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvWHouYwpAQCAtMCwwICsxLDkwIEBACisvKiBYei5jIC0gWHoNCisyMDA5LTA0LTE1IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSAiN3pDcmMuaCINCisjaW5jbHVkZSAiQ3B1QXJjaC5oIg0KKyNpbmNsdWRlICJYei5oIg0KKyNpbmNsdWRlICJYekNyYzY0LmgiDQorDQorQnl0ZSBYWl9TSUdbWFpfU0lHX1NJWkVdID0geyAweEZELCAnNycsICd6JywgJ1gnLCAnWicsIDAgfTsNCitCeXRlIFhaX0ZPT1RFUl9TSUdbWFpfRk9PVEVSX1NJR19TSVpFXSA9IHsgJ1knLCAnWicgfTsNCisNCit1bnNpZ25lZCBYel9Xcml0ZVZhckludChCeXRlICpidWYsIFVJbnQ2NCB2KQ0KK3sNCisgIHVuc2lnbmVkIGkgPSAwOw0KKyAgZG8NCisgIHsNCisgICAgYnVmW2krK10gPSAoQnl0ZSkoKHYgJiAweDdGKSB8IDB4ODApOw0KKyAgICB2ID4+PSA3Ow0KKyAgfQ0KKyAgd2hpbGUgKHYgIT0gMCk7DQorICBidWZbaSAtIDFdICY9IDB4N0Y7DQorICByZXR1cm4gaTsNCit9DQorDQordm9pZCBYel9Db25zdHJ1Y3QoQ1h6U3RyZWFtICpwKQ0KK3sNCisgIHAtPm51bUJsb2NrcyA9IHAtPm51bUJsb2Nrc0FsbG9jYXRlZCA9IDA7DQorICBwLT5ibG9ja3MgPSAwOw0KKyAgcC0+ZmxhZ3MgPSAwOw0KK30NCisNCit2b2lkIFh6X0ZyZWUoQ1h6U3RyZWFtICpwLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgYWxsb2MtPkZyZWUoYWxsb2MsIHAtPmJsb2Nrcyk7DQorICBwLT5udW1CbG9ja3MgPSBwLT5udW1CbG9ja3NBbGxvY2F0ZWQgPSAwOw0KKyAgcC0+YmxvY2tzID0gMDsNCit9DQorDQordW5zaWduZWQgWHpGbGFnc19HZXRDaGVja1NpemUoQ1h6U3RyZWFtRmxhZ3MgZikNCit7DQorICBpbnQgdCA9IFh6RmxhZ3NfR2V0Q2hlY2tUeXBlKGYpOw0KKyAgcmV0dXJuICh0ID09IDApID8gMCA6ICg0IDw8ICgodCAtIDEpIC8gMykpOw0KK30NCisNCit2b2lkIFh6Q2hlY2tfSW5pdChDWHpDaGVjayAqcCwgaW50IG1vZGUpDQorew0KKyAgcC0+bW9kZSA9IG1vZGU7DQorICBzd2l0Y2ggKG1vZGUpDQorICB7DQorICAgIGNhc2UgWFpfQ0hFQ0tfQ1JDMzI6IHAtPmNyYyA9IENSQ19JTklUX1ZBTDsgYnJlYWs7DQorICAgIGNhc2UgWFpfQ0hFQ0tfQ1JDNjQ6IHAtPmNyYzY0ID0gQ1JDNjRfSU5JVF9WQUw7IGJyZWFrOw0KKyAgICBjYXNlIFhaX0NIRUNLX1NIQTI1NjogU2hhMjU2X0luaXQoJnAtPnNoYSk7IGJyZWFrOw0KKyAgfQ0KK30NCisNCit2b2lkIFh6Q2hlY2tfVXBkYXRlKENYekNoZWNrICpwLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkNCit7DQorICBzd2l0Y2ggKHAtPm1vZGUpDQorICB7DQorICAgIGNhc2UgWFpfQ0hFQ0tfQ1JDMzI6IHAtPmNyYyA9IENyY1VwZGF0ZShwLT5jcmMsIGRhdGEsIHNpemUpOyBicmVhazsNCisgICAgY2FzZSBYWl9DSEVDS19DUkM2NDogcC0+Y3JjNjQgPSBDcmM2NFVwZGF0ZShwLT5jcmM2NCwgZGF0YSwgc2l6ZSk7IGJyZWFrOw0KKyAgICBjYXNlIFhaX0NIRUNLX1NIQTI1NjogU2hhMjU2X1VwZGF0ZSgmcC0+c2hhLCAoY29uc3QgQnl0ZSAqKWRhdGEsIHNpemUpOyBicmVhazsNCisgIH0NCit9DQorDQoraW50IFh6Q2hlY2tfRmluYWwoQ1h6Q2hlY2sgKnAsIEJ5dGUgKmRpZ2VzdCkNCit7DQorICBzd2l0Y2ggKHAtPm1vZGUpDQorICB7DQorICAgIGNhc2UgWFpfQ0hFQ0tfQ1JDMzI6DQorICAgICAgU2V0VWkzMihkaWdlc3QsIENSQ19HRVRfRElHRVNUKHAtPmNyYykpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhaX0NIRUNLX0NSQzY0Og0KKyAgICB7DQorICAgICAgaW50IGk7DQorICAgICAgVUludDY0IHYgPSBDUkM2NF9HRVRfRElHRVNUKHAtPmNyYzY0KTsNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCB2ID4+PSA4KQ0KKyAgICAgICAgZGlnZXN0W2ldID0gKEJ5dGUpKHYgJiAweEZGKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIFhaX0NIRUNLX1NIQTI1NjoNCisgICAgICBTaGEyNTZfRmluYWwoJnAtPnNoYSwgZGlnZXN0KTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gMDsNCisgIH0NCisgIHJldHVybiAxOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0MvWHouaCBiL2x6bWEvQy9Yei5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTJmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvWHouaApAQCAtMCwwICsxLDI3NSBAQAorLyogWHouaCAtIFh6IGludGVyZmFjZQ0KKzIwMTQtMTItMzAgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaWZuZGVmIF9fWFpfSA0KKyNkZWZpbmUgX19YWl9IDQorDQorI2luY2x1ZGUgIlNoYTI1Ni5oIg0KKw0KK0VYVEVSTl9DX0JFR0lODQorDQorI2RlZmluZSBYWl9JRF9TdWJibG9jayAxDQorI2RlZmluZSBYWl9JRF9EZWx0YSAzDQorI2RlZmluZSBYWl9JRF9YODYgNA0KKyNkZWZpbmUgWFpfSURfUFBDIDUNCisjZGVmaW5lIFhaX0lEX0lBNjQgNg0KKyNkZWZpbmUgWFpfSURfQVJNIDcNCisjZGVmaW5lIFhaX0lEX0FSTVQgOA0KKyNkZWZpbmUgWFpfSURfU1BBUkMgOQ0KKyNkZWZpbmUgWFpfSURfTFpNQTIgMHgyMQ0KKw0KK3Vuc2lnbmVkIFh6X1JlYWRWYXJJbnQoY29uc3QgQnl0ZSAqcCwgc2l6ZV90IG1heFNpemUsIFVJbnQ2NCAqdmFsdWUpOw0KK3Vuc2lnbmVkIFh6X1dyaXRlVmFySW50KEJ5dGUgKmJ1ZiwgVUludDY0IHYpOw0KKw0KKy8qIC0tLS0tLS0tLS0geHogYmxvY2sgLS0tLS0tLS0tLSAqLw0KKw0KKyNkZWZpbmUgWFpfQkxPQ0tfSEVBREVSX1NJWkVfTUFYIDEwMjQNCisNCisjZGVmaW5lIFhaX05VTV9GSUxURVJTX01BWCA0DQorI2RlZmluZSBYWl9CRl9OVU1fRklMVEVSU19NQVNLIDMNCisjZGVmaW5lIFhaX0JGX1BBQ0tfU0laRSAoMSA8PCA2KQ0KKyNkZWZpbmUgWFpfQkZfVU5QQUNLX1NJWkUgKDEgPDwgNykNCisNCisjZGVmaW5lIFhaX0ZJTFRFUl9QUk9QU19TSVpFX01BWCAyMA0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgVUludDY0IGlkOw0KKyAgVUludDMyIHByb3BzU2l6ZTsNCisgIEJ5dGUgcHJvcHNbWFpfRklMVEVSX1BST1BTX1NJWkVfTUFYXTsNCit9IENYekZpbHRlcjsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIFVJbnQ2NCBwYWNrU2l6ZTsNCisgIFVJbnQ2NCB1bnBhY2tTaXplOw0KKyAgQnl0ZSBmbGFnczsNCisgIENYekZpbHRlciBmaWx0ZXJzW1haX05VTV9GSUxURVJTX01BWF07DQorfSBDWHpCbG9jazsNCisNCisjZGVmaW5lIFh6QmxvY2tfR2V0TnVtRmlsdGVycyhwKSAoKChwKS0+ZmxhZ3MgJiBYWl9CRl9OVU1fRklMVEVSU19NQVNLKSArIDEpDQorI2RlZmluZSBYekJsb2NrX0hhc1BhY2tTaXplKHApICAgKCgocCktPmZsYWdzICYgWFpfQkZfUEFDS19TSVpFKSAhPSAwKQ0KKyNkZWZpbmUgWHpCbG9ja19IYXNVbnBhY2tTaXplKHApICgoKHApLT5mbGFncyAmIFhaX0JGX1VOUEFDS19TSVpFKSAhPSAwKQ0KKw0KK1NSZXMgWHpCbG9ja19QYXJzZShDWHpCbG9jayAqcCwgY29uc3QgQnl0ZSAqaGVhZGVyKTsNCitTUmVzIFh6QmxvY2tfUmVhZEhlYWRlcihDWHpCbG9jayAqcCwgSVNlcUluU3RyZWFtICppblN0cmVhbSwgQm9vbCAqaXNJbmRleCwgVUludDMyICpoZWFkZXJTaXplUmVzKTsNCisNCisvKiAtLS0tLS0tLS0tIHh6IHN0cmVhbSAtLS0tLS0tLS0tICovDQorDQorI2RlZmluZSBYWl9TSUdfU0laRSA2DQorI2RlZmluZSBYWl9GT09URVJfU0lHX1NJWkUgMg0KKw0KK2V4dGVybiBCeXRlIFhaX1NJR1tYWl9TSUdfU0laRV07DQorZXh0ZXJuIEJ5dGUgWFpfRk9PVEVSX1NJR1tYWl9GT09URVJfU0lHX1NJWkVdOw0KKw0KKyNkZWZpbmUgWFpfU1RSRUFNX0ZMQUdTX1NJWkUgMg0KKyNkZWZpbmUgWFpfU1RSRUFNX0NSQ19TSVpFIDQNCisNCisjZGVmaW5lIFhaX1NUUkVBTV9IRUFERVJfU0laRSAoWFpfU0lHX1NJWkUgKyBYWl9TVFJFQU1fRkxBR1NfU0laRSArIFhaX1NUUkVBTV9DUkNfU0laRSkNCisjZGVmaW5lIFhaX1NUUkVBTV9GT09URVJfU0laRSAoWFpfRk9PVEVSX1NJR19TSVpFICsgWFpfU1RSRUFNX0ZMQUdTX1NJWkUgKyBYWl9TVFJFQU1fQ1JDX1NJWkUgKyA0KQ0KKw0KKyNkZWZpbmUgWFpfQ0hFQ0tfTUFTSyAweEYNCisjZGVmaW5lIFhaX0NIRUNLX05PIDANCisjZGVmaW5lIFhaX0NIRUNLX0NSQzMyIDENCisjZGVmaW5lIFhaX0NIRUNLX0NSQzY0IDQNCisjZGVmaW5lIFhaX0NIRUNLX1NIQTI1NiAxMA0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgaW50IG1vZGU7DQorICBVSW50MzIgY3JjOw0KKyAgVUludDY0IGNyYzY0Ow0KKyAgQ1NoYTI1NiBzaGE7DQorfSBDWHpDaGVjazsNCisNCit2b2lkIFh6Q2hlY2tfSW5pdChDWHpDaGVjayAqcCwgaW50IG1vZGUpOw0KK3ZvaWQgWHpDaGVja19VcGRhdGUoQ1h6Q2hlY2sgKnAsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsNCitpbnQgWHpDaGVja19GaW5hbChDWHpDaGVjayAqcCwgQnl0ZSAqZGlnZXN0KTsNCisNCit0eXBlZGVmIFVJbnQxNiBDWHpTdHJlYW1GbGFnczsNCisNCisjZGVmaW5lIFh6RmxhZ3NfSXNTdXBwb3J0ZWQoZikgKChmKSA8PSBYWl9DSEVDS19NQVNLKQ0KKyNkZWZpbmUgWHpGbGFnc19HZXRDaGVja1R5cGUoZikgKChmKSAmIFhaX0NIRUNLX01BU0spDQorI2RlZmluZSBYekZsYWdzX0hhc0RhdGFDcmMzMihmKSAoWHpfR2V0Q2hlY2tUeXBlKGYpID09IFhaX0NIRUNLX0NSQzMyKQ0KK3Vuc2lnbmVkIFh6RmxhZ3NfR2V0Q2hlY2tTaXplKENYelN0cmVhbUZsYWdzIGYpOw0KKw0KK1NSZXMgWHpfUGFyc2VIZWFkZXIoQ1h6U3RyZWFtRmxhZ3MgKnAsIGNvbnN0IEJ5dGUgKmJ1Zik7DQorU1JlcyBYel9SZWFkSGVhZGVyKENYelN0cmVhbUZsYWdzICpwLCBJU2VxSW5TdHJlYW0gKmluU3RyZWFtKTsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIFVJbnQ2NCB1bnBhY2tTaXplOw0KKyAgVUludDY0IHRvdGFsU2l6ZTsNCit9IENYekJsb2NrU2l6ZXM7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBDWHpTdHJlYW1GbGFncyBmbGFnczsNCisgIHNpemVfdCBudW1CbG9ja3M7DQorICBzaXplX3QgbnVtQmxvY2tzQWxsb2NhdGVkOw0KKyAgQ1h6QmxvY2tTaXplcyAqYmxvY2tzOw0KKyAgVUludDY0IHN0YXJ0T2Zmc2V0Ow0KK30gQ1h6U3RyZWFtOw0KKw0KK3ZvaWQgWHpfQ29uc3RydWN0KENYelN0cmVhbSAqcCk7DQordm9pZCBYel9GcmVlKENYelN0cmVhbSAqcCwgSVN6QWxsb2MgKmFsbG9jKTsNCisNCisjZGVmaW5lIFhaX1NJWkVfT1ZFUkZMT1cgKChVSW50NjQpKEludDY0KS0xKQ0KKw0KK1VJbnQ2NCBYel9HZXRVbnBhY2tTaXplKGNvbnN0IENYelN0cmVhbSAqcCk7DQorVUludDY0IFh6X0dldFBhY2tTaXplKGNvbnN0IENYelN0cmVhbSAqcCk7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBzaXplX3QgbnVtOw0KKyAgc2l6ZV90IG51bUFsbG9jYXRlZDsNCisgIENYelN0cmVhbSAqc3RyZWFtczsNCit9IENYenM7DQorDQordm9pZCBYenNfQ29uc3RydWN0KENYenMgKnApOw0KK3ZvaWQgWHpzX0ZyZWUoQ1h6cyAqcCwgSVN6QWxsb2MgKmFsbG9jKTsNCitTUmVzIFh6c19SZWFkQmFja3dhcmQoQ1h6cyAqcCwgSUxvb2tJblN0cmVhbSAqaW5TdHJlYW0sIEludDY0ICpzdGFydE9mZnNldCwgSUNvbXByZXNzUHJvZ3Jlc3MgKnByb2dyZXNzLCBJU3pBbGxvYyAqYWxsb2MpOw0KKw0KK1VJbnQ2NCBYenNfR2V0TnVtQmxvY2tzKGNvbnN0IENYenMgKnApOw0KK1VJbnQ2NCBYenNfR2V0VW5wYWNrU2l6ZShjb25zdCBDWHpzICpwKTsNCisNCit0eXBlZGVmIGVudW0NCit7DQorICBDT0RFUl9TVEFUVVNfTk9UX1NQRUNJRklFRCwgICAgICAgICAgICAgICAvKiB1c2UgbWFpbiBlcnJvciBjb2RlIGluc3RlYWQgKi8NCisgIENPREVSX1NUQVRVU19GSU5JU0hFRF9XSVRIX01BUkssICAgICAgICAgIC8qIHN0cmVhbSB3YXMgZmluaXNoZWQgd2l0aCBlbmQgbWFyay4gKi8NCisgIENPREVSX1NUQVRVU19OT1RfRklOSVNIRUQsICAgICAgICAgICAgICAgIC8qIHN0cmVhbSB3YXMgbm90IGZpbmlzaGVkICovDQorICBDT0RFUl9TVEFUVVNfTkVFRFNfTU9SRV9JTlBVVCAgICAgICAgICAgICAvKiB5b3UgbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYnl0ZXMgKi8NCit9IEVDb2RlclN0YXR1czsNCisNCit0eXBlZGVmIGVudW0NCit7DQorICBDT0RFUl9GSU5JU0hfQU5ZLCAgIC8qIGZpbmlzaCBhdCBhbnkgcG9pbnQgKi8NCisgIENPREVSX0ZJTklTSF9FTkQgICAgLyogYmxvY2sgbXVzdCBiZSBmaW5pc2hlZCBhdCB0aGUgZW5kICovDQorfSBFQ29kZXJGaW5pc2hNb2RlOw0KKw0KK3R5cGVkZWYgc3RydWN0IF9JU3RhdGVDb2Rlcg0KK3sNCisgIHZvaWQgKnA7DQorICB2b2lkICgqRnJlZSkodm9pZCAqcCwgSVN6QWxsb2MgKmFsbG9jKTsNCisgIFNSZXMgKCpTZXRQcm9wcykodm9pZCAqcCwgY29uc3QgQnl0ZSAqcHJvcHMsIHNpemVfdCBwcm9wU2l6ZSwgSVN6QWxsb2MgKmFsbG9jKTsNCisgIHZvaWQgKCpJbml0KSh2b2lkICpwKTsNCisgIFNSZXMgKCpDb2RlKSh2b2lkICpwLCBCeXRlICpkZXN0LCBTaXplVCAqZGVzdExlbiwgY29uc3QgQnl0ZSAqc3JjLCBTaXplVCAqc3JjTGVuLA0KKyAgICAgIGludCBzcmNXYXNGaW5pc2hlZCwgRUNvZGVyRmluaXNoTW9kZSBmaW5pc2hNb2RlLCBpbnQgKndhc0ZpbmlzaGVkKTsNCit9IElTdGF0ZUNvZGVyOw0KKw0KKyNkZWZpbmUgTUlYQ09ERVJfTlVNX0ZJTFRFUlNfTUFYIDQNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIElTekFsbG9jICphbGxvYzsNCisgIEJ5dGUgKmJ1ZjsNCisgIGludCBudW1Db2RlcnM7DQorICBpbnQgZmluaXNoZWRbTUlYQ09ERVJfTlVNX0ZJTFRFUlNfTUFYIC0gMV07DQorICBzaXplX3QgcG9zW01JWENPREVSX05VTV9GSUxURVJTX01BWCAtIDFdOw0KKyAgc2l6ZV90IHNpemVbTUlYQ09ERVJfTlVNX0ZJTFRFUlNfTUFYIC0gMV07DQorICBVSW50NjQgaWRzW01JWENPREVSX05VTV9GSUxURVJTX01BWF07DQorICBJU3RhdGVDb2RlciBjb2RlcnNbTUlYQ09ERVJfTlVNX0ZJTFRFUlNfTUFYXTsNCit9IENNaXhDb2RlcjsNCisNCit2b2lkIE1peENvZGVyX0NvbnN0cnVjdChDTWl4Q29kZXIgKnAsIElTekFsbG9jICphbGxvYyk7DQordm9pZCBNaXhDb2Rlcl9GcmVlKENNaXhDb2RlciAqcCk7DQordm9pZCBNaXhDb2Rlcl9Jbml0KENNaXhDb2RlciAqcCk7DQorU1JlcyBNaXhDb2Rlcl9TZXRGcm9tTWV0aG9kKENNaXhDb2RlciAqcCwgaW50IGNvZGVySW5kZXgsIFVJbnQ2NCBtZXRob2RJZCk7DQorU1JlcyBNaXhDb2Rlcl9Db2RlKENNaXhDb2RlciAqcCwgQnl0ZSAqZGVzdCwgU2l6ZVQgKmRlc3RMZW4sDQorICAgIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbiwgaW50IHNyY1dhc0ZpbmlzaGVkLA0KKyAgICBFQ29kZXJGaW5pc2hNb2RlIGZpbmlzaE1vZGUsIEVDb2RlclN0YXR1cyAqc3RhdHVzKTsNCisNCit0eXBlZGVmIGVudW0NCit7DQorICBYWl9TVEFURV9TVFJFQU1fSEVBREVSLA0KKyAgWFpfU1RBVEVfU1RSRUFNX0lOREVYLA0KKyAgWFpfU1RBVEVfU1RSRUFNX0lOREVYX0NSQywNCisgIFhaX1NUQVRFX1NUUkVBTV9GT09URVIsDQorICBYWl9TVEFURV9TVFJFQU1fUEFERElORywNCisgIFhaX1NUQVRFX0JMT0NLX0hFQURFUiwNCisgIFhaX1NUQVRFX0JMT0NLLA0KKyAgWFpfU1RBVEVfQkxPQ0tfRk9PVEVSDQorfSBFWHpTdGF0ZTsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIEVYelN0YXRlIHN0YXRlOw0KKyAgVUludDMyIHBvczsNCisgIHVuc2lnbmVkIGFsaWduUG9zOw0KKyAgdW5zaWduZWQgaW5kZXhQcmVTaXplOw0KKw0KKyAgQ1h6U3RyZWFtRmxhZ3Mgc3RyZWFtRmxhZ3M7DQorICANCisgIFVJbnQzMiBibG9ja0hlYWRlclNpemU7DQorICBVSW50NjQgcGFja1NpemU7DQorICBVSW50NjQgdW5wYWNrU2l6ZTsNCisNCisgIFVJbnQ2NCBudW1CbG9ja3M7DQorICBVSW50NjQgaW5kZXhTaXplOw0KKyAgVUludDY0IGluZGV4UG9zOw0KKyAgVUludDY0IHBhZFNpemU7DQorDQorICBVSW50NjQgbnVtU3RhcnRlZFN0cmVhbXM7DQorICBVSW50NjQgbnVtRmluaXNoZWRTdHJlYW1zOw0KKyAgVUludDY0IG51bVRvdGFsQmxvY2tzOw0KKw0KKyAgVUludDMyIGNyYzsNCisgIENNaXhDb2RlciBkZWNvZGVyOw0KKyAgQ1h6QmxvY2sgYmxvY2s7DQorICBDWHpDaGVjayBjaGVjazsNCisgIENTaGEyNTYgc2hhOw0KKyAgQnl0ZSBzaGFEaWdlc3RbU0hBMjU2X0RJR0VTVF9TSVpFXTsNCisgIEJ5dGUgYnVmW1haX0JMT0NLX0hFQURFUl9TSVpFX01BWF07DQorfSBDWHpVbnBhY2tlcjsNCisNCit2b2lkIFh6VW5wYWNrZXJfQ29uc3RydWN0KENYelVucGFja2VyICpwLCBJU3pBbGxvYyAqYWxsb2MpOw0KK3ZvaWQgWHpVbnBhY2tlcl9Jbml0KENYelVucGFja2VyICpwKTsNCit2b2lkIFh6VW5wYWNrZXJfRnJlZShDWHpVbnBhY2tlciAqcCk7DQorDQorLyoNCitmaW5pc2hNb2RlOg0KKyAgSXQgaGFzIG1lYW5pbmcgb25seSBpZiB0aGUgZGVjb2RpbmcgcmVhY2hlcyBvdXRwdXQgbGltaXQgKCpkZXN0TGVuKS4NCisgIENPREVSX0ZJTklTSF9BTlkgLSB1c2Ugc21hbGxlc3QgbnVtYmVyIG9mIGlucHV0IGJ5dGVzDQorICBDT0RFUl9GSU5JU0hfRU5EIC0gcmVhZCBFbmRPZlN0cmVhbSBtYXJrZXIgYWZ0ZXIgZGVjb2RpbmcNCisNCitSZXR1cm5zOg0KKyAgU1pfT0sNCisgICAgc3RhdHVzOg0KKyAgICAgIENPREVSX1NUQVRVU19OT1RfRklOSVNIRUQsDQorICAgICAgQ09ERVJfU1RBVFVTX05FRURTX01PUkVfSU5QVVQgLSBtYXliZSB0aGVyZSBhcmUgbW9yZSB4eiBzdHJlYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCBYelVucGFja2VyX0lzU3RyZWFtV2FzRmluaXNoZWQgdG8gY2hlY2sgdGhhdCBjdXJyZW50IHN0cmVhbSB3YXMgZmluaXNoZWQNCisgIFNaX0VSUk9SX01FTSAgLSBNZW1vcnkgYWxsb2NhdGlvbiBlcnJvcg0KKyAgU1pfRVJST1JfREFUQSAtIERhdGEgZXJyb3INCisgIFNaX0VSUk9SX1VOU1VQUE9SVEVEIC0gVW5zdXBwb3J0ZWQgbWV0aG9kIG9yIG1ldGhvZCBwcm9wZXJ0aWVzDQorICBTWl9FUlJPUl9DUkMgIC0gQ1JDIGVycm9yDQorICAvLyBTWl9FUlJPUl9JTlBVVF9FT0YgLSBJdCBuZWVkcyBtb3JlIGJ5dGVzIGluIGlucHV0IGJ1ZmZlciAoc3JjKS4NCisNCisgIFNaX0VSUk9SX05PX0FSQ0hJVkUgLSB0aGUgZXJyb3Igd2l0aCB4eiBTdHJlYW0gSGVhZGVyIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczoNCisgICAgIC0geHogU3RyZWFtIFNpZ25hdHVyZSBmYWlsdXJlDQorICAgICAtIENSQzMyIG9mIHh6IFN0cmVhbSBIZWFkZXIgaXMgZmFpbGVkDQorICAgICAtIFRoZSBzaXplIG9mIFN0cmVhbSBwYWRkaW5nIGlzIG5vdCBtdWx0aXBsZSBvZiBmb3VyIGJ5dGVzLg0KKyAgICBJdCdzIHBvc3NpYmxlIHRvIGdldCB0aGF0IGVycm9yLCBpZiB4eiBzdHJlYW0gd2FzIGZpbmlzaGVkIGFuZCB0aGUgc3RyZWFtDQorICAgIGNvbnRhaW5zIHNvbWUgYW5vdGhlciBkYXRhLiBJbiB0aGF0IGNhc2UgeW91IGNhbiBjYWxsIFh6VW5wYWNrZXJfR2V0RXh0cmFTaXplKCkNCisgICAgZnVuY3Rpb24gdG8gZ2V0IHJlYWwgc2l6ZSBvZiB4eiBzdHJlYW0uDQorKi8NCisNCisNCitTUmVzIFh6VW5wYWNrZXJfQ29kZShDWHpVbnBhY2tlciAqcCwgQnl0ZSAqZGVzdCwgU2l6ZVQgKmRlc3RMZW4sDQorICAgIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbiwgRUNvZGVyRmluaXNoTW9kZSBmaW5pc2hNb2RlLA0KKyAgICBFQ29kZXJTdGF0dXMgKnN0YXR1cyk7DQorDQorQm9vbCBYelVucGFja2VyX0lzU3RyZWFtV2FzRmluaXNoZWQoQ1h6VW5wYWNrZXIgKnApOw0KKw0KKy8qDQorQ2FsbCBYelVucGFja2VyX0dldEV4dHJhU2l6ZSBhZnRlciBYelVucGFja2VyX0NvZGUgZnVuY3Rpb24gdG8gZGV0ZWN0IHJlYWwgc2l6ZSBvZg0KK3h6IHN0cmVhbSBpbiB0d28gY2FzZXM6DQorWHpVbnBhY2tlcl9Db2RlKCkgcmV0dXJuczoNCisgIHJlcyA9PSBTWl9PSyAmJiBzdGF0dXMgPT0gQ09ERVJfU1RBVFVTX05FRURTX01PUkVfSU5QVVQNCisgIHJlcyA9PSBTWl9FUlJPUl9OT19BUkNISVZFDQorKi8NCisNCitVSW50NjQgWHpVbnBhY2tlcl9HZXRFeHRyYVNpemUoQ1h6VW5wYWNrZXIgKnApOw0KKw0KK0VYVEVSTl9DX0VORA0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy9YekNyYzY0LmMgYi9sem1hL0MvWHpDcmM2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2N2U0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvWHpDcmM2NC5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qIFh6Q3JjNjQuYyAtLSBDUkM2NCBjYWxjdWxhdGlvbg0KKzIwMTEtMDYtMjggOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiUHJlY29tcC5oIg0KKw0KKyNpbmNsdWRlICJYekNyYzY0LmgiDQorI2luY2x1ZGUgIkNwdUFyY2guaCINCisNCisjZGVmaW5lIGtDcmM2NFBvbHkgVUlOVDY0X0NPTlNUKDB4Qzk2QzU3OTVENzg3MEY0MikNCisNCisjaWZkZWYgTVlfQ1BVX0xFDQorICAjZGVmaW5lIENSQ19OVU1fVEFCTEVTIDQNCisjZWxzZQ0KKyAgI2RlZmluZSBDUkNfTlVNX1RBQkxFUyA1DQorICAjZGVmaW5lIENSQ19VSU5UNjRfU1dBUCh2KSBcDQorICAoKHYgPj4gNTYpIHwgXA0KKyAgKCh2ID4+IDQwKSAmICgoVUludDY0KTB4RkYgPDwgIDgpKSB8IFwNCisgICgodiA+PiAyNCkgJiAoKFVJbnQ2NCkweEZGIDw8IDE2KSkgfCBcDQorICAoKHYgPj4gIDgpICYgKChVSW50NjQpMHhGRiA8PCAyNCkpIHwgXA0KKyAgKCh2IDw8ICA4KSAmICgoVUludDY0KTB4RkYgPDwgMzIpKSB8IFwNCisgICgodiA8PCAyNCkgJiAoKFVJbnQ2NCkweEZGIDw8IDQwKSkgfCBcDQorICAoKHYgPDwgNDApICYgKChVSW50NjQpMHhGRiA8PCA0OCkpIHwgXA0KKyAgICh2IDw8IDU2KSkNCisgIFVJbnQ2NCBNWV9GQVNUX0NBTEwgWHpDcmM2NFVwZGF0ZVQxX0JlVDQoVUludDY0IHYsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBjb25zdCBVSW50NjQgKnRhYmxlKTsNCisjZW5kaWYNCisNCisjaWZuZGVmIE1ZX0NQVV9CRQ0KKyAgVUludDY0IE1ZX0ZBU1RfQ0FMTCBYekNyYzY0VXBkYXRlVDQoVUludDY0IHYsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBjb25zdCBVSW50NjQgKnRhYmxlKTsNCisjZW5kaWYNCisNCit0eXBlZGVmIFVJbnQ2NCAoTVlfRkFTVF9DQUxMICpDUkNfRlVOQykoVUludDY0IHYsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBjb25zdCBVSW50NjQgKnRhYmxlKTsNCisNCitzdGF0aWMgQ1JDX0ZVTkMgZ19DcmM2NFVwZGF0ZTsNCitVSW50NjQgZ19DcmM2NFRhYmxlWzI1NiAqIENSQ19OVU1fVEFCTEVTXTsNCisNCitVSW50NjQgTVlfRkFTVF9DQUxMIENyYzY0VXBkYXRlKFVJbnQ2NCB2LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkNCit7DQorICByZXR1cm4gZ19DcmM2NFVwZGF0ZSh2LCBkYXRhLCBzaXplLCBnX0NyYzY0VGFibGUpOw0KK30NCisNCitVSW50NjQgTVlfRkFTVF9DQUxMIENyYzY0Q2FsYyhjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkNCit7DQorICByZXR1cm4gZ19DcmM2NFVwZGF0ZShDUkM2NF9JTklUX1ZBTCwgZGF0YSwgc2l6ZSwgZ19DcmM2NFRhYmxlKSBeIENSQzY0X0lOSVRfVkFMOw0KK30NCisNCit2b2lkIE1ZX0ZBU1RfQ0FMTCBDcmM2NEdlbmVyYXRlVGFibGUoKQ0KK3sNCisgIFVJbnQzMiBpOw0KKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQ0KKyAgew0KKyAgICBVSW50NjQgciA9IGk7DQorICAgIHVuc2lnbmVkIGo7DQorICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspDQorICAgICAgciA9IChyID4+IDEpIF4gKGtDcmM2NFBvbHkgJiB+KChyICYgMSkgLSAxKSk7DQorICAgIGdfQ3JjNjRUYWJsZVtpXSA9IHI7DQorICB9DQorICBmb3IgKDsgaSA8IDI1NiAqIENSQ19OVU1fVEFCTEVTOyBpKyspDQorICB7DQorICAgIFVJbnQ2NCByID0gZ19DcmM2NFRhYmxlW2kgLSAyNTZdOw0KKyAgICBnX0NyYzY0VGFibGVbaV0gPSBnX0NyYzY0VGFibGVbciAmIDB4RkZdIF4gKHIgPj4gOCk7DQorICB9DQorICANCisgICNpZmRlZiBNWV9DUFVfTEUNCisNCisgIGdfQ3JjNjRVcGRhdGUgPSBYekNyYzY0VXBkYXRlVDQ7DQorDQorICANCisNCisNCisNCisNCisgICNlbHNlDQorICB7DQorICAgICNpZm5kZWYgTVlfQ1BVX0JFDQorICAgIFVJbnQzMiBrID0gMTsNCisgICAgaWYgKCooY29uc3QgQnl0ZSAqKSZrID09IDEpDQorICAgICAgZ19DcmM2NFVwZGF0ZSA9IFh6Q3JjNjRVcGRhdGVUNDsNCisgICAgZWxzZQ0KKyAgICAjZW5kaWYNCisgICAgew0KKyAgICAgIGZvciAoaSA9IDI1NiAqIENSQ19OVU1fVEFCTEVTIC0gMTsgaSA+PSAyNTY7IGktLSkNCisgICAgICB7DQorICAgICAgICBVSW50NjQgeCA9IGdfQ3JjNjRUYWJsZVtpIC0gMjU2XTsNCisgICAgICAgIGdfQ3JjNjRUYWJsZVtpXSA9IENSQ19VSU5UNjRfU1dBUCh4KTsNCisgICAgICB9DQorICAgICAgZ19DcmM2NFVwZGF0ZSA9IFh6Q3JjNjRVcGRhdGVUMV9CZVQ0Ow0KKyAgICB9DQorICB9DQorICAjZW5kaWYNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DL1h6Q3JjNjQuaCBiL2x6bWEvQy9YekNyYzY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiMTBkNQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9YekNyYzY0LmgKQEAgLTAsMCArMSwyNiBAQAorLyogWHpDcmM2NC5oIC0tIENSQzY0IGNhbGN1bGF0aW9uDQorMjAxMy0wMS0xOCA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpZm5kZWYgX19YWl9DUkM2NF9IDQorI2RlZmluZSBfX1haX0NSQzY0X0gNCisNCisjaW5jbHVkZSA8c3RkZGVmLmg+DQorDQorI2luY2x1ZGUgIjd6VHlwZXMuaCINCisNCitFWFRFUk5fQ19CRUdJTg0KKw0KK2V4dGVybiBVSW50NjQgZ19DcmM2NFRhYmxlW107DQorDQordm9pZCBNWV9GQVNUX0NBTEwgQ3JjNjRHZW5lcmF0ZVRhYmxlKHZvaWQpOw0KKw0KKyNkZWZpbmUgQ1JDNjRfSU5JVF9WQUwgVUlOVDY0X0NPTlNUKDB4RkZGRkZGRkZGRkZGRkZGRikNCisjZGVmaW5lIENSQzY0X0dFVF9ESUdFU1QoY3JjKSAoKGNyYykgXiBDUkM2NF9JTklUX1ZBTCkNCisjZGVmaW5lIENSQzY0X1VQREFURV9CWVRFKGNyYywgYikgKGdfQ3JjNjRUYWJsZVsoKGNyYykgXiAoYikpICYgMHhGRl0gXiAoKGNyYykgPj4gOCkpDQorDQorVUludDY0IE1ZX0ZBU1RfQ0FMTCBDcmM2NFVwZGF0ZShVSW50NjQgY3JjLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7DQorVUludDY0IE1ZX0ZBU1RfQ0FMTCBDcmM2NENhbGMoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOw0KKw0KK0VYVEVSTl9DX0VORA0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy9YekNyYzY0T3B0LmMgYi9sem1hL0MvWHpDcmM2NE9wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YmU1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvWHpDcmM2NE9wdC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIFh6Q3JjNjRPcHQuYyAtLSBDUkM2NCBjYWxjdWxhdGlvbg0KKzIwMTEtMDYtMjggOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiUHJlY29tcC5oIg0KKw0KKyNpbmNsdWRlICJDcHVBcmNoLmgiDQorDQorI2RlZmluZSBDUkNfVVBEQVRFX0JZVEVfMihjcmMsIGIpICh0YWJsZVsoKGNyYykgXiAoYikpICYgMHhGRl0gXiAoKGNyYykgPj4gOCkpDQorDQorI2lmbmRlZiBNWV9DUFVfQkUNCisNCitVSW50NjQgTVlfRkFTVF9DQUxMIFh6Q3JjNjRVcGRhdGVUNChVSW50NjQgdiwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGNvbnN0IFVJbnQ2NCAqdGFibGUpDQorew0KKyAgY29uc3QgQnl0ZSAqcCA9IChjb25zdCBCeXRlICopZGF0YTsNCisgIGZvciAoOyBzaXplID4gMCAmJiAoKHVuc2lnbmVkKShwdHJkaWZmX3QpcCAmIDMpICE9IDA7IHNpemUtLSwgcCsrKQ0KKyAgICB2ID0gQ1JDX1VQREFURV9CWVRFXzIodiwgKnApOw0KKyAgZm9yICg7IHNpemUgPj0gNDsgc2l6ZSAtPSA0LCBwICs9IDQpDQorICB7DQorICAgIFVJbnQzMiBkID0gKFVJbnQzMil2IF4gKihjb25zdCBVSW50MzIgKilwOw0KKyAgICB2ID0gKHYgPj4gMzIpIF4NCisgICAgICB0YWJsZVsweDMwMCArICgoZCAgICAgICkgJiAweEZGKV0gXg0KKyAgICAgIHRhYmxlWzB4MjAwICsgKChkID4+ICA4KSAmIDB4RkYpXSBeDQorICAgICAgdGFibGVbMHgxMDAgKyAoKGQgPj4gMTYpICYgMHhGRildIF4NCisgICAgICB0YWJsZVsweDAwMCArICgoZCA+PiAyNCkpXTsNCisgIH0NCisgIGZvciAoOyBzaXplID4gMDsgc2l6ZS0tLCBwKyspDQorICAgIHYgPSBDUkNfVVBEQVRFX0JZVEVfMih2LCAqcCk7DQorICByZXR1cm4gdjsNCit9DQorDQorI2VuZGlmDQorDQorDQorI2lmbmRlZiBNWV9DUFVfTEUNCisNCisjZGVmaW5lIENSQ19VSU5UNjRfU1dBUCh2KSBcDQorICAoKHYgPj4gNTYpIHwgXA0KKyAgKCh2ID4+IDQwKSAmICgoVUludDY0KTB4RkYgPDwgIDgpKSB8IFwNCisgICgodiA+PiAyNCkgJiAoKFVJbnQ2NCkweEZGIDw8IDE2KSkgfCBcDQorICAoKHYgPj4gIDgpICYgKChVSW50NjQpMHhGRiA8PCAyNCkpIHwgXA0KKyAgKCh2IDw8ICA4KSAmICgoVUludDY0KTB4RkYgPDwgMzIpKSB8IFwNCisgICgodiA8PCAyNCkgJiAoKFVJbnQ2NCkweEZGIDw8IDQwKSkgfCBcDQorICAoKHYgPDwgNDApICYgKChVSW50NjQpMHhGRiA8PCA0OCkpIHwgXA0KKyAgICh2IDw8IDU2KSkNCisNCitVSW50NjQgTVlfRkFTVF9DQUxMIFh6Q3JjNjRVcGRhdGVUMV9CZVQ0KFVJbnQ2NCB2LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgY29uc3QgVUludDY0ICp0YWJsZSkNCit7DQorICBjb25zdCBCeXRlICpwID0gKGNvbnN0IEJ5dGUgKilkYXRhOw0KKyAgZm9yICg7IHNpemUgPiAwICYmICgodW5zaWduZWQpKHB0cmRpZmZfdClwICYgMykgIT0gMDsgc2l6ZS0tLCBwKyspDQorICAgIHYgPSBDUkNfVVBEQVRFX0JZVEVfMih2LCAqcCk7DQorICB2ID0gQ1JDX1VJTlQ2NF9TV0FQKHYpOw0KKyAgdGFibGUgKz0gMHgxMDA7DQorICBmb3IgKDsgc2l6ZSA+PSA0OyBzaXplIC09IDQsIHAgKz0gNCkNCisgIHsNCisgICAgVUludDMyIGQgPSAoVUludDMyKSh2ID4+IDMyKSBeICooY29uc3QgVUludDMyICopcDsNCisgICAgdiA9ICh2IDw8IDMyKSBeDQorICAgICAgdGFibGVbMHgwMDAgKyAoKGQgICAgICApICYgMHhGRildIF4NCisgICAgICB0YWJsZVsweDEwMCArICgoZCA+PiAgOCkgJiAweEZGKV0gXg0KKyAgICAgIHRhYmxlWzB4MjAwICsgKChkID4+IDE2KSAmIDB4RkYpXSBeDQorICAgICAgdGFibGVbMHgzMDAgKyAoKGQgPj4gMjQpKV07DQorICB9DQorICB0YWJsZSAtPSAweDEwMDsNCisgIHYgPSBDUkNfVUlOVDY0X1NXQVAodik7DQorICBmb3IgKDsgc2l6ZSA+IDA7IHNpemUtLSwgcCsrKQ0KKyAgICB2ID0gQ1JDX1VQREFURV9CWVRFXzIodiwgKnApOw0KKyAgcmV0dXJuIHY7DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQy9YekRlYy5jIGIvbHptYS9DL1h6RGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIzZjIyMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9YekRlYy5jCkBAIC0wLDAgKzEsOTA5IEBACisvKiBYekRlYy5jIC0tIFh6IERlY29kZQ0KKzIwMTQtMTItMzAgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gKi8NCisNCisjaW5jbHVkZSAiUHJlY29tcC5oIg0KKw0KKy8qICNkZWZpbmUgWFpfRFVNUCAqLw0KKw0KKyNpZmRlZiBYWl9EVU1QDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2VuZGlmDQorDQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisNCisjaW5jbHVkZSAiN3pDcmMuaCINCisjaW5jbHVkZSAiQWxsb2MuaCINCisjaW5jbHVkZSAiQnJhLmgiDQorI2luY2x1ZGUgIkNwdUFyY2guaCINCisjaW5jbHVkZSAiRGVsdGEuaCINCisjaW5jbHVkZSAiTHptYTJEZWMuaCINCisNCisjaWZkZWYgVVNFX1NVQkJMT0NLDQorI2luY2x1ZGUgIkJjajNEZWMuYyINCisjaW5jbHVkZSAiU2JEZWMuYyINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiWHouaCINCisNCisjZGVmaW5lIFhaX0NIRUNLX1NJWkVfTUFYIDY0DQorDQorI2RlZmluZSBDT0RFUl9CVUZfU0laRSAoMSA8PCAxNykNCisNCit1bnNpZ25lZCBYel9SZWFkVmFySW50KGNvbnN0IEJ5dGUgKnAsIHNpemVfdCBtYXhTaXplLCBVSW50NjQgKnZhbHVlKQ0KK3sNCisgIGludCBpLCBsaW1pdDsNCisgICp2YWx1ZSA9IDA7DQorICBsaW1pdCA9IChtYXhTaXplID4gOSkgPyA5IDogKGludCltYXhTaXplOw0KKw0KKyAgZm9yIChpID0gMDsgaSA8IGxpbWl0OykNCisgIHsNCisgICAgQnl0ZSBiID0gcFtpXTsNCisgICAgKnZhbHVlIHw9IChVSW50NjQpKGIgJiAweDdGKSA8PCAoNyAqIGkrKyk7DQorICAgIGlmICgoYiAmIDB4ODApID09IDApDQorICAgICAgcmV0dXJuIChiID09IDAgJiYgaSAhPSAxKSA/IDAgOiBpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KKy8qIC0tLS0tLS0tLS0gQnJhU3RhdGUgLS0tLS0tLS0tLSAqLw0KKw0KKyNkZWZpbmUgQlJBX0JVRl9TSVpFICgxIDw8IDE0KQ0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgc2l6ZV90IGJ1ZlBvczsNCisgIHNpemVfdCBidWZDb252Ow0KKyAgc2l6ZV90IGJ1ZlRvdGFsOw0KKw0KKyAgVUludDMyIG1ldGhvZElkOw0KKyAgaW50IGVuY29kZU1vZGU7DQorICBVSW50MzIgZGVsdGE7DQorICBVSW50MzIgaXA7DQorICBVSW50MzIgeDg2U3RhdGU7DQorICBCeXRlIGRlbHRhU3RhdGVbREVMVEFfU1RBVEVfU0laRV07DQorDQorICBCeXRlIGJ1ZltCUkFfQlVGX1NJWkVdOw0KK30gQ0JyYVN0YXRlOw0KKw0KK3ZvaWQgQnJhU3RhdGVfRnJlZSh2b2lkICpwcCwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIGFsbG9jLT5GcmVlKGFsbG9jLCBwcCk7DQorfQ0KKw0KK1NSZXMgQnJhU3RhdGVfU2V0UHJvcHModm9pZCAqcHAsIGNvbnN0IEJ5dGUgKnByb3BzLCBzaXplX3QgcHJvcFNpemUsIElTekFsbG9jICphbGxvYykNCit7DQorICBDQnJhU3RhdGUgKnAgPSAoKENCcmFTdGF0ZSAqKXBwKTsNCisgIGFsbG9jID0gYWxsb2M7DQorICBwLT5pcCA9IDA7DQorICBpZiAocC0+bWV0aG9kSWQgPT0gWFpfSURfRGVsdGEpDQorICB7DQorICAgIGlmIChwcm9wU2l6ZSAhPSAxKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgICAgcC0+ZGVsdGEgPSAodW5zaWduZWQpcHJvcHNbMF0gKyAxOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBpZiAocHJvcFNpemUgPT0gNCkNCisgICAgew0KKyAgICAgIFVJbnQzMiB2ID0gR2V0VWkzMihwcm9wcyk7DQorICAgICAgc3dpdGNoKHAtPm1ldGhvZElkKQ0KKyAgICAgIHsNCisgICAgICAgIGNhc2UgWFpfSURfUFBDOg0KKyAgICAgICAgY2FzZSBYWl9JRF9BUk06DQorICAgICAgICBjYXNlIFhaX0lEX1NQQVJDOg0KKyAgICAgICAgICBpZiAoKHYgJiAzKSAhPSAwKQ0KKyAgICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhaX0lEX0FSTVQ6DQorICAgICAgICAgIGlmICgodiAmIDEpICE9IDApDQorICAgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWFpfSURfSUE2NDoNCisgICAgICAgICAgaWYgKCh2ICYgMHhGKSAhPSAwKQ0KKyAgICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHAtPmlwID0gdjsNCisgICAgfQ0KKyAgICBlbHNlIGlmIChwcm9wU2l6ZSAhPSAwKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgIH0NCisgIHJldHVybiBTWl9PSzsNCit9DQorDQordm9pZCBCcmFTdGF0ZV9Jbml0KHZvaWQgKnBwKQ0KK3sNCisgIENCcmFTdGF0ZSAqcCA9ICgoQ0JyYVN0YXRlICopcHApOw0KKyAgcC0+YnVmUG9zID0gcC0+YnVmQ29udiA9IHAtPmJ1ZlRvdGFsID0gMDsNCisgIHg4Nl9Db252ZXJ0X0luaXQocC0+eDg2U3RhdGUpOw0KKyAgaWYgKHAtPm1ldGhvZElkID09IFhaX0lEX0RlbHRhKQ0KKyAgICBEZWx0YV9Jbml0KHAtPmRlbHRhU3RhdGUpOw0KK30NCisNCisjZGVmaW5lIENBU0VfQlJBX0NPTlYoaXNhKSBjYXNlIFhaX0lEXyAjIyBpc2E6IHAtPmJ1ZkNvbnYgPSBpc2EgIyMgX0NvbnZlcnQocC0+YnVmLCBwLT5idWZUb3RhbCwgcC0+aXAsIHAtPmVuY29kZU1vZGUpOyBicmVhazsNCisNCitzdGF0aWMgU1JlcyBCcmFTdGF0ZV9Db2RlKHZvaWQgKnBwLCBCeXRlICpkZXN0LCBTaXplVCAqZGVzdExlbiwgY29uc3QgQnl0ZSAqc3JjLCBTaXplVCAqc3JjTGVuLA0KKyAgICBpbnQgc3JjV2FzRmluaXNoZWQsIEVDb2RlckZpbmlzaE1vZGUgZmluaXNoTW9kZSwgaW50ICp3YXNGaW5pc2hlZCkNCit7DQorICBDQnJhU3RhdGUgKnAgPSAoKENCcmFTdGF0ZSAqKXBwKTsNCisgIFNpemVUIGRlc3RMZW5PcmlnID0gKmRlc3RMZW47DQorICBTaXplVCBzcmNMZW5PcmlnID0gKnNyY0xlbjsNCisgICpkZXN0TGVuID0gMDsNCisgICpzcmNMZW4gPSAwOw0KKyAgZmluaXNoTW9kZSA9IGZpbmlzaE1vZGU7DQorICAqd2FzRmluaXNoZWQgPSAwOw0KKyAgd2hpbGUgKGRlc3RMZW5PcmlnID4gMCkNCisgIHsNCisgICAgaWYgKHAtPmJ1ZlBvcyAhPSBwLT5idWZDb252KQ0KKyAgICB7DQorICAgICAgc2l6ZV90IGN1clNpemUgPSBwLT5idWZDb252IC0gcC0+YnVmUG9zOw0KKyAgICAgIGlmIChjdXJTaXplID4gZGVzdExlbk9yaWcpDQorICAgICAgICBjdXJTaXplID0gZGVzdExlbk9yaWc7DQorICAgICAgbWVtY3B5KGRlc3QsIHAtPmJ1ZiArIHAtPmJ1ZlBvcywgY3VyU2l6ZSk7DQorICAgICAgcC0+YnVmUG9zICs9IGN1clNpemU7DQorICAgICAgKmRlc3RMZW4gKz0gY3VyU2l6ZTsNCisgICAgICBkZXN0ICs9IGN1clNpemU7DQorICAgICAgZGVzdExlbk9yaWcgLT0gY3VyU2l6ZTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBwLT5idWZUb3RhbCAtPSBwLT5idWZQb3M7DQorICAgIG1lbW1vdmUocC0+YnVmLCBwLT5idWYgKyBwLT5idWZQb3MsIHAtPmJ1ZlRvdGFsKTsNCisgICAgcC0+YnVmUG9zID0gMDsNCisgICAgcC0+YnVmQ29udiA9IDA7DQorICAgIHsNCisgICAgICBzaXplX3QgY3VyU2l6ZSA9IEJSQV9CVUZfU0laRSAtIHAtPmJ1ZlRvdGFsOw0KKyAgICAgIGlmIChjdXJTaXplID4gc3JjTGVuT3JpZykNCisgICAgICAgIGN1clNpemUgPSBzcmNMZW5PcmlnOw0KKyAgICAgIG1lbWNweShwLT5idWYgKyBwLT5idWZUb3RhbCwgc3JjLCBjdXJTaXplKTsNCisgICAgICAqc3JjTGVuICs9IGN1clNpemU7DQorICAgICAgc3JjICs9IGN1clNpemU7DQorICAgICAgc3JjTGVuT3JpZyAtPSBjdXJTaXplOw0KKyAgICAgIHAtPmJ1ZlRvdGFsICs9IGN1clNpemU7DQorICAgIH0NCisgICAgaWYgKHAtPmJ1ZlRvdGFsID09IDApDQorICAgICAgYnJlYWs7DQorICAgIHN3aXRjaChwLT5tZXRob2RJZCkNCisgICAgew0KKyAgICAgIGNhc2UgWFpfSURfRGVsdGE6DQorICAgICAgICBpZiAocC0+ZW5jb2RlTW9kZSkNCisgICAgICAgICAgRGVsdGFfRW5jb2RlKHAtPmRlbHRhU3RhdGUsIHAtPmRlbHRhLCBwLT5idWYsIHAtPmJ1ZlRvdGFsKTsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgRGVsdGFfRGVjb2RlKHAtPmRlbHRhU3RhdGUsIHAtPmRlbHRhLCBwLT5idWYsIHAtPmJ1ZlRvdGFsKTsNCisgICAgICAgIHAtPmJ1ZkNvbnYgPSBwLT5idWZUb3RhbDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWFpfSURfWDg2Og0KKyAgICAgICAgcC0+YnVmQ29udiA9IHg4Nl9Db252ZXJ0KHAtPmJ1ZiwgcC0+YnVmVG90YWwsIHAtPmlwLCAmcC0+eDg2U3RhdGUsIHAtPmVuY29kZU1vZGUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgQ0FTRV9CUkFfQ09OVihQUEMpDQorICAgICAgQ0FTRV9CUkFfQ09OVihJQTY0KQ0KKyAgICAgIENBU0VfQlJBX0NPTlYoQVJNKQ0KKyAgICAgIENBU0VfQlJBX0NPTlYoQVJNVCkNCisgICAgICBDQVNFX0JSQV9DT05WKFNQQVJDKQ0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICAgIH0NCisgICAgcC0+aXAgKz0gKFVJbnQzMilwLT5idWZDb252Ow0KKw0KKyAgICBpZiAocC0+YnVmQ29udiA9PSAwKQ0KKyAgICB7DQorICAgICAgaWYgKCFzcmNXYXNGaW5pc2hlZCkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIHAtPmJ1ZkNvbnYgPSBwLT5idWZUb3RhbDsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHAtPmJ1ZlRvdGFsID09IHAtPmJ1ZlBvcyAmJiBzcmNMZW5PcmlnID09IDAgJiYgc3JjV2FzRmluaXNoZWQpDQorICAgICp3YXNGaW5pc2hlZCA9IDE7DQorICByZXR1cm4gU1pfT0s7DQorfQ0KKw0KK1NSZXMgQnJhU3RhdGVfU2V0RnJvbU1ldGhvZChJU3RhdGVDb2RlciAqcCwgVUludDY0IGlkLCBpbnQgZW5jb2RlTW9kZSwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIENCcmFTdGF0ZSAqZGVjb2RlcjsNCisgIGlmIChpZCAhPSBYWl9JRF9EZWx0YSAmJg0KKyAgICAgIGlkICE9IFhaX0lEX1g4NiAmJg0KKyAgICAgIGlkICE9IFhaX0lEX1BQQyAmJg0KKyAgICAgIGlkICE9IFhaX0lEX0lBNjQgJiYNCisgICAgICBpZCAhPSBYWl9JRF9BUk0gJiYNCisgICAgICBpZCAhPSBYWl9JRF9BUk1UICYmDQorICAgICAgaWQgIT0gWFpfSURfU1BBUkMpDQorICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgIHAtPnAgPSAwOw0KKyAgZGVjb2RlciA9IChDQnJhU3RhdGUgKilhbGxvYy0+QWxsb2MoYWxsb2MsIHNpemVvZihDQnJhU3RhdGUpKTsNCisgIGlmIChkZWNvZGVyID09IDApDQorICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorICBkZWNvZGVyLT5tZXRob2RJZCA9IChVSW50MzIpaWQ7DQorICBkZWNvZGVyLT5lbmNvZGVNb2RlID0gZW5jb2RlTW9kZTsNCisgIHAtPnAgPSBkZWNvZGVyOw0KKyAgcC0+RnJlZSA9IEJyYVN0YXRlX0ZyZWU7DQorICBwLT5TZXRQcm9wcyA9IEJyYVN0YXRlX1NldFByb3BzOw0KKyAgcC0+SW5pdCA9IEJyYVN0YXRlX0luaXQ7DQorICBwLT5Db2RlID0gQnJhU3RhdGVfQ29kZTsNCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorLyogLS0tLS0tLS0tLSBTYlN0YXRlIC0tLS0tLS0tLS0gKi8NCisNCisjaWZkZWYgVVNFX1NVQkJMT0NLDQorDQorc3RhdGljIHZvaWQgU2JTdGF0ZV9GcmVlKHZvaWQgKnBwLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgQ1NiRGVjICpwID0gKENTYkRlYyAqKXBwOw0KKyAgU2JEZWNfRnJlZShwKTsNCisgIGFsbG9jLT5GcmVlKGFsbG9jLCBwcCk7DQorfQ0KKw0KK3N0YXRpYyBTUmVzIFNiU3RhdGVfU2V0UHJvcHModm9pZCAqcHAsIGNvbnN0IEJ5dGUgKnByb3BzLCBzaXplX3QgcHJvcFNpemUsIElTekFsbG9jICphbGxvYykNCit7DQorICBwcCA9IHBwOw0KKyAgcHJvcHMgPSBwcm9wczsNCisgIGFsbG9jID0gYWxsb2M7DQorICByZXR1cm4gKHByb3BTaXplID09IDApID8gU1pfT0sgOiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCit9DQorDQorc3RhdGljIHZvaWQgU2JTdGF0ZV9Jbml0KHZvaWQgKnBwKQ0KK3sNCisgIFNiRGVjX0luaXQoKENTYkRlYyAqKXBwKTsNCit9DQorDQorc3RhdGljIFNSZXMgU2JTdGF0ZV9Db2RlKHZvaWQgKnBwLCBCeXRlICpkZXN0LCBTaXplVCAqZGVzdExlbiwgY29uc3QgQnl0ZSAqc3JjLCBTaXplVCAqc3JjTGVuLA0KKyAgICBpbnQgc3JjV2FzRmluaXNoZWQsIEVDb2RlckZpbmlzaE1vZGUgZmluaXNoTW9kZSwgaW50ICp3YXNGaW5pc2hlZCkNCit7DQorICBDU2JEZWMgKnAgPSAoQ1NiRGVjICopcHA7DQorICBTUmVzIHJlczsNCisgIHNyY1dhc0ZpbmlzaGVkID0gc3JjV2FzRmluaXNoZWQ7DQorICBwLT5kZXN0ID0gZGVzdDsNCisgIHAtPmRlc3RMZW4gPSAqZGVzdExlbjsNCisgIHAtPnNyYyA9IHNyYzsNCisgIHAtPnNyY0xlbiA9ICpzcmNMZW47DQorICBwLT5maW5pc2ggPSBmaW5pc2hNb2RlOyAvKiBjaGFuZ2UgaXQgKi8NCisgIHJlcyA9IFNiRGVjX0RlY29kZSgoQ1NiRGVjICopcHApOw0KKyAgKmRlc3RMZW4gLT0gcC0+ZGVzdExlbjsNCisgICpzcmNMZW4gLT0gcC0+c3JjTGVuOw0KKyAgKndhc0ZpbmlzaGVkID0gKCpkZXN0TGVuID09IDAgJiYgKnNyY0xlbiA9PSAwKTsgLyogY2hhbmdlIGl0ICovDQorICByZXR1cm4gcmVzOw0KK30NCisNCitTUmVzIFNiU3RhdGVfU2V0RnJvbU1ldGhvZChJU3RhdGVDb2RlciAqcCwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIENTYkRlYyAqZGVjb2RlcjsNCisgIHAtPnAgPSAwOw0KKyAgZGVjb2RlciA9IGFsbG9jLT5BbGxvYyhhbGxvYywgc2l6ZW9mKENTYkRlYykpOw0KKyAgaWYgKGRlY29kZXIgPT0gMCkNCisgICAgcmV0dXJuIFNaX0VSUk9SX01FTTsNCisgIHAtPnAgPSBkZWNvZGVyOw0KKyAgcC0+RnJlZSA9IFNiU3RhdGVfRnJlZTsNCisgIHAtPlNldFByb3BzID0gU2JTdGF0ZV9TZXRQcm9wczsNCisgIHAtPkluaXQgPSBTYlN0YXRlX0luaXQ7DQorICBwLT5Db2RlID0gU2JTdGF0ZV9Db2RlOw0KKyAgU2JEZWNfQ29uc3RydWN0KGRlY29kZXIpOw0KKyAgU2JEZWNfU2V0QWxsb2MoZGVjb2RlciwgYWxsb2MpOw0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisjZW5kaWYNCisNCisvKiAtLS0tLS0tLS0tIEx6bWEyU3RhdGUgLS0tLS0tLS0tLSAqLw0KKw0KK3N0YXRpYyB2b2lkIEx6bWEyU3RhdGVfRnJlZSh2b2lkICpwcCwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIEx6bWEyRGVjX0ZyZWUoKENMem1hMkRlYyAqKXBwLCBhbGxvYyk7DQorICBhbGxvYy0+RnJlZShhbGxvYywgcHApOw0KK30NCisNCitzdGF0aWMgU1JlcyBMem1hMlN0YXRlX1NldFByb3BzKHZvaWQgKnBwLCBjb25zdCBCeXRlICpwcm9wcywgc2l6ZV90IHByb3BTaXplLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgaWYgKHByb3BTaXplICE9IDEpDQorICAgIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgIHJldHVybiBMem1hMkRlY19BbGxvY2F0ZSgoQ0x6bWEyRGVjICopcHAsIHByb3BzWzBdLCBhbGxvYyk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIEx6bWEyU3RhdGVfSW5pdCh2b2lkICpwcCkNCit7DQorICBMem1hMkRlY19Jbml0KChDTHptYTJEZWMgKilwcCk7DQorfQ0KKw0KK3N0YXRpYyBTUmVzIEx6bWEyU3RhdGVfQ29kZSh2b2lkICpwcCwgQnl0ZSAqZGVzdCwgU2l6ZVQgKmRlc3RMZW4sIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbiwNCisgICAgaW50IHNyY1dhc0ZpbmlzaGVkLCBFQ29kZXJGaW5pc2hNb2RlIGZpbmlzaE1vZGUsIGludCAqd2FzRmluaXNoZWQpDQorew0KKyAgRUx6bWFTdGF0dXMgc3RhdHVzOw0KKyAgLyogRUx6bWFGaW5pc2hNb2RlIGZtID0gKGZpbmlzaE1vZGUgPT0gTFpNQV9GSU5JU0hfQU5ZKSA/IExaTUFfRklOSVNIX0FOWSA6IExaTUFfRklOSVNIX0VORDsgKi8NCisgIFNSZXMgcmVzID0gTHptYTJEZWNfRGVjb2RlVG9CdWYoKENMem1hMkRlYyAqKXBwLCBkZXN0LCBkZXN0TGVuLCBzcmMsIHNyY0xlbiwgKEVMem1hRmluaXNoTW9kZSlmaW5pc2hNb2RlLCAmc3RhdHVzKTsNCisgIHNyY1dhc0ZpbmlzaGVkID0gc3JjV2FzRmluaXNoZWQ7DQorICAqd2FzRmluaXNoZWQgPSAoc3RhdHVzID09IExaTUFfU1RBVFVTX0ZJTklTSEVEX1dJVEhfTUFSSyk7DQorICByZXR1cm4gcmVzOw0KK30NCisNCitzdGF0aWMgU1JlcyBMem1hMlN0YXRlX1NldEZyb21NZXRob2QoSVN0YXRlQ29kZXIgKnAsIElTekFsbG9jICphbGxvYykNCit7DQorICBDTHptYTJEZWMgKmRlY29kZXIgPSAoQ0x6bWEyRGVjICopYWxsb2MtPkFsbG9jKGFsbG9jLCBzaXplb2YoQ0x6bWEyRGVjKSk7DQorICBwLT5wID0gZGVjb2RlcjsNCisgIGlmIChkZWNvZGVyID09IDApDQorICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorICBwLT5GcmVlID0gTHptYTJTdGF0ZV9GcmVlOw0KKyAgcC0+U2V0UHJvcHMgPSBMem1hMlN0YXRlX1NldFByb3BzOw0KKyAgcC0+SW5pdCA9IEx6bWEyU3RhdGVfSW5pdDsNCisgIHAtPkNvZGUgPSBMem1hMlN0YXRlX0NvZGU7DQorICBMem1hMkRlY19Db25zdHJ1Y3QoZGVjb2Rlcik7DQorICByZXR1cm4gU1pfT0s7DQorfQ0KKw0KKw0KK3ZvaWQgTWl4Q29kZXJfQ29uc3RydWN0KENNaXhDb2RlciAqcCwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIGludCBpOw0KKyAgcC0+YWxsb2MgPSBhbGxvYzsNCisgIHAtPmJ1ZiA9IDA7DQorICBwLT5udW1Db2RlcnMgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IE1JWENPREVSX05VTV9GSUxURVJTX01BWDsgaSsrKQ0KKyAgICBwLT5jb2RlcnNbaV0ucCA9IE5VTEw7DQorfQ0KKw0KK3ZvaWQgTWl4Q29kZXJfRnJlZShDTWl4Q29kZXIgKnApDQorew0KKyAgaW50IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgcC0+bnVtQ29kZXJzOyBpKyspDQorICB7DQorICAgIElTdGF0ZUNvZGVyICpzYyA9ICZwLT5jb2RlcnNbaV07DQorICAgIGlmIChwLT5hbGxvYyAmJiBzYy0+cCkNCisgICAgICBzYy0+RnJlZShzYy0+cCwgcC0+YWxsb2MpOw0KKyAgfQ0KKyAgcC0+bnVtQ29kZXJzID0gMDsNCisgIGlmIChwLT5idWYpDQorICB7DQorICAgIHAtPmFsbG9jLT5GcmVlKHAtPmFsbG9jLCBwLT5idWYpOw0KKyAgICBwLT5idWYgPSAwOyAvKiA5LjMxOiB0aGUgQlVHIHdhcyBmaXhlZCAqLw0KKyAgfQ0KK30NCisNCit2b2lkIE1peENvZGVyX0luaXQoQ01peENvZGVyICpwKQ0KK3sNCisgIGludCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHAtPm51bUNvZGVycyAtIDE7IGkrKykNCisgIHsNCisgICAgcC0+c2l6ZVtpXSA9IDA7DQorICAgIHAtPnBvc1tpXSA9IDA7DQorICAgIHAtPmZpbmlzaGVkW2ldID0gMDsNCisgIH0NCisgIGZvciAoaSA9IDA7IGkgPCBwLT5udW1Db2RlcnM7IGkrKykNCisgIHsNCisgICAgSVN0YXRlQ29kZXIgKmNvZGVyID0gJnAtPmNvZGVyc1tpXTsNCisgICAgY29kZXItPkluaXQoY29kZXItPnApOw0KKyAgfQ0KK30NCisNCitTUmVzIE1peENvZGVyX1NldEZyb21NZXRob2QoQ01peENvZGVyICpwLCBpbnQgY29kZXJJbmRleCwgVUludDY0IG1ldGhvZElkKQ0KK3sNCisgIElTdGF0ZUNvZGVyICpzYyA9ICZwLT5jb2RlcnNbY29kZXJJbmRleF07DQorICBwLT5pZHNbY29kZXJJbmRleF0gPSBtZXRob2RJZDsNCisgIHN3aXRjaChtZXRob2RJZCkNCisgIHsNCisgICAgY2FzZSBYWl9JRF9MWk1BMjogcmV0dXJuIEx6bWEyU3RhdGVfU2V0RnJvbU1ldGhvZChzYywgcC0+YWxsb2MpOw0KKyAgICAjaWZkZWYgVVNFX1NVQkJMT0NLDQorICAgIGNhc2UgWFpfSURfU3ViYmxvY2s6IHJldHVybiBTYlN0YXRlX1NldEZyb21NZXRob2Qoc2MsIHAtPmFsbG9jKTsNCisgICAgI2VuZGlmDQorICB9DQorICBpZiAoY29kZXJJbmRleCA9PSAwKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICByZXR1cm4gQnJhU3RhdGVfU2V0RnJvbU1ldGhvZChzYywgbWV0aG9kSWQsIDAsIHAtPmFsbG9jKTsNCit9DQorDQorU1JlcyBNaXhDb2Rlcl9Db2RlKENNaXhDb2RlciAqcCwgQnl0ZSAqZGVzdCwgU2l6ZVQgKmRlc3RMZW4sDQorICAgIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbiwgaW50IHNyY1dhc0ZpbmlzaGVkLA0KKyAgICBFQ29kZXJGaW5pc2hNb2RlIGZpbmlzaE1vZGUsIEVDb2RlclN0YXR1cyAqc3RhdHVzKQ0KK3sNCisgIFNpemVUIGRlc3RMZW5PcmlnID0gKmRlc3RMZW47DQorICBTaXplVCBzcmNMZW5PcmlnID0gKnNyY0xlbjsNCisgIEJvb2wgYWxsRmluaXNoZWQgPSBUcnVlOw0KKyAgKmRlc3RMZW4gPSAwOw0KKyAgKnNyY0xlbiA9IDA7DQorICAqc3RhdHVzID0gQ09ERVJfU1RBVFVTX05PVF9GSU5JU0hFRDsNCisNCisgIGlmIChwLT5idWYgPT0gMCkNCisgIHsNCisgICAgcC0+YnVmID0gKEJ5dGUgKilwLT5hbGxvYy0+QWxsb2MocC0+YWxsb2MsIENPREVSX0JVRl9TSVpFICogKE1JWENPREVSX05VTV9GSUxURVJTX01BWCAtIDEpKTsNCisgICAgaWYgKHAtPmJ1ZiA9PSAwKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorICB9DQorDQorICBpZiAocC0+bnVtQ29kZXJzICE9IDEpDQorICAgIGZpbmlzaE1vZGUgPSBDT0RFUl9GSU5JU0hfQU5ZOw0KKw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgQm9vbCBwcm9jZXNzZWQgPSBGYWxzZTsNCisgICAgaW50IGk7DQorICAgIC8qDQorICAgIGlmIChwLT5udW1Db2RlcnMgPT0gMSAmJiAqZGVzdExlbiA9PSBkZXN0TGVuT3JpZyAmJiBmaW5pc2hNb2RlID09IExaTUFfRklOSVNIX0FOWSkNCisgICAgICBicmVhazsNCisgICAgKi8NCisNCisgICAgZm9yIChpID0gMDsgaSA8IHAtPm51bUNvZGVyczsgaSsrKQ0KKyAgICB7DQorICAgICAgU1JlcyByZXM7DQorICAgICAgSVN0YXRlQ29kZXIgKmNvZGVyID0gJnAtPmNvZGVyc1tpXTsNCisgICAgICBCeXRlICpkZXN0Q3VyOw0KKyAgICAgIFNpemVUIGRlc3RMZW5DdXIsIHNyY0xlbkN1cjsNCisgICAgICBjb25zdCBCeXRlICpzcmNDdXI7DQorICAgICAgaW50IHNyY0ZpbmlzaGVkQ3VyOw0KKyAgICAgIGludCBlbmNvZGluZ1dhc0ZpbmlzaGVkOw0KKyAgICAgIA0KKyAgICAgIGlmIChpID09IDApDQorICAgICAgew0KKyAgICAgICAgc3JjQ3VyID0gc3JjOw0KKyAgICAgICAgc3JjTGVuQ3VyID0gc3JjTGVuT3JpZyAtICpzcmNMZW47DQorICAgICAgICBzcmNGaW5pc2hlZEN1ciA9IHNyY1dhc0ZpbmlzaGVkOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgc3JjQ3VyID0gcC0+YnVmICsgKENPREVSX0JVRl9TSVpFICogKGkgLSAxKSkgKyBwLT5wb3NbaSAtIDFdOw0KKyAgICAgICAgc3JjTGVuQ3VyID0gcC0+c2l6ZVtpIC0gMV0gLSBwLT5wb3NbaSAtIDFdOw0KKyAgICAgICAgc3JjRmluaXNoZWRDdXIgPSBwLT5maW5pc2hlZFtpIC0gMV07DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIGlmIChpID09IHAtPm51bUNvZGVycyAtIDEpDQorICAgICAgew0KKyAgICAgICAgZGVzdEN1ciA9IGRlc3Q7DQorICAgICAgICBkZXN0TGVuQ3VyID0gZGVzdExlbk9yaWcgLSAqZGVzdExlbjsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChwLT5wb3NbaV0gIT0gcC0+c2l6ZVtpXSkNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICBkZXN0Q3VyID0gcC0+YnVmICsgKENPREVSX0JVRl9TSVpFICogaSk7DQorICAgICAgICBkZXN0TGVuQ3VyID0gQ09ERVJfQlVGX1NJWkU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIHJlcyA9IGNvZGVyLT5Db2RlKGNvZGVyLT5wLCBkZXN0Q3VyLCAmZGVzdExlbkN1ciwgc3JjQ3VyLCAmc3JjTGVuQ3VyLCBzcmNGaW5pc2hlZEN1ciwgZmluaXNoTW9kZSwgJmVuY29kaW5nV2FzRmluaXNoZWQpOw0KKw0KKyAgICAgIGlmICghZW5jb2RpbmdXYXNGaW5pc2hlZCkNCisgICAgICAgIGFsbEZpbmlzaGVkID0gRmFsc2U7DQorDQorICAgICAgaWYgKGkgPT0gMCkNCisgICAgICB7DQorICAgICAgICAqc3JjTGVuICs9IHNyY0xlbkN1cjsNCisgICAgICAgIHNyYyArPSBzcmNMZW5DdXI7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBwLT5wb3NbaSAtIDFdICs9IHNyY0xlbkN1cjsNCisgICAgICB9DQorDQorICAgICAgaWYgKGkgPT0gcC0+bnVtQ29kZXJzIC0gMSkNCisgICAgICB7DQorICAgICAgICAqZGVzdExlbiArPSBkZXN0TGVuQ3VyOw0KKyAgICAgICAgZGVzdCArPSBkZXN0TGVuQ3VyOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgcC0+c2l6ZVtpXSA9IGRlc3RMZW5DdXI7DQorICAgICAgICBwLT5wb3NbaV0gPSAwOw0KKyAgICAgICAgcC0+ZmluaXNoZWRbaV0gPSBlbmNvZGluZ1dhc0ZpbmlzaGVkOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBpZiAocmVzICE9IFNaX09LKQ0KKyAgICAgICAgcmV0dXJuIHJlczsNCisNCisgICAgICBpZiAoZGVzdExlbkN1ciAhPSAwIHx8IHNyY0xlbkN1ciAhPSAwKQ0KKyAgICAgICAgcHJvY2Vzc2VkID0gVHJ1ZTsNCisgICAgfQ0KKyAgICBpZiAoIXByb2Nlc3NlZCkNCisgICAgICBicmVhazsNCisgIH0NCisgIGlmIChhbGxGaW5pc2hlZCkNCisgICAgKnN0YXR1cyA9IENPREVSX1NUQVRVU19GSU5JU0hFRF9XSVRIX01BUks7DQorICByZXR1cm4gU1pfT0s7DQorfQ0KKw0KK1NSZXMgWHpfUGFyc2VIZWFkZXIoQ1h6U3RyZWFtRmxhZ3MgKnAsIGNvbnN0IEJ5dGUgKmJ1ZikNCit7DQorICAqcCA9IChDWHpTdHJlYW1GbGFncylHZXRCZTE2KGJ1ZiArIFhaX1NJR19TSVpFKTsNCisgIGlmIChDcmNDYWxjKGJ1ZiArIFhaX1NJR19TSVpFLCBYWl9TVFJFQU1fRkxBR1NfU0laRSkgIT0NCisgICAgICBHZXRVaTMyKGJ1ZiArIFhaX1NJR19TSVpFICsgWFpfU1RSRUFNX0ZMQUdTX1NJWkUpKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfTk9fQVJDSElWRTsNCisgIHJldHVybiBYekZsYWdzX0lzU3VwcG9ydGVkKCpwKSA/IFNaX09LIDogU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorfQ0KKw0KK3N0YXRpYyBCb29sIFh6X0NoZWNrRm9vdGVyKENYelN0cmVhbUZsYWdzIGZsYWdzLCBVSW50NjQgaW5kZXhTaXplLCBjb25zdCBCeXRlICpidWYpDQorew0KKyAgcmV0dXJuDQorICAgICAgaW5kZXhTaXplID09ICgoKFVJbnQ2NClHZXRVaTMyKGJ1ZiArIDQpICsgMSkgPDwgMikgJiYNCisgICAgICAoR2V0VWkzMihidWYpID09IENyY0NhbGMoYnVmICsgNCwgNikgJiYNCisgICAgICBmbGFncyA9PSBHZXRCZTE2KGJ1ZiArIDgpICYmDQorICAgICAgbWVtY21wKGJ1ZiArIDEwLCBYWl9GT09URVJfU0lHLCBYWl9GT09URVJfU0lHX1NJWkUpID09IDApOw0KK30NCisNCisjZGVmaW5lIFJFQURfVkFSSU5UX0FORF9DSEVDSyhidWYsIHBvcywgc2l6ZSwgcmVzKSBcDQorICB7IHVuc2lnbmVkIHMgPSBYel9SZWFkVmFySW50KGJ1ZiArIHBvcywgc2l6ZSAtIHBvcywgcmVzKTsgXA0KKyAgaWYgKHMgPT0gMCkgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7IHBvcyArPSBzOyB9DQorDQorDQorU1JlcyBYekJsb2NrX1BhcnNlKENYekJsb2NrICpwLCBjb25zdCBCeXRlICpoZWFkZXIpDQorew0KKyAgdW5zaWduZWQgcG9zOw0KKyAgaW50IG51bUZpbHRlcnMsIGk7DQorICBVSW50MzIgaGVhZGVyU2l6ZSA9IChVSW50MzIpaGVhZGVyWzBdIDw8IDI7DQorDQorICBpZiAoQ3JjQ2FsYyhoZWFkZXIsIGhlYWRlclNpemUpICE9IEdldFVpMzIoaGVhZGVyICsgaGVhZGVyU2l6ZSkpDQorICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKw0KKyAgcG9zID0gMTsNCisgIGlmIChwb3MgPT0gaGVhZGVyU2l6ZSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorICBwLT5mbGFncyA9IGhlYWRlcltwb3MrK107DQorDQorICBpZiAoWHpCbG9ja19IYXNQYWNrU2l6ZShwKSkNCisgIHsNCisgICAgUkVBRF9WQVJJTlRfQU5EX0NIRUNLKGhlYWRlciwgcG9zLCBoZWFkZXJTaXplLCAmcC0+cGFja1NpemUpOw0KKyAgICBpZiAocC0+cGFja1NpemUgPT0gMCB8fCBwLT5wYWNrU2l6ZSArIGhlYWRlclNpemUgPj0gKFVJbnQ2NCkxIDw8IDYzKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgfQ0KKw0KKyAgaWYgKFh6QmxvY2tfSGFzVW5wYWNrU2l6ZShwKSkNCisgICAgUkVBRF9WQVJJTlRfQU5EX0NIRUNLKGhlYWRlciwgcG9zLCBoZWFkZXJTaXplLCAmcC0+dW5wYWNrU2l6ZSk7DQorDQorICBudW1GaWx0ZXJzID0gWHpCbG9ja19HZXROdW1GaWx0ZXJzKHApOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bUZpbHRlcnM7IGkrKykNCisgIHsNCisgICAgQ1h6RmlsdGVyICpmaWx0ZXIgPSBwLT5maWx0ZXJzICsgaTsNCisgICAgVUludDY0IHNpemU7DQorICAgIFJFQURfVkFSSU5UX0FORF9DSEVDSyhoZWFkZXIsIHBvcywgaGVhZGVyU2l6ZSwgJmZpbHRlci0+aWQpOw0KKyAgICBSRUFEX1ZBUklOVF9BTkRfQ0hFQ0soaGVhZGVyLCBwb3MsIGhlYWRlclNpemUsICZzaXplKTsNCisgICAgaWYgKHNpemUgPiBoZWFkZXJTaXplIC0gcG9zIHx8IHNpemUgPiBYWl9GSUxURVJfUFJPUFNfU0laRV9NQVgpDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorICAgIGZpbHRlci0+cHJvcHNTaXplID0gKFVJbnQzMilzaXplOw0KKyAgICBtZW1jcHkoZmlsdGVyLT5wcm9wcywgaGVhZGVyICsgcG9zLCAoc2l6ZV90KXNpemUpOw0KKyAgICBwb3MgKz0gKHVuc2lnbmVkKXNpemU7DQorDQorICAgICNpZmRlZiBYWl9EVU1QDQorICAgIHByaW50ZigiXG5mWyVkXSA9ICUyWDogIiwgaSwgZmlsdGVyLT5pZCk7DQorICAgIHsNCisgICAgICBpbnQgaTsNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KKyAgICAgICAgcHJpbnRmKCIgJTJYIiwgZmlsdGVyLT5wcm9wc1tpXSk7DQorICAgIH0NCisgICAgI2VuZGlmDQorICB9DQorDQorICB3aGlsZSAocG9zIDwgaGVhZGVyU2l6ZSkNCisgICAgaWYgKGhlYWRlcltwb3MrK10gIT0gMCkNCisgICAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisgIHJldHVybiBTWl9PSzsNCit9DQorDQorU1JlcyBYekRlY19Jbml0KENNaXhDb2RlciAqcCwgY29uc3QgQ1h6QmxvY2sgKmJsb2NrKQ0KK3sNCisgIGludCBpOw0KKyAgQm9vbCBuZWVkUmVJbml0ID0gVHJ1ZTsNCisgIGludCBudW1GaWx0ZXJzID0gWHpCbG9ja19HZXROdW1GaWx0ZXJzKGJsb2NrKTsNCisgIGlmIChudW1GaWx0ZXJzID09IHAtPm51bUNvZGVycykNCisgIHsNCisgICAgZm9yIChpID0gMDsgaSA8IG51bUZpbHRlcnM7IGkrKykNCisgICAgICBpZiAocC0+aWRzW2ldICE9IGJsb2NrLT5maWx0ZXJzW251bUZpbHRlcnMgLSAxIC0gaV0uaWQpDQorICAgICAgICBicmVhazsNCisgICAgbmVlZFJlSW5pdCA9IChpICE9IG51bUZpbHRlcnMpOw0KKyAgfQ0KKyAgaWYgKG5lZWRSZUluaXQpDQorICB7DQorICAgIE1peENvZGVyX0ZyZWUocCk7DQorICAgIHAtPm51bUNvZGVycyA9IG51bUZpbHRlcnM7DQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1GaWx0ZXJzOyBpKyspDQorICAgIHsNCisgICAgICBjb25zdCBDWHpGaWx0ZXIgKmYgPSAmYmxvY2stPmZpbHRlcnNbbnVtRmlsdGVycyAtIDEgLSBpXTsNCisgICAgICBSSU5PSyhNaXhDb2Rlcl9TZXRGcm9tTWV0aG9kKHAsIGksIGYtPmlkKSk7DQorICAgIH0NCisgIH0NCisgIGZvciAoaSA9IDA7IGkgPCBudW1GaWx0ZXJzOyBpKyspDQorICB7DQorICAgIGNvbnN0IENYekZpbHRlciAqZiA9ICZibG9jay0+ZmlsdGVyc1tudW1GaWx0ZXJzIC0gMSAtIGldOw0KKyAgICBJU3RhdGVDb2RlciAqc2MgPSAmcC0+Y29kZXJzW2ldOw0KKyAgICBSSU5PSyhzYy0+U2V0UHJvcHMoc2MtPnAsIGYtPnByb3BzLCBmLT5wcm9wc1NpemUsIHAtPmFsbG9jKSk7DQorICB9DQorICBNaXhDb2Rlcl9Jbml0KHApOw0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCit2b2lkIFh6VW5wYWNrZXJfSW5pdChDWHpVbnBhY2tlciAqcCkNCit7DQorICBwLT5zdGF0ZSA9IFhaX1NUQVRFX1NUUkVBTV9IRUFERVI7DQorICBwLT5wb3MgPSAwOw0KKyAgcC0+bnVtU3RhcnRlZFN0cmVhbXMgPSAwOw0KKyAgcC0+bnVtRmluaXNoZWRTdHJlYW1zID0gMDsNCisgIHAtPm51bVRvdGFsQmxvY2tzID0gMDsNCisgIHAtPnBhZFNpemUgPSAwOw0KK30NCisNCit2b2lkIFh6VW5wYWNrZXJfQ29uc3RydWN0KENYelVucGFja2VyICpwLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgTWl4Q29kZXJfQ29uc3RydWN0KCZwLT5kZWNvZGVyLCBhbGxvYyk7DQorICBYelVucGFja2VyX0luaXQocCk7DQorfQ0KKw0KK3ZvaWQgWHpVbnBhY2tlcl9GcmVlKENYelVucGFja2VyICpwKQ0KK3sNCisgIE1peENvZGVyX0ZyZWUoJnAtPmRlY29kZXIpOw0KK30NCisNCitTUmVzIFh6VW5wYWNrZXJfQ29kZShDWHpVbnBhY2tlciAqcCwgQnl0ZSAqZGVzdCwgU2l6ZVQgKmRlc3RMZW4sDQorICAgIGNvbnN0IEJ5dGUgKnNyYywgU2l6ZVQgKnNyY0xlbiwgRUNvZGVyRmluaXNoTW9kZSBmaW5pc2hNb2RlLCBFQ29kZXJTdGF0dXMgKnN0YXR1cykNCit7DQorICBTaXplVCBkZXN0TGVuT3JpZyA9ICpkZXN0TGVuOw0KKyAgU2l6ZVQgc3JjTGVuT3JpZyA9ICpzcmNMZW47DQorICAqZGVzdExlbiA9IDA7DQorICAqc3JjTGVuID0gMDsNCisgICpzdGF0dXMgPSBDT0RFUl9TVEFUVVNfTk9UX1NQRUNJRklFRDsNCisgIGZvciAoOzspDQorICB7DQorICAgIFNpemVUIHNyY1JlbSA9IHNyY0xlbk9yaWcgLSAqc3JjTGVuOw0KKw0KKyAgICBpZiAocC0+c3RhdGUgPT0gWFpfU1RBVEVfQkxPQ0spDQorICAgIHsNCisgICAgICBTaXplVCBkZXN0TGVuMiA9IGRlc3RMZW5PcmlnIC0gKmRlc3RMZW47DQorICAgICAgU2l6ZVQgc3JjTGVuMiA9IHNyY0xlbk9yaWcgLSAqc3JjTGVuOw0KKyAgICAgIFNSZXMgcmVzOw0KKyAgICAgIGlmIChzcmNMZW4yID09IDAgJiYgZGVzdExlbjIgPT0gMCkNCisgICAgICB7DQorICAgICAgICAqc3RhdHVzID0gQ09ERVJfU1RBVFVTX05PVF9GSU5JU0hFRDsNCisgICAgICAgIHJldHVybiBTWl9PSzsNCisgICAgICB9DQorICAgICAgDQorICAgICAgcmVzID0gTWl4Q29kZXJfQ29kZSgmcC0+ZGVjb2RlciwgZGVzdCwgJmRlc3RMZW4yLCBzcmMsICZzcmNMZW4yLCBGYWxzZSwgZmluaXNoTW9kZSwgc3RhdHVzKTsNCisgICAgICBYekNoZWNrX1VwZGF0ZSgmcC0+Y2hlY2ssIGRlc3QsIGRlc3RMZW4yKTsNCisgICAgICANCisgICAgICAoKnNyY0xlbikgKz0gc3JjTGVuMjsNCisgICAgICBzcmMgKz0gc3JjTGVuMjsNCisgICAgICBwLT5wYWNrU2l6ZSArPSBzcmNMZW4yOw0KKyAgICAgIA0KKyAgICAgICgqZGVzdExlbikgKz0gZGVzdExlbjI7DQorICAgICAgZGVzdCArPSBkZXN0TGVuMjsNCisgICAgICBwLT51bnBhY2tTaXplICs9IGRlc3RMZW4yOw0KKyAgICAgIA0KKyAgICAgIFJJTk9LKHJlcyk7DQorICAgICAgDQorICAgICAgaWYgKCpzdGF0dXMgPT0gQ09ERVJfU1RBVFVTX0ZJTklTSEVEX1dJVEhfTUFSSykNCisgICAgICB7DQorICAgICAgICBCeXRlIHRlbXBbMzJdOw0KKyAgICAgICAgdW5zaWduZWQgbnVtID0gWHpfV3JpdGVWYXJJbnQodGVtcCwgcC0+cGFja1NpemUgKyBwLT5ibG9ja0hlYWRlclNpemUgKyBYekZsYWdzX0dldENoZWNrU2l6ZShwLT5zdHJlYW1GbGFncykpOw0KKyAgICAgICAgbnVtICs9IFh6X1dyaXRlVmFySW50KHRlbXAgKyBudW0sIHAtPnVucGFja1NpemUpOw0KKyAgICAgICAgU2hhMjU2X1VwZGF0ZSgmcC0+c2hhLCB0ZW1wLCBudW0pOw0KKyAgICAgICAgcC0+aW5kZXhTaXplICs9IG51bTsNCisgICAgICAgIHAtPm51bUJsb2NrcysrOw0KKyAgICAgICAgDQorICAgICAgICBwLT5zdGF0ZSA9IFhaX1NUQVRFX0JMT0NLX0ZPT1RFUjsNCisgICAgICAgIHAtPnBvcyA9IDA7DQorICAgICAgICBwLT5hbGlnblBvcyA9IDA7DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKHNyY0xlbjIgPT0gMCAmJiBkZXN0TGVuMiA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIFNaX09LOw0KKyAgICAgIA0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorDQorICAgIGlmIChzcmNSZW0gPT0gMCkNCisgICAgew0KKyAgICAgICpzdGF0dXMgPSBDT0RFUl9TVEFUVVNfTkVFRFNfTU9SRV9JTlBVVDsNCisgICAgICByZXR1cm4gU1pfT0s7DQorICAgIH0NCisNCisgICAgc3dpdGNoIChwLT5zdGF0ZSkNCisgICAgew0KKyAgICAgIGNhc2UgWFpfU1RBVEVfU1RSRUFNX0hFQURFUjoNCisgICAgICB7DQorICAgICAgICBpZiAocC0+cG9zIDwgWFpfU1RSRUFNX0hFQURFUl9TSVpFKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAocC0+cG9zIDwgWFpfU0lHX1NJWkUgJiYgKnNyYyAhPSBYWl9TSUdbcC0+cG9zXSkNCisgICAgICAgICAgICByZXR1cm4gU1pfRVJST1JfTk9fQVJDSElWRTsNCisgICAgICAgICAgcC0+YnVmW3AtPnBvcysrXSA9ICpzcmMrKzsNCisgICAgICAgICAgKCpzcmNMZW4pKys7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIFJJTk9LKFh6X1BhcnNlSGVhZGVyKCZwLT5zdHJlYW1GbGFncywgcC0+YnVmKSk7DQorICAgICAgICAgIHAtPm51bVN0YXJ0ZWRTdHJlYW1zKys7DQorICAgICAgICAgIHAtPnN0YXRlID0gWFpfU1RBVEVfQkxPQ0tfSEVBREVSOw0KKyAgICAgICAgICBTaGEyNTZfSW5pdCgmcC0+c2hhKTsNCisgICAgICAgICAgcC0+aW5kZXhTaXplID0gMDsNCisgICAgICAgICAgcC0+bnVtQmxvY2tzID0gMDsNCisgICAgICAgICAgcC0+cG9zID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisNCisgICAgICBjYXNlIFhaX1NUQVRFX0JMT0NLX0hFQURFUjoNCisgICAgICB7DQorICAgICAgICBpZiAocC0+cG9zID09IDApDQorICAgICAgICB7DQorICAgICAgICAgIHAtPmJ1ZltwLT5wb3MrK10gPSAqc3JjKys7DQorICAgICAgICAgICgqc3JjTGVuKSsrOw0KKyAgICAgICAgICBpZiAocC0+YnVmWzBdID09IDApDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBwLT5pbmRleFByZVNpemUgPSAxICsgWHpfV3JpdGVWYXJJbnQocC0+YnVmICsgMSwgcC0+bnVtQmxvY2tzKTsNCisgICAgICAgICAgICBwLT5pbmRleFBvcyA9IHAtPmluZGV4UHJlU2l6ZTsNCisgICAgICAgICAgICBwLT5pbmRleFNpemUgKz0gcC0+aW5kZXhQcmVTaXplOw0KKyAgICAgICAgICAgIFNoYTI1Nl9GaW5hbCgmcC0+c2hhLCBwLT5zaGFEaWdlc3QpOw0KKyAgICAgICAgICAgIFNoYTI1Nl9Jbml0KCZwLT5zaGEpOw0KKyAgICAgICAgICAgIHAtPmNyYyA9IENyY1VwZGF0ZShDUkNfSU5JVF9WQUwsIHAtPmJ1ZiwgcC0+aW5kZXhQcmVTaXplKTsNCisgICAgICAgICAgICBwLT5zdGF0ZSA9IFhaX1NUQVRFX1NUUkVBTV9JTkRFWDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwLT5ibG9ja0hlYWRlclNpemUgPSAoKFVJbnQzMilwLT5idWZbMF0gPDwgMikgKyA0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSBpZiAocC0+cG9zICE9IHAtPmJsb2NrSGVhZGVyU2l6ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgVUludDMyIGN1ciA9IHAtPmJsb2NrSGVhZGVyU2l6ZSAtIHAtPnBvczsNCisgICAgICAgICAgaWYgKGN1ciA+IHNyY1JlbSkNCisgICAgICAgICAgICBjdXIgPSAoVUludDMyKXNyY1JlbTsNCisgICAgICAgICAgbWVtY3B5KHAtPmJ1ZiArIHAtPnBvcywgc3JjLCBjdXIpOw0KKyAgICAgICAgICBwLT5wb3MgKz0gY3VyOw0KKyAgICAgICAgICAoKnNyY0xlbikgKz0gY3VyOw0KKyAgICAgICAgICBzcmMgKz0gY3VyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICBSSU5PSyhYekJsb2NrX1BhcnNlKCZwLT5ibG9jaywgcC0+YnVmKSk7DQorICAgICAgICAgIHAtPm51bVRvdGFsQmxvY2tzKys7DQorICAgICAgICAgIHAtPnN0YXRlID0gWFpfU1RBVEVfQkxPQ0s7DQorICAgICAgICAgIHAtPnBhY2tTaXplID0gMDsNCisgICAgICAgICAgcC0+dW5wYWNrU2l6ZSA9IDA7DQorICAgICAgICAgIFh6Q2hlY2tfSW5pdCgmcC0+Y2hlY2ssIFh6RmxhZ3NfR2V0Q2hlY2tUeXBlKHAtPnN0cmVhbUZsYWdzKSk7DQorICAgICAgICAgIFJJTk9LKFh6RGVjX0luaXQoJnAtPmRlY29kZXIsICZwLT5ibG9jaykpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKw0KKyAgICAgIGNhc2UgWFpfU1RBVEVfQkxPQ0tfRk9PVEVSOg0KKyAgICAgIHsNCisgICAgICAgIGlmICgoKHAtPnBhY2tTaXplICsgcC0+YWxpZ25Qb3MpICYgMykgIT0gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgKCpzcmNMZW4pKys7DQorICAgICAgICAgIHAtPmFsaWduUG9zKys7DQorICAgICAgICAgIGlmICgqc3JjKysgIT0gMCkNCisgICAgICAgICAgICByZXR1cm4gU1pfRVJST1JfQ1JDOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICBVSW50MzIgY2hlY2tTaXplID0gWHpGbGFnc19HZXRDaGVja1NpemUocC0+c3RyZWFtRmxhZ3MpOw0KKyAgICAgICAgICBVSW50MzIgY3VyID0gY2hlY2tTaXplIC0gcC0+cG9zOw0KKyAgICAgICAgICBpZiAoY3VyICE9IDApDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoY3VyID4gc3JjUmVtKQ0KKyAgICAgICAgICAgICAgY3VyID0gKFVJbnQzMilzcmNSZW07DQorICAgICAgICAgICAgbWVtY3B5KHAtPmJ1ZiArIHAtPnBvcywgc3JjLCBjdXIpOw0KKyAgICAgICAgICAgIHAtPnBvcyArPSBjdXI7DQorICAgICAgICAgICAgKCpzcmNMZW4pICs9IGN1cjsNCisgICAgICAgICAgICBzcmMgKz0gY3VyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGVsc2UNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIEJ5dGUgZGlnZXN0W1haX0NIRUNLX1NJWkVfTUFYXTsNCisgICAgICAgICAgICBwLT5zdGF0ZSA9IFhaX1NUQVRFX0JMT0NLX0hFQURFUjsNCisgICAgICAgICAgICBwLT5wb3MgPSAwOw0KKyAgICAgICAgICAgIGlmIChYekNoZWNrX0ZpbmFsKCZwLT5jaGVjaywgZGlnZXN0KSAmJiBtZW1jbXAoZGlnZXN0LCBwLT5idWYsIGNoZWNrU2l6ZSkgIT0gMCkNCisgICAgICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9DUkM7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisNCisgICAgICBjYXNlIFhaX1NUQVRFX1NUUkVBTV9JTkRFWDoNCisgICAgICB7DQorICAgICAgICBpZiAocC0+cG9zIDwgcC0+aW5kZXhQcmVTaXplKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAoKnNyY0xlbikrKzsNCisgICAgICAgICAgaWYgKCpzcmMrKyAhPSBwLT5idWZbcC0+cG9zKytdKQ0KKyAgICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9DUkM7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIGlmIChwLT5pbmRleFBvcyA8IHAtPmluZGV4U2l6ZSkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIFVJbnQ2NCBjdXIgPSBwLT5pbmRleFNpemUgLSBwLT5pbmRleFBvczsNCisgICAgICAgICAgICBpZiAoc3JjUmVtID4gY3VyKQ0KKyAgICAgICAgICAgICAgc3JjUmVtID0gKFNpemVUKWN1cjsNCisgICAgICAgICAgICBwLT5jcmMgPSBDcmNVcGRhdGUocC0+Y3JjLCBzcmMsIHNyY1JlbSk7DQorICAgICAgICAgICAgU2hhMjU2X1VwZGF0ZSgmcC0+c2hhLCBzcmMsIHNyY1JlbSk7DQorICAgICAgICAgICAgKCpzcmNMZW4pICs9IHNyY1JlbTsNCisgICAgICAgICAgICBzcmMgKz0gc3JjUmVtOw0KKyAgICAgICAgICAgIHAtPmluZGV4UG9zICs9IHNyY1JlbTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBlbHNlIGlmICgocC0+aW5kZXhQb3MgJiAzKSAhPSAwKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgQnl0ZSBiID0gKnNyYysrOw0KKyAgICAgICAgICAgIHAtPmNyYyA9IENSQ19VUERBVEVfQllURShwLT5jcmMsIGIpOw0KKyAgICAgICAgICAgICgqc3JjTGVuKSsrOw0KKyAgICAgICAgICAgIHAtPmluZGV4UG9zKys7DQorICAgICAgICAgICAgcC0+aW5kZXhTaXplKys7DQorICAgICAgICAgICAgaWYgKGIgIT0gMCkNCisgICAgICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9DUkM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgQnl0ZSBkaWdlc3RbU0hBMjU2X0RJR0VTVF9TSVpFXTsNCisgICAgICAgICAgICBwLT5zdGF0ZSA9IFhaX1NUQVRFX1NUUkVBTV9JTkRFWF9DUkM7DQorICAgICAgICAgICAgcC0+aW5kZXhTaXplICs9IDQ7DQorICAgICAgICAgICAgcC0+cG9zID0gMDsNCisgICAgICAgICAgICBTaGEyNTZfRmluYWwoJnAtPnNoYSwgZGlnZXN0KTsNCisgICAgICAgICAgICBpZiAobWVtY21wKGRpZ2VzdCwgcC0+c2hhRGlnZXN0LCBTSEEyNTZfRElHRVNUX1NJWkUpICE9IDApDQorICAgICAgICAgICAgICByZXR1cm4gU1pfRVJST1JfQ1JDOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorDQorICAgICAgY2FzZSBYWl9TVEFURV9TVFJFQU1fSU5ERVhfQ1JDOg0KKyAgICAgIHsNCisgICAgICAgIGlmIChwLT5wb3MgPCA0KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAoKnNyY0xlbikrKzsNCisgICAgICAgICAgcC0+YnVmW3AtPnBvcysrXSA9ICpzcmMrKzsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgcC0+c3RhdGUgPSBYWl9TVEFURV9TVFJFQU1fRk9PVEVSOw0KKyAgICAgICAgICBwLT5wb3MgPSAwOw0KKyAgICAgICAgICBpZiAoQ1JDX0dFVF9ESUdFU1QocC0+Y3JjKSAhPSBHZXRVaTMyKHAtPmJ1ZikpDQorICAgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX0NSQzsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisNCisgICAgICBjYXNlIFhaX1NUQVRFX1NUUkVBTV9GT09URVI6DQorICAgICAgew0KKyAgICAgICAgVUludDMyIGN1ciA9IFhaX1NUUkVBTV9GT09URVJfU0laRSAtIHAtPnBvczsNCisgICAgICAgIGlmIChjdXIgPiBzcmNSZW0pDQorICAgICAgICAgIGN1ciA9IChVSW50MzIpc3JjUmVtOw0KKyAgICAgICAgbWVtY3B5KHAtPmJ1ZiArIHAtPnBvcywgc3JjLCBjdXIpOw0KKyAgICAgICAgcC0+cG9zICs9IGN1cjsNCisgICAgICAgICgqc3JjTGVuKSArPSBjdXI7DQorICAgICAgICBzcmMgKz0gY3VyOw0KKyAgICAgICAgaWYgKHAtPnBvcyA9PSBYWl9TVFJFQU1fRk9PVEVSX1NJWkUpDQorICAgICAgICB7DQorICAgICAgICAgIHAtPnN0YXRlID0gWFpfU1RBVEVfU1RSRUFNX1BBRERJTkc7DQorICAgICAgICAgIHAtPm51bUZpbmlzaGVkU3RyZWFtcysrOw0KKyAgICAgICAgICBwLT5wYWRTaXplID0gMDsNCisgICAgICAgICAgaWYgKCFYel9DaGVja0Zvb3RlcihwLT5zdHJlYW1GbGFncywgcC0+aW5kZXhTaXplLCBwLT5idWYpKQ0KKyAgICAgICAgICAgIHJldHVybiBTWl9FUlJPUl9DUkM7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorDQorICAgICAgY2FzZSBYWl9TVEFURV9TVFJFQU1fUEFERElORzoNCisgICAgICB7DQorICAgICAgICBpZiAoKnNyYyAhPSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAoKChVSW50MzIpcC0+cGFkU2l6ZSAmIDMpICE9IDApDQorICAgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX05PX0FSQ0hJVkU7DQorICAgICAgICAgIHAtPnBvcyA9IDA7DQorICAgICAgICAgIHAtPnN0YXRlID0gWFpfU1RBVEVfU1RSRUFNX0hFQURFUjsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgKCpzcmNMZW4pKys7DQorICAgICAgICAgIHNyYysrOw0KKyAgICAgICAgICBwLT5wYWRTaXplKys7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgDQorICAgICAgY2FzZSBYWl9TVEFURV9CTE9DSzogYnJlYWs7IC8qIHRvIGRpc2FibGUgR0NDIHdhcm5pbmcgKi8NCisgICAgfQ0KKyAgfQ0KKyAgLyoNCisgIGlmIChwLT5zdGF0ZSA9PSBYWl9TVEFURV9GSU5JU0hFRCkNCisgICAgKnN0YXR1cyA9IENPREVSX1NUQVRVU19GSU5JU0hFRF9XSVRIX01BUks7DQorICByZXR1cm4gU1pfT0s7DQorICAqLw0KK30NCisNCitCb29sIFh6VW5wYWNrZXJfSXNTdHJlYW1XYXNGaW5pc2hlZChDWHpVbnBhY2tlciAqcCkNCit7DQorICByZXR1cm4gKHAtPnN0YXRlID09IFhaX1NUQVRFX1NUUkVBTV9QQURESU5HKSAmJiAoKChVSW50MzIpcC0+cGFkU2l6ZSAmIDMpID09IDApOw0KK30NCisNCitVSW50NjQgWHpVbnBhY2tlcl9HZXRFeHRyYVNpemUoQ1h6VW5wYWNrZXIgKnApDQorew0KKyAgVUludDY0IG51bSA9IDA7DQorICBpZiAocC0+c3RhdGUgPT0gWFpfU1RBVEVfU1RSRUFNX1BBRERJTkcpDQorICAgIG51bSArPSBwLT5wYWRTaXplOw0KKyAgZWxzZSBpZiAocC0+c3RhdGUgPT0gWFpfU1RBVEVfU1RSRUFNX0hFQURFUikNCisgICAgbnVtICs9IHAtPnBhZFNpemUgKyBwLT5wb3M7DQorICByZXR1cm4gbnVtOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0MvWHpFbmMuYyBiL2x6bWEvQy9YekVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNjM1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0MvWHpFbmMuYwpAQCAtMCwwICsxLDUyMiBAQAorLyogWHpFbmMuYyAtLSBYeiBFbmNvZGUNCisyMDE0LTEyLTMwIDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKw0KKyNpbmNsdWRlICI3ekNyYy5oIg0KKyNpbmNsdWRlICJBbGxvYy5oIg0KKyNpbmNsdWRlICJCcmEuaCINCisjaW5jbHVkZSAiQ3B1QXJjaC5oIg0KKyNpZmRlZiBVU0VfU1VCQkxPQ0sNCisjaW5jbHVkZSAiQmNqM0VuYy5jIg0KKyNpbmNsdWRlICJTYkZpbmQuYyINCisjaW5jbHVkZSAiU2JFbmMuYyINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiWHpFbmMuaCINCisNCitzdGF0aWMgdm9pZCAqU3pCaWdBbGxvYyh2b2lkICpwLCBzaXplX3Qgc2l6ZSkgeyBwID0gcDsgcmV0dXJuIEJpZ0FsbG9jKHNpemUpOyB9DQorc3RhdGljIHZvaWQgU3pCaWdGcmVlKHZvaWQgKnAsIHZvaWQgKmFkZHJlc3MpIHsgcCA9IHA7IEJpZ0ZyZWUoYWRkcmVzcyk7IH0NCitzdGF0aWMgSVN6QWxsb2MgZ19CaWdBbGxvYyA9IHsgU3pCaWdBbGxvYywgU3pCaWdGcmVlIH07DQorDQorc3RhdGljIHZvaWQgKlN6QWxsb2Modm9pZCAqcCwgc2l6ZV90IHNpemUpIHsgcCA9IHA7IHJldHVybiBNeUFsbG9jKHNpemUpOyB9DQorc3RhdGljIHZvaWQgU3pGcmVlKHZvaWQgKnAsIHZvaWQgKmFkZHJlc3MpIHsgcCA9IHA7IE15RnJlZShhZGRyZXNzKTsgfQ0KK3N0YXRpYyBJU3pBbGxvYyBnX0FsbG9jID0geyBTekFsbG9jLCBTekZyZWUgfTsNCisNCisjZGVmaW5lIFh6QmxvY2tfQ2xlYXJGbGFncyhwKSAgICAgICAocCktPmZsYWdzID0gMDsNCisjZGVmaW5lIFh6QmxvY2tfU2V0TnVtRmlsdGVycyhwLCBuKSAocCktPmZsYWdzIHw9ICgobikgLSAxKTsNCisjZGVmaW5lIFh6QmxvY2tfU2V0SGFzUGFja1NpemUocCkgICAocCktPmZsYWdzIHw9IFhaX0JGX1BBQ0tfU0laRTsNCisjZGVmaW5lIFh6QmxvY2tfU2V0SGFzVW5wYWNrU2l6ZShwKSAocCktPmZsYWdzIHw9IFhaX0JGX1VOUEFDS19TSVpFOw0KKw0KK3N0YXRpYyBTUmVzIFdyaXRlQnl0ZXMoSVNlcU91dFN0cmVhbSAqcywgY29uc3Qgdm9pZCAqYnVmLCBVSW50MzIgc2l6ZSkNCit7DQorICByZXR1cm4gKHMtPldyaXRlKHMsIGJ1Ziwgc2l6ZSkgPT0gc2l6ZSkgPyBTWl9PSyA6IFNaX0VSUk9SX1dSSVRFOw0KK30NCisNCitzdGF0aWMgU1JlcyBXcml0ZUJ5dGVzQW5kQ3JjKElTZXFPdXRTdHJlYW0gKnMsIGNvbnN0IHZvaWQgKmJ1ZiwgVUludDMyIHNpemUsIFVJbnQzMiAqY3JjKQ0KK3sNCisgICpjcmMgPSBDcmNVcGRhdGUoKmNyYywgYnVmLCBzaXplKTsNCisgIHJldHVybiBXcml0ZUJ5dGVzKHMsIGJ1Ziwgc2l6ZSk7DQorfQ0KKw0KK1NSZXMgWHpfV3JpdGVIZWFkZXIoQ1h6U3RyZWFtRmxhZ3MgZiwgSVNlcU91dFN0cmVhbSAqcykNCit7DQorICBVSW50MzIgY3JjOw0KKyAgQnl0ZSBoZWFkZXJbWFpfU1RSRUFNX0hFQURFUl9TSVpFXTsNCisgIG1lbWNweShoZWFkZXIsIFhaX1NJRywgWFpfU0lHX1NJWkUpOw0KKyAgaGVhZGVyW1haX1NJR19TSVpFXSA9IChCeXRlKShmID4+IDgpOw0KKyAgaGVhZGVyW1haX1NJR19TSVpFICsgMV0gPSAoQnl0ZSkoZiAmIDB4RkYpOw0KKyAgY3JjID0gQ3JjQ2FsYyhoZWFkZXIgKyBYWl9TSUdfU0laRSwgWFpfU1RSRUFNX0ZMQUdTX1NJWkUpOw0KKyAgU2V0VWkzMihoZWFkZXIgKyBYWl9TSUdfU0laRSArIFhaX1NUUkVBTV9GTEFHU19TSVpFLCBjcmMpOw0KKyAgcmV0dXJuIFdyaXRlQnl0ZXMocywgaGVhZGVyLCBYWl9TVFJFQU1fSEVBREVSX1NJWkUpOw0KK30NCisNCitTUmVzIFh6QmxvY2tfV3JpdGVIZWFkZXIoY29uc3QgQ1h6QmxvY2sgKnAsIElTZXFPdXRTdHJlYW0gKnMpDQorew0KKyAgQnl0ZSBoZWFkZXJbWFpfQkxPQ0tfSEVBREVSX1NJWkVfTUFYXTsNCisNCisgIHVuc2lnbmVkIHBvcyA9IDE7DQorICBpbnQgbnVtRmlsdGVycywgaTsNCisgIGhlYWRlcltwb3MrK10gPSBwLT5mbGFnczsNCisNCisgIGlmIChYekJsb2NrX0hhc1BhY2tTaXplKHApKSBwb3MgKz0gWHpfV3JpdGVWYXJJbnQoaGVhZGVyICsgcG9zLCBwLT5wYWNrU2l6ZSk7DQorICBpZiAoWHpCbG9ja19IYXNVbnBhY2tTaXplKHApKSBwb3MgKz0gWHpfV3JpdGVWYXJJbnQoaGVhZGVyICsgcG9zLCBwLT51bnBhY2tTaXplKTsNCisgIG51bUZpbHRlcnMgPSBYekJsb2NrX0dldE51bUZpbHRlcnMocCk7DQorICBmb3IgKGkgPSAwOyBpIDwgbnVtRmlsdGVyczsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCBDWHpGaWx0ZXIgKmYgPSAmcC0+ZmlsdGVyc1tpXTsNCisgICAgcG9zICs9IFh6X1dyaXRlVmFySW50KGhlYWRlciArIHBvcywgZi0+aWQpOw0KKyAgICBwb3MgKz0gWHpfV3JpdGVWYXJJbnQoaGVhZGVyICsgcG9zLCBmLT5wcm9wc1NpemUpOw0KKyAgICBtZW1jcHkoaGVhZGVyICsgcG9zLCBmLT5wcm9wcywgZi0+cHJvcHNTaXplKTsNCisgICAgcG9zICs9IGYtPnByb3BzU2l6ZTsNCisgIH0NCisgIHdoaWxlKChwb3MgJiAzKSAhPSAwKQ0KKyAgICBoZWFkZXJbcG9zKytdID0gMDsNCisgIGhlYWRlclswXSA9IChCeXRlKShwb3MgPj4gMik7DQorICBTZXRVaTMyKGhlYWRlciArIHBvcywgQ3JjQ2FsYyhoZWFkZXIsIHBvcykpOw0KKyAgcmV0dXJuIFdyaXRlQnl0ZXMocywgaGVhZGVyLCBwb3MgKyA0KTsNCit9DQorDQorU1JlcyBYel9Xcml0ZUZvb3RlcihDWHpTdHJlYW0gKnAsIElTZXFPdXRTdHJlYW0gKnMpDQorew0KKyAgQnl0ZSBidWZbMzJdOw0KKyAgVUludDY0IGdsb2JhbFBvczsNCisgIHsNCisgICAgVUludDMyIGNyYyA9IENSQ19JTklUX1ZBTDsNCisgICAgdW5zaWduZWQgcG9zID0gMSArIFh6X1dyaXRlVmFySW50KGJ1ZiArIDEsIHAtPm51bUJsb2Nrcyk7DQorICAgIHNpemVfdCBpOw0KKw0KKyAgICBnbG9iYWxQb3MgPSBwb3M7DQorICAgIGJ1ZlswXSA9IDA7DQorICAgIFJJTk9LKFdyaXRlQnl0ZXNBbmRDcmMocywgYnVmLCBwb3MsICZjcmMpKTsNCisgICAgZm9yIChpID0gMDsgaSA8IHAtPm51bUJsb2NrczsgaSsrKQ0KKyAgICB7DQorICAgICAgY29uc3QgQ1h6QmxvY2tTaXplcyAqYmxvY2sgPSAmcC0+YmxvY2tzW2ldOw0KKyAgICAgIHBvcyA9IFh6X1dyaXRlVmFySW50KGJ1ZiwgYmxvY2stPnRvdGFsU2l6ZSk7DQorICAgICAgcG9zICs9IFh6X1dyaXRlVmFySW50KGJ1ZiArIHBvcywgYmxvY2stPnVucGFja1NpemUpOw0KKyAgICAgIGdsb2JhbFBvcyArPSBwb3M7DQorICAgICAgUklOT0soV3JpdGVCeXRlc0FuZENyYyhzLCBidWYsIHBvcywgJmNyYykpOw0KKyAgICB9DQorICAgIHBvcyA9ICgodW5zaWduZWQpZ2xvYmFsUG9zICYgMyk7DQorICAgIGlmIChwb3MgIT0gMCkNCisgICAgew0KKyAgICAgIGJ1ZlswXSA9IGJ1ZlsxXSA9IGJ1ZlsyXSA9IDA7DQorICAgICAgUklOT0soV3JpdGVCeXRlc0FuZENyYyhzLCBidWYsIDQgLSBwb3MsICZjcmMpKTsNCisgICAgICBnbG9iYWxQb3MgKz0gNCAtIHBvczsNCisgICAgfQ0KKyAgICB7DQorICAgICAgU2V0VWkzMihidWYsIENSQ19HRVRfRElHRVNUKGNyYykpOw0KKyAgICAgIFJJTk9LKFdyaXRlQnl0ZXMocywgYnVmLCA0KSk7DQorICAgICAgZ2xvYmFsUG9zICs9IDQ7DQorICAgIH0NCisgIH0NCisNCisgIHsNCisgICAgVUludDMyIGluZGV4U2l6ZSA9IChVSW50MzIpKChnbG9iYWxQb3MgPj4gMikgLSAxKTsNCisgICAgU2V0VWkzMihidWYgKyA0LCBpbmRleFNpemUpOw0KKyAgICBidWZbOF0gPSAoQnl0ZSkocC0+ZmxhZ3MgPj4gOCk7DQorICAgIGJ1Zls5XSA9IChCeXRlKShwLT5mbGFncyAmIDB4RkYpOw0KKyAgICBTZXRVaTMyKGJ1ZiwgQ3JjQ2FsYyhidWYgKyA0LCA2KSk7DQorICAgIG1lbWNweShidWYgKyAxMCwgWFpfRk9PVEVSX1NJRywgWFpfRk9PVEVSX1NJR19TSVpFKTsNCisgICAgcmV0dXJuIFdyaXRlQnl0ZXMocywgYnVmLCAxMik7DQorICB9DQorfQ0KKw0KK1NSZXMgWHpfQWRkSW5kZXhSZWNvcmQoQ1h6U3RyZWFtICpwLCBVSW50NjQgdW5wYWNrU2l6ZSwgVUludDY0IHRvdGFsU2l6ZSwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIGlmIChwLT5ibG9ja3MgPT0gMCB8fCBwLT5udW1CbG9ja3NBbGxvY2F0ZWQgPT0gcC0+bnVtQmxvY2tzKQ0KKyAgew0KKyAgICBzaXplX3QgbnVtID0gKHAtPm51bUJsb2NrcyArIDEpICogMjsNCisgICAgc2l6ZV90IG5ld1NpemUgPSBzaXplb2YoQ1h6QmxvY2tTaXplcykgKiBudW07DQorICAgIENYekJsb2NrU2l6ZXMgKmJsb2NrczsNCisgICAgaWYgKG5ld1NpemUgLyBzaXplb2YoQ1h6QmxvY2tTaXplcykgIT0gbnVtKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorICAgIGJsb2NrcyA9IChDWHpCbG9ja1NpemVzICopYWxsb2MtPkFsbG9jKGFsbG9jLCBuZXdTaXplKTsNCisgICAgaWYgKGJsb2NrcyA9PSAwKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorICAgIGlmIChwLT5udW1CbG9ja3MgIT0gMCkNCisgICAgew0KKyAgICAgIG1lbWNweShibG9ja3MsIHAtPmJsb2NrcywgcC0+bnVtQmxvY2tzICogc2l6ZW9mKENYekJsb2NrU2l6ZXMpKTsNCisgICAgICBYel9GcmVlKHAsIGFsbG9jKTsNCisgICAgfQ0KKyAgICBwLT5ibG9ja3MgPSBibG9ja3M7DQorICAgIHAtPm51bUJsb2Nrc0FsbG9jYXRlZCA9IG51bTsNCisgIH0NCisgIHsNCisgICAgQ1h6QmxvY2tTaXplcyAqYmxvY2sgPSAmcC0+YmxvY2tzW3AtPm51bUJsb2NrcysrXTsNCisgICAgYmxvY2stPnRvdGFsU2l6ZSA9IHRvdGFsU2l6ZTsNCisgICAgYmxvY2stPnVucGFja1NpemUgPSB1bnBhY2tTaXplOw0KKyAgfQ0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCisvKiAtLS0tLS0tLS0tIENTZXFDaGVja0luU3RyZWFtIC0tLS0tLS0tLS0gKi8NCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIElTZXFJblN0cmVhbSBwOw0KKyAgSVNlcUluU3RyZWFtICpyZWFsU3RyZWFtOw0KKyAgVUludDY0IHByb2Nlc3NlZDsNCisgIENYekNoZWNrIGNoZWNrOw0KK30gQ1NlcUNoZWNrSW5TdHJlYW07DQorDQordm9pZCBTZXFDaGVja0luU3RyZWFtX0luaXQoQ1NlcUNoZWNrSW5TdHJlYW0gKnAsIGludCBtb2RlKQ0KK3sNCisgIHAtPnByb2Nlc3NlZCA9IDA7DQorICBYekNoZWNrX0luaXQoJnAtPmNoZWNrLCBtb2RlKTsNCit9DQorDQordm9pZCBTZXFDaGVja0luU3RyZWFtX0dldERpZ2VzdChDU2VxQ2hlY2tJblN0cmVhbSAqcCwgQnl0ZSAqZGlnZXN0KQ0KK3sNCisgIFh6Q2hlY2tfRmluYWwoJnAtPmNoZWNrLCBkaWdlc3QpOw0KK30NCisNCitzdGF0aWMgU1JlcyBTZXFDaGVja0luU3RyZWFtX1JlYWQodm9pZCAqcHAsIHZvaWQgKmRhdGEsIHNpemVfdCAqc2l6ZSkNCit7DQorICBDU2VxQ2hlY2tJblN0cmVhbSAqcCA9IChDU2VxQ2hlY2tJblN0cmVhbSAqKXBwOw0KKyAgU1JlcyByZXMgPSBwLT5yZWFsU3RyZWFtLT5SZWFkKHAtPnJlYWxTdHJlYW0sIGRhdGEsIHNpemUpOw0KKyAgWHpDaGVja19VcGRhdGUoJnAtPmNoZWNrLCBkYXRhLCAqc2l6ZSk7DQorICBwLT5wcm9jZXNzZWQgKz0gKnNpemU7DQorICByZXR1cm4gcmVzOw0KK30NCisNCisvKiAtLS0tLS0tLS0tIENTZXFTaXplT3V0U3RyZWFtIC0tLS0tLS0tLS0gKi8NCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIElTZXFPdXRTdHJlYW0gcDsNCisgIElTZXFPdXRTdHJlYW0gKnJlYWxTdHJlYW07DQorICBVSW50NjQgcHJvY2Vzc2VkOw0KK30gQ1NlcVNpemVPdXRTdHJlYW07DQorDQorc3RhdGljIHNpemVfdCBNeVdyaXRlKHZvaWQgKnBwLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkNCit7DQorICBDU2VxU2l6ZU91dFN0cmVhbSAqcCA9IChDU2VxU2l6ZU91dFN0cmVhbSAqKXBwOw0KKyAgc2l6ZSA9IHAtPnJlYWxTdHJlYW0tPldyaXRlKHAtPnJlYWxTdHJlYW0sIGRhdGEsIHNpemUpOw0KKyAgcC0+cHJvY2Vzc2VkICs9IHNpemU7DQorICByZXR1cm4gc2l6ZTsNCit9DQorDQorLyogLS0tLS0tLS0tLSBDU2VxSW5GaWx0ZXIgLS0tLS0tLS0tLSAqLw0KKw0KKyNkZWZpbmUgRklMVEVSX0JVRl9TSVpFICgxIDw8IDIwKQ0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgSVNlcUluU3RyZWFtIHA7DQorICBJU2VxSW5TdHJlYW0gKnJlYWxTdHJlYW07DQorICBJU3RhdGVDb2RlciBTdGF0ZUNvZGVyOw0KKyAgQnl0ZSAqYnVmOw0KKyAgc2l6ZV90IGN1clBvczsNCisgIHNpemVfdCBlbmRQb3M7DQorICBpbnQgc3JjV2FzRmluaXNoZWQ7DQorfSBDU2VxSW5GaWx0ZXI7DQorDQorc3RhdGljIFNSZXMgU2VxSW5GaWx0ZXJfUmVhZCh2b2lkICpwcCwgdm9pZCAqZGF0YSwgc2l6ZV90ICpzaXplKQ0KK3sNCisgIENTZXFJbkZpbHRlciAqcCA9IChDU2VxSW5GaWx0ZXIgKilwcDsNCisgIHNpemVfdCBzaXplT3JpZ2luYWwgPSAqc2l6ZTsNCisgIGlmIChzaXplT3JpZ2luYWwgPT0gMCkNCisgICAgcmV0dXJuIFNaX09LOw0KKyAgKnNpemUgPSAwOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgaWYgKCFwLT5zcmNXYXNGaW5pc2hlZCAmJiBwLT5jdXJQb3MgPT0gcC0+ZW5kUG9zKQ0KKyAgICB7DQorICAgICAgcC0+Y3VyUG9zID0gMDsNCisgICAgICBwLT5lbmRQb3MgPSBGSUxURVJfQlVGX1NJWkU7DQorICAgICAgUklOT0socC0+cmVhbFN0cmVhbS0+UmVhZChwLT5yZWFsU3RyZWFtLCBwLT5idWYsICZwLT5lbmRQb3MpKTsNCisgICAgICBpZiAocC0+ZW5kUG9zID09IDApDQorICAgICAgICBwLT5zcmNXYXNGaW5pc2hlZCA9IDE7DQorICAgIH0NCisgICAgew0KKyAgICAgIFNpemVUIHNyY0xlbiA9IHAtPmVuZFBvcyAtIHAtPmN1clBvczsNCisgICAgICBpbnQgd2FzRmluaXNoZWQ7DQorICAgICAgU1JlcyByZXM7DQorICAgICAgKnNpemUgPSBzaXplT3JpZ2luYWw7DQorICAgICAgcmVzID0gcC0+U3RhdGVDb2Rlci5Db2RlKHAtPlN0YXRlQ29kZXIucCwgZGF0YSwgc2l6ZSwgcC0+YnVmICsgcC0+Y3VyUG9zLCAmc3JjTGVuLA0KKyAgICAgICAgcC0+c3JjV2FzRmluaXNoZWQsIENPREVSX0ZJTklTSF9BTlksICZ3YXNGaW5pc2hlZCk7DQorICAgICAgcC0+Y3VyUG9zICs9IHNyY0xlbjsNCisgICAgICBpZiAoKnNpemUgIT0gMCB8fCBzcmNMZW4gPT0gMCB8fCByZXMgIT0gMCkNCisgICAgICAgIHJldHVybiByZXM7DQorICAgIH0NCisgIH0NCit9DQorDQorc3RhdGljIHZvaWQgU2VxSW5GaWx0ZXJfQ29uc3RydWN0KENTZXFJbkZpbHRlciAqcCkNCit7DQorICBwLT5idWYgPSBOVUxMOw0KKyAgcC0+cC5SZWFkID0gU2VxSW5GaWx0ZXJfUmVhZDsNCit9DQorDQorc3RhdGljIHZvaWQgU2VxSW5GaWx0ZXJfRnJlZShDU2VxSW5GaWx0ZXIgKnApDQorew0KKyAgaWYgKHAtPmJ1ZikNCisgIHsNCisgICAgZ19BbGxvYy5GcmVlKCZnX0FsbG9jLCBwLT5idWYpOw0KKyAgICBwLT5idWYgPSBOVUxMOw0KKyAgfQ0KK30NCisNCitTUmVzIEJyYVN0YXRlX1NldEZyb21NZXRob2QoSVN0YXRlQ29kZXIgKnAsIFVJbnQ2NCBpZCwgaW50IGVuY29kZU1vZGUsIElTekFsbG9jICphbGxvYyk7DQorDQorc3RhdGljIFNSZXMgU2VxSW5GaWx0ZXJfSW5pdChDU2VxSW5GaWx0ZXIgKnAsIGNvbnN0IENYekZpbHRlciAqcHJvcHMpDQorew0KKyAgaWYgKCFwLT5idWYpDQorICB7DQorICAgIHAtPmJ1ZiA9IGdfQWxsb2MuQWxsb2MoJmdfQWxsb2MsIEZJTFRFUl9CVUZfU0laRSk7DQorICAgIGlmICghcC0+YnVmKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorICB9DQorICBwLT5jdXJQb3MgPSBwLT5lbmRQb3MgPSAwOw0KKyAgcC0+c3JjV2FzRmluaXNoZWQgPSAwOw0KKyAgUklOT0soQnJhU3RhdGVfU2V0RnJvbU1ldGhvZCgmcC0+U3RhdGVDb2RlciwgcHJvcHMtPmlkLCAxLCAmZ19BbGxvYykpOw0KKyAgUklOT0socC0+U3RhdGVDb2Rlci5TZXRQcm9wcyhwLT5TdGF0ZUNvZGVyLnAsIHByb3BzLT5wcm9wcywgcHJvcHMtPnByb3BzU2l6ZSwgJmdfQWxsb2MpKTsNCisgIHAtPlN0YXRlQ29kZXIuSW5pdChwLT5TdGF0ZUNvZGVyLnApOw0KKyAgcmV0dXJuIFNaX09LOw0KK30NCisNCisvKiAtLS0tLS0tLS0tIENTYkVuY0luU3RyZWFtIC0tLS0tLS0tLS0gKi8NCisNCisjaWZkZWYgVVNFX1NVQkJMT0NLDQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBJU2VxSW5TdHJlYW0gcDsNCisgIElTZXFJblN0cmVhbSAqaW5TdHJlYW07DQorICBDU2JFbmMgZW5jOw0KK30gQ1NiRW5jSW5TdHJlYW07DQorDQorc3RhdGljIFNSZXMgU2JFbmNJblN0cmVhbV9SZWFkKHZvaWQgKnBwLCB2b2lkICpkYXRhLCBzaXplX3QgKnNpemUpDQorew0KKyAgQ1NiRW5jSW5TdHJlYW0gKnAgPSAoQ1NiRW5jSW5TdHJlYW0gKilwcDsNCisgIHNpemVfdCBzaXplT3JpZ2luYWwgPSAqc2l6ZTsNCisgIGlmIChzaXplT3JpZ2luYWwgPT0gMCkNCisgICAgcmV0dXJuIFNfT0s7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBpZiAocC0+ZW5jLm5lZWRSZWFkICYmICFwLT5lbmMucmVhZFdhc0ZpbmlzaGVkKQ0KKyAgICB7DQorICAgICAgc2l6ZV90IHByb2Nlc3NlZCA9IHAtPmVuYy5uZWVkUmVhZFNpemVNYXg7DQorICAgICAgUklOT0socC0+aW5TdHJlYW0tPlJlYWQocC0+aW5TdHJlYW0sIHAtPmVuYy5idWYgKyBwLT5lbmMucmVhZFBvcywgJnByb2Nlc3NlZCkpOw0KKyAgICAgIHAtPmVuYy5yZWFkUG9zICs9IHByb2Nlc3NlZDsNCisgICAgICBpZiAocHJvY2Vzc2VkID09IDApDQorICAgICAgew0KKyAgICAgICAgcC0+ZW5jLnJlYWRXYXNGaW5pc2hlZCA9IFRydWU7DQorICAgICAgICBwLT5lbmMuaXNGaW5hbEZpbmlzaGVkID0gVHJ1ZTsNCisgICAgICB9DQorICAgICAgcC0+ZW5jLm5lZWRSZWFkID0gRmFsc2U7DQorICAgIH0NCisgICAgKnNpemUgPSBzaXplT3JpZ2luYWw7DQorICAgIFJJTk9LKFNiRW5jX1JlYWQoJnAtPmVuYywgZGF0YSwgc2l6ZSkpOw0KKyAgICBpZiAoKnNpemUgIT0gMCB8fCAhcC0+ZW5jLm5lZWRSZWFkKQ0KKyAgICAgIHJldHVybiBTX09LOw0KKyAgfQ0KK30NCisNCit2b2lkIFNiRW5jSW5TdHJlYW1fQ29uc3RydWN0KENTYkVuY0luU3RyZWFtICpwLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgU2JFbmNfQ29uc3RydWN0KCZwLT5lbmMsIGFsbG9jKTsNCisgIHAtPnAuUmVhZCA9IFNiRW5jSW5TdHJlYW1fUmVhZDsNCit9DQorDQorU1JlcyBTYkVuY0luU3RyZWFtX0luaXQoQ1NiRW5jSW5TdHJlYW0gKnApDQorew0KKyAgcmV0dXJuIFNiRW5jX0luaXQoJnAtPmVuYyk7DQorfQ0KKw0KK3ZvaWQgU2JFbmNJblN0cmVhbV9GcmVlKENTYkVuY0luU3RyZWFtICpwKQ0KK3sNCisgIFNiRW5jX0ZyZWUoJnAtPmVuYyk7DQorfQ0KKw0KKyNlbmRpZg0KKw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgQ0x6bWEyRW5jSGFuZGxlIGx6bWEyOw0KKyAgI2lmZGVmIFVTRV9TVUJCTE9DSw0KKyAgQ1NiRW5jSW5TdHJlYW0gc2I7DQorICAjZW5kaWYNCisgIENTZXFJbkZpbHRlciBmaWx0ZXI7DQorICBJU3pBbGxvYyAqYWxsb2M7DQorICBJU3pBbGxvYyAqYmlnQWxsb2M7DQorfSBDTHptYTJXaXRoRmlsdGVyczsNCisNCisNCitzdGF0aWMgdm9pZCBMem1hMldpdGhGaWx0ZXJzX0NvbnN0cnVjdChDTHptYTJXaXRoRmlsdGVycyAqcCwgSVN6QWxsb2MgKmFsbG9jLCBJU3pBbGxvYyAqYmlnQWxsb2MpDQorew0KKyAgcC0+YWxsb2MgPSBhbGxvYzsNCisgIHAtPmJpZ0FsbG9jID0gYmlnQWxsb2M7DQorICBwLT5sem1hMiA9IE5VTEw7DQorICAjaWZkZWYgVVNFX1NVQkJMT0NLDQorICBTYkVuY0luU3RyZWFtX0NvbnN0cnVjdCgmcC0+c2IsIGFsbG9jKTsNCisgICNlbmRpZg0KKyAgU2VxSW5GaWx0ZXJfQ29uc3RydWN0KCZwLT5maWx0ZXIpOw0KK30NCisNCitzdGF0aWMgU1JlcyBMem1hMldpdGhGaWx0ZXJzX0NyZWF0ZShDTHptYTJXaXRoRmlsdGVycyAqcCkNCit7DQorICBwLT5sem1hMiA9IEx6bWEyRW5jX0NyZWF0ZShwLT5hbGxvYywgcC0+YmlnQWxsb2MpOw0KKyAgaWYgKHAtPmx6bWEyID09IDApDQorICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorICByZXR1cm4gU1pfT0s7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIEx6bWEyV2l0aEZpbHRlcnNfRnJlZShDTHptYTJXaXRoRmlsdGVycyAqcCkNCit7DQorICBTZXFJbkZpbHRlcl9GcmVlKCZwLT5maWx0ZXIpOw0KKyAgI2lmZGVmIFVTRV9TVUJCTE9DSw0KKyAgU2JFbmNJblN0cmVhbV9GcmVlKCZwLT5zYik7DQorICAjZW5kaWYNCisgIGlmIChwLT5sem1hMikNCisgIHsNCisgICAgTHptYTJFbmNfRGVzdHJveShwLT5sem1hMik7DQorICAgIHAtPmx6bWEyID0gTlVMTDsNCisgIH0NCit9DQorDQordm9pZCBYelByb3BzX0luaXQoQ1h6UHJvcHMgKnApDQorew0KKyAgcC0+bHptYTJQcm9wcyA9IDA7DQorICBwLT5maWx0ZXJQcm9wcyA9IDA7DQorICBwLT5jaGVja0lkID0gWFpfQ0hFQ0tfQ1JDMzI7DQorfQ0KKw0KK3ZvaWQgWHpGaWx0ZXJQcm9wc19Jbml0KENYekZpbHRlclByb3BzICpwKQ0KK3sNCisgIHAtPmlkID0gMDsNCisgIHAtPmRlbHRhID0gMDsNCisgIHAtPmlwPSAwOw0KKyAgcC0+aXBEZWZpbmVkID0gRmFsc2U7DQorfQ0KKw0KK3N0YXRpYyBTUmVzIFh6X0NvbXByZXNzKENYelN0cmVhbSAqeHosIENMem1hMldpdGhGaWx0ZXJzICpsem1hZiwNCisgICAgSVNlcU91dFN0cmVhbSAqb3V0U3RyZWFtLCBJU2VxSW5TdHJlYW0gKmluU3RyZWFtLA0KKyAgICBjb25zdCBDWHpQcm9wcyAqcHJvcHMsIElDb21wcmVzc1Byb2dyZXNzICpwcm9ncmVzcykNCit7DQorICB4ei0+ZmxhZ3MgPSAoQnl0ZSlwcm9wcy0+Y2hlY2tJZDsNCisNCisgIFJJTk9LKEx6bWEyRW5jX1NldFByb3BzKGx6bWFmLT5sem1hMiwgcHJvcHMtPmx6bWEyUHJvcHMpKTsNCisgIFJJTk9LKFh6X1dyaXRlSGVhZGVyKHh6LT5mbGFncywgb3V0U3RyZWFtKSk7DQorDQorICB7DQorICAgIENTZXFDaGVja0luU3RyZWFtIGNoZWNrSW5TdHJlYW07DQorICAgIENTZXFTaXplT3V0U3RyZWFtIHNlcVNpemVPdXRTdHJlYW07DQorICAgIENYekJsb2NrIGJsb2NrOw0KKyAgICBpbnQgZmlsdGVySW5kZXggPSAwOw0KKyAgICBDWHpGaWx0ZXIgKmZpbHRlciA9IE5VTEw7DQorICAgIGNvbnN0IENYekZpbHRlclByb3BzICpmcCA9IHByb3BzLT5maWx0ZXJQcm9wczsNCisgICAgDQorICAgIFh6QmxvY2tfQ2xlYXJGbGFncygmYmxvY2spOw0KKyAgICBYekJsb2NrX1NldE51bUZpbHRlcnMoJmJsb2NrLCAxICsgKGZwID8gMSA6IDApKTsNCisgICAgDQorICAgIGlmIChmcCkNCisgICAgew0KKyAgICAgIGZpbHRlciA9ICZibG9jay5maWx0ZXJzW2ZpbHRlckluZGV4KytdOw0KKyAgICAgIGZpbHRlci0+aWQgPSBmcC0+aWQ7DQorICAgICAgZmlsdGVyLT5wcm9wc1NpemUgPSAwOw0KKyAgICAgIGlmIChmcC0+aWQgPT0gWFpfSURfRGVsdGEpDQorICAgICAgew0KKyAgICAgICAgZmlsdGVyLT5wcm9wc1swXSA9IChCeXRlKShmcC0+ZGVsdGEgLSAxKTsNCisgICAgICAgIGZpbHRlci0+cHJvcHNTaXplID0gMTsNCisgICAgICB9DQorICAgICAgZWxzZSBpZiAoZnAtPmlwRGVmaW5lZCkNCisgICAgICB7DQorICAgICAgICBTZXRVaTMyKGZpbHRlci0+cHJvcHMsIGZwLT5pcCk7DQorICAgICAgICBmaWx0ZXItPnByb3BzU2l6ZSA9IDQ7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIHsNCisgICAgICBDWHpGaWx0ZXIgKmYgPSAmYmxvY2suZmlsdGVyc1tmaWx0ZXJJbmRleCsrXTsNCisgICAgICBmLT5pZCA9IFhaX0lEX0xaTUEyOw0KKyAgICAgIGYtPnByb3BzU2l6ZSA9IDE7DQorICAgICAgZi0+cHJvcHNbMF0gPSBMem1hMkVuY19Xcml0ZVByb3BlcnRpZXMobHptYWYtPmx6bWEyKTsNCisgICAgfQ0KKw0KKyAgICBzZXFTaXplT3V0U3RyZWFtLnAuV3JpdGUgPSBNeVdyaXRlOw0KKyAgICBzZXFTaXplT3V0U3RyZWFtLnJlYWxTdHJlYW0gPSBvdXRTdHJlYW07DQorICAgIHNlcVNpemVPdXRTdHJlYW0ucHJvY2Vzc2VkID0gMDsNCisgICAgDQorICAgIFJJTk9LKFh6QmxvY2tfV3JpdGVIZWFkZXIoJmJsb2NrLCAmc2VxU2l6ZU91dFN0cmVhbS5wKSk7DQorICAgIA0KKyAgICBjaGVja0luU3RyZWFtLnAuUmVhZCA9IFNlcUNoZWNrSW5TdHJlYW1fUmVhZDsNCisgICAgY2hlY2tJblN0cmVhbS5yZWFsU3RyZWFtID0gaW5TdHJlYW07DQorICAgIFNlcUNoZWNrSW5TdHJlYW1fSW5pdCgmY2hlY2tJblN0cmVhbSwgWHpGbGFnc19HZXRDaGVja1R5cGUoeHotPmZsYWdzKSk7DQorICAgIA0KKyAgICBpZiAoZnApDQorICAgIHsNCisgICAgICAjaWZkZWYgVVNFX1NVQkJMT0NLDQorICAgICAgaWYgKGZwLT5pZCA9PSBYWl9JRF9TdWJibG9jaykNCisgICAgICB7DQorICAgICAgICBsem1hZi0+c2IuaW5TdHJlYW0gPSAmY2hlY2tJblN0cmVhbS5wOw0KKyAgICAgICAgUklOT0soU2JFbmNJblN0cmVhbV9Jbml0KCZsem1hZi0+c2IpKTsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgICNlbmRpZg0KKyAgICAgIHsNCisgICAgICAgIGx6bWFmLT5maWx0ZXIucmVhbFN0cmVhbSA9ICZjaGVja0luU3RyZWFtLnA7DQorICAgICAgICBSSU5PSyhTZXFJbkZpbHRlcl9Jbml0KCZsem1hZi0+ZmlsdGVyLCBmaWx0ZXIpKTsNCisgICAgICB9DQorICAgIH0NCisNCisgICAgew0KKyAgICAgIFVJbnQ2NCBwYWNrUG9zID0gc2VxU2l6ZU91dFN0cmVhbS5wcm9jZXNzZWQ7DQorICAgICAgU1JlcyByZXMgPSBMem1hMkVuY19FbmNvZGUobHptYWYtPmx6bWEyLCAmc2VxU2l6ZU91dFN0cmVhbS5wLA0KKyAgICAgICAgZnAgPw0KKyAgICAgICAgI2lmZGVmIFVTRV9TVUJCTE9DSw0KKyAgICAgICAgKGZwLT5pZCA9PSBYWl9JRF9TdWJibG9jaykgPyAmbHptYWYtPnNiLnA6DQorICAgICAgICAjZW5kaWYNCisgICAgICAgICZsem1hZi0+ZmlsdGVyLnA6DQorICAgICAgICAmY2hlY2tJblN0cmVhbS5wLA0KKyAgICAgICAgcHJvZ3Jlc3MpOw0KKyAgICAgIFJJTk9LKHJlcyk7DQorICAgICAgYmxvY2sudW5wYWNrU2l6ZSA9IGNoZWNrSW5TdHJlYW0ucHJvY2Vzc2VkOw0KKyAgICAgIGJsb2NrLnBhY2tTaXplID0gc2VxU2l6ZU91dFN0cmVhbS5wcm9jZXNzZWQgLSBwYWNrUG9zOw0KKyAgICB9DQorDQorICAgIHsNCisgICAgICB1bnNpZ25lZCBwYWRTaXplID0gMDsNCisgICAgICBCeXRlIGJ1ZlsxMjhdOw0KKyAgICAgIHdoaWxlKCgoKHVuc2lnbmVkKWJsb2NrLnBhY2tTaXplICsgcGFkU2l6ZSkgJiAzKSAhPSAwKQ0KKyAgICAgICAgYnVmW3BhZFNpemUrK10gPSAwOw0KKyAgICAgIFNlcUNoZWNrSW5TdHJlYW1fR2V0RGlnZXN0KCZjaGVja0luU3RyZWFtLCBidWYgKyBwYWRTaXplKTsNCisgICAgICBSSU5PSyhXcml0ZUJ5dGVzKCZzZXFTaXplT3V0U3RyZWFtLnAsIGJ1ZiwgcGFkU2l6ZSArIFh6RmxhZ3NfR2V0Q2hlY2tTaXplKHh6LT5mbGFncykpKTsNCisgICAgICBSSU5PSyhYel9BZGRJbmRleFJlY29yZCh4eiwgYmxvY2sudW5wYWNrU2l6ZSwgc2VxU2l6ZU91dFN0cmVhbS5wcm9jZXNzZWQgLSBwYWRTaXplLCAmZ19BbGxvYykpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gWHpfV3JpdGVGb290ZXIoeHosIG91dFN0cmVhbSk7DQorfQ0KKw0KK1NSZXMgWHpfRW5jb2RlKElTZXFPdXRTdHJlYW0gKm91dFN0cmVhbSwgSVNlcUluU3RyZWFtICppblN0cmVhbSwNCisgICAgY29uc3QgQ1h6UHJvcHMgKnByb3BzLCBJQ29tcHJlc3NQcm9ncmVzcyAqcHJvZ3Jlc3MpDQorew0KKyAgU1JlcyByZXM7DQorICBDWHpTdHJlYW0geHo7DQorICBDTHptYTJXaXRoRmlsdGVycyBsem1hZjsNCisgIFh6X0NvbnN0cnVjdCgmeHopOw0KKyAgTHptYTJXaXRoRmlsdGVyc19Db25zdHJ1Y3QoJmx6bWFmLCAmZ19BbGxvYywgJmdfQmlnQWxsb2MpOw0KKyAgcmVzID0gTHptYTJXaXRoRmlsdGVyc19DcmVhdGUoJmx6bWFmKTsNCisgIGlmIChyZXMgPT0gU1pfT0spDQorICAgIHJlcyA9IFh6X0NvbXByZXNzKCZ4eiwgJmx6bWFmLCBvdXRTdHJlYW0sIGluU3RyZWFtLCBwcm9wcywgcHJvZ3Jlc3MpOw0KKyAgTHptYTJXaXRoRmlsdGVyc19GcmVlKCZsem1hZik7DQorICBYel9GcmVlKCZ4eiwgJmdfQWxsb2MpOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorU1JlcyBYel9FbmNvZGVFbXB0eShJU2VxT3V0U3RyZWFtICpvdXRTdHJlYW0pDQorew0KKyAgU1JlcyByZXM7DQorICBDWHpTdHJlYW0geHo7DQorICBYel9Db25zdHJ1Y3QoJnh6KTsNCisgIHJlcyA9IFh6X1dyaXRlSGVhZGVyKHh6LmZsYWdzLCBvdXRTdHJlYW0pOw0KKyAgaWYgKHJlcyA9PSBTWl9PSykNCisgICAgcmVzID0gWHpfV3JpdGVGb290ZXIoJnh6LCBvdXRTdHJlYW0pOw0KKyAgWHpfRnJlZSgmeHosICZnX0FsbG9jKTsNCisgIHJldHVybiByZXM7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQy9YekVuYy5oIGIvbHptYS9DL1h6RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljZWEzNAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQy9YekVuYy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qIFh6RW5jLmggLS0gWHogRW5jb2RlDQorMjAxMS0wMi0wNyA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbiAqLw0KKw0KKyNpZm5kZWYgX19YWl9FTkNfSA0KKyNkZWZpbmUgX19YWl9FTkNfSA0KKw0KKyNpbmNsdWRlICJMem1hMkVuYy5oIg0KKw0KKyNpbmNsdWRlICJYei5oIg0KKw0KK0VYVEVSTl9DX0JFR0lODQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICBVSW50MzIgaWQ7DQorICBVSW50MzIgZGVsdGE7DQorICBVSW50MzIgaXA7DQorICBpbnQgaXBEZWZpbmVkOw0KK30gQ1h6RmlsdGVyUHJvcHM7DQorDQordm9pZCBYekZpbHRlclByb3BzX0luaXQoQ1h6RmlsdGVyUHJvcHMgKnApOw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgY29uc3QgQ0x6bWEyRW5jUHJvcHMgKmx6bWEyUHJvcHM7DQorICBjb25zdCBDWHpGaWx0ZXJQcm9wcyAqZmlsdGVyUHJvcHM7DQorICB1bnNpZ25lZCBjaGVja0lkOw0KK30gQ1h6UHJvcHM7DQorDQordm9pZCBYelByb3BzX0luaXQoQ1h6UHJvcHMgKnApOw0KKw0KK1NSZXMgWHpfRW5jb2RlKElTZXFPdXRTdHJlYW0gKm91dFN0cmVhbSwgSVNlcUluU3RyZWFtICppblN0cmVhbSwNCisgICAgY29uc3QgQ1h6UHJvcHMgKnByb3BzLCBJQ29tcHJlc3NQcm9ncmVzcyAqcHJvZ3Jlc3MpOw0KKw0KK1NSZXMgWHpfRW5jb2RlRW1wdHkoSVNlcU91dFN0cmVhbSAqb3V0U3RyZWFtKTsNCisNCitFWFRFUk5fQ19FTkQNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0MvWHpJbi5jIGIvbHptYS9DL1h6SW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTlkNzFjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DL1h6SW4uYwpAQCAtMCwwICsxLDMwNyBAQAorLyogWHpJbi5jIC0gWHogaW5wdXQNCisyMDE0LTEyLTMwIDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorI2luY2x1ZGUgIlByZWNvbXAuaCINCisNCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorDQorI2luY2x1ZGUgIjd6Q3JjLmgiDQorI2luY2x1ZGUgIkNwdUFyY2guaCINCisjaW5jbHVkZSAiWHouaCINCisNCitTUmVzIFh6X1JlYWRIZWFkZXIoQ1h6U3RyZWFtRmxhZ3MgKnAsIElTZXFJblN0cmVhbSAqaW5TdHJlYW0pDQorew0KKyAgQnl0ZSBzaWdbWFpfU1RSRUFNX0hFQURFUl9TSVpFXTsNCisgIFJJTk9LKFNlcUluU3RyZWFtX1JlYWQyKGluU3RyZWFtLCBzaWcsIFhaX1NUUkVBTV9IRUFERVJfU0laRSwgU1pfRVJST1JfTk9fQVJDSElWRSkpOw0KKyAgaWYgKG1lbWNtcChzaWcsIFhaX1NJRywgWFpfU0lHX1NJWkUpICE9IDApDQorICAgIHJldHVybiBTWl9FUlJPUl9OT19BUkNISVZFOw0KKyAgcmV0dXJuIFh6X1BhcnNlSGVhZGVyKHAsIHNpZyk7DQorfQ0KKw0KKyNkZWZpbmUgUkVBRF9WQVJJTlRfQU5EX0NIRUNLKGJ1ZiwgcG9zLCBzaXplLCByZXMpIFwNCisgIHsgdW5zaWduZWQgcyA9IFh6X1JlYWRWYXJJbnQoYnVmICsgcG9zLCBzaXplIC0gcG9zLCByZXMpOyBcDQorICBpZiAocyA9PSAwKSByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsgcG9zICs9IHM7IH0NCisNCitTUmVzIFh6QmxvY2tfUmVhZEhlYWRlcihDWHpCbG9jayAqcCwgSVNlcUluU3RyZWFtICppblN0cmVhbSwgQm9vbCAqaXNJbmRleCwgVUludDMyICpoZWFkZXJTaXplUmVzKQ0KK3sNCisgIEJ5dGUgaGVhZGVyW1haX0JMT0NLX0hFQURFUl9TSVpFX01BWF07DQorICB1bnNpZ25lZCBoZWFkZXJTaXplOw0KKyAgKmhlYWRlclNpemVSZXMgPSAwOw0KKyAgUklOT0soU2VxSW5TdHJlYW1fUmVhZEJ5dGUoaW5TdHJlYW0sICZoZWFkZXJbMF0pKTsNCisgIGhlYWRlclNpemUgPSAoKHVuc2lnbmVkKWhlYWRlclswXSA8PCAyKSArIDQ7DQorICBpZiAoaGVhZGVyU2l6ZSA9PSAwKQ0KKyAgew0KKyAgICAqaGVhZGVyU2l6ZVJlcyA9IDE7DQorICAgICppc0luZGV4ID0gVHJ1ZTsNCisgICAgcmV0dXJuIFNaX09LOw0KKyAgfQ0KKw0KKyAgKmlzSW5kZXggPSBGYWxzZTsNCisgICpoZWFkZXJTaXplUmVzID0gaGVhZGVyU2l6ZTsNCisgIFJJTk9LKFNlcUluU3RyZWFtX1JlYWQoaW5TdHJlYW0sIGhlYWRlciArIDEsIGhlYWRlclNpemUgLSAxKSk7DQorICByZXR1cm4gWHpCbG9ja19QYXJzZShwLCBoZWFkZXIpOw0KK30NCisNCisjZGVmaW5lIEFERF9TSVpFX0NIRUNIKHNpemUsIHZhbCkgXA0KKyAgeyBVSW50NjQgbmV3U2l6ZSA9IHNpemUgKyAodmFsKTsgaWYgKG5ld1NpemUgPCBzaXplKSByZXR1cm4gWFpfU0laRV9PVkVSRkxPVzsgc2l6ZSA9IG5ld1NpemU7IH0NCisNCitVSW50NjQgWHpfR2V0VW5wYWNrU2l6ZShjb25zdCBDWHpTdHJlYW0gKnApDQorew0KKyAgVUludDY0IHNpemUgPSAwOw0KKyAgc2l6ZV90IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgcC0+bnVtQmxvY2tzOyBpKyspDQorICAgIEFERF9TSVpFX0NIRUNIKHNpemUsIHAtPmJsb2Nrc1tpXS51bnBhY2tTaXplKTsNCisgIHJldHVybiBzaXplOw0KK30NCisNCitVSW50NjQgWHpfR2V0UGFja1NpemUoY29uc3QgQ1h6U3RyZWFtICpwKQ0KK3sNCisgIFVJbnQ2NCBzaXplID0gMDsNCisgIHNpemVfdCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHAtPm51bUJsb2NrczsgaSsrKQ0KKyAgICBBRERfU0laRV9DSEVDSChzaXplLCAocC0+YmxvY2tzW2ldLnRvdGFsU2l6ZSArIDMpICYgfihVSW50NjQpMyk7DQorICByZXR1cm4gc2l6ZTsNCit9DQorDQorLyoNCitTUmVzIFh6QmxvY2tfUmVhZEZvb3RlcihDWHpCbG9jayAqcCwgQ1h6U3RyZWFtRmxhZ3MgZiwgSVNlcUluU3RyZWFtICppblN0cmVhbSkNCit7DQorICByZXR1cm4gU2VxSW5TdHJlYW1fUmVhZChpblN0cmVhbSwgcC0+Y2hlY2ssIFh6RmxhZ3NfR2V0Q2hlY2tTaXplKGYpKTsNCit9DQorKi8NCisNCitzdGF0aWMgU1JlcyBYel9SZWFkSW5kZXgyKENYelN0cmVhbSAqcCwgY29uc3QgQnl0ZSAqYnVmLCBzaXplX3Qgc2l6ZSwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIHNpemVfdCBpLCBudW1CbG9ja3MsIHBvcyA9IDE7DQorICBVSW50MzIgY3JjOw0KKw0KKyAgaWYgKHNpemUgPCA1IHx8IGJ1ZlswXSAhPSAwKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisNCisgIHNpemUgLT0gNDsNCisgIGNyYyA9IENyY0NhbGMoYnVmLCBzaXplKTsNCisgIGlmIChjcmMgIT0gR2V0VWkzMihidWYgKyBzaXplKSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorDQorICB7DQorICAgIFVJbnQ2NCBudW1CbG9ja3M2NDsNCisgICAgUkVBRF9WQVJJTlRfQU5EX0NIRUNLKGJ1ZiwgcG9zLCBzaXplLCAmbnVtQmxvY2tzNjQpOw0KKyAgICBudW1CbG9ja3MgPSAoc2l6ZV90KW51bUJsb2NrczY0Ow0KKyAgICBpZiAobnVtQmxvY2tzICE9IG51bUJsb2NrczY0IHx8IG51bUJsb2NrcyAqIDIgPiBzaXplKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgfQ0KKyAgDQorICBYel9GcmVlKHAsIGFsbG9jKTsNCisgIGlmIChudW1CbG9ja3MgIT0gMCkNCisgIHsNCisgICAgcC0+bnVtQmxvY2tzID0gbnVtQmxvY2tzOw0KKyAgICBwLT5udW1CbG9ja3NBbGxvY2F0ZWQgPSBudW1CbG9ja3M7DQorICAgIHAtPmJsb2NrcyA9IGFsbG9jLT5BbGxvYyhhbGxvYywgc2l6ZW9mKENYekJsb2NrU2l6ZXMpICogbnVtQmxvY2tzKTsNCisgICAgaWYgKHAtPmJsb2NrcyA9PSAwKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9NRU07DQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1CbG9ja3M7IGkrKykNCisgICAgew0KKyAgICAgIENYekJsb2NrU2l6ZXMgKmJsb2NrID0gJnAtPmJsb2Nrc1tpXTsNCisgICAgICBSRUFEX1ZBUklOVF9BTkRfQ0hFQ0soYnVmLCBwb3MsIHNpemUsICZibG9jay0+dG90YWxTaXplKTsNCisgICAgICBSRUFEX1ZBUklOVF9BTkRfQ0hFQ0soYnVmLCBwb3MsIHNpemUsICZibG9jay0+dW5wYWNrU2l6ZSk7DQorICAgICAgaWYgKGJsb2NrLT50b3RhbFNpemUgPT0gMCkNCisgICAgICAgIHJldHVybiBTWl9FUlJPUl9BUkNISVZFOw0KKyAgICB9DQorICB9DQorICB3aGlsZSAoKHBvcyAmIDMpICE9IDApDQorICAgIGlmIChidWZbcG9zKytdICE9IDApDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorICByZXR1cm4gKHBvcyA9PSBzaXplKSA/IFNaX09LIDogU1pfRVJST1JfQVJDSElWRTsNCit9DQorDQorc3RhdGljIFNSZXMgWHpfUmVhZEluZGV4KENYelN0cmVhbSAqcCwgSUxvb2tJblN0cmVhbSAqc3RyZWFtLCBVSW50NjQgaW5kZXhTaXplLCBJU3pBbGxvYyAqYWxsb2MpDQorew0KKyAgU1JlcyByZXM7DQorICBzaXplX3Qgc2l6ZTsNCisgIEJ5dGUgKmJ1ZjsNCisgIGlmIChpbmRleFNpemUgPiAoKFVJbnQzMikxIDw8IDMxKSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKyAgc2l6ZSA9IChzaXplX3QpaW5kZXhTaXplOw0KKyAgaWYgKHNpemUgIT0gaW5kZXhTaXplKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICBidWYgPSBhbGxvYy0+QWxsb2MoYWxsb2MsIHNpemUpOw0KKyAgaWYgKGJ1ZiA9PSAwKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfTUVNOw0KKyAgcmVzID0gTG9va0luU3RyZWFtX1JlYWQyKHN0cmVhbSwgYnVmLCBzaXplLCBTWl9FUlJPUl9VTlNVUFBPUlRFRCk7DQorICBpZiAocmVzID09IFNaX09LKQ0KKyAgICByZXMgPSBYel9SZWFkSW5kZXgyKHAsIGJ1Ziwgc2l6ZSwgYWxsb2MpOw0KKyAgYWxsb2MtPkZyZWUoYWxsb2MsIGJ1Zik7DQorICByZXR1cm4gcmVzOw0KK30NCisNCitzdGF0aWMgU1JlcyBTZWVrRnJvbUN1cihJTG9va0luU3RyZWFtICppblN0cmVhbSwgSW50NjQgKnJlcykNCit7DQorICByZXR1cm4gaW5TdHJlYW0tPlNlZWsoaW5TdHJlYW0sIHJlcywgU1pfU0VFS19DVVIpOw0KK30NCisNCitzdGF0aWMgU1JlcyBYel9SZWFkQmFja3dhcmQoQ1h6U3RyZWFtICpwLCBJTG9va0luU3RyZWFtICpzdHJlYW0sIEludDY0ICpzdGFydE9mZnNldCwgSVN6QWxsb2MgKmFsbG9jKQ0KK3sNCisgIFVJbnQ2NCBpbmRleFNpemU7DQorICBCeXRlIGJ1ZltYWl9TVFJFQU1fRk9PVEVSX1NJWkVdOw0KKw0KKyAgaWYgKCgqc3RhcnRPZmZzZXQgJiAzKSAhPSAwIHx8ICpzdGFydE9mZnNldCA8IFhaX1NUUkVBTV9GT09URVJfU0laRSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX05PX0FSQ0hJVkU7DQorICAqc3RhcnRPZmZzZXQgPSAtWFpfU1RSRUFNX0ZPT1RFUl9TSVpFOw0KKyAgUklOT0soU2Vla0Zyb21DdXIoc3RyZWFtLCBzdGFydE9mZnNldCkpOw0KKw0KKyAgUklOT0soTG9va0luU3RyZWFtX1JlYWQyKHN0cmVhbSwgYnVmLCBYWl9TVFJFQU1fRk9PVEVSX1NJWkUsIFNaX0VSUk9SX05PX0FSQ0hJVkUpKTsNCisgIA0KKyAgaWYgKG1lbWNtcChidWYgKyAxMCwgWFpfRk9PVEVSX1NJRywgWFpfRk9PVEVSX1NJR19TSVpFKSAhPSAwKQ0KKyAgew0KKyAgICBVSW50MzIgdG90YWwgPSAwOw0KKyAgICAqc3RhcnRPZmZzZXQgKz0gWFpfU1RSRUFNX0ZPT1RFUl9TSVpFOw0KKyAgICBmb3IgKDs7KQ0KKyAgICB7DQorICAgICAgc2l6ZV90IGk7DQorICAgICAgI2RlZmluZSBURU1QX0JVRl9TSVpFICgxIDw8IDEwKQ0KKyAgICAgIEJ5dGUgdGVtcEJ1ZltURU1QX0JVRl9TSVpFXTsNCisgICAgICBpZiAoKnN0YXJ0T2Zmc2V0IDwgWFpfU1RSRUFNX0ZPT1RFUl9TSVpFIHx8IHRvdGFsID4gKDEgPDwgMTYpKQ0KKyAgICAgICAgcmV0dXJuIFNaX0VSUk9SX05PX0FSQ0hJVkU7DQorICAgICAgaSA9ICgqc3RhcnRPZmZzZXQgPiBURU1QX0JVRl9TSVpFKSA/IFRFTVBfQlVGX1NJWkUgOiAoc2l6ZV90KSpzdGFydE9mZnNldDsNCisgICAgICB0b3RhbCArPSAoVUludDMyKWk7DQorICAgICAgKnN0YXJ0T2Zmc2V0ID0gLShJbnQ2NClpOw0KKyAgICAgIFJJTk9LKFNlZWtGcm9tQ3VyKHN0cmVhbSwgc3RhcnRPZmZzZXQpKTsNCisgICAgICBSSU5PSyhMb29rSW5TdHJlYW1fUmVhZDIoc3RyZWFtLCB0ZW1wQnVmLCBpLCBTWl9FUlJPUl9OT19BUkNISVZFKSk7DQorICAgICAgZm9yICg7IGkgIT0gMDsgaS0tKQ0KKyAgICAgICAgaWYgKHRlbXBCdWZbaSAtIDFdICE9IDApDQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIGlmIChpICE9IDApDQorICAgICAgew0KKyAgICAgICAgaWYgKChpICYgMykgIT0gMCkNCisgICAgICAgICAgcmV0dXJuIFNaX0VSUk9SX05PX0FSQ0hJVkU7DQorICAgICAgICAqc3RhcnRPZmZzZXQgKz0gaTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoKnN0YXJ0T2Zmc2V0IDwgWFpfU1RSRUFNX0ZPT1RFUl9TSVpFKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9OT19BUkNISVZFOw0KKyAgICAqc3RhcnRPZmZzZXQgLT0gWFpfU1RSRUFNX0ZPT1RFUl9TSVpFOw0KKyAgICBSSU5PSyhzdHJlYW0tPlNlZWsoc3RyZWFtLCBzdGFydE9mZnNldCwgU1pfU0VFS19TRVQpKTsNCisgICAgUklOT0soTG9va0luU3RyZWFtX1JlYWQyKHN0cmVhbSwgYnVmLCBYWl9TVFJFQU1fRk9PVEVSX1NJWkUsIFNaX0VSUk9SX05PX0FSQ0hJVkUpKTsNCisgICAgaWYgKG1lbWNtcChidWYgKyAxMCwgWFpfRk9PVEVSX1NJRywgWFpfRk9PVEVSX1NJR19TSVpFKSAhPSAwKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9OT19BUkNISVZFOw0KKyAgfQ0KKyAgDQorICBwLT5mbGFncyA9IChDWHpTdHJlYW1GbGFncylHZXRCZTE2KGJ1ZiArIDgpOw0KKw0KKyAgaWYgKCFYekZsYWdzX0lzU3VwcG9ydGVkKHAtPmZsYWdzKSkNCisgICAgcmV0dXJuIFNaX0VSUk9SX1VOU1VQUE9SVEVEOw0KKw0KKyAgaWYgKEdldFVpMzIoYnVmKSAhPSBDcmNDYWxjKGJ1ZiArIDQsIDYpKQ0KKyAgICByZXR1cm4gU1pfRVJST1JfQVJDSElWRTsNCisNCisgIGluZGV4U2l6ZSA9ICgoVUludDY0KUdldFVpMzIoYnVmICsgNCkgKyAxKSA8PCAyOw0KKw0KKyAgKnN0YXJ0T2Zmc2V0ID0gLShJbnQ2NCkoaW5kZXhTaXplICsgWFpfU1RSRUFNX0ZPT1RFUl9TSVpFKTsNCisgIFJJTk9LKFNlZWtGcm9tQ3VyKHN0cmVhbSwgc3RhcnRPZmZzZXQpKTsNCisNCisgIFJJTk9LKFh6X1JlYWRJbmRleChwLCBzdHJlYW0sIGluZGV4U2l6ZSwgYWxsb2MpKTsNCisNCisgIHsNCisgICAgVUludDY0IHRvdGFsU2l6ZSA9IFh6X0dldFBhY2tTaXplKHApOw0KKyAgICBVSW50NjQgc3VtID0gWFpfU1RSRUFNX0hFQURFUl9TSVpFICsgdG90YWxTaXplICsgaW5kZXhTaXplOw0KKyAgICBpZiAodG90YWxTaXplID09IFhaX1NJWkVfT1ZFUkZMT1cgfHwNCisgICAgICBzdW0gPj0gKChVSW50NjQpMSA8PCA2MykgfHwNCisgICAgICB0b3RhbFNpemUgPj0gKChVSW50NjQpMSA8PCA2MykpDQorICAgICAgcmV0dXJuIFNaX0VSUk9SX0FSQ0hJVkU7DQorICAgICpzdGFydE9mZnNldCA9IC0oSW50NjQpc3VtOw0KKyAgICBSSU5PSyhTZWVrRnJvbUN1cihzdHJlYW0sIHN0YXJ0T2Zmc2V0KSk7DQorICB9DQorICB7DQorICAgIENYelN0cmVhbUZsYWdzIGhlYWRlckZsYWdzOw0KKyAgICBDU2VjVG9SZWFkIHNlY1RvUmVhZDsNCisgICAgU2VjVG9SZWFkX0NyZWF0ZVZUYWJsZSgmc2VjVG9SZWFkKTsNCisgICAgc2VjVG9SZWFkLnJlYWxTdHJlYW0gPSBzdHJlYW07DQorDQorICAgIFJJTk9LKFh6X1JlYWRIZWFkZXIoJmhlYWRlckZsYWdzLCAmc2VjVG9SZWFkLnMpKTsNCisgICAgcmV0dXJuIChwLT5mbGFncyA9PSBoZWFkZXJGbGFncykgPyBTWl9PSyA6IFNaX0VSUk9SX0FSQ0hJVkU7DQorICB9DQorfQ0KKw0KKw0KKy8qIC0tLS0tLS0tLS0gWHogU3RyZWFtcyAtLS0tLS0tLS0tICovDQorDQordm9pZCBYenNfQ29uc3RydWN0KENYenMgKnApDQorew0KKyAgcC0+bnVtID0gcC0+bnVtQWxsb2NhdGVkID0gMDsNCisgIHAtPnN0cmVhbXMgPSAwOw0KK30NCisNCit2b2lkIFh6c19GcmVlKENYenMgKnAsIElTekFsbG9jICphbGxvYykNCit7DQorICBzaXplX3QgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBwLT5udW07IGkrKykNCisgICAgWHpfRnJlZSgmcC0+c3RyZWFtc1tpXSwgYWxsb2MpOw0KKyAgYWxsb2MtPkZyZWUoYWxsb2MsIHAtPnN0cmVhbXMpOw0KKyAgcC0+bnVtID0gcC0+bnVtQWxsb2NhdGVkID0gMDsNCisgIHAtPnN0cmVhbXMgPSAwOw0KK30NCisNCitVSW50NjQgWHpzX0dldE51bUJsb2Nrcyhjb25zdCBDWHpzICpwKQ0KK3sNCisgIFVJbnQ2NCBudW0gPSAwOw0KKyAgc2l6ZV90IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgcC0+bnVtOyBpKyspDQorICAgIG51bSArPSBwLT5zdHJlYW1zW2ldLm51bUJsb2NrczsNCisgIHJldHVybiBudW07DQorfQ0KKw0KK1VJbnQ2NCBYenNfR2V0VW5wYWNrU2l6ZShjb25zdCBDWHpzICpwKQ0KK3sNCisgIFVJbnQ2NCBzaXplID0gMDsNCisgIHNpemVfdCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHAtPm51bTsgaSsrKQ0KKyAgICBBRERfU0laRV9DSEVDSChzaXplLCBYel9HZXRVbnBhY2tTaXplKCZwLT5zdHJlYW1zW2ldKSk7DQorICByZXR1cm4gc2l6ZTsNCit9DQorDQorLyoNCitVSW50NjQgWHpzX0dldFBhY2tTaXplKGNvbnN0IENYenMgKnApDQorew0KKyAgVUludDY0IHNpemUgPSAwOw0KKyAgc2l6ZV90IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgcC0+bnVtOyBpKyspDQorICAgIEFERF9TSVpFX0NIRUNIKHNpemUsIFh6X0dldFRvdGFsU2l6ZSgmcC0+c3RyZWFtc1tpXSkpOw0KKyAgcmV0dXJuIHNpemU7DQorfQ0KKyovDQorDQorU1JlcyBYenNfUmVhZEJhY2t3YXJkKENYenMgKnAsIElMb29rSW5TdHJlYW0gKnN0cmVhbSwgSW50NjQgKnN0YXJ0T2Zmc2V0LCBJQ29tcHJlc3NQcm9ncmVzcyAqcHJvZ3Jlc3MsIElTekFsbG9jICphbGxvYykNCit7DQorICBJbnQ2NCBlbmRPZmZzZXQgPSAwOw0KKyAgUklOT0soc3RyZWFtLT5TZWVrKHN0cmVhbSwgJmVuZE9mZnNldCwgU1pfU0VFS19FTkQpKTsNCisgICpzdGFydE9mZnNldCA9IGVuZE9mZnNldDsNCisgIGZvciAoOzspDQorICB7DQorICAgIENYelN0cmVhbSBzdDsNCisgICAgU1JlcyByZXM7DQorICAgIFh6X0NvbnN0cnVjdCgmc3QpOw0KKyAgICByZXMgPSBYel9SZWFkQmFja3dhcmQoJnN0LCBzdHJlYW0sIHN0YXJ0T2Zmc2V0LCBhbGxvYyk7DQorICAgIHN0LnN0YXJ0T2Zmc2V0ID0gKnN0YXJ0T2Zmc2V0Ow0KKyAgICBSSU5PSyhyZXMpOw0KKyAgICBpZiAocC0+bnVtID09IHAtPm51bUFsbG9jYXRlZCkNCisgICAgew0KKyAgICAgIHNpemVfdCBuZXdOdW0gPSBwLT5udW0gKyBwLT5udW0gLyA0ICsgMTsNCisgICAgICBCeXRlICpkYXRhID0gKEJ5dGUgKilhbGxvYy0+QWxsb2MoYWxsb2MsIG5ld051bSAqIHNpemVvZihDWHpTdHJlYW0pKTsNCisgICAgICBpZiAoZGF0YSA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIFNaX0VSUk9SX01FTTsNCisgICAgICBwLT5udW1BbGxvY2F0ZWQgPSBuZXdOdW07DQorICAgICAgaWYgKHAtPm51bSAhPSAwKQ0KKyAgICAgICAgbWVtY3B5KGRhdGEsIHAtPnN0cmVhbXMsIHAtPm51bSAqIHNpemVvZihDWHpTdHJlYW0pKTsNCisgICAgICBhbGxvYy0+RnJlZShhbGxvYywgcC0+c3RyZWFtcyk7DQorICAgICAgcC0+c3RyZWFtcyA9IChDWHpTdHJlYW0gKilkYXRhOw0KKyAgICB9DQorICAgIHAtPnN0cmVhbXNbcC0+bnVtKytdID0gc3Q7DQorICAgIGlmICgqc3RhcnRPZmZzZXQgPT0gMCkNCisgICAgICBicmVhazsNCisgICAgUklOT0soc3RyZWFtLT5TZWVrKHN0cmVhbSwgc3RhcnRPZmZzZXQsIFNaX1NFRUtfU0VUKSk7DQorICAgIGlmIChwcm9ncmVzcyAmJiBwcm9ncmVzcy0+UHJvZ3Jlc3MocHJvZ3Jlc3MsIGVuZE9mZnNldCAtICpzdGFydE9mZnNldCwgKFVJbnQ2NCkoSW50NjQpLTEpICE9IFNaX09LKQ0KKyAgICAgIHJldHVybiBTWl9FUlJPUl9QUk9HUkVTUzsNCisgIH0NCisgIHJldHVybiBTWl9PSzsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC83emlwLm1hayBiL2x6bWEvQ1BQLzd6aXAvN3ppcC5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlYzI3YwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvN3ppcC5tYWsKQEAgLTAsMCArMSwyNDAgQEAKK09CSlMgPSBcDQorICAkT1xTdGRBZngub2JqIFwNCisgICQoQ1VSUkVOVF9PQkpTKSBcDQorICAkKENPTU1PTl9PQkpTKSBcDQorICAkKFdJTl9PQkpTKSBcDQorICAkKFdJTl9DVFJMX09CSlMpIFwNCisgICQoN1pJUF9DT01NT05fT0JKUykgXA0KKyAgJChBUl9PQkpTKSBcDQorICAkKEFSX0NPTU1PTl9PQkpTKSBcDQorICAkKFVJX0NPTU1PTl9PQkpTKSBcDQorICAkKEFHRU5UX09CSlMpIFwNCisgICQoQ09OU09MRV9PQkpTKSBcDQorICAkKEVYUExPUkVSX09CSlMpIFwNCisgICQoRk1fT0JKUykgXA0KKyAgJChHVUlfT0JKUykgXA0KKyAgJCg3Wl9PQkpTKSBcDQorICAkKENBQl9PQkpTKSBcDQorICAkKENITV9PQkpTKSBcDQorICAkKENPTV9PQkpTKSBcDQorICAkKElTT19PQkpTKSBcDQorICAkKE5TSVNfT0JKUykgXA0KKyAgJChSQVJfT0JKUykgXA0KKyAgJChUQVJfT0JKUykgXA0KKyAgJChVREZfT0JKUykgXA0KKyAgJChXSU1fT0JKUykgXA0KKyAgJChaSVBfT0JKUykgXA0KKyAgJChDT01QUkVTU19PQkpTKSBcDQorICAkKENSWVBUT19PQkpTKSBcDQorICAkKENfT0JKUykgXA0KKyAgJChBU01fT0JKUykgXA0KKyAgJE9ccmVzb3VyY2UucmVzIFwNCisNCishaW5jbHVkZSAiLi4vLi4vLi4vQnVpbGQubWFrIg0KKw0KKyMgTUFLX1NJTkdMRV9GSUxFID0gMQ0KKw0KKyFJRkRFRiBNQUtfU0lOR0xFX0ZJTEUNCisNCishSUZERUYgQ1VSUkVOVF9PQkpTDQorJChDVVJSRU5UX09CSlMpOiAuLyQoKkIpLmNwcA0KKwkkKENPTVBMKQ0KKyFFTkRJRg0KKw0KKw0KKyFJRkRFRiBDT01NT05fT0JKUw0KKyQoQ09NTU9OX09CSlMpOiAuLi8uLi8uLi9Db21tb24vJCgqQikuY3BwDQorCSQoQ09NUEwpDQorIUVORElGDQorDQorIUlGREVGIFdJTl9PQkpTDQorJChXSU5fT0JKUyk6IC4uLy4uLy4uL1dpbmRvd3MvJCgqQikuY3BwDQorCSQoQ09NUEwpDQorIUVORElGDQorDQorIUlGREVGIFdJTl9DVFJMX09CSlMNCiskKFdJTl9DVFJMX09CSlMpOiAuLi8uLi8uLi9XaW5kb3dzL0NvbnRyb2wvJCgqQikuY3BwDQorCSQoQ09NUEwpDQorIUVORElGDQorDQorIUlGREVGIDdaSVBfQ09NTU9OX09CSlMNCiskKDdaSVBfQ09NTU9OX09CSlMpOiAuLi8uLi9Db21tb24vJCgqQikuY3BwDQorCSQoQ09NUEwpDQorIUVORElGDQorDQorIUlGREVGIEFSX09CSlMNCiskKEFSX09CSlMpOiAuLi8uLi9BcmNoaXZlLyQoKkIpLmNwcA0KKwkkKENPTVBMKQ0KKyFFTkRJRg0KKw0KKyFJRkRFRiBBUl9DT01NT05fT0JKUw0KKyQoQVJfQ09NTU9OX09CSlMpOiAuLi8uLi9BcmNoaXZlL0NvbW1vbi8kKCpCKS5jcHANCisJJChDT01QTCkNCishRU5ESUYNCisNCishSUZERUYgN1pfT0JKUw0KKyQoN1pfT0JKUyk6IC4uLy4uL0FyY2hpdmUvN3ovJCgqQikuY3BwDQorCSQoQ09NUEwpDQorIUVORElGDQorDQorIUlGREVGIENBQl9PQkpTDQorJChDQUJfT0JKUyk6IC4uLy4uL0FyY2hpdmUvQ2FiLyQoKkIpLmNwcA0KKwkkKENPTVBMKQ0KKyFFTkRJRg0KKw0KKyFJRkRFRiBDSE1fT0JKUw0KKyQoQ0hNX09CSlMpOiAuLi8uLi9BcmNoaXZlL0NobS8kKCpCKS5jcHANCisJJChDT01QTCkNCishRU5ESUYNCisNCishSUZERUYgQ09NX09CSlMNCiskKENPTV9PQkpTKTogLi4vLi4vQXJjaGl2ZS9Db20vJCgqQikuY3BwDQorCSQoQ09NUEwpDQorIUVORElGDQorDQorIUlGREVGIElTT19PQkpTDQorJChJU09fT0JKUyk6IC4uLy4uL0FyY2hpdmUvSXNvLyQoKkIpLmNwcA0KKwkkKENPTVBMKQ0KKyFFTkRJRg0KKw0KKyFJRkRFRiBOU0lTX09CSlMNCiskKE5TSVNfT0JKUyk6IC4uLy4uL0FyY2hpdmUvTnNpcy8kKCpCKS5jcHANCisJJChDT01QTCkNCishRU5ESUYNCisNCishSUZERUYgUkFSX09CSlMNCiskKFJBUl9PQkpTKTogLi4vLi4vQXJjaGl2ZS9SYXIvJCgqQikuY3BwDQorCSQoQ09NUEwpDQorIUVORElGDQorDQorIUlGREVGIFRBUl9PQkpTDQorJChUQVJfT0JKUyk6IC4uLy4uL0FyY2hpdmUvVGFyLyQoKkIpLmNwcA0KKwkkKENPTVBMKQ0KKyFFTkRJRg0KKw0KKyFJRkRFRiBVREZfT0JKUw0KKyQoVURGX09CSlMpOiAuLi8uLi9BcmNoaXZlL1VkZi8kKCpCKS5jcHANCisJJChDT01QTCkNCishRU5ESUYNCisNCishSUZERUYgV0lNX09CSlMNCiskKFdJTV9PQkpTKTogLi4vLi4vQXJjaGl2ZS9XaW0vJCgqQikuY3BwDQorCSQoQ09NUEwpDQorIUVORElGDQorDQorIUlGREVGIFpJUF9PQkpTDQorJChaSVBfT0JKUyk6IC4uLy4uL0FyY2hpdmUvWmlwLyQoKkIpLmNwcA0KKwkkKENPTVBMKQ0KKyFFTkRJRg0KKw0KKyFJRkRFRiBDT01QUkVTU19PQkpTDQorJChDT01QUkVTU19PQkpTKTogLi4vLi4vQ29tcHJlc3MvJCgqQikuY3BwDQorCSQoQ09NUExfTzIpDQorIUVORElGDQorDQorIUlGREVGIENSWVBUT19PQkpTDQorJChDUllQVE9fT0JKUyk6IC4uLy4uL0NyeXB0by8kKCpCKS5jcHANCisJJChDT01QTF9PMikNCishRU5ESUYNCisNCishSUZERUYgVUlfQ09NTU9OX09CSlMNCiskKFVJX0NPTU1PTl9PQkpTKTogLi4vLi4vVUkvQ29tbW9uLyQoKkIpLmNwcA0KKwkkKENPTVBMKQ0KKyFFTkRJRg0KKw0KKyFJRkRFRiBBR0VOVF9PQkpTDQorJChBR0VOVF9PQkpTKTogLi4vLi4vVUkvQWdlbnQvJCgqQikuY3BwDQorCSQoQ09NUEwpDQorIUVORElGDQorDQorIUlGREVGIENPTlNPTEVfT0JKUw0KKyQoQ09OU09MRV9PQkpTKTogLi4vLi4vVUkvQ29uc29sZS8kKCpCKS5jcHANCisJJChDT01QTCkNCishRU5ESUYNCisNCishSUZERUYgRVhQTE9SRVJfT0JKUw0KKyQoRVhQTE9SRVJfT0JKUyk6IC4uLy4uL1VJL0V4cGxvcmVyLyQoKkIpLmNwcA0KKwkkKENPTVBMKQ0KKyFFTkRJRg0KKw0KKyFJRkRFRiBGTV9PQkpTDQorJChGTV9PQkpTKTogLi4vLi4vVUkvRmlsZU1hbmFnZXIvJCgqQikuY3BwDQorCSQoQ09NUEwpDQorIUVORElGDQorDQorIUlGREVGIEdVSV9PQkpTDQorJChHVUlfT0JKUyk6IC4uLy4uL1VJL0dVSS8kKCpCKS5jcHANCisJJChDT01QTCkNCishRU5ESUYNCisNCishSUZERUYgQ19PQkpTDQorJChDX09CSlMpOiAuLi8uLi8uLi8uLi9DLyQoKkIpLmMNCisJJChDT01QTF9PMikNCishRU5ESUYNCisNCisNCishRUxTRQ0KKw0KK3sufS5jcHB7JE99Lm9iajo6DQorCSQoQ09NUExCKQ0KK3suLi8uLi8uLi9Db21tb259LmNwcHskT30ub2JqOjoNCisJJChDT01QTEIpDQorey4uLy4uLy4uL1dpbmRvd3N9LmNwcHskT30ub2JqOjoNCisJJChDT01QTEIpDQorey4uLy4uLy4uL1dpbmRvd3MvQ29udHJvbH0uY3BweyRPfS5vYmo6Og0KKwkkKENPTVBMQikNCit7Li4vLi4vQ29tbW9ufS5jcHB7JE99Lm9iajo6DQorCSQoQ09NUExCKQ0KKw0KK3suLi8uLi9VSS9Db21tb259LmNwcHskT30ub2JqOjoNCisJJChDT01QTEIpDQorey4uLy4uL1VJL0FnZW50fS5jcHB7JE99Lm9iajo6DQorCSQoQ09NUExCKQ0KK3suLi8uLi9VSS9Db25zb2xlfS5jcHB7JE99Lm9iajo6DQorCSQoQ09NUExCKQ0KK3suLi8uLi9VSS9FeHBsb3Jlcn0uY3BweyRPfS5vYmo6Og0KKwkkKENPTVBMQikNCit7Li4vLi4vVUkvRmlsZU1hbmFnZXJ9LmNwcHskT30ub2JqOjoNCisJJChDT01QTEIpDQorey4uLy4uL1VJL0dVSX0uY3BweyRPfS5vYmo6Og0KKwkkKENPTVBMQikNCisNCisNCit7Li4vLi4vQXJjaGl2ZX0uY3BweyRPfS5vYmo6Og0KKwkkKENPTVBMQikNCit7Li4vLi4vQXJjaGl2ZS9Db21tb259LmNwcHskT30ub2JqOjoNCisJJChDT01QTEIpDQorDQorey4uLy4uL0FyY2hpdmUvN3p9LmNwcHskT30ub2JqOjoNCisJJChDT01QTEIpDQorey4uLy4uL0FyY2hpdmUvQ2FifS5jcHB7JE99Lm9iajo6DQorCSQoQ09NUExCKQ0KK3suLi8uLi9BcmNoaXZlL0NobX0uY3BweyRPfS5vYmo6Og0KKwkkKENPTVBMQikNCit7Li4vLi4vQXJjaGl2ZS9Db219LmNwcHskT30ub2JqOjoNCisJJChDT01QTEIpDQorey4uLy4uL0FyY2hpdmUvSXNvfS5jcHB7JE99Lm9iajo6DQorCSQoQ09NUExCKQ0KK3suLi8uLi9BcmNoaXZlL05zaXN9LmNwcHskT30ub2JqOjoNCisJJChDT01QTEIpDQorey4uLy4uL0FyY2hpdmUvUmFyfS5jcHB7JE99Lm9iajo6DQorCSQoQ09NUExCKQ0KK3suLi8uLi9BcmNoaXZlL1Rhcn0uY3BweyRPfS5vYmo6Og0KKwkkKENPTVBMQikNCit7Li4vLi4vQXJjaGl2ZS9VZGZ9LmNwcHskT30ub2JqOjoNCisJJChDT01QTEIpDQorey4uLy4uL0FyY2hpdmUvV2ltfS5jcHB7JE99Lm9iajo6DQorCSQoQ09NUExCKQ0KK3suLi8uLi9BcmNoaXZlL1ppcH0uY3BweyRPfS5vYmo6Og0KKwkkKENPTVBMQikNCisNCit7Li4vLi4vQ29tcHJlc3N9LmNwcHskT30ub2JqOjoNCisJJChDT01QTEJfTzIpDQorey4uLy4uL0NyeXB0b30uY3BweyRPfS5vYmo6Og0KKwkkKENPTVBMQl9PMikNCit7Li4vLi4vLi4vLi4vQ30uY3skT30ub2JqOjoNCisJJChDQ09NUExCKQ0KKw0KKyFFTkRJRg0KKw0KKyFpbmNsdWRlICJBc20ubWFrIg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQWVzLm1hayBiL2x6bWEvQ1BQLzd6aXAvQWVzLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2UyOGNmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BZXMubWFrCkBAIC0wLDAgKzEsNyBAQAorQ19PQkpTID0gJChDX09CSlMpIFwNCisgICRPXEFlcy5vYmoNCisNCishSUYgIiQoQ1BVKSIgIT0gIklBNjQiICYmICIkKENQVSkiICE9ICJNSVBTIiAmJiAiJChDUFUpIiAhPSAiQVJNIg0KK0FTTV9PQkpTID0gJChBU01fT0JKUykgXA0KKyAgJE9cQWVzT3B0Lm9iag0KKyFFTkRJRg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekNvbXByZXNzaW9uTW9kZS5jcHAgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pDb21wcmVzc2lvbk1vZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMmM2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pDb21wcmVzc2lvbk1vZGUuY3BwCkBAIC0wLDAgKzEsMyBAQAorLy8gQ29tcHJlc3Npb25NZXRob2QuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekNvbXByZXNzaW9uTW9kZS5oIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6Q29tcHJlc3Npb25Nb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwMWI5MwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekNvbXByZXNzaW9uTW9kZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vIDd6Q29tcHJlc3Npb25Nb2RlLmgNCisNCisjaWZuZGVmIF9fN1pfQ09NUFJFU1NJT05fTU9ERV9IDQorI2RlZmluZSBfXzdaX0NPTVBSRVNTSU9OX01PREVfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTWV0aG9kSWQuaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL01ldGhvZFByb3BzLmgiDQorDQorbmFtZXNwYWNlIE5BcmNoaXZlIHsNCituYW1lc3BhY2UgTjd6IHsNCisNCitzdHJ1Y3QgQ01ldGhvZEZ1bGw6IHB1YmxpYyBDUHJvcHMNCit7DQorICBDTWV0aG9kSWQgSWQ7DQorICBVSW50MzIgTnVtSW5TdHJlYW1zOw0KKyAgVUludDMyIE51bU91dFN0cmVhbXM7DQorDQorICBib29sIElzU2ltcGxlQ29kZXIoKSBjb25zdCB7IHJldHVybiAoTnVtSW5TdHJlYW1zID09IDEpICYmIChOdW1PdXRTdHJlYW1zID09IDEpOyB9DQorfTsNCisNCitzdHJ1Y3QgQ0JpbmQNCit7DQorICBVSW50MzIgSW5Db2RlcjsNCisgIFVJbnQzMiBJblN0cmVhbTsNCisgIFVJbnQzMiBPdXRDb2RlcjsNCisgIFVJbnQzMiBPdXRTdHJlYW07DQorfTsNCisNCitzdHJ1Y3QgQ0NvbXByZXNzaW9uTWV0aG9kTW9kZQ0KK3sNCisgIENPYmplY3RWZWN0b3I8Q01ldGhvZEZ1bGw+IE1ldGhvZHM7DQorICBDUmVjb3JkVmVjdG9yPENCaW5kPiBCaW5kczsNCisgICNpZm5kZWYgXzdaSVBfU1QNCisgIFVJbnQzMiBOdW1UaHJlYWRzOw0KKyAgI2VuZGlmDQorICBib29sIFBhc3N3b3JkSXNEZWZpbmVkOw0KKyAgVVN0cmluZyBQYXNzd29yZDsNCisNCisgIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIChNZXRob2RzLklzRW1wdHkoKSAmJiAhUGFzc3dvcmRJc0RlZmluZWQpOyB9DQorICBDQ29tcHJlc3Npb25NZXRob2RNb2RlKCk6IFBhc3N3b3JkSXNEZWZpbmVkKGZhbHNlKQ0KKyAgICAgICNpZm5kZWYgXzdaSVBfU1QNCisgICAgICAsIE51bVRocmVhZHMoMSkNCisgICAgICAjZW5kaWYNCisgIHt9DQorfTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekRlY29kZS5jcHAgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pEZWNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OGZiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pEZWNvZGUuY3BwCkBAIC0wLDAgKzEsMzQzIEBACisvLyA3ekRlY29kZS5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9MaW1pdGVkU3RyZWFtcy5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTG9ja2VkU3RyZWFtLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9Qcm9ncmVzc1V0aWxzLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9TdHJlYW1PYmplY3RzLmgiDQorDQorI2luY2x1ZGUgIjd6RGVjb2RlLmgiDQorDQorbmFtZXNwYWNlIE5BcmNoaXZlIHsNCituYW1lc3BhY2UgTjd6IHsNCisNCitzdGF0aWMgdm9pZCBDb252ZXJ0Rm9sZGVySXRlbUluZm9Ub0JpbmRJbmZvKGNvbnN0IENGb2xkZXIgJmZvbGRlciwNCisgICAgQ0JpbmRJbmZvRXggJmJpbmRJbmZvKQ0KK3sNCisgIGJpbmRJbmZvLkNsZWFyKCk7DQorICBiaW5kSW5mby5CaW5kUGFpcnMuQ2xlYXJBbmRTZXRTaXplKGZvbGRlci5CaW5kUGFpcnMuU2l6ZSgpKTsNCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgZm9sZGVyLkJpbmRQYWlycy5TaXplKCk7IGkrKykNCisgIHsNCisgICAgTkNvZGVyTWl4ZXI6OkNCaW5kUGFpciAmYmluZFBhaXIgPSBiaW5kSW5mby5CaW5kUGFpcnNbaV07DQorICAgIGJpbmRQYWlyLkluSW5kZXggPSAoVUludDMyKWZvbGRlci5CaW5kUGFpcnNbaV0uSW5JbmRleDsNCisgICAgYmluZFBhaXIuT3V0SW5kZXggPSAoVUludDMyKWZvbGRlci5CaW5kUGFpcnNbaV0uT3V0SW5kZXg7DQorICB9DQorDQorICBiaW5kSW5mby5Db2RlcnMuQ2xlYXJBbmRTZXRTaXplKGZvbGRlci5Db2RlcnMuU2l6ZSgpKTsNCisgIGJpbmRJbmZvLkNvZGVyTWV0aG9kSURzLkNsZWFyQW5kU2V0U2l6ZShmb2xkZXIuQ29kZXJzLlNpemUoKSk7DQorDQorICBVSW50MzIgb3V0U3RyZWFtSW5kZXggPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IGZvbGRlci5Db2RlcnMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIE5Db2Rlck1peGVyOjpDQ29kZXJTdHJlYW1zSW5mbyAmY29kZXJTdHJlYW1zSW5mbyA9IGJpbmRJbmZvLkNvZGVyc1tpXTsNCisgICAgY29uc3QgQ0NvZGVySW5mbyAmY29kZXJJbmZvID0gZm9sZGVyLkNvZGVyc1tpXTsNCisgICAgY29kZXJTdHJlYW1zSW5mby5OdW1JblN0cmVhbXMgPSAoVUludDMyKWNvZGVySW5mby5OdW1JblN0cmVhbXM7DQorICAgIGNvZGVyU3RyZWFtc0luZm8uTnVtT3V0U3RyZWFtcyA9IChVSW50MzIpY29kZXJJbmZvLk51bU91dFN0cmVhbXM7DQorICAgIGJpbmRJbmZvLkNvZGVyTWV0aG9kSURzW2ldID0gY29kZXJJbmZvLk1ldGhvZElEOw0KKyAgICBmb3IgKFVJbnQzMiBqID0gMDsgaiA8IGNvZGVyU3RyZWFtc0luZm8uTnVtT3V0U3RyZWFtczsgaisrLCBvdXRTdHJlYW1JbmRleCsrKQ0KKyAgICAgIGlmIChmb2xkZXIuRmluZEJpbmRQYWlyRm9yT3V0U3RyZWFtKG91dFN0cmVhbUluZGV4KSA8IDApDQorICAgICAgICBiaW5kSW5mby5PdXRTdHJlYW1zLkFkZChvdXRTdHJlYW1JbmRleCk7DQorICB9DQorICBiaW5kSW5mby5JblN0cmVhbXMuQ2xlYXJBbmRTZXRTaXplKGZvbGRlci5QYWNrU3RyZWFtcy5TaXplKCkpOw0KKyAgZm9yIChpID0gMDsgaSA8IGZvbGRlci5QYWNrU3RyZWFtcy5TaXplKCk7IGkrKykNCisgICAgYmluZEluZm8uSW5TdHJlYW1zW2ldID0gKFVJbnQzMilmb2xkZXIuUGFja1N0cmVhbXNbaV07DQorfQ0KKw0KK3N0YXRpYyBib29sIEFyZUNvZGVyc0VxdWFsKGNvbnN0IE5Db2Rlck1peGVyOjpDQ29kZXJTdHJlYW1zSW5mbyAmYTEsDQorICAgIGNvbnN0IE5Db2Rlck1peGVyOjpDQ29kZXJTdHJlYW1zSW5mbyAmYTIpDQorew0KKyAgcmV0dXJuIChhMS5OdW1JblN0cmVhbXMgPT0gYTIuTnVtSW5TdHJlYW1zKSAmJg0KKyAgICAoYTEuTnVtT3V0U3RyZWFtcyA9PSBhMi5OdW1PdXRTdHJlYW1zKTsNCit9DQorDQorc3RhdGljIGJvb2wgQXJlQmluZFBhaXJzRXF1YWwoY29uc3QgTkNvZGVyTWl4ZXI6OkNCaW5kUGFpciAmYTEsIGNvbnN0IE5Db2Rlck1peGVyOjpDQmluZFBhaXIgJmEyKQ0KK3sNCisgIHJldHVybiAoYTEuSW5JbmRleCA9PSBhMi5JbkluZGV4KSAmJg0KKyAgICAoYTEuT3V0SW5kZXggPT0gYTIuT3V0SW5kZXgpOw0KK30NCisNCitzdGF0aWMgYm9vbCBBcmVCaW5kSW5mb0V4RXF1YWwoY29uc3QgQ0JpbmRJbmZvRXggJmExLCBjb25zdCBDQmluZEluZm9FeCAmYTIpDQorew0KKyAgaWYgKGExLkNvZGVycy5TaXplKCkgIT0gYTIuQ29kZXJzLlNpemUoKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBhMS5Db2RlcnMuU2l6ZSgpOyBpKyspDQorICAgIGlmICghQXJlQ29kZXJzRXF1YWwoYTEuQ29kZXJzW2ldLCBhMi5Db2RlcnNbaV0pKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgIGlmIChhMS5CaW5kUGFpcnMuU2l6ZSgpICE9IGEyLkJpbmRQYWlycy5TaXplKCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIGZvciAoaSA9IDA7IGkgPCBhMS5CaW5kUGFpcnMuU2l6ZSgpOyBpKyspDQorICAgIGlmICghQXJlQmluZFBhaXJzRXF1YWwoYTEuQmluZFBhaXJzW2ldLCBhMi5CaW5kUGFpcnNbaV0pKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgIGZvciAoaSA9IDA7IGkgPCBhMS5Db2Rlck1ldGhvZElEcy5TaXplKCk7IGkrKykNCisgICAgaWYgKGExLkNvZGVyTWV0aG9kSURzW2ldICE9IGEyLkNvZGVyTWV0aG9kSURzW2ldKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgIGlmIChhMS5JblN0cmVhbXMuU2l6ZSgpICE9IGEyLkluU3RyZWFtcy5TaXplKCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIGlmIChhMS5PdXRTdHJlYW1zLlNpemUoKSAhPSBhMi5PdXRTdHJlYW1zLlNpemUoKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK0NEZWNvZGVyOjpDRGVjb2Rlcihib29sIG11bHRpVGhyZWFkKQ0KK3sNCisgICNpZm5kZWYgX1NUX01PREUNCisgIG11bHRpVGhyZWFkID0gdHJ1ZTsNCisgICNlbmRpZg0KKyAgX211bHRpVGhyZWFkID0gbXVsdGlUaHJlYWQ7DQorICBfYmluZEluZm9FeFByZXZJc0RlZmluZWQgPSBmYWxzZTsNCit9DQorDQorSFJFU1VMVCBDRGVjb2Rlcjo6RGVjb2RlKA0KKyAgICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICBJSW5TdHJlYW0gKmluU3RyZWFtLA0KKyAgICBVSW50NjQgc3RhcnRQb3MsDQorICAgIGNvbnN0IENGb2xkZXJzICZmb2xkZXJzLCBpbnQgZm9sZGVySW5kZXgsDQorICAgIElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sDQorICAgIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqY29tcHJlc3NQcm9ncmVzcw0KKyAgICBfN1pfREVDT0RFUl9DUllQUk9fVkFSU19ERUNMDQorICAgICNpZiAhZGVmaW5lZChfN1pJUF9TVCkgJiYgIWRlZmluZWQoX1NGWCkNCisgICAgLCBib29sIG10TW9kZSwgVUludDMyIG51bVRocmVhZHMNCisgICAgI2VuZGlmDQorICAgICkNCit7DQorICBjb25zdCBVSW50NjQgKnBhY2tQb3NpdGlvbnMgPSAmZm9sZGVycy5QYWNrUG9zaXRpb25zW2ZvbGRlcnMuRm9TdGFydFBhY2tTdHJlYW1JbmRleFtmb2xkZXJJbmRleF1dOw0KKyAgQ0ZvbGRlciBmb2xkZXJJbmZvOw0KKyAgZm9sZGVycy5QYXJzZUZvbGRlckluZm8oZm9sZGVySW5kZXgsIGZvbGRlckluZm8pOw0KKw0KKyAgaWYgKCFmb2xkZXJJbmZvLkNoZWNrU3RydWN0dXJlKGZvbGRlcnMuR2V0TnVtRm9sZGVyVW5wYWNrU2l6ZXMoZm9sZGVySW5kZXgpKSkNCisgICAgcmV0dXJuIEVfTk9USU1QTDsNCisgIA0KKyAgLyoNCisgIFdlIGRvbid0IG5lZWQgdG8gaW5pdCBpc0VuY3J5cHRlZCBhbmQgcGFzc3dvcmRJc0RlZmluZWQNCisgIFdlIG11c3QgdXBncmFkZSB0aGVtIG9ubHkNCisgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgaXNFbmNyeXB0ZWQgPSBmYWxzZTsNCisgIHBhc3N3b3JkSXNEZWZpbmVkID0gZmFsc2U7DQorICAjZW5kaWYNCisgICovDQorDQorICBDT2JqZWN0VmVjdG9yPCBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gPiBpblN0cmVhbXM7DQorICANCisgIENMb2NrZWRJblN0cmVhbSBsb2NrZWRJblN0cmVhbTsNCisgIGxvY2tlZEluU3RyZWFtLkluaXQoaW5TdHJlYW0pOw0KKyAgDQorICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgZm9sZGVySW5mby5QYWNrU3RyZWFtcy5TaXplKCk7IGorKykNCisgIHsNCisgICAgQ0xvY2tlZFNlcXVlbnRpYWxJblN0cmVhbUltcCAqbG9ja2VkU3RyZWFtSW1wU3BlYyA9IG5ldyBDTG9ja2VkU2VxdWVudGlhbEluU3RyZWFtSW1wOw0KKyAgICBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gbG9ja2VkU3RyZWFtSW1wID0gbG9ja2VkU3RyZWFtSW1wU3BlYzsNCisgICAgbG9ja2VkU3RyZWFtSW1wU3BlYy0+SW5pdCgmbG9ja2VkSW5TdHJlYW0sIHN0YXJ0UG9zICsgcGFja1Bvc2l0aW9uc1tqXSk7DQorICAgIENMaW1pdGVkU2VxdWVudGlhbEluU3RyZWFtICpzdHJlYW1TcGVjID0gbmV3IENMaW1pdGVkU2VxdWVudGlhbEluU3RyZWFtOw0KKyAgICBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gaW5TdHJlYW0gPSBzdHJlYW1TcGVjOw0KKyAgICBzdHJlYW1TcGVjLT5TZXRTdHJlYW0obG9ja2VkU3RyZWFtSW1wKTsNCisgICAgc3RyZWFtU3BlYy0+SW5pdChwYWNrUG9zaXRpb25zW2ogKyAxXSAtIHBhY2tQb3NpdGlvbnNbal0pOw0KKyAgICBpblN0cmVhbXMuQWRkKGluU3RyZWFtKTsNCisgIH0NCisgIA0KKyAgdW5zaWduZWQgbnVtQ29kZXJzID0gZm9sZGVySW5mby5Db2RlcnMuU2l6ZSgpOw0KKyAgDQorICBDQmluZEluZm9FeCBiaW5kSW5mbzsNCisgIENvbnZlcnRGb2xkZXJJdGVtSW5mb1RvQmluZEluZm8oZm9sZGVySW5mbywgYmluZEluZm8pOw0KKyAgYm9vbCBjcmVhdGVOZXdDb2RlcnM7DQorICBpZiAoIV9iaW5kSW5mb0V4UHJldklzRGVmaW5lZCkNCisgICAgY3JlYXRlTmV3Q29kZXJzID0gdHJ1ZTsNCisgIGVsc2UNCisgICAgY3JlYXRlTmV3Q29kZXJzID0gIUFyZUJpbmRJbmZvRXhFcXVhbChiaW5kSW5mbywgX2JpbmRJbmZvRXhQcmV2KTsNCisgIGlmIChjcmVhdGVOZXdDb2RlcnMpDQorICB7DQorICAgIHVuc2lnbmVkIGk7DQorICAgIF9kZWNvZGVycy5DbGVhcigpOw0KKyAgICAvLyBfZGVjb2RlcnMyLkNsZWFyKCk7DQorICAgIA0KKyAgICBfbWl4ZXJDb2Rlci5SZWxlYXNlKCk7DQorDQorICAgIGlmIChfbXVsdGlUaHJlYWQpDQorICAgIHsNCisgICAgICBfbWl4ZXJDb2Rlck1UU3BlYyA9IG5ldyBOQ29kZXJNaXhlcjo6Q0NvZGVyTWl4ZXIyTVQ7DQorICAgICAgX21peGVyQ29kZXIgPSBfbWl4ZXJDb2Rlck1UU3BlYzsNCisgICAgICBfbWl4ZXJDb2RlckNvbW1vbiA9IF9taXhlckNvZGVyTVRTcGVjOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICNpZmRlZiBfU1RfTU9ERQ0KKyAgICAgIF9taXhlckNvZGVyU1RTcGVjID0gbmV3IE5Db2Rlck1peGVyOjpDQ29kZXJNaXhlcjJTVDsNCisgICAgICBfbWl4ZXJDb2RlciA9IF9taXhlckNvZGVyU1RTcGVjOw0KKyAgICAgIF9taXhlckNvZGVyQ29tbW9uID0gX21peGVyQ29kZXJTVFNwZWM7DQorICAgICAgI2VuZGlmDQorICAgIH0NCisgICAgUklOT0soX21peGVyQ29kZXJDb21tb24tPlNldEJpbmRJbmZvKGJpbmRJbmZvKSk7DQorICAgIA0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29kZXJzOyBpKyspDQorICAgIHsNCisgICAgICBjb25zdCBDQ29kZXJJbmZvICZjb2RlckluZm8gPSBmb2xkZXJJbmZvLkNvZGVyc1tpXTsNCisNCisgIA0KKyAgICAgIENNeUNvbVB0cjxJQ29tcHJlc3NDb2Rlcj4gZGVjb2RlcjsNCisgICAgICBDTXlDb21QdHI8SUNvbXByZXNzQ29kZXIyPiBkZWNvZGVyMjsNCisgICAgICBSSU5PSyhDcmVhdGVDb2RlcigNCisgICAgICAgICAgRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgICAgICAgIGNvZGVySW5mby5NZXRob2RJRCwgZGVjb2RlciwgZGVjb2RlcjIsIGZhbHNlKSk7DQorICAgICAgQ015Q29tUHRyPElVbmtub3duPiBkZWNvZGVyVW5rbm93bjsNCisgICAgICBpZiAoY29kZXJJbmZvLklzU2ltcGxlQ29kZXIoKSkNCisgICAgICB7DQorICAgICAgICBpZiAoZGVjb2RlciA9PSAwKQ0KKyAgICAgICAgICByZXR1cm4gRV9OT1RJTVBMOw0KKw0KKyAgICAgICAgZGVjb2RlclVua25vd24gPSAoSVVua25vd24gKilkZWNvZGVyOw0KKyAgICAgICAgDQorICAgICAgICBpZiAoX211bHRpVGhyZWFkKQ0KKyAgICAgICAgICBfbWl4ZXJDb2Rlck1UU3BlYy0+QWRkQ29kZXIoZGVjb2Rlcik7DQorICAgICAgICAjaWZkZWYgX1NUX01PREUNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgX21peGVyQ29kZXJTVFNwZWMtPkFkZENvZGVyKGRlY29kZXIsIGZhbHNlKTsNCisgICAgICAgICNlbmRpZg0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgaWYgKGRlY29kZXIyID09IDApDQorICAgICAgICAgIHJldHVybiBFX05PVElNUEw7DQorICAgICAgICBkZWNvZGVyVW5rbm93biA9IChJVW5rbm93biAqKWRlY29kZXIyOw0KKyAgICAgICAgaWYgKF9tdWx0aVRocmVhZCkNCisgICAgICAgICAgX21peGVyQ29kZXJNVFNwZWMtPkFkZENvZGVyMihkZWNvZGVyMik7DQorICAgICAgICAjaWZkZWYgX1NUX01PREUNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgX21peGVyQ29kZXJTVFNwZWMtPkFkZENvZGVyMihkZWNvZGVyMiwgZmFsc2UpOw0KKyAgICAgICAgI2VuZGlmDQorICAgICAgfQ0KKyAgICAgIF9kZWNvZGVycy5BZGQoZGVjb2RlclVua25vd24pOw0KKyAgICAgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisgICAgICBDTXlDb21QdHI8SVNldENvbXByZXNzQ29kZWNzSW5mbz4gc2V0Q29tcHJlc3NDb2RlY3NJbmZvOw0KKyAgICAgIGRlY29kZXJVbmtub3duLlF1ZXJ5SW50ZXJmYWNlKElJRF9JU2V0Q29tcHJlc3NDb2RlY3NJbmZvLCAodm9pZCAqKikmc2V0Q29tcHJlc3NDb2RlY3NJbmZvKTsNCisgICAgICBpZiAoc2V0Q29tcHJlc3NDb2RlY3NJbmZvKQ0KKyAgICAgIHsNCisgICAgICAgIFJJTk9LKHNldENvbXByZXNzQ29kZWNzSW5mby0+U2V0Q29tcHJlc3NDb2RlY3NJbmZvKF9fZXh0ZXJuYWxDb2RlY3MtPkdldENvZGVjcykpOw0KKyAgICAgIH0NCisgICAgICAjZW5kaWYNCisgICAgfQ0KKyAgICBfYmluZEluZm9FeFByZXYgPSBiaW5kSW5mbzsNCisgICAgX2JpbmRJbmZvRXhQcmV2SXNEZWZpbmVkID0gdHJ1ZTsNCisgIH0NCisgIHVuc2lnbmVkIGk7DQorICBfbWl4ZXJDb2RlckNvbW1vbi0+UmVJbml0KCk7DQorICANCisgIFVJbnQzMiBwYWNrU3RyZWFtSW5kZXggPSAwOw0KKyAgVUludDMyIHVucGFja1N0cmVhbUluZGV4U3RhcnQgPSBmb2xkZXJzLkZvVG9Db2RlclVucGFja1NpemVzW2ZvbGRlckluZGV4XTsNCisgIFVJbnQzMiB1bnBhY2tTdHJlYW1JbmRleCA9IHVucGFja1N0cmVhbUluZGV4U3RhcnQ7DQorICBVSW50MzIgY29kZXJJbmRleCA9IDA7DQorICAvLyBVSW50MzIgY29kZXIySW5kZXggPSAwOw0KKyAgDQorICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29kZXJzOyBpKyspDQorICB7DQorICAgIGNvbnN0IENDb2RlckluZm8gJmNvZGVySW5mbyA9IGZvbGRlckluZm8uQ29kZXJzW2ldOw0KKyAgICBDTXlDb21QdHI8SVVua25vd24+ICZkZWNvZGVyID0gX2RlY29kZXJzW2NvZGVySW5kZXhdOw0KKyAgICANCisgICAgew0KKyAgICAgIENNeUNvbVB0cjxJQ29tcHJlc3NTZXREZWNvZGVyUHJvcGVydGllczI+IHNldERlY29kZXJQcm9wZXJ0aWVzOw0KKyAgICAgIGRlY29kZXIuUXVlcnlJbnRlcmZhY2UoSUlEX0lDb21wcmVzc1NldERlY29kZXJQcm9wZXJ0aWVzMiwgJnNldERlY29kZXJQcm9wZXJ0aWVzKTsNCisgICAgICBpZiAoc2V0RGVjb2RlclByb3BlcnRpZXMpDQorICAgICAgew0KKyAgICAgICAgY29uc3QgQ0J5dGVCdWZmZXIgJnByb3BzID0gY29kZXJJbmZvLlByb3BzOw0KKyAgICAgICAgc2l6ZV90IHNpemUgPSBwcm9wcy5TaXplKCk7DQorICAgICAgICBpZiAoc2l6ZSA+IDB4RkZGRkZGRkYpDQorICAgICAgICAgIHJldHVybiBFX05PVElNUEw7DQorICAgICAgICAvLyBpZiAoc2l6ZSA+IDApDQorICAgICAgICB7DQorICAgICAgICAgIFJJTk9LKHNldERlY29kZXJQcm9wZXJ0aWVzLT5TZXREZWNvZGVyUHJvcGVydGllczIoKGNvbnN0IEJ5dGUgKilwcm9wcywgKFVJbnQzMilzaXplKSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgICNpZiAhZGVmaW5lZChfN1pJUF9TVCkgJiYgIWRlZmluZWQoX1NGWCkNCisgICAgaWYgKG10TW9kZSkNCisgICAgew0KKyAgICAgIENNeUNvbVB0cjxJQ29tcHJlc3NTZXRDb2Rlck10PiBzZXRDb2Rlck10Ow0KKyAgICAgIGRlY29kZXIuUXVlcnlJbnRlcmZhY2UoSUlEX0lDb21wcmVzc1NldENvZGVyTXQsICZzZXRDb2Rlck10KTsNCisgICAgICBpZiAoc2V0Q29kZXJNdCkNCisgICAgICB7DQorICAgICAgICBSSU5PSyhzZXRDb2Rlck10LT5TZXROdW1iZXJPZlRocmVhZHMobnVtVGhyZWFkcykpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICAjZW5kaWYNCisNCisgICAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICAgIHsNCisgICAgICBDTXlDb21QdHI8SUNyeXB0b1NldFBhc3N3b3JkPiBjcnlwdG9TZXRQYXNzd29yZDsNCisgICAgICBkZWNvZGVyLlF1ZXJ5SW50ZXJmYWNlKElJRF9JQ3J5cHRvU2V0UGFzc3dvcmQsICZjcnlwdG9TZXRQYXNzd29yZCk7DQorICAgICAgaWYgKGNyeXB0b1NldFBhc3N3b3JkKQ0KKyAgICAgIHsNCisgICAgICAgIGlzRW5jcnlwdGVkID0gdHJ1ZTsNCisgICAgICAgIGlmICghZ2V0VGV4dFBhc3N3b3JkKQ0KKyAgICAgICAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgICAgICAgQ015Q29tQlNUUiBwYXNzd29yZEJTVFI7DQorICAgICAgICBSSU5PSyhnZXRUZXh0UGFzc3dvcmQtPkNyeXB0b0dldFRleHRQYXNzd29yZCgmcGFzc3dvcmRCU1RSKSk7DQorICAgICAgICBwYXNzd29yZElzRGVmaW5lZCA9IHRydWU7DQorICAgICAgICBzaXplX3QgbGVuID0gMDsNCisgICAgICAgIGlmIChwYXNzd29yZEJTVFIpDQorICAgICAgICAgIGxlbiA9IE15U3RyaW5nTGVuKChCU1RSKXBhc3N3b3JkQlNUUik7DQorICAgICAgICBDQnl0ZUJ1ZmZlciBidWZmZXIobGVuICogMik7DQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKQ0KKyAgICAgICAgew0KKyAgICAgICAgICB3Y2hhcl90IGMgPSBwYXNzd29yZEJTVFJbaV07DQorICAgICAgICAgICgoQnl0ZSAqKWJ1ZmZlcilbaSAqIDJdID0gKEJ5dGUpYzsNCisgICAgICAgICAgKChCeXRlICopYnVmZmVyKVtpICogMiArIDFdID0gKEJ5dGUpKGMgPj4gOCk7DQorICAgICAgICB9DQorICAgICAgICBSSU5PSyhjcnlwdG9TZXRQYXNzd29yZC0+Q3J5cHRvU2V0UGFzc3dvcmQoKGNvbnN0IEJ5dGUgKilidWZmZXIsIChVSW50MzIpYnVmZmVyLlNpemUoKSkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICAjZW5kaWYNCisNCisgICAgY29kZXJJbmRleCsrOw0KKyAgICANCisgICAgVUludDMyIG51bUluU3RyZWFtcyA9IChVSW50MzIpY29kZXJJbmZvLk51bUluU3RyZWFtczsNCisgICAgVUludDMyIG51bU91dFN0cmVhbXMgPSAoVUludDMyKWNvZGVySW5mby5OdW1PdXRTdHJlYW1zOw0KKyAgICBDT2JqQXJyYXk8VUludDY0PiBwYWNrU2l6ZXMobnVtSW5TdHJlYW1zKTsNCisgICAgQ09iakFycmF5PGNvbnN0IFVJbnQ2NCAqPiBwYWNrU2l6ZXNQb2ludGVycyhudW1JblN0cmVhbXMpOw0KKyAgICBDT2JqQXJyYXk8Y29uc3QgVUludDY0ICo+IHVucGFja1NpemVzUG9pbnRlcnMobnVtT3V0U3RyZWFtcyk7DQorICAgIFVJbnQzMiBqOw0KKw0KKyAgICBmb3IgKGogPSAwOyBqIDwgbnVtT3V0U3RyZWFtczsgaisrLCB1bnBhY2tTdHJlYW1JbmRleCsrKQ0KKyAgICAgIHVucGFja1NpemVzUG9pbnRlcnNbal0gPSAmZm9sZGVycy5Db2RlclVucGFja1NpemVzW3VucGFja1N0cmVhbUluZGV4XTsNCisgICAgDQorICAgIGZvciAoaiA9IDA7IGogPCBudW1JblN0cmVhbXM7IGorKywgcGFja1N0cmVhbUluZGV4KyspDQorICAgIHsNCisgICAgICBpbnQgYmluZFBhaXJJbmRleCA9IGZvbGRlckluZm8uRmluZEJpbmRQYWlyRm9ySW5TdHJlYW0ocGFja1N0cmVhbUluZGV4KTsNCisgICAgICBpZiAoYmluZFBhaXJJbmRleCA+PSAwKQ0KKyAgICAgICAgcGFja1NpemVzUG9pbnRlcnNbal0gPSAmZm9sZGVycy5Db2RlclVucGFja1NpemVzW3VucGFja1N0cmVhbUluZGV4U3RhcnQgKyAoVUludDMyKWZvbGRlckluZm8uQmluZFBhaXJzW2JpbmRQYWlySW5kZXhdLk91dEluZGV4XTsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgaW50IGluZGV4ID0gZm9sZGVySW5mby5GaW5kUGFja1N0cmVhbUFycmF5SW5kZXgocGFja1N0cmVhbUluZGV4KTsNCisgICAgICAgIGlmIChpbmRleCA8IDApDQorICAgICAgICAgIHJldHVybiBTX0ZBTFNFOyAvLyBjaGVjayBpdA0KKyAgICAgICAgcGFja1NpemVzW2pdID0gcGFja1Bvc2l0aW9uc1tpbmRleCArIDFdIC0gcGFja1Bvc2l0aW9uc1tpbmRleF07DQorICAgICAgICBwYWNrU2l6ZXNQb2ludGVyc1tqXSA9ICZwYWNrU2l6ZXNbal07DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBfbWl4ZXJDb2RlckNvbW1vbi0+U2V0Q29kZXJJbmZvKGksIHBhY2tTaXplc1BvaW50ZXJzLCB1bnBhY2tTaXplc1BvaW50ZXJzKTsNCisgIH0NCisgIFVJbnQzMiBtYWluQ29kZXIsIHRlbXA7DQorICBiaW5kSW5mby5GaW5kT3V0U3RyZWFtKGJpbmRJbmZvLk91dFN0cmVhbXNbMF0sIG1haW5Db2RlciwgdGVtcCk7DQorDQorICBpZiAoX211bHRpVGhyZWFkKQ0KKyAgICBfbWl4ZXJDb2Rlck1UU3BlYy0+U2V0UHJvZ3Jlc3NDb2RlckluZGV4KG1haW5Db2Rlcik7DQorICAvKg0KKyAgZWxzZQ0KKyAgICBfbWl4ZXJDb2RlclNUU3BlYy0+U2V0UHJvZ3Jlc3NDb2RlckluZGV4KG1haW5Db2Rlcik7Ow0KKyAgKi8NCisgIA0KKyAgaWYgKG51bUNvZGVycyA9PSAwKQ0KKyAgICByZXR1cm4gMDsNCisgIHVuc2lnbmVkIG51bSA9IGluU3RyZWFtcy5TaXplKCk7DQorICBDT2JqQXJyYXk8SVNlcXVlbnRpYWxJblN0cmVhbSAqPiBpblN0cmVhbVBvaW50ZXJzKG51bSk7DQorICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspDQorICAgIGluU3RyZWFtUG9pbnRlcnNbaV0gPSBpblN0cmVhbXNbaV07DQorICBJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtUG9pbnRlciA9IG91dFN0cmVhbTsNCisgIHJldHVybiBfbWl4ZXJDb2Rlci0+Q29kZSgNCisgICAgICBpblN0cmVhbVBvaW50ZXJzLCBOVUxMLCBudW0sDQorICAgICAgJm91dFN0cmVhbVBvaW50ZXIsIE5VTEwsIDEsDQorICAgICAgY29tcHJlc3NQcm9ncmVzcyk7DQorfQ0KKw0KK319DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6RGVjb2RlLmggYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pEZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjcxNzBkCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6RGVjb2RlLmgKQEAgLTAsMCArMSw2NSBAQAorLy8gN3pEZWNvZGUuaA0KKw0KKyNpZm5kZWYgX183Wl9ERUNPREVfSA0KKyNkZWZpbmUgX183Wl9ERUNPREVfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9JU3RyZWFtLmgiDQorI2luY2x1ZGUgIi4uLy4uL0lQYXNzd29yZC5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vQ29kZXJNaXhlcjIuaCINCisjaW5jbHVkZSAiLi4vQ29tbW9uL0NvZGVyTWl4ZXIyTVQuaCINCisjaWZkZWYgX1NUX01PREUNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0NvZGVyTWl4ZXIyU1QuaCINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0NyZWF0ZUNvZGVyLmgiDQorDQorI2luY2x1ZGUgIjd6SW4uaCINCisNCituYW1lc3BhY2UgTkFyY2hpdmUgew0KK25hbWVzcGFjZSBON3ogew0KKw0KK3N0cnVjdCBDQmluZEluZm9FeDogcHVibGljIE5Db2Rlck1peGVyOjpDQmluZEluZm8NCit7DQorICBDUmVjb3JkVmVjdG9yPENNZXRob2RJZD4gQ29kZXJNZXRob2RJRHM7DQorICB2b2lkIENsZWFyKCkNCisgIHsNCisgICAgQ0JpbmRJbmZvOjpDbGVhcigpOw0KKyAgICBDb2Rlck1ldGhvZElEcy5DbGVhcigpOw0KKyAgfQ0KK307DQorDQorY2xhc3MgQ0RlY29kZXINCit7DQorICBib29sIF9iaW5kSW5mb0V4UHJldklzRGVmaW5lZDsNCisgIENCaW5kSW5mb0V4IF9iaW5kSW5mb0V4UHJldjsNCisgIA0KKyAgYm9vbCBfbXVsdGlUaHJlYWQ7DQorICAjaWZkZWYgX1NUX01PREUNCisgIE5Db2Rlck1peGVyOjpDQ29kZXJNaXhlcjJTVCAqX21peGVyQ29kZXJTVFNwZWM7DQorICAjZW5kaWYNCisgIE5Db2Rlck1peGVyOjpDQ29kZXJNaXhlcjJNVCAqX21peGVyQ29kZXJNVFNwZWM7DQorICBOQ29kZXJNaXhlcjo6Q0NvZGVyTWl4ZXIyICpfbWl4ZXJDb2RlckNvbW1vbjsNCisgIA0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyMj4gX21peGVyQ29kZXI7DQorICBDT2JqZWN0VmVjdG9yPENNeUNvbVB0cjxJVW5rbm93bj4gPiBfZGVjb2RlcnM7DQorICAvLyBDT2JqZWN0VmVjdG9yPENNeUNvbVB0cjxJQ29tcHJlc3NDb2RlcjI+ID4gX2RlY29kZXJzMjsNCitwdWJsaWM6DQorICBDRGVjb2Rlcihib29sIG11bHRpVGhyZWFkKTsNCisgIEhSRVNVTFQgRGVjb2RlKA0KKyAgICAgIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgICAgSUluU3RyZWFtICppblN0cmVhbSwNCisgICAgICBVSW50NjQgc3RhcnRQb3MsDQorICAgICAgY29uc3QgQ0ZvbGRlcnMgJmZvbGRlcnMsIGludCBmb2xkZXJJbmRleCwNCisgICAgICBJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtLA0KKyAgICAgIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqY29tcHJlc3NQcm9ncmVzcw0KKyAgICAgIF83Wl9ERUNPREVSX0NSWVBST19WQVJTX0RFQ0wNCisgICAgICAjaWYgIWRlZmluZWQoXzdaSVBfU1QpICYmICFkZWZpbmVkKF9TRlgpDQorICAgICAgLCBib29sIG10TW9kZSwgVUludDMyIG51bVRocmVhZHMNCisgICAgICAjZW5kaWYNCisgICAgICApOw0KK307DQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pFbmNvZGUuY3BwIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6RW5jb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjU0ODljCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6RW5jb2RlLmNwcApAQCAtMCwwICsxLDQ2NCBAQAorLy8gN3pFbmNvZGUuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vQ3JlYXRlQ29kZXIuaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0ZpbHRlckNvZGVyLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9MaW1pdGVkU3RyZWFtcy5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vSW5PdXRUZW1wQnVmZmVyLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9Qcm9ncmVzc1V0aWxzLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9TdHJlYW1PYmplY3RzLmgiDQorDQorI2luY2x1ZGUgIjd6RW5jb2RlLmgiDQorI2luY2x1ZGUgIjd6U3BlY1N0cmVhbS5oIg0KKw0KK3N0YXRpYyBjb25zdCBVSW50NjQga19EZWx0YSA9IDB4MDM7DQorc3RhdGljIGNvbnN0IFVJbnQ2NCBrX0JDSiA9IDB4MDMwMzAxMDM7DQorc3RhdGljIGNvbnN0IFVJbnQ2NCBrX0JDSjIgPSAweDAzMDMwMTFCOw0KKw0KK25hbWVzcGFjZSBOQXJjaGl2ZSB7DQorbmFtZXNwYWNlIE43eiB7DQorDQorc3RhdGljIHZvaWQgQ29udmVydEJpbmRJbmZvVG9Gb2xkZXJJdGVtSW5mbyhjb25zdCBOQ29kZXJNaXhlcjo6Q0JpbmRJbmZvICZiaW5kSW5mbywNCisgICAgY29uc3QgQ1JlY29yZFZlY3RvcjxDTWV0aG9kSWQ+IGRlY29tcHJlc3Npb25NZXRob2RzLA0KKyAgICBDRm9sZGVyICZmb2xkZXIpDQorew0KKyAgLy8gYmluZEluZm8uQ29kZXJNZXRob2RJRHMuQ2xlYXIoKTsNCisgIC8vIGZvbGRlci5PdXRTdHJlYW1zLkNsZWFyKCk7DQorICBmb2xkZXIuQmluZFBhaXJzLlNldFNpemUoYmluZEluZm8uQmluZFBhaXJzLlNpemUoKSk7DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IGJpbmRJbmZvLkJpbmRQYWlycy5TaXplKCk7IGkrKykNCisgIHsNCisgICAgQ0JpbmRQYWlyICZicCA9IGZvbGRlci5CaW5kUGFpcnNbaV07DQorICAgIGNvbnN0IE5Db2Rlck1peGVyOjpDQmluZFBhaXIgJm1peGVyQnAgPSBiaW5kSW5mby5CaW5kUGFpcnNbaV07DQorICAgIGJwLkluSW5kZXggPSBtaXhlckJwLkluSW5kZXg7DQorICAgIGJwLk91dEluZGV4ID0gbWl4ZXJCcC5PdXRJbmRleDsNCisgIH0NCisgIGZvbGRlci5Db2RlcnMuU2V0U2l6ZShiaW5kSW5mby5Db2RlcnMuU2l6ZSgpKTsNCisgIGZvciAoaSA9IDA7IGkgPCBiaW5kSW5mby5Db2RlcnMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIENDb2RlckluZm8gJmNvZGVySW5mbyA9IGZvbGRlci5Db2RlcnNbaV07DQorICAgIGNvbnN0IE5Db2Rlck1peGVyOjpDQ29kZXJTdHJlYW1zSW5mbyAmY29kZXJTdHJlYW1zSW5mbyA9IGJpbmRJbmZvLkNvZGVyc1tpXTsNCisgICAgY29kZXJJbmZvLk51bUluU3RyZWFtcyA9IGNvZGVyU3RyZWFtc0luZm8uTnVtSW5TdHJlYW1zOw0KKyAgICBjb2RlckluZm8uTnVtT3V0U3RyZWFtcyA9IGNvZGVyU3RyZWFtc0luZm8uTnVtT3V0U3RyZWFtczsNCisgICAgY29kZXJJbmZvLk1ldGhvZElEID0gZGVjb21wcmVzc2lvbk1ldGhvZHNbaV07DQorICAgIC8vIGNvZGVySW5mby5Qcm9wcyBjYW4gYmUgbm9uRnJlZTsNCisgIH0NCisgIGZvbGRlci5QYWNrU3RyZWFtcy5TZXRTaXplKGJpbmRJbmZvLkluU3RyZWFtcy5TaXplKCkpOw0KKyAgZm9yIChpID0gMDsgaSA8IGJpbmRJbmZvLkluU3RyZWFtcy5TaXplKCk7IGkrKykNCisgICAgZm9sZGVyLlBhY2tTdHJlYW1zW2ldID0gYmluZEluZm8uSW5TdHJlYW1zW2ldOw0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBTZXRDb2RlclByb3BzMihjb25zdCBDUHJvcHMgJnByb3BzLCBjb25zdCBVSW50NjQgKmRhdGFTaXplUmVkdWNlLCBJVW5rbm93biAqY29kZXIpDQorew0KKyAgQ015Q29tUHRyPElDb21wcmVzc1NldENvZGVyUHJvcGVydGllcz4gc2V0Q29kZXJQcm9wZXJ0aWVzOw0KKyAgY29kZXItPlF1ZXJ5SW50ZXJmYWNlKElJRF9JQ29tcHJlc3NTZXRDb2RlclByb3BlcnRpZXMsICh2b2lkICoqKSZzZXRDb2RlclByb3BlcnRpZXMpOw0KKyAgaWYgKHNldENvZGVyUHJvcGVydGllcykNCisgICAgcmV0dXJuIHByb3BzLlNldENvZGVyUHJvcHMoc2V0Q29kZXJQcm9wZXJ0aWVzLCBkYXRhU2l6ZVJlZHVjZSk7DQorICByZXR1cm4gcHJvcHMuQXJlVGhlcmVOb25PcHRpb25hbFByb3BzKCkgPyBFX0lOVkFMSURBUkcgOiBTX09LOw0KK30NCisNCitIUkVTVUxUIENFbmNvZGVyOjpDcmVhdGVNaXhlckNvZGVyKA0KKyAgICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICBjb25zdCBVSW50NjQgKmluU2l6ZUZvclJlZHVjZSkNCit7DQorICBfbWl4ZXJDb2RlclNwZWMgPSBuZXcgTkNvZGVyTWl4ZXI6OkNDb2Rlck1peGVyMk1UOw0KKyAgX21peGVyQ29kZXIgPSBfbWl4ZXJDb2RlclNwZWM7DQorICBSSU5PSyhfbWl4ZXJDb2RlclNwZWMtPlNldEJpbmRJbmZvKF9iaW5kSW5mbykpOw0KKyAgRk9SX1ZFQ1RPUiAoaSwgX29wdGlvbnMuTWV0aG9kcykNCisgIHsNCisgICAgY29uc3QgQ01ldGhvZEZ1bGwgJm1ldGhvZEZ1bGwgPSBfb3B0aW9ucy5NZXRob2RzW2ldOw0KKyAgICBDQ29kZXJJbmZvICZlbmNvZGluZ0luZm8gPSBfY29kZXJzSW5mby5BZGROZXcoKTsNCisgICAgZW5jb2RpbmdJbmZvLk1ldGhvZElEID0gbWV0aG9kRnVsbC5JZDsNCisgICAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyPiBlbmNvZGVyOw0KKyAgICBDTXlDb21QdHI8SUNvbXByZXNzQ29kZXIyPiBlbmNvZGVyMjsNCisgICAgDQorDQorICAgIFJJTk9LKENyZWF0ZUNvZGVyKA0KKyAgICAgICAgRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgICAgICBtZXRob2RGdWxsLklkLCBlbmNvZGVyLCBlbmNvZGVyMiwgdHJ1ZSkpOw0KKw0KKyAgICBpZiAoIWVuY29kZXIgJiYgIWVuY29kZXIyKQ0KKyAgICAgIHJldHVybiBFX0ZBSUw7DQorDQorICAgIENNeUNvbVB0cjxJVW5rbm93bj4gZW5jb2RlckNvbW1vbiA9IGVuY29kZXIgPyAoSVVua25vd24gKillbmNvZGVyIDogKElVbmtub3duICopZW5jb2RlcjI7DQorICAgDQorICAgICNpZm5kZWYgXzdaSVBfU1QNCisgICAgew0KKyAgICAgIENNeUNvbVB0cjxJQ29tcHJlc3NTZXRDb2Rlck10PiBzZXRDb2Rlck10Ow0KKyAgICAgIGVuY29kZXJDb21tb24uUXVlcnlJbnRlcmZhY2UoSUlEX0lDb21wcmVzc1NldENvZGVyTXQsICZzZXRDb2Rlck10KTsNCisgICAgICBpZiAoc2V0Q29kZXJNdCkNCisgICAgICB7DQorICAgICAgICBSSU5PSyhzZXRDb2Rlck10LT5TZXROdW1iZXJPZlRocmVhZHMoX29wdGlvbnMuTnVtVGhyZWFkcykpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICAjZW5kaWYNCisgICAgICAgIA0KKyAgICBSSU5PSyhTZXRDb2RlclByb3BzMihtZXRob2RGdWxsLCBpblNpemVGb3JSZWR1Y2UsIGVuY29kZXJDb21tb24pKTsNCisNCisgICAgLyoNCisgICAgQ015Q29tUHRyPElDcnlwdG9SZXNldFNhbHQ+IHJlc2V0U2FsdDsNCisgICAgZW5jb2RlckNvbW1vbi5RdWVyeUludGVyZmFjZShJSURfSUNyeXB0b1Jlc2V0U2FsdCwgKHZvaWQgKiopJnJlc2V0U2FsdCk7DQorICAgIGlmIChyZXNldFNhbHQpDQorICAgIHsNCisgICAgICByZXNldFNhbHQtPlJlc2V0U2FsdCgpOw0KKyAgICB9DQorICAgICovDQorDQorICAgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisgICAgQ015Q29tUHRyPElTZXRDb21wcmVzc0NvZGVjc0luZm8+IHNldENvbXByZXNzQ29kZWNzSW5mbzsNCisgICAgZW5jb2RlckNvbW1vbi5RdWVyeUludGVyZmFjZShJSURfSVNldENvbXByZXNzQ29kZWNzSW5mbywgKHZvaWQgKiopJnNldENvbXByZXNzQ29kZWNzSW5mbyk7DQorICAgIGlmIChzZXRDb21wcmVzc0NvZGVjc0luZm8pDQorICAgIHsNCisgICAgICBSSU5PSyhzZXRDb21wcmVzc0NvZGVjc0luZm8tPlNldENvbXByZXNzQ29kZWNzSW5mbyhfX2V4dGVybmFsQ29kZWNzLT5HZXRDb2RlY3MpKTsNCisgICAgfQ0KKyAgICAjZW5kaWYNCisgICAgDQorICAgIENNeUNvbVB0cjxJQ3J5cHRvU2V0UGFzc3dvcmQ+IGNyeXB0b1NldFBhc3N3b3JkOw0KKyAgICBlbmNvZGVyQ29tbW9uLlF1ZXJ5SW50ZXJmYWNlKElJRF9JQ3J5cHRvU2V0UGFzc3dvcmQsICZjcnlwdG9TZXRQYXNzd29yZCk7DQorDQorICAgIGlmIChjcnlwdG9TZXRQYXNzd29yZCkNCisgICAgew0KKyAgICAgIGNvbnN0IFVJbnQzMiBzaXplSW5CeXRlcyA9IF9vcHRpb25zLlBhc3N3b3JkLkxlbigpICogMjsNCisgICAgICBDQnl0ZUJ1ZmZlciBidWZmZXIoc2l6ZUluQnl0ZXMpOw0KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBfb3B0aW9ucy5QYXNzd29yZC5MZW4oKTsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgIHdjaGFyX3QgYyA9IF9vcHRpb25zLlBhc3N3b3JkW2ldOw0KKyAgICAgICAgKChCeXRlICopYnVmZmVyKVtpICogMl0gPSAoQnl0ZSljOw0KKyAgICAgICAgKChCeXRlICopYnVmZmVyKVtpICogMiArIDFdID0gKEJ5dGUpKGMgPj4gOCk7DQorICAgICAgfQ0KKyAgICAgIFJJTk9LKGNyeXB0b1NldFBhc3N3b3JkLT5DcnlwdG9TZXRQYXNzd29yZCgoY29uc3QgQnl0ZSAqKWJ1ZmZlciwgc2l6ZUluQnl0ZXMpKTsNCisgICAgfQ0KKw0KKyAgICBpZiAoZW5jb2RlcikNCisgICAgICBfbWl4ZXJDb2RlclNwZWMtPkFkZENvZGVyKGVuY29kZXIpOw0KKyAgICBlbHNlDQorICAgICAgX21peGVyQ29kZXJTcGVjLT5BZGRDb2RlcjIoZW5jb2RlcjIpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ0VuY29kZXI6OkVuY29kZSgNCisgICAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0sDQorICAgIGNvbnN0IFVJbnQ2NCAqaW5TdHJlYW1TaXplLCBjb25zdCBVSW50NjQgKmluU2l6ZUZvclJlZHVjZSwNCisgICAgQ0ZvbGRlciAmZm9sZGVySXRlbSwNCisgICAgQ1JlY29yZFZlY3RvcjxVSW50NjQ+ICZjb2RlclVucGFja1NpemVzLA0KKyAgICBVSW50NjQgJnVucGFja1NpemUsDQorICAgIElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sDQorICAgIENSZWNvcmRWZWN0b3I8VUludDY0PiAmcGFja1NpemVzLA0KKyAgICBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKmNvbXByZXNzUHJvZ3Jlc3MpDQorew0KKyAgUklOT0soRW5jb2RlckNvbnN0cigpKTsNCisNCisgIGlmICghX21peGVyQ29kZXJTcGVjKQ0KKyAgew0KKyAgICBSSU5PSyhDcmVhdGVNaXhlckNvZGVyKEVYVEVSTkFMX0NPREVDU19MT0NfVkFSUyBpblNpemVGb3JSZWR1Y2UpKTsNCisgIH0NCisgIF9taXhlckNvZGVyU3BlYy0+UmVJbml0KCk7DQorICAvLyBfbWl4ZXJDb2RlclNwZWMtPlNldENvZGVySW5mbygwLCBOVUxMLCBOVUxMLCBwcm9ncmVzcyk7DQorDQorICBDT2JqZWN0VmVjdG9yPENJbk91dFRlbXBCdWZmZXI+IGluT3V0VGVtcEJ1ZmZlcnM7DQorICBDT2JqZWN0VmVjdG9yPENTZXF1ZW50aWFsT3V0VGVtcEJ1ZmZlckltcCAqPiB0ZW1wQnVmZmVyU3BlY3M7DQorICBDT2JqZWN0VmVjdG9yPENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gPiB0ZW1wQnVmZmVyczsNCisgIHVuc2lnbmVkIG51bU1ldGhvZHMgPSBfYmluZEluZm8uQ29kZXJzLlNpemUoKTsNCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSAxOyBpIDwgX2JpbmRJbmZvLk91dFN0cmVhbXMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIENJbk91dFRlbXBCdWZmZXIgJmlvdGIgPSBpbk91dFRlbXBCdWZmZXJzLkFkZE5ldygpOw0KKyAgICBpb3RiLkNyZWF0ZSgpOw0KKyAgICBpb3RiLkluaXRXcml0aW5nKCk7DQorICB9DQorICBmb3IgKGkgPSAxOyBpIDwgX2JpbmRJbmZvLk91dFN0cmVhbXMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIENTZXF1ZW50aWFsT3V0VGVtcEJ1ZmZlckltcCAqdGVtcEJ1ZmZlclNwZWMgPSBuZXcgQ1NlcXVlbnRpYWxPdXRUZW1wQnVmZmVySW1wOw0KKyAgICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IHRlbXBCdWZmZXIgPSB0ZW1wQnVmZmVyU3BlYzsNCisgICAgdGVtcEJ1ZmZlclNwZWMtPkluaXQoJmluT3V0VGVtcEJ1ZmZlcnNbaSAtIDFdKTsNCisgICAgdGVtcEJ1ZmZlcnMuQWRkKHRlbXBCdWZmZXIpOw0KKyAgICB0ZW1wQnVmZmVyU3BlY3MuQWRkKHRlbXBCdWZmZXJTcGVjKTsNCisgIH0NCisNCisgIGZvciAoaSA9IDA7IGkgPCBudW1NZXRob2RzOyBpKyspDQorICAgIF9taXhlckNvZGVyU3BlYy0+U2V0Q29kZXJJbmZvKGksIE5VTEwsIE5VTEwpOw0KKw0KKyAgaWYgKF9iaW5kSW5mby5JblN0cmVhbXMuSXNFbXB0eSgpKQ0KKyAgICByZXR1cm4gRV9GQUlMOw0KKyAgVUludDMyIG1haW5Db2RlckluZGV4LCBtYWluU3RyZWFtSW5kZXg7DQorICBfYmluZEluZm8uRmluZEluU3RyZWFtKF9iaW5kSW5mby5JblN0cmVhbXNbMF0sIG1haW5Db2RlckluZGV4LCBtYWluU3RyZWFtSW5kZXgpOw0KKyAgDQorICBpZiAoaW5TdHJlYW1TaXplKQ0KKyAgew0KKyAgICBDUmVjb3JkVmVjdG9yPGNvbnN0IFVJbnQ2NCAqPiBzaXplUG9pbnRlcnM7DQorICAgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgX2JpbmRJbmZvLkNvZGVyc1ttYWluQ29kZXJJbmRleF0uTnVtSW5TdHJlYW1zOyBpKyspDQorICAgICAgaWYgKGkgPT0gbWFpblN0cmVhbUluZGV4KQ0KKyAgICAgICAgc2l6ZVBvaW50ZXJzLkFkZChpblN0cmVhbVNpemUpOw0KKyAgICAgIGVsc2UNCisgICAgICAgIHNpemVQb2ludGVycy5BZGQoTlVMTCk7DQorICAgIF9taXhlckNvZGVyU3BlYy0+U2V0Q29kZXJJbmZvKG1haW5Db2RlckluZGV4LCAmc2l6ZVBvaW50ZXJzLkZyb250KCksIE5VTEwpOw0KKyAgfQ0KKw0KKyAgDQorICAvLyBVSW50NjQgb3V0U3RyZWFtU3RhcnRQb3M7DQorICAvLyBSSU5PSyhzdHJlYW0tPlNlZWsoMCwgU1RSRUFNX1NFRUtfQ1VSLCAmb3V0U3RyZWFtU3RhcnRQb3MpKTsNCisgIA0KKyAgQ1NlcXVlbnRpYWxJblN0cmVhbVNpemVDb3VudDIgKmluU3RyZWFtU2l6ZUNvdW50U3BlYyA9IG5ldyBDU2VxdWVudGlhbEluU3RyZWFtU2l6ZUNvdW50MjsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbEluU3RyZWFtPiBpblN0cmVhbVNpemVDb3VudCA9IGluU3RyZWFtU2l6ZUNvdW50U3BlYzsNCisgIENTZXF1ZW50aWFsT3V0U3RyZWFtU2l6ZUNvdW50ICpvdXRTdHJlYW1TaXplQ291bnRTcGVjID0gTlVMTDsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gb3V0U3RyZWFtU2l6ZUNvdW50Ow0KKw0KKyAgaW5TdHJlYW1TaXplQ291bnRTcGVjLT5Jbml0KGluU3RyZWFtKTsNCisNCisgIENSZWNvcmRWZWN0b3I8SVNlcXVlbnRpYWxJblN0cmVhbSAqPiBpblN0cmVhbVBvaW50ZXJzOw0KKyAgQ1JlY29yZFZlY3RvcjxJU2VxdWVudGlhbE91dFN0cmVhbSAqPiBvdXRTdHJlYW1Qb2ludGVyczsNCisgIGluU3RyZWFtUG9pbnRlcnMuQWRkKGluU3RyZWFtU2l6ZUNvdW50KTsNCisgIA0KKyAgaWYgKF9iaW5kSW5mby5PdXRTdHJlYW1zLlNpemUoKSAhPSAwKQ0KKyAgew0KKyAgICBvdXRTdHJlYW1TaXplQ291bnRTcGVjID0gbmV3IENTZXF1ZW50aWFsT3V0U3RyZWFtU2l6ZUNvdW50Ow0KKyAgICBvdXRTdHJlYW1TaXplQ291bnQgPSBvdXRTdHJlYW1TaXplQ291bnRTcGVjOw0KKyAgICBvdXRTdHJlYW1TaXplQ291bnRTcGVjLT5TZXRTdHJlYW0ob3V0U3RyZWFtKTsNCisgICAgb3V0U3RyZWFtU2l6ZUNvdW50U3BlYy0+SW5pdCgpOw0KKyAgICBvdXRTdHJlYW1Qb2ludGVycy5BZGQob3V0U3RyZWFtU2l6ZUNvdW50KTsNCisgIH0NCisNCisgIGZvciAoaSA9IDE7IGkgPCBfYmluZEluZm8uT3V0U3RyZWFtcy5TaXplKCk7IGkrKykNCisgICAgb3V0U3RyZWFtUG9pbnRlcnMuQWRkKHRlbXBCdWZmZXJzW2kgLSAxXSk7DQorDQorICBmb3IgKGkgPSAwOyBpIDwgX2NvZGVyc0luZm8uU2l6ZSgpOyBpKyspDQorICB7DQorICAgIENDb2RlckluZm8gJmVuY29kaW5nSW5mbyA9IF9jb2RlcnNJbmZvW2ldOw0KKyAgICANCisgICAgQ015Q29tUHRyPElDcnlwdG9SZXNldEluaXRWZWN0b3I+IHJlc2V0SW5pdFZlY3RvcjsNCisgICAgX21peGVyQ29kZXJTcGVjLT5fY29kZXJzW2ldLlF1ZXJ5SW50ZXJmYWNlKElJRF9JQ3J5cHRvUmVzZXRJbml0VmVjdG9yLCAodm9pZCAqKikmcmVzZXRJbml0VmVjdG9yKTsNCisgICAgaWYgKHJlc2V0SW5pdFZlY3RvcikNCisgICAgew0KKyAgICAgIHJlc2V0SW5pdFZlY3Rvci0+UmVzZXRJbml0VmVjdG9yKCk7DQorICAgIH0NCisNCisgICAgQ015Q29tUHRyPElDb21wcmVzc1dyaXRlQ29kZXJQcm9wZXJ0aWVzPiB3cml0ZUNvZGVyUHJvcGVydGllczsNCisgICAgX21peGVyQ29kZXJTcGVjLT5fY29kZXJzW2ldLlF1ZXJ5SW50ZXJmYWNlKElJRF9JQ29tcHJlc3NXcml0ZUNvZGVyUHJvcGVydGllcywgKHZvaWQgKiopJndyaXRlQ29kZXJQcm9wZXJ0aWVzKTsNCisgICAgaWYgKHdyaXRlQ29kZXJQcm9wZXJ0aWVzKQ0KKyAgICB7DQorICAgICAgQ0R5bkJ1ZlNlcU91dFN0cmVhbSAqb3V0U3RyZWFtU3BlYyA9IG5ldyBDRHluQnVmU2VxT3V0U3RyZWFtOw0KKyAgICAgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gb3V0U3RyZWFtKG91dFN0cmVhbVNwZWMpOw0KKyAgICAgIG91dFN0cmVhbVNwZWMtPkluaXQoKTsNCisgICAgICB3cml0ZUNvZGVyUHJvcGVydGllcy0+V3JpdGVDb2RlclByb3BlcnRpZXMob3V0U3RyZWFtKTsNCisgICAgICBvdXRTdHJlYW1TcGVjLT5Db3B5VG9CdWZmZXIoZW5jb2RpbmdJbmZvLlByb3BzKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgVUludDMyIHByb2dyZXNzSW5kZXggPSBtYWluQ29kZXJJbmRleDsNCisNCisgIGZvciAoaSA9IDA7IGkgKyAxIDwgX2NvZGVyc0luZm8uU2l6ZSgpOyBpKyspDQorICB7DQorICAgIFVJbnQ2NCBtID0gX2NvZGVyc0luZm9baV0uTWV0aG9kSUQ7DQorICAgIGlmIChtID09IGtfRGVsdGEgfHwgbSA9PSBrX0JDSiB8fCBtID09IGtfQkNKMikNCisgICAgICBwcm9ncmVzc0luZGV4ID0gaSArIDE7DQorICB9DQorDQorICBfbWl4ZXJDb2RlclNwZWMtPlNldFByb2dyZXNzQ29kZXJJbmRleChwcm9ncmVzc0luZGV4KTsNCisgIA0KKyAgUklOT0soX21peGVyQ29kZXItPkNvZGUoJmluU3RyZWFtUG9pbnRlcnMuRnJvbnQoKSwgTlVMTCwgMSwNCisgICAgJm91dFN0cmVhbVBvaW50ZXJzLkZyb250KCksIE5VTEwsIG91dFN0cmVhbVBvaW50ZXJzLlNpemUoKSwgY29tcHJlc3NQcm9ncmVzcykpOw0KKyAgDQorICBDb252ZXJ0QmluZEluZm9Ub0ZvbGRlckl0ZW1JbmZvKF9kZWNvbXByZXNzQmluZEluZm8sIF9kZWNvbXByZXNzaW9uTWV0aG9kcywgZm9sZGVySXRlbSk7DQorICANCisgIGlmIChfYmluZEluZm8uT3V0U3RyZWFtcy5TaXplKCkgIT0gMCkNCisgICAgcGFja1NpemVzLkFkZChvdXRTdHJlYW1TaXplQ291bnRTcGVjLT5HZXRTaXplKCkpOw0KKyAgDQorICBmb3IgKGkgPSAxOyBpIDwgX2JpbmRJbmZvLk91dFN0cmVhbXMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIENJbk91dFRlbXBCdWZmZXIgJmluT3V0VGVtcEJ1ZmZlciA9IGluT3V0VGVtcEJ1ZmZlcnNbaSAtIDFdOw0KKyAgICBSSU5PSyhpbk91dFRlbXBCdWZmZXIuV3JpdGVUb1N0cmVhbShvdXRTdHJlYW0pKTsNCisgICAgcGFja1NpemVzLkFkZChpbk91dFRlbXBCdWZmZXIuR2V0RGF0YVNpemUoKSk7DQorICB9DQorDQorICB1bnBhY2tTaXplID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCAoaW50KV9iaW5kUmV2ZXJzZUNvbnZlcnRlci0+TnVtU3JjSW5TdHJlYW1zOyBpKyspDQorICB7DQorICAgIGludCBiaW5kZXIgPSBfYmluZEluZm8uRmluZEJpbmRlckZvckluU3RyZWFtKA0KKyAgICAgICAgX2JpbmRSZXZlcnNlQ29udmVydGVyLT5EZXN0T3V0VG9TcmNJbk1hcFtpXSk7DQorICAgIFVJbnQ2NCBzdHJlYW1TaXplOw0KKyAgICBpZiAoYmluZGVyIDwgMCkNCisgICAgew0KKyAgICAgIHN0cmVhbVNpemUgPSBpblN0cmVhbVNpemVDb3VudFNwZWMtPkdldFNpemUoKTsNCisgICAgICB1bnBhY2tTaXplID0gc3RyZWFtU2l6ZTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgc3RyZWFtU2l6ZSA9IF9taXhlckNvZGVyU3BlYy0+R2V0V3JpdGVQcm9jZXNzZWRTaXplKGJpbmRlcik7DQorICAgIGNvZGVyVW5wYWNrU2l6ZXMuQWRkKHN0cmVhbVNpemUpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IG51bU1ldGhvZHM7IGkrKykNCisgICAgZm9sZGVySXRlbS5Db2RlcnNbbnVtTWV0aG9kcyAtIDEgLSBpXS5Qcm9wcyA9IF9jb2RlcnNJbmZvW2ldLlByb3BzOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKw0KK0NFbmNvZGVyOjpDRW5jb2Rlcihjb25zdCBDQ29tcHJlc3Npb25NZXRob2RNb2RlICZvcHRpb25zKToNCisgIF9iaW5kUmV2ZXJzZUNvbnZlcnRlcigwKSwNCisgIF9jb25zdHJ1Y3RlZChmYWxzZSkNCit7DQorICBpZiAob3B0aW9ucy5Jc0VtcHR5KCkpDQorICAgIHRocm93IDE7DQorDQorICBfb3B0aW9ucyA9IG9wdGlvbnM7DQorICBfbWl4ZXJDb2RlclNwZWMgPSBOVUxMOw0KK30NCisNCitIUkVTVUxUIENFbmNvZGVyOjpFbmNvZGVyQ29uc3RyKCkNCit7DQorICBpZiAoX2NvbnN0cnVjdGVkKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIGlmIChfb3B0aW9ucy5NZXRob2RzLklzRW1wdHkoKSkNCisgIHsNCisgICAgLy8gaXQgaGFzIG9ubHkgcGFzc3dvcmQgbWV0aG9kOw0KKyAgICBpZiAoIV9vcHRpb25zLlBhc3N3b3JkSXNEZWZpbmVkKQ0KKyAgICAgIHRocm93IDE7DQorICAgIGlmICghX29wdGlvbnMuQmluZHMuSXNFbXB0eSgpKQ0KKyAgICAgIHRocm93IDE7DQorICAgIE5Db2Rlck1peGVyOjpDQ29kZXJTdHJlYW1zSW5mbyBjb2RlclN0cmVhbXNJbmZvOw0KKyAgICBDTWV0aG9kRnVsbCBtZXRob2Q7DQorICAgIA0KKyAgICBtZXRob2QuTnVtSW5TdHJlYW1zID0gMTsNCisgICAgbWV0aG9kLk51bU91dFN0cmVhbXMgPSAxOw0KKyAgICBjb2RlclN0cmVhbXNJbmZvLk51bUluU3RyZWFtcyA9IDE7DQorICAgIGNvZGVyU3RyZWFtc0luZm8uTnVtT3V0U3RyZWFtcyA9IDE7DQorICAgIG1ldGhvZC5JZCA9IGtfQUVTOw0KKyAgICANCisgICAgX29wdGlvbnMuTWV0aG9kcy5BZGQobWV0aG9kKTsNCisgICAgX2JpbmRJbmZvLkNvZGVycy5BZGQoY29kZXJTdHJlYW1zSW5mbyk7DQorICANCisgICAgX2JpbmRJbmZvLkluU3RyZWFtcy5BZGQoMCk7DQorICAgIF9iaW5kSW5mby5PdXRTdHJlYW1zLkFkZCgwKTsNCisgIH0NCisgIGVsc2UNCisgIHsNCisNCisgIFVJbnQzMiBudW1JblN0cmVhbXMgPSAwLCBudW1PdXRTdHJlYW1zID0gMDsNCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgX29wdGlvbnMuTWV0aG9kcy5TaXplKCk7IGkrKykNCisgIHsNCisgICAgY29uc3QgQ01ldGhvZEZ1bGwgJm1ldGhvZEZ1bGwgPSBfb3B0aW9ucy5NZXRob2RzW2ldOw0KKyAgICBOQ29kZXJNaXhlcjo6Q0NvZGVyU3RyZWFtc0luZm8gY29kZXJTdHJlYW1zSW5mbzsNCisgICAgY29kZXJTdHJlYW1zSW5mby5OdW1JblN0cmVhbXMgPSBtZXRob2RGdWxsLk51bU91dFN0cmVhbXM7DQorICAgIGNvZGVyU3RyZWFtc0luZm8uTnVtT3V0U3RyZWFtcyA9IG1ldGhvZEZ1bGwuTnVtSW5TdHJlYW1zOw0KKyAgICBpZiAoX29wdGlvbnMuQmluZHMuSXNFbXB0eSgpKQ0KKyAgICB7DQorICAgICAgaWYgKGkgPCBfb3B0aW9ucy5NZXRob2RzLlNpemUoKSAtIDEpDQorICAgICAgew0KKyAgICAgICAgTkNvZGVyTWl4ZXI6OkNCaW5kUGFpciBiaW5kUGFpcjsNCisgICAgICAgIGJpbmRQYWlyLkluSW5kZXggPSBudW1JblN0cmVhbXMgKyBjb2RlclN0cmVhbXNJbmZvLk51bUluU3RyZWFtczsNCisgICAgICAgIGJpbmRQYWlyLk91dEluZGV4ID0gbnVtT3V0U3RyZWFtczsNCisgICAgICAgIF9iaW5kSW5mby5CaW5kUGFpcnMuQWRkKGJpbmRQYWlyKTsNCisgICAgICB9DQorICAgICAgZWxzZSBpZiAoY29kZXJTdHJlYW1zSW5mby5OdW1PdXRTdHJlYW1zICE9IDApDQorICAgICAgICBfYmluZEluZm8uT3V0U3RyZWFtcy5JbnNlcnQoMCwgbnVtT3V0U3RyZWFtcyk7DQorICAgICAgZm9yIChVSW50MzIgaiA9IDE7IGogPCBjb2RlclN0cmVhbXNJbmZvLk51bU91dFN0cmVhbXM7IGorKykNCisgICAgICAgIF9iaW5kSW5mby5PdXRTdHJlYW1zLkFkZChudW1PdXRTdHJlYW1zICsgaik7DQorICAgIH0NCisgICAgDQorICAgIG51bUluU3RyZWFtcyArPSBjb2RlclN0cmVhbXNJbmZvLk51bUluU3RyZWFtczsNCisgICAgbnVtT3V0U3RyZWFtcyArPSBjb2RlclN0cmVhbXNJbmZvLk51bU91dFN0cmVhbXM7DQorDQorICAgIF9iaW5kSW5mby5Db2RlcnMuQWRkKGNvZGVyU3RyZWFtc0luZm8pOw0KKyAgfQ0KKw0KKyAgaWYgKCFfb3B0aW9ucy5CaW5kcy5Jc0VtcHR5KCkpDQorICB7DQorICAgIGZvciAoaSA9IDA7IGkgPCBfb3B0aW9ucy5CaW5kcy5TaXplKCk7IGkrKykNCisgICAgew0KKyAgICAgIE5Db2Rlck1peGVyOjpDQmluZFBhaXIgYmluZFBhaXI7DQorICAgICAgY29uc3QgQ0JpbmQgJmJpbmQgPSBfb3B0aW9ucy5CaW5kc1tpXTsNCisgICAgICBiaW5kUGFpci5JbkluZGV4ID0gX2JpbmRJbmZvLkdldENvZGVySW5TdHJlYW1JbmRleChiaW5kLkluQ29kZXIpICsgYmluZC5JblN0cmVhbTsNCisgICAgICBiaW5kUGFpci5PdXRJbmRleCA9IF9iaW5kSW5mby5HZXRDb2Rlck91dFN0cmVhbUluZGV4KGJpbmQuT3V0Q29kZXIpICsgYmluZC5PdXRTdHJlYW07DQorICAgICAgX2JpbmRJbmZvLkJpbmRQYWlycy5BZGQoYmluZFBhaXIpOw0KKyAgICB9DQorICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KW51bU91dFN0cmVhbXM7IGkrKykNCisgICAgICBpZiAoX2JpbmRJbmZvLkZpbmRCaW5kZXJGb3JPdXRTdHJlYW0oaSkgPT0gLTEpDQorICAgICAgICBfYmluZEluZm8uT3V0U3RyZWFtcy5BZGQoaSk7DQorICB9DQorDQorICBmb3IgKGkgPSAwOyBpIDwgKGludCludW1JblN0cmVhbXM7IGkrKykNCisgICAgaWYgKF9iaW5kSW5mby5GaW5kQmluZGVyRm9ySW5TdHJlYW0oaSkgPT0gLTEpDQorICAgICAgX2JpbmRJbmZvLkluU3RyZWFtcy5BZGQoaSk7DQorDQorICBpZiAoX2JpbmRJbmZvLkluU3RyZWFtcy5Jc0VtcHR5KCkpDQorICAgIHRocm93IDE7IC8vIHRoaXMgaXMgZXJyb3INCisNCisgIC8vIE1ha2UgbWFpbiBzdHJlYW0gZmlyc3QgaW4gbGlzdA0KKyAgaW50IGluSW5kZXggPSBfYmluZEluZm8uSW5TdHJlYW1zWzBdOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgVUludDMyIGNvZGVySW5kZXgsIGNvZGVyU3RyZWFtSW5kZXg7DQorICAgIF9iaW5kSW5mby5GaW5kSW5TdHJlYW0oaW5JbmRleCwgY29kZXJJbmRleCwgY29kZXJTdHJlYW1JbmRleCk7DQorICAgIFVJbnQzMiBvdXRJbmRleCA9IF9iaW5kSW5mby5HZXRDb2Rlck91dFN0cmVhbUluZGV4KGNvZGVySW5kZXgpOw0KKyAgICBpbnQgYmluZGVyID0gX2JpbmRJbmZvLkZpbmRCaW5kZXJGb3JPdXRTdHJlYW0ob3V0SW5kZXgpOw0KKyAgICBpZiAoYmluZGVyID49IDApDQorICAgIHsNCisgICAgICBpbkluZGV4ID0gX2JpbmRJbmZvLkJpbmRQYWlyc1tiaW5kZXJdLkluSW5kZXg7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgZm9yIChpID0gMDsgaSA8IF9iaW5kSW5mby5PdXRTdHJlYW1zLlNpemUoKTsgaSsrKQ0KKyAgICAgIGlmIChfYmluZEluZm8uT3V0U3RyZWFtc1tpXSA9PSBvdXRJbmRleCkNCisgICAgICB7DQorICAgICAgICBfYmluZEluZm8uT3V0U3RyZWFtcy5EZWxldGUoaSk7DQorICAgICAgICBfYmluZEluZm8uT3V0U3RyZWFtcy5JbnNlcnQoMCwgb3V0SW5kZXgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICBicmVhazsNCisgIH0NCisNCisgIGlmIChfb3B0aW9ucy5QYXNzd29yZElzRGVmaW5lZCkNCisgIHsNCisgICAgdW5zaWduZWQgbnVtQ3J5cHRvU3RyZWFtcyA9IF9iaW5kSW5mby5PdXRTdHJlYW1zLlNpemUoKTsNCisNCisgICAgZm9yIChpID0gMDsgaSA8IG51bUNyeXB0b1N0cmVhbXM7IGkrKykNCisgICAgew0KKyAgICAgIE5Db2Rlck1peGVyOjpDQmluZFBhaXIgYmluZFBhaXI7DQorICAgICAgYmluZFBhaXIuSW5JbmRleCA9IG51bUluU3RyZWFtcyArIGk7DQorICAgICAgYmluZFBhaXIuT3V0SW5kZXggPSBfYmluZEluZm8uT3V0U3RyZWFtc1tpXTsNCisgICAgICBfYmluZEluZm8uQmluZFBhaXJzLkFkZChiaW5kUGFpcik7DQorICAgIH0NCisgICAgX2JpbmRJbmZvLk91dFN0cmVhbXMuQ2xlYXIoKTsNCisNCisgICAgLyoNCisgICAgaWYgKG51bUNyeXB0b1N0cmVhbXMgPT0gMCkNCisgICAgICBudW1DcnlwdG9TdHJlYW1zID0gMTsNCisgICAgKi8NCisNCisgICAgZm9yIChpID0gMDsgaSA8IG51bUNyeXB0b1N0cmVhbXM7IGkrKykNCisgICAgew0KKyAgICAgIE5Db2Rlck1peGVyOjpDQ29kZXJTdHJlYW1zSW5mbyBjb2RlclN0cmVhbXNJbmZvOw0KKyAgICAgIENNZXRob2RGdWxsIG1ldGhvZDsNCisgICAgICBtZXRob2QuTnVtSW5TdHJlYW1zID0gMTsNCisgICAgICBtZXRob2QuTnVtT3V0U3RyZWFtcyA9IDE7DQorICAgICAgY29kZXJTdHJlYW1zSW5mby5OdW1JblN0cmVhbXMgPSBtZXRob2QuTnVtT3V0U3RyZWFtczsNCisgICAgICBjb2RlclN0cmVhbXNJbmZvLk51bU91dFN0cmVhbXMgPSBtZXRob2QuTnVtSW5TdHJlYW1zOw0KKyAgICAgIG1ldGhvZC5JZCA9IGtfQUVTOw0KKw0KKyAgICAgIF9vcHRpb25zLk1ldGhvZHMuQWRkKG1ldGhvZCk7DQorICAgICAgX2JpbmRJbmZvLkNvZGVycy5BZGQoY29kZXJTdHJlYW1zSW5mbyk7DQorICAgICAgX2JpbmRJbmZvLk91dFN0cmVhbXMuQWRkKG51bU91dFN0cmVhbXMgKyBpKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgfQ0KKw0KKyAgZm9yIChpbnQgaSA9IF9vcHRpb25zLk1ldGhvZHMuU2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pDQorICB7DQorICAgIGNvbnN0IENNZXRob2RGdWxsICZtZXRob2RGdWxsID0gX29wdGlvbnMuTWV0aG9kc1tpXTsNCisgICAgX2RlY29tcHJlc3Npb25NZXRob2RzLkFkZChtZXRob2RGdWxsLklkKTsNCisgIH0NCisNCisgIF9iaW5kUmV2ZXJzZUNvbnZlcnRlciA9IG5ldyBOQ29kZXJNaXhlcjo6Q0JpbmRSZXZlcnNlQ29udmVydGVyKF9iaW5kSW5mbyk7DQorICBfYmluZFJldmVyc2VDb252ZXJ0ZXItPkNyZWF0ZVJldmVyc2VCaW5kSW5mbyhfZGVjb21wcmVzc0JpbmRJbmZvKTsNCisgIF9jb25zdHJ1Y3RlZCA9IHRydWU7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorQ0VuY29kZXI6On5DRW5jb2RlcigpDQorew0KKyAgZGVsZXRlIF9iaW5kUmV2ZXJzZUNvbnZlcnRlcjsNCit9DQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pFbmNvZGUuaCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekVuY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMjhjZmIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pFbmNvZGUuaApAQCAtMCwwICsxLDU3IEBACisvLyA3ekVuY29kZS5oDQorDQorI2lmbmRlZiBfXzdaX0VOQ09ERV9IDQorI2RlZmluZSBfXzdaX0VOQ09ERV9IDQorDQorLy8gI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9TdHJlYW1PYmplY3RzLmgiDQorDQorI2luY2x1ZGUgIjd6Q29tcHJlc3Npb25Nb2RlLmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9Db2Rlck1peGVyMi5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vQ29kZXJNaXhlcjJNVC5oIg0KKyNpZmRlZiBfU1RfTU9ERQ0KKyNpbmNsdWRlICIuLi9Db21tb24vQ29kZXJNaXhlcjJTVC5oIg0KKyNlbmRpZg0KKyNpbmNsdWRlICI3ekl0ZW0uaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0NyZWF0ZUNvZGVyLmgiDQorDQorbmFtZXNwYWNlIE5BcmNoaXZlIHsNCituYW1lc3BhY2UgTjd6IHsNCisNCitjbGFzcyBDRW5jb2Rlcg0KK3sNCisgIE5Db2Rlck1peGVyOjpDQ29kZXJNaXhlcjJNVCAqX21peGVyQ29kZXJTcGVjOw0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyMj4gX21peGVyQ29kZXI7DQorDQorICBDT2JqZWN0VmVjdG9yPENDb2RlckluZm8+IF9jb2RlcnNJbmZvOw0KKw0KKyAgQ0NvbXByZXNzaW9uTWV0aG9kTW9kZSBfb3B0aW9uczsNCisgIE5Db2Rlck1peGVyOjpDQmluZEluZm8gX2JpbmRJbmZvOw0KKyAgTkNvZGVyTWl4ZXI6OkNCaW5kSW5mbyBfZGVjb21wcmVzc0JpbmRJbmZvOw0KKyAgTkNvZGVyTWl4ZXI6OkNCaW5kUmV2ZXJzZUNvbnZlcnRlciAqX2JpbmRSZXZlcnNlQ29udmVydGVyOw0KKyAgQ1JlY29yZFZlY3RvcjxDTWV0aG9kSWQ+IF9kZWNvbXByZXNzaW9uTWV0aG9kczsNCisNCisgIEhSRVNVTFQgQ3JlYXRlTWl4ZXJDb2RlcihERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICAgIGNvbnN0IFVJbnQ2NCAqaW5TaXplRm9yUmVkdWNlKTsNCisNCisgIGJvb2wgX2NvbnN0cnVjdGVkOw0KK3B1YmxpYzoNCisgIENFbmNvZGVyKGNvbnN0IENDb21wcmVzc2lvbk1ldGhvZE1vZGUgJm9wdGlvbnMpOw0KKyAgfkNFbmNvZGVyKCk7DQorICBIUkVTVUxUIEVuY29kZXJDb25zdHIoKTsNCisgIEhSRVNVTFQgRW5jb2RlKA0KKyAgICAgIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgICAgSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0sDQorICAgICAgY29uc3QgVUludDY0ICppblN0cmVhbVNpemUsIGNvbnN0IFVJbnQ2NCAqaW5TaXplRm9yUmVkdWNlLA0KKyAgICAgIENGb2xkZXIgJmZvbGRlckl0ZW0sDQorICAgICAgQ1JlY29yZFZlY3RvcjxVSW50NjQ+ICZjb2RlclVucGFja1NpemVzLA0KKyAgICAgIFVJbnQ2NCAmdW5wYWNrU2l6ZSwNCisgICAgICBJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtLA0KKyAgICAgIENSZWNvcmRWZWN0b3I8VUludDY0PiAmcGFja1NpemVzLA0KKyAgICAgIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqY29tcHJlc3NQcm9ncmVzcyk7DQorfTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekV4dHJhY3QuY3BwIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6RXh0cmFjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxMDc2MgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekV4dHJhY3QuY3BwCkBAIC0wLDAgKzEsMjYyIEBACisvLyA3ekV4dHJhY3QuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vQ29tVHJ5LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9Qcm9ncmVzc1V0aWxzLmgiDQorDQorI2luY2x1ZGUgIjd6RGVjb2RlLmgiDQorLy8gI2luY2x1ZGUgIjd6MURlY29kZS5oIg0KKyNpbmNsdWRlICI3ekZvbGRlck91dFN0cmVhbS5oIg0KKyNpbmNsdWRlICI3ekhhbmRsZXIuaCINCisNCituYW1lc3BhY2UgTkFyY2hpdmUgew0KK25hbWVzcGFjZSBON3ogew0KKw0KK3N0cnVjdCBDRXh0cmFjdEZvbGRlckluZm8NCit7DQorICAjaWZkZWYgXzdaX1ZPTA0KKyAgaW50IFZvbHVtZUluZGV4Ow0KKyAgI2VuZGlmDQorICBDTnVtIEZpbGVJbmRleDsNCisgIENOdW0gRm9sZGVySW5kZXg7DQorICBDQm9vbFZlY3RvciBFeHRyYWN0U3RhdHVzZXM7DQorICBVSW50NjQgVW5wYWNrU2l6ZTsNCisgIENFeHRyYWN0Rm9sZGVySW5mbygNCisgICAgI2lmZGVmIF83Wl9WT0wNCisgICAgaW50IHZvbHVtZUluZGV4LA0KKyAgICAjZW5kaWYNCisgICAgQ051bSBmaWxlSW5kZXgsIENOdW0gZm9sZGVySW5kZXgpOg0KKyAgICAjaWZkZWYgXzdaX1ZPTA0KKyAgICBWb2x1bWVJbmRleCh2b2x1bWVJbmRleCksDQorICAgICNlbmRpZg0KKyAgICBGaWxlSW5kZXgoZmlsZUluZGV4KSwNCisgICAgRm9sZGVySW5kZXgoZm9sZGVySW5kZXgpLA0KKyAgICBVbnBhY2tTaXplKDApDQorICB7DQorICAgIGlmIChmaWxlSW5kZXggIT0ga051bU5vSW5kZXgpDQorICAgIHsNCisgICAgICBFeHRyYWN0U3RhdHVzZXMuQ2xlYXJBbmRTZXRTaXplKDEpOw0KKyAgICAgIEV4dHJhY3RTdGF0dXNlc1swXSA9IHRydWU7DQorICAgIH0NCisgIH07DQorfTsNCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkV4dHJhY3QoY29uc3QgVUludDMyICppbmRpY2VzLCBVSW50MzIgbnVtSXRlbXMsDQorICAgIEludDMyIHRlc3RNb2RlU3BlYywgSUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2sgKmV4dHJhY3RDYWxsYmFja1NwZWMpDQorew0KKyAgQ09NX1RSWV9CRUdJTg0KKyAgYm9vbCB0ZXN0TW9kZSA9ICh0ZXN0TW9kZVNwZWMgIT0gMCk7DQorICBDTXlDb21QdHI8SUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2s+IGV4dHJhY3RDYWxsYmFjayA9IGV4dHJhY3RDYWxsYmFja1NwZWM7DQorICBVSW50NjQgaW1wb3J0YW50VG90YWxVbnBhY2tlZCA9IDA7DQorDQorICBib29sIGFsbEZpbGVzTW9kZSA9IChudW1JdGVtcyA9PSAoVUludDMyKShJbnQzMiktMSk7DQorICBpZiAoYWxsRmlsZXNNb2RlKQ0KKyAgICBudW1JdGVtcyA9DQorICAgICNpZmRlZiBfN1pfVk9MDQorICAgIF9yZWZzLlNpemUoKTsNCisgICAgI2Vsc2UNCisgICAgX2RiLkZpbGVzLlNpemUoKTsNCisgICAgI2VuZGlmDQorDQorICBpZihudW1JdGVtcyA9PSAwKQ0KKyAgICByZXR1cm4gU19PSzsNCisNCisgIC8qDQorICBpZihfdm9sdW1lcy5TaXplKCkgIT0gMSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIGNvbnN0IENWb2x1bWUgJnZvbHVtZSA9IF92b2x1bWVzLkZyb250KCk7DQorICBjb25zdCBDRGJFeCAmX2RiID0gdm9sdW1lLkRhdGFiYXNlOw0KKyAgSUluU3RyZWFtICpfaW5TdHJlYW0gPSB2b2x1bWUuU3RyZWFtOw0KKyAgKi8NCisgIA0KKyAgQ09iamVjdFZlY3RvcjxDRXh0cmFjdEZvbGRlckluZm8+IGV4dHJhY3RGb2xkZXJJbmZvVmVjdG9yOw0KKyAgZm9yIChVSW50MzIgaWkgPSAwOyBpaSA8IG51bUl0ZW1zOyBpaSsrKQ0KKyAgew0KKyAgICAvLyBVSW50MzIgZmlsZUluZGV4ID0gYWxsRmlsZXNNb2RlID8gaW5kZXhJbmRleCA6IGluZGljZXNbaW5kZXhJbmRleF07DQorICAgIFVJbnQzMiByZWYySW5kZXggPSBhbGxGaWxlc01vZGUgPyBpaSA6IGluZGljZXNbaWldOw0KKyAgICAvLyBjb25zdCBDUmVmMiAmcmVmMiA9IF9yZWZzW3JlZjJJbmRleF07DQorDQorICAgIC8vIGZvciAoVUludDMyIHJpID0gMDsgcmkgPCByZWYyLlJlZnMuU2l6ZSgpOyByaSsrKQ0KKyAgICB7DQorICAgICAgI2lmZGVmIF83Wl9WT0wNCisgICAgICAvLyBjb25zdCBDUmVmICZyZWYgPSByZWYyLlJlZnNbcmldOw0KKyAgICAgIGNvbnN0IENSZWYgJnJlZiA9IF9yZWZzW3JlZjJJbmRleF07DQorDQorICAgICAgaW50IHZvbHVtZUluZGV4ID0gcmVmLlZvbHVtZUluZGV4Ow0KKyAgICAgIGNvbnN0IENWb2x1bWUgJnZvbHVtZSA9IF92b2x1bWVzW3ZvbHVtZUluZGV4XTsNCisgICAgICBjb25zdCBDRGJFeCAmZGIgPSB2b2x1bWUuRGF0YWJhc2U7DQorICAgICAgVUludDMyIGZpbGVJbmRleCA9IHJlZi5JdGVtSW5kZXg7DQorICAgICAgI2Vsc2UNCisgICAgICBjb25zdCBDRGJFeCAmZGIgPSBfZGI7DQorICAgICAgVUludDMyIGZpbGVJbmRleCA9IHJlZjJJbmRleDsNCisgICAgICAjZW5kaWYNCisNCisgICAgICBDTnVtIGZvbGRlckluZGV4ID0gZGIuRmlsZUluZGV4VG9Gb2xkZXJJbmRleE1hcFtmaWxlSW5kZXhdOw0KKyAgICAgIGlmIChmb2xkZXJJbmRleCA9PSBrTnVtTm9JbmRleCkNCisgICAgICB7DQorICAgICAgICBleHRyYWN0Rm9sZGVySW5mb1ZlY3Rvci5BZGQoQ0V4dHJhY3RGb2xkZXJJbmZvKA0KKyAgICAgICAgICAgICNpZmRlZiBfN1pfVk9MDQorICAgICAgICAgICAgdm9sdW1lSW5kZXgsDQorICAgICAgICAgICAgI2VuZGlmDQorICAgICAgICAgICAgZmlsZUluZGV4LCBrTnVtTm9JbmRleCkpOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChleHRyYWN0Rm9sZGVySW5mb1ZlY3Rvci5Jc0VtcHR5KCkgfHwNCisgICAgICAgIGZvbGRlckluZGV4ICE9IGV4dHJhY3RGb2xkZXJJbmZvVmVjdG9yLkJhY2soKS5Gb2xkZXJJbmRleA0KKyAgICAgICAgI2lmZGVmIF83Wl9WT0wNCisgICAgICAgIHx8IHZvbHVtZUluZGV4ICE9IGV4dHJhY3RGb2xkZXJJbmZvVmVjdG9yLkJhY2soKS5Wb2x1bWVJbmRleA0KKyAgICAgICAgI2VuZGlmDQorICAgICAgICApDQorICAgICAgew0KKyAgICAgICAgZXh0cmFjdEZvbGRlckluZm9WZWN0b3IuQWRkKENFeHRyYWN0Rm9sZGVySW5mbygNCisgICAgICAgICAgICAjaWZkZWYgXzdaX1ZPTA0KKyAgICAgICAgICAgIHZvbHVtZUluZGV4LA0KKyAgICAgICAgICAgICNlbmRpZg0KKyAgICAgICAgICAgIGtOdW1Ob0luZGV4LCBmb2xkZXJJbmRleCkpOw0KKyAgICAgICAgVUludDY0IHVucGFja1NpemUgPSBkYi5HZXRGb2xkZXJVbnBhY2tTaXplKGZvbGRlckluZGV4KTsNCisgICAgICAgIGltcG9ydGFudFRvdGFsVW5wYWNrZWQgKz0gdW5wYWNrU2l6ZTsNCisgICAgICAgIGV4dHJhY3RGb2xkZXJJbmZvVmVjdG9yLkJhY2soKS5VbnBhY2tTaXplID0gdW5wYWNrU2l6ZTsNCisgICAgICB9DQorICAgICAgDQorICAgICAgQ0V4dHJhY3RGb2xkZXJJbmZvICZlZmkgPSBleHRyYWN0Rm9sZGVySW5mb1ZlY3Rvci5CYWNrKCk7DQorICAgICAgDQorICAgICAgLy8gY29uc3QgQ0ZvbGRlckluZm8gJmZvbGRlckluZm8gPSBtX2RhbV9Gb2xkZXJzW2ZvbGRlckluZGV4XTsNCisgICAgICBDTnVtIHN0YXJ0SW5kZXggPSBkYi5Gb2xkZXJTdGFydEZpbGVJbmRleFtmb2xkZXJJbmRleF07DQorICAgICAgZm9yIChDTnVtIGluZGV4ID0gZWZpLkV4dHJhY3RTdGF0dXNlcy5TaXplKCk7DQorICAgICAgICAgIGluZGV4IDw9IGZpbGVJbmRleCAtIHN0YXJ0SW5kZXg7IGluZGV4KyspDQorICAgICAgew0KKyAgICAgICAgLy8gVUludDY0IHVucGFja1NpemUgPSBfZGIuRmlsZXNbc3RhcnRJbmRleCArIGluZGV4XS5VbnBhY2tTaXplOw0KKyAgICAgICAgLy8gQ291bnQgcGFydGlhbF9mb2xkZXJfc2l6ZQ0KKyAgICAgICAgLy8gZWZpLlVucGFja1NpemUgKz0gdW5wYWNrU2l6ZTsNCisgICAgICAgIC8vIGltcG9ydGFudFRvdGFsVW5wYWNrZWQgKz0gdW5wYWNrU2l6ZTsNCisgICAgICAgIGVmaS5FeHRyYWN0U3RhdHVzZXMuQWRkKGluZGV4ID09IGZpbGVJbmRleCAtIHN0YXJ0SW5kZXgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgUklOT0soZXh0cmFjdENhbGxiYWNrLT5TZXRUb3RhbChpbXBvcnRhbnRUb3RhbFVucGFja2VkKSk7DQorDQorICBDRGVjb2RlciBkZWNvZGVyKA0KKyAgICAjaWZkZWYgX1NUX01PREUNCisgICAgZmFsc2UNCisgICAgI2Vsc2UNCisgICAgdHJ1ZQ0KKyAgICAjZW5kaWYNCisgICAgKTsNCisgIC8vIENEZWNvZGVyMSBkZWNvZGVyOw0KKw0KKyAgVUludDY0IHRvdGFsUGFja2VkID0gMDsNCisgIFVJbnQ2NCB0b3RhbFVucGFja2VkID0gMDsNCisgIFVJbnQ2NCBjdXJQYWNrZWQsIGN1clVucGFja2VkOw0KKw0KKyAgQ0xvY2FsUHJvZ3Jlc3MgKmxwcyA9IG5ldyBDTG9jYWxQcm9ncmVzczsNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NQcm9ncmVzc0luZm8+IHByb2dyZXNzID0gbHBzOw0KKyAgbHBzLT5Jbml0KGV4dHJhY3RDYWxsYmFjaywgZmFsc2UpOw0KKw0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDs7IGkrKywgdG90YWxVbnBhY2tlZCArPSBjdXJVbnBhY2tlZCwgdG90YWxQYWNrZWQgKz0gY3VyUGFja2VkKQ0KKyAgew0KKyAgICBscHMtPk91dFNpemUgPSB0b3RhbFVucGFja2VkOw0KKyAgICBscHMtPkluU2l6ZSA9IHRvdGFsUGFja2VkOw0KKyAgICBSSU5PSyhscHMtPlNldEN1cigpKTsNCisNCisgICAgaWYgKGkgPj0gZXh0cmFjdEZvbGRlckluZm9WZWN0b3IuU2l6ZSgpKQ0KKyAgICAgIGJyZWFrOw0KKyAgICANCisgICAgY29uc3QgQ0V4dHJhY3RGb2xkZXJJbmZvICZlZmkgPSBleHRyYWN0Rm9sZGVySW5mb1ZlY3RvcltpXTsNCisgICAgY3VyVW5wYWNrZWQgPSBlZmkuVW5wYWNrU2l6ZTsNCisgICAgY3VyUGFja2VkID0gMDsNCisNCisgICAgQ0ZvbGRlck91dFN0cmVhbSAqZm9sZGVyT3V0U3RyZWFtID0gbmV3IENGb2xkZXJPdXRTdHJlYW07DQorICAgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gb3V0U3RyZWFtKGZvbGRlck91dFN0cmVhbSk7DQorDQorICAgICNpZmRlZiBfN1pfVk9MDQorICAgIGNvbnN0IENWb2x1bWUgJnZvbHVtZSA9IF92b2x1bWVzW2VmaS5Wb2x1bWVJbmRleF07DQorICAgIGNvbnN0IENEYkV4ICZkYiA9IHZvbHVtZS5EYXRhYmFzZTsNCisgICAgI2Vsc2UNCisgICAgY29uc3QgQ0RiRXggJmRiID0gX2RiOw0KKyAgICAjZW5kaWYNCisNCisgICAgQ051bSBzdGFydEluZGV4Ow0KKyAgICBpZiAoZWZpLkZpbGVJbmRleCAhPSBrTnVtTm9JbmRleCkNCisgICAgICBzdGFydEluZGV4ID0gZWZpLkZpbGVJbmRleDsNCisgICAgZWxzZQ0KKyAgICAgIHN0YXJ0SW5kZXggPSBkYi5Gb2xkZXJTdGFydEZpbGVJbmRleFtlZmkuRm9sZGVySW5kZXhdOw0KKw0KKyAgICBIUkVTVUxUIHJlc3VsdCA9IGZvbGRlck91dFN0cmVhbS0+SW5pdCgmZGIsDQorICAgICAgICAjaWZkZWYgXzdaX1ZPTA0KKyAgICAgICAgdm9sdW1lLlN0YXJ0UmVmMkluZGV4LA0KKyAgICAgICAgI2Vsc2UNCisgICAgICAgIDAsDQorICAgICAgICAjZW5kaWYNCisgICAgICAgIHN0YXJ0SW5kZXgsDQorICAgICAgICAmZWZpLkV4dHJhY3RTdGF0dXNlcywgZXh0cmFjdENhbGxiYWNrLCB0ZXN0TW9kZSwgX2NyY1NpemUgIT0gMCk7DQorDQorICAgIFJJTk9LKHJlc3VsdCk7DQorDQorICAgIGlmIChlZmkuRmlsZUluZGV4ICE9IGtOdW1Ob0luZGV4KQ0KKyAgICAgIGNvbnRpbnVlOw0KKw0KKyAgICBDTnVtIGZvbGRlckluZGV4ID0gZWZpLkZvbGRlckluZGV4Ow0KKyAgICBjdXJQYWNrZWQgPSBfZGIuR2V0Rm9sZGVyRnVsbFBhY2tTaXplKGZvbGRlckluZGV4KTsNCisNCisgICAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICAgIENNeUNvbVB0cjxJQ3J5cHRvR2V0VGV4dFBhc3N3b3JkPiBnZXRUZXh0UGFzc3dvcmQ7DQorICAgIGlmIChleHRyYWN0Q2FsbGJhY2spDQorICAgICAgZXh0cmFjdENhbGxiYWNrLlF1ZXJ5SW50ZXJmYWNlKElJRF9JQ3J5cHRvR2V0VGV4dFBhc3N3b3JkLCAmZ2V0VGV4dFBhc3N3b3JkKTsNCisgICAgI2VuZGlmDQorDQorICAgIHRyeQ0KKyAgICB7DQorICAgICAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICAgICAgICBib29sIGlzRW5jcnlwdGVkID0gZmFsc2U7DQorICAgICAgICBib29sIHBhc3N3b3JkSXNEZWZpbmVkID0gZmFsc2U7DQorICAgICAgI2VuZGlmDQorDQorICAgICAgSFJFU1VMVCByZXN1bHQgPSBkZWNvZGVyLkRlY29kZSgNCisgICAgICAgICAgRVhURVJOQUxfQ09ERUNTX1ZBUlMNCisgICAgICAgICAgI2lmZGVmIF83Wl9WT0wNCisgICAgICAgICAgICB2b2x1bWUuU3RyZWFtLA0KKyAgICAgICAgICAjZWxzZQ0KKyAgICAgICAgICAgIF9pblN0cmVhbSwNCisgICAgICAgICAgI2VuZGlmDQorICAgICAgICAgIGRiLkFyY0luZm8uRGF0YVN0YXJ0UG9zaXRpb24sDQorICAgICAgICAgIGRiLCBmb2xkZXJJbmRleCwNCisgICAgICAgICAgb3V0U3RyZWFtLA0KKyAgICAgICAgICBwcm9ncmVzcw0KKyAgICAgICAgICBfN1pfREVDT0RFUl9DUllQUk9fVkFSUw0KKyAgICAgICAgICAjaWYgIWRlZmluZWQoXzdaSVBfU1QpICYmICFkZWZpbmVkKF9TRlgpDQorICAgICAgICAgICAgLCB0cnVlLCBfbnVtVGhyZWFkcw0KKyAgICAgICAgICAjZW5kaWYNCisgICAgICAgICAgKTsNCisNCisgICAgICBpZiAocmVzdWx0ID09IFNfRkFMU0UpDQorICAgICAgew0KKyAgICAgICAgUklOT0soZm9sZGVyT3V0U3RyZWFtLT5GbHVzaENvcnJ1cHRlZChORXh0cmFjdDo6Tk9wZXJhdGlvblJlc3VsdDo6a0RhdGFFcnJvcikpOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXN1bHQgPT0gRV9OT1RJTVBMKQ0KKyAgICAgIHsNCisgICAgICAgIFJJTk9LKGZvbGRlck91dFN0cmVhbS0+Rmx1c2hDb3JydXB0ZWQoTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtVbnN1cHBvcnRlZE1ldGhvZCkpOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChyZXN1bHQgIT0gU19PSykNCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgaWYgKGZvbGRlck91dFN0cmVhbS0+V2FzV3JpdGluZ0ZpbmlzaGVkKCkgIT0gU19PSykNCisgICAgICB7DQorICAgICAgICBSSU5PSyhmb2xkZXJPdXRTdHJlYW0tPkZsdXNoQ29ycnVwdGVkKE5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprRGF0YUVycm9yKSk7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgY2F0Y2goLi4uKQ0KKyAgICB7DQorICAgICAgUklOT0soZm9sZGVyT3V0U3RyZWFtLT5GbHVzaENvcnJ1cHRlZChORXh0cmFjdDo6Tk9wZXJhdGlvblJlc3VsdDo6a0RhdGFFcnJvcikpOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gU19PSzsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KK319DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6Rm9sZGVySW5TdHJlYW0uY3BwIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6Rm9sZGVySW5TdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NzExOTEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pGb2xkZXJJblN0cmVhbS5jcHAKQEAgLTAsMCArMSwxMjMgQEAKKy8vIDd6Rm9sZGVySW5TdHJlYW0uY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICI3ekZvbGRlckluU3RyZWFtLmgiDQorDQorbmFtZXNwYWNlIE5BcmNoaXZlIHsNCituYW1lc3BhY2UgTjd6IHsNCisNCitDRm9sZGVySW5TdHJlYW06OkNGb2xkZXJJblN0cmVhbSgpDQorew0KKyAgX2luU3RyZWFtV2l0aEhhc2hTcGVjID0gbmV3IENTZXF1ZW50aWFsSW5TdHJlYW1XaXRoQ1JDOw0KKyAgX2luU3RyZWFtV2l0aEhhc2ggPSBfaW5TdHJlYW1XaXRoSGFzaFNwZWM7DQorfQ0KKw0KK3ZvaWQgQ0ZvbGRlckluU3RyZWFtOjpJbml0KElBcmNoaXZlVXBkYXRlQ2FsbGJhY2sgKnVwZGF0ZUNhbGxiYWNrLA0KKyAgICBjb25zdCBVSW50MzIgKmZpbGVJbmRpY2VzLCBVSW50MzIgbnVtRmlsZXMpDQorew0KKyAgX3VwZGF0ZUNhbGxiYWNrID0gdXBkYXRlQ2FsbGJhY2s7DQorICBfbnVtRmlsZXMgPSBudW1GaWxlczsNCisgIF9maWxlSW5kZXggPSAwOw0KKyAgX2ZpbGVJbmRpY2VzID0gZmlsZUluZGljZXM7DQorICBQcm9jZXNzZWQuQ2xlYXIoKTsNCisgIENSQ3MuQ2xlYXIoKTsNCisgIFNpemVzLkNsZWFyKCk7DQorICBfZmlsZUlzT3BlbiA9IGZhbHNlOw0KKyAgX2N1cnJlbnRTaXplSXNEZWZpbmVkID0gZmFsc2U7DQorfQ0KKw0KK0hSRVNVTFQgQ0ZvbGRlckluU3RyZWFtOjpPcGVuU3RyZWFtKCkNCit7DQorICBfZmlsZVBvcyA9IDA7DQorICB3aGlsZSAoX2ZpbGVJbmRleCA8IF9udW1GaWxlcykNCisgIHsNCisgICAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IHN0cmVhbTsNCisgICAgSFJFU1VMVCByZXN1bHQgPSBfdXBkYXRlQ2FsbGJhY2stPkdldFN0cmVhbShfZmlsZUluZGljZXNbX2ZpbGVJbmRleF0sICZzdHJlYW0pOw0KKyAgICBpZiAocmVzdWx0ICE9IFNfT0sgJiYgcmVzdWx0ICE9IFNfRkFMU0UpDQorICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgX2ZpbGVJbmRleCsrOw0KKyAgICBfaW5TdHJlYW1XaXRoSGFzaFNwZWMtPlNldFN0cmVhbShzdHJlYW0pOw0KKyAgICBfaW5TdHJlYW1XaXRoSGFzaFNwZWMtPkluaXQoKTsNCisgICAgaWYgKHN0cmVhbSkNCisgICAgew0KKyAgICAgIF9maWxlSXNPcGVuID0gdHJ1ZTsNCisgICAgICBDTXlDb21QdHI8SVN0cmVhbUdldFNpemU+IHN0cmVhbUdldFNpemU7DQorICAgICAgc3RyZWFtLlF1ZXJ5SW50ZXJmYWNlKElJRF9JU3RyZWFtR2V0U2l6ZSwgJnN0cmVhbUdldFNpemUpOw0KKyAgICAgIGlmIChzdHJlYW1HZXRTaXplKQ0KKyAgICAgIHsNCisgICAgICAgIFJJTk9LKHN0cmVhbUdldFNpemUtPkdldFNpemUoJl9jdXJyZW50U2l6ZSkpOw0KKyAgICAgICAgX2N1cnJlbnRTaXplSXNEZWZpbmVkID0gdHJ1ZTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIFNfT0s7DQorICAgIH0NCisgICAgUklOT0soX3VwZGF0ZUNhbGxiYWNrLT5TZXRPcGVyYXRpb25SZXN1bHQoTkFyY2hpdmU6Ok5VcGRhdGU6Ok5PcGVyYXRpb25SZXN1bHQ6OmtPSykpOw0KKyAgICBTaXplcy5BZGQoMCk7DQorICAgIFByb2Nlc3NlZC5BZGQocmVzdWx0ID09IFNfT0spOw0KKyAgICBBZGREaWdlc3QoKTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCit2b2lkIENGb2xkZXJJblN0cmVhbTo6QWRkRGlnZXN0KCkNCit7DQorICBDUkNzLkFkZChfaW5TdHJlYW1XaXRoSGFzaFNwZWMtPkdldENSQygpKTsNCit9DQorDQorSFJFU1VMVCBDRm9sZGVySW5TdHJlYW06OkNsb3NlU3RyZWFtKCkNCit7DQorICBSSU5PSyhfdXBkYXRlQ2FsbGJhY2stPlNldE9wZXJhdGlvblJlc3VsdChOQXJjaGl2ZTo6TlVwZGF0ZTo6Tk9wZXJhdGlvblJlc3VsdDo6a09LKSk7DQorICBfaW5TdHJlYW1XaXRoSGFzaFNwZWMtPlJlbGVhc2VTdHJlYW0oKTsNCisgIF9maWxlSXNPcGVuID0gZmFsc2U7DQorICBfY3VycmVudFNpemVJc0RlZmluZWQgPSBmYWxzZTsNCisgIFByb2Nlc3NlZC5BZGQodHJ1ZSk7DQorICBTaXplcy5BZGQoX2ZpbGVQb3MpOw0KKyAgQWRkRGlnZXN0KCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENGb2xkZXJJblN0cmVhbTo6UmVhZCh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIGlmIChwcm9jZXNzZWRTaXplICE9IDApDQorICAgICpwcm9jZXNzZWRTaXplID0gMDsNCisgIHdoaWxlIChzaXplID4gMCkNCisgIHsNCisgICAgaWYgKF9maWxlSXNPcGVuKQ0KKyAgICB7DQorICAgICAgVUludDMyIHByb2Nlc3NlZDI7DQorICAgICAgUklOT0soX2luU3RyZWFtV2l0aEhhc2gtPlJlYWQoZGF0YSwgc2l6ZSwgJnByb2Nlc3NlZDIpKTsNCisgICAgICBpZiAocHJvY2Vzc2VkMiA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgIFJJTk9LKENsb3NlU3RyZWFtKCkpOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChwcm9jZXNzZWRTaXplICE9IDApDQorICAgICAgICAqcHJvY2Vzc2VkU2l6ZSA9IHByb2Nlc3NlZDI7DQorICAgICAgX2ZpbGVQb3MgKz0gcHJvY2Vzc2VkMjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoX2ZpbGVJbmRleCA+PSBfbnVtRmlsZXMpDQorICAgICAgYnJlYWs7DQorICAgIFJJTk9LKE9wZW5TdHJlYW0oKSk7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENGb2xkZXJJblN0cmVhbTo6R2V0U3ViU3RyZWFtU2l6ZShVSW50NjQgc3ViU3RyZWFtLCBVSW50NjQgKnZhbHVlKQ0KK3sNCisgICp2YWx1ZSA9IDA7DQorICB1bnNpZ25lZCBpbmRleDIgPSAodW5zaWduZWQpc3ViU3RyZWFtOw0KKyAgaWYgKHN1YlN0cmVhbSA+IFNpemVzLlNpemUoKSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIGlmIChpbmRleDIgPCBTaXplcy5TaXplKCkpDQorICB7DQorICAgICp2YWx1ZSA9IFNpemVzW2luZGV4Ml07DQorICAgIHJldHVybiBTX09LOw0KKyAgfQ0KKyAgaWYgKCFfY3VycmVudFNpemVJc0RlZmluZWQpDQorICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgKnZhbHVlID0gX2N1cnJlbnRTaXplOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK319DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6Rm9sZGVySW5TdHJlYW0uaCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekZvbGRlckluU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxNmRmZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekZvbGRlckluU3RyZWFtLmgKQEAgLTAsMCArMSw1OCBAQAorLy8gN3pGb2xkZXJJblN0cmVhbS5oDQorDQorI2lmbmRlZiBfXzdaX0ZPTERFUl9JTl9TVFJFQU1fSA0KKyNkZWZpbmUgX183Wl9GT0xERVJfSU5fU1RSRUFNX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vSUNvZGVyLmgiDQorI2luY2x1ZGUgIi4uL0lBcmNoaXZlLmgiDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9JblN0cmVhbVdpdGhDUkMuaCINCisNCisjaW5jbHVkZSAiN3pJdGVtLmgiDQorDQorbmFtZXNwYWNlIE5BcmNoaXZlIHsNCituYW1lc3BhY2UgTjd6IHsNCisNCitjbGFzcyBDRm9sZGVySW5TdHJlYW06DQorICBwdWJsaWMgSVNlcXVlbnRpYWxJblN0cmVhbSwNCisgIHB1YmxpYyBJQ29tcHJlc3NHZXRTdWJTdHJlYW1TaXplLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBDU2VxdWVudGlhbEluU3RyZWFtV2l0aENSQyAqX2luU3RyZWFtV2l0aEhhc2hTcGVjOw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IF9pblN0cmVhbVdpdGhIYXNoOw0KKyAgQ015Q29tUHRyPElBcmNoaXZlVXBkYXRlQ2FsbGJhY2s+IF91cGRhdGVDYWxsYmFjazsNCisNCisgIGJvb2wgX2N1cnJlbnRTaXplSXNEZWZpbmVkOw0KKyAgYm9vbCBfZmlsZUlzT3BlbjsNCisgIFVJbnQ2NCBfY3VycmVudFNpemU7DQorICBVSW50NjQgX2ZpbGVQb3M7DQorICBjb25zdCBVSW50MzIgKl9maWxlSW5kaWNlczsNCisgIFVJbnQzMiBfbnVtRmlsZXM7DQorICBVSW50MzIgX2ZpbGVJbmRleDsNCisNCisgIEhSRVNVTFQgT3BlblN0cmVhbSgpOw0KKyAgSFJFU1VMVCBDbG9zZVN0cmVhbSgpOw0KKyAgdm9pZCBBZGREaWdlc3QoKTsNCisNCitwdWJsaWM6DQorICBDUmVjb3JkVmVjdG9yPGJvb2w+IFByb2Nlc3NlZDsNCisgIENSZWNvcmRWZWN0b3I8VUludDMyPiBDUkNzOw0KKyAgQ1JlY29yZFZlY3RvcjxVSW50NjQ+IFNpemVzOw0KKw0KKyAgTVlfVU5LTk9XTl9JTVAxKElDb21wcmVzc0dldFN1YlN0cmVhbVNpemUpDQorICBTVERNRVRIT0QoUmVhZCkodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorICBTVERNRVRIT0QoR2V0U3ViU3RyZWFtU2l6ZSkoVUludDY0IHN1YlN0cmVhbSwgVUludDY0ICp2YWx1ZSk7DQorDQorICBDRm9sZGVySW5TdHJlYW0oKTsNCisgIHZvaWQgSW5pdChJQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrICp1cGRhdGVDYWxsYmFjaywgY29uc3QgVUludDMyICpmaWxlSW5kaWNlcywgVUludDMyIG51bUZpbGVzKTsNCisgIFVJbnQ2NCBHZXRGdWxsU2l6ZSgpIGNvbnN0DQorICB7DQorICAgIFVJbnQ2NCBzaXplID0gMDsNCisgICAgRk9SX1ZFQ1RPUiAoaSwgU2l6ZXMpDQorICAgICAgc2l6ZSArPSBTaXplc1tpXTsNCisgICAgcmV0dXJuIHNpemU7DQorICB9DQorfTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekZvbGRlck91dFN0cmVhbS5jcHAgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pGb2xkZXJPdXRTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDZkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pGb2xkZXJPdXRTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTQ5IEBACisvLyA3ekZvbGRlck91dFN0cmVhbS5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIjd6Rm9sZGVyT3V0U3RyZWFtLmgiDQorDQorbmFtZXNwYWNlIE5BcmNoaXZlIHsNCituYW1lc3BhY2UgTjd6IHsNCisNCitDRm9sZGVyT3V0U3RyZWFtOjpDRm9sZGVyT3V0U3RyZWFtKCkNCit7DQorICBfY3JjU3RyZWFtU3BlYyA9IG5ldyBDT3V0U3RyZWFtV2l0aENSQzsNCisgIF9jcmNTdHJlYW0gPSBfY3JjU3RyZWFtU3BlYzsNCit9DQorDQorSFJFU1VMVCBDRm9sZGVyT3V0U3RyZWFtOjpJbml0KA0KKyAgICBjb25zdCBDRGJFeCAqZGIsDQorICAgIFVJbnQzMiByZWYyT2Zmc2V0LCBVSW50MzIgc3RhcnRJbmRleCwNCisgICAgY29uc3QgQ0Jvb2xWZWN0b3IgKmV4dHJhY3RTdGF0dXNlcywNCisgICAgSUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2sgKmV4dHJhY3RDYWxsYmFjaywNCisgICAgYm9vbCB0ZXN0TW9kZSwgYm9vbCBjaGVja0NyYykNCit7DQorICBfZGIgPSBkYjsNCisgIF9yZWYyT2Zmc2V0ID0gcmVmMk9mZnNldDsNCisgIF9zdGFydEluZGV4ID0gc3RhcnRJbmRleDsNCisNCisgIF9leHRyYWN0U3RhdHVzZXMgPSBleHRyYWN0U3RhdHVzZXM7DQorICBfZXh0cmFjdENhbGxiYWNrID0gZXh0cmFjdENhbGxiYWNrOw0KKyAgX3Rlc3RNb2RlID0gdGVzdE1vZGU7DQorICBfY2hlY2tDcmMgPSBjaGVja0NyYzsNCisNCisgIF9jdXJyZW50SW5kZXggPSAwOw0KKyAgX2ZpbGVJc09wZW4gPSBmYWxzZTsNCisgIHJldHVybiBQcm9jZXNzRW1wdHlGaWxlcygpOw0KK30NCisNCitIUkVTVUxUIENGb2xkZXJPdXRTdHJlYW06Ok9wZW5GaWxlKCkNCit7DQorICBJbnQzMiBhc2tNb2RlID0gKCgqX2V4dHJhY3RTdGF0dXNlcylbX2N1cnJlbnRJbmRleF0pID8gKF90ZXN0TW9kZSA/DQorICAgICAgTkV4dHJhY3Q6Ok5Bc2tNb2RlOjprVGVzdCA6DQorICAgICAgTkV4dHJhY3Q6Ok5Bc2tNb2RlOjprRXh0cmFjdCkgOg0KKyAgICAgIE5FeHRyYWN0OjpOQXNrTW9kZTo6a1NraXA7DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IHJlYWxPdXRTdHJlYW07DQorICBVSW50MzIgaW5kZXggPSBfc3RhcnRJbmRleCArIF9jdXJyZW50SW5kZXg7DQorICBSSU5PSyhfZXh0cmFjdENhbGxiYWNrLT5HZXRTdHJlYW0oX3JlZjJPZmZzZXQgKyBpbmRleCwgJnJlYWxPdXRTdHJlYW0sIGFza01vZGUpKTsNCisgIF9jcmNTdHJlYW1TcGVjLT5TZXRTdHJlYW0ocmVhbE91dFN0cmVhbSk7DQorICBfY3JjU3RyZWFtU3BlYy0+SW5pdChfY2hlY2tDcmMpOw0KKyAgX2ZpbGVJc09wZW4gPSB0cnVlOw0KKyAgY29uc3QgQ0ZpbGVJdGVtICZmaSA9IF9kYi0+RmlsZXNbaW5kZXhdOw0KKyAgX3JlbSA9IGZpLlNpemU7DQorICBpZiAoYXNrTW9kZSA9PSBORXh0cmFjdDo6TkFza01vZGU6OmtFeHRyYWN0ICYmICFyZWFsT3V0U3RyZWFtICYmDQorICAgICAgIV9kYi0+SXNJdGVtQW50aShpbmRleCkgJiYgIWZpLklzRGlyKQ0KKyAgICBhc2tNb2RlID0gTkV4dHJhY3Q6Ok5Bc2tNb2RlOjprU2tpcDsNCisgIHJldHVybiBfZXh0cmFjdENhbGxiYWNrLT5QcmVwYXJlT3BlcmF0aW9uKGFza01vZGUpOw0KK30NCisNCitIUkVTVUxUIENGb2xkZXJPdXRTdHJlYW06OkNsb3NlRmlsZUFuZFNldFJlc3VsdChJbnQzMiByZXMpDQorew0KKyAgX2NyY1N0cmVhbVNwZWMtPlJlbGVhc2VTdHJlYW0oKTsNCisgIF9maWxlSXNPcGVuID0gZmFsc2U7DQorICBfY3VycmVudEluZGV4Kys7DQorICByZXR1cm4gX2V4dHJhY3RDYWxsYmFjay0+U2V0T3BlcmF0aW9uUmVzdWx0KHJlcyk7DQorfQ0KKw0KK0hSRVNVTFQgQ0ZvbGRlck91dFN0cmVhbTo6Q2xvc2VGaWxlQW5kU2V0UmVzdWx0KCkNCit7DQorICBjb25zdCBDRmlsZUl0ZW0gJmZpID0gX2RiLT5GaWxlc1tfc3RhcnRJbmRleCArIF9jdXJyZW50SW5kZXhdOw0KKyAgcmV0dXJuIENsb3NlRmlsZUFuZFNldFJlc3VsdCgNCisgICAgICAoZmkuSXNEaXIgfHwgIWZpLkNyY0RlZmluZWQgfHwgIV9jaGVja0NyYyB8fCBmaS5DcmMgPT0gX2NyY1N0cmVhbVNwZWMtPkdldENSQygpKSA/DQorICAgICAgTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtPSyA6DQorICAgICAgTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtDUkNFcnJvcik7DQorfQ0KKw0KK0hSRVNVTFQgQ0ZvbGRlck91dFN0cmVhbTo6UHJvY2Vzc0VtcHR5RmlsZXMoKQ0KK3sNCisgIHdoaWxlIChfY3VycmVudEluZGV4IDwgX2V4dHJhY3RTdGF0dXNlcy0+U2l6ZSgpICYmIF9kYi0+RmlsZXNbX3N0YXJ0SW5kZXggKyBfY3VycmVudEluZGV4XS5TaXplID09IDApDQorICB7DQorICAgIFJJTk9LKE9wZW5GaWxlKCkpOw0KKyAgICBSSU5PSyhDbG9zZUZpbGVBbmRTZXRSZXN1bHQoKSk7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENGb2xkZXJPdXRTdHJlYW06OldyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgaWYgKHByb2Nlc3NlZFNpemUgIT0gTlVMTCkNCisgICAgKnByb2Nlc3NlZFNpemUgPSAwOw0KKyAgd2hpbGUgKHNpemUgIT0gMCkNCisgIHsNCisgICAgaWYgKF9maWxlSXNPcGVuKQ0KKyAgICB7DQorICAgICAgVUludDMyIGN1ciA9IHNpemUgPCBfcmVtID8gc2l6ZSA6IChVSW50MzIpX3JlbTsNCisgICAgICBSSU5PSyhfY3JjU3RyZWFtLT5Xcml0ZShkYXRhLCBjdXIsICZjdXIpKTsNCisgICAgICBpZiAoY3VyID09IDApDQorICAgICAgICBicmVhazsNCisgICAgICBkYXRhID0gKGNvbnN0IEJ5dGUgKilkYXRhICsgY3VyOw0KKyAgICAgIHNpemUgLT0gY3VyOw0KKyAgICAgIF9yZW0gLT0gY3VyOw0KKyAgICAgIGlmIChwcm9jZXNzZWRTaXplICE9IE5VTEwpDQorICAgICAgICAqcHJvY2Vzc2VkU2l6ZSArPSBjdXI7DQorICAgICAgaWYgKF9yZW0gPT0gMCkNCisgICAgICB7DQorICAgICAgICBSSU5PSyhDbG9zZUZpbGVBbmRTZXRSZXN1bHQoKSk7DQorICAgICAgICBSSU5PSyhQcm9jZXNzRW1wdHlGaWxlcygpKTsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBSSU5PSyhQcm9jZXNzRW1wdHlGaWxlcygpKTsNCisgICAgICBpZiAoX2N1cnJlbnRJbmRleCA9PSBfZXh0cmFjdFN0YXR1c2VzLT5TaXplKCkpDQorICAgICAgew0KKyAgICAgICAgLy8gd2Ugc3VwcG9ydCBwYXJ0aWFsIGV4dHJhY3RpbmcNCisgICAgICAgIGlmIChwcm9jZXNzZWRTaXplICE9IE5VTEwpDQorICAgICAgICAgICpwcm9jZXNzZWRTaXplICs9IHNpemU7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgUklOT0soT3BlbkZpbGUoKSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0ZvbGRlck91dFN0cmVhbTo6R2V0U3ViU3RyZWFtU2l6ZShVSW50NjQgc3ViU3RyZWFtLCBVSW50NjQgKnZhbHVlKQ0KK3sNCisgICp2YWx1ZSA9IDA7DQorICBpZiAoKGludClzdWJTdHJlYW0gPj0gX2V4dHJhY3RTdGF0dXNlcy0+U2l6ZSgpKQ0KKyAgICByZXR1cm4gU19GQUxTRTsNCisgICp2YWx1ZSA9IF9kYi0+RmlsZXNbX3N0YXJ0SW5kZXggKyAoaW50KXN1YlN0cmVhbV0uU2l6ZTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENGb2xkZXJPdXRTdHJlYW06OkZsdXNoQ29ycnVwdGVkKEludDMyIHJlc3VsdEVPcGVyYXRpb25SZXN1bHQpDQorew0KKyAgd2hpbGUgKF9jdXJyZW50SW5kZXggPCBfZXh0cmFjdFN0YXR1c2VzLT5TaXplKCkpDQorICB7DQorICAgIGlmIChfZmlsZUlzT3BlbikNCisgICAgew0KKyAgICAgIFJJTk9LKENsb3NlRmlsZUFuZFNldFJlc3VsdChyZXN1bHRFT3BlcmF0aW9uUmVzdWx0KSk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgUklOT0soT3BlbkZpbGUoKSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCit9fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekZvbGRlck91dFN0cmVhbS5oIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6Rm9sZGVyT3V0U3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwYWJhNwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekZvbGRlck91dFN0cmVhbS5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIDd6Rm9sZGVyT3V0U3RyZWFtLmgNCisNCisjaWZuZGVmIF9fN1pfRk9MREVSX09VVF9TVFJFQU1fSA0KKyNkZWZpbmUgX183Wl9GT0xERVJfT1VUX1NUUkVBTV9IDQorDQorI2luY2x1ZGUgIi4uLy4uL0lTdHJlYW0uaCINCisjaW5jbHVkZSAiLi4vSUFyY2hpdmUuaCINCisjaW5jbHVkZSAiLi4vQ29tbW9uL091dFN0cmVhbVdpdGhDUkMuaCINCisNCisjaW5jbHVkZSAiN3pJbi5oIg0KKw0KK25hbWVzcGFjZSBOQXJjaGl2ZSB7DQorbmFtZXNwYWNlIE43eiB7DQorDQorY2xhc3MgQ0ZvbGRlck91dFN0cmVhbToNCisgIHB1YmxpYyBJU2VxdWVudGlhbE91dFN0cmVhbSwNCisgIHB1YmxpYyBJQ29tcHJlc3NHZXRTdWJTdHJlYW1TaXplLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBDT3V0U3RyZWFtV2l0aENSQyAqX2NyY1N0cmVhbVNwZWM7DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IF9jcmNTdHJlYW07DQorICBjb25zdCBDRGJFeCAqX2RiOw0KKyAgY29uc3QgQ0Jvb2xWZWN0b3IgKl9leHRyYWN0U3RhdHVzZXM7DQorICBDTXlDb21QdHI8SUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2s+IF9leHRyYWN0Q2FsbGJhY2s7DQorICBVSW50MzIgX3JlZjJPZmZzZXQ7DQorICBVSW50MzIgX3N0YXJ0SW5kZXg7DQorICB1bnNpZ25lZCBfY3VycmVudEluZGV4Ow0KKyAgYm9vbCBfdGVzdE1vZGU7DQorICBib29sIF9jaGVja0NyYzsNCisgIGJvb2wgX2ZpbGVJc09wZW47DQorICBVSW50NjQgX3JlbTsNCisNCisgIEhSRVNVTFQgT3BlbkZpbGUoKTsNCisgIEhSRVNVTFQgQ2xvc2VGaWxlQW5kU2V0UmVzdWx0KEludDMyIHJlcyk7DQorICBIUkVTVUxUIENsb3NlRmlsZUFuZFNldFJlc3VsdCgpOw0KKyAgSFJFU1VMVCBQcm9jZXNzRW1wdHlGaWxlcygpOw0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QMShJQ29tcHJlc3NHZXRTdWJTdHJlYW1TaXplKQ0KKw0KKyAgQ0ZvbGRlck91dFN0cmVhbSgpOw0KKw0KKyAgU1RETUVUSE9EKFdyaXRlKShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCisgIFNURE1FVEhPRChHZXRTdWJTdHJlYW1TaXplKShVSW50NjQgc3ViU3RyZWFtLCBVSW50NjQgKnZhbHVlKTsNCisNCisgIEhSRVNVTFQgSW5pdCgNCisgICAgICBjb25zdCBDRGJFeCAqZGIsDQorICAgICAgVUludDMyIHJlZjJPZmZzZXQsIFVJbnQzMiBzdGFydEluZGV4LA0KKyAgICAgIGNvbnN0IENCb29sVmVjdG9yICpleHRyYWN0U3RhdHVzZXMsDQorICAgICAgSUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2sgKmV4dHJhY3RDYWxsYmFjaywNCisgICAgICBib29sIHRlc3RNb2RlLCBib29sIGNoZWNrQ3JjKTsNCisgIEhSRVNVTFQgRmx1c2hDb3JydXB0ZWQoSW50MzIgcmVzdWx0RU9wZXJhdGlvblJlc3VsdCk7DQorICBIUkVTVUxUIFdhc1dyaXRpbmdGaW5pc2hlZCgpIGNvbnN0DQorICAgICAgeyByZXR1cm4gKF9jdXJyZW50SW5kZXggPT0gX2V4dHJhY3RTdGF0dXNlcy0+U2l6ZSgpKSA/IFNfT0s6IEVfRkFJTDsgfQ0KK307DQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pIYW5kbGVyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekhhbmRsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDQ0NDAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pIYW5kbGVyLmNwcApAQCAtMCwwICsxLDc1MyBAQAorLy8gN3pIYW5kbGVyLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vQy9DcHVBcmNoLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9Db21UcnkuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0ludFRvU3RyaW5nLmgiDQorDQorI2lmbmRlZiBfXzdaX1NFVF9QUk9QRVJUSUVTDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvU3lzdGVtLmgiDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9JdGVtTmFtZVV0aWxzLmgiDQorDQorI2luY2x1ZGUgIjd6SGFuZGxlci5oIg0KKyNpbmNsdWRlICI3elByb3BlcnRpZXMuaCINCisNCisjaWZkZWYgX183Wl9TRVRfUFJPUEVSVElFUw0KKyNpZmRlZiBFWFRSQUNUX09OTFkNCisjaW5jbHVkZSAiLi4vQ29tbW9uL1BhcnNlUHJvcGVydGllcy5oIg0KKyNlbmRpZg0KKyNlbmRpZg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCit1c2luZyBuYW1lc3BhY2UgTkNPTTsNCisNCituYW1lc3BhY2UgTkFyY2hpdmUgew0KK25hbWVzcGFjZSBON3ogew0KKw0KK0NIYW5kbGVyOjpDSGFuZGxlcigpDQorew0KKyAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICBfaXNFbmNyeXB0ZWQgPSBmYWxzZTsNCisgIF9wYXNzd29yZElzRGVmaW5lZCA9IGZhbHNlOw0KKyAgI2VuZGlmDQorDQorICAjaWZkZWYgRVhUUkFDVF9PTkxZDQorICBfY3JjU2l6ZSA9IDQ7DQorICAjaWZkZWYgX183Wl9TRVRfUFJPUEVSVElFUw0KKyAgX251bVRocmVhZHMgPSBOU3lzdGVtOjpHZXROdW1iZXJPZlByb2Nlc3NvcnMoKTsNCisgICNlbmRpZg0KKyAgI2VuZGlmDQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0TnVtYmVyT2ZJdGVtcyhVSW50MzIgKm51bUl0ZW1zKQ0KK3sNCisgICpudW1JdGVtcyA9IF9kYi5GaWxlcy5TaXplKCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorI2lmZGVmIF9TRlgNCisNCitJTVBfSUluQXJjaGl2ZV9BcmNQcm9wc19OT19UYWJsZQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0TnVtYmVyT2ZQcm9wZXJ0aWVzKFVJbnQzMiAqbnVtUHJvcHMpDQorew0KKyAgKm51bVByb3BzID0gMDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkdldFByb3BlcnR5SW5mbyhVSW50MzIgLyogaW5kZXggKi8sDQorICAgICAgQlNUUiAqIC8qIG5hbWUgKi8sIFBST1BJRCAqIC8qIHByb3BJRCAqLywgVkFSVFlQRSAqIC8qIHZhclR5cGUgKi8pDQorew0KKyAgcmV0dXJuIEVfTk9USU1QTDsNCit9DQorDQorI2Vsc2UNCisNCitzdGF0aWMgY29uc3QgQnl0ZSBrQXJjUHJvcHNbXSA9DQorew0KKyAga3BpZEhlYWRlcnNTaXplLA0KKyAga3BpZE1ldGhvZCwNCisgIGtwaWRTb2xpZCwNCisgIGtwaWROdW1CbG9ja3MNCisgIC8vICwga3BpZElzVHJlZQ0KK307DQorDQorSU1QX0lJbkFyY2hpdmVfQXJjUHJvcHMNCisNCitzdGF0aWMgaW5saW5lIGNoYXIgR2V0SGV4KHVuc2lnbmVkIHZhbHVlKQ0KK3sNCisgIHJldHVybiAoY2hhcikoKHZhbHVlIDwgMTApID8gKCcwJyArIHZhbHVlKSA6ICgnQScgKyAodmFsdWUgLSAxMCkpKTsNCit9DQorDQorc3RhdGljIHVuc2lnbmVkIENvbnZlcnRNZXRob2RJZFRvU3RyaW5nX0JhY2soY2hhciAqcywgVUludDY0IGlkKQ0KK3sNCisgIGludCBsZW4gPSAwOw0KKyAgZG8NCisgIHsNCisgICAgc1stLWxlbl0gPSBHZXRIZXgoKHVuc2lnbmVkKWlkICYgMHhGKTsgaWQgPj49IDQ7DQorICAgIHNbLS1sZW5dID0gR2V0SGV4KCh1bnNpZ25lZClpZCAmIDB4Rik7IGlkID4+PSA0Ow0KKyAgfQ0KKyAgd2hpbGUgKGlkICE9IDApOw0KKyAgcmV0dXJuICh1bnNpZ25lZCktbGVuOw0KK30NCisNCitzdGF0aWMgdm9pZCBDb252ZXJ0TWV0aG9kSWRUb1N0cmluZyhBU3RyaW5nICZyZXMsIFVJbnQ2NCBpZCkNCit7DQorICBjb25zdCB1bnNpZ25lZCBrTGVuID0gMzI7DQorICBjaGFyIHNba0xlbl07DQorICB1bnNpZ25lZCBsZW4gPSBrTGVuIC0gMTsNCisgIHNbbGVuXSA9IDA7DQorICByZXMgKz0gcyArIGxlbiAtIENvbnZlcnRNZXRob2RJZFRvU3RyaW5nX0JhY2socyArIGxlbiwgaWQpOw0KK30NCisNCitzdGF0aWMgdW5zaWduZWQgR2V0U3RyaW5nRm9yU2l6ZVZhbHVlKGNoYXIgKnMsIFVJbnQzMiB2YWwpDQorew0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IGkgPD0gMzE7IGkrKykNCisgICAgaWYgKCgoVUludDMyKTEgPDwgaSkgPT0gdmFsKQ0KKyAgICB7DQorICAgICAgaWYgKGkgPCAxMCkNCisgICAgICB7DQorICAgICAgICBzWzBdID0gKGNoYXIpKCcwJyArIGkpOw0KKyAgICAgICAgc1sxXSA9IDA7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgICB9DQorICAgICAgICAgICBpZiAoaSA8IDIwKSB7IHNbMF0gPSAnMSc7IHNbMV0gPSAoY2hhcikoJzAnICsgaSAtIDEwKTsgfQ0KKyAgICAgIGVsc2UgaWYgKGkgPCAzMCkgeyBzWzBdID0gJzInOyBzWzFdID0gKGNoYXIpKCcwJyArIGkgLSAyMCk7IH0NCisgICAgICBlbHNlICAgICAgICAgICAgIHsgc1swXSA9ICczJzsgc1sxXSA9IChjaGFyKSgnMCcgKyBpIC0gMzApOyB9DQorICAgICAgc1syXSA9IDA7DQorICAgICAgcmV0dXJuIDI7DQorICAgIH0NCisgIGNoYXIgYyA9ICdiJzsNCisgIGlmICAgICAgKCh2YWwgJiAoKDEgPDwgMjApIC0gMSkpID09IDApIHsgdmFsID4+PSAyMDsgYyA9ICdtJzsgfQ0KKyAgZWxzZSBpZiAoKHZhbCAmICgoMSA8PCAxMCkgLSAxKSkgPT0gMCkgeyB2YWwgPj49IDEwOyBjID0gJ2snOyB9DQorICA6OkNvbnZlcnRVSW50MzJUb1N0cmluZyh2YWwsIHMpOw0KKyAgdW5zaWduZWQgcG9zID0gTXlTdHJpbmdMZW4ocyk7DQorICBzW3BvcysrXSA9IGM7DQorICBzW3Bvc10gPSAwOw0KKyAgcmV0dXJuIHBvczsNCit9DQorDQorLyoNCitzdGF0aWMgaW5saW5lIHZvaWQgQWRkSGV4VG9TdHJpbmcoVVN0cmluZyAmcmVzLCBCeXRlIHZhbHVlKQ0KK3sNCisgIHJlcyArPSBHZXRIZXgoKEJ5dGUpKHZhbHVlID4+IDQpKTsNCisgIHJlcyArPSBHZXRIZXgoKEJ5dGUpKHZhbHVlICYgMHhGKSk7DQorfQ0KKyovDQorDQorc3RhdGljIGNoYXIgKkFkZFByb3AzMihjaGFyICpzLCBjb25zdCBjaGFyICpuYW1lLCBVSW50MzIgdikNCit7DQorICAqcysrID0gJzonOw0KKyAgcyA9IE15U3RwQ3B5KHMsIG5hbWUpOw0KKyAgOjpDb252ZXJ0VUludDMyVG9TdHJpbmcodiwgcyk7DQorICByZXR1cm4gcyArIE15U3RyaW5nTGVuKHMpOw0KK30NCisgDQordm9pZCBDSGFuZGxlcjo6QWRkTWV0aG9kTmFtZShBU3RyaW5nICZzLCBVSW50NjQgaWQpDQorew0KKyAgVVN0cmluZyBtZXRob2ROYW1lOw0KKyAgRmluZE1ldGhvZChFWFRFUk5BTF9DT0RFQ1NfVkFSUyBpZCwgbWV0aG9kTmFtZSk7DQorICBpZiAobWV0aG9kTmFtZS5Jc0VtcHR5KCkpDQorICB7DQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtZXRob2ROYW1lLkxlbigpOyBpKyspDQorICAgICAgaWYgKG1ldGhvZE5hbWVbaV0gPj0gMHg4MCkNCisgICAgICB7DQorICAgICAgICBtZXRob2ROYW1lLkVtcHR5KCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICB9DQorICBpZiAobWV0aG9kTmFtZS5Jc0VtcHR5KCkpDQorICAgIENvbnZlcnRNZXRob2RJZFRvU3RyaW5nKHMsIGlkKTsNCisgIGVsc2UNCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1ldGhvZE5hbWUuTGVuKCk7IGkrKykNCisgICAgICBzICs9IChjaGFyKW1ldGhvZE5hbWVbaV07DQorfQ0KKw0KKyNlbmRpZg0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0QXJjaGl2ZVByb3BlcnR5KFBST1BJRCBwcm9wSUQsIFBST1BWQVJJQU5UICp2YWx1ZSkNCit7DQorICAjaWZuZGVmIF9TRlgNCisgIENPTV9UUllfQkVHSU4NCisgICNlbmRpZg0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBzd2l0Y2ggKHByb3BJRCkNCisgIHsNCisgICAgI2lmbmRlZiBfU0ZYDQorICAgIGNhc2Uga3BpZE1ldGhvZDoNCisgICAgew0KKyAgICAgIEFTdHJpbmcgczsNCisgICAgICBjb25zdCBDUGFyc2VkTWV0aG9kcyAmcG0gPSBfZGIuUGFyc2VkTWV0aG9kczsNCisgICAgICBGT1JfVkVDVE9SIChpLCBwbS5JRHMpDQorICAgICAgew0KKyAgICAgICAgVUludDY0IGlkID0gcG0uSURzW2ldOw0KKyAgICAgICAgaWYgKCFzLklzRW1wdHkoKSkNCisgICAgICAgICAgcyArPSAnICc7DQorICAgICAgICBjaGFyIHRlbXBbMTZdOw0KKyAgICAgICAgaWYgKGlkID09IGtfTFpNQTIpDQorICAgICAgICB7DQorICAgICAgICAgIHMgKz0gIkxaTUEyOiI7DQorICAgICAgICAgIGlmICgocG0uTHptYTJQcm9wICYgMSkgPT0gMCkNCisgICAgICAgICAgICBDb252ZXJ0VUludDMyVG9TdHJpbmcoKHBtLkx6bWEyUHJvcCA+PiAxKSArIDEyLCB0ZW1wKTsNCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIEdldFN0cmluZ0ZvclNpemVWYWx1ZSh0ZW1wLCAzIDw8ICgocG0uTHptYTJQcm9wID4+IDEpICsgMTEpKTsNCisgICAgICAgICAgcyArPSB0ZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSBpZiAoaWQgPT0ga19MWk1BKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBzICs9ICJMWk1BOiI7DQorICAgICAgICAgIEdldFN0cmluZ0ZvclNpemVWYWx1ZSh0ZW1wLCBwbS5Mem1hRGljKTsNCisgICAgICAgICAgcyArPSB0ZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICBBZGRNZXRob2ROYW1lKHMsIGlkKTsNCisgICAgICB9DQorICAgICAgcHJvcCA9IHM7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBrcGlkU29saWQ6IHByb3AgPSBfZGIuSXNTb2xpZCgpOyBicmVhazsNCisgICAgY2FzZSBrcGlkTnVtQmxvY2tzOiBwcm9wID0gKFVJbnQzMilfZGIuTnVtRm9sZGVyczsgYnJlYWs7DQorICAgIGNhc2Uga3BpZEhlYWRlcnNTaXplOiAgcHJvcCA9IF9kYi5IZWFkZXJzU2l6ZTsgYnJlYWs7DQorICAgIGNhc2Uga3BpZFBoeVNpemU6ICBwcm9wID0gX2RiLlBoeVNpemU7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRPZmZzZXQ6IGlmIChfZGIuQXJjSW5mby5TdGFydFBvc2l0aW9uICE9IDApIHByb3AgPSBfZGIuQXJjSW5mby5TdGFydFBvc2l0aW9uOyBicmVhazsNCisgICAgLyoNCisgICAgY2FzZSBrcGlkSXNUcmVlOiBpZiAoX2RiLklzVHJlZSkgcHJvcCA9IHRydWU7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRJc0FsdFN0cmVhbTogaWYgKF9kYi5UaGVyZUFyZUFsdFN0cmVhbXMpIHByb3AgPSB0cnVlOyBicmVhazsNCisgICAgY2FzZSBrcGlkSXNBdXg6IGlmIChfZGIuSXNUcmVlKSBwcm9wID0gdHJ1ZTsgYnJlYWs7DQorICAgICovDQorICAgIC8vIGNhc2Uga3BpZEVycm9yOiBpZiAoX2RiLlRoZXJlSXNIZWFkZXJFcnJvcikgcHJvcCA9ICJIZWFkZXIgZXJyb3IiOyBicmVhazsNCisgICAgI2VuZGlmDQorICAgIA0KKyAgICBjYXNlIGtwaWRXYXJuaW5nRmxhZ3M6DQorICAgIHsNCisgICAgICBVSW50MzIgdiA9IDA7DQorICAgICAgaWYgKF9kYi5TdGFydEhlYWRlcldhc1JlY292ZXJlZCkgdiB8PSBrcHZfRXJyb3JGbGFnc19IZWFkZXJzRXJyb3I7DQorICAgICAgaWYgKF9kYi5VbnN1cHBvcnRlZEZlYXR1cmVXYXJuaW5nKSB2IHw9IGtwdl9FcnJvckZsYWdzX1Vuc3VwcG9ydGVkRmVhdHVyZTsNCisgICAgICBpZiAodiAhPSAwKQ0KKyAgICAgICAgcHJvcCA9IHY7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgDQorICAgIGNhc2Uga3BpZEVycm9yRmxhZ3M6DQorICAgIHsNCisgICAgICBVSW50MzIgdiA9IDA7DQorICAgICAgaWYgKCFfZGIuSXNBcmMpIHYgfD0ga3B2X0Vycm9yRmxhZ3NfSXNOb3RBcmM7DQorICAgICAgaWYgKF9kYi5UaGVyZUlzSGVhZGVyRXJyb3IpIHYgfD0ga3B2X0Vycm9yRmxhZ3NfSGVhZGVyc0Vycm9yOw0KKyAgICAgIGlmIChfZGIuVW5leHBlY3RlZEVuZCkgdiB8PSBrcHZfRXJyb3JGbGFnc19VbmV4cGVjdGVkRW5kOw0KKyAgICAgIC8vIGlmIChfZGIuVW5zdXBwb3J0ZWRWZXJzaW9uKSB2IHw9IGtwdl9FcnJvckZsYWdzX1Vuc3VwcG9ydGVkOw0KKyAgICAgIGlmIChfZGIuVW5zdXBwb3J0ZWRGZWF0dXJlRXJyb3IpIHYgfD0ga3B2X0Vycm9yRmxhZ3NfVW5zdXBwb3J0ZWRGZWF0dXJlOw0KKyAgICAgIHByb3AgPSB2Ow0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBwcm9wLkRldGFjaCh2YWx1ZSk7DQorICByZXR1cm4gU19PSzsNCisgICNpZm5kZWYgX1NGWA0KKyAgQ09NX1RSWV9FTkQNCisgICNlbmRpZg0KK30NCisNCitzdGF0aWMgdm9pZCBTZXRGaWxlVGltZVByb3BfRnJvbV9VSW50NjREZWYoUFJPUFZBUklBTlQgKnByb3AsIGNvbnN0IENVSW50NjREZWZWZWN0b3IgJnYsIGludCBpbmRleCkNCit7DQorICBVSW50NjQgdmFsdWU7DQorICBpZiAodi5HZXRJdGVtKGluZGV4LCB2YWx1ZSkpDQorICAgIFByb3BWYXJFbV9TZXRfRmlsZVRpbWU2NChwcm9wLCB2YWx1ZSk7DQorfQ0KKw0KK2Jvb2wgQ0hhbmRsZXI6OklzRm9sZGVyRW5jcnlwdGVkKENOdW0gZm9sZGVySW5kZXgpIGNvbnN0DQorew0KKyAgaWYgKGZvbGRlckluZGV4ID09IGtOdW1Ob0luZGV4KQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBzaXplX3Qgc3RhcnRQb3MgPSBfZGIuRm9Db2RlcnNEYXRhT2Zmc2V0W2ZvbGRlckluZGV4XTsNCisgIGNvbnN0IEJ5dGUgKnAgPSBfZGIuQ29kZXJzRGF0YSArIHN0YXJ0UG9zOw0KKyAgc2l6ZV90IHNpemUgPSBfZGIuRm9Db2RlcnNEYXRhT2Zmc2V0W2ZvbGRlckluZGV4ICsgMV0gLSBzdGFydFBvczsNCisgIENJbkJ5dGUyIGluQnl0ZTsNCisgIGluQnl0ZS5Jbml0KHAsIHNpemUpOw0KKyAgDQorICBDTnVtIG51bUNvZGVycyA9IGluQnl0ZS5SZWFkTnVtKCk7DQorICBmb3IgKDsgbnVtQ29kZXJzICE9IDA7IG51bUNvZGVycy0tKQ0KKyAgew0KKyAgICBCeXRlIG1haW5CeXRlID0gaW5CeXRlLlJlYWRCeXRlKCk7DQorICAgIHVuc2lnbmVkIGlkU2l6ZSA9IChtYWluQnl0ZSAmIDB4Rik7DQorICAgIGNvbnN0IEJ5dGUgKmxvbmdJRCA9IGluQnl0ZS5HZXRQdHIoKTsNCisgICAgVUludDY0IGlkNjQgPSAwOw0KKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgaWRTaXplOyBqKyspDQorICAgICAgaWQ2NCA9ICgoaWQ2NCA8PCA4KSB8IGxvbmdJRFtqXSk7DQorICAgIGluQnl0ZS5Ta2lwRGF0YU5vQ2hlY2soaWRTaXplKTsNCisgICAgaWYgKGlkNjQgPT0ga19BRVMpDQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIGlmICgobWFpbkJ5dGUgJiAweDIwKSAhPSAwKQ0KKyAgICAgIGluQnl0ZS5Ta2lwRGF0YU5vQ2hlY2soaW5CeXRlLlJlYWROdW0oKSk7DQorICB9DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0TnVtUmF3UHJvcHMoVUludDMyICpudW1Qcm9wcykNCit7DQorICAqbnVtUHJvcHMgPSAwOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0UmF3UHJvcEluZm8oVUludDMyIC8qIGluZGV4ICovLCBCU1RSICpuYW1lLCBQUk9QSUQgKnByb3BJRCkNCit7DQorICAqbmFtZSA9IE5VTEw7DQorICAqcHJvcElEID0ga3BpZE50U2VjdXJlOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0UGFyZW50KFVJbnQzMiAvKiBpbmRleCAqLywgVUludDMyICpwYXJlbnQsIFVJbnQzMiAqcGFyZW50VHlwZSkNCit7DQorICAvKg0KKyAgY29uc3QgQ0ZpbGVJdGVtICZmaWxlID0gX2RiLkZpbGVzW2luZGV4XTsNCisgICpwYXJlbnRUeXBlID0gKGZpbGUuSXNBbHRTdHJlYW0gPyBOUGFyZW50VHlwZTo6a0FsdFN0cmVhbSA6IE5QYXJlbnRUeXBlOjprRGlyKTsNCisgICpwYXJlbnQgPSAoVUludDMyKShJbnQzMilmaWxlLlBhcmVudDsNCisgICovDQorICAqcGFyZW50VHlwZSA9IE5QYXJlbnRUeXBlOjprRGlyOw0KKyAgKnBhcmVudCA9IChVSW50MzIpKEludDMyKS0xOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0UmF3UHJvcChVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIGNvbnN0IHZvaWQgKipkYXRhLCBVSW50MzIgKmRhdGFTaXplLCBVSW50MzIgKnByb3BUeXBlKQ0KK3sNCisgICpkYXRhID0gTlVMTDsNCisgICpkYXRhU2l6ZSA9IDA7DQorICAqcHJvcFR5cGUgPSAwOw0KKw0KKyAgaWYgKC8qIF9kYi5Jc1RyZWUgJiYgcHJvcElEID09IGtwaWROYW1lIHx8DQorICAgICAgIV9kYi5Jc1RyZWUgJiYgKi8gcHJvcElEID09IGtwaWRQYXRoKQ0KKyAgew0KKyAgICBpZiAoX2RiLk5hbWVPZmZzZXRzICYmIF9kYi5OYW1lc0J1ZikNCisgICAgew0KKyAgICAgIHNpemVfdCBvZmZzZXQgPSBfZGIuTmFtZU9mZnNldHNbaW5kZXhdOw0KKyAgICAgIHNpemVfdCBzaXplID0gKF9kYi5OYW1lT2Zmc2V0c1tpbmRleCArIDFdIC0gb2Zmc2V0KSAqIDI7DQorICAgICAgaWYgKHNpemUgPCAoKFVJbnQzMikxIDw8IDMxKSkNCisgICAgICB7DQorICAgICAgICAqZGF0YSA9IChjb25zdCB2b2lkICopKF9kYi5OYW1lc0J1ZiArIG9mZnNldCAqIDIpOw0KKyAgICAgICAgKmRhdGFTaXplID0gKFVJbnQzMilzaXplOw0KKyAgICAgICAgKnByb3BUeXBlID0gTlByb3BEYXRhVHlwZTo6a1V0ZjE2ejsNCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFNfT0s7DQorICB9DQorICAvKg0KKyAgaWYgKHByb3BJRCA9PSBrcGlkTnRTZWN1cmUpDQorICB7DQorICAgIGlmIChpbmRleCA8IChVSW50MzIpX2RiLlNlY3VyZUlEcy5TaXplKCkpDQorICAgIHsNCisgICAgICBpbnQgaWQgPSBfZGIuU2VjdXJlSURzW2luZGV4XTsNCisgICAgICBzaXplX3Qgb2ZmcyA9IF9kYi5TZWN1cmVPZmZzZXRzW2lkXTsNCisgICAgICBzaXplX3Qgc2l6ZSA9IF9kYi5TZWN1cmVPZmZzZXRzW2lkICsgMV0gLSBvZmZzOw0KKyAgICAgIGlmIChzaXplID49IDApDQorICAgICAgew0KKyAgICAgICAgKmRhdGEgPSBfZGIuU2VjdXJlQnVmICsgb2ZmczsNCisgICAgICAgICpkYXRhU2l6ZSA9IChVSW50MzIpc2l6ZTsNCisgICAgICAgICpwcm9wVHlwZSA9IE5Qcm9wRGF0YVR5cGU6OmtSYXc7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICAqLw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKyNpZm5kZWYgX1NGWA0KKw0KK0hSRVNVTFQgQ0hhbmRsZXI6OlNldE1ldGhvZFRvUHJvcChDTnVtIGZvbGRlckluZGV4LCBQUk9QVkFSSUFOVCAqcHJvcCkgY29uc3QNCit7DQorICBQcm9wVmFyaWFudF9DbGVhcihwcm9wKTsNCisgIGlmIChmb2xkZXJJbmRleCA9PSBrTnVtTm9JbmRleCkNCisgICAgcmV0dXJuIFNfT0s7DQorICAvLyBmb3IgKGludCB0dHQgPSAwOyB0dHQgPCAxOyB0dHQrKykgew0KKyAgY29uc3QgdW5zaWduZWQga1RlbXBTaXplID0gMjU2Ow0KKyAgY2hhciB0ZW1wW2tUZW1wU2l6ZV07DQorICB1bnNpZ25lZCBwb3MgPSBrVGVtcFNpemU7DQorICB0ZW1wWy0tcG9zXSA9IDA7DQorIA0KKyAgc2l6ZV90IHN0YXJ0UG9zID0gX2RiLkZvQ29kZXJzRGF0YU9mZnNldFtmb2xkZXJJbmRleF07DQorICBjb25zdCBCeXRlICpwID0gX2RiLkNvZGVyc0RhdGEgKyBzdGFydFBvczsNCisgIHNpemVfdCBzaXplID0gX2RiLkZvQ29kZXJzRGF0YU9mZnNldFtmb2xkZXJJbmRleCArIDFdIC0gc3RhcnRQb3M7DQorICBDSW5CeXRlMiBpbkJ5dGU7DQorICBpbkJ5dGUuSW5pdChwLCBzaXplKTsNCisgIA0KKyAgLy8gbnVtQ29kZXJzID09IDAgPz8/DQorICBDTnVtIG51bUNvZGVycyA9IGluQnl0ZS5SZWFkTnVtKCk7DQorICBib29sIG5lZWRTcGFjZSA9IGZhbHNlOw0KKyAgZm9yICg7IG51bUNvZGVycyAhPSAwOyBudW1Db2RlcnMtLSwgbmVlZFNwYWNlID0gdHJ1ZSkNCisgIHsNCisgICAgaWYgKHBvcyA8IDMyKSAvLyBtYXggc2l6ZSBvZiBwcm9wZXJ0eQ0KKyAgICAgIGJyZWFrOw0KKyAgICBCeXRlIG1haW5CeXRlID0gaW5CeXRlLlJlYWRCeXRlKCk7DQorICAgIHVuc2lnbmVkIGlkU2l6ZSA9IChtYWluQnl0ZSAmIDB4Rik7DQorICAgIGNvbnN0IEJ5dGUgKmxvbmdJRCA9IGluQnl0ZS5HZXRQdHIoKTsNCisgICAgVUludDY0IGlkNjQgPSAwOw0KKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgaWRTaXplOyBqKyspDQorICAgICAgaWQ2NCA9ICgoaWQ2NCA8PCA4KSB8IGxvbmdJRFtqXSk7DQorICAgIGluQnl0ZS5Ta2lwRGF0YU5vQ2hlY2soaWRTaXplKTsNCisNCisgICAgaWYgKChtYWluQnl0ZSAmIDB4MTApICE9IDApDQorICAgIHsNCisgICAgICBpbkJ5dGUuUmVhZE51bSgpOyAvLyBOdW1JblN0cmVhbXMNCisgICAgICBpbkJ5dGUuUmVhZE51bSgpOyAvLyBOdW1PdXRTdHJlYW1zDQorICAgIH0NCisgIA0KKyAgICBDTnVtIHByb3BzU2l6ZSA9IDA7DQorICAgIGNvbnN0IEJ5dGUgKnByb3BzID0gTlVMTDsNCisgICAgaWYgKChtYWluQnl0ZSAmIDB4MjApICE9IDApDQorICAgIHsNCisgICAgICBwcm9wc1NpemUgPSBpbkJ5dGUuUmVhZE51bSgpOw0KKyAgICAgIHByb3BzID0gaW5CeXRlLkdldFB0cigpOw0KKyAgICAgIGluQnl0ZS5Ta2lwRGF0YU5vQ2hlY2socHJvcHNTaXplKTsNCisgICAgfQ0KKyAgICANCisgICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7DQorICAgIGNoYXIgc1szMl07DQorICAgIHNbMF0gPSAwOw0KKyAgICANCisgICAgaWYgKGlkNjQgPD0gKFVJbnQzMikweEZGRkZGRkZGKQ0KKyAgICB7DQorICAgICAgVUludDMyIGlkID0gKFVJbnQzMilpZDY0Ow0KKyAgICAgIGlmIChpZCA9PSBrX0xaTUEpDQorICAgICAgew0KKyAgICAgICAgbmFtZSA9ICJMWk1BIjsNCisgICAgICAgIGlmIChwcm9wc1NpemUgPT0gNSkNCisgICAgICAgIHsNCisgICAgICAgICAgVUludDMyIGRpY1NpemUgPSBHZXRVaTMyKChjb25zdCBCeXRlICopcHJvcHMgKyAxKTsNCisgICAgICAgICAgY2hhciAqZGVzdCA9IHMgKyBHZXRTdHJpbmdGb3JTaXplVmFsdWUocywgZGljU2l6ZSk7DQorICAgICAgICAgIFVJbnQzMiBkID0gcHJvcHNbMF07DQorICAgICAgICAgIGlmIChkICE9IDB4NUQpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBVSW50MzIgbGMgPSBkICUgOTsNCisgICAgICAgICAgICBkIC89IDk7DQorICAgICAgICAgICAgVUludDMyIHBiID0gZCAvIDU7DQorICAgICAgICAgICAgVUludDMyIGxwID0gZCAlIDU7DQorICAgICAgICAgICAgaWYgKGxjICE9IDMpIGRlc3QgPSBBZGRQcm9wMzIoZGVzdCwgImxjIiwgbGMpOw0KKyAgICAgICAgICAgIGlmIChscCAhPSAwKSBkZXN0ID0gQWRkUHJvcDMyKGRlc3QsICJscCIsIGxwKTsNCisgICAgICAgICAgICBpZiAocGIgIT0gMikgZGVzdCA9IEFkZFByb3AzMihkZXN0LCAicGIiLCBwYik7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZWxzZSBpZiAoaWQgPT0ga19MWk1BMikNCisgICAgICB7DQorICAgICAgICBuYW1lID0gIkxaTUEyIjsNCisgICAgICAgIGlmIChwcm9wc1NpemUgPT0gMSkNCisgICAgICAgIHsNCisgICAgICAgICAgQnl0ZSBwID0gcHJvcHNbMF07DQorICAgICAgICAgIGlmICgocCAmIDEpID09IDApDQorICAgICAgICAgICAgQ29udmVydFVJbnQzMlRvU3RyaW5nKChVSW50MzIpKChwID4+IDEpICsgMTIpLCBzKTsNCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIEdldFN0cmluZ0ZvclNpemVWYWx1ZShzLCAzIDw8ICgocCA+PiAxKSArIDExKSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKGlkID09IGtfUFBNRCkNCisgICAgICB7DQorICAgICAgICBuYW1lID0gIlBQTUQiOw0KKyAgICAgICAgaWYgKHByb3BzU2l6ZSA9PSA1KQ0KKyAgICAgICAgew0KKyAgICAgICAgICBCeXRlIG9yZGVyID0gKnByb3BzOw0KKyAgICAgICAgICBjaGFyICpkZXN0ID0gczsNCisgICAgICAgICAgKmRlc3QrKyA9ICdvJzsNCisgICAgICAgICAgQ29udmVydFVJbnQzMlRvU3RyaW5nKG9yZGVyLCBkZXN0KTsNCisgICAgICAgICAgZGVzdCArPSBNeVN0cmluZ0xlbihkZXN0KTsNCisgICAgICAgICAgZGVzdCA9IE15U3RwQ3B5KGRlc3QsICI6bWVtIik7DQorICAgICAgICAgIEdldFN0cmluZ0ZvclNpemVWYWx1ZShkZXN0LCBHZXRVaTMyKHByb3BzICsgMSkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBlbHNlIGlmIChpZCA9PSBrX0RlbHRhKQ0KKyAgICAgIHsNCisgICAgICAgIG5hbWUgPSAiRGVsdGEiOw0KKyAgICAgICAgaWYgKHByb3BzU2l6ZSA9PSAxKQ0KKyAgICAgICAgICBDb252ZXJ0VUludDMyVG9TdHJpbmcoKFVJbnQzMilwcm9wc1swXSArIDEsIHMpOw0KKyAgICAgIH0NCisgICAgICBlbHNlIGlmIChpZCA9PSBrX0JDSjIpIG5hbWUgPSAiQkNKMiI7DQorICAgICAgZWxzZSBpZiAoaWQgPT0ga19CQ0opIG5hbWUgPSAiQkNKIjsNCisgICAgICBlbHNlIGlmIChpZCA9PSBrX0FFUykNCisgICAgICB7DQorICAgICAgICBuYW1lID0gIjd6QUVTIjsNCisgICAgICAgIGlmIChwcm9wc1NpemUgPj0gMSkNCisgICAgICAgIHsNCisgICAgICAgICAgQnl0ZSBmaXJzdEJ5dGUgPSBwcm9wc1swXTsNCisgICAgICAgICAgVUludDMyIG51bUN5Y2xlc1Bvd2VyID0gZmlyc3RCeXRlICYgMHgzRjsNCisgICAgICAgICAgQ29udmVydFVJbnQzMlRvU3RyaW5nKG51bUN5Y2xlc1Bvd2VyLCBzKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIGlmIChuYW1lKQ0KKyAgICB7DQorICAgICAgdW5zaWduZWQgbmFtZUxlbiA9IE15U3RyaW5nTGVuKG5hbWUpOw0KKyAgICAgIHVuc2lnbmVkIHByb3BzTGVuID0gTXlTdHJpbmdMZW4ocyk7DQorICAgICAgdW5zaWduZWQgdG90YWxMZW4gPSBuYW1lTGVuICsgcHJvcHNMZW47DQorICAgICAgaWYgKHByb3BzTGVuICE9IDApDQorICAgICAgICB0b3RhbExlbisrOw0KKyAgICAgIGlmIChuZWVkU3BhY2UpDQorICAgICAgICB0b3RhbExlbisrOw0KKyAgICAgIGlmICh0b3RhbExlbiArIDUgPj0gcG9zKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgcG9zIC09IHRvdGFsTGVuOw0KKyAgICAgIE15U3RyaW5nQ29weSh0ZW1wICsgcG9zLCBuYW1lKTsNCisgICAgICBpZiAocHJvcHNMZW4gIT0gMCkNCisgICAgICB7DQorICAgICAgICBjaGFyICpkZXN0ID0gdGVtcCArIHBvcyArIG5hbWVMZW47DQorICAgICAgICAqZGVzdCsrID0gJzonOw0KKyAgICAgICAgTXlTdHJpbmdDb3B5KGRlc3QsIHMpOw0KKyAgICAgIH0NCisgICAgICBpZiAobmVlZFNwYWNlKQ0KKyAgICAgICAgdGVtcFtwb3MgKyB0b3RhbExlbiAtIDFdID0gJyAnOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIFVTdHJpbmcgbWV0aG9kTmFtZTsNCisgICAgICBGaW5kTWV0aG9kKEVYVEVSTkFMX0NPREVDU19WQVJTIGlkNjQsIG1ldGhvZE5hbWUpOw0KKyAgICAgIGlmIChtZXRob2ROYW1lLklzRW1wdHkoKSkNCisgICAgICB7DQorICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgbWV0aG9kTmFtZS5MZW4oKTsgaisrKQ0KKyAgICAgICAgICBpZiAobWV0aG9kTmFtZVtqXSA+PSAweDgwKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgbWV0aG9kTmFtZS5FbXB0eSgpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChuZWVkU3BhY2UpDQorICAgICAgICB0ZW1wWy0tcG9zXSA9ICcgJzsNCisgICAgICBpZiAobWV0aG9kTmFtZS5Jc0VtcHR5KCkpDQorICAgICAgICBwb3MgLT0gQ29udmVydE1ldGhvZElkVG9TdHJpbmdfQmFjayh0ZW1wICsgcG9zLCBpZDY0KTsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgdW5zaWduZWQgbGVuID0gbWV0aG9kTmFtZS5MZW4oKTsNCisgICAgICAgIGlmIChsZW4gKyA1ID4gcG9zKQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIHBvcyAtPSBsZW47DQorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspDQorICAgICAgICAgIHRlbXBbcG9zICsgaV0gPSAoY2hhciltZXRob2ROYW1lW2ldOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG51bUNvZGVycyAhPSAwICYmIHBvcyA+PSA0KQ0KKyAgew0KKyAgICB0ZW1wWy0tcG9zXSA9ICcgJzsNCisgICAgdGVtcFstLXBvc10gPSAnLic7DQorICAgIHRlbXBbLS1wb3NdID0gJy4nOw0KKyAgICB0ZW1wWy0tcG9zXSA9ICcuJzsNCisgIH0NCisgIHJldHVybiBQcm9wVmFyRW1fU2V0X1N0cihwcm9wLCB0ZW1wICsgcG9zKTsNCisgIC8vIH0NCit9DQorDQorI2VuZGlmDQorDQorU1RETUVUSE9ESU1QIENIYW5kbGVyOjpHZXRQcm9wZXJ0eShVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIFBST1BWQVJJQU5UICp2YWx1ZSkNCit7DQorICBQcm9wVmFyaWFudF9DbGVhcih2YWx1ZSk7DQorICAvLyBDT01fVFJZX0JFR0lODQorICAvLyBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgIA0KKyAgLyoNCisgIGNvbnN0IENSZWYyICZyZWYyID0gX3JlZnNbaW5kZXhdOw0KKyAgaWYgKHJlZjIuUmVmcy5Jc0VtcHR5KCkpDQorICAgIHJldHVybiBFX0ZBSUw7DQorICBjb25zdCBDUmVmICZyZWYgPSByZWYyLlJlZnMuRnJvbnQoKTsNCisgICovDQorICANCisgIGNvbnN0IENGaWxlSXRlbSAmaXRlbSA9IF9kYi5GaWxlc1tpbmRleF07DQorICBVSW50MzIgaW5kZXgyID0gaW5kZXg7DQorDQorICBzd2l0Y2gocHJvcElEKQ0KKyAgew0KKyAgICBjYXNlIGtwaWRJc0RpcjogUHJvcFZhckVtX1NldF9Cb29sKHZhbHVlLCBpdGVtLklzRGlyKTsgYnJlYWs7DQorICAgIGNhc2Uga3BpZFNpemU6DQorICAgIHsNCisgICAgICBQcm9wVmFyRW1fU2V0X1VJbnQ2NCh2YWx1ZSwgaXRlbS5TaXplKTsNCisgICAgICAvLyBwcm9wID0gcmVmMi5TaXplOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2Uga3BpZFBhY2tTaXplOg0KKyAgICB7DQorICAgICAgLy8gcHJvcCA9IHJlZjIuUGFja1NpemU7DQorICAgICAgew0KKyAgICAgICAgQ051bSBmb2xkZXJJbmRleCA9IF9kYi5GaWxlSW5kZXhUb0ZvbGRlckluZGV4TWFwW2luZGV4Ml07DQorICAgICAgICBpZiAoZm9sZGVySW5kZXggIT0ga051bU5vSW5kZXgpDQorICAgICAgICB7DQorICAgICAgICAgIGlmIChfZGIuRm9sZGVyU3RhcnRGaWxlSW5kZXhbZm9sZGVySW5kZXhdID09IChDTnVtKWluZGV4MikNCisgICAgICAgICAgICBQcm9wVmFyRW1fU2V0X1VJbnQ2NCh2YWx1ZSwgX2RiLkdldEZvbGRlckZ1bGxQYWNrU2l6ZShmb2xkZXJJbmRleCkpOw0KKyAgICAgICAgICAvKg0KKyAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgUHJvcFZhckVtX1NldF9VSW50NjQodmFsdWUsIDApOw0KKyAgICAgICAgICAqLw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICBQcm9wVmFyRW1fU2V0X1VJbnQ2NCh2YWx1ZSwgMCk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIC8vIGNhc2Uga3BpZElzQXV4OiBwcm9wID0gX2RiLklzSXRlbUF1eChpbmRleDIpOyBicmVhazsNCisgICAgY2FzZSBrcGlkUG9zaXRpb246ICB7IFVJbnQ2NCB2OyBpZiAoX2RiLlN0YXJ0UG9zLkdldEl0ZW0oaW5kZXgyLCB2KSkgUHJvcFZhckVtX1NldF9VSW50NjQodmFsdWUsIHYpOyBicmVhazsgfQ0KKyAgICBjYXNlIGtwaWRDVGltZTogIFNldEZpbGVUaW1lUHJvcF9Gcm9tX1VJbnQ2NERlZih2YWx1ZSwgX2RiLkNUaW1lLCBpbmRleDIpOyBicmVhazsNCisgICAgY2FzZSBrcGlkQVRpbWU6ICBTZXRGaWxlVGltZVByb3BfRnJvbV9VSW50NjREZWYodmFsdWUsIF9kYi5BVGltZSwgaW5kZXgyKTsgYnJlYWs7DQorICAgIGNhc2Uga3BpZE1UaW1lOiAgU2V0RmlsZVRpbWVQcm9wX0Zyb21fVUludDY0RGVmKHZhbHVlLCBfZGIuTVRpbWUsIGluZGV4Mik7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRBdHRyaWI6ICBpZiAoaXRlbS5BdHRyaWJEZWZpbmVkKSBQcm9wVmFyRW1fU2V0X1VJbnQzMih2YWx1ZSwgaXRlbS5BdHRyaWIpOyBicmVhazsNCisgICAgY2FzZSBrcGlkQ1JDOiAgaWYgKGl0ZW0uQ3JjRGVmaW5lZCkgUHJvcFZhckVtX1NldF9VSW50MzIodmFsdWUsIGl0ZW0uQ3JjKTsgYnJlYWs7DQorICAgIGNhc2Uga3BpZEVuY3J5cHRlZDogIFByb3BWYXJFbV9TZXRfQm9vbCh2YWx1ZSwgSXNGb2xkZXJFbmNyeXB0ZWQoX2RiLkZpbGVJbmRleFRvRm9sZGVySW5kZXhNYXBbaW5kZXgyXSkpOyBicmVhazsNCisgICAgY2FzZSBrcGlkSXNBbnRpOiAgUHJvcFZhckVtX1NldF9Cb29sKHZhbHVlLCBfZGIuSXNJdGVtQW50aShpbmRleDIpKTsgYnJlYWs7DQorICAgIC8qDQorICAgIGNhc2Uga3BpZElzQWx0U3RyZWFtOiAgcHJvcCA9IGl0ZW0uSXNBbHRTdHJlYW07IGJyZWFrOw0KKyAgICBjYXNlIGtwaWROdFNlY3VyZToNCisgICAgICB7DQorICAgICAgICBpbnQgaWQgPSBfZGIuU2VjdXJlSURzW2luZGV4XTsNCisgICAgICAgIHNpemVfdCBvZmZzID0gX2RiLlNlY3VyZU9mZnNldHNbaWRdOw0KKyAgICAgICAgc2l6ZV90IHNpemUgPSBfZGIuU2VjdXJlT2Zmc2V0c1tpZCArIDFdIC0gb2ZmczsNCisgICAgICAgIGlmIChzaXplID49IDApDQorICAgICAgICB7DQorICAgICAgICAgIHByb3AuU2V0QmxvYihfZGIuU2VjdXJlQnVmICsgb2ZmcywgKFVMT05HKXNpemUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAqLw0KKw0KKyAgICBjYXNlIGtwaWRQYXRoOiByZXR1cm4gX2RiLkdldFBhdGhfUHJvcChpbmRleCwgdmFsdWUpOw0KKyAgICAjaWZuZGVmIF9TRlgNCisgICAgY2FzZSBrcGlkTWV0aG9kOiByZXR1cm4gU2V0TWV0aG9kVG9Qcm9wKF9kYi5GaWxlSW5kZXhUb0ZvbGRlckluZGV4TWFwW2luZGV4Ml0sIHZhbHVlKTsNCisgICAgY2FzZSBrcGlkQmxvY2s6DQorICAgICAgew0KKyAgICAgICAgQ051bSBmb2xkZXJJbmRleCA9IF9kYi5GaWxlSW5kZXhUb0ZvbGRlckluZGV4TWFwW2luZGV4Ml07DQorICAgICAgICBpZiAoZm9sZGVySW5kZXggIT0ga051bU5vSW5kZXgpDQorICAgICAgICAgIFByb3BWYXJFbV9TZXRfVUludDMyKHZhbHVlLCAoVUludDMyKWZvbGRlckluZGV4KTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2Uga3BpZFBhY2tlZFNpemUwOg0KKyAgICBjYXNlIGtwaWRQYWNrZWRTaXplMToNCisgICAgY2FzZSBrcGlkUGFja2VkU2l6ZTI6DQorICAgIGNhc2Uga3BpZFBhY2tlZFNpemUzOg0KKyAgICBjYXNlIGtwaWRQYWNrZWRTaXplNDoNCisgICAgICB7DQorICAgICAgICAvKg0KKyAgICAgICAgQ051bSBmb2xkZXJJbmRleCA9IF9kYi5GaWxlSW5kZXhUb0ZvbGRlckluZGV4TWFwW2luZGV4Ml07DQorICAgICAgICBpZiAoZm9sZGVySW5kZXggIT0ga051bU5vSW5kZXgpDQorICAgICAgICB7DQorICAgICAgICAgIGNvbnN0IENGb2xkZXIgJmZvbGRlckluZm8gPSBfZGIuRm9sZGVyc1tmb2xkZXJJbmRleF07DQorICAgICAgICAgIGlmIChfZGIuRm9sZGVyU3RhcnRGaWxlSW5kZXhbZm9sZGVySW5kZXhdID09IChDTnVtKWluZGV4MiAmJg0KKyAgICAgICAgICAgICAgZm9sZGVySW5mby5QYWNrU3RyZWFtcy5TaXplKCkgPiAoaW50KShwcm9wSUQgLSBrcGlkUGFja2VkU2l6ZTApKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgcHJvcCA9IF9kYi5HZXRGb2xkZXJQYWNrU3RyZWFtU2l6ZShmb2xkZXJJbmRleCwgcHJvcElEIC0ga3BpZFBhY2tlZFNpemUwKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgcHJvcCA9IChVSW50NjQpMDsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgICAgcHJvcCA9IChVSW50NjQpMDsNCisgICAgICAgICovDQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICAjZW5kaWYNCisgIH0NCisgIC8vIHByb3AuRGV0YWNoKHZhbHVlKTsNCisgIHJldHVybiBTX09LOw0KKyAgLy8gQ09NX1RSWV9FTkQNCit9DQorDQorU1RETUVUSE9ESU1QIENIYW5kbGVyOjpPcGVuKElJblN0cmVhbSAqc3RyZWFtLA0KKyAgICBjb25zdCBVSW50NjQgKm1heENoZWNrU3RhcnRQb3NpdGlvbiwNCisgICAgSUFyY2hpdmVPcGVuQ2FsbGJhY2sgKm9wZW5BcmNoaXZlQ2FsbGJhY2spDQorew0KKyAgQ09NX1RSWV9CRUdJTg0KKyAgQ2xvc2UoKTsNCisgICNpZm5kZWYgX1NGWA0KKyAgX2ZpbGVJbmZvUG9wSURzLkNsZWFyKCk7DQorICAjZW5kaWYNCisgIA0KKyAgdHJ5DQorICB7DQorICAgIENNeUNvbVB0cjxJQXJjaGl2ZU9wZW5DYWxsYmFjaz4gb3BlbkFyY2hpdmVDYWxsYmFja1RlbXAgPSBvcGVuQXJjaGl2ZUNhbGxiYWNrOw0KKw0KKyAgICAjaWZuZGVmIF9OT19DUllQVE8NCisgICAgQ015Q29tUHRyPElDcnlwdG9HZXRUZXh0UGFzc3dvcmQ+IGdldFRleHRQYXNzd29yZDsNCisgICAgaWYgKG9wZW5BcmNoaXZlQ2FsbGJhY2spDQorICAgICAgb3BlbkFyY2hpdmVDYWxsYmFja1RlbXAuUXVlcnlJbnRlcmZhY2UoSUlEX0lDcnlwdG9HZXRUZXh0UGFzc3dvcmQsICZnZXRUZXh0UGFzc3dvcmQpOw0KKyAgICAjZW5kaWYNCisNCisgICAgQ0luQXJjaGl2ZSBhcmNoaXZlOw0KKyAgICBfZGIuSXNBcmMgPSBmYWxzZTsNCisgICAgUklOT0soYXJjaGl2ZS5PcGVuKHN0cmVhbSwgbWF4Q2hlY2tTdGFydFBvc2l0aW9uKSk7DQorICAgIF9kYi5Jc0FyYyA9IHRydWU7DQorICAgIA0KKyAgICBIUkVTVUxUIHJlc3VsdCA9IGFyY2hpdmUuUmVhZERhdGFiYXNlKA0KKyAgICAgICAgRVhURVJOQUxfQ09ERUNTX1ZBUlMNCisgICAgICAgIF9kYg0KKyAgICAgICAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICAgICAgICAgICwgZ2V0VGV4dFBhc3N3b3JkLCBfaXNFbmNyeXB0ZWQsIF9wYXNzd29yZElzRGVmaW5lZA0KKyAgICAgICAgI2VuZGlmDQorICAgICAgICApOw0KKyAgICBSSU5PSyhyZXN1bHQpOw0KKyAgICANCisgICAgX2luU3RyZWFtID0gc3RyZWFtOw0KKyAgfQ0KKyAgY2F0Y2goLi4uKQ0KKyAgew0KKyAgICBDbG9zZSgpOw0KKyAgICAvLyByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICAvLyB3ZSBtdXN0IHJldHVybiBvdXRfb2ZfbWVtb3J5IGhlcmUNCisgICAgcmV0dXJuIFNfRkFMU0U7DQorICB9DQorICAvLyBfaW5TdHJlYW0gPSBzdHJlYW07DQorICAjaWZuZGVmIF9TRlgNCisgIEZpbGxQb3BJRHMoKTsNCisgICNlbmRpZg0KKyAgcmV0dXJuIFNfT0s7DQorICBDT01fVFJZX0VORA0KK30NCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkNsb3NlKCkNCit7DQorICBDT01fVFJZX0JFR0lODQorICBfaW5TdHJlYW0uUmVsZWFzZSgpOw0KKyAgX2RiLkNsZWFyKCk7DQorICAjaWZuZGVmIF9OT19DUllQVE8NCisgIF9pc0VuY3J5cHRlZCA9IGZhbHNlOw0KKyAgX3Bhc3N3b3JkSXNEZWZpbmVkID0gZmFsc2U7DQorICAjZW5kaWYNCisgIHJldHVybiBTX09LOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorI2lmZGVmIF9fN1pfU0VUX1BST1BFUlRJRVMNCisjaWZkZWYgRVhUUkFDVF9PTkxZDQorDQorU1RETUVUSE9ESU1QIENIYW5kbGVyOjpTZXRQcm9wZXJ0aWVzKGNvbnN0IHdjaGFyX3QgKipuYW1lcywgY29uc3QgUFJPUFZBUklBTlQgKnZhbHVlcywgVUludDMyIG51bVByb3BzKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIGNvbnN0IFVJbnQzMiBudW1Qcm9jZXNzb3JzID0gTlN5c3RlbTo6R2V0TnVtYmVyT2ZQcm9jZXNzb3JzKCk7DQorICBfbnVtVGhyZWFkcyA9IG51bVByb2Nlc3NvcnM7DQorDQorICBmb3IgKFVJbnQzMiBpID0gMDsgaSA8IG51bVByb3BzOyBpKyspDQorICB7DQorICAgIFVTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOw0KKyAgICBuYW1lLk1ha2VMb3dlcl9Bc2NpaSgpOw0KKyAgICBpZiAobmFtZS5Jc0VtcHR5KCkpDQorICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgY29uc3QgUFJPUFZBUklBTlQgJnZhbHVlID0gdmFsdWVzW2ldOw0KKyAgICBVSW50MzIgbnVtYmVyOw0KKyAgICBpbnQgaW5kZXggPSBQYXJzZVN0cmluZ1RvVUludDMyKG5hbWUsIG51bWJlcik7DQorICAgIGlmIChpbmRleCA9PSAwKQ0KKyAgICB7DQorICAgICAgaWYgKG5hbWUuSXNQcmVmaXhlZEJ5KEwibXQiKSkNCisgICAgICB7DQorICAgICAgICBSSU5PSyhQYXJzZU10UHJvcChuYW1lLlB0cigyKSwgdmFsdWUsIG51bVByb2Nlc3NvcnMsIF9udW1UaHJlYWRzKSk7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorICBDT01fVFJZX0VORA0KK30NCisNCisjZW5kaWYNCisjZW5kaWYNCisNCitJTVBMX0lTZXRDb21wcmVzc0NvZGVjc0luZm8NCisNCit9fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekhhbmRsZXIuaCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekhhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2E4MGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6SGFuZGxlci5oCkBAIC0wLDAgKzEsMTc5IEBACisvLyA3ei9IYW5kbGVyLmgNCisNCisjaWZuZGVmIF9fN1pfSEFORExFUl9IDQorI2RlZmluZSBfXzdaX0hBTkRMRVJfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9JQ29kZXIuaCINCisjaW5jbHVkZSAiLi4vSUFyY2hpdmUuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0NyZWF0ZUNvZGVyLmgiDQorDQorI2lmbmRlZiBFWFRSQUNUX09OTFkNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0hhbmRsZXJPdXQuaCINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiN3pDb21wcmVzc2lvbk1vZGUuaCINCisjaW5jbHVkZSAiN3pJbi5oIg0KKw0KK25hbWVzcGFjZSBOQXJjaGl2ZSB7DQorbmFtZXNwYWNlIE43eiB7DQorDQorY29uc3QgVUludDMyIGtfQ29weSA9IDB4MDsNCitjb25zdCBVSW50MzIga19EZWx0YSA9IDM7DQorY29uc3QgVUludDMyIGtfTFpNQTIgPSAweDIxOw0KK2NvbnN0IFVJbnQzMiBrX0xaTUEgID0gMHgwMzAxMDE7DQorY29uc3QgVUludDMyIGtfUFBNRCAgPSAweDAzMDQwMTsNCitjb25zdCBVSW50MzIga19CQ0ogID0gMHgwMzAzMDEwMzsNCitjb25zdCBVSW50MzIga19CQ0oyID0gMHgwMzAzMDExQjsNCitjb25zdCBVSW50MzIga19EZWZsYXRlID0gMHgwNDAxMDg7DQorY29uc3QgVUludDMyIGtfQlppcDIgICA9IDB4MDQwMjAyOw0KKw0KKyNpZm5kZWYgX183Wl9TRVRfUFJPUEVSVElFUw0KKw0KKyNpZmRlZiBFWFRSQUNUX09OTFkNCisjaWYgIWRlZmluZWQoXzdaSVBfU1QpICYmICFkZWZpbmVkKF9TRlgpDQorI2RlZmluZSBfXzdaX1NFVF9QUk9QRVJUSUVTDQorI2VuZGlmDQorI2Vsc2UNCisjZGVmaW5lIF9fN1pfU0VUX1BST1BFUlRJRVMNCisjZW5kaWYNCisNCisjZW5kaWYNCisNCisNCisjaWZuZGVmIEVYVFJBQ1RfT05MWQ0KKw0KK2NsYXNzIENPdXRIYW5kbGVyOiBwdWJsaWMgQ011bHRpTWV0aG9kUHJvcHMNCit7DQorICBIUkVTVUxUIFNldFNvbGlkRnJvbVN0cmluZyhjb25zdCBVU3RyaW5nICZzKTsNCisgIEhSRVNVTFQgU2V0U29saWRGcm9tUFJPUFZBUklBTlQoY29uc3QgUFJPUFZBUklBTlQgJnZhbHVlKTsNCitwdWJsaWM6DQorICBib29sIF9yZW1vdmVTZnhCbG9jazsNCisgIA0KKyAgVUludDY0IF9udW1Tb2xpZEZpbGVzOw0KKyAgVUludDY0IF9udW1Tb2xpZEJ5dGVzOw0KKyAgYm9vbCBfbnVtU29saWRCeXRlc0RlZmluZWQ7DQorICBib29sIF9zb2xpZEV4dGVuc2lvbjsNCisNCisgIGJvb2wgX2NvbXByZXNzSGVhZGVyczsNCisgIGJvb2wgX2VuY3J5cHRIZWFkZXJzU3BlY2lmaWVkOw0KKyAgYm9vbCBfZW5jcnlwdEhlYWRlcnM7DQorICAvLyBib29sIF91c2VQYXJlbnRzOyA5LjI2DQorDQorICBDQm9vbFBhaXIgV3JpdGVfQ1RpbWU7DQorICBDQm9vbFBhaXIgV3JpdGVfQVRpbWU7DQorICBDQm9vbFBhaXIgV3JpdGVfTVRpbWU7DQorDQorICBib29sIF92b2x1bWVNb2RlOw0KKw0KKyAgdm9pZCBJbml0U29saWRGaWxlcygpIHsgX251bVNvbGlkRmlsZXMgPSAoVUludDY0KShJbnQ2NCkoLTEpOyB9DQorICB2b2lkIEluaXRTb2xpZFNpemUoKSAgeyBfbnVtU29saWRCeXRlcyA9IChVSW50NjQpKEludDY0KSgtMSk7IH0NCisgIHZvaWQgSW5pdFNvbGlkKCkNCisgIHsNCisgICAgSW5pdFNvbGlkRmlsZXMoKTsNCisgICAgSW5pdFNvbGlkU2l6ZSgpOw0KKyAgICBfc29saWRFeHRlbnNpb24gPSBmYWxzZTsNCisgICAgX251bVNvbGlkQnl0ZXNEZWZpbmVkID0gZmFsc2U7DQorICB9DQorDQorICB2b2lkIEluaXRQcm9wcygpOw0KKw0KKyAgQ091dEhhbmRsZXIoKSB7IEluaXRQcm9wcygpOyB9DQorDQorICBIUkVTVUxUIFNldFByb3BlcnR5KGNvbnN0IHdjaGFyX3QgKm5hbWUsIGNvbnN0IFBST1BWQVJJQU5UICZ2YWx1ZSk7DQorfTsNCisNCisjZW5kaWYNCisNCitjbGFzcyBDSGFuZGxlcjoNCisgIHB1YmxpYyBJSW5BcmNoaXZlLA0KKyAgcHVibGljIElBcmNoaXZlR2V0UmF3UHJvcHMsDQorICAjaWZkZWYgX183Wl9TRVRfUFJPUEVSVElFUw0KKyAgcHVibGljIElTZXRQcm9wZXJ0aWVzLA0KKyAgI2VuZGlmDQorICAjaWZuZGVmIEVYVFJBQ1RfT05MWQ0KKyAgcHVibGljIElPdXRBcmNoaXZlLA0KKyAgI2VuZGlmDQorICBQVUJMSUNfSVNldENvbXByZXNzQ29kZWNzSW5mbw0KKyAgcHVibGljIENNeVVua25vd25JbXANCisgICNpZm5kZWYgRVhUUkFDVF9PTkxZDQorICAsIHB1YmxpYyBDT3V0SGFuZGxlcg0KKyAgI2VuZGlmDQorew0KK3B1YmxpYzoNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0JFR0lOMihJSW5BcmNoaXZlKQ0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoSUFyY2hpdmVHZXRSYXdQcm9wcykNCisgICNpZmRlZiBfXzdaX1NFVF9QUk9QRVJUSUVTDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShJU2V0UHJvcGVydGllcykNCisgICNlbmRpZg0KKyAgI2lmbmRlZiBFWFRSQUNUX09OTFkNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKElPdXRBcmNoaXZlKQ0KKyAgI2VuZGlmDQorICBRVUVSWV9FTlRSWV9JU2V0Q29tcHJlc3NDb2RlY3NJbmZvDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTkQNCisgIE1ZX0FERFJFRl9SRUxFQVNFDQorDQorICBJTlRFUkZBQ0VfSUluQXJjaGl2ZSg7KQ0KKyAgSU5URVJGQUNFX0lBcmNoaXZlR2V0UmF3UHJvcHMoOykNCisNCisgICNpZmRlZiBfXzdaX1NFVF9QUk9QRVJUSUVTDQorICBTVERNRVRIT0QoU2V0UHJvcGVydGllcykoY29uc3Qgd2NoYXJfdCAqKm5hbWVzLCBjb25zdCBQUk9QVkFSSUFOVCAqdmFsdWVzLCBVSW50MzIgbnVtUHJvcHMpOw0KKyAgI2VuZGlmDQorDQorICAjaWZuZGVmIEVYVFJBQ1RfT05MWQ0KKyAgSU5URVJGQUNFX0lPdXRBcmNoaXZlKDspDQorICAjZW5kaWYNCisNCisgIERFQ0xfSVNldENvbXByZXNzQ29kZWNzSW5mbw0KKw0KKyAgQ0hhbmRsZXIoKTsNCisNCitwcml2YXRlOg0KKyAgQ015Q29tUHRyPElJblN0cmVhbT4gX2luU3RyZWFtOw0KKyAgTkFyY2hpdmU6Ok43ejo6Q0RiRXggX2RiOw0KKyAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICBib29sIF9pc0VuY3J5cHRlZDsNCisgIGJvb2wgX3Bhc3N3b3JkSXNEZWZpbmVkOw0KKyAgI2VuZGlmDQorDQorICAjaWZkZWYgRVhUUkFDVF9PTkxZDQorICANCisgICNpZmRlZiBfXzdaX1NFVF9QUk9QRVJUSUVTDQorICBVSW50MzIgX251bVRocmVhZHM7DQorICAjZW5kaWYNCisNCisgIFVJbnQzMiBfY3JjU2l6ZTsNCisNCisgICNlbHNlDQorICANCisgIENSZWNvcmRWZWN0b3I8Q0JpbmQ+IF9iaW5kczsNCisNCisgIEhSRVNVTFQgUHJvcHNNZXRob2RfVG9fRnVsbE1ldGhvZChDTWV0aG9kRnVsbCAmZGVzdCwgY29uc3QgQ09uZU1ldGhvZEluZm8gJm0pOw0KKyAgSFJFU1VMVCBTZXRIZWFkZXJNZXRob2QoQ0NvbXByZXNzaW9uTWV0aG9kTW9kZSAmaGVhZGVyTWV0aG9kKTsNCisgIHZvaWQgQWRkRGVmYXVsdE1ldGhvZCgpOw0KKyAgSFJFU1VMVCBTZXRNYWluTWV0aG9kKENDb21wcmVzc2lvbk1ldGhvZE1vZGUgJm1ldGhvZCwNCisgICAgICBDT2JqZWN0VmVjdG9yPENPbmVNZXRob2RJbmZvPiAmbWV0aG9kc0luZm8NCisgICAgICAjaWZuZGVmIF83WklQX1NUDQorICAgICAgLCBVSW50MzIgbnVtVGhyZWFkcw0KKyAgICAgICNlbmRpZg0KKyAgICAgICk7DQorDQorDQorICAjZW5kaWYNCisNCisgIGJvb2wgSXNGb2xkZXJFbmNyeXB0ZWQoQ051bSBmb2xkZXJJbmRleCkgY29uc3Q7DQorICAjaWZuZGVmIF9TRlgNCisNCisgIENSZWNvcmRWZWN0b3I8VUludDY0PiBfZmlsZUluZm9Qb3BJRHM7DQorICB2b2lkIEZpbGxQb3BJRHMoKTsNCisgIHZvaWQgQWRkTWV0aG9kTmFtZShBU3RyaW5nICZzLCBVSW50NjQgaWQpOw0KKyAgSFJFU1VMVCBTZXRNZXRob2RUb1Byb3AoQ051bSBmb2xkZXJJbmRleCwgUFJPUFZBUklBTlQgKnByb3ApIGNvbnN0Ow0KKw0KKyAgI2VuZGlmDQorDQorICBERUNMX0VYVEVSTkFMX0NPREVDU19WQVJTDQorfTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekhhbmRsZXJPdXQuY3BwIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6SGFuZGxlck91dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmNTgwOQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekhhbmRsZXJPdXQuY3BwCkBAIC0wLDAgKzEsODc1IEBACisvLyA3ekhhbmRsZXJPdXQuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vQ29tVHJ5LmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdHJpbmdUb0ludC5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vV2lsZGNhcmQuaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0l0ZW1OYW1lVXRpbHMuaCINCisjaW5jbHVkZSAiLi4vQ29tbW9uL1BhcnNlUHJvcGVydGllcy5oIg0KKw0KKyNpbmNsdWRlICI3ekhhbmRsZXIuaCINCisjaW5jbHVkZSAiN3pPdXQuaCINCisjaW5jbHVkZSAiN3pVcGRhdGUuaCINCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQorDQorbmFtZXNwYWNlIE5BcmNoaXZlIHsNCituYW1lc3BhY2UgTjd6IHsNCisNCitzdGF0aWMgY29uc3Qgd2NoYXJfdCAqa19MWk1BX05hbWUgPSBMIkxaTUEiOw0KK3N0YXRpYyBjb25zdCB3Y2hhcl90ICprRGVmYXVsdE1ldGhvZE5hbWUgPSBMIkxaTUEyIjsNCitzdGF0aWMgY29uc3Qgd2NoYXJfdCAqa19Db3B5X05hbWUgPSBMIkNvcHkiOw0KKw0KK3N0YXRpYyBjb25zdCB3Y2hhcl90ICprX01hdGNoRmluZGVyX0ZvckhlYWRlcnMgPSBMIkJUMiI7DQorc3RhdGljIGNvbnN0IFVJbnQzMiBrX051bUZhc3RCeXRlc19Gb3JIZWFkZXJzID0gMjczOw0KK3N0YXRpYyBjb25zdCBVSW50MzIga19MZXZlbF9Gb3JIZWFkZXJzID0gNTsNCitzdGF0aWMgY29uc3QgVUludDMyIGtfRGljdGlvbmFyeV9Gb3JIZWFkZXJzID0NCisgICNpZmRlZiBVTkRFUl9DRQ0KKyAgMSA8PCAxODsNCisgICNlbHNlDQorICAxIDw8IDIwOw0KKyAgI2VuZGlmDQorDQorU1RETUVUSE9ESU1QIENIYW5kbGVyOjpHZXRGaWxlVGltZVR5cGUoVUludDMyICp0eXBlKQ0KK3sNCisgICp0eXBlID0gTkZpbGVUaW1lVHlwZTo6a1dpbmRvd3M7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDSGFuZGxlcjo6UHJvcHNNZXRob2RfVG9fRnVsbE1ldGhvZChDTWV0aG9kRnVsbCAmZGVzdCwgY29uc3QgQ09uZU1ldGhvZEluZm8gJm0pDQorew0KKyAgaWYgKCFGaW5kTWV0aG9kKA0KKyAgICAgIEVYVEVSTkFMX0NPREVDU19WQVJTDQorICAgICAgbS5NZXRob2ROYW1lLCBkZXN0LklkLCBkZXN0Lk51bUluU3RyZWFtcywgZGVzdC5OdW1PdXRTdHJlYW1zKSkNCisgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgIChDUHJvcHMgJilkZXN0ID0gKENQcm9wcyAmKW07DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDSGFuZGxlcjo6U2V0SGVhZGVyTWV0aG9kKENDb21wcmVzc2lvbk1ldGhvZE1vZGUgJmhlYWRlck1ldGhvZCkNCit7DQorICBpZiAoIV9jb21wcmVzc0hlYWRlcnMpDQorICAgIHJldHVybiBTX09LOw0KKyAgQ09uZU1ldGhvZEluZm8gbTsNCisgIG0uTWV0aG9kTmFtZSA9IGtfTFpNQV9OYW1lOw0KKyAgbS5BZGRQcm9wU3RyaW5nKE5Db2RlclByb3BJRDo6a01hdGNoRmluZGVyLCBrX01hdGNoRmluZGVyX0ZvckhlYWRlcnMpOw0KKyAgbS5BZGRQcm9wMzIoTkNvZGVyUHJvcElEOjprTGV2ZWwsIGtfTGV2ZWxfRm9ySGVhZGVycyk7DQorICBtLkFkZFByb3AzMihOQ29kZXJQcm9wSUQ6OmtOdW1GYXN0Qnl0ZXMsIGtfTnVtRmFzdEJ5dGVzX0ZvckhlYWRlcnMpOw0KKyAgbS5BZGRQcm9wMzIoTkNvZGVyUHJvcElEOjprRGljdGlvbmFyeVNpemUsIGtfRGljdGlvbmFyeV9Gb3JIZWFkZXJzKTsNCisgIG0uQWRkTnVtVGhyZWFkc1Byb3AoMSk7DQorDQorICBDTWV0aG9kRnVsbCBtZXRob2RGdWxsOw0KKyAgUklOT0soUHJvcHNNZXRob2RfVG9fRnVsbE1ldGhvZChtZXRob2RGdWxsLCBtKSk7DQorICBoZWFkZXJNZXRob2QuTWV0aG9kcy5BZGQobWV0aG9kRnVsbCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQordm9pZCBDSGFuZGxlcjo6QWRkRGVmYXVsdE1ldGhvZCgpDQorew0KKyAgRk9SX1ZFQ1RPUiAoaSwgX21ldGhvZHMpDQorICB7DQorICAgIFVTdHJpbmcgJm1ldGhvZE5hbWUgPSBfbWV0aG9kc1tpXS5NZXRob2ROYW1lOw0KKyAgICBpZiAobWV0aG9kTmFtZS5Jc0VtcHR5KCkpDQorICAgICAgbWV0aG9kTmFtZSA9IGtEZWZhdWx0TWV0aG9kTmFtZTsNCisgIH0NCisgIGlmIChfbWV0aG9kcy5Jc0VtcHR5KCkpDQorICB7DQorICAgIENPbmVNZXRob2RJbmZvIG07DQorICAgIG0uTWV0aG9kTmFtZSA9IChHZXRMZXZlbCgpID09IDAgPyBrX0NvcHlfTmFtZSA6IGtEZWZhdWx0TWV0aG9kTmFtZSk7DQorICAgIF9tZXRob2RzLkFkZChtKTsNCisgIH0NCit9DQorDQorSFJFU1VMVCBDSGFuZGxlcjo6U2V0TWFpbk1ldGhvZCgNCisgICAgQ0NvbXByZXNzaW9uTWV0aG9kTW9kZSAmbWV0aG9kTW9kZSwNCisgICAgQ09iamVjdFZlY3RvcjxDT25lTWV0aG9kSW5mbz4gJm1ldGhvZHMNCisgICAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgICAsIFVJbnQzMiBudW1UaHJlYWRzDQorICAgICNlbmRpZg0KKyAgICApDQorew0KKyAgQWRkRGVmYXVsdE1ldGhvZCgpOw0KKw0KKyAgY29uc3QgVUludDY0IGtTb2xpZEJ5dGVzX01pbiA9ICgxIDw8IDI0KTsNCisgIGNvbnN0IFVJbnQ2NCBrU29saWRCeXRlc19NYXggPSAoKFVJbnQ2NCkxIDw8IDMyKSAtIDE7DQorDQorICBib29sIG5lZWRTb2xpZCA9IGZhbHNlOw0KKyAgRk9SX1ZFQ1RPUiAoaSwgbWV0aG9kcykNCisgIHsNCisgICAgQ09uZU1ldGhvZEluZm8gJm9uZU1ldGhvZEluZm8gPSBtZXRob2RzW2ldOw0KKyAgICBTZXRHbG9iYWxMZXZlbEFuZFRocmVhZHMob25lTWV0aG9kSW5mbw0KKyAgICAgICNpZm5kZWYgXzdaSVBfU1QNCisgICAgICAsIG51bVRocmVhZHMNCisgICAgICAjZW5kaWYNCisgICAgICApOw0KKw0KKyAgICBDTWV0aG9kRnVsbCBtZXRob2RGdWxsOw0KKyAgICBSSU5PSyhQcm9wc01ldGhvZF9Ub19GdWxsTWV0aG9kKG1ldGhvZEZ1bGwsIG9uZU1ldGhvZEluZm8pKTsNCisgICAgbWV0aG9kTW9kZS5NZXRob2RzLkFkZChtZXRob2RGdWxsKTsNCisNCisgICAgaWYgKG1ldGhvZEZ1bGwuSWQgIT0ga19Db3B5KQ0KKyAgICAgIG5lZWRTb2xpZCA9IHRydWU7DQorDQorICAgIGlmIChfbnVtU29saWRCeXRlc0RlZmluZWQpDQorICAgICAgY29udGludWU7DQorDQorICAgIFVJbnQzMiBkaWNTaXplOw0KKyAgICBzd2l0Y2ggKG1ldGhvZEZ1bGwuSWQpDQorICAgIHsNCisgICAgICBjYXNlIGtfTFpNQToNCisgICAgICBjYXNlIGtfTFpNQTI6IGRpY1NpemUgPSBvbmVNZXRob2RJbmZvLkdldF9Mem1hX0RpY1NpemUoKTsgYnJlYWs7DQorICAgICAgY2FzZSBrX1BQTUQ6IGRpY1NpemUgPSBvbmVNZXRob2RJbmZvLkdldF9QcG1kX01lbVNpemUoKTsgYnJlYWs7DQorICAgICAgY2FzZSBrX0RlZmxhdGU6IGRpY1NpemUgPSAoVUludDMyKTEgPDwgMTU7IGJyZWFrOw0KKyAgICAgIGNhc2Uga19CWmlwMjogZGljU2l6ZSA9IG9uZU1ldGhvZEluZm8uR2V0X0JaaXAyX0Jsb2NrU2l6ZSgpOyBicmVhazsNCisgICAgICBkZWZhdWx0OiBjb250aW51ZTsNCisgICAgfQ0KKyAgICBfbnVtU29saWRCeXRlcyA9IChVSW50NjQpZGljU2l6ZSA8PCA3Ow0KKyAgICBpZiAoX251bVNvbGlkQnl0ZXMgPCBrU29saWRCeXRlc19NaW4pIF9udW1Tb2xpZEJ5dGVzID0ga1NvbGlkQnl0ZXNfTWluOw0KKyAgICBpZiAoX251bVNvbGlkQnl0ZXMgPiBrU29saWRCeXRlc19NYXgpIF9udW1Tb2xpZEJ5dGVzID0ga1NvbGlkQnl0ZXNfTWF4Ow0KKyAgICBfbnVtU29saWRCeXRlc0RlZmluZWQgPSB0cnVlOw0KKyAgfQ0KKw0KKyAgaWYgKCFfbnVtU29saWRCeXRlc0RlZmluZWQpDQorICAgIGlmIChuZWVkU29saWQpDQorICAgICAgX251bVNvbGlkQnl0ZXMgPSBrU29saWRCeXRlc19NYXg7DQorICAgIGVsc2UNCisgICAgICBfbnVtU29saWRCeXRlcyA9IDA7DQorICBfbnVtU29saWRCeXRlc0RlZmluZWQgPSB0cnVlOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0YXRpYyBIUkVTVUxUIEdldFRpbWUoSUFyY2hpdmVVcGRhdGVDYWxsYmFjayAqdXBkYXRlQ2FsbGJhY2ssIGludCBpbmRleCwgUFJPUElEIHByb3BJRCwgVUludDY0ICZmdCwgYm9vbCAmZnREZWZpbmVkKQ0KK3sNCisgIC8vIGZ0ID0gMDsNCisgIC8vIGZ0RGVmaW5lZCA9IGZhbHNlOw0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBSSU5PSyh1cGRhdGVDYWxsYmFjay0+R2V0UHJvcGVydHkoaW5kZXgsIHByb3BJRCwgJnByb3ApKTsNCisgIGlmIChwcm9wLnZ0ID09IFZUX0ZJTEVUSU1FKQ0KKyAgew0KKyAgICBmdCA9IHByb3AuZmlsZXRpbWUuZHdMb3dEYXRlVGltZSB8ICgoVUludDY0KXByb3AuZmlsZXRpbWUuZHdIaWdoRGF0ZVRpbWUgPDwgMzIpOw0KKyAgICBmdERlZmluZWQgPSB0cnVlOw0KKyAgfQ0KKyAgZWxzZSBpZiAocHJvcC52dCAhPSBWVF9FTVBUWSkNCisgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgIGVsc2UNCisgIHsNCisgICAgZnQgPSAwOw0KKyAgICBmdERlZmluZWQgPSBmYWxzZTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCisvKg0KKw0KKyNpZmRlZiBfV0lOMzINCitzdGF0aWMgY29uc3Qgd2NoYXJfdCBrRGlyRGVsaW1pdGVyMSA9IEwnXFwnOw0KKyNlbmRpZg0KK3N0YXRpYyBjb25zdCB3Y2hhcl90IGtEaXJEZWxpbWl0ZXIyID0gTCcvJzsNCisNCitzdGF0aWMgaW5saW5lIGJvb2wgSXNDaGFyRGlyTGltaXRlcih3Y2hhcl90IGMpDQorew0KKyAgcmV0dXJuICgNCisgICAgI2lmZGVmIF9XSU4zMg0KKyAgICBjID09IGtEaXJEZWxpbWl0ZXIxIHx8DQorICAgICNlbmRpZg0KKyAgICBjID09IGtEaXJEZWxpbWl0ZXIyKTsNCit9DQorDQorc3RhdGljIGludCBGaWxsU29ydEluZGV4KENPYmplY3RWZWN0b3I8Q1RyZWVGb2xkZXI+ICZ0cmVlRm9sZGVycywgaW50IGN1ciwgaW50IGN1clNvcnRJbmRleCkNCit7DQorICBDVHJlZUZvbGRlciAmdGYgPSB0cmVlRm9sZGVyc1tjdXJdOw0KKyAgdGYuU29ydEluZGV4ID0gY3VyU29ydEluZGV4Kys7DQorICBmb3IgKGludCBpID0gMDsgaSA8IHRmLlN1YkZvbGRlcnMuU2l6ZSgpOyBpKyspDQorICAgIGN1clNvcnRJbmRleCA9IEZpbGxTb3J0SW5kZXgodHJlZUZvbGRlcnMsIHRmLlN1YkZvbGRlcnNbaV0sIGN1clNvcnRJbmRleCk7DQorICB0Zi5Tb3J0SW5kZXhFbmQgPSBjdXJTb3J0SW5kZXg7DQorICByZXR1cm4gY3VyU29ydEluZGV4Ow0KK30NCisNCitzdGF0aWMgaW50IEZpbmRTdWJGb2xkZXIoY29uc3QgQ09iamVjdFZlY3RvcjxDVHJlZUZvbGRlcj4gJnRyZWVGb2xkZXJzLCBpbnQgY3VyLCBjb25zdCBVU3RyaW5nICZuYW1lLCBpbnQgJmluc2VydFBvcykNCit7DQorICBjb25zdCBDSW50VmVjdG9yICZzdWJGb2xkZXJzID0gdHJlZUZvbGRlcnNbY3VyXS5TdWJGb2xkZXJzOw0KKyAgaW50IGxlZnQgPSAwLCByaWdodCA9IHN1YkZvbGRlcnMuU2l6ZSgpOw0KKyAgaW5zZXJ0UG9zID0gLTE7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBpZiAobGVmdCA9PSByaWdodCkNCisgICAgew0KKyAgICAgIGluc2VydFBvcyA9IGxlZnQ7DQorICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIGludCBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7DQorICAgIGludCBtaWRGb2xkZXIgPSBzdWJGb2xkZXJzW21pZF07DQorICAgIGludCBjb21wYXJlID0gQ29tcGFyZUZpbGVOYW1lcyhuYW1lLCB0cmVlRm9sZGVyc1ttaWRGb2xkZXJdLk5hbWUpOw0KKyAgICBpZiAoY29tcGFyZSA9PSAwKQ0KKyAgICAgIHJldHVybiBtaWRGb2xkZXI7DQorICAgIGlmIChjb21wYXJlIDwgMCkNCisgICAgICByaWdodCA9IG1pZDsNCisgICAgZWxzZQ0KKyAgICAgIGxlZnQgPSBtaWQgKyAxOw0KKyAgfQ0KK30NCisNCitzdGF0aWMgaW50IEFkZEZvbGRlcihDT2JqZWN0VmVjdG9yPENUcmVlRm9sZGVyPiAmdHJlZUZvbGRlcnMsIGludCBjdXIsIGNvbnN0IFVTdHJpbmcgJm5hbWUpDQorew0KKyAgaW50IGluc2VydFBvczsNCisgIGludCBmb2xkZXJJbmRleCA9IEZpbmRTdWJGb2xkZXIodHJlZUZvbGRlcnMsIGN1ciwgbmFtZSwgaW5zZXJ0UG9zKTsNCisgIGlmIChmb2xkZXJJbmRleCA8IDApDQorICB7DQorICAgIGZvbGRlckluZGV4ID0gdHJlZUZvbGRlcnMuU2l6ZSgpOw0KKyAgICBDVHJlZUZvbGRlciAmbmV3Rm9sZGVyID0gdHJlZUZvbGRlcnMuQWRkTmV3KCk7DQorICAgIG5ld0ZvbGRlci5QYXJlbnQgPSBjdXI7DQorICAgIG5ld0ZvbGRlci5OYW1lID0gbmFtZTsNCisgICAgdHJlZUZvbGRlcnNbY3VyXS5TdWJGb2xkZXJzLkluc2VydChpbnNlcnRQb3MsIGZvbGRlckluZGV4KTsNCisgIH0NCisgIC8vIGVsc2UgaWYgKHRyZWVGb2xkZXJzW2ZvbGRlckluZGV4XS5Jc0FsdFN0cmVhbUZvbGRlciAhPSBpc0FsdFN0cmVhbUZvbGRlcikgdGhyb3cgMTEyMzIzNDIzNDsNCisgIHJldHVybiBmb2xkZXJJbmRleDsNCit9DQorKi8NCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OlVwZGF0ZUl0ZW1zKElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sIFVJbnQzMiBudW1JdGVtcywNCisgICAgSUFyY2hpdmVVcGRhdGVDYWxsYmFjayAqdXBkYXRlQ2FsbGJhY2spDQorew0KKyAgQ09NX1RSWV9CRUdJTg0KKw0KKyAgY29uc3QgQ0RiRXggKmRiID0gMDsNCisgICNpZmRlZiBfN1pfVk9MDQorICBpZiAoX3ZvbHVtZXMuU2l6ZSgpID4gMSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIGNvbnN0IENWb2x1bWUgKnZvbHVtZSA9IDA7DQorICBpZiAoX3ZvbHVtZXMuU2l6ZSgpID09IDEpDQorICB7DQorICAgIHZvbHVtZSA9ICZfdm9sdW1lcy5Gcm9udCgpOw0KKyAgICBkYiA9ICZ2b2x1bWUtPkRhdGFiYXNlOw0KKyAgfQ0KKyAgI2Vsc2UNCisgIGlmIChfaW5TdHJlYW0gIT0gMCkNCisgICAgZGIgPSAmX2RiOw0KKyAgI2VuZGlmDQorDQorICAvKg0KKyAgQ015Q29tUHRyPElBcmNoaXZlR2V0UmF3UHJvcHM+IGdldFJhd1Byb3BzOw0KKyAgdXBkYXRlQ2FsbGJhY2stPlF1ZXJ5SW50ZXJmYWNlKElJRF9JQXJjaGl2ZUdldFJhd1Byb3BzLCAodm9pZCAqKikmZ2V0UmF3UHJvcHMpOw0KKw0KKyAgQ1VuaXFCbG9ja3Mgc2VjdXJlQmxvY2tzOw0KKyAgc2VjdXJlQmxvY2tzLkFkZFVuaXEoTlVMTCwgMCk7DQorDQorICBDT2JqZWN0VmVjdG9yPENUcmVlRm9sZGVyPiB0cmVlRm9sZGVyczsNCisgIHsNCisgICAgQ1RyZWVGb2xkZXIgZm9sZGVyOw0KKyAgICBmb2xkZXIuUGFyZW50ID0gLTE7DQorICAgIHRyZWVGb2xkZXJzLkFkZChmb2xkZXIpOw0KKyAgfQ0KKyAgKi8NCisNCisgIENPYmplY3RWZWN0b3I8Q1VwZGF0ZUl0ZW0+IHVwZGF0ZUl0ZW1zOw0KKw0KKyAgYm9vbCBuZWVkX0NUaW1lID0gKFdyaXRlX0NUaW1lLkRlZiAmJiBXcml0ZV9DVGltZS5WYWwpOw0KKyAgYm9vbCBuZWVkX0FUaW1lID0gKFdyaXRlX0FUaW1lLkRlZiAmJiBXcml0ZV9BVGltZS5WYWwpOw0KKyAgYm9vbCBuZWVkX01UaW1lID0gKFdyaXRlX01UaW1lLkRlZiAmJiBXcml0ZV9NVGltZS5WYWwgfHwgIVdyaXRlX01UaW1lLkRlZik7DQorICBpZiAoZGIpDQorICB7DQorICAgIGlmICghV3JpdGVfQ1RpbWUuRGVmKSBuZWVkX0NUaW1lID0gIWRiLT5DVGltZS5EZWZzLklzRW1wdHkoKTsNCisgICAgaWYgKCFXcml0ZV9BVGltZS5EZWYpIG5lZWRfQVRpbWUgPSAhZGItPkFUaW1lLkRlZnMuSXNFbXB0eSgpOw0KKyAgICBpZiAoIVdyaXRlX01UaW1lLkRlZikgbmVlZF9NVGltZSA9ICFkYi0+TVRpbWUuRGVmcy5Jc0VtcHR5KCk7DQorICB9DQorDQorICBVU3RyaW5nIHM7DQorDQorICBmb3IgKFVJbnQzMiBpID0gMDsgaSA8IG51bUl0ZW1zOyBpKyspDQorICB7DQorICAgIEludDMyIG5ld0RhdGEsIG5ld1Byb3BzOw0KKyAgICBVSW50MzIgaW5kZXhJbkFyY2hpdmU7DQorICAgIGlmICghdXBkYXRlQ2FsbGJhY2spDQorICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgUklOT0sodXBkYXRlQ2FsbGJhY2stPkdldFVwZGF0ZUl0ZW1JbmZvKGksICZuZXdEYXRhLCAmbmV3UHJvcHMsICZpbmRleEluQXJjaGl2ZSkpOw0KKyAgICBDVXBkYXRlSXRlbSB1aTsNCisgICAgdWkuTmV3UHJvcHMgPSBJbnRUb0Jvb2wobmV3UHJvcHMpOw0KKyAgICB1aS5OZXdEYXRhID0gSW50VG9Cb29sKG5ld0RhdGEpOw0KKyAgICB1aS5JbmRleEluQXJjaGl2ZSA9IGluZGV4SW5BcmNoaXZlOw0KKyAgICB1aS5JbmRleEluQ2xpZW50ID0gaTsNCisgICAgdWkuSXNBbnRpID0gZmFsc2U7DQorICAgIHVpLlNpemUgPSAwOw0KKw0KKyAgICBVU3RyaW5nIG5hbWU7DQorICAgIC8vIGJvb2wgaXNBbHRTdHJlYW0gPSBmYWxzZTsNCisgICAgaWYgKHVpLkluZGV4SW5BcmNoaXZlICE9IC0xKQ0KKyAgICB7DQorICAgICAgaWYgKGRiID09IDAgfHwgKHVuc2lnbmVkKXVpLkluZGV4SW5BcmNoaXZlID49IGRiLT5GaWxlcy5TaXplKCkpDQorICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICAgIGNvbnN0IENGaWxlSXRlbSAmZmkgPSBkYi0+RmlsZXNbdWkuSW5kZXhJbkFyY2hpdmVdOw0KKyAgICAgIGlmICghdWkuTmV3UHJvcHMpDQorICAgICAgew0KKyAgICAgICAgX2RiLkdldFBhdGgodWkuSW5kZXhJbkFyY2hpdmUsIG5hbWUpOw0KKyAgICAgIH0NCisgICAgICB1aS5Jc0RpciA9IGZpLklzRGlyOw0KKyAgICAgIHVpLlNpemUgPSBmaS5TaXplOw0KKyAgICAgIC8vIGlzQWx0U3RyZWFtID0gZmkuSXNBbHRTdHJlYW07DQorICAgICAgdWkuSXNBbnRpID0gZGItPklzSXRlbUFudGkodWkuSW5kZXhJbkFyY2hpdmUpOw0KKyAgICAgIA0KKyAgICAgIGlmICghdWkuTmV3UHJvcHMpDQorICAgICAgew0KKyAgICAgICAgdWkuQ1RpbWVEZWZpbmVkID0gZGItPkNUaW1lLkdldEl0ZW0odWkuSW5kZXhJbkFyY2hpdmUsIHVpLkNUaW1lKTsNCisgICAgICAgIHVpLkFUaW1lRGVmaW5lZCA9IGRiLT5BVGltZS5HZXRJdGVtKHVpLkluZGV4SW5BcmNoaXZlLCB1aS5BVGltZSk7DQorICAgICAgICB1aS5NVGltZURlZmluZWQgPSBkYi0+TVRpbWUuR2V0SXRlbSh1aS5JbmRleEluQXJjaGl2ZSwgdWkuTVRpbWUpOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBpZiAodWkuTmV3UHJvcHMpDQorICAgIHsNCisgICAgICBib29sIGZvbGRlclN0YXR1c0lzRGVmaW5lZDsNCisgICAgICB7DQorICAgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgICAgIFJJTk9LKHVwZGF0ZUNhbGxiYWNrLT5HZXRQcm9wZXJ0eShpLCBrcGlkQXR0cmliLCAmcHJvcCkpOw0KKyAgICAgICAgaWYgKHByb3AudnQgPT0gVlRfRU1QVFkpDQorICAgICAgICAgIHVpLkF0dHJpYkRlZmluZWQgPSBmYWxzZTsNCisgICAgICAgIGVsc2UgaWYgKHByb3AudnQgIT0gVlRfVUk0KQ0KKyAgICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICB1aS5BdHRyaWIgPSBwcm9wLnVsVmFsOw0KKyAgICAgICAgICB1aS5BdHRyaWJEZWZpbmVkID0gdHJ1ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgLy8gd2UgbmVlZCBNVGltZSB0byBzb3J0IGZpbGVzLg0KKyAgICAgIGlmIChuZWVkX0NUaW1lKSBSSU5PSyhHZXRUaW1lKHVwZGF0ZUNhbGxiYWNrLCBpLCBrcGlkQ1RpbWUsIHVpLkNUaW1lLCB1aS5DVGltZURlZmluZWQpKTsNCisgICAgICBpZiAobmVlZF9BVGltZSkgUklOT0soR2V0VGltZSh1cGRhdGVDYWxsYmFjaywgaSwga3BpZEFUaW1lLCB1aS5BVGltZSwgdWkuQVRpbWVEZWZpbmVkKSk7DQorICAgICAgaWYgKG5lZWRfTVRpbWUpIFJJTk9LKEdldFRpbWUodXBkYXRlQ2FsbGJhY2ssIGksIGtwaWRNVGltZSwgdWkuTVRpbWUsIHVpLk1UaW1lRGVmaW5lZCkpOw0KKw0KKyAgICAgIC8qDQorICAgICAgaWYgKGdldFJhd1Byb3BzKQ0KKyAgICAgIHsNCisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7DQorICAgICAgICBVSW50MzIgZGF0YVNpemU7DQorICAgICAgICBVSW50MzIgcHJvcFR5cGU7DQorDQorICAgICAgICBnZXRSYXdQcm9wcy0+R2V0UmF3UHJvcChpLCBrcGlkTnRTZWN1cmUsICZkYXRhLCAmZGF0YVNpemUsICZwcm9wVHlwZSk7DQorICAgICAgICBpZiAoZGF0YVNpemUgIT0gMCAmJiBwcm9wVHlwZSAhPSBOUHJvcERhdGFUeXBlOjprUmF3KQ0KKyAgICAgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICAgICAgdWkuU2VjdXJlSW5kZXggPSBzZWN1cmVCbG9ja3MuQWRkVW5pcSgoY29uc3QgQnl0ZSAqKWRhdGEsIGRhdGFTaXplKTsNCisgICAgICB9DQorICAgICAgKi8NCisNCisgICAgICB7DQorICAgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgICAgIFJJTk9LKHVwZGF0ZUNhbGxiYWNrLT5HZXRQcm9wZXJ0eShpLCBrcGlkUGF0aCwgJnByb3ApKTsNCisgICAgICAgIGlmIChwcm9wLnZ0ID09IFZUX0VNUFRZKQ0KKyAgICAgICAgew0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSBpZiAocHJvcC52dCAhPSBWVF9CU1RSKQ0KKyAgICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICBuYW1lID0gTkl0ZW1OYW1lOjpNYWtlTGVnYWxOYW1lKHByb3AuYnN0clZhbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgICAgICAgUklOT0sodXBkYXRlQ2FsbGJhY2stPkdldFByb3BlcnR5KGksIGtwaWRJc0RpciwgJnByb3ApKTsNCisgICAgICAgIGlmIChwcm9wLnZ0ID09IFZUX0VNUFRZKQ0KKyAgICAgICAgICBmb2xkZXJTdGF0dXNJc0RlZmluZWQgPSBmYWxzZTsNCisgICAgICAgIGVsc2UgaWYgKHByb3AudnQgIT0gVlRfQk9PTCkNCisgICAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgdWkuSXNEaXIgPSAocHJvcC5ib29sVmFsICE9IFZBUklBTlRfRkFMU0UpOw0KKyAgICAgICAgICBmb2xkZXJTdGF0dXNJc0RlZmluZWQgPSB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICB7DQorICAgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgICAgIFJJTk9LKHVwZGF0ZUNhbGxiYWNrLT5HZXRQcm9wZXJ0eShpLCBrcGlkSXNBbnRpLCAmcHJvcCkpOw0KKyAgICAgICAgaWYgKHByb3AudnQgPT0gVlRfRU1QVFkpDQorICAgICAgICAgIHVpLklzQW50aSA9IGZhbHNlOw0KKyAgICAgICAgZWxzZSBpZiAocHJvcC52dCAhPSBWVF9CT09MKQ0KKyAgICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICB1aS5Jc0FudGkgPSAocHJvcC5ib29sVmFsICE9IFZBUklBTlRfRkFMU0UpOw0KKyAgICAgIH0NCisNCisgICAgICAvKg0KKyAgICAgIHsNCisgICAgICAgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgICAgICAgUklOT0sodXBkYXRlQ2FsbGJhY2stPkdldFByb3BlcnR5KGksIGtwaWRJc0FsdFN0cmVhbSwgJnByb3ApKTsNCisgICAgICAgIGlmIChwcm9wLnZ0ID09IFZUX0VNUFRZKQ0KKyAgICAgICAgICBpc0FsdFN0cmVhbSA9IGZhbHNlOw0KKyAgICAgICAgZWxzZSBpZiAocHJvcC52dCAhPSBWVF9CT09MKQ0KKyAgICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICBpc0FsdFN0cmVhbSA9IChwcm9wLmJvb2xWYWwgIT0gVkFSSUFOVF9GQUxTRSk7DQorICAgICAgfQ0KKyAgICAgICovDQorDQorICAgICAgaWYgKHVpLklzQW50aSkNCisgICAgICB7DQorICAgICAgICB1aS5BdHRyaWJEZWZpbmVkID0gZmFsc2U7DQorDQorICAgICAgICB1aS5DVGltZURlZmluZWQgPSBmYWxzZTsNCisgICAgICAgIHVpLkFUaW1lRGVmaW5lZCA9IGZhbHNlOw0KKyAgICAgICAgdWkuTVRpbWVEZWZpbmVkID0gZmFsc2U7DQorICAgICAgICANCisgICAgICAgIHVpLlNpemUgPSAwOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAoIWZvbGRlclN0YXR1c0lzRGVmaW5lZCAmJiB1aS5BdHRyaWJEZWZpbmVkKQ0KKyAgICAgICAgdWkuU2V0RGlyU3RhdHVzRnJvbUF0dHJpYigpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIC8qDQorICAgICAgaWYgKF9kYi5TZWN1cmVJRHMuSXNFbXB0eSgpKQ0KKyAgICAgICAgdWkuU2VjdXJlSW5kZXggPSBzZWN1cmVCbG9ja3MuQWRkVW5pcShOVUxMLCAwKTsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgaW50IGlkID0gX2RiLlNlY3VyZUlEc1t1aS5JbmRleEluQXJjaGl2ZV07DQorICAgICAgICBzaXplX3Qgb2ZmcyA9IF9kYi5TZWN1cmVPZmZzZXRzW2lkXTsNCisgICAgICAgIHNpemVfdCBzaXplID0gX2RiLlNlY3VyZU9mZnNldHNbaWQgKyAxXSAtIG9mZnM7DQorICAgICAgICB1aS5TZWN1cmVJbmRleCA9IHNlY3VyZUJsb2Nrcy5BZGRVbmlxKF9kYi5TZWN1cmVCdWYgKyBvZmZzLCBzaXplKTsNCisgICAgICB9DQorICAgICAgKi8NCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICB7DQorICAgICAgaW50IGZvbGRlckluZGV4ID0gMDsNCisgICAgICBpZiAoX3VzZVBhcmVudHMpDQorICAgICAgew0KKyAgICAgICAgaW50IGo7DQorICAgICAgICBzLkVtcHR5KCk7DQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmFtZS5MZW4oKTsgaisrKQ0KKyAgICAgICAgew0KKyAgICAgICAgICB3Y2hhcl90IGMgPSBuYW1lW2pdOw0KKyAgICAgICAgICBpZiAoSXNDaGFyRGlyTGltaXRlcihjKSkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGZvbGRlckluZGV4ID0gQWRkRm9sZGVyKHRyZWVGb2xkZXJzLCBmb2xkZXJJbmRleCwgcyk7DQorICAgICAgICAgICAgcy5FbXB0eSgpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHMgKz0gYzsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpc0FsdFN0cmVhbSkNCisgICAgICAgIHsNCisgICAgICAgICAgaW50IGNvbG9uUG9zID0gcy5GaW5kKCc6Jyk7DQorICAgICAgICAgIGlmIChjb2xvblBvcyA8IDApDQorICAgICAgICAgIHsNCisgICAgICAgICAgICAvLyBpc0FsdFN0cmVhbSA9IGZhbHNlOw0KKyAgICAgICAgICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICAgICAgICAgIH0NCisgICAgICAgICAgVVN0cmluZyBtYWluTmFtZSA9IHMuTGVmdChjb2xvblBvcyk7DQorICAgICAgICAgIGludCBuZXdGb2xkZXJJbmRleCA9IEFkZEZvbGRlcih0cmVlRm9sZGVycywgZm9sZGVySW5kZXgsIG1haW5OYW1lKTsNCisgICAgICAgICAgaWYgKHRyZWVGb2xkZXJzW25ld0ZvbGRlckluZGV4XS5VcGRhdGVJdGVtSW5kZXggPCAwKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IHVwZGF0ZUl0ZW1zLlNpemUoKSAtIDE7IGogPj0gMDsgai0tKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIENVcGRhdGVJdGVtICZ1aTIgPSB1cGRhdGVJdGVtc1tqXTsNCisgICAgICAgICAgICAgIGlmICh1aTIuUGFyZW50Rm9sZGVySW5kZXggPT0gZm9sZGVySW5kZXgNCisgICAgICAgICAgICAgICAgICAmJiB1aTIuTmFtZSA9PSBtYWluTmFtZSkNCisgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdWkyLlRyZWVGb2xkZXJJbmRleCA9IG5ld0ZvbGRlckluZGV4Ow0KKyAgICAgICAgICAgICAgICB0cmVlRm9sZGVyc1tuZXdGb2xkZXJJbmRleF0uVXBkYXRlSXRlbUluZGV4ID0gajsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgZm9sZGVySW5kZXggPSBuZXdGb2xkZXJJbmRleDsNCisgICAgICAgICAgcy5EZWxldGUoMCwgY29sb25Qb3MgKyAxKTsNCisgICAgICAgIH0NCisgICAgICAgIHVpLk5hbWUgPSBzOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgICB1aS5OYW1lID0gbmFtZTsNCisgICAgICB1aS5Jc0FsdFN0cmVhbSA9IGlzQWx0U3RyZWFtOw0KKyAgICAgIHVpLlBhcmVudEZvbGRlckluZGV4ID0gZm9sZGVySW5kZXg7DQorICAgICAgdWkuVHJlZUZvbGRlckluZGV4ID0gLTE7DQorICAgICAgaWYgKHVpLklzRGlyICYmICFzLklzRW1wdHkoKSkNCisgICAgICB7DQorICAgICAgICB1aS5UcmVlRm9sZGVySW5kZXggPSBBZGRGb2xkZXIodHJlZUZvbGRlcnMsIGZvbGRlckluZGV4LCBzKTsNCisgICAgICAgIHRyZWVGb2xkZXJzW3VpLlRyZWVGb2xkZXJJbmRleF0uVXBkYXRlSXRlbUluZGV4ID0gdXBkYXRlSXRlbXMuU2l6ZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICAqLw0KKyAgICB1aS5OYW1lID0gbmFtZTsNCisNCisgICAgaWYgKHVpLk5ld0RhdGEpDQorICAgIHsNCisgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgICBSSU5PSyh1cGRhdGVDYWxsYmFjay0+R2V0UHJvcGVydHkoaSwga3BpZFNpemUsICZwcm9wKSk7DQorICAgICAgaWYgKHByb3AudnQgIT0gVlRfVUk4KQ0KKyAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgICB1aS5TaXplID0gKFVJbnQ2NClwcm9wLnVoVmFsLlF1YWRQYXJ0Ow0KKyAgICAgIGlmICh1aS5TaXplICE9IDAgJiYgdWkuSXNBbnRpKQ0KKyAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgfQ0KKyAgICB1cGRhdGVJdGVtcy5BZGQodWkpOw0KKyAgfQ0KKw0KKyAgLyoNCisgIEZpbGxTb3J0SW5kZXgodHJlZUZvbGRlcnMsIDAsIDApOw0KKyAgZm9yIChpID0gMDsgaSA8IChVSW50MzIpdXBkYXRlSXRlbXMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIENVcGRhdGVJdGVtICZ1aSA9IHVwZGF0ZUl0ZW1zW2ldOw0KKyAgICB1aS5QYXJlbnRTb3J0SW5kZXggPSB0cmVlRm9sZGVyc1t1aS5QYXJlbnRGb2xkZXJJbmRleF0uU29ydEluZGV4Ow0KKyAgICB1aS5QYXJlbnRTb3J0SW5kZXhFbmQgPSB0cmVlRm9sZGVyc1t1aS5QYXJlbnRGb2xkZXJJbmRleF0uU29ydEluZGV4RW5kOw0KKyAgfQ0KKyAgKi8NCisNCisgIENDb21wcmVzc2lvbk1ldGhvZE1vZGUgbWV0aG9kTW9kZSwgaGVhZGVyTWV0aG9kOw0KKw0KKyAgSFJFU1VMVCByZXMgPSBTZXRNYWluTWV0aG9kKG1ldGhvZE1vZGUsIF9tZXRob2RzDQorICAgICNpZm5kZWYgXzdaSVBfU1QNCisgICAgLCBfbnVtVGhyZWFkcw0KKyAgICAjZW5kaWYNCisgICAgKTsNCisgIFJJTk9LKHJlcyk7DQorICBtZXRob2RNb2RlLkJpbmRzID0gX2JpbmRzOw0KKw0KKyAgUklOT0soU2V0SGVhZGVyTWV0aG9kKGhlYWRlck1ldGhvZCkpOw0KKyAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgbWV0aG9kTW9kZS5OdW1UaHJlYWRzID0gX251bVRocmVhZHM7DQorICBoZWFkZXJNZXRob2QuTnVtVGhyZWFkcyA9IDE7DQorICAjZW5kaWYNCisNCisgIENNeUNvbVB0cjxJQ3J5cHRvR2V0VGV4dFBhc3N3b3JkMj4gZ2V0UGFzc3dvcmQyOw0KKyAgdXBkYXRlQ2FsbGJhY2stPlF1ZXJ5SW50ZXJmYWNlKElJRF9JQ3J5cHRvR2V0VGV4dFBhc3N3b3JkMiwgKHZvaWQgKiopJmdldFBhc3N3b3JkMik7DQorDQorICBtZXRob2RNb2RlLlBhc3N3b3JkSXNEZWZpbmVkID0gZmFsc2U7DQorICBtZXRob2RNb2RlLlBhc3N3b3JkLkVtcHR5KCk7DQorICBpZiAoZ2V0UGFzc3dvcmQyKQ0KKyAgew0KKyAgICBDTXlDb21CU1RSIHBhc3N3b3JkOw0KKyAgICBJbnQzMiBwYXNzd29yZElzRGVmaW5lZDsNCisgICAgUklOT0soZ2V0UGFzc3dvcmQyLT5DcnlwdG9HZXRUZXh0UGFzc3dvcmQyKCZwYXNzd29yZElzRGVmaW5lZCwgJnBhc3N3b3JkKSk7DQorICAgIG1ldGhvZE1vZGUuUGFzc3dvcmRJc0RlZmluZWQgPSBJbnRUb0Jvb2wocGFzc3dvcmRJc0RlZmluZWQpOw0KKyAgICBpZiAobWV0aG9kTW9kZS5QYXNzd29yZElzRGVmaW5lZCAmJiAoQlNUUilwYXNzd29yZCkNCisgICAgICBtZXRob2RNb2RlLlBhc3N3b3JkID0gcGFzc3dvcmQ7DQorICB9DQorDQorICBib29sIGNvbXByZXNzTWFpbkhlYWRlciA9IF9jb21wcmVzc0hlYWRlcnM7ICAvLyBjaGVjayBpdA0KKw0KKyAgYm9vbCBlbmNyeXB0SGVhZGVycyA9IGZhbHNlOw0KKw0KKyAgaWYgKG1ldGhvZE1vZGUuUGFzc3dvcmRJc0RlZmluZWQpDQorICB7DQorICAgIGlmIChfZW5jcnlwdEhlYWRlcnNTcGVjaWZpZWQpDQorICAgICAgZW5jcnlwdEhlYWRlcnMgPSBfZW5jcnlwdEhlYWRlcnM7DQorICAgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgICBlbHNlDQorICAgICAgZW5jcnlwdEhlYWRlcnMgPSBfcGFzc3dvcmRJc0RlZmluZWQ7DQorICAgICNlbmRpZg0KKyAgICBjb21wcmVzc01haW5IZWFkZXIgPSB0cnVlOw0KKyAgICBpZiAoZW5jcnlwdEhlYWRlcnMpDQorICAgIHsNCisgICAgICBoZWFkZXJNZXRob2QuUGFzc3dvcmRJc0RlZmluZWQgPSBtZXRob2RNb2RlLlBhc3N3b3JkSXNEZWZpbmVkOw0KKyAgICAgIGhlYWRlck1ldGhvZC5QYXNzd29yZCA9IG1ldGhvZE1vZGUuUGFzc3dvcmQ7DQorICAgIH0NCisgIH0NCisNCisgIGlmIChudW1JdGVtcyA8IDIpDQorICAgIGNvbXByZXNzTWFpbkhlYWRlciA9IGZhbHNlOw0KKw0KKyAgQ1VwZGF0ZU9wdGlvbnMgb3B0aW9uczsNCisgIG9wdGlvbnMuTWV0aG9kID0gJm1ldGhvZE1vZGU7DQorICBvcHRpb25zLkhlYWRlck1ldGhvZCA9IChfY29tcHJlc3NIZWFkZXJzIHx8IGVuY3J5cHRIZWFkZXJzKSA/ICZoZWFkZXJNZXRob2QgOiAwOw0KKyAgaW50IGxldmVsID0gR2V0TGV2ZWwoKTsNCisgIG9wdGlvbnMuVXNlRmlsdGVycyA9IGxldmVsICE9IDAgJiYgX2F1dG9GaWx0ZXI7DQorICBvcHRpb25zLk1heEZpbHRlciA9IGxldmVsID49IDg7DQorDQorICBvcHRpb25zLkhlYWRlck9wdGlvbnMuQ29tcHJlc3NNYWluSGVhZGVyID0gY29tcHJlc3NNYWluSGVhZGVyOw0KKyAgLyoNCisgIG9wdGlvbnMuSGVhZGVyT3B0aW9ucy5Xcml0ZUNUaW1lID0gV3JpdGVfQ1RpbWU7DQorICBvcHRpb25zLkhlYWRlck9wdGlvbnMuV3JpdGVBVGltZSA9IFdyaXRlX0FUaW1lOw0KKyAgb3B0aW9ucy5IZWFkZXJPcHRpb25zLldyaXRlTVRpbWUgPSBXcml0ZV9NVGltZTsNCisgICovDQorICANCisgIG9wdGlvbnMuTnVtU29saWRGaWxlcyA9IF9udW1Tb2xpZEZpbGVzOw0KKyAgb3B0aW9ucy5OdW1Tb2xpZEJ5dGVzID0gX251bVNvbGlkQnl0ZXM7DQorICBvcHRpb25zLlNvbGlkRXh0ZW5zaW9uID0gX3NvbGlkRXh0ZW5zaW9uOw0KKyAgb3B0aW9ucy5SZW1vdmVTZnhCbG9jayA9IF9yZW1vdmVTZnhCbG9jazsNCisgIG9wdGlvbnMuVm9sdW1lTW9kZSA9IF92b2x1bWVNb2RlOw0KKw0KKyAgQ091dEFyY2hpdmUgYXJjaGl2ZTsNCisgIENBcmNoaXZlRGF0YWJhc2VPdXQgbmV3RGF0YWJhc2U7DQorDQorICBDTXlDb21QdHI8SUNyeXB0b0dldFRleHRQYXNzd29yZD4gZ2V0UGFzc3dvcmQ7DQorICB1cGRhdGVDYWxsYmFjay0+UXVlcnlJbnRlcmZhY2UoSUlEX0lDcnlwdG9HZXRUZXh0UGFzc3dvcmQsICh2b2lkICoqKSZnZXRQYXNzd29yZCk7DQorICANCisgIC8qDQorICBpZiAoc2VjdXJlQmxvY2tzLlNvcnRlZC5TaXplKCkgPiAxKQ0KKyAgew0KKyAgICBzZWN1cmVCbG9ja3MuR2V0UmV2ZXJzZU1hcCgpOw0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHVwZGF0ZUl0ZW1zLlNpemUoKTsgaSsrKQ0KKyAgICB7DQorICAgICAgaW50ICZzZWN1cmVJbmRleCA9IHVwZGF0ZUl0ZW1zW2ldLlNlY3VyZUluZGV4Ow0KKyAgICAgIHNlY3VyZUluZGV4ID0gc2VjdXJlQmxvY2tzLkJ1ZkluZGV4VG9Tb3J0ZWRJbmRleFtzZWN1cmVJbmRleF07DQorICAgIH0NCisgIH0NCisgICovDQorDQorICByZXMgPSBVcGRhdGUoDQorICAgICAgRVhURVJOQUxfQ09ERUNTX1ZBUlMNCisgICAgICAjaWZkZWYgXzdaX1ZPTA0KKyAgICAgIHZvbHVtZSA/IHZvbHVtZS0+U3RyZWFtOiAwLA0KKyAgICAgIHZvbHVtZSA/IGRiIDogMCwNCisgICAgICAjZWxzZQ0KKyAgICAgIF9pblN0cmVhbSwNCisgICAgICBkYiwNCisgICAgICAjZW5kaWYNCisgICAgICB1cGRhdGVJdGVtcywNCisgICAgICAvLyB0cmVlRm9sZGVycywNCisgICAgICAvLyBzZWN1cmVCbG9ja3MsDQorICAgICAgYXJjaGl2ZSwgbmV3RGF0YWJhc2UsIG91dFN0cmVhbSwgdXBkYXRlQ2FsbGJhY2ssIG9wdGlvbnMNCisgICAgICAjaWZuZGVmIF9OT19DUllQVE8NCisgICAgICAsIGdldFBhc3N3b3JkDQorICAgICAgI2VuZGlmDQorICAgICAgKTsNCisNCisgIFJJTk9LKHJlcyk7DQorDQorICB1cGRhdGVJdGVtcy5DbGVhckFuZEZyZWUoKTsNCisNCisgIHJldHVybiBhcmNoaXZlLldyaXRlRGF0YWJhc2UoRVhURVJOQUxfQ09ERUNTX1ZBUlMNCisgICAgICBuZXdEYXRhYmFzZSwgb3B0aW9ucy5IZWFkZXJNZXRob2QsIG9wdGlvbnMuSGVhZGVyT3B0aW9ucyk7DQorDQorICBDT01fVFJZX0VORA0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBHZXRCaW5kSW5mb1BhcnQoVVN0cmluZyAmc3JjU3RyaW5nLCBVSW50MzIgJmNvZGVyLCBVSW50MzIgJnN0cmVhbSkNCit7DQorICBzdHJlYW0gPSAwOw0KKyAgaW50IGluZGV4ID0gUGFyc2VTdHJpbmdUb1VJbnQzMihzcmNTdHJpbmcsIGNvZGVyKTsNCisgIGlmIChpbmRleCA9PSAwKQ0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgc3JjU3RyaW5nLkRlbGV0ZSgwLCBpbmRleCk7DQorICBpZiAoc3JjU3RyaW5nWzBdID09ICdzJykNCisgIHsNCisgICAgc3JjU3RyaW5nLkRlbGV0ZSgwKTsNCisgICAgaW50IGluZGV4ID0gUGFyc2VTdHJpbmdUb1VJbnQzMihzcmNTdHJpbmcsIHN0cmVhbSk7DQorICAgIGlmIChpbmRleCA9PSAwKQ0KKyAgICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICAgIHNyY1N0cmluZy5EZWxldGUoMCwgaW5kZXgpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3ZvaWQgQ091dEhhbmRsZXI6OkluaXRQcm9wcygpDQorew0KKyAgQ011bHRpTWV0aG9kUHJvcHM6OkluaXQoKTsNCisNCisgIF9yZW1vdmVTZnhCbG9jayA9IGZhbHNlOw0KKyAgX2NvbXByZXNzSGVhZGVycyA9IHRydWU7DQorICBfZW5jcnlwdEhlYWRlcnNTcGVjaWZpZWQgPSBmYWxzZTsNCisgIF9lbmNyeXB0SGVhZGVycyA9IGZhbHNlOw0KKyAgLy8gX3VzZVBhcmVudHMgPSBmYWxzZTsNCisgIA0KKyAgV3JpdGVfQ1RpbWUuSW5pdCgpOw0KKyAgV3JpdGVfQVRpbWUuSW5pdCgpOw0KKyAgV3JpdGVfTVRpbWUuSW5pdCgpOw0KKw0KKyAgX3ZvbHVtZU1vZGUgPSBmYWxzZTsNCisgIEluaXRTb2xpZCgpOw0KK30NCisNCitIUkVTVUxUIENPdXRIYW5kbGVyOjpTZXRTb2xpZEZyb21TdHJpbmcoY29uc3QgVVN0cmluZyAmcykNCit7DQorICBVU3RyaW5nIHMyID0gczsNCisgIHMyLk1ha2VMb3dlcl9Bc2NpaSgpOw0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHMyLkxlbigpOykNCisgIHsNCisgICAgY29uc3Qgd2NoYXJfdCAqc3RhcnQgPSAoKGNvbnN0IHdjaGFyX3QgKilzMikgKyBpOw0KKyAgICBjb25zdCB3Y2hhcl90ICplbmQ7DQorICAgIFVJbnQ2NCB2ID0gQ29udmVydFN0cmluZ1RvVUludDY0KHN0YXJ0LCAmZW5kKTsNCisgICAgaWYgKHN0YXJ0ID09IGVuZCkNCisgICAgew0KKyAgICAgIGlmIChzMltpKytdICE9ICdlJykNCisgICAgICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICAgICAgX3NvbGlkRXh0ZW5zaW9uID0gdHJ1ZTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpICs9IChpbnQpKGVuZCAtIHN0YXJ0KTsNCisgICAgaWYgKGkgPT0gczIuTGVuKCkpDQorICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgd2NoYXJfdCBjID0gczJbaSsrXTsNCisgICAgaWYgKGMgPT0gJ2YnKQ0KKyAgICB7DQorICAgICAgaWYgKHYgPCAxKQ0KKyAgICAgICAgdiA9IDE7DQorICAgICAgX251bVNvbGlkRmlsZXMgPSB2Ow0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIG51bUJpdHM7DQorICAgICAgc3dpdGNoIChjKQ0KKyAgICAgIHsNCisgICAgICAgIGNhc2UgJ2InOiBudW1CaXRzID0gIDA7IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnayc6IG51bUJpdHMgPSAxMDsgYnJlYWs7DQorICAgICAgICBjYXNlICdtJzogbnVtQml0cyA9IDIwOyBicmVhazsNCisgICAgICAgIGNhc2UgJ2cnOiBudW1CaXRzID0gMzA7IGJyZWFrOw0KKyAgICAgICAgY2FzZSAndCc6IG51bUJpdHMgPSA0MDsgYnJlYWs7DQorICAgICAgICBkZWZhdWx0OiByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICAgIH0NCisgICAgICBfbnVtU29saWRCeXRlcyA9ICh2IDw8IG51bUJpdHMpOw0KKyAgICAgIF9udW1Tb2xpZEJ5dGVzRGVmaW5lZCA9IHRydWU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENPdXRIYW5kbGVyOjpTZXRTb2xpZEZyb21QUk9QVkFSSUFOVChjb25zdCBQUk9QVkFSSUFOVCAmdmFsdWUpDQorew0KKyAgYm9vbCBpc1NvbGlkOw0KKyAgc3dpdGNoICh2YWx1ZS52dCkNCisgIHsNCisgICAgY2FzZSBWVF9FTVBUWTogaXNTb2xpZCA9IHRydWU7IGJyZWFrOw0KKyAgICBjYXNlIFZUX0JPT0w6IGlzU29saWQgPSAodmFsdWUuYm9vbFZhbCAhPSBWQVJJQU5UX0ZBTFNFKTsgYnJlYWs7DQorICAgIGNhc2UgVlRfQlNUUjoNCisgICAgICBpZiAoU3RyaW5nVG9Cb29sKHZhbHVlLmJzdHJWYWwsIGlzU29saWQpKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgcmV0dXJuIFNldFNvbGlkRnJvbVN0cmluZyh2YWx1ZS5ic3RyVmFsKTsNCisgICAgZGVmYXVsdDogcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgIH0NCisgIGlmIChpc1NvbGlkKQ0KKyAgICBJbml0U29saWQoKTsNCisgIGVsc2UNCisgICAgX251bVNvbGlkRmlsZXMgPSAxOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0YXRpYyBIUkVTVUxUIFBST1BWQVJJQU5UX3RvX0Jvb2xQYWlyKGNvbnN0IFBST1BWQVJJQU5UICZwcm9wLCBDQm9vbFBhaXIgJmRlc3QpDQorew0KKyAgUklOT0soUFJPUFZBUklBTlRfdG9fYm9vbChwcm9wLCBkZXN0LlZhbCkpOw0KKyAgZGVzdC5EZWYgPSB0cnVlOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ091dEhhbmRsZXI6OlNldFByb3BlcnR5KGNvbnN0IHdjaGFyX3QgKm5hbWVTcGVjLCBjb25zdCBQUk9QVkFSSUFOVCAmdmFsdWUpDQorew0KKyAgVVN0cmluZyBuYW1lID0gbmFtZVNwZWM7DQorICBuYW1lLk1ha2VMb3dlcl9Bc2NpaSgpOw0KKyAgaWYgKG5hbWUuSXNFbXB0eSgpKQ0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgDQorICBpZiAobmFtZVswXSA9PSBMJ3MnKQ0KKyAgew0KKyAgICBuYW1lLkRlbGV0ZSgwKTsNCisgICAgaWYgKG5hbWUuSXNFbXB0eSgpKQ0KKyAgICAgIHJldHVybiBTZXRTb2xpZEZyb21QUk9QVkFSSUFOVCh2YWx1ZSk7DQorICAgIGlmICh2YWx1ZS52dCAhPSBWVF9FTVBUWSkNCisgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICByZXR1cm4gU2V0U29saWRGcm9tU3RyaW5nKG5hbWUpOw0KKyAgfQ0KKyAgDQorICBVSW50MzIgbnVtYmVyOw0KKyAgaW50IGluZGV4ID0gUGFyc2VTdHJpbmdUb1VJbnQzMihuYW1lLCBudW1iZXIpOw0KKyAgVVN0cmluZyByZWFsTmFtZSA9IG5hbWUuUHRyKGluZGV4KTsNCisgIGlmIChpbmRleCA9PSAwKQ0KKyAgew0KKyAgICBpZiAobmFtZS5Jc0VxdWFsVG8oInJzZngiKSkgcmV0dXJuIFBST1BWQVJJQU5UX3RvX2Jvb2wodmFsdWUsIF9yZW1vdmVTZnhCbG9jayk7DQorICAgIGlmIChuYW1lLklzRXF1YWxUbygiaGMiKSkgcmV0dXJuIFBST1BWQVJJQU5UX3RvX2Jvb2wodmFsdWUsIF9jb21wcmVzc0hlYWRlcnMpOw0KKyAgICAvLyBpZiAobmFtZS5Jc0VxdWFsVG9Ob0Nhc2UoTCJIUyIpKSByZXR1cm4gUFJPUFZBUklBTlRfdG9fYm9vbCh2YWx1ZSwgX3VzZVBhcmVudHMpOw0KKyAgICANCisgICAgaWYgKG5hbWUuSXNFcXVhbFRvKCJoY2YiKSkNCisgICAgew0KKyAgICAgIGJvb2wgY29tcHJlc3NIZWFkZXJzRnVsbCA9IHRydWU7DQorICAgICAgUklOT0soUFJPUFZBUklBTlRfdG9fYm9vbCh2YWx1ZSwgY29tcHJlc3NIZWFkZXJzRnVsbCkpOw0KKyAgICAgIHJldHVybiBjb21wcmVzc0hlYWRlcnNGdWxsID8gU19PSzogRV9JTlZBTElEQVJHOw0KKyAgICB9DQorICAgIA0KKyAgICBpZiAobmFtZS5Jc0VxdWFsVG8oImhlIikpDQorICAgIHsNCisgICAgICBSSU5PSyhQUk9QVkFSSUFOVF90b19ib29sKHZhbHVlLCBfZW5jcnlwdEhlYWRlcnMpKTsNCisgICAgICBfZW5jcnlwdEhlYWRlcnNTcGVjaWZpZWQgPSB0cnVlOw0KKyAgICAgIHJldHVybiBTX09LOw0KKyAgICB9DQorICAgIA0KKyAgICBpZiAobmFtZS5Jc0VxdWFsVG8oInRjIikpIHJldHVybiBQUk9QVkFSSUFOVF90b19Cb29sUGFpcih2YWx1ZSwgV3JpdGVfQ1RpbWUpOw0KKyAgICBpZiAobmFtZS5Jc0VxdWFsVG8oInRhIikpIHJldHVybiBQUk9QVkFSSUFOVF90b19Cb29sUGFpcih2YWx1ZSwgV3JpdGVfQVRpbWUpOw0KKyAgICBpZiAobmFtZS5Jc0VxdWFsVG8oInRtIikpIHJldHVybiBQUk9QVkFSSUFOVF90b19Cb29sUGFpcih2YWx1ZSwgV3JpdGVfTVRpbWUpOw0KKyAgICANCisgICAgaWYgKG5hbWUuSXNFcXVhbFRvKCJ2IikpICByZXR1cm4gUFJPUFZBUklBTlRfdG9fYm9vbCh2YWx1ZSwgX3ZvbHVtZU1vZGUpOw0KKyAgfQ0KKyAgcmV0dXJuIENNdWx0aU1ldGhvZFByb3BzOjpTZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6U2V0UHJvcGVydGllcyhjb25zdCB3Y2hhcl90ICoqbmFtZXMsIGNvbnN0IFBST1BWQVJJQU5UICp2YWx1ZXMsIFVJbnQzMiBudW1Qcm9wcykNCit7DQorICBDT01fVFJZX0JFR0lODQorICBfYmluZHMuQ2xlYXIoKTsNCisgIEluaXRQcm9wcygpOw0KKw0KKyAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBudW1Qcm9wczsgaSsrKQ0KKyAgew0KKyAgICBVU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsNCisgICAgbmFtZS5NYWtlTG93ZXJfQXNjaWkoKTsNCisgICAgaWYgKG5hbWUuSXNFbXB0eSgpKQ0KKyAgICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorDQorICAgIGNvbnN0IFBST1BWQVJJQU5UICZ2YWx1ZSA9IHZhbHVlc1tpXTsNCisNCisgICAgaWYgKG5hbWVbMF0gPT0gJ2InKQ0KKyAgICB7DQorICAgICAgaWYgKHZhbHVlLnZ0ICE9IFZUX0VNUFRZKQ0KKyAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgICBuYW1lLkRlbGV0ZSgwKTsNCisgICAgICBDQmluZCBiaW5kOw0KKyAgICAgIFJJTk9LKEdldEJpbmRJbmZvUGFydChuYW1lLCBiaW5kLk91dENvZGVyLCBiaW5kLk91dFN0cmVhbSkpOw0KKyAgICAgIGlmIChuYW1lWzBdICE9ICc6JykNCisgICAgICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICAgICAgbmFtZS5EZWxldGUoMCk7DQorICAgICAgUklOT0soR2V0QmluZEluZm9QYXJ0KG5hbWUsIGJpbmQuSW5Db2RlciwgYmluZC5JblN0cmVhbSkpOw0KKyAgICAgIGlmICghbmFtZS5Jc0VtcHR5KCkpDQorICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICAgIF9iaW5kcy5BZGQoYmluZCk7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisNCisgICAgUklOT0soU2V0UHJvcGVydHkobmFtZSwgdmFsdWUpKTsNCisgIH0NCisNCisgIHVuc2lnbmVkIG51bUVtcHR5TWV0aG9kcyA9IEdldE51bUVtcHR5TWV0aG9kcygpOw0KKyAgaWYgKG51bUVtcHR5TWV0aG9kcyA+IDApDQorICB7DQorICAgIHVuc2lnbmVkIGs7DQorICAgIGZvciAoayA9IDA7IGsgPCBfYmluZHMuU2l6ZSgpOyBrKyspDQorICAgIHsNCisgICAgICBjb25zdCBDQmluZCAmYmluZCA9IF9iaW5kc1trXTsNCisgICAgICBpZiAoYmluZC5JbkNvZGVyIDwgKFVJbnQzMiludW1FbXB0eU1ldGhvZHMgfHwNCisgICAgICAgICAgYmluZC5PdXRDb2RlciA8IChVSW50MzIpbnVtRW1wdHlNZXRob2RzKQ0KKyAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgfQ0KKyAgICBmb3IgKGsgPSAwOyBrIDwgX2JpbmRzLlNpemUoKTsgaysrKQ0KKyAgICB7DQorICAgICAgQ0JpbmQgJmJpbmQgPSBfYmluZHNba107DQorICAgICAgYmluZC5JbkNvZGVyIC09IChVSW50MzIpbnVtRW1wdHlNZXRob2RzOw0KKyAgICAgIGJpbmQuT3V0Q29kZXIgLT0gKFVJbnQzMiludW1FbXB0eU1ldGhvZHM7DQorICAgIH0NCisgICAgX21ldGhvZHMuRGVsZXRlRnJvbnRhbChudW1FbXB0eU1ldGhvZHMpOw0KKyAgfQ0KKyAgDQorICBBZGREZWZhdWx0TWV0aG9kKCk7DQorDQorICBpZiAoIV9maWx0ZXJNZXRob2QuTWV0aG9kTmFtZS5Jc0VtcHR5KCkpDQorICB7DQorICAgIEZPUl9WRUNUT1IgKGssIF9iaW5kcykNCisgICAgew0KKyAgICAgIENCaW5kICZiaW5kID0gX2JpbmRzW2tdOw0KKyAgICAgIGJpbmQuSW5Db2RlcisrOw0KKyAgICAgIGJpbmQuT3V0Q29kZXIrKzsNCisgICAgfQ0KKyAgICBfbWV0aG9kcy5JbnNlcnQoMCwgX2ZpbHRlck1ldGhvZCk7DQorICB9DQorDQorICBGT1JfVkVDVE9SIChrLCBfYmluZHMpDQorICB7DQorICAgIGNvbnN0IENCaW5kICZiaW5kID0gX2JpbmRzW2tdOw0KKyAgICBpZiAoYmluZC5JbkNvZGVyID49IChVSW50MzIpX21ldGhvZHMuU2l6ZSgpIHx8DQorICAgICAgICBiaW5kLk91dENvZGVyID49IChVSW50MzIpX21ldGhvZHMuU2l6ZSgpKQ0KKyAgICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICB9DQorDQorICByZXR1cm4gU19PSzsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KK319DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6SGVhZGVyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekhlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzOTkwOQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekhlYWRlci5jcHAKQEAgLTAsMCArMSwxOSBAQAorLy8gN3pIZWFkZXIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICI3ekhlYWRlci5oIg0KKw0KK25hbWVzcGFjZSBOQXJjaGl2ZSB7DQorbmFtZXNwYWNlIE43eiB7DQorDQorQnl0ZSBrU2lnbmF0dXJlW2tTaWduYXR1cmVTaXplXSA9IHsnNycsICd6JywgMHhCQywgMHhBRiwgMHgyNywgMHgxQ307DQorI2lmZGVmIF83Wl9WT0wNCitCeXRlIGtGaW5pc2hTaWduYXR1cmVba1NpZ25hdHVyZVNpemVdID0geyc3JywgJ3onLCAweEJDLCAweEFGLCAweDI3LCAweDFDICsgMX07DQorI2VuZGlmDQorDQorLy8gV2UgY2FuIGNoYW5nZSBzaWduYXR1cmUuIFNvIGZpbGUgZG9lc24ndCBjb250YWluIGNvcnJlY3Qgc2lnbmF0dXJlLg0KKy8vIHN0cnVjdCBTaWduYXR1cmVJbml0aWFsaXplciB7IFNpZ25hdHVyZUluaXRpYWxpemVyKCkgeyBrU2lnbmF0dXJlWzBdLS07IH0gfTsNCisvLyBzdGF0aWMgU2lnbmF0dXJlSW5pdGlhbGl6ZXIgZ19TaWduYXR1cmVJbml0aWFsaXplcjsNCisNCit9fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekhlYWRlci5oIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6SGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiNTA2MQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekhlYWRlci5oCkBAIC0wLDAgKzEsMTAxIEBACisvLyA3ei83ekhlYWRlci5oDQorDQorI2lmbmRlZiBfXzdaX0hFQURFUl9IDQorI2RlZmluZSBfXzdaX0hFQURFUl9IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeVR5cGVzLmgiDQorDQorbmFtZXNwYWNlIE5BcmNoaXZlIHsNCituYW1lc3BhY2UgTjd6IHsNCisNCitjb25zdCB1bnNpZ25lZCBrU2lnbmF0dXJlU2l6ZSA9IDY7DQorZXh0ZXJuIEJ5dGUga1NpZ25hdHVyZVtrU2lnbmF0dXJlU2l6ZV07DQorDQorLy8gI2RlZmluZSBfN1pfVk9MDQorLy8gN3otTXVsdGlWb2x1bWUgaXMgbm90IGZpbmlzaGVkIHlldC4NCisvLyBJdCBjYW4gd29yayBhbHJlYWR5LCBidXQgSSBzdGlsbCBkbyBub3QgbGlrZSBzb21lDQorLy8gdGhpbmdzIG9mIHRoYXQgbmV3IG11bHRpdm9sdW1lIGZvcm1hdC4NCisvLyBTbyBwbGVhc2Uga2VlcCBpdCBjb21tZW50ZWQuDQorDQorI2lmZGVmIF83Wl9WT0wNCitleHRlcm4gQnl0ZSBrRmluaXNoU2lnbmF0dXJlW2tTaWduYXR1cmVTaXplXTsNCisjZW5kaWYNCisNCitzdHJ1Y3QgQ0FyY2hpdmVWZXJzaW9uDQorew0KKyAgQnl0ZSBNYWpvcjsNCisgIEJ5dGUgTWlub3I7DQorfTsNCisNCitjb25zdCBCeXRlIGtNYWpvclZlcnNpb24gPSAwOw0KKw0KK3N0cnVjdCBDU3RhcnRIZWFkZXINCit7DQorICBVSW50NjQgTmV4dEhlYWRlck9mZnNldDsNCisgIFVJbnQ2NCBOZXh0SGVhZGVyU2l6ZTsNCisgIFVJbnQzMiBOZXh0SGVhZGVyQ1JDOw0KK307DQorDQorY29uc3QgVUludDMyIGtTdGFydEhlYWRlclNpemUgPSAyMDsNCisNCisjaWZkZWYgXzdaX1ZPTA0KK3N0cnVjdCBDRmluaXNoSGVhZGVyOiBwdWJsaWMgQ1N0YXJ0SGVhZGVyDQorew0KKyAgVUludDY0IEFyY2hpdmVTdGFydE9mZnNldDsgIC8vIGRhdGEgb2Zmc2V0IGZyb20gZW5kIGlmIHRoYXQgc3RydWN0DQorICBVSW50NjQgQWRkaXRpb25hbFN0YXJ0QmxvY2tTaXplOyAvLyBzdGFydCAgc2lnbmF0dXJlICYgc3RhcnQgaGVhZGVyIHNpemUNCit9Ow0KKw0KK2NvbnN0IFVJbnQzMiBrRmluaXNoSGVhZGVyU2l6ZSA9IGtTdGFydEhlYWRlclNpemUgKyAxNjsNCisjZW5kaWYNCisNCituYW1lc3BhY2UgTklEDQorew0KKyAgZW51bSBFRW51bQ0KKyAgew0KKyAgICBrRW5kLA0KKw0KKyAgICBrSGVhZGVyLA0KKw0KKyAgICBrQXJjaGl2ZVByb3BlcnRpZXMsDQorICAgIA0KKyAgICBrQWRkaXRpb25hbFN0cmVhbXNJbmZvLA0KKyAgICBrTWFpblN0cmVhbXNJbmZvLA0KKyAgICBrRmlsZXNJbmZvLA0KKyAgICANCisgICAga1BhY2tJbmZvLA0KKyAgICBrVW5wYWNrSW5mbywNCisgICAga1N1YlN0cmVhbXNJbmZvLA0KKw0KKyAgICBrU2l6ZSwNCisgICAga0NSQywNCisNCisgICAga0ZvbGRlciwNCisNCisgICAga0NvZGVyc1VucGFja1NpemUsDQorICAgIGtOdW1VbnBhY2tTdHJlYW0sDQorDQorICAgIGtFbXB0eVN0cmVhbSwNCisgICAga0VtcHR5RmlsZSwNCisgICAga0FudGksDQorDQorICAgIGtOYW1lLA0KKyAgICBrQ1RpbWUsDQorICAgIGtBVGltZSwNCisgICAga01UaW1lLA0KKyAgICBrV2luQXR0cmliLA0KKyAgICBrQ29tbWVudCwNCisNCisgICAga0VuY29kZWRIZWFkZXIsDQorDQorICAgIGtTdGFydFBvcywNCisgICAga0R1bW15DQorDQorICAgIC8vIGtOdFNlY3VyZSwNCisgICAgLy8ga1BhcmVudCwNCisgICAgLy8ga0lzQXV4DQorICB9Ow0KK30NCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekluLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ekluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTg1NTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6SW4uY3BwCkBAIC0wLDAgKzEsMTY3OSBAQAorLy8gN3pJbi5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2lmZGVmIF9XSU4zMg0KKyNpbmNsdWRlIDx3Y2hhci5oPg0KKyNlbHNlDQorI2luY2x1ZGUgPGN0eXBlLmg+DQorI2VuZGlmDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL0MvN3pDcmMuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vQy9DcHVBcmNoLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9TdHJlYW1PYmplY3RzLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9TdHJlYW1VdGlscy5oIg0KKw0KKyNpbmNsdWRlICI3ekRlY29kZS5oIg0KKyNpbmNsdWRlICI3ekluLmgiDQorDQorI2RlZmluZSBHZXQxNihwKSBHZXRVaTE2KHApDQorI2RlZmluZSBHZXQzMihwKSBHZXRVaTMyKHApDQorI2RlZmluZSBHZXQ2NChwKSBHZXRVaTY0KHApDQorDQorLy8gZGVmaW5lIEZPUk1BVF83Wl9SRUNPVkVSWSBpZiB5b3Ugd2FudCB0byByZWNvdmVyIG11bHRpdm9sdW1lIGFyY2hpdmVzIHdpdGggZW1wdHkgU3RhcnRIZWFkZXINCisjaWZuZGVmIF9TRlgNCisjZGVmaW5lIEZPUk1BVF83Wl9SRUNPVkVSWQ0KKyNlbmRpZg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCit1c2luZyBuYW1lc3BhY2UgTkNPTTsNCisNCituYW1lc3BhY2UgTkFyY2hpdmUgew0KK25hbWVzcGFjZSBON3ogew0KKw0KK3N0YXRpYyBjb25zdCBVSW50MzIga19MWk1BMiA9IDB4MjE7DQorc3RhdGljIGNvbnN0IFVJbnQzMiBrX0xaTUEgID0gMHgwMzAxMDE7DQorDQorc3RhdGljIHZvaWQgQm9vbFZlY3Rvcl9GaWxsX0ZhbHNlKENCb29sVmVjdG9yICZ2LCB1bnNpZ25lZCBzaXplKQ0KK3sNCisgIHYuQ2xlYXJBbmRTZXRTaXplKHNpemUpOw0KKyAgYm9vbCAqcCA9ICZ2WzBdOw0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7IGkrKykNCisgICAgcFtpXSA9IGZhbHNlOw0KK30NCisNCitzdGF0aWMgYm9vbCBCb29sVmVjdG9yX0dldEFuZFNldChDQm9vbFZlY3RvciAmdiwgVUludDMyIGluZGV4KQ0KK3sNCisgIGlmIChpbmRleCA+PSAoVUludDMyKXYuU2l6ZSgpKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIGJvb2wgcmVzID0gdltpbmRleF07DQorICB2W2luZGV4XSA9IHRydWU7DQorICByZXR1cm4gcmVzOw0KK30NCisNCitib29sIENGb2xkZXI6OkNoZWNrU3RydWN0dXJlKHVuc2lnbmVkIG51bVVucGFja1NpemVzKSBjb25zdA0KK3sNCisgIGNvbnN0IHVuc2lnbmVkIGtOdW1Db2RlcnNNYXggPSBzaXplb2YoVUludDMyKSAqIDg7IC8vIGRvbid0IGNoYW5nZSBpdA0KKyAgY29uc3QgdW5zaWduZWQga01hc2tTaXplID0gc2l6ZW9mKFVJbnQzMikgKiA4OyAvLyBpdCBtdXN0IGJlID49IGtOdW1Db2RlcnNNYXgNCisgIGNvbnN0IHVuc2lnbmVkIGtOdW1CaW5kc01heCA9IDMyOw0KKw0KKyAgaWYgKENvZGVycy5TaXplKCkgPiBrTnVtQ29kZXJzTWF4IHx8IEJpbmRQYWlycy5TaXplKCkgPiBrTnVtQmluZHNNYXgpDQorICAgIHJldHVybiBmYWxzZTsNCisNCisgIHsNCisgICAgQ0Jvb2xWZWN0b3IgdjsNCisgICAgQm9vbFZlY3Rvcl9GaWxsX0ZhbHNlKHYsIEJpbmRQYWlycy5TaXplKCkgKyBQYWNrU3RyZWFtcy5TaXplKCkpOw0KKyAgICANCisgICAgdW5zaWduZWQgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IEJpbmRQYWlycy5TaXplKCk7IGkrKykNCisgICAgICBpZiAoQm9vbFZlY3Rvcl9HZXRBbmRTZXQodiwgQmluZFBhaXJzW2ldLkluSW5kZXgpKQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgUGFja1N0cmVhbXMuU2l6ZSgpOyBpKyspDQorICAgICAgaWYgKEJvb2xWZWN0b3JfR2V0QW5kU2V0KHYsIFBhY2tTdHJlYW1zW2ldKSkNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgDQorICAgIEJvb2xWZWN0b3JfRmlsbF9GYWxzZSh2LCBudW1VbnBhY2tTaXplcyk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBCaW5kUGFpcnMuU2l6ZSgpOyBpKyspDQorICAgICAgaWYgKEJvb2xWZWN0b3JfR2V0QW5kU2V0KHYsIEJpbmRQYWlyc1tpXS5PdXRJbmRleCkpDQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICANCisgIFVJbnQzMiBtYXNrW2tNYXNrU2l6ZV07DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IGtNYXNrU2l6ZTsgaSsrKQ0KKyAgICBtYXNrW2ldID0gMDsNCisNCisgIHsNCisgICAgQ1VJbnRWZWN0b3IgaW5TdHJlYW1Ub0NvZGVyLCBvdXRTdHJlYW1Ub0NvZGVyOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgQ29kZXJzLlNpemUoKTsgaSsrKQ0KKyAgICB7DQorICAgICAgQ051bSBqOw0KKyAgICAgIGNvbnN0IENDb2RlckluZm8gJmNvZGVyID0gQ29kZXJzW2ldOw0KKyAgICAgIGZvciAoaiA9IDA7IGogPCBjb2Rlci5OdW1JblN0cmVhbXM7IGorKykNCisgICAgICAgIGluU3RyZWFtVG9Db2Rlci5BZGQoaSk7DQorICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGVyLk51bU91dFN0cmVhbXM7IGorKykNCisgICAgICAgIG91dFN0cmVhbVRvQ29kZXIuQWRkKGkpOw0KKyAgICB9DQorICAgIA0KKyAgICBmb3IgKGkgPSAwOyBpIDwgQmluZFBhaXJzLlNpemUoKTsgaSsrKQ0KKyAgICB7DQorICAgICAgY29uc3QgQ0JpbmRQYWlyICZicCA9IEJpbmRQYWlyc1tpXTsNCisgICAgICBtYXNrW2luU3RyZWFtVG9Db2RlclticC5JbkluZGV4XV0gfD0gKDEgPDwgb3V0U3RyZWFtVG9Db2RlclticC5PdXRJbmRleF0pOw0KKyAgICB9DQorICB9DQorICANCisgIGZvciAoaSA9IDA7IGkgPCBrTWFza1NpemU7IGkrKykNCisgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGtNYXNrU2l6ZTsgaisrKQ0KKyAgICAgIGlmICgoKDEgPDwgaikgJiBtYXNrW2ldKSAhPSAwKQ0KKyAgICAgICAgbWFza1tpXSB8PSBtYXNrW2pdOw0KKw0KKyAgZm9yIChpID0gMDsgaSA8IGtNYXNrU2l6ZTsgaSsrKQ0KKyAgICBpZiAoKCgxIDw8IGkpICYgbWFza1tpXSkgIT0gMCkNCisgICAgICByZXR1cm4gZmFsc2U7DQorDQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorY2xhc3MgQ0luQXJjaGl2ZUV4Y2VwdGlvbiB7fTsNCitjbGFzcyBDVW5zdXBwb3J0ZWRGZWF0dXJlRXhjZXB0aW9uOiBwdWJsaWMgQ0luQXJjaGl2ZUV4Y2VwdGlvbiB7fTsNCisNCitzdGF0aWMgdm9pZCBUaHJvd0V4Y2VwdGlvbigpIHsgdGhyb3cgQ0luQXJjaGl2ZUV4Y2VwdGlvbigpOyB9DQorc3RhdGljIGlubGluZSB2b2lkIFRocm93RW5kT2ZEYXRhKCkgICB7IFRocm93RXhjZXB0aW9uKCk7IH0NCitzdGF0aWMgaW5saW5lIHZvaWQgVGhyb3dVbnN1cHBvcnRlZCgpIHsgdGhyb3cgQ1Vuc3VwcG9ydGVkRmVhdHVyZUV4Y2VwdGlvbigpOyB9DQorc3RhdGljIGlubGluZSB2b2lkIFRocm93SW5jb3JyZWN0KCkgICB7IFRocm93RXhjZXB0aW9uKCk7IH0NCisNCitjbGFzcyBDU3RyZWFtU3dpdGNoDQorew0KKyAgQ0luQXJjaGl2ZSAqX2FyY2hpdmU7DQorICBib29sIF9uZWVkUmVtb3ZlOw0KKyAgYm9vbCBfbmVlZFVwZGF0ZVBvczsNCitwdWJsaWM6DQorICBDU3RyZWFtU3dpdGNoKCk6IF9uZWVkUmVtb3ZlKGZhbHNlKSwgX25lZWRVcGRhdGVQb3MoZmFsc2UpIHt9DQorICB+Q1N0cmVhbVN3aXRjaCgpIHsgUmVtb3ZlKCk7IH0NCisgIHZvaWQgUmVtb3ZlKCk7DQorICB2b2lkIFNldChDSW5BcmNoaXZlICphcmNoaXZlLCBjb25zdCBCeXRlICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBuZWVkVXBkYXRlUG9zKTsNCisgIHZvaWQgU2V0KENJbkFyY2hpdmUgKmFyY2hpdmUsIGNvbnN0IENCeXRlQnVmZmVyICZieXRlQnVmZmVyKTsNCisgIHZvaWQgU2V0KENJbkFyY2hpdmUgKmFyY2hpdmUsIGNvbnN0IENPYmplY3RWZWN0b3I8Q0J5dGVCdWZmZXI+ICpkYXRhVmVjdG9yKTsNCit9Ow0KKw0KK3ZvaWQgQ1N0cmVhbVN3aXRjaDo6UmVtb3ZlKCkNCit7DQorICBpZiAoX25lZWRSZW1vdmUpDQorICB7DQorICAgIGlmIChfYXJjaGl2ZS0+X2luQnl0ZUJhY2stPkdldFJlbSgpICE9IDApDQorICAgICAgX2FyY2hpdmUtPlRoZXJlSXNIZWFkZXJFcnJvciA9IHRydWU7DQorICAgIF9hcmNoaXZlLT5EZWxldGVCeXRlU3RyZWFtKF9uZWVkVXBkYXRlUG9zKTsNCisgICAgX25lZWRSZW1vdmUgPSBmYWxzZTsNCisgIH0NCit9DQorDQordm9pZCBDU3RyZWFtU3dpdGNoOjpTZXQoQ0luQXJjaGl2ZSAqYXJjaGl2ZSwgY29uc3QgQnl0ZSAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbmVlZFVwZGF0ZVBvcykNCit7DQorICBSZW1vdmUoKTsNCisgIF9hcmNoaXZlID0gYXJjaGl2ZTsNCisgIF9hcmNoaXZlLT5BZGRCeXRlU3RyZWFtKGRhdGEsIHNpemUpOw0KKyAgX25lZWRSZW1vdmUgPSB0cnVlOw0KKyAgX25lZWRVcGRhdGVQb3MgPSBuZWVkVXBkYXRlUG9zOw0KK30NCisNCit2b2lkIENTdHJlYW1Td2l0Y2g6OlNldChDSW5BcmNoaXZlICphcmNoaXZlLCBjb25zdCBDQnl0ZUJ1ZmZlciAmYnl0ZUJ1ZmZlcikNCit7DQorICBTZXQoYXJjaGl2ZSwgYnl0ZUJ1ZmZlciwgYnl0ZUJ1ZmZlci5TaXplKCksIGZhbHNlKTsNCit9DQorDQordm9pZCBDU3RyZWFtU3dpdGNoOjpTZXQoQ0luQXJjaGl2ZSAqYXJjaGl2ZSwgY29uc3QgQ09iamVjdFZlY3RvcjxDQnl0ZUJ1ZmZlcj4gKmRhdGFWZWN0b3IpDQorew0KKyAgUmVtb3ZlKCk7DQorICBCeXRlIGV4dGVybmFsID0gYXJjaGl2ZS0+UmVhZEJ5dGUoKTsNCisgIGlmIChleHRlcm5hbCAhPSAwKQ0KKyAgew0KKyAgICBDTnVtIGRhdGFJbmRleCA9IGFyY2hpdmUtPlJlYWROdW0oKTsNCisgICAgaWYgKGRhdGFJbmRleCA+PSBkYXRhVmVjdG9yLT5TaXplKCkpDQorICAgICAgVGhyb3dJbmNvcnJlY3QoKTsNCisgICAgU2V0KGFyY2hpdmUsICgqZGF0YVZlY3RvcilbZGF0YUluZGV4XSk7DQorICB9DQorfQ0KKw0KK3ZvaWQgQ0luQXJjaGl2ZTo6QWRkQnl0ZVN0cmVhbShjb25zdCBCeXRlICpidWYsIHNpemVfdCBzaXplKQ0KK3sNCisgIGlmIChfbnVtSW5CeXRlQnVmcyA9PSBrTnVtQnVmTGV2ZWxzTWF4KQ0KKyAgICBUaHJvd0luY29ycmVjdCgpOw0KKyAgX2luQnl0ZUJhY2sgPSAmX2luQnl0ZVZlY3RvcltfbnVtSW5CeXRlQnVmcysrXTsNCisgIF9pbkJ5dGVCYWNrLT5Jbml0KGJ1Ziwgc2l6ZSk7DQorfQ0KKyAgDQorDQorQnl0ZSBDSW5CeXRlMjo6UmVhZEJ5dGUoKQ0KK3sNCisgIGlmIChfcG9zID49IF9zaXplKQ0KKyAgICBUaHJvd0VuZE9mRGF0YSgpOw0KKyAgcmV0dXJuIF9idWZmZXJbX3BvcysrXTsNCit9DQorDQordm9pZCBDSW5CeXRlMjo6UmVhZEJ5dGVzKEJ5dGUgKmRhdGEsIHNpemVfdCBzaXplKQ0KK3sNCisgIGlmIChzaXplID4gX3NpemUgLSBfcG9zKQ0KKyAgICBUaHJvd0VuZE9mRGF0YSgpOw0KKyAgbWVtY3B5KGRhdGEsIF9idWZmZXIgKyBfcG9zLCBzaXplKTsNCisgIF9wb3MgKz0gc2l6ZTsNCit9DQorDQordm9pZCBDSW5CeXRlMjo6U2tpcERhdGEoVUludDY0IHNpemUpDQorew0KKyAgaWYgKHNpemUgPiBfc2l6ZSAtIF9wb3MpDQorICAgIFRocm93RW5kT2ZEYXRhKCk7DQorICBfcG9zICs9IChzaXplX3Qpc2l6ZTsNCit9DQorDQordm9pZCBDSW5CeXRlMjo6U2tpcERhdGEoKQ0KK3sNCisgIFNraXBEYXRhKFJlYWROdW1iZXIoKSk7DQorfQ0KKw0KK3N0YXRpYyBVSW50NjQgUmVhZE51bWJlclNwZWMoY29uc3QgQnl0ZSAqcCwgc2l6ZV90IHNpemUsIHNpemVfdCAmcHJvY2Vzc2VkKQ0KK3sNCisgIGlmIChzaXplID09IDApDQorICB7DQorICAgIHByb2Nlc3NlZCA9IDA7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgQnl0ZSBmaXJzdEJ5dGUgPSAqcCsrOw0KKyAgc2l6ZS0tOw0KKyAgaWYgKChmaXJzdEJ5dGUgJiAweDgwKSA9PSAwKQ0KKyAgew0KKyAgICBwcm9jZXNzZWQgPSAxOw0KKyAgICByZXR1cm4gZmlyc3RCeXRlOw0KKyAgfQ0KKyAgQnl0ZSBtYXNrID0gMHg0MDsNCisgIGlmIChzaXplID09IDApDQorICB7DQorICAgIHByb2Nlc3NlZCA9IDA7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgVUludDY0IHZhbHVlID0gKFVJbnQ2NCkqcDsNCisgIHArKzsNCisgIHNpemUtLTsNCisgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPCA4OyBpKyspDQorICB7DQorICAgIGlmICgoZmlyc3RCeXRlICYgbWFzaykgPT0gMCkNCisgICAgew0KKyAgICAgIFVJbnQ2NCBoaWdoUGFydCA9IGZpcnN0Qnl0ZSAmIChtYXNrIC0gMSk7DQorICAgICAgdmFsdWUgKz0gKGhpZ2hQYXJ0IDw8IChpICogOCkpOw0KKyAgICAgIHByb2Nlc3NlZCA9IGkgKyAxOw0KKyAgICAgIHJldHVybiB2YWx1ZTsNCisgICAgfQ0KKyAgICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICB7DQorICAgICAgcHJvY2Vzc2VkID0gMDsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICB2YWx1ZSB8PSAoKFVJbnQ2NCkqcCA8PCAoaSAqIDgpKTsNCisgICAgcCsrOw0KKyAgICBzaXplLS07DQorICAgIG1hc2sgPj49IDE7DQorICB9DQorICBwcm9jZXNzZWQgPSA5Ow0KKyAgcmV0dXJuIHZhbHVlOw0KK30NCisNCitVSW50NjQgQ0luQnl0ZTI6OlJlYWROdW1iZXIoKQ0KK3sNCisgIHNpemVfdCBwcm9jZXNzZWQ7DQorICBVSW50NjQgcmVzID0gUmVhZE51bWJlclNwZWMoX2J1ZmZlciArIF9wb3MsIF9zaXplIC0gX3BvcywgcHJvY2Vzc2VkKTsNCisgIGlmIChwcm9jZXNzZWQgPT0gMCkNCisgICAgVGhyb3dFbmRPZkRhdGEoKTsNCisgIF9wb3MgKz0gcHJvY2Vzc2VkOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorQ051bSBDSW5CeXRlMjo6UmVhZE51bSgpDQorew0KKyAgLyoNCisgIGlmIChfcG9zIDwgX3NpemUpDQorICB7DQorICAgIEJ5dGUgdmFsID0gX2J1ZmZlcltfcG9zXTsNCisgICAgaWYgKCh1bnNpZ25lZCl2YWwgPCAweDgwKQ0KKyAgICB7DQorICAgICAgX3BvcysrOw0KKyAgICAgIHJldHVybiAodW5zaWduZWQpdmFsOw0KKyAgICB9DQorICB9DQorICAqLw0KKyAgVUludDY0IHZhbHVlID0gUmVhZE51bWJlcigpOw0KKyAgaWYgKHZhbHVlID4ga051bU1heCkNCisgICAgVGhyb3dVbnN1cHBvcnRlZCgpOw0KKyAgcmV0dXJuIChDTnVtKXZhbHVlOw0KK30NCisNCitVSW50MzIgQ0luQnl0ZTI6OlJlYWRVSW50MzIoKQ0KK3sNCisgIGlmIChfcG9zICsgNCA+IF9zaXplKQ0KKyAgICBUaHJvd0VuZE9mRGF0YSgpOw0KKyAgVUludDMyIHJlcyA9IEdldDMyKF9idWZmZXIgKyBfcG9zKTsNCisgIF9wb3MgKz0gNDsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK1VJbnQ2NCBDSW5CeXRlMjo6UmVhZFVJbnQ2NCgpDQorew0KKyAgaWYgKF9wb3MgKyA4ID4gX3NpemUpDQorICAgIFRocm93RW5kT2ZEYXRhKCk7DQorICBVSW50NjQgcmVzID0gR2V0NjQoX2J1ZmZlciArIF9wb3MpOw0KKyAgX3BvcyArPSA4Ow0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorI2RlZmluZSBDSEVDS19TSUdOQVRVUkUgaWYgKHBbMF0gIT0gJzcnIHx8IHBbMV0gIT0gJ3onIHx8IHBbMl0gIT0gMHhCQyB8fCBwWzNdICE9IDB4QUYgfHwgcFs0XSAhPSAweDI3IHx8IHBbNV0gIT0gMHgxQykgcmV0dXJuIGZhbHNlOw0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBUZXN0U2lnbmF0dXJlKGNvbnN0IEJ5dGUgKnApDQorew0KKyAgQ0hFQ0tfU0lHTkFUVVJFDQorICByZXR1cm4gQ3JjQ2FsYyhwICsgMTIsIDIwKSA9PSBHZXQzMihwICsgOCk7DQorfQ0KKw0KKyNpZmRlZiBGT1JNQVRfN1pfUkVDT1ZFUlkNCitzdGF0aWMgaW5saW5lIGJvb2wgVGVzdFNpZ25hdHVyZTIoY29uc3QgQnl0ZSAqcCkNCit7DQorICBDSEVDS19TSUdOQVRVUkU7DQorICBpZiAoQ3JjQ2FsYyhwICsgMTIsIDIwKSA9PSBHZXQzMihwICsgOCkpDQorICAgIHJldHVybiB0cnVlOw0KKyAgZm9yICh1bnNpZ25lZCBpID0gODsgaSA8IGtIZWFkZXJTaXplOyBpKyspDQorICAgIGlmIChwW2ldICE9IDApDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIChwWzZdICE9IDAgfHwgcFs3XSAhPSAwKTsNCit9DQorI2Vsc2UNCisjZGVmaW5lIFRlc3RTaWduYXR1cmUyKHApIFRlc3RTaWduYXR1cmUocCkNCisjZW5kaWYNCisNCitIUkVTVUxUIENJbkFyY2hpdmU6OkZpbmRBbmRSZWFkU2lnbmF0dXJlKElJblN0cmVhbSAqc3RyZWFtLCBjb25zdCBVSW50NjQgKnNlYXJjaEhlYWRlclNpemVMaW1pdCkNCit7DQorICBSSU5PSyhSZWFkU3RyZWFtX0ZBTFNFKHN0cmVhbSwgX2hlYWRlciwga0hlYWRlclNpemUpKTsNCisNCisgIGlmIChUZXN0U2lnbmF0dXJlMihfaGVhZGVyKSkNCisgICAgcmV0dXJuIFNfT0s7DQorICBpZiAoc2VhcmNoSGVhZGVyU2l6ZUxpbWl0ICYmICpzZWFyY2hIZWFkZXJTaXplTGltaXQgPT0gMCkNCisgICAgcmV0dXJuIFNfRkFMU0U7DQorDQorICBjb25zdCBVSW50MzIga0J1ZlNpemUgPSAxIDw8IDE1Ow0KKyAgQ0J5dGVBcnIgYnVmKGtCdWZTaXplKTsNCisgIG1lbWNweShidWYsIF9oZWFkZXIsIGtIZWFkZXJTaXplKTsNCisgIFVJbnQ2NCBvZmZzZXQgPSAwOw0KKyAgDQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBVSW50MzIgcmVhZFNpemUgPSBrQnVmU2l6ZSAtIGtIZWFkZXJTaXplOw0KKyAgICB7DQorICAgICAgVUludDY0IHJlbSA9ICpzZWFyY2hIZWFkZXJTaXplTGltaXQgLSBvZmZzZXQ7DQorICAgICAgaWYgKHJlYWRTaXplID4gcmVtKQ0KKyAgICAgICAgcmVhZFNpemUgPSAoVUludDMyKXJlbTsNCisgICAgICBpZiAocmVhZFNpemUgPT0gMCkNCisgICAgICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgICB9DQorICAgIFVJbnQzMiBwcm9jZXNzZWQgPSAwOw0KKyAgICBSSU5PSyhzdHJlYW0tPlJlYWQoYnVmICsga0hlYWRlclNpemUsIHJlYWRTaXplLCAmcHJvY2Vzc2VkKSk7DQorICAgIGlmIChwcm9jZXNzZWQgPT0gMCkNCisgICAgICByZXR1cm4gU19GQUxTRTsNCisgICAgZm9yIChVSW50MzIgcG9zID0gMDs7KQ0KKyAgICB7DQorICAgICAgY29uc3QgQnl0ZSAqcCA9IGJ1ZiArIHBvcyArIDE7DQorICAgICAgY29uc3QgQnl0ZSAqbGltID0gYnVmICsgcHJvY2Vzc2VkOw0KKyAgICAgIGZvciAoOyBwIDw9IGxpbTsgcCArPSA0KQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChwWzBdID09ICc3JykgYnJlYWs7DQorICAgICAgICBpZiAocFsxXSA9PSAnNycpIHsgcCArPSAxOyBicmVhazsgfQ0KKyAgICAgICAgaWYgKHBbMl0gPT0gJzcnKSB7IHAgKz0gMjsgYnJlYWs7IH0NCisgICAgICAgIGlmIChwWzNdID09ICc3JykgeyBwICs9IDM7IGJyZWFrOyB9DQorICAgICAgfTsNCisgICAgICBpZiAocCA+IGxpbSkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIHBvcyA9IChVSW50MzIpKHAgLSBidWYpOw0KKyAgICAgIGlmIChUZXN0U2lnbmF0dXJlKHApKQ0KKyAgICAgIHsNCisgICAgICAgIG1lbWNweShfaGVhZGVyLCBwLCBrSGVhZGVyU2l6ZSk7DQorICAgICAgICBfYXJoaXZlQmVnaW5TdHJlYW1Qb3NpdGlvbiArPSBvZmZzZXQgKyBwb3M7DQorICAgICAgICByZXR1cm4gc3RyZWFtLT5TZWVrKF9hcmhpdmVCZWdpblN0cmVhbVBvc2l0aW9uICsga0hlYWRlclNpemUsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIG9mZnNldCArPSBwcm9jZXNzZWQ7DQorICAgIG1lbW1vdmUoYnVmLCBidWYgKyBwcm9jZXNzZWQsIGtIZWFkZXJTaXplKTsNCisgIH0NCit9DQorDQorLy8gU19GQUxTRSBtZWFucyB0aGF0IGZpbGUgaXMgbm90IGFyY2hpdmUNCitIUkVTVUxUIENJbkFyY2hpdmU6Ok9wZW4oSUluU3RyZWFtICpzdHJlYW0sIGNvbnN0IFVJbnQ2NCAqc2VhcmNoSGVhZGVyU2l6ZUxpbWl0KQ0KK3sNCisgIEhlYWRlcnNTaXplID0gMDsNCisgIENsb3NlKCk7DQorICBSSU5PSyhzdHJlYW0tPlNlZWsoMCwgU1RSRUFNX1NFRUtfQ1VSLCAmX2FyaGl2ZUJlZ2luU3RyZWFtUG9zaXRpb24pKQ0KKyAgUklOT0soc3RyZWFtLT5TZWVrKDAsIFNUUkVBTV9TRUVLX0VORCwgJl9maWxlRW5kUG9zaXRpb24pKQ0KKyAgUklOT0soc3RyZWFtLT5TZWVrKF9hcmhpdmVCZWdpblN0cmVhbVBvc2l0aW9uLCBTVFJFQU1fU0VFS19TRVQsIE5VTEwpKQ0KKyAgUklOT0soRmluZEFuZFJlYWRTaWduYXR1cmUoc3RyZWFtLCBzZWFyY2hIZWFkZXJTaXplTGltaXQpKTsNCisgIF9zdHJlYW0gPSBzdHJlYW07DQorICByZXR1cm4gU19PSzsNCit9DQorICANCit2b2lkIENJbkFyY2hpdmU6OkNsb3NlKCkNCit7DQorICBfbnVtSW5CeXRlQnVmcyA9IDA7DQorICBfc3RyZWFtLlJlbGVhc2UoKTsNCisgIFRoZXJlSXNIZWFkZXJFcnJvciA9IGZhbHNlOw0KK30NCisNCit2b2lkIENJbkFyY2hpdmU6OlJlYWRBcmNoaXZlUHJvcGVydGllcyhDSW5BcmNoaXZlSW5mbyAmIC8qIGFyY2hpdmVJbmZvICovKQ0KK3sNCisgIGZvciAoOzspDQorICB7DQorICAgIGlmIChSZWFkSUQoKSA9PSBOSUQ6OmtFbmQpDQorICAgICAgYnJlYWs7DQorICAgIFNraXBEYXRhKCk7DQorICB9DQorfQ0KKw0KKy8vIENGb2xkZXIgJmZvbGRlciBjYW4gYmUgbm9uIGVtcHR5LiBTbyB3ZSBtdXN0IHNldCBhbGwgZmllbGRzDQorDQordm9pZCBDSW5CeXRlMjo6UGFyc2VGb2xkZXIoQ0ZvbGRlciAmZm9sZGVyKQ0KK3sNCisgIENOdW0gbnVtQ29kZXJzID0gUmVhZE51bSgpOw0KKw0KKyAgZm9sZGVyLkNvZGVycy5TZXRTaXplKG51bUNvZGVycyk7DQorDQorICBDTnVtIG51bUluU3RyZWFtcyA9IDA7DQorICBDTnVtIG51bU91dFN0cmVhbXMgPSAwOw0KKyAgQ051bSBpOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bUNvZGVyczsgaSsrKQ0KKyAgew0KKyAgICBDQ29kZXJJbmZvICZjb2RlciA9IGZvbGRlci5Db2RlcnNbaV07DQorICAgIHsNCisgICAgICBCeXRlIG1haW5CeXRlID0gUmVhZEJ5dGUoKTsNCisgICAgICBpZiAoKG1haW5CeXRlICYgMHhDMCkgIT0gMCkNCisgICAgICAgIFRocm93VW5zdXBwb3J0ZWQoKTsNCisgICAgICB1bnNpZ25lZCBpZFNpemUgPSAobWFpbkJ5dGUgJiAweEYpOw0KKyAgICAgIGlmIChpZFNpemUgPiA4IHx8IGlkU2l6ZSA+IEdldFJlbSgpKQ0KKyAgICAgICAgVGhyb3dVbnN1cHBvcnRlZCgpOw0KKyAgICAgIGNvbnN0IEJ5dGUgKmxvbmdJRCA9IEdldFB0cigpOw0KKyAgICAgIFVJbnQ2NCBpZCA9IDA7DQorICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGlkU2l6ZTsgaisrKQ0KKyAgICAgICAgaWQgPSAoKGlkIDw8IDgpIHwgbG9uZ0lEW2pdKTsNCisgICAgICBTa2lwRGF0YU5vQ2hlY2soaWRTaXplKTsNCisgICAgICBjb2Rlci5NZXRob2RJRCA9IGlkOw0KKw0KKyAgICAgIGlmICgobWFpbkJ5dGUgJiAweDEwKSAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgIGNvZGVyLk51bUluU3RyZWFtcyA9IFJlYWROdW0oKTsNCisgICAgICAgIGNvZGVyLk51bU91dFN0cmVhbXMgPSBSZWFkTnVtKCk7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBjb2Rlci5OdW1JblN0cmVhbXMgPSAxOw0KKyAgICAgICAgY29kZXIuTnVtT3V0U3RyZWFtcyA9IDE7DQorICAgICAgfQ0KKyAgICAgIGlmICgobWFpbkJ5dGUgJiAweDIwKSAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgIENOdW0gcHJvcHNTaXplID0gUmVhZE51bSgpOw0KKyAgICAgICAgY29kZXIuUHJvcHMuQWxsb2MoKHNpemVfdClwcm9wc1NpemUpOw0KKyAgICAgICAgUmVhZEJ5dGVzKChCeXRlICopY29kZXIuUHJvcHMsIChzaXplX3QpcHJvcHNTaXplKTsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgICAgY29kZXIuUHJvcHMuRnJlZSgpOw0KKyAgICB9DQorICAgIG51bUluU3RyZWFtcyArPSBjb2Rlci5OdW1JblN0cmVhbXM7DQorICAgIG51bU91dFN0cmVhbXMgKz0gY29kZXIuTnVtT3V0U3RyZWFtczsNCisgIH0NCisNCisgIENOdW0gbnVtQmluZFBhaXJzID0gbnVtT3V0U3RyZWFtcyAtIDE7DQorICBmb2xkZXIuQmluZFBhaXJzLlNldFNpemUobnVtQmluZFBhaXJzKTsNCisgIGZvciAoaSA9IDA7IGkgPCBudW1CaW5kUGFpcnM7IGkrKykNCisgIHsNCisgICAgQ0JpbmRQYWlyICZicCA9IGZvbGRlci5CaW5kUGFpcnNbaV07DQorICAgIGJwLkluSW5kZXggPSBSZWFkTnVtKCk7DQorICAgIGJwLk91dEluZGV4ID0gUmVhZE51bSgpOw0KKyAgfQ0KKw0KKyAgaWYgKG51bUluU3RyZWFtcyA8IG51bUJpbmRQYWlycykNCisgICAgVGhyb3dVbnN1cHBvcnRlZCgpOw0KKyAgQ051bSBudW1QYWNrU3RyZWFtcyA9IG51bUluU3RyZWFtcyAtIG51bUJpbmRQYWlyczsNCisgIGZvbGRlci5QYWNrU3RyZWFtcy5TZXRTaXplKG51bVBhY2tTdHJlYW1zKTsNCisgIGlmIChudW1QYWNrU3RyZWFtcyA9PSAxKQ0KKyAgew0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtSW5TdHJlYW1zOyBpKyspDQorICAgICAgaWYgKGZvbGRlci5GaW5kQmluZFBhaXJGb3JJblN0cmVhbShpKSA8IDApDQorICAgICAgew0KKyAgICAgICAgZm9sZGVyLlBhY2tTdHJlYW1zWzBdID0gaTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgaWYgKGkgPT0gbnVtSW5TdHJlYW1zKQ0KKyAgICAgIFRocm93VW5zdXBwb3J0ZWQoKTsNCisgIH0NCisgIGVsc2UNCisgICAgZm9yIChpID0gMDsgaSA8IG51bVBhY2tTdHJlYW1zOyBpKyspDQorICAgICAgZm9sZGVyLlBhY2tTdHJlYW1zW2ldID0gUmVhZE51bSgpOw0KK30NCisNCit2b2lkIENGb2xkZXJzOjpQYXJzZUZvbGRlckluZm8odW5zaWduZWQgZm9sZGVySW5kZXgsIENGb2xkZXIgJmZvbGRlcikgY29uc3QNCit7DQorICBzaXplX3Qgc3RhcnRQb3MgPSBGb0NvZGVyc0RhdGFPZmZzZXRbZm9sZGVySW5kZXhdOw0KKyAgQ0luQnl0ZTIgaW5CeXRlOw0KKyAgaW5CeXRlLkluaXQoQ29kZXJzRGF0YSArIHN0YXJ0UG9zLCBGb0NvZGVyc0RhdGFPZmZzZXRbZm9sZGVySW5kZXggKyAxXSAtIHN0YXJ0UG9zKTsNCisgIGluQnl0ZS5QYXJzZUZvbGRlcihmb2xkZXIpOw0KKyAgaWYgKGluQnl0ZS5HZXRSZW0oKSAhPSAwKQ0KKyAgICB0aHJvdyAyMDEyMDQyNDsNCit9DQorDQorDQordm9pZCBDRGF0YWJhc2U6OkdldFBhdGgodW5zaWduZWQgaW5kZXgsIFVTdHJpbmcgJnBhdGgpIGNvbnN0DQorew0KKyAgcGF0aC5FbXB0eSgpOw0KKyAgaWYgKCFOYW1lT2Zmc2V0cyB8fCAhTmFtZXNCdWYpDQorICAgIHJldHVybjsNCisNCisgIHNpemVfdCBvZmZzZXQgPSBOYW1lT2Zmc2V0c1tpbmRleF07DQorICBzaXplX3Qgc2l6ZSA9IE5hbWVPZmZzZXRzW2luZGV4ICsgMV0gLSBvZmZzZXQgLSAxOw0KKw0KKyAgaWYgKHNpemUgPj0gKDEgPDwgMjApKQ0KKyAgICByZXR1cm47DQorDQorICB3Y2hhcl90ICpzID0gcGF0aC5HZXRCdWZmZXIoKHVuc2lnbmVkKXNpemUpOw0KKw0KKyAgY29uc3QgQnl0ZSAqcCA9ICgoY29uc3QgQnl0ZSAqKU5hbWVzQnVmICsgb2Zmc2V0ICogMik7DQorDQorICAjaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoTVlfQ1BVX0xFKQ0KKyAgDQorICB3bWVtY3B5KHMsIChjb25zdCB3Y2hhcl90ICopcCwgc2l6ZSk7DQorICANCisgICNlbHNlDQorDQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykNCisgIHsNCisgICAgKnMgPSBHZXQxNihwKTsNCisgICAgcCArPSAyOw0KKyAgICBzKys7DQorICB9DQorDQorICAjZW5kaWYNCisNCisgIHBhdGguUmVsZWFzZUJ1ZmZlcigodW5zaWduZWQpc2l6ZSk7DQorfQ0KKw0KK0hSRVNVTFQgQ0RhdGFiYXNlOjpHZXRQYXRoX1Byb3AodW5zaWduZWQgaW5kZXgsIFBST1BWQVJJQU5UICpwYXRoKSBjb25zdCB0aHJvdygpDQorew0KKyAgUHJvcFZhcmlhbnRfQ2xlYXIocGF0aCk7DQorICBpZiAoIU5hbWVPZmZzZXRzIHx8ICFOYW1lc0J1ZikNCisgICAgcmV0dXJuIFNfT0s7DQorDQorICBzaXplX3Qgb2Zmc2V0ID0gTmFtZU9mZnNldHNbaW5kZXhdOw0KKyAgc2l6ZV90IHNpemUgPSBOYW1lT2Zmc2V0c1tpbmRleCArIDFdIC0gb2Zmc2V0Ow0KKw0KKyAgaWYgKHNpemUgPj0gKDEgPDwgMTQpKQ0KKyAgICByZXR1cm4gU19PSzsNCisNCisgIFJJTk9LKFByb3BWYXJFbV9BbGxvY19Cc3RyKHBhdGgsICh1bnNpZ25lZClzaXplIC0gMSkpOw0KKyAgd2NoYXJfdCAqcyA9IHBhdGgtPmJzdHJWYWw7DQorDQorICBjb25zdCBCeXRlICpwID0gKChjb25zdCBCeXRlICopTmFtZXNCdWYgKyBvZmZzZXQgKiAyKTsNCisNCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KKyAgew0KKyAgICB3Y2hhcl90IGMgPSBHZXQxNihwKTsNCisgICAgcCArPSAyOw0KKyAgICAjaWYgV0NIQVJfUEFUSF9TRVBBUkFUT1IgIT0gTCcvJw0KKyAgICBpZiAoYyA9PSBMJy8nKQ0KKyAgICAgIGMgPSBXQ0hBUl9QQVRIX1NFUEFSQVRPUjsNCisgICAgI2VuZGlmDQorICAgICpzKysgPSBjOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIFNfT0s7DQorDQorICAvKg0KKyAgdW5zaWduZWQgY3VyID0gaW5kZXg7DQorICB1bnNpZ25lZCBzaXplID0gMDsNCisgIA0KKyAgZm9yIChpbnQgaSA9IDA7OyBpKyspDQorICB7DQorICAgIHNpemVfdCBsZW4gPSBOYW1lT2Zmc2V0c1tjdXIgKyAxXSAtIE5hbWVPZmZzZXRzW2N1cl07DQorICAgIHNpemUgKz0gKHVuc2lnbmVkKWxlbjsNCisgICAgaWYgKGkgPiAyNTYgfHwgbGVuID4gKDEgPDwgMTQpIHx8IHNpemUgPiAoMSA8PCAxNCkpDQorICAgICAgcmV0dXJuIFByb3BWYXJFbV9TZXRfU3RyKHBhdGgsICJbVE9PLUxPTkddIik7DQorICAgIGN1ciA9IEZpbGVzW2N1cl0uUGFyZW50Ow0KKyAgICBpZiAoY3VyIDwgMCkNCisgICAgICBicmVhazsNCisgIH0NCisgIHNpemUtLTsNCisNCisgIFJJTk9LKFByb3BWYXJFbV9BbGxvY19Cc3RyKHBhdGgsIHNpemUpKTsNCisgIHdjaGFyX3QgKnMgPSBwYXRoLT5ic3RyVmFsOw0KKyAgcyArPSBzaXplOw0KKyAgKnMgPSAwOw0KKyAgY3VyID0gaW5kZXg7DQorICANCisgIGZvciAoOzspDQorICB7DQorICAgIHVuc2lnbmVkIGxlbiA9ICh1bnNpZ25lZCkoTmFtZU9mZnNldHNbY3VyICsgMV0gLSBOYW1lT2Zmc2V0c1tjdXJdIC0gMSk7DQorICAgIGNvbnN0IEJ5dGUgKnAgPSAoY29uc3QgQnl0ZSAqKU5hbWVzQnVmICsgKE5hbWVPZmZzZXRzW2N1ciArIDFdICogMikgLSAyOw0KKyAgICBkbw0KKyAgICB7DQorICAgICAgcCAtPSAyOw0KKyAgICAgIC0tczsNCisgICAgICB3Y2hhcl90IGMgPSBHZXQxNihwKTsNCisgICAgICBpZiAoYyA9PSAnLycpDQorICAgICAgICBjID0gV0NIQVJfUEFUSF9TRVBBUkFUT1I7DQorICAgICAgKnMgPSBjOw0KKyAgICB9DQorICAgIHdoaWxlICgtLWxlbik7DQorICAgIGNvbnN0IENGaWxlSXRlbSAmZmlsZSA9IEZpbGVzW2N1cl07DQorICAgIGN1ciA9IGZpbGUuUGFyZW50Ow0KKyAgICBpZiAoY3VyIDwgMCkNCisgICAgICByZXR1cm4gU19PSzsNCisgICAgKigtLXMpID0gKGZpbGUuSXNBbHRTdHJlYW0gPyAnOicgOiBXQ0hBUl9QQVRIX1NFUEFSQVRPUik7DQorICB9DQorICAqLw0KK30NCisNCit2b2lkIENJbkFyY2hpdmU6OldhaXRJZChVSW50NjQgaWQpDQorew0KKyAgZm9yICg7OykNCisgIHsNCisgICAgVUludDY0IHR5cGUgPSBSZWFkSUQoKTsNCisgICAgaWYgKHR5cGUgPT0gaWQpDQorICAgICAgcmV0dXJuOw0KKyAgICBpZiAodHlwZSA9PSBOSUQ6OmtFbmQpDQorICAgICAgVGhyb3dJbmNvcnJlY3QoKTsNCisgICAgU2tpcERhdGEoKTsNCisgIH0NCit9DQorDQordm9pZCBDSW5BcmNoaXZlOjpSZWFkSGFzaERpZ2VzdHModW5zaWduZWQgbnVtSXRlbXMsIENVSW50MzJEZWZWZWN0b3IgJmNyY3MpDQorew0KKyAgUmVhZEJvb2xWZWN0b3IyKG51bUl0ZW1zLCBjcmNzLkRlZnMpOw0KKyAgY3Jjcy5WYWxzLkNsZWFyQW5kU2V0U2l6ZShudW1JdGVtcyk7DQorICBVSW50MzIgKnAgPSAmY3Jjcy5WYWxzWzBdOw0KKyAgY29uc3QgYm9vbCAqZGVmcyA9ICZjcmNzLkRlZnNbMF07DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykNCisgIHsNCisgICAgVUludDMyIGNyYyA9IDA7DQorICAgIGlmIChkZWZzW2ldKQ0KKyAgICAgIGNyYyA9IFJlYWRVSW50MzIoKTsNCisgICAgcFtpXSA9IGNyYzsNCisgIH0NCit9DQorDQordm9pZCBDSW5BcmNoaXZlOjpSZWFkUGFja0luZm8oQ0ZvbGRlcnMgJmYpDQorew0KKyAgQ051bSBudW1QYWNrU3RyZWFtcyA9IFJlYWROdW0oKTsNCisgIA0KKyAgV2FpdElkKE5JRDo6a1NpemUpOw0KKyAgZi5QYWNrUG9zaXRpb25zLkFsbG9jKG51bVBhY2tTdHJlYW1zICsgMSk7DQorICBmLk51bVBhY2tTdHJlYW1zID0gbnVtUGFja1N0cmVhbXM7DQorICBVSW50NjQgc3VtID0gMDsNCisgIGZvciAoQ051bSBpID0gMDsgaSA8IG51bVBhY2tTdHJlYW1zOyBpKyspDQorICB7DQorICAgIGYuUGFja1Bvc2l0aW9uc1tpXSA9IHN1bTsNCisgICAgVUludDY0IHBhY2tTaXplID0gUmVhZE51bWJlcigpOw0KKyAgICBzdW0gKz0gcGFja1NpemU7DQorICAgIGlmIChzdW0gPCBwYWNrU2l6ZSkNCisgICAgICBUaHJvd0luY29ycmVjdCgpOw0KKyAgfQ0KKyAgZi5QYWNrUG9zaXRpb25zW251bVBhY2tTdHJlYW1zXSA9IHN1bTsNCisNCisgIFVJbnQ2NCB0eXBlOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgdHlwZSA9IFJlYWRJRCgpOw0KKyAgICBpZiAodHlwZSA9PSBOSUQ6OmtFbmQpDQorICAgICAgcmV0dXJuOw0KKyAgICBpZiAodHlwZSA9PSBOSUQ6OmtDUkMpDQorICAgIHsNCisgICAgICBDVUludDMyRGVmVmVjdG9yIFBhY2tDUkNzOw0KKyAgICAgIFJlYWRIYXNoRGlnZXN0cyhudW1QYWNrU3RyZWFtcywgUGFja0NSQ3MpOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIFNraXBEYXRhKCk7DQorICB9DQorfQ0KKw0KK3ZvaWQgQ0luQXJjaGl2ZTo6UmVhZFVucGFja0luZm8oDQorICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q0J5dGVCdWZmZXI+ICpkYXRhVmVjdG9yLA0KKyAgICBDRm9sZGVycyAmZm9sZGVycykNCit7DQorICBXYWl0SWQoTklEOjprRm9sZGVyKTsNCisgIENOdW0gbnVtRm9sZGVycyA9IFJlYWROdW0oKTsNCisNCisgIENOdW0gbnVtQ29kZXJzT3V0U3RyZWFtcyA9IDA7DQorICB7DQorICAgIENTdHJlYW1Td2l0Y2ggc3RyZWFtU3dpdGNoOw0KKyAgICBzdHJlYW1Td2l0Y2guU2V0KHRoaXMsIGRhdGFWZWN0b3IpOw0KKyAgICBjb25zdCBCeXRlICpzdGFydEJ1ZlB0ciA9IF9pbkJ5dGVCYWNrLT5HZXRQdHIoKTsNCisgICAgZm9sZGVycy5OdW1Gb2xkZXJzID0gbnVtRm9sZGVyczsNCisNCisgICAgZm9sZGVycy5Gb1N0YXJ0UGFja1N0cmVhbUluZGV4LkFsbG9jKG51bUZvbGRlcnMgKyAxKTsNCisgICAgZm9sZGVycy5Gb1RvTWFpblVucGFja1NpemVJbmRleC5BbGxvYyhudW1Gb2xkZXJzKTsNCisgICAgZm9sZGVycy5Gb0NvZGVyc0RhdGFPZmZzZXQuQWxsb2MobnVtRm9sZGVycyArIDEpOw0KKyAgICBmb2xkZXJzLkZvVG9Db2RlclVucGFja1NpemVzLkFsbG9jKG51bUZvbGRlcnMgKyAxKTsNCisNCisgICAgQ1JlY29yZFZlY3Rvcjxib29sPiBJblN0cmVhbVVzZWQ7DQorICAgIENSZWNvcmRWZWN0b3I8Ym9vbD4gT3V0U3RyZWFtVXNlZDsNCisNCisgICAgQ051bSBwYWNrU3RyZWFtSW5kZXggPSAwOw0KKyAgICBDTnVtIGZvOw0KKyAgICBDSW5CeXRlMiAqaW5CeXRlID0gX2luQnl0ZUJhY2s7DQorICAgIGZvciAoZm8gPSAwOyBmbyA8IG51bUZvbGRlcnM7IGZvKyspDQorICAgIHsNCisgICAgICBVSW50MzIgbnVtT3V0U3RyZWFtcyA9IDA7DQorICAgICAgVUludDMyIGluZGV4T2ZNYWluU3RyZWFtID0gMDsNCisgICAgICBVSW50MzIgbnVtUGFja1N0cmVhbXMgPSAwOw0KKyAgICAgIGZvbGRlcnMuRm9Db2RlcnNEYXRhT2Zmc2V0W2ZvXSA9IF9pbkJ5dGVCYWNrLT5HZXRQdHIoKSAtIHN0YXJ0QnVmUHRyOw0KKw0KKyAgICAgIG51bU91dFN0cmVhbXMgPSAwOw0KKyAgICAgIENOdW0gbnVtSW5TdHJlYW1zID0gMDsNCisgICAgICBDTnVtIG51bUNvZGVycyA9IGluQnl0ZS0+UmVhZE51bSgpOw0KKyAgICAgIGZvciAoQ051bSBjaSA9IDA7IGNpIDwgbnVtQ29kZXJzOyBjaSsrKQ0KKyAgICAgIHsNCisgICAgICAgIEJ5dGUgbWFpbkJ5dGUgPSBpbkJ5dGUtPlJlYWRCeXRlKCk7DQorICAgICAgICBpZiAoKG1haW5CeXRlICYgMHhDMCkgIT0gMCkNCisgICAgICAgICAgVGhyb3dVbnN1cHBvcnRlZCgpOw0KKyAgICAgICAgdW5zaWduZWQgaWRTaXplID0gKG1haW5CeXRlICYgMHhGKTsNCisgICAgICAgIGlmIChpZFNpemUgPiA4KQ0KKyAgICAgICAgICBUaHJvd1Vuc3VwcG9ydGVkKCk7DQorICAgICAgICBpZiAoaWRTaXplID4gaW5CeXRlLT5HZXRSZW0oKSkNCisgICAgICAgICAgVGhyb3dFbmRPZkRhdGEoKTsNCisgICAgICAgIGNvbnN0IEJ5dGUgKmxvbmdJRCA9IGluQnl0ZS0+R2V0UHRyKCk7DQorICAgICAgICBVSW50NjQgaWQgPSAwOw0KKyAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGlkU2l6ZTsgaisrKQ0KKyAgICAgICAgICBpZCA9ICgoaWQgPDwgOCkgfCBsb25nSURbal0pOw0KKyAgICAgICAgaW5CeXRlLT5Ta2lwRGF0YU5vQ2hlY2soaWRTaXplKTsNCisgICAgICAgIGlmIChmb2xkZXJzLlBhcnNlZE1ldGhvZHMuSURzLlNpemUoKSA8IDEyOCkNCisgICAgICAgICAgZm9sZGVycy5QYXJzZWRNZXRob2RzLklEcy5BZGRUb1VuaXF1ZVNvcnRlZChpZCk7DQorICAgICAgICBDTnVtIGNvZGVySW5TdHJlYW1zID0gMTsNCisgICAgICAgIENOdW0gY29kZXJPdXRTdHJlYW1zID0gMTsNCisgICAgICAgIGlmICgobWFpbkJ5dGUgJiAweDEwKSAhPSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBjb2RlckluU3RyZWFtcyA9IGluQnl0ZS0+UmVhZE51bSgpOw0KKyAgICAgICAgICBjb2Rlck91dFN0cmVhbXMgPSBpbkJ5dGUtPlJlYWROdW0oKTsNCisgICAgICAgIH0NCisgICAgICAgIG51bUluU3RyZWFtcyArPSBjb2RlckluU3RyZWFtczsNCisgICAgICAgIGlmIChudW1JblN0cmVhbXMgPCBjb2RlckluU3RyZWFtcykNCisgICAgICAgICAgVGhyb3dVbnN1cHBvcnRlZCgpOw0KKyAgICAgICAgbnVtT3V0U3RyZWFtcyArPSBjb2Rlck91dFN0cmVhbXM7DQorICAgICAgICBpZiAobnVtT3V0U3RyZWFtcyA8IGNvZGVyT3V0U3RyZWFtcykNCisgICAgICAgICAgVGhyb3dVbnN1cHBvcnRlZCgpOw0KKyAgICAgICAgaWYgKChtYWluQnl0ZSAmIDB4MjApICE9IDApDQorICAgICAgICB7DQorICAgICAgICAgIENOdW0gcHJvcHNTaXplID0gaW5CeXRlLT5SZWFkTnVtKCk7DQorICAgICAgICAgIGlmIChwcm9wc1NpemUgPiBpbkJ5dGUtPkdldFJlbSgpKQ0KKyAgICAgICAgICAgIFRocm93RW5kT2ZEYXRhKCk7DQorICAgICAgICAgIGlmIChpZCA9PSBrX0xaTUEyICYmIHByb3BzU2l6ZSA9PSAxKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgQnl0ZSB2ID0gKl9pbkJ5dGVCYWNrLT5HZXRQdHIoKTsNCisgICAgICAgICAgICBpZiAoZm9sZGVycy5QYXJzZWRNZXRob2RzLkx6bWEyUHJvcCA8IHYpDQorICAgICAgICAgICAgICBmb2xkZXJzLlBhcnNlZE1ldGhvZHMuTHptYTJQcm9wID0gdjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBlbHNlIGlmIChpZCA9PSBrX0xaTUEgJiYgcHJvcHNTaXplID09IDUpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBVSW50MzIgZGljU2l6ZSA9IEdldFVpMzIoX2luQnl0ZUJhY2stPkdldFB0cigpICsgMSk7DQorICAgICAgICAgICAgaWYgKGZvbGRlcnMuUGFyc2VkTWV0aG9kcy5Mem1hRGljIDwgZGljU2l6ZSkNCisgICAgICAgICAgICAgIGZvbGRlcnMuUGFyc2VkTWV0aG9kcy5Mem1hRGljID0gZGljU2l6ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbkJ5dGUtPlNraXBEYXRhTm9DaGVjaygoc2l6ZV90KXByb3BzU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIGlmIChudW1PdXRTdHJlYW1zID09IDEgJiYgbnVtSW5TdHJlYW1zID09IDEpDQorICAgICAgew0KKyAgICAgICAgaW5kZXhPZk1haW5TdHJlYW0gPSAwOw0KKyAgICAgICAgbnVtUGFja1N0cmVhbXMgPSAxOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgVUludDMyIGk7DQorICAgICAgICBpZiAobnVtT3V0U3RyZWFtcyA9PSAwKQ0KKyAgICAgICAgICBUaHJvd1Vuc3VwcG9ydGVkKCk7DQorICAgICAgICBDTnVtIG51bUJpbmRQYWlycyA9IG51bU91dFN0cmVhbXMgLSAxOw0KKyAgICAgICAgaWYgKG51bUluU3RyZWFtcyA8IG51bUJpbmRQYWlycykNCisgICAgICAgICAgVGhyb3dVbnN1cHBvcnRlZCgpOw0KKyAgICAgICAgaWYgKG51bUluU3RyZWFtcyA+PSAyNTYgfHwgbnVtT3V0U3RyZWFtcyA+PSAyNTYpDQorICAgICAgICAgIFRocm93VW5zdXBwb3J0ZWQoKTsNCisgICAgICAgIA0KKyAgICAgICAgSW5TdHJlYW1Vc2VkLkNsZWFyQW5kU2V0U2l6ZShudW1JblN0cmVhbXMpOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUluU3RyZWFtczsgaSsrKQ0KKyAgICAgICAgICBJblN0cmVhbVVzZWRbaV0gPSBmYWxzZTsNCisgICAgICAgIA0KKyAgICAgICAgT3V0U3RyZWFtVXNlZC5DbGVhckFuZFNldFNpemUobnVtT3V0U3RyZWFtcyk7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtT3V0U3RyZWFtczsgaSsrKQ0KKyAgICAgICAgICBPdXRTdHJlYW1Vc2VkW2ldID0gZmFsc2U7DQorICAgICAgICANCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1CaW5kUGFpcnM7IGkrKykNCisgICAgICAgIHsNCisgICAgICAgICAgQ051bSBpbmRleCA9IFJlYWROdW0oKTsNCisgICAgICAgICAgaWYgKGluZGV4ID49IG51bUluU3RyZWFtcyB8fCBJblN0cmVhbVVzZWRbaW5kZXhdKQ0KKyAgICAgICAgICAgIFRocm93VW5zdXBwb3J0ZWQoKTsNCisgICAgICAgICAgSW5TdHJlYW1Vc2VkW2luZGV4XSA9IHRydWU7DQorICAgICAgICAgIGluZGV4ID0gUmVhZE51bSgpOw0KKyAgICAgICAgICBpZiAoaW5kZXggPj0gbnVtT3V0U3RyZWFtcyB8fCBPdXRTdHJlYW1Vc2VkW2luZGV4XSkNCisgICAgICAgICAgICBUaHJvd1Vuc3VwcG9ydGVkKCk7DQorICAgICAgICAgIE91dFN0cmVhbVVzZWRbaW5kZXhdID0gdHJ1ZTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgbnVtUGFja1N0cmVhbXMgPSBudW1JblN0cmVhbXMgLSBudW1CaW5kUGFpcnM7DQorICAgICAgICANCisgICAgICAgIGlmIChudW1QYWNrU3RyZWFtcyAhPSAxKQ0KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUGFja1N0cmVhbXM7IGkrKykNCisgICAgICAgICAgICBpbkJ5dGUtPlJlYWROdW0oKTsgLy8gUGFja1N0cmVhbXMNCisgICAgICAgICAgDQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtT3V0U3RyZWFtczsgaSsrKQ0KKyAgICAgICAgICBpZiAoIU91dFN0cmVhbVVzZWRbaV0pDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBpbmRleE9mTWFpblN0cmVhbSA9IGk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIGlmIChpID09IG51bU91dFN0cmVhbXMpDQorICAgICAgICAgIFRocm93VW5zdXBwb3J0ZWQoKTsNCisgICAgICB9DQorICAgICAgZm9sZGVycy5Gb1RvQ29kZXJVbnBhY2tTaXplc1tmb10gPSBudW1Db2RlcnNPdXRTdHJlYW1zOw0KKyAgICAgIG51bUNvZGVyc091dFN0cmVhbXMgKz0gbnVtT3V0U3RyZWFtczsNCisgICAgICBmb2xkZXJzLkZvU3RhcnRQYWNrU3RyZWFtSW5kZXhbZm9dID0gcGFja1N0cmVhbUluZGV4Ow0KKyAgICAgIHBhY2tTdHJlYW1JbmRleCArPSBudW1QYWNrU3RyZWFtczsNCisgICAgICBmb2xkZXJzLkZvVG9NYWluVW5wYWNrU2l6ZUluZGV4W2ZvXSA9IChCeXRlKWluZGV4T2ZNYWluU3RyZWFtOw0KKyAgICB9DQorICAgIHNpemVfdCBkYXRhU2l6ZSA9IF9pbkJ5dGVCYWNrLT5HZXRQdHIoKSAtIHN0YXJ0QnVmUHRyOw0KKyAgICBmb2xkZXJzLkZvVG9Db2RlclVucGFja1NpemVzW2ZvXSA9IG51bUNvZGVyc091dFN0cmVhbXM7DQorICAgIGZvbGRlcnMuRm9TdGFydFBhY2tTdHJlYW1JbmRleFtmb10gPSBwYWNrU3RyZWFtSW5kZXg7DQorICAgIGZvbGRlcnMuRm9Db2RlcnNEYXRhT2Zmc2V0W2ZvXSA9IF9pbkJ5dGVCYWNrLT5HZXRQdHIoKSAtIHN0YXJ0QnVmUHRyOw0KKyAgICBmb2xkZXJzLkNvZGVyc0RhdGEuQ29weUZyb20oc3RhcnRCdWZQdHIsIGRhdGFTaXplKTsNCisgIH0NCisNCisgIFdhaXRJZChOSUQ6OmtDb2RlcnNVbnBhY2tTaXplKTsNCisgIGZvbGRlcnMuQ29kZXJVbnBhY2tTaXplcy5BbGxvYyhudW1Db2RlcnNPdXRTdHJlYW1zKTsNCisgIGZvciAoQ051bSBpID0gMDsgaSA8IG51bUNvZGVyc091dFN0cmVhbXM7IGkrKykNCisgICAgZm9sZGVycy5Db2RlclVucGFja1NpemVzW2ldID0gUmVhZE51bWJlcigpOw0KKw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgVUludDY0IHR5cGUgPSBSZWFkSUQoKTsNCisgICAgaWYgKHR5cGUgPT0gTklEOjprRW5kKQ0KKyAgICAgIHJldHVybjsNCisgICAgaWYgKHR5cGUgPT0gTklEOjprQ1JDKQ0KKyAgICB7DQorICAgICAgUmVhZEhhc2hEaWdlc3RzKG51bUZvbGRlcnMsIGZvbGRlcnMuRm9sZGVyQ1JDcyk7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgU2tpcERhdGEoKTsNCisgIH0NCit9DQorDQordm9pZCBDSW5BcmNoaXZlOjpSZWFkU3ViU3RyZWFtc0luZm8oDQorICAgIENGb2xkZXJzICZmb2xkZXJzLA0KKyAgICBDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gJnVucGFja1NpemVzLA0KKyAgICBDVUludDMyRGVmVmVjdG9yICZkaWdlc3RzKQ0KK3sNCisgIGZvbGRlcnMuTnVtVW5wYWNrU3RyZWFtc1ZlY3Rvci5BbGxvYyhmb2xkZXJzLk51bUZvbGRlcnMpOw0KKyAgQ051bSBpOw0KKyAgZm9yIChpID0gMDsgaSA8IGZvbGRlcnMuTnVtRm9sZGVyczsgaSsrKQ0KKyAgICBmb2xkZXJzLk51bVVucGFja1N0cmVhbXNWZWN0b3JbaV0gPSAxOw0KKyAgDQorICBVSW50NjQgdHlwZTsNCisgIA0KKyAgZm9yICg7OykNCisgIHsNCisgICAgdHlwZSA9IFJlYWRJRCgpOw0KKyAgICBpZiAodHlwZSA9PSBOSUQ6OmtOdW1VbnBhY2tTdHJlYW0pDQorICAgIHsNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZm9sZGVycy5OdW1Gb2xkZXJzOyBpKyspDQorICAgICAgICBmb2xkZXJzLk51bVVucGFja1N0cmVhbXNWZWN0b3JbaV0gPSBSZWFkTnVtKCk7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKHR5cGUgPT0gTklEOjprQ1JDIHx8IHR5cGUgPT0gTklEOjprU2l6ZSB8fCB0eXBlID09IE5JRDo6a0VuZCkNCisgICAgICBicmVhazsNCisgICAgU2tpcERhdGEoKTsNCisgIH0NCisNCisgIGlmICh0eXBlID09IE5JRDo6a1NpemUpDQorICB7DQorICAgIGZvciAoaSA9IDA7IGkgPCBmb2xkZXJzLk51bUZvbGRlcnM7IGkrKykNCisgICAgew0KKyAgICAgIC8vIHYzLjEzIGluY29ycmVjdGx5IHdvcmtlZCB3aXRoIGVtcHR5IGZvbGRlcnMNCisgICAgICAvLyB2NC4wNzogd2UgY2hlY2sgdGhhdCBmb2xkZXIgaXMgZW1wdHkNCisgICAgICBDTnVtIG51bVN1YnN0cmVhbXMgPSBmb2xkZXJzLk51bVVucGFja1N0cmVhbXNWZWN0b3JbaV07DQorICAgICAgaWYgKG51bVN1YnN0cmVhbXMgPT0gMCkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIFVJbnQ2NCBzdW0gPSAwOw0KKyAgICAgIGZvciAoQ051bSBqID0gMTsgaiA8IG51bVN1YnN0cmVhbXM7IGorKykNCisgICAgICB7DQorICAgICAgICBVSW50NjQgc2l6ZSA9IFJlYWROdW1iZXIoKTsNCisgICAgICAgIHVucGFja1NpemVzLkFkZChzaXplKTsNCisgICAgICAgIHN1bSArPSBzaXplOw0KKyAgICAgICAgaWYgKHN1bSA8IHNpemUpDQorICAgICAgICAgIFRocm93SW5jb3JyZWN0KCk7DQorICAgICAgfQ0KKyAgICAgIFVJbnQ2NCBmb2xkZXJVbnBhY2tTaXplID0gZm9sZGVycy5HZXRGb2xkZXJVbnBhY2tTaXplKGkpOw0KKyAgICAgIGlmIChmb2xkZXJVbnBhY2tTaXplIDwgc3VtKQ0KKyAgICAgICAgVGhyb3dJbmNvcnJlY3QoKTsNCisgICAgICB1bnBhY2tTaXplcy5BZGQoZm9sZGVyVW5wYWNrU2l6ZSAtIHN1bSk7DQorICAgIH0NCisgICAgdHlwZSA9IFJlYWRJRCgpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZm9sZGVycy5OdW1Gb2xkZXJzOyBpKyspDQorICAgIHsNCisgICAgICAvKiB2OS4yNiAtIHY5LjI5IGluY29ycmVjdGx5IHdvcmtlZDoNCisgICAgICAgICBpZiAoZm9sZGVycy5OdW1VbnBhY2tTdHJlYW1zVmVjdG9yW2ldID09IDApLCBpdCB0aHJldyBlcnJvciAqLw0KKyAgICAgIENOdW0gdmFsID0gZm9sZGVycy5OdW1VbnBhY2tTdHJlYW1zVmVjdG9yW2ldOw0KKyAgICAgIGlmICh2YWwgPiAxKQ0KKyAgICAgICAgVGhyb3dJbmNvcnJlY3QoKTsNCisgICAgICBpZiAodmFsID09IDEpDQorICAgICAgICB1bnBhY2tTaXplcy5BZGQoZm9sZGVycy5HZXRGb2xkZXJVbnBhY2tTaXplKGkpKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgdW5zaWduZWQgbnVtRGlnZXN0cyA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgZm9sZGVycy5OdW1Gb2xkZXJzOyBpKyspDQorICB7DQorICAgIENOdW0gbnVtU3Vic3RyZWFtcyA9IGZvbGRlcnMuTnVtVW5wYWNrU3RyZWFtc1ZlY3RvcltpXTsNCisgICAgaWYgKG51bVN1YnN0cmVhbXMgIT0gMSB8fCAhZm9sZGVycy5Gb2xkZXJDUkNzLlZhbGlkQW5kRGVmaW5lZChpKSkNCisgICAgICBudW1EaWdlc3RzICs9IG51bVN1YnN0cmVhbXM7DQorICB9DQorDQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBpZiAodHlwZSA9PSBOSUQ6OmtFbmQpDQorICAgICAgYnJlYWs7DQorICAgIGlmICh0eXBlID09IE5JRDo6a0NSQykNCisgICAgew0KKyAgICAgIC8vIENVSW50MzJEZWZWZWN0b3IgZGlnZXN0czI7DQorICAgICAgLy8gUmVhZEhhc2hEaWdlc3RzKG51bURpZ2VzdHMsIGRpZ2VzdHMyKTsNCisgICAgICBDQm9vbFZlY3RvciBkaWdlc3RzMjsNCisgICAgICBSZWFkQm9vbFZlY3RvcjIobnVtRGlnZXN0cywgZGlnZXN0czIpOw0KKw0KKyAgICAgIGRpZ2VzdHMuQ2xlYXJBbmRTZXRTaXplKHVucGFja1NpemVzLlNpemUoKSk7DQorICAgICAgDQorICAgICAgdW5zaWduZWQgayA9IDA7DQorICAgICAgdW5zaWduZWQgazIgPSAwOw0KKyAgICAgIA0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBmb2xkZXJzLk51bUZvbGRlcnM7IGkrKykNCisgICAgICB7DQorICAgICAgICBDTnVtIG51bVN1YnN0cmVhbXMgPSBmb2xkZXJzLk51bVVucGFja1N0cmVhbXNWZWN0b3JbaV07DQorICAgICAgICBpZiAobnVtU3Vic3RyZWFtcyA9PSAxICYmIGZvbGRlcnMuRm9sZGVyQ1JDcy5WYWxpZEFuZERlZmluZWQoaSkpDQorICAgICAgICB7DQorICAgICAgICAgIGRpZ2VzdHMuRGVmc1trXSA9IHRydWU7DQorICAgICAgICAgIGRpZ2VzdHMuVmFsc1trXSA9IGZvbGRlcnMuRm9sZGVyQ1JDcy5WYWxzW2ldOw0KKyAgICAgICAgICBrKys7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIGZvciAoQ051bSBqID0gMDsgaiA8IG51bVN1YnN0cmVhbXM7IGorKykNCisgICAgICAgIHsNCisgICAgICAgICAgYm9vbCBkZWZpbmVkID0gZGlnZXN0czJbazIrK107DQorICAgICAgICAgIGRpZ2VzdHMuRGVmc1trXSA9IGRlZmluZWQ7DQorICAgICAgICAgIFVJbnQzMiBjcmMgPSAwOw0KKyAgICAgICAgICBpZiAoZGVmaW5lZCkNCisgICAgICAgICAgICBjcmMgPSBSZWFkVUludDMyKCk7DQorICAgICAgICAgIGRpZ2VzdHMuVmFsc1trXSA9IGNyYzsNCisgICAgICAgICAgaysrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICAvLyBpZiAoayAhPSB1bnBhY2tTaXplcy5TaXplKCkpIHRocm93IDEyMzQ1Njc7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAgIFNraXBEYXRhKCk7DQorICAgIA0KKyAgICB0eXBlID0gUmVhZElEKCk7DQorICB9DQorDQorICBpZiAoZGlnZXN0cy5EZWZzLlNpemUoKSAhPSB1bnBhY2tTaXplcy5TaXplKCkpDQorICB7DQorICAgIGRpZ2VzdHMuQ2xlYXJBbmRTZXRTaXplKHVucGFja1NpemVzLlNpemUoKSk7DQorICAgIHVuc2lnbmVkIGsgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZm9sZGVycy5OdW1Gb2xkZXJzOyBpKyspDQorICAgIHsNCisgICAgICBDTnVtIG51bVN1YnN0cmVhbXMgPSBmb2xkZXJzLk51bVVucGFja1N0cmVhbXNWZWN0b3JbaV07DQorICAgICAgaWYgKG51bVN1YnN0cmVhbXMgPT0gMSAmJiBmb2xkZXJzLkZvbGRlckNSQ3MuVmFsaWRBbmREZWZpbmVkKGkpKQ0KKyAgICAgIHsNCisgICAgICAgIGRpZ2VzdHMuRGVmc1trXSA9IHRydWU7DQorICAgICAgICBkaWdlc3RzLlZhbHNba10gPSBmb2xkZXJzLkZvbGRlckNSQ3MuVmFsc1tpXTsNCisgICAgICAgIGsrKzsNCisgICAgICB9DQorICAgICAgZWxzZSBmb3IgKENOdW0gaiA9IDA7IGogPCBudW1TdWJzdHJlYW1zOyBqKyspDQorICAgICAgew0KKyAgICAgICAgZGlnZXN0cy5EZWZzW2tdID0gZmFsc2U7DQorICAgICAgICBkaWdlc3RzLlZhbHNba10gPSAwOw0KKyAgICAgICAgaysrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCisNCit2b2lkIENJbkFyY2hpdmU6OlJlYWRTdHJlYW1zSW5mbygNCisgICAgY29uc3QgQ09iamVjdFZlY3RvcjxDQnl0ZUJ1ZmZlcj4gKmRhdGFWZWN0b3IsDQorICAgIFVJbnQ2NCAmZGF0YU9mZnNldCwNCisgICAgQ0ZvbGRlcnMgJmZvbGRlcnMsDQorICAgIENSZWNvcmRWZWN0b3I8VUludDY0PiAmdW5wYWNrU2l6ZXMsDQorICAgIENVSW50MzJEZWZWZWN0b3IgJmRpZ2VzdHMpDQorew0KKyAgVUludDY0IHR5cGUgPSBSZWFkSUQoKTsNCisgIA0KKyAgaWYgKHR5cGUgPT0gTklEOjprUGFja0luZm8pDQorICB7DQorICAgIGRhdGFPZmZzZXQgPSBSZWFkTnVtYmVyKCk7DQorICAgIFJlYWRQYWNrSW5mbyhmb2xkZXJzKTsNCisgICAgdHlwZSA9IFJlYWRJRCgpOw0KKyAgfQ0KKw0KKyAgaWYgKHR5cGUgPT0gTklEOjprVW5wYWNrSW5mbykNCisgIHsNCisgICAgUmVhZFVucGFja0luZm8oZGF0YVZlY3RvciwgZm9sZGVycyk7DQorICAgIHR5cGUgPSBSZWFkSUQoKTsNCisgIH0NCisNCisgIGlmIChmb2xkZXJzLk51bUZvbGRlcnMgIT0gMCAmJiAhZm9sZGVycy5QYWNrUG9zaXRpb25zKQ0KKyAgew0KKyAgICAvLyBpZiB0aGVyZSBhcmUgZm9sZGVycywgd2UgbmVlZCBQYWNrUG9zaXRpb25zIGFsc28NCisgICAgZm9sZGVycy5QYWNrUG9zaXRpb25zLkFsbG9jKDEpOw0KKyAgICBmb2xkZXJzLlBhY2tQb3NpdGlvbnNbMF0gPSAwOw0KKyAgfQ0KKyAgDQorICBpZiAodHlwZSA9PSBOSUQ6OmtTdWJTdHJlYW1zSW5mbykNCisgIHsNCisgICAgUmVhZFN1YlN0cmVhbXNJbmZvKGZvbGRlcnMsIHVucGFja1NpemVzLCBkaWdlc3RzKTsNCisgICAgdHlwZSA9IFJlYWRJRCgpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBmb2xkZXJzLk51bVVucGFja1N0cmVhbXNWZWN0b3IuQWxsb2MoZm9sZGVycy5OdW1Gb2xkZXJzKTsNCisgICAgLyogSWYgZGlnZXN0cy5EZWZzLlNpemUoKSA9PSAwLCBpdCBtZWFucyB0aGF0IHRoZXJlIGFyZSBubyBjcmNzLg0KKyAgICAgICBTbyB3ZSBkb24ndCBuZWVkIHRvIGZpbGwgZGlnZXN0cyB3aXRoIHZhbHVlcy4gKi8NCisgICAgLy8gZGlnZXN0cy5WYWxzLkNsZWFyQW5kU2V0U2l6ZShmb2xkZXJzLk51bUZvbGRlcnMpOw0KKyAgICAvLyBCb29sVmVjdG9yX0ZpbGxfRmFsc2UoZGlnZXN0cy5EZWZzLCBmb2xkZXJzLk51bUZvbGRlcnMpOw0KKyAgICBmb3IgKENOdW0gaSA9IDA7IGkgPCBmb2xkZXJzLk51bUZvbGRlcnM7IGkrKykNCisgICAgew0KKyAgICAgIGZvbGRlcnMuTnVtVW5wYWNrU3RyZWFtc1ZlY3RvcltpXSA9IDE7DQorICAgICAgdW5wYWNrU2l6ZXMuQWRkKGZvbGRlcnMuR2V0Rm9sZGVyVW5wYWNrU2l6ZShpKSk7DQorICAgICAgLy8gZGlnZXN0cy5WYWxzW2ldID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBpZiAodHlwZSAhPSBOSUQ6OmtFbmQpDQorICAgIFRocm93SW5jb3JyZWN0KCk7DQorfQ0KKw0KK3ZvaWQgQ0luQXJjaGl2ZTo6UmVhZEJvb2xWZWN0b3IodW5zaWduZWQgbnVtSXRlbXMsIENCb29sVmVjdG9yICZ2KQ0KK3sNCisgIHYuQ2xlYXJBbmRTZXRTaXplKG51bUl0ZW1zKTsNCisgIEJ5dGUgYiA9IDA7DQorICBCeXRlIG1hc2sgPSAwOw0KKyAgYm9vbCAqcCA9ICZ2WzBdOw0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUl0ZW1zOyBpKyspDQorICB7DQorICAgIGlmIChtYXNrID09IDApDQorICAgIHsNCisgICAgICBiID0gUmVhZEJ5dGUoKTsNCisgICAgICBtYXNrID0gMHg4MDsNCisgICAgfQ0KKyAgICBwW2ldID0gKChiICYgbWFzaykgIT0gMCk7DQorICAgIG1hc2sgPj49IDE7DQorICB9DQorfQ0KKw0KK3ZvaWQgQ0luQXJjaGl2ZTo6UmVhZEJvb2xWZWN0b3IyKHVuc2lnbmVkIG51bUl0ZW1zLCBDQm9vbFZlY3RvciAmdikNCit7DQorICBCeXRlIGFsbEFyZURlZmluZWQgPSBSZWFkQnl0ZSgpOw0KKyAgaWYgKGFsbEFyZURlZmluZWQgPT0gMCkNCisgIHsNCisgICAgUmVhZEJvb2xWZWN0b3IobnVtSXRlbXMsIHYpOw0KKyAgICByZXR1cm47DQorICB9DQorICB2LkNsZWFyQW5kU2V0U2l6ZShudW1JdGVtcyk7DQorICBib29sICpwID0gJnZbMF07DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykNCisgICAgcFtpXSA9IHRydWU7DQorfQ0KKw0KK3ZvaWQgQ0luQXJjaGl2ZTo6UmVhZFVJbnQ2NERlZlZlY3Rvcihjb25zdCBDT2JqZWN0VmVjdG9yPENCeXRlQnVmZmVyPiAmZGF0YVZlY3RvciwNCisgICAgQ1VJbnQ2NERlZlZlY3RvciAmdiwgdW5zaWduZWQgbnVtSXRlbXMpDQorew0KKyAgUmVhZEJvb2xWZWN0b3IyKG51bUl0ZW1zLCB2LkRlZnMpOw0KKw0KKyAgQ1N0cmVhbVN3aXRjaCBzdHJlYW1Td2l0Y2g7DQorICBzdHJlYW1Td2l0Y2guU2V0KHRoaXMsICZkYXRhVmVjdG9yKTsNCisgIA0KKyAgdi5WYWxzLkNsZWFyQW5kU2V0U2l6ZShudW1JdGVtcyk7DQorICBVSW50NjQgKnAgPSAmdi5WYWxzWzBdOw0KKyAgY29uc3QgYm9vbCAqZGVmcyA9ICZ2LkRlZnNbMF07DQorDQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykNCisgIHsNCisgICAgVUludDY0IHQgPSAwOw0KKyAgICBpZiAoZGVmc1tpXSkNCisgICAgICB0ID0gUmVhZFVJbnQ2NCgpOw0KKyAgICBwW2ldID0gdDsNCisgIH0NCit9DQorDQorSFJFU1VMVCBDSW5BcmNoaXZlOjpSZWFkQW5kRGVjb2RlUGFja2VkU3RyZWFtcygNCisgICAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgVUludDY0IGJhc2VPZmZzZXQsDQorICAgIFVJbnQ2NCAmZGF0YU9mZnNldCwgQ09iamVjdFZlY3RvcjxDQnl0ZUJ1ZmZlcj4gJmRhdGFWZWN0b3INCisgICAgXzdaX0RFQ09ERVJfQ1JZUFJPX1ZBUlNfREVDTA0KKyAgICApDQorew0KKyAgQ0ZvbGRlcnMgZm9sZGVyczsNCisgIENSZWNvcmRWZWN0b3I8VUludDY0PiB1bnBhY2tTaXplczsNCisgIENVSW50MzJEZWZWZWN0b3IgIGRpZ2VzdHM7DQorICANCisgIFJlYWRTdHJlYW1zSW5mbyhOVUxMLA0KKyAgICBkYXRhT2Zmc2V0LA0KKyAgICBmb2xkZXJzLA0KKyAgICB1bnBhY2tTaXplcywNCisgICAgZGlnZXN0cyk7DQorICANCisgIENEZWNvZGVyIGRlY29kZXIoDQorICAgICNpZmRlZiBfU1RfTU9ERQ0KKyAgICBmYWxzZQ0KKyAgICAjZWxzZQ0KKyAgICB0cnVlDQorICAgICNlbmRpZg0KKyAgICApOw0KKw0KKyAgZm9yIChDTnVtIGkgPSAwOyBpIDwgZm9sZGVycy5OdW1Gb2xkZXJzOyBpKyspDQorICB7DQorICAgIENCeXRlQnVmZmVyICZkYXRhID0gZGF0YVZlY3Rvci5BZGROZXcoKTsNCisgICAgVUludDY0IHVucGFja1NpemU2NCA9IGZvbGRlcnMuR2V0Rm9sZGVyVW5wYWNrU2l6ZShpKTsNCisgICAgc2l6ZV90IHVucGFja1NpemUgPSAoc2l6ZV90KXVucGFja1NpemU2NDsNCisgICAgaWYgKHVucGFja1NpemUgIT0gdW5wYWNrU2l6ZTY0KQ0KKyAgICAgIFRocm93VW5zdXBwb3J0ZWQoKTsNCisgICAgZGF0YS5BbGxvYyh1bnBhY2tTaXplKTsNCisgICAgDQorICAgIENCdWZQdHJTZXFPdXRTdHJlYW0gKm91dFN0cmVhbVNwZWMgPSBuZXcgQ0J1ZlB0clNlcU91dFN0cmVhbTsNCisgICAgQ015Q29tUHRyPElTZXF1ZW50aWFsT3V0U3RyZWFtPiBvdXRTdHJlYW0gPSBvdXRTdHJlYW1TcGVjOw0KKyAgICBvdXRTdHJlYW1TcGVjLT5Jbml0KGRhdGEsIHVucGFja1NpemUpOw0KKyAgICANCisgICAgSFJFU1VMVCByZXN1bHQgPSBkZWNvZGVyLkRlY29kZSgNCisgICAgICBFWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgICBfc3RyZWFtLCBiYXNlT2Zmc2V0ICsgZGF0YU9mZnNldCwNCisgICAgICBmb2xkZXJzLCBpLA0KKyAgICAgIG91dFN0cmVhbSwgTlVMTA0KKyAgICAgIF83Wl9ERUNPREVSX0NSWVBST19WQVJTDQorICAgICAgI2lmICFkZWZpbmVkKF83WklQX1NUKSAmJiAhZGVmaW5lZChfU0ZYKQ0KKyAgICAgICwgZmFsc2UsIDENCisgICAgICAjZW5kaWYNCisgICAgICApOw0KKyAgICBSSU5PSyhyZXN1bHQpOw0KKyAgICANCisgICAgaWYgKGZvbGRlcnMuRm9sZGVyQ1JDcy5WYWxpZEFuZERlZmluZWQoaSkpDQorICAgICAgaWYgKENyY0NhbGMoZGF0YSwgdW5wYWNrU2l6ZSkgIT0gZm9sZGVycy5Gb2xkZXJDUkNzLlZhbHNbaV0pDQorICAgICAgICBUaHJvd0luY29ycmVjdCgpOw0KKyAgfQ0KKyAgSGVhZGVyc1NpemUgKz0gZm9sZGVycy5QYWNrUG9zaXRpb25zW2ZvbGRlcnMuTnVtUGFja1N0cmVhbXNdOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ0luQXJjaGl2ZTo6UmVhZEhlYWRlcigNCisgICAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgQ0RiRXggJmRiDQorICAgIF83Wl9ERUNPREVSX0NSWVBST19WQVJTX0RFQ0wNCisgICAgKQ0KK3sNCisgIFVJbnQ2NCB0eXBlID0gUmVhZElEKCk7DQorDQorICBpZiAodHlwZSA9PSBOSUQ6OmtBcmNoaXZlUHJvcGVydGllcykNCisgIHsNCisgICAgUmVhZEFyY2hpdmVQcm9wZXJ0aWVzKGRiLkFyY0luZm8pOw0KKyAgICB0eXBlID0gUmVhZElEKCk7DQorICB9DQorIA0KKyAgQ09iamVjdFZlY3RvcjxDQnl0ZUJ1ZmZlcj4gZGF0YVZlY3RvcjsNCisgIA0KKyAgaWYgKHR5cGUgPT0gTklEOjprQWRkaXRpb25hbFN0cmVhbXNJbmZvKQ0KKyAgew0KKyAgICBIUkVTVUxUIHJlc3VsdCA9IFJlYWRBbmREZWNvZGVQYWNrZWRTdHJlYW1zKA0KKyAgICAgICAgRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgICAgICBkYi5BcmNJbmZvLlN0YXJ0UG9zaXRpb25BZnRlckhlYWRlciwNCisgICAgICAgIGRiLkFyY0luZm8uRGF0YVN0YXJ0UG9zaXRpb24yLA0KKyAgICAgICAgZGF0YVZlY3Rvcg0KKyAgICAgICAgXzdaX0RFQ09ERVJfQ1JZUFJPX1ZBUlMNCisgICAgICAgICk7DQorICAgIFJJTk9LKHJlc3VsdCk7DQorICAgIGRiLkFyY0luZm8uRGF0YVN0YXJ0UG9zaXRpb24yICs9IGRiLkFyY0luZm8uU3RhcnRQb3NpdGlvbkFmdGVySGVhZGVyOw0KKyAgICB0eXBlID0gUmVhZElEKCk7DQorICB9DQorDQorICBDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gdW5wYWNrU2l6ZXM7DQorICBDVUludDMyRGVmVmVjdG9yIGRpZ2VzdHM7DQorICANCisgIGlmICh0eXBlID09IE5JRDo6a01haW5TdHJlYW1zSW5mbykNCisgIHsNCisgICAgUmVhZFN0cmVhbXNJbmZvKCZkYXRhVmVjdG9yLA0KKyAgICAgICAgZGIuQXJjSW5mby5EYXRhU3RhcnRQb3NpdGlvbiwNCisgICAgICAgIChDRm9sZGVycyAmKWRiLA0KKyAgICAgICAgdW5wYWNrU2l6ZXMsDQorICAgICAgICBkaWdlc3RzKTsNCisgICAgZGIuQXJjSW5mby5EYXRhU3RhcnRQb3NpdGlvbiArPSBkYi5BcmNJbmZvLlN0YXJ0UG9zaXRpb25BZnRlckhlYWRlcjsNCisgICAgdHlwZSA9IFJlYWRJRCgpOw0KKyAgfQ0KKw0KKyAgZGIuRmlsZXMuQ2xlYXIoKTsNCisNCisgIGlmICh0eXBlID09IE5JRDo6a0ZpbGVzSW5mbykNCisgIHsNCisgIA0KKyAgQ051bSBudW1GaWxlcyA9IFJlYWROdW0oKTsNCisgIGRiLkZpbGVzLkNsZWFyQW5kU2V0U2l6ZShudW1GaWxlcyk7DQorICBDTnVtIGk7DQorICAvKg0KKyAgZGIuRmlsZXMuUmVzZXJ2ZShudW1GaWxlcyk7DQorICBDTnVtIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgbnVtRmlsZXM7IGkrKykNCisgICAgZGIuRmlsZXMuQWRkKENGaWxlSXRlbSgpKTsNCisgICovDQorDQorICBkYi5BcmNJbmZvLkZpbGVJbmZvUG9wSURzLkFkZChOSUQ6OmtTaXplKTsNCisgIC8vIGlmICghZGIuUGFja1NpemVzLklzRW1wdHkoKSkNCisgICAgZGIuQXJjSW5mby5GaWxlSW5mb1BvcElEcy5BZGQoTklEOjprUGFja0luZm8pOw0KKyAgaWYgKG51bUZpbGVzID4gMCAgJiYgIWRpZ2VzdHMuRGVmcy5Jc0VtcHR5KCkpDQorICAgIGRiLkFyY0luZm8uRmlsZUluZm9Qb3BJRHMuQWRkKE5JRDo6a0NSQyk7DQorDQorICBDQm9vbFZlY3RvciBlbXB0eVN0cmVhbVZlY3RvcjsNCisgIEJvb2xWZWN0b3JfRmlsbF9GYWxzZShlbXB0eVN0cmVhbVZlY3RvciwgKHVuc2lnbmVkKW51bUZpbGVzKTsNCisgIENCb29sVmVjdG9yIGVtcHR5RmlsZVZlY3RvcjsNCisgIENCb29sVmVjdG9yIGFudGlGaWxlVmVjdG9yOw0KKyAgQ051bSBudW1FbXB0eVN0cmVhbXMgPSAwOw0KKw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgVUludDY0IHR5cGUgPSBSZWFkSUQoKTsNCisgICAgaWYgKHR5cGUgPT0gTklEOjprRW5kKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBVSW50NjQgc2l6ZSA9IFJlYWROdW1iZXIoKTsNCisgICAgaWYgKHNpemUgPiBfaW5CeXRlQmFjay0+R2V0UmVtKCkpDQorICAgICAgVGhyb3dJbmNvcnJlY3QoKTsNCisgICAgQ1N0cmVhbVN3aXRjaCBzd2l0Y2hQcm9wOw0KKyAgICBzd2l0Y2hQcm9wLlNldCh0aGlzLCBfaW5CeXRlQmFjay0+R2V0UHRyKCksIChzaXplX3Qpc2l6ZSwgdHJ1ZSk7DQorICAgIGJvb2wgYWRkUHJvcElkVG9MaXN0ID0gdHJ1ZTsNCisgICAgYm9vbCBpc0tub3duVHlwZSA9IHRydWU7DQorICAgIGlmICh0eXBlID4gKChVSW50MzIpMSA8PCAzMCkpDQorICAgICAgaXNLbm93blR5cGUgPSBmYWxzZTsNCisgICAgZWxzZSBzd2l0Y2goKFVJbnQzMil0eXBlKQ0KKyAgICB7DQorICAgICAgY2FzZSBOSUQ6OmtOYW1lOg0KKyAgICAgIHsNCisgICAgICAgIENTdHJlYW1Td2l0Y2ggc3RyZWFtU3dpdGNoOw0KKyAgICAgICAgc3RyZWFtU3dpdGNoLlNldCh0aGlzLCAmZGF0YVZlY3Rvcik7DQorICAgICAgICBzaXplX3QgcmVtID0gX2luQnl0ZUJhY2stPkdldFJlbSgpOw0KKyAgICAgICAgZGIuTmFtZXNCdWYuQWxsb2MocmVtKTsNCisgICAgICAgIFJlYWRCeXRlcyhkYi5OYW1lc0J1ZiwgcmVtKTsNCisgICAgICAgIGRiLk5hbWVPZmZzZXRzLkFsbG9jKGRiLkZpbGVzLlNpemUoKSArIDEpOw0KKyAgICAgICAgc2l6ZV90IHBvcyA9IDA7DQorICAgICAgICB1bnNpZ25lZCBpOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRiLkZpbGVzLlNpemUoKTsgaSsrKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBzaXplX3QgY3VyUmVtID0gKHJlbSAtIHBvcykgLyAyOw0KKyAgICAgICAgICBjb25zdCBVSW50MTYgKmJ1ZiA9IChjb25zdCBVSW50MTYgKikoZGIuTmFtZXNCdWYgKyBwb3MpOw0KKyAgICAgICAgICBzaXplX3QgajsNCisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1clJlbSAmJiBidWZbal0gIT0gMDsgaisrKTsNCisgICAgICAgICAgaWYgKGogPT0gY3VyUmVtKQ0KKyAgICAgICAgICAgIFRocm93RW5kT2ZEYXRhKCk7DQorICAgICAgICAgIGRiLk5hbWVPZmZzZXRzW2ldID0gcG9zIC8gMjsNCisgICAgICAgICAgcG9zICs9IGogKiAyICsgMjsNCisgICAgICAgIH0NCisgICAgICAgIGRiLk5hbWVPZmZzZXRzW2ldID0gcG9zIC8gMjsNCisgICAgICAgIGlmIChwb3MgIT0gcmVtKQ0KKyAgICAgICAgICBUaGVyZUlzSGVhZGVyRXJyb3IgPSB0cnVlOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgTklEOjprV2luQXR0cmliOg0KKyAgICAgIHsNCisgICAgICAgIENCb29sVmVjdG9yIGJvb2xWZWN0b3I7DQorICAgICAgICBSZWFkQm9vbFZlY3RvcjIoZGIuRmlsZXMuU2l6ZSgpLCBib29sVmVjdG9yKTsNCisgICAgICAgIENTdHJlYW1Td2l0Y2ggc3RyZWFtU3dpdGNoOw0KKyAgICAgICAgc3RyZWFtU3dpdGNoLlNldCh0aGlzLCAmZGF0YVZlY3Rvcik7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRmlsZXM7IGkrKykNCisgICAgICAgIHsNCisgICAgICAgICAgQ0ZpbGVJdGVtICZmaWxlID0gZGIuRmlsZXNbaV07DQorICAgICAgICAgIGZpbGUuQXR0cmliRGVmaW5lZCA9IGJvb2xWZWN0b3JbaV07DQorICAgICAgICAgIGlmIChmaWxlLkF0dHJpYkRlZmluZWQpDQorICAgICAgICAgICAgZmlsZS5BdHRyaWIgPSBSZWFkVUludDMyKCk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgLyoNCisgICAgICBjYXNlIE5JRDo6a0lzQXV4Og0KKyAgICAgIHsNCisgICAgICAgIFJlYWRCb29sVmVjdG9yKGRiLkZpbGVzLlNpemUoKSwgZGIuSXNBdXgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgTklEOjprUGFyZW50Og0KKyAgICAgIHsNCisgICAgICAgIGRiLklzVHJlZSA9IHRydWU7DQorICAgICAgICAvLyBDQm9vbFZlY3RvciBib29sVmVjdG9yOw0KKyAgICAgICAgLy8gUmVhZEJvb2xWZWN0b3IyKGRiLkZpbGVzLlNpemUoKSwgYm9vbFZlY3Rvcik7DQorICAgICAgICAvLyBDU3RyZWFtU3dpdGNoIHN0cmVhbVN3aXRjaDsNCisgICAgICAgIC8vIHN0cmVhbVN3aXRjaC5TZXQodGhpcywgJmRhdGFWZWN0b3IpOw0KKyAgICAgICAgQ0Jvb2xWZWN0b3IgYm9vbFZlY3RvcjsNCisgICAgICAgIFJlYWRCb29sVmVjdG9yMihkYi5GaWxlcy5TaXplKCksIGJvb2xWZWN0b3IpOw0KKw0KKyAgICAgICAgZGIuVGhlcmVBcmVBbHRTdHJlYW1zID0gZmFsc2U7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRmlsZXM7IGkrKykNCisgICAgICAgIHsNCisgICAgICAgICAgQ0ZpbGVJdGVtICZmaWxlID0gZGIuRmlsZXNbaV07DQorICAgICAgICAgIC8vIGZpbGUuUGFyZW50ID0gLTE7DQorICAgICAgICAgIC8vIGlmIChib29sVmVjdG9yW2ldKQ0KKyAgICAgICAgICBmaWxlLlBhcmVudCA9IChpbnQpUmVhZFVJbnQzMigpOw0KKyAgICAgICAgICBmaWxlLklzQWx0U3RyZWFtID0gIWJvb2xWZWN0b3JbaV07DQorICAgICAgICAgIGlmIChmaWxlLklzQWx0U3RyZWFtKQ0KKyAgICAgICAgICAgIGRiLlRoZXJlQXJlQWx0U3RyZWFtcyA9IHRydWU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgKi8NCisgICAgICBjYXNlIE5JRDo6a0VtcHR5U3RyZWFtOg0KKyAgICAgIHsNCisgICAgICAgIFJlYWRCb29sVmVjdG9yKG51bUZpbGVzLCBlbXB0eVN0cmVhbVZlY3Rvcik7DQorICAgICAgICBudW1FbXB0eVN0cmVhbXMgPSAwOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChDTnVtKWVtcHR5U3RyZWFtVmVjdG9yLlNpemUoKTsgaSsrKQ0KKyAgICAgICAgICBpZiAoZW1wdHlTdHJlYW1WZWN0b3JbaV0pDQorICAgICAgICAgICAgbnVtRW1wdHlTdHJlYW1zKys7DQorDQorICAgICAgICBCb29sVmVjdG9yX0ZpbGxfRmFsc2UoZW1wdHlGaWxlVmVjdG9yLCBudW1FbXB0eVN0cmVhbXMpOw0KKyAgICAgICAgQm9vbFZlY3Rvcl9GaWxsX0ZhbHNlKGFudGlGaWxlVmVjdG9yLCBudW1FbXB0eVN0cmVhbXMpOw0KKw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgTklEOjprRW1wdHlGaWxlOiAgUmVhZEJvb2xWZWN0b3IobnVtRW1wdHlTdHJlYW1zLCBlbXB0eUZpbGVWZWN0b3IpOyBicmVhazsNCisgICAgICBjYXNlIE5JRDo6a0FudGk6ICBSZWFkQm9vbFZlY3RvcihudW1FbXB0eVN0cmVhbXMsIGFudGlGaWxlVmVjdG9yKTsgYnJlYWs7DQorICAgICAgY2FzZSBOSUQ6OmtTdGFydFBvczogIFJlYWRVSW50NjREZWZWZWN0b3IoZGF0YVZlY3RvciwgZGIuU3RhcnRQb3MsICh1bnNpZ25lZCludW1GaWxlcyk7IGJyZWFrOw0KKyAgICAgIGNhc2UgTklEOjprQ1RpbWU6ICBSZWFkVUludDY0RGVmVmVjdG9yKGRhdGFWZWN0b3IsIGRiLkNUaW1lLCAodW5zaWduZWQpbnVtRmlsZXMpOyBicmVhazsNCisgICAgICBjYXNlIE5JRDo6a0FUaW1lOiAgUmVhZFVJbnQ2NERlZlZlY3RvcihkYXRhVmVjdG9yLCBkYi5BVGltZSwgKHVuc2lnbmVkKW51bUZpbGVzKTsgYnJlYWs7DQorICAgICAgY2FzZSBOSUQ6OmtNVGltZTogIFJlYWRVSW50NjREZWZWZWN0b3IoZGF0YVZlY3RvciwgZGIuTVRpbWUsICh1bnNpZ25lZCludW1GaWxlcyk7IGJyZWFrOw0KKyAgICAgIGNhc2UgTklEOjprRHVtbXk6DQorICAgICAgew0KKyAgICAgICAgZm9yIChVSW50NjQgaiA9IDA7IGogPCBzaXplOyBqKyspDQorICAgICAgICAgIGlmIChSZWFkQnl0ZSgpICE9IDApDQorICAgICAgICAgICAgVGhlcmVJc0hlYWRlckVycm9yID0gdHJ1ZTsNCisgICAgICAgIGFkZFByb3BJZFRvTGlzdCA9IGZhbHNlOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIC8qDQorICAgICAgY2FzZSBOSUQ6OmtOdFNlY3VyZToNCisgICAgICB7DQorICAgICAgICB0cnkNCisgICAgICAgIHsNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIENTdHJlYW1Td2l0Y2ggc3RyZWFtU3dpdGNoOw0KKyAgICAgICAgICAgIHN0cmVhbVN3aXRjaC5TZXQodGhpcywgJmRhdGFWZWN0b3IpOw0KKyAgICAgICAgICAgIFVJbnQzMiBudW1EZXNjcmlwdG9ycyA9IFJlYWRVSW50MzIoKTsNCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsNCisgICAgICAgICAgICBkYi5TZWN1cmVPZmZzZXRzLkNsZWFyKCk7DQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bURlc2NyaXB0b3JzOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgVUludDMyIHNpemUgPSBSZWFkVUludDMyKCk7DQorICAgICAgICAgICAgICBkYi5TZWN1cmVPZmZzZXRzLkFkZChvZmZzZXQpOw0KKyAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIC8vIFRocm93SW5jb3JyZWN0KCk7Ow0KKyAgICAgICAgICAgIGRiLlNlY3VyZU9mZnNldHMuQWRkKG9mZnNldCk7DQorICAgICAgICAgICAgZGIuU2VjdXJlQnVmLlNldENhcGFjaXR5KG9mZnNldCk7DQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bURlc2NyaXB0b3JzOyBpKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgb2Zmc2V0ID0gZGIuU2VjdXJlT2Zmc2V0c1tpXTsNCisgICAgICAgICAgICAgIFJlYWRCeXRlcyhkYi5TZWN1cmVCdWYgKyBvZmZzZXQsIGRiLlNlY3VyZU9mZnNldHNbaSArIDFdIC0gb2Zmc2V0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGIuU2VjdXJlSURzLkNsZWFyKCk7DQorICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRiLkZpbGVzLlNpemUoKTsgaSsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIGRiLlNlY3VyZUlEcy5BZGQoUmVhZE51bSgpKTsNCisgICAgICAgICAgICAgIC8vIGRiLlNlY3VyZUlEcy5BZGQoUmVhZFVJbnQzMigpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgLy8gUmVhZFVJbnQzMigpOw0KKyAgICAgICAgICAgIGlmIChfaW5CeXRlQmFjay0+R2V0UmVtKCkgIT0gMCkNCisgICAgICAgICAgICAgIFRocm93SW5jb3JyZWN0KCk7Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBjYXRjaChDSW5BcmNoaXZlRXhjZXB0aW9uICYpDQorICAgICAgICB7DQorICAgICAgICAgIFRoZXJlSXNIZWFkZXJFcnJvciA9IHRydWU7DQorICAgICAgICAgIGFkZFByb3BJZFRvTGlzdCA9IGlzS25vd25UeXBlID0gZmFsc2U7DQorICAgICAgICAgIGRiLkNsZWFyU2VjdXJlKCk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgKi8NCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYWRkUHJvcElkVG9MaXN0ID0gaXNLbm93blR5cGUgPSBmYWxzZTsNCisgICAgfQ0KKyAgICBpZiAoaXNLbm93blR5cGUpDQorICAgIHsNCisgICAgICBpZiAoYWRkUHJvcElkVG9MaXN0KQ0KKyAgICAgICAgZGIuQXJjSW5mby5GaWxlSW5mb1BvcElEcy5BZGQodHlwZSk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgZGIuVW5zdXBwb3J0ZWRGZWF0dXJlV2FybmluZyA9IHRydWU7DQorICAgICAgX2luQnl0ZUJhY2stPlNraXBSZW0oKTsNCisgICAgfQ0KKyAgICAvLyBTa2lwRGF0YSB3b3JrZWQgaW5jb3JyZWN0bHkgaW4gc29tZSB2ZXJzaW9ucyBiZWZvcmUgdjQuNTkgKDd6VmVyIDw9IDAwLjAyKQ0KKyAgICBpZiAoX2luQnl0ZUJhY2stPkdldFJlbSgpICE9IDApDQorICAgICAgVGhyb3dJbmNvcnJlY3QoKTsNCisgIH0NCisNCisgIHR5cGUgPSBSZWFkSUQoKTsgLy8gUmVhZCAoTklEOjprRW5kKSBlbmQgb2YgaGVhZGVycw0KKw0KKyAgQ051bSBlbXB0eUZpbGVJbmRleCA9IDA7DQorICBDTnVtIHNpemVJbmRleCA9IDA7DQorDQorICBDTnVtIG51bUFudGlJdGVtcyA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgbnVtRW1wdHlTdHJlYW1zOyBpKyspDQorICAgIGlmIChhbnRpRmlsZVZlY3RvcltpXSkNCisgICAgICBudW1BbnRpSXRlbXMrKzsNCisgICAgDQorICBmb3IgKGkgPSAwOyBpIDwgbnVtRmlsZXM7IGkrKykNCisgIHsNCisgICAgQ0ZpbGVJdGVtICZmaWxlID0gZGIuRmlsZXNbaV07DQorICAgIGJvb2wgaXNBbnRpOw0KKyAgICBmaWxlLkhhc1N0cmVhbSA9ICFlbXB0eVN0cmVhbVZlY3RvcltpXTsNCisgICAgZmlsZS5DcmMgPSAwOw0KKyAgICBpZiAoZmlsZS5IYXNTdHJlYW0pDQorICAgIHsNCisgICAgICBmaWxlLklzRGlyID0gZmFsc2U7DQorICAgICAgaXNBbnRpID0gZmFsc2U7DQorICAgICAgZmlsZS5TaXplID0gdW5wYWNrU2l6ZXNbc2l6ZUluZGV4XTsNCisgICAgICBmaWxlLkNyY0RlZmluZWQgPSBkaWdlc3RzLlZhbGlkQW5kRGVmaW5lZChzaXplSW5kZXgpOw0KKyAgICAgIGlmIChmaWxlLkNyY0RlZmluZWQpDQorICAgICAgICBmaWxlLkNyYyA9IGRpZ2VzdHMuVmFsc1tzaXplSW5kZXhdOw0KKyAgICAgIHNpemVJbmRleCsrOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGZpbGUuSXNEaXIgPSAhZW1wdHlGaWxlVmVjdG9yW2VtcHR5RmlsZUluZGV4XTsNCisgICAgICBpc0FudGkgPSBhbnRpRmlsZVZlY3RvcltlbXB0eUZpbGVJbmRleF07DQorICAgICAgZW1wdHlGaWxlSW5kZXgrKzsNCisgICAgICBmaWxlLlNpemUgPSAwOw0KKyAgICAgIGZpbGUuQ3JjRGVmaW5lZCA9IGZhbHNlOw0KKyAgICB9DQorICAgIGlmIChudW1BbnRpSXRlbXMgIT0gMCkNCisgICAgICBkYi5Jc0FudGkuQWRkKGlzQW50aSk7DQorICB9DQorICB9DQorICBkYi5GaWxsTGlua3MoKTsNCisgIC8qDQorICBpZiAodHlwZSAhPSBOSUQ6OmtFbmQpDQorICAgIFRocm93SW5jb3JyZWN0KCk7DQorICBpZiAoX2luQnl0ZUJhY2stPkdldFJlbSgpICE9IDApDQorICAgIFRocm93SW5jb3JyZWN0KCk7DQorICAqLw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3ZvaWQgQ0RiRXg6OkZpbGxMaW5rcygpDQorew0KKyAgRm9sZGVyU3RhcnRGaWxlSW5kZXguQ2xlYXJBbmRTZXRTaXplKE51bUZvbGRlcnMpOw0KKyAgDQorICBGaWxlSW5kZXhUb0ZvbGRlckluZGV4TWFwLkNsZWFyQW5kU2V0U2l6ZShGaWxlcy5TaXplKCkpOw0KKyAgDQorICBDTnVtIGZvbGRlckluZGV4ID0gMDsNCisgIENOdW0gaW5kZXhJbkZvbGRlciA9IDA7DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IEZpbGVzLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICBib29sIGVtcHR5U3RyZWFtID0gIUZpbGVzW2ldLkhhc1N0cmVhbTsNCisgICAgaWYgKGluZGV4SW5Gb2xkZXIgPT0gMCkNCisgICAgew0KKyAgICAgIGlmIChlbXB0eVN0cmVhbSkNCisgICAgICB7DQorICAgICAgICBGaWxlSW5kZXhUb0ZvbGRlckluZGV4TWFwW2ldID0ga051bU5vSW5kZXg7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgLy8gdjMuMTMgaW5jb3JyZWN0bHkgd29ya2VkIHdpdGggZW1wdHkgZm9sZGVycw0KKyAgICAgIC8vIHY0LjA3OiB3ZSBza2lwIGVtcHR5IGZvbGRlcnMNCisgICAgICBmb3IgKDs7KQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChmb2xkZXJJbmRleCA+PSBOdW1Gb2xkZXJzKQ0KKyAgICAgICAgICBUaHJvd0luY29ycmVjdCgpOw0KKyAgICAgICAgRm9sZGVyU3RhcnRGaWxlSW5kZXhbZm9sZGVySW5kZXhdID0gaTsNCisgICAgICAgIGlmIChOdW1VbnBhY2tTdHJlYW1zVmVjdG9yW2ZvbGRlckluZGV4XSAhPSAwKQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGZvbGRlckluZGV4Kys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZpbGVJbmRleFRvRm9sZGVySW5kZXhNYXBbaV0gPSBmb2xkZXJJbmRleDsNCisgICAgaWYgKGVtcHR5U3RyZWFtKQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICBpZiAoKytpbmRleEluRm9sZGVyID49IE51bVVucGFja1N0cmVhbXNWZWN0b3JbZm9sZGVySW5kZXhdKQ0KKyAgICB7DQorICAgICAgZm9sZGVySW5kZXgrKzsNCisgICAgICBpbmRleEluRm9sZGVyID0gMDsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKGluZGV4SW5Gb2xkZXIgIT0gMCkNCisgICAgZm9sZGVySW5kZXgrKzsNCisgIC8qDQorICBpZiAoaW5kZXhJbkZvbGRlciAhPSAwKQ0KKyAgICBUaHJvd0luY29ycmVjdCgpOw0KKyAgKi8NCisgIGZvciAoOzspDQorICB7DQorICAgIGlmIChmb2xkZXJJbmRleCA+PSBOdW1Gb2xkZXJzKQ0KKyAgICAgIHJldHVybjsNCisgICAgRm9sZGVyU3RhcnRGaWxlSW5kZXhbZm9sZGVySW5kZXhdID0gaTsNCisgICAgLyoNCisgICAgaWYgKE51bVVucGFja1N0cmVhbXNWZWN0b3JbZm9sZGVySW5kZXhdICE9IDApDQorICAgICAgVGhyb3dJbmNvcnJlY3QoKTs7DQorICAgICovDQorICAgIGZvbGRlckluZGV4Kys7DQorICB9DQorfQ0KKw0KK0hSRVNVTFQgQ0luQXJjaGl2ZTo6UmVhZERhdGFiYXNlMigNCisgICAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgQ0RiRXggJmRiDQorICAgIF83Wl9ERUNPREVSX0NSWVBST19WQVJTX0RFQ0wNCisgICAgKQ0KK3sNCisgIGRiLkNsZWFyKCk7DQorICBkYi5BcmNJbmZvLlN0YXJ0UG9zaXRpb24gPSBfYXJoaXZlQmVnaW5TdHJlYW1Qb3NpdGlvbjsNCisNCisgIGRiLkFyY0luZm8uVmVyc2lvbi5NYWpvciA9IF9oZWFkZXJbNl07DQorICBkYi5BcmNJbmZvLlZlcnNpb24uTWlub3IgPSBfaGVhZGVyWzddOw0KKw0KKyAgaWYgKGRiLkFyY0luZm8uVmVyc2lvbi5NYWpvciAhPSBrTWFqb3JWZXJzaW9uKQ0KKyAgew0KKyAgICAvLyBkYi5VbnN1cHBvcnRlZFZlcnNpb24gPSB0cnVlOw0KKyAgICByZXR1cm4gU19GQUxTRTsNCisgIH0NCisNCisgIFVJbnQ2NCBuZXh0SGVhZGVyT2Zmc2V0ID0gR2V0NjQoX2hlYWRlciArIDEyKTsNCisgIFVJbnQ2NCBuZXh0SGVhZGVyU2l6ZSA9IEdldDY0KF9oZWFkZXIgKyAyMCk7DQorICBVSW50MzIgbmV4dEhlYWRlckNSQyA9IEdldDMyKF9oZWFkZXIgKyAyOCk7DQorDQorICAjaWZkZWYgRk9STUFUXzdaX1JFQ09WRVJZDQorICBVSW50MzIgY3JjRnJvbUFyYyA9IEdldDMyKF9oZWFkZXIgKyA4KTsNCisgIGlmIChjcmNGcm9tQXJjID09IDAgJiYgbmV4dEhlYWRlck9mZnNldCA9PSAwICYmIG5leHRIZWFkZXJTaXplID09IDAgJiYgbmV4dEhlYWRlckNSQyA9PSAwKQ0KKyAgew0KKyAgICBVSW50NjQgY3VyLCBmaWxlU2l6ZTsNCisgICAgUklOT0soX3N0cmVhbS0+U2VlaygwLCBTVFJFQU1fU0VFS19DVVIsICZjdXIpKTsNCisgICAgY29uc3QgdW5zaWduZWQga0NoZWNrU2l6ZSA9IDUxMjsNCisgICAgQnl0ZSBidWZba0NoZWNrU2l6ZV07DQorICAgIFJJTk9LKF9zdHJlYW0tPlNlZWsoMCwgU1RSRUFNX1NFRUtfRU5ELCAmZmlsZVNpemUpKTsNCisgICAgVUludDY0IHJlbSA9IGZpbGVTaXplIC0gY3VyOw0KKyAgICB1bnNpZ25lZCBjaGVja1NpemUgPSBrQ2hlY2tTaXplOw0KKyAgICBpZiAocmVtIDwga0NoZWNrU2l6ZSkNCisgICAgICBjaGVja1NpemUgPSAodW5zaWduZWQpKHJlbSk7DQorICAgIGlmIChjaGVja1NpemUgPCAzKQ0KKyAgICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgICBSSU5PSyhfc3RyZWFtLT5TZWVrKGZpbGVTaXplIC0gY2hlY2tTaXplLCBTVFJFQU1fU0VFS19TRVQsIE5VTEwpKTsNCisgICAgUklOT0soUmVhZFN0cmVhbV9GQUxTRShfc3RyZWFtLCBidWYsIChzaXplX3QpY2hlY2tTaXplKSk7DQorDQorICAgIGlmIChidWZbY2hlY2tTaXplIC0gMV0gIT0gMCkNCisgICAgICByZXR1cm4gU19GQUxTRTsNCisNCisgICAgdW5zaWduZWQgaTsNCisgICAgZm9yIChpID0gY2hlY2tTaXplIC0gMjs7IGktLSkNCisgICAgew0KKyAgICAgIGlmIChidWZbaV0gPT0gTklEOjprRW5jb2RlZEhlYWRlciAmJiBidWZbaSArIDFdID09IE5JRDo6a1BhY2tJbmZvIHx8DQorICAgICAgICAgIGJ1ZltpXSA9PSBOSUQ6OmtIZWFkZXIgJiYgYnVmW2kgKyAxXSA9PSBOSUQ6OmtNYWluU3RyZWFtc0luZm8pDQorICAgICAgICBicmVhazsNCisgICAgICBpZiAoaSA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIFNfRkFMU0U7DQorICAgIH0NCisgICAgbmV4dEhlYWRlclNpemUgPSBjaGVja1NpemUgLSBpOw0KKyAgICBuZXh0SGVhZGVyT2Zmc2V0ID0gcmVtIC0gbmV4dEhlYWRlclNpemU7DQorICAgIG5leHRIZWFkZXJDUkMgPSBDcmNDYWxjKGJ1ZiArIGksIChzaXplX3QpbmV4dEhlYWRlclNpemUpOw0KKyAgICBSSU5PSyhfc3RyZWFtLT5TZWVrKGN1ciwgU1RSRUFNX1NFRUtfU0VULCBOVUxMKSk7DQorICAgIGRiLlN0YXJ0SGVhZGVyV2FzUmVjb3ZlcmVkID0gdHJ1ZTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICAvLyBDcmMgd2FzIHRlc3RlZCBhbHJlYWR5IGF0IHNpZ25hdHVyZSBjaGVjaw0KKyAgICAvLyBpZiAoQ3JjQ2FsYyhfaGVhZGVyICsgMTIsIDIwKSAhPSBjcmNGcm9tQXJjaGl2ZSkgVGhyb3dJbmNvcnJlY3QoKTsNCisgIH0NCisNCisgIGRiLkFyY0luZm8uU3RhcnRQb3NpdGlvbkFmdGVySGVhZGVyID0gX2FyaGl2ZUJlZ2luU3RyZWFtUG9zaXRpb24gKyBrSGVhZGVyU2l6ZTsNCisgIGRiLlBoeVNpemUgPSBrSGVhZGVyU2l6ZTsNCisNCisgIGRiLklzQXJjID0gZmFsc2U7DQorICBpZiAoKEludDY0KW5leHRIZWFkZXJPZmZzZXQgPCAwIHx8DQorICAgICAgbmV4dEhlYWRlclNpemUgPiAoKFVJbnQ2NCkxIDw8IDYyKSkNCisgICAgcmV0dXJuIFNfRkFMU0U7DQorICBpZiAobmV4dEhlYWRlclNpemUgPT0gMCkNCisgIHsNCisgICAgaWYgKG5leHRIZWFkZXJPZmZzZXQgIT0gMCkNCisgICAgICByZXR1cm4gU19GQUxTRTsNCisgICAgZGIuSXNBcmMgPSB0cnVlOw0KKyAgICByZXR1cm4gU19PSzsNCisgIH0NCisgIA0KKyAgaWYgKCFkYi5TdGFydEhlYWRlcldhc1JlY292ZXJlZCkNCisgICAgZGIuSXNBcmMgPSB0cnVlOw0KKyAgDQorICBIZWFkZXJzU2l6ZSArPSBrSGVhZGVyU2l6ZSArIG5leHRIZWFkZXJTaXplOw0KKyAgZGIuUGh5U2l6ZSA9IGtIZWFkZXJTaXplICsgbmV4dEhlYWRlck9mZnNldCArIG5leHRIZWFkZXJTaXplOw0KKyAgaWYgKF9maWxlRW5kUG9zaXRpb24gLSBkYi5BcmNJbmZvLlN0YXJ0UG9zaXRpb25BZnRlckhlYWRlciA8IG5leHRIZWFkZXJPZmZzZXQgKyBuZXh0SGVhZGVyU2l6ZSkNCisgIHsNCisgICAgZGIuVW5leHBlY3RlZEVuZCA9IHRydWU7DQorICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgfQ0KKyAgUklOT0soX3N0cmVhbS0+U2VlayhuZXh0SGVhZGVyT2Zmc2V0LCBTVFJFQU1fU0VFS19DVVIsIE5VTEwpKTsNCisNCisgIHNpemVfdCBuZXh0SGVhZGVyU2l6ZV90ID0gKHNpemVfdCluZXh0SGVhZGVyU2l6ZTsNCisgIGlmIChuZXh0SGVhZGVyU2l6ZV90ICE9IG5leHRIZWFkZXJTaXplKQ0KKyAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisgIENCeXRlQnVmZmVyIGJ1ZmZlcjIobmV4dEhlYWRlclNpemVfdCk7DQorDQorICBSSU5PSyhSZWFkU3RyZWFtX0ZBTFNFKF9zdHJlYW0sIGJ1ZmZlcjIsIG5leHRIZWFkZXJTaXplX3QpKTsNCisNCisgIGlmIChDcmNDYWxjKGJ1ZmZlcjIsIG5leHRIZWFkZXJTaXplX3QpICE9IG5leHRIZWFkZXJDUkMpDQorICAgIFRocm93SW5jb3JyZWN0KCk7DQorDQorICBpZiAoIWRiLlN0YXJ0SGVhZGVyV2FzUmVjb3ZlcmVkKQ0KKyAgICBkYi5QaHlTaXplV2FzQ29uZmlybWVkID0gdHJ1ZTsNCisgIA0KKyAgQ1N0cmVhbVN3aXRjaCBzdHJlYW1Td2l0Y2g7DQorICBzdHJlYW1Td2l0Y2guU2V0KHRoaXMsIGJ1ZmZlcjIpOw0KKyAgDQorICBDT2JqZWN0VmVjdG9yPENCeXRlQnVmZmVyPiBkYXRhVmVjdG9yOw0KKyAgDQorICBVSW50NjQgdHlwZSA9IFJlYWRJRCgpOw0KKyAgaWYgKHR5cGUgIT0gTklEOjprSGVhZGVyKQ0KKyAgew0KKyAgICBpZiAodHlwZSAhPSBOSUQ6OmtFbmNvZGVkSGVhZGVyKQ0KKyAgICAgIFRocm93SW5jb3JyZWN0KCk7DQorICAgIEhSRVNVTFQgcmVzdWx0ID0gUmVhZEFuZERlY29kZVBhY2tlZFN0cmVhbXMoDQorICAgICAgICBFWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgICAgIGRiLkFyY0luZm8uU3RhcnRQb3NpdGlvbkFmdGVySGVhZGVyLA0KKyAgICAgICAgZGIuQXJjSW5mby5EYXRhU3RhcnRQb3NpdGlvbjIsDQorICAgICAgICBkYXRhVmVjdG9yDQorICAgICAgICBfN1pfREVDT0RFUl9DUllQUk9fVkFSUw0KKyAgICAgICAgKTsNCisgICAgUklOT0socmVzdWx0KTsNCisgICAgaWYgKGRhdGFWZWN0b3IuU2l6ZSgpID09IDApDQorICAgICAgcmV0dXJuIFNfT0s7DQorICAgIGlmIChkYXRhVmVjdG9yLlNpemUoKSA+IDEpDQorICAgICAgVGhyb3dJbmNvcnJlY3QoKTsNCisgICAgc3RyZWFtU3dpdGNoLlJlbW92ZSgpOw0KKyAgICBzdHJlYW1Td2l0Y2guU2V0KHRoaXMsIGRhdGFWZWN0b3IuRnJvbnQoKSk7DQorICAgIGlmIChSZWFkSUQoKSAhPSBOSUQ6OmtIZWFkZXIpDQorICAgICAgVGhyb3dJbmNvcnJlY3QoKTsNCisgIH0NCisNCisgIGRiLklzQXJjID0gdHJ1ZTsNCisNCisgIGRiLkhlYWRlcnNTaXplID0gSGVhZGVyc1NpemU7DQorDQorICByZXR1cm4gUmVhZEhlYWRlcigNCisgICAgRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgIGRiDQorICAgIF83Wl9ERUNPREVSX0NSWVBST19WQVJTDQorICAgICk7DQorfQ0KKw0KK0hSRVNVTFQgQ0luQXJjaGl2ZTo6UmVhZERhdGFiYXNlKA0KKyAgICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICBDRGJFeCAmZGINCisgICAgXzdaX0RFQ09ERVJfQ1JZUFJPX1ZBUlNfREVDTA0KKyAgICApDQorew0KKyAgdHJ5DQorICB7DQorICAgIEhSRVNVTFQgcmVzID0gUmVhZERhdGFiYXNlMigNCisgICAgICBFWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMgZGINCisgICAgICBfN1pfREVDT0RFUl9DUllQUk9fVkFSUw0KKyAgICAgICk7DQorICAgIGlmIChUaGVyZUlzSGVhZGVyRXJyb3IpDQorICAgICAgZGIuVGhlcmVJc0hlYWRlckVycm9yID0gdHJ1ZTsNCisgICAgaWYgKHJlcyA9PSBFX05PVElNUEwpDQorICAgICAgVGhyb3dVbnN1cHBvcnRlZCgpOw0KKyAgICByZXR1cm4gcmVzOw0KKyAgfQ0KKyAgY2F0Y2goQ1Vuc3VwcG9ydGVkRmVhdHVyZUV4Y2VwdGlvbiAmKQ0KKyAgew0KKyAgICBkYi5VbnN1cHBvcnRlZEZlYXR1cmVFcnJvciA9IHRydWU7DQorICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgfQ0KKyAgY2F0Y2goQ0luQXJjaGl2ZUV4Y2VwdGlvbiAmKQ0KKyAgew0KKyAgICBkYi5UaGVyZUlzSGVhZGVyRXJyb3IgPSB0cnVlOw0KKyAgICByZXR1cm4gU19GQUxTRTsNCisgIH0NCit9DQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pJbi5oIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6SW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzhlY2EyCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6SW4uaApAQCAtMCwwICsxLDQxMiBAQAorLy8gN3pJbi5oDQorDQorI2lmbmRlZiBfXzdaX0lOX0gNCisjZGVmaW5lIF9fN1pfSU5fSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlDb20uaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9Qcm9wVmFyaWFudC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9JUGFzc3dvcmQuaCINCisjaW5jbHVkZSAiLi4vLi4vSVN0cmVhbS5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vQ3JlYXRlQ29kZXIuaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0luQnVmZmVyLmgiDQorDQorI2luY2x1ZGUgIjd6SXRlbS5oIg0KKyANCituYW1lc3BhY2UgTkFyY2hpdmUgew0KK25hbWVzcGFjZSBON3ogew0KKw0KKy8qDQorICBXZSBkb24ndCBuZWVkIHRvIGluaXQgaXNFbmNyeXB0ZWQgYW5kIHBhc3N3b3JkSXNEZWZpbmVkDQorICBXZSBtdXN0IHVwZ3JhZGUgdGhlbSBvbmx5ICovDQorDQorI2lmZGVmIF9OT19DUllQVE8NCisjZGVmaW5lIF83Wl9ERUNPREVSX0NSWVBST19WQVJTX0RFQ0wNCisjZGVmaW5lIF83Wl9ERUNPREVSX0NSWVBST19WQVJTDQorI2Vsc2UNCisjZGVmaW5lIF83Wl9ERUNPREVSX0NSWVBST19WQVJTX0RFQ0wgLCBJQ3J5cHRvR2V0VGV4dFBhc3N3b3JkICpnZXRUZXh0UGFzc3dvcmQsIGJvb2wgJmlzRW5jcnlwdGVkLCBib29sICZwYXNzd29yZElzRGVmaW5lZA0KKyNkZWZpbmUgXzdaX0RFQ09ERVJfQ1JZUFJPX1ZBUlMgLCBnZXRUZXh0UGFzc3dvcmQsIGlzRW5jcnlwdGVkLCBwYXNzd29yZElzRGVmaW5lZA0KKyNlbmRpZg0KKw0KK3N0cnVjdCBDUGFyc2VkTWV0aG9kcw0KK3sNCisgIEJ5dGUgTHptYTJQcm9wOw0KKyAgVUludDMyIEx6bWFEaWM7DQorICBDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gSURzOw0KKw0KKyAgQ1BhcnNlZE1ldGhvZHMoKTogTHptYTJQcm9wKDApLCBMem1hRGljKDApIHt9DQorfTsNCisNCitzdHJ1Y3QgQ0ZvbGRlcnMNCit7DQorICBDTnVtIE51bVBhY2tTdHJlYW1zOw0KKyAgQ051bSBOdW1Gb2xkZXJzOw0KKw0KKyAgQ09iakFycmF5PFVJbnQ2ND4gUGFja1Bvc2l0aW9uczsgLy8gTnVtUGFja1N0cmVhbXMgKyAxDQorICAvLyBDVUludDMyRGVmVmVjdG9yIFBhY2tDUkNzOyAvLyB3ZSBkb24ndCB1c2UgUGFja0NSQ3Mgbm93DQorDQorICBDVUludDMyRGVmVmVjdG9yIEZvbGRlckNSQ3M7ICAgICAgICAgICAgICAvLyBOdW1Gb2xkZXJzDQorICBDT2JqQXJyYXk8Q051bT4gTnVtVW5wYWNrU3RyZWFtc1ZlY3RvcjsgIC8vIE51bUZvbGRlcnMNCisNCisgIENPYmpBcnJheTxVSW50NjQ+IENvZGVyVW5wYWNrU2l6ZXM7ICAgICAgLy8gaW5jbHVkaW5nIHVucGFjayBzaXplcyBvZiBiaW5kIGNvZGVycw0KKyAgQ09iakFycmF5PENOdW0+IEZvVG9Db2RlclVucGFja1NpemVzOyAgICAvLyBOdW1Gb2xkZXJzICsgMQ0KKyAgQ09iakFycmF5PENOdW0+IEZvU3RhcnRQYWNrU3RyZWFtSW5kZXg7ICAvLyBOdW1Gb2xkZXJzICsgMQ0KKyAgQ09iakFycmF5PEJ5dGU+IEZvVG9NYWluVW5wYWNrU2l6ZUluZGV4OyAvLyBOdW1Gb2xkZXJzDQorICANCisgIENPYmpBcnJheTxzaXplX3Q+IEZvQ29kZXJzRGF0YU9mZnNldDsgICAgLy8gTnVtRm9sZGVycyArIDENCisgIENCeXRlQnVmZmVyIENvZGVyc0RhdGE7DQorDQorICBDUGFyc2VkTWV0aG9kcyBQYXJzZWRNZXRob2RzOw0KKw0KKyAgdm9pZCBQYXJzZUZvbGRlckluZm8odW5zaWduZWQgZm9sZGVySW5kZXgsIENGb2xkZXIgJmZvbGRlcikgY29uc3Q7DQorICANCisgIHVuc2lnbmVkIEdldE51bUZvbGRlclVucGFja1NpemVzKHVuc2lnbmVkIGZvbGRlckluZGV4KSBjb25zdA0KKyAgew0KKyAgICByZXR1cm4gRm9Ub0NvZGVyVW5wYWNrU2l6ZXNbZm9sZGVySW5kZXggKyAxXSAtIEZvVG9Db2RlclVucGFja1NpemVzW2ZvbGRlckluZGV4XTsNCisgIH0NCisNCisgIFVJbnQ2NCBHZXRGb2xkZXJVbnBhY2tTaXplKHVuc2lnbmVkIGZvbGRlckluZGV4KSBjb25zdA0KKyAgew0KKyAgICByZXR1cm4gQ29kZXJVbnBhY2tTaXplc1tGb1RvQ29kZXJVbnBhY2tTaXplc1tmb2xkZXJJbmRleF0gKyBGb1RvTWFpblVucGFja1NpemVJbmRleFtmb2xkZXJJbmRleF1dOw0KKyAgfQ0KKw0KKyAgVUludDY0IEdldFN0cmVhbVBhY2tTaXplKHVuc2lnbmVkIGluZGV4KSBjb25zdA0KKyAgew0KKyAgICByZXR1cm4gUGFja1Bvc2l0aW9uc1tpbmRleCArIDFdIC0gUGFja1Bvc2l0aW9uc1tpbmRleF07DQorICB9DQorDQorICB2b2lkIENsZWFyKCkNCisgIHsNCisgICAgTnVtUGFja1N0cmVhbXMgPSAwOw0KKyAgICBQYWNrUG9zaXRpb25zLkZyZWUoKTsNCisgICAgLy8gUGFja0NSQ3MuQ2xlYXIoKTsNCisNCisgICAgTnVtRm9sZGVycyA9IDA7DQorICAgIEZvbGRlckNSQ3MuQ2xlYXIoKTsNCisgICAgTnVtVW5wYWNrU3RyZWFtc1ZlY3Rvci5GcmVlKCk7DQorICAgIENvZGVyVW5wYWNrU2l6ZXMuRnJlZSgpOw0KKyAgICBGb1RvQ29kZXJVbnBhY2tTaXplcy5GcmVlKCk7DQorICAgIEZvU3RhcnRQYWNrU3RyZWFtSW5kZXguRnJlZSgpOw0KKyAgICBGb1RvTWFpblVucGFja1NpemVJbmRleC5GcmVlKCk7DQorICAgIEZvQ29kZXJzRGF0YU9mZnNldC5GcmVlKCk7DQorICAgIENvZGVyc0RhdGEuRnJlZSgpOw0KKyAgfQ0KK307DQorDQorc3RydWN0IENEYXRhYmFzZTogcHVibGljIENGb2xkZXJzDQorew0KKyAgQ1JlY29yZFZlY3RvcjxDRmlsZUl0ZW0+IEZpbGVzOw0KKw0KKyAgQ1VJbnQ2NERlZlZlY3RvciBDVGltZTsNCisgIENVSW50NjREZWZWZWN0b3IgQVRpbWU7DQorICBDVUludDY0RGVmVmVjdG9yIE1UaW1lOw0KKyAgQ1VJbnQ2NERlZlZlY3RvciBTdGFydFBvczsNCisgIENSZWNvcmRWZWN0b3I8Ym9vbD4gSXNBbnRpOw0KKyAgLyoNCisgIENSZWNvcmRWZWN0b3I8Ym9vbD4gSXNBdXg7DQorICBDQnl0ZUJ1ZmZlciBTZWN1cmVCdWY7DQorICBDUmVjb3JkVmVjdG9yPFVJbnQzMj4gU2VjdXJlSURzOw0KKyAgKi8NCisNCisgIENCeXRlQnVmZmVyIE5hbWVzQnVmOw0KKyAgQ09iakFycmF5PHNpemVfdD4gTmFtZU9mZnNldHM7IC8vIG51bUZpbGVzICsgMSwgb2Zmc2V0cyBvZiB1dGYtMTYgc3ltYm9scw0KKw0KKyAgLyoNCisgIHZvaWQgQ2xlYXJTZWN1cmUoKQ0KKyAgew0KKyAgICBTZWN1cmVCdWYuRnJlZSgpOw0KKyAgICBTZWN1cmVJRHMuQ2xlYXIoKTsNCisgIH0NCisgICovDQorDQorICB2b2lkIENsZWFyKCkNCisgIHsNCisgICAgQ0ZvbGRlcnM6OkNsZWFyKCk7DQorICAgIC8vIENsZWFyU2VjdXJlKCk7DQorDQorICAgIE5hbWVzQnVmLkZyZWUoKTsNCisgICAgTmFtZU9mZnNldHMuRnJlZSgpOw0KKyAgICANCisgICAgRmlsZXMuQ2xlYXIoKTsNCisgICAgQ1RpbWUuQ2xlYXIoKTsNCisgICAgQVRpbWUuQ2xlYXIoKTsNCisgICAgTVRpbWUuQ2xlYXIoKTsNCisgICAgU3RhcnRQb3MuQ2xlYXIoKTsNCisgICAgSXNBbnRpLkNsZWFyKCk7DQorICAgIC8vIElzQXV4LkNsZWFyKCk7DQorICB9DQorDQorICBib29sIElzU29saWQoKSBjb25zdA0KKyAgew0KKyAgICBmb3IgKENOdW0gaSA9IDA7IGkgPCBOdW1Gb2xkZXJzOyBpKyspDQorICAgICAgaWYgKE51bVVucGFja1N0cmVhbXNWZWN0b3JbaV0gPiAxKQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIGJvb2wgSXNJdGVtQW50aSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gKGluZGV4IDwgSXNBbnRpLlNpemUoKSAmJiBJc0FudGlbaW5kZXhdKTsgfQ0KKyAgLy8gYm9vbCBJc0l0ZW1BdXgodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIChpbmRleCA8IElzQXV4LlNpemUoKSAmJiBJc0F1eFtpbmRleF0pOyB9DQorDQorICBjb25zdCB2b2lkICogR2V0TmFtZSh1bnNpZ25lZCBpbmRleCkgY29uc3QNCisgIHsNCisgICAgaWYgKCFOYW1lT2Zmc2V0cyB8fCAhTmFtZXNCdWYpDQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIHJldHVybiAoY29uc3Qgdm9pZCAqKSgoY29uc3QgQnl0ZSAqKU5hbWVzQnVmICsgTmFtZU9mZnNldHNbaW5kZXhdICogMik7DQorICB9Ow0KKw0KKyAgdm9pZCBHZXRQYXRoKHVuc2lnbmVkIGluZGV4LCBVU3RyaW5nICZwYXRoKSBjb25zdDsNCisgIEhSRVNVTFQgR2V0UGF0aF9Qcm9wKHVuc2lnbmVkIGluZGV4LCBQUk9QVkFSSUFOVCAqcGF0aCkgY29uc3QgdGhyb3coKTsNCit9Ow0KKw0KK3N0cnVjdCBDSW5BcmNoaXZlSW5mbw0KK3sNCisgIENBcmNoaXZlVmVyc2lvbiBWZXJzaW9uOw0KKyAgVUludDY0IFN0YXJ0UG9zaXRpb247DQorICBVSW50NjQgU3RhcnRQb3NpdGlvbkFmdGVySGVhZGVyOw0KKyAgVUludDY0IERhdGFTdGFydFBvc2l0aW9uOw0KKyAgVUludDY0IERhdGFTdGFydFBvc2l0aW9uMjsNCisgIENSZWNvcmRWZWN0b3I8VUludDY0PiBGaWxlSW5mb1BvcElEczsNCisgIA0KKyAgdm9pZCBDbGVhcigpDQorICB7DQorICAgIFN0YXJ0UG9zaXRpb24gPSAwOw0KKyAgICBTdGFydFBvc2l0aW9uQWZ0ZXJIZWFkZXIgPSAwOw0KKyAgICBEYXRhU3RhcnRQb3NpdGlvbiA9IDA7DQorICAgIERhdGFTdGFydFBvc2l0aW9uMiA9IDA7DQorICAgIEZpbGVJbmZvUG9wSURzLkNsZWFyKCk7DQorICB9DQorfTsNCisNCitzdHJ1Y3QgQ0RiRXg6IHB1YmxpYyBDRGF0YWJhc2UNCit7DQorICBDSW5BcmNoaXZlSW5mbyBBcmNJbmZvOw0KKyAgQ1JlY29yZFZlY3RvcjxDTnVtPiBGb2xkZXJTdGFydEZpbGVJbmRleDsNCisgIENSZWNvcmRWZWN0b3I8Q051bT4gRmlsZUluZGV4VG9Gb2xkZXJJbmRleE1hcDsNCisNCisgIFVJbnQ2NCBIZWFkZXJzU2l6ZTsNCisgIFVJbnQ2NCBQaHlTaXplOw0KKw0KKyAgLyoNCisgIENSZWNvcmRWZWN0b3I8c2l6ZV90PiBTZWN1cmVPZmZzZXRzOw0KKyAgYm9vbCBJc1RyZWU7DQorICBib29sIFRoZXJlQXJlQWx0U3RyZWFtczsNCisgICovDQorDQorICBib29sIElzQXJjOw0KKyAgYm9vbCBQaHlTaXplV2FzQ29uZmlybWVkOw0KKw0KKyAgYm9vbCBUaGVyZUlzSGVhZGVyRXJyb3I7DQorICBib29sIFVuZXhwZWN0ZWRFbmQ7DQorICAvLyBib29sIFVuc3VwcG9ydGVkVmVyc2lvbjsNCisNCisgIGJvb2wgU3RhcnRIZWFkZXJXYXNSZWNvdmVyZWQ7DQorICBib29sIFVuc3VwcG9ydGVkRmVhdHVyZVdhcm5pbmc7DQorICBib29sIFVuc3VwcG9ydGVkRmVhdHVyZUVycm9yOw0KKw0KKyAgLyoNCisgIHZvaWQgQ2xlYXJTZWN1cmVFeCgpDQorICB7DQorICAgIENsZWFyU2VjdXJlKCk7DQorICAgIFNlY3VyZU9mZnNldHMuQ2xlYXIoKTsNCisgIH0NCisgICovDQorDQorICB2b2lkIENsZWFyKCkNCisgIHsNCisgICAgSXNBcmMgPSBmYWxzZTsNCisgICAgUGh5U2l6ZVdhc0NvbmZpcm1lZCA9IGZhbHNlOw0KKw0KKyAgICBUaGVyZUlzSGVhZGVyRXJyb3IgPSBmYWxzZTsNCisgICAgVW5leHBlY3RlZEVuZCA9IGZhbHNlOw0KKyAgICAvLyBVbnN1cHBvcnRlZFZlcnNpb24gPSBmYWxzZTsNCisNCisgICAgU3RhcnRIZWFkZXJXYXNSZWNvdmVyZWQgPSBmYWxzZTsNCisgICAgVW5zdXBwb3J0ZWRGZWF0dXJlRXJyb3IgPSBmYWxzZTsNCisgICAgVW5zdXBwb3J0ZWRGZWF0dXJlV2FybmluZyA9IGZhbHNlOw0KKw0KKyAgICAvKg0KKyAgICBJc1RyZWUgPSBmYWxzZTsNCisgICAgVGhlcmVBcmVBbHRTdHJlYW1zID0gZmFsc2U7DQorICAgICovDQorDQorICAgIENEYXRhYmFzZTo6Q2xlYXIoKTsNCisgICAgDQorICAgIC8vIFNlY3VyZU9mZnNldHMuQ2xlYXIoKTsNCisgICAgQXJjSW5mby5DbGVhcigpOw0KKyAgICBGb2xkZXJTdGFydEZpbGVJbmRleC5DbGVhcigpOw0KKyAgICBGaWxlSW5kZXhUb0ZvbGRlckluZGV4TWFwLkNsZWFyKCk7DQorDQorICAgIEhlYWRlcnNTaXplID0gMDsNCisgICAgUGh5U2l6ZSA9IDA7DQorICB9DQorDQorICB2b2lkIEZpbGxMaW5rcygpOw0KKyAgDQorICBVSW50NjQgR2V0Rm9sZGVyU3RyZWFtUG9zKHVuc2lnbmVkIGZvbGRlckluZGV4LCB1bnNpZ25lZCBpbmRleEluRm9sZGVyKSBjb25zdA0KKyAgew0KKyAgICByZXR1cm4gQXJjSW5mby5EYXRhU3RhcnRQb3NpdGlvbiArDQorICAgICAgICBQYWNrUG9zaXRpb25zW0ZvU3RhcnRQYWNrU3RyZWFtSW5kZXhbZm9sZGVySW5kZXhdICsgaW5kZXhJbkZvbGRlcl07DQorICB9DQorICANCisgIFVJbnQ2NCBHZXRGb2xkZXJGdWxsUGFja1NpemUodW5zaWduZWQgZm9sZGVySW5kZXgpIGNvbnN0DQorICB7DQorICAgIHJldHVybg0KKyAgICAgIFBhY2tQb3NpdGlvbnNbRm9TdGFydFBhY2tTdHJlYW1JbmRleFtmb2xkZXJJbmRleCArIDFdXSAtDQorICAgICAgUGFja1Bvc2l0aW9uc1tGb1N0YXJ0UGFja1N0cmVhbUluZGV4W2ZvbGRlckluZGV4XV07DQorICB9DQorICANCisgIFVJbnQ2NCBHZXRGb2xkZXJQYWNrU3RyZWFtU2l6ZSh1bnNpZ25lZCBmb2xkZXJJbmRleCwgdW5zaWduZWQgc3RyZWFtSW5kZXgpIGNvbnN0DQorICB7DQorICAgIHVuc2lnbmVkIGkgPSBGb1N0YXJ0UGFja1N0cmVhbUluZGV4W2ZvbGRlckluZGV4XSArIHN0cmVhbUluZGV4Ow0KKyAgICByZXR1cm4gUGFja1Bvc2l0aW9uc1tpICsgMV0gLSBQYWNrUG9zaXRpb25zW2ldOw0KKyAgfQ0KKw0KKyAgVUludDY0IEdldEZpbGVQYWNrU2l6ZShDTnVtIGZpbGVJbmRleCkgY29uc3QNCisgIHsNCisgICAgQ051bSBmb2xkZXJJbmRleCA9IEZpbGVJbmRleFRvRm9sZGVySW5kZXhNYXBbZmlsZUluZGV4XTsNCisgICAgaWYgKGZvbGRlckluZGV4ICE9IGtOdW1Ob0luZGV4KQ0KKyAgICAgIGlmIChGb2xkZXJTdGFydEZpbGVJbmRleFtmb2xkZXJJbmRleF0gPT0gZmlsZUluZGV4KQ0KKyAgICAgICAgcmV0dXJuIEdldEZvbGRlckZ1bGxQYWNrU2l6ZShmb2xkZXJJbmRleCk7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KK307DQorDQorY29uc3QgdW5zaWduZWQga051bUJ1ZkxldmVsc01heCA9IDQ7DQorDQorc3RydWN0IENJbkJ5dGUyDQorew0KKyAgY29uc3QgQnl0ZSAqX2J1ZmZlcjsNCitwdWJsaWM6DQorICBzaXplX3QgX3NpemU7DQorICBzaXplX3QgX3BvczsNCisgIA0KKyAgc2l6ZV90IEdldFJlbSgpIGNvbnN0IHsgcmV0dXJuIF9zaXplIC0gX3BvczsgfQ0KKyAgY29uc3QgQnl0ZSAqR2V0UHRyKCkgY29uc3QgeyByZXR1cm4gX2J1ZmZlciArIF9wb3M7IH0NCisgIHZvaWQgSW5pdChjb25zdCBCeXRlICpidWZmZXIsIHNpemVfdCBzaXplKQ0KKyAgew0KKyAgICBfYnVmZmVyID0gYnVmZmVyOw0KKyAgICBfc2l6ZSA9IHNpemU7DQorICAgIF9wb3MgPSAwOw0KKyAgfQ0KKyAgQnl0ZSBSZWFkQnl0ZSgpOw0KKyAgdm9pZCBSZWFkQnl0ZXMoQnl0ZSAqZGF0YSwgc2l6ZV90IHNpemUpOw0KKyAgdm9pZCBTa2lwRGF0YU5vQ2hlY2soVUludDY0IHNpemUpIHsgX3BvcyArPSAoc2l6ZV90KXNpemU7IH0NCisgIHZvaWQgU2tpcERhdGEoVUludDY0IHNpemUpOw0KKw0KKyAgdm9pZCBTa2lwRGF0YSgpOw0KKyAgdm9pZCBTa2lwUmVtKCkgeyBfcG9zID0gX3NpemU7IH0NCisgIFVJbnQ2NCBSZWFkTnVtYmVyKCk7DQorICBDTnVtIFJlYWROdW0oKTsNCisgIFVJbnQzMiBSZWFkVUludDMyKCk7DQorICBVSW50NjQgUmVhZFVJbnQ2NCgpOw0KKw0KKyAgdm9pZCBQYXJzZUZvbGRlcihDRm9sZGVyICZmb2xkZXIpOw0KK307DQorDQorY2xhc3MgQ1N0cmVhbVN3aXRjaDsNCisNCitjb25zdCBVSW50MzIga0hlYWRlclNpemUgPSAzMjsNCisNCitjbGFzcyBDSW5BcmNoaXZlDQorew0KKyAgZnJpZW5kIGNsYXNzIENTdHJlYW1Td2l0Y2g7DQorDQorICBDTXlDb21QdHI8SUluU3RyZWFtPiBfc3RyZWFtOw0KKw0KKyAgdW5zaWduZWQgX251bUluQnl0ZUJ1ZnM7DQorICBDSW5CeXRlMiBfaW5CeXRlVmVjdG9yW2tOdW1CdWZMZXZlbHNNYXhdOw0KKw0KKyAgQ0luQnl0ZTIgKl9pbkJ5dGVCYWNrOw0KKyAgYm9vbCBUaGVyZUlzSGVhZGVyRXJyb3I7DQorIA0KKyAgVUludDY0IF9hcmhpdmVCZWdpblN0cmVhbVBvc2l0aW9uOw0KKyAgVUludDY0IF9maWxlRW5kUG9zaXRpb247DQorDQorICBCeXRlIF9oZWFkZXJba0hlYWRlclNpemVdOw0KKw0KKyAgVUludDY0IEhlYWRlcnNTaXplOw0KKw0KKyAgdm9pZCBBZGRCeXRlU3RyZWFtKGNvbnN0IEJ5dGUgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOw0KKyAgDQorICB2b2lkIERlbGV0ZUJ5dGVTdHJlYW0oYm9vbCBuZWVkVXBkYXRlUG9zKQ0KKyAgew0KKyAgICBfbnVtSW5CeXRlQnVmcy0tOw0KKyAgICBpZiAoX251bUluQnl0ZUJ1ZnMgPiAwKQ0KKyAgICB7DQorICAgICAgX2luQnl0ZUJhY2sgPSAmX2luQnl0ZVZlY3RvcltfbnVtSW5CeXRlQnVmcyAtIDFdOw0KKyAgICAgIGlmIChuZWVkVXBkYXRlUG9zKQ0KKyAgICAgICAgX2luQnl0ZUJhY2stPl9wb3MgKz0gX2luQnl0ZVZlY3RvcltfbnVtSW5CeXRlQnVmc10uX3BvczsNCisgICAgfQ0KKyAgfQ0KKw0KK3ByaXZhdGU6DQorICBIUkVTVUxUIEZpbmRBbmRSZWFkU2lnbmF0dXJlKElJblN0cmVhbSAqc3RyZWFtLCBjb25zdCBVSW50NjQgKnNlYXJjaEhlYWRlclNpemVMaW1pdCk7DQorICANCisgIHZvaWQgUmVhZEJ5dGVzKEJ5dGUgKmRhdGEsIHNpemVfdCBzaXplKSB7IF9pbkJ5dGVCYWNrLT5SZWFkQnl0ZXMoZGF0YSwgc2l6ZSk7IH0NCisgIEJ5dGUgUmVhZEJ5dGUoKSB7IHJldHVybiBfaW5CeXRlQmFjay0+UmVhZEJ5dGUoKTsgfQ0KKyAgVUludDY0IFJlYWROdW1iZXIoKSB7IHJldHVybiBfaW5CeXRlQmFjay0+UmVhZE51bWJlcigpOyB9DQorICBDTnVtIFJlYWROdW0oKSB7IHJldHVybiBfaW5CeXRlQmFjay0+UmVhZE51bSgpOyB9DQorICBVSW50NjQgUmVhZElEKCkgeyByZXR1cm4gX2luQnl0ZUJhY2stPlJlYWROdW1iZXIoKTsgfQ0KKyAgVUludDMyIFJlYWRVSW50MzIoKSB7IHJldHVybiBfaW5CeXRlQmFjay0+UmVhZFVJbnQzMigpOyB9DQorICBVSW50NjQgUmVhZFVJbnQ2NCgpIHsgcmV0dXJuIF9pbkJ5dGVCYWNrLT5SZWFkVUludDY0KCk7IH0NCisgIHZvaWQgU2tpcERhdGEoVUludDY0IHNpemUpIHsgX2luQnl0ZUJhY2stPlNraXBEYXRhKHNpemUpOyB9DQorICB2b2lkIFNraXBEYXRhKCkgeyBfaW5CeXRlQmFjay0+U2tpcERhdGEoKTsgfQ0KKyAgdm9pZCBXYWl0SWQoVUludDY0IGlkKTsNCisNCisgIHZvaWQgUmVhZEFyY2hpdmVQcm9wZXJ0aWVzKENJbkFyY2hpdmVJbmZvICZhcmNoaXZlSW5mbyk7DQorICB2b2lkIFJlYWRIYXNoRGlnZXN0cyh1bnNpZ25lZCBudW1JdGVtcywgQ1VJbnQzMkRlZlZlY3RvciAmY3Jjcyk7DQorICANCisgIHZvaWQgUmVhZFBhY2tJbmZvKENGb2xkZXJzICZmKTsNCisgIA0KKyAgdm9pZCBSZWFkVW5wYWNrSW5mbygNCisgICAgICBjb25zdCBDT2JqZWN0VmVjdG9yPENCeXRlQnVmZmVyPiAqZGF0YVZlY3RvciwNCisgICAgICBDRm9sZGVycyAmZm9sZGVycyk7DQorICANCisgIHZvaWQgUmVhZFN1YlN0cmVhbXNJbmZvKA0KKyAgICAgIENGb2xkZXJzICZmb2xkZXJzLA0KKyAgICAgIENSZWNvcmRWZWN0b3I8VUludDY0PiAmdW5wYWNrU2l6ZXMsDQorICAgICAgQ1VJbnQzMkRlZlZlY3RvciAmZGlnZXN0cyk7DQorDQorICB2b2lkIFJlYWRTdHJlYW1zSW5mbygNCisgICAgICBjb25zdCBDT2JqZWN0VmVjdG9yPENCeXRlQnVmZmVyPiAqZGF0YVZlY3RvciwNCisgICAgICBVSW50NjQgJmRhdGFPZmZzZXQsDQorICAgICAgQ0ZvbGRlcnMgJmZvbGRlcnMsDQorICAgICAgQ1JlY29yZFZlY3RvcjxVSW50NjQ+ICZ1bnBhY2tTaXplcywNCisgICAgICBDVUludDMyRGVmVmVjdG9yICZkaWdlc3RzKTsNCisNCisgIHZvaWQgUmVhZEJvb2xWZWN0b3IodW5zaWduZWQgbnVtSXRlbXMsIENCb29sVmVjdG9yICZ2KTsNCisgIHZvaWQgUmVhZEJvb2xWZWN0b3IyKHVuc2lnbmVkIG51bUl0ZW1zLCBDQm9vbFZlY3RvciAmdik7DQorICB2b2lkIFJlYWRVSW50NjREZWZWZWN0b3IoY29uc3QgQ09iamVjdFZlY3RvcjxDQnl0ZUJ1ZmZlcj4gJmRhdGFWZWN0b3IsDQorICAgICAgQ1VJbnQ2NERlZlZlY3RvciAmdiwgdW5zaWduZWQgbnVtSXRlbXMpOw0KKyAgSFJFU1VMVCBSZWFkQW5kRGVjb2RlUGFja2VkU3RyZWFtcygNCisgICAgICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICAgIFVJbnQ2NCBiYXNlT2Zmc2V0LCBVSW50NjQgJmRhdGFPZmZzZXQsDQorICAgICAgQ09iamVjdFZlY3RvcjxDQnl0ZUJ1ZmZlcj4gJmRhdGFWZWN0b3INCisgICAgICBfN1pfREVDT0RFUl9DUllQUk9fVkFSU19ERUNMDQorICAgICAgKTsNCisgIEhSRVNVTFQgUmVhZEhlYWRlcigNCisgICAgICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICAgIENEYkV4ICZkYg0KKyAgICAgIF83Wl9ERUNPREVSX0NSWVBST19WQVJTX0RFQ0wNCisgICAgICApOw0KKyAgSFJFU1VMVCBSZWFkRGF0YWJhc2UyKA0KKyAgICAgIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgICAgQ0RiRXggJmRiDQorICAgICAgXzdaX0RFQ09ERVJfQ1JZUFJPX1ZBUlNfREVDTA0KKyAgICAgICk7DQorcHVibGljOg0KKyAgQ0luQXJjaGl2ZSgpOiBfbnVtSW5CeXRlQnVmcygwKSB7IH0NCisgIEhSRVNVTFQgT3BlbihJSW5TdHJlYW0gKnN0cmVhbSwgY29uc3QgVUludDY0ICpzZWFyY2hIZWFkZXJTaXplTGltaXQpOyAvLyBTX0ZBTFNFIG1lYW5zIGlzIG5vdCBhcmNoaXZlDQorICB2b2lkIENsb3NlKCk7DQorDQorICBIUkVTVUxUIFJlYWREYXRhYmFzZSgNCisgICAgICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICAgIENEYkV4ICZkYg0KKyAgICAgIF83Wl9ERUNPREVSX0NSWVBST19WQVJTX0RFQ0wNCisgICAgICApOw0KK307DQorICANCit9fQ0KKyAgDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6SXRlbS5oIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6SXRlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZTY4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pJdGVtLmgKQEAgLTAsMCArMSwxODYgQEAKKy8vIDd6SXRlbS5oDQorDQorI2lmbmRlZiBfXzdaX0lURU1fSA0KKyNkZWZpbmUgX183Wl9JVEVNX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015QnVmZmVyLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeVN0cmluZy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTWV0aG9kSWQuaCINCisNCisjaW5jbHVkZSAiN3pIZWFkZXIuaCINCisNCituYW1lc3BhY2UgTkFyY2hpdmUgew0KK25hbWVzcGFjZSBON3ogew0KKw0KK2NvbnN0IFVJbnQ2NCBrX0FFUyA9IDB4MDZGMTA3MDE7DQorDQordHlwZWRlZiBVSW50MzIgQ051bTsNCitjb25zdCBDTnVtIGtOdW1NYXggICAgID0gMHg3RkZGRkZGRjsNCitjb25zdCBDTnVtIGtOdW1Ob0luZGV4ID0gMHhGRkZGRkZGRjsNCisNCitzdHJ1Y3QgQ0NvZGVySW5mbw0KK3sNCisgIENNZXRob2RJZCBNZXRob2RJRDsNCisgIENCeXRlQnVmZmVyIFByb3BzOw0KKyAgQ051bSBOdW1JblN0cmVhbXM7DQorICBDTnVtIE51bU91dFN0cmVhbXM7DQorICANCisgIGJvb2wgSXNTaW1wbGVDb2RlcigpIGNvbnN0IHsgcmV0dXJuIChOdW1JblN0cmVhbXMgPT0gMSkgJiYgKE51bU91dFN0cmVhbXMgPT0gMSk7IH0NCit9Ow0KKw0KK3N0cnVjdCBDQmluZFBhaXINCit7DQorICBDTnVtIEluSW5kZXg7DQorICBDTnVtIE91dEluZGV4Ow0KK307DQorDQorc3RydWN0IENGb2xkZXINCit7DQorICBDT2JqQXJyYXkyPENDb2RlckluZm8+IENvZGVyczsNCisgIENPYmpBcnJheTI8Q0JpbmRQYWlyPiBCaW5kUGFpcnM7DQorICBDT2JqQXJyYXkyPENOdW0+IFBhY2tTdHJlYW1zOw0KKw0KKyAgQ051bSBHZXROdW1PdXRTdHJlYW1zKCkgY29uc3QNCisgIHsNCisgICAgQ051bSByZXN1bHQgPSAwOw0KKyAgICBGT1JfVkVDVE9SKGksIENvZGVycykNCisgICAgICByZXN1bHQgKz0gQ29kZXJzW2ldLk51bU91dFN0cmVhbXM7DQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorDQorICBpbnQgRmluZEJpbmRQYWlyRm9ySW5TdHJlYW0oQ051bSBpblN0cmVhbUluZGV4KSBjb25zdA0KKyAgew0KKyAgICBGT1JfVkVDVE9SKGksIEJpbmRQYWlycykNCisgICAgICBpZiAoQmluZFBhaXJzW2ldLkluSW5kZXggPT0gaW5TdHJlYW1JbmRleCkNCisgICAgICAgIHJldHVybiBpOw0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpbnQgRmluZEJpbmRQYWlyRm9yT3V0U3RyZWFtKENOdW0gb3V0U3RyZWFtSW5kZXgpIGNvbnN0DQorICB7DQorICAgIEZPUl9WRUNUT1IoaSwgQmluZFBhaXJzKQ0KKyAgICAgIGlmIChCaW5kUGFpcnNbaV0uT3V0SW5kZXggPT0gb3V0U3RyZWFtSW5kZXgpDQorICAgICAgICByZXR1cm4gaTsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaW50IEZpbmRQYWNrU3RyZWFtQXJyYXlJbmRleChDTnVtIGluU3RyZWFtSW5kZXgpIGNvbnN0DQorICB7DQorICAgIEZPUl9WRUNUT1IoaSwgUGFja1N0cmVhbXMpDQorICAgICAgaWYgKFBhY2tTdHJlYW1zW2ldID09IGluU3RyZWFtSW5kZXgpDQorICAgICAgICByZXR1cm4gaTsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKw0KKyAgaW50IEdldEluZGV4T2ZNYWluT3V0U3RyZWFtKCkgY29uc3QNCisgIHsNCisgICAgZm9yIChpbnQgaSA9IChpbnQpR2V0TnVtT3V0U3RyZWFtcygpIC0gMTsgaSA+PSAwOyBpLS0pDQorICAgICAgaWYgKEZpbmRCaW5kUGFpckZvck91dFN0cmVhbShpKSA8IDApDQorICAgICAgICByZXR1cm4gaTsNCisgICAgdGhyb3cgMTsNCisgIH0NCisNCisgIGJvb2wgSXNFbmNyeXB0ZWQoKSBjb25zdA0KKyAgew0KKyAgICBmb3IgKGludCBpID0gQ29kZXJzLlNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQ0KKyAgICAgIGlmIChDb2RlcnNbaV0uTWV0aG9kSUQgPT0ga19BRVMpDQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgYm9vbCBDaGVja1N0cnVjdHVyZSh1bnNpZ25lZCBudW1VbnBhY2tTaXplcykgY29uc3Q7DQorfTsNCisNCitzdHJ1Y3QgQ1VJbnQzMkRlZlZlY3Rvcg0KK3sNCisgIENCb29sVmVjdG9yIERlZnM7DQorICBDUmVjb3JkVmVjdG9yPFVJbnQzMj4gVmFsczsNCisNCisgIHZvaWQgQ2xlYXJBbmRTZXRTaXplKHVuc2lnbmVkIG5ld1NpemUpDQorICB7DQorICAgIERlZnMuQ2xlYXJBbmRTZXRTaXplKG5ld1NpemUpOw0KKyAgICBWYWxzLkNsZWFyQW5kU2V0U2l6ZShuZXdTaXplKTsNCisgIH0NCisNCisgIHZvaWQgQ2xlYXIoKQ0KKyAgew0KKyAgICBEZWZzLkNsZWFyKCk7DQorICAgIFZhbHMuQ2xlYXIoKTsNCisgIH0NCisNCisgIHZvaWQgUmVzZXJ2ZURvd24oKQ0KKyAgew0KKyAgICBEZWZzLlJlc2VydmVEb3duKCk7DQorICAgIFZhbHMuUmVzZXJ2ZURvd24oKTsNCisgIH0NCisNCisgIGJvb2wgVmFsaWRBbmREZWZpbmVkKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIGkgPCBEZWZzLlNpemUoKSAmJiBEZWZzW2ldOyB9DQorfTsNCisNCitzdHJ1Y3QgQ1VJbnQ2NERlZlZlY3Rvcg0KK3sNCisgIENCb29sVmVjdG9yIERlZnM7DQorICBDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gVmFsczsNCisgIA0KKyAgdm9pZCBDbGVhcigpDQorICB7DQorICAgIERlZnMuQ2xlYXIoKTsNCisgICAgVmFscy5DbGVhcigpOw0KKyAgfQ0KKyAgDQorICB2b2lkIFJlc2VydmVEb3duKCkNCisgIHsNCisgICAgRGVmcy5SZXNlcnZlRG93bigpOw0KKyAgICBWYWxzLlJlc2VydmVEb3duKCk7DQorICB9DQorDQorICBib29sIEdldEl0ZW0odW5zaWduZWQgaW5kZXgsIFVJbnQ2NCAmdmFsdWUpIGNvbnN0DQorICB7DQorICAgIGlmIChpbmRleCA8IERlZnMuU2l6ZSgpICYmIERlZnNbaW5kZXhdKQ0KKyAgICB7DQorICAgICAgdmFsdWUgPSBWYWxzW2luZGV4XTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgICB2YWx1ZSA9IDA7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIA0KKyAgdm9pZCBTZXRJdGVtKHVuc2lnbmVkIGluZGV4LCBib29sIGRlZmluZWQsIFVJbnQ2NCB2YWx1ZSk7DQorDQorICBib29sIENoZWNrU2l6ZSh1bnNpZ25lZCBzaXplKSBjb25zdCB7IHJldHVybiBEZWZzLlNpemUoKSA9PSBzaXplIHx8IERlZnMuU2l6ZSgpID09IDA7IH0NCit9Ow0KKw0KK3N0cnVjdCBDRmlsZUl0ZW0NCit7DQorICBVSW50NjQgU2l6ZTsNCisgIFVJbnQzMiBBdHRyaWI7DQorICBVSW50MzIgQ3JjOw0KKyAgLyoNCisgIGludCBQYXJlbnQ7DQorICBib29sIElzQWx0U3RyZWFtOw0KKyAgKi8NCisgIGJvb2wgSGFzU3RyZWFtOyAvLyBUZXN0IGl0ICEhISBpdCBtZWFucyB0aGF0IHRoZXJlIGlzDQorICAgICAgICAgICAgICAgICAgLy8gc3RyZWFtIGluIHNvbWUgZm9sZGVyLiBJdCBjYW4gYmUgZW1wdHkgc3RyZWFtDQorICBib29sIElzRGlyOw0KKyAgYm9vbCBDcmNEZWZpbmVkOw0KKyAgYm9vbCBBdHRyaWJEZWZpbmVkOw0KKw0KKyAgQ0ZpbGVJdGVtKCk6DQorICAgIC8qDQorICAgIFBhcmVudCgtMSksDQorICAgIElzQWx0U3RyZWFtKGZhbHNlKSwNCisgICAgKi8NCisgICAgSGFzU3RyZWFtKHRydWUpLA0KKyAgICBJc0RpcihmYWxzZSksDQorICAgIENyY0RlZmluZWQoZmFsc2UpLA0KKyAgICBBdHRyaWJEZWZpbmVkKGZhbHNlKQ0KKyAgICAgIHt9DQorICB2b2lkIFNldEF0dHJpYihVSW50MzIgYXR0cmliKQ0KKyAgew0KKyAgICBBdHRyaWJEZWZpbmVkID0gdHJ1ZTsNCisgICAgQXR0cmliID0gYXR0cmliOw0KKyAgfQ0KK307DQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pPdXQuY3BwIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6T3V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjc3NmNlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6T3V0LmNwcApAQCAtMCwwICsxLDkwMyBAQAorLy8gN3pPdXQuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9DLzd6Q3JjLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9BdXRvUHRyLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9TdHJlYW1PYmplY3RzLmgiDQorDQorI2luY2x1ZGUgIjd6T3V0LmgiDQorDQorbmFtZXNwYWNlIE5BcmNoaXZlIHsNCituYW1lc3BhY2UgTjd6IHsNCisNCitIUkVTVUxUIENPdXRBcmNoaXZlOjpXcml0ZVNpZ25hdHVyZSgpDQorew0KKyAgQnl0ZSBidWZbOF07DQorICBtZW1jcHkoYnVmLCBrU2lnbmF0dXJlLCBrU2lnbmF0dXJlU2l6ZSk7DQorICBidWZba1NpZ25hdHVyZVNpemVdID0ga01ham9yVmVyc2lvbjsNCisgIGJ1ZltrU2lnbmF0dXJlU2l6ZSArIDFdID0gNDsNCisgIHJldHVybiBXcml0ZURpcmVjdChidWYsIDgpOw0KK30NCisNCisjaWZkZWYgXzdaX1ZPTA0KK0hSRVNVTFQgQ091dEFyY2hpdmU6OldyaXRlRmluaXNoU2lnbmF0dXJlKCkNCit7DQorICBSSU5PSyhXcml0ZURpcmVjdChrRmluaXNoU2lnbmF0dXJlLCBrU2lnbmF0dXJlU2l6ZSkpOw0KKyAgQ0FyY2hpdmVWZXJzaW9uIGF2Ow0KKyAgYXYuTWFqb3IgPSBrTWFqb3JWZXJzaW9uOw0KKyAgYXYuTWlub3IgPSAyOw0KKyAgUklOT0soV3JpdGVEaXJlY3RCeXRlKGF2Lk1ham9yKSk7DQorICByZXR1cm4gV3JpdGVEaXJlY3RCeXRlKGF2Lk1pbm9yKTsNCit9DQorI2VuZGlmDQorDQorc3RhdGljIHZvaWQgU2V0VUludDMyKEJ5dGUgKnAsIFVJbnQzMiBkKQ0KK3sNCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrLCBkID4+PSA4KQ0KKyAgICBwW2ldID0gKEJ5dGUpZDsNCit9DQorDQorc3RhdGljIHZvaWQgU2V0VUludDY0KEJ5dGUgKnAsIFVJbnQ2NCBkKQ0KK3sNCisgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrLCBkID4+PSA4KQ0KKyAgICBwW2ldID0gKEJ5dGUpZDsNCit9DQorDQorSFJFU1VMVCBDT3V0QXJjaGl2ZTo6V3JpdGVTdGFydEhlYWRlcihjb25zdCBDU3RhcnRIZWFkZXIgJmgpDQorew0KKyAgQnl0ZSBidWZbMjRdOw0KKyAgU2V0VUludDY0KGJ1ZiArIDQsIGguTmV4dEhlYWRlck9mZnNldCk7DQorICBTZXRVSW50NjQoYnVmICsgMTIsIGguTmV4dEhlYWRlclNpemUpOw0KKyAgU2V0VUludDMyKGJ1ZiArIDIwLCBoLk5leHRIZWFkZXJDUkMpOw0KKyAgU2V0VUludDMyKGJ1ZiwgQ3JjQ2FsYyhidWYgKyA0LCAyMCkpOw0KKyAgcmV0dXJuIFdyaXRlRGlyZWN0KGJ1ZiwgMjQpOw0KK30NCisNCisjaWZkZWYgXzdaX1ZPTA0KK0hSRVNVTFQgQ091dEFyY2hpdmU6OldyaXRlRmluaXNoSGVhZGVyKGNvbnN0IENGaW5pc2hIZWFkZXIgJmgpDQorew0KKyAgQ0NSQyBjcmM7DQorICBjcmMuVXBkYXRlVUludDY0KGguTmV4dEhlYWRlck9mZnNldCk7DQorICBjcmMuVXBkYXRlVUludDY0KGguTmV4dEhlYWRlclNpemUpOw0KKyAgY3JjLlVwZGF0ZVVJbnQzMihoLk5leHRIZWFkZXJDUkMpOw0KKyAgY3JjLlVwZGF0ZVVJbnQ2NChoLkFyY2hpdmVTdGFydE9mZnNldCk7DQorICBjcmMuVXBkYXRlVUludDY0KGguQWRkaXRpb25hbFN0YXJ0QmxvY2tTaXplKTsNCisgIFJJTk9LKFdyaXRlRGlyZWN0VUludDMyKGNyYy5HZXREaWdlc3QoKSkpOw0KKyAgUklOT0soV3JpdGVEaXJlY3RVSW50NjQoaC5OZXh0SGVhZGVyT2Zmc2V0KSk7DQorICBSSU5PSyhXcml0ZURpcmVjdFVJbnQ2NChoLk5leHRIZWFkZXJTaXplKSk7DQorICBSSU5PSyhXcml0ZURpcmVjdFVJbnQzMihoLk5leHRIZWFkZXJDUkMpKTsNCisgIFJJTk9LKFdyaXRlRGlyZWN0VUludDY0KGguQXJjaGl2ZVN0YXJ0T2Zmc2V0KSk7DQorICByZXR1cm4gV3JpdGVEaXJlY3RVSW50NjQoaC5BZGRpdGlvbmFsU3RhcnRCbG9ja1NpemUpOw0KK30NCisjZW5kaWYNCisNCitIUkVTVUxUIENPdXRBcmNoaXZlOjpDcmVhdGUoSVNlcXVlbnRpYWxPdXRTdHJlYW0gKnN0cmVhbSwgYm9vbCBlbmRNYXJrZXIpDQorew0KKyAgQ2xvc2UoKTsNCisgICNpZmRlZiBfN1pfVk9MDQorICAvLyBlbmRNYXJrZXIgPSBmYWxzZTsNCisgIF9lbmRNYXJrZXIgPSBlbmRNYXJrZXI7DQorICAjZW5kaWYNCisgIFNlcVN0cmVhbSA9IHN0cmVhbTsNCisgIGlmICghZW5kTWFya2VyKQ0KKyAgew0KKyAgICBTZXFTdHJlYW0uUXVlcnlJbnRlcmZhY2UoSUlEX0lPdXRTdHJlYW0sICZTdHJlYW0pOw0KKyAgICBpZiAoIVN0cmVhbSkNCisgICAgew0KKyAgICAgIHJldHVybiBFX05PVElNUEw7DQorICAgICAgLy8gZW5kTWFya2VyID0gdHJ1ZTsNCisgICAgfQ0KKyAgfQ0KKyAgI2lmZGVmIF83Wl9WT0wNCisgIGlmIChlbmRNYXJrZXIpDQorICB7DQorICAgIC8qDQorICAgIENTdGFydEhlYWRlciBzaDsNCisgICAgc2guTmV4dEhlYWRlck9mZnNldCA9IChVSW50MzIpKEludDMyKS0xOw0KKyAgICBzaC5OZXh0SGVhZGVyU2l6ZSA9IChVSW50MzIpKEludDMyKS0xOw0KKyAgICBzaC5OZXh0SGVhZGVyQ1JDID0gMDsNCisgICAgV3JpdGVTdGFydEhlYWRlcihzaCk7DQorICAgICovDQorICB9DQorICBlbHNlDQorICAjZW5kaWYNCisgIHsNCisgICAgaWYgKCFTdHJlYW0pDQorICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgUklOT0soV3JpdGVTaWduYXR1cmUoKSk7DQorICAgIFJJTk9LKFN0cmVhbS0+U2VlaygwLCBTVFJFQU1fU0VFS19DVVIsICZfcHJlZml4SGVhZGVyUG9zKSk7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQordm9pZCBDT3V0QXJjaGl2ZTo6Q2xvc2UoKQ0KK3sNCisgIFNlcVN0cmVhbS5SZWxlYXNlKCk7DQorICBTdHJlYW0uUmVsZWFzZSgpOw0KK30NCisNCitIUkVTVUxUIENPdXRBcmNoaXZlOjpTa2lwUHJlZml4QXJjaGl2ZUhlYWRlcigpDQorew0KKyAgI2lmZGVmIF83Wl9WT0wNCisgIGlmIChfZW5kTWFya2VyKQ0KKyAgICByZXR1cm4gU19PSzsNCisgICNlbmRpZg0KKyAgQnl0ZSBidWZbMjRdOw0KKyAgbWVtc2V0KGJ1ZiwgMCwgMjQpOw0KKyAgcmV0dXJuIFdyaXRlRGlyZWN0KGJ1ZiwgMjQpOw0KK30NCisNCitVSW50NjQgQ091dEFyY2hpdmU6OkdldFBvcygpIGNvbnN0DQorew0KKyAgaWYgKF9jb3VudE1vZGUpDQorICAgIHJldHVybiBfY291bnRTaXplOw0KKyAgaWYgKF93cml0ZVRvU3RyZWFtKQ0KKyAgICByZXR1cm4gX291dEJ5dGUuR2V0UHJvY2Vzc2VkU2l6ZSgpOw0KKyAgcmV0dXJuIF9vdXRCeXRlMi5HZXRQb3MoKTsNCit9DQorDQordm9pZCBDT3V0QXJjaGl2ZTo6V3JpdGVCeXRlcyhjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkNCit7DQorICBpZiAoX2NvdW50TW9kZSkNCisgICAgX2NvdW50U2l6ZSArPSBzaXplOw0KKyAgZWxzZSBpZiAoX3dyaXRlVG9TdHJlYW0pDQorICB7DQorICAgIF9vdXRCeXRlLldyaXRlQnl0ZXMoZGF0YSwgc2l6ZSk7DQorICAgIF9jcmMgPSBDcmNVcGRhdGUoX2NyYywgZGF0YSwgc2l6ZSk7DQorICB9DQorICBlbHNlDQorICAgIF9vdXRCeXRlMi5Xcml0ZUJ5dGVzKGRhdGEsIHNpemUpOw0KK30NCisNCit2b2lkIENPdXRBcmNoaXZlOjpXcml0ZUJ5dGUoQnl0ZSBiKQ0KK3sNCisgIGlmIChfY291bnRNb2RlKQ0KKyAgICBfY291bnRTaXplKys7DQorICBlbHNlIGlmIChfd3JpdGVUb1N0cmVhbSkNCisgIHsNCisgICAgX291dEJ5dGUuV3JpdGVCeXRlKGIpOw0KKyAgICBfY3JjID0gQ1JDX1VQREFURV9CWVRFKF9jcmMsIGIpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgICBfb3V0Qnl0ZTIuV3JpdGVCeXRlKGIpOw0KK30NCisNCit2b2lkIENPdXRBcmNoaXZlOjpXcml0ZVVJbnQzMihVSW50MzIgdmFsdWUpDQorew0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspDQorICB7DQorICAgIFdyaXRlQnl0ZSgoQnl0ZSl2YWx1ZSk7DQorICAgIHZhbHVlID4+PSA4Ow0KKyAgfQ0KK30NCisNCit2b2lkIENPdXRBcmNoaXZlOjpXcml0ZVVJbnQ2NChVSW50NjQgdmFsdWUpDQorew0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspDQorICB7DQorICAgIFdyaXRlQnl0ZSgoQnl0ZSl2YWx1ZSk7DQorICAgIHZhbHVlID4+PSA4Ow0KKyAgfQ0KK30NCisNCit2b2lkIENPdXRBcmNoaXZlOjpXcml0ZU51bWJlcihVSW50NjQgdmFsdWUpDQorew0KKyAgQnl0ZSBmaXJzdEJ5dGUgPSAwOw0KKyAgQnl0ZSBtYXNrID0gMHg4MDsNCisgIGludCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykNCisgIHsNCisgICAgaWYgKHZhbHVlIDwgKChVSW50NjQoMSkgPDwgKCA3ICAqIChpICsgMSkpKSkpDQorICAgIHsNCisgICAgICBmaXJzdEJ5dGUgfD0gQnl0ZSh2YWx1ZSA+PiAoOCAqIGkpKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBmaXJzdEJ5dGUgfD0gbWFzazsNCisgICAgbWFzayA+Pj0gMTsNCisgIH0NCisgIFdyaXRlQnl0ZShmaXJzdEJ5dGUpOw0KKyAgZm9yICg7aSA+IDA7IGktLSkNCisgIHsNCisgICAgV3JpdGVCeXRlKChCeXRlKXZhbHVlKTsNCisgICAgdmFsdWUgPj49IDg7DQorICB9DQorfQ0KKw0KK3N0YXRpYyBVSW50MzIgR2V0QmlnTnVtYmVyU2l6ZShVSW50NjQgdmFsdWUpDQorew0KKyAgaW50IGk7DQorICBmb3IgKGkgPSAxOyBpIDwgOTsgaSsrKQ0KKyAgICBpZiAodmFsdWUgPCAoKChVSW50NjQpMSA8PCAoaSAqIDcpKSkpDQorICAgICAgYnJlYWs7DQorICByZXR1cm4gaTsNCit9DQorDQorI2lmZGVmIF83Wl9WT0wNCitVSW50MzIgQ091dEFyY2hpdmU6OkdldFZvbEhlYWRlcnNTaXplKFVJbnQ2NCBkYXRhU2l6ZSwgaW50IG5hbWVMZW5ndGgsIGJvb2wgcHJvcHMpDQorew0KKyAgVUludDMyIHJlc3VsdCA9IEdldEJpZ051bWJlclNpemUoZGF0YVNpemUpICogMiArIDQxOw0KKyAgaWYgKG5hbWVMZW5ndGggIT0gMCkNCisgIHsNCisgICAgbmFtZUxlbmd0aCA9IChuYW1lTGVuZ3RoICsgMSkgKiAyOw0KKyAgICByZXN1bHQgKz0gbmFtZUxlbmd0aCArIEdldEJpZ051bWJlclNpemUobmFtZUxlbmd0aCkgKyAyOw0KKyAgfQ0KKyAgaWYgKHByb3BzKQ0KKyAgew0KKyAgICByZXN1bHQgKz0gMjA7DQorICB9DQorICBpZiAocmVzdWx0ID49IDEyOCkNCisgICAgcmVzdWx0Kys7DQorICByZXN1bHQgKz0ga1NpZ25hdHVyZVNpemUgKyAyICsga0ZpbmlzaEhlYWRlclNpemU7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisNCitVSW50NjQgQ091dEFyY2hpdmU6OkdldFZvbFB1cmVTaXplKFVJbnQ2NCB2b2xTaXplLCBpbnQgbmFtZUxlbmd0aCwgYm9vbCBwcm9wcykNCit7DQorICBVSW50MzIgaGVhZGVyc1NpemVCYXNlID0gQ091dEFyY2hpdmU6OkdldFZvbEhlYWRlcnNTaXplKDEsIG5hbWVMZW5ndGgsIHByb3BzKTsNCisgIGludCB0ZXN0U2l6ZTsNCisgIGlmICh2b2xTaXplID4gaGVhZGVyc1NpemVCYXNlKQ0KKyAgICB0ZXN0U2l6ZSA9IHZvbFNpemUgLSBoZWFkZXJzU2l6ZUJhc2U7DQorICBlbHNlDQorICAgIHRlc3RTaXplID0gMTsNCisgIFVJbnQzMiBoZWFkZXJzU2l6ZSA9IENPdXRBcmNoaXZlOjpHZXRWb2xIZWFkZXJzU2l6ZSh0ZXN0U2l6ZSwgbmFtZUxlbmd0aCwgcHJvcHMpOw0KKyAgVUludDY0IHB1cmVTaXplID0gMTsNCisgIGlmICh2b2xTaXplID4gaGVhZGVyc1NpemUpDQorICAgIHB1cmVTaXplID0gdm9sU2l6ZSAtIGhlYWRlcnNTaXplOw0KKyAgcmV0dXJuIHB1cmVTaXplOw0KK30NCisjZW5kaWYNCisNCit2b2lkIENPdXRBcmNoaXZlOjpXcml0ZUZvbGRlcihjb25zdCBDRm9sZGVyICZmb2xkZXIpDQorew0KKyAgV3JpdGVOdW1iZXIoZm9sZGVyLkNvZGVycy5TaXplKCkpOw0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBmb2xkZXIuQ29kZXJzLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCBDQ29kZXJJbmZvICZjb2RlciA9IGZvbGRlci5Db2RlcnNbaV07DQorICAgIHsNCisgICAgICBzaXplX3QgcHJvcHNTaXplID0gY29kZXIuUHJvcHMuU2l6ZSgpOw0KKyAgICAgIA0KKyAgICAgIFVJbnQ2NCBpZCA9IGNvZGVyLk1ldGhvZElEOw0KKyAgICAgIGludCBpZFNpemU7DQorICAgICAgZm9yIChpZFNpemUgPSAxOyBpZFNpemUgPCBzaXplb2YoaWQpOyBpZFNpemUrKykNCisgICAgICAgIGlmICgoaWQgPj4gKDggKiBpZFNpemUpKSA9PSAwKQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICBCeXRlIGxvbmdJRFsxNV07DQorICAgICAgZm9yIChpbnQgdCA9IGlkU2l6ZSAtIDE7IHQgPj0gMCA7IHQtLSwgaWQgPj49IDgpDQorICAgICAgICBsb25nSURbdF0gPSAoQnl0ZSkoaWQgJiAweEZGKTsNCisgICAgICBCeXRlIGI7DQorICAgICAgYiA9IChCeXRlKShpZFNpemUgJiAweEYpOw0KKyAgICAgIGJvb2wgaXNDb21wbGV4ID0gIWNvZGVyLklzU2ltcGxlQ29kZXIoKTsNCisgICAgICBiIHw9IChpc0NvbXBsZXggPyAweDEwIDogMCk7DQorICAgICAgYiB8PSAoKHByb3BzU2l6ZSAhPSAwKSA/IDB4MjAgOiAwICk7DQorICAgICAgV3JpdGVCeXRlKGIpOw0KKyAgICAgIFdyaXRlQnl0ZXMobG9uZ0lELCBpZFNpemUpOw0KKyAgICAgIGlmIChpc0NvbXBsZXgpDQorICAgICAgew0KKyAgICAgICAgV3JpdGVOdW1iZXIoY29kZXIuTnVtSW5TdHJlYW1zKTsNCisgICAgICAgIFdyaXRlTnVtYmVyKGNvZGVyLk51bU91dFN0cmVhbXMpOw0KKyAgICAgIH0NCisgICAgICBpZiAocHJvcHNTaXplID09IDApDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBXcml0ZU51bWJlcihwcm9wc1NpemUpOw0KKyAgICAgIFdyaXRlQnl0ZXMoY29kZXIuUHJvcHMsIHByb3BzU2l6ZSk7DQorICAgIH0NCisgIH0NCisgIGZvciAoaSA9IDA7IGkgPCBmb2xkZXIuQmluZFBhaXJzLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCBDQmluZFBhaXIgJmJpbmRQYWlyID0gZm9sZGVyLkJpbmRQYWlyc1tpXTsNCisgICAgV3JpdGVOdW1iZXIoYmluZFBhaXIuSW5JbmRleCk7DQorICAgIFdyaXRlTnVtYmVyKGJpbmRQYWlyLk91dEluZGV4KTsNCisgIH0NCisgIGlmIChmb2xkZXIuUGFja1N0cmVhbXMuU2l6ZSgpID4gMSkNCisgICAgZm9yIChpID0gMDsgaSA8IGZvbGRlci5QYWNrU3RyZWFtcy5TaXplKCk7IGkrKykNCisgICAgew0KKyAgICAgIFdyaXRlTnVtYmVyKGZvbGRlci5QYWNrU3RyZWFtc1tpXSk7DQorICAgIH0NCit9DQorDQordm9pZCBDT3V0QXJjaGl2ZTo6V3JpdGVCb29sVmVjdG9yKGNvbnN0IENCb29sVmVjdG9yICZib29sVmVjdG9yKQ0KK3sNCisgIEJ5dGUgYiA9IDA7DQorICBCeXRlIG1hc2sgPSAweDgwOw0KKyAgRk9SX1ZFQ1RPUiAoaSwgYm9vbFZlY3RvcikNCisgIHsNCisgICAgaWYgKGJvb2xWZWN0b3JbaV0pDQorICAgICAgYiB8PSBtYXNrOw0KKyAgICBtYXNrID4+PSAxOw0KKyAgICBpZiAobWFzayA9PSAwKQ0KKyAgICB7DQorICAgICAgV3JpdGVCeXRlKGIpOw0KKyAgICAgIG1hc2sgPSAweDgwOw0KKyAgICAgIGIgPSAwOw0KKyAgICB9DQorICB9DQorICBpZiAobWFzayAhPSAweDgwKQ0KKyAgICBXcml0ZUJ5dGUoYik7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgQnZfR2V0U2l6ZUluQnl0ZXMoY29uc3QgQ0Jvb2xWZWN0b3IgJnYpIHsgcmV0dXJuICgodW5zaWduZWQpdi5TaXplKCkgKyA3KSAvIDg7IH0NCisNCit2b2lkIENPdXRBcmNoaXZlOjpXcml0ZVByb3BCb29sVmVjdG9yKEJ5dGUgaWQsIGNvbnN0IENCb29sVmVjdG9yICZib29sVmVjdG9yKQ0KK3sNCisgIFdyaXRlQnl0ZShpZCk7DQorICBXcml0ZU51bWJlcihCdl9HZXRTaXplSW5CeXRlcyhib29sVmVjdG9yKSk7DQorICBXcml0ZUJvb2xWZWN0b3IoYm9vbFZlY3Rvcik7DQorfQ0KKw0KK3ZvaWQgQ091dEFyY2hpdmU6OldyaXRlSGFzaERpZ2VzdHMoY29uc3QgQ1VJbnQzMkRlZlZlY3RvciAmZGlnZXN0cykNCit7DQorICB1bnNpZ25lZCBudW1EZWZpbmVkID0gMDsNCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgZGlnZXN0cy5EZWZzLlNpemUoKTsgaSsrKQ0KKyAgICBpZiAoZGlnZXN0cy5EZWZzW2ldKQ0KKyAgICAgIG51bURlZmluZWQrKzsNCisgIGlmIChudW1EZWZpbmVkID09IDApDQorICAgIHJldHVybjsNCisNCisgIFdyaXRlQnl0ZShOSUQ6OmtDUkMpOw0KKyAgaWYgKG51bURlZmluZWQgPT0gZGlnZXN0cy5EZWZzLlNpemUoKSkNCisgICAgV3JpdGVCeXRlKDEpOw0KKyAgZWxzZQ0KKyAgew0KKyAgICBXcml0ZUJ5dGUoMCk7DQorICAgIFdyaXRlQm9vbFZlY3RvcihkaWdlc3RzLkRlZnMpOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IGRpZ2VzdHMuRGVmcy5TaXplKCk7IGkrKykNCisgICAgaWYgKGRpZ2VzdHMuRGVmc1tpXSkNCisgICAgICBXcml0ZVVJbnQzMihkaWdlc3RzLlZhbHNbaV0pOw0KK30NCisNCit2b2lkIENPdXRBcmNoaXZlOjpXcml0ZVBhY2tJbmZvKA0KKyAgICBVSW50NjQgZGF0YU9mZnNldCwNCisgICAgY29uc3QgQ1JlY29yZFZlY3RvcjxVSW50NjQ+ICZwYWNrU2l6ZXMsDQorICAgIGNvbnN0IENVSW50MzJEZWZWZWN0b3IgJnBhY2tDUkNzKQ0KK3sNCisgIGlmIChwYWNrU2l6ZXMuSXNFbXB0eSgpKQ0KKyAgICByZXR1cm47DQorICBXcml0ZUJ5dGUoTklEOjprUGFja0luZm8pOw0KKyAgV3JpdGVOdW1iZXIoZGF0YU9mZnNldCk7DQorICBXcml0ZU51bWJlcihwYWNrU2l6ZXMuU2l6ZSgpKTsNCisgIFdyaXRlQnl0ZShOSUQ6OmtTaXplKTsNCisgIEZPUl9WRUNUT1IgKGksIHBhY2tTaXplcykNCisgICAgV3JpdGVOdW1iZXIocGFja1NpemVzW2ldKTsNCisNCisgIFdyaXRlSGFzaERpZ2VzdHMocGFja0NSQ3MpOw0KKyAgDQorICBXcml0ZUJ5dGUoTklEOjprRW5kKTsNCit9DQorDQordm9pZCBDT3V0QXJjaGl2ZTo6V3JpdGVVbnBhY2tJbmZvKGNvbnN0IENPYmplY3RWZWN0b3I8Q0ZvbGRlcj4gJmZvbGRlcnMsIGNvbnN0IENPdXRGb2xkZXJzICZvdXRGb2xkZXJzKQ0KK3sNCisgIGlmIChmb2xkZXJzLklzRW1wdHkoKSkNCisgICAgcmV0dXJuOw0KKw0KKyAgV3JpdGVCeXRlKE5JRDo6a1VucGFja0luZm8pOw0KKw0KKyAgV3JpdGVCeXRlKE5JRDo6a0ZvbGRlcik7DQorICBXcml0ZU51bWJlcihmb2xkZXJzLlNpemUoKSk7DQorICB7DQorICAgIFdyaXRlQnl0ZSgwKTsNCisgICAgRk9SX1ZFQ1RPUiAoaSwgZm9sZGVycykNCisgICAgICBXcml0ZUZvbGRlcihmb2xkZXJzW2ldKTsNCisgIH0NCisgIA0KKyAgV3JpdGVCeXRlKE5JRDo6a0NvZGVyc1VucGFja1NpemUpOw0KKyAgRk9SX1ZFQ1RPUiAoaSwgb3V0Rm9sZGVycy5Db2RlclVucGFja1NpemVzKQ0KKyAgICBXcml0ZU51bWJlcihvdXRGb2xkZXJzLkNvZGVyVW5wYWNrU2l6ZXNbaV0pOw0KKyAgDQorICBXcml0ZUhhc2hEaWdlc3RzKG91dEZvbGRlcnMuRm9sZGVyVW5wYWNrQ1JDcyk7DQorICANCisgIFdyaXRlQnl0ZShOSUQ6OmtFbmQpOw0KK30NCisNCit2b2lkIENPdXRBcmNoaXZlOjpXcml0ZVN1YlN0cmVhbXNJbmZvKGNvbnN0IENPYmplY3RWZWN0b3I8Q0ZvbGRlcj4gJmZvbGRlcnMsDQorICAgIGNvbnN0IENPdXRGb2xkZXJzICZvdXRGb2xkZXJzLA0KKyAgICBjb25zdCBDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gJnVucGFja1NpemVzLA0KKyAgICBjb25zdCBDVUludDMyRGVmVmVjdG9yICZkaWdlc3RzKQ0KK3sNCisgIGNvbnN0IENSZWNvcmRWZWN0b3I8Q051bT4gJm51bVVucGFja1N0cmVhbXNJbkZvbGRlcnMgPSBvdXRGb2xkZXJzLk51bVVucGFja1N0cmVhbXNWZWN0b3I7DQorICBXcml0ZUJ5dGUoTklEOjprU3ViU3RyZWFtc0luZm8pOw0KKw0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBudW1VbnBhY2tTdHJlYW1zSW5Gb2xkZXJzLlNpemUoKTsgaSsrKQ0KKyAgICBpZiAobnVtVW5wYWNrU3RyZWFtc0luRm9sZGVyc1tpXSAhPSAxKQ0KKyAgICB7DQorICAgICAgV3JpdGVCeXRlKE5JRDo6a051bVVucGFja1N0cmVhbSk7DQorICAgICAgZm9yIChpID0gMDsgaSA8IG51bVVucGFja1N0cmVhbXNJbkZvbGRlcnMuU2l6ZSgpOyBpKyspDQorICAgICAgICBXcml0ZU51bWJlcihudW1VbnBhY2tTdHJlYW1zSW5Gb2xkZXJzW2ldKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyANCisgIGZvciAoaSA9IDA7IGkgPCBudW1VbnBhY2tTdHJlYW1zSW5Gb2xkZXJzLlNpemUoKTsgaSsrKQ0KKyAgICBpZiAobnVtVW5wYWNrU3RyZWFtc0luRm9sZGVyc1tpXSA+IDEpDQorICAgIHsNCisgICAgICBXcml0ZUJ5dGUoTklEOjprU2l6ZSk7DQorICAgICAgQ051bSBpbmRleCA9IDA7DQorICAgICAgZm9yIChpID0gMDsgaSA8IG51bVVucGFja1N0cmVhbXNJbkZvbGRlcnMuU2l6ZSgpOyBpKyspDQorICAgICAgew0KKyAgICAgICAgQ051bSBudW0gPSBudW1VbnBhY2tTdHJlYW1zSW5Gb2xkZXJzW2ldOw0KKyAgICAgICAgZm9yIChDTnVtIGogPSAwOyBqIDwgbnVtOyBqKyspDQorICAgICAgICB7DQorICAgICAgICAgIGlmIChqICsgMSAhPSBudW0pDQorICAgICAgICAgICAgV3JpdGVOdW1iZXIodW5wYWNrU2l6ZXNbaW5kZXhdKTsNCisgICAgICAgICAgaW5kZXgrKzsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisNCisgIENVSW50MzJEZWZWZWN0b3IgZGlnZXN0czI7DQorDQorICB1bnNpZ25lZCBkaWdlc3RJbmRleCA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgZm9sZGVycy5TaXplKCk7IGkrKykNCisgIHsNCisgICAgdW5zaWduZWQgbnVtU3ViU3RyZWFtcyA9ICh1bnNpZ25lZCludW1VbnBhY2tTdHJlYW1zSW5Gb2xkZXJzW2ldOw0KKyAgICBpZiAobnVtU3ViU3RyZWFtcyA9PSAxICYmIG91dEZvbGRlcnMuRm9sZGVyVW5wYWNrQ1JDcy5WYWxpZEFuZERlZmluZWQoaSkpDQorICAgICAgZGlnZXN0SW5kZXgrKzsNCisgICAgZWxzZQ0KKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBudW1TdWJTdHJlYW1zOyBqKyssIGRpZ2VzdEluZGV4KyspDQorICAgICAgew0KKyAgICAgICAgZGlnZXN0czIuRGVmcy5BZGQoZGlnZXN0cy5EZWZzW2RpZ2VzdEluZGV4XSk7DQorICAgICAgICBkaWdlc3RzMi5WYWxzLkFkZChkaWdlc3RzLlZhbHNbZGlnZXN0SW5kZXhdKTsNCisgICAgICB9DQorICB9DQorICBXcml0ZUhhc2hEaWdlc3RzKGRpZ2VzdHMyKTsNCisgIFdyaXRlQnl0ZShOSUQ6OmtFbmQpOw0KK30NCisNCisvLyA3LVppcCA0LjUwIC0gNC41OCBjb250YWluIEJVRywgc28gdGhleSBkbyBub3Qgc3VwcG9ydCAuN3ogYXJjaGl2ZXMgd2l0aCBVbmtub3duIGZpZWxkLg0KKw0KK3ZvaWQgQ091dEFyY2hpdmU6OlNraXBBbGlnbih1bnNpZ25lZCBwb3MsIHVuc2lnbmVkIGFsaWduU2l6ZSkNCit7DQorICBpZiAoIV91c2VBbGlnbikNCisgICAgcmV0dXJuOw0KKyAgcG9zICs9ICh1bnNpZ25lZClHZXRQb3MoKTsNCisgIHBvcyAmPSAoYWxpZ25TaXplIC0gMSk7DQorICBpZiAocG9zID09IDApDQorICAgIHJldHVybjsNCisgIHVuc2lnbmVkIHNraXAgPSBhbGlnblNpemUgLSBwb3M7DQorICBpZiAoc2tpcCA8IDIpDQorICAgIHNraXAgKz0gYWxpZ25TaXplOw0KKyAgc2tpcCAtPSAyOw0KKyAgV3JpdGVCeXRlKE5JRDo6a0R1bW15KTsNCisgIFdyaXRlQnl0ZSgoQnl0ZSlza2lwKTsNCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBza2lwOyBpKyspDQorICAgIFdyaXRlQnl0ZSgwKTsNCit9DQorDQordm9pZCBDT3V0QXJjaGl2ZTo6V3JpdGVBbGlnbmVkQm9vbEhlYWRlcihjb25zdCBDQm9vbFZlY3RvciAmdiwgdW5zaWduZWQgbnVtRGVmaW5lZCwgQnl0ZSB0eXBlLCB1bnNpZ25lZCBpdGVtU2l6ZSkNCit7DQorICBjb25zdCB1bnNpZ25lZCBidlNpemUgPSAobnVtRGVmaW5lZCA9PSB2LlNpemUoKSkgPyAwIDogQnZfR2V0U2l6ZUluQnl0ZXModik7DQorICBjb25zdCBVSW50NjQgZGF0YVNpemUgPSAoVUludDY0KW51bURlZmluZWQgKiBpdGVtU2l6ZSArIGJ2U2l6ZSArIDI7DQorICBTa2lwQWxpZ24oMyArICh1bnNpZ25lZClidlNpemUgKyAodW5zaWduZWQpR2V0QmlnTnVtYmVyU2l6ZShkYXRhU2l6ZSksIGl0ZW1TaXplKTsNCisNCisgIFdyaXRlQnl0ZSh0eXBlKTsNCisgIFdyaXRlTnVtYmVyKGRhdGFTaXplKTsNCisgIGlmIChudW1EZWZpbmVkID09IHYuU2l6ZSgpKQ0KKyAgICBXcml0ZUJ5dGUoMSk7DQorICBlbHNlDQorICB7DQorICAgIFdyaXRlQnl0ZSgwKTsNCisgICAgV3JpdGVCb29sVmVjdG9yKHYpOw0KKyAgfQ0KKyAgV3JpdGVCeXRlKDApOw0KK30NCisNCit2b2lkIENPdXRBcmNoaXZlOjpXcml0ZVVJbnQ2NERlZlZlY3Rvcihjb25zdCBDVUludDY0RGVmVmVjdG9yICZ2LCBCeXRlIHR5cGUpDQorew0KKyAgdW5zaWduZWQgbnVtRGVmaW5lZCA9IDA7DQorDQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHYuRGVmcy5TaXplKCk7IGkrKykNCisgICAgaWYgKHYuRGVmc1tpXSkNCisgICAgICBudW1EZWZpbmVkKys7DQorDQorICBpZiAobnVtRGVmaW5lZCA9PSAwKQ0KKyAgICByZXR1cm47DQorDQorICBXcml0ZUFsaWduZWRCb29sSGVhZGVyKHYuRGVmcywgbnVtRGVmaW5lZCwgdHlwZSwgOCk7DQorICANCisgIGZvciAoaSA9IDA7IGkgPCB2LkRlZnMuU2l6ZSgpOyBpKyspDQorICAgIGlmICh2LkRlZnNbaV0pDQorICAgICAgV3JpdGVVSW50NjQodi5WYWxzW2ldKTsNCit9DQorDQorSFJFU1VMVCBDT3V0QXJjaGl2ZTo6RW5jb2RlU3RyZWFtKA0KKyAgICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICBDRW5jb2RlciAmZW5jb2RlciwgY29uc3QgQ0J5dGVCdWZmZXIgJmRhdGEsDQorICAgIENSZWNvcmRWZWN0b3I8VUludDY0PiAmcGFja1NpemVzLCBDT2JqZWN0VmVjdG9yPENGb2xkZXI+ICZmb2xkZXJzLCBDT3V0Rm9sZGVycyAmb3V0Rm9sZGVycykNCit7DQorICBDQnVmSW5TdHJlYW0gKnN0cmVhbVNwZWMgPSBuZXcgQ0J1ZkluU3RyZWFtOw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IHN0cmVhbSA9IHN0cmVhbVNwZWM7DQorICBzdHJlYW1TcGVjLT5Jbml0KGRhdGEsIGRhdGEuU2l6ZSgpKTsNCisgIG91dEZvbGRlcnMuRm9sZGVyVW5wYWNrQ1JDcy5EZWZzLkFkZCh0cnVlKTsNCisgIG91dEZvbGRlcnMuRm9sZGVyVW5wYWNrQ1JDcy5WYWxzLkFkZChDcmNDYWxjKGRhdGEsIGRhdGEuU2l6ZSgpKSk7DQorICAvLyBvdXRGb2xkZXJzLk51bVVucGFja1N0cmVhbXNWZWN0b3IuQWRkKDEpOw0KKyAgVUludDY0IGRhdGFTaXplNjQgPSBkYXRhLlNpemUoKTsNCisgIFVJbnQ2NCB1bnBhY2tTaXplOw0KKyAgUklOT0soZW5jb2Rlci5FbmNvZGUoDQorICAgICAgRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgICAgc3RyZWFtLCBOVUxMLCAmZGF0YVNpemU2NCwgZm9sZGVycy5BZGROZXcoKSwgb3V0Rm9sZGVycy5Db2RlclVucGFja1NpemVzLCB1bnBhY2tTaXplLCBTZXFTdHJlYW0sIHBhY2tTaXplcywgTlVMTCkpDQorICByZXR1cm4gU19PSzsNCit9DQorDQordm9pZCBDT3V0QXJjaGl2ZTo6V3JpdGVIZWFkZXIoDQorICAgIGNvbnN0IENBcmNoaXZlRGF0YWJhc2VPdXQgJmRiLA0KKyAgICAvLyBjb25zdCBDSGVhZGVyT3B0aW9ucyAmaGVhZGVyT3B0aW9ucywNCisgICAgVUludDY0ICZoZWFkZXJPZmZzZXQpDQorew0KKyAgLyoNCisgIGJvb2wgdGhlcmVJc1NlY3VyZSA9IChkYi5TZWN1cmVCdWYuU2l6ZSgpICE9IDApOw0KKyAgKi8NCisgIF91c2VBbGlnbiA9IHRydWU7DQorDQorICB1bnNpZ25lZCBpOw0KKyAgDQorICBVSW50NjQgcGFja2VkU2l6ZSA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgZGIuUGFja1NpemVzLlNpemUoKTsgaSsrKQ0KKyAgICBwYWNrZWRTaXplICs9IGRiLlBhY2tTaXplc1tpXTsNCisNCisgIGhlYWRlck9mZnNldCA9IHBhY2tlZFNpemU7DQorDQorICBXcml0ZUJ5dGUoTklEOjprSGVhZGVyKTsNCisNCisgIC8vIEFyY2hpdmUgUHJvcGVydGllcw0KKw0KKyAgaWYgKGRiLkZvbGRlcnMuU2l6ZSgpID4gMCkNCisgIHsNCisgICAgV3JpdGVCeXRlKE5JRDo6a01haW5TdHJlYW1zSW5mbyk7DQorICAgIFdyaXRlUGFja0luZm8oMCwgZGIuUGFja1NpemVzLCBkYi5QYWNrQ1JDcyk7DQorICAgIFdyaXRlVW5wYWNrSW5mbyhkYi5Gb2xkZXJzLCAoY29uc3QgQ091dEZvbGRlcnMgJilkYik7DQorDQorICAgIENSZWNvcmRWZWN0b3I8VUludDY0PiB1bnBhY2tTaXplczsNCisgICAgQ1VJbnQzMkRlZlZlY3RvciBkaWdlc3RzOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZGIuRmlsZXMuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBjb25zdCBDRmlsZUl0ZW0gJmZpbGUgPSBkYi5GaWxlc1tpXTsNCisgICAgICBpZiAoIWZpbGUuSGFzU3RyZWFtKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgdW5wYWNrU2l6ZXMuQWRkKGZpbGUuU2l6ZSk7DQorICAgICAgZGlnZXN0cy5EZWZzLkFkZChmaWxlLkNyY0RlZmluZWQpOw0KKyAgICAgIGRpZ2VzdHMuVmFscy5BZGQoZmlsZS5DcmMpOw0KKyAgICB9DQorDQorICAgIFdyaXRlU3ViU3RyZWFtc0luZm8oZGIuRm9sZGVycywgKGNvbnN0IENPdXRGb2xkZXJzICYpZGIsIHVucGFja1NpemVzLCBkaWdlc3RzKTsNCisgICAgV3JpdGVCeXRlKE5JRDo6a0VuZCk7DQorICB9DQorDQorICBpZiAoZGIuRmlsZXMuSXNFbXB0eSgpKQ0KKyAgew0KKyAgICBXcml0ZUJ5dGUoTklEOjprRW5kKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKw0KKyAgV3JpdGVCeXRlKE5JRDo6a0ZpbGVzSW5mbyk7DQorICBXcml0ZU51bWJlcihkYi5GaWxlcy5TaXplKCkpOw0KKw0KKyAgew0KKyAgICAvKiAtLS0tLS0tLS0tIEVtcHR5IFN0cmVhbXMgLS0tLS0tLS0tLSAqLw0KKyAgICBDQm9vbFZlY3RvciBlbXB0eVN0cmVhbVZlY3RvcjsNCisgICAgZW1wdHlTdHJlYW1WZWN0b3IuQ2xlYXJBbmRTZXRTaXplKGRiLkZpbGVzLlNpemUoKSk7DQorICAgIHVuc2lnbmVkIG51bUVtcHR5U3RyZWFtcyA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPCBkYi5GaWxlcy5TaXplKCk7IGkrKykNCisgICAgICBpZiAoZGIuRmlsZXNbaV0uSGFzU3RyZWFtKQ0KKyAgICAgICAgZW1wdHlTdHJlYW1WZWN0b3JbaV0gPSBmYWxzZTsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgZW1wdHlTdHJlYW1WZWN0b3JbaV0gPSB0cnVlOw0KKyAgICAgICAgbnVtRW1wdHlTdHJlYW1zKys7DQorICAgICAgfQ0KKyAgICBpZiAobnVtRW1wdHlTdHJlYW1zICE9IDApDQorICAgIHsNCisgICAgICBXcml0ZVByb3BCb29sVmVjdG9yKE5JRDo6a0VtcHR5U3RyZWFtLCBlbXB0eVN0cmVhbVZlY3Rvcik7DQorICAgICAgDQorICAgICAgQ0Jvb2xWZWN0b3IgZW1wdHlGaWxlVmVjdG9yLCBhbnRpVmVjdG9yOw0KKyAgICAgIGVtcHR5RmlsZVZlY3Rvci5DbGVhckFuZFNldFNpemUobnVtRW1wdHlTdHJlYW1zKTsNCisgICAgICBhbnRpVmVjdG9yLkNsZWFyQW5kU2V0U2l6ZShudW1FbXB0eVN0cmVhbXMpOw0KKyAgICAgIGJvb2wgdGhlcmVBcmVFbXB0eUZpbGVzID0gZmFsc2UsIHRoZXJlQXJlQW50aUl0ZW1zID0gZmFsc2U7DQorICAgICAgdW5zaWduZWQgY3VyID0gMDsNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZGIuRmlsZXMuU2l6ZSgpOyBpKyspDQorICAgICAgew0KKyAgICAgICAgY29uc3QgQ0ZpbGVJdGVtICZmaWxlID0gZGIuRmlsZXNbaV07DQorICAgICAgICBpZiAoZmlsZS5IYXNTdHJlYW0pDQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgZW1wdHlGaWxlVmVjdG9yW2N1cl0gPSAhZmlsZS5Jc0RpcjsNCisgICAgICAgIGlmICghZmlsZS5Jc0RpcikNCisgICAgICAgICAgdGhlcmVBcmVFbXB0eUZpbGVzID0gdHJ1ZTsNCisgICAgICAgIGJvb2wgaXNBbnRpID0gZGIuSXNJdGVtQW50aShpKTsNCisgICAgICAgIGFudGlWZWN0b3JbY3VyXSA9IGlzQW50aTsNCisgICAgICAgIGlmIChpc0FudGkpDQorICAgICAgICAgIHRoZXJlQXJlQW50aUl0ZW1zID0gdHJ1ZTsNCisgICAgICAgIGN1cisrOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBpZiAodGhlcmVBcmVFbXB0eUZpbGVzKQ0KKyAgICAgICAgV3JpdGVQcm9wQm9vbFZlY3RvcihOSUQ6OmtFbXB0eUZpbGUsIGVtcHR5RmlsZVZlY3Rvcik7DQorICAgICAgaWYgKHRoZXJlQXJlQW50aUl0ZW1zKQ0KKyAgICAgICAgV3JpdGVQcm9wQm9vbFZlY3RvcihOSUQ6OmtBbnRpLCBhbnRpVmVjdG9yKTsNCisgICAgfQ0KKyAgfQ0KKw0KKw0KKyAgew0KKyAgICAvKiAtLS0tLS0tLS0tIE5hbWVzIC0tLS0tLS0tLS0gKi8NCisgICAgDQorICAgIHVuc2lnbmVkIG51bURlZmluZWQgPSAwOw0KKyAgICBzaXplX3QgbmFtZXNEYXRhU2l6ZSA9IDA7DQorICAgIEZPUl9WRUNUT1IgKGksIGRiLkZpbGVzKQ0KKyAgICB7DQorICAgICAgY29uc3QgVVN0cmluZyAmbmFtZSA9IGRiLk5hbWVzW2ldOw0KKyAgICAgIGlmICghbmFtZS5Jc0VtcHR5KCkpDQorICAgICAgICBudW1EZWZpbmVkKys7DQorICAgICAgbmFtZXNEYXRhU2l6ZSArPSAobmFtZS5MZW4oKSArIDEpICogMjsNCisgICAgfQ0KKyAgICANCisgICAgaWYgKG51bURlZmluZWQgPiAwKQ0KKyAgICB7DQorICAgICAgbmFtZXNEYXRhU2l6ZSsrOw0KKyAgICAgIFNraXBBbGlnbigyICsgR2V0QmlnTnVtYmVyU2l6ZShuYW1lc0RhdGFTaXplKSwgMTYpOw0KKw0KKyAgICAgIFdyaXRlQnl0ZShOSUQ6OmtOYW1lKTsNCisgICAgICBXcml0ZU51bWJlcihuYW1lc0RhdGFTaXplKTsNCisgICAgICBXcml0ZUJ5dGUoMCk7DQorICAgICAgRk9SX1ZFQ1RPUiAoaSwgZGIuRmlsZXMpDQorICAgICAgew0KKyAgICAgICAgY29uc3QgVVN0cmluZyAmbmFtZSA9IGRiLk5hbWVzW2ldOw0KKyAgICAgICAgZm9yICh1bnNpZ25lZCB0ID0gMDsgdCA8PSBuYW1lLkxlbigpOyB0KyspDQorICAgICAgICB7DQorICAgICAgICAgIHdjaGFyX3QgYyA9IG5hbWVbdF07DQorICAgICAgICAgIFdyaXRlQnl0ZSgoQnl0ZSljKTsNCisgICAgICAgICAgV3JpdGVCeXRlKChCeXRlKShjID4+IDgpKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIC8qIGlmIChoZWFkZXJPcHRpb25zLldyaXRlQ1RpbWUpICovIFdyaXRlVUludDY0RGVmVmVjdG9yKGRiLkNUaW1lLCBOSUQ6OmtDVGltZSk7DQorICAvKiBpZiAoaGVhZGVyT3B0aW9ucy5Xcml0ZUFUaW1lKSAqLyBXcml0ZVVJbnQ2NERlZlZlY3RvcihkYi5BVGltZSwgTklEOjprQVRpbWUpOw0KKyAgLyogaWYgKGhlYWRlck9wdGlvbnMuV3JpdGVNVGltZSkgKi8gV3JpdGVVSW50NjREZWZWZWN0b3IoZGIuTVRpbWUsIE5JRDo6a01UaW1lKTsNCisgIFdyaXRlVUludDY0RGVmVmVjdG9yKGRiLlN0YXJ0UG9zLCBOSUQ6OmtTdGFydFBvcyk7DQorICANCisgIHsNCisgICAgLyogLS0tLS0tLS0tLSBXcml0ZSBBdHRyaWIgLS0tLS0tLS0tLSAqLw0KKyAgICBDQm9vbFZlY3RvciBib29sVmVjdG9yOw0KKyAgICBib29sVmVjdG9yLkNsZWFyQW5kU2V0U2l6ZShkYi5GaWxlcy5TaXplKCkpOw0KKyAgICB1bnNpZ25lZCBudW1EZWZpbmVkID0gMDsNCisgICAgZm9yIChpID0gMDsgaSA8IGRiLkZpbGVzLlNpemUoKTsgaSsrKQ0KKyAgICB7DQorICAgICAgYm9vbCBkZWZpbmVkID0gZGIuRmlsZXNbaV0uQXR0cmliRGVmaW5lZDsNCisgICAgICBib29sVmVjdG9yW2ldID0gZGVmaW5lZDsNCisgICAgICBpZiAoZGVmaW5lZCkNCisgICAgICAgIG51bURlZmluZWQrKzsNCisgICAgfQ0KKyAgICBpZiAobnVtRGVmaW5lZCAhPSAwKQ0KKyAgICB7DQorICAgICAgV3JpdGVBbGlnbmVkQm9vbEhlYWRlcihib29sVmVjdG9yLCBudW1EZWZpbmVkLCBOSUQ6OmtXaW5BdHRyaWIsIDQpOw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBkYi5GaWxlcy5TaXplKCk7IGkrKykNCisgICAgICB7DQorICAgICAgICBjb25zdCBDRmlsZUl0ZW0gJmZpbGUgPSBkYi5GaWxlc1tpXTsNCisgICAgICAgIGlmIChmaWxlLkF0dHJpYkRlZmluZWQpDQorICAgICAgICAgIFdyaXRlVUludDMyKGZpbGUuQXR0cmliKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIC8qDQorICB7DQorICAgIC8vIC0tLS0tLS0tLS0gV3JpdGUgSXNBdXggLS0tLS0tLS0tLQ0KKyAgICB1bnNpZ25lZCBudW1BdXggPSAwOw0KKyAgICBjb25zdCBDQm9vbFZlY3RvciAmaXNBdXggPSBkYi5Jc0F1eDsNCisgICAgZm9yIChpID0gMDsgaSA8IGlzQXV4LlNpemUoKTsgaSsrKQ0KKyAgICAgIGlmIChpc0F1eFtpXSkNCisgICAgICAgIG51bUF1eCsrOw0KKyAgICBpZiAobnVtQXV4ID4gMCkNCisgICAgew0KKyAgICAgIGNvbnN0IHVuc2lnbmVkIGJ2U2l6ZSA9IEJ2X0dldFNpemVJbkJ5dGVzKGlzQXV4KTsNCisgICAgICBXcml0ZUJ5dGUoTklEOjprSXNBdXgpOw0KKyAgICAgIFdyaXRlTnVtYmVyKGJ2U2l6ZSk7DQorICAgICAgV3JpdGVCb29sVmVjdG9yKGlzQXV4KTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgew0KKyAgICAvLyAtLS0tLS0tLS0tIFdyaXRlIFBhcmVudCAtLS0tLS0tLS0tDQorICAgIENCb29sVmVjdG9yIGJvb2xWZWN0b3I7DQorICAgIGJvb2xWZWN0b3IuUmVzZXJ2ZShkYi5GaWxlcy5TaXplKCkpOw0KKyAgICB1bnNpZ25lZCBudW1Jc0RpciA9IDA7DQorICAgIHVuc2lnbmVkIG51bVBhcmVudExpbmtzID0gMDsNCisgICAgZm9yIChpID0gMDsgaSA8IGRiLkZpbGVzLlNpemUoKTsgaSsrKQ0KKyAgICB7DQorICAgICAgY29uc3QgQ0ZpbGVJdGVtICZmaWxlID0gZGIuRmlsZXNbaV07DQorICAgICAgYm9vbCBkZWZpbmVkID0gIWZpbGUuSXNBbHRTdHJlYW07DQorICAgICAgYm9vbFZlY3Rvci5BZGQoZGVmaW5lZCk7DQorICAgICAgaWYgKGRlZmluZWQpDQorICAgICAgICBudW1Jc0RpcisrOw0KKyAgICAgIGlmIChmaWxlLlBhcmVudCA+PSAwKQ0KKyAgICAgICAgbnVtUGFyZW50TGlua3MrKzsNCisgICAgfQ0KKyAgICBpZiAobnVtUGFyZW50TGlua3MgPiAwKQ0KKyAgICB7DQorICAgICAgLy8gV3JpdGVBbGlnbmVkQm9vbEhlYWRlcihib29sVmVjdG9yLCBudW1EZWZpbmVkLCBOSUQ6OmtQYXJlbnQsIDQpOw0KKyAgICAgIGNvbnN0IHVuc2lnbmVkIGJ2U2l6ZSA9IChudW1Jc0RpciA9PSBib29sVmVjdG9yLlNpemUoKSkgPyAwIDogQnZfR2V0U2l6ZUluQnl0ZXMoYm9vbFZlY3Rvcik7DQorICAgICAgY29uc3QgVUludDY0IGRhdGFTaXplID0gKFVJbnQ2NClkYi5GaWxlcy5TaXplKCkgKiA0ICsgYnZTaXplICsgMTsNCisgICAgICBTa2lwQWxpZ24oMiArICh1bnNpZ25lZClidlNpemUgKyAodW5zaWduZWQpR2V0QmlnTnVtYmVyU2l6ZShkYXRhU2l6ZSksIDQpOw0KKyAgICAgIA0KKyAgICAgIFdyaXRlQnl0ZShOSUQ6OmtQYXJlbnQpOw0KKyAgICAgIFdyaXRlTnVtYmVyKGRhdGFTaXplKTsNCisgICAgICBpZiAobnVtSXNEaXIgPT0gYm9vbFZlY3Rvci5TaXplKCkpDQorICAgICAgICBXcml0ZUJ5dGUoMSk7DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIFdyaXRlQnl0ZSgwKTsNCisgICAgICAgIFdyaXRlQm9vbFZlY3Rvcihib29sVmVjdG9yKTsNCisgICAgICB9DQorICAgICAgZm9yIChpID0gMDsgaSA8IGRiLkZpbGVzLlNpemUoKTsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgIGNvbnN0IENGaWxlSXRlbSAmZmlsZSA9IGRiLkZpbGVzW2ldOw0KKyAgICAgICAgLy8gaWYgKGZpbGUuUGFyZW50ID49IDApDQorICAgICAgICAgIFdyaXRlVUludDMyKGZpbGUuUGFyZW50KTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIGlmICh0aGVyZUlzU2VjdXJlKQ0KKyAgew0KKyAgICBVSW50NjQgc2VjdXJlRGF0YVNpemUgPSAxICsgNCArDQorICAgICAgIGRiLlNlY3VyZUJ1Zi5TaXplKCkgKw0KKyAgICAgICBkYi5TZWN1cmVTaXplcy5TaXplKCkgKiA0Ow0KKyAgICAvLyBzZWN1cmVEYXRhU2l6ZSArPSBkYi5TZWN1cmVJRHMuU2l6ZSgpICogNDsNCisgICAgZm9yIChpID0gMDsgaSA8IGRiLlNlY3VyZUlEcy5TaXplKCk7IGkrKykNCisgICAgICBzZWN1cmVEYXRhU2l6ZSArPSBHZXRCaWdOdW1iZXJTaXplKGRiLlNlY3VyZUlEc1tpXSk7DQorICAgIFNraXBBbGlnbigyICsgR2V0QmlnTnVtYmVyU2l6ZShzZWN1cmVEYXRhU2l6ZSksIDQpOw0KKyAgICBXcml0ZUJ5dGUoTklEOjprTnRTZWN1cmUpOw0KKyAgICBXcml0ZU51bWJlcihzZWN1cmVEYXRhU2l6ZSk7DQorICAgIFdyaXRlQnl0ZSgwKTsNCisgICAgV3JpdGVVSW50MzIoZGIuU2VjdXJlU2l6ZXMuU2l6ZSgpKTsNCisgICAgZm9yIChpID0gMDsgaSA8IGRiLlNlY3VyZVNpemVzLlNpemUoKTsgaSsrKQ0KKyAgICAgIFdyaXRlVUludDMyKGRiLlNlY3VyZVNpemVzW2ldKTsNCisgICAgV3JpdGVCeXRlcyhkYi5TZWN1cmVCdWYsIGRiLlNlY3VyZUJ1Zi5TaXplKCkpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZGIuU2VjdXJlSURzLlNpemUoKTsgaSsrKQ0KKyAgICB7DQorICAgICAgV3JpdGVOdW1iZXIoZGIuU2VjdXJlSURzW2ldKTsNCisgICAgICAvLyBXcml0ZVVJbnQzMihkYi5TZWN1cmVJRHNbaV0pOw0KKyAgICB9DQorICB9DQorICAqLw0KKw0KKyAgV3JpdGVCeXRlKE5JRDo6a0VuZCk7IC8vIGZvciBmaWxlcw0KKyAgV3JpdGVCeXRlKE5JRDo6a0VuZCk7IC8vIGZvciBoZWFkZXJzDQorfQ0KKw0KK0hSRVNVTFQgQ091dEFyY2hpdmU6OldyaXRlRGF0YWJhc2UoDQorICAgIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgIGNvbnN0IENBcmNoaXZlRGF0YWJhc2VPdXQgJmRiLA0KKyAgICBjb25zdCBDQ29tcHJlc3Npb25NZXRob2RNb2RlICpvcHRpb25zLA0KKyAgICBjb25zdCBDSGVhZGVyT3B0aW9ucyAmaGVhZGVyT3B0aW9ucykNCit7DQorICBpZiAoIWRiLkNoZWNrTnVtRmlsZXMoKSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisNCisgIFVJbnQ2NCBoZWFkZXJPZmZzZXQ7DQorICBVSW50MzIgaGVhZGVyQ1JDOw0KKyAgVUludDY0IGhlYWRlclNpemU7DQorICBpZiAoZGIuSXNFbXB0eSgpKQ0KKyAgew0KKyAgICBoZWFkZXJTaXplID0gMDsNCisgICAgaGVhZGVyT2Zmc2V0ID0gMDsNCisgICAgaGVhZGVyQ1JDID0gQ3JjQ2FsYygwLCAwKTsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgYm9vbCBlbmNvZGVIZWFkZXJzID0gZmFsc2U7DQorICAgIGlmIChvcHRpb25zICE9IDApDQorICAgICAgaWYgKG9wdGlvbnMtPklzRW1wdHkoKSkNCisgICAgICAgIG9wdGlvbnMgPSAwOw0KKyAgICBpZiAob3B0aW9ucyAhPSAwKQ0KKyAgICAgIGlmIChvcHRpb25zLT5QYXNzd29yZElzRGVmaW5lZCB8fCBoZWFkZXJPcHRpb25zLkNvbXByZXNzTWFpbkhlYWRlcikNCisgICAgICAgIGVuY29kZUhlYWRlcnMgPSB0cnVlOw0KKw0KKyAgICBfb3V0Qnl0ZS5TZXRTdHJlYW0oU2VxU3RyZWFtKTsNCisgICAgX291dEJ5dGUuSW5pdCgpOw0KKyAgICBfY3JjID0gQ1JDX0lOSVRfVkFMOw0KKyAgICBfY291bnRNb2RlID0gZW5jb2RlSGVhZGVyczsNCisgICAgX3dyaXRlVG9TdHJlYW0gPSB0cnVlOw0KKyAgICBfY291bnRTaXplID0gMDsNCisgICAgV3JpdGVIZWFkZXIoZGIsIC8qIGhlYWRlck9wdGlvbnMsICovIGhlYWRlck9mZnNldCk7DQorDQorICAgIGlmIChlbmNvZGVIZWFkZXJzKQ0KKyAgICB7DQorICAgICAgQ0J5dGVCdWZmZXIgYnVmKF9jb3VudFNpemUpOw0KKyAgICAgIF9vdXRCeXRlMi5Jbml0KChCeXRlICopYnVmLCBfY291bnRTaXplKTsNCisgICAgICANCisgICAgICBfY291bnRNb2RlID0gZmFsc2U7DQorICAgICAgX3dyaXRlVG9TdHJlYW0gPSBmYWxzZTsNCisgICAgICBXcml0ZUhlYWRlcihkYiwgLyogaGVhZGVyT3B0aW9ucywgKi8gaGVhZGVyT2Zmc2V0KTsNCisgICAgICANCisgICAgICBpZiAoX2NvdW50U2l6ZSAhPSBfb3V0Qnl0ZTIuR2V0UG9zKCkpDQorICAgICAgICByZXR1cm4gRV9GQUlMOw0KKw0KKyAgICAgIENDb21wcmVzc2lvbk1ldGhvZE1vZGUgZW5jcnlwdE9wdGlvbnM7DQorICAgICAgZW5jcnlwdE9wdGlvbnMuUGFzc3dvcmRJc0RlZmluZWQgPSBvcHRpb25zLT5QYXNzd29yZElzRGVmaW5lZDsNCisgICAgICBlbmNyeXB0T3B0aW9ucy5QYXNzd29yZCA9IG9wdGlvbnMtPlBhc3N3b3JkOw0KKyAgICAgIENFbmNvZGVyIGVuY29kZXIoaGVhZGVyT3B0aW9ucy5Db21wcmVzc01haW5IZWFkZXIgPyAqb3B0aW9ucyA6IGVuY3J5cHRPcHRpb25zKTsNCisgICAgICBDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gcGFja1NpemVzOw0KKyAgICAgIENPYmplY3RWZWN0b3I8Q0ZvbGRlcj4gZm9sZGVyczsNCisgICAgICBDT3V0Rm9sZGVycyBvdXRGb2xkZXJzOw0KKw0KKyAgICAgIFJJTk9LKEVuY29kZVN0cmVhbSgNCisgICAgICAgICAgRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgICAgICAgIGVuY29kZXIsIGJ1ZiwNCisgICAgICAgICAgcGFja1NpemVzLCBmb2xkZXJzLCBvdXRGb2xkZXJzKSk7DQorDQorICAgICAgX3dyaXRlVG9TdHJlYW0gPSB0cnVlOw0KKyAgICAgIA0KKyAgICAgIGlmIChmb2xkZXJzLlNpemUoKSA9PSAwKQ0KKyAgICAgICAgdGhyb3cgMTsNCisNCisgICAgICBXcml0ZUlEKE5JRDo6a0VuY29kZWRIZWFkZXIpOw0KKyAgICAgIFdyaXRlUGFja0luZm8oaGVhZGVyT2Zmc2V0LCBwYWNrU2l6ZXMsIENVSW50MzJEZWZWZWN0b3IoKSk7DQorICAgICAgV3JpdGVVbnBhY2tJbmZvKGZvbGRlcnMsIG91dEZvbGRlcnMpOw0KKyAgICAgIFdyaXRlQnl0ZShOSUQ6OmtFbmQpOw0KKyAgICAgIEZPUl9WRUNUT1IgKGksIHBhY2tTaXplcykNCisgICAgICAgIGhlYWRlck9mZnNldCArPSBwYWNrU2l6ZXNbaV07DQorICAgIH0NCisgICAgUklOT0soX291dEJ5dGUuRmx1c2goKSk7DQorICAgIGhlYWRlckNSQyA9IENSQ19HRVRfRElHRVNUKF9jcmMpOw0KKyAgICBoZWFkZXJTaXplID0gX291dEJ5dGUuR2V0UHJvY2Vzc2VkU2l6ZSgpOw0KKyAgfQ0KKyAgI2lmZGVmIF83Wl9WT0wNCisgIGlmIChfZW5kTWFya2VyKQ0KKyAgew0KKyAgICBDRmluaXNoSGVhZGVyIGg7DQorICAgIGguTmV4dEhlYWRlclNpemUgPSBoZWFkZXJTaXplOw0KKyAgICBoLk5leHRIZWFkZXJDUkMgPSBoZWFkZXJDUkM7DQorICAgIGguTmV4dEhlYWRlck9mZnNldCA9DQorICAgICAgICBVSW50NjQoMCkgLSAoaGVhZGVyU2l6ZSArDQorICAgICAgICA0ICsga0ZpbmlzaEhlYWRlclNpemUpOw0KKyAgICBoLkFyY2hpdmVTdGFydE9mZnNldCA9IGguTmV4dEhlYWRlck9mZnNldCAtIGhlYWRlck9mZnNldDsNCisgICAgaC5BZGRpdGlvbmFsU3RhcnRCbG9ja1NpemUgPSAwOw0KKyAgICBSSU5PSyhXcml0ZUZpbmlzaEhlYWRlcihoKSk7DQorICAgIHJldHVybiBXcml0ZUZpbmlzaFNpZ25hdHVyZSgpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgI2VuZGlmDQorICB7DQorICAgIENTdGFydEhlYWRlciBoOw0KKyAgICBoLk5leHRIZWFkZXJTaXplID0gaGVhZGVyU2l6ZTsNCisgICAgaC5OZXh0SGVhZGVyQ1JDID0gaGVhZGVyQ1JDOw0KKyAgICBoLk5leHRIZWFkZXJPZmZzZXQgPSBoZWFkZXJPZmZzZXQ7DQorICAgIFJJTk9LKFN0cmVhbS0+U2VlayhfcHJlZml4SGVhZGVyUG9zLCBTVFJFQU1fU0VFS19TRVQsIE5VTEwpKTsNCisgICAgcmV0dXJuIFdyaXRlU3RhcnRIZWFkZXIoaCk7DQorICB9DQorfQ0KKw0KK3ZvaWQgQ1VJbnQ2NERlZlZlY3Rvcjo6U2V0SXRlbSh1bnNpZ25lZCBpbmRleCwgYm9vbCBkZWZpbmVkLCBVSW50NjQgdmFsdWUpDQorew0KKyAgd2hpbGUgKGluZGV4ID49IERlZnMuU2l6ZSgpKQ0KKyAgICBEZWZzLkFkZChmYWxzZSk7DQorICBEZWZzW2luZGV4XSA9IGRlZmluZWQ7DQorICBpZiAoIWRlZmluZWQpDQorICAgIHJldHVybjsNCisgIHdoaWxlIChpbmRleCA+PSBWYWxzLlNpemUoKSkNCisgICAgVmFscy5BZGQoMCk7DQorICBWYWxzW2luZGV4XSA9IHZhbHVlOw0KK30NCisNCit2b2lkIENBcmNoaXZlRGF0YWJhc2VPdXQ6OkFkZEZpbGUoY29uc3QgQ0ZpbGVJdGVtICZmaWxlLCBjb25zdCBDRmlsZUl0ZW0yICZmaWxlMiwgY29uc3QgVVN0cmluZyAmbmFtZSkNCit7DQorICB1bnNpZ25lZCBpbmRleCA9IEZpbGVzLlNpemUoKTsNCisgIENUaW1lLlNldEl0ZW0oaW5kZXgsIGZpbGUyLkNUaW1lRGVmaW5lZCwgZmlsZTIuQ1RpbWUpOw0KKyAgQVRpbWUuU2V0SXRlbShpbmRleCwgZmlsZTIuQVRpbWVEZWZpbmVkLCBmaWxlMi5BVGltZSk7DQorICBNVGltZS5TZXRJdGVtKGluZGV4LCBmaWxlMi5NVGltZURlZmluZWQsIGZpbGUyLk1UaW1lKTsNCisgIFN0YXJ0UG9zLlNldEl0ZW0oaW5kZXgsIGZpbGUyLlN0YXJ0UG9zRGVmaW5lZCwgZmlsZTIuU3RhcnRQb3MpOw0KKyAgU2V0SXRlbV9BbnRpKGluZGV4LCBmaWxlMi5Jc0FudGkpOw0KKyAgLy8gU2V0SXRlbV9BdXgoaW5kZXgsIGZpbGUyLklzQXV4KTsNCisgIE5hbWVzLkFkZChuYW1lKTsNCisgIEZpbGVzLkFkZChmaWxlKTsNCit9DQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pPdXQuaCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83ek91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGJkNjMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pPdXQuaApAQCAtMCwwICsxLDMxOSBAQAorLy8gN3pPdXQuaA0KKw0KKyNpZm5kZWYgX183Wl9PVVRfSA0KKyNkZWZpbmUgX183Wl9PVVRfSA0KKw0KKyNpbmNsdWRlICI3ekNvbXByZXNzaW9uTW9kZS5oIg0KKyNpbmNsdWRlICI3ekVuY29kZS5oIg0KKyNpbmNsdWRlICI3ekhlYWRlci5oIg0KKyNpbmNsdWRlICI3ekl0ZW0uaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL091dEJ1ZmZlci5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vU3RyZWFtVXRpbHMuaCINCisNCituYW1lc3BhY2UgTkFyY2hpdmUgew0KK25hbWVzcGFjZSBON3ogew0KKw0KK2NsYXNzIENXcml0ZUJ1ZmZlckxvYw0KK3sNCisgIEJ5dGUgKl9kYXRhOw0KKyAgc2l6ZV90IF9zaXplOw0KKyAgc2l6ZV90IF9wb3M7DQorcHVibGljOg0KKyAgQ1dyaXRlQnVmZmVyTG9jKCk6IF9zaXplKDApLCBfcG9zKDApIHt9DQorICB2b2lkIEluaXQoQnl0ZSAqZGF0YSwgc2l6ZV90IHNpemUpDQorICB7DQorICAgIF9kYXRhID0gZGF0YTsNCisgICAgX3NpemUgPSBzaXplOw0KKyAgICBfcG9zID0gMDsNCisgIH0NCisgIHZvaWQgV3JpdGVCeXRlcyhjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkNCisgIHsNCisgICAgaWYgKHNpemUgPiBfc2l6ZSAtIF9wb3MpDQorICAgICAgdGhyb3cgMTsNCisgICAgbWVtY3B5KF9kYXRhICsgX3BvcywgZGF0YSwgc2l6ZSk7DQorICAgIF9wb3MgKz0gc2l6ZTsNCisgIH0NCisgIHZvaWQgV3JpdGVCeXRlKEJ5dGUgYikNCisgIHsNCisgICAgaWYgKF9zaXplID09IF9wb3MpDQorICAgICAgdGhyb3cgMTsNCisgICAgX2RhdGFbX3BvcysrXSA9IGI7DQorICB9DQorICBzaXplX3QgR2V0UG9zKCkgY29uc3QgeyByZXR1cm4gX3BvczsgfQ0KK307DQorDQorc3RydWN0IENIZWFkZXJPcHRpb25zDQorew0KKyAgYm9vbCBDb21wcmVzc01haW5IZWFkZXI7DQorICAvKg0KKyAgYm9vbCBXcml0ZUNUaW1lOw0KKyAgYm9vbCBXcml0ZUFUaW1lOw0KKyAgYm9vbCBXcml0ZU1UaW1lOw0KKyAgKi8NCisNCisgIENIZWFkZXJPcHRpb25zKCk6DQorICAgICAgQ29tcHJlc3NNYWluSGVhZGVyKHRydWUpDQorICAgICAgLyoNCisgICAgICAsIFdyaXRlQ1RpbWUoZmFsc2UpDQorICAgICAgLCBXcml0ZUFUaW1lKGZhbHNlKQ0KKyAgICAgICwgV3JpdGVNVGltZSh0cnVlKQ0KKyAgICAgICovDQorICAgICAge30NCit9Ow0KKw0KKw0KK3N0cnVjdCBDRmlsZUl0ZW0yDQorew0KKyAgVUludDY0IENUaW1lOw0KKyAgVUludDY0IEFUaW1lOw0KKyAgVUludDY0IE1UaW1lOw0KKyAgVUludDY0IFN0YXJ0UG9zOw0KKyAgYm9vbCBDVGltZURlZmluZWQ7DQorICBib29sIEFUaW1lRGVmaW5lZDsNCisgIGJvb2wgTVRpbWVEZWZpbmVkOw0KKyAgYm9vbCBTdGFydFBvc0RlZmluZWQ7DQorICBib29sIElzQW50aTsNCisgIC8vIGJvb2wgSXNBdXg7DQorDQorICB2b2lkIEluaXQoKQ0KKyAgew0KKyAgICBDVGltZURlZmluZWQgPSBmYWxzZTsNCisgICAgQVRpbWVEZWZpbmVkID0gZmFsc2U7DQorICAgIE1UaW1lRGVmaW5lZCA9IGZhbHNlOw0KKyAgICBTdGFydFBvc0RlZmluZWQgPSBmYWxzZTsNCisgICAgSXNBbnRpID0gZmFsc2U7DQorICAgIC8vIElzQXV4ID0gZmFsc2U7DQorICB9DQorfTsNCisNCitzdHJ1Y3QgQ091dEZvbGRlcnMNCit7DQorICBDVUludDMyRGVmVmVjdG9yIEZvbGRlclVucGFja0NSQ3M7IC8vIE5vdyB3ZSB1c2UgaXQgZm9yIGhlYWRlcnMgb25seS4NCisNCisgIENSZWNvcmRWZWN0b3I8Q051bT4gTnVtVW5wYWNrU3RyZWFtc1ZlY3RvcjsNCisgIENSZWNvcmRWZWN0b3I8VUludDY0PiBDb2RlclVucGFja1NpemVzOyAvLyBpbmNsdWRpbmcgdW5wYWNrIHNpemVzIG9mIGJpbmQgY29kZXJzDQorDQorICB2b2lkIE91dEZvbGRlcnNDbGVhcigpDQorICB7DQorICAgIEZvbGRlclVucGFja0NSQ3MuQ2xlYXIoKTsNCisgICAgTnVtVW5wYWNrU3RyZWFtc1ZlY3Rvci5DbGVhcigpOw0KKyAgICBDb2RlclVucGFja1NpemVzLkNsZWFyKCk7DQorICB9DQorDQorICB2b2lkIE91dEZvbGRlcnNSZXNlcnZlRG93bigpDQorICB7DQorICAgIEZvbGRlclVucGFja0NSQ3MuUmVzZXJ2ZURvd24oKTsNCisgICAgTnVtVW5wYWNrU3RyZWFtc1ZlY3Rvci5SZXNlcnZlRG93bigpOw0KKyAgICBDb2RlclVucGFja1NpemVzLlJlc2VydmVEb3duKCk7DQorICB9DQorfTsNCisNCitzdHJ1Y3QgQ0FyY2hpdmVEYXRhYmFzZU91dDogcHVibGljIENPdXRGb2xkZXJzDQorew0KKyAgQ1JlY29yZFZlY3RvcjxVSW50NjQ+IFBhY2tTaXplczsNCisgIENVSW50MzJEZWZWZWN0b3IgUGFja0NSQ3M7DQorICBDT2JqZWN0VmVjdG9yPENGb2xkZXI+IEZvbGRlcnM7DQorDQorICBDUmVjb3JkVmVjdG9yPENGaWxlSXRlbT4gRmlsZXM7DQorICBVU3RyaW5nVmVjdG9yIE5hbWVzOw0KKyAgQ1VJbnQ2NERlZlZlY3RvciBDVGltZTsNCisgIENVSW50NjREZWZWZWN0b3IgQVRpbWU7DQorICBDVUludDY0RGVmVmVjdG9yIE1UaW1lOw0KKyAgQ1VJbnQ2NERlZlZlY3RvciBTdGFydFBvczsNCisgIENSZWNvcmRWZWN0b3I8Ym9vbD4gSXNBbnRpOw0KKw0KKyAgLyoNCisgIENSZWNvcmRWZWN0b3I8Ym9vbD4gSXNBdXg7DQorDQorICBDQnl0ZUJ1ZmZlciBTZWN1cmVCdWY7DQorICBDUmVjb3JkVmVjdG9yPFVJbnQzMj4gU2VjdXJlU2l6ZXM7DQorICBDUmVjb3JkVmVjdG9yPFVJbnQzMj4gU2VjdXJlSURzOw0KKw0KKyAgdm9pZCBDbGVhclNlY3VyZSgpDQorICB7DQorICAgIFNlY3VyZUJ1Zi5GcmVlKCk7DQorICAgIFNlY3VyZVNpemVzLkNsZWFyKCk7DQorICAgIFNlY3VyZUlEcy5DbGVhcigpOw0KKyAgfQ0KKyAgKi8NCisNCisgIHZvaWQgQ2xlYXIoKQ0KKyAgew0KKyAgICBPdXRGb2xkZXJzQ2xlYXIoKTsNCisNCisgICAgUGFja1NpemVzLkNsZWFyKCk7DQorICAgIFBhY2tDUkNzLkNsZWFyKCk7DQorICAgIEZvbGRlcnMuQ2xlYXIoKTsNCisgIA0KKyAgICBGaWxlcy5DbGVhcigpOw0KKyAgICBOYW1lcy5DbGVhcigpOw0KKyAgICBDVGltZS5DbGVhcigpOw0KKyAgICBBVGltZS5DbGVhcigpOw0KKyAgICBNVGltZS5DbGVhcigpOw0KKyAgICBTdGFydFBvcy5DbGVhcigpOw0KKyAgICBJc0FudGkuQ2xlYXIoKTsNCisNCisgICAgLyoNCisgICAgSXNBdXguQ2xlYXIoKTsNCisgICAgQ2xlYXJTZWN1cmUoKTsNCisgICAgKi8NCisgIH0NCisNCisgIHZvaWQgUmVzZXJ2ZURvd24oKQ0KKyAgew0KKyAgICBPdXRGb2xkZXJzUmVzZXJ2ZURvd24oKTsNCisNCisgICAgUGFja1NpemVzLlJlc2VydmVEb3duKCk7DQorICAgIFBhY2tDUkNzLlJlc2VydmVEb3duKCk7DQorICAgIEZvbGRlcnMuUmVzZXJ2ZURvd24oKTsNCisgICAgDQorICAgIEZpbGVzLlJlc2VydmVEb3duKCk7DQorICAgIE5hbWVzLlJlc2VydmVEb3duKCk7DQorICAgIENUaW1lLlJlc2VydmVEb3duKCk7DQorICAgIEFUaW1lLlJlc2VydmVEb3duKCk7DQorICAgIE1UaW1lLlJlc2VydmVEb3duKCk7DQorICAgIFN0YXJ0UG9zLlJlc2VydmVEb3duKCk7DQorICAgIElzQW50aS5SZXNlcnZlRG93bigpOw0KKw0KKyAgICAvKg0KKyAgICBJc0F1eC5SZXNlcnZlRG93bigpOw0KKyAgICAqLw0KKyAgfQ0KKw0KKyAgYm9vbCBJc0VtcHR5KCkgY29uc3QNCisgIHsNCisgICAgcmV0dXJuICgNCisgICAgICBQYWNrU2l6ZXMuSXNFbXB0eSgpICYmDQorICAgICAgTnVtVW5wYWNrU3RyZWFtc1ZlY3Rvci5Jc0VtcHR5KCkgJiYNCisgICAgICBGb2xkZXJzLklzRW1wdHkoKSAmJg0KKyAgICAgIEZpbGVzLklzRW1wdHkoKSk7DQorICB9DQorDQorICBib29sIENoZWNrTnVtRmlsZXMoKSBjb25zdA0KKyAgew0KKyAgICB1bnNpZ25lZCBzaXplID0gRmlsZXMuU2l6ZSgpOw0KKyAgICByZXR1cm4gKA0KKyAgICAgIENUaW1lLkNoZWNrU2l6ZShzaXplKSAmJg0KKyAgICAgIEFUaW1lLkNoZWNrU2l6ZShzaXplKSAmJg0KKyAgICAgIE1UaW1lLkNoZWNrU2l6ZShzaXplKSAmJg0KKyAgICAgIFN0YXJ0UG9zLkNoZWNrU2l6ZShzaXplKSAmJg0KKyAgICAgIChzaXplID09IElzQW50aS5TaXplKCkgfHwgSXNBbnRpLlNpemUoKSA9PSAwKSk7DQorICB9DQorDQorICBib29sIElzSXRlbUFudGkodW5zaWduZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIChpbmRleCA8IElzQW50aS5TaXplKCkgJiYgSXNBbnRpW2luZGV4XSk7IH0NCisgIC8vIGJvb2wgSXNJdGVtQXV4KHVuc2lnbmVkIGluZGV4KSBjb25zdCB7IHJldHVybiAoaW5kZXggPCBJc0F1eC5TaXplKCkgJiYgSXNBdXhbaW5kZXhdKTsgfQ0KKw0KKyAgdm9pZCBTZXRJdGVtX0FudGkodW5zaWduZWQgaW5kZXgsIGJvb2wgaXNBbnRpKQ0KKyAgew0KKyAgICB3aGlsZSAoaW5kZXggPj0gSXNBbnRpLlNpemUoKSkNCisgICAgICBJc0FudGkuQWRkKGZhbHNlKTsNCisgICAgSXNBbnRpW2luZGV4XSA9IGlzQW50aTsNCisgIH0NCisgIC8qDQorICB2b2lkIFNldEl0ZW1fQXV4KHVuc2lnbmVkIGluZGV4LCBib29sIGlzQXV4KQ0KKyAgew0KKyAgICB3aGlsZSAoaW5kZXggPj0gSXNBdXguU2l6ZSgpKQ0KKyAgICAgIElzQXV4LkFkZChmYWxzZSk7DQorICAgIElzQXV4W2luZGV4XSA9IGlzQXV4Ow0KKyAgfQ0KKyAgKi8NCisNCisgIHZvaWQgQWRkRmlsZShjb25zdCBDRmlsZUl0ZW0gJmZpbGUsIGNvbnN0IENGaWxlSXRlbTIgJmZpbGUyLCBjb25zdCBVU3RyaW5nICZuYW1lKTsNCit9Ow0KKw0KK2NsYXNzIENPdXRBcmNoaXZlDQorew0KKyAgVUludDY0IF9wcmVmaXhIZWFkZXJQb3M7DQorDQorICBIUkVTVUxUIFdyaXRlRGlyZWN0KGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplKSB7IHJldHVybiBXcml0ZVN0cmVhbShTZXFTdHJlYW0sIGRhdGEsIHNpemUpOyB9DQorICANCisgIFVJbnQ2NCBHZXRQb3MoKSBjb25zdDsNCisgIHZvaWQgV3JpdGVCeXRlcyhjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7DQorICB2b2lkIFdyaXRlQnl0ZXMoY29uc3QgQ0J5dGVCdWZmZXIgJmRhdGEpIHsgV3JpdGVCeXRlcyhkYXRhLCBkYXRhLlNpemUoKSk7IH0NCisgIHZvaWQgV3JpdGVCeXRlKEJ5dGUgYik7DQorICB2b2lkIFdyaXRlVUludDMyKFVJbnQzMiB2YWx1ZSk7DQorICB2b2lkIFdyaXRlVUludDY0KFVJbnQ2NCB2YWx1ZSk7DQorICB2b2lkIFdyaXRlTnVtYmVyKFVJbnQ2NCB2YWx1ZSk7DQorICB2b2lkIFdyaXRlSUQoVUludDY0IHZhbHVlKSB7IFdyaXRlTnVtYmVyKHZhbHVlKTsgfQ0KKw0KKyAgdm9pZCBXcml0ZUZvbGRlcihjb25zdCBDRm9sZGVyICZmb2xkZXIpOw0KKyAgSFJFU1VMVCBXcml0ZUZpbGVIZWFkZXIoY29uc3QgQ0ZpbGVJdGVtICZpdGVtSW5mbyk7DQorICB2b2lkIFdyaXRlQm9vbFZlY3Rvcihjb25zdCBDQm9vbFZlY3RvciAmYm9vbFZlY3Rvcik7DQorICB2b2lkIFdyaXRlUHJvcEJvb2xWZWN0b3IoQnl0ZSBpZCwgY29uc3QgQ0Jvb2xWZWN0b3IgJmJvb2xWZWN0b3IpOw0KKw0KKyAgdm9pZCBXcml0ZUhhc2hEaWdlc3RzKGNvbnN0IENVSW50MzJEZWZWZWN0b3IgJmRpZ2VzdHMpOw0KKw0KKyAgdm9pZCBXcml0ZVBhY2tJbmZvKA0KKyAgICAgIFVJbnQ2NCBkYXRhT2Zmc2V0LA0KKyAgICAgIGNvbnN0IENSZWNvcmRWZWN0b3I8VUludDY0PiAmcGFja1NpemVzLA0KKyAgICAgIGNvbnN0IENVSW50MzJEZWZWZWN0b3IgJnBhY2tDUkNzKTsNCisNCisgIHZvaWQgV3JpdGVVbnBhY2tJbmZvKA0KKyAgICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q0ZvbGRlcj4gJmZvbGRlcnMsDQorICAgICAgY29uc3QgQ091dEZvbGRlcnMgJm91dEZvbGRlcnMpOw0KKw0KKyAgdm9pZCBXcml0ZVN1YlN0cmVhbXNJbmZvKA0KKyAgICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q0ZvbGRlcj4gJmZvbGRlcnMsDQorICAgICAgY29uc3QgQ091dEZvbGRlcnMgJm91dEZvbGRlcnMsDQorICAgICAgY29uc3QgQ1JlY29yZFZlY3RvcjxVSW50NjQ+ICZ1bnBhY2tTaXplcywNCisgICAgICBjb25zdCBDVUludDMyRGVmVmVjdG9yICZkaWdlc3RzKTsNCisNCisgIHZvaWQgU2tpcEFsaWduKHVuc2lnbmVkIHBvcywgdW5zaWduZWQgYWxpZ25TaXplKTsNCisgIHZvaWQgV3JpdGVBbGlnbmVkQm9vbEhlYWRlcihjb25zdCBDQm9vbFZlY3RvciAmdiwgdW5zaWduZWQgbnVtRGVmaW5lZCwgQnl0ZSB0eXBlLCB1bnNpZ25lZCBpdGVtU2l6ZSk7DQorICB2b2lkIFdyaXRlVUludDY0RGVmVmVjdG9yKGNvbnN0IENVSW50NjREZWZWZWN0b3IgJnYsIEJ5dGUgdHlwZSk7DQorDQorICBIUkVTVUxUIEVuY29kZVN0cmVhbSgNCisgICAgICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICAgIENFbmNvZGVyICZlbmNvZGVyLCBjb25zdCBDQnl0ZUJ1ZmZlciAmZGF0YSwNCisgICAgICBDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gJnBhY2tTaXplcywgQ09iamVjdFZlY3RvcjxDRm9sZGVyPiAmZm9sZGVycywgQ091dEZvbGRlcnMgJm91dEZvbGRlcnMpOw0KKyAgdm9pZCBXcml0ZUhlYWRlcigNCisgICAgICBjb25zdCBDQXJjaGl2ZURhdGFiYXNlT3V0ICZkYiwNCisgICAgICAvLyBjb25zdCBDSGVhZGVyT3B0aW9ucyAmaGVhZGVyT3B0aW9ucywNCisgICAgICBVSW50NjQgJmhlYWRlck9mZnNldCk7DQorICANCisgIGJvb2wgX2NvdW50TW9kZTsNCisgIGJvb2wgX3dyaXRlVG9TdHJlYW07DQorICBzaXplX3QgX2NvdW50U2l6ZTsNCisgIFVJbnQzMiBfY3JjOw0KKyAgQ091dEJ1ZmZlciBfb3V0Qnl0ZTsNCisgIENXcml0ZUJ1ZmZlckxvYyBfb3V0Qnl0ZTI7DQorDQorICAjaWZkZWYgXzdaX1ZPTA0KKyAgYm9vbCBfZW5kTWFya2VyOw0KKyAgI2VuZGlmDQorDQorICBib29sIF91c2VBbGlnbjsNCisNCisgIEhSRVNVTFQgV3JpdGVTaWduYXR1cmUoKTsNCisgICNpZmRlZiBfN1pfVk9MDQorICBIUkVTVUxUIFdyaXRlRmluaXNoU2lnbmF0dXJlKCk7DQorICAjZW5kaWYNCisgIEhSRVNVTFQgV3JpdGVTdGFydEhlYWRlcihjb25zdCBDU3RhcnRIZWFkZXIgJmgpOw0KKyAgI2lmZGVmIF83Wl9WT0wNCisgIEhSRVNVTFQgV3JpdGVGaW5pc2hIZWFkZXIoY29uc3QgQ0ZpbmlzaEhlYWRlciAmaCk7DQorICAjZW5kaWYNCisgIENNeUNvbVB0cjxJT3V0U3RyZWFtPiBTdHJlYW07DQorcHVibGljOg0KKw0KKyAgQ091dEFyY2hpdmUoKSB7IF9vdXRCeXRlLkNyZWF0ZSgxIDw8IDE2KTsgfQ0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsT3V0U3RyZWFtPiBTZXFTdHJlYW07DQorICBIUkVTVUxUIENyZWF0ZShJU2VxdWVudGlhbE91dFN0cmVhbSAqc3RyZWFtLCBib29sIGVuZE1hcmtlcik7DQorICB2b2lkIENsb3NlKCk7DQorICBIUkVTVUxUIFNraXBQcmVmaXhBcmNoaXZlSGVhZGVyKCk7DQorICBIUkVTVUxUIFdyaXRlRGF0YWJhc2UoDQorICAgICAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgICBjb25zdCBDQXJjaGl2ZURhdGFiYXNlT3V0ICZkYiwNCisgICAgICBjb25zdCBDQ29tcHJlc3Npb25NZXRob2RNb2RlICpvcHRpb25zLA0KKyAgICAgIGNvbnN0IENIZWFkZXJPcHRpb25zICZoZWFkZXJPcHRpb25zKTsNCisNCisgICNpZmRlZiBfN1pfVk9MDQorICBzdGF0aWMgVUludDMyIEdldFZvbEhlYWRlcnNTaXplKFVJbnQ2NCBkYXRhU2l6ZSwgaW50IG5hbWVMZW5ndGggPSAwLCBib29sIHByb3BzID0gZmFsc2UpOw0KKyAgc3RhdGljIFVJbnQ2NCBHZXRWb2xQdXJlU2l6ZShVSW50NjQgdm9sU2l6ZSwgaW50IG5hbWVMZW5ndGggPSAwLCBib29sIHByb3BzID0gZmFsc2UpOw0KKyAgI2VuZGlmDQorDQorfTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83elByb3BlcnRpZXMuY3BwIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6UHJvcGVydGllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1YzYxYgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83elByb3BlcnRpZXMuY3BwCkBAIC0wLDAgKzEsMTcwIEBACisvLyA3elByb3BlcnRpZXMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICI3elByb3BlcnRpZXMuaCINCisjaW5jbHVkZSAiN3pIZWFkZXIuaCINCisjaW5jbHVkZSAiN3pIYW5kbGVyLmgiDQorDQorLy8gI2RlZmluZSBfTVVMVElfUEFDSw0KKw0KK25hbWVzcGFjZSBOQXJjaGl2ZSB7DQorbmFtZXNwYWNlIE43eiB7DQorDQorc3RydWN0IENQcm9wTWFwDQorew0KKyAgVUludDY0IEZpbGVQcm9wSUQ7DQorICBTVEFUUFJPUFNURyBTdGF0UFJPUFNURzsNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBDUHJvcE1hcCBrUHJvcE1hcFtdID0NCit7DQorICB7IE5JRDo6a05hbWUsIHsgTlVMTCwga3BpZFBhdGgsIFZUX0JTVFIgfSB9LA0KKyAgeyBOSUQ6OmtTaXplLCB7IE5VTEwsIGtwaWRTaXplLCBWVF9VSTggfSB9LA0KKyAgeyBOSUQ6OmtQYWNrSW5mbywgeyBOVUxMLCBrcGlkUGFja1NpemUsIFZUX1VJOCB9IH0sDQorICANCisgICNpZmRlZiBfTVVMVElfUEFDSw0KKyAgeyAxMDAsIHsgTCJQYWNrMCIsIGtwaWRQYWNrZWRTaXplMCwgVlRfVUk4IH0gfSwNCisgIHsgMTAxLCB7IEwiUGFjazEiLCBrcGlkUGFja2VkU2l6ZTEsIFZUX1VJOCB9IH0sDQorICB7IDEwMiwgeyBMIlBhY2syIiwga3BpZFBhY2tlZFNpemUyLCBWVF9VSTggfSB9LA0KKyAgeyAxMDMsIHsgTCJQYWNrMyIsIGtwaWRQYWNrZWRTaXplMywgVlRfVUk4IH0gfSwNCisgIHsgMTA0LCB7IEwiUGFjazQiLCBrcGlkUGFja2VkU2l6ZTQsIFZUX1VJOCB9IH0sDQorICAjZW5kaWYNCisNCisgIHsgTklEOjprQ1RpbWUsIHsgTlVMTCwga3BpZENUaW1lLCBWVF9GSUxFVElNRSB9IH0sDQorICB7IE5JRDo6a01UaW1lLCB7IE5VTEwsIGtwaWRNVGltZSwgVlRfRklMRVRJTUUgfSB9LA0KKyAgeyBOSUQ6OmtBVGltZSwgeyBOVUxMLCBrcGlkQVRpbWUsIFZUX0ZJTEVUSU1FIH0gfSwNCisgIHsgTklEOjprV2luQXR0cmliLCB7IE5VTEwsIGtwaWRBdHRyaWIsIFZUX1VJNCB9IH0sDQorICB7IE5JRDo6a1N0YXJ0UG9zLCB7IE5VTEwsIGtwaWRQb3NpdGlvbiwgVlRfVUk0IH0gfSwNCisNCisgIHsgTklEOjprQ1JDLCB7IE5VTEwsIGtwaWRDUkMsIFZUX1VJNCB9IH0sDQorICANCisvLyAgeyBOSUQ6OmtJc0F1eCwgeyBOVUxMLCBrcGlkSXNBdXgsIFZUX0JPT0wgfSB9LA0KKyAgeyBOSUQ6OmtBbnRpLCB7IE5VTEwsIGtwaWRJc0FudGksIFZUX0JPT0wgfSB9DQorDQorICAjaWZuZGVmIF9TRlgNCisgICwNCisgIHsgOTcsIHsgTlVMTCxrcGlkRW5jcnlwdGVkLCBWVF9CT09MIH0gfSwNCisgIHsgOTgsIHsgTlVMTCxrcGlkTWV0aG9kLCBWVF9CU1RSIH0gfSwNCisgIHsgOTksIHsgTlVMTCxrcGlkQmxvY2ssIFZUX1VJNCB9IH0NCisgICNlbmRpZg0KK307DQorDQorc3RhdGljIGludCBGaW5kUHJvcEluTWFwKFVJbnQ2NCBmaWxlUHJvcElEKQ0KK3sNCisgIGZvciAoaW50IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUHJvcE1hcCk7IGkrKykNCisgICAgaWYgKGtQcm9wTWFwW2ldLkZpbGVQcm9wSUQgPT0gZmlsZVByb3BJRCkNCisgICAgICByZXR1cm4gaTsNCisgIHJldHVybiAtMTsNCit9DQorDQorc3RhdGljIHZvaWQgQ29weU9uZUl0ZW0oQ1JlY29yZFZlY3RvcjxVSW50NjQ+ICZzcmMsDQorICAgIENSZWNvcmRWZWN0b3I8VUludDY0PiAmZGVzdCwgVUludDMyIGl0ZW0pDQorew0KKyAgRk9SX1ZFQ1RPUiAoaSwgc3JjKQ0KKyAgICBpZiAoc3JjW2ldID09IGl0ZW0pDQorICAgIHsNCisgICAgICBkZXN0LkFkZChpdGVtKTsNCisgICAgICBzcmMuRGVsZXRlKGkpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KK30NCisNCitzdGF0aWMgdm9pZCBSZW1vdmVPbmVJdGVtKENSZWNvcmRWZWN0b3I8VUludDY0PiAmc3JjLCBVSW50MzIgaXRlbSkNCit7DQorICBGT1JfVkVDVE9SIChpLCBzcmMpDQorICAgIGlmIChzcmNbaV0gPT0gaXRlbSkNCisgICAgew0KKyAgICAgIHNyYy5EZWxldGUoaSk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIEluc2VydFRvSGVhZChDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gJmRlc3QsIFVJbnQzMiBpdGVtKQ0KK3sNCisgIEZPUl9WRUNUT1IgKGksIGRlc3QpDQorICAgIGlmIChkZXN0W2ldID09IGl0ZW0pDQorICAgIHsNCisgICAgICBkZXN0LkRlbGV0ZShpKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgZGVzdC5JbnNlcnQoMCwgaXRlbSk7DQorfQ0KKw0KKyNkZWZpbmUgQ09QWV9PTkVfSVRFTShpZCkgQ29weU9uZUl0ZW0oZmlsZUluZm9Qb3BJRHMsIF9maWxlSW5mb1BvcElEcywgTklEOjppZCk7DQorDQordm9pZCBDSGFuZGxlcjo6RmlsbFBvcElEcygpDQorew0KKyAgX2ZpbGVJbmZvUG9wSURzLkNsZWFyKCk7DQorDQorICAjaWZkZWYgXzdaX1ZPTA0KKyAgaWYoX3ZvbHVtZXMuU2l6ZSgpIDwgMSkNCisgICAgcmV0dXJuOw0KKyAgY29uc3QgQ1ZvbHVtZSAmdm9sdW1lID0gX3ZvbHVtZXMuRnJvbnQoKTsNCisgIGNvbnN0IENBcmNoaXZlRGF0YWJhc2VFeCAmX2RiID0gdm9sdW1lLkRhdGFiYXNlOw0KKyAgI2VuZGlmDQorDQorICBDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gZmlsZUluZm9Qb3BJRHMgPSBfZGIuQXJjSW5mby5GaWxlSW5mb1BvcElEczsNCisNCisgIFJlbW92ZU9uZUl0ZW0oZmlsZUluZm9Qb3BJRHMsIE5JRDo6a0VtcHR5U3RyZWFtKTsNCisgIFJlbW92ZU9uZUl0ZW0oZmlsZUluZm9Qb3BJRHMsIE5JRDo6a0VtcHR5RmlsZSk7DQorICAvKg0KKyAgUmVtb3ZlT25lSXRlbShmaWxlSW5mb1BvcElEcywgTklEOjprUGFyZW50KTsNCisgIFJlbW92ZU9uZUl0ZW0oZmlsZUluZm9Qb3BJRHMsIE5JRDo6a050U2VjdXJlKTsNCisgICovDQorDQorICBDT1BZX09ORV9JVEVNKGtOYW1lKTsNCisgIENPUFlfT05FX0lURU0oa0FudGkpOw0KKyAgQ09QWV9PTkVfSVRFTShrU2l6ZSk7DQorICBDT1BZX09ORV9JVEVNKGtQYWNrSW5mbyk7DQorICBDT1BZX09ORV9JVEVNKGtDVGltZSk7DQorICBDT1BZX09ORV9JVEVNKGtNVGltZSk7DQorICBDT1BZX09ORV9JVEVNKGtBVGltZSk7DQorICBDT1BZX09ORV9JVEVNKGtXaW5BdHRyaWIpOw0KKyAgQ09QWV9PTkVfSVRFTShrQ1JDKTsNCisgIENPUFlfT05FX0lURU0oa0NvbW1lbnQpOw0KKw0KKyAgX2ZpbGVJbmZvUG9wSURzICs9IGZpbGVJbmZvUG9wSURzOw0KKyANCisgICNpZm5kZWYgX1NGWA0KKyAgX2ZpbGVJbmZvUG9wSURzLkFkZCg5Nyk7DQorICBfZmlsZUluZm9Qb3BJRHMuQWRkKDk4KTsNCisgIF9maWxlSW5mb1BvcElEcy5BZGQoOTkpOw0KKyAgI2VuZGlmDQorICAjaWZkZWYgX01VTFRJX1BBQ0sNCisgIF9maWxlSW5mb1BvcElEcy5BZGQoMTAwKTsNCisgIF9maWxlSW5mb1BvcElEcy5BZGQoMTAxKTsNCisgIF9maWxlSW5mb1BvcElEcy5BZGQoMTAyKTsNCisgIF9maWxlSW5mb1BvcElEcy5BZGQoMTAzKTsNCisgIF9maWxlSW5mb1BvcElEcy5BZGQoMTA0KTsNCisgICNlbmRpZg0KKw0KKyAgI2lmbmRlZiBfU0ZYDQorICBJbnNlcnRUb0hlYWQoX2ZpbGVJbmZvUG9wSURzLCBOSUQ6OmtNVGltZSk7DQorICBJbnNlcnRUb0hlYWQoX2ZpbGVJbmZvUG9wSURzLCBOSUQ6OmtQYWNrSW5mbyk7DQorICBJbnNlcnRUb0hlYWQoX2ZpbGVJbmZvUG9wSURzLCBOSUQ6OmtTaXplKTsNCisgIEluc2VydFRvSGVhZChfZmlsZUluZm9Qb3BJRHMsIE5JRDo6a05hbWUpOw0KKyAgI2VuZGlmDQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0TnVtYmVyT2ZQcm9wZXJ0aWVzKFVJbnQzMiAqbnVtUHJvcHMpDQorew0KKyAgKm51bVByb3BzID0gX2ZpbGVJbmZvUG9wSURzLlNpemUoKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkdldFByb3BlcnR5SW5mbyhVSW50MzIgaW5kZXgsIEJTVFIgKm5hbWUsIFBST1BJRCAqcHJvcElELCBWQVJUWVBFICp2YXJUeXBlKQ0KK3sNCisgIGlmICgoaW50KWluZGV4ID49IF9maWxlSW5mb1BvcElEcy5TaXplKCkpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICBpbnQgaW5kZXhJbk1hcCA9IEZpbmRQcm9wSW5NYXAoX2ZpbGVJbmZvUG9wSURzW2luZGV4XSk7DQorICBpZiAoaW5kZXhJbk1hcCA9PSAtMSkNCisgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgIGNvbnN0IFNUQVRQUk9QU1RHICZzcmNJdGVtID0ga1Byb3BNYXBbaW5kZXhJbk1hcF0uU3RhdFBST1BTVEc7DQorICAqcHJvcElEID0gc3JjSXRlbS5wcm9waWQ7DQorICAqdmFyVHlwZSA9IHNyY0l0ZW0udnQ7DQorICAqbmFtZSA9IDA7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pQcm9wZXJ0aWVzLmggYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pQcm9wZXJ0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3ODEzMAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83elByb3BlcnRpZXMuaApAQCAtMCwwICsxLDIyIEBACisvLyA3elByb3BlcnRpZXMuaA0KKw0KKyNpZm5kZWYgX183Wl9QUk9QRVJUSUVTX0gNCisjZGVmaW5lIF9fN1pfUFJPUEVSVElFU19IDQorDQorI2luY2x1ZGUgIi4uLy4uL1Byb3BJRC5oIg0KKw0KK25hbWVzcGFjZSBOQXJjaGl2ZSB7DQorbmFtZXNwYWNlIE43eiB7DQorDQorZW51bQ0KK3sNCisgIGtwaWRQYWNrZWRTaXplMCA9IGtwaWRVc2VyRGVmaW5lZCwNCisgIGtwaWRQYWNrZWRTaXplMSwNCisgIGtwaWRQYWNrZWRTaXplMiwNCisgIGtwaWRQYWNrZWRTaXplMywNCisgIGtwaWRQYWNrZWRTaXplNA0KK307DQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pSZWdpc3Rlci5jcHAgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pSZWdpc3Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0ZTg5MAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83elJlZ2lzdGVyLmNwcApAQCAtMCwwICsxLDI1IEBACisvLyA3elJlZ2lzdGVyLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL1JlZ2lzdGVyQXJjLmgiDQorDQorI2luY2x1ZGUgIjd6SGFuZGxlci5oIg0KKw0KK25hbWVzcGFjZSBOQXJjaGl2ZSB7DQorbmFtZXNwYWNlIE43eiB7DQorDQorSU1QX0NyZWF0ZUFyY0luDQorSU1QX0NyZWF0ZUFyY091dA0KKw0KK3N0YXRpYyBDQXJjSW5mbyBnX0FyY0luZm8gPQ0KKyAgeyAiN3oiLCAiN3oiLCAwLCA3LA0KKyAgNiwgeyc3JyArIDEsICd6JywgMHhCQywgMHhBRiwgMHgyNywgMHgxQ30sDQorICAwLA0KKyAgTkFyY0luZm9GbGFnczo6a0ZpbmRTaWduYXR1cmUsDQorICBSRUZfQ3JlYXRlQXJjX1BhaXIgfTsNCisNCitSRUdJU1RFUl9BUkNfREVDX1NJRyg3eikNCisvLyBSRUdJU1RFUl9BUkMoN3opDQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pTcGVjU3RyZWFtLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83elNwZWNTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NjcxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pTcGVjU3RyZWFtLmNwcApAQCAtMCwwICsxLDIyIEBACisvLyA3elNwZWNTdHJlYW0uY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICI3elNwZWNTdHJlYW0uaCINCisNCitTVERNRVRIT0RJTVAgQ1NlcXVlbnRpYWxJblN0cmVhbVNpemVDb3VudDI6OlJlYWQodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBVSW50MzIgcmVhbFByb2Nlc3NlZFNpemU7DQorICBIUkVTVUxUIHJlc3VsdCA9IF9zdHJlYW0tPlJlYWQoZGF0YSwgc2l6ZSwgJnJlYWxQcm9jZXNzZWRTaXplKTsNCisgIF9zaXplICs9IHJlYWxQcm9jZXNzZWRTaXplOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gcmVhbFByb2Nlc3NlZFNpemU7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisNCitTVERNRVRIT0RJTVAgQ1NlcXVlbnRpYWxJblN0cmVhbVNpemVDb3VudDI6OkdldFN1YlN0cmVhbVNpemUoVUludDY0IHN1YlN0cmVhbSwgVUludDY0ICp2YWx1ZSkNCit7DQorICBpZiAoIV9nZXRTdWJTdHJlYW1TaXplKQ0KKyAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgcmV0dXJuIF9nZXRTdWJTdHJlYW1TaXplLT5HZXRTdWJTdHJlYW1TaXplKHN1YlN0cmVhbSwgdmFsdWUpOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pTcGVjU3RyZWFtLmggYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovN3pTcGVjU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1OGFjMgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83elNwZWNTdHJlYW0uaApAQCAtMCwwICsxLDM1IEBACisvLyA3elNwZWNTdHJlYW0uaA0KKw0KKyNpZm5kZWYgX183Wl9TUEVDX1NUUkVBTV9IDQorI2RlZmluZSBfXzdaX1NQRUNfU1RSRUFNX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vSVN0cmVhbS5oIg0KKyNpbmNsdWRlICIuLi8uLi9JQ29kZXIuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015Q29tLmgiDQorDQorY2xhc3MgQ1NlcXVlbnRpYWxJblN0cmVhbVNpemVDb3VudDI6DQorICBwdWJsaWMgSVNlcXVlbnRpYWxJblN0cmVhbSwNCisgIHB1YmxpYyBJQ29tcHJlc3NHZXRTdWJTdHJlYW1TaXplLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gX3N0cmVhbTsNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NHZXRTdWJTdHJlYW1TaXplPiBfZ2V0U3ViU3RyZWFtU2l6ZTsNCisgIFVJbnQ2NCBfc2l6ZTsNCitwdWJsaWM6DQorICB2b2lkIEluaXQoSVNlcXVlbnRpYWxJblN0cmVhbSAqc3RyZWFtKQ0KKyAgew0KKyAgICBfc3RyZWFtID0gc3RyZWFtOw0KKyAgICBfZ2V0U3ViU3RyZWFtU2l6ZSA9IDA7DQorICAgIF9zdHJlYW0uUXVlcnlJbnRlcmZhY2UoSUlEX0lDb21wcmVzc0dldFN1YlN0cmVhbVNpemUsICZfZ2V0U3ViU3RyZWFtU2l6ZSk7DQorICAgIF9zaXplID0gMDsNCisgIH0NCisgIFVJbnQ2NCBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gX3NpemU7IH0NCisNCisgIE1ZX1VOS05PV05fSU1QMShJQ29tcHJlc3NHZXRTdWJTdHJlYW1TaXplKQ0KKw0KKyAgU1RETUVUSE9EKFJlYWQpKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KKw0KKyAgU1RETUVUSE9EKEdldFN1YlN0cmVhbVNpemUpKFVJbnQ2NCBzdWJTdHJlYW0sIFVJbnQ2NCAqdmFsdWUpOw0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6VXBkYXRlLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83elVwZGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmM2UwZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83elVwZGF0ZS5jcHAKQEAgLTAsMCArMSwxMzYzIEBACisvLyA3elVwZGF0ZS5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL0MvQ3B1QXJjaC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vV2lsZGNhcmQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0NyZWF0ZUNvZGVyLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9MaW1pdGVkU3RyZWFtcy5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vUHJvZ3Jlc3NVdGlscy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21wcmVzcy9Db3B5Q29kZXIuaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0l0ZW1OYW1lVXRpbHMuaCINCisjaW5jbHVkZSAiLi4vQ29tbW9uL091dFN0cmVhbVdpdGhDUkMuaCINCisNCisjaW5jbHVkZSAiN3pEZWNvZGUuaCINCisjaW5jbHVkZSAiN3pFbmNvZGUuaCINCisjaW5jbHVkZSAiN3pGb2xkZXJJblN0cmVhbS5oIg0KKyNpbmNsdWRlICI3ekhhbmRsZXIuaCINCisjaW5jbHVkZSAiN3pPdXQuaCINCisjaW5jbHVkZSAiN3pVcGRhdGUuaCINCisNCituYW1lc3BhY2UgTkFyY2hpdmUgew0KK25hbWVzcGFjZSBON3ogew0KKw0KKyNpZmRlZiBNWV9DUFVfWDg2X09SX0FNRDY0DQorI2RlZmluZSBVU0VfODZfRklMVEVSDQorI2VuZGlmDQorDQorc3RhdGljIEhSRVNVTFQgV3JpdGVSYW5nZShJSW5TdHJlYW0gKmluU3RyZWFtLCBJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtLA0KKyAgICBVSW50NjQgcG9zaXRpb24sIFVJbnQ2NCBzaXplLCBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKQ0KK3sNCisgIFJJTk9LKGluU3RyZWFtLT5TZWVrKHBvc2l0aW9uLCBTVFJFQU1fU0VFS19TRVQsIDApKTsNCisgIENMaW1pdGVkU2VxdWVudGlhbEluU3RyZWFtICpzdHJlYW1TcGVjID0gbmV3IENMaW1pdGVkU2VxdWVudGlhbEluU3RyZWFtOw0KKyAgQ015Q29tUHRyPENMaW1pdGVkU2VxdWVudGlhbEluU3RyZWFtPiBpblN0cmVhbUxpbWl0ZWQoc3RyZWFtU3BlYyk7DQorICBzdHJlYW1TcGVjLT5TZXRTdHJlYW0oaW5TdHJlYW0pOw0KKyAgc3RyZWFtU3BlYy0+SW5pdChzaXplKTsNCisNCisgIE5Db21wcmVzczo6Q0NvcHlDb2RlciAqY29weUNvZGVyU3BlYyA9IG5ldyBOQ29tcHJlc3M6OkNDb3B5Q29kZXI7DQorICBDTXlDb21QdHI8SUNvbXByZXNzQ29kZXI+IGNvcHlDb2RlciA9IGNvcHlDb2RlclNwZWM7DQorICBSSU5PSyhjb3B5Q29kZXItPkNvZGUoaW5TdHJlYW1MaW1pdGVkLCBvdXRTdHJlYW0sIE5VTEwsIE5VTEwsIHByb2dyZXNzKSk7DQorICByZXR1cm4gKGNvcHlDb2RlclNwZWMtPlRvdGFsU2l6ZSA9PSBzaXplID8gU19PSyA6IEVfRkFJTCk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgR2V0UmV2ZXJzZVNsYXNoUG9zKGNvbnN0IFVTdHJpbmcgJm5hbWUpDQorew0KKyAgaW50IHNsYXNoUG9zID0gbmFtZS5SZXZlcnNlRmluZChMJy8nKTsNCisgICNpZmRlZiBfV0lOMzINCisgIGludCBzbGFzaDFQb3MgPSBuYW1lLlJldmVyc2VGaW5kKEwnXFwnKTsNCisgIHNsYXNoUG9zID0gTXlNYXgoc2xhc2hQb3MsIHNsYXNoMVBvcyk7DQorICAjZW5kaWYNCisgIHJldHVybiBzbGFzaFBvczsNCit9DQorDQoraW50IENVcGRhdGVJdGVtOjpHZXRFeHRlbnNpb25Qb3MoKSBjb25zdA0KK3sNCisgIGludCBzbGFzaFBvcyA9IEdldFJldmVyc2VTbGFzaFBvcyhOYW1lKTsNCisgIGludCBkb3RQb3MgPSBOYW1lLlJldmVyc2VGaW5kKEwnLicpOw0KKyAgaWYgKGRvdFBvcyA8IDAgfHwgKGRvdFBvcyA8IHNsYXNoUG9zICYmIHNsYXNoUG9zID49IDApKQ0KKyAgICByZXR1cm4gTmFtZS5MZW4oKTsNCisgIHJldHVybiBkb3RQb3MgKyAxOw0KK30NCisNCitVU3RyaW5nIENVcGRhdGVJdGVtOjpHZXRFeHRlbnNpb24oKSBjb25zdA0KK3sNCisgIHJldHVybiBOYW1lLlB0cihHZXRFeHRlbnNpb25Qb3MoKSk7DQorfQ0KKw0KKyNkZWZpbmUgUklOT1ooeCkgeyBpbnQgX190dCA9ICh4KTsgaWYgKF9fdHQgIT0gMCkgcmV0dXJuIF9fdHQ7IH0NCisNCisjZGVmaW5lIFJJTk9aX0NPTVAoYSwgYikgUklOT1ooTXlDb21wYXJlKGEsIGIpKQ0KKw0KKy8qDQorc3RhdGljIGludCBDb21wYXJlQnVmZmVycyhjb25zdCBDQnl0ZUJ1ZmZlciAmYTEsIGNvbnN0IENCeXRlQnVmZmVyICZhMikNCit7DQorICBzaXplX3QgYzEgPSBhMS5HZXRDYXBhY2l0eSgpOw0KKyAgc2l6ZV90IGMyID0gYTIuR2V0Q2FwYWNpdHkoKTsNCisgIFJJTk9aX0NPTVAoYzEsIGMyKTsNCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYzE7IGkrKykNCisgICAgUklOT1pfQ09NUChhMVtpXSwgYTJbaV0pOw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbnQgQ29tcGFyZUNvZGVycyhjb25zdCBDQ29kZXJJbmZvICZjMSwgY29uc3QgQ0NvZGVySW5mbyAmYzIpDQorew0KKyAgUklOT1pfQ09NUChjMS5OdW1JblN0cmVhbXMsIGMyLk51bUluU3RyZWFtcyk7DQorICBSSU5PWl9DT01QKGMxLk51bU91dFN0cmVhbXMsIGMyLk51bU91dFN0cmVhbXMpOw0KKyAgUklOT1pfQ09NUChjMS5NZXRob2RJRCwgYzIuTWV0aG9kSUQpOw0KKyAgcmV0dXJuIENvbXBhcmVCdWZmZXJzKGMxLlByb3BzLCBjMi5Qcm9wcyk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgQ29tcGFyZUJpbmRQYWlycyhjb25zdCBDQmluZFBhaXIgJmIxLCBjb25zdCBDQmluZFBhaXIgJmIyKQ0KK3sNCisgIFJJTk9aX0NPTVAoYjEuSW5JbmRleCwgYjIuSW5JbmRleCk7DQorICByZXR1cm4gTXlDb21wYXJlKGIxLk91dEluZGV4LCBiMi5PdXRJbmRleCk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgQ29tcGFyZUZvbGRlcnMoY29uc3QgQ0ZvbGRlciAmZjEsIGNvbnN0IENGb2xkZXIgJmYyKQ0KK3sNCisgIGludCBzMSA9IGYxLkNvZGVycy5TaXplKCk7DQorICBpbnQgczIgPSBmMi5Db2RlcnMuU2l6ZSgpOw0KKyAgUklOT1pfQ09NUChzMSwgczIpOw0KKyAgaW50IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgczE7IGkrKykNCisgICAgUklOT1ooQ29tcGFyZUNvZGVycyhmMS5Db2RlcnNbaV0sIGYyLkNvZGVyc1tpXSkpOw0KKyAgczEgPSBmMS5CaW5kUGFpcnMuU2l6ZSgpOw0KKyAgczIgPSBmMi5CaW5kUGFpcnMuU2l6ZSgpOw0KKyAgUklOT1pfQ09NUChzMSwgczIpOw0KKyAgZm9yIChpID0gMDsgaSA8IHMxOyBpKyspDQorICAgIFJJTk9aKENvbXBhcmVCaW5kUGFpcnMoZjEuQmluZFBhaXJzW2ldLCBmMi5CaW5kUGFpcnNbaV0pKTsNCisgIHJldHVybiAwOw0KK30NCisqLw0KKw0KKy8qDQorc3RhdGljIGludCBDb21wYXJlRmlsZXMoY29uc3QgQ0ZpbGVJdGVtICZmMSwgY29uc3QgQ0ZpbGVJdGVtICZmMikNCit7DQorICByZXR1cm4gQ29tcGFyZUZpbGVOYW1lcyhmMS5OYW1lLCBmMi5OYW1lKTsNCit9DQorKi8NCisNCitzdHJ1Y3QgQ0ZvbGRlclJlcGFjaw0KK3sNCisgIGludCBGb2xkZXJJbmRleDsNCisgIGludCBHcm91cDsNCisgIENOdW0gTnVtQ29weUZpbGVzOw0KK307DQorDQorc3RhdGljIGludCBDb21wYXJlRm9sZGVyUmVwYWNrcyhjb25zdCBDRm9sZGVyUmVwYWNrICpwMSwgY29uc3QgQ0ZvbGRlclJlcGFjayAqcDIsIHZvaWQgKiAvKiBwYXJhbSAqLykNCit7DQorICBSSU5PWl9DT01QKHAxLT5Hcm91cCwgcDItPkdyb3VwKTsNCisgIGludCBpMSA9IHAxLT5Gb2xkZXJJbmRleDsNCisgIGludCBpMiA9IHAyLT5Gb2xkZXJJbmRleDsNCisgIC8qDQorICAvLyBJbiB0aGF0IHZlcnNpb24gd2UgZG9uJ3Qgd2FudCB0byBwYXJzZSBmb2xkZXJzIGhlcmUsIHNvIHdlIGRvbid0IGNvbXBhcmUgZm9sZGVycw0KKyAgLy8gcHJvYmFibHkgaXQgbXVzdCBiZSBpbXByb3ZlZCBpbiBmdXR1cmUNCisgIGNvbnN0IENEYkV4ICZkYiA9ICooY29uc3QgQ0RiRXggKilwYXJhbTsNCisgIFJJTk9aKENvbXBhcmVGb2xkZXJzKA0KKyAgICAgIGRiLkZvbGRlcnNbaTFdLA0KKyAgICAgIGRiLkZvbGRlcnNbaTJdKSk7DQorICAqLw0KKyAgcmV0dXJuIE15Q29tcGFyZShpMSwgaTIpOw0KKyAgLyoNCisgIFJJTk9aX0NPTVAoDQorICAgICAgZGIuTnVtVW5wYWNrU3RyZWFtc1ZlY3RvcltpMV0sDQorICAgICAgZGIuTnVtVW5wYWNrU3RyZWFtc1ZlY3RvcltpMl0pOw0KKyAgaWYgKGRiLk51bVVucGFja1N0cmVhbXNWZWN0b3JbaTFdID09IDApDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIENvbXBhcmVGaWxlcygNCisgICAgICBkYi5GaWxlc1tkYi5Gb2xkZXJTdGFydEZpbGVJbmRleFtpMV1dLA0KKyAgICAgIGRiLkZpbGVzW2RiLkZvbGRlclN0YXJ0RmlsZUluZGV4W2kyXV0pOw0KKyAgKi8NCit9DQorDQorLyoNCisgIHdlIHNvcnQgZW1wdHkgZmlsZXMgYW5kIGRpcnMgaW4gc3VjaCBvcmRlcjoNCisgIC0gRGlyLk5vbkFudGkgICAobmFtZSBzb3J0ZWQpDQorICAtIEZpbGUuTm9uQW50aSAgKG5hbWUgc29ydGVkKQ0KKyAgLSBGaWxlLkFudGkgICAgIChuYW1lIHNvcnRlZCkNCisgIC0gRGlyLkFudGkgKHJldmVyc2UgbmFtZSBzb3J0ZWQpDQorKi8NCisNCitzdGF0aWMgaW50IENvbXBhcmVFbXB0eUl0ZW1zKGNvbnN0IGludCAqcDEsIGNvbnN0IGludCAqcDIsIHZvaWQgKnBhcmFtKQ0KK3sNCisgIGNvbnN0IENPYmplY3RWZWN0b3I8Q1VwZGF0ZUl0ZW0+ICZ1cGRhdGVJdGVtcyA9ICooY29uc3QgQ09iamVjdFZlY3RvcjxDVXBkYXRlSXRlbT4gKilwYXJhbTsNCisgIGNvbnN0IENVcGRhdGVJdGVtICZ1MSA9IHVwZGF0ZUl0ZW1zWypwMV07DQorICBjb25zdCBDVXBkYXRlSXRlbSAmdTIgPSB1cGRhdGVJdGVtc1sqcDJdOw0KKyAgLy8gTm9uQW50aSA8IEFudGkNCisgIGlmICh1MS5Jc0FudGkgIT0gdTIuSXNBbnRpKQ0KKyAgICByZXR1cm4gKHUxLklzQW50aSA/IDEgOiAtMSk7DQorICBpZiAodTEuSXNEaXIgIT0gdTIuSXNEaXIpDQorICB7DQorICAgIC8vIERpci5Ob25BbnRpIDwgRmlsZSA8IERpci5BbnRpDQorICAgIGlmICh1MS5Jc0RpcikNCisgICAgICByZXR1cm4gKHUxLklzQW50aSA/IDEgOiAtMSk7DQorICAgIHJldHVybiAodTIuSXNBbnRpID8gLTEgOiAxKTsNCisgIH0NCisgIGludCBuID0gQ29tcGFyZUZpbGVOYW1lcyh1MS5OYW1lLCB1Mi5OYW1lKTsNCisgIHJldHVybiAodTEuSXNEaXIgJiYgdTEuSXNBbnRpKSA/IC1uIDogbjsNCit9DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmdfRXh0cyA9DQorICAiIGx6bWEgN3ogYWNlIGFyYyBhcmogYnogYnoyIGRlYiBsem8gbHp4IGd6IHBhayBycG0gc2l0IHRneiB0YnogdGJ6MiB0Z3ogY2FiIGhhIGxoYSBsemggcmFyIHpvbyINCisgICIgemlwIGphciBlYXIgd2FyIG1zaSINCisgICIgM2dwIGF2aSBtb3YgbXBlZyBtcGcgbXBlIHdtdiINCisgICIgYWFjIGFwZSBmbGEgZmxhYyBsYSBtcDMgbTRhIG1wNCBvZnIgb2dnIHBhYyByYSBybSBya2Egc2huIHN3YSB0dGEgd3Ygd21hIHdhdiINCisgICIgc3dmICINCisgICIgY2htIGh4aSBoeHMiDQorICAiIGdpZiBqcGVnIGpwZyBqcDIgcG5nIHRpZmYgIGJtcCBpY28gcHNkIHBzcCINCisgICIgYXdnIHBzIGVwcyBjZ20gZHhmIHN2ZyB2cm1sIHdtZiBlbWYgYWkgbWQiDQorICAiIGNhZCBkd2cgcHBzIGtleSBzeGkiDQorICAiIG1heCAzZHMiDQorICAiIGlzbyBiaW4gbnJnIG1kZiBpbWcgcGRpIHRhciBjcGlvIHhwaSINCisgICIgdmZkIHZoZCB2dWQgdm1jIHZzdiINCisgICIgdm1kayBkc2sgbnZyYW0gdm1lbSB2bXNkIHZtc24gdm1zcyB2bXRtIg0KKyAgIiBpbmwgaW5jIGlkbCBhY2YgYXNhIGggaHBwIGh4eCBjIGNwcCBjeHggcmMgamF2YSBjcyBwYXMgYmFzIHZiIGNscyBjdGwgZnJtIGRsZyBkZWYiDQorICAiIGY3NyBmIGY5MCBmOTUiDQorICAiIGFzbSBzcWwgbWFuaWZlc3QgZGVwICINCisgICIgbWFrIGNsdyBjc3Byb2ogdmNwcm9qIHNsbiBkc3AgZHN3ICINCisgICIgY2xhc3MgIg0KKyAgIiBiYXQgY21kIg0KKyAgIiB4bWwgeHNkIHhzbCB4c2x0IGh4ayBoeGMgaHRtIGh0bWwgeGh0bWwgeGh0IG1odCBtaHRtbCBodHcgYXNwIGFzcHggY3NzIGNnaSBqc3Agc2h0bWwiDQorICAiIGF3ayBzZWQgaHRhIGpzIHBocCBwaHAzIHBocDQgcGhwNSBwaHB0bWwgcGwgcG0gcHkgcHlvIHJiIHNoIHRjbCB2YnMiDQorICAiIHRleHQgdHh0IHRleCBhbnMgYXNjIHNydCByZWcgaW5pIGRvYyBkb2N4IG1jdyBkb3QgcnRmIGhscCB4bHMgeGxyIHhsdCB4bHcgcHB0IHBkZiINCisgICIgc3hjIHN4ZCBzeGkgc3hnIHN4dyBzdGMgc3RpIHN0dyBzdG0gb2R0IG90dCBvZGcgb3RnIG9kcCBvdHAgb2RzIG90cyBvZGYiDQorICAiIGFidyBhZnAgY3drIGx3cCB3cGQgd3BzIHdwdCB3cmYgd3JpIg0KKyAgIiBhYmYgYWZtIGJkZiBmb24gbWdmIG90ZiBwY2YgcGZhIHNuZiB0dGYiDQorICAiIGRiZiBtZGIgbnNmIG50ZiB3ZGIgZGIgZmRiIGdkYiINCisgICIgZXhlIGRsbCBvY3ggdmJ4IHNmeCBzeXMgdGxiIGF3eCBjb20gb2JqIGxpYiBvdXQgbyBzbyAiDQorICAiIHBkYiBwY2ggaWRiIG5jYiBvcHQiOw0KKw0KK3N0YXRpYyBpbnQgR2V0RXh0SW5kZXgoY29uc3QgY2hhciAqZXh0KQ0KK3sNCisgIGludCBleHRJbmRleCA9IDE7DQorICBjb25zdCBjaGFyICpwID0gZ19FeHRzOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgY2hhciBjID0gKnArKzsNCisgICAgaWYgKGMgPT0gMCkNCisgICAgICByZXR1cm4gZXh0SW5kZXg7DQorICAgIGlmIChjID09ICcgJykNCisgICAgICBjb250aW51ZTsNCisgICAgaW50IHBvcyA9IDA7DQorICAgIGZvciAoOzspDQorICAgIHsNCisgICAgICBjaGFyIGMyID0gZXh0W3BvcysrXTsNCisgICAgICBpZiAoYzIgPT0gMCAmJiAoYyA9PSAwIHx8IGMgPT0gJyAnKSkNCisgICAgICAgIHJldHVybiBleHRJbmRleDsNCisgICAgICBpZiAoYyAhPSBjMikNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGMgPSAqcCsrOw0KKyAgICB9DQorICAgIGV4dEluZGV4Kys7DQorICAgIGZvciAoOzspDQorICAgIHsNCisgICAgICBpZiAoYyA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIGV4dEluZGV4Ow0KKyAgICAgIGlmIChjID09ICcgJykNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGMgPSAqcCsrOw0KKyAgICB9DQorICB9DQorfQ0KKw0KK3N0cnVjdCBDUmVmSXRlbQ0KK3sNCisgIGNvbnN0IENVcGRhdGVJdGVtICpVcGRhdGVJdGVtOw0KKyAgVUludDMyIEluZGV4Ow0KKyAgVUludDMyIEV4dGVuc2lvblBvczsNCisgIFVJbnQzMiBOYW1lUG9zOw0KKyAgdW5zaWduZWQgRXh0ZW5zaW9uSW5kZXg7DQorICANCisgIENSZWZJdGVtKCkge307DQorICBDUmVmSXRlbShVSW50MzIgaW5kZXgsIGNvbnN0IENVcGRhdGVJdGVtICZ1aSwgYm9vbCBzb3J0QnlUeXBlKToNCisgICAgVXBkYXRlSXRlbSgmdWkpLA0KKyAgICBJbmRleChpbmRleCksDQorICAgIEV4dGVuc2lvblBvcygwKSwNCisgICAgTmFtZVBvcygwKSwNCisgICAgRXh0ZW5zaW9uSW5kZXgoMCkNCisgIHsNCisgICAgaWYgKHNvcnRCeVR5cGUpDQorICAgIHsNCisgICAgICBpbnQgc2xhc2hQb3MgPSBHZXRSZXZlcnNlU2xhc2hQb3ModWkuTmFtZSk7DQorICAgICAgTmFtZVBvcyA9IHNsYXNoUG9zICsgMTsNCisgICAgICBpbnQgZG90UG9zID0gdWkuTmFtZS5SZXZlcnNlRmluZChMJy4nKTsNCisgICAgICBpZiAoZG90UG9zIDwgMCB8fCBkb3RQb3MgPCBzbGFzaFBvcykNCisgICAgICAgIEV4dGVuc2lvblBvcyA9IHVpLk5hbWUuTGVuKCk7DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIEV4dGVuc2lvblBvcyA9IGRvdFBvcyArIDE7DQorICAgICAgICBpZiAoRXh0ZW5zaW9uUG9zICE9IHVpLk5hbWUuTGVuKCkpDQorICAgICAgICB7DQorICAgICAgICAgIEFTdHJpbmcgczsNCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBwb3MgPSBFeHRlbnNpb25Qb3M7OyBwb3MrKykNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIHdjaGFyX3QgYyA9IHVpLk5hbWVbcG9zXTsNCisgICAgICAgICAgICBpZiAoYyA+PSAweDgwKQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgaWYgKGMgPT0gMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICBFeHRlbnNpb25JbmRleCA9IEdldEV4dEluZGV4KHMpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHMgKz0gKGNoYXIpTXlDaGFyTG93ZXJfQXNjaWkoKGNoYXIpYyk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCit9Ow0KKw0KK3N0cnVjdCBDU29ydFBhcmFtDQorew0KKyAgLy8gY29uc3QgQ09iamVjdFZlY3RvcjxDVHJlZUZvbGRlcj4gKlRyZWVGb2xkZXJzOw0KKyAgYm9vbCBTb3J0QnlUeXBlOw0KK307DQorDQorLyoNCisgIHdlIHNvcnQgZmlsZXMgaW4gc3VjaCBvcmRlcjoNCisgIC0gRGlyLk5vbkFudGkgICAobmFtZSBzb3J0ZWQpDQorICAtIGFsdCBzdHJlYW1zDQorICAtIERpcnMNCisgIC0gRGlyLkFudGkgKHJldmVyc2UgbmFtZSBzb3J0ZWQpDQorKi8NCisNCisNCitzdGF0aWMgaW50IENvbXBhcmVVcGRhdGVJdGVtcyhjb25zdCBDUmVmSXRlbSAqcDEsIGNvbnN0IENSZWZJdGVtICpwMiwgdm9pZCAqcGFyYW0pDQorew0KKyAgY29uc3QgQ1JlZkl0ZW0gJmExID0gKnAxOw0KKyAgY29uc3QgQ1JlZkl0ZW0gJmEyID0gKnAyOw0KKyAgY29uc3QgQ1VwZGF0ZUl0ZW0gJnUxID0gKmExLlVwZGF0ZUl0ZW07DQorICBjb25zdCBDVXBkYXRlSXRlbSAmdTIgPSAqYTIuVXBkYXRlSXRlbTsNCisNCisgIC8qDQorICBpZiAodTEuSXNBbHRTdHJlYW0gIT0gdTIuSXNBbHRTdHJlYW0pDQorICAgIHJldHVybiB1MS5Jc0FsdFN0cmVhbSA/IDEgOiAtMTsNCisgICovDQorICANCisgIC8vIEFjdHVhbGx5IHRoZXJlIGFyZSBubyBkaXJzIHRoYXQgdGltZS4gVGhleSB3ZXJlIHN0b3JlZCBpbiBvdGhlciBzdGVwcw0KKyAgLy8gU28gdGhhdCBjb2RlIGlzIHVudXNlZD8NCisgIGlmICh1MS5Jc0RpciAhPSB1Mi5Jc0RpcikNCisgICAgcmV0dXJuIHUxLklzRGlyID8gMSA6IC0xOw0KKyAgaWYgKHUxLklzRGlyKQ0KKyAgew0KKyAgICBpZiAodTEuSXNBbnRpICE9IHUyLklzQW50aSkNCisgICAgICByZXR1cm4gKHUxLklzQW50aSA/IDEgOiAtMSk7DQorICAgIGludCBuID0gQ29tcGFyZUZpbGVOYW1lcyh1MS5OYW1lLCB1Mi5OYW1lKTsNCisgICAgcmV0dXJuIC1uOw0KKyAgfQ0KKyAgDQorICAvLyBib29sIHNvcnRCeVR5cGUgPSAqKGJvb2wgKilwYXJhbTsNCisgIGNvbnN0IENTb3J0UGFyYW0gKnNvcnRQYXJhbSA9IChjb25zdCBDU29ydFBhcmFtICopcGFyYW07DQorICBib29sIHNvcnRCeVR5cGUgPSBzb3J0UGFyYW0tPlNvcnRCeVR5cGU7DQorICBpZiAoc29ydEJ5VHlwZSkNCisgIHsNCisgICAgUklOT1pfQ09NUChhMS5FeHRlbnNpb25JbmRleCwgYTIuRXh0ZW5zaW9uSW5kZXgpOw0KKyAgICBSSU5PWihDb21wYXJlRmlsZU5hbWVzKHUxLk5hbWUuUHRyKGExLkV4dGVuc2lvblBvcyksIHUyLk5hbWUuUHRyKGEyLkV4dGVuc2lvblBvcykpKTsNCisgICAgUklOT1ooQ29tcGFyZUZpbGVOYW1lcyh1MS5OYW1lLlB0cihhMS5OYW1lUG9zKSwgdTIuTmFtZS5QdHIoYTIuTmFtZVBvcykpKTsNCisgICAgaWYgKCF1MS5NVGltZURlZmluZWQgJiYgdTIuTVRpbWVEZWZpbmVkKSByZXR1cm4gMTsNCisgICAgaWYgKHUxLk1UaW1lRGVmaW5lZCAmJiAhdTIuTVRpbWVEZWZpbmVkKSByZXR1cm4gLTE7DQorICAgIGlmICh1MS5NVGltZURlZmluZWQgJiYgdTIuTVRpbWVEZWZpbmVkKSBSSU5PWl9DT01QKHUxLk1UaW1lLCB1Mi5NVGltZSk7DQorICAgIFJJTk9aX0NPTVAodTEuU2l6ZSwgdTIuU2l6ZSk7DQorICB9DQorICAvKg0KKyAgaW50IHBhcjEgPSBhMS5VcGRhdGVJdGVtLT5QYXJlbnRGb2xkZXJJbmRleDsNCisgIGludCBwYXIyID0gYTIuVXBkYXRlSXRlbS0+UGFyZW50Rm9sZGVySW5kZXg7DQorICBjb25zdCBDVHJlZUZvbGRlciAmdGYxID0gKCpzb3J0UGFyYW0tPlRyZWVGb2xkZXJzKVtwYXIxXTsNCisgIGNvbnN0IENUcmVlRm9sZGVyICZ0ZjIgPSAoKnNvcnRQYXJhbS0+VHJlZUZvbGRlcnMpW3BhcjJdOw0KKw0KKyAgaW50IGIxID0gdGYxLlNvcnRJbmRleCwgZTEgPSB0ZjEuU29ydEluZGV4RW5kOw0KKyAgaW50IGIyID0gdGYyLlNvcnRJbmRleCwgZTIgPSB0ZjIuU29ydEluZGV4RW5kOw0KKyAgaWYgKGIxIDwgYjIpDQorICB7DQorICAgIGlmIChlMSA8PSBiMikNCisgICAgICByZXR1cm4gLTE7DQorICAgIC8vIHAyIGluIHAxDQorICAgIGludCBwYXIgPSBwYXIyOw0KKyAgICBmb3IgKDs7KQ0KKyAgICB7DQorICAgICAgY29uc3QgQ1RyZWVGb2xkZXIgJnRmID0gKCpzb3J0UGFyYW0tPlRyZWVGb2xkZXJzKVtwYXJdOw0KKyAgICAgIHBhciA9IHRmLlBhcmVudDsNCisgICAgICBpZiAocGFyID09IHBhcjEpDQorICAgICAgew0KKyAgICAgICAgUklOT1ooQ29tcGFyZUZpbGVOYW1lcyh1MS5OYW1lLCB0Zi5OYW1lKSk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGVsc2UgaWYgKGIyIDwgYjEpDQorICB7DQorICAgIGlmIChlMiA8PSBiMSkNCisgICAgICByZXR1cm4gMTsNCisgICAgLy8gcDEgaW4gcDINCisgICAgaW50IHBhciA9IHBhcjE7DQorICAgIGZvciAoOzspDQorICAgIHsNCisgICAgICBjb25zdCBDVHJlZUZvbGRlciAmdGYgPSAoKnNvcnRQYXJhbS0+VHJlZUZvbGRlcnMpW3Bhcl07DQorICAgICAgcGFyID0gdGYuUGFyZW50Ow0KKyAgICAgIGlmIChwYXIgPT0gcGFyMikNCisgICAgICB7DQorICAgICAgICBSSU5PWihDb21wYXJlRmlsZU5hbWVzKHRmLk5hbWUsIHUyLk5hbWUpKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgKi8NCisgIC8vIFJJTk9aX0NPTVAoYTEuVXBkYXRlSXRlbS0+UGFyZW50U29ydEluZGV4LCBhMi5VcGRhdGVJdGVtLT5QYXJlbnRTb3J0SW5kZXgpOw0KKyAgUklOT0soQ29tcGFyZUZpbGVOYW1lcyh1MS5OYW1lLCB1Mi5OYW1lKSk7DQorICBSSU5PWl9DT01QKGExLlVwZGF0ZUl0ZW0tPkluZGV4SW5DbGllbnQsIGEyLlVwZGF0ZUl0ZW0tPkluZGV4SW5DbGllbnQpOw0KKyAgUklOT1pfQ09NUChhMS5VcGRhdGVJdGVtLT5JbmRleEluQXJjaGl2ZSwgYTIuVXBkYXRlSXRlbS0+SW5kZXhJbkFyY2hpdmUpOw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3N0cnVjdCBDU29saWRHcm91cA0KK3sNCisgIENSZWNvcmRWZWN0b3I8VUludDMyPiBJbmRpY2VzOw0KK307DQorDQorc3RhdGljIGNvbnN0IHdjaGFyX3QgKmdfRXhlRXh0c1tdID0NCit7DQorICAgIEwiZGxsIg0KKyAgLCBMImV4ZSINCisgICwgTCJvY3giDQorICAsIEwic2Z4Ig0KKyAgLCBMInN5cyINCit9Ow0KKw0KK3N0YXRpYyBib29sIElzRXhlRXh0KGNvbnN0IHdjaGFyX3QgKmV4dCkNCit7DQorICBmb3IgKGludCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ19FeGVFeHRzKTsgaSsrKQ0KKyAgICBpZiAoTXlTdHJpbmdDb21wYXJlTm9DYXNlKGV4dCwgZ19FeGVFeHRzW2ldKSA9PSAwKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCisNCitzdGF0aWMgaW5saW5lIHZvaWQgR2V0TWV0aG9kRnVsbChVSW50NjQgbWV0aG9kSUQsIFVJbnQzMiBudW1JblN0cmVhbXMsIENNZXRob2RGdWxsICZtKQ0KK3sNCisgIG0uSWQgPSBtZXRob2RJRDsNCisgIG0uTnVtSW5TdHJlYW1zID0gbnVtSW5TdHJlYW1zOw0KKyAgbS5OdW1PdXRTdHJlYW1zID0gMTsNCit9DQorDQorc3RhdGljIHZvaWQgQWRkQmNqMk1ldGhvZHMoQ0NvbXByZXNzaW9uTWV0aG9kTW9kZSAmbW9kZSkNCit7DQorICBDTWV0aG9kRnVsbCBtOw0KKyAgR2V0TWV0aG9kRnVsbChrX0xaTUEsIDEsIG0pOw0KKyAgDQorICBtLkFkZFByb3AzMihOQ29kZXJQcm9wSUQ6OmtEaWN0aW9uYXJ5U2l6ZSwgMSA8PCAyMCk7DQorICBtLkFkZFByb3AzMihOQ29kZXJQcm9wSUQ6OmtOdW1GYXN0Qnl0ZXMsIDEyOCk7DQorICBtLkFkZFByb3AzMihOQ29kZXJQcm9wSUQ6OmtOdW1UaHJlYWRzLCAxKTsNCisgIG0uQWRkUHJvcDMyKE5Db2RlclByb3BJRDo6a0xpdFBvc0JpdHMsIDIpOw0KKyAgbS5BZGRQcm9wMzIoTkNvZGVyUHJvcElEOjprTGl0Q29udGV4dEJpdHMsIDApOw0KKyAgLy8gbS5BZGRQcm9wU3RyaW5nKE5Db2RlclByb3BJRDo6a01hdGNoRmluZGVyLCBMIkJUMiIpOw0KKw0KKyAgbW9kZS5NZXRob2RzLkFkZChtKTsNCisgIG1vZGUuTWV0aG9kcy5BZGQobSk7DQorICANCisgIENCaW5kIGJpbmQ7DQorICBiaW5kLk91dENvZGVyID0gMDsNCisgIGJpbmQuSW5TdHJlYW0gPSAwOw0KKyAgYmluZC5JbkNvZGVyID0gMTsgIGJpbmQuT3V0U3RyZWFtID0gMDsgIG1vZGUuQmluZHMuQWRkKGJpbmQpOw0KKyAgYmluZC5JbkNvZGVyID0gMjsgIGJpbmQuT3V0U3RyZWFtID0gMTsgIG1vZGUuQmluZHMuQWRkKGJpbmQpOw0KKyAgYmluZC5JbkNvZGVyID0gMzsgIGJpbmQuT3V0U3RyZWFtID0gMjsgIG1vZGUuQmluZHMuQWRkKGJpbmQpOw0KK30NCisNCitzdGF0aWMgdm9pZCBNYWtlRXhlTWV0aG9kKENDb21wcmVzc2lvbk1ldGhvZE1vZGUgJm1vZGUsDQorICAgIGJvb2wgdXNlRmlsdGVycywgYm9vbCBhZGRGaWx0ZXIsIGJvb2wgYmNqMkZpbHRlcikNCit7DQorICBpZiAoIW1vZGUuQmluZHMuSXNFbXB0eSgpIHx8ICF1c2VGaWx0ZXJzIHx8IG1vZGUuTWV0aG9kcy5TaXplKCkgPiAyKQ0KKyAgICByZXR1cm47DQorICBpZiAobW9kZS5NZXRob2RzLlNpemUoKSA9PSAyKQ0KKyAgew0KKyAgICBpZiAobW9kZS5NZXRob2RzWzBdLklkID09IGtfQkNKMikNCisgICAgICBBZGRCY2oyTWV0aG9kcyhtb2RlKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKCFhZGRGaWx0ZXIpDQorICAgIHJldHVybjsNCisgIGJjajJGaWx0ZXIgPSBiY2oyRmlsdGVyOw0KKyAgI2lmZGVmIFVTRV84Nl9GSUxURVINCisgIGlmIChiY2oyRmlsdGVyKQ0KKyAgew0KKyAgICBDTWV0aG9kRnVsbCBtOw0KKyAgICBHZXRNZXRob2RGdWxsKGtfQkNKMiwgNCwgbSk7DQorICAgIG1vZGUuTWV0aG9kcy5JbnNlcnQoMCwgbSk7DQorICAgIEFkZEJjajJNZXRob2RzKG1vZGUpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBDTWV0aG9kRnVsbCBtOw0KKyAgICBHZXRNZXRob2RGdWxsKGtfQkNKLCAxLCBtKTsNCisgICAgbW9kZS5NZXRob2RzLkluc2VydCgwLCBtKTsNCisgICAgQ0JpbmQgYmluZDsNCisgICAgYmluZC5PdXRDb2RlciA9IDA7DQorICAgIGJpbmQuSW5TdHJlYW0gPSAwOw0KKyAgICBiaW5kLkluQ29kZXIgPSAxOw0KKyAgICBiaW5kLk91dFN0cmVhbSA9IDA7DQorICAgIG1vZGUuQmluZHMuQWRkKGJpbmQpOw0KKyAgfQ0KKyAgI2VuZGlmDQorfQ0KKw0KKw0KK3N0YXRpYyB2b2lkIEZyb21VcGRhdGVJdGVtVG9GaWxlSXRlbShjb25zdCBDVXBkYXRlSXRlbSAmdWksDQorICAgIENGaWxlSXRlbSAmZmlsZSwgQ0ZpbGVJdGVtMiAmZmlsZTIpDQorew0KKyAgaWYgKHVpLkF0dHJpYkRlZmluZWQpDQorICAgIGZpbGUuU2V0QXR0cmliKHVpLkF0dHJpYik7DQorICANCisgIGZpbGUyLkNUaW1lID0gdWkuQ1RpbWU7ICBmaWxlMi5DVGltZURlZmluZWQgPSB1aS5DVGltZURlZmluZWQ7DQorICBmaWxlMi5BVGltZSA9IHVpLkFUaW1lOyAgZmlsZTIuQVRpbWVEZWZpbmVkID0gdWkuQVRpbWVEZWZpbmVkOw0KKyAgZmlsZTIuTVRpbWUgPSB1aS5NVGltZTsgIGZpbGUyLk1UaW1lRGVmaW5lZCA9IHVpLk1UaW1lRGVmaW5lZDsNCisgIGZpbGUyLklzQW50aSA9IHVpLklzQW50aTsNCisgIC8vIGZpbGUyLklzQXV4ID0gZmFsc2U7DQorICBmaWxlMi5TdGFydFBvc0RlZmluZWQgPSBmYWxzZTsNCisNCisgIGZpbGUuU2l6ZSA9IHVpLlNpemU7DQorICBmaWxlLklzRGlyID0gdWkuSXNEaXI7DQorICBmaWxlLkhhc1N0cmVhbSA9IHVpLkhhc1N0cmVhbSgpOw0KKyAgLy8gZmlsZS5Jc0FsdFN0cmVhbSA9IHVpLklzQWx0U3RyZWFtOw0KK30NCisNCitjbGFzcyBDRm9sZGVyT3V0U3RyZWFtMjoNCisgIHB1YmxpYyBJU2VxdWVudGlhbE91dFN0cmVhbSwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KKyAgQ091dFN0cmVhbVdpdGhDUkMgKl9jcmNTdHJlYW1TcGVjOw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsT3V0U3RyZWFtPiBfY3JjU3RyZWFtOw0KKyAgY29uc3QgQ0RiRXggKl9kYjsNCisgIGNvbnN0IENCb29sVmVjdG9yICpfZXh0cmFjdFN0YXR1c2VzOw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsT3V0U3RyZWFtPiBfb3V0U3RyZWFtOw0KKyAgVUludDMyIF9zdGFydEluZGV4Ow0KKyAgdW5zaWduZWQgX2N1cnJlbnRJbmRleDsNCisgIGJvb2wgX2ZpbGVJc09wZW47DQorICBVSW50NjQgX3JlbTsNCisNCisgIHZvaWQgT3BlbkZpbGUoKTsNCisgIHZvaWQgQ2xvc2VGaWxlKCk7DQorICBIUkVTVUxUIENsb3NlRmlsZUFuZFNldFJlc3VsdCgpOw0KKyAgSFJFU1VMVCBQcm9jZXNzRW1wdHlGaWxlcygpOw0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QDQorICANCisgIENGb2xkZXJPdXRTdHJlYW0yKCkNCisgIHsNCisgICAgX2NyY1N0cmVhbVNwZWMgPSBuZXcgQ091dFN0cmVhbVdpdGhDUkM7DQorICAgIF9jcmNTdHJlYW0gPSBfY3JjU3RyZWFtU3BlYzsNCisgIH0NCisNCisgIEhSRVNVTFQgSW5pdChjb25zdCBDRGJFeCAqZGIsIFVJbnQzMiBzdGFydEluZGV4LA0KKyAgICAgIGNvbnN0IENCb29sVmVjdG9yICpleHRyYWN0U3RhdHVzZXMsIElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0pOw0KKyAgdm9pZCBSZWxlYXNlT3V0U3RyZWFtKCk7DQorICBIUkVTVUxUIENoZWNrRmluaXNoZWRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIChfY3VycmVudEluZGV4ID09IF9leHRyYWN0U3RhdHVzZXMtPlNpemUoKSkgPyBTX09LOiBFX0ZBSUw7IH0NCisNCisgIFNURE1FVEhPRChXcml0ZSkoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorfTsNCisNCitIUkVTVUxUIENGb2xkZXJPdXRTdHJlYW0yOjpJbml0KGNvbnN0IENEYkV4ICpkYiwgVUludDMyIHN0YXJ0SW5kZXgsDQorICAgIGNvbnN0IENCb29sVmVjdG9yICpleHRyYWN0U3RhdHVzZXMsIElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0pDQorew0KKyAgX2RiID0gZGI7DQorICBfc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7DQorICBfZXh0cmFjdFN0YXR1c2VzID0gZXh0cmFjdFN0YXR1c2VzOw0KKyAgX291dFN0cmVhbSA9IG91dFN0cmVhbTsNCisNCisgIF9jdXJyZW50SW5kZXggPSAwOw0KKyAgX2ZpbGVJc09wZW4gPSBmYWxzZTsNCisgIHJldHVybiBQcm9jZXNzRW1wdHlGaWxlcygpOw0KK30NCisNCit2b2lkIENGb2xkZXJPdXRTdHJlYW0yOjpSZWxlYXNlT3V0U3RyZWFtKCkNCit7DQorICBfb3V0U3RyZWFtLlJlbGVhc2UoKTsNCisgIF9jcmNTdHJlYW1TcGVjLT5SZWxlYXNlU3RyZWFtKCk7DQorfQ0KKw0KK3ZvaWQgQ0ZvbGRlck91dFN0cmVhbTI6Ok9wZW5GaWxlKCkNCit7DQorICBfY3JjU3RyZWFtU3BlYy0+U2V0U3RyZWFtKCgqX2V4dHJhY3RTdGF0dXNlcylbX2N1cnJlbnRJbmRleF0gPyBfb3V0U3RyZWFtIDogTlVMTCk7DQorICBfY3JjU3RyZWFtU3BlYy0+SW5pdCh0cnVlKTsNCisgIF9maWxlSXNPcGVuID0gdHJ1ZTsNCisgIF9yZW0gPSBfZGItPkZpbGVzW19zdGFydEluZGV4ICsgX2N1cnJlbnRJbmRleF0uU2l6ZTsNCit9DQorDQordm9pZCBDRm9sZGVyT3V0U3RyZWFtMjo6Q2xvc2VGaWxlKCkNCit7DQorICBfY3JjU3RyZWFtU3BlYy0+UmVsZWFzZVN0cmVhbSgpOw0KKyAgX2ZpbGVJc09wZW4gPSBmYWxzZTsNCisgIF9jdXJyZW50SW5kZXgrKzsNCit9DQorDQorSFJFU1VMVCBDRm9sZGVyT3V0U3RyZWFtMjo6Q2xvc2VGaWxlQW5kU2V0UmVzdWx0KCkNCit7DQorICBjb25zdCBDRmlsZUl0ZW0gJmZpbGUgPSBfZGItPkZpbGVzW19zdGFydEluZGV4ICsgX2N1cnJlbnRJbmRleF07DQorICBDbG9zZUZpbGUoKTsNCisgIHJldHVybiAoZmlsZS5Jc0RpciB8fCAhZmlsZS5DcmNEZWZpbmVkIHx8IGZpbGUuQ3JjID09IF9jcmNTdHJlYW1TcGVjLT5HZXRDUkMoKSkgPyBTX09LOiBTX0ZBTFNFOw0KK30NCisNCitIUkVTVUxUIENGb2xkZXJPdXRTdHJlYW0yOjpQcm9jZXNzRW1wdHlGaWxlcygpDQorew0KKyAgd2hpbGUgKF9jdXJyZW50SW5kZXggPCBfZXh0cmFjdFN0YXR1c2VzLT5TaXplKCkgJiYgX2RiLT5GaWxlc1tfc3RhcnRJbmRleCArIF9jdXJyZW50SW5kZXhdLlNpemUgPT0gMCkNCisgIHsNCisgICAgT3BlbkZpbGUoKTsNCisgICAgUklOT0soQ2xvc2VGaWxlQW5kU2V0UmVzdWx0KCkpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRm9sZGVyT3V0U3RyZWFtMjo6V3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSAhPSBOVUxMKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IDA7DQorICB3aGlsZSAoc2l6ZSAhPSAwKQ0KKyAgew0KKyAgICBpZiAoX2ZpbGVJc09wZW4pDQorICAgIHsNCisgICAgICBVSW50MzIgY3VyID0gc2l6ZSA8IF9yZW0gPyBzaXplIDogKFVJbnQzMilfcmVtOw0KKyAgICAgIFJJTk9LKF9jcmNTdHJlYW0tPldyaXRlKGRhdGEsIGN1ciwgJmN1cikpOw0KKyAgICAgIGlmIChjdXIgPT0gMCkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRhdGEgPSAoY29uc3QgQnl0ZSAqKWRhdGEgKyBjdXI7DQorICAgICAgc2l6ZSAtPSBjdXI7DQorICAgICAgX3JlbSAtPSBjdXI7DQorICAgICAgaWYgKHByb2Nlc3NlZFNpemUgIT0gTlVMTCkNCisgICAgICAgICpwcm9jZXNzZWRTaXplICs9IGN1cjsNCisgICAgICBpZiAoX3JlbSA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgIFJJTk9LKENsb3NlRmlsZUFuZFNldFJlc3VsdCgpKTsNCisgICAgICAgIFJJTk9LKFByb2Nlc3NFbXB0eUZpbGVzKCkpOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIFJJTk9LKFByb2Nlc3NFbXB0eUZpbGVzKCkpOw0KKyAgICAgIGlmIChfY3VycmVudEluZGV4ID09IF9leHRyYWN0U3RhdHVzZXMtPlNpemUoKSkNCisgICAgICB7DQorICAgICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IHBhcnRpYWwgZXh0cmFjdGluZw0KKyAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICB9DQorICAgICAgT3BlbkZpbGUoKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK2NsYXNzIENUaHJlYWREZWNvZGVyOiBwdWJsaWMgQ1ZpcnRUaHJlYWQNCit7DQorcHVibGljOg0KKyAgSFJFU1VMVCBSZXN1bHQ7DQorICBDTXlDb21QdHI8SUluU3RyZWFtPiBJblN0cmVhbTsNCisNCisgIENGb2xkZXJPdXRTdHJlYW0yICpGb3NTcGVjOw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsT3V0U3RyZWFtPiBGb3M7DQorDQorICBVSW50NjQgU3RhcnRQb3M7DQorICBjb25zdCBDRm9sZGVycyAqRm9sZGVyczsNCisgIGludCBGb2xkZXJJbmRleDsNCisgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgQ015Q29tUHRyPElDcnlwdG9HZXRUZXh0UGFzc3dvcmQ+IGdldFRleHRQYXNzd29yZDsNCisgICNlbmRpZg0KKw0KKyAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMyOw0KKyAgQ0RlY29kZXIgRGVjb2RlcjsNCisNCisgICNpZm5kZWYgXzdaSVBfU1QNCisgIGJvb2wgTXRNb2RlOw0KKyAgVUludDMyIE51bVRocmVhZHM7DQorICAjZW5kaWYNCisNCisgIENUaHJlYWREZWNvZGVyKCk6DQorICAgIERlY29kZXIodHJ1ZSkNCisgIHsNCisgICAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgICBNdE1vZGUgPSBmYWxzZTsNCisgICAgTnVtVGhyZWFkcyA9IDE7DQorICAgICNlbmRpZg0KKyAgICBGb3NTcGVjID0gbmV3IENGb2xkZXJPdXRTdHJlYW0yOw0KKyAgICBGb3MgPSBGb3NTcGVjOw0KKyAgICBSZXN1bHQgPSBFX0ZBSUw7DQorICB9DQorICB+Q1RocmVhZERlY29kZXIoKSB7IENWaXJ0VGhyZWFkOjpXYWl0VGhyZWFkRmluaXNoKCk7IH0NCisgIHZpcnR1YWwgdm9pZCBFeGVjdXRlKCk7DQorfTsNCisNCit2b2lkIENUaHJlYWREZWNvZGVyOjpFeGVjdXRlKCkNCit7DQorICB0cnkNCisgIHsNCisgICAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICAgICAgYm9vbCBpc0VuY3J5cHRlZCA9IGZhbHNlOw0KKyAgICAgIGJvb2wgcGFzc3dvcmRJc0RlZmluZWQgPSBmYWxzZTsNCisgICAgI2VuZGlmDQorICAgIA0KKyAgICBSZXN1bHQgPSBEZWNvZGVyLkRlY29kZSgNCisgICAgICBFWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgICBJblN0cmVhbSwNCisgICAgICBTdGFydFBvcywNCisgICAgICAqRm9sZGVycywgRm9sZGVySW5kZXgsDQorICAgICAgRm9zLA0KKyAgICAgIE5VTEwNCisgICAgICBfN1pfREVDT0RFUl9DUllQUk9fVkFSUw0KKyAgICAgICNpZm5kZWYgXzdaSVBfU1QNCisgICAgICAgICwgTXRNb2RlLCBOdW1UaHJlYWRzDQorICAgICAgI2VuZGlmDQorICAgICAgKTsNCisgIH0NCisgIGNhdGNoKC4uLikNCisgIHsNCisgICAgUmVzdWx0ID0gRV9GQUlMOw0KKyAgfQ0KKyAgaWYgKFJlc3VsdCA9PSBTX09LKQ0KKyAgICBSZXN1bHQgPSBGb3NTcGVjLT5DaGVja0ZpbmlzaGVkU3RhdGUoKTsNCisgIEZvc1NwZWMtPlJlbGVhc2VPdXRTdHJlYW0oKTsNCit9DQorDQorYm9vbCBzdGF0aWMgSXM4NkZpbHRlcmVkRm9sZGVyKGNvbnN0IENGb2xkZXIgJmYpDQorew0KKyAgRk9SX1ZFQ1RPUihpLCBmLkNvZGVycykNCisgIHsNCisgICAgQ01ldGhvZElkIG0gPSBmLkNvZGVyc1tpXS5NZXRob2RJRDsNCisgICAgaWYgKG0gPT0ga19CQ0ogfHwgbSA9PSBrX0JDSjIpDQorICAgICAgcmV0dXJuIHRydWU7DQorICB9DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KKyNpZm5kZWYgX05PX0NSWVBUTw0KKw0KK2NsYXNzIENDcnlwdG9HZXRUZXh0UGFzc3dvcmQ6DQorICBwdWJsaWMgSUNyeXB0b0dldFRleHRQYXNzd29yZCwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KK3B1YmxpYzoNCisgIFVTdHJpbmcgUGFzc3dvcmQ7DQorDQorICBNWV9VTktOT1dOX0lNUA0KKyAgU1RETUVUSE9EKENyeXB0b0dldFRleHRQYXNzd29yZCkoQlNUUiAqcGFzc3dvcmQpOw0KK307DQorDQorU1RETUVUSE9ESU1QIENDcnlwdG9HZXRUZXh0UGFzc3dvcmQ6OkNyeXB0b0dldFRleHRQYXNzd29yZChCU1RSICpwYXNzd29yZCkNCit7DQorICByZXR1cm4gU3RyaW5nVG9Cc3RyKFBhc3N3b3JkLCBwYXNzd29yZCk7DQorfQ0KKw0KKyNlbmRpZg0KKw0KK3N0YXRpYyBjb25zdCBpbnQga051bUdyb3Vwc01heCA9IDQ7DQorDQorc3RhdGljIGJvb2wgSXM4Nkdyb3VwKGludCBncm91cCkgeyByZXR1cm4gKGdyb3VwICYgMSkgIT0gMDsgfQ0KK3N0YXRpYyBib29sIElzRW5jcnlwdGVkR3JvdXAoaW50IGdyb3VwKSB7IHJldHVybiAoZ3JvdXAgJiAyKSAhPSAwOyB9DQorc3RhdGljIGludCBHZXRHcm91cEluZGV4KGJvb2wgZW5jcnlwdGVkLCBpbnQgYmNqRmlsdGVyZWQpDQorICB7IHJldHVybiAoZW5jcnlwdGVkID8gMiA6IDApICsgKGJjakZpbHRlcmVkID8gMSA6IDApOyB9DQorDQorc3RhdGljIHZvaWQgR2V0RmlsZShjb25zdCBDRGF0YWJhc2UgJmluRGIsIGludCBpbmRleCwgQ0ZpbGVJdGVtICZmaWxlLCBDRmlsZUl0ZW0yICZmaWxlMikNCit7DQorICBmaWxlID0gaW5EYi5GaWxlc1tpbmRleF07DQorICBmaWxlMi5DVGltZURlZmluZWQgPSBpbkRiLkNUaW1lLkdldEl0ZW0oaW5kZXgsIGZpbGUyLkNUaW1lKTsNCisgIGZpbGUyLkFUaW1lRGVmaW5lZCA9IGluRGIuQVRpbWUuR2V0SXRlbShpbmRleCwgZmlsZTIuQVRpbWUpOw0KKyAgZmlsZTIuTVRpbWVEZWZpbmVkID0gaW5EYi5NVGltZS5HZXRJdGVtKGluZGV4LCBmaWxlMi5NVGltZSk7DQorICBmaWxlMi5TdGFydFBvc0RlZmluZWQgPSBpbkRiLlN0YXJ0UG9zLkdldEl0ZW0oaW5kZXgsIGZpbGUyLlN0YXJ0UG9zKTsNCisgIGZpbGUyLklzQW50aSA9IGluRGIuSXNJdGVtQW50aShpbmRleCk7DQorICAvLyBmaWxlMi5Jc0F1eCA9IGluRGIuSXNJdGVtQXV4KGluZGV4KTsNCit9DQorDQorSFJFU1VMVCBVcGRhdGUoDQorICAgIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgIElJblN0cmVhbSAqaW5TdHJlYW0sDQorICAgIGNvbnN0IENEYkV4ICpkYiwNCisgICAgY29uc3QgQ09iamVjdFZlY3RvcjxDVXBkYXRlSXRlbT4gJnVwZGF0ZUl0ZW1zLA0KKyAgICAvLyBjb25zdCBDT2JqZWN0VmVjdG9yPENUcmVlRm9sZGVyPiAmdHJlZUZvbGRlcnMsDQorICAgIC8vIGNvbnN0IENVbmlxQmxvY2tzICZzZWN1cmVCbG9ja3MsDQorICAgIENPdXRBcmNoaXZlICZhcmNoaXZlLA0KKyAgICBDQXJjaGl2ZURhdGFiYXNlT3V0ICZuZXdEYXRhYmFzZSwNCisgICAgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKnNlcU91dFN0cmVhbSwNCisgICAgSUFyY2hpdmVVcGRhdGVDYWxsYmFjayAqdXBkYXRlQ2FsbGJhY2ssDQorICAgIGNvbnN0IENVcGRhdGVPcHRpb25zICZvcHRpb25zDQorICAgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgICAsIElDcnlwdG9HZXRUZXh0UGFzc3dvcmQgKmdldERlY29kZXJQYXNzd29yZA0KKyAgICAjZW5kaWYNCisgICAgKQ0KK3sNCisgIFVJbnQ2NCBudW1Tb2xpZEZpbGVzID0gb3B0aW9ucy5OdW1Tb2xpZEZpbGVzOw0KKyAgaWYgKG51bVNvbGlkRmlsZXMgPT0gMCkNCisgICAgbnVtU29saWRGaWxlcyA9IDE7DQorDQorICAvLyBzaXplX3QgdG90YWxTZWN1cmVEYXRhU2l6ZSA9IChzaXplX3Qpc2VjdXJlQmxvY2tzLkdldFRvdGFsU2l6ZUluQnl0ZXMoKTsNCisNCisgIC8qDQorICBDTXlDb21QdHI8SU91dFN0cmVhbT4gb3V0U3RyZWFtOw0KKyAgUklOT0soc2VxT3V0U3RyZWFtLT5RdWVyeUludGVyZmFjZShJSURfSU91dFN0cmVhbSwgKHZvaWQgKiopJm91dFN0cmVhbSkpOw0KKyAgaWYgKCFvdXRTdHJlYW0pDQorICAgIHJldHVybiBFX05PVElNUEw7DQorICAqLw0KKw0KKyAgVUludDY0IHN0YXJ0QmxvY2tTaXplID0gZGIgIT0gMCA/IGRiLT5BcmNJbmZvLlN0YXJ0UG9zaXRpb246IDA7DQorICBpZiAoc3RhcnRCbG9ja1NpemUgPiAwICYmICFvcHRpb25zLlJlbW92ZVNmeEJsb2NrKQ0KKyAgew0KKyAgICBSSU5PSyhXcml0ZVJhbmdlKGluU3RyZWFtLCBzZXFPdXRTdHJlYW0sIDAsIHN0YXJ0QmxvY2tTaXplLCBOVUxMKSk7DQorICB9DQorDQorICBDSW50QXJyIGZpbGVJbmRleFRvVXBkYXRlSW5kZXhNYXA7DQorICBDUmVjb3JkVmVjdG9yPENGb2xkZXJSZXBhY2s+IGZvbGRlclJlZnM7DQorICBVSW50NjQgY29tcGxleGl0eSA9IDA7DQorICBVSW50NjQgaW5TaXplRm9yUmVkdWNlMiA9IDA7DQorICBib29sIG5lZWRFbmNyeXB0ZWRSZXBhY2sgPSBmYWxzZTsNCisgIGlmIChkYiAhPSAwKQ0KKyAgew0KKyAgICBmaWxlSW5kZXhUb1VwZGF0ZUluZGV4TWFwLkFsbG9jKGRiLT5GaWxlcy5TaXplKCkpOw0KKyAgICB1bnNpZ25lZCBpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZGItPkZpbGVzLlNpemUoKTsgaSsrKQ0KKyAgICAgIGZpbGVJbmRleFRvVXBkYXRlSW5kZXhNYXBbaV0gPSAtMTsNCisNCisgICAgZm9yIChpID0gMDsgaSA8IHVwZGF0ZUl0ZW1zLlNpemUoKTsgaSsrKQ0KKyAgICB7DQorICAgICAgaW50IGluZGV4ID0gdXBkYXRlSXRlbXNbaV0uSW5kZXhJbkFyY2hpdmU7DQorICAgICAgaWYgKGluZGV4ICE9IC0xKQ0KKyAgICAgICAgZmlsZUluZGV4VG9VcGRhdGVJbmRleE1hcFtpbmRleF0gPSBpOw0KKyAgICB9DQorDQorICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWRiLT5OdW1Gb2xkZXJzOyBpKyspDQorICAgIHsNCisgICAgICBDTnVtIGluZGV4SW5Gb2xkZXIgPSAwOw0KKyAgICAgIENOdW0gbnVtQ29weUl0ZW1zID0gMDsNCisgICAgICBDTnVtIG51bVVucGFja1N0cmVhbXMgPSBkYi0+TnVtVW5wYWNrU3RyZWFtc1ZlY3RvcltpXTsNCisgICAgICBVSW50NjQgcmVwYWNrU2l6ZSA9IDA7DQorICAgICAgZm9yIChDTnVtIGZpID0gZGItPkZvbGRlclN0YXJ0RmlsZUluZGV4W2ldOyBpbmRleEluRm9sZGVyIDwgbnVtVW5wYWNrU3RyZWFtczsgZmkrKykNCisgICAgICB7DQorICAgICAgICBjb25zdCBDRmlsZUl0ZW0gJmZpbGUgPSBkYi0+RmlsZXNbZmldOw0KKyAgICAgICAgaWYgKGZpbGUuSGFzU3RyZWFtKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpbmRleEluRm9sZGVyKys7DQorICAgICAgICAgIGludCB1cGRhdGVJbmRleCA9IGZpbGVJbmRleFRvVXBkYXRlSW5kZXhNYXBbZmldOw0KKyAgICAgICAgICBpZiAodXBkYXRlSW5kZXggPj0gMCAmJiAhdXBkYXRlSXRlbXNbdXBkYXRlSW5kZXhdLk5ld0RhdGEpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBudW1Db3B5SXRlbXMrKzsNCisgICAgICAgICAgICByZXBhY2tTaXplICs9IGZpbGUuU2l6ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBpZiAobnVtQ29weUl0ZW1zID09IDApDQorICAgICAgICBjb250aW51ZTsNCisNCisgICAgICBDRm9sZGVyUmVwYWNrIHJlcDsNCisgICAgICByZXAuRm9sZGVySW5kZXggPSBpOw0KKyAgICAgIHJlcC5OdW1Db3B5RmlsZXMgPSBudW1Db3B5SXRlbXM7DQorICAgICAgQ0ZvbGRlciBmOw0KKyAgICAgIGRiLT5QYXJzZUZvbGRlckluZm8oaSwgZik7DQorICAgICAgYm9vbCBpc0VuY3J5cHRlZCA9IGYuSXNFbmNyeXB0ZWQoKTsNCisgICAgICByZXAuR3JvdXAgPSBHZXRHcm91cEluZGV4KGlzRW5jcnlwdGVkLCBJczg2RmlsdGVyZWRGb2xkZXIoZikpOw0KKyAgICAgIGZvbGRlclJlZnMuQWRkKHJlcCk7DQorICAgICAgaWYgKG51bUNvcHlJdGVtcyA9PSBudW1VbnBhY2tTdHJlYW1zKQ0KKyAgICAgICAgY29tcGxleGl0eSArPSBkYi0+R2V0Rm9sZGVyRnVsbFBhY2tTaXplKGkpOw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBjb21wbGV4aXR5ICs9IHJlcGFja1NpemU7DQorICAgICAgICBpZiAocmVwYWNrU2l6ZSA+IGluU2l6ZUZvclJlZHVjZTIpDQorICAgICAgICAgIGluU2l6ZUZvclJlZHVjZTIgPSByZXBhY2tTaXplOw0KKyAgICAgICAgaWYgKGlzRW5jcnlwdGVkKQ0KKyAgICAgICAgICBuZWVkRW5jcnlwdGVkUmVwYWNrID0gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgZm9sZGVyUmVmcy5Tb3J0KENvbXBhcmVGb2xkZXJSZXBhY2tzLCAodm9pZCAqKWRiKTsNCisgIH0NCisNCisgIFVJbnQ2NCBpblNpemVGb3JSZWR1Y2UgPSAwOw0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCB1cGRhdGVJdGVtcy5TaXplKCk7IGkrKykNCisgIHsNCisgICAgY29uc3QgQ1VwZGF0ZUl0ZW0gJnVpID0gdXBkYXRlSXRlbXNbaV07DQorICAgIGlmICh1aS5OZXdEYXRhKQ0KKyAgICB7DQorICAgICAgY29tcGxleGl0eSArPSB1aS5TaXplOw0KKyAgICAgIGlmIChudW1Tb2xpZEZpbGVzICE9IDEpDQorICAgICAgICBpblNpemVGb3JSZWR1Y2UgKz0gdWkuU2l6ZTsNCisgICAgICBlbHNlIGlmICh1aS5TaXplID4gaW5TaXplRm9yUmVkdWNlKQ0KKyAgICAgICAgaW5TaXplRm9yUmVkdWNlID0gdWkuU2l6ZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKGluU2l6ZUZvclJlZHVjZTIgPiBpblNpemVGb3JSZWR1Y2UpDQorICAgIGluU2l6ZUZvclJlZHVjZSA9IGluU2l6ZUZvclJlZHVjZTI7DQorDQorICBSSU5PSyh1cGRhdGVDYWxsYmFjay0+U2V0VG90YWwoY29tcGxleGl0eSkpOw0KKw0KKyAgQ0xvY2FsUHJvZ3Jlc3MgKmxwcyA9IG5ldyBDTG9jYWxQcm9ncmVzczsNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NQcm9ncmVzc0luZm8+IHByb2dyZXNzID0gbHBzOw0KKyAgbHBzLT5Jbml0KHVwZGF0ZUNhbGxiYWNrLCB0cnVlKTsNCisNCisgIENTdHJlYW1CaW5kZXIgc2I7DQorICBSSU5PSyhzYi5DcmVhdGVFdmVudHMoKSk7DQorDQorICBDVGhyZWFkRGVjb2RlciB0aHJlYWREZWNvZGVyOw0KKyAgaWYgKCFmb2xkZXJSZWZzLklzRW1wdHkoKSkNCisgIHsNCisgICAgI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKyAgICB0aHJlYWREZWNvZGVyLl9fZXh0ZXJuYWxDb2RlY3MgPSBfX2V4dGVybmFsQ29kZWNzOw0KKyAgICAjZW5kaWYNCisgICAgUklOT0sodGhyZWFkRGVjb2Rlci5DcmVhdGUoKSk7DQorICB9DQorDQorICBDT2JqZWN0VmVjdG9yPENTb2xpZEdyb3VwPiBncm91cHM7DQorICBmb3IgKGkgPSAwOyBpIDwga051bUdyb3Vwc01heDsgaSsrKQ0KKyAgICBncm91cHMuQWRkTmV3KCk7DQorDQorICB7DQorICAgIC8vIC0tLS0tLS0tLS0gU3BsaXQgZmlsZXMgdG8gZ3JvdXBzIC0tLS0tLS0tLS0NCisNCisgICAgYm9vbCB1c2VGaWx0ZXJzID0gb3B0aW9ucy5Vc2VGaWx0ZXJzOw0KKyAgICBjb25zdCBDQ29tcHJlc3Npb25NZXRob2RNb2RlICZtZXRob2QgPSAqb3B0aW9ucy5NZXRob2Q7DQorICAgIGlmIChtZXRob2QuTWV0aG9kcy5TaXplKCkgIT0gMSB8fCBtZXRob2QuQmluZHMuU2l6ZSgpICE9IDApDQorICAgICAgdXNlRmlsdGVycyA9IGZhbHNlOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgdXBkYXRlSXRlbXMuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBjb25zdCBDVXBkYXRlSXRlbSAmdWkgPSB1cGRhdGVJdGVtc1tpXTsNCisgICAgICBpZiAoIXVpLk5ld0RhdGEgfHwgIXVpLkhhc1N0cmVhbSgpKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgYm9vbCBmaWx0ZXJlZEdyb3VwID0gZmFsc2U7DQorICAgICAgaWYgKHVzZUZpbHRlcnMpDQorICAgICAgew0KKyAgICAgICAgaW50IGRvdFBvcyA9IHVpLk5hbWUuUmV2ZXJzZUZpbmQoTCcuJyk7DQorICAgICAgICBpZiAoZG90UG9zID49IDApDQorICAgICAgICAgIGZpbHRlcmVkR3JvdXAgPSBJc0V4ZUV4dCh1aS5OYW1lLlB0cihkb3RQb3MgKyAxKSk7DQorICAgICAgfQ0KKyAgICAgIGdyb3Vwc1tHZXRHcm91cEluZGV4KG1ldGhvZC5QYXNzd29yZElzRGVmaW5lZCwgZmlsdGVyZWRHcm91cCldLkluZGljZXMuQWRkKGkpOw0KKyAgICB9DQorICB9DQorDQorICAjaWZuZGVmIF9OT19DUllQVE8NCisNCisgIENDcnlwdG9HZXRUZXh0UGFzc3dvcmQgKmdldFBhc3N3b3JkU3BlYyA9IE5VTEw7DQorICBpZiAobmVlZEVuY3J5cHRlZFJlcGFjaykNCisgIHsNCisgICAgZ2V0UGFzc3dvcmRTcGVjID0gbmV3IENDcnlwdG9HZXRUZXh0UGFzc3dvcmQ7DQorICAgIHRocmVhZERlY29kZXIuZ2V0VGV4dFBhc3N3b3JkID0gZ2V0UGFzc3dvcmRTcGVjOw0KKw0KKyAgICBpZiAob3B0aW9ucy5NZXRob2QtPlBhc3N3b3JkSXNEZWZpbmVkKQ0KKyAgICAgIGdldFBhc3N3b3JkU3BlYy0+UGFzc3dvcmQgPSBvcHRpb25zLk1ldGhvZC0+UGFzc3dvcmQ7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGlmICghZ2V0RGVjb2RlclBhc3N3b3JkKQ0KKyAgICAgICAgcmV0dXJuIEVfTk9USU1QTDsNCisgICAgICBDTXlDb21CU1RSIHBhc3N3b3JkOw0KKyAgICAgIFJJTk9LKGdldERlY29kZXJQYXNzd29yZC0+Q3J5cHRvR2V0VGV4dFBhc3N3b3JkKCZwYXNzd29yZCkpOw0KKyAgICAgIGlmICgoQlNUUilwYXNzd29yZCkNCisgICAgICAgIGdldFBhc3N3b3JkU3BlYy0+UGFzc3dvcmQgPSBwYXNzd29yZDsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgI2VuZGlmDQorDQorICANCisgIC8vIC0tLS0tLS0tLS0gQ29tcHJlc3MgLS0tLS0tLS0tLQ0KKw0KKyAgUklOT0soYXJjaGl2ZS5DcmVhdGUoc2VxT3V0U3RyZWFtLCBmYWxzZSkpOw0KKyAgUklOT0soYXJjaGl2ZS5Ta2lwUHJlZml4QXJjaGl2ZUhlYWRlcigpKTsNCisNCisgIC8qDQorICBDSW50VmVjdG9yIHRyZWVGb2xkZXJUb0FyY0luZGV4Ow0KKyAgdHJlZUZvbGRlclRvQXJjSW5kZXguUmVzZXJ2ZSh0cmVlRm9sZGVycy5TaXplKCkpOw0KKyAgZm9yIChpID0gMDsgaSA8IHRyZWVGb2xkZXJzLlNpemUoKTsgaSsrKQ0KKyAgICB0cmVlRm9sZGVyVG9BcmNJbmRleC5BZGQoLTEpOw0KKyAgLy8gLS0tLS0tLS0tLSBXcml0ZSBUcmVlIChvbmx5IEFVWCBkaXJzKSAtLS0tLS0tLS0tDQorICBmb3IgKGkgPSAxOyBpIDwgdHJlZUZvbGRlcnMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIGNvbnN0IENUcmVlRm9sZGVyICZ0cmVlRm9sZGVyID0gdHJlZUZvbGRlcnNbaV07DQorICAgIENGaWxlSXRlbSBmaWxlOw0KKyAgICBDRmlsZUl0ZW0yIGZpbGUyOw0KKyAgICBmaWxlMi5Jbml0KCk7DQorICAgIGludCBzZWN1cmVJRCA9IDA7DQorICAgIGlmICh0cmVlRm9sZGVyLlVwZGF0ZUl0ZW1JbmRleCA8IDApDQorICAgIHsNCisgICAgICAvLyB3ZSBjYW4gc3RvcmUgdmlydHVhbCBkaXIgaXRlbSB3dXRob3V0IGF0dHJpYiwgYnV0IHdlIHdhbnQgYWxsIGl0ZW1zIGhhdmUgYXR0cmliLg0KKyAgICAgIGZpbGUuU2V0QXR0cmliKEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSk7DQorICAgICAgZmlsZTIuSXNBdXggPSB0cnVlOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGNvbnN0IENVcGRhdGVJdGVtICZ1aSA9IHVwZGF0ZUl0ZW1zW3RyZWVGb2xkZXIuVXBkYXRlSXRlbUluZGV4XTsNCisgICAgICAvLyBpZiBpdGVtIGlzIG5vdCBkaXIsIHRoZW4gaXQncyBwYXJlbnQgZm9yIGFsdCBzdHJlYW1zLg0KKyAgICAgIC8vIHdlIHdpbGwgd3JpdGUgc3VjaCBpdGVtcyBsYXRlcg0KKyAgICAgIGlmICghdWkuSXNEaXIpDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBzZWN1cmVJRCA9IHVpLlNlY3VyZUluZGV4Ow0KKyAgICAgIGlmICh1aS5OZXdQcm9wcykNCisgICAgICAgIEZyb21VcGRhdGVJdGVtVG9GaWxlSXRlbSh1aSwgZmlsZSwgZmlsZTIpOw0KKyAgICAgIGVsc2UNCisgICAgICAgIEdldEZpbGUoKmRiLCB1aS5JbmRleEluQXJjaGl2ZSwgZmlsZSwgZmlsZTIpOw0KKyAgICB9DQorICAgIGZpbGUuU2l6ZSA9IDA7DQorICAgIGZpbGUuSGFzU3RyZWFtID0gZmFsc2U7DQorICAgIGZpbGUuSXNEaXIgPSB0cnVlOw0KKyAgICBmaWxlLlBhcmVudCA9IHRyZWVGb2xkZXIuUGFyZW50Ow0KKyAgICANCisgICAgdHJlZUZvbGRlclRvQXJjSW5kZXhbaV0gPSBuZXdEYXRhYmFzZS5GaWxlcy5TaXplKCk7DQorICAgIG5ld0RhdGFiYXNlLkFkZEZpbGUoZmlsZSwgZmlsZTIsIHRyZWVGb2xkZXIuTmFtZSk7DQorICAgIA0KKyAgICBpZiAodG90YWxTZWN1cmVEYXRhU2l6ZSAhPSAwKQ0KKyAgICAgIG5ld0RhdGFiYXNlLlNlY3VyZUlEcy5BZGQoc2VjdXJlSUQpOw0KKyAgfQ0KKyAgKi8NCisNCisgIHsNCisgICAgLyogLS0tLS0tLS0tLSBXcml0ZSBub24tQVVYIGRpcnMgYW5kIEVtcHR5IGZpbGVzIC0tLS0tLS0tLS0gKi8NCisgICAgQ1JlY29yZFZlY3RvcjxpbnQ+IGVtcHR5UmVmczsNCisgICAgZm9yIChpID0gMDsgaSA8IHVwZGF0ZUl0ZW1zLlNpemUoKTsgaSsrKQ0KKyAgICB7DQorICAgICAgY29uc3QgQ1VwZGF0ZUl0ZW0gJnVpID0gdXBkYXRlSXRlbXNbaV07DQorICAgICAgaWYgKHVpLk5ld0RhdGEpDQorICAgICAgew0KKyAgICAgICAgaWYgKHVpLkhhc1N0cmVhbSgpKQ0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgZWxzZSBpZiAodWkuSW5kZXhJbkFyY2hpdmUgIT0gLTEgJiYgZGItPkZpbGVzW3VpLkluZGV4SW5BcmNoaXZlXS5IYXNTdHJlYW0pDQorICAgICAgICBjb250aW51ZTsNCisgICAgICAvKg0KKyAgICAgIGlmICh1aS5UcmVlRm9sZGVySW5kZXggPj0gMCkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICovDQorICAgICAgZW1wdHlSZWZzLkFkZChpKTsNCisgICAgfQ0KKyAgICBlbXB0eVJlZnMuU29ydChDb21wYXJlRW1wdHlJdGVtcywgKHZvaWQgKikmdXBkYXRlSXRlbXMpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZW1wdHlSZWZzLlNpemUoKTsgaSsrKQ0KKyAgICB7DQorICAgICAgY29uc3QgQ1VwZGF0ZUl0ZW0gJnVpID0gdXBkYXRlSXRlbXNbZW1wdHlSZWZzW2ldXTsNCisgICAgICBDRmlsZUl0ZW0gZmlsZTsNCisgICAgICBDRmlsZUl0ZW0yIGZpbGUyOw0KKyAgICAgIFVTdHJpbmcgbmFtZTsNCisgICAgICBpZiAodWkuTmV3UHJvcHMpDQorICAgICAgew0KKyAgICAgICAgRnJvbVVwZGF0ZUl0ZW1Ub0ZpbGVJdGVtKHVpLCBmaWxlLCBmaWxlMik7DQorICAgICAgICBuYW1lID0gdWkuTmFtZTsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIEdldEZpbGUoKmRiLCB1aS5JbmRleEluQXJjaGl2ZSwgZmlsZSwgZmlsZTIpOw0KKyAgICAgICAgZGItPkdldFBhdGgodWkuSW5kZXhJbkFyY2hpdmUsIG5hbWUpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICAvKg0KKyAgICAgIGlmICh0b3RhbFNlY3VyZURhdGFTaXplICE9IDApDQorICAgICAgICBuZXdEYXRhYmFzZS5TZWN1cmVJRHMuQWRkKHVpLlNlY3VyZUluZGV4KTsNCisgICAgICBmaWxlLlBhcmVudCA9IHVpLlBhcmVudEZvbGRlckluZGV4Ow0KKyAgICAgICovDQorICAgICAgbmV3RGF0YWJhc2UuQWRkRmlsZShmaWxlLCBmaWxlMiwgbmFtZSk7DQorICAgIH0NCisgIH0NCisNCisgIHVuc2lnbmVkIGZvbGRlclJlZkluZGV4ID0gMDsNCisgIGxwcy0+UHJvZ3Jlc3NPZmZzZXQgPSAwOw0KKw0KKyAgZm9yIChpbnQgZ3JvdXBJbmRleCA9IDA7IGdyb3VwSW5kZXggPCBrTnVtR3JvdXBzTWF4OyBncm91cEluZGV4KyspDQorICB7DQorICAgIGNvbnN0IENTb2xpZEdyb3VwICZncm91cCA9IGdyb3Vwc1tncm91cEluZGV4XTsNCisNCisgICAgQ0NvbXByZXNzaW9uTWV0aG9kTW9kZSBtZXRob2QgPSAqb3B0aW9ucy5NZXRob2Q7DQorICAgIE1ha2VFeGVNZXRob2QobWV0aG9kLCBvcHRpb25zLlVzZUZpbHRlcnMsIElzODZHcm91cChncm91cEluZGV4KSwgb3B0aW9ucy5NYXhGaWx0ZXIpOw0KKw0KKyAgICBpZiAoSXNFbmNyeXB0ZWRHcm91cChncm91cEluZGV4KSkNCisgICAgew0KKyAgICAgIGlmICghbWV0aG9kLlBhc3N3b3JkSXNEZWZpbmVkKQ0KKyAgICAgIHsNCisgICAgICAgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgICAgICAgaWYgKGdldFBhc3N3b3JkU3BlYykNCisgICAgICAgICAgbWV0aG9kLlBhc3N3b3JkID0gZ2V0UGFzc3dvcmRTcGVjLT5QYXNzd29yZDsNCisgICAgICAgICNlbmRpZg0KKyAgICAgICAgbWV0aG9kLlBhc3N3b3JkSXNEZWZpbmVkID0gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgbWV0aG9kLlBhc3N3b3JkSXNEZWZpbmVkID0gZmFsc2U7DQorICAgICAgbWV0aG9kLlBhc3N3b3JkLkVtcHR5KCk7DQorICAgIH0NCisNCisgICAgQ0VuY29kZXIgZW5jb2RlcihtZXRob2QpOw0KKw0KKyAgICBmb3IgKDsgZm9sZGVyUmVmSW5kZXggPCBmb2xkZXJSZWZzLlNpemUoKTsgZm9sZGVyUmVmSW5kZXgrKykNCisgICAgew0KKyAgICAgIGNvbnN0IENGb2xkZXJSZXBhY2sgJnJlcCA9IGZvbGRlclJlZnNbZm9sZGVyUmVmSW5kZXhdOw0KKyAgICAgIGlmIChyZXAuR3JvdXAgIT0gZ3JvdXBJbmRleCkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGludCBmb2xkZXJJbmRleCA9IHJlcC5Gb2xkZXJJbmRleDsNCisgICAgICANCisgICAgICBpZiAocmVwLk51bUNvcHlGaWxlcyA9PSBkYi0+TnVtVW5wYWNrU3RyZWFtc1ZlY3Rvcltmb2xkZXJJbmRleF0pDQorICAgICAgew0KKyAgICAgICAgVUludDY0IHBhY2tTaXplID0gZGItPkdldEZvbGRlckZ1bGxQYWNrU2l6ZShmb2xkZXJJbmRleCk7DQorICAgICAgICBSSU5PSyhXcml0ZVJhbmdlKGluU3RyZWFtLCBhcmNoaXZlLlNlcVN0cmVhbSwNCisgICAgICAgICAgZGItPkdldEZvbGRlclN0cmVhbVBvcyhmb2xkZXJJbmRleCwgMCksIHBhY2tTaXplLCBwcm9ncmVzcykpOw0KKyAgICAgICAgbHBzLT5Qcm9ncmVzc09mZnNldCArPSBwYWNrU2l6ZTsNCisgICAgICAgIA0KKyAgICAgICAgQ0ZvbGRlciAmZm9sZGVyID0gbmV3RGF0YWJhc2UuRm9sZGVycy5BZGROZXcoKTsNCisgICAgICAgIGRiLT5QYXJzZUZvbGRlckluZm8oZm9sZGVySW5kZXgsIGZvbGRlcik7DQorICAgICAgICBDTnVtIHN0YXJ0SW5kZXggPSBkYi0+Rm9TdGFydFBhY2tTdHJlYW1JbmRleFtmb2xkZXJJbmRleF07DQorICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgZm9sZGVyLlBhY2tTdHJlYW1zLlNpemUoKTsgaisrKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBuZXdEYXRhYmFzZS5QYWNrU2l6ZXMuQWRkKGRiLT5HZXRTdHJlYW1QYWNrU2l6ZShzdGFydEluZGV4ICsgaikpOw0KKyAgICAgICAgICAvLyBuZXdEYXRhYmFzZS5QYWNrQ1JDc0RlZmluZWQuQWRkKGRiLlBhY2tDUkNzRGVmaW5lZFtzdGFydEluZGV4ICsgal0pOw0KKyAgICAgICAgICAvLyBuZXdEYXRhYmFzZS5QYWNrQ1JDcy5BZGQoZGIuUGFja0NSQ3Nbc3RhcnRJbmRleCArIGpdKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFVJbnQzMiBpbmRleFN0YXJ0ID0gZGItPkZvVG9Db2RlclVucGFja1NpemVzW2ZvbGRlckluZGV4XTsNCisgICAgICAgIFVJbnQzMiBpbmRleEVuZCA9IGRiLT5Gb1RvQ29kZXJVbnBhY2tTaXplc1tmb2xkZXJJbmRleCArIDFdOw0KKyAgICAgICAgZm9yICg7IGluZGV4U3RhcnQgPCBpbmRleEVuZDsgaW5kZXhTdGFydCsrKQ0KKyAgICAgICAgICBuZXdEYXRhYmFzZS5Db2RlclVucGFja1NpemVzLkFkZChkYi0+Q29kZXJVbnBhY2tTaXplc1tpbmRleFN0YXJ0XSk7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBDQm9vbFZlY3RvciBleHRyYWN0U3RhdHVzZXM7DQorICAgICAgICANCisgICAgICAgIENOdW0gbnVtVW5wYWNrU3RyZWFtcyA9IGRiLT5OdW1VbnBhY2tTdHJlYW1zVmVjdG9yW2ZvbGRlckluZGV4XTsNCisgICAgICAgIENOdW0gaW5kZXhJbkZvbGRlciA9IDA7DQorICAgICAgICANCisgICAgICAgIGZvciAoQ051bSBmaSA9IGRiLT5Gb2xkZXJTdGFydEZpbGVJbmRleFtmb2xkZXJJbmRleF07IGluZGV4SW5Gb2xkZXIgPCBudW1VbnBhY2tTdHJlYW1zOyBmaSsrKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBib29sIG5lZWRFeHRyYWN0ID0gZmFsc2U7DQorICAgICAgICAgIGlmIChkYi0+RmlsZXNbZmldLkhhc1N0cmVhbSkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGluZGV4SW5Gb2xkZXIrKzsNCisgICAgICAgICAgICBpbnQgdXBkYXRlSW5kZXggPSBmaWxlSW5kZXhUb1VwZGF0ZUluZGV4TWFwW2ZpXTsNCisgICAgICAgICAgICBpZiAodXBkYXRlSW5kZXggPj0gMCAmJiAhdXBkYXRlSXRlbXNbdXBkYXRlSW5kZXhdLk5ld0RhdGEpDQorICAgICAgICAgICAgICBuZWVkRXh0cmFjdCA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZXh0cmFjdFN0YXR1c2VzLkFkZChuZWVkRXh0cmFjdCk7DQorICAgICAgICB9DQorDQorICAgICAgICB1bnNpZ25lZCBzdGFydFBhY2tJbmRleCA9IG5ld0RhdGFiYXNlLlBhY2tTaXplcy5TaXplKCk7DQorICAgICAgICBVSW50NjQgY3VyVW5wYWNrU2l6ZTsNCisgICAgICAgIHsNCisgICAgICAgICAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IHNiSW5TdHJlYW07DQorICAgICAgICAgIHsNCisgICAgICAgICAgICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IHNiT3V0U3RyZWFtOw0KKyAgICAgICAgICAgIHNiLkNyZWF0ZVN0cmVhbXMoJnNiSW5TdHJlYW0sICZzYk91dFN0cmVhbSk7DQorICAgICAgICAgICAgc2IuUmVJbml0KCk7DQorICAgICAgICAgICAgUklOT0sodGhyZWFkRGVjb2Rlci5Gb3NTcGVjLT5Jbml0KGRiLCBkYi0+Rm9sZGVyU3RhcnRGaWxlSW5kZXhbZm9sZGVySW5kZXhdLCAmZXh0cmFjdFN0YXR1c2VzLCBzYk91dFN0cmVhbSkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIA0KKyAgICAgICAgICB0aHJlYWREZWNvZGVyLkluU3RyZWFtID0gaW5TdHJlYW07DQorICAgICAgICAgIHRocmVhZERlY29kZXIuRm9sZGVycyA9IChjb25zdCBDRm9sZGVycyAqKWRiOw0KKyAgICAgICAgICB0aHJlYWREZWNvZGVyLkZvbGRlckluZGV4ID0gZm9sZGVySW5kZXg7DQorICAgICAgICAgIHRocmVhZERlY29kZXIuU3RhcnRQb3MgPSBkYi0+QXJjSW5mby5EYXRhU3RhcnRQb3NpdGlvbjsgLy8gZGItPkdldEZvbGRlclN0cmVhbVBvcyhmb2xkZXJJbmRleCwgMCk7DQorICAgICAgICAgIA0KKyAgICAgICAgICB0aHJlYWREZWNvZGVyLlN0YXJ0KCk7DQorICAgICAgICAgIA0KKyAgICAgICAgICBSSU5PSyhlbmNvZGVyLkVuY29kZSgNCisgICAgICAgICAgICAgIEVYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICAgICAgICAgICAgc2JJblN0cmVhbSwgTlVMTCwgJmluU2l6ZUZvclJlZHVjZSwNCisgICAgICAgICAgICAgIG5ld0RhdGFiYXNlLkZvbGRlcnMuQWRkTmV3KCksIG5ld0RhdGFiYXNlLkNvZGVyVW5wYWNrU2l6ZXMsIGN1clVucGFja1NpemUsDQorICAgICAgICAgICAgICBhcmNoaXZlLlNlcVN0cmVhbSwgbmV3RGF0YWJhc2UuUGFja1NpemVzLCBwcm9ncmVzcykpOw0KKyAgICAgICAgICANCisgICAgICAgICAgdGhyZWFkRGVjb2Rlci5XYWl0RXhlY3V0ZUZpbmlzaCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgUklOT0sodGhyZWFkRGVjb2Rlci5SZXN1bHQpOw0KKw0KKyAgICAgICAgZm9yICg7IHN0YXJ0UGFja0luZGV4IDwgbmV3RGF0YWJhc2UuUGFja1NpemVzLlNpemUoKTsgc3RhcnRQYWNrSW5kZXgrKykNCisgICAgICAgICAgbHBzLT5PdXRTaXplICs9IG5ld0RhdGFiYXNlLlBhY2tTaXplc1tzdGFydFBhY2tJbmRleF07DQorICAgICAgICBscHMtPkluU2l6ZSArPSBjdXJVbnBhY2tTaXplOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBuZXdEYXRhYmFzZS5OdW1VbnBhY2tTdHJlYW1zVmVjdG9yLkFkZChyZXAuTnVtQ29weUZpbGVzKTsNCisgICAgICANCisgICAgICBDTnVtIG51bVVucGFja1N0cmVhbXMgPSBkYi0+TnVtVW5wYWNrU3RyZWFtc1ZlY3Rvcltmb2xkZXJJbmRleF07DQorICAgICAgDQorICAgICAgQ051bSBpbmRleEluRm9sZGVyID0gMDsNCisgICAgICBmb3IgKENOdW0gZmkgPSBkYi0+Rm9sZGVyU3RhcnRGaWxlSW5kZXhbZm9sZGVySW5kZXhdOyBpbmRleEluRm9sZGVyIDwgbnVtVW5wYWNrU3RyZWFtczsgZmkrKykNCisgICAgICB7DQorICAgICAgICBDRmlsZUl0ZW0gZmlsZTsNCisgICAgICAgIENGaWxlSXRlbTIgZmlsZTI7DQorICAgICAgICBHZXRGaWxlKCpkYiwgZmksIGZpbGUsIGZpbGUyKTsNCisgICAgICAgIFVTdHJpbmcgbmFtZTsNCisgICAgICAgIGRiLT5HZXRQYXRoKGZpLCBuYW1lKTsNCisgICAgICAgIGlmIChmaWxlLkhhc1N0cmVhbSkNCisgICAgICAgIHsNCisgICAgICAgICAgaW5kZXhJbkZvbGRlcisrOw0KKyAgICAgICAgICBpbnQgdXBkYXRlSW5kZXggPSBmaWxlSW5kZXhUb1VwZGF0ZUluZGV4TWFwW2ZpXTsNCisgICAgICAgICAgaWYgKHVwZGF0ZUluZGV4ID49IDApDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBjb25zdCBDVXBkYXRlSXRlbSAmdWkgPSB1cGRhdGVJdGVtc1t1cGRhdGVJbmRleF07DQorICAgICAgICAgICAgaWYgKHVpLk5ld0RhdGEpDQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICBpZiAodWkuTmV3UHJvcHMpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgQ0ZpbGVJdGVtIHVmOw0KKyAgICAgICAgICAgICAgRnJvbVVwZGF0ZUl0ZW1Ub0ZpbGVJdGVtKHVpLCB1ZiwgZmlsZTIpOw0KKyAgICAgICAgICAgICAgdWYuU2l6ZSA9IGZpbGUuU2l6ZTsNCisgICAgICAgICAgICAgIHVmLkNyYyA9IGZpbGUuQ3JjOw0KKyAgICAgICAgICAgICAgdWYuQ3JjRGVmaW5lZCA9IGZpbGUuQ3JjRGVmaW5lZDsNCisgICAgICAgICAgICAgIHVmLkhhc1N0cmVhbSA9IGZpbGUuSGFzU3RyZWFtOw0KKyAgICAgICAgICAgICAgZmlsZSA9IHVmOw0KKyAgICAgICAgICAgICAgbmFtZSA9IHVpLk5hbWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIC8qDQorICAgICAgICAgICAgZmlsZS5QYXJlbnQgPSB1aS5QYXJlbnRGb2xkZXJJbmRleDsNCisgICAgICAgICAgICBpZiAodWkuVHJlZUZvbGRlckluZGV4ID49IDApDQorICAgICAgICAgICAgICB0cmVlRm9sZGVyVG9BcmNJbmRleFt1aS5UcmVlRm9sZGVySW5kZXhdID0gbmV3RGF0YWJhc2UuRmlsZXMuU2l6ZSgpOw0KKyAgICAgICAgICAgIGlmICh0b3RhbFNlY3VyZURhdGFTaXplICE9IDApDQorICAgICAgICAgICAgICBuZXdEYXRhYmFzZS5TZWN1cmVJRHMuQWRkKHVpLlNlY3VyZUluZGV4KTsNCisgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIG5ld0RhdGFiYXNlLkFkZEZpbGUoZmlsZSwgZmlsZTIsIG5hbWUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIHVuc2lnbmVkIG51bUZpbGVzID0gZ3JvdXAuSW5kaWNlcy5TaXplKCk7DQorICAgIGlmIChudW1GaWxlcyA9PSAwKQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICBDUmVjb3JkVmVjdG9yPENSZWZJdGVtPiByZWZJdGVtczsNCisgICAgcmVmSXRlbXMuQ2xlYXJBbmRTZXRTaXplKG51bUZpbGVzKTsNCisgICAgYm9vbCBzb3J0QnlUeXBlID0gKG51bVNvbGlkRmlsZXMgPiAxKTsNCisgICAgZm9yIChpID0gMDsgaSA8IG51bUZpbGVzOyBpKyspDQorICAgICAgcmVmSXRlbXNbaV0gPSBDUmVmSXRlbShncm91cC5JbmRpY2VzW2ldLCB1cGRhdGVJdGVtc1tncm91cC5JbmRpY2VzW2ldXSwgc29ydEJ5VHlwZSk7DQorICAgIENTb3J0UGFyYW0gc29ydFBhcmFtOw0KKyAgICAvLyBzb3J0UGFyYW0uVHJlZUZvbGRlcnMgPSAmdHJlZUZvbGRlcnM7DQorICAgIHNvcnRQYXJhbS5Tb3J0QnlUeXBlID0gc29ydEJ5VHlwZTsNCisgICAgcmVmSXRlbXMuU29ydChDb21wYXJlVXBkYXRlSXRlbXMsICh2b2lkICopJnNvcnRQYXJhbSk7DQorICAgIA0KKyAgICBDT2JqQXJyYXk8VUludDMyPiBpbmRpY2VzKG51bUZpbGVzKTsNCisNCisgICAgZm9yIChpID0gMDsgaSA8IG51bUZpbGVzOyBpKyspDQorICAgIHsNCisgICAgICBVSW50MzIgaW5kZXggPSByZWZJdGVtc1tpXS5JbmRleDsNCisgICAgICBpbmRpY2VzW2ldID0gaW5kZXg7DQorICAgICAgLyoNCisgICAgICBjb25zdCBDVXBkYXRlSXRlbSAmdWkgPSB1cGRhdGVJdGVtc1tpbmRleF07DQorICAgICAgQ0ZpbGVJdGVtIGZpbGU7DQorICAgICAgaWYgKHVpLk5ld1Byb3BzKQ0KKyAgICAgICAgRnJvbVVwZGF0ZUl0ZW1Ub0ZpbGVJdGVtKHVpLCBmaWxlKTsNCisgICAgICBlbHNlDQorICAgICAgICBmaWxlID0gZGIuRmlsZXNbdWkuSW5kZXhJbkFyY2hpdmVdOw0KKyAgICAgIGlmIChmaWxlLklzQW50aSB8fCBmaWxlLklzRGlyKQ0KKyAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICBuZXdEYXRhYmFzZS5GaWxlcy5BZGQoZmlsZSk7DQorICAgICAgKi8NCisgICAgfQ0KKyAgICANCisgICAgZm9yIChpID0gMDsgaSA8IG51bUZpbGVzOykNCisgICAgew0KKyAgICAgIFVJbnQ2NCB0b3RhbFNpemUgPSAwOw0KKyAgICAgIGludCBudW1TdWJGaWxlczsNCisgICAgICBVU3RyaW5nIHByZXZFeHRlbnNpb247DQorICAgICAgZm9yIChudW1TdWJGaWxlcyA9IDA7IGkgKyBudW1TdWJGaWxlcyA8IG51bUZpbGVzICYmDQorICAgICAgICAgIG51bVN1YkZpbGVzIDwgbnVtU29saWRGaWxlczsgbnVtU3ViRmlsZXMrKykNCisgICAgICB7DQorICAgICAgICBjb25zdCBDVXBkYXRlSXRlbSAmdWkgPSB1cGRhdGVJdGVtc1tpbmRpY2VzW2kgKyBudW1TdWJGaWxlc11dOw0KKyAgICAgICAgdG90YWxTaXplICs9IHVpLlNpemU7DQorICAgICAgICBpZiAodG90YWxTaXplID4gb3B0aW9ucy5OdW1Tb2xpZEJ5dGVzKQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGlmIChvcHRpb25zLlNvbGlkRXh0ZW5zaW9uKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBVU3RyaW5nIGV4dCA9IHVpLkdldEV4dGVuc2lvbigpOw0KKyAgICAgICAgICBpZiAobnVtU3ViRmlsZXMgPT0gMCkNCisgICAgICAgICAgICBwcmV2RXh0ZW5zaW9uID0gZXh0Ow0KKyAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgaWYgKCFleHQuSXNFcXVhbFRvTm9DYXNlKHByZXZFeHRlbnNpb24pKQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChudW1TdWJGaWxlcyA8IDEpDQorICAgICAgICBudW1TdWJGaWxlcyA9IDE7DQorDQorICAgICAgQ0ZvbGRlckluU3RyZWFtICppblN0cmVhbVNwZWMgPSBuZXcgQ0ZvbGRlckluU3RyZWFtOw0KKyAgICAgIENNeUNvbVB0cjxJU2VxdWVudGlhbEluU3RyZWFtPiBzb2xpZEluU3RyZWFtKGluU3RyZWFtU3BlYyk7DQorICAgICAgaW5TdHJlYW1TcGVjLT5Jbml0KHVwZGF0ZUNhbGxiYWNrLCAmaW5kaWNlc1tpXSwgbnVtU3ViRmlsZXMpOw0KKyAgICAgIA0KKyAgICAgIHVuc2lnbmVkIHN0YXJ0UGFja0luZGV4ID0gbmV3RGF0YWJhc2UuUGFja1NpemVzLlNpemUoKTsNCisgICAgICBVSW50NjQgY3VyRm9sZGVyVW5wYWNrU2l6ZTsNCisgICAgICBSSU5PSyhlbmNvZGVyLkVuY29kZSgNCisgICAgICAgICAgRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgICAgICAgIHNvbGlkSW5TdHJlYW0sIE5VTEwsICZpblNpemVGb3JSZWR1Y2UsDQorICAgICAgICAgIG5ld0RhdGFiYXNlLkZvbGRlcnMuQWRkTmV3KCksIG5ld0RhdGFiYXNlLkNvZGVyVW5wYWNrU2l6ZXMsIGN1ckZvbGRlclVucGFja1NpemUsDQorICAgICAgICAgIGFyY2hpdmUuU2VxU3RyZWFtLCBuZXdEYXRhYmFzZS5QYWNrU2l6ZXMsIHByb2dyZXNzKSk7DQorDQorICAgICAgZm9yICg7IHN0YXJ0UGFja0luZGV4IDwgbmV3RGF0YWJhc2UuUGFja1NpemVzLlNpemUoKTsgc3RhcnRQYWNrSW5kZXgrKykNCisgICAgICAgIGxwcy0+T3V0U2l6ZSArPSBuZXdEYXRhYmFzZS5QYWNrU2l6ZXNbc3RhcnRQYWNrSW5kZXhdOw0KKw0KKyAgICAgIGxwcy0+SW5TaXplICs9IGN1ckZvbGRlclVucGFja1NpemU7DQorICAgICAgLy8gZm9yICgpDQorICAgICAgLy8gbmV3RGF0YWJhc2UuUGFja0NSQ3NEZWZpbmVkLkFkZChmYWxzZSk7DQorICAgICAgLy8gbmV3RGF0YWJhc2UuUGFja0NSQ3MuQWRkKDApOw0KKyAgICAgIA0KKyAgICAgIENOdW0gbnVtVW5wYWNrU3RyZWFtcyA9IDA7DQorICAgICAgZm9yIChpbnQgc3ViSW5kZXggPSAwOyBzdWJJbmRleCA8IG51bVN1YkZpbGVzOyBzdWJJbmRleCsrKQ0KKyAgICAgIHsNCisgICAgICAgIGNvbnN0IENVcGRhdGVJdGVtICZ1aSA9IHVwZGF0ZUl0ZW1zW2luZGljZXNbaSArIHN1YkluZGV4XV07DQorICAgICAgICBDRmlsZUl0ZW0gZmlsZTsNCisgICAgICAgIENGaWxlSXRlbTIgZmlsZTI7DQorICAgICAgICBVU3RyaW5nIG5hbWU7DQorICAgICAgICBpZiAodWkuTmV3UHJvcHMpDQorICAgICAgICB7DQorICAgICAgICAgIEZyb21VcGRhdGVJdGVtVG9GaWxlSXRlbSh1aSwgZmlsZSwgZmlsZTIpOw0KKyAgICAgICAgICBuYW1lID0gdWkuTmFtZTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgR2V0RmlsZSgqZGIsIHVpLkluZGV4SW5BcmNoaXZlLCBmaWxlLCBmaWxlMik7DQorICAgICAgICAgIGRiLT5HZXRQYXRoKHVpLkluZGV4SW5BcmNoaXZlLCBuYW1lKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChmaWxlMi5Jc0FudGkgfHwgZmlsZS5Jc0RpcikNCisgICAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICAgIA0KKyAgICAgICAgLyoNCisgICAgICAgIENGaWxlSXRlbSAmZmlsZSA9IG5ld0RhdGFiYXNlLkZpbGVzWw0KKyAgICAgICAgICAgICAgc3RhcnRGaWxlSW5kZXhJbkRhdGFiYXNlICsgaSArIHN1YkluZGV4XTsNCisgICAgICAgICovDQorICAgICAgICBpZiAoIWluU3RyZWFtU3BlYy0+UHJvY2Vzc2VkW3N1YkluZGV4XSkNCisgICAgICAgIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIC8vIGZpbGUuTmFtZSArPSBMIi5sb2NrZWQiOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZmlsZS5DcmMgPSBpblN0cmVhbVNwZWMtPkNSQ3Nbc3ViSW5kZXhdOw0KKyAgICAgICAgZmlsZS5TaXplID0gaW5TdHJlYW1TcGVjLT5TaXplc1tzdWJJbmRleF07DQorICAgICAgICBpZiAoZmlsZS5TaXplICE9IDApDQorICAgICAgICB7DQorICAgICAgICAgIGZpbGUuQ3JjRGVmaW5lZCA9IHRydWU7DQorICAgICAgICAgIGZpbGUuSGFzU3RyZWFtID0gdHJ1ZTsNCisgICAgICAgICAgbnVtVW5wYWNrU3RyZWFtcysrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICBmaWxlLkNyY0RlZmluZWQgPSBmYWxzZTsNCisgICAgICAgICAgZmlsZS5IYXNTdHJlYW0gPSBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIC8qDQorICAgICAgICBmaWxlLlBhcmVudCA9IHVpLlBhcmVudEZvbGRlckluZGV4Ow0KKyAgICAgICAgaWYgKHVpLlRyZWVGb2xkZXJJbmRleCA+PSAwKQ0KKyAgICAgICAgICB0cmVlRm9sZGVyVG9BcmNJbmRleFt1aS5UcmVlRm9sZGVySW5kZXhdID0gbmV3RGF0YWJhc2UuRmlsZXMuU2l6ZSgpOw0KKyAgICAgICAgaWYgKHRvdGFsU2VjdXJlRGF0YVNpemUgIT0gMCkNCisgICAgICAgICAgbmV3RGF0YWJhc2UuU2VjdXJlSURzLkFkZCh1aS5TZWN1cmVJbmRleCk7DQorICAgICAgICAqLw0KKyAgICAgICAgbmV3RGF0YWJhc2UuQWRkRmlsZShmaWxlLCBmaWxlMiwgbmFtZSk7DQorICAgICAgfQ0KKyAgICAgIC8vIG51bVVucGFja1N0cmVhbXMgPSAwIGlzIHZlcnkgYmFkIGNhc2UgZm9yIGxvY2tlZCBmaWxlcw0KKyAgICAgIC8vIHYzLjEzIGRvZXNuJ3QgdW5kZXJzdGFuZCBpdC4NCisgICAgICBuZXdEYXRhYmFzZS5OdW1VbnBhY2tTdHJlYW1zVmVjdG9yLkFkZChudW1VbnBhY2tTdHJlYW1zKTsNCisgICAgICBpICs9IG51bVN1YkZpbGVzOw0KKyAgICB9DQorICB9DQorDQorICBpZiAoZm9sZGVyUmVmSW5kZXggIT0gZm9sZGVyUmVmcy5TaXplKCkpDQorICAgIHJldHVybiBFX0ZBSUw7DQorDQorICBSSU5PSyhscHMtPlNldEN1cigpKTsNCisNCisgIC8qDQorICBmb2xkZXJSZWZzLkNsZWFyQW5kRnJlZSgpOw0KKyAgZmlsZUluZGV4VG9VcGRhdGVJbmRleE1hcC5DbGVhckFuZEZyZWUoKTsNCisgIGdyb3Vwcy5DbGVhckFuZEZyZWUoKTsNCisgICovDQorDQorICAvKg0KKyAgZm9yIChpID0gMDsgaSA8IG5ld0RhdGFiYXNlLkZpbGVzLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICBDRmlsZUl0ZW0gJmZpbGUgPSBuZXdEYXRhYmFzZS5GaWxlc1tpXTsNCisgICAgZmlsZS5QYXJlbnQgPSB0cmVlRm9sZGVyVG9BcmNJbmRleFtmaWxlLlBhcmVudF07DQorICB9DQorDQorICBpZiAodG90YWxTZWN1cmVEYXRhU2l6ZSAhPSAwKQ0KKyAgew0KKyAgICBuZXdEYXRhYmFzZS5TZWN1cmVCdWYuU2V0Q2FwYWNpdHkodG90YWxTZWN1cmVEYXRhU2l6ZSk7DQorICAgIHNpemVfdCBwb3MgPSAwOw0KKyAgICBuZXdEYXRhYmFzZS5TZWN1cmVTaXplcy5SZXNlcnZlKHNlY3VyZUJsb2Nrcy5Tb3J0ZWQuU2l6ZSgpKTsNCisgICAgZm9yIChpID0gMDsgaSA8IHNlY3VyZUJsb2Nrcy5Tb3J0ZWQuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBjb25zdCBDQnl0ZUJ1ZmZlciAmYnVmID0gc2VjdXJlQmxvY2tzLkJ1ZnNbc2VjdXJlQmxvY2tzLlNvcnRlZFtpXV07DQorICAgICAgc2l6ZV90IHNpemUgPSBidWYuR2V0Q2FwYWNpdHkoKTsNCisgICAgICBtZW1jcHkobmV3RGF0YWJhc2UuU2VjdXJlQnVmICsgcG9zLCBidWYsIHNpemUpOw0KKyAgICAgIG5ld0RhdGFiYXNlLlNlY3VyZVNpemVzLkFkZCgoVUludDMyKXNpemUpOw0KKyAgICAgIHBvcyArPSBzaXplOw0KKyAgICB9DQorICB9DQorICAqLw0KKyAgbmV3RGF0YWJhc2UuUmVzZXJ2ZURvd24oKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCit9fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83elVwZGF0ZS5oIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6Lzd6VXBkYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcwYmMzMAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei83elVwZGF0ZS5oCkBAIC0wLDAgKzEsMTIwIEBACisvLyA3elVwZGF0ZS5oDQorDQorI2lmbmRlZiBfXzdaX1VQREFURV9IDQorI2RlZmluZSBfXzdaX1VQREFURV9IDQorDQorI2luY2x1ZGUgIi4uL0lBcmNoaXZlLmgiDQorDQorLy8gI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9VbmlxQmxvY2tzLmgiDQorDQorI2luY2x1ZGUgIjd6Q29tcHJlc3Npb25Nb2RlLmgiDQorI2luY2x1ZGUgIjd6SW4uaCINCisjaW5jbHVkZSAiN3pPdXQuaCINCisNCituYW1lc3BhY2UgTkFyY2hpdmUgew0KK25hbWVzcGFjZSBON3ogew0KKw0KKy8qDQorc3RydWN0IENUcmVlRm9sZGVyDQorew0KKyAgVVN0cmluZyBOYW1lOw0KKyAgaW50IFBhcmVudDsNCisgIENJbnRWZWN0b3IgU3ViRm9sZGVyczsNCisgIGludCBVcGRhdGVJdGVtSW5kZXg7DQorICBpbnQgU29ydEluZGV4Ow0KKyAgaW50IFNvcnRJbmRleEVuZDsNCisNCisgIENUcmVlRm9sZGVyKCk6IFVwZGF0ZUl0ZW1JbmRleCgtMSkge30NCit9Ow0KKyovDQorDQorc3RydWN0IENVcGRhdGVJdGVtDQorew0KKyAgaW50IEluZGV4SW5BcmNoaXZlOw0KKyAgaW50IEluZGV4SW5DbGllbnQ7DQorICANCisgIFVJbnQ2NCBDVGltZTsNCisgIFVJbnQ2NCBBVGltZTsNCisgIFVJbnQ2NCBNVGltZTsNCisNCisgIFVJbnQ2NCBTaXplOw0KKyAgVVN0cmluZyBOYW1lOw0KKyAgLyoNCisgIGJvb2wgSXNBbHRTdHJlYW07DQorICBpbnQgUGFyZW50Rm9sZGVySW5kZXg7DQorICBpbnQgVHJlZUZvbGRlckluZGV4Ow0KKyAgKi8NCisNCisgIC8vIHRoYXQgY29kZSBpcyBub3QgdXNlZCBpbiA5LjI2DQorICAvLyBpbnQgUGFyZW50U29ydEluZGV4Ow0KKyAgLy8gaW50IFBhcmVudFNvcnRJbmRleEVuZDsNCisNCisgIFVJbnQzMiBBdHRyaWI7DQorICANCisgIGJvb2wgTmV3RGF0YTsNCisgIGJvb2wgTmV3UHJvcHM7DQorDQorICBib29sIElzQW50aTsNCisgIGJvb2wgSXNEaXI7DQorDQorICBib29sIEF0dHJpYkRlZmluZWQ7DQorICBib29sIENUaW1lRGVmaW5lZDsNCisgIGJvb2wgQVRpbWVEZWZpbmVkOw0KKyAgYm9vbCBNVGltZURlZmluZWQ7DQorDQorICAvLyBpbnQgU2VjdXJlSW5kZXg7IC8vIDAgbWVhbnMgKG5vX3NlY3VyaXR5KQ0KKw0KKyAgYm9vbCBIYXNTdHJlYW0oKSBjb25zdCB7IHJldHVybiAhSXNEaXIgJiYgIUlzQW50aSAmJiBTaXplICE9IDA7IH0NCisNCisgIENVcGRhdGVJdGVtKCk6DQorICAgICAgLy8gUGFyZW50U29ydEluZGV4KC0xKSwNCisgICAgICAvLyBJc0FsdFN0cmVhbShmYWxzZSksDQorICAgICAgSXNBbnRpKGZhbHNlKSwNCisgICAgICBJc0RpcihmYWxzZSksDQorICAgICAgQXR0cmliRGVmaW5lZChmYWxzZSksDQorICAgICAgQ1RpbWVEZWZpbmVkKGZhbHNlKSwNCisgICAgICBBVGltZURlZmluZWQoZmFsc2UpLA0KKyAgICAgIE1UaW1lRGVmaW5lZChmYWxzZSkNCisgICAgICAvLyBTZWN1cmVJbmRleCgwKQ0KKyAgICAgIHt9DQorICB2b2lkIFNldERpclN0YXR1c0Zyb21BdHRyaWIoKSB7IElzRGlyID0gKChBdHRyaWIgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpICE9IDApOyB9Ow0KKw0KKyAgaW50IEdldEV4dGVuc2lvblBvcygpIGNvbnN0Ow0KKyAgVVN0cmluZyBHZXRFeHRlbnNpb24oKSBjb25zdDsNCit9Ow0KKw0KK3N0cnVjdCBDVXBkYXRlT3B0aW9ucw0KK3sNCisgIGNvbnN0IENDb21wcmVzc2lvbk1ldGhvZE1vZGUgKk1ldGhvZDsNCisgIGNvbnN0IENDb21wcmVzc2lvbk1ldGhvZE1vZGUgKkhlYWRlck1ldGhvZDsNCisgIGJvb2wgVXNlRmlsdGVyczsNCisgIGJvb2wgTWF4RmlsdGVyOw0KKw0KKyAgQ0hlYWRlck9wdGlvbnMgSGVhZGVyT3B0aW9uczsNCisNCisgIFVJbnQ2NCBOdW1Tb2xpZEZpbGVzOw0KKyAgVUludDY0IE51bVNvbGlkQnl0ZXM7DQorICBib29sIFNvbGlkRXh0ZW5zaW9uOw0KKyAgYm9vbCBSZW1vdmVTZnhCbG9jazsNCisgIGJvb2wgVm9sdW1lTW9kZTsNCit9Ow0KKw0KK0hSRVNVTFQgVXBkYXRlKA0KKyAgICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICBJSW5TdHJlYW0gKmluU3RyZWFtLA0KKyAgICBjb25zdCBDRGJFeCAqZGIsDQorICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q1VwZGF0ZUl0ZW0+ICZ1cGRhdGVJdGVtcywNCisgICAgLy8gY29uc3QgQ09iamVjdFZlY3RvcjxDVHJlZUZvbGRlcj4gJnRyZWVGb2xkZXJzLCAvLyB0cmVlRm9sZGVyc1swXSBpcyByb290DQorICAgIC8vIGNvbnN0IENVbmlxQmxvY2tzICZzZWN1cmVCbG9ja3MsDQorICAgIENPdXRBcmNoaXZlICZhcmNoaXZlLA0KKyAgICBDQXJjaGl2ZURhdGFiYXNlT3V0ICZuZXdEYXRhYmFzZSwNCisgICAgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKnNlcU91dFN0cmVhbSwNCisgICAgSUFyY2hpdmVVcGRhdGVDYWxsYmFjayAqdXBkYXRlQ2FsbGJhY2ssDQorICAgIGNvbnN0IENVcGRhdGVPcHRpb25zICZvcHRpb25zDQorICAgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgICAsIElDcnlwdG9HZXRUZXh0UGFzc3dvcmQgKmdldERlY29kZXJQYXNzd29yZA0KKyAgICAjZW5kaWYNCisgICAgKTsNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei9TdGRBZnguY3BwIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlLzd6L1N0ZEFmeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkM2IxZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei9TdGRBZnguY3BwCkBAIC0wLDAgKzEsMyBAQAorLy8gU3RkQWZ4LmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovU3RkQWZ4LmggYi9sem1hL0NQUC83emlwL0FyY2hpdmUvN3ovU3RkQWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkOWFjMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS83ei9TdGRBZnguaApAQCAtMCwwICsxLDggQEAKKy8vIFN0ZEFmeC5oDQorDQorI2lmbmRlZiBfX1NUREFGWF9IDQorI2RlZmluZSBfX1NUREFGWF9IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9Db21tb24uaCINCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvQXJjaGl2ZS5kZWYgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQXJjaGl2ZS5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5MjQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9BcmNoaXZlLmRlZgpAQCAtMCwwICsxLDYgQEAKK0VYUE9SVFMNCisgIENyZWF0ZU9iamVjdCBQUklWQVRFDQorICBHZXRIYW5kbGVyUHJvcGVydHkgUFJJVkFURQ0KKyAgR2V0TnVtYmVyT2ZGb3JtYXRzIFBSSVZBVEUNCisgIEdldEhhbmRsZXJQcm9wZXJ0eTIgUFJJVkFURQ0KKyAgQ3JlYXRlT2JqZWN0IFBSSVZBVEUNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvQXJjaGl2ZTIuZGVmIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0FyY2hpdmUyLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWJkOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0FyY2hpdmUyLmRlZgpAQCAtMCwwICsxLDExIEBACitFWFBPUlRTDQorICBDcmVhdGVPYmplY3QgUFJJVkFURQ0KKyAgR2V0SGFuZGxlclByb3BlcnR5IFBSSVZBVEUNCisgIEdldE51bWJlck9mRm9ybWF0cyBQUklWQVRFDQorICBHZXRIYW5kbGVyUHJvcGVydHkyIFBSSVZBVEUNCisgIEdldE51bWJlck9mTWV0aG9kcyBQUklWQVRFDQorICBHZXRNZXRob2RQcm9wZXJ0eSBQUklWQVRFDQorICBHZXRIYXNoZXJzIFBSSVZBVEUNCisgIFNldExhcmdlUGFnZU1vZGUgUFJJVkFURQ0KKyAgU2V0Q2FzZVNlbnNpdGl2ZSBQUklWQVRFDQorICBHZXRJc0FyYyBQUklWQVRFClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0FyY2hpdmVFeHBvcnRzLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9BcmNoaXZlRXhwb3J0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5NTMzMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9BcmNoaXZlRXhwb3J0cy5jcHAKQEAgLTAsMCArMSwxNDkgQEAKKy8vIEFyY2hpdmVFeHBvcnRzLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQy83elZlcnNpb24uaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0NvbVRyeS5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9XaW5kb3dzL1Byb3BWYXJpYW50LmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9SZWdpc3RlckFyYy5oIg0KKw0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrTnVtQXJjc01heCA9IDY0Ow0KK3N0YXRpYyB1bnNpZ25lZCBnX051bUFyY3MgPSAwOw0KK3N0YXRpYyB1bnNpZ25lZCBnX0RlZmF1bHRBcmNJbmRleCA9IDA7DQorc3RhdGljIGNvbnN0IENBcmNJbmZvICpnX0FyY3Nba051bUFyY3NNYXhdOw0KKw0KK3ZvaWQgUmVnaXN0ZXJBcmMoY29uc3QgQ0FyY0luZm8gKmFyY0luZm8pIHRocm93KCkNCit7DQorICBpZiAoZ19OdW1BcmNzIDwga051bUFyY3NNYXgpDQorICB7DQorICAgIGNvbnN0IGNoYXIgKnAgPSBhcmNJbmZvLT5OYW1lOw0KKyAgICBpZiAocFswXSA9PSAnNycgJiYgcFsxXSA9PSAneicgJiYgcFsyXSA9PSAwKQ0KKyAgICAgIGdfRGVmYXVsdEFyY0luZGV4ID0gZ19OdW1BcmNzOw0KKyAgICBnX0FyY3NbZ19OdW1BcmNzXSA9IGFyY0luZm87DQorICAgIGdfTnVtQXJjcysrOw0KKyAgfQ0KK30NCisNCitERUZJTkVfR1VJRChDTFNJRF9DQXJjaGl2ZUhhbmRsZXIsDQorMHgyMzE3MEY2OSwgMHg0MEMxLCAweDI3OEEsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDApOw0KKw0KKyNkZWZpbmUgQ0xTX0FSQ19JRF9JVEVNKGNscykgKChjbHMpLkRhdGE0WzVdKQ0KKw0KK3N0YXRpYyBpbmxpbmUgSFJFU1VMVCBTZXRQcm9wU3RyaW5nKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIHNpemUsIFBST1BWQVJJQU5UICp2YWx1ZSkNCit7DQorICBpZiAoKHZhbHVlLT5ic3RyVmFsID0gOjpTeXNBbGxvY1N0cmluZ0J5dGVMZW4ocywgc2l6ZSkpICE9IDApDQorICAgIHZhbHVlLT52dCA9IFZUX0JTVFI7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorc3RhdGljIGlubGluZSBIUkVTVUxUIFNldFByb3BHVUlEKGNvbnN0IEdVSUQgJmd1aWQsIFBST1BWQVJJQU5UICp2YWx1ZSkNCit7DQorICByZXR1cm4gU2V0UHJvcFN0cmluZygoY29uc3QgY2hhciAqKSZndWlkLCBzaXplb2YoR1VJRCksIHZhbHVlKTsNCit9DQorDQoraW50IEZpbmRGb3JtYXRDYWxzc0lkKGNvbnN0IEdVSUQgKmNsc0lEKQ0KK3sNCisgIEdVSUQgY2xzID0gKmNsc0lEOw0KKyAgQ0xTX0FSQ19JRF9JVEVNKGNscykgPSAwOw0KKyAgaWYgKGNscyAhPSBDTFNJRF9DQXJjaGl2ZUhhbmRsZXIpDQorICAgIHJldHVybiAtMTsNCisgIEJ5dGUgaWQgPSBDTFNfQVJDX0lEX0lURU0oKmNsc0lEKTsNCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBnX051bUFyY3M7IGkrKykNCisgICAgaWYgKGdfQXJjc1tpXS0+Q2xhc3NJZCA9PSBpZCkNCisgICAgICByZXR1cm4gKGludClpOw0KKyAgcmV0dXJuIC0xOw0KK30NCisNCitTVERBUEkgQ3JlYXRlQXJjaGl2ZXIoY29uc3QgR1VJRCAqY2xzaWQsIGNvbnN0IEdVSUQgKmlpZCwgdm9pZCAqKm91dE9iamVjdCkNCit7DQorICBDT01fVFJZX0JFR0lODQorICB7DQorICAgIGludCBuZWVkSW4gPSAoKmlpZCA9PSBJSURfSUluQXJjaGl2ZSk7DQorICAgIGludCBuZWVkT3V0ID0gKCppaWQgPT0gSUlEX0lPdXRBcmNoaXZlKTsNCisgICAgaWYgKCFuZWVkSW4gJiYgIW5lZWRPdXQpDQorICAgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7DQorICAgIGludCBmb3JtYXRJbmRleCA9IEZpbmRGb3JtYXRDYWxzc0lkKGNsc2lkKTsNCisgICAgaWYgKGZvcm1hdEluZGV4IDwgMCkNCisgICAgICByZXR1cm4gQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRTsNCisgICAgDQorICAgIGNvbnN0IENBcmNJbmZvICZhcmMgPSAqZ19BcmNzW2Zvcm1hdEluZGV4XTsNCisgICAgaWYgKG5lZWRJbikNCisgICAgew0KKyAgICAgICpvdXRPYmplY3QgPSBhcmMuQ3JlYXRlSW5BcmNoaXZlKCk7DQorICAgICAgKChJSW5BcmNoaXZlICopKm91dE9iamVjdCktPkFkZFJlZigpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGlmICghYXJjLkNyZWF0ZU91dEFyY2hpdmUpDQorICAgICAgICByZXR1cm4gQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRTsNCisgICAgICAqb3V0T2JqZWN0ID0gYXJjLkNyZWF0ZU91dEFyY2hpdmUoKTsNCisgICAgICAoKElPdXRBcmNoaXZlICopKm91dE9iamVjdCktPkFkZFJlZigpOw0KKyAgICB9DQorICB9DQorICBDT01fVFJZX0VORA0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NUREFQSSBHZXRIYW5kbGVyUHJvcGVydHkyKFVJbnQzMiBmb3JtYXRJbmRleCwgUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIE5XaW5kb3dzOjpOQ09NOjpQcm9wVmFyaWFudF9DbGVhcih2YWx1ZSk7DQorICBpZiAoZm9ybWF0SW5kZXggPj0gZ19OdW1BcmNzKQ0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgY29uc3QgQ0FyY0luZm8gJmFyYyA9ICpnX0FyY3NbZm9ybWF0SW5kZXhdOw0KKyAgTldpbmRvd3M6Ok5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgc3dpdGNoIChwcm9wSUQpDQorICB7DQorICAgIGNhc2UgTkFyY2hpdmU6Ok5IYW5kbGVyUHJvcElEOjprTmFtZTogcHJvcCA9IGFyYy5OYW1lOyBicmVhazsNCisgICAgY2FzZSBOQXJjaGl2ZTo6TkhhbmRsZXJQcm9wSUQ6OmtDbGFzc0lEOg0KKyAgICB7DQorICAgICAgR1VJRCBjbHNJZCA9IENMU0lEX0NBcmNoaXZlSGFuZGxlcjsNCisgICAgICBDTFNfQVJDX0lEX0lURU0oY2xzSWQpID0gYXJjLkNsYXNzSWQ7DQorICAgICAgcmV0dXJuIFNldFByb3BHVUlEKGNsc0lkLCB2YWx1ZSk7DQorICAgIH0NCisgICAgY2FzZSBOQXJjaGl2ZTo6TkhhbmRsZXJQcm9wSUQ6OmtFeHRlbnNpb246IGlmIChhcmMuRXh0KSBwcm9wID0gYXJjLkV4dDsgYnJlYWs7DQorICAgIGNhc2UgTkFyY2hpdmU6Ok5IYW5kbGVyUHJvcElEOjprQWRkRXh0ZW5zaW9uOiBpZiAoYXJjLkFkZEV4dCkgcHJvcCA9IGFyYy5BZGRFeHQ7IGJyZWFrOw0KKyAgICBjYXNlIE5BcmNoaXZlOjpOSGFuZGxlclByb3BJRDo6a1VwZGF0ZTogcHJvcCA9IChib29sKShhcmMuQ3JlYXRlT3V0QXJjaGl2ZSAhPSBOVUxMKTsgYnJlYWs7DQorICAgIGNhc2UgTkFyY2hpdmU6Ok5IYW5kbGVyUHJvcElEOjprS2VlcE5hbWU6ICAgcHJvcCA9ICgoYXJjLkZsYWdzICYgTkFyY0luZm9GbGFnczo6a0tlZXBOYW1lKSAhPSAwKTsgYnJlYWs7DQorICAgIGNhc2UgTkFyY2hpdmU6Ok5IYW5kbGVyUHJvcElEOjprQWx0U3RyZWFtczogcHJvcCA9ICgoYXJjLkZsYWdzICYgTkFyY0luZm9GbGFnczo6a0FsdFN0cmVhbXMpICE9IDApOyBicmVhazsNCisgICAgY2FzZSBOQXJjaGl2ZTo6TkhhbmRsZXJQcm9wSUQ6OmtOdFNlY3VyZTogICBwcm9wID0gKChhcmMuRmxhZ3MgJiBOQXJjSW5mb0ZsYWdzOjprTnRTZWN1cmUpICE9IDApOyBicmVhazsNCisgICAgY2FzZSBOQXJjaGl2ZTo6TkhhbmRsZXJQcm9wSUQ6OmtGbGFnczogcHJvcCA9IChVSW50MzIpYXJjLkZsYWdzOyBicmVhazsNCisgICAgY2FzZSBOQXJjaGl2ZTo6TkhhbmRsZXJQcm9wSUQ6OmtTaWduYXR1cmVPZmZzZXQ6IHByb3AgPSAoVUludDMyKWFyYy5TaWduYXR1cmVPZmZzZXQ7IGJyZWFrOw0KKyAgICAvLyBjYXNlIE5BcmNoaXZlOjpOSGFuZGxlclByb3BJRDo6a1ZlcnNpb246IHByb3AgPSAoVUludDMyKU1ZX1ZFUl9NSVg7IGJyZWFrOw0KKw0KKyAgICBjYXNlIE5BcmNoaXZlOjpOSGFuZGxlclByb3BJRDo6a1NpZ25hdHVyZToNCisgICAgICBpZiAoIWFyYy5Jc011bHRpU2lnbmF0dXJlKCkpDQorICAgICAgICByZXR1cm4gU2V0UHJvcFN0cmluZygoY29uc3QgY2hhciAqKWFyYy5TaWduYXR1cmUsIGFyYy5TaWduYXR1cmVTaXplLCB2YWx1ZSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgTkFyY2hpdmU6Ok5IYW5kbGVyUHJvcElEOjprTXVsdGlTaWduYXR1cmU6DQorICAgICAgaWYgKGFyYy5Jc011bHRpU2lnbmF0dXJlKCkpDQorICAgICAgICByZXR1cm4gU2V0UHJvcFN0cmluZygoY29uc3QgY2hhciAqKWFyYy5TaWduYXR1cmUsIGFyYy5TaWduYXR1cmVTaXplLCB2YWx1ZSk7DQorICAgICAgYnJlYWs7DQorICB9DQorICBwcm9wLkRldGFjaCh2YWx1ZSk7DQorICByZXR1cm4gU19PSzsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KK1NUREFQSSBHZXRIYW5kbGVyUHJvcGVydHkoUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKQ0KK3sNCisgIHJldHVybiBHZXRIYW5kbGVyUHJvcGVydHkyKGdfRGVmYXVsdEFyY0luZGV4LCBwcm9wSUQsIHZhbHVlKTsNCit9DQorDQorU1REQVBJIEdldE51bWJlck9mRm9ybWF0cyhVSU5UMzIgKm51bUZvcm1hdHMpDQorew0KKyAgKm51bUZvcm1hdHMgPSBnX051bUFyY3M7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1REQVBJIEdldElzQXJjKFVJbnQzMiBmb3JtYXRJbmRleCwgRnVuY19Jc0FyYyAqaXNBcmMpDQorew0KKyAgKmlzQXJjID0gTlVMTDsNCisgIGlmIChmb3JtYXRJbmRleCA+PSBnX051bUFyY3MpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICAqaXNBcmMgPSBnX0FyY3NbZm9ybWF0SW5kZXhdLT5Jc0FyYzsNCisgIHJldHVybiBTX09LOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0NvZGVyTWl4ZXIyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vQ29kZXJNaXhlcjIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODJkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0NvZGVyTWl4ZXIyLmNwcApAQCAtMCwwICsxLDExOSBAQAorLy8gQ29kZXJNaXhlcjIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJDb2Rlck1peGVyMi5oIg0KKw0KK25hbWVzcGFjZSBOQ29kZXJNaXhlciB7DQorDQorQ0JpbmRSZXZlcnNlQ29udmVydGVyOjpDQmluZFJldmVyc2VDb252ZXJ0ZXIoY29uc3QgQ0JpbmRJbmZvICZzcmNCaW5kSW5mbyk6DQorICBfc3JjQmluZEluZm8oc3JjQmluZEluZm8pDQorew0KKyAgc3JjQmluZEluZm8uR2V0TnVtU3RyZWFtcyhOdW1TcmNJblN0cmVhbXMsIF9udW1TcmNPdXRTdHJlYW1zKTsNCisNCisgIFVJbnQzMiBqOw0KKyAgX3NyY0luVG9EZXN0T3V0TWFwLkNsZWFyQW5kU2V0U2l6ZShOdW1TcmNJblN0cmVhbXMpOw0KKyAgRGVzdE91dFRvU3JjSW5NYXAuQ2xlYXJBbmRTZXRTaXplKE51bVNyY0luU3RyZWFtcyk7DQorDQorICBmb3IgKGogPSAwOyBqIDwgTnVtU3JjSW5TdHJlYW1zOyBqKyspDQorICB7DQorICAgIF9zcmNJblRvRGVzdE91dE1hcFtqXSA9IDA7DQorICAgIERlc3RPdXRUb1NyY0luTWFwW2pdID0gMDsNCisgIH0NCisNCisgIF9zcmNPdXRUb0Rlc3RJbk1hcC5DbGVhckFuZFNldFNpemUoX251bVNyY091dFN0cmVhbXMpOw0KKyAgX2Rlc3RJblRvU3JjT3V0TWFwLkNsZWFyQW5kU2V0U2l6ZShfbnVtU3JjT3V0U3RyZWFtcyk7DQorDQorICBmb3IgKGogPSAwOyBqIDwgX251bVNyY091dFN0cmVhbXM7IGorKykNCisgIHsNCisgICAgX3NyY091dFRvRGVzdEluTWFwW2pdID0gMDsNCisgICAgX2Rlc3RJblRvU3JjT3V0TWFwW2pdID0gMDsNCisgIH0NCisNCisgIFVJbnQzMiBkZXN0SW5PZmZzZXQgPSAwOw0KKyAgVUludDMyIGRlc3RPdXRPZmZzZXQgPSAwOw0KKyAgVUludDMyIHNyY0luT2Zmc2V0ID0gTnVtU3JjSW5TdHJlYW1zOw0KKyAgVUludDMyIHNyY091dE9mZnNldCA9IF9udW1TcmNPdXRTdHJlYW1zOw0KKw0KKyAgZm9yIChpbnQgaSA9IHNyY0JpbmRJbmZvLkNvZGVycy5TaXplKCkgLSAxOyBpID49IDA7IGktLSkNCisgIHsNCisgICAgY29uc3QgQ0NvZGVyU3RyZWFtc0luZm8gJnNyY0NvZGVySW5mbyA9IHNyY0JpbmRJbmZvLkNvZGVyc1tpXTsNCisNCisgICAgc3JjSW5PZmZzZXQgLT0gc3JjQ29kZXJJbmZvLk51bUluU3RyZWFtczsNCisgICAgc3JjT3V0T2Zmc2V0IC09IHNyY0NvZGVySW5mby5OdW1PdXRTdHJlYW1zOw0KKyAgICANCisgICAgVUludDMyIGo7DQorICAgIGZvciAoaiA9IDA7IGogPCBzcmNDb2RlckluZm8uTnVtSW5TdHJlYW1zOyBqKyssIGRlc3RPdXRPZmZzZXQrKykNCisgICAgew0KKyAgICAgIFVJbnQzMiBpbmRleCA9IHNyY0luT2Zmc2V0ICsgajsNCisgICAgICBfc3JjSW5Ub0Rlc3RPdXRNYXBbaW5kZXhdID0gZGVzdE91dE9mZnNldDsNCisgICAgICBEZXN0T3V0VG9TcmNJbk1hcFtkZXN0T3V0T2Zmc2V0XSA9IGluZGV4Ow0KKyAgICB9DQorICAgIGZvciAoaiA9IDA7IGogPCBzcmNDb2RlckluZm8uTnVtT3V0U3RyZWFtczsgaisrLCBkZXN0SW5PZmZzZXQrKykNCisgICAgew0KKyAgICAgIFVJbnQzMiBpbmRleCA9IHNyY091dE9mZnNldCArIGo7DQorICAgICAgX3NyY091dFRvRGVzdEluTWFwW2luZGV4XSA9IGRlc3RJbk9mZnNldDsNCisgICAgICBfZGVzdEluVG9TcmNPdXRNYXBbZGVzdEluT2Zmc2V0XSA9IGluZGV4Ow0KKyAgICB9DQorICB9DQorfQ0KKw0KK3ZvaWQgQ0JpbmRSZXZlcnNlQ29udmVydGVyOjpDcmVhdGVSZXZlcnNlQmluZEluZm8oQ0JpbmRJbmZvICZkZXN0QmluZEluZm8pDQorew0KKyAgZGVzdEJpbmRJbmZvLkNvZGVycy5DbGVhckFuZFJlc2VydmUoX3NyY0JpbmRJbmZvLkNvZGVycy5TaXplKCkpOw0KKyAgZGVzdEJpbmRJbmZvLkJpbmRQYWlycy5DbGVhckFuZFJlc2VydmUoX3NyY0JpbmRJbmZvLkJpbmRQYWlycy5TaXplKCkpOw0KKyAgZGVzdEJpbmRJbmZvLkluU3RyZWFtcy5DbGVhckFuZFJlc2VydmUoX3NyY0JpbmRJbmZvLk91dFN0cmVhbXMuU2l6ZSgpKTsNCisgIGRlc3RCaW5kSW5mby5PdXRTdHJlYW1zLkNsZWFyQW5kUmVzZXJ2ZShfc3JjQmluZEluZm8uSW5TdHJlYW1zLlNpemUoKSk7DQorDQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gX3NyY0JpbmRJbmZvLkNvZGVycy5TaXplKCk7IGkgIT0gMDspDQorICB7DQorICAgIGktLTsNCisgICAgY29uc3QgQ0NvZGVyU3RyZWFtc0luZm8gJnNyY0NvZGVySW5mbyA9IF9zcmNCaW5kSW5mby5Db2RlcnNbaV07DQorICAgIENDb2RlclN0cmVhbXNJbmZvIGRlc3RDb2RlckluZm87DQorICAgIGRlc3RDb2RlckluZm8uTnVtSW5TdHJlYW1zID0gc3JjQ29kZXJJbmZvLk51bU91dFN0cmVhbXM7DQorICAgIGRlc3RDb2RlckluZm8uTnVtT3V0U3RyZWFtcyA9IHNyY0NvZGVySW5mby5OdW1JblN0cmVhbXM7DQorICAgIGRlc3RCaW5kSW5mby5Db2RlcnMuQWRkSW5SZXNlcnZlZChkZXN0Q29kZXJJbmZvKTsNCisgIH0NCisgIGZvciAoaSA9IF9zcmNCaW5kSW5mby5CaW5kUGFpcnMuU2l6ZSgpOyBpICE9IDA7KQ0KKyAgew0KKyAgICBpLS07DQorICAgIGNvbnN0IENCaW5kUGFpciAmc3JjQmluZFBhaXIgPSBfc3JjQmluZEluZm8uQmluZFBhaXJzW2ldOw0KKyAgICBDQmluZFBhaXIgZGVzdEJpbmRQYWlyOw0KKyAgICBkZXN0QmluZFBhaXIuSW5JbmRleCA9IF9zcmNPdXRUb0Rlc3RJbk1hcFtzcmNCaW5kUGFpci5PdXRJbmRleF07DQorICAgIGRlc3RCaW5kUGFpci5PdXRJbmRleCA9IF9zcmNJblRvRGVzdE91dE1hcFtzcmNCaW5kUGFpci5JbkluZGV4XTsNCisgICAgZGVzdEJpbmRJbmZvLkJpbmRQYWlycy5BZGRJblJlc2VydmVkKGRlc3RCaW5kUGFpcik7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgX3NyY0JpbmRJbmZvLkluU3RyZWFtcy5TaXplKCk7IGkrKykNCisgICAgZGVzdEJpbmRJbmZvLk91dFN0cmVhbXMuQWRkSW5SZXNlcnZlZChfc3JjSW5Ub0Rlc3RPdXRNYXBbX3NyY0JpbmRJbmZvLkluU3RyZWFtc1tpXV0pOw0KKyAgZm9yIChpID0gMDsgaSA8IF9zcmNCaW5kSW5mby5PdXRTdHJlYW1zLlNpemUoKTsgaSsrKQ0KKyAgICBkZXN0QmluZEluZm8uSW5TdHJlYW1zLkFkZEluUmVzZXJ2ZWQoX3NyY091dFRvRGVzdEluTWFwW19zcmNCaW5kSW5mby5PdXRTdHJlYW1zW2ldXSk7DQorfQ0KKw0KK3ZvaWQgU2V0U2l6ZXMoY29uc3QgVUludDY0ICoqc3JjU2l6ZXMsIENSZWNvcmRWZWN0b3I8VUludDY0PiAmc2l6ZXMsDQorICAgIENSZWNvcmRWZWN0b3I8Y29uc3QgVUludDY0ICo+ICZzaXplUG9pbnRlcnMsIFVJbnQzMiBudW1JdGVtcykNCit7DQorICBzaXplcy5DbGVhckFuZFNldFNpemUobnVtSXRlbXMpOw0KKyAgc2l6ZVBvaW50ZXJzLkNsZWFyQW5kU2V0U2l6ZShudW1JdGVtcyk7DQorICBmb3IoVUludDMyIGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykNCisgIHsNCisgICAgaWYgKCFzcmNTaXplcyB8fCAhc3JjU2l6ZXNbaV0pDQorICAgIHsNCisgICAgICBzaXplc1tpXSA9IDA7DQorICAgICAgc2l6ZVBvaW50ZXJzW2ldID0gTlVMTDsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBzaXplc1tpXSA9ICooc3JjU2l6ZXNbaV0pOw0KKyAgICAgIHNpemVQb2ludGVyc1tpXSA9ICZzaXplc1tpXTsNCisgICAgfQ0KKyAgfQ0KK30NCisNCit2b2lkIENDb2RlckluZm8yOjpTZXRDb2RlckluZm8oY29uc3QgVUludDY0ICoqaW5TaXplcywgY29uc3QgVUludDY0ICoqb3V0U2l6ZXMpDQorew0KKyAgU2V0U2l6ZXMoaW5TaXplcywgSW5TaXplcywgSW5TaXplUG9pbnRlcnMsIE51bUluU3RyZWFtcyk7DQorICBTZXRTaXplcyhvdXRTaXplcywgT3V0U2l6ZXMsIE91dFNpemVQb2ludGVycywgTnVtT3V0U3RyZWFtcyk7DQorfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0NvZGVyTWl4ZXIyLmggYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0NvZGVyTWl4ZXIyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxOGJiMgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vQ29kZXJNaXhlcjIuaApAQCAtMCwwICsxLDE3OSBAQAorLy8gQ29kZXJNaXhlcjIuaA0KKw0KKyNpZm5kZWYgX19DT0RFUl9NSVhFUjJfSA0KKyNkZWZpbmUgX19DT0RFUl9NSVhFUjJfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlDb20uaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015VmVjdG9yLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0lDb2Rlci5oIg0KKw0KK25hbWVzcGFjZSBOQ29kZXJNaXhlciB7DQorDQorc3RydWN0IENCaW5kUGFpcg0KK3sNCisgIFVJbnQzMiBJbkluZGV4Ow0KKyAgVUludDMyIE91dEluZGV4Ow0KK307DQorDQorc3RydWN0IENDb2RlclN0cmVhbXNJbmZvDQorew0KKyAgVUludDMyIE51bUluU3RyZWFtczsNCisgIFVJbnQzMiBOdW1PdXRTdHJlYW1zOw0KK307DQorDQorc3RydWN0IENCaW5kSW5mbw0KK3sNCisgIENSZWNvcmRWZWN0b3I8Q0NvZGVyU3RyZWFtc0luZm8+IENvZGVyczsNCisgIENSZWNvcmRWZWN0b3I8Q0JpbmRQYWlyPiBCaW5kUGFpcnM7DQorICBDUmVjb3JkVmVjdG9yPFVJbnQzMj4gSW5TdHJlYW1zOw0KKyAgQ1JlY29yZFZlY3RvcjxVSW50MzI+IE91dFN0cmVhbXM7DQorDQorICB2b2lkIENsZWFyKCkNCisgIHsNCisgICAgQ29kZXJzLkNsZWFyKCk7DQorICAgIEJpbmRQYWlycy5DbGVhcigpOw0KKyAgICBJblN0cmVhbXMuQ2xlYXIoKTsNCisgICAgT3V0U3RyZWFtcy5DbGVhcigpOw0KKyAgfQ0KKw0KKyAgLyoNCisgIFVJbnQzMiBHZXRDb2RlclN0YXJ0T3V0U3RyZWFtKFVJbnQzMiBjb2RlckluZGV4KSBjb25zdA0KKyAgew0KKyAgICBVSW50MzIgbnVtT3V0U3RyZWFtcyA9IDA7DQorICAgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgY29kZXJJbmRleDsgaSsrKQ0KKyAgICAgIG51bU91dFN0cmVhbXMgKz0gQ29kZXJzW2ldLk51bU91dFN0cmVhbXM7DQorICAgIHJldHVybiBudW1PdXRTdHJlYW1zOw0KKyAgfQ0KKyAgKi8NCisNCisNCisgIHZvaWQgR2V0TnVtU3RyZWFtcyhVSW50MzIgJm51bUluU3RyZWFtcywgVUludDMyICZudW1PdXRTdHJlYW1zKSBjb25zdA0KKyAgew0KKyAgICBudW1JblN0cmVhbXMgPSAwOw0KKyAgICBudW1PdXRTdHJlYW1zID0gMDsNCisgICAgRk9SX1ZFQ1RPUiAoaSwgQ29kZXJzKQ0KKyAgICB7DQorICAgICAgY29uc3QgQ0NvZGVyU3RyZWFtc0luZm8gJmNvZGVyU3RyZWFtc0luZm8gPSBDb2RlcnNbaV07DQorICAgICAgbnVtSW5TdHJlYW1zICs9IGNvZGVyU3RyZWFtc0luZm8uTnVtSW5TdHJlYW1zOw0KKyAgICAgIG51bU91dFN0cmVhbXMgKz0gY29kZXJTdHJlYW1zSW5mby5OdW1PdXRTdHJlYW1zOw0KKyAgICB9DQorICB9DQorDQorICBpbnQgRmluZEJpbmRlckZvckluU3RyZWFtKFVJbnQzMiBpblN0cmVhbSkgY29uc3QNCisgIHsNCisgICAgRk9SX1ZFQ1RPUiAoaSwgQmluZFBhaXJzKQ0KKyAgICAgIGlmIChCaW5kUGFpcnNbaV0uSW5JbmRleCA9PSBpblN0cmVhbSkNCisgICAgICAgIHJldHVybiBpOw0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpbnQgRmluZEJpbmRlckZvck91dFN0cmVhbShVSW50MzIgb3V0U3RyZWFtKSBjb25zdA0KKyAgew0KKyAgICBGT1JfVkVDVE9SIChpLCBCaW5kUGFpcnMpDQorICAgICAgaWYgKEJpbmRQYWlyc1tpXS5PdXRJbmRleCA9PSBvdXRTdHJlYW0pDQorICAgICAgICByZXR1cm4gaTsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKw0KKyAgVUludDMyIEdldENvZGVySW5TdHJlYW1JbmRleChVSW50MzIgY29kZXJJbmRleCkgY29uc3QNCisgIHsNCisgICAgVUludDMyIHN0cmVhbUluZGV4ID0gMDsNCisgICAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBjb2RlckluZGV4OyBpKyspDQorICAgICAgc3RyZWFtSW5kZXggKz0gQ29kZXJzW2ldLk51bUluU3RyZWFtczsNCisgICAgcmV0dXJuIHN0cmVhbUluZGV4Ow0KKyAgfQ0KKw0KKyAgVUludDMyIEdldENvZGVyT3V0U3RyZWFtSW5kZXgoVUludDMyIGNvZGVySW5kZXgpIGNvbnN0DQorICB7DQorICAgIFVJbnQzMiBzdHJlYW1JbmRleCA9IDA7DQorICAgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgY29kZXJJbmRleDsgaSsrKQ0KKyAgICAgIHN0cmVhbUluZGV4ICs9IENvZGVyc1tpXS5OdW1PdXRTdHJlYW1zOw0KKyAgICByZXR1cm4gc3RyZWFtSW5kZXg7DQorICB9DQorDQorDQorICB2b2lkIEZpbmRJblN0cmVhbShVSW50MzIgc3RyZWFtSW5kZXgsIFVJbnQzMiAmY29kZXJJbmRleCwNCisgICAgICBVSW50MzIgJmNvZGVyU3RyZWFtSW5kZXgpIGNvbnN0DQorICB7DQorICAgIGZvciAoY29kZXJJbmRleCA9IDA7IGNvZGVySW5kZXggPCAoVUludDMyKUNvZGVycy5TaXplKCk7IGNvZGVySW5kZXgrKykNCisgICAgew0KKyAgICAgIFVJbnQzMiBjdXJTaXplID0gQ29kZXJzW2NvZGVySW5kZXhdLk51bUluU3RyZWFtczsNCisgICAgICBpZiAoc3RyZWFtSW5kZXggPCBjdXJTaXplKQ0KKyAgICAgIHsNCisgICAgICAgIGNvZGVyU3RyZWFtSW5kZXggPSBzdHJlYW1JbmRleDsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgc3RyZWFtSW5kZXggLT0gY3VyU2l6ZTsNCisgICAgfQ0KKyAgICB0aHJvdyAxOw0KKyAgfQ0KKyAgdm9pZCBGaW5kT3V0U3RyZWFtKFVJbnQzMiBzdHJlYW1JbmRleCwgVUludDMyICZjb2RlckluZGV4LA0KKyAgICAgIFVJbnQzMiAmY29kZXJTdHJlYW1JbmRleCkgY29uc3QNCisgIHsNCisgICAgZm9yIChjb2RlckluZGV4ID0gMDsgY29kZXJJbmRleCA8IChVSW50MzIpQ29kZXJzLlNpemUoKTsgY29kZXJJbmRleCsrKQ0KKyAgICB7DQorICAgICAgVUludDMyIGN1clNpemUgPSBDb2RlcnNbY29kZXJJbmRleF0uTnVtT3V0U3RyZWFtczsNCisgICAgICBpZiAoc3RyZWFtSW5kZXggPCBjdXJTaXplKQ0KKyAgICAgIHsNCisgICAgICAgIGNvZGVyU3RyZWFtSW5kZXggPSBzdHJlYW1JbmRleDsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgc3RyZWFtSW5kZXggLT0gY3VyU2l6ZTsNCisgICAgfQ0KKyAgICB0aHJvdyAxOw0KKyAgfQ0KK307DQorDQorY2xhc3MgQ0JpbmRSZXZlcnNlQ29udmVydGVyDQorew0KKyAgVUludDMyIF9udW1TcmNPdXRTdHJlYW1zOw0KKyAgTkNvZGVyTWl4ZXI6OkNCaW5kSW5mbyBfc3JjQmluZEluZm87DQorICBDUmVjb3JkVmVjdG9yPFVJbnQzMj4gX3NyY0luVG9EZXN0T3V0TWFwOw0KKyAgQ1JlY29yZFZlY3RvcjxVSW50MzI+IF9zcmNPdXRUb0Rlc3RJbk1hcDsNCisgIENSZWNvcmRWZWN0b3I8VUludDMyPiBfZGVzdEluVG9TcmNPdXRNYXA7DQorcHVibGljOg0KKyAgVUludDMyIE51bVNyY0luU3RyZWFtczsNCisgIENSZWNvcmRWZWN0b3I8VUludDMyPiBEZXN0T3V0VG9TcmNJbk1hcDsNCisNCisgIENCaW5kUmV2ZXJzZUNvbnZlcnRlcihjb25zdCBOQ29kZXJNaXhlcjo6Q0JpbmRJbmZvICZzcmNCaW5kSW5mbyk7DQorICB2b2lkIENyZWF0ZVJldmVyc2VCaW5kSW5mbyhOQ29kZXJNaXhlcjo6Q0JpbmRJbmZvICZkZXN0QmluZEluZm8pOw0KK307DQorDQordm9pZCBTZXRTaXplcyhjb25zdCBVSW50NjQgKipzcmNTaXplcywgQ1JlY29yZFZlY3RvcjxVSW50NjQ+ICZzaXplcywNCisgICAgQ1JlY29yZFZlY3Rvcjxjb25zdCBVSW50NjQgKj4gJnNpemVQb2ludGVycywgVUludDMyIG51bUl0ZW1zKTsNCisNCitzdHJ1Y3QgQ0NvZGVySW5mbzINCit7DQorICBDTXlDb21QdHI8SUNvbXByZXNzQ29kZXI+IENvZGVyOw0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyMj4gQ29kZXIyOw0KKyAgVUludDMyIE51bUluU3RyZWFtczsNCisgIFVJbnQzMiBOdW1PdXRTdHJlYW1zOw0KKw0KKyAgQ1JlY29yZFZlY3RvcjxVSW50NjQ+IEluU2l6ZXM7DQorICBDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gT3V0U2l6ZXM7DQorICBDUmVjb3JkVmVjdG9yPGNvbnN0IFVJbnQ2NCAqPiBJblNpemVQb2ludGVyczsNCisgIENSZWNvcmRWZWN0b3I8Y29uc3QgVUludDY0ICo+IE91dFNpemVQb2ludGVyczsNCisNCisgIENDb2RlckluZm8yKFVJbnQzMiBudW1JblN0cmVhbXMsIFVJbnQzMiBudW1PdXRTdHJlYW1zKToNCisgICAgICBOdW1JblN0cmVhbXMobnVtSW5TdHJlYW1zKSwNCisgICAgICBOdW1PdXRTdHJlYW1zKG51bU91dFN0cmVhbXMpIHt9DQorICB2b2lkIFNldENvZGVySW5mbyhjb25zdCBVSW50NjQgKippblNpemVzLCBjb25zdCBVSW50NjQgKipvdXRTaXplcyk7DQorDQorICBIUkVTVUxUIFF1ZXJ5SW50ZXJmYWNlKFJFRkdVSUQgaWlkLCB2b2lkKiogcHApIGNvbnN0DQorICB7DQorICAgIElVbmtub3duICpwID0gQ29kZXIgPyAoSVVua25vd24gKilDb2RlciA6IChJVW5rbm93biAqKUNvZGVyMjsNCisgICAgcmV0dXJuIHAtPlF1ZXJ5SW50ZXJmYWNlKGlpZCwgcHApOw0KKyAgfQ0KK307DQorDQorY2xhc3MgQ0NvZGVyTWl4ZXIyDQorew0KK3B1YmxpYzoNCisgIHZpcnR1YWwgSFJFU1VMVCBTZXRCaW5kSW5mbyhjb25zdCBDQmluZEluZm8gJmJpbmRJbmZvKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVJbml0KCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENvZGVySW5mbyhVSW50MzIgY29kZXJJbmRleCwgY29uc3QgVUludDY0ICoqaW5TaXplcywgY29uc3QgVUludDY0ICoqb3V0U2l6ZXMpID0gMDsNCit9Ow0KKw0KK30NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0NvZGVyTWl4ZXIyTVQuY3BwIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9Db2Rlck1peGVyMk1ULmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTljMTNlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9Db2Rlck1peGVyMk1ULmNwcApAQCAtMCwwICsxLDIxOCBAQAorLy8gQ29kZXJNaXhlcjJNVC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIkNvZGVyTWl4ZXIyTVQuaCINCisNCituYW1lc3BhY2UgTkNvZGVyTWl4ZXIgew0KKw0KK0NDb2RlcjI6OkNDb2RlcjIoVUludDMyIG51bUluU3RyZWFtcywgVUludDMyIG51bU91dFN0cmVhbXMpOg0KKyAgICBDQ29kZXJJbmZvMihudW1JblN0cmVhbXMsIG51bU91dFN0cmVhbXMpDQorew0KKyAgSW5TdHJlYW1zLkNsZWFyQW5kUmVzZXJ2ZShOdW1JblN0cmVhbXMpOw0KKyAgT3V0U3RyZWFtcy5DbGVhckFuZFJlc2VydmUoTnVtT3V0U3RyZWFtcyk7DQorfQ0KKw0KK3ZvaWQgQ0NvZGVyMjo6RXhlY3V0ZSgpIHsgQ29kZShOVUxMKTsgfQ0KKw0KK3ZvaWQgQ0NvZGVyMjo6Q29kZShJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKQ0KK3sNCisgIEluU3RyZWFtUG9pbnRlcnMuQ2xlYXJBbmRSZXNlcnZlKE51bUluU3RyZWFtcyk7DQorICBPdXRTdHJlYW1Qb2ludGVycy5DbGVhckFuZFJlc2VydmUoTnVtT3V0U3RyZWFtcyk7DQorICBVSW50MzIgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBOdW1JblN0cmVhbXM7IGkrKykNCisgIHsNCisgICAgaWYgKEluU2l6ZVBvaW50ZXJzW2ldKQ0KKyAgICAgIEluU2l6ZVBvaW50ZXJzW2ldID0gJkluU2l6ZXNbaV07DQorICAgIEluU3RyZWFtUG9pbnRlcnMuQWRkSW5SZXNlcnZlZCgoSVNlcXVlbnRpYWxJblN0cmVhbSAqKUluU3RyZWFtc1tpXSk7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgTnVtT3V0U3RyZWFtczsgaSsrKQ0KKyAgew0KKyAgICBpZiAoT3V0U2l6ZVBvaW50ZXJzW2ldKQ0KKyAgICAgIE91dFNpemVQb2ludGVyc1tpXSA9ICZPdXRTaXplc1tpXTsNCisgICAgT3V0U3RyZWFtUG9pbnRlcnMuQWRkSW5SZXNlcnZlZCgoSVNlcXVlbnRpYWxPdXRTdHJlYW0gKilPdXRTdHJlYW1zW2ldKTsNCisgIH0NCisgIGlmIChDb2RlcikNCisgICAgUmVzdWx0ID0gQ29kZXItPkNvZGUoSW5TdHJlYW1Qb2ludGVyc1swXSwgT3V0U3RyZWFtUG9pbnRlcnNbMF0sDQorICAgICAgICBJblNpemVQb2ludGVyc1swXSwgT3V0U2l6ZVBvaW50ZXJzWzBdLCBwcm9ncmVzcyk7DQorICBlbHNlDQorICAgIFJlc3VsdCA9IENvZGVyMi0+Q29kZSgmSW5TdHJlYW1Qb2ludGVycy5Gcm9udCgpLCAmSW5TaXplUG9pbnRlcnMuRnJvbnQoKSwgTnVtSW5TdHJlYW1zLA0KKyAgICAgICZPdXRTdHJlYW1Qb2ludGVycy5Gcm9udCgpLCAmT3V0U2l6ZVBvaW50ZXJzLkZyb250KCksIE51bU91dFN0cmVhbXMsIHByb2dyZXNzKTsNCisgIHsNCisgICAgdW5zaWduZWQgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IEluU3RyZWFtcy5TaXplKCk7IGkrKykNCisgICAgICBJblN0cmVhbXNbaV0uUmVsZWFzZSgpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgT3V0U3RyZWFtcy5TaXplKCk7IGkrKykNCisgICAgICBPdXRTdHJlYW1zW2ldLlJlbGVhc2UoKTsNCisgIH0NCit9DQorDQorLyoNCit2b2lkIENDb2RlcjI6OlNldENvZGVySW5mbyhjb25zdCBVSW50NjQgKippblNpemVzLCBjb25zdCBVSW50NjQgKipvdXRTaXplcykNCit7DQorICBTZXRTaXplcyhpblNpemVzLCBJblNpemVzLCBJblNpemVQb2ludGVycywgTnVtSW5TdHJlYW1zKTsNCisgIFNldFNpemVzKG91dFNpemVzLCBPdXRTaXplcywgT3V0U2l6ZVBvaW50ZXJzLCBOdW1PdXRTdHJlYW1zKTsNCit9DQorKi8NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENDb2Rlck1peGVyMk1UDQorDQorSFJFU1VMVCBDQ29kZXJNaXhlcjJNVDo6U2V0QmluZEluZm8oY29uc3QgQ0JpbmRJbmZvICZiaW5kSW5mbykNCit7DQorICBfYmluZEluZm8gPSBiaW5kSW5mbzsNCisgIF9zdHJlYW1CaW5kZXJzLkNsZWFyKCk7DQorICBGT1JfVkVDVE9SIChpLCBfYmluZEluZm8uQmluZFBhaXJzKQ0KKyAgew0KKyAgICBSSU5PSyhfc3RyZWFtQmluZGVycy5BZGROZXcoKS5DcmVhdGVFdmVudHMoKSk7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQordm9pZCBDQ29kZXJNaXhlcjJNVDo6QWRkQ29kZXJDb21tb24oKQ0KK3sNCisgIGNvbnN0IENDb2RlclN0cmVhbXNJbmZvICZjID0gX2JpbmRJbmZvLkNvZGVyc1tfY29kZXJzLlNpemUoKV07DQorICBDQ29kZXIyIHRocmVhZENvZGVySW5mbyhjLk51bUluU3RyZWFtcywgYy5OdW1PdXRTdHJlYW1zKTsNCisgIF9jb2RlcnMuQWRkKHRocmVhZENvZGVySW5mbyk7DQorfQ0KKw0KK3ZvaWQgQ0NvZGVyTWl4ZXIyTVQ6OkFkZENvZGVyKElDb21wcmVzc0NvZGVyICpjb2RlcikNCit7DQorICBBZGRDb2RlckNvbW1vbigpOw0KKyAgX2NvZGVycy5CYWNrKCkuQ29kZXIgPSBjb2RlcjsNCit9DQorDQordm9pZCBDQ29kZXJNaXhlcjJNVDo6QWRkQ29kZXIyKElDb21wcmVzc0NvZGVyMiAqY29kZXIpDQorew0KKyAgQWRkQ29kZXJDb21tb24oKTsNCisgIF9jb2RlcnMuQmFjaygpLkNvZGVyMiA9IGNvZGVyOw0KK30NCisNCisNCit2b2lkIENDb2Rlck1peGVyMk1UOjpSZUluaXQoKQ0KK3sNCisgIEZPUl9WRUNUT1IgKGksIF9zdHJlYW1CaW5kZXJzKQ0KKyAgICBfc3RyZWFtQmluZGVyc1tpXS5SZUluaXQoKTsNCit9DQorDQorDQorSFJFU1VMVCBDQ29kZXJNaXhlcjJNVDo6SW5pdChJU2VxdWVudGlhbEluU3RyZWFtICoqaW5TdHJlYW1zLCBJU2VxdWVudGlhbE91dFN0cmVhbSAqKm91dFN0cmVhbXMpDQorew0KKyAgLyoNCisgIGlmIChfY29kZXJzLlNpemUoKSAhPSBfYmluZEluZm8uQ29kZXJzLlNpemUoKSkNCisgICAgdGhyb3cgMDsNCisgICovDQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IF9jb2RlcnMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIENDb2RlcjIgJmNvZGVySW5mbyA9IF9jb2RlcnNbaV07DQorICAgIGNvbnN0IENDb2RlclN0cmVhbXNJbmZvICZjb2RlclN0cmVhbXNJbmZvID0gX2JpbmRJbmZvLkNvZGVyc1tpXTsNCisgICAgY29kZXJJbmZvLkluU3RyZWFtcy5DbGVhcigpOw0KKyAgICBVSW50MzIgajsNCisgICAgZm9yIChqID0gMDsgaiA8IGNvZGVyU3RyZWFtc0luZm8uTnVtSW5TdHJlYW1zOyBqKyspDQorICAgICAgY29kZXJJbmZvLkluU3RyZWFtcy5BZGQoTlVMTCk7DQorICAgIGNvZGVySW5mby5PdXRTdHJlYW1zLkNsZWFyKCk7DQorICAgIGZvciAoaiA9IDA7IGogPCBjb2RlclN0cmVhbXNJbmZvLk51bU91dFN0cmVhbXM7IGorKykNCisgICAgICBjb2RlckluZm8uT3V0U3RyZWFtcy5BZGQoTlVMTCk7DQorICB9DQorDQorICBmb3IgKGkgPSAwOyBpIDwgX2JpbmRJbmZvLkJpbmRQYWlycy5TaXplKCk7IGkrKykNCisgIHsNCisgICAgY29uc3QgQ0JpbmRQYWlyICZiaW5kUGFpciA9IF9iaW5kSW5mby5CaW5kUGFpcnNbaV07DQorICAgIFVJbnQzMiBpbkNvZGVySW5kZXgsIGluQ29kZXJTdHJlYW1JbmRleDsNCisgICAgVUludDMyIG91dENvZGVySW5kZXgsIG91dENvZGVyU3RyZWFtSW5kZXg7DQorICAgIF9iaW5kSW5mby5GaW5kSW5TdHJlYW0oYmluZFBhaXIuSW5JbmRleCwgaW5Db2RlckluZGV4LCBpbkNvZGVyU3RyZWFtSW5kZXgpOw0KKyAgICBfYmluZEluZm8uRmluZE91dFN0cmVhbShiaW5kUGFpci5PdXRJbmRleCwgb3V0Q29kZXJJbmRleCwgb3V0Q29kZXJTdHJlYW1JbmRleCk7DQorDQorICAgIF9zdHJlYW1CaW5kZXJzW2ldLkNyZWF0ZVN0cmVhbXMoDQorICAgICAgICAmX2NvZGVyc1tpbkNvZGVySW5kZXhdLkluU3RyZWFtc1tpbkNvZGVyU3RyZWFtSW5kZXhdLA0KKyAgICAgICAgJl9jb2RlcnNbb3V0Q29kZXJJbmRleF0uT3V0U3RyZWFtc1tvdXRDb2RlclN0cmVhbUluZGV4XSk7DQorDQorICAgIENNeUNvbVB0cjxJQ29tcHJlc3NTZXRCdWZTaXplPiBpblNldFNpemUsIG91dFNldFNpemU7DQorICAgIF9jb2RlcnNbaW5Db2RlckluZGV4XS5RdWVyeUludGVyZmFjZShJSURfSUNvbXByZXNzU2V0QnVmU2l6ZSwgKHZvaWQgKiopJmluU2V0U2l6ZSk7DQorICAgIF9jb2RlcnNbb3V0Q29kZXJJbmRleF0uUXVlcnlJbnRlcmZhY2UoSUlEX0lDb21wcmVzc1NldEJ1ZlNpemUsICh2b2lkICoqKSZvdXRTZXRTaXplKTsNCisgICAgaWYgKGluU2V0U2l6ZSAmJiBvdXRTZXRTaXplKQ0KKyAgICB7DQorICAgICAgY29uc3QgVUludDMyIGtCdWZTaXplID0gMSA8PCAxOTsNCisgICAgICBpblNldFNpemUtPlNldEluQnVmU2l6ZShpbkNvZGVyU3RyZWFtSW5kZXgsIGtCdWZTaXplKTsNCisgICAgICBvdXRTZXRTaXplLT5TZXRPdXRCdWZTaXplKG91dENvZGVyU3RyZWFtSW5kZXgsIGtCdWZTaXplKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgZm9yIChpID0gMDsgaSA8IF9iaW5kSW5mby5JblN0cmVhbXMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIFVJbnQzMiBpbkNvZGVySW5kZXgsIGluQ29kZXJTdHJlYW1JbmRleDsNCisgICAgX2JpbmRJbmZvLkZpbmRJblN0cmVhbShfYmluZEluZm8uSW5TdHJlYW1zW2ldLCBpbkNvZGVySW5kZXgsIGluQ29kZXJTdHJlYW1JbmRleCk7DQorICAgIF9jb2RlcnNbaW5Db2RlckluZGV4XS5JblN0cmVhbXNbaW5Db2RlclN0cmVhbUluZGV4XSA9IGluU3RyZWFtc1tpXTsNCisgIH0NCisgIA0KKyAgZm9yIChpID0gMDsgaSA8IF9iaW5kSW5mby5PdXRTdHJlYW1zLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICBVSW50MzIgb3V0Q29kZXJJbmRleCwgb3V0Q29kZXJTdHJlYW1JbmRleDsNCisgICAgX2JpbmRJbmZvLkZpbmRPdXRTdHJlYW0oX2JpbmRJbmZvLk91dFN0cmVhbXNbaV0sIG91dENvZGVySW5kZXgsIG91dENvZGVyU3RyZWFtSW5kZXgpOw0KKyAgICBfY29kZXJzW291dENvZGVySW5kZXhdLk91dFN0cmVhbXNbb3V0Q29kZXJTdHJlYW1JbmRleF0gPSBvdXRTdHJlYW1zW2ldOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ0NvZGVyTWl4ZXIyTVQ6OlJldHVybklmRXJyb3IoSFJFU1VMVCBjb2RlKQ0KK3sNCisgIEZPUl9WRUNUT1IgKGksIF9jb2RlcnMpDQorICAgIGlmIChfY29kZXJzW2ldLlJlc3VsdCA9PSBjb2RlKQ0KKyAgICAgIHJldHVybiBjb2RlOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQ29kZXJNaXhlcjJNVDo6Q29kZShJU2VxdWVudGlhbEluU3RyZWFtICoqaW5TdHJlYW1zLA0KKyAgICAgIGNvbnN0IFVJbnQ2NCAqKiAvKiBpblNpemVzICovLA0KKyAgICAgIFVJbnQzMiBudW1JblN0cmVhbXMsDQorICAgICAgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKipvdXRTdHJlYW1zLA0KKyAgICAgIGNvbnN0IFVJbnQ2NCAqKiAvKiBvdXRTaXplcyAqLywNCisgICAgICBVSW50MzIgbnVtT3V0U3RyZWFtcywNCisgICAgICBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKQ0KK3sNCisgIGlmIChudW1JblN0cmVhbXMgIT0gKFVJbnQzMilfYmluZEluZm8uSW5TdHJlYW1zLlNpemUoKSB8fA0KKyAgICAgIG51bU91dFN0cmVhbXMgIT0gKFVJbnQzMilfYmluZEluZm8uT3V0U3RyZWFtcy5TaXplKCkpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorDQorICBJbml0KGluU3RyZWFtcywgb3V0U3RyZWFtcyk7DQorDQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IF9jb2RlcnMuU2l6ZSgpOyBpKyspDQorICAgIGlmIChpICE9IF9wcm9ncmVzc0NvZGVySW5kZXgpDQorICAgIHsNCisgICAgICBSSU5PSyhfY29kZXJzW2ldLkNyZWF0ZSgpKTsNCisgICAgfQ0KKw0KKyAgZm9yIChpID0gMDsgaSA8IF9jb2RlcnMuU2l6ZSgpOyBpKyspDQorICAgIGlmIChpICE9IF9wcm9ncmVzc0NvZGVySW5kZXgpDQorICAgICAgX2NvZGVyc1tpXS5TdGFydCgpOw0KKw0KKyAgX2NvZGVyc1tfcHJvZ3Jlc3NDb2RlckluZGV4XS5Db2RlKHByb2dyZXNzKTsNCisNCisgIGZvciAoaSA9IDA7IGkgPCBfY29kZXJzLlNpemUoKTsgaSsrKQ0KKyAgICBpZiAoaSAhPSBfcHJvZ3Jlc3NDb2RlckluZGV4KQ0KKyAgICAgIF9jb2RlcnNbaV0uV2FpdEV4ZWN1dGVGaW5pc2goKTsNCisNCisgIFJJTk9LKFJldHVybklmRXJyb3IoRV9BQk9SVCkpOw0KKyAgUklOT0soUmV0dXJuSWZFcnJvcihFX09VVE9GTUVNT1JZKSk7DQorDQorICBmb3IgKGkgPSAwOyBpIDwgX2NvZGVycy5TaXplKCk7IGkrKykNCisgIHsNCisgICAgSFJFU1VMVCByZXN1bHQgPSBfY29kZXJzW2ldLlJlc3VsdDsNCisgICAgaWYgKHJlc3VsdCAhPSBTX09LICYmIHJlc3VsdCAhPSBFX0ZBSUwgJiYgcmVzdWx0ICE9IFNfRkFMU0UpDQorICAgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIFJJTk9LKFJldHVybklmRXJyb3IoU19GQUxTRSkpOw0KKw0KKyAgZm9yIChpID0gMDsgaSA8IF9jb2RlcnMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIEhSRVNVTFQgcmVzdWx0ID0gX2NvZGVyc1tpXS5SZXN1bHQ7DQorICAgIGlmIChyZXN1bHQgIT0gU19PSykNCisgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0NvZGVyTWl4ZXIyTVQuaCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vQ29kZXJNaXhlcjJNVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZDBjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0NvZGVyTWl4ZXIyTVQuaApAQCAtMCwwICsxLDgzIEBACisvLyBDb2Rlck1peGVyMk1ULmgNCisNCisjaWZuZGVmIF9fQ09ERVJfTUlYRVIyX01UX0gNCisjZGVmaW5lIF9fQ09ERVJfTUlYRVIyX01UX0gNCisNCisjaW5jbHVkZSAiQ29kZXJNaXhlcjIuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015Q29tLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9TdHJlYW1CaW5kZXIuaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL1ZpcnRUaHJlYWQuaCINCisNCituYW1lc3BhY2UgTkNvZGVyTWl4ZXIgew0KKw0KK3N0cnVjdCBDQ29kZXIyOiBwdWJsaWMgQ0NvZGVySW5mbzIsIHB1YmxpYyBDVmlydFRocmVhZA0KK3sNCisgIENSZWNvcmRWZWN0b3I8SVNlcXVlbnRpYWxJblN0cmVhbSo+IEluU3RyZWFtUG9pbnRlcnM7DQorICBDUmVjb3JkVmVjdG9yPElTZXF1ZW50aWFsT3V0U3RyZWFtKj4gT3V0U3RyZWFtUG9pbnRlcnM7DQorDQorcHVibGljOg0KKyAgSFJFU1VMVCBSZXN1bHQ7DQorICBDT2JqZWN0VmVjdG9yPCBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gPiBJblN0cmVhbXM7DQorICBDT2JqZWN0VmVjdG9yPCBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+ID4gT3V0U3RyZWFtczsNCisNCisgIENDb2RlcjIoVUludDMyIG51bUluU3RyZWFtcywgVUludDMyIG51bU91dFN0cmVhbXMpOw0KKyAgfkNDb2RlcjIoKSB7IENWaXJ0VGhyZWFkOjpXYWl0VGhyZWFkRmluaXNoKCk7IH0NCisgIC8vIHZvaWQgU2V0Q29kZXJJbmZvKGNvbnN0IFVJbnQ2NCAqKmluU2l6ZXMsIGNvbnN0IFVJbnQ2NCAqKm91dFNpemVzKTsNCisgIHZpcnR1YWwgdm9pZCBFeGVjdXRlKCk7DQorICB2b2lkIENvZGUoSUNvbXByZXNzUHJvZ3Jlc3NJbmZvICpwcm9ncmVzcyk7DQorfTsNCisNCisNCisvKg0KKyAgU2V0QmluZEluZm8oKQ0KKyAgZm9yIGVhY2ggY29kZXINCisgICAgQWRkQ29kZXJbMl0oKQ0KKyAgU2V0UHJvZ3Jlc3NJbmRleChVSW50MzIgY29kZXJJbmRleCk7DQorIA0KKyAgZm9yIGVhY2ggZmlsZQ0KKyAgew0KKyAgICBSZUluaXQoKQ0KKyAgICBmb3IgZWFjaCBjb2Rlcg0KKyAgICAgIFNldENvZGVySW5mbw0KKyAgICBDb2RlDQorICB9DQorKi8NCisNCitjbGFzcyBDQ29kZXJNaXhlcjJNVDoNCisgIHB1YmxpYyBJQ29tcHJlc3NDb2RlcjIsDQorICBwdWJsaWMgQ0NvZGVyTWl4ZXIyLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBDQmluZEluZm8gX2JpbmRJbmZvOw0KKyAgQ09iamVjdFZlY3RvcjxDU3RyZWFtQmluZGVyPiBfc3RyZWFtQmluZGVyczsNCisgIHVuc2lnbmVkIF9wcm9ncmVzc0NvZGVySW5kZXg7DQorDQorICB2b2lkIEFkZENvZGVyQ29tbW9uKCk7DQorICBIUkVTVUxUIEluaXQoSVNlcXVlbnRpYWxJblN0cmVhbSAqKmluU3RyZWFtcywgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKipvdXRTdHJlYW1zKTsNCisgIEhSRVNVTFQgUmV0dXJuSWZFcnJvcihIUkVTVUxUIGNvZGUpOw0KK3B1YmxpYzoNCisgIENPYmplY3RWZWN0b3I8Q0NvZGVyMj4gX2NvZGVyczsNCisgIE1ZX1VOS05PV05fSU1QDQorDQorICBTVERNRVRIT0QoQ29kZSkoSVNlcXVlbnRpYWxJblN0cmVhbSAqKmluU3RyZWFtcywNCisgICAgICBjb25zdCBVSW50NjQgKippblNpemVzLA0KKyAgICAgIFVJbnQzMiBudW1JblN0cmVhbXMsDQorICAgICAgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKipvdXRTdHJlYW1zLA0KKyAgICAgIGNvbnN0IFVJbnQ2NCAqKm91dFNpemVzLA0KKyAgICAgIFVJbnQzMiBudW1PdXRTdHJlYW1zLA0KKyAgICAgIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpOw0KKw0KKyAgSFJFU1VMVCBTZXRCaW5kSW5mbyhjb25zdCBDQmluZEluZm8gJmJpbmRJbmZvKTsNCisgIHZvaWQgQWRkQ29kZXIoSUNvbXByZXNzQ29kZXIgKmNvZGVyKTsNCisgIHZvaWQgQWRkQ29kZXIyKElDb21wcmVzc0NvZGVyMiAqY29kZXIpOw0KKyAgdm9pZCBTZXRQcm9ncmVzc0NvZGVySW5kZXgodW5zaWduZWQgY29kZXJJbmRleCkgeyAgX3Byb2dyZXNzQ29kZXJJbmRleCA9IGNvZGVySW5kZXg7IH0NCisNCisgIHZvaWQgUmVJbml0KCk7DQorICB2b2lkIFNldENvZGVySW5mbyhVSW50MzIgY29kZXJJbmRleCwgY29uc3QgVUludDY0ICoqaW5TaXplcywgY29uc3QgVUludDY0ICoqb3V0U2l6ZXMpDQorICAgIHsgIF9jb2RlcnNbY29kZXJJbmRleF0uU2V0Q29kZXJJbmZvKGluU2l6ZXMsIG91dFNpemVzKTsgfQ0KKyAgVUludDY0IEdldFdyaXRlUHJvY2Vzc2VkU2l6ZShVSW50MzIgYmluZGVySW5kZXgpIGNvbnN0DQorICAgIHsgIHJldHVybiBfc3RyZWFtQmluZGVyc1tiaW5kZXJJbmRleF0uUHJvY2Vzc2VkU2l6ZTsgfQ0KK307DQorDQorfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vQ3Jvc3NUaHJlYWRQcm9ncmVzcy5jcHAgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0Nyb3NzVGhyZWFkUHJvZ3Jlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDA1YWYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0Nyb3NzVGhyZWFkUHJvZ3Jlc3MuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKy8vIENyb3NzVGhyZWFkUHJvZ3Jlc3MuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJDcm9zc1RocmVhZFByb2dyZXNzLmgiDQorDQorU1RETUVUSE9ESU1QIENDcm9zc1RocmVhZFByb2dyZXNzOjpTZXRSYXRpb0luZm8oY29uc3QgVUludDY0ICppblNpemUsIGNvbnN0IFVJbnQ2NCAqb3V0U2l6ZSkNCit7DQorICBJblNpemUgPSBpblNpemU7DQorICBPdXRTaXplID0gb3V0U2l6ZTsNCisgIFByb2dyZXNzRXZlbnQuU2V0KCk7DQorICBXYWl0RXZlbnQuTG9jaygpOw0KKyAgcmV0dXJuIFJlc3VsdDsNCit9DQorDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9Dcm9zc1RocmVhZFByb2dyZXNzLmggYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0Nyb3NzVGhyZWFkUHJvZ3Jlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDE0OTU4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9Dcm9zc1RocmVhZFByb2dyZXNzLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ3Jvc3NUaHJlYWRQcm9ncmVzcy5oDQorDQorI2lmbmRlZiBfX0NST1NTVEhSRUFEUFJPR1JFU1NfSA0KKyNkZWZpbmUgX19DUk9TU1RIUkVBRFBST0dSRVNTX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vSUNvZGVyLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvU3luY2hyb25pemF0aW9uLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKw0KK2NsYXNzIENDcm9zc1RocmVhZFByb2dyZXNzOg0KKyAgcHVibGljIElDb21wcmVzc1Byb2dyZXNzSW5mbywNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KK3B1YmxpYzoNCisgIGNvbnN0IFVJbnQ2NCAqSW5TaXplOw0KKyAgY29uc3QgVUludDY0ICpPdXRTaXplOw0KKyAgSFJFU1VMVCBSZXN1bHQ7DQorICBOV2luZG93czo6TlN5bmNocm9uaXphdGlvbjo6Q0F1dG9SZXNldEV2ZW50IFByb2dyZXNzRXZlbnQ7DQorICBOV2luZG93czo6TlN5bmNocm9uaXphdGlvbjo6Q0F1dG9SZXNldEV2ZW50IFdhaXRFdmVudDsNCisNCisgIEhSZXMgQ3JlYXRlKCkNCisgIHsNCisgICAgUklOT0soUHJvZ3Jlc3NFdmVudC5DcmVhdGVJZk5vdENyZWF0ZWQoKSk7DQorICAgIHJldHVybiBXYWl0RXZlbnQuQ3JlYXRlSWZOb3RDcmVhdGVkKCk7DQorICB9DQorICB2b2lkIEluaXQoKQ0KKyAgew0KKyAgICBQcm9ncmVzc0V2ZW50LlJlc2V0KCk7DQorICAgIFdhaXRFdmVudC5SZXNldCgpOw0KKyAgfQ0KKw0KKyAgTVlfVU5LTk9XTl9JTVANCisNCisgIFNURE1FVEhPRChTZXRSYXRpb0luZm8pKGNvbnN0IFVJbnQ2NCAqaW5TaXplLCBjb25zdCBVSW50NjQgKm91dFNpemUpOw0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9EdW1teU91dFN0cmVhbS5jcHAgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0R1bW15T3V0U3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2Q0NWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9EdW1teU91dFN0cmVhbS5jcHAKQEAgLTAsMCArMSwxNyBAQAorLy8gRHVtbXlPdXRTdHJlYW0uY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJEdW1teU91dFN0cmVhbS5oIg0KKw0KK1NURE1FVEhPRElNUCBDRHVtbXlPdXRTdHJlYW06OldyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgVUludDMyIHJlYWxQcm9jZXNzZWRTaXplID0gc2l6ZTsNCisgIEhSRVNVTFQgcmVzID0gU19PSzsNCisgIGlmIChfc3RyZWFtKQ0KKyAgICByZXMgPSBfc3RyZWFtLT5Xcml0ZShkYXRhLCBzaXplLCAmcmVhbFByb2Nlc3NlZFNpemUpOw0KKyAgX3NpemUgKz0gcmVhbFByb2Nlc3NlZFNpemU7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSByZWFsUHJvY2Vzc2VkU2l6ZTsNCisgIHJldHVybiByZXM7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vRHVtbXlPdXRTdHJlYW0uaCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vRHVtbXlPdXRTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGU4NGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9EdW1teU91dFN0cmVhbS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIER1bW15T3V0U3RyZWFtLmgNCisNCisjaWZuZGVmIF9fRFVNTVlfT1VUX1NUUkVBTV9IDQorI2RlZmluZSBfX0RVTU1ZX09VVF9TVFJFQU1fSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlDb20uaCINCisNCisjaW5jbHVkZSAiLi4vLi4vSVN0cmVhbS5oIg0KKw0KK2NsYXNzIENEdW1teU91dFN0cmVhbToNCisgIHB1YmxpYyBJU2VxdWVudGlhbE91dFN0cmVhbSwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsT3V0U3RyZWFtPiBfc3RyZWFtOw0KKyAgVUludDY0IF9zaXplOw0KK3B1YmxpYzoNCisgIHZvaWQgU2V0U3RyZWFtKElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0pIHsgX3N0cmVhbSA9IG91dFN0cmVhbTsgfQ0KKyAgdm9pZCBSZWxlYXNlU3RyZWFtKCkgeyBfc3RyZWFtLlJlbGVhc2UoKTsgfQ0KKyAgdm9pZCBJbml0KCkgeyBfc2l6ZSA9IDA7IH0NCisgIE1ZX1VOS05PV05fSU1QDQorICBTVERNRVRIT0QoV3JpdGUpKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KKyAgVUludDY0IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBfc2l6ZTsgfQ0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9IYW5kbGVyT3V0LmNwcCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vSGFuZGxlck91dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5MjBiYwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vSGFuZGxlck91dC5jcHAKQEAgLTAsMCArMSwxNDEgQEAKKy8vIEhhbmRsZXJPdXQuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpZm5kZWYgXzdaSVBfU1QNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9TeXN0ZW0uaCINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL1BhcnNlUHJvcGVydGllcy5oIg0KKw0KKyNpbmNsdWRlICJIYW5kbGVyT3V0LmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KKw0KK25hbWVzcGFjZSBOQXJjaGl2ZSB7DQorDQorc3RhdGljIHZvaWQgU2V0TWV0aG9kUHJvcDMyKENPbmVNZXRob2RJbmZvICZtLCBQUk9QSUQgcHJvcElELCBVSW50MzIgdmFsdWUpDQorew0KKyAgaWYgKG0uRmluZFByb3AocHJvcElEKSA8IDApDQorICAgIG0uQWRkUHJvcDMyKHByb3BJRCwgdmFsdWUpOw0KK30NCisNCit2b2lkIENNdWx0aU1ldGhvZFByb3BzOjpTZXRHbG9iYWxMZXZlbEFuZFRocmVhZHMoQ09uZU1ldGhvZEluZm8gJm9uZU1ldGhvZEluZm8NCisgICAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgICAsIFVJbnQzMiBudW1UaHJlYWRzDQorICAgICNlbmRpZg0KKyAgICApDQorew0KKyAgVUludDMyIGxldmVsID0gX2xldmVsOw0KKyAgaWYgKGxldmVsICE9IChVSW50MzIpKEludDMyKS0xKQ0KKyAgICBTZXRNZXRob2RQcm9wMzIob25lTWV0aG9kSW5mbywgTkNvZGVyUHJvcElEOjprTGV2ZWwsIChVSW50MzIpbGV2ZWwpOw0KKyAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgU2V0TWV0aG9kUHJvcDMyKG9uZU1ldGhvZEluZm8sIE5Db2RlclByb3BJRDo6a051bVRocmVhZHMsIG51bVRocmVhZHMpOw0KKyAgI2VuZGlmDQorfQ0KKw0KK3ZvaWQgQ011bHRpTWV0aG9kUHJvcHM6OkluaXQoKQ0KK3sNCisgICNpZm5kZWYgXzdaSVBfU1QNCisgIF9udW1Qcm9jZXNzb3JzID0gX251bVRocmVhZHMgPSBOU3lzdGVtOjpHZXROdW1iZXJPZlByb2Nlc3NvcnMoKTsNCisgICNlbmRpZg0KKyAgDQorICBfbGV2ZWwgPSAoVUludDMyKShJbnQzMiktMTsNCisgIF9hdXRvRmlsdGVyID0gdHJ1ZTsNCisgIF9jcmNTaXplID0gNDsNCisgIF9maWx0ZXJNZXRob2QuQ2xlYXIoKTsNCisgIF9tZXRob2RzLkNsZWFyKCk7DQorfQ0KKw0KK0hSRVNVTFQgQ011bHRpTWV0aG9kUHJvcHM6OlNldFByb3BlcnR5KGNvbnN0IHdjaGFyX3QgKm5hbWVTcGVjLCBjb25zdCBQUk9QVkFSSUFOVCAmdmFsdWUpDQorew0KKyAgVVN0cmluZyBuYW1lID0gbmFtZVNwZWM7DQorICBuYW1lLk1ha2VMb3dlcl9Bc2NpaSgpOw0KKyAgaWYgKG5hbWUuSXNFbXB0eSgpKQ0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgDQorICBpZiAobmFtZVswXSA9PSAneCcpDQorICB7DQorICAgIG5hbWUuRGVsZXRlKDApOw0KKyAgICBfbGV2ZWwgPSA5Ow0KKyAgICByZXR1cm4gUGFyc2VQcm9wVG9VSW50MzIobmFtZSwgdmFsdWUsIF9sZXZlbCk7DQorICB9DQorICANCisgIGlmIChuYW1lID09IEwiY3JjIikNCisgIHsNCisgICAgbmFtZS5EZWxldGUoMCwgMyk7DQorICAgIF9jcmNTaXplID0gNDsNCisgICAgcmV0dXJuIFBhcnNlUHJvcFRvVUludDMyKG5hbWUsIHZhbHVlLCBfY3JjU2l6ZSk7DQorICB9DQorICANCisgIFVJbnQzMiBudW1iZXI7DQorICBpbnQgaW5kZXggPSBQYXJzZVN0cmluZ1RvVUludDMyKG5hbWUsIG51bWJlcik7DQorICBVU3RyaW5nIHJlYWxOYW1lID0gbmFtZS5QdHIoaW5kZXgpOw0KKyAgaWYgKGluZGV4ID09IDApDQorICB7DQorICAgIGlmIChuYW1lLklzUHJlZml4ZWRCeShMIm10IikpDQorICAgIHsNCisgICAgICAjaWZuZGVmIF83WklQX1NUDQorICAgICAgUklOT0soUGFyc2VNdFByb3AobmFtZS5QdHIoMiksIHZhbHVlLCBfbnVtUHJvY2Vzc29ycywgX251bVRocmVhZHMpKTsNCisgICAgICAjZW5kaWYNCisgICAgICByZXR1cm4gU19PSzsNCisgICAgfQ0KKyAgICBpZiAobmFtZS5Jc0VxdWFsVG8oImYiKSkNCisgICAgew0KKyAgICAgIEhSRVNVTFQgcmVzID0gUFJPUFZBUklBTlRfdG9fYm9vbCh2YWx1ZSwgX2F1dG9GaWx0ZXIpOw0KKyAgICAgIGlmIChyZXMgPT0gU19PSykNCisgICAgICAgIHJldHVybiByZXM7DQorICAgICAgaWYgKHZhbHVlLnZ0ICE9IFZUX0JTVFIpDQorICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICAgIHJldHVybiBfZmlsdGVyTWV0aG9kLlBhcnNlTWV0aG9kRnJvbVBST1BWQVJJQU5UKEwiIiwgdmFsdWUpOw0KKyAgICB9DQorICAgIG51bWJlciA9IDA7DQorICB9DQorICBpZiAobnVtYmVyID4gNjQpDQorICAgIHJldHVybiBFX0ZBSUw7DQorICBmb3IgKGludCBqID0gX21ldGhvZHMuU2l6ZSgpOyBqIDw9IChpbnQpbnVtYmVyOyBqKyspDQorICAgIF9tZXRob2RzLkFkZChDT25lTWV0aG9kSW5mbygpKTsNCisgIHJldHVybiBfbWV0aG9kc1tudW1iZXJdLlBhcnNlTWV0aG9kRnJvbVBST1BWQVJJQU5UKHJlYWxOYW1lLCB2YWx1ZSk7DQorfQ0KKw0KK3ZvaWQgQ1NpbmdsZU1ldGhvZFByb3BzOjpJbml0KCkNCit7DQorICBDbGVhcigpOw0KKyAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgX251bVByb2Nlc3NvcnMgPSBfbnVtVGhyZWFkcyA9IE5XaW5kb3dzOjpOU3lzdGVtOjpHZXROdW1iZXJPZlByb2Nlc3NvcnMoKTsNCisgIEFkZE51bVRocmVhZHNQcm9wKF9udW1UaHJlYWRzKTsNCisgICNlbmRpZg0KKyAgX2xldmVsID0gKFVJbnQzMikoSW50MzIpLTE7DQorfQ0KKw0KK0hSRVNVTFQgQ1NpbmdsZU1ldGhvZFByb3BzOjpTZXRQcm9wZXJ0aWVzKGNvbnN0IHdjaGFyX3QgKipuYW1lcywgY29uc3QgUFJPUFZBUklBTlQgKnZhbHVlcywgVUludDMyIG51bVByb3BzKQ0KK3sNCisgIEluaXQoKTsNCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtUHJvcHM7IGkrKykNCisgIHsNCisgICAgVVN0cmluZyBuYW1lID0gbmFtZXNbaV07DQorICAgIG5hbWUuTWFrZUxvd2VyX0FzY2lpKCk7DQorICAgIGlmIChuYW1lLklzRW1wdHkoKSkNCisgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICBjb25zdCBQUk9QVkFSSUFOVCAmdmFsdWUgPSB2YWx1ZXNbaV07DQorICAgIGlmIChuYW1lWzBdID09IEwneCcpDQorICAgIHsNCisgICAgICBVSW50MzIgYSA9IDk7DQorICAgICAgUklOT0soUGFyc2VQcm9wVG9VSW50MzIobmFtZS5QdHIoMSksIHZhbHVlLCBhKSk7DQorICAgICAgX2xldmVsID0gYTsNCisgICAgICBBZGRMZXZlbFByb3AoYSk7DQorICAgIH0NCisgICAgZWxzZSBpZiAobmFtZS5Jc1ByZWZpeGVkQnkoTCJtdCIpKQ0KKyAgICB7DQorICAgICAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgICAgIFJJTk9LKFBhcnNlTXRQcm9wKG5hbWUuUHRyKDIpLCB2YWx1ZSwgX251bVByb2Nlc3NvcnMsIF9udW1UaHJlYWRzKSk7DQorICAgICAgQWRkTnVtVGhyZWFkc1Byb3AoX251bVRocmVhZHMpOw0KKyAgICAgICNlbmRpZg0KKyAgICB9DQorICAgIGVsc2UNCisgICAgICByZXR1cm4gUGFyc2VNZXRob2RGcm9tUFJPUFZBUklBTlQobmFtZXNbaV0sIHZhbHVlKTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9IYW5kbGVyT3V0LmggYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0hhbmRsZXJPdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmMzZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9IYW5kbGVyT3V0LmgKQEAgLTAsMCArMSw2NSBAQAorLy8gSGFuZGxlck91dC5oDQorDQorI2lmbmRlZiBfX0hBTkRMRVJfT1VUX0gNCisjZGVmaW5lIF9fSEFORExFUl9PVVRfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTWV0aG9kUHJvcHMuaCINCisNCituYW1lc3BhY2UgTkFyY2hpdmUgew0KKw0KK2NsYXNzIENNdWx0aU1ldGhvZFByb3BzDQorew0KKyAgVUludDMyIF9sZXZlbDsNCitwdWJsaWM6DQorICAjaWZuZGVmIF83WklQX1NUDQorICBVSW50MzIgX251bVRocmVhZHM7DQorICBVSW50MzIgX251bVByb2Nlc3NvcnM7DQorICAjZW5kaWYNCisNCisgIFVJbnQzMiBfY3JjU2l6ZTsNCisgIENPYmplY3RWZWN0b3I8Q09uZU1ldGhvZEluZm8+IF9tZXRob2RzOw0KKyAgQ09uZU1ldGhvZEluZm8gX2ZpbHRlck1ldGhvZDsNCisgIGJvb2wgX2F1dG9GaWx0ZXI7DQorDQorICB2b2lkIFNldEdsb2JhbExldmVsQW5kVGhyZWFkcyhDT25lTWV0aG9kSW5mbyAmb25lTWV0aG9kSW5mbw0KKyAgICAgICNpZm5kZWYgXzdaSVBfU1QNCisgICAgICAsIFVJbnQzMiBudW1UaHJlYWRzDQorICAgICAgI2VuZGlmDQorICAgICAgKTsNCisNCisgIHVuc2lnbmVkIEdldE51bUVtcHR5TWV0aG9kcygpIGNvbnN0DQorICB7DQorICAgIHVuc2lnbmVkIGk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBfbWV0aG9kcy5TaXplKCk7IGkrKykNCisgICAgICBpZiAoIV9tZXRob2RzW2ldLklzRW1wdHkoKSkNCisgICAgICAgIGJyZWFrOw0KKyAgICByZXR1cm4gaTsNCisgIH0NCisNCisgIGludCBHZXRMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIF9sZXZlbCA9PSAoVUludDMyKShJbnQzMiktMSA/IDUgOiAoaW50KV9sZXZlbDsgfQ0KKw0KKyAgdm9pZCBJbml0KCk7DQorDQorICBDTXVsdGlNZXRob2RQcm9wcygpIHsgSW5pdCgpOyB9DQorICBIUkVTVUxUIFNldFByb3BlcnR5KGNvbnN0IHdjaGFyX3QgKm5hbWUsIGNvbnN0IFBST1BWQVJJQU5UICZ2YWx1ZSk7DQorfTsNCisNCitjbGFzcyBDU2luZ2xlTWV0aG9kUHJvcHM6IHB1YmxpYyBDT25lTWV0aG9kSW5mbw0KK3sNCisgIFVJbnQzMiBfbGV2ZWw7DQorICANCitwdWJsaWM6DQorICAjaWZuZGVmIF83WklQX1NUDQorICBVSW50MzIgX251bVRocmVhZHM7DQorICBVSW50MzIgX251bVByb2Nlc3NvcnM7DQorICAjZW5kaWYNCisNCisgIHZvaWQgSW5pdCgpOw0KKyAgQ1NpbmdsZU1ldGhvZFByb3BzKCkgeyBJbml0KCk7IH0NCisgIGludCBHZXRMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIF9sZXZlbCA9PSAoVUludDMyKShJbnQzMiktMSA/IDUgOiAoaW50KV9sZXZlbDsgfQ0KKyAgSFJFU1VMVCBTZXRQcm9wZXJ0aWVzKGNvbnN0IHdjaGFyX3QgKipuYW1lcywgY29uc3QgUFJPUFZBUklBTlQgKnZhbHVlcywgVUludDMyIG51bVByb3BzKTsNCit9Ow0KKw0KK30NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0luU3RyZWFtV2l0aENSQy5jcHAgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0luU3RyZWFtV2l0aENSQy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkYzA4MwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vSW5TdHJlYW1XaXRoQ1JDLmNwcApAQCAtMCwwICsxLDQ2IEBACisvLyBJblN0cmVhbVdpdGhDUkMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJJblN0cmVhbVdpdGhDUkMuaCINCisNCitTVERNRVRIT0RJTVAgQ1NlcXVlbnRpYWxJblN0cmVhbVdpdGhDUkM6OlJlYWQodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBVSW50MzIgcmVhbFByb2Nlc3NlZCA9IDA7DQorICBIUkVTVUxUIHJlc3VsdCA9IFNfT0s7DQorICBpZiAoX3N0cmVhbSkNCisgICAgcmVzdWx0ID0gX3N0cmVhbS0+UmVhZChkYXRhLCBzaXplLCAmcmVhbFByb2Nlc3NlZCk7DQorICBfc2l6ZSArPSByZWFsUHJvY2Vzc2VkOw0KKyAgaWYgKHNpemUgIT0gMCAmJiByZWFsUHJvY2Vzc2VkID09IDApDQorICAgIF93YXNGaW5pc2hlZCA9IHRydWU7DQorICBfY3JjID0gQ3JjVXBkYXRlKF9jcmMsIGRhdGEsIHJlYWxQcm9jZXNzZWQpOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gcmVhbFByb2Nlc3NlZDsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSW5TdHJlYW1XaXRoQ1JDOjpSZWFkKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgVUludDMyIHJlYWxQcm9jZXNzZWQgPSAwOw0KKyAgSFJFU1VMVCByZXN1bHQgPSBTX09LOw0KKyAgaWYgKF9zdHJlYW0pDQorICAgIHJlc3VsdCA9IF9zdHJlYW0tPlJlYWQoZGF0YSwgc2l6ZSwgJnJlYWxQcm9jZXNzZWQpOw0KKyAgX3NpemUgKz0gcmVhbFByb2Nlc3NlZDsNCisgIC8qDQorICBpZiAoc2l6ZSAhPSAwICYmIHJlYWxQcm9jZXNzZWQgPT0gMCkNCisgICAgX3dhc0ZpbmlzaGVkID0gdHJ1ZTsNCisgICovDQorICBfY3JjID0gQ3JjVXBkYXRlKF9jcmMsIGRhdGEsIHJlYWxQcm9jZXNzZWQpOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gcmVhbFByb2Nlc3NlZDsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSW5TdHJlYW1XaXRoQ1JDOjpTZWVrKEludDY0IG9mZnNldCwgVUludDMyIHNlZWtPcmlnaW4sIFVJbnQ2NCAqbmV3UG9zaXRpb24pDQorew0KKyAgaWYgKHNlZWtPcmlnaW4gIT0gU1RSRUFNX1NFRUtfU0VUIHx8IG9mZnNldCAhPSAwKQ0KKyAgICByZXR1cm4gRV9GQUlMOw0KKyAgX3NpemUgPSAwOw0KKyAgX2NyYyA9IENSQ19JTklUX1ZBTDsNCisgIHJldHVybiBfc3RyZWFtLT5TZWVrKG9mZnNldCwgc2Vla09yaWdpbiwgbmV3UG9zaXRpb24pOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0luU3RyZWFtV2l0aENSQy5oIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9JblN0cmVhbVdpdGhDUkMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTRiMmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9JblN0cmVhbVdpdGhDUkMuaApAQCAtMCwwICsxLDY3IEBACisvLyBJblN0cmVhbVdpdGhDUkMuaA0KKw0KKyNpZm5kZWYgX19JTl9TVFJFQU1fV0lUSF9DUkNfSA0KKyNkZWZpbmUgX19JTl9TVFJFQU1fV0lUSF9DUkNfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9DLzd6Q3JjLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9JU3RyZWFtLmgiDQorDQorY2xhc3MgQ1NlcXVlbnRpYWxJblN0cmVhbVdpdGhDUkM6DQorICBwdWJsaWMgSVNlcXVlbnRpYWxJblN0cmVhbSwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QDQorDQorICBTVERNRVRIT0QoUmVhZCkodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorcHJpdmF0ZToNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbEluU3RyZWFtPiBfc3RyZWFtOw0KKyAgVUludDY0IF9zaXplOw0KKyAgVUludDMyIF9jcmM7DQorICBib29sIF93YXNGaW5pc2hlZDsNCitwdWJsaWM6DQorICB2b2lkIFNldFN0cmVhbShJU2VxdWVudGlhbEluU3RyZWFtICpzdHJlYW0pIHsgX3N0cmVhbSA9IHN0cmVhbTsgIH0NCisgIHZvaWQgSW5pdCgpDQorICB7DQorICAgIF9zaXplID0gMDsNCisgICAgX3dhc0ZpbmlzaGVkID0gZmFsc2U7DQorICAgIF9jcmMgPSBDUkNfSU5JVF9WQUw7DQorICB9DQorICB2b2lkIFJlbGVhc2VTdHJlYW0oKSB7IF9zdHJlYW0uUmVsZWFzZSgpOyB9DQorICBVSW50MzIgR2V0Q1JDKCkgY29uc3QgeyByZXR1cm4gQ1JDX0dFVF9ESUdFU1QoX2NyYyk7IH0NCisgIFVJbnQ2NCBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gX3NpemU7IH0NCisgIGJvb2wgV2FzRmluaXNoZWQoKSBjb25zdCB7IHJldHVybiBfd2FzRmluaXNoZWQ7IH0NCit9Ow0KKw0KK2NsYXNzIENJblN0cmVhbVdpdGhDUkM6DQorICBwdWJsaWMgSUluU3RyZWFtLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorcHVibGljOg0KKyAgTVlfVU5LTk9XTl9JTVAxKElJblN0cmVhbSkNCisNCisgIFNURE1FVEhPRChSZWFkKSh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCisgIFNURE1FVEhPRChTZWVrKShJbnQ2NCBvZmZzZXQsIFVJbnQzMiBzZWVrT3JpZ2luLCBVSW50NjQgKm5ld1Bvc2l0aW9uKTsNCitwcml2YXRlOg0KKyAgQ015Q29tUHRyPElJblN0cmVhbT4gX3N0cmVhbTsNCisgIFVJbnQ2NCBfc2l6ZTsNCisgIFVJbnQzMiBfY3JjOw0KKyAgLy8gYm9vbCBfd2FzRmluaXNoZWQ7DQorcHVibGljOg0KKyAgdm9pZCBTZXRTdHJlYW0oSUluU3RyZWFtICpzdHJlYW0pIHsgX3N0cmVhbSA9IHN0cmVhbTsgIH0NCisgIHZvaWQgSW5pdCgpDQorICB7DQorICAgIF9zaXplID0gMDsNCisgICAgLy8gX3dhc0ZpbmlzaGVkID0gZmFsc2U7DQorICAgIF9jcmMgPSBDUkNfSU5JVF9WQUw7DQorICB9DQorICB2b2lkIFJlbGVhc2VTdHJlYW0oKSB7IF9zdHJlYW0uUmVsZWFzZSgpOyB9DQorICBVSW50MzIgR2V0Q1JDKCkgY29uc3QgeyByZXR1cm4gQ1JDX0dFVF9ESUdFU1QoX2NyYyk7IH0NCisgIFVJbnQ2NCBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gX3NpemU7IH0NCisgIC8vIGJvb2wgV2FzRmluaXNoZWQoKSBjb25zdCB7IHJldHVybiBfd2FzRmluaXNoZWQ7IH0NCit9Ow0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vSXRlbU5hbWVVdGlscy5jcHAgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0l0ZW1OYW1lVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDg5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0l0ZW1OYW1lVXRpbHMuY3BwCkBAIC0wLDAgKzEsODggQEAKKy8vIEFyY2hpdmUvQ29tbW9uL0l0ZW1OYW1lVXRpbHMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJJdGVtTmFtZVV0aWxzLmgiDQorDQorbmFtZXNwYWNlIE5BcmNoaXZlIHsNCituYW1lc3BhY2UgTkl0ZW1OYW1lIHsNCisNCitzdGF0aWMgY29uc3Qgd2NoYXJfdCBrT1NEaXJEZWxpbWl0ZXIgPSBXQ0hBUl9QQVRIX1NFUEFSQVRPUjsNCitzdGF0aWMgY29uc3Qgd2NoYXJfdCBrRGlyRGVsaW1pdGVyID0gTCcvJzsNCisNCit2b2lkIFJlcGxhY2VUb09zUGF0aFNlcGFyYXRvcih3Y2hhcl90ICpzKQ0KK3sNCisgICNpZmRlZiBfV0lOMzINCisgIGZvciAoOzspDQorICB7DQorICAgIHdjaGFyX3QgYyA9ICpzOw0KKyAgICBpZiAoYyA9PSAwKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBpZiAoYyA9PSBrRGlyRGVsaW1pdGVyKQ0KKyAgICAgICpzID0ga09TRGlyRGVsaW1pdGVyOw0KKyAgICBzKys7DQorICB9DQorICAjZW5kaWYNCit9DQorDQorVVN0cmluZyBNYWtlTGVnYWxOYW1lKGNvbnN0IFVTdHJpbmcgJm5hbWUpDQorew0KKyAgVVN0cmluZyB6aXBOYW1lID0gbmFtZTsNCisgIHppcE5hbWUuUmVwbGFjZShrT1NEaXJEZWxpbWl0ZXIsIGtEaXJEZWxpbWl0ZXIpOw0KKyAgcmV0dXJuIHppcE5hbWU7DQorfQ0KKw0KK1VTdHJpbmcgR2V0T1NOYW1lKGNvbnN0IFVTdHJpbmcgJm5hbWUpDQorew0KKyAgVVN0cmluZyBuZXdOYW1lID0gbmFtZTsNCisgIG5ld05hbWUuUmVwbGFjZShrRGlyRGVsaW1pdGVyLCBrT1NEaXJEZWxpbWl0ZXIpOw0KKyAgcmV0dXJuIG5ld05hbWU7DQorfQ0KKw0KK1VTdHJpbmcgR2V0T1NOYW1lMihjb25zdCBVU3RyaW5nICZuYW1lKQ0KK3sNCisgIGlmIChuYW1lLklzRW1wdHkoKSkNCisgICAgcmV0dXJuIFVTdHJpbmcoKTsNCisgIFVTdHJpbmcgbmV3TmFtZSA9IEdldE9TTmFtZShuYW1lKTsNCisgIGlmIChuZXdOYW1lLkJhY2soKSA9PSBrT1NEaXJEZWxpbWl0ZXIpDQorICAgIG5ld05hbWUuRGVsZXRlQmFjaygpOw0KKyAgcmV0dXJuIG5ld05hbWU7DQorfQ0KKw0KK3ZvaWQgQ29udmVydFRvT1NOYW1lMihVU3RyaW5nICZuYW1lKQ0KK3sNCisgIGlmICghbmFtZS5Jc0VtcHR5KCkpDQorICB7DQorICAgIG5hbWUuUmVwbGFjZShrRGlyRGVsaW1pdGVyLCBrT1NEaXJEZWxpbWl0ZXIpOw0KKyAgICBpZiAobmFtZS5CYWNrKCkgPT0ga09TRGlyRGVsaW1pdGVyKQ0KKyAgICAgIG5hbWUuRGVsZXRlQmFjaygpOw0KKyAgfQ0KK30NCisNCitib29sIEhhc1RhaWxTbGFzaChjb25zdCBBU3RyaW5nICZuYW1lLCBVSU5UDQorICAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKyAgICBjb2RlUGFnZQ0KKyAgI2VuZGlmDQorICApDQorew0KKyAgaWYgKG5hbWUuSXNFbXB0eSgpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBMUENTVFIgcHJldiA9DQorICAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKyAgICBDaGFyUHJldkV4QSgoV09SRCljb2RlUGFnZSwgbmFtZSwgJm5hbWVbbmFtZS5MZW4oKV0sIDApOw0KKyAgI2Vsc2UNCisgICAgKExQQ1NUUikobmFtZSkgKyAobmFtZS5MZW4oKSAtIDEpOw0KKyAgI2VuZGlmDQorICByZXR1cm4gKCpwcmV2ID09ICcvJyk7DQorfQ0KKw0KKyNpZm5kZWYgX1dJTjMyDQorVVN0cmluZyBXaW5OYW1lVG9PU05hbWUoY29uc3QgVVN0cmluZyAmbmFtZSkNCit7DQorICBVU3RyaW5nIG5ld05hbWUgPSBuYW1lOw0KKyAgbmV3TmFtZS5SZXBsYWNlKEwnXFwnLCBrT1NEaXJEZWxpbWl0ZXIpOw0KKyAgcmV0dXJuIG5ld05hbWU7DQorfQ0KKyNlbmRpZg0KKw0KK319DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9JdGVtTmFtZVV0aWxzLmggYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL0l0ZW1OYW1lVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWUyZDBmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9JdGVtTmFtZVV0aWxzLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQXJjaGl2ZS9Db21tb24vSXRlbU5hbWVVdGlscy5oDQorDQorI2lmbmRlZiBfX0FSQ0hJVkVfSVRFTV9OQU1FX1VUSUxTX0gNCisjZGVmaW5lIF9fQVJDSElWRV9JVEVNX05BTUVfVVRJTFNfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlTdHJpbmcuaCINCisNCituYW1lc3BhY2UgTkFyY2hpdmUgew0KK25hbWVzcGFjZSBOSXRlbU5hbWUgew0KKw0KKyAgdm9pZCBSZXBsYWNlVG9Pc1BhdGhTZXBhcmF0b3Iod2NoYXJfdCAqcyk7DQorDQorICBVU3RyaW5nIE1ha2VMZWdhbE5hbWUoY29uc3QgVVN0cmluZyAmbmFtZSk7DQorICBVU3RyaW5nIEdldE9TTmFtZShjb25zdCBVU3RyaW5nICZuYW1lKTsNCisgIFVTdHJpbmcgR2V0T1NOYW1lMihjb25zdCBVU3RyaW5nICZuYW1lKTsNCisgIHZvaWQgQ29udmVydFRvT1NOYW1lMihVU3RyaW5nICZuYW1lKTsNCisgIGJvb2wgSGFzVGFpbFNsYXNoKGNvbnN0IEFTdHJpbmcgJm5hbWUsIFVJTlQgY29kZVBhZ2UpOw0KKw0KKyAgI2lmZGVmIF9XSU4zMg0KKyAgaW5saW5lIFVTdHJpbmcgV2luTmFtZVRvT1NOYW1lKGNvbnN0IFVTdHJpbmcgJm5hbWUpICB7IHJldHVybiBuYW1lOyB9DQorICAjZWxzZQ0KKyAgVVN0cmluZyBXaW5OYW1lVG9PU05hbWUoY29uc3QgVVN0cmluZyAmbmFtZSk7DQorICAjZW5kaWYNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vTXVsdGlTdHJlYW0uY3BwIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9NdWx0aVN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxM2FiMgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vTXVsdGlTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTkxIEBACisvLyBNdWx0aVN0cmVhbS5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIk11bHRpU3RyZWFtLmgiDQorDQorU1RETUVUSE9ESU1QIENNdWx0aVN0cmVhbTo6UmVhZCh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IDA7DQorICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIGlmIChfcG9zID49IF90b3RhbExlbmd0aCkNCisgICAgcmV0dXJuIFNfT0s7DQorDQorICB7DQorICAgIHVuc2lnbmVkIGxlZnQgPSAwLCBtaWQgPSBfc3RyZWFtSW5kZXgsIHJpZ2h0ID0gU3RyZWFtcy5TaXplKCk7DQorICAgIGZvciAoOzspDQorICAgIHsNCisgICAgICBDU3ViU3RyZWFtSW5mbyAmbSA9IFN0cmVhbXNbbWlkXTsNCisgICAgICBpZiAoX3BvcyA8IG0uR2xvYmFsT2Zmc2V0KQ0KKyAgICAgICAgcmlnaHQgPSBtaWQ7DQorICAgICAgZWxzZSBpZiAoX3BvcyA+PSBtLkdsb2JhbE9mZnNldCArIG0uU2l6ZSkNCisgICAgICAgIGxlZnQgPSBtaWQgKyAxOw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBfc3RyZWFtSW5kZXggPSBtaWQ7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgbWlkID0gKGxlZnQgKyByaWdodCkgLyAyOw0KKyAgICB9DQorICAgIF9zdHJlYW1JbmRleCA9IG1pZDsNCisgIH0NCisgIA0KKyAgQ1N1YlN0cmVhbUluZm8gJnMgPSBTdHJlYW1zW19zdHJlYW1JbmRleF07DQorICBVSW50NjQgbG9jYWxQb3MgPSBfcG9zIC0gcy5HbG9iYWxPZmZzZXQ7DQorICBpZiAobG9jYWxQb3MgIT0gcy5Mb2NhbFBvcykNCisgIHsNCisgICAgUklOT0socy5TdHJlYW0tPlNlZWsobG9jYWxQb3MsIFNUUkVBTV9TRUVLX1NFVCwgJnMuTG9jYWxQb3MpKTsNCisgIH0NCisgIFVJbnQ2NCByZW0gPSBzLlNpemUgLSBsb2NhbFBvczsNCisgIGlmIChzaXplID4gcmVtKQ0KKyAgICBzaXplID0gKFVJbnQzMilyZW07DQorICBIUkVTVUxUIHJlc3VsdCA9IHMuU3RyZWFtLT5SZWFkKGRhdGEsIHNpemUsICZzaXplKTsNCisgIF9wb3MgKz0gc2l6ZTsNCisgIHMuTG9jYWxQb3MgKz0gc2l6ZTsNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IHNpemU7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisgIA0KK1NURE1FVEhPRElNUCBDTXVsdGlTdHJlYW06OlNlZWsoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbikNCit7DQorICBzd2l0Y2ggKHNlZWtPcmlnaW4pDQorICB7DQorICAgIGNhc2UgU1RSRUFNX1NFRUtfU0VUOiBicmVhazsNCisgICAgY2FzZSBTVFJFQU1fU0VFS19DVVI6IG9mZnNldCArPSBfcG9zOyBicmVhazsNCisgICAgY2FzZSBTVFJFQU1fU0VFS19FTkQ6IG9mZnNldCArPSBfdG90YWxMZW5ndGg7IGJyZWFrOw0KKyAgICBkZWZhdWx0OiByZXR1cm4gU1RHX0VfSU5WQUxJREZVTkNUSU9OOw0KKyAgfQ0KKyAgaWYgKG9mZnNldCA8IDApDQorICAgIHJldHVybiBIUkVTVUxUX1dJTjMyX0VSUk9SX05FR0FUSVZFX1NFRUs7DQorICBfcG9zID0gb2Zmc2V0Ow0KKyAgaWYgKG5ld1Bvc2l0aW9uKQ0KKyAgICAqbmV3UG9zaXRpb24gPSBvZmZzZXQ7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorDQorLyoNCitjbGFzcyBDT3V0Vm9sdW1lU3RyZWFtOg0KKyAgcHVibGljIElTZXF1ZW50aWFsT3V0U3RyZWFtLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICB1bnNpZ25lZCBfdm9sSW5kZXg7DQorICBVSW50NjQgX3ZvbFNpemU7DQorICBVSW50NjQgX2N1clBvczsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gX3ZvbHVtZVN0cmVhbTsNCisgIENPdXRBcmNoaXZlIF9hcmNoaXZlOw0KKyAgQ0NSQyBfY3JjOw0KKw0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QDQorDQorICBDRmlsZUl0ZW0gX2ZpbGU7DQorICBDVXBkYXRlT3B0aW9ucyBfb3B0aW9uczsNCisgIENNeUNvbVB0cjxJQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrMj4gVm9sdW1lQ2FsbGJhY2s7DQorICB2b2lkIEluaXQoSUFyY2hpdmVVcGRhdGVDYWxsYmFjazIgKnZvbHVtZUNhbGxiYWNrLA0KKyAgICAgIGNvbnN0IFVTdHJpbmcgJm5hbWUpDQorICB7DQorICAgIF9maWxlLk5hbWUgPSBuYW1lOw0KKyAgICBfZmlsZS5Jc1N0YXJ0UG9zRGVmaW5lZCA9IHRydWU7DQorICAgIF9maWxlLlN0YXJ0UG9zID0gMDsNCisgICAgDQorICAgIFZvbHVtZUNhbGxiYWNrID0gdm9sdW1lQ2FsbGJhY2s7DQorICAgIF92b2xJbmRleCA9IDA7DQorICAgIF92b2xTaXplID0gMDsNCisgIH0NCisgIA0KKyAgSFJFU1VMVCBGbHVzaCgpOw0KKyAgU1RETUVUSE9EKFdyaXRlKShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCit9Ow0KKw0KK0hSRVNVTFQgQ091dFZvbHVtZVN0cmVhbTo6Rmx1c2goKQ0KK3sNCisgIGlmIChfdm9sdW1lU3RyZWFtKQ0KKyAgew0KKyAgICBfZmlsZS5VblBhY2tTaXplID0gX2N1clBvczsNCisgICAgX2ZpbGUuRmlsZUNSQyA9IF9jcmMuR2V0RGlnZXN0KCk7DQorICAgIFJJTk9LKFdyaXRlVm9sdW1lSGVhZGVyKF9hcmNoaXZlLCBfZmlsZSwgX29wdGlvbnMpKTsNCisgICAgX2FyY2hpdmUuQ2xvc2UoKTsNCisgICAgX3ZvbHVtZVN0cmVhbS5SZWxlYXNlKCk7DQorICAgIF9maWxlLlN0YXJ0UG9zICs9IF9maWxlLlVuUGFja1NpemU7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorKi8NCisNCisvKg0KK1NURE1FVEhPRElNUCBDT3V0TXVsdGlTdHJlYW06OldyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgaWYocHJvY2Vzc2VkU2l6ZSAhPSBOVUxMKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IDA7DQorICB3aGlsZShzaXplID4gMCkNCisgIHsNCisgICAgaWYgKF9zdHJlYW1JbmRleCA+PSBTdHJlYW1zLlNpemUoKSkNCisgICAgew0KKyAgICAgIENTdWJTdHJlYW1JbmZvIHN1YlN0cmVhbTsNCisgICAgICBSSU5PSyhWb2x1bWVDYWxsYmFjay0+R2V0Vm9sdW1lU2l6ZShTdHJlYW1zLlNpemUoKSwgJnN1YlN0cmVhbS5TaXplKSk7DQorICAgICAgUklOT0soVm9sdW1lQ2FsbGJhY2stPkdldFZvbHVtZVN0cmVhbShTdHJlYW1zLlNpemUoKSwgJnN1YlN0cmVhbS5TdHJlYW0pKTsNCisgICAgICBzdWJTdHJlYW0uUG9zID0gMDsNCisgICAgICBTdHJlYW1zLkFkZChzdWJTdHJlYW0pOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENTdWJTdHJlYW1JbmZvICZzdWJTdHJlYW0gPSBTdHJlYW1zW19zdHJlYW1JbmRleF07DQorICAgIGlmIChfb2Zmc2V0UG9zID49IHN1YlN0cmVhbS5TaXplKQ0KKyAgICB7DQorICAgICAgX29mZnNldFBvcyAtPSBzdWJTdHJlYW0uU2l6ZTsNCisgICAgICBfc3RyZWFtSW5kZXgrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoX29mZnNldFBvcyAhPSBzdWJTdHJlYW0uUG9zKQ0KKyAgICB7DQorICAgICAgQ015Q29tUHRyPElPdXRTdHJlYW0+IG91dFN0cmVhbTsNCisgICAgICBSSU5PSyhzdWJTdHJlYW0uU3RyZWFtLlF1ZXJ5SW50ZXJmYWNlKElJRF9JT3V0U3RyZWFtLCAmb3V0U3RyZWFtKSk7DQorICAgICAgUklOT0sob3V0U3RyZWFtLT5TZWVrKF9vZmZzZXRQb3MsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCkpOw0KKyAgICAgIHN1YlN0cmVhbS5Qb3MgPSBfb2Zmc2V0UG9zOw0KKyAgICB9DQorDQorICAgIFVJbnQzMiBjdXJTaXplID0gKFVJbnQzMilNeU1pbigoVUludDY0KXNpemUsIHN1YlN0cmVhbS5TaXplIC0gc3ViU3RyZWFtLlBvcyk7DQorICAgIFVJbnQzMiByZWFsUHJvY2Vzc2VkOw0KKyAgICBSSU5PSyhzdWJTdHJlYW0uU3RyZWFtLT5Xcml0ZShkYXRhLCBjdXJTaXplLCAmcmVhbFByb2Nlc3NlZCkpOw0KKyAgICBkYXRhID0gKHZvaWQgKikoKEJ5dGUgKilkYXRhICsgcmVhbFByb2Nlc3NlZCk7DQorICAgIHNpemUgLT0gcmVhbFByb2Nlc3NlZDsNCisgICAgc3ViU3RyZWFtLlBvcyArPSByZWFsUHJvY2Vzc2VkOw0KKyAgICBfb2Zmc2V0UG9zICs9IHJlYWxQcm9jZXNzZWQ7DQorICAgIF9hYnNQb3MgKz0gcmVhbFByb2Nlc3NlZDsNCisgICAgaWYgKF9hYnNQb3MgPiBfbGVuZ3RoKQ0KKyAgICAgIF9sZW5ndGggPSBfYWJzUG9zOw0KKyAgICBpZihwcm9jZXNzZWRTaXplICE9IE5VTEwpDQorICAgICAgKnByb2Nlc3NlZFNpemUgKz0gcmVhbFByb2Nlc3NlZDsNCisgICAgaWYgKHN1YlN0cmVhbS5Qb3MgPT0gc3ViU3RyZWFtLlNpemUpDQorICAgIHsNCisgICAgICBfc3RyZWFtSW5kZXgrKzsNCisgICAgICBfb2Zmc2V0UG9zID0gMDsNCisgICAgfQ0KKyAgICBpZiAocmVhbFByb2Nlc3NlZCAhPSBjdXJTaXplICYmIHJlYWxQcm9jZXNzZWQgPT0gMCkNCisgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDT3V0TXVsdGlTdHJlYW06OlNlZWsoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbikNCit7DQorICBzd2l0Y2ggKHNlZWtPcmlnaW4pDQorICB7DQorICAgIGNhc2UgU1RSRUFNX1NFRUtfU0VUOiBicmVhazsNCisgICAgY2FzZSBTVFJFQU1fU0VFS19DVVI6IG9mZnNldCArPSBfYWJzUG9zOyBicmVhazsNCisgICAgY2FzZSBTVFJFQU1fU0VFS19FTkQ6IG9mZnNldCArPSBfbGVuZ3RoOyBicmVhazsNCisgICAgZGVmYXVsdDogcmV0dXJuIFNUR19FX0lOVkFMSURGVU5DVElPTjsNCisgIH0NCisgIGlmIChvZmZzZXQgPCAwKQ0KKyAgICByZXR1cm4gSFJFU1VMVF9XSU4zMl9FUlJPUl9ORUdBVElWRV9TRUVLOw0KKyAgX2Fic1BvcyA9IG9mZnNldDsNCisgIF9vZmZzZXRQb3MgPSBfYWJzUG9zOw0KKyAgX3N0cmVhbUluZGV4ID0gMDsNCisgIGlmIChuZXdQb3NpdGlvbikNCisgICAgKm5ld1Bvc2l0aW9uID0gb2Zmc2V0Ow0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKyovDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9NdWx0aVN0cmVhbS5oIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9NdWx0aVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTA0MWQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL011bHRpU3RyZWFtLmgKQEAgLTAsMCArMSw4OSBAQAorLy8gTXVsdGlTdHJlYW0uaA0KKw0KKyNpZm5kZWYgX19NVUxUSV9TVFJFQU1fSA0KKyNkZWZpbmUgX19NVUxUSV9TVFJFQU1fSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlDb20uaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015VmVjdG9yLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0lTdHJlYW0uaCINCisNCitjbGFzcyBDTXVsdGlTdHJlYW06DQorICBwdWJsaWMgSUluU3RyZWFtLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBVSW50NjQgX3BvczsNCisgIFVJbnQ2NCBfdG90YWxMZW5ndGg7DQorICB1bnNpZ25lZCBfc3RyZWFtSW5kZXg7DQorDQorcHVibGljOg0KKw0KKyAgc3RydWN0IENTdWJTdHJlYW1JbmZvDQorICB7DQorICAgIENNeUNvbVB0cjxJSW5TdHJlYW0+IFN0cmVhbTsNCisgICAgVUludDY0IFNpemU7DQorICAgIFVJbnQ2NCBHbG9iYWxPZmZzZXQ7DQorICAgIFVJbnQ2NCBMb2NhbFBvczsNCisNCisgICAgQ1N1YlN0cmVhbUluZm8oKTogU2l6ZSgwKSwgR2xvYmFsT2Zmc2V0KDApLCBMb2NhbFBvcygwKSB7fQ0KKyAgfTsNCisgIA0KKyAgQ09iamVjdFZlY3RvcjxDU3ViU3RyZWFtSW5mbz4gU3RyZWFtczsNCisgIA0KKyAgSFJFU1VMVCBJbml0KCkNCisgIHsNCisgICAgVUludDY0IHRvdGFsID0gMDsNCisgICAgRk9SX1ZFQ1RPUiAoaSwgU3RyZWFtcykNCisgICAgew0KKyAgICAgIENTdWJTdHJlYW1JbmZvICZzID0gU3RyZWFtc1tpXTsNCisgICAgICBzLkdsb2JhbE9mZnNldCA9IHRvdGFsOw0KKyAgICAgIHRvdGFsICs9IFN0cmVhbXNbaV0uU2l6ZTsNCisgICAgICBSSU5PSyhzLlN0cmVhbS0+U2VlaygwLCBTVFJFQU1fU0VFS19DVVIsICZzLkxvY2FsUG9zKSk7DQorICAgIH0NCisgICAgX3RvdGFsTGVuZ3RoID0gdG90YWw7DQorICAgIF9wb3MgPSAwOw0KKyAgICBfc3RyZWFtSW5kZXggPSAwOw0KKyAgICByZXR1cm4gU19PSzsNCisgIH0NCisNCisgIE1ZX1VOS05PV05fSU1QMShJSW5TdHJlYW0pDQorDQorICBTVERNRVRIT0QoUmVhZCkodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorICBTVERNRVRIT0QoU2VlaykoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbik7DQorfTsNCisNCisvKg0KK2NsYXNzIENPdXRNdWx0aVN0cmVhbToNCisgIHB1YmxpYyBJT3V0U3RyZWFtLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICB1bnNpZ25lZCBfc3RyZWFtSW5kZXg7IC8vIHJlcXVpcmVkIHN0cmVhbQ0KKyAgVUludDY0IF9vZmZzZXRQb3M7IC8vIG9mZnNldCBmcm9tIHN0YXJ0IG9mIF9zdHJlYW1JbmRleCBpbmRleA0KKyAgVUludDY0IF9hYnNQb3M7DQorICBVSW50NjQgX2xlbmd0aDsNCisNCisgIHN0cnVjdCBDU3ViU3RyZWFtSW5mbw0KKyAgew0KKyAgICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IFN0cmVhbTsNCisgICAgVUludDY0IFNpemU7DQorICAgIFVJbnQ2NCBQb3M7DQorIH07DQorICBDT2JqZWN0VmVjdG9yPENTdWJTdHJlYW1JbmZvPiBTdHJlYW1zOw0KK3B1YmxpYzoNCisgIENNeUNvbVB0cjxJQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrMj4gVm9sdW1lQ2FsbGJhY2s7DQorICB2b2lkIEluaXQoKQ0KKyAgew0KKyAgICBfc3RyZWFtSW5kZXggPSAwOw0KKyAgICBfb2Zmc2V0UG9zID0gMDsNCisgICAgX2Fic1BvcyA9IDA7DQorICAgIF9sZW5ndGggPSAwOw0KKyAgfQ0KKw0KKyAgTVlfVU5LTk9XTl9JTVAxKElPdXRTdHJlYW0pDQorDQorICBTVERNRVRIT0QoV3JpdGUpKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KKyAgU1RETUVUSE9EKFNlZWspKEludDY0IG9mZnNldCwgVUludDMyIHNlZWtPcmlnaW4sIFVJbnQ2NCAqbmV3UG9zaXRpb24pOw0KK307DQorKi8NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL091dFN0cmVhbVdpdGhDUkMuY3BwIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9PdXRTdHJlYW1XaXRoQ1JDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQzODk0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9PdXRTdHJlYW1XaXRoQ1JDLmNwcApAQCAtMCwwICsxLDE4IEBACisvLyBPdXRTdHJlYW1XaXRoQ1JDLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiT3V0U3RyZWFtV2l0aENSQy5oIg0KKw0KK1NURE1FVEhPRElNUCBDT3V0U3RyZWFtV2l0aENSQzo6V3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBIUkVTVUxUIHJlc3VsdCA9IFNfT0s7DQorICBpZiAoX3N0cmVhbSkNCisgICAgcmVzdWx0ID0gX3N0cmVhbS0+V3JpdGUoZGF0YSwgc2l6ZSwgJnNpemUpOw0KKyAgaWYgKF9jYWxjdWxhdGUpDQorICAgIF9jcmMgPSBDcmNVcGRhdGUoX2NyYywgZGF0YSwgc2l6ZSk7DQorICBfc2l6ZSArPSBzaXplOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUgIT0gTlVMTCkNCisgICAgKnByb2Nlc3NlZFNpemUgPSBzaXplOw0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9PdXRTdHJlYW1XaXRoQ1JDLmggYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL091dFN0cmVhbVdpdGhDUkMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M5YTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9PdXRTdHJlYW1XaXRoQ1JDLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gT3V0U3RyZWFtV2l0aENSQy5oDQorDQorI2lmbmRlZiBfX09VVF9TVFJFQU1fV0lUSF9DUkNfSA0KKyNkZWZpbmUgX19PVVRfU1RSRUFNX1dJVEhfQ1JDX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vQy83ekNyYy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlDb20uaCINCisNCisjaW5jbHVkZSAiLi4vLi4vSVN0cmVhbS5oIg0KKw0KK2NsYXNzIENPdXRTdHJlYW1XaXRoQ1JDOg0KKyAgcHVibGljIElTZXF1ZW50aWFsT3V0U3RyZWFtLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IF9zdHJlYW07DQorICBVSW50NjQgX3NpemU7DQorICBVSW50MzIgX2NyYzsNCisgIGJvb2wgX2NhbGN1bGF0ZTsNCitwdWJsaWM6DQorICBNWV9VTktOT1dOX0lNUA0KKyAgU1RETUVUSE9EKFdyaXRlKShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCisgIHZvaWQgU2V0U3RyZWFtKElTZXF1ZW50aWFsT3V0U3RyZWFtICpzdHJlYW0pIHsgX3N0cmVhbSA9IHN0cmVhbTsgfQ0KKyAgdm9pZCBSZWxlYXNlU3RyZWFtKCkgeyBfc3RyZWFtLlJlbGVhc2UoKTsgfQ0KKyAgdm9pZCBJbml0KGJvb2wgY2FsY3VsYXRlID0gdHJ1ZSkNCisgIHsNCisgICAgX3NpemUgPSAwOw0KKyAgICBfY2FsY3VsYXRlID0gY2FsY3VsYXRlOw0KKyAgICBfY3JjID0gQ1JDX0lOSVRfVkFMOw0KKyAgfQ0KKyAgdm9pZCBFbmFibGVDYWxjKGJvb2wgY2FsY3VsYXRlKSB7IF9jYWxjdWxhdGUgPSBjYWxjdWxhdGU7IH0NCisgIHZvaWQgSW5pdENSQygpIHsgX2NyYyA9IENSQ19JTklUX1ZBTDsgfQ0KKyAgVUludDY0IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBfc2l6ZTsgfQ0KKyAgVUludDMyIEdldENSQygpIGNvbnN0IHsgcmV0dXJuIENSQ19HRVRfRElHRVNUKF9jcmMpOyB9DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL1BhcnNlUHJvcGVydGllcy5jcHAgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvQ29tbW9uL1BhcnNlUHJvcGVydGllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlODliMwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vUGFyc2VQcm9wZXJ0aWVzLmNwcApAQCAtMCwwICsxLDMgQEAKKy8vIFBhcnNlUHJvcGVydGllcy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9QYXJzZVByb3BlcnRpZXMuaCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vUGFyc2VQcm9wZXJ0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzNjdhNwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vUGFyc2VQcm9wZXJ0aWVzLmgKQEAgLTAsMCArMSw2IEBACisvLyBQYXJzZVByb3BlcnRpZXMuaA0KKw0KKyNpZm5kZWYgX19QQVJTRV9QUk9QRVJUSUVTX0gNCisjZGVmaW5lIF9fUEFSU0VfUFJPUEVSVElFU19IDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0NvbW1vbi9TdGRBZnguaCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vU3RkQWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkOWFjMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Db21tb24vU3RkQWZ4LmgKQEAgLTAsMCArMSw4IEBACisvLyBTdGRBZnguaA0KKw0KKyNpZm5kZWYgX19TVERBRlhfSA0KKyNkZWZpbmUgX19TVERBRlhfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vQ29tbW9uLmgiDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0RsbEV4cG9ydHMyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9EbGxFeHBvcnRzMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2N2Q0NgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9EbGxFeHBvcnRzMi5jcHAKQEAgLTAsMCArMSw4MiBAQAorLy8gRExMRXhwb3J0czIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlJbml0R3VpZC5oIg0KKw0KKyNpZiBkZWZpbmVkKF83WklQX0xBUkdFX1BBR0VTKQ0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0FsbG9jLmgiDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9Db21UcnkuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vV2luZG93cy9OdENoZWNrLmgiDQorI2luY2x1ZGUgIi4uLy4uL1dpbmRvd3MvUHJvcFZhcmlhbnQuaCINCisNCisjaW5jbHVkZSAiLi4vSUNvZGVyLmgiDQorI2luY2x1ZGUgIi4uL0lQYXNzd29yZC5oIg0KKw0KKyNpbmNsdWRlICJJQXJjaGl2ZS5oIg0KKw0KK0hJTlNUQU5DRSBnX2hJbnN0YW5jZTsNCisNCisjZGVmaW5lIE5UX0NIRUNLX0ZBSUxfQUNUSU9OIHJldHVybiBGQUxTRTsNCisNCitleHRlcm4gIkMiDQorQk9PTCBXSU5BUEkgRGxsTWFpbigNCisgICNpZmRlZiBVTkRFUl9DRQ0KKyAgSEFORExFDQorICAjZWxzZQ0KKyAgSElOU1RBTkNFDQorICAjZW5kaWYNCisgIGhJbnN0YW5jZSwgRFdPUkQgZHdSZWFzb24sIExQVk9JRCAvKmxwUmVzZXJ2ZWQqLykNCit7DQorICBpZiAoZHdSZWFzb24gPT0gRExMX1BST0NFU1NfQVRUQUNIKQ0KKyAgew0KKyAgICBnX2hJbnN0YW5jZSA9IChISU5TVEFOQ0UpaEluc3RhbmNlOw0KKyAgICBOVF9DSEVDSzsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCisNCitERUZJTkVfR1VJRChDTFNJRF9DQXJjaGl2ZUhhbmRsZXIsDQorMHgyMzE3MEY2OSwgMHg0MEMxLCAweDI3OEEsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDApOw0KKw0KK3N0YXRpYyBjb25zdCBVSW50MTYga0RlY29kZUlkID0gMHgyNzkwOw0KKw0KK0RFRklORV9HVUlEKENMU0lEX0NDb2RlYywNCisweDIzMTcwRjY5LCAweDQwQzEsIGtEZWNvZGVJZCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7DQorDQorU1REQVBJIENyZWF0ZUNvZGVyKGNvbnN0IEdVSUQgKmNsc2lkLCBjb25zdCBHVUlEICppaWQsIHZvaWQgKipvdXRPYmplY3QpOw0KK1NUREFQSSBDcmVhdGVIYXNoZXIoY29uc3QgR1VJRCAqY2xzaWQsIElIYXNoZXIgKipoYXNoZXIpOw0KK1NUREFQSSBDcmVhdGVBcmNoaXZlcihjb25zdCBHVUlEICpjbGFzc0lELCBjb25zdCBHVUlEICppaWQsIHZvaWQgKipvdXRPYmplY3QpOw0KKw0KK1NUREFQSSBDcmVhdGVPYmplY3QoY29uc3QgR1VJRCAqY2xzaWQsIGNvbnN0IEdVSUQgKmlpZCwgdm9pZCAqKm91dE9iamVjdCkNCit7DQorICAvLyBDT01fVFJZX0JFR0lODQorICAqb3V0T2JqZWN0ID0gMDsNCisgIGlmICgqaWlkID09IElJRF9JQ29tcHJlc3NDb2RlciB8fA0KKyAgICAgICppaWQgPT0gSUlEX0lDb21wcmVzc0NvZGVyMiB8fA0KKyAgICAgICppaWQgPT0gSUlEX0lDb21wcmVzc0ZpbHRlcikNCisgICAgcmV0dXJuIENyZWF0ZUNvZGVyKGNsc2lkLCBpaWQsIG91dE9iamVjdCk7DQorICBpZiAoKmlpZCA9PSBJSURfSUhhc2hlcikNCisgICAgcmV0dXJuIENyZWF0ZUhhc2hlcihjbHNpZCwgKElIYXNoZXIgKiopb3V0T2JqZWN0KTsNCisgIHJldHVybiBDcmVhdGVBcmNoaXZlcihjbHNpZCwgaWlkLCBvdXRPYmplY3QpOw0KKyAgLy8gQ09NX1RSWV9FTkQNCit9DQorDQorU1REQVBJIFNldExhcmdlUGFnZU1vZGUoKQ0KK3sNCisgICNpZiBkZWZpbmVkKF83WklQX0xBUkdFX1BBR0VTKQ0KKyAgU2V0TGFyZ2VQYWdlU2l6ZSgpOw0KKyAgI2VuZGlmDQorICByZXR1cm4gU19PSzsNCit9DQorDQorZXh0ZXJuIGJvb2wgZ19DYXNlU2Vuc2l0aXZlOw0KKw0KK1NUREFQSSBTZXRDYXNlU2Vuc2l0aXZlKEludDMyIGNhc2VTZW5zaXRpdmUpDQorew0KKyAgZ19DYXNlU2Vuc2l0aXZlID0gKGNhc2VTZW5zaXRpdmUgIT0gMCk7DQorICByZXR1cm4gU19PSzsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0lBcmNoaXZlLmggYi9sem1hL0NQUC83emlwL0FyY2hpdmUvSUFyY2hpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTgzMWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL0lBcmNoaXZlLmgKQEAgLTAsMCArMSw0NzYgQEAKKy8vIElBcmNoaXZlLmgNCisNCisjaWZuZGVmIF9fSUFSQ0hJVkVfSA0KKyNkZWZpbmUgX19JQVJDSElWRV9IDQorDQorI2luY2x1ZGUgIi4uL0lQcm9ncmVzcy5oIg0KKyNpbmNsdWRlICIuLi9JU3RyZWFtLmgiDQorI2luY2x1ZGUgIi4uL1Byb3BJRC5oIg0KKw0KKyNkZWZpbmUgQVJDSElWRV9JTlRFUkZBQ0VfU1VCKGksIGJhc2UsIHgpIERFQ0xfSU5URVJGQUNFX1NVQihpLCBiYXNlLCA2LCB4KQ0KKyNkZWZpbmUgQVJDSElWRV9JTlRFUkZBQ0UoaSwgeCkgQVJDSElWRV9JTlRFUkZBQ0VfU1VCKGksIElVbmtub3duLCB4KQ0KKw0KK25hbWVzcGFjZSBORmlsZVRpbWVUeXBlDQorew0KKyAgZW51bSBFRW51bQ0KKyAgew0KKyAgICBrV2luZG93cywNCisgICAga1VuaXgsDQorICAgIGtET1MNCisgIH07DQorfQ0KKw0KK25hbWVzcGFjZSBOQXJjSW5mb0ZsYWdzDQorew0KKyAgY29uc3QgVUludDMyIGtLZWVwTmFtZSAgICAgICAgPSAxIDw8IDA7ICAvLyBrZWVwIG5hbWUgb2YgZmlsZSBpbiBhcmNoaXZlIG5hbWUNCisgIGNvbnN0IFVJbnQzMiBrQWx0U3RyZWFtcyAgICAgID0gMSA8PCAxOyAgLy8gdGhlIGhhbmRsZXIgc3VwcG9ydHMgYWx0IHN0cmVhbXMNCisgIGNvbnN0IFVJbnQzMiBrTnRTZWN1cmUgICAgICAgID0gMSA8PCAyOyAgLy8gdGhlIGhhbmRsZXIgc3VwcG9ydHMgTlQgc2VjdXJpdHkNCisgIGNvbnN0IFVJbnQzMiBrRmluZFNpZ25hdHVyZSAgID0gMSA8PCAzOyAgLy8gdGhlIGhhbmRsZXIgY2FuIGZpbmQgc3RhcnQgb2YgYXJjaGl2ZQ0KKyAgY29uc3QgVUludDMyIGtNdWx0aVNpZ25hdHVyZSAgPSAxIDw8IDQ7ICAvLyB0aGVyZSBhcmUgc2V2ZXJhbCBzaWduYXR1cmVzDQorICBjb25zdCBVSW50MzIga1VzZUdsb2JhbE9mZnNldCA9IDEgPDwgNTsgIC8vIHRoZSBzZWVrIHBvc2l0aW9uIG9mIHN0cmVhbSBtdXN0IGJlIHNldCBhcyBnbG9iYWwgb2Zmc2V0DQorICBjb25zdCBVSW50MzIga1N0YXJ0T3BlbiAgICAgICA9IDEgPDwgNjsgIC8vIGNhbGwgaGFuZGxlciBmb3IgZWFjaCBzdGFydCBwb3NpdGlvbg0KKyAgY29uc3QgVUludDMyIGtQdXJlU3RhcnRPcGVuICAgPSAxIDw8IDc7ICAvLyBjYWxsIGhhbmRsZXIgb25seSBmb3Igc3RhcnQgb2YgZmlsZQ0KKyAgY29uc3QgVUludDMyIGtCYWNrd2FyZE9wZW4gICAgPSAxIDw8IDg7ICAvLyBhcmNoaXZlIGNhbiBiZSBvcGVuIGJhY2t3YXJkDQorICBjb25zdCBVSW50MzIga1ByZUFyYyAgICAgICAgICA9IDEgPDwgOTsgIC8vIHN1Y2ggYXJjaGl2ZSBjYW4gYmUgc3RvcmVkIGJlZm9yZSByZWFsIGFyY2hpdmUgKGxpa2UgU0ZYIHN0dWIpDQorICBjb25zdCBVSW50MzIga1N5bUxpbmtzICAgICAgICA9IDEgPDwgMTA7IC8vIHRoZSBoYW5kbGVyIHN1cHBvcnRzIHN5bWJvbGljIGxpbmtzDQorICBjb25zdCBVSW50MzIga0hhcmRMaW5rcyAgICAgICA9IDEgPDwgMTE7IC8vIHRoZSBoYW5kbGVyIHN1cHBvcnRzIGhhcmQgbGlua3MNCit9DQorDQorbmFtZXNwYWNlIE5BcmNoaXZlDQorew0KKyAgbmFtZXNwYWNlIE5IYW5kbGVyUHJvcElEDQorICB7DQorICAgIGVudW0NCisgICAgew0KKyAgICAgIGtOYW1lID0gMCwgICAgICAgIC8vIFZUX0JTVFINCisgICAgICBrQ2xhc3NJRCwgICAgICAgICAvLyBiaW5hcnkgR1VJRCBpbiBWVF9CU1RSDQorICAgICAga0V4dGVuc2lvbiwgICAgICAgLy8gVlRfQlNUUg0KKyAgICAgIGtBZGRFeHRlbnNpb24sICAgIC8vIFZUX0JTVFINCisgICAgICBrVXBkYXRlLCAgICAgICAgICAvLyBWVF9CT09MDQorICAgICAga0tlZXBOYW1lLCAgICAgICAgLy8gVlRfQk9PTA0KKyAgICAgIGtTaWduYXR1cmUsICAgICAgIC8vIGJpbmFyeSBpbiBWVF9CU1RSDQorICAgICAga011bHRpU2lnbmF0dXJlLCAgLy8gYmluYXJ5IGluIFZUX0JTVFINCisgICAgICBrU2lnbmF0dXJlT2Zmc2V0LCAvLyBWVF9VSTQNCisgICAgICBrQWx0U3RyZWFtcywgICAgICAvLyBWVF9CT09MDQorICAgICAga050U2VjdXJlLCAgICAgICAgLy8gVlRfQk9PTA0KKyAgICAgIGtGbGFncyAgICAgICAgICAgIC8vIFZUX1VJNA0KKyAgICAgIC8vIGtWZXJzaW9uICAgICAgICAgIC8vIFZUX1VJNCAoKFZFUl9NQUpPUiA8PCA4KSB8IFZFUl9NSU5PUikNCisgICAgfTsNCisgIH0NCisNCisgIG5hbWVzcGFjZSBORXh0cmFjdA0KKyAgew0KKyAgICBuYW1lc3BhY2UgTkFza01vZGUNCisgICAgew0KKyAgICAgIGVudW0NCisgICAgICB7DQorICAgICAgICBrRXh0cmFjdCA9IDAsDQorICAgICAgICBrVGVzdCwNCisgICAgICAgIGtTa2lwDQorICAgICAgfTsNCisgICAgfQ0KKyAgDQorICAgIG5hbWVzcGFjZSBOT3BlcmF0aW9uUmVzdWx0DQorICAgIHsNCisgICAgICBlbnVtDQorICAgICAgew0KKyAgICAgICAga09LID0gMCwNCisgICAgICAgIGtVbnN1cHBvcnRlZE1ldGhvZCwNCisgICAgICAgIGtEYXRhRXJyb3IsDQorICAgICAgICBrQ1JDRXJyb3IsDQorICAgICAgICBrVW5hdmFpbGFibGUsDQorICAgICAgICBrVW5leHBlY3RlZEVuZCwNCisgICAgICAgIGtEYXRhQWZ0ZXJFbmQsDQorICAgICAgICBrSXNOb3RBcmMsDQorICAgICAgICBrSGVhZGVyc0Vycm9yDQorICAgICAgfTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBuYW1lc3BhY2UgTlVwZGF0ZQ0KKyAgew0KKyAgICBuYW1lc3BhY2UgTk9wZXJhdGlvblJlc3VsdA0KKyAgICB7DQorICAgICAgZW51bQ0KKyAgICAgIHsNCisgICAgICAgIGtPSyA9IDANCisgICAgICAgICwgLy8ga0Vycm9yDQorICAgICAgfTsNCisgICAgfQ0KKyAgfQ0KK30NCisNCisjZGVmaW5lIElOVEVSRkFDRV9JQXJjaGl2ZU9wZW5DYWxsYmFjayh4KSBcDQorICBTVERNRVRIT0QoU2V0VG90YWwpKGNvbnN0IFVJbnQ2NCAqZmlsZXMsIGNvbnN0IFVJbnQ2NCAqYnl0ZXMpIHg7IFwNCisgIFNURE1FVEhPRChTZXRDb21wbGV0ZWQpKGNvbnN0IFVJbnQ2NCAqZmlsZXMsIGNvbnN0IFVJbnQ2NCAqYnl0ZXMpIHg7IFwNCisNCitBUkNISVZFX0lOVEVSRkFDRShJQXJjaGl2ZU9wZW5DYWxsYmFjaywgMHgxMCkNCit7DQorICBJTlRFUkZBQ0VfSUFyY2hpdmVPcGVuQ2FsbGJhY2soUFVSRSk7DQorfTsNCisNCisvKg0KK0lBcmNoaXZlRXh0cmFjdENhbGxiYWNrOjpHZXRTdHJlYW0NCisgIFJlc3VsdDoNCisgICAgICAoKmluU3RyZWFtID09IE5VTEwpIC0gZm9yIGRpcmVjdG9yaWVzDQorICAgICAgKCppblN0cmVhbSA9PSBOVUxMKSAtIGlmIGxpbmsgKGhhcmQgbGluayBvciBzeW1ib2xpYyBsaW5rKSB3YXMgY3JlYXRlZA0KKyovDQorDQorI2RlZmluZSBJTlRFUkZBQ0VfSUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2soeCkgXA0KKyAgSU5URVJGQUNFX0lQcm9ncmVzcyh4KSBcDQorICBTVERNRVRIT0QoR2V0U3RyZWFtKShVSW50MzIgaW5kZXgsIElTZXF1ZW50aWFsT3V0U3RyZWFtICoqb3V0U3RyZWFtLCBJbnQzMiBhc2tFeHRyYWN0TW9kZSkgeDsgXA0KKyAgU1RETUVUSE9EKFByZXBhcmVPcGVyYXRpb24pKEludDMyIGFza0V4dHJhY3RNb2RlKSB4OyBcDQorICBTVERNRVRIT0QoU2V0T3BlcmF0aW9uUmVzdWx0KShJbnQzMiByZXN1bHRFT3BlcmF0aW9uUmVzdWx0KSB4OyBcDQorDQorQVJDSElWRV9JTlRFUkZBQ0VfU1VCKElBcmNoaXZlRXh0cmFjdENhbGxiYWNrLCBJUHJvZ3Jlc3MsIDB4MjApDQorew0KKyAgSU5URVJGQUNFX0lBcmNoaXZlRXh0cmFjdENhbGxiYWNrKFBVUkUpDQorfTsNCisNCisNCisjZGVmaW5lIElOVEVSRkFDRV9JQXJjaGl2ZU9wZW5Wb2x1bWVDYWxsYmFjayh4KSBcDQorICBTVERNRVRIT0QoR2V0UHJvcGVydHkpKFBST1BJRCBwcm9wSUQsIFBST1BWQVJJQU5UICp2YWx1ZSkgeDsgXA0KKyAgU1RETUVUSE9EKEdldFN0cmVhbSkoY29uc3Qgd2NoYXJfdCAqbmFtZSwgSUluU3RyZWFtICoqaW5TdHJlYW0pIHg7IFwNCisNCitBUkNISVZFX0lOVEVSRkFDRShJQXJjaGl2ZU9wZW5Wb2x1bWVDYWxsYmFjaywgMHgzMCkNCit7DQorICBJTlRFUkZBQ0VfSUFyY2hpdmVPcGVuVm9sdW1lQ2FsbGJhY2soUFVSRSk7DQorfTsNCisNCisNCitBUkNISVZFX0lOVEVSRkFDRShJSW5BcmNoaXZlR2V0U3RyZWFtLCAweDQwKQ0KK3sNCisgIFNURE1FVEhPRChHZXRTdHJlYW0pKFVJbnQzMiBpbmRleCwgSVNlcXVlbnRpYWxJblN0cmVhbSAqKnN0cmVhbSkgUFVSRTsNCit9Ow0KKw0KKw0KK0FSQ0hJVkVfSU5URVJGQUNFKElBcmNoaXZlT3BlblNldFN1YkFyY2hpdmVOYW1lLCAweDUwKQ0KK3sNCisgIFNURE1FVEhPRChTZXRTdWJBcmNoaXZlTmFtZSkoY29uc3Qgd2NoYXJfdCAqbmFtZSkgUFVSRTsNCit9Ow0KKw0KKw0KKy8qDQorSUluQXJjaGl2ZTo6T3Blbg0KKyAgICBzdHJlYW0NCisgICAgICBpZiAoa1VzZUdsb2JhbE9mZnNldCksIHN0cmVhbSBjdXJyZW50IHBvc2l0aW9uIGNhbiBiZSBub24gMC4NCisgICAgICBpZiAoIWtVc2VHbG9iYWxPZmZzZXQpLCBzdHJlYW0gY3VycmVudCBwb3NpdGlvbiBpcyAwLg0KKyAgICBpZiAobWF4Q2hlY2tTdGFydFBvc2l0aW9uID09IE5VTEwpLCB0aGUgaGFuZGxlciBjYW4gdHJ5IHRvIHNlYXJjaCBhcmNoaXZlIHN0YXJ0IGluIHN0cmVhbQ0KKyAgICBpZiAoKm1heENoZWNrU3RhcnRQb3NpdGlvbiA9PSAwKSwgdGhlIGhhbmRsZXIgbXVzdCBjaGVjayBvbmx5IGN1cnJlbnQgcG9zaXRpb24gYXMgYXJjaGl2ZSBzdGFydA0KKw0KK0lJbkFyY2hpdmU6OkV4dHJhY3Q6DQorICBpbmRpY2VzIG11c3QgYmUgc29ydGVkDQorICBudW1JdGVtcyA9IChVSW50MzIpKEludDMyKS0xID0gMHhGRkZGRkZGRiBtZWFucyAiYWxsIGZpbGVzIg0KKyAgdGVzdE1vZGUgIT0gMCBtZWFucyAidGVzdCBmaWxlcyB3aXRob3V0IHdyaXRpbmcgdG8gb3V0U3RyZWFtIg0KKw0KK0lJbkFyY2hpdmU6OkdldEFyY2hpdmVQcm9wZXJ0eToNCisgIGtwaWRPZmZzZXQgIC0gc3RhcnQgb2Zmc2V0IG9mIGFyY2hpdmUuDQorICAgICAgVlRfRU1QVFkgOiBtZWFucyBvZmZzZXQgPSAwLg0KKyAgICAgIFZUX1VJNCwgVlRfVUk4LCBWVF9JOCA6IHJlc3VsdCBvZmZzZXQ7IG5lZ2F0aXZlIHZhbHVlcyBpcyBhbGxvd2VkDQorICBrcGlkUGh5U2l6ZSAtIHNpemUgb2YgYXJjaGl2ZS4gVlRfRU1QVFkgbWVhbnMgdW5rbm93biBzaXplLg0KKyAgICBrcGlkUGh5U2l6ZSBpcyBhbGxvd2VkIHRvIGJlIGxhcmdlciB0aGFuIGZpbGUgc2l6ZS4gSW4gdGhhdCBjYXNlIGl0IG11c3Qgc2hvdw0KKyAgICBzdXBwb3NlZCBzaXplLg0KKw0KKyAga3BpZElzRGVsZXRlZDoNCisgIGtwaWRJc0FsdFN0cmVhbToNCisgIGtwaWRJc0F1eDoNCisgIGtwaWRJTm9kZToNCisgICAgbXVzdCByZXR1cm4gVkFSSUFOVF9UUlVFIChWVF9CT09MKSwgaWYgYXJjaGl2ZSBjYW4gc3VwcG9ydCB0aGF0IHByb3BlcnR5IGluIEdldFByb3BlcnR5Lg0KKw0KKw0KK05vdGVzOg0KKyAgRG9uJ3QgY2FsbCBJSW5BcmNoaXZlIGZ1bmN0aW9ucyBmb3Igc2FtZSBJSW5BcmNoaXZlIG9iamVjdCBmcm9tIGRpZmZlcmVudCB0aHJlYWRzIHNpbXVsdGFuZW91c2x5Lg0KKyAgU29tZSBJSW5BcmNoaXZlIGhhbmRsZXJzIHdpbGwgd29yayBpbmNvcnJlY3RseSBpbiB0aGF0IGNhc2UuDQorKi8NCisNCisvKiBNU1ZDIGFsbG93cyB0aGUgY29kZSB3aGVyZSB0aGVyZSBpcyB0aHJvdygpIGluIGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uLA0KKyAgIGJ1dCB0aGVyZSBpcyBubyB0aHJvdygpIGluIGRlZmluaXRpb24gb2YgZnVuY3Rpb24uICovDQorDQorI2lmZGVmIF9NU0NfVkVSDQorICAjZGVmaW5lIE1ZX05PX1RIUk9XX0RFQ0xfT05MWSB0aHJvdygpDQorI2Vsc2UNCisgICNkZWZpbmUgTVlfTk9fVEhST1dfREVDTF9PTkxZDQorI2VuZGlmDQorDQorI2RlZmluZSBJTlRFUkZBQ0VfSUluQXJjaGl2ZSh4KSBcDQorICBTVERNRVRIT0QoT3BlbikoSUluU3RyZWFtICpzdHJlYW0sIGNvbnN0IFVJbnQ2NCAqbWF4Q2hlY2tTdGFydFBvc2l0aW9uLCBJQXJjaGl2ZU9wZW5DYWxsYmFjayAqb3BlbkNhbGxiYWNrKSBNWV9OT19USFJPV19ERUNMX09OTFkgeDsgXA0KKyAgU1RETUVUSE9EKENsb3NlKSgpIE1ZX05PX1RIUk9XX0RFQ0xfT05MWSB4OyBcDQorICBTVERNRVRIT0QoR2V0TnVtYmVyT2ZJdGVtcykoVUludDMyICpudW1JdGVtcykgTVlfTk9fVEhST1dfREVDTF9PTkxZIHg7IFwNCisgIFNURE1FVEhPRChHZXRQcm9wZXJ0eSkoVUludDMyIGluZGV4LCBQUk9QSUQgcHJvcElELCBQUk9QVkFSSUFOVCAqdmFsdWUpIE1ZX05PX1RIUk9XX0RFQ0xfT05MWSB4OyBcDQorICBTVERNRVRIT0QoRXh0cmFjdCkoY29uc3QgVUludDMyKiBpbmRpY2VzLCBVSW50MzIgbnVtSXRlbXMsIEludDMyIHRlc3RNb2RlLCBJQXJjaGl2ZUV4dHJhY3RDYWxsYmFjayAqZXh0cmFjdENhbGxiYWNrKSBNWV9OT19USFJPV19ERUNMX09OTFkgeDsgXA0KKyAgU1RETUVUSE9EKEdldEFyY2hpdmVQcm9wZXJ0eSkoUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKSBNWV9OT19USFJPV19ERUNMX09OTFkgeDsgXA0KKyAgU1RETUVUSE9EKEdldE51bWJlck9mUHJvcGVydGllcykoVUludDMyICpudW1Qcm9wcykgTVlfTk9fVEhST1dfREVDTF9PTkxZIHg7IFwNCisgIFNURE1FVEhPRChHZXRQcm9wZXJ0eUluZm8pKFVJbnQzMiBpbmRleCwgQlNUUiAqbmFtZSwgUFJPUElEICpwcm9wSUQsIFZBUlRZUEUgKnZhclR5cGUpIE1ZX05PX1RIUk9XX0RFQ0xfT05MWSB4OyBcDQorICBTVERNRVRIT0QoR2V0TnVtYmVyT2ZBcmNoaXZlUHJvcGVydGllcykoVUludDMyICpudW1Qcm9wcykgTVlfTk9fVEhST1dfREVDTF9PTkxZIHg7IFwNCisgIFNURE1FVEhPRChHZXRBcmNoaXZlUHJvcGVydHlJbmZvKShVSW50MzIgaW5kZXgsIEJTVFIgKm5hbWUsIFBST1BJRCAqcHJvcElELCBWQVJUWVBFICp2YXJUeXBlKSBNWV9OT19USFJPV19ERUNMX09OTFkgeDsNCisNCitBUkNISVZFX0lOVEVSRkFDRShJSW5BcmNoaXZlLCAweDYwKQ0KK3sNCisgIElOVEVSRkFDRV9JSW5BcmNoaXZlKFBVUkUpDQorfTsNCisNCituYW1lc3BhY2UgTlBhcmVudFR5cGUNCit7DQorICBlbnVtDQorICB7DQorICAgIGtEaXIgPSAwLA0KKyAgICBrQWx0U3RyZWFtDQorICB9Ow0KK307DQorDQorbmFtZXNwYWNlIE5Qcm9wRGF0YVR5cGUNCit7DQorICBjb25zdCBVSW50MzIga01hc2tfWmVyb0VuZCAgID0gMSA8PCA0Ow0KKyAgLy8gY29uc3QgVUludDMyIGtNYXNrX0JpZ0VuZGlhbiA9IDEgPDwgNTsNCisgIGNvbnN0IFVJbnQzMiBrTWFza19VdGYgICAgICAgPSAxIDw8IDY7DQorICAvLyBjb25zdCBVSW50MzIga01hc2tfVXRmOCAgPSBrTWFza19VdGYgfCAwOw0KKyAgY29uc3QgVUludDMyIGtNYXNrX1V0ZjE2ID0ga01hc2tfVXRmIHwgMTsNCisgIC8vIGNvbnN0IFVJbnQzMiBrTWFza19VdGYzMiA9IGtNYXNrX1V0ZiB8IDI7DQorDQorICBjb25zdCBVSW50MzIga05vdERlZmluZWQgPSAwOw0KKyAgY29uc3QgVUludDMyIGtSYXcgPSAxOw0KKyAgY29uc3QgVUludDMyIGtVdGYxNnogPSBrTWFza19VdGYxNiB8IGtNYXNrX1plcm9FbmQ7DQorfTsNCisNCisvLyBVVEYgc3RyaW5nIChwb2ludGVyIHRvIHdjaGFyX3QpIHdpdGggemVybyBlbmQgYW5kIGxpdHRsZS1lbmRpYW4uDQorI2RlZmluZSBQUk9QX0RBVEFfVFlQRV93Y2hhcl90X1BUUl9aX0xFICgoTlByb3BEYXRhVHlwZTo6a01hc2tfVXRmIHwgTlByb3BEYXRhVHlwZTo6a01hc2tfWmVyb0VuZCkgKyAoc2l6ZW9mKHdjaGFyX3QpID4+IDEpKQ0KKw0KKy8qDQorR2V0UmF3UHJvcDoNCisgIFJlc3VsdDoNCisgICAgU19PSyAtIGV2ZW4gaWYgcHJvcGVydHkgaXMgbm90IHNldA0KKyovDQorDQorI2RlZmluZSBJTlRFUkZBQ0VfSUFyY2hpdmVHZXRSYXdQcm9wcyh4KSBcDQorICBTVERNRVRIT0QoR2V0UGFyZW50KShVSW50MzIgaW5kZXgsIFVJbnQzMiAqcGFyZW50LCBVSW50MzIgKnBhcmVudFR5cGUpIHg7IFwNCisgIFNURE1FVEhPRChHZXRSYXdQcm9wKShVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIGNvbnN0IHZvaWQgKipkYXRhLCBVSW50MzIgKmRhdGFTaXplLCBVSW50MzIgKnByb3BUeXBlKSB4OyBcDQorICBTVERNRVRIT0QoR2V0TnVtUmF3UHJvcHMpKFVJbnQzMiAqbnVtUHJvcHMpIHg7IFwNCisgIFNURE1FVEhPRChHZXRSYXdQcm9wSW5mbykoVUludDMyIGluZGV4LCBCU1RSICpuYW1lLCBQUk9QSUQgKnByb3BJRCkgeDsNCisNCitBUkNISVZFX0lOVEVSRkFDRShJQXJjaGl2ZUdldFJhd1Byb3BzLCAweDcwKQ0KK3sNCisgIElOVEVSRkFDRV9JQXJjaGl2ZUdldFJhd1Byb3BzKFBVUkUpDQorfTsNCisNCisjZGVmaW5lIElOVEVSRkFDRV9JQXJjaGl2ZUdldFJvb3RQcm9wcyh4KSBcDQorICBTVERNRVRIT0QoR2V0Um9vdFByb3ApKFBST1BJRCBwcm9wSUQsIFBST1BWQVJJQU5UICp2YWx1ZSkgeDsgXA0KKyAgU1RETUVUSE9EKEdldFJvb3RSYXdQcm9wKShQUk9QSUQgcHJvcElELCBjb25zdCB2b2lkICoqZGF0YSwgVUludDMyICpkYXRhU2l6ZSwgVUludDMyICpwcm9wVHlwZSkgeDsgXA0KKyANCitBUkNISVZFX0lOVEVSRkFDRShJQXJjaGl2ZUdldFJvb3RQcm9wcywgMHg3MSkNCit7DQorICBJTlRFUkZBQ0VfSUFyY2hpdmVHZXRSb290UHJvcHMoUFVSRSkNCit9Ow0KKw0KK0FSQ0hJVkVfSU5URVJGQUNFKElBcmNoaXZlT3BlblNlcSwgMHg2MSkNCit7DQorICBTVERNRVRIT0QoT3BlblNlcSkoSVNlcXVlbnRpYWxJblN0cmVhbSAqc3RyZWFtKSBQVVJFOw0KK307DQorDQorLyoNCisgIE9wZW5Gb3JTaXplDQorICBSZXN1bHQ6DQorICAgIFNfRkFMU0UgLSBpcyBub3QgYXJjaGl2ZQ0KKyAgICA/IC0gREFUQSBlcnJvcg0KKyovDQorICAgIA0KKy8qDQorY29uc3QgVUludDMyIGtPcGVuRmxhZ3NfUmVhbFBoeVNpemUgPSAxIDw8IDA7DQorY29uc3QgVUludDMyIGtPcGVuRmxhZ3NfTm9TZWVrID0gMSA8PCAxOw0KKy8vIGNvbnN0IFVJbnQzMiBrT3BlbkZsYWdzX0JlZm9yZUV4dHJhY3QgPSAxIDw8IDI7DQorKi8NCisNCisvKg0KK0ZsYWdzOg0KKyAgIDAgLSBvcGVucyBhcmNoaXZlIHdpdGggSUluU3RyZWFtLCBpZiBJSW5TdHJlYW0gaW50ZXJmYWNlIGlzIHN1cHBvcnRlZA0KKyAgICAgLSBpZiBwaHlTaXplIGlzIG5vdCBhdmFpbGFibGUsIGl0IGRvZXNuJ3QgdHJ5IHRvIG1ha2UgZnVsbCBwYXJzZSB0byBnZXQgcGh5U2l6ZQ0KKyAgIGtPcGVuRmxhZ3NfTm9TZWVrIC0gIEFyY09wZW4yIGZ1bmN0aW9uIGRvZXNuJ3QgdXNlIElJblN0cmVhbSBpbnRlcmZhY2UsIGV2ZW4gaWYgaXQncyBhdmFpbGFibGUNCisgICBrT3BlbkZsYWdzX1JlYWxQaHlTaXplIC0gdGhlIGhhbmRsZXIgd2lsbCB0cnkgdG8gZ2V0IFBoeVNpemUsIGV2ZW4gaWYgaXQgcmVxdWlyZXMgZnVsbCBkZWNvbXByZXNzaW9uIGZvciBmaWxlDQorICAgDQorICBpZiBoYW5kbGVyIGlzIG5vdCBhbGxvd2VkIHRvIHVzZSBJSW5TdHJlYW0gYW5kIHRoZSBmbGFnIGtPcGVuRmxhZ3NfUmVhbFBoeVNpemUgaXMgbm90IHNwZWNpZmllZCwNCisgIHRoZSBoYW5kbGVyIGNhbiByZXR1cm4gU19PSywgYnV0IGl0IGRvZXNuJ3QgY2hlY2sgZXZlbiBTaWduYXR1cmUuDQorICBTbyBuZXh0IEV4dHJhY3QgY2FuIGJlIGNhbGxlZCBmb3IgdGhhdCBzZXF1ZW50aWFsIHN0cmVhbS4NCisqLw0KKw0KKy8qDQorQVJDSElWRV9JTlRFUkZBQ0UoSUFyY2hpdmVPcGVuMiwgMHg2MikNCit7DQorICBTVERNRVRIT0QoQXJjT3BlbjIpKElTZXF1ZW50aWFsSW5TdHJlYW0gKnN0cmVhbSwgVUludDMyIGZsYWdzLCBJQXJjaGl2ZU9wZW5DYWxsYmFjayAqb3BlbkNhbGxiYWNrKSBQVVJFOw0KK307DQorKi8NCisNCisvLyAtLS0tLS0tLS0tIFVQREFURSAtLS0tLS0tLS0tDQorDQorLyoNCitHZXRVcGRhdGVJdGVtSW5mbyBvdXRzOg0KKypuZXdEYXRhICAqbmV3UHJvcHMNCisgICAwICAgICAgICAwICAgICAgLSBDb3B5IGRhdGEgYW5kIHByb3BlcnRpZXMgZnJvbSBhcmNoaXZlDQorICAgMCAgICAgICAgMSAgICAgIC0gQ29weSBkYXRhIGZyb20gYXJjaGl2ZSwgcmVxdWVzdCBuZXcgcHJvcGVydGllcw0KKyAgIDEgICAgICAgIDAgICAgICAtIHRoYXQgY29tYmluYXRpb24gaXMgdW51c2VkIG5vdw0KKyAgIDEgICAgICAgIDEgICAgICAtIFJlcXVlc3QgbmV3IGRhdGEgYW5kIG5ldyBwcm9wZXJ0aWVzLiBJdCBjYW4gYmUgdXNlZCBldmVuIGZvciBmb2xkZXJzDQorDQorICBpbmRleEluQXJjaGl2ZSA9IC0xIGlmIHRoZXJlIGlzIG5vIGl0ZW0gaW4gYXJjaGl2ZSwgb3IgaWYgaXQgZG9lc24ndCBtYXR0ZXIuDQorDQorDQorR2V0U3RyZWFtIG91dDoNCisgIFJlc3VsdDoNCisgICAgU19PSzoNCisgICAgICAoKmluU3RyZWFtID09IE5VTEwpIC0gb25seSBmb3IgZGlyZWN0b3JpZXMNCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGhlIGJ1ZyB3YXMgZml4ZWQgaW4gOS4zMzogKCpTdHJlYW0gPT0gTlVMTCkgd2FzIGluIGNhc2Ugb2YgYW50aS1maWxlDQorICAgICAgKCppblN0cmVhbSAhPSBOVUxMKSAtIGZvciBhbnkgZmlsZSwgZXZlbiBmb3IgZW1wdHkgZmlsZSBvciBhbnRpLWZpbGUNCisgICAgU19GQUxTRSAtIHNraXAgdGhhdCBmaWxlIChkb24ndCBhZGQgaXRlbSB0byBhcmNoaXZlKSAtIChjbGllbnQgY29kZSBjYW4ndCBvcGVuIHN0cmVhbSBvZiB0aGF0IGZpbGUgYnkgc29tZSByZWFzb24pDQorICAgICAgKCppblN0cmVhbSA9PSBOVUxMKQ0KKw0KK1RoZSBvcmRlciBvZiBjYWxsaW5nIGZvciBoYXJkIGxpbmtzOg0KKyAgLSBHZXRTdHJlYW0oKQ0KKyAgLSBHZXRQcm9wZXJ0eShrcGlkSGFyZExpbmspDQorDQorKi8NCisNCisjZGVmaW5lIElOVEVSRkFDRV9JQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrKHgpIFwNCisgIElOVEVSRkFDRV9JUHJvZ3Jlc3MoeCk7IFwNCisgIFNURE1FVEhPRChHZXRVcGRhdGVJdGVtSW5mbykoVUludDMyIGluZGV4LCBJbnQzMiAqbmV3RGF0YSwgSW50MzIgKm5ld1Byb3BzLCBVSW50MzIgKmluZGV4SW5BcmNoaXZlKSB4OyBcDQorICBTVERNRVRIT0QoR2V0UHJvcGVydHkpKFVJbnQzMiBpbmRleCwgUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKSB4OyBcDQorICBTVERNRVRIT0QoR2V0U3RyZWFtKShVSW50MzIgaW5kZXgsIElTZXF1ZW50aWFsSW5TdHJlYW0gKippblN0cmVhbSkgeDsgXA0KKyAgU1RETUVUSE9EKFNldE9wZXJhdGlvblJlc3VsdCkoSW50MzIgb3BlcmF0aW9uUmVzdWx0KSB4OyBcDQorDQorQVJDSElWRV9JTlRFUkZBQ0VfU1VCKElBcmNoaXZlVXBkYXRlQ2FsbGJhY2ssIElQcm9ncmVzcywgMHg4MCkNCit7DQorICBJTlRFUkZBQ0VfSUFyY2hpdmVVcGRhdGVDYWxsYmFjayhQVVJFKTsNCit9Ow0KKw0KKyNkZWZpbmUgSU5URVJGQUNFX0lBcmNoaXZlVXBkYXRlQ2FsbGJhY2syKHgpIFwNCisgIElOVEVSRkFDRV9JQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrKHgpIFwNCisgIFNURE1FVEhPRChHZXRWb2x1bWVTaXplKShVSW50MzIgaW5kZXgsIFVJbnQ2NCAqc2l6ZSkgeDsgXA0KKyAgU1RETUVUSE9EKEdldFZvbHVtZVN0cmVhbSkoVUludDMyIGluZGV4LCBJU2VxdWVudGlhbE91dFN0cmVhbSAqKnZvbHVtZVN0cmVhbSkgeDsgXA0KKw0KK0FSQ0hJVkVfSU5URVJGQUNFX1NVQihJQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrMiwgSUFyY2hpdmVVcGRhdGVDYWxsYmFjaywgMHg4MikNCit7DQorICBJTlRFUkZBQ0VfSUFyY2hpdmVVcGRhdGVDYWxsYmFjazIoUFVSRSk7DQorfTsNCisNCisvKg0KK1VwZGF0ZUl0ZW1zKCkNCistLS0tLS0tLS0tLS0tDQorDQorICBvdXRTdHJlYW06IG91dHB1dCBzdHJlYW0uICh0aGUgaGFuZGxlcikgTVVTVCBzdXBwb3J0IHRoZSBjYXNlIHdoZW4NCisgICAgU2VlayBwb3NpdGlvbiBpbiBvdXRTdHJlYW0gaXMgbm90IFpFUk8uDQorICAgIGJ1dCB0aGUgY2FsbGVyIGNhbGxzIHdpdGggZW1wdHkgb3V0U3RyZWFtIGFuZCBzZWVrIHBvc2l0aW9uIGlzIFpFUk8/Pw0KKyANCisgIGFyY2hpdmVzIHdpdGggc3R1YjoNCisNCisgIElmIGFyY2hpdmUgaXMgb3BlbiBhbmQgdGhlIGhhbmRsZXIgYW5kIChPZmZzZXQgPiAwKSwgdGhlbiB0aGUgaGFuZGxlcg0KKyAga25vd3MgYWJvdXQgc3R1YiBzaXplLg0KKyAgVXBkYXRlSXRlbXMoKToNCisgIDEpIHRoZSBoYW5kbGVyIE1VU1QgY29weSB0aGF0IHN0dWIgdG8gb3V0U3RyZWFtDQorICAyKSB0aGUgY2FsbGVyIE1VU1QgTk9UIGNvcHkgdGhlIHN0dWIgdG8gb3V0U3RyZWFtLCBpZg0KKyAgICAgInJzZngiIHByb3BlcnR5IGlzIHNldCB3aXRoIFNldFByb3BlcnRpZXMNCisNCisgIHRoZSBoYW5kbGVyIG11c3Qgc3VwcG9ydCB0aGUgY2FzZSB3aGVyZQ0KKyAgICBJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtDQorKi8NCisNCisNCisjZGVmaW5lIElOVEVSRkFDRV9JT3V0QXJjaGl2ZSh4KSBcDQorICBTVERNRVRIT0QoVXBkYXRlSXRlbXMpKElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sIFVJbnQzMiBudW1JdGVtcywgSUFyY2hpdmVVcGRhdGVDYWxsYmFjayAqdXBkYXRlQ2FsbGJhY2spIHg7IFwNCisgIFNURE1FVEhPRChHZXRGaWxlVGltZVR5cGUpKFVJbnQzMiAqdHlwZSkgeDsNCisNCitBUkNISVZFX0lOVEVSRkFDRShJT3V0QXJjaGl2ZSwgMHhBMCkNCit7DQorICBJTlRFUkZBQ0VfSU91dEFyY2hpdmUoUFVSRSkNCit9Ow0KKw0KKw0KK0FSQ0hJVkVfSU5URVJGQUNFKElTZXRQcm9wZXJ0aWVzLCAweDAzKQ0KK3sNCisgIFNURE1FVEhPRChTZXRQcm9wZXJ0aWVzKShjb25zdCB3Y2hhcl90ICoqbmFtZXMsIGNvbnN0IFBST1BWQVJJQU5UICp2YWx1ZXMsIFVJbnQzMiBudW1Qcm9wcykgUFVSRTsNCit9Ow0KKw0KK0FSQ0hJVkVfSU5URVJGQUNFKElBcmNoaXZlS2VlcE1vZGVGb3JOZXh0T3BlbiwgMHgwNCkNCit7DQorICBTVERNRVRIT0QoS2VlcE1vZGVGb3JOZXh0T3BlbikoKSBQVVJFOw0KK307DQorDQorLyogRXhlIGhhbmRsZXI6IHRoZSBoYW5kbGVyIGZvciBleGVjdXRhYmxlIGZvcm1hdCAoUEUsIEVMRiwgTWFjaC1PKS4NCisgICBTRlggYXJjaGl2ZTogZXhlY3V0YWJsZSBzdHViICsgc29tZSB0YWlsIGRhdGEuDQorICAgICBiZWZvcmUgOS4zMTogZXhlIGhhbmRsZXIgZGlkbid0IHBhcnNlIFNGWCBhcmNoaXZlcyBhcyBleGVjdXRhYmxlIGZvcm1hdC4NCisgICAgIGZvciA5LjMxKzogZXhlIGhhbmRsZXIgcGFyc2VzIFNGWCBhcmNoaXZlcyBhcyBleGVjdXRhYmxlIGZvcm1hdCwgb25seSBpZiBBbGxvd1RhaWwoMSkgd2FzIGNhbGxlZCAqLw0KKw0KK0FSQ0hJVkVfSU5URVJGQUNFKElBcmNoaXZlQWxsb3dUYWlsLCAweDA1KQ0KK3sNCisgIFNURE1FVEhPRChBbGxvd1RhaWwpKEludDMyIGFsbG93VGFpbCkgUFVSRTsNCit9Ow0KKw0KKw0KKyNkZWZpbmUgSU1QX0lJbkFyY2hpdmVfR2V0UHJvcChrKSBcDQorICAoVUludDMyIGluZGV4LCBCU1RSICpuYW1lLCBQUk9QSUQgKnByb3BJRCwgVkFSVFlQRSAqdmFyVHlwZSkgXA0KKyAgICB7IGlmIChpbmRleCA+PSBBUlJBWV9TSVpFKGspKSByZXR1cm4gRV9JTlZBTElEQVJHOyBcDQorICAgICpwcm9wSUQgPSBrW2luZGV4XTsgKnZhclR5cGUgPSBrN3pfUFJPUElEX1RvX1ZBUlRZUEVbKHVuc2lnbmVkKSpwcm9wSURdOyAgKm5hbWUgPSAwOyByZXR1cm4gU19PSzsgfSBcDQorDQorI2RlZmluZSBJTVBfSUluQXJjaGl2ZV9HZXRQcm9wX1dJVEhfTkFNRShrKSBcDQorICAoVUludDMyIGluZGV4LCBCU1RSICpuYW1lLCBQUk9QSUQgKnByb3BJRCwgVkFSVFlQRSAqdmFyVHlwZSkgXA0KKyAgICB7IGlmIChpbmRleCA+PSBBUlJBWV9TSVpFKGspKSByZXR1cm4gRV9JTlZBTElEQVJHOyBcDQorICAgIGNvbnN0IFNUQVRQUk9QU1RHICZzcmNJdGVtID0ga1tpbmRleF07IFwNCisgICAgKnByb3BJRCA9IHNyY0l0ZW0ucHJvcGlkOyAqdmFyVHlwZSA9IHNyY0l0ZW0udnQ7IFwNCisgICAgaWYgKHNyY0l0ZW0ubHB3c3RyTmFtZSA9PSAwKSAqbmFtZSA9IDA7IGVsc2UgKm5hbWUgPSA6OlN5c0FsbG9jU3RyaW5nKHNyY0l0ZW0ubHB3c3RyTmFtZSk7IHJldHVybiBTX09LOyB9IFwNCisNCisjZGVmaW5lIElNUF9JSW5BcmNoaXZlX1Byb3BzIFwNCisgIFNURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0TnVtYmVyT2ZQcm9wZXJ0aWVzKFVJbnQzMiAqbnVtUHJvcHMpIFwNCisgICAgeyAqbnVtUHJvcHMgPSBBUlJBWV9TSVpFKGtQcm9wcyk7IHJldHVybiBTX09LOyB9IFwNCisgIFNURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0UHJvcGVydHlJbmZvIElNUF9JSW5BcmNoaXZlX0dldFByb3Aoa1Byb3BzKQ0KKw0KKyNkZWZpbmUgSU1QX0lJbkFyY2hpdmVfUHJvcHNfV0lUSF9OQU1FIFwNCisgIFNURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0TnVtYmVyT2ZQcm9wZXJ0aWVzKFVJbnQzMiAqbnVtUHJvcHMpIFwNCisgICAgeyAqbnVtUHJvcHMgPSBBUlJBWV9TSVpFKGtQcm9wcyk7IHJldHVybiBTX09LOyB9IFwNCisgIFNURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0UHJvcGVydHlJbmZvIElNUF9JSW5BcmNoaXZlX0dldFByb3BfV0lUSF9OQU1FKGtQcm9wcykNCisNCisNCisjZGVmaW5lIElNUF9JSW5BcmNoaXZlX0FyY1Byb3BzIFwNCisgIFNURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0TnVtYmVyT2ZBcmNoaXZlUHJvcGVydGllcyhVSW50MzIgKm51bVByb3BzKSBcDQorICAgIHsgKm51bVByb3BzID0gQVJSQVlfU0laRShrQXJjUHJvcHMpOyByZXR1cm4gU19PSzsgfSBcDQorICBTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkdldEFyY2hpdmVQcm9wZXJ0eUluZm8gSU1QX0lJbkFyY2hpdmVfR2V0UHJvcChrQXJjUHJvcHMpDQorDQorI2RlZmluZSBJTVBfSUluQXJjaGl2ZV9BcmNQcm9wc19XSVRIX05BTUUgXA0KKyAgU1RETUVUSE9ESU1QIENIYW5kbGVyOjpHZXROdW1iZXJPZkFyY2hpdmVQcm9wZXJ0aWVzKFVJbnQzMiAqbnVtUHJvcHMpIFwNCisgICAgeyAqbnVtUHJvcHMgPSBBUlJBWV9TSVpFKGtBcmNQcm9wcyk7IHJldHVybiBTX09LOyB9IFwNCisgIFNURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0QXJjaGl2ZVByb3BlcnR5SW5mbyBJTVBfSUluQXJjaGl2ZV9HZXRQcm9wX1dJVEhfTkFNRShrQXJjUHJvcHMpDQorDQorI2RlZmluZSBJTVBfSUluQXJjaGl2ZV9BcmNQcm9wc19OT19UYWJsZSBcDQorICBTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkdldE51bWJlck9mQXJjaGl2ZVByb3BlcnRpZXMoVUludDMyICpudW1Qcm9wcykgXA0KKyAgICB7ICpudW1Qcm9wcyA9IDA7IHJldHVybiBTX09LOyB9IFwNCisgIFNURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0QXJjaGl2ZVByb3BlcnR5SW5mbyhVSW50MzIsIEJTVFIgKiwgUFJPUElEICosIFZBUlRZUEUgKikgXA0KKyAgICB7IHJldHVybiBFX05PVElNUEw7IH0gXA0KKw0KKyNkZWZpbmUgSU1QX0lJbkFyY2hpdmVfQXJjUHJvcHNfTk8gXA0KKyAgSU1QX0lJbkFyY2hpdmVfQXJjUHJvcHNfTk9fVGFibGUgXA0KKyAgU1RETUVUSE9ESU1QIENIYW5kbGVyOjpHZXRBcmNoaXZlUHJvcGVydHkoUFJPUElELCBQUk9QVkFSSUFOVCAqdmFsdWUpIFwNCisgICAgeyB2YWx1ZS0+dnQgPSBWVF9FTVBUWTsgcmV0dXJuIFNfT0s7IH0NCisNCisNCisNCisjZGVmaW5lIGtfSXNBcmNfUmVzX05PICAgMA0KKyNkZWZpbmUga19Jc0FyY19SZXNfWUVTICAxDQorI2RlZmluZSBrX0lzQXJjX1Jlc19ORUVEX01PUkUgMg0KKy8vICNkZWZpbmUga19Jc0FyY19SZXNfWUVTX0xPV19QUk9CIDMNCisNCisjZGVmaW5lIEFQSV9GVU5DX0lzQXJjIEVYVEVSTl9DIFVJbnQzMiBXSU5BUEkNCisjZGVmaW5lIEFQSV9GVU5DX3N0YXRpY19Jc0FyYyBleHRlcm4gIkMiIHsgc3RhdGljIFVJbnQzMiBXSU5BUEkNCisNCitleHRlcm4gIkMiDQorew0KKyAgdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkgKkZ1bmNfQ3JlYXRlT2JqZWN0KShjb25zdCBHVUlEICpjbHNJRCwgY29uc3QgR1VJRCAqaWlkLCB2b2lkICoqb3V0T2JqZWN0KTsNCisNCisgIHR5cGVkZWYgVUludDMyIChXSU5BUEkgKkZ1bmNfSXNBcmMpKGNvbnN0IEJ5dGUgKnAsIHNpemVfdCBzaXplKTsNCisgIHR5cGVkZWYgSFJFU1VMVCAoV0lOQVBJICpGdW5jX0dldElzQXJjKShVSW50MzIgZm9ybWF0SW5kZXgsIEZ1bmNfSXNBcmMgKmlzQXJjKTsNCisNCisgIHR5cGVkZWYgSFJFU1VMVCAoV0lOQVBJICpGdW5jX0dldE51bWJlck9mRm9ybWF0cykoVUludDMyICpudW1Gb3JtYXRzKTsNCisgIHR5cGVkZWYgSFJFU1VMVCAoV0lOQVBJICpGdW5jX0dldEhhbmRsZXJQcm9wZXJ0eSkoUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKTsNCisgIHR5cGVkZWYgSFJFU1VMVCAoV0lOQVBJICpGdW5jX0dldEhhbmRsZXJQcm9wZXJ0eTIpKFVJbnQzMiBpbmRleCwgUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKTsNCisNCisgIHR5cGVkZWYgSFJFU1VMVCAoV0lOQVBJICpGdW5jX1NldENhc2VTZW5zaXRpdmUpKEludDMyIGNhc2VTZW5zaXRpdmUpOw0KKyAgdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkgKkZ1bmNfU2V0TGFyZ2VQYWdlTW9kZSkoKTsNCisNCisgIHR5cGVkZWYgSU91dEFyY2hpdmUgKiAoKkZ1bmNfQ3JlYXRlT3V0QXJjaGl2ZSkoKTsNCisgIHR5cGVkZWYgSUluQXJjaGl2ZSAqICgqRnVuY19DcmVhdGVJbkFyY2hpdmUpKCk7DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9JY29ucy83ei5pY28gYi9sem1hL0NQUC83emlwL0FyY2hpdmUvSWNvbnMvN3ouaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOTc1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvSWNvbnMvN3ouaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9Mem1hSGFuZGxlci5jcHAgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvTHptYUhhbmRsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNzIwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0FyY2hpdmUvTHptYUhhbmRsZXIuY3BwCkBAIC0wLDAgKzEsNjA0IEBACisvLyBMem1hSGFuZGxlci5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0MvQ3B1QXJjaC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vQ29tVHJ5LmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9JbnRUb1N0cmluZy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9XaW5kb3dzL1Byb3BWYXJpYW50LmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9DcmVhdGVDb2Rlci5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vUHJvZ3Jlc3NVdGlscy5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vUmVnaXN0ZXJBcmMuaCINCisjaW5jbHVkZSAiLi4vQ29tbW9uL1N0cmVhbVV0aWxzLmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbXByZXNzL0x6bWFEZWNvZGVyLmgiDQorDQorI2luY2x1ZGUgIkNvbW1vbi9EdW1teU91dFN0cmVhbS5oIg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCisNCituYW1lc3BhY2UgTkFyY2hpdmUgew0KK25hbWVzcGFjZSBOTHptYSB7DQorDQorc3RhdGljIGJvb2wgQ2hlY2tEaWNTaXplKGNvbnN0IEJ5dGUgKnApDQorew0KKyAgVUludDMyIGRpY1NpemUgPSBHZXRVaTMyKHApOw0KKyAgaWYgKGRpY1NpemUgPT0gMSkNCisgICAgcmV0dXJuIHRydWU7DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDw9IDMwOyBpKyspDQorICAgIGlmIChkaWNTaXplID09ICgoVUludDMyKTIgPDwgaSkgfHwgZGljU2l6ZSA9PSAoKFVJbnQzMikzIDw8IGkpKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgcmV0dXJuIChkaWNTaXplID09IDB4RkZGRkZGRkYpOw0KK30NCisNCitzdGF0aWMgY29uc3QgQnl0ZSBrUHJvcHNbXSA9DQorew0KKyAga3BpZFNpemUsDQorICBrcGlkUGFja1NpemUsDQorICBrcGlkTWV0aG9kDQorfTsNCisNCitzdGF0aWMgY29uc3QgQnl0ZSBrQXJjUHJvcHNbXSA9DQorew0KKyAga3BpZE51bVN0cmVhbXMNCit9Ow0KKw0KK3N0cnVjdCBDSGVhZGVyDQorew0KKyAgVUludDY0IFNpemU7DQorICBCeXRlIEZpbHRlcklEOw0KKyAgQnl0ZSBMem1hUHJvcHNbNV07DQorDQorICBVSW50MzIgR2V0RGljU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEdldFVpMzIoTHptYVByb3BzICsgMSk7IH0NCisgIGJvb2wgSGFzU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIChTaXplICE9IChVSW50NjQpKEludDY0KS0xKTsgfQ0KKyAgYm9vbCBQYXJzZShjb25zdCBCeXRlICpidWYsIGJvb2wgaXNUaGVyZUZpbHRlcik7DQorfTsNCisNCitib29sIENIZWFkZXI6OlBhcnNlKGNvbnN0IEJ5dGUgKmJ1ZiwgYm9vbCBpc1RoZXJlRmlsdGVyKQ0KK3sNCisgIEZpbHRlcklEID0gMDsNCisgIGlmIChpc1RoZXJlRmlsdGVyKQ0KKyAgICBGaWx0ZXJJRCA9IGJ1ZlswXTsNCisgIGNvbnN0IEJ5dGUgKnNpZyA9IGJ1ZiArIChpc1RoZXJlRmlsdGVyID8gMSA6IDApOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspDQorICAgIEx6bWFQcm9wc1tpXSA9IHNpZ1tpXTsNCisgIFNpemUgPSBHZXRVaTY0KHNpZyArIDUpOw0KKyAgcmV0dXJuDQorICAgIEx6bWFQcm9wc1swXSA8IDUgKiA1ICogOSAmJg0KKyAgICBGaWx0ZXJJRCA8IDIgJiYNCisgICAgKCFIYXNTaXplKCkgfHwgU2l6ZSA8ICgoVUludDY0KTEgPDwgNTYpKQ0KKyAgICAmJiBDaGVja0RpY1NpemUoTHptYVByb3BzICsgMSk7DQorfQ0KKw0KK2NsYXNzIENEZWNvZGVyDQorew0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyPiBfbHptYURlY29kZXI7DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IF9iY2pTdHJlYW07DQorcHVibGljOg0KKyAgTkNvbXByZXNzOjpOTHptYTo6Q0RlY29kZXIgKl9sem1hRGVjb2RlclNwZWM7DQorDQorICB+Q0RlY29kZXIoKTsNCisgIEhSRVNVTFQgQ3JlYXRlKERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgICAgYm9vbCBmaWx0ZXJlZCwgSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0pOw0KKw0KKyAgSFJFU1VMVCBDb2RlKGNvbnN0IENIZWFkZXIgJmhlYWRlciwgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSwgSUNvbXByZXNzUHJvZ3Jlc3NJbmZvICpwcm9ncmVzcyk7DQorDQorICBVSW50NjQgR2V0SW5wdXRQcm9jZXNzZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2x6bWFEZWNvZGVyU3BlYy0+R2V0SW5wdXRQcm9jZXNzZWRTaXplKCk7IH0NCisNCisgIHZvaWQgUmVsZWFzZUluU3RyZWFtKCkgeyBpZiAoX2x6bWFEZWNvZGVyKSBfbHptYURlY29kZXJTcGVjLT5SZWxlYXNlSW5TdHJlYW0oKTsgfQ0KKw0KKyAgSFJFU1VMVCBSZWFkSW5wdXQoQnl0ZSAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCisgICAgeyByZXR1cm4gX2x6bWFEZWNvZGVyU3BlYy0+UmVhZEZyb21JbnB1dFN0cmVhbShkYXRhLCBzaXplLCBwcm9jZXNzZWRTaXplKTsgfQ0KK307DQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrX0JDSiA9IDB4MDMwMzAxMDM7DQorICANCitIUkVTVUxUIENEZWNvZGVyOjpDcmVhdGUoDQorICAgIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgIGJvb2wgZmlsdGVyZWRNb2RlLCBJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSkNCit7DQorICBpZiAoIV9sem1hRGVjb2RlcikNCisgIHsNCisgICAgX2x6bWFEZWNvZGVyU3BlYyA9IG5ldyBOQ29tcHJlc3M6Ok5Mem1hOjpDRGVjb2RlcjsNCisgICAgX2x6bWFEZWNvZGVyU3BlYy0+RmluaXNoU3RyZWFtID0gdHJ1ZTsNCisgICAgX2x6bWFEZWNvZGVyID0gX2x6bWFEZWNvZGVyU3BlYzsNCisgIH0NCisNCisgIGlmIChmaWx0ZXJlZE1vZGUpDQorICB7DQorICAgIGlmICghX2JjalN0cmVhbSkNCisgICAgew0KKyAgICAgIENNeUNvbVB0cjxJQ29tcHJlc3NDb2Rlcj4gY29kZXI7DQorICAgICAgUklOT0soQ3JlYXRlQ29kZXIoRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTIGtfQkNKLCBjb2RlciwgZmFsc2UpKTsNCisgICAgICBpZiAoIWNvZGVyKQ0KKyAgICAgICAgcmV0dXJuIEVfTk9USU1QTDsNCisgICAgICBjb2Rlci5RdWVyeUludGVyZmFjZShJSURfSVNlcXVlbnRpYWxPdXRTdHJlYW0sICZfYmNqU3RyZWFtKTsNCisgICAgICBpZiAoIV9iY2pTdHJlYW0pDQorICAgICAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgICB9DQorICB9DQorDQorICByZXR1cm4gX2x6bWFEZWNvZGVyU3BlYy0+U2V0SW5TdHJlYW0oaW5TdHJlYW0pOw0KK30NCisNCitDRGVjb2Rlcjo6fkNEZWNvZGVyKCkNCit7DQorICBSZWxlYXNlSW5TdHJlYW0oKTsNCit9DQorDQorSFJFU1VMVCBDRGVjb2Rlcjo6Q29kZShjb25zdCBDSGVhZGVyICZoZWFkZXIsIElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sDQorICAgIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpDQorew0KKyAgaWYgKGhlYWRlci5GaWx0ZXJJRCA+IDEpDQorICAgIHJldHVybiBFX05PVElNUEw7DQorDQorICB7DQorICAgIENNeUNvbVB0cjxJQ29tcHJlc3NTZXREZWNvZGVyUHJvcGVydGllczI+IHNldERlY29kZXJQcm9wZXJ0aWVzOw0KKyAgICBfbHptYURlY29kZXIuUXVlcnlJbnRlcmZhY2UoSUlEX0lDb21wcmVzc1NldERlY29kZXJQcm9wZXJ0aWVzMiwgJnNldERlY29kZXJQcm9wZXJ0aWVzKTsNCisgICAgaWYgKCFzZXREZWNvZGVyUHJvcGVydGllcykNCisgICAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgICBSSU5PSyhzZXREZWNvZGVyUHJvcGVydGllcy0+U2V0RGVjb2RlclByb3BlcnRpZXMyKGhlYWRlci5Mem1hUHJvcHMsIDUpKTsNCisgIH0NCisNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NTZXRPdXRTdHJlYW0+IHNldE91dFN0cmVhbTsNCisNCisgIGJvb2wgZmlsdGVyZWRNb2RlID0gKGhlYWRlci5GaWx0ZXJJRCA9PSAxKTsNCisNCisgIGlmIChmaWx0ZXJlZE1vZGUpDQorICB7DQorICAgIF9iY2pTdHJlYW0uUXVlcnlJbnRlcmZhY2UoSUlEX0lDb21wcmVzc1NldE91dFN0cmVhbSwgJnNldE91dFN0cmVhbSk7DQorICAgIGlmICghc2V0T3V0U3RyZWFtKQ0KKyAgICAgIHJldHVybiBFX05PVElNUEw7DQorICAgIFJJTk9LKHNldE91dFN0cmVhbS0+U2V0T3V0U3RyZWFtKG91dFN0cmVhbSkpOw0KKyAgICBvdXRTdHJlYW0gPSBfYmNqU3RyZWFtOw0KKyAgfQ0KKw0KKyAgY29uc3QgVUludDY0ICpTaXplID0gaGVhZGVyLkhhc1NpemUoKSA/ICZoZWFkZXIuU2l6ZSA6IE5VTEw7DQorICBIUkVTVUxUIHJlcyA9IF9sem1hRGVjb2RlclNwZWMtPkNvZGVSZXN1bWUob3V0U3RyZWFtLCBTaXplLCBwcm9ncmVzcyk7DQorDQorICBpZiAoZmlsdGVyZWRNb2RlKQ0KKyAgew0KKyAgICBDTXlDb21QdHI8SU91dFN0cmVhbUZsdXNoPiBmbHVzaDsNCisgICAgX2JjalN0cmVhbS5RdWVyeUludGVyZmFjZShJSURfSU91dFN0cmVhbUZsdXNoLCAmZmx1c2gpOw0KKyAgICBpZiAoZmx1c2gpDQorICAgIHsNCisgICAgICBIUkVTVUxUIHJlczIgPSBmbHVzaC0+Rmx1c2goKTsNCisgICAgICBpZiAocmVzID09IFNfT0spDQorICAgICAgICByZXMgPSByZXMyOw0KKyAgICB9DQorICAgIEhSRVNVTFQgcmVzMiA9IHNldE91dFN0cmVhbS0+UmVsZWFzZU91dFN0cmVhbSgpOw0KKyAgICBpZiAocmVzID09IFNfT0spDQorICAgICAgcmVzID0gcmVzMjsNCisgIH0NCisgIFJJTk9LKHJlcyk7DQorDQorICBpZiAoaGVhZGVyLkhhc1NpemUoKSkNCisgICAgaWYgKF9sem1hRGVjb2RlclNwZWMtPkdldE91dHB1dFByb2Nlc3NlZFNpemUoKSAhPSBoZWFkZXIuU2l6ZSkNCisgICAgICByZXR1cm4gU19GQUxTRTsNCisNCisgIHJldHVybiBTX09LOw0KK30NCisNCisNCitjbGFzcyBDSGFuZGxlcjoNCisgIHB1YmxpYyBJSW5BcmNoaXZlLA0KKyAgcHVibGljIElBcmNoaXZlT3BlblNlcSwNCisgIFBVQkxJQ19JU2V0Q29tcHJlc3NDb2RlY3NJbmZvDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIENIZWFkZXIgX2hlYWRlcjsNCisgIGJvb2wgX2x6bWE4NjsNCisgIENNeUNvbVB0cjxJSW5TdHJlYW0+IF9zdHJlYW07DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gX3NlcVN0cmVhbTsNCisgIA0KKyAgYm9vbCBfaXNBcmM7DQorICBib29sIF9uZWVkU2Vla1RvU3RhcnQ7DQorICBib29sIF9kYXRhQWZ0ZXJFbmQ7DQorICBib29sIF9uZWVkTW9yZUlucHV0Ow0KKw0KKyAgYm9vbCBfcGFja1NpemVfRGVmaW5lZDsNCisgIGJvb2wgX3VucGFja1NpemVfRGVmaW5lZDsNCisgIGJvb2wgX251bVN0cmVhbXNfRGVmaW5lZDsNCisNCisgIGJvb2wgX3Vuc3VwcG9ydGVkOw0KKyAgYm9vbCBfZGF0YUVycm9yOw0KKw0KKyAgVUludDY0IF9wYWNrU2l6ZTsNCisgIFVJbnQ2NCBfdW5wYWNrU2l6ZTsNCisgIFVJbnQ2NCBfbnVtU3RyZWFtczsNCisNCisgIERFQ0xfRVhURVJOQUxfQ09ERUNTX1ZBUlMNCisgIERFQ0xfSVNldENvbXByZXNzQ29kZWNzSW5mbw0KKw0KK3B1YmxpYzoNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0JFR0lOMihJSW5BcmNoaXZlKQ0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoSUFyY2hpdmVPcGVuU2VxKQ0KKyAgUVVFUllfRU5UUllfSVNldENvbXByZXNzQ29kZWNzSW5mbw0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5EDQorICBNWV9BRERSRUZfUkVMRUFTRQ0KKw0KKyAgSU5URVJGQUNFX0lJbkFyY2hpdmUoOykNCisgIFNURE1FVEhPRChPcGVuU2VxKShJU2VxdWVudGlhbEluU3RyZWFtICpzdHJlYW0pOw0KKw0KKyAgQ0hhbmRsZXIoYm9vbCBsem1hODYpIHsgX2x6bWE4NiA9IGx6bWE4NjsgfQ0KKw0KKyAgdW5zaWduZWQgR2V0SGVhZGVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDUgKyA4ICsgKF9sem1hODYgPyAxIDogMCk7IH0NCisNCit9Ow0KKw0KK0lNUF9JSW5BcmNoaXZlX1Byb3BzDQorSU1QX0lJbkFyY2hpdmVfQXJjUHJvcHMNCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkdldEFyY2hpdmVQcm9wZXJ0eShQUk9QSUQgcHJvcElELCBQUk9QVkFSSUFOVCAqdmFsdWUpDQorew0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBzd2l0Y2ggKHByb3BJRCkNCisgIHsNCisgICAgY2FzZSBrcGlkUGh5U2l6ZTogaWYgKF9wYWNrU2l6ZV9EZWZpbmVkKSBwcm9wID0gX3BhY2tTaXplOyBicmVhazsNCisgICAgY2FzZSBrcGlkTnVtU3RyZWFtczogaWYgKF9udW1TdHJlYW1zX0RlZmluZWQpIHByb3AgPSBfbnVtU3RyZWFtczsgYnJlYWs7DQorICAgIGNhc2Uga3BpZFVucGFja1NpemU6IGlmIChfdW5wYWNrU2l6ZV9EZWZpbmVkKSBwcm9wID0gX3VucGFja1NpemU7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRFcnJvckZsYWdzOg0KKyAgICB7DQorICAgICAgVUludDMyIHYgPSAwOw0KKyAgICAgIGlmICghX2lzQXJjKSB2IHw9IGtwdl9FcnJvckZsYWdzX0lzTm90QXJjOzsNCisgICAgICBpZiAoX25lZWRNb3JlSW5wdXQpIHYgfD0ga3B2X0Vycm9yRmxhZ3NfVW5leHBlY3RlZEVuZDsNCisgICAgICBpZiAoX2RhdGFBZnRlckVuZCkgdiB8PSBrcHZfRXJyb3JGbGFnc19EYXRhQWZ0ZXJFbmQ7DQorICAgICAgaWYgKF91bnN1cHBvcnRlZCkgdiB8PSBrcHZfRXJyb3JGbGFnc19VbnN1cHBvcnRlZE1ldGhvZDsNCisgICAgICBpZiAoX2RhdGFFcnJvcikgdiB8PSBrcHZfRXJyb3JGbGFnc19EYXRhRXJyb3I7DQorICAgICAgcHJvcCA9IHY7DQorICAgIH0NCisgIH0NCisgIHByb3AuRGV0YWNoKHZhbHVlKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkdldE51bWJlck9mSXRlbXMoVUludDMyICpudW1JdGVtcykNCit7DQorICAqbnVtSXRlbXMgPSAxOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIERpY3RTaXplVG9TdHJpbmcoVUludDMyIHZhbHVlLCBjaGFyICpzKQ0KK3sNCisgIGZvciAoaW50IGkgPSAwOyBpIDw9IDMxOyBpKyspDQorICAgIGlmICgoKFVJbnQzMikxIDw8IGkpID09IHZhbHVlKQ0KKyAgICB7DQorICAgICAgOjpDb252ZXJ0VUludDMyVG9TdHJpbmcoaSwgcyk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICBjaGFyIGMgPSAnYic7DQorICAgICAgIGlmICgodmFsdWUgJiAoKDEgPDwgMjApIC0gMSkpID09IDApIHsgdmFsdWUgPj49IDIwOyBjID0gJ20nOyB9DQorICBlbHNlIGlmICgodmFsdWUgJiAoKDEgPDwgMTApIC0gMSkpID09IDApIHsgdmFsdWUgPj49IDEwOyBjID0gJ2snOyB9DQorICA6OkNvbnZlcnRVSW50MzJUb1N0cmluZyh2YWx1ZSwgcyk7DQorICBzICs9IE15U3RyaW5nTGVuKHMpOw0KKyAgKnMrKyA9IGM7DQorICAqcyA9IDA7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0UHJvcGVydHkoVUludDMyIC8qIGluZGV4ICovLCBQUk9QSUQgcHJvcElELCBQUk9QVkFSSUFOVCAqdmFsdWUpDQorew0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBzd2l0Y2ggKHByb3BJRCkNCisgIHsNCisgICAgY2FzZSBrcGlkU2l6ZTogaWYgKF9zdHJlYW0gJiYgX2hlYWRlci5IYXNTaXplKCkpIHByb3AgPSBfaGVhZGVyLlNpemU7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRQYWNrU2l6ZTogaWYgKF9wYWNrU2l6ZV9EZWZpbmVkKSBwcm9wID0gX3BhY2tTaXplOyBicmVhazsNCisgICAgY2FzZSBrcGlkTWV0aG9kOg0KKyAgICAgIGlmIChfc3RyZWFtKQ0KKyAgICAgIHsNCisgICAgICAgIGNoYXIgc3pbNjRdOw0KKyAgICAgICAgY2hhciAqcyA9IHN6Ow0KKyAgICAgICAgaWYgKF9oZWFkZXIuRmlsdGVySUQgIT0gMCkNCisgICAgICAgICAgcyA9IE15U3RwQ3B5KHMsICJCQ0ogIik7DQorICAgICAgICBzID0gTXlTdHBDcHkocywgIkxaTUE6Iik7DQorICAgICAgICBEaWN0U2l6ZVRvU3RyaW5nKF9oZWFkZXIuR2V0RGljU2l6ZSgpLCBzKTsNCisgICAgICAgIHByb3AgPSBzejsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICB9DQorICBwcm9wLkRldGFjaCh2YWx1ZSk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorQVBJX0ZVTkNfc3RhdGljX0lzQXJjIElzQXJjX0x6bWEoY29uc3QgQnl0ZSAqcCwgc2l6ZV90IHNpemUpDQorew0KKyAgY29uc3QgVUludDMyIGtIZWFkZXJTaXplID0gMSArIDQgKyA4Ow0KKyAgaWYgKHNpemUgPCBrSGVhZGVyU2l6ZSkNCisgICAgcmV0dXJuIGtfSXNBcmNfUmVzX05FRURfTU9SRTsNCisgIGlmIChwWzBdID49IDUgKiA1ICogOSkNCisgICAgcmV0dXJuIGtfSXNBcmNfUmVzX05POw0KKyAgVUludDY0IHVucGFja1NpemUgPSBHZXRVaTY0KHAgKyAxICsgNCk7DQorICBpZiAodW5wYWNrU2l6ZSAhPSAoVUludDY0KShJbnQ2NCktMSkNCisgIHsNCisgICAgaWYgKHNpemUgPj0gKChVSW50NjQpMSA8PCA1NikpDQorICAgICAgcmV0dXJuIGtfSXNBcmNfUmVzX05POw0KKyAgfQ0KKyAgaWYgKHVucGFja1NpemUgIT0gMCkNCisgIHsNCisgICAgaWYgKHNpemUgPCBrSGVhZGVyU2l6ZSArIDIpDQorICAgICAgcmV0dXJuIGtfSXNBcmNfUmVzX05FRURfTU9SRTsNCisgICAgaWYgKHBba0hlYWRlclNpemVdICE9IDApDQorICAgICAgcmV0dXJuIGtfSXNBcmNfUmVzX05POw0KKyAgICBpZiAodW5wYWNrU2l6ZSAhPSAoVUludDY0KShJbnQ2NCktMSkNCisgICAgew0KKyAgICAgIGlmICgocFtrSGVhZGVyU2l6ZSArIDFdICYgMHg4MCkgIT0gMCkNCisgICAgICAgIHJldHVybiBrX0lzQXJjX1Jlc19OTzsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFDaGVja0RpY1NpemUocCArIDEpKQ0KKyAgICAvLyByZXR1cm4ga19Jc0FyY19SZXNfWUVTX0xPV19QUk9COw0KKyAgICByZXR1cm4ga19Jc0FyY19SZXNfTk87DQorICByZXR1cm4ga19Jc0FyY19SZXNfWUVTOw0KK30NCit9DQorDQorQVBJX0ZVTkNfc3RhdGljX0lzQXJjIElzQXJjX0x6bWE4Nihjb25zdCBCeXRlICpwLCBzaXplX3Qgc2l6ZSkNCit7DQorICBpZiAoc2l6ZSA8IDEpDQorICAgIHJldHVybiBrX0lzQXJjX1Jlc19ORUVEX01PUkU7DQorICBCeXRlIGZpbHRlcklEID0gcFswXTsNCisgIGlmIChmaWx0ZXJJRCAhPSAwICYmIGZpbHRlcklEICE9IDEpDQorICAgIHJldHVybiBrX0lzQXJjX1Jlc19OTzsNCisgIHJldHVybiBJc0FyY19Mem1hKHAgKyAxLCBzaXplIC0gMSk7DQorfQ0KK30NCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6Ok9wZW4oSUluU3RyZWFtICppblN0cmVhbSwgY29uc3QgVUludDY0ICosIElBcmNoaXZlT3BlbkNhbGxiYWNrICopDQorew0KKyAgQ2xvc2UoKTsNCisgIA0KKyAgY29uc3QgVUludDMyIGtCdWZTaXplID0gMSArIDUgKyA4ICsgMjsNCisgIEJ5dGUgYnVmW2tCdWZTaXplXTsNCisgIA0KKyAgUklOT0soUmVhZFN0cmVhbV9GQUxTRShpblN0cmVhbSwgYnVmLCBrQnVmU2l6ZSkpOw0KKyAgDQorICBpZiAoIV9oZWFkZXIuUGFyc2UoYnVmLCBfbHptYTg2KSkNCisgICAgcmV0dXJuIFNfRkFMU0U7DQorICBjb25zdCBCeXRlICpzdGFydCA9IGJ1ZiArIEdldEhlYWRlclNpemUoKTsNCisgIGlmIChzdGFydFswXSAhPSAwIC8qIHx8IChzdGFydFsxXSAmIDB4ODApICE9IDAgKi8gKSAvLyBlbXB0eSBzdHJlYW0gd2l0aCBFT1MgaXMgbm90IDB4ODANCisgICAgcmV0dXJuIFNfRkFMU0U7DQorICANCisgIFJJTk9LKGluU3RyZWFtLT5TZWVrKDAsIFNUUkVBTV9TRUVLX0VORCwgJl9wYWNrU2l6ZSkpOw0KKyAgaWYgKF9wYWNrU2l6ZSA+PSAyNCAmJiBfaGVhZGVyLlNpemUgPT0gMCAmJiBfaGVhZGVyLkZpbHRlcklEID09IDAgJiYgX2hlYWRlci5Mem1hUHJvcHNbMF0gPT0gMCkNCisgICAgcmV0dXJuIFNfRkFMU0U7DQorICBfaXNBcmMgPSB0cnVlOw0KKyAgX3N0cmVhbSA9IGluU3RyZWFtOw0KKyAgX3NlcVN0cmVhbSA9IGluU3RyZWFtOw0KKyAgX25lZWRTZWVrVG9TdGFydCA9IHRydWU7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENIYW5kbGVyOjpPcGVuU2VxKElTZXF1ZW50aWFsSW5TdHJlYW0gKnN0cmVhbSkNCit7DQorICBDbG9zZSgpOw0KKyAgX2lzQXJjID0gdHJ1ZTsNCisgIF9zZXFTdHJlYW0gPSBzdHJlYW07DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENIYW5kbGVyOjpDbG9zZSgpDQorew0KKyAgX2lzQXJjID0gZmFsc2U7DQorICBfcGFja1NpemVfRGVmaW5lZCA9IGZhbHNlOw0KKyAgX3VucGFja1NpemVfRGVmaW5lZCA9IGZhbHNlOw0KKyAgX251bVN0cmVhbXNfRGVmaW5lZCA9IGZhbHNlOw0KKw0KKyAgX2RhdGFBZnRlckVuZCA9IGZhbHNlOw0KKyAgX25lZWRNb3JlSW5wdXQgPSBmYWxzZTsNCisgIF91bnN1cHBvcnRlZCA9IGZhbHNlOw0KKyAgX2RhdGFFcnJvciA9IGZhbHNlOw0KKw0KKyAgX3BhY2tTaXplID0gMDsNCisNCisgIF9uZWVkU2Vla1RvU3RhcnQgPSBmYWxzZTsNCisNCisgIF9zdHJlYW0uUmVsZWFzZSgpOw0KKyAgX3NlcVN0cmVhbS5SZWxlYXNlKCk7DQorICAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK2NsYXNzIENDb21wcmVzc1Byb2dyZXNzSW5mb0ltcDoNCisgIHB1YmxpYyBJQ29tcHJlc3NQcm9ncmVzc0luZm8sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIENNeUNvbVB0cjxJQXJjaGl2ZU9wZW5DYWxsYmFjaz4gQ2FsbGJhY2s7DQorcHVibGljOg0KKyAgVUludDY0IE9mZnNldDsNCisgDQorICBNWV9VTktOT1dOX0lNUDEoSUNvbXByZXNzUHJvZ3Jlc3NJbmZvKQ0KKyAgU1RETUVUSE9EKFNldFJhdGlvSW5mbykoY29uc3QgVUludDY0ICppblNpemUsIGNvbnN0IFVJbnQ2NCAqb3V0U2l6ZSk7DQorICB2b2lkIEluaXQoSUFyY2hpdmVPcGVuQ2FsbGJhY2sgKmNhbGxiYWNrKSB7IENhbGxiYWNrID0gY2FsbGJhY2s7IH0NCit9Ow0KKw0KK1NURE1FVEhPRElNUCBDQ29tcHJlc3NQcm9ncmVzc0luZm9JbXA6OlNldFJhdGlvSW5mbyhjb25zdCBVSW50NjQgKmluU2l6ZSwgY29uc3QgVUludDY0ICogLyogb3V0U2l6ZSAqLykNCit7DQorICBpZiAoQ2FsbGJhY2spDQorICB7DQorICAgIFVJbnQ2NCBmaWxlcyA9IDA7DQorICAgIFVJbnQ2NCB2YWx1ZSA9IE9mZnNldCArICppblNpemU7DQorICAgIHJldHVybiBDYWxsYmFjay0+U2V0Q29tcGxldGVkKCZmaWxlcywgJnZhbHVlKTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkV4dHJhY3QoY29uc3QgVUludDMyICppbmRpY2VzLCBVSW50MzIgbnVtSXRlbXMsDQorICAgIEludDMyIHRlc3RNb2RlLCBJQXJjaGl2ZUV4dHJhY3RDYWxsYmFjayAqZXh0cmFjdENhbGxiYWNrKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIGlmIChudW1JdGVtcyA9PSAwKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIGlmIChudW1JdGVtcyAhPSAoVUludDMyKShJbnQzMiktMSAmJiAobnVtSXRlbXMgIT0gMSB8fCBpbmRpY2VzWzBdICE9IDApKQ0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKw0KKyAgaWYgKF9wYWNrU2l6ZV9EZWZpbmVkKQ0KKyAgICBleHRyYWN0Q2FsbGJhY2stPlNldFRvdGFsKF9wYWNrU2l6ZSk7DQorICAgIA0KKyAgDQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IHJlYWxPdXRTdHJlYW07DQorICBJbnQzMiBhc2tNb2RlID0gdGVzdE1vZGUgPw0KKyAgICAgIE5FeHRyYWN0OjpOQXNrTW9kZTo6a1Rlc3QgOg0KKyAgICAgIE5FeHRyYWN0OjpOQXNrTW9kZTo6a0V4dHJhY3Q7DQorICBSSU5PSyhleHRyYWN0Q2FsbGJhY2stPkdldFN0cmVhbSgwLCAmcmVhbE91dFN0cmVhbSwgYXNrTW9kZSkpOw0KKyAgaWYgKCF0ZXN0TW9kZSAmJiAhcmVhbE91dFN0cmVhbSkNCisgICAgcmV0dXJuIFNfT0s7DQorICANCisgIGV4dHJhY3RDYWxsYmFjay0+UHJlcGFyZU9wZXJhdGlvbihhc2tNb2RlKTsNCisNCisgIENEdW1teU91dFN0cmVhbSAqb3V0U3RyZWFtU3BlYyA9IG5ldyBDRHVtbXlPdXRTdHJlYW07DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IG91dFN0cmVhbShvdXRTdHJlYW1TcGVjKTsNCisgIG91dFN0cmVhbVNwZWMtPlNldFN0cmVhbShyZWFsT3V0U3RyZWFtKTsNCisgIG91dFN0cmVhbVNwZWMtPkluaXQoKTsNCisgIHJlYWxPdXRTdHJlYW0uUmVsZWFzZSgpOw0KKw0KKyAgQ0xvY2FsUHJvZ3Jlc3MgKmxwcyA9IG5ldyBDTG9jYWxQcm9ncmVzczsNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NQcm9ncmVzc0luZm8+IHByb2dyZXNzID0gbHBzOw0KKyAgbHBzLT5Jbml0KGV4dHJhY3RDYWxsYmFjaywgdHJ1ZSk7DQorDQorICBpZiAoX25lZWRTZWVrVG9TdGFydCkNCisgIHsNCisgICAgaWYgKCFfc3RyZWFtKQ0KKyAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgIFJJTk9LKF9zdHJlYW0tPlNlZWsoMCwgU1RSRUFNX1NFRUtfU0VULCBOVUxMKSk7DQorICB9DQorICBlbHNlDQorICAgIF9uZWVkU2Vla1RvU3RhcnQgPSB0cnVlOw0KKw0KKyAgQ0RlY29kZXIgZGVjb2RlcjsNCisgIEhSRVNVTFQgcmVzdWx0ID0gZGVjb2Rlci5DcmVhdGUoDQorICAgICAgRVhURVJOQUxfQ09ERUNTX1ZBUlMNCisgICAgICBfbHptYTg2LCBfc2VxU3RyZWFtKTsNCisgIFJJTk9LKHJlc3VsdCk7DQorIA0KKyAgYm9vbCBmaXJzdEl0ZW0gPSB0cnVlOw0KKw0KKyAgVUludDY0IHBhY2tTaXplID0gMDsNCisgIFVJbnQ2NCB1bnBhY2tTaXplID0gMDsNCisgIFVJbnQ2NCBudW1TdHJlYW1zID0gMDsNCisNCisgIGJvb2wgZGF0YUFmdGVyRW5kID0gZmFsc2U7DQorICANCisgIGZvciAoOzspDQorICB7DQorICAgIGxwcy0+SW5TaXplID0gcGFja1NpemU7DQorICAgIGxwcy0+T3V0U2l6ZSA9IHVucGFja1NpemU7DQorICAgIFJJTk9LKGxwcy0+U2V0Q3VyKCkpOw0KKw0KKyAgICBjb25zdCBVSW50MzIga0J1ZlNpemUgPSAxICsgNSArIDg7DQorICAgIEJ5dGUgYnVmW2tCdWZTaXplXTsNCisgICAgY29uc3QgVUludDMyIGhlYWRlclNpemUgPSBHZXRIZWFkZXJTaXplKCk7DQorICAgIFVJbnQzMiBwcm9jZXNzZWQ7DQorICAgIFJJTk9LKGRlY29kZXIuUmVhZElucHV0KGJ1ZiwgaGVhZGVyU2l6ZSwgJnByb2Nlc3NlZCkpOw0KKyAgICBpZiAocHJvY2Vzc2VkICE9IGhlYWRlclNpemUpDQorICAgIHsNCisgICAgICBpZiAocHJvY2Vzc2VkICE9IDApDQorICAgICAgICBkYXRhQWZ0ZXJFbmQgPSB0cnVlOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICANCisgICAgQ0hlYWRlciBzdDsNCisgICAgaWYgKCFzdC5QYXJzZShidWYsIF9sem1hODYpKQ0KKyAgICB7DQorICAgICAgZGF0YUFmdGVyRW5kID0gdHJ1ZTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBudW1TdHJlYW1zKys7DQorICAgIGZpcnN0SXRlbSA9IGZhbHNlOw0KKw0KKyAgICByZXN1bHQgPSBkZWNvZGVyLkNvZGUoc3QsIG91dFN0cmVhbSwgcHJvZ3Jlc3MpOw0KKw0KKyAgICBwYWNrU2l6ZSA9IGRlY29kZXIuR2V0SW5wdXRQcm9jZXNzZWRTaXplKCk7DQorICAgIHVucGFja1NpemUgPSBvdXRTdHJlYW1TcGVjLT5HZXRTaXplKCk7DQorICAgIA0KKyAgICBpZiAocmVzdWx0ID09IEVfTk9USU1QTCkNCisgICAgew0KKyAgICAgIF91bnN1cHBvcnRlZCA9IHRydWU7DQorICAgICAgcmVzdWx0ID0gU19GQUxTRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAocmVzdWx0ID09IFNfRkFMU0UpDQorICAgICAgYnJlYWs7DQorICAgIFJJTk9LKHJlc3VsdCk7DQorICB9DQorDQorICBpZiAoZmlyc3RJdGVtKQ0KKyAgew0KKyAgICBfaXNBcmMgPSBmYWxzZTsNCisgICAgcmVzdWx0ID0gU19GQUxTRTsNCisgIH0NCisgIGVsc2UgaWYgKHJlc3VsdCA9PSBTX09LIHx8IHJlc3VsdCA9PSBTX0ZBTFNFKQ0KKyAgew0KKyAgICBpZiAoZGF0YUFmdGVyRW5kKQ0KKyAgICAgIF9kYXRhQWZ0ZXJFbmQgPSB0cnVlOw0KKyAgICBlbHNlIGlmIChkZWNvZGVyLl9sem1hRGVjb2RlclNwZWMtPk5lZWRNb3JlSW5wdXQpDQorICAgICAgX25lZWRNb3JlSW5wdXQgPSB0cnVlOw0KKw0KKyAgICBfcGFja1NpemUgPSBwYWNrU2l6ZTsNCisgICAgX3VucGFja1NpemUgPSB1bnBhY2tTaXplOw0KKyAgICBfbnVtU3RyZWFtcyA9IG51bVN0cmVhbXM7DQorICANCisgICAgX3BhY2tTaXplX0RlZmluZWQgPSB0cnVlOw0KKyAgICBfdW5wYWNrU2l6ZV9EZWZpbmVkID0gdHJ1ZTsNCisgICAgX251bVN0cmVhbXNfRGVmaW5lZCA9IHRydWU7DQorICB9DQorICANCisgIEludDMyIG9wUmVzdWx0ID0gTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtPSzsNCisNCisgIGlmICghX2lzQXJjKQ0KKyAgICBvcFJlc3VsdCA9IE5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprSXNOb3RBcmM7DQorICBlbHNlIGlmIChfbmVlZE1vcmVJbnB1dCkNCisgICAgb3BSZXN1bHQgPSBORXh0cmFjdDo6Tk9wZXJhdGlvblJlc3VsdDo6a1VuZXhwZWN0ZWRFbmQ7DQorICBlbHNlIGlmIChfdW5zdXBwb3J0ZWQpDQorICAgIG9wUmVzdWx0ID0gTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtVbnN1cHBvcnRlZE1ldGhvZDsNCisgIGVsc2UgaWYgKF9kYXRhQWZ0ZXJFbmQpDQorICAgIG9wUmVzdWx0ID0gTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtEYXRhQWZ0ZXJFbmQ7DQorICBlbHNlIGlmIChyZXN1bHQgPT0gU19GQUxTRSkNCisgICAgb3BSZXN1bHQgPSBORXh0cmFjdDo6Tk9wZXJhdGlvblJlc3VsdDo6a0RhdGFFcnJvcjsNCisgIGVsc2UgaWYgKHJlc3VsdCA9PSBTX09LKQ0KKyAgICBvcFJlc3VsdCA9IE5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprT0s7DQorICBlbHNlDQorICAgIHJldHVybiByZXN1bHQ7DQorDQorICBvdXRTdHJlYW0uUmVsZWFzZSgpOw0KKyAgcmV0dXJuIGV4dHJhY3RDYWxsYmFjay0+U2V0T3BlcmF0aW9uUmVzdWx0KG9wUmVzdWx0KTsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KK0lNUExfSVNldENvbXByZXNzQ29kZWNzSW5mbw0KKw0KK25hbWVzcGFjZSBOTHptYUFyIHsNCisNCitJTVBfQ3JlYXRlQXJjSW5fMihDSGFuZGxlcihmYWxzZSkpDQorDQorc3RhdGljIENBcmNJbmZvIGdfQXJjSW5mbyA9DQorICB7ICJsem1hIiwgImx6bWEiLCAwLCAweEEsDQorICAwLCB7IDAgfSwNCisgIC8vIDIsIHsgMHg1RCwgMHgwMCB9LA0KKyAgMCwNCisgIE5BcmNJbmZvRmxhZ3M6OmtTdGFydE9wZW4gfA0KKyAgTkFyY0luZm9GbGFnczo6a0tlZXBOYW1lLA0KKyAgQ3JlYXRlQXJjLCBOVUxMLA0KKyAgSXNBcmNfTHptYSB9Ow0KKw0KK1JFR0lTVEVSX0FSQyhMem1hKQ0KKw0KK30NCisNCituYW1lc3BhY2UgTkx6bWE4NkFyIHsNCisNCitJTVBfQ3JlYXRlQXJjSW5fMihDSGFuZGxlcih0cnVlKSkNCisNCitzdGF0aWMgQ0FyY0luZm8gZ19BcmNJbmZvID0NCisgIHsgImx6bWE4NiIsICJsem1hODYiLCAwLCAweEIsDQorICAwLCB7IDAgfSwNCisgIDAsDQorICBOQXJjSW5mb0ZsYWdzOjprS2VlcE5hbWUsDQorICBDcmVhdGVBcmMsIE5VTEwsDQorICBJc0FyY19Mem1hODYgfTsNCisNCitSRUdJU1RFUl9BUkMoTHptYTg2KQ0KKw0KK30NCisNCit9fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9TcGxpdEhhbmRsZXIuY3BwIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL1NwbGl0SGFuZGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4MjlmMwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9TcGxpdEhhbmRsZXIuY3BwCkBAIC0wLDAgKzEsMzY5IEBACisvLyBTcGxpdEhhbmRsZXIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vQ29tVHJ5LmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeVN0cmluZy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9XaW5kb3dzL1Byb3BWYXJpYW50LmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9Qcm9ncmVzc1V0aWxzLmgiDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9SZWdpc3RlckFyYy5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21wcmVzcy9Db3B5Q29kZXIuaCINCisNCisjaW5jbHVkZSAiQ29tbW9uL011bHRpU3RyZWFtLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KKw0KK25hbWVzcGFjZSBOQXJjaGl2ZSB7DQorbmFtZXNwYWNlIE5TcGxpdCB7DQorDQorc3RhdGljIGNvbnN0IEJ5dGUga1Byb3BzW10gPQ0KK3sNCisgIGtwaWRQYXRoLA0KKyAga3BpZFNpemUNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBCeXRlIGtBcmNQcm9wc1tdID0NCit7DQorICBrcGlkTnVtVm9sdW1lcywNCisgIGtwaWRUb3RhbFBoeVNpemUNCit9Ow0KKw0KK2NsYXNzIENIYW5kbGVyOg0KKyAgcHVibGljIElJbkFyY2hpdmUsDQorICBwdWJsaWMgSUluQXJjaGl2ZUdldFN0cmVhbSwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KKyAgQ09iamVjdFZlY3RvcjxDTXlDb21QdHI8SUluU3RyZWFtPiA+IF9zdHJlYW1zOw0KKyAgQ1JlY29yZFZlY3RvcjxVSW50NjQ+IF9zaXplczsNCisgIFVTdHJpbmcgX3N1Yk5hbWU7DQorICBVSW50NjQgX3RvdGFsU2l6ZTsNCisNCisgIEhSRVNVTFQgT3BlbjIoSUluU3RyZWFtICpzdHJlYW0sIElBcmNoaXZlT3BlbkNhbGxiYWNrICpjYWxsYmFjayk7DQorcHVibGljOg0KKyAgTVlfVU5LTk9XTl9JTVAyKElJbkFyY2hpdmUsIElJbkFyY2hpdmVHZXRTdHJlYW0pDQorICBJTlRFUkZBQ0VfSUluQXJjaGl2ZSg7KQ0KKyAgU1RETUVUSE9EKEdldFN0cmVhbSkoVUludDMyIGluZGV4LCBJU2VxdWVudGlhbEluU3RyZWFtICoqc3RyZWFtKTsNCit9Ow0KKw0KK0lNUF9JSW5BcmNoaXZlX1Byb3BzDQorSU1QX0lJbkFyY2hpdmVfQXJjUHJvcHMNCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkdldEFyY2hpdmVQcm9wZXJ0eShQUk9QSUQgcHJvcElELCBQUk9QVkFSSUFOVCAqdmFsdWUpDQorew0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBzd2l0Y2ggKHByb3BJRCkNCisgIHsNCisgICAgY2FzZSBrcGlkTWFpblN1YmZpbGU6IHByb3AgPSAoVUludDMyKTA7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRQaHlTaXplOiBpZiAoIV9zaXplcy5Jc0VtcHR5KCkpIHByb3AgPSBfc2l6ZXNbMF07IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRUb3RhbFBoeVNpemU6IHByb3AgPSBfdG90YWxTaXplOyBicmVhazsNCisgICAgY2FzZSBrcGlkTnVtVm9sdW1lczogcHJvcCA9IChVSW50MzIpX3N0cmVhbXMuU2l6ZSgpOyBicmVhazsNCisgIH0NCisgIHByb3AuRGV0YWNoKHZhbHVlKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitzdHJ1Y3QgQ1NlcU5hbWUNCit7DQorICBVU3RyaW5nIF91bmNoYW5nZWRQYXJ0Ow0KKyAgVVN0cmluZyBfY2hhbmdlZFBhcnQ7DQorICBib29sIF9zcGxpdFN0eWxlOw0KKyAgDQorICBVU3RyaW5nIEdldE5leHROYW1lKCkNCisgIHsNCisgICAgVVN0cmluZyBuZXdOYW1lOw0KKyAgICBpZiAoX3NwbGl0U3R5bGUpDQorICAgIHsNCisgICAgICBpbnQgaTsNCisgICAgICBpbnQgbnVtTGV0dGVycyA9IF9jaGFuZ2VkUGFydC5MZW4oKTsNCisgICAgICBmb3IgKGkgPSBudW1MZXR0ZXJzIC0gMTsgaSA+PSAwOyBpLS0pDQorICAgICAgew0KKyAgICAgICAgd2NoYXJfdCBjID0gX2NoYW5nZWRQYXJ0W2ldOw0KKyAgICAgICAgaWYgKGMgPT0gJ3onKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBuZXdOYW1lLkluc2VydEF0RnJvbnQoJ2EnKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIGlmIChjID09ICdaJykNCisgICAgICAgIHsNCisgICAgICAgICAgbmV3TmFtZS5JbnNlcnRBdEZyb250KCdBJyk7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYysrOw0KKyAgICAgICAgaWYgKChjID09ICd6JyB8fCBjID09ICdaJykgJiYgaSA9PSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBfdW5jaGFuZ2VkUGFydCArPSBjOw0KKyAgICAgICAgICB3Y2hhcl90IG5ld0NoYXIgPSAoYyA9PSAneicpID8gTCdhJyA6IEwnQSc7DQorICAgICAgICAgIG5ld05hbWUuRW1wdHkoKTsNCisgICAgICAgICAgbnVtTGV0dGVycysrOw0KKyAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IG51bUxldHRlcnM7IGsrKykNCisgICAgICAgICAgICBuZXdOYW1lICs9IG5ld0NoYXI7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbmV3TmFtZS5JbnNlcnRBdEZyb250KGMpOw0KKyAgICAgICAgaS0tOw0KKyAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKQ0KKyAgICAgICAgICBuZXdOYW1lLkluc2VydEF0RnJvbnQoX2NoYW5nZWRQYXJ0W2ldKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBpbnQgaTsNCisgICAgICBpbnQgbnVtTGV0dGVycyA9IF9jaGFuZ2VkUGFydC5MZW4oKTsNCisgICAgICBmb3IgKGkgPSBudW1MZXR0ZXJzIC0gMTsgaSA+PSAwOyBpLS0pDQorICAgICAgew0KKyAgICAgICAgd2NoYXJfdCBjID0gX2NoYW5nZWRQYXJ0W2ldOw0KKyAgICAgICAgaWYgKGMgPT0gJzknKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBuZXdOYW1lLkluc2VydEF0RnJvbnQoJzAnKTsNCisgICAgICAgICAgaWYgKGkgPT0gMCkNCisgICAgICAgICAgICBuZXdOYW1lLkluc2VydEF0RnJvbnQoJzEnKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBjKys7DQorICAgICAgICBuZXdOYW1lLkluc2VydEF0RnJvbnQoYyk7DQorICAgICAgICBpLS07DQorICAgICAgICBmb3IgKDsgaSA+PSAwOyBpLS0pDQorICAgICAgICAgIG5ld05hbWUuSW5zZXJ0QXRGcm9udChfY2hhbmdlZFBhcnRbaV0pOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIF9jaGFuZ2VkUGFydCA9IG5ld05hbWU7DQorICAgIHJldHVybiBfdW5jaGFuZ2VkUGFydCArIF9jaGFuZ2VkUGFydDsNCisgIH0NCit9Ow0KKw0KK0hSRVNVTFQgQ0hhbmRsZXI6Ok9wZW4yKElJblN0cmVhbSAqc3RyZWFtLCBJQXJjaGl2ZU9wZW5DYWxsYmFjayAqY2FsbGJhY2spDQorew0KKyAgQ2xvc2UoKTsNCisgIGlmICghY2FsbGJhY2spDQorICAgIHJldHVybiBTX0ZBTFNFOw0KKw0KKyAgQ015Q29tUHRyPElBcmNoaXZlT3BlblZvbHVtZUNhbGxiYWNrPiB2b2x1bWVDYWxsYmFjazsNCisgIGNhbGxiYWNrLT5RdWVyeUludGVyZmFjZShJSURfSUFyY2hpdmVPcGVuVm9sdW1lQ2FsbGJhY2ssICh2b2lkICoqKSZ2b2x1bWVDYWxsYmFjayk7DQorICBpZiAoIXZvbHVtZUNhbGxiYWNrKQ0KKyAgICByZXR1cm4gU19GQUxTRTsNCisgIA0KKyAgVVN0cmluZyBuYW1lOw0KKyAgew0KKyAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgUklOT0sodm9sdW1lQ2FsbGJhY2stPkdldFByb3BlcnR5KGtwaWROYW1lLCAmcHJvcCkpOw0KKyAgICBpZiAocHJvcC52dCAhPSBWVF9CU1RSKQ0KKyAgICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgICBuYW1lID0gcHJvcC5ic3RyVmFsOw0KKyAgfQ0KKyAgDQorICBpbnQgZG90UG9zID0gbmFtZS5SZXZlcnNlRmluZCgnLicpOw0KKyAgY29uc3QgVVN0cmluZyBwcmVmaXggPSBuYW1lLkxlZnQoZG90UG9zICsgMSk7DQorICBjb25zdCBVU3RyaW5nIGV4dCA9IG5hbWUuUHRyKGRvdFBvcyArIDEpOw0KKyAgVVN0cmluZyBleHQyID0gZXh0Ow0KKyAgZXh0Mi5NYWtlTG93ZXJfQXNjaWkoKTsNCisgIA0KKyAgQ1NlcU5hbWUgc2VxTmFtZTsNCisgIA0KKyAgdW5zaWduZWQgbnVtTGV0dGVycyA9IDI7DQorICBib29sIHNwbGl0U3R5bGUgPSBmYWxzZTsNCisgIA0KKyAgaWYgKGV4dDIuTGVuKCkgPj0gMiAmJiBTdHJpbmdzQXJlRXF1YWxfQXNjaWkoZXh0Mi5SaWdodFB0cigyKSwgImFhIikpDQorICB7DQorICAgIHNwbGl0U3R5bGUgPSB0cnVlOw0KKyAgICB3aGlsZSAobnVtTGV0dGVycyA8IGV4dDIuTGVuKCkpDQorICAgIHsNCisgICAgICBpZiAoZXh0MltleHQyLkxlbigpIC0gbnVtTGV0dGVycyAtIDFdICE9ICdhJykNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIG51bUxldHRlcnMrKzsNCisgICAgfQ0KKyAgfQ0KKyAgZWxzZSBpZiAoZXh0LkxlbigpID49IDIgJiYgU3RyaW5nc0FyZUVxdWFsX0FzY2lpKGV4dDIuUmlnaHRQdHIoMiksICIwMSIpKQ0KKyAgew0KKyAgICB3aGlsZSAobnVtTGV0dGVycyA8IGV4dDIuTGVuKCkpDQorICAgIHsNCisgICAgICBpZiAoZXh0MltleHQyLkxlbigpIC0gbnVtTGV0dGVycyAtIDFdICE9ICcwJykNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIG51bUxldHRlcnMrKzsNCisgICAgfQ0KKyAgICBpZiAobnVtTGV0dGVycyAhPSBleHQuTGVuKCkpDQorICAgICAgcmV0dXJuIFNfRkFMU0U7DQorICB9DQorICBlbHNlDQorICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgDQorICBzZXFOYW1lLl91bmNoYW5nZWRQYXJ0ID0gcHJlZml4ICsgZXh0LkxlZnQoZXh0Mi5MZW4oKSAtIG51bUxldHRlcnMpOw0KKyAgc2VxTmFtZS5fY2hhbmdlZFBhcnQgPSBleHQuUmlnaHRQdHIobnVtTGV0dGVycyk7DQorICBzZXFOYW1lLl9zcGxpdFN0eWxlID0gc3BsaXRTdHlsZTsNCisgIA0KKyAgaWYgKHByZWZpeC5MZW4oKSA8IDEpDQorICAgIF9zdWJOYW1lID0gTCJmaWxlIjsNCisgIGVsc2UNCisgICAgX3N1Yk5hbWUuU2V0RnJvbShwcmVmaXgsIHByZWZpeC5MZW4oKSAtIDEpOw0KKyAgDQorICBVSW50NjQgc2l6ZTsNCisgIHsNCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgIFJJTk9LKHZvbHVtZUNhbGxiYWNrLT5HZXRQcm9wZXJ0eShrcGlkU2l6ZSwgJnByb3ApKTsNCisgICAgaWYgKHByb3AudnQgIT0gVlRfVUk4KQ0KKyAgICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICAgIHNpemUgPSBwcm9wLnVoVmFsLlF1YWRQYXJ0Ow0KKyAgfQ0KKyAgDQorICBfdG90YWxTaXplICs9IHNpemU7DQorICBfc2l6ZXMuQWRkKHNpemUpOw0KKyAgX3N0cmVhbXMuQWRkKHN0cmVhbSk7DQorICANCisgIHsNCisgICAgVUludDY0IG51bUZpbGVzID0gX3N0cmVhbXMuU2l6ZSgpOw0KKyAgICBSSU5PSyhjYWxsYmFjay0+U2V0Q29tcGxldGVkKCZudW1GaWxlcywgTlVMTCkpOw0KKyAgfQ0KKyAgDQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBjb25zdCBVU3RyaW5nIGZ1bGxOYW1lID0gc2VxTmFtZS5HZXROZXh0TmFtZSgpOw0KKyAgICBDTXlDb21QdHI8SUluU3RyZWFtPiBuZXh0U3RyZWFtOw0KKyAgICBIUkVTVUxUIHJlc3VsdCA9IHZvbHVtZUNhbGxiYWNrLT5HZXRTdHJlYW0oZnVsbE5hbWUsICZuZXh0U3RyZWFtKTsNCisgICAgaWYgKHJlc3VsdCA9PSBTX0ZBTFNFKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBpZiAocmVzdWx0ICE9IFNfT0spDQorICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgaWYgKCFzdHJlYW0pDQorICAgICAgYnJlYWs7DQorICAgIHsNCisgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgICBSSU5PSyh2b2x1bWVDYWxsYmFjay0+R2V0UHJvcGVydHkoa3BpZFNpemUsICZwcm9wKSk7DQorICAgICAgaWYgKHByb3AudnQgIT0gVlRfVUk4KQ0KKyAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgICBzaXplID0gcHJvcC51aFZhbC5RdWFkUGFydDsNCisgICAgfQ0KKyAgICBfdG90YWxTaXplICs9IHNpemU7DQorICAgIF9zaXplcy5BZGQoc2l6ZSk7DQorICAgIF9zdHJlYW1zLkFkZChuZXh0U3RyZWFtKTsNCisgICAgew0KKyAgICAgIFVJbnQ2NCBudW1GaWxlcyA9IF9zdHJlYW1zLlNpemUoKTsNCisgICAgICBSSU5PSyhjYWxsYmFjay0+U2V0Q29tcGxldGVkKCZudW1GaWxlcywgTlVMTCkpOw0KKyAgICB9DQorICB9DQorDQorICBpZiAoX3N0cmVhbXMuU2l6ZSgpID09IDEpDQorICB7DQorICAgIGlmIChzcGxpdFN0eWxlKQ0KKyAgICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6T3BlbihJSW5TdHJlYW0gKnN0cmVhbSwgY29uc3QgVUludDY0ICosIElBcmNoaXZlT3BlbkNhbGxiYWNrICpjYWxsYmFjaykNCit7DQorICBDT01fVFJZX0JFR0lODQorICBIUkVTVUxUIHJlcyA9IE9wZW4yKHN0cmVhbSwgY2FsbGJhY2spOw0KKyAgaWYgKHJlcyAhPSBTX09LKQ0KKyAgICBDbG9zZSgpOw0KKyAgcmV0dXJuIHJlczsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6Q2xvc2UoKQ0KK3sNCisgIF90b3RhbFNpemUgPSAwOw0KKyAgX3N1Yk5hbWUuRW1wdHkoKTsNCisgIF9zdHJlYW1zLkNsZWFyKCk7DQorICBfc2l6ZXMuQ2xlYXIoKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkdldE51bWJlck9mSXRlbXMoVUludDMyICpudW1JdGVtcykNCit7DQorICAqbnVtSXRlbXMgPSBfc3RyZWFtcy5Jc0VtcHR5KCkgPyAwIDogMTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkdldFByb3BlcnR5KFVJbnQzMiAvKiBpbmRleCAqLywgUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKQ0KK3sNCisgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgc3dpdGNoIChwcm9wSUQpDQorICB7DQorICAgIGNhc2Uga3BpZFBhdGg6IHByb3AgPSBfc3ViTmFtZTsgYnJlYWs7DQorICAgIGNhc2Uga3BpZFNpemU6DQorICAgIGNhc2Uga3BpZFBhY2tTaXplOg0KKyAgICAgIHByb3AgPSBfdG90YWxTaXplOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcHJvcC5EZXRhY2godmFsdWUpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6RXh0cmFjdChjb25zdCBVSW50MzIgKmluZGljZXMsIFVJbnQzMiBudW1JdGVtcywNCisgICAgSW50MzIgdGVzdE1vZGUsIElBcmNoaXZlRXh0cmFjdENhbGxiYWNrICpleHRyYWN0Q2FsbGJhY2spDQorew0KKyAgQ09NX1RSWV9CRUdJTg0KKyAgaWYgKG51bUl0ZW1zID09IDApDQorICAgIHJldHVybiBTX09LOw0KKyAgaWYgKG51bUl0ZW1zICE9IChVSW50MzIpKEludDMyKS0xICYmIChudW1JdGVtcyAhPSAxIHx8IGluZGljZXNbMF0gIT0gMCkpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorDQorICBVSW50NjQgY3VycmVudFRvdGFsU2l6ZSA9IDA7DQorICBSSU5PSyhleHRyYWN0Q2FsbGJhY2stPlNldFRvdGFsKF90b3RhbFNpemUpKTsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gb3V0U3RyZWFtOw0KKyAgSW50MzIgYXNrTW9kZSA9IHRlc3RNb2RlID8NCisgICAgICBORXh0cmFjdDo6TkFza01vZGU6OmtUZXN0IDoNCisgICAgICBORXh0cmFjdDo6TkFza01vZGU6OmtFeHRyYWN0Ow0KKyAgUklOT0soZXh0cmFjdENhbGxiYWNrLT5HZXRTdHJlYW0oMCwgJm91dFN0cmVhbSwgYXNrTW9kZSkpOw0KKyAgaWYgKCF0ZXN0TW9kZSAmJiAhb3V0U3RyZWFtKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIFJJTk9LKGV4dHJhY3RDYWxsYmFjay0+UHJlcGFyZU9wZXJhdGlvbihhc2tNb2RlKSk7DQorICANCisgIE5Db21wcmVzczo6Q0NvcHlDb2RlciAqY29weUNvZGVyU3BlYyA9IG5ldyBOQ29tcHJlc3M6OkNDb3B5Q29kZXI7DQorICBDTXlDb21QdHI8SUNvbXByZXNzQ29kZXI+IGNvcHlDb2RlciA9IGNvcHlDb2RlclNwZWM7DQorDQorICBDTG9jYWxQcm9ncmVzcyAqbHBzID0gbmV3IENMb2NhbFByb2dyZXNzOw0KKyAgQ015Q29tUHRyPElDb21wcmVzc1Byb2dyZXNzSW5mbz4gcHJvZ3Jlc3MgPSBscHM7DQorICBscHMtPkluaXQoZXh0cmFjdENhbGxiYWNrLCBmYWxzZSk7DQorDQorICBGT1JfVkVDVE9SIChpLCBfc3RyZWFtcykNCisgIHsNCisgICAgbHBzLT5JblNpemUgPSBscHMtPk91dFNpemUgPSBjdXJyZW50VG90YWxTaXplOw0KKyAgICBSSU5PSyhscHMtPlNldEN1cigpKTsNCisgICAgSUluU3RyZWFtICppblN0cmVhbSA9IF9zdHJlYW1zW2ldOw0KKyAgICBSSU5PSyhpblN0cmVhbS0+U2VlaygwLCBTVFJFQU1fU0VFS19TRVQsIE5VTEwpKTsNCisgICAgUklOT0soY29weUNvZGVyLT5Db2RlKGluU3RyZWFtLCBvdXRTdHJlYW0sIE5VTEwsIE5VTEwsIHByb2dyZXNzKSk7DQorICAgIGN1cnJlbnRUb3RhbFNpemUgKz0gY29weUNvZGVyU3BlYy0+VG90YWxTaXplOw0KKyAgfQ0KKyAgb3V0U3RyZWFtLlJlbGVhc2UoKTsNCisgIHJldHVybiBleHRyYWN0Q2FsbGJhY2stPlNldE9wZXJhdGlvblJlc3VsdChORXh0cmFjdDo6Tk9wZXJhdGlvblJlc3VsdDo6a09LKTsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0U3RyZWFtKFVJbnQzMiBpbmRleCwgSVNlcXVlbnRpYWxJblN0cmVhbSAqKnN0cmVhbSkNCit7DQorICBDT01fVFJZX0JFR0lODQorICBpZiAoaW5kZXggIT0gMCkNCisgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICpzdHJlYW0gPSAwOw0KKyAgQ011bHRpU3RyZWFtICpzdHJlYW1TcGVjID0gbmV3IENNdWx0aVN0cmVhbTsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbEluU3RyZWFtPiBzdHJlYW1UZW1wID0gc3RyZWFtU3BlYzsNCisgIEZPUl9WRUNUT1IgKGksIF9zdHJlYW1zKQ0KKyAgew0KKyAgICBDTXVsdGlTdHJlYW06OkNTdWJTdHJlYW1JbmZvIHN1YlN0cmVhbUluZm87DQorICAgIHN1YlN0cmVhbUluZm8uU3RyZWFtID0gX3N0cmVhbXNbaV07DQorICAgIHN1YlN0cmVhbUluZm8uU2l6ZSA9IF9zaXplc1tpXTsNCisgICAgc3RyZWFtU3BlYy0+U3RyZWFtcy5BZGQoc3ViU3RyZWFtSW5mbyk7DQorICB9DQorICBzdHJlYW1TcGVjLT5Jbml0KCk7DQorICAqc3RyZWFtID0gc3RyZWFtVGVtcC5EZXRhY2goKTsNCisgIHJldHVybiBTX09LOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorSU1QX0NyZWF0ZUFyY0luDQorDQorc3RhdGljIENBcmNJbmZvIGdfQXJjSW5mbyA9DQorICB7ICJTcGxpdCIsICIwMDEiLCAwLCAweEVBLA0KKyAgMCwgeyAwIH0sDQorICAwLA0KKyAgMCwNCisgIENyZWF0ZUFyYyB9Ow0KKw0KK1JFR0lTVEVSX0FSQyhTcGxpdCkNCisNCit9fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9TdGRBZnguaCBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9TdGRBZnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmEwODhmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL1N0ZEFmeC5oCkBAIC0wLDAgKzEsOCBAQAorLy8gU3RkQWZ4LmgNCisNCisjaWZuZGVmIF9fU1REQUZYX0gNCisjZGVmaW5lIF9fU1REQUZYX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0NvbW1vbi5oIg0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9YekhhbmRsZXIuY3BwIGIvbHptYS9DUFAvN3ppcC9BcmNoaXZlL1h6SGFuZGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc4N2MxNgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQXJjaGl2ZS9YekhhbmRsZXIuY3BwCkBAIC0wLDAgKzEsOTkxIEBACisvLyBYekhhbmRsZXIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0FsbG9jLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0MvWHpDcmM2NC5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL1h6RW5jLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9Db21UcnkuaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0RlZnMuaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0ludFRvU3RyaW5nLmgiDQorDQorI2luY2x1ZGUgIi4uL0lDb2Rlci5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vQ1dyYXBwZXJzLmgiDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9Qcm9ncmVzc1V0aWxzLmgiDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9SZWdpc3RlckFyYy5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vU3RyZWFtVXRpbHMuaCINCisNCisjaW5jbHVkZSAiLi4vQ29tcHJlc3MvQ29weUNvZGVyLmgiDQorDQorI2luY2x1ZGUgIklBcmNoaXZlLmgiDQorDQorI2luY2x1ZGUgIkNvbW1vbi9IYW5kbGVyT3V0LmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KKw0KK25hbWVzcGFjZSBOQ29tcHJlc3Mgew0KK25hbWVzcGFjZSBOTHptYTIgew0KKw0KK0hSRVNVTFQgU2V0THptYTJQcm9wKFBST1BJRCBwcm9wSUQsIGNvbnN0IFBST1BWQVJJQU5UICZwcm9wLCBDTHptYTJFbmNQcm9wcyAmbHptYTJQcm9wcyk7DQorDQorfX0NCisNCitzdGF0aWMgdm9pZCAqU3pBbGxvYyh2b2lkICosIHNpemVfdCBzaXplKSB7IHJldHVybiBNeUFsbG9jKHNpemUpOyB9DQorc3RhdGljIHZvaWQgU3pGcmVlKHZvaWQgKiwgdm9pZCAqYWRkcmVzcykgeyBNeUZyZWUoYWRkcmVzcyk7IH0NCitzdGF0aWMgSVN6QWxsb2MgZ19BbGxvYyA9IHsgU3pBbGxvYywgU3pGcmVlIH07DQorDQorbmFtZXNwYWNlIE5BcmNoaXZlIHsNCituYW1lc3BhY2UgTlh6IHsNCisNCitzdHJ1Y3QgQ0NyYzY0R2VuIHsgQ0NyYzY0R2VuKCkgeyBDcmM2NEdlbmVyYXRlVGFibGUoKTsgfSB9IGdfQ3JjNjRUYWJsZUluaXQ7DQorDQorc3RhdGljIGNvbnN0IHdjaGFyX3QgKmtfTFpNQTJfTmFtZSA9IEwiTFpNQTIiOw0KKw0KK3N0cnVjdCBDU3RhdEluZm8NCit7DQorICBVSW50NjQgSW5TaXplOw0KKyAgVUludDY0IE91dFNpemU7DQorICBVSW50NjQgUGh5U2l6ZTsNCisNCisgIFVJbnQ2NCBOdW1TdHJlYW1zOw0KKyAgVUludDY0IE51bUJsb2NrczsNCisNCisgIGJvb2wgVW5wYWNrU2l6ZV9EZWZpbmVkOw0KKw0KKyAgYm9vbCBOdW1TdHJlYW1zX0RlZmluZWQ7DQorICBib29sIE51bUJsb2Nrc19EZWZpbmVkOw0KKw0KKyAgYm9vbCBJc0FyYzsNCisgIGJvb2wgVW5leHBlY3RlZEVuZDsNCisgIGJvb2wgRGF0YUFmdGVyRW5kOw0KKyAgYm9vbCBVbnN1cHBvcnRlZDsNCisgIGJvb2wgSGVhZGVyc0Vycm9yOw0KKyAgYm9vbCBEYXRhRXJyb3I7DQorICBib29sIENyY0Vycm9yOw0KKw0KKyAgQ1N0YXRJbmZvKCkgeyBDbGVhcigpOyAgIH0NCisNCisgIHZvaWQgQ2xlYXIoKQ0KKyAgew0KKyAgICBJblNpemUgPSAwOw0KKyAgICBPdXRTaXplID0gMDsNCisgICAgUGh5U2l6ZSA9IDA7DQorDQorICAgIE51bVN0cmVhbXMgPSAwOw0KKyAgICBOdW1CbG9ja3MgPSAwOw0KKw0KKyAgICBVbnBhY2tTaXplX0RlZmluZWQgPSBmYWxzZTsNCisgIA0KKyAgICBOdW1TdHJlYW1zX0RlZmluZWQgPSBmYWxzZTsNCisgICAgTnVtQmxvY2tzX0RlZmluZWQgPSBmYWxzZTsNCisgICAgDQorICAgIFVuZXhwZWN0ZWRFbmQgPSBmYWxzZTsNCisgICAgRGF0YUFmdGVyRW5kID0gZmFsc2U7DQorICAgIFVuc3VwcG9ydGVkID0gZmFsc2U7DQorICAgIEhlYWRlcnNFcnJvciA9IGZhbHNlOw0KKyAgICBEYXRhRXJyb3IgPSBmYWxzZTsNCisgICAgQ3JjRXJyb3IgPSBmYWxzZTsNCisgICAgSXNBcmMgPSBmYWxzZTsNCisgIH0NCisNCit9Ow0KKw0KK3N0cnVjdCBJRGVjb2RlU3RhdGU6IHB1YmxpYyBDU3RhdEluZm8NCit7DQorICBTUmVzIERlY29kZVJlczsNCisNCisgIElEZWNvZGVTdGF0ZSgpOiBEZWNvZGVSZXMoU1pfT0spIHt9DQorICB2aXJ0dWFsIEhSRVNVTFQgUHJvZ3Jlc3MoKSA9IDA7DQorDQorICBIUkVTVUxUIERlY29kZShJU2VxdWVudGlhbEluU3RyZWFtICpzZXFJblN0cmVhbSwgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSk7DQorfTsNCisNCitzdHJ1Y3QgQ1ZpcnRQcm9ncmVzc19Ub19Mb2NhbFByb2dyZXNzOiBwdWJsaWMgSURlY29kZVN0YXRlDQorew0KKyAgQ0xvY2FsUHJvZ3Jlc3MgKmxwczsNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NQcm9ncmVzc0luZm8+IHByb2dyZXNzOw0KKw0KKyAgSFJFU1VMVCBQcm9ncmVzcygpOw0KK307DQorDQorSFJFU1VMVCBDVmlydFByb2dyZXNzX1RvX0xvY2FsUHJvZ3Jlc3M6OlByb2dyZXNzKCkNCit7DQorICBscHMtPkluU2l6ZSA9IEluU2l6ZTsNCisgIGxwcy0+T3V0U2l6ZSA9IE91dFNpemU7DQorICByZXR1cm4gbHBzLT5TZXRDdXIoKTsNCit9DQorDQorDQorY2xhc3MgQ0hhbmRsZXI6DQorICBwdWJsaWMgSUluQXJjaGl2ZSwNCisgIHB1YmxpYyBJQXJjaGl2ZU9wZW5TZXEsDQorICAjaWZuZGVmIEVYVFJBQ1RfT05MWQ0KKyAgcHVibGljIElPdXRBcmNoaXZlLA0KKyAgcHVibGljIElTZXRQcm9wZXJ0aWVzLA0KKyAgcHVibGljIENNdWx0aU1ldGhvZFByb3BzLA0KKyAgI2VuZGlmDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIENTdGF0SW5mbyBfc3RhdDsNCisgIA0KKyAgYm9vbCBfaXNBcmM7DQorICBib29sIF9uZWVkU2Vla1RvU3RhcnQ7DQorICBib29sIF9waHlTaXplX0RlZmluZWQ7DQorICANCisgIENNeUNvbVB0cjxJSW5TdHJlYW0+IF9zdHJlYW07DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gX3NlcVN0cmVhbTsNCisNCisgIFVJbnQzMiBfZmlsdGVySWQ7DQorICBBU3RyaW5nIF9tZXRob2RzU3RyaW5nOw0KKw0KKyAgdm9pZCBJbml0KCkNCisgIHsNCisgICAgX2ZpbHRlcklkID0gMDsNCisgICAgQ011bHRpTWV0aG9kUHJvcHM6OkluaXQoKTsNCisgIH0NCisNCisgIEhSRVNVTFQgT3BlbjIoSUluU3RyZWFtICppblN0cmVhbSwgLyogVUludDMyIGZsYWdzLCAqLyBJQXJjaGl2ZU9wZW5DYWxsYmFjayAqY2FsbGJhY2spOw0KKw0KKyAgSFJFU1VMVCBEZWNvZGUyKElTZXF1ZW50aWFsSW5TdHJlYW0gKnNlcUluU3RyZWFtLCBJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtLCBJRGVjb2RlU3RhdGUgJnByb2dyZXNzKQ0KKyAgew0KKyAgICBSSU5PSyhwcm9ncmVzcy5EZWNvZGUoc2VxSW5TdHJlYW0sIG91dFN0cmVhbSkpOw0KKyAgICBfc3RhdCA9IHByb2dyZXNzOw0KKyAgICBfcGh5U2l6ZV9EZWZpbmVkID0gdHJ1ZTsNCisgICAgcmV0dXJuIFNfT0s7DQorICB9DQorDQorcHVibGljOg0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfQkVHSU4yKElJbkFyY2hpdmUpDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShJQXJjaGl2ZU9wZW5TZXEpDQorICAjaWZuZGVmIEVYVFJBQ1RfT05MWQ0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoSU91dEFyY2hpdmUpDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShJU2V0UHJvcGVydGllcykNCisgICNlbmRpZg0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5EDQorICBNWV9BRERSRUZfUkVMRUFTRQ0KKw0KKyAgSU5URVJGQUNFX0lJbkFyY2hpdmUoOykNCisgIFNURE1FVEhPRChPcGVuU2VxKShJU2VxdWVudGlhbEluU3RyZWFtICpzdHJlYW0pOw0KKw0KKyAgI2lmbmRlZiBFWFRSQUNUX09OTFkNCisgIElOVEVSRkFDRV9JT3V0QXJjaGl2ZSg7KQ0KKyAgU1RETUVUSE9EKFNldFByb3BlcnRpZXMpKGNvbnN0IHdjaGFyX3QgKipuYW1lcywgY29uc3QgUFJPUFZBUklBTlQgKnZhbHVlcywgVUludDMyIG51bVByb3BzKTsNCisgICNlbmRpZg0KKw0KKyAgQ0hhbmRsZXIoKTsNCit9Ow0KKw0KK0NIYW5kbGVyOjpDSGFuZGxlcigpDQorew0KKyAgSW5pdCgpOw0KK30NCisNCitzdGF0aWMgY29uc3QgQnl0ZSBrUHJvcHNbXSA9DQorew0KKyAga3BpZFNpemUsDQorICBrcGlkUGFja1NpemUsDQorICBrcGlkTWV0aG9kDQorfTsNCisNCitzdGF0aWMgY29uc3QgQnl0ZSBrQXJjUHJvcHNbXSA9DQorew0KKyAga3BpZE1ldGhvZCwNCisgIGtwaWROdW1TdHJlYW1zLA0KKyAga3BpZE51bUJsb2Nrcw0KK307DQorDQorSU1QX0lJbkFyY2hpdmVfUHJvcHMNCitJTVBfSUluQXJjaGl2ZV9BcmNQcm9wcw0KKw0KK3N0YXRpYyBpbmxpbmUgY2hhciBHZXRIZXgodW5zaWduZWQgdmFsdWUpDQorew0KKyAgcmV0dXJuIChjaGFyKSgodmFsdWUgPCAxMCkgPyAoJzAnICsgdmFsdWUpIDogKCdBJyArICh2YWx1ZSAtIDEwKSkpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgQWRkSGV4VG9TdHJpbmcoQVN0cmluZyAmcywgQnl0ZSB2YWx1ZSkNCit7DQorICBzICs9IEdldEhleCh2YWx1ZSA+PiA0KTsNCisgIHMgKz0gR2V0SGV4KHZhbHVlICYgMHhGKTsNCit9DQorDQorc3RhdGljIHZvaWQgQWRkVUludDMyVG9TdHJpbmcoQVN0cmluZyAmcywgVUludDMyIHZhbHVlKQ0KK3sNCisgIGNoYXIgdGVtcFsxNl07DQorICBDb252ZXJ0VUludDMyVG9TdHJpbmcodmFsdWUsIHRlbXApOw0KKyAgcyArPSB0ZW1wOw0KK30NCisNCitzdGF0aWMgdm9pZCBMem1hMlByb3BUb1N0cmluZyhBU3RyaW5nICZzLCB1bnNpZ25lZCBwcm9wKQ0KK3sNCisgIGNoYXIgYyA9IDA7DQorICBVSW50MzIgc2l6ZTsNCisgIGlmICgocHJvcCAmIDEpID09IDApDQorICAgIHNpemUgPSBwcm9wIC8gMiArIDEyOw0KKyAgZWxzZQ0KKyAgew0KKyAgICBjID0gJ2snOw0KKyAgICBzaXplID0gKFVJbnQzMikoMiB8IChwcm9wICYgMSkpIDw8IChwcm9wIC8gMiArIDEpOw0KKyAgICBpZiAocHJvcCA+IDE3KQ0KKyAgICB7DQorICAgICAgc2l6ZSA+Pj0gMTA7DQorICAgICAgYyA9ICdtJzsNCisgICAgfQ0KKyAgfQ0KKyAgQWRkVUludDMyVG9TdHJpbmcocywgc2l6ZSk7DQorICBpZiAoYyAhPSAwKQ0KKyAgICBzICs9IGM7DQorfQ0KKw0KK3N0cnVjdCBDTWV0aG9kTmFtZVBhaXINCit7DQorICBVSW50MzIgSWQ7DQorICBjb25zdCBjaGFyICpOYW1lOw0KK307DQorDQorc3RhdGljIGNvbnN0IENNZXRob2ROYW1lUGFpciBnX05hbWVQYWlyc1tdID0NCit7DQorICB7IFhaX0lEX1N1YmJsb2NrLCAiU0IiIH0sDQorICB7IFhaX0lEX0RlbHRhLCAiRGVsdGEiIH0sDQorICB7IFhaX0lEX1g4NiwgIkJDSiIgfSwNCisgIHsgWFpfSURfUFBDLCAiUFBDIiB9LA0KKyAgeyBYWl9JRF9JQTY0LCAiSUE2NCIgfSwNCisgIHsgWFpfSURfQVJNLCAiQVJNIiB9LA0KKyAgeyBYWl9JRF9BUk1ULCAiQVJNVCIgfSwNCisgIHsgWFpfSURfU1BBUkMsICJTUEFSQyIgfSwNCisgIHsgWFpfSURfTFpNQTIsICJMWk1BMiIgfQ0KK307DQorDQorc3RhdGljIEFTdHJpbmcgR2V0TWV0aG9kU3RyaW5nKGNvbnN0IENYekZpbHRlciAmZikNCit7DQorICBjb25zdCBjaGFyICpwID0gTlVMTDsNCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdfTmFtZVBhaXJzKTsgaSsrKQ0KKyAgICBpZiAoZ19OYW1lUGFpcnNbaV0uSWQgPT0gZi5pZCkNCisgICAgew0KKyAgICAgIHAgPSBnX05hbWVQYWlyc1tpXS5OYW1lOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICBjaGFyIHRlbXBbMzJdOw0KKyAgaWYgKCFwKQ0KKyAgew0KKyAgICA6OkNvbnZlcnRVSW50NjRUb1N0cmluZyhmLmlkLCB0ZW1wKTsNCisgICAgcCA9IHRlbXA7DQorICB9DQorDQorICBBU3RyaW5nIHMgPSBwOw0KKw0KKyAgaWYgKGYucHJvcHNTaXplID4gMCkNCisgIHsNCisgICAgcyArPSAnOic7DQorICAgIGlmIChmLmlkID09IFhaX0lEX0xaTUEyICYmIGYucHJvcHNTaXplID09IDEpDQorICAgICAgTHptYTJQcm9wVG9TdHJpbmcocywgZi5wcm9wc1swXSk7DQorICAgIGVsc2UgaWYgKGYuaWQgPT0gWFpfSURfRGVsdGEgJiYgZi5wcm9wc1NpemUgPT0gMSkNCisgICAgICBBZGRVSW50MzJUb1N0cmluZyhzLCAoVUludDMyKWYucHJvcHNbMF0gKyAxKTsNCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgcyArPSAnWyc7DQorICAgICAgZm9yIChVSW50MzIgYmkgPSAwOyBiaSA8IGYucHJvcHNTaXplOyBiaSsrKQ0KKyAgICAgICAgQWRkSGV4VG9TdHJpbmcocywgZi5wcm9wc1tiaV0pOw0KKyAgICAgIHMgKz0gJ10nOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gczsNCit9DQorDQorc3RhdGljIHZvaWQgQWRkU3RyaW5nKEFTdHJpbmcgJmRlc3QsIGNvbnN0IEFTdHJpbmcgJnNyYykNCit7DQorICBpZiAoIWRlc3QuSXNFbXB0eSgpKQ0KKyAgICBkZXN0ICs9ICcgJzsNCisgIGRlc3QgKz0gc3JjOw0KK30NCisNCitzdGF0aWMgY29uc3QgY2hhciAqa0NoZWNrc1tdID0NCit7DQorICAgICJOb0NoZWNrIg0KKyAgLCAiQ1JDMzIiDQorICAsIE5VTEwNCisgICwgTlVMTA0KKyAgLCAiQ1JDNjQiDQorICAsIE5VTEwNCisgICwgTlVMTA0KKyAgLCBOVUxMDQorICAsIE5VTEwNCisgICwgTlVMTA0KKyAgLCAiU0hBMjU2Ig0KKyAgLCBOVUxMDQorICAsIE5VTEwNCisgICwgTlVMTA0KKyAgLCBOVUxMDQorICAsIE5VTEwNCit9Ow0KKw0KK3N0YXRpYyBBU3RyaW5nIEdldENoZWNrU3RyaW5nKGNvbnN0IENYenMgJnh6cykNCit7DQorICBzaXplX3QgaTsNCisgIFVJbnQzMiBtYXNrID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCB4enMubnVtOyBpKyspDQorICAgIG1hc2sgfD0gKChVSW50MzIpMSA8PCBYekZsYWdzX0dldENoZWNrVHlwZSh4enMuc3RyZWFtc1tpXS5mbGFncykpOw0KKyAgQVN0cmluZyBzOw0KKyAgZm9yIChpID0gMDsgaSA8PSBYWl9DSEVDS19NQVNLOyBpKyspDQorICAgIGlmICgoKG1hc2sgPj4gaSkgJiAxKSAhPSAwKQ0KKyAgICB7DQorICAgICAgQVN0cmluZyBzMjsNCisgICAgICBpZiAoa0NoZWNrc1tpXSkNCisgICAgICAgIHMyID0ga0NoZWNrc1tpXTsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgczIgPSAiQ2hlY2stIjsNCisgICAgICAgIEFkZFVJbnQzMlRvU3RyaW5nKHMyLCAoVUludDMyKWkpOw0KKyAgICAgIH0NCisgICAgICBBZGRTdHJpbmcocywgczIpOw0KKyAgICB9DQorICByZXR1cm4gczsNCit9DQorDQorU1RETUVUSE9ESU1QIENIYW5kbGVyOjpHZXRBcmNoaXZlUHJvcGVydHkoUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgc3dpdGNoIChwcm9wSUQpDQorICB7DQorICAgIGNhc2Uga3BpZFBoeVNpemU6IGlmIChfcGh5U2l6ZV9EZWZpbmVkKSBwcm9wID0gX3N0YXQuUGh5U2l6ZTsgYnJlYWs7DQorICAgIGNhc2Uga3BpZE51bVN0cmVhbXM6IGlmIChfc3RhdC5OdW1TdHJlYW1zX0RlZmluZWQpIHByb3AgPSBfc3RhdC5OdW1TdHJlYW1zOyBicmVhazsNCisgICAgY2FzZSBrcGlkTnVtQmxvY2tzOiBpZiAoX3N0YXQuTnVtQmxvY2tzX0RlZmluZWQpIHByb3AgPSBfc3RhdC5OdW1CbG9ja3M7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRVbnBhY2tTaXplOiBpZiAoX3N0YXQuVW5wYWNrU2l6ZV9EZWZpbmVkKSBwcm9wID0gX3N0YXQuT3V0U2l6ZTsgYnJlYWs7DQorICAgIGNhc2Uga3BpZE1ldGhvZDogaWYgKCFfbWV0aG9kc1N0cmluZy5Jc0VtcHR5KCkpIHByb3AgPSBfbWV0aG9kc1N0cmluZzsgYnJlYWs7DQorICAgIGNhc2Uga3BpZEVycm9yRmxhZ3M6DQorICAgIHsNCisgICAgICBVSW50MzIgdiA9IDA7DQorICAgICAgaWYgKCFfaXNBcmMpIHYgfD0ga3B2X0Vycm9yRmxhZ3NfSXNOb3RBcmM7Ow0KKyAgICAgIGlmIChfc3RhdC5VbmV4cGVjdGVkRW5kKSB2IHw9IGtwdl9FcnJvckZsYWdzX1VuZXhwZWN0ZWRFbmQ7DQorICAgICAgaWYgKF9zdGF0LkRhdGFBZnRlckVuZCkgdiB8PSBrcHZfRXJyb3JGbGFnc19EYXRhQWZ0ZXJFbmQ7DQorICAgICAgaWYgKF9zdGF0LkhlYWRlcnNFcnJvcikgdiB8PSBrcHZfRXJyb3JGbGFnc19IZWFkZXJzRXJyb3I7DQorICAgICAgaWYgKF9zdGF0LlVuc3VwcG9ydGVkKSB2IHw9IGtwdl9FcnJvckZsYWdzX1Vuc3VwcG9ydGVkTWV0aG9kOw0KKyAgICAgIGlmIChfc3RhdC5EYXRhRXJyb3IpIHYgfD0ga3B2X0Vycm9yRmxhZ3NfRGF0YUVycm9yOw0KKyAgICAgIGlmIChfc3RhdC5DcmNFcnJvcikgdiB8PSBrcHZfRXJyb3JGbGFnc19DcmNFcnJvcjsNCisgICAgICBwcm9wID0gdjsNCisgICAgfQ0KKyAgfQ0KKyAgcHJvcC5EZXRhY2godmFsdWUpOw0KKyAgcmV0dXJuIFNfT0s7DQorICBDT01fVFJZX0VORA0KK30NCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkdldE51bWJlck9mSXRlbXMoVUludDMyICpudW1JdGVtcykNCit7DQorICAqbnVtSXRlbXMgPSAxOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0UHJvcGVydHkoVUludDMyLCBQUk9QSUQgcHJvcElELCBQUk9QVkFSSUFOVCAqdmFsdWUpDQorew0KKyAgQ09NX1RSWV9CRUdJTg0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBzd2l0Y2ggKHByb3BJRCkNCisgIHsNCisgICAgY2FzZSBrcGlkU2l6ZTogaWYgKF9zdGF0LlVucGFja1NpemVfRGVmaW5lZCkgcHJvcCA9IF9zdGF0Lk91dFNpemU7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRQYWNrU2l6ZTogaWYgKF9waHlTaXplX0RlZmluZWQpIHByb3AgPSBfc3RhdC5QaHlTaXplOyBicmVhazsNCisgICAgY2FzZSBrcGlkTWV0aG9kOiBpZiAoIV9tZXRob2RzU3RyaW5nLklzRW1wdHkoKSkgcHJvcCA9IF9tZXRob2RzU3RyaW5nOyBicmVhazsNCisgIH0NCisgIHByb3AuRGV0YWNoKHZhbHVlKTsNCisgIHJldHVybiBTX09LOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorDQorc3RydWN0IENPcGVuQ2FsbGJhY2tXcmFwDQorew0KKyAgSUNvbXByZXNzUHJvZ3Jlc3MgcDsNCisgIElBcmNoaXZlT3BlbkNhbGxiYWNrICpPcGVuQ2FsbGJhY2s7DQorICBIUkVTVUxUIFJlczsNCisgIENPcGVuQ2FsbGJhY2tXcmFwKElBcmNoaXZlT3BlbkNhbGxiYWNrICpwcm9ncmVzcyk7DQorfTsNCisNCitzdGF0aWMgU1JlcyBPcGVuQ2FsbGJhY2tQcm9ncmVzcyh2b2lkICpwcCwgVUludDY0IGluU2l6ZSwgVUludDY0IC8qIG91dFNpemUgKi8pDQorew0KKyAgQ09wZW5DYWxsYmFja1dyYXAgKnAgPSAoQ09wZW5DYWxsYmFja1dyYXAgKilwcDsNCisgIHAtPlJlcyA9IHAtPk9wZW5DYWxsYmFjay0+U2V0Q29tcGxldGVkKE5VTEwsICZpblNpemUpOw0KKyAgcmV0dXJuIChTUmVzKXAtPlJlczsNCit9DQorDQorQ09wZW5DYWxsYmFja1dyYXA6OkNPcGVuQ2FsbGJhY2tXcmFwKElBcmNoaXZlT3BlbkNhbGxiYWNrICpjYWxsYmFjaykNCit7DQorICBwLlByb2dyZXNzID0gT3BlbkNhbGxiYWNrUHJvZ3Jlc3M7DQorICBPcGVuQ2FsbGJhY2sgPSBjYWxsYmFjazsNCisgIFJlcyA9IFNaX09LOw0KK30NCisNCitzdHJ1Y3QgQ1h6c0NQUA0KK3sNCisgIENYenMgcDsNCisgIENYenNDUFAoKSB7IFh6c19Db25zdHJ1Y3QoJnApOyB9DQorICB+Q1h6c0NQUCgpIHsgWHpzX0ZyZWUoJnAsICZnX0FsbG9jKTsgfQ0KK307DQorDQorDQorc3RydWN0IENWaXJ0UHJvZ3Jlc3NfVG9fT3BlblByb2dyZXNzOiBwdWJsaWMgSURlY29kZVN0YXRlDQorew0KKyAgSUFyY2hpdmVPcGVuQ2FsbGJhY2sgKkNhbGxiYWNrOw0KKyAgVUludDY0IE9mZnNldDsNCisNCisgIEhSRVNVTFQgUHJvZ3Jlc3MoKTsNCit9Ow0KKw0KK0hSRVNVTFQgQ1ZpcnRQcm9ncmVzc19Ub19PcGVuUHJvZ3Jlc3M6OlByb2dyZXNzKCkNCit7DQorICBpZiAoQ2FsbGJhY2spDQorICB7DQorICAgIFVJbnQ2NCBmaWxlcyA9IDA7DQorICAgIFVJbnQ2NCB2YWx1ZSA9IE9mZnNldCArIEluU2l6ZTsNCisgICAgcmV0dXJuIENhbGxiYWNrLT5TZXRDb21wbGV0ZWQoJmZpbGVzLCAmdmFsdWUpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0YXRpYyBIUkVTVUxUIFNSZXNfdG9fT3Blbl9IUkVTVUxUKFNSZXMgcmVzKQ0KK3sNCisgIHN3aXRjaCAocmVzKQ0KKyAgew0KKyAgICBjYXNlIFNaX09LOiByZXR1cm4gU19PSzsNCisgICAgY2FzZSBTWl9FUlJPUl9NRU06IHJldHVybiBFX09VVE9GTUVNT1JZOw0KKyAgICBjYXNlIFNaX0VSUk9SX1BST0dSRVNTOiByZXR1cm4gRV9BQk9SVDsNCisgICAgLyoNCisgICAgY2FzZSBTWl9FUlJPUl9VTlNVUFBPUlRFRDoNCisgICAgY2FzZSBTWl9FUlJPUl9DUkM6DQorICAgIGNhc2UgU1pfRVJST1JfREFUQToNCisgICAgY2FzZSBTWl9FUlJPUl9BUkNISVZFOg0KKyAgICBjYXNlIFNaX0VSUk9SX05PX0FSQ0hJVkU6DQorICAgICAgcmV0dXJuIFNfRkFMU0U7DQorICAgICovDQorICB9DQorICByZXR1cm4gU19GQUxTRTsNCit9DQorDQorSFJFU1VMVCBDSGFuZGxlcjo6T3BlbjIoSUluU3RyZWFtICppblN0cmVhbSwgLyogVUludDMyIGZsYWdzLCAqLyBJQXJjaGl2ZU9wZW5DYWxsYmFjayAqY2FsbGJhY2spDQorew0KKyAgX25lZWRTZWVrVG9TdGFydCA9IHRydWU7DQorDQorICB7DQorICAgIENYelN0cmVhbUZsYWdzIHN0Ow0KKyAgICBDU2VxSW5TdHJlYW1XcmFwIGluU3RyZWFtV3JhcChpblN0cmVhbSk7DQorICAgIFNSZXMgcmVzID0gWHpfUmVhZEhlYWRlcigmc3QsICZpblN0cmVhbVdyYXAucCk7DQorICAgIGlmIChyZXMgIT0gU1pfT0spDQorICAgICAgcmV0dXJuIFNSZXNfdG9fT3Blbl9IUkVTVUxUKHJlcyk7DQorDQorICAgIHsNCisgICAgICBDWHpCbG9jayBibG9jazsNCisgICAgICBCb29sIGlzSW5kZXg7DQorICAgICAgVUludDMyIGhlYWRlclNpemVSZXM7DQorICAgICAgU1JlcyByZXMyID0gWHpCbG9ja19SZWFkSGVhZGVyKCZibG9jaywgJmluU3RyZWFtV3JhcC5wLCAmaXNJbmRleCwgJmhlYWRlclNpemVSZXMpOw0KKyAgICAgIGlmIChyZXMyID09IFNaX09LICYmICFpc0luZGV4KQ0KKyAgICAgIHsNCisgICAgICAgIHVuc2lnbmVkIG51bUZpbHRlcnMgPSBYekJsb2NrX0dldE51bUZpbHRlcnMoJmJsb2NrKTsNCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1GaWx0ZXJzOyBpKyspDQorICAgICAgICAgIEFkZFN0cmluZyhfbWV0aG9kc1N0cmluZywgR2V0TWV0aG9kU3RyaW5nKGJsb2NrLmZpbHRlcnNbaV0pKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIFJJTk9LKGluU3RyZWFtLT5TZWVrKDAsIFNUUkVBTV9TRUVLX0VORCwgJl9zdGF0LlBoeVNpemUpKTsNCisgIFJJTk9LKGNhbGxiYWNrLT5TZXRUb3RhbChOVUxMLCAmX3N0YXQuUGh5U2l6ZSkpOw0KKw0KKyAgQ1NlZWtJblN0cmVhbVdyYXAgaW5TdHJlYW1JbXAoaW5TdHJlYW0pOw0KKw0KKyAgQ0xvb2tUb1JlYWQgbG9va1N0cmVhbTsNCisgIExvb2tUb1JlYWRfQ3JlYXRlVlRhYmxlKCZsb29rU3RyZWFtLCBUcnVlKTsNCisgIGxvb2tTdHJlYW0ucmVhbFN0cmVhbSA9ICZpblN0cmVhbUltcC5wOw0KKyAgTG9va1RvUmVhZF9Jbml0KCZsb29rU3RyZWFtKTsNCisNCisgIENPcGVuQ2FsbGJhY2tXcmFwIG9wZW5XcmFwKGNhbGxiYWNrKTsNCisNCisgIENYenNDUFAgeHpzOw0KKyAgSW50NjQgc3RhcnRQb3NpdGlvbjsNCisgIFNSZXMgcmVzID0gWHpzX1JlYWRCYWNrd2FyZCgmeHpzLnAsICZsb29rU3RyZWFtLnMsICZzdGFydFBvc2l0aW9uLCAmb3BlbldyYXAucCwgJmdfQWxsb2MpOw0KKyAgaWYgKHJlcyA9PSBTWl9FUlJPUl9QUk9HUkVTUykNCisgICAgcmV0dXJuIChvcGVuV3JhcC5SZXMgPT0gU19PSykgPyBFX0ZBSUwgOiBvcGVuV3JhcC5SZXM7DQorICAvKg0KKyAgaWYgKHJlcyA9PSBTWl9FUlJPUl9OT19BUkNISVZFICYmIHh6cy5wLm51bSA+IDApDQorICAgIHJlcyA9IFNaX09LOw0KKyAgKi8NCisgIGlmIChyZXMgPT0gU1pfT0sgJiYgc3RhcnRQb3NpdGlvbiA9PSAwKQ0KKyAgew0KKyAgICBfcGh5U2l6ZV9EZWZpbmVkID0gdHJ1ZTsNCisNCisgICAgX3N0YXQuT3V0U2l6ZSA9IFh6c19HZXRVbnBhY2tTaXplKCZ4enMucCk7DQorICAgIF9zdGF0LlVucGFja1NpemVfRGVmaW5lZCA9IHRydWU7DQorDQorICAgIF9zdGF0Lk51bVN0cmVhbXMgPSB4enMucC5udW07DQorICAgIF9zdGF0Lk51bVN0cmVhbXNfRGVmaW5lZCA9IHRydWU7DQorICAgIA0KKyAgICBfc3RhdC5OdW1CbG9ja3MgPSBYenNfR2V0TnVtQmxvY2tzKCZ4enMucCk7DQorICAgIF9zdGF0Lk51bUJsb2Nrc19EZWZpbmVkID0gdHJ1ZTsNCisNCisgICAgQWRkU3RyaW5nKF9tZXRob2RzU3RyaW5nLCBHZXRDaGVja1N0cmluZyh4enMucCkpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICByZXMgPSBTWl9PSzsNCisgIH0NCisgIFJJTk9LKFNSZXNfdG9fT3Blbl9IUkVTVUxUKHJlcykpOw0KKyAgX3N0cmVhbSA9IGluU3RyZWFtOw0KKyAgX3NlcVN0cmVhbSA9IGluU3RyZWFtOw0KKyAgX2lzQXJjID0gdHJ1ZTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6Ok9wZW4oSUluU3RyZWFtICppblN0cmVhbSwgY29uc3QgVUludDY0ICosIElBcmNoaXZlT3BlbkNhbGxiYWNrICpjYWxsYmFjaykNCit7DQorICBDT01fVFJZX0JFR0lODQorICB7DQorICAgIENsb3NlKCk7DQorICAgIHJldHVybiBPcGVuMihpblN0cmVhbSwgLyogMCwgKi8gY2FsbGJhY2spOw0KKyAgfQ0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorU1RETUVUSE9ESU1QIENIYW5kbGVyOjpPcGVuU2VxKElTZXF1ZW50aWFsSW5TdHJlYW0gKnN0cmVhbSkNCit7DQorICBDbG9zZSgpOw0KKyAgX3NlcVN0cmVhbSA9IHN0cmVhbTsNCisgIF9pc0FyYyA9IHRydWU7DQorICBfbmVlZFNlZWtUb1N0YXJ0ID0gZmFsc2U7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENIYW5kbGVyOjpDbG9zZSgpDQorew0KKyAgX3N0YXQuQ2xlYXIoKTsNCisNCisgIF9pc0FyYyA9IGZhbHNlOw0KKyAgX25lZWRTZWVrVG9TdGFydCA9IGZhbHNlOw0KKw0KKyAgX3BoeVNpemVfRGVmaW5lZCA9IGZhbHNlOw0KKyAgDQorICAgX21ldGhvZHNTdHJpbmcuRW1wdHkoKTsNCisgIF9zdHJlYW0uUmVsZWFzZSgpOw0KKyAgX3NlcVN0cmVhbS5SZWxlYXNlKCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorY2xhc3MgQ1NlZWtUb1NlcVN0cmVhbToNCisgIHB1YmxpYyBJSW5TdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCitwdWJsaWM6DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gU3RyZWFtOw0KKyAgTVlfVU5LTk9XTl9JTVAxKElJblN0cmVhbSkNCisNCisgIFNURE1FVEhPRChSZWFkKSh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCisgIFNURE1FVEhPRChTZWVrKShJbnQ2NCBvZmZzZXQsIFVJbnQzMiBzZWVrT3JpZ2luLCBVSW50NjQgKm5ld1Bvc2l0aW9uKTsNCit9Ow0KKw0KK1NURE1FVEhPRElNUCBDU2Vla1RvU2VxU3RyZWFtOjpSZWFkKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgcmV0dXJuIFN0cmVhbS0+UmVhZChkYXRhLCBzaXplLCBwcm9jZXNzZWRTaXplKTsNCit9DQorDQorU1RETUVUSE9ESU1QIENTZWVrVG9TZXFTdHJlYW06OlNlZWsoSW50NjQsIFVJbnQzMiwgVUludDY0ICopIHsgcmV0dXJuIEVfTk9USU1QTDsgfQ0KKw0KK3N0cnVjdCBDWHpVbnBhY2tlckNQUA0KK3sNCisgIEJ5dGUgKkluQnVmOw0KKyAgQnl0ZSAqT3V0QnVmOw0KKyAgQ1h6VW5wYWNrZXIgcDsNCisgIA0KKyAgQ1h6VW5wYWNrZXJDUFAoKTogSW5CdWYoMCksIE91dEJ1ZigwKQ0KKyAgew0KKyAgICBYelVucGFja2VyX0NvbnN0cnVjdCgmcCwgJmdfQWxsb2MpOw0KKyAgfQ0KKyAgfkNYelVucGFja2VyQ1BQKCkNCisgIHsNCisgICAgWHpVbnBhY2tlcl9GcmVlKCZwKTsNCisgICAgTXlGcmVlKEluQnVmKTsNCisgICAgTXlGcmVlKE91dEJ1Zik7DQorICB9DQorfTsNCisNCitIUkVTVUxUIElEZWNvZGVTdGF0ZTo6RGVjb2RlKElTZXF1ZW50aWFsSW5TdHJlYW0gKnNlcUluU3RyZWFtLCBJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtKQ0KK3sNCisgIGNvbnN0IHNpemVfdCBrSW5CdWZTaXplID0gMSA8PCAxNTsNCisgIGNvbnN0IHNpemVfdCBrT3V0QnVmU2l6ZSA9IDEgPDwgMjE7DQorDQorICBEZWNvZGVSZXMgPSBTWl9PSzsNCisNCisgIENYelVucGFja2VyQ1BQIHh6dTsNCisgIFh6VW5wYWNrZXJfSW5pdCgmeHp1LnApOw0KKyAgeHp1LkluQnVmID0gKEJ5dGUgKilNeUFsbG9jKGtJbkJ1ZlNpemUpOw0KKyAgeHp1Lk91dEJ1ZiA9IChCeXRlICopTXlBbGxvYyhrT3V0QnVmU2l6ZSk7DQorICBpZiAoIXh6dS5JbkJ1ZiB8fCAheHp1Lk91dEJ1ZikNCisgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7DQorDQorICBVSW50MzIgaW5TaXplID0gMDsNCisgIFNpemVUIGluUG9zID0gMDsNCisgIFNpemVUIG91dFBvcyA9IDA7DQorDQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBpZiAoaW5Qb3MgPT0gaW5TaXplKQ0KKyAgICB7DQorICAgICAgaW5Qb3MgPSBpblNpemUgPSAwOw0KKyAgICAgIFJJTk9LKHNlcUluU3RyZWFtLT5SZWFkKHh6dS5JbkJ1Ziwga0luQnVmU2l6ZSwgJmluU2l6ZSkpOw0KKyAgICB9DQorDQorICAgIFNpemVUIGluTGVuID0gaW5TaXplIC0gaW5Qb3M7DQorICAgIFNpemVUIG91dExlbiA9IGtPdXRCdWZTaXplIC0gb3V0UG9zOw0KKyAgICBFQ29kZXJTdGF0dXMgc3RhdHVzOw0KKyAgICANCisgICAgU1JlcyByZXMgPSBYelVucGFja2VyX0NvZGUoJnh6dS5wLA0KKyAgICAgICAgeHp1Lk91dEJ1ZiArIG91dFBvcywgJm91dExlbiwNCisgICAgICAgIHh6dS5JbkJ1ZiArIGluUG9zLCAmaW5MZW4sDQorICAgICAgICAoaW5TaXplID09IDAgPyBDT0RFUl9GSU5JU0hfRU5EIDogQ09ERVJfRklOSVNIX0FOWSksICZzdGF0dXMpOw0KKw0KKyAgICBpblBvcyArPSBpbkxlbjsNCisgICAgb3V0UG9zICs9IG91dExlbjsNCisNCisgICAgSW5TaXplICs9IGluTGVuOw0KKyAgICBPdXRTaXplICs9IG91dExlbjsNCisNCisgICAgRGVjb2RlUmVzID0gcmVzOw0KKw0KKyAgICBib29sIGZpbmlzaGVkID0gKChpbkxlbiA9PSAwICYmIG91dExlbiA9PSAwKSB8fCByZXMgIT0gU1pfT0spOw0KKw0KKyAgICBpZiAob3V0U3RyZWFtKQ0KKyAgICB7DQorICAgICAgaWYgKG91dFBvcyA9PSBrT3V0QnVmU2l6ZSB8fCBmaW5pc2hlZCkNCisgICAgICB7DQorICAgICAgICBpZiAob3V0UG9zICE9IDApDQorICAgICAgICB7DQorICAgICAgICAgIFJJTk9LKFdyaXRlU3RyZWFtKG91dFN0cmVhbSwgeHp1Lk91dEJ1Ziwgb3V0UG9zKSk7DQorICAgICAgICAgIG91dFBvcyA9IDA7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2UNCisgICAgICBvdXRQb3MgPSAwOw0KKyAgICANCisgICAgUklOT0soUHJvZ3Jlc3MoKSk7DQorICAgIA0KKyAgICBpZiAoZmluaXNoZWQpDQorICAgIHsNCisgICAgICBQaHlTaXplID0gSW5TaXplOw0KKyAgICAgIE51bVN0cmVhbXMgPSB4enUucC5udW1TdGFydGVkU3RyZWFtczsNCisgICAgICBpZiAoTnVtU3RyZWFtcyA+IDApDQorICAgICAgICBJc0FyYyA9IHRydWU7DQorICAgICAgTnVtQmxvY2tzID0geHp1LnAubnVtVG90YWxCbG9ja3M7DQorDQorICAgICAgVW5wYWNrU2l6ZV9EZWZpbmVkID0gdHJ1ZTsNCisgICAgICBOdW1TdHJlYW1zX0RlZmluZWQgPSB0cnVlOw0KKyAgICAgIE51bUJsb2Nrc19EZWZpbmVkID0gdHJ1ZTsNCisNCisgICAgICBVSW50NjQgZXh0cmFTaXplID0gWHpVbnBhY2tlcl9HZXRFeHRyYVNpemUoJnh6dS5wKTsNCisNCisgICAgICBpZiAocmVzID09IFNaX09LKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChzdGF0dXMgPT0gQ09ERVJfU1RBVFVTX05FRURTX01PUkVfSU5QVVQpDQorICAgICAgICB7DQorICAgICAgICAgIGV4dHJhU2l6ZSA9IDA7DQorICAgICAgICAgIGlmICghWHpVbnBhY2tlcl9Jc1N0cmVhbVdhc0ZpbmlzaGVkKCZ4enUucCkpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICAvLyBmaW5pc2hlZCBhdCBwYWRkaW5nIGJ5dGVzLCBidXQgcGFkZGluZyBpcyBub3QgYWxpZ25lZCBmb3IgNA0KKyAgICAgICAgICAgIFVuZXhwZWN0ZWRFbmQgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlcyA9IFNaX0VSUk9SX0RBVEE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVsc2UgLy8gc3RhdHVzID09IENPREVSX1NUQVRVU19OT1RfRklOSVNIRUQNCisgICAgICAgICAgcmVzID0gU1pfRVJST1JfREFUQTsNCisgICAgICB9DQorICAgICAgZWxzZSBpZiAocmVzID09IFNaX0VSUk9SX05PX0FSQ0hJVkUpDQorICAgICAgew0KKyAgICAgICAgaWYgKEluU2l6ZSA9PSBleHRyYVNpemUpDQorICAgICAgICAgIElzQXJjID0gZmFsc2U7DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIGlmIChleHRyYVNpemUgIT0gMCB8fCBpblBvcyAhPSBpblNpemUpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBEYXRhQWZ0ZXJFbmQgPSB0cnVlOw0KKyAgICAgICAgICAgIHJlcyA9IFNaX09LOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIERlY29kZVJlcyA9IHJlczsNCisgICAgICBQaHlTaXplIC09IGV4dHJhU2l6ZTsNCisNCisgICAgICBzd2l0Y2ggKHJlcykNCisgICAgICB7DQorICAgICAgICBjYXNlIFNaX09LOiBicmVhazsNCisgICAgICAgIGNhc2UgU1pfRVJST1JfTk9fQVJDSElWRTogSXNBcmMgPSBmYWxzZTsgYnJlYWs7DQorICAgICAgICBjYXNlIFNaX0VSUk9SX0FSQ0hJVkU6IEhlYWRlcnNFcnJvciA9IHRydWU7IGJyZWFrOw0KKyAgICAgICAgY2FzZSBTWl9FUlJPUl9VTlNVUFBPUlRFRDogVW5zdXBwb3J0ZWQgPSB0cnVlOyBicmVhazsNCisgICAgICAgIGNhc2UgU1pfRVJST1JfQ1JDOiBDcmNFcnJvciA9IHRydWU7IGJyZWFrOw0KKyAgICAgICAgY2FzZSBTWl9FUlJPUl9EQVRBOiBEYXRhRXJyb3IgPSB0cnVlOyBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6IERhdGFFcnJvciA9IHRydWU7IGJyZWFrOw0KKyAgICAgIH0NCisNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6RXh0cmFjdChjb25zdCBVSW50MzIgKmluZGljZXMsIFVJbnQzMiBudW1JdGVtcywNCisgICAgSW50MzIgdGVzdE1vZGUsIElBcmNoaXZlRXh0cmFjdENhbGxiYWNrICpleHRyYWN0Q2FsbGJhY2spDQorew0KKyAgQ09NX1RSWV9CRUdJTg0KKyAgaWYgKG51bUl0ZW1zID09IDApDQorICAgIHJldHVybiBTX09LOw0KKyAgaWYgKG51bUl0ZW1zICE9IChVSW50MzIpKEludDMyKS0xICYmIChudW1JdGVtcyAhPSAxIHx8IGluZGljZXNbMF0gIT0gMCkpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorDQorICBleHRyYWN0Q2FsbGJhY2stPlNldFRvdGFsKF9zdGF0LlBoeVNpemUpOw0KKyAgVUludDY0IGN1cnJlbnRUb3RhbFBhY2tlZCA9IDA7DQorICBSSU5PSyhleHRyYWN0Q2FsbGJhY2stPlNldENvbXBsZXRlZCgmY3VycmVudFRvdGFsUGFja2VkKSk7DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IHJlYWxPdXRTdHJlYW07DQorICBJbnQzMiBhc2tNb2RlID0gdGVzdE1vZGUgPw0KKyAgICAgIE5FeHRyYWN0OjpOQXNrTW9kZTo6a1Rlc3QgOg0KKyAgICAgIE5FeHRyYWN0OjpOQXNrTW9kZTo6a0V4dHJhY3Q7DQorICANCisgIFJJTk9LKGV4dHJhY3RDYWxsYmFjay0+R2V0U3RyZWFtKDAsICZyZWFsT3V0U3RyZWFtLCBhc2tNb2RlKSk7DQorICANCisgIGlmICghdGVzdE1vZGUgJiYgIXJlYWxPdXRTdHJlYW0pDQorICAgIHJldHVybiBTX09LOw0KKw0KKyAgZXh0cmFjdENhbGxiYWNrLT5QcmVwYXJlT3BlcmF0aW9uKGFza01vZGUpOw0KKw0KKyAgQ1ZpcnRQcm9ncmVzc19Ub19Mb2NhbFByb2dyZXNzIHZwOw0KKyAgdnAubHBzID0gbmV3IENMb2NhbFByb2dyZXNzOw0KKyAgdnAucHJvZ3Jlc3MgPSB2cC5scHM7DQorICB2cC5scHMtPkluaXQoZXh0cmFjdENhbGxiYWNrLCB0cnVlKTsNCisNCisNCisgIGlmIChfbmVlZFNlZWtUb1N0YXJ0KQ0KKyAgew0KKyAgICBpZiAoIV9zdHJlYW0pDQorICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgUklOT0soX3N0cmVhbS0+U2VlaygwLCBTVFJFQU1fU0VFS19TRVQsIE5VTEwpKTsNCisgIH0NCisgIGVsc2UNCisgICAgX25lZWRTZWVrVG9TdGFydCA9IHRydWU7DQorDQorICBSSU5PSyhEZWNvZGUyKF9zZXFTdHJlYW0sIHJlYWxPdXRTdHJlYW0sIHZwKSk7DQorDQorICBJbnQzMiBvcFJlczsNCisNCisgIGlmICghdnAuSXNBcmMpDQorICAgIG9wUmVzID0gTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtJc05vdEFyYzsNCisgIGVsc2UgaWYgKHZwLlVuZXhwZWN0ZWRFbmQpDQorICAgIG9wUmVzID0gTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtVbmV4cGVjdGVkRW5kOw0KKyAgZWxzZSBpZiAodnAuRGF0YUFmdGVyRW5kKQ0KKyAgICBvcFJlcyA9IE5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprRGF0YUFmdGVyRW5kOw0KKyAgZWxzZSBpZiAodnAuQ3JjRXJyb3IpDQorICAgIG9wUmVzID0gTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtDUkNFcnJvcjsNCisgIGVsc2UgaWYgKHZwLlVuc3VwcG9ydGVkKQ0KKyAgICBvcFJlcyA9IE5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprVW5zdXBwb3J0ZWRNZXRob2Q7DQorICBlbHNlIGlmICh2cC5IZWFkZXJzRXJyb3IpDQorICAgIG9wUmVzID0gTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtEYXRhRXJyb3I7DQorICBlbHNlIGlmICh2cC5EYXRhRXJyb3IpDQorICAgIG9wUmVzID0gTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtEYXRhRXJyb3I7DQorICBlbHNlIGlmICh2cC5EZWNvZGVSZXMgIT0gU1pfT0spDQorICAgIG9wUmVzID0gTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtEYXRhRXJyb3I7DQorICBlbHNlDQorICAgIG9wUmVzID0gTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtPSzsNCisNCisgIHJlYWxPdXRTdHJlYW0uUmVsZWFzZSgpOw0KKyAgcmV0dXJuIGV4dHJhY3RDYWxsYmFjay0+U2V0T3BlcmF0aW9uUmVzdWx0KG9wUmVzKTsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KKyNpZm5kZWYgRVhUUkFDVF9PTkxZDQorDQorU1RETUVUSE9ESU1QIENIYW5kbGVyOjpHZXRGaWxlVGltZVR5cGUoVUludDMyICp0aW1lVHlwZSkNCit7DQorICAqdGltZVR5cGUgPSBORmlsZVRpbWVUeXBlOjprVW5peDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OlVwZGF0ZUl0ZW1zKElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sIFVJbnQzMiBudW1JdGVtcywNCisgICAgSUFyY2hpdmVVcGRhdGVDYWxsYmFjayAqdXBkYXRlQ2FsbGJhY2spDQorew0KKyAgQ1NlcU91dFN0cmVhbVdyYXAgc2VxT3V0U3RyZWFtKG91dFN0cmVhbSk7DQorICANCisgIGlmIChudW1JdGVtcyA9PSAwKQ0KKyAgew0KKyAgICBTUmVzIHJlcyA9IFh6X0VuY29kZUVtcHR5KCZzZXFPdXRTdHJlYW0ucCk7DQorICAgIHJldHVybiBTUmVzVG9IUkVTVUxUKHJlcyk7DQorICB9DQorICANCisgIGlmIChudW1JdGVtcyAhPSAxKQ0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKw0KKyAgSW50MzIgbmV3RGF0YSwgbmV3UHJvcHM7DQorICBVSW50MzIgaW5kZXhJbkFyY2hpdmU7DQorICBpZiAoIXVwZGF0ZUNhbGxiYWNrKQ0KKyAgICByZXR1cm4gRV9GQUlMOw0KKyAgUklOT0sodXBkYXRlQ2FsbGJhY2stPkdldFVwZGF0ZUl0ZW1JbmZvKDAsICZuZXdEYXRhLCAmbmV3UHJvcHMsICZpbmRleEluQXJjaGl2ZSkpOw0KKw0KKyAgaWYgKEludFRvQm9vbChuZXdQcm9wcykpDQorICB7DQorICAgIHsNCisgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgICBSSU5PSyh1cGRhdGVDYWxsYmFjay0+R2V0UHJvcGVydHkoMCwga3BpZElzRGlyLCAmcHJvcCkpOw0KKyAgICAgIGlmIChwcm9wLnZ0ICE9IFZUX0VNUFRZKQ0KKyAgICAgICAgaWYgKHByb3AudnQgIT0gVlRfQk9PTCB8fCBwcm9wLmJvb2xWYWwgIT0gVkFSSUFOVF9GQUxTRSkNCisgICAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKEludFRvQm9vbChuZXdEYXRhKSkNCisgIHsNCisgICAgVUludDY0IHNpemU7DQorICAgIHsNCisgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgICBSSU5PSyh1cGRhdGVDYWxsYmFjay0+R2V0UHJvcGVydHkoMCwga3BpZFNpemUsICZwcm9wKSk7DQorICAgICAgaWYgKHByb3AudnQgIT0gVlRfVUk4KQ0KKyAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgICBzaXplID0gcHJvcC51aFZhbC5RdWFkUGFydDsNCisgICAgICBSSU5PSyh1cGRhdGVDYWxsYmFjay0+U2V0VG90YWwoc2l6ZSkpOw0KKyAgICB9DQorDQorICAgIENMem1hMkVuY1Byb3BzIGx6bWEyUHJvcHM7DQorICAgIEx6bWEyRW5jUHJvcHNfSW5pdCgmbHptYTJQcm9wcyk7DQorDQorICAgIGx6bWEyUHJvcHMubHptYVByb3BzLmxldmVsID0gR2V0TGV2ZWwoKTsNCisNCisgICAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IGZpbGVJblN0cmVhbTsNCisgICAgUklOT0sodXBkYXRlQ2FsbGJhY2stPkdldFN0cmVhbSgwLCAmZmlsZUluU3RyZWFtKSk7DQorDQorICAgIENTZXFJblN0cmVhbVdyYXAgc2VxSW5TdHJlYW0oZmlsZUluU3RyZWFtKTsNCisNCisgICAgew0KKyAgICAgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wID0gKFVJbnQ2NClzaXplOw0KKyAgICAgIFJJTk9LKE5Db21wcmVzczo6Tkx6bWEyOjpTZXRMem1hMlByb3AoTkNvZGVyUHJvcElEOjprUmVkdWNlU2l6ZSwgcHJvcCwgbHptYTJQcm9wcykpOw0KKyAgICB9DQorDQorICAgIEZPUl9WRUNUT1IgKGksIF9tZXRob2RzKQ0KKyAgICB7DQorICAgICAgQ09uZU1ldGhvZEluZm8gJm0gPSBfbWV0aG9kc1tpXTsNCisgICAgICBTZXRHbG9iYWxMZXZlbEFuZFRocmVhZHMobQ0KKyAgICAgICNpZm5kZWYgXzdaSVBfU1QNCisgICAgICAsIF9udW1UaHJlYWRzDQorICAgICAgI2VuZGlmDQorICAgICAgKTsNCisgICAgICB7DQorICAgICAgICBGT1JfVkVDVE9SIChqLCBtLlByb3BzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBjb25zdCBDUHJvcCAmcHJvcCA9IG0uUHJvcHNbal07DQorICAgICAgICAgIFJJTk9LKE5Db21wcmVzczo6Tkx6bWEyOjpTZXRMem1hMlByb3AocHJvcC5JZCwgcHJvcC5WYWx1ZSwgbHptYTJQcm9wcykpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAjaWZuZGVmIF83WklQX1NUDQorICAgIGx6bWEyUHJvcHMubnVtVG90YWxUaHJlYWRzID0gX251bVRocmVhZHM7DQorICAgICNlbmRpZg0KKw0KKyAgICBDTG9jYWxQcm9ncmVzcyAqbHBzID0gbmV3IENMb2NhbFByb2dyZXNzOw0KKyAgICBDTXlDb21QdHI8SUNvbXByZXNzUHJvZ3Jlc3NJbmZvPiBwcm9ncmVzcyA9IGxwczsNCisgICAgbHBzLT5Jbml0KHVwZGF0ZUNhbGxiYWNrLCB0cnVlKTsNCisNCisgICAgQ0NvbXByZXNzUHJvZ3Jlc3NXcmFwIHByb2dyZXNzV3JhcChwcm9ncmVzcyk7DQorICAgIENYelByb3BzIHh6UHJvcHM7DQorICAgIENYekZpbHRlclByb3BzIGZpbHRlcjsNCisgICAgWHpQcm9wc19Jbml0KCZ4elByb3BzKTsNCisgICAgWHpGaWx0ZXJQcm9wc19Jbml0KCZmaWx0ZXIpOw0KKyAgICB4elByb3BzLmx6bWEyUHJvcHMgPSAmbHptYTJQcm9wczsNCisgICAgeHpQcm9wcy5maWx0ZXJQcm9wcyA9IChfZmlsdGVySWQgIT0gMCA/ICZmaWx0ZXIgOiBOVUxMKTsNCisgICAgc3dpdGNoIChfY3JjU2l6ZSkNCisgICAgew0KKyAgICAgIGNhc2UgIDA6IHh6UHJvcHMuY2hlY2tJZCA9IFhaX0NIRUNLX05POyBicmVhazsNCisgICAgICBjYXNlICA0OiB4elByb3BzLmNoZWNrSWQgPSBYWl9DSEVDS19DUkMzMjsgYnJlYWs7DQorICAgICAgY2FzZSAgODogeHpQcm9wcy5jaGVja0lkID0gWFpfQ0hFQ0tfQ1JDNjQ7IGJyZWFrOw0KKyAgICAgIGNhc2UgMzI6IHh6UHJvcHMuY2hlY2tJZCA9IFhaX0NIRUNLX1NIQTI1NjsgYnJlYWs7DQorICAgICAgZGVmYXVsdDogcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgfQ0KKyAgICBmaWx0ZXIuaWQgPSBfZmlsdGVySWQ7DQorICAgIGlmIChfZmlsdGVySWQgPT0gWFpfSURfRGVsdGEpDQorICAgIHsNCisgICAgICBib29sIGRlbHRhRGVmaW5lZCA9IGZhbHNlOw0KKyAgICAgIEZPUl9WRUNUT1IgKGosIF9maWx0ZXJNZXRob2QuUHJvcHMpDQorICAgICAgew0KKyAgICAgICAgY29uc3QgQ1Byb3AgJnByb3AgPSBfZmlsdGVyTWV0aG9kLlByb3BzW2pdOw0KKyAgICAgICAgaWYgKHByb3AuSWQgPT0gTkNvZGVyUHJvcElEOjprRGVmYXVsdFByb3AgJiYgcHJvcC5WYWx1ZS52dCA9PSBWVF9VSTQpDQorICAgICAgICB7DQorICAgICAgICAgIFVJbnQzMiBkZWx0YSA9IChVSW50MzIpcHJvcC5WYWx1ZS51bFZhbDsNCisgICAgICAgICAgaWYgKGRlbHRhIDwgMSB8fCBkZWx0YSA+IDI1NikNCisgICAgICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICAgICAgICBmaWx0ZXIuZGVsdGEgPSBkZWx0YTsNCisgICAgICAgICAgZGVsdGFEZWZpbmVkID0gdHJ1ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKCFkZWx0YURlZmluZWQpDQorICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICB9DQorICAgIFNSZXMgcmVzID0gWHpfRW5jb2RlKCZzZXFPdXRTdHJlYW0ucCwgJnNlcUluU3RyZWFtLnAsICZ4elByb3BzLCAmcHJvZ3Jlc3NXcmFwLnApOw0KKyAgICBpZiAocmVzID09IFNaX09LKQ0KKyAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjay0+U2V0T3BlcmF0aW9uUmVzdWx0KE5BcmNoaXZlOjpOVXBkYXRlOjpOT3BlcmF0aW9uUmVzdWx0OjprT0spOw0KKyAgICByZXR1cm4gU1Jlc1RvSFJFU1VMVChyZXMpOw0KKyAgfQ0KKyAgaWYgKGluZGV4SW5BcmNoaXZlICE9IDApDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICBpZiAoX3N0cmVhbSkNCisgICAgUklOT0soX3N0cmVhbS0+U2VlaygwLCBTVFJFQU1fU0VFS19TRVQsIE5VTEwpKTsNCisgIHJldHVybiBOQ29tcHJlc3M6OkNvcHlTdHJlYW0oX3N0cmVhbSwgb3V0U3RyZWFtLCBOVUxMKTsNCit9DQorDQorU1RETUVUSE9ESU1QIENIYW5kbGVyOjpTZXRQcm9wZXJ0aWVzKGNvbnN0IHdjaGFyX3QgKipuYW1lcywgY29uc3QgUFJPUFZBUklBTlQgKnZhbHVlcywgVUludDMyIG51bVByb3BzKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIEluaXQoKTsNCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtUHJvcHM7IGkrKykNCisgIHsNCisgICAgUklOT0soU2V0UHJvcGVydHkobmFtZXNbaV0sIHZhbHVlc1tpXSkpOw0KKyAgfQ0KKw0KKyAgaWYgKCFfZmlsdGVyTWV0aG9kLk1ldGhvZE5hbWUuSXNFbXB0eSgpKQ0KKyAgew0KKyAgICB1bnNpZ25lZCBrOw0KKyAgICBmb3IgKGsgPSAwOyBrIDwgQVJSQVlfU0laRShnX05hbWVQYWlycyk7IGsrKykNCisgICAgew0KKyAgICAgIGNvbnN0IENNZXRob2ROYW1lUGFpciAmcGFpciA9IGdfTmFtZVBhaXJzW2tdOw0KKyAgICAgIGlmIChTdHJpbmdzQXJlRXF1YWxOb0Nhc2VfQXNjaWkoX2ZpbHRlck1ldGhvZC5NZXRob2ROYW1lLCBwYWlyLk5hbWUpKQ0KKyAgICAgIHsNCisgICAgICAgIF9maWx0ZXJJZCA9IHBhaXIuSWQ7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGsgPT0gQVJSQVlfU0laRShnX05hbWVQYWlycykpDQorICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgIH0NCisNCisgIF9tZXRob2RzLkRlbGV0ZUZyb250YWwoR2V0TnVtRW1wdHlNZXRob2RzKCkpOw0KKyAgaWYgKF9tZXRob2RzLlNpemUoKSA+IDEpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICBpZiAoX21ldGhvZHMuU2l6ZSgpID09IDEpDQorICB7DQorICAgIFVTdHJpbmcgJm1ldGhvZE5hbWUgPSBfbWV0aG9kc1swXS5NZXRob2ROYW1lOw0KKyAgICBpZiAobWV0aG9kTmFtZS5Jc0VtcHR5KCkpDQorICAgICAgbWV0aG9kTmFtZSA9IGtfTFpNQTJfTmFtZTsNCisgICAgZWxzZSBpZiAoIW1ldGhvZE5hbWUuSXNFcXVhbFRvTm9DYXNlKGtfTFpNQTJfTmFtZSkpDQorICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgIH0NCisgIHJldHVybiBTX09LOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorI2VuZGlmDQorDQorSU1QX0NyZWF0ZUFyY0luDQorSU1QX0NyZWF0ZUFyY091dA0KKw0KK3N0YXRpYyBDQXJjSW5mbyBnX0FyY0luZm8gPQ0KKyAgeyAieHoiLCAieHogdHh6IiwgIiogLnRhciIsIDB4QywNCisgIDYsIHsgMHhGRCwgJzcnICwgJ3onLCAnWCcsICdaJywgMCB9LA0KKyAgMCwNCisgIE5BcmNJbmZvRmxhZ3M6OmtLZWVwTmFtZSwNCisgIFJFRl9DcmVhdGVBcmNfUGFpciB9Ow0KKw0KK1JFR0lTVEVSX0FSQyh4eikNCisNCit9fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQXNtLm1hayBiL2x6bWEvQ1BQLzd6aXAvQXNtLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDEyYjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Bc20ubWFrCkBAIC0wLDAgKzEsOSBAQAorIUlGREVGIEFTTV9PQkpTDQorIUlGICIkKENQVSkiID09ICJBUk0iDQorJChBU01fT0JKUyk6IC4uLy4uLy4uLy4uL0FzbS9Bcm0vJCgqQikuYXNtDQorCSQoQ09NUExfQVNNKQ0KKyFFTFNFSUYgIiQoQ1BVKSIgIT0gIklBNjQiICYmICIkKENQVSkiICE9ICJNSVBTIg0KKyQoQVNNX09CSlMpOiAuLi8uLi8uLi8uLi9Bc20veDg2LyQoKkIpLmFzbQ0KKwkkKENPTVBMX0FTTSkNCishRU5ESUYNCishRU5ESUYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvQWxvbmU3ei9BbG9uZS5kc3AgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvQWxvbmU3ei9BbG9uZS5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2YWQ3NAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9BbG9uZTd6L0Fsb25lLmRzcApAQCAtMCwwICsxLDE4MDEgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iQWxvbmUiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz1BbG9uZSAtIFdpbjMyIERlYnVnVQ0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiQWxvbmUubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIkFsb25lLm1hayIgQ0ZHPSJBbG9uZSAtIFdpbjMyIERlYnVnVSINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAiQWxvbmUgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJBbG9uZSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJBbG9uZSAtIFdpbjMyIFJlbGVhc2VVIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJBbG9uZSAtIFdpbjMyIERlYnVnVSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL0d6IC9NVCAvVzMgL0dYIC9PMSAvSSAiLi5cLi5cLi5cXCIgL0QgIk5ERUJVRyIgL0QgIl9NQkNTIiAvRCAiV0lOMzIiIC9EICJfQ09OU09MRSIgL1l1IlN0ZEFmeC5oIiAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQxOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQxOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NiAvb3V0OiJjOlxVVElMXDd6ci5leGUiIC9vcHQ6Tk9XSU45OA0KKyMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9HeiAvTURkIC9XMyAvR20gL0dYIC9aSSAvT2QgL0kgIi4uXC4uXC4uXFwiIC9EICJfREVCVUciIC9EICJfTUJDUyIgL0QgIldJTjMyIiAvRCAiX0NPTlNPTEUiIC9ZdSJTdGRBZnguaCIgL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDE5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDE5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJjOlxVVElMXDd6ci5leGUiIC9wZGJ0eXBlOnNlcHQNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBSZWxlYXNlVSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlVSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlVSINCisjIFBST1AgQkFTRSBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2VVIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlVSINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX0NPTlNPTEUiIC9EICJFWENMVURFX0NPTSIgL0QgIk5PX1JFR0lTVFJZIiAvWXUiU3RkQWZ4LmgiIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9HeiAvTUQgL1c0IC9HWCAvTzEgL0kgIi4uXC4uXC4uXFwiIC9EICJOREVCVUciIC9EICJVTklDT0RFIiAvRCAiX1VOSUNPREUiIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvWXUiU3RkQWZ4LmgiIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDE5IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDE5IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NiAvb3V0OiJjOlxVVElMXDd6YS5leGUiIC9vcHQ6Tk9XSU45OA0KKyMgU1VCVFJBQ1QgQkFTRSBMSU5LMzIgL3BkYjpub25lDQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYgL291dDoiYzpcVVRJTFw3enIuZXhlIiAvb3B0Ok5PV0lOOTgNCisjIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBEZWJ1Z1UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWdVIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnVSINCisjIFBST1AgQkFTRSBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnVSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWdVIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX0NPTlNPTEUiIC9EICJFWENMVURFX0NPTSIgL0QgIk5PX1JFR0lTVFJZIiAvRCAiX01CQ1MiIC9ZdSJTdGRBZnguaCIgL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9HeiAvTURkIC9XNCAvR20gL0dYIC9aSSAvT2QgL0kgIi4uXC4uXC4uXFwiIC9EICJfREVCVUciIC9EICJfVU5JQ09ERSIgL0QgIlVOSUNPREUiIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvWXUiU3RkQWZ4LmgiIC9GRCAvR1ogL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQxOSAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQxOSAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6ImM6XFVUSUxcN3phLmV4ZSIgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJjOlxVVElMXDd6ci5leGUiIC9wZGJ0eXBlOnNlcHQNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgIkFsb25lIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgIkFsb25lIC0gV2luMzIgRGVidWciDQorIyBOYW1lICJBbG9uZSAtIFdpbjMyIFJlbGVhc2VVIg0KKyMgTmFtZSAiQWxvbmUgLSBXaW4zMiBEZWJ1Z1UiDQorIyBCZWdpbiBHcm91cCAiQ29uc29sZSINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbnNvbGVcQXJFcnJvci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbnNvbGVcQmVuY2hDb24uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbnNvbGVcQmVuY2hDb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb25zb2xlXENvbXByZXNzaW9uTW9kZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbnNvbGVcQ29uc29sZUNsb3NlLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb25zb2xlXENvbnNvbGVDbG9zZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbnNvbGVcRXh0cmFjdENhbGxiYWNrQ29uc29sZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29uc29sZVxFeHRyYWN0Q2FsbGJhY2tDb25zb2xlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29uc29sZVxIYXNoQ29uLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb25zb2xlXEhhc2hDb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb25zb2xlXExpc3QuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbnNvbGVcTGlzdC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbnNvbGVcTWFpbi5jcHANCisjIEFERCBDUFAgL0QgIlBST0dfVkFSSUFOVF9SIg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb25zb2xlXE1haW5Bci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29uc29sZVxPcGVuQ2FsbGJhY2tDb25zb2xlLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb25zb2xlXE9wZW5DYWxsYmFja0NvbnNvbGUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb25zb2xlXFBlcmNlbnRQcmludGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb25zb2xlXFBlcmNlbnRQcmludGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29uc29sZVxVcGRhdGVDYWxsYmFja0NvbnNvbGUuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbnNvbGVcVXBkYXRlQ2FsbGJhY2tDb25zb2xlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29uc29sZVxVc2VySW5wdXRVdGlscy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29uc29sZVxVc2VySW5wdXRVdGlscy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlNwZWMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc291cmNlLnJjDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU3RkQWZ4LmNwcA0KKyMgQUREIENQUCAvWWMiU3RkQWZ4LmgiDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU3RkQWZ4LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiQ29tbW9uIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXEF1dG9QdHIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cQnVmZmVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXENvbW1hbmRMaW5lUGFyc2VyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cQ29tbWFuZExpbmVQYXJzZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cQ29tVHJ5LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXENSQy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXENyY1JlZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXERlZnMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cRHluYW1pY0J1ZmZlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxJbnRUb1N0cmluZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXEludFRvU3RyaW5nLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXExpc3RGaWxlVXRpbHMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxMaXN0RmlsZVV0aWxzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15Q29tLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15RXhjZXB0aW9uLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15R3VpZERlZi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxNeUluaXRHdWlkLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15U3RyaW5nLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cTXlTdHJpbmcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cTXlVbmtub3duLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15VmVjdG9yLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cTXlWZWN0b3IuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cTmV3SGFuZGxlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE5ld0hhbmRsZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cU2hhMjU2UmVnLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cU3RkSW5TdHJlYW0uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxTdGRJblN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxTdGRPdXRTdHJlYW0uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxTdGRPdXRTdHJlYW0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cU3RyaW5nQ29udmVydC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXFN0cmluZ0NvbnZlcnQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cU3RyaW5nVG9JbnQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxTdHJpbmdUb0ludC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxUeXBlcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxVVEZDb252ZXJ0LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cVVRGQ29udmVydC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxXaWxkY2FyZC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXFdpbGRjYXJkLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXFh6Q3JjNjRSZWcuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIldpbmRvd3MiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXERlZnMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXERldmljZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRExMLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXERMTC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRXJyb3JNc2cuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRXJyb3JNc2cuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXEZpbGVEaXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZURpci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZUZpbmQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZUZpbmQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXEZpbGVJTy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlSU8uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXEZpbGVMaW5rLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXEZpbGVNYXBwaW5nLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlTmFtZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlTmFtZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcSGFuZGxlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xNZW1vcnlMb2NrLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXE1lbW9yeUxvY2suaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFByb3BWYXJpYW50LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFByb3BWYXJpYW50LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xQcm9wVmFyaWFudENvbnYuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcUHJvcFZhcmlhbnRDb252LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xTeW5jaHJvbml6YXRpb24uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcU3luY2hyb25pemF0aW9uLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xTeXN0ZW0uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcU3lzdGVtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xUaHJlYWQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFRpbWVVdGlscy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xUaW1lVXRpbHMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICI3emlwIENvbW1vbiINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxDcmVhdGVDb2Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXENyZWF0ZUNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ3Jvc3NUaHJlYWRQcm9ncmVzcy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ3Jvc3NUaHJlYWRQcm9ncmVzcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxDV3JhcHBlcnMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxDV3JhcHBlcnMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cRmlsZVBhdGhBdXRvUmVuYW1lLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cRmlsZVBhdGhBdXRvUmVuYW1lLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEZpbGVTdHJlYW1zLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cRmlsZVN0cmVhbXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cRmlsdGVyQ29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxGaWx0ZXJDb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxJbkJ1ZmZlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEluQnVmZmVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEluT3V0VGVtcEJ1ZmZlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEluT3V0VGVtcEJ1ZmZlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxMaW1pdGVkU3RyZWFtcy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXExpbWl0ZWRTdHJlYW1zLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXExvY2tlZFN0cmVhbS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXExvY2tlZFN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxNZXRob2RJZC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXE1ldGhvZElkLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXE1ldGhvZFByb3BzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cTWV0aG9kUHJvcHMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cT2Zmc2V0U3RyZWFtLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cT2Zmc2V0U3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXE91dEJ1ZmZlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXE91dEJ1ZmZlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxQcm9ncmVzc1V0aWxzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cUHJvZ3Jlc3NVdGlscy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxQcm9wSWQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxSZWdpc3RlckFyYy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxSZWdpc3RlckNvZGVjLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXFN0cmVhbUJpbmRlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXFN0cmVhbUJpbmRlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxTdHJlYW1PYmplY3RzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cU3RyZWFtT2JqZWN0cy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxTdHJlYW1VdGlscy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXFN0cmVhbVV0aWxzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXFVuaXFCbG9ja3MuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxVbmlxQmxvY2tzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXFZpcnRUaHJlYWQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxWaXJ0VGhyZWFkLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiQ29tcHJlc3MiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xCY2oyQ29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEJjajJDb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEJjajJSZWdpc3Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcQmNqQ29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEJjakNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcQmNqUmVnaXN0ZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEJyYW5jaENvZGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xCcmFuY2hDb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEJyYW5jaE1pc2MuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEJyYW5jaE1pc2MuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xCcmFuY2hSZWdpc3Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcQnl0ZVN3YXAuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEJ5dGVTd2FwLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcQ29weUNvZGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xDb3B5Q29kZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xDb3B5UmVnaXN0ZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXERlbHRhRmlsdGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xMem1hMkRlY29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEx6bWEyRGVjb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEx6bWEyRW5jb2Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcTHptYTJFbmNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcTHptYTJSZWdpc3Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcTHptYURlY29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEx6bWFEZWNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcTHptYUVuY29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEx6bWFFbmNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcTHptYVJlZ2lzdGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xSYW5nZUNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcUmFuZ2VDb2RlckJpdC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkFyY2hpdmUiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBHcm91cCAiN3oiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6Q29tcHJlc3Npb25Nb2RlLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6Q29tcHJlc3Npb25Nb2RlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekRlY29kZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekRlY29kZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pFbmNvZGUuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pFbmNvZGUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6RXh0cmFjdC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekZvbGRlckluU3RyZWFtLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6Rm9sZGVySW5TdHJlYW0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6Rm9sZGVyT3V0U3RyZWFtLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6Rm9sZGVyT3V0U3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekhhbmRsZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pIYW5kbGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekhhbmRsZXJPdXQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pIZWFkZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pIZWFkZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6SW4uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pJbi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pJdGVtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ek91dC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ek91dC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pQcm9wZXJ0aWVzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6UHJvcGVydGllcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pSZWdpc3Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3elNwZWNTdHJlYW0uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pTcGVjU3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3elVwZGF0ZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3elVwZGF0ZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkFyY2hpdmUgQ29tbW9uIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ29kZXJNaXhlcjIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXENvZGVyTWl4ZXIyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ29kZXJNaXhlcjJNVC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ29kZXJNaXhlcjJNVC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXER1bW15T3V0U3RyZWFtLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxEdW1teU91dFN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXEhhbmRsZXJPdXQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXEhhbmRsZXJPdXQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxJblN0cmVhbVdpdGhDUkMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXEluU3RyZWFtV2l0aENSQy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXEl0ZW1OYW1lVXRpbHMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXEl0ZW1OYW1lVXRpbHMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxNdWx0aVN0cmVhbS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cTXVsdGlTdHJlYW0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxPdXRTdHJlYW1XaXRoQ1JDLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxPdXRTdHJlYW1XaXRoQ1JDLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cUGFyc2VQcm9wZXJ0aWVzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxQYXJzZVByb3BlcnRpZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcTHptYUhhbmRsZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcU3BsaXRIYW5kbGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXFh6SGFuZGxlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiVUkgQ29tbW9uIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEFyY2hpdmVDb21tYW5kTGluZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEFyY2hpdmVDb21tYW5kTGluZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxBcmNoaXZlRXh0cmFjdENhbGxiYWNrLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cQXJjaGl2ZUV4dHJhY3RDYWxsYmFjay5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxBcmNoaXZlT3BlbkNhbGxiYWNrLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cQXJjaGl2ZU9wZW5DYWxsYmFjay5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxCZW5jaC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEJlbmNoLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXERlZmF1bHROYW1lLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cRGVmYXVsdE5hbWUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cRW51bURpckl0ZW1zLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cRW51bURpckl0ZW1zLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEV4dHJhY3QuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxFeHRyYWN0LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEV4dHJhY3RpbmdGaWxlUGF0aC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEV4dHJhY3RpbmdGaWxlUGF0aC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxIYXNoQ2FsYy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEhhc2hDYWxjLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXExvYWRDb2RlY3MuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxMb2FkQ29kZWNzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXE9wZW5BcmNoaXZlLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cT3BlbkFyY2hpdmUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cUHJvcGVydHkuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cUHJvcElEVXRpbHMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxQcm9wSURVdGlscy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxTZXRQcm9wZXJ0aWVzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cU2V0UHJvcGVydGllcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxTb3J0VXRpbHMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxTb3J0VXRpbHMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cVGVtcEZpbGVzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cVGVtcEZpbGVzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXFVwZGF0ZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXFVwZGF0ZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxVcGRhdGVBY3Rpb24uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxVcGRhdGVBY3Rpb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cVXBkYXRlQ2FsbGJhY2suY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxVcGRhdGVDYWxsYmFjay5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxVcGRhdGVQYWlyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cVXBkYXRlUGFpci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxVcGRhdGVQcm9kdWNlLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cVXBkYXRlUHJvZHVjZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIjctemlwIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cSUNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cSU15VW5rbm93bi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXElQYXNzd29yZC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXElQcm9ncmVzcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXElTdHJlYW0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxQcm9wSUQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJDIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gR3JvdXAgIlh6Ig0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xTaGEyNTYuYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgUmVsZWFzZSINCisNCisjIEFERCBDUFAgL08yDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIFJlbGVhc2VVIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgRGVidWdVIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXFNoYTI1Ni5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcWHouYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgUmVsZWFzZSINCisNCisjIEFERCBDUFAgL08yDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIFJlbGVhc2VVIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgRGVidWdVIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXFh6LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xYekNyYzY0LmMNCisNCishSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBBREQgQ1BQIC9PMg0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgRGVidWciDQorDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBSZWxlYXNlVSINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIERlYnVnVSINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xYekNyYzY0LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xYekNyYzY0T3B0LmMNCisNCishSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBBREQgQ1BQIC9PMg0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgRGVidWciDQorDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBSZWxlYXNlVSINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIERlYnVnVSINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xYekRlYy5jDQorDQorIUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgQUREIENQUCAvTzINCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIERlYnVnIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgUmVsZWFzZVUiDQorDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBEZWJ1Z1UiDQorDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcWHpFbmMuYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgUmVsZWFzZSINCisNCisjIEFERCBDUFAgL08yDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIFJlbGVhc2VVIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgRGVidWdVIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXFh6RW5jLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xYekluLmMNCisNCishSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBBREQgQ1BQIC9PMg0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgRGVidWciDQorDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBSZWxlYXNlVSINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIERlYnVnVSINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXDd6Q3JjLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXDd6Q3JjLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1w3ekNyY09wdC5jDQorDQorIUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgQUREIENQUCAvTzINCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIERlYnVnIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgUmVsZWFzZVUiDQorDQorIyBBREQgQ1BQIC9PMg0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgRGVidWdVIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXDd6U3RyZWFtLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEFlcy5jDQorDQorIUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgQUREIENQUCAvTzINCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIERlYnVnIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgUmVsZWFzZVUiDQorDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBEZWJ1Z1UiDQorDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcQWVzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xBZXNPcHQuYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgUmVsZWFzZSINCisNCisjIEFERCBDUFAgL08yDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIFJlbGVhc2VVIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgRGVidWdVIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEFsbG9jLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEFsbG9jLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xCcmEuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcQnJhLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xCcmE4Ni5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xCcmFJQTY0LmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXENwdUFyY2guYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgUmVsZWFzZSINCisNCisjIEFERCBDUFAgL08yDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIFJlbGVhc2VVIg0KKw0KKyMgQUREIENQUCAvTzINCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIERlYnVnVSINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTkRJRiANCisNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xDcHVBcmNoLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xEZWx0YS5jDQorDQorIUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgQUREIENQUCAvTzINCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIERlYnVnIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgUmVsZWFzZVUiDQorDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBEZWJ1Z1UiDQorDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcRGVsdGEuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXElTdHJlYW0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6RmluZC5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xMekZpbmQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6RmluZE10LmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6RmluZE10LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xDb21wcmVzc1xMelxMekhhc2guaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6SGFzaC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcTHptYTJEZWMuYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgUmVsZWFzZSINCisNCisjIEFERCBDUFAgL08yDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIFJlbGVhc2VVIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgRGVidWdVIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6bWEyRGVjLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xMem1hMkVuYy5jDQorDQorIUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgQUREIENQUCAvTzINCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIERlYnVnIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgUmVsZWFzZVUiDQorDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBEZWJ1Z1UiDQorDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcTHptYTJFbmMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6bWFEZWMuYw0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgUmVsZWFzZSINCisNCisjIEFERCBDUFAgL08yDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIFJlbGVhc2VVIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgRGVidWdVIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVORElGIA0KKw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6bWFEZWMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6bWFFbmMuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcTHptYUVuYy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcTXRDb2Rlci5jDQorDQorIUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgQUREIENQUCAvTzINCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJBbG9uZSAtIFdpbjMyIERlYnVnIg0KKw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFsb25lIC0gV2luMzIgUmVsZWFzZVUiDQorDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiQWxvbmUgLSBXaW4zMiBEZWJ1Z1UiDQorDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisNCishRU5ESUYgDQorDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcTXRDb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcVGhyZWFkcy5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xUaHJlYWRzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xUeXBlcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkNyeXB0byINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENyeXB0b1w3ekFlcy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ3J5cHRvXDd6QWVzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ3J5cHRvXDd6QWVzUmVnaXN0ZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENyeXB0b1xNeUFlcy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ3J5cHRvXE15QWVzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ3J5cHRvXFJhbmRHZW4uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENyeXB0b1xSYW5kR2VuLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9BbG9uZTd6L0Fsb25lLmRzdyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9BbG9uZTd6L0Fsb25lLmRzdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzZhYWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Fsb25lN3ovQWxvbmUuZHN3CkBAIC0wLDAgKzEsMjkgQEAKK01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSENCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIkFsb25lIj0uXEFsb25lLmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitHbG9iYWw6DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTwzPg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvQWxvbmU3ei9TdGRBZnguY3BwIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Fsb25lN3ovU3RkQWZ4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmQzYjFmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Fsb25lN3ovU3RkQWZ4LmNwcApAQCAtMCwwICsxLDMgQEAKKy8vIFN0ZEFmeC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Fsb25lN3ovU3RkQWZ4LmggYi9sem1hL0NQUC83emlwL0J1bmRsZXMvQWxvbmU3ei9TdGRBZnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQ5YWMxCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Fsb25lN3ovU3RkQWZ4LmgKQEAgLTAsMCArMSw4IEBACisvLyBTdGRBZnguaA0KKw0KKyNpZm5kZWYgX19TVERBRlhfSA0KKyNkZWZpbmUgX19TVERBRlhfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vQ29tbW9uLmgiDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Fsb25lN3ovbWFrZWZpbGUgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvQWxvbmU3ei9tYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjhhNDJlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Fsb25lN3ovbWFrZWZpbGUKQEAgLTAsMCArMSwxNTQgQEAKK1BST0cgPSA3enIuZXhlDQorTVlfQ09OU09MRSA9IDENCitDRkxBR1MgPSAkKENGTEFHUykgLURQUk9HX1ZBUklBTlRfUg0KKw0KKyFJRk5ERUYgVU5ERVJfQ0UNCitDRkxBR1MgPSAkKENGTEFHUykgLURXSU5fTE9OR19QQVRIDQorIUVORElGDQorDQorQ09NTU9OX09CSlMgPSBcDQorICAkT1xDb21tYW5kTGluZVBhcnNlci5vYmogXA0KKyAgJE9cQ1JDLm9iaiBcDQorICAkT1xDcmNSZWcub2JqIFwNCisgICRPXEludFRvU3RyaW5nLm9iaiBcDQorICAkT1xMaXN0RmlsZVV0aWxzLm9iaiBcDQorICAkT1xOZXdIYW5kbGVyLm9iaiBcDQorICAkT1xTdGRJblN0cmVhbS5vYmogXA0KKyAgJE9cU3RkT3V0U3RyZWFtLm9iaiBcDQorICAkT1xNeVN0cmluZy5vYmogXA0KKyAgJE9cU2hhMjU2UmVnLm9iaiBcDQorICAkT1xTdHJpbmdDb252ZXJ0Lm9iaiBcDQorICAkT1xTdHJpbmdUb0ludC5vYmogXA0KKyAgJE9cVVRGQ29udmVydC5vYmogXA0KKyAgJE9cTXlWZWN0b3Iub2JqIFwNCisgICRPXFdpbGRjYXJkLm9iaiBcDQorICAkT1xYekNyYzY0UmVnLm9iaiBcDQorDQorV0lOX09CSlMgPSBcDQorICAkT1xETEwub2JqIFwNCisgICRPXEVycm9yTXNnLm9iaiBcDQorICAkT1xGaWxlRGlyLm9iaiBcDQorICAkT1xGaWxlRmluZC5vYmogXA0KKyAgJE9cRmlsZUlPLm9iaiBcDQorICAkT1xGaWxlTGluay5vYmogXA0KKyAgJE9cRmlsZU5hbWUub2JqIFwNCisgICRPXE1lbW9yeUxvY2sub2JqIFwNCisgICRPXFByb3BWYXJpYW50Lm9iaiBcDQorICAkT1xQcm9wVmFyaWFudENvbnYub2JqIFwNCisgICRPXFN5bmNocm9uaXphdGlvbi5vYmogXA0KKyAgJE9cU3lzdGVtLm9iaiBcDQorICAkT1xUaW1lVXRpbHMub2JqIFwNCisNCis3WklQX0NPTU1PTl9PQkpTID0gXA0KKyAgJE9cQ3JlYXRlQ29kZXIub2JqIFwNCisgICRPXENXcmFwcGVycy5vYmogXA0KKyAgJE9cRmlsZVBhdGhBdXRvUmVuYW1lLm9iaiBcDQorICAkT1xGaWxlU3RyZWFtcy5vYmogXA0KKyAgJE9cSW5CdWZmZXIub2JqIFwNCisgICRPXEluT3V0VGVtcEJ1ZmZlci5vYmogXA0KKyAgJE9cRmlsdGVyQ29kZXIub2JqIFwNCisgICRPXExpbWl0ZWRTdHJlYW1zLm9iaiBcDQorICAkT1xMb2NrZWRTdHJlYW0ub2JqIFwNCisgICRPXE1ldGhvZElkLm9iaiBcDQorICAkT1xNZXRob2RQcm9wcy5vYmogXA0KKyAgJE9cT2Zmc2V0U3RyZWFtLm9iaiBcDQorICAkT1xPdXRCdWZmZXIub2JqIFwNCisgICRPXFByb2dyZXNzVXRpbHMub2JqIFwNCisgICRPXFByb3BJZC5vYmogXA0KKyAgJE9cU3RyZWFtQmluZGVyLm9iaiBcDQorICAkT1xTdHJlYW1PYmplY3RzLm9iaiBcDQorICAkT1xTdHJlYW1VdGlscy5vYmogXA0KKyAgJE9cVW5pcUJsb2Nrcy5vYmogXA0KKyAgJE9cVmlydFRocmVhZC5vYmogXA0KKw0KK0FSX09CSlMgPSBcDQorICAkT1xMem1hSGFuZGxlci5vYmogXA0KKyAgJE9cU3BsaXRIYW5kbGVyLm9iaiBcDQorICAkT1xYekhhbmRsZXIub2JqIFwNCisNCitBUl9DT01NT05fT0JKUyA9IFwNCisgICRPXENvZGVyTWl4ZXIyLm9iaiBcDQorICAkT1xDb2Rlck1peGVyMk1ULm9iaiBcDQorICAkT1xDcm9zc1RocmVhZFByb2dyZXNzLm9iaiBcDQorICAkT1xEdW1teU91dFN0cmVhbS5vYmogXA0KKyAgJE9cSGFuZGxlck91dC5vYmogXA0KKyAgJE9cSW5TdHJlYW1XaXRoQ1JDLm9iaiBcDQorICAkT1xJdGVtTmFtZVV0aWxzLm9iaiBcDQorICAkT1xNdWx0aVN0cmVhbS5vYmogXA0KKyAgJE9cT3V0U3RyZWFtV2l0aENSQy5vYmogXA0KKyAgJE9cUGFyc2VQcm9wZXJ0aWVzLm9iaiBcDQorDQorDQorN1pfT0JKUyA9IFwNCisgICRPXDd6Q29tcHJlc3Npb25Nb2RlLm9iaiBcDQorICAkT1w3ekRlY29kZS5vYmogXA0KKyAgJE9cN3pFbmNvZGUub2JqIFwNCisgICRPXDd6RXh0cmFjdC5vYmogXA0KKyAgJE9cN3pGb2xkZXJJblN0cmVhbS5vYmogXA0KKyAgJE9cN3pGb2xkZXJPdXRTdHJlYW0ub2JqIFwNCisgICRPXDd6SGFuZGxlci5vYmogXA0KKyAgJE9cN3pIYW5kbGVyT3V0Lm9iaiBcDQorICAkT1w3ekhlYWRlci5vYmogXA0KKyAgJE9cN3pJbi5vYmogXA0KKyAgJE9cN3pPdXQub2JqIFwNCisgICRPXDd6UHJvcGVydGllcy5vYmogXA0KKyAgJE9cN3pSZWdpc3Rlci5vYmogXA0KKyAgJE9cN3pTcGVjU3RyZWFtLm9iaiBcDQorICAkT1w3elVwZGF0ZS5vYmogXA0KKw0KK0NPTVBSRVNTX09CSlMgPSBcDQorICAkT1xCY2oyQ29kZXIub2JqIFwNCisgICRPXEJjajJSZWdpc3Rlci5vYmogXA0KKyAgJE9cQmNqQ29kZXIub2JqIFwNCisgICRPXEJjalJlZ2lzdGVyLm9iaiBcDQorICAkT1xCcmFuY2hDb2Rlci5vYmogXA0KKyAgJE9cQnJhbmNoTWlzYy5vYmogXA0KKyAgJE9cQnJhbmNoUmVnaXN0ZXIub2JqIFwNCisgICRPXEJ5dGVTd2FwLm9iaiBcDQorICAkT1xDb3B5Q29kZXIub2JqIFwNCisgICRPXENvcHlSZWdpc3Rlci5vYmogXA0KKyAgJE9cRGVsdGFGaWx0ZXIub2JqIFwNCisgICRPXEx6bWEyRGVjb2Rlci5vYmogXA0KKyAgJE9cTHptYTJFbmNvZGVyLm9iaiBcDQorICAkT1xMem1hMlJlZ2lzdGVyLm9iaiBcDQorICAkT1xMem1hRGVjb2Rlci5vYmogXA0KKyAgJE9cTHptYUVuY29kZXIub2JqIFwNCisgICRPXEx6bWFSZWdpc3Rlci5vYmogXA0KKw0KK0NSWVBUT19PQkpTID0gXA0KKyAgJE9cN3pBZXMub2JqIFwNCisgICRPXDd6QWVzUmVnaXN0ZXIub2JqIFwNCisgICRPXE15QWVzLm9iaiBcDQorICAkT1xNeUFlc1JlZy5vYmogXA0KKyAgJE9cUmFuZEdlbi5vYmogXA0KKw0KK0NfT0JKUyA9IFwNCisgICRPXDd6U3RyZWFtLm9iaiBcDQorICAkT1xBbGxvYy5vYmogXA0KKyAgJE9cQnJhLm9iaiBcDQorICAkT1xCcmE4Ni5vYmogXA0KKyAgJE9cQnJhSUE2NC5vYmogXA0KKyAgJE9cQ3B1QXJjaC5vYmogXA0KKyAgJE9cRGVsdGEub2JqIFwNCisgICRPXEx6RmluZC5vYmogXA0KKyAgJE9cTHpGaW5kTXQub2JqIFwNCisgICRPXEx6bWEyRGVjLm9iaiBcDQorICAkT1xMem1hMkVuYy5vYmogXA0KKyAgJE9cTHptYURlYy5vYmogXA0KKyAgJE9cTHptYUVuYy5vYmogXA0KKyAgJE9cTXRDb2Rlci5vYmogXA0KKyAgJE9cU2hhMjU2Lm9iaiBcDQorICAkT1xTb3J0Lm9iaiBcDQorICAkT1xUaHJlYWRzLm9iaiBcDQorICAkT1xYei5vYmogXA0KKyAgJE9cWHpEZWMub2JqIFwNCisgICRPXFh6RW5jLm9iaiBcDQorICAkT1xYekluLm9iaiBcDQorDQorIWluY2x1ZGUgIi4uLy4uL1VJL0NvbnNvbGUvQ29uc29sZS5tYWsiDQorDQorIWluY2x1ZGUgIi4uLy4uL0Flcy5tYWsiDQorIWluY2x1ZGUgIi4uLy4uL0NyYy5tYWsiDQorIWluY2x1ZGUgIi4uLy4uL0NyYzY0Lm1hayINCisNCishaW5jbHVkZSAiLi4vLi4vN3ppcC5tYWsiDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Fsb25lN3ovcmVzb3VyY2UucmMgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvQWxvbmU3ei9yZXNvdXJjZS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmUwOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Fsb25lN3ovcmVzb3VyY2UucmMKQEAgLTAsMCArMSwzIEBACisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vQy83elZlcnNpb24ucmMiDQorDQorTVlfVkVSU0lPTl9JTkZPX0FQUCgiNy1aaXAgUmVkdWNlZCBTdGFuZGFsb25lIENvbnNvbGUiLCAiN3pyIikNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvRm9ybWF0N3pFeHRyYWN0Ui9TdGRBZnguY3BwIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Zvcm1hdDd6RXh0cmFjdFIvU3RkQWZ4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmQzYjFmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Zvcm1hdDd6RXh0cmFjdFIvU3RkQWZ4LmNwcApAQCAtMCwwICsxLDMgQEAKKy8vIFN0ZEFmeC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Zvcm1hdDd6RXh0cmFjdFIvU3RkQWZ4LmggYi9sem1hL0NQUC83emlwL0J1bmRsZXMvRm9ybWF0N3pFeHRyYWN0Ui9TdGRBZnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQ5YWMxCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Zvcm1hdDd6RXh0cmFjdFIvU3RkQWZ4LmgKQEAgLTAsMCArMSw4IEBACisvLyBTdGRBZnguaA0KKw0KKyNpZm5kZWYgX19TVERBRlhfSA0KKyNkZWZpbmUgX19TVERBRlhfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vQ29tbW9uLmgiDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Zvcm1hdDd6RXh0cmFjdFIvbWFrZWZpbGUgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvRm9ybWF0N3pFeHRyYWN0Ui9tYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjJmNTgxCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Zvcm1hdDd6RXh0cmFjdFIvbWFrZWZpbGUKQEAgLTAsMCArMSw5NyBAQAorUFJPRyA9IDd6eHIuZGxsDQorREVGX0ZJTEUgPSAuLi8uLi9BcmNoaXZlL0FyY2hpdmUyLmRlZg0KK0NGTEFHUyA9ICQoQ0ZMQUdTKSBcDQorICAtREVYVFJBQ1RfT05MWSBcDQorICAtRF9OT19DUllQVE8NCisNCitDT01NT05fT0JKUyA9IFwNCisgICRPXENSQy5vYmogXA0KKyAgJE9cQ3JjUmVnLm9iaiBcDQorICAkT1xJbnRUb1N0cmluZy5vYmogXA0KKyAgJE9cTmV3SGFuZGxlci5vYmogXA0KKyAgJE9cTXlTdHJpbmcub2JqIFwNCisgICRPXFN0cmluZ0NvbnZlcnQub2JqIFwNCisgICRPXFN0cmluZ1RvSW50Lm9iaiBcDQorICAkT1xNeVZlY3Rvci5vYmogXA0KKyAgJE9cV2lsZGNhcmQub2JqIFwNCisNCitXSU5fT0JKUyA9IFwNCisgICRPXFByb3BWYXJpYW50Lm9iaiBcDQorICAkT1xTeW5jaHJvbml6YXRpb24ub2JqIFwNCisgICRPXFN5c3RlbS5vYmogXA0KKw0KKzdaSVBfQ09NTU9OX09CSlMgPSBcDQorICAkT1xDcmVhdGVDb2Rlci5vYmogXA0KKyAgJE9cQ1dyYXBwZXJzLm9iaiBcDQorICAkT1xJbkJ1ZmZlci5vYmogXA0KKyAgJE9cRmlsdGVyQ29kZXIub2JqIFwNCisgICRPXExpbWl0ZWRTdHJlYW1zLm9iaiBcDQorICAkT1xMb2NrZWRTdHJlYW0ub2JqIFwNCisgICRPXE1ldGhvZElkLm9iaiBcDQorICAkT1xNZXRob2RQcm9wcy5vYmogXA0KKyAgJE9cT3V0QnVmZmVyLm9iaiBcDQorICAkT1xQcm9ncmVzc1V0aWxzLm9iaiBcDQorICAkT1xQcm9wSWQub2JqIFwNCisgICRPXFN0cmVhbUJpbmRlci5vYmogXA0KKyAgJE9cU3RyZWFtT2JqZWN0cy5vYmogXA0KKyAgJE9cU3RyZWFtVXRpbHMub2JqIFwNCisgICRPXFZpcnRUaHJlYWQub2JqIFwNCisNCitBUl9PQkpTID0gXA0KKyAgJE9cQXJjaGl2ZUV4cG9ydHMub2JqIFwNCisgICRPXERsbEV4cG9ydHMyLm9iaiBcDQorDQorQVJfQ09NTU9OX09CSlMgPSBcDQorICAkT1xDb2Rlck1peGVyMi5vYmogXA0KKyAgJE9cQ29kZXJNaXhlcjJNVC5vYmogXA0KKyAgJE9cQ3Jvc3NUaHJlYWRQcm9ncmVzcy5vYmogXA0KKyAgJE9cSGFuZGxlck91dC5vYmogXA0KKyAgJE9cSXRlbU5hbWVVdGlscy5vYmogXA0KKyAgJE9cT3V0U3RyZWFtV2l0aENSQy5vYmogXA0KKyAgJE9cUGFyc2VQcm9wZXJ0aWVzLm9iaiBcDQorDQorDQorN1pfT0JKUyA9IFwNCisgICRPXDd6Q29tcHJlc3Npb25Nb2RlLm9iaiBcDQorICAkT1w3ekRlY29kZS5vYmogXA0KKyAgJE9cN3pFeHRyYWN0Lm9iaiBcDQorICAkT1w3ekZvbGRlck91dFN0cmVhbS5vYmogXA0KKyAgJE9cN3pIYW5kbGVyLm9iaiBcDQorICAkT1w3ekhlYWRlci5vYmogXA0KKyAgJE9cN3pJbi5vYmogXA0KKyAgJE9cN3pQcm9wZXJ0aWVzLm9iaiBcDQorICAkT1w3elJlZ2lzdGVyLm9iaiBcDQorDQorDQorQ09NUFJFU1NfT0JKUyA9IFwNCisgICRPXENvZGVjRXhwb3J0cy5vYmogXA0KKyAgJE9cQmNqMkNvZGVyLm9iaiBcDQorICAkT1xCY2oyUmVnaXN0ZXIub2JqIFwNCisgICRPXEJjakNvZGVyLm9iaiBcDQorICAkT1xCY2pSZWdpc3Rlci5vYmogXA0KKyAgJE9cQnJhbmNoQ29kZXIub2JqIFwNCisgICRPXEJyYW5jaE1pc2Mub2JqIFwNCisgICRPXEJyYW5jaFJlZ2lzdGVyLm9iaiBcDQorICAkT1xCeXRlU3dhcC5vYmogXA0KKyAgJE9cQ29weUNvZGVyLm9iaiBcDQorICAkT1xDb3B5UmVnaXN0ZXIub2JqIFwNCisgICRPXERlbHRhRmlsdGVyLm9iaiBcDQorICAkT1xMem1hMkRlY29kZXIub2JqIFwNCisgICRPXEx6bWEyUmVnaXN0ZXIub2JqIFwNCisgICRPXEx6bWFEZWNvZGVyLm9iaiBcDQorICAkT1xMem1hUmVnaXN0ZXIub2JqIFwNCisNCitDX09CSlMgPSBcDQorICAkT1xBbGxvYy5vYmogXA0KKyAgJE9cQnJhLm9iaiBcDQorICAkT1xCcmE4Ni5vYmogXA0KKyAgJE9cQnJhSUE2NC5vYmogXA0KKyAgJE9cQ3B1QXJjaC5vYmogXA0KKyAgJE9cRGVsdGEub2JqIFwNCisgICRPXEx6bWEyRGVjLm9iaiBcDQorICAkT1xMem1hRGVjLm9iaiBcDQorICAkT1xUaHJlYWRzLm9iaiBcDQorDQorIWluY2x1ZGUgIi4uLy4uL0NyYy5tYWsiDQorDQorIWluY2x1ZGUgIi4uLy4uLzd6aXAubWFrIg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Gb3JtYXQ3ekV4dHJhY3RSL3Jlc291cmNlLnJjIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Zvcm1hdDd6RXh0cmFjdFIvcmVzb3VyY2UucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjMDJhNgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Gb3JtYXQ3ekV4dHJhY3RSL3Jlc291cmNlLnJjCkBAIC0wLDAgKzEsNSBAQAorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL0MvN3pWZXJzaW9uLnJjIg0KKw0KK01ZX1ZFUlNJT05fSU5GT19ETEwoIjd6IEV4dHJhY3RpbmcgUmVkdWNlZCBTdGFuZGFsb25lIFBsdWdpbiIsICI3enhyIikNCisNCisxMDEgIElDT04gICIuLi8uLi9BcmNoaXZlL0ljb25zLzd6LmljbyINCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvRm9ybWF0N3pSL1N0ZEFmeC5jcHAgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvRm9ybWF0N3pSL1N0ZEFmeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkM2IxZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Gb3JtYXQ3elIvU3RkQWZ4LmNwcApAQCAtMCwwICsxLDMgQEAKKy8vIFN0ZEFmeC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Zvcm1hdDd6Ui9TdGRBZnguaCBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Gb3JtYXQ3elIvU3RkQWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkOWFjMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Gb3JtYXQ3elIvU3RkQWZ4LmgKQEAgLTAsMCArMSw4IEBACisvLyBTdGRBZnguaA0KKw0KKyNpZm5kZWYgX19TVERBRlhfSA0KKyNkZWZpbmUgX19TVERBRlhfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vQ29tbW9uLmgiDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Zvcm1hdDd6Ui9tYWtlZmlsZSBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Gb3JtYXQ3elIvbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4ODVjMAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Gb3JtYXQ3elIvbWFrZWZpbGUKQEAgLTAsMCArMSwxMTYgQEAKK1BST0cgPSA3enJhLmRsbA0KK0RFRl9GSUxFID0gLi4vLi4vQXJjaGl2ZS9BcmNoaXZlMi5kZWYNCitDRkxBR1MgPSAkKENGTEFHUykgXA0KKyAgLURfTk9fQ1JZUFRPDQorDQorQ09NTU9OX09CSlMgPSBcDQorICAkT1xDUkMub2JqIFwNCisgICRPXENyY1JlZy5vYmogXA0KKyAgJE9cSW50VG9TdHJpbmcub2JqIFwNCisgICRPXE5ld0hhbmRsZXIub2JqIFwNCisgICRPXE15U3RyaW5nLm9iaiBcDQorICAkT1xTdHJpbmdDb252ZXJ0Lm9iaiBcDQorICAkT1xTdHJpbmdUb0ludC5vYmogXA0KKyAgJE9cTXlWZWN0b3Iub2JqIFwNCisgICRPXFdpbGRjYXJkLm9iaiBcDQorDQorV0lOX09CSlMgPSBcDQorICAkT1xGaWxlRGlyLm9iaiBcDQorICAkT1xGaWxlRmluZC5vYmogXA0KKyAgJE9cRmlsZUlPLm9iaiBcDQorICAkT1xGaWxlTmFtZS5vYmogXA0KKyAgJE9cUHJvcFZhcmlhbnQub2JqIFwNCisgICRPXFN5bmNocm9uaXphdGlvbi5vYmogXA0KKyAgJE9cU3lzdGVtLm9iaiBcDQorDQorN1pJUF9DT01NT05fT0JKUyA9IFwNCisgICRPXENyZWF0ZUNvZGVyLm9iaiBcDQorICAkT1xDV3JhcHBlcnMub2JqIFwNCisgICRPXEluQnVmZmVyLm9iaiBcDQorICAkT1xJbk91dFRlbXBCdWZmZXIub2JqIFwNCisgICRPXEZpbHRlckNvZGVyLm9iaiBcDQorICAkT1xMaW1pdGVkU3RyZWFtcy5vYmogXA0KKyAgJE9cTG9ja2VkU3RyZWFtLm9iaiBcDQorICAkT1xNZXRob2RJZC5vYmogXA0KKyAgJE9cTWV0aG9kUHJvcHMub2JqIFwNCisgICRPXE91dEJ1ZmZlci5vYmogXA0KKyAgJE9cUHJvZ3Jlc3NVdGlscy5vYmogXA0KKyAgJE9cUHJvcElkLm9iaiBcDQorICAkT1xTdHJlYW1CaW5kZXIub2JqIFwNCisgICRPXFN0cmVhbU9iamVjdHMub2JqIFwNCisgICRPXFN0cmVhbVV0aWxzLm9iaiBcDQorICAkT1xVbmlxQmxvY2tzLm9iaiBcDQorICAkT1xWaXJ0VGhyZWFkLm9iaiBcDQorDQorQVJfT0JKUyA9IFwNCisgICRPXEFyY2hpdmVFeHBvcnRzLm9iaiBcDQorICAkT1xEbGxFeHBvcnRzMi5vYmogXA0KKw0KK0FSX0NPTU1PTl9PQkpTID0gXA0KKyAgJE9cQ29kZXJNaXhlcjIub2JqIFwNCisgICRPXENvZGVyTWl4ZXIyTVQub2JqIFwNCisgICRPXENyb3NzVGhyZWFkUHJvZ3Jlc3Mub2JqIFwNCisgICRPXEhhbmRsZXJPdXQub2JqIFwNCisgICRPXEluU3RyZWFtV2l0aENSQy5vYmogXA0KKyAgJE9cSXRlbU5hbWVVdGlscy5vYmogXA0KKyAgJE9cT3V0U3RyZWFtV2l0aENSQy5vYmogXA0KKyAgJE9cUGFyc2VQcm9wZXJ0aWVzLm9iaiBcDQorDQorDQorN1pfT0JKUyA9IFwNCisgICRPXDd6Q29tcHJlc3Npb25Nb2RlLm9iaiBcDQorICAkT1w3ekRlY29kZS5vYmogXA0KKyAgJE9cN3pFbmNvZGUub2JqIFwNCisgICRPXDd6RXh0cmFjdC5vYmogXA0KKyAgJE9cN3pGb2xkZXJJblN0cmVhbS5vYmogXA0KKyAgJE9cN3pGb2xkZXJPdXRTdHJlYW0ub2JqIFwNCisgICRPXDd6SGFuZGxlci5vYmogXA0KKyAgJE9cN3pIYW5kbGVyT3V0Lm9iaiBcDQorICAkT1w3ekhlYWRlci5vYmogXA0KKyAgJE9cN3pJbi5vYmogXA0KKyAgJE9cN3pPdXQub2JqIFwNCisgICRPXDd6UHJvcGVydGllcy5vYmogXA0KKyAgJE9cN3pTcGVjU3RyZWFtLm9iaiBcDQorICAkT1w3elVwZGF0ZS5vYmogXA0KKyAgJE9cN3pSZWdpc3Rlci5vYmogXA0KKw0KKw0KK0NPTVBSRVNTX09CSlMgPSBcDQorICAkT1xDb2RlY0V4cG9ydHMub2JqIFwNCisgICRPXEJjajJDb2Rlci5vYmogXA0KKyAgJE9cQmNqMlJlZ2lzdGVyLm9iaiBcDQorICAkT1xCY2pDb2Rlci5vYmogXA0KKyAgJE9cQmNqUmVnaXN0ZXIub2JqIFwNCisgICRPXEJyYW5jaENvZGVyLm9iaiBcDQorICAkT1xCcmFuY2hNaXNjLm9iaiBcDQorICAkT1xCcmFuY2hSZWdpc3Rlci5vYmogXA0KKyAgJE9cQnl0ZVN3YXAub2JqIFwNCisgICRPXENvcHlDb2Rlci5vYmogXA0KKyAgJE9cQ29weVJlZ2lzdGVyLm9iaiBcDQorICAkT1xEZWx0YUZpbHRlci5vYmogXA0KKyAgJE9cTHptYTJEZWNvZGVyLm9iaiBcDQorICAkT1xMem1hMkVuY29kZXIub2JqIFwNCisgICRPXEx6bWEyUmVnaXN0ZXIub2JqIFwNCisgICRPXEx6bWFEZWNvZGVyLm9iaiBcDQorICAkT1xMem1hRW5jb2Rlci5vYmogXA0KKyAgJE9cTHptYVJlZ2lzdGVyLm9iaiBcDQorDQorQ19PQkpTID0gXA0KKyAgJE9cQWxsb2Mub2JqIFwNCisgICRPXEJyYS5vYmogXA0KKyAgJE9cQnJhODYub2JqIFwNCisgICRPXEJyYUlBNjQub2JqIFwNCisgICRPXENwdUFyY2gub2JqIFwNCisgICRPXERlbHRhLm9iaiBcDQorICAkT1xMekZpbmQub2JqIFwNCisgICRPXEx6RmluZE10Lm9iaiBcDQorICAkT1xMem1hMkRlYy5vYmogXA0KKyAgJE9cTHptYTJFbmMub2JqIFwNCisgICRPXEx6bWFEZWMub2JqIFwNCisgICRPXEx6bWFFbmMub2JqIFwNCisgICRPXE10Q29kZXIub2JqIFwNCisgICRPXFRocmVhZHMub2JqIFwNCisNCishaW5jbHVkZSAiLi4vLi4vQ3JjLm1hayINCisNCishaW5jbHVkZSAiLi4vLi4vN3ppcC5tYWsiDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0Zvcm1hdDd6Ui9yZXNvdXJjZS5yYyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Gb3JtYXQ3elIvcmVzb3VyY2UucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyMTI1YwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Gb3JtYXQ3elIvcmVzb3VyY2UucmMKQEAgLTAsMCArMSw1IEBACisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vQy83elZlcnNpb24ucmMiDQorDQorTVlfVkVSU0lPTl9JTkZPX0RMTCgiN3ogUmVkdWNlZCBTdGFuZGFsb25lIFBsdWdpbiIsICI3enIiKQ0KKw0KKzEwMSAgSUNPTiAgIi4uLy4uL0FyY2hpdmUvSWNvbnMvN3ouaWNvIg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Mem1hQ29uL0x6bWFBbG9uZS5jcHAgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvTHptYUNvbi9Mem1hQWxvbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3N2ZiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvTHptYUNvbi9Mem1hQWxvbmUuY3BwCkBAIC0wLDAgKzEsNTcxIEBACisvLyBMem1hQWxvbmUuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKw0KKyNpZiAoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKE1TRE9TKSkgJiYgIWRlZmluZWQoVU5ERVJfQ0UpDQorI2luY2x1ZGUgPGZjbnRsLmg+DQorI2luY2x1ZGUgPGlvLmg+DQorI2RlZmluZSBNWV9TRVRfQklOQVJZX01PREUoZmlsZSkgX3NldG1vZGUoX2ZpbGVubyhmaWxlKSwgT19CSU5BUlkpDQorI2Vsc2UNCisjZGVmaW5lIE1ZX1NFVF9CSU5BUllfTU9ERShmaWxlKQ0KKyNlbmRpZg0KKw0KKy8vICNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlXaW5kb3dzLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeUluaXRHdWlkLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL0MvN3pWZXJzaW9uLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL0MvQWxsb2MuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vQy9Mem1hODYuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9OdENoZWNrLmgiDQorDQorI2lmbmRlZiBfN1pJUF9TVA0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1N5c3RlbS5oIg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vQ29tbWFuZExpbmVQYXJzZXIuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ1RvSW50LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9GaWxlU3RyZWFtcy5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vU3RyZWFtVXRpbHMuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tcHJlc3MvTHptYURlY29kZXIuaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tcHJlc3MvTHptYUVuY29kZXIuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vVUkvQ29uc29sZS9CZW5jaENvbi5oIg0KKw0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOQ29tbWFuZExpbmVQYXJzZXI7DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtDYW50QWxsb2NhdGUgPSAiQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprUmVhZEVycm9yID0gIlJlYWQgZXJyb3IiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprV3JpdGVFcnJvciA9ICJXcml0ZSBlcnJvciI7DQorDQorbmFtZXNwYWNlIE5LZXkgew0KK2VudW0gRW51bQ0KK3sNCisgIGtIZWxwMSA9IDAsDQorICBrSGVscDIsDQorICBrTWV0aG9kLA0KKyAga0xldmVsLA0KKyAga0FsZ28sDQorICBrRGljdCwNCisgIGtGYiwNCisgIGtNYywNCisgIGtMYywNCisgIGtMcCwNCisgIGtQYiwNCisgIGtNYXRjaEZpbmRlciwNCisgIGtNdWx0aVRocmVhZCwNCisgIGtFT1MsDQorICBrU3RkSW4sDQorICBrU3RkT3V0LA0KKyAga0ZpbHRlcjg2DQorfTsNCit9DQorDQorc3RhdGljIGNvbnN0IENTd2l0Y2hGb3JtIGtTd2l0Y2hGb3Jtc1tdID0NCit7DQorICB7ICI/IiwgIE5Td2l0Y2hUeXBlOjprU2ltcGxlLCBmYWxzZSB9LA0KKyAgeyAiSCIsICBOU3dpdGNoVHlwZTo6a1NpbXBsZSwgZmFsc2UgfSwNCisgIHsgIk1NIiwgTlN3aXRjaFR5cGU6OmtTdHJpbmcsIGZhbHNlLCAxIH0sDQorICB7ICJYIiwgTlN3aXRjaFR5cGU6OmtTdHJpbmcsIGZhbHNlLCAxIH0sDQorICB7ICJBIiwgTlN3aXRjaFR5cGU6OmtTdHJpbmcsIGZhbHNlLCAxIH0sDQorICB7ICJEIiwgTlN3aXRjaFR5cGU6OmtTdHJpbmcsIGZhbHNlLCAxIH0sDQorICB7ICJGQiIsIE5Td2l0Y2hUeXBlOjprU3RyaW5nLCBmYWxzZSwgMSB9LA0KKyAgeyAiTUMiLCBOU3dpdGNoVHlwZTo6a1N0cmluZywgZmFsc2UsIDEgfSwNCisgIHsgIkxDIiwgTlN3aXRjaFR5cGU6OmtTdHJpbmcsIGZhbHNlLCAxIH0sDQorICB7ICJMUCIsIE5Td2l0Y2hUeXBlOjprU3RyaW5nLCBmYWxzZSwgMSB9LA0KKyAgeyAiUEIiLCBOU3dpdGNoVHlwZTo6a1N0cmluZywgZmFsc2UsIDEgfSwNCisgIHsgIk1GIiwgTlN3aXRjaFR5cGU6OmtTdHJpbmcsIGZhbHNlLCAxIH0sDQorICB7ICJNVCIsIE5Td2l0Y2hUeXBlOjprU3RyaW5nLCBmYWxzZSwgMCB9LA0KKyAgeyAiRU9TIiwgTlN3aXRjaFR5cGU6OmtTaW1wbGUsIGZhbHNlIH0sDQorICB7ICJTSSIsICBOU3dpdGNoVHlwZTo6a1NpbXBsZSwgZmFsc2UgfSwNCisgIHsgIlNPIiwgIE5Td2l0Y2hUeXBlOjprU2ltcGxlLCBmYWxzZSB9LA0KKyAgeyAiRjg2IiwgIE5Td2l0Y2hUeXBlOjprQ2hhciwgZmFsc2UsIDAsICIrIiB9DQorfTsNCisNCitzdGF0aWMgdm9pZCBQcmludE1lc3NhZ2UoY29uc3QgY2hhciAqcykNCit7DQorICBmcHV0cyhzLCBzdGRlcnIpOw0KK30NCisNCitzdGF0aWMgdm9pZCBQcmludEhlbHAoKQ0KK3sNCisgIFByaW50TWVzc2FnZSgiXG5Vc2FnZTogIExaTUEgPGV8ZD4gaW5wdXRGaWxlIG91dHB1dEZpbGUgWzxzd2l0Y2hlcz4uLi5dXG4iDQorICAgICAgICAgICAgICIgIGU6IGVuY29kZSBmaWxlXG4iDQorICAgICAgICAgICAgICIgIGQ6IGRlY29kZSBmaWxlXG4iDQorICAgICAgICAgICAgICIgIGI6IEJlbmNobWFya1xuIg0KKyAgICAiPFN3aXRjaGVzPlxuIg0KKyAgICAiICAtYXtOfTogIHNldCBjb21wcmVzc2lvbiBtb2RlIC0gWzAsIDFdLCBkZWZhdWx0OiAxIChtYXgpXG4iDQorICAgICIgIC1ke059OiAgc2V0IGRpY3Rpb25hcnkgc2l6ZSAtIFsxMiwgMzBdLCBkZWZhdWx0OiAyMyAoOE1CKVxuIg0KKyAgICAiICAtZmJ7Tn06IHNldCBudW1iZXIgb2YgZmFzdCBieXRlcyAtIFs1LCAyNzNdLCBkZWZhdWx0OiAxMjhcbiINCisgICAgIiAgLW1je059OiBzZXQgbnVtYmVyIG9mIGN5Y2xlcyBmb3IgbWF0Y2ggZmluZGVyXG4iDQorICAgICIgIC1sY3tOfTogc2V0IG51bWJlciBvZiBsaXRlcmFsIGNvbnRleHQgYml0cyAtIFswLCA4XSwgZGVmYXVsdDogM1xuIg0KKyAgICAiICAtbHB7Tn06IHNldCBudW1iZXIgb2YgbGl0ZXJhbCBwb3MgYml0cyAtIFswLCA0XSwgZGVmYXVsdDogMFxuIg0KKyAgICAiICAtcGJ7Tn06IHNldCBudW1iZXIgb2YgcG9zIGJpdHMgLSBbMCwgNF0sIGRlZmF1bHQ6IDJcbiINCisgICAgIiAgLW1me01GX0lEfTogc2V0IE1hdGNoIEZpbmRlcjogW2J0MiwgYnQzLCBidDQsIGhjNF0sIGRlZmF1bHQ6IGJ0NFxuIg0KKyAgICAiICAtbXR7Tn06IHNldCBudW1iZXIgb2YgQ1BVIHRocmVhZHNcbiINCisgICAgIiAgLWVvczogICB3cml0ZSBFbmQgT2YgU3RyZWFtIG1hcmtlclxuIg0KKyAgICAiICAtc2k6ICAgIHJlYWQgZGF0YSBmcm9tIHN0ZGluXG4iDQorICAgICIgIC1zbzogICAgd3JpdGUgZGF0YSB0byBzdGRvdXRcbiINCisgICAgKTsNCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnRIZWxwQW5kRXhpdChjb25zdCBjaGFyICpzKQ0KK3sNCisgIGZwcmludGYoc3RkZXJyLCAiXG5FcnJvcjogJXNcblxuIiwgcyk7DQorICBQcmludEhlbHAoKTsNCisgIHRocm93IC0xOw0KK30NCisNCitzdGF0aWMgdm9pZCBJbmNvcnJlY3RDb21tYW5kKCkNCit7DQorICBQcmludEhlbHBBbmRFeGl0KCJJbmNvcnJlY3QgY29tbWFuZCIpOw0KK30NCisNCitzdGF0aWMgdm9pZCBXcml0ZUFyZ3VtZW50c1RvU3RyaW5nTGlzdChpbnQgbnVtQXJncywgY29uc3QgY2hhciAqYXJnc1tdLCBVU3RyaW5nVmVjdG9yICZzdHJpbmdzKQ0KK3sNCisgIGZvciAoaW50IGkgPSAxOyBpIDwgbnVtQXJnczsgaSsrKQ0KKyAgICBzdHJpbmdzLkFkZChNdWx0aUJ5dGVUb1VuaWNvZGVTdHJpbmcoYXJnc1tpXSkpOw0KK30NCisNCitzdGF0aWMgYm9vbCBHZXROdW1iZXIoY29uc3Qgd2NoYXJfdCAqcywgVUludDMyICZ2YWx1ZSkNCit7DQorICB2YWx1ZSA9IDA7DQorICBpZiAoKnMgPT0gMCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgY29uc3Qgd2NoYXJfdCAqZW5kOw0KKyAgdmFsdWUgPSBDb252ZXJ0U3RyaW5nVG9VSW50MzIocywgJmVuZCk7DQorICByZXR1cm4gKmVuZCA9PSAwOw0KK30NCisNCitzdGF0aWMgdm9pZCBQYXJzZVVJbnQzMihjb25zdCBDUGFyc2VyICZwYXJzZXIsIHVuc2lnbmVkIGluZGV4LCBVSW50MzIgJnJlcykNCit7DQorICBpZiAocGFyc2VyW2luZGV4XS5UaGVyZUlzKQ0KKyAgICBpZiAoIUdldE51bWJlcihwYXJzZXJbaW5kZXhdLlBvc3RTdHJpbmdzWzBdLCByZXMpKQ0KKyAgICAgIEluY29ycmVjdENvbW1hbmQoKTsNCit9DQorDQorI2RlZmluZSBOVF9DSEVDS19GQUlMX0FDVElPTiBQcmludE1lc3NhZ2UoIlVuc3VwcG9ydGVkIFdpbmRvd3MgdmVyc2lvbiIpOyByZXR1cm4gMTsNCisNCitpbnQgbWFpbjIoaW50IG51bUFyZ3MsIGNvbnN0IGNoYXIgKmFyZ3NbXSkNCit7DQorICBOVF9DSEVDSw0KKw0KKyAgUHJpbnRNZXNzYWdlKCJcbkxaTUEgIiBNWV9WRVJTSU9OX0NPUFlSSUdIVF9EQVRFICJcbiIpOw0KKw0KKyAgaWYgKG51bUFyZ3MgPT0gMSkNCisgIHsNCisgICAgUHJpbnRIZWxwKCk7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKw0KKyAgYm9vbCB1bnN1cHBvcnRlZFR5cGVzID0gKHNpemVvZihCeXRlKSAhPSAxIHx8IHNpemVvZihVSW50MzIpIDwgNCB8fCBzaXplb2YoVUludDY0KSA8IDQpOw0KKyAgaWYgKHVuc3VwcG9ydGVkVHlwZXMpDQorICB7DQorICAgIFByaW50TWVzc2FnZSgiVW5zdXBwb3J0ZWQgYmFzZSB0eXBlcy4gRWRpdCBDb21tb24vVHlwZXMuaCBhbmQgcmVjb21waWxlIik7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKw0KKyAgVVN0cmluZ1ZlY3RvciBjb21tYW5kU3RyaW5nczsNCisgIFdyaXRlQXJndW1lbnRzVG9TdHJpbmdMaXN0KG51bUFyZ3MsIGFyZ3MsIGNvbW1hbmRTdHJpbmdzKTsNCisgIA0KKyAgQ1BhcnNlciBwYXJzZXIoQVJSQVlfU0laRShrU3dpdGNoRm9ybXMpKTsNCisgIHRyeQ0KKyAgew0KKyAgICBwYXJzZXIuUGFyc2VTdHJpbmdzKGtTd2l0Y2hGb3JtcywgY29tbWFuZFN0cmluZ3MpOw0KKyAgfQ0KKyAgY2F0Y2goLi4uKQ0KKyAgew0KKyAgICBJbmNvcnJlY3RDb21tYW5kKCk7DQorICB9DQorDQorICBpZiAocGFyc2VyW05LZXk6OmtIZWxwMV0uVGhlcmVJcyB8fCBwYXJzZXJbTktleTo6a0hlbHAyXS5UaGVyZUlzKQ0KKyAgew0KKyAgICBQcmludEhlbHAoKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBjb25zdCBVU3RyaW5nVmVjdG9yICZub25Td2l0Y2hTdHJpbmdzID0gcGFyc2VyLk5vblN3aXRjaFN0cmluZ3M7DQorDQorICB1bnNpZ25lZCBwYXJhbUluZGV4ID0gMDsNCisgIGlmIChwYXJhbUluZGV4ID49IG5vblN3aXRjaFN0cmluZ3MuU2l6ZSgpKQ0KKyAgICBJbmNvcnJlY3RDb21tYW5kKCk7DQorICBjb25zdCBVU3RyaW5nICZjb21tYW5kID0gbm9uU3dpdGNoU3RyaW5nc1twYXJhbUluZGV4KytdOw0KKw0KKyAgQ09iamVjdFZlY3RvcjxDUHJvcGVydHk+IHByb3BzOw0KKyAgYm9vbCBkaWN0RGVmaW5lZCA9IGZhbHNlOw0KKyAgVUludDMyIGRpY3QgPSAoVUludDMyKShJbnQzMiktMTsNCisgIGlmIChwYXJzZXJbTktleTo6a0RpY3RdLlRoZXJlSXMpDQorICB7DQorICAgIFVJbnQzMiBkaWNMb2c7DQorICAgIGNvbnN0IFVTdHJpbmcgJnMgPSBwYXJzZXJbTktleTo6a0RpY3RdLlBvc3RTdHJpbmdzWzBdOw0KKyAgICBpZiAoIUdldE51bWJlcihzLCBkaWNMb2cpKQ0KKyAgICAgIEluY29ycmVjdENvbW1hbmQoKTsNCisgICAgZGljdCA9IDEgPDwgZGljTG9nOw0KKyAgICBkaWN0RGVmaW5lZCA9IHRydWU7DQorICAgIENQcm9wZXJ0eSBwcm9wOw0KKyAgICBwcm9wLk5hbWUgPSBMImQiOw0KKyAgICBwcm9wLlZhbHVlID0gczsNCisgICAgcHJvcHMuQWRkKHByb3ApOw0KKyAgfQ0KKyAgaWYgKHBhcnNlcltOS2V5OjprTGV2ZWxdLlRoZXJlSXMpDQorICB7DQorICAgIFVJbnQzMiBsZXZlbCA9IDU7DQorICAgIGNvbnN0IFVTdHJpbmcgJnMgPSBwYXJzZXJbTktleTo6a0xldmVsXS5Qb3N0U3RyaW5nc1swXTsNCisgICAgaWYgKCFHZXROdW1iZXIocywgbGV2ZWwpKQ0KKyAgICAgIEluY29ycmVjdENvbW1hbmQoKTsNCisgICAgQ1Byb3BlcnR5IHByb3A7DQorICAgIHByb3AuTmFtZSA9IEwieCI7DQorICAgIHByb3AuVmFsdWUgPSBzOw0KKyAgICBwcm9wcy5BZGQocHJvcCk7DQorICB9DQorICBVU3RyaW5nIG1mID0gTCJCVDQiOw0KKyAgaWYgKHBhcnNlcltOS2V5OjprTWF0Y2hGaW5kZXJdLlRoZXJlSXMpDQorICAgIG1mID0gcGFyc2VyW05LZXk6OmtNYXRjaEZpbmRlcl0uUG9zdFN0cmluZ3NbMF07DQorDQorICBVSW50MzIgbnVtVGhyZWFkcyA9IChVSW50MzIpKEludDMyKS0xOw0KKw0KKyAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgaWYgKHBhcnNlcltOS2V5OjprTXVsdGlUaHJlYWRdLlRoZXJlSXMpDQorICB7DQorICAgIFVJbnQzMiBudW1DUFVzID0gTldpbmRvd3M6Ok5TeXN0ZW06OkdldE51bWJlck9mUHJvY2Vzc29ycygpOw0KKyAgICBjb25zdCBVU3RyaW5nICZzID0gcGFyc2VyW05LZXk6OmtNdWx0aVRocmVhZF0uUG9zdFN0cmluZ3NbMF07DQorICAgIGlmIChzLklzRW1wdHkoKSkNCisgICAgICBudW1UaHJlYWRzID0gbnVtQ1BVczsNCisgICAgZWxzZQ0KKyAgICAgIGlmICghR2V0TnVtYmVyKHMsIG51bVRocmVhZHMpKQ0KKyAgICAgICAgSW5jb3JyZWN0Q29tbWFuZCgpOw0KKyAgICBDUHJvcGVydHkgcHJvcDsNCisgICAgcHJvcC5OYW1lID0gTCJtdCI7DQorICAgIHByb3AuVmFsdWUgPSBzOw0KKyAgICBwcm9wcy5BZGQocHJvcCk7DQorICB9DQorICAjZW5kaWYNCisNCisgIGlmIChwYXJzZXJbTktleTo6a01ldGhvZF0uVGhlcmVJcykNCisgIHsNCisgICAgVVN0cmluZyBzID0gcGFyc2VyW05LZXk6OmtNZXRob2RdLlBvc3RTdHJpbmdzWzBdOw0KKyAgICBpZiAocy5Jc0VtcHR5KCkgfHwgc1swXSAhPSAnPScpDQorICAgICAgSW5jb3JyZWN0Q29tbWFuZCgpOw0KKyAgICBDUHJvcGVydHkgcHJvcDsNCisgICAgcHJvcC5OYW1lID0gTCJtIjsNCisgICAgcHJvcC5WYWx1ZSA9IHMuUHRyKDEpOw0KKyAgICBwcm9wcy5BZGQocHJvcCk7DQorICB9DQorDQorICBpZiAoTXlTdHJpbmdDb21wYXJlTm9DYXNlKGNvbW1hbmQsIEwiYiIpID09IDApDQorICB7DQorICAgIGNvbnN0IFVJbnQzMiBrTnVtRGVmYXVsdEl0ZXJlYXRpb25zID0gMTsNCisgICAgVUludDMyIG51bUl0ZXJhdGlvbnMgPSBrTnVtRGVmYXVsdEl0ZXJlYXRpb25zOw0KKyAgICB7DQorICAgICAgaWYgKHBhcmFtSW5kZXggPCBub25Td2l0Y2hTdHJpbmdzLlNpemUoKSkNCisgICAgICAgIGlmICghR2V0TnVtYmVyKG5vblN3aXRjaFN0cmluZ3NbcGFyYW1JbmRleCsrXSwgbnVtSXRlcmF0aW9ucykpDQorICAgICAgICAgIG51bUl0ZXJhdGlvbnMgPSBrTnVtRGVmYXVsdEl0ZXJlYXRpb25zOw0KKyAgICB9DQorICAgIEhSRVNVTFQgcmVzID0gQmVuY2hDb24ocHJvcHMsIG51bUl0ZXJhdGlvbnMsIHN0ZGVycik7DQorICAgIGlmIChyZXMgIT0gU19PSykNCisgICAgew0KKyAgICAgIGlmIChyZXMgIT0gRV9BQk9SVCkNCisgICAgICB7DQorICAgICAgICBQcmludE1lc3NhZ2UoIkJlbmNobWFyayBFcnJvciIpOw0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKw0KKyAgaWYgKG51bVRocmVhZHMgPT0gKFVJbnQzMikoSW50MzIpLTEpDQorICAgIG51bVRocmVhZHMgPSAxOw0KKw0KKyAgYm9vbCBlbmNvZGVNb2RlID0gZmFsc2U7DQorICBpZiAoTXlTdHJpbmdDb21wYXJlTm9DYXNlKGNvbW1hbmQsIEwiZSIpID09IDApDQorICAgIGVuY29kZU1vZGUgPSB0cnVlOw0KKyAgZWxzZSBpZiAoTXlTdHJpbmdDb21wYXJlTm9DYXNlKGNvbW1hbmQsIEwiZCIpID09IDApDQorICAgIGVuY29kZU1vZGUgPSBmYWxzZTsNCisgIGVsc2UNCisgICAgSW5jb3JyZWN0Q29tbWFuZCgpOw0KKw0KKyAgYm9vbCBzdGRJbk1vZGUgPSBwYXJzZXJbTktleTo6a1N0ZEluXS5UaGVyZUlzOw0KKyAgYm9vbCBzdGRPdXRNb2RlID0gcGFyc2VyW05LZXk6OmtTdGRPdXRdLlRoZXJlSXM7DQorDQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gaW5TdHJlYW07DQorICBDSW5GaWxlU3RyZWFtICppblN0cmVhbVNwZWMgPSAwOw0KKyAgaWYgKHN0ZEluTW9kZSkNCisgIHsNCisgICAgaW5TdHJlYW0gPSBuZXcgQ1N0ZEluRmlsZVN0cmVhbTsNCisgICAgTVlfU0VUX0JJTkFSWV9NT0RFKHN0ZGluKTsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgaWYgKHBhcmFtSW5kZXggPj0gbm9uU3dpdGNoU3RyaW5ncy5TaXplKCkpDQorICAgICAgSW5jb3JyZWN0Q29tbWFuZCgpOw0KKyAgICBjb25zdCBVU3RyaW5nICZpbnB1dE5hbWUgPSBub25Td2l0Y2hTdHJpbmdzW3BhcmFtSW5kZXgrK107DQorICAgIGluU3RyZWFtU3BlYyA9IG5ldyBDSW5GaWxlU3RyZWFtOw0KKyAgICBpblN0cmVhbSA9IGluU3RyZWFtU3BlYzsNCisgICAgaWYgKCFpblN0cmVhbVNwZWMtPk9wZW4odXMyZnMoaW5wdXROYW1lKSkpDQorICAgIHsNCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3I6IGNhbiBub3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iLA0KKyAgICAgICAgICAoY29uc3QgY2hhciAqKUdldE9lbVN0cmluZyhpbnB1dE5hbWUpKTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsT3V0U3RyZWFtPiBvdXRTdHJlYW07DQorICBDT3V0RmlsZVN0cmVhbSAqb3V0U3RyZWFtU3BlYyA9IE5VTEw7DQorICBpZiAoc3RkT3V0TW9kZSkNCisgIHsNCisgICAgb3V0U3RyZWFtID0gbmV3IENTdGRPdXRGaWxlU3RyZWFtOw0KKyAgICBNWV9TRVRfQklOQVJZX01PREUoc3Rkb3V0KTsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgaWYgKHBhcmFtSW5kZXggPj0gbm9uU3dpdGNoU3RyaW5ncy5TaXplKCkpDQorICAgICAgSW5jb3JyZWN0Q29tbWFuZCgpOw0KKyAgICBjb25zdCBVU3RyaW5nICZvdXRwdXROYW1lID0gbm9uU3dpdGNoU3RyaW5nc1twYXJhbUluZGV4KytdOw0KKyAgICBvdXRTdHJlYW1TcGVjID0gbmV3IENPdXRGaWxlU3RyZWFtOw0KKyAgICBvdXRTdHJlYW0gPSBvdXRTdHJlYW1TcGVjOw0KKyAgICBpZiAoIW91dFN0cmVhbVNwZWMtPkNyZWF0ZSh1czJmcyhvdXRwdXROYW1lKSwgdHJ1ZSkpDQorICAgIHsNCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3I6IGNhbiBub3Qgb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwNCisgICAgICAgIChjb25zdCBjaGFyICopR2V0T2VtU3RyaW5nKG91dHB1dE5hbWUpKTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKHBhcnNlcltOS2V5OjprRmlsdGVyODZdLlRoZXJlSXMpDQorICB7DQorICAgIC8vIC1mODYgc3dpdGNoIGlzIGZvciB4ODYgZmlsdGVyZWQgbW9kZTogQkNKICsgTFpNQS4NCisgICAgaWYgKHBhcnNlcltOS2V5OjprRU9TXS5UaGVyZUlzIHx8IHN0ZEluTW9kZSkNCisgICAgICB0aHJvdyAiQ2FuIG5vdCB1c2Ugc3RkaW4gaW4gdGhpcyBtb2RlIjsNCisgICAgVUludDY0IGZpbGVTaXplOw0KKyAgICBpblN0cmVhbVNwZWMtPkZpbGUuR2V0TGVuZ3RoKGZpbGVTaXplKTsNCisgICAgaWYgKGZpbGVTaXplID4gMHhGMDAwMDAwMCkNCisgICAgICB0aHJvdyAiRmlsZSBpcyB0b28gYmlnIjsNCisgICAgc2l6ZV90IGluU2l6ZSA9IChzaXplX3QpZmlsZVNpemU7DQorICAgIEJ5dGUgKmluQnVmZmVyID0gMDsNCisgICAgaWYgKGluU2l6ZSAhPSAwKQ0KKyAgICB7DQorICAgICAgaW5CdWZmZXIgPSAoQnl0ZSAqKU15QWxsb2MoKHNpemVfdClpblNpemUpOw0KKyAgICAgIGlmIChpbkJ1ZmZlciA9PSAwKQ0KKyAgICAgICAgdGhyb3cga0NhbnRBbGxvY2F0ZTsNCisgICAgfQ0KKyAgICANCisgICAgaWYgKFJlYWRTdHJlYW1fRkFJTChpblN0cmVhbSwgaW5CdWZmZXIsIGluU2l6ZSkgIT0gU19PSykNCisgICAgICB0aHJvdyAiQ2FuIG5vdCByZWFkIjsNCisNCisgICAgQnl0ZSAqb3V0QnVmZmVyID0gMDsNCisgICAgc2l6ZV90IG91dFNpemU7DQorICAgIGlmIChlbmNvZGVNb2RlKQ0KKyAgICB7DQorICAgICAgLy8gd2UgYWxsb2NhdGUgMTA1JSBvZiBvcmlnaW5hbCBzaXplIGZvciBvdXRwdXQgYnVmZmVyDQorICAgICAgb3V0U2l6ZSA9IChzaXplX3QpZmlsZVNpemUgLyAyMCAqIDIxICsgKDEgPDwgMTYpOw0KKyAgICAgIGlmIChvdXRTaXplICE9IDApDQorICAgICAgew0KKyAgICAgICAgb3V0QnVmZmVyID0gKEJ5dGUgKilNeUFsbG9jKChzaXplX3Qpb3V0U2l6ZSk7DQorICAgICAgICBpZiAob3V0QnVmZmVyID09IDApDQorICAgICAgICAgIHRocm93IGtDYW50QWxsb2NhdGU7DQorICAgICAgfQ0KKyAgICAgIGlmICghZGljdERlZmluZWQpDQorICAgICAgICBkaWN0ID0gMSA8PCAyMzsNCisgICAgICBpbnQgcmVzID0gTHptYTg2X0VuY29kZShvdXRCdWZmZXIsICZvdXRTaXplLCBpbkJ1ZmZlciwgaW5TaXplLA0KKyAgICAgICAgICA1LCBkaWN0LCBwYXJzZXJbTktleTo6a0ZpbHRlcjg2XS5Qb3N0Q2hhckluZGV4ID09IDAgPyBTWl9GSUxURVJfWUVTIDogU1pfRklMVEVSX0FVVE8pOw0KKyAgICAgIGlmIChyZXMgIT0gMCkNCisgICAgICB7DQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuRW5jb2RlciBlcnJvciA9ICVkXG4iLCAoaW50KXJlcyk7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgICB9DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgVUludDY0IG91dFNpemU2NDsNCisgICAgICBpZiAoTHptYTg2X0dldFVucGFja1NpemUoaW5CdWZmZXIsIGluU2l6ZSwgJm91dFNpemU2NCkgIT0gMCkNCisgICAgICAgIHRocm93ICJkYXRhIGVycm9yIjsNCisgICAgICBvdXRTaXplID0gKHNpemVfdClvdXRTaXplNjQ7DQorICAgICAgaWYgKG91dFNpemUgIT0gb3V0U2l6ZTY0KQ0KKyAgICAgICAgdGhyb3cgInRvbyBiaWciOw0KKyAgICAgIGlmIChvdXRTaXplICE9IDApDQorICAgICAgew0KKyAgICAgICAgb3V0QnVmZmVyID0gKEJ5dGUgKilNeUFsbG9jKG91dFNpemUpOw0KKyAgICAgICAgaWYgKG91dEJ1ZmZlciA9PSAwKQ0KKyAgICAgICAgICB0aHJvdyBrQ2FudEFsbG9jYXRlOw0KKyAgICAgIH0NCisgICAgICBpbnQgcmVzID0gTHptYTg2X0RlY29kZShvdXRCdWZmZXIsICZvdXRTaXplLCBpbkJ1ZmZlciwgJmluU2l6ZSk7DQorICAgICAgaWYgKGluU2l6ZSAhPSAoc2l6ZV90KWZpbGVTaXplKQ0KKyAgICAgICAgdGhyb3cgImluY29ycmVjdCBwcm9jZXNzZWQgc2l6ZSI7DQorICAgICAgaWYgKHJlcyAhPSAwKQ0KKyAgICAgICAgdGhyb3cgIkx6bWFEZWNvZGVyIGVycm9yIjsNCisgICAgfQ0KKyAgICBpZiAoV3JpdGVTdHJlYW0ob3V0U3RyZWFtLCBvdXRCdWZmZXIsIG91dFNpemUpICE9IFNfT0spDQorICAgICAgdGhyb3cga1dyaXRlRXJyb3I7DQorICAgIE15RnJlZShvdXRCdWZmZXIpOw0KKyAgICBNeUZyZWUoaW5CdWZmZXIpOw0KKyAgICByZXR1cm4gMDsNCisgIH0NCisNCisNCisgIFVJbnQ2NCBmaWxlU2l6ZTsNCisgIGlmIChlbmNvZGVNb2RlKQ0KKyAgew0KKyAgICBOQ29tcHJlc3M6Ok5Mem1hOjpDRW5jb2RlciAqZW5jb2RlclNwZWMgPSBuZXcgTkNvbXByZXNzOjpOTHptYTo6Q0VuY29kZXI7DQorICAgIENNeUNvbVB0cjxJQ29tcHJlc3NDb2Rlcj4gZW5jb2RlciA9IGVuY29kZXJTcGVjOw0KKw0KKyAgICBpZiAoIWRpY3REZWZpbmVkKQ0KKyAgICAgIGRpY3QgPSAxIDw8IDIzOw0KKw0KKyAgICBVSW50MzIgcGIgPSAyOw0KKyAgICBVSW50MzIgbGMgPSAzOyAvLyA9IDA7IGZvciAzMi1iaXQgZGF0YQ0KKyAgICBVSW50MzIgbHAgPSAwOyAvLyA9IDI7IGZvciAzMi1iaXQgZGF0YQ0KKyAgICBVSW50MzIgYWxnbyA9IDE7DQorICAgIFVJbnQzMiBmYiA9IDEyODsNCisgICAgVUludDMyIG1jID0gMTYgKyBmYiAvIDI7DQorICAgIGJvb2wgbWNEZWZpbmVkID0gZmFsc2U7DQorDQorICAgIGJvb2wgZW9zID0gcGFyc2VyW05LZXk6OmtFT1NdLlRoZXJlSXMgfHwgc3RkSW5Nb2RlOw0KKyANCisgICAgUGFyc2VVSW50MzIocGFyc2VyLCBOS2V5OjprQWxnbywgYWxnbyk7DQorICAgIFBhcnNlVUludDMyKHBhcnNlciwgTktleTo6a0ZiLCBmYik7DQorICAgIFBhcnNlVUludDMyKHBhcnNlciwgTktleTo6a0xjLCBsYyk7DQorICAgIFBhcnNlVUludDMyKHBhcnNlciwgTktleTo6a0xwLCBscCk7DQorICAgIFBhcnNlVUludDMyKHBhcnNlciwgTktleTo6a1BiLCBwYik7DQorDQorICAgIG1jRGVmaW5lZCA9IHBhcnNlcltOS2V5OjprTWNdLlRoZXJlSXM7DQorICAgIGlmIChtY0RlZmluZWQpDQorICAgICAgaWYgKCFHZXROdW1iZXIocGFyc2VyW05LZXk6OmtNY10uUG9zdFN0cmluZ3NbMF0sIG1jKSkNCisgICAgICAgIEluY29ycmVjdENvbW1hbmQoKTsNCisgICAgDQorICAgIGNvbnN0IFBST1BJRCBwcm9wSURzW10gPQ0KKyAgICB7DQorICAgICAgTkNvZGVyUHJvcElEOjprRGljdGlvbmFyeVNpemUsDQorICAgICAgTkNvZGVyUHJvcElEOjprUG9zU3RhdGVCaXRzLA0KKyAgICAgIE5Db2RlclByb3BJRDo6a0xpdENvbnRleHRCaXRzLA0KKyAgICAgIE5Db2RlclByb3BJRDo6a0xpdFBvc0JpdHMsDQorICAgICAgTkNvZGVyUHJvcElEOjprQWxnb3JpdGhtLA0KKyAgICAgIE5Db2RlclByb3BJRDo6a051bUZhc3RCeXRlcywNCisgICAgICBOQ29kZXJQcm9wSUQ6OmtNYXRjaEZpbmRlciwNCisgICAgICBOQ29kZXJQcm9wSUQ6OmtFbmRNYXJrZXIsDQorICAgICAgTkNvZGVyUHJvcElEOjprTnVtVGhyZWFkcywNCisgICAgICBOQ29kZXJQcm9wSUQ6OmtNYXRjaEZpbmRlckN5Y2xlcywNCisgICAgfTsNCisgICAgY29uc3QgdW5zaWduZWQga051bVByb3BzTWF4ID0gQVJSQVlfU0laRShwcm9wSURzKTsNCisNCisgICAgUFJPUFZBUklBTlQgcHJvcHNba051bVByb3BzTWF4XTsNCisgICAgZm9yIChpbnQgcCA9IDA7IHAgPCA2OyBwKyspDQorICAgICAgcHJvcHNbcF0udnQgPSBWVF9VSTQ7DQorDQorICAgIHByb3BzWzBdLnVsVmFsID0gKFVJbnQzMilkaWN0Ow0KKyAgICBwcm9wc1sxXS51bFZhbCA9IChVSW50MzIpcGI7DQorICAgIHByb3BzWzJdLnVsVmFsID0gKFVJbnQzMilsYzsNCisgICAgcHJvcHNbM10udWxWYWwgPSAoVUludDMyKWxwOw0KKyAgICBwcm9wc1s0XS51bFZhbCA9IChVSW50MzIpYWxnbzsNCisgICAgcHJvcHNbNV0udWxWYWwgPSAoVUludDMyKWZiOw0KKw0KKyAgICBwcm9wc1s2XS52dCA9IFZUX0JTVFI7DQorICAgIHByb3BzWzZdLmJzdHJWYWwgPSBjb25zdF9jYXN0PEJTVFI+KChjb25zdCB3Y2hhcl90ICopbWYpOw0KKw0KKyAgICBwcm9wc1s3XS52dCA9IFZUX0JPT0w7DQorICAgIHByb3BzWzddLmJvb2xWYWwgPSBlb3MgPyBWQVJJQU5UX1RSVUUgOiBWQVJJQU5UX0ZBTFNFOw0KKw0KKyAgICBwcm9wc1s4XS52dCA9IFZUX1VJNDsNCisgICAgcHJvcHNbOF0udWxWYWwgPSAoVUludDMyKW51bVRocmVhZHM7DQorDQorICAgIC8vIGl0IG11c3QgYmUgbGFzdCBpbiBwcm9wZXJ0eSBsaXN0DQorICAgIHByb3BzWzldLnZ0ID0gVlRfVUk0Ow0KKyAgICBwcm9wc1s5XS51bFZhbCA9IChVSW50MzIpbWM7DQorDQorICAgIHVuc2lnbmVkIG51bVByb3BzID0ga051bVByb3BzTWF4Ow0KKyAgICBpZiAoIW1jRGVmaW5lZCkNCisgICAgICBudW1Qcm9wcy0tOw0KKw0KKyAgICBpZiAoZW5jb2RlclNwZWMtPlNldENvZGVyUHJvcGVydGllcyhwcm9wSURzLCBwcm9wcywgbnVtUHJvcHMpICE9IFNfT0spDQorICAgICAgSW5jb3JyZWN0Q29tbWFuZCgpOw0KKyAgICBlbmNvZGVyU3BlYy0+V3JpdGVDb2RlclByb3BlcnRpZXMob3V0U3RyZWFtKTsNCisNCisgICAgaWYgKGVvcyB8fCBzdGRJbk1vZGUpDQorICAgICAgZmlsZVNpemUgPSAoVUludDY0KShJbnQ2NCktMTsNCisgICAgZWxzZQ0KKyAgICAgIGluU3RyZWFtU3BlYy0+RmlsZS5HZXRMZW5ndGgoZmlsZVNpemUpOw0KKw0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykNCisgICAgew0KKyAgICAgIEJ5dGUgYiA9IEJ5dGUoZmlsZVNpemUgPj4gKDggKiBpKSk7DQorICAgICAgaWYgKG91dFN0cmVhbS0+V3JpdGUoJmIsIDEsIDApICE9IFNfT0spDQorICAgICAgew0KKyAgICAgICAgUHJpbnRNZXNzYWdlKGtXcml0ZUVycm9yKTsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBIUkVTVUxUIHJlc3VsdCA9IGVuY29kZXItPkNvZGUoaW5TdHJlYW0sIG91dFN0cmVhbSwgMCwgMCwgMCk7DQorICAgIGlmIChyZXN1bHQgPT0gRV9PVVRPRk1FTU9SWSkNCisgICAgew0KKyAgICAgIFByaW50TWVzc2FnZSgiXG5FcnJvcjogQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOw0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIGVsc2UgaWYgKHJlc3VsdCAhPSBTX09LKQ0KKyAgICB7DQorICAgICAgZnByaW50ZihzdGRlcnIsICJcbkVuY29kZXIgZXJyb3IgPSAlWFxuIiwgKHVuc2lnbmVkKXJlc3VsdCk7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgTkNvbXByZXNzOjpOTHptYTo6Q0RlY29kZXIgKmRlY29kZXJTcGVjID0gbmV3IE5Db21wcmVzczo6Tkx6bWE6OkNEZWNvZGVyOw0KKyAgICBDTXlDb21QdHI8SUNvbXByZXNzQ29kZXI+IGRlY29kZXIgPSBkZWNvZGVyU3BlYzsNCisgICAgZGVjb2RlclNwZWMtPkZpbmlzaFN0cmVhbSA9IHRydWU7DQorICAgIGNvbnN0IFVJbnQzMiBrUHJvcGVydGllc1NpemUgPSA1Ow0KKyAgICBCeXRlIGhlYWRlcltrUHJvcGVydGllc1NpemUgKyA4XTsNCisgICAgaWYgKFJlYWRTdHJlYW1fRkFMU0UoaW5TdHJlYW0sIGhlYWRlciwga1Byb3BlcnRpZXNTaXplICsgOCkgIT0gU19PSykNCisgICAgew0KKyAgICAgIFByaW50TWVzc2FnZShrUmVhZEVycm9yKTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBpZiAoZGVjb2RlclNwZWMtPlNldERlY29kZXJQcm9wZXJ0aWVzMihoZWFkZXIsIGtQcm9wZXJ0aWVzU2l6ZSkgIT0gU19PSykNCisgICAgew0KKyAgICAgIFByaW50TWVzc2FnZSgiU2V0RGVjb2RlclByb3BlcnRpZXMgZXJyb3IiKTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBmaWxlU2l6ZSA9IDA7DQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKQ0KKyAgICAgIGZpbGVTaXplIHw9ICgoVUludDY0KWhlYWRlcltrUHJvcGVydGllc1NpemUgKyBpXSkgPDwgKDggKiBpKTsNCisNCisgICAgYm9vbCBpc1NpemVEZWZpbmVkID0gKGZpbGVTaXplICE9IChVSW50NjQpKEludDY0KS0xKTsNCisgICAgSFJFU1VMVCByZXMgPSBkZWNvZGVyLT5Db2RlKGluU3RyZWFtLCBvdXRTdHJlYW0sIDAsIGlzU2l6ZURlZmluZWQgPyAmZmlsZVNpemUgOiBOVUxMLCAwKSAhPSBTX09LOw0KKyAgICBpZiAocmVzICE9IFNfT0spDQorICAgIHsNCisgICAgICBQcmludE1lc3NhZ2UoIkRlY29kZXIgZXJyb3IiKTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBpZiAoaXNTaXplRGVmaW5lZCAmJiBkZWNvZGVyU3BlYy0+R2V0T3V0cHV0UHJvY2Vzc2VkU2l6ZSgpICE9IGZpbGVTaXplKQ0KKyAgICB7DQorICAgICAgUHJpbnRNZXNzYWdlKCJFcnJvcjogaW5jb3JyZWN0IHVuY29tcHJlc3NlZCBzaXplIGluIGhlYWRlciIpOw0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICB9DQorICBpZiAob3V0U3RyZWFtU3BlYyAhPSBOVUxMKQ0KKyAgew0KKyAgICBpZiAob3V0U3RyZWFtU3BlYy0+Q2xvc2UoKSAhPSBTX09LKQ0KKyAgICB7DQorICAgICAgUHJpbnRNZXNzYWdlKCJGaWxlIGNsb3NpbmcgZXJyb3IiKTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBNWV9DREVDTCBtYWluKGludCBudW1BcmdzLCBjb25zdCBjaGFyICphcmdzW10pDQorew0KKyAgdHJ5IHsgcmV0dXJuIG1haW4yKG51bUFyZ3MsIGFyZ3MpOyB9DQorICBjYXRjaCAoY29uc3QgY2hhciAqcykNCisgIHsNCisgICAgZnByaW50ZihzdGRlcnIsICJcbkVycm9yOiAlc1xuIiwgcyk7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgY2F0Y2goLi4uKQ0KKyAgew0KKyAgICBQcmludE1lc3NhZ2UoIlxuRXJyb3JcbiIpOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0x6bWFDb24vTHptYUNvbi5kc3AgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvTHptYUNvbi9Mem1hQ29uLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTQzODA0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0x6bWFDb24vTHptYUNvbi5kc3AKQEAgLTAsMCArMSw0NzcgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iTHptYUNvbiIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzDQorDQorQ0ZHPUx6bWFDb24gLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiTHptYUNvbi5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiTHptYUNvbi5tYWsiIENGRz0iTHptYUNvbiAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJMem1hQ29uIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAiTHptYUNvbiAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJMem1hQ29uIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9HciAvTUQgL1c0IC9XWCAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZdSJTdGRBZnguaCIgL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MTkgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MTkgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYgL291dDoiQzpcVXRpbFxsem1hLmV4ZSINCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiTHptYUNvbiAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9HWiAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1c0IC9XWCAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1l1IlN0ZEFmeC5oIiAvRkQgL0daIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MTkgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MTkgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkM6XFV0aWxcbHptYS5leGUiIC9wZGJ0eXBlOnNlcHQNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgIkx6bWFDb24gLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAiTHptYUNvbiAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNwZWMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFN0ZEFmeC5jcHANCisjIEFERCBDUFAgL1ljIlN0ZEFmeC5oIg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFN0ZEFmeC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkNvbXByZXNzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcTHptYURlY29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEx6bWFEZWNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcTHptYUVuY29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEx6bWFFbmNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcTHptYVJlZ2lzdGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJXaW5kb3dzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlSU8uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZUlPLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xQcm9wVmFyaWFudC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xQcm9wVmFyaWFudC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcU3luY2hyb25pemF0aW9uLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFN5bmNocm9uaXphdGlvbi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcU3lzdGVtLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFN5c3RlbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcVGhyZWFkLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiQ29tbW9uIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXENvbW1hbmRMaW5lUGFyc2VyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cQ29tbWFuZExpbmVQYXJzZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cQ29tVHJ5LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXENSQy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXENyY1JlZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXERlZnMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cSW50VG9TdHJpbmcuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxJbnRUb1N0cmluZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxNeUNvbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxNeVN0cmluZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15U3RyaW5nLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15VW5rbm93bi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxNeVZlY3Rvci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15VmVjdG9yLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15V2luZG93cy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15V2luZG93cy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxOZXdIYW5kbGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cTmV3SGFuZGxlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxTdHJpbmdDb252ZXJ0LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cU3RyaW5nQ29udmVydC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxTdHJpbmdUb0ludC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXFN0cmluZ1RvSW50LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXFR5cGVzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiN3ppcCBDb21tb24iDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cQ3JlYXRlQ29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxDcmVhdGVDb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxDV3JhcHBlcnMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxDV3JhcHBlcnMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cRmlsZVN0cmVhbXMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxGaWxlU3RyZWFtcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxGaWx0ZXJDb2Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEZpbHRlckNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXE1ldGhvZFByb3BzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cTWV0aG9kUHJvcHMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cU3RyZWFtVXRpbHMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxTdHJlYW1VdGlscy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlVJIENvbW1vbiINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxCZW5jaC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEJlbmNoLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXExvYWRDb2RlY3MuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxMb2FkQ29kZWNzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiQ29uc29sZSINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbnNvbGVcQmVuY2hDb24uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbnNvbGVcQmVuY2hDb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb25zb2xlXENvbnNvbGVDbG9zZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29uc29sZVxDb25zb2xlQ2xvc2UuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJDIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1w3ekNyYy5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1w3ekNyYy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcN3pDcmNPcHQuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcQWxsb2MuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcQWxsb2MuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEJyYS5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xCcmEuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEJyYTg2LmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEJyYUlBNjQuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcQ3B1QXJjaC5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xDcHVBcmNoLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xMekZpbmQuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcTHpGaW5kLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xMekZpbmRNdC5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xMekZpbmRNdC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcTHpIYXNoLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xMem1hODYuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6bWE4NkRlYy5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xMem1hODZFbmMuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcTHptYURlYy5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xMem1hRGVjLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xMem1hRW5jLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6bWFFbmMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXFRocmVhZHMuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcVGhyZWFkcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcVHlwZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cTHptYUFsb25lLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Mem1hQ29uL0x6bWFDb24uZHN3IGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0x6bWFDb24vTHptYUNvbi5kc3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhNjY2MgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Mem1hQ29uL0x6bWFDb24uZHN3CkBAIC0wLDAgKzEsMjkgQEAKK01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSENCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIkx6bWFDb24iPS5cTHptYUNvbi5kc3AgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08ND4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorR2xvYmFsOg0KKw0KK1BhY2thZ2U9PDU+DQore3t7DQorfX19DQorDQorUGFja2FnZT08Mz4NCit7e3sNCit9fX0NCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0x6bWFDb24vU3RkQWZ4LmNwcCBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Mem1hQ29uL1N0ZEFmeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkM2IxZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Mem1hQ29uL1N0ZEFmeC5jcHAKQEAgLTAsMCArMSwzIEBACisvLyBTdGRBZnguY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Mem1hQ29uL1N0ZEFmeC5oIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0x6bWFDb24vU3RkQWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkOWFjMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Mem1hQ29uL1N0ZEFmeC5oCkBAIC0wLDAgKzEsOCBAQAorLy8gU3RkQWZ4LmgNCisNCisjaWZuZGVmIF9fU1REQUZYX0gNCisjZGVmaW5lIF9fU1REQUZYX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0NvbW1vbi5oIg0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Mem1hQ29uL21ha2VmaWxlIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0x6bWFDb24vbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwOTc2MwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Mem1hQ29uL21ha2VmaWxlCkBAIC0wLDAgKzEsNTkgQEAKK1BST0cgPSBsem1hLmV4ZQ0KK01ZX0NPTlNPTEUgPSAxDQorQ0ZMQUdTID0gJChDRkxBR1MpDQorDQorQ1VSUkVOVF9PQkpTID0gXA0KKyAgJE9cTHptYUFsb25lLm9iaiBcDQorDQorQ09NUFJFU1NfT0JKUyA9IFwNCisgICRPXEx6bWFEZWNvZGVyLm9iaiBcDQorICAkT1xMem1hRW5jb2Rlci5vYmogXA0KKyAgJE9cTHptYVJlZ2lzdGVyLm9iaiBcDQorDQorQ09NTU9OX09CSlMgPSBcDQorICAkT1xDb21tYW5kTGluZVBhcnNlci5vYmogXA0KKyAgJE9cQ1JDLm9iaiBcDQorICAkT1xDcmNSZWcub2JqIFwNCisgICRPXEludFRvU3RyaW5nLm9iaiBcDQorICAkT1xNeVN0cmluZy5vYmogXA0KKyAgJE9cTmV3SGFuZGxlci5vYmogXA0KKyAgJE9cU3RyaW5nQ29udmVydC5vYmogXA0KKyAgJE9cU3RyaW5nVG9JbnQub2JqIFwNCisgICRPXE15VmVjdG9yLm9iag0KKw0KK1dJTl9PQkpTID0gXA0KKyAgJE9cRmlsZUlPLm9iaiBcDQorICAkT1xQcm9wVmFyaWFudC5vYmogXA0KKyAgJE9cU3lzdGVtLm9iag0KKw0KKzdaSVBfQ09NTU9OX09CSlMgPSBcDQorICAkT1xDV3JhcHBlcnMub2JqIFwNCisgICRPXENyZWF0ZUNvZGVyLm9iaiBcDQorICAkT1xGaWxlU3RyZWFtcy5vYmogXA0KKyAgJE9cRmlsdGVyQ29kZXIub2JqIFwNCisgICRPXE1ldGhvZFByb3BzLm9iaiBcDQorICAkT1xPdXRCdWZmZXIub2JqIFwNCisgICRPXFN0cmVhbVV0aWxzLm9iaiBcDQorDQorVUlfQ09NTU9OX09CSlMgPSBcDQorICAkT1xCZW5jaC5vYmogXA0KKw0KK0NPTlNPTEVfT0JKUyA9IFwNCisgICRPXENvbnNvbGVDbG9zZS5vYmogXA0KKyAgJE9cQmVuY2hDb24ub2JqIFwNCisNCitDX09CSlMgPSBcDQorICAkT1xBbGxvYy5vYmogXA0KKyAgJE9cQnJhODYub2JqIFwNCisgICRPXENwdUFyY2gub2JqIFwNCisgICRPXEx6RmluZC5vYmogXA0KKyAgJE9cTHpGaW5kTXQub2JqIFwNCisgICRPXEx6bWE4NkRlYy5vYmogXA0KKyAgJE9cTHptYTg2RW5jLm9iaiBcDQorICAkT1xMem1hRGVjLm9iaiBcDQorICAkT1xMem1hRW5jLm9iaiBcDQorICAkT1xUaHJlYWRzLm9iaiBcDQorDQorIWluY2x1ZGUgIi4uLy4uL0NyYy5tYWsiDQorDQorIWluY2x1ZGUgIi4uLy4uLzd6aXAubWFrIg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Mem1hQ29uL21ha2VmaWxlLmdjYyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Mem1hQ29uL21ha2VmaWxlLmdjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTllMjdhCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL0x6bWFDb24vbWFrZWZpbGUuZ2NjCkBAIC0wLDAgKzEsMTk4IEBACitQUk9HID0gbHptYQ0KK0NYWCA9IGcrKyAtTzINCisjIC1XYWxsIC1XZXJyb3IgLVduby1kZWxldGUtbm9uLXZpcnR1YWwtZHRvcg0KK0NYWF9DID0gZ2NjIC1PMiAtV2FsbCAtV2Vycm9yDQorDQoraWZkZWYgU3lzdGVtRHJpdmUNCitJU19NSU5HVyA9IDENCitlbmRpZg0KKw0KK2lmZGVmIElTX01JTkdXDQorDQorUk0gPSBkZWwNCitDRkxBR1MgPSAtYw0KK0xJQjIgPSAtbG9sZWF1dDMyIC1sdXVpZA0KK0xERkxBR1MgPSAtcw0KKw0KK0ZJTEVfSU8gPUZpbGVJTw0KK0ZJTEVfSU9fMiA9V2luZG93cy8kKEZJTEVfSU8pDQorDQorTVRfRklMRVMgPSBcDQorICBTeXN0ZW0ubyBcDQorICBMekZpbmRNdC5vIFwNCisgIFRocmVhZHMubyBcDQorDQorZWxzZQ0KKw0KK1JNID0gcm0gLWYNCitDRkxBR1MgPSAtYyAtRF83WklQX1NUDQorDQorRklMRV9JTyA9Q19GaWxlSU8NCitGSUxFX0lPXzIgPUNvbW1vbi8kKEZJTEVfSU8pDQorDQorDQorZW5kaWYNCisNCisNCitPQkpTID0gXA0KKyAgJChNVF9GSUxFUykgXA0KKyAgJChGSUxFX0lPKS5vIFwNCisgIEx6bWFBbG9uZS5vIFwNCisgIEJlbmNoLm8gXA0KKyAgQmVuY2hDb24ubyBcDQorICBDb25zb2xlQ2xvc2UubyBcDQorICBMem1hRGVjb2Rlci5vIFwNCisgIEx6bWFFbmNvZGVyLm8gXA0KKyAgTHptYVJlZ2lzdGVyLm8gXA0KKyAgQ3JlYXRlQ29kZXIubyBcDQorICBDV3JhcHBlcnMubyBcDQorICBGaWxlU3RyZWFtcy5vIFwNCisgIEZpbHRlckNvZGVyLm8gXA0KKyAgTWV0aG9kUHJvcHMubyBcDQorICBTdHJlYW1VdGlscy5vIFwNCisgIENvbW1hbmRMaW5lUGFyc2VyLm8gXA0KKyAgQ1JDLm8gXA0KKyAgQ3JjUmVnLm8gXA0KKyAgSW50VG9TdHJpbmcubyBcDQorICBNeVN0cmluZy5vIFwNCisgIE15VmVjdG9yLm8gXA0KKyAgTXlXaW5kb3dzLm8gXA0KKyAgU3RyaW5nQ29udmVydC5vIFwNCisgIFN0cmluZ1RvSW50Lm8gXA0KKyAgUHJvcFZhcmlhbnQubyBcDQorICA3ekNyYy5vIFwNCisgIDd6Q3JjT3B0Lm8gXA0KKyAgQWxsb2MubyBcDQorICBCcmE4Ni5vIFwNCisgIENwdUFyY2gubyBcDQorICBMekZpbmQubyBcDQorICBMem1hRGVjLm8gXA0KKyAgTHptYUVuYy5vIFwNCisgIEx6bWE4NkRlYy5vIFwNCisgIEx6bWE4NkVuYy5vIFwNCisNCisNCithbGw6ICQoUFJPRykNCisNCiskKFBST0cpOiAkKE9CSlMpDQorCSQoQ1hYKSAtbyAkKFBST0cpICQoTERGTEFHUykgJChPQkpTKSAkKExJQjIpDQorDQorTHptYUFsb25lLm86IEx6bWFBbG9uZS5jcHANCisJJChDWFgpICQoQ0ZMQUdTKSBMem1hQWxvbmUuY3BwDQorDQorQmVuY2gubzogLi4vLi4vVUkvQ29tbW9uL0JlbmNoLmNwcA0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uL1VJL0NvbW1vbi9CZW5jaC5jcHANCisNCitCZW5jaENvbi5vOiAuLi8uLi9VSS9Db25zb2xlL0JlbmNoQ29uLmNwcA0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uL1VJL0NvbnNvbGUvQmVuY2hDb24uY3BwDQorDQorQ29uc29sZUNsb3NlLm86IC4uLy4uL1VJL0NvbnNvbGUvQ29uc29sZUNsb3NlLmNwcA0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uL1VJL0NvbnNvbGUvQ29uc29sZUNsb3NlLmNwcA0KKw0KK0x6bWFEZWNvZGVyLm86IC4uLy4uL0NvbXByZXNzL0x6bWFEZWNvZGVyLmNwcA0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uL0NvbXByZXNzL0x6bWFEZWNvZGVyLmNwcA0KKw0KK0x6bWFFbmNvZGVyLm86IC4uLy4uL0NvbXByZXNzL0x6bWFFbmNvZGVyLmNwcA0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uL0NvbXByZXNzL0x6bWFFbmNvZGVyLmNwcA0KKw0KK0x6bWFSZWdpc3Rlci5vOiAuLi8uLi9Db21wcmVzcy9Mem1hUmVnaXN0ZXIuY3BwDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vQ29tcHJlc3MvTHptYVJlZ2lzdGVyLmNwcA0KKw0KK0NyZWF0ZUNvZGVyLm86IC4uLy4uL0NvbW1vbi9DcmVhdGVDb2Rlci5jcHANCisJJChDWFgpICQoQ0ZMQUdTKSAuLi8uLi9Db21tb24vQ3JlYXRlQ29kZXIuY3BwDQorDQorQ1dyYXBwZXJzLm86IC4uLy4uL0NvbW1vbi9DV3JhcHBlcnMuY3BwDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vQ29tbW9uL0NXcmFwcGVycy5jcHANCisNCitGaWxlU3RyZWFtcy5vOiAuLi8uLi9Db21tb24vRmlsZVN0cmVhbXMuY3BwDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vQ29tbW9uL0ZpbGVTdHJlYW1zLmNwcA0KKw0KK0ZpbHRlckNvZGVyLm86IC4uLy4uL0NvbW1vbi9GaWx0ZXJDb2Rlci5jcHANCisJJChDWFgpICQoQ0ZMQUdTKSAuLi8uLi9Db21tb24vRmlsdGVyQ29kZXIuY3BwDQorDQorTWV0aG9kUHJvcHMubzogLi4vLi4vQ29tbW9uL01ldGhvZFByb3BzLmNwcA0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uL0NvbW1vbi9NZXRob2RQcm9wcy5jcHANCisNCitTdHJlYW1VdGlscy5vOiAuLi8uLi9Db21tb24vU3RyZWFtVXRpbHMuY3BwDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vQ29tbW9uL1N0cmVhbVV0aWxzLmNwcA0KKw0KKyQoRklMRV9JTykubzogLi4vLi4vLi4vJChGSUxFX0lPXzIpLmNwcA0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uLy4uLyQoRklMRV9JT18yKS5jcHANCisNCisNCitDb21tYW5kTGluZVBhcnNlci5vOiAuLi8uLi8uLi9Db21tb24vQ29tbWFuZExpbmVQYXJzZXIuY3BwDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vLi4vQ29tbW9uL0NvbW1hbmRMaW5lUGFyc2VyLmNwcA0KKw0KK0NSQy5vOiAuLi8uLi8uLi9Db21tb24vQ1JDLmNwcA0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uLy4uL0NvbW1vbi9DUkMuY3BwDQorDQorQ3JjUmVnLm86IC4uLy4uLy4uL0NvbW1vbi9DcmNSZWcuY3BwDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vLi4vQ29tbW9uL0NyY1JlZy5jcHANCisNCitJbnRUb1N0cmluZy5vOiAuLi8uLi8uLi9Db21tb24vSW50VG9TdHJpbmcuY3BwDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vLi4vQ29tbW9uL0ludFRvU3RyaW5nLmNwcA0KKw0KK015U3RyaW5nLm86IC4uLy4uLy4uL0NvbW1vbi9NeVN0cmluZy5jcHANCisJJChDWFgpICQoQ0ZMQUdTKSAuLi8uLi8uLi9Db21tb24vTXlTdHJpbmcuY3BwDQorDQorTXlWZWN0b3IubzogLi4vLi4vLi4vQ29tbW9uL015VmVjdG9yLmNwcA0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uLy4uL0NvbW1vbi9NeVZlY3Rvci5jcHANCisNCitNeVdpbmRvd3MubzogLi4vLi4vLi4vQ29tbW9uL015V2luZG93cy5jcHANCisJJChDWFgpICQoQ0ZMQUdTKSAuLi8uLi8uLi9Db21tb24vTXlXaW5kb3dzLmNwcA0KKw0KK1N0cmluZ0NvbnZlcnQubzogLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuY3BwDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuY3BwDQorDQorU3RyaW5nVG9JbnQubzogLi4vLi4vLi4vQ29tbW9uL1N0cmluZ1RvSW50LmNwcA0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uLy4uL0NvbW1vbi9TdHJpbmdUb0ludC5jcHANCisNCitQcm9wVmFyaWFudC5vOiAuLi8uLi8uLi9XaW5kb3dzL1Byb3BWYXJpYW50LmNwcA0KKwkkKENYWCkgJChDRkxBR1MpIC4uLy4uLy4uL1dpbmRvd3MvUHJvcFZhcmlhbnQuY3BwDQorDQoraWZkZWYgTVRfRklMRVMNCitTeXN0ZW0ubzogLi4vLi4vLi4vV2luZG93cy9TeXN0ZW0uY3BwDQorCSQoQ1hYKSAkKENGTEFHUykgLi4vLi4vLi4vV2luZG93cy9TeXN0ZW0uY3BwDQorZW5kaWYNCisNCis3ekNyYy5vOiAuLi8uLi8uLi8uLi9DLzd6Q3JjLmMNCisJJChDWFhfQykgJChDRkxBR1MpIC4uLy4uLy4uLy4uL0MvN3pDcmMuYw0KKw0KKzd6Q3JjT3B0Lm86IC4uLy4uLy4uLy4uL0MvN3pDcmNPcHQuYw0KKwkkKENYWF9DKSAkKENGTEFHUykgLi4vLi4vLi4vLi4vQy83ekNyY09wdC5jDQorDQorQWxsb2MubzogLi4vLi4vLi4vLi4vQy9BbGxvYy5jDQorCSQoQ1hYX0MpICQoQ0ZMQUdTKSAuLi8uLi8uLi8uLi9DL0FsbG9jLmMNCisNCitCcmE4Ni5vOiAuLi8uLi8uLi8uLi9DL0JyYTg2LmMNCisJJChDWFhfQykgJChDRkxBR1MpIC4uLy4uLy4uLy4uL0MvQnJhODYuYw0KKw0KK0NwdUFyY2gubzogLi4vLi4vLi4vLi4vQy9DcHVBcmNoLmMNCisJJChDWFhfQykgJChDRkxBR1MpIC4uLy4uLy4uLy4uL0MvQ3B1QXJjaC5jDQorDQorTHpGaW5kLm86IC4uLy4uLy4uLy4uL0MvTHpGaW5kLmMNCisJJChDWFhfQykgJChDRkxBR1MpIC4uLy4uLy4uLy4uL0MvTHpGaW5kLmMNCisNCitpZmRlZiBNVF9GSUxFUw0KK0x6RmluZE10Lm86IC4uLy4uLy4uLy4uL0MvTHpGaW5kTXQuYw0KKwkkKENYWF9DKSAkKENGTEFHUykgLi4vLi4vLi4vLi4vQy9MekZpbmRNdC5jDQorDQorVGhyZWFkcy5vOiAuLi8uLi8uLi8uLi9DL1RocmVhZHMuYw0KKwkkKENYWF9DKSAkKENGTEFHUykgLi4vLi4vLi4vLi4vQy9UaHJlYWRzLmMNCitlbmRpZg0KKw0KK0x6bWFEZWMubzogLi4vLi4vLi4vLi4vQy9Mem1hRGVjLmMNCisJJChDWFhfQykgJChDRkxBR1MpIC4uLy4uLy4uLy4uL0MvTHptYURlYy5jDQorDQorTHptYUVuYy5vOiAuLi8uLi8uLi8uLi9DL0x6bWFFbmMuYw0KKwkkKENYWF9DKSAkKENGTEFHUykgLi4vLi4vLi4vLi4vQy9Mem1hRW5jLmMNCisNCitMem1hODZEZWMubzogLi4vLi4vLi4vLi4vQy9Mem1hODZEZWMuYw0KKwkkKENYWF9DKSAkKENGTEFHUykgLi4vLi4vLi4vLi4vQy9Mem1hODZEZWMuYw0KKw0KK0x6bWE4NkVuYy5vOiAuLi8uLi8uLi8uLi9DL0x6bWE4NkVuYy5jDQorCSQoQ1hYX0MpICQoQ0ZMQUdTKSAuLi8uLi8uLi8uLi9DL0x6bWE4NkVuYy5jDQorDQorY2xlYW46DQorCS0kKFJNKSAkKFBST0cpICQoT0JKUykNCisNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvTHptYUNvbi9yZXNvdXJjZS5yYyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Mem1hQ29uL3Jlc291cmNlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNTkxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvTHptYUNvbi9yZXNvdXJjZS5yYwpAQCAtMCwwICsxLDMgQEAKKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9DLzd6VmVyc2lvbi5yYyINCisNCitNWV9WRVJTSU9OX0lORk9fQVBQKCJMWk1BIiwgImx6bWEiKQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9Mem1hU3BlYy9Mem1hU3BlYy5jcHAgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvTHptYVNwZWMvTHptYVNwZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNzkxMjMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvTHptYVNwZWMvTHptYVNwZWMuY3BwCkBAIC0wLDAgKzEsNzEzIEBACisvKiBMem1hU3BlYy5jIC0tIExaTUEgUmVmZXJlbmNlIERlY29kZXINCisyMDEzLTA3LTI4IDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluICovDQorDQorLy8gVGhpcyBjb2RlIGltcGxlbWVudHMgTFpNQSBmaWxlIGRlY29kaW5nIGFjY29yZGluZyB0byBMWk1BIHNwZWNpZmljYXRpb24uDQorLy8gVGhpcyBjb2RlIGlzIG5vdCBvcHRpbWl6ZWQgZm9yIHNwZWVkLg0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKw0KKyNpZmRlZiBfTVNDX1ZFUg0KKyAgI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0NzEwKSAvLyBmdW5jdGlvbiBub3QgaW5saW5lZA0KKyAgI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0OTk2KSAvLyBUaGlzIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIG1heSBiZSB1bnNhZmUNCisjZW5kaWYNCisNCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQnl0ZTsNCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVJbnQxNjsNCisNCisjaWZkZWYgX0xaTUFfVUlOVDMyX0lTX1VMT05HDQorICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUludDMyOw0KKyNlbHNlDQorICB0eXBlZGVmIHVuc2lnbmVkIGludCBVSW50MzI7DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQ0KKyAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IFVJbnQ2NDsNCisjZWxzZQ0KKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IFVJbnQ2NDsNCisjZW5kaWYNCisNCisNCitzdHJ1Y3QgQ0lucHV0U3RyZWFtDQorew0KKyAgRklMRSAqRmlsZTsNCisgIFVJbnQ2NCBQcm9jZXNzZWQ7DQorICANCisgIHZvaWQgSW5pdCgpIHsgUHJvY2Vzc2VkID0gMDsgfQ0KKw0KKyAgQnl0ZSBSZWFkQnl0ZSgpDQorICB7DQorICAgIGludCBjID0gZ2V0YyhGaWxlKTsNCisgICAgaWYgKGMgPCAwKQ0KKyAgICAgIHRocm93ICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIjsNCisgICAgUHJvY2Vzc2VkKys7DQorICAgIHJldHVybiAoQnl0ZSljOw0KKyAgfQ0KK307DQorDQorDQorc3RydWN0IENPdXRTdHJlYW0NCit7DQorICBGSUxFICpGaWxlOw0KKyAgVUludDY0IFByb2Nlc3NlZDsNCisNCisgIHZvaWQgSW5pdCgpIHsgUHJvY2Vzc2VkID0gMDsgfQ0KKw0KKyAgdm9pZCBXcml0ZUJ5dGUoQnl0ZSBiKQ0KKyAgew0KKyAgICBpZiAocHV0YyhiLCBGaWxlKSA9PSBFT0YpDQorICAgICAgdGhyb3cgIkZpbGUgd3JpdGluZyBlcnJvciI7DQorICAgIFByb2Nlc3NlZCsrOw0KKyAgfQ0KK307DQorDQorDQorY2xhc3MgQ091dFdpbmRvdw0KK3sNCisgIEJ5dGUgKkJ1ZjsNCisgIFVJbnQzMiBQb3M7DQorICBVSW50MzIgU2l6ZTsNCisgIGJvb2wgSXNGdWxsOw0KKw0KK3B1YmxpYzoNCisgIHVuc2lnbmVkIFRvdGFsUG9zOw0KKyAgQ091dFN0cmVhbSBPdXRTdHJlYW07DQorDQorICBDT3V0V2luZG93KCk6IEJ1ZihOVUxMKSB7fQ0KKyAgfkNPdXRXaW5kb3coKSB7IGRlbGV0ZSBbXUJ1ZjsgfQ0KKyANCisgIHZvaWQgQ3JlYXRlKFVJbnQzMiBkaWN0U2l6ZSkNCisgIHsNCisgICAgQnVmID0gbmV3IEJ5dGVbZGljdFNpemVdOw0KKyAgICBQb3MgPSAwOw0KKyAgICBTaXplID0gZGljdFNpemU7DQorICAgIElzRnVsbCA9IGZhbHNlOw0KKyAgICBUb3RhbFBvcyA9IDA7DQorICB9DQorDQorICB2b2lkIFB1dEJ5dGUoQnl0ZSBiKQ0KKyAgew0KKyAgICBUb3RhbFBvcysrOw0KKyAgICBCdWZbUG9zKytdID0gYjsNCisgICAgaWYgKFBvcyA9PSBTaXplKQ0KKyAgICB7DQorICAgICAgUG9zID0gMDsNCisgICAgICBJc0Z1bGwgPSB0cnVlOw0KKyAgICB9DQorICAgIE91dFN0cmVhbS5Xcml0ZUJ5dGUoYik7DQorICB9DQorDQorICBCeXRlIEdldEJ5dGUoVUludDMyIGRpc3QpIGNvbnN0DQorICB7DQorICAgIHJldHVybiBCdWZbZGlzdCA8PSBQb3MgPyBQb3MgLSBkaXN0IDogU2l6ZSAtIGRpc3QgKyBQb3NdOw0KKyAgfQ0KKw0KKyAgdm9pZCBDb3B5TWF0Y2goVUludDMyIGRpc3QsIHVuc2lnbmVkIGxlbikNCisgIHsNCisgICAgZm9yICg7IGxlbiA+IDA7IGxlbi0tKQ0KKyAgICAgIFB1dEJ5dGUoR2V0Qnl0ZShkaXN0KSk7DQorICB9DQorDQorICBib29sIENoZWNrRGlzdGFuY2UoVUludDMyIGRpc3QpIGNvbnN0DQorICB7DQorICAgIHJldHVybiBkaXN0IDw9IFBvcyB8fCBJc0Z1bGw7DQorICB9DQorDQorICBib29sIElzRW1wdHkoKSBjb25zdA0KKyAgew0KKyAgICByZXR1cm4gUG9zID09IDAgJiYgIUlzRnVsbDsNCisgIH0NCit9Ow0KKw0KKw0KKyNkZWZpbmUga051bUJpdE1vZGVsVG90YWxCaXRzIDExDQorI2RlZmluZSBrTnVtTW92ZUJpdHMgNQ0KKw0KK3R5cGVkZWYgVUludDE2IENQcm9iOw0KKw0KKyNkZWZpbmUgUFJPQl9JTklUX1ZBTCAoKDEgPDwga051bUJpdE1vZGVsVG90YWxCaXRzKSAvIDIpDQorDQorI2RlZmluZSBJTklUX1BST0JTKHApIFwNCisgeyBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZW9mKHApIC8gc2l6ZW9mKHBbMF0pOyBpKyspIHBbaV0gPSBQUk9CX0lOSVRfVkFMOyB9DQorDQorY2xhc3MgQ1JhbmdlRGVjb2Rlcg0KK3sNCisgIFVJbnQzMiBSYW5nZTsNCisgIFVJbnQzMiBDb2RlOw0KKw0KKyAgdm9pZCBOb3JtYWxpemUoKTsNCisNCitwdWJsaWM6DQorDQorICBDSW5wdXRTdHJlYW0gKkluU3RyZWFtOw0KKyAgYm9vbCBDb3JydXB0ZWQ7DQorDQorICB2b2lkIEluaXQoKTsNCisgIGJvb2wgSXNGaW5pc2hlZE9LKCkgY29uc3QgeyByZXR1cm4gQ29kZSA9PSAwOyB9DQorDQorICBVSW50MzIgRGVjb2RlRGlyZWN0Qml0cyh1bnNpZ25lZCBudW1CaXRzKTsNCisgIHVuc2lnbmVkIERlY29kZUJpdChDUHJvYiAqcHJvYik7DQorfTsNCisNCit2b2lkIENSYW5nZURlY29kZXI6OkluaXQoKQ0KK3sNCisgIENvcnJ1cHRlZCA9IGZhbHNlOw0KKyAgDQorICBpZiAoSW5TdHJlYW0tPlJlYWRCeXRlKCkgIT0gMCkNCisgICAgQ29ycnVwdGVkID0gdHJ1ZTsNCisgIA0KKyAgUmFuZ2UgPSAweEZGRkZGRkZGOw0KKyAgQ29kZSA9IDA7DQorICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykNCisgICAgQ29kZSA9IChDb2RlIDw8IDgpIHwgSW5TdHJlYW0tPlJlYWRCeXRlKCk7DQorICANCisgIGlmIChDb2RlID09IFJhbmdlKQ0KKyAgICBDb3JydXB0ZWQgPSB0cnVlOw0KK30NCisNCisjZGVmaW5lIGtUb3BWYWx1ZSAoKFVJbnQzMikxIDw8IDI0KQ0KKw0KK3ZvaWQgQ1JhbmdlRGVjb2Rlcjo6Tm9ybWFsaXplKCkNCit7DQorICBpZiAoUmFuZ2UgPCBrVG9wVmFsdWUpDQorICB7DQorICAgIFJhbmdlIDw8PSA4Ow0KKyAgICBDb2RlID0gKENvZGUgPDwgOCkgfCBJblN0cmVhbS0+UmVhZEJ5dGUoKTsNCisgIH0NCit9DQorDQorVUludDMyIENSYW5nZURlY29kZXI6OkRlY29kZURpcmVjdEJpdHModW5zaWduZWQgbnVtQml0cykNCit7DQorICBVSW50MzIgcmVzID0gMDsNCisgIGRvDQorICB7DQorICAgIFJhbmdlID4+PSAxOw0KKyAgICBDb2RlIC09IFJhbmdlOw0KKyAgICBVSW50MzIgdCA9IDAgLSAoKFVJbnQzMilDb2RlID4+IDMxKTsNCisgICAgQ29kZSArPSBSYW5nZSAmIHQ7DQorICAgIA0KKyAgICBpZiAoQ29kZSA9PSBSYW5nZSkNCisgICAgICBDb3JydXB0ZWQgPSB0cnVlOw0KKyAgICANCisgICAgTm9ybWFsaXplKCk7DQorICAgIHJlcyA8PD0gMTsNCisgICAgcmVzICs9IHQgKyAxOw0KKyAgfQ0KKyAgd2hpbGUgKC0tbnVtQml0cyk7DQorICByZXR1cm4gcmVzOw0KK30NCisNCit1bnNpZ25lZCBDUmFuZ2VEZWNvZGVyOjpEZWNvZGVCaXQoQ1Byb2IgKnByb2IpDQorew0KKyAgdW5zaWduZWQgdiA9ICpwcm9iOw0KKyAgVUludDMyIGJvdW5kID0gKFJhbmdlID4+IGtOdW1CaXRNb2RlbFRvdGFsQml0cykgKiB2Ow0KKyAgdW5zaWduZWQgc3ltYm9sOw0KKyAgaWYgKENvZGUgPCBib3VuZCkNCisgIHsNCisgICAgdiArPSAoKDEgPDwga051bUJpdE1vZGVsVG90YWxCaXRzKSAtIHYpID4+IGtOdW1Nb3ZlQml0czsNCisgICAgUmFuZ2UgPSBib3VuZDsNCisgICAgc3ltYm9sID0gMDsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgdiAtPSB2ID4+IGtOdW1Nb3ZlQml0czsNCisgICAgQ29kZSAtPSBib3VuZDsNCisgICAgUmFuZ2UgLT0gYm91bmQ7DQorICAgIHN5bWJvbCA9IDE7DQorICB9DQorICAqcHJvYiA9IChDUHJvYil2Ow0KKyAgTm9ybWFsaXplKCk7DQorICByZXR1cm4gc3ltYm9sOw0KK30NCisNCisNCit1bnNpZ25lZCBCaXRUcmVlUmV2ZXJzZURlY29kZShDUHJvYiAqcHJvYnMsIHVuc2lnbmVkIG51bUJpdHMsIENSYW5nZURlY29kZXIgKnJjKQ0KK3sNCisgIHVuc2lnbmVkIG0gPSAxOw0KKyAgdW5zaWduZWQgc3ltYm9sID0gMDsNCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1CaXRzOyBpKyspDQorICB7DQorICAgIHVuc2lnbmVkIGJpdCA9IHJjLT5EZWNvZGVCaXQoJnByb2JzW21dKTsNCisgICAgbSA8PD0gMTsNCisgICAgbSArPSBiaXQ7DQorICAgIHN5bWJvbCB8PSAoYml0IDw8IGkpOw0KKyAgfQ0KKyAgcmV0dXJuIHN5bWJvbDsNCit9DQorDQordGVtcGxhdGUgPHVuc2lnbmVkIE51bUJpdHM+DQorY2xhc3MgQ0JpdFRyZWVEZWNvZGVyDQorew0KKyAgQ1Byb2IgUHJvYnNbKHVuc2lnbmVkKTEgPDwgTnVtQml0c107DQorDQorcHVibGljOg0KKw0KKyAgdm9pZCBJbml0KCkNCisgIHsNCisgICAgSU5JVF9QUk9CUyhQcm9icyk7DQorICB9DQorDQorICB1bnNpZ25lZCBEZWNvZGUoQ1JhbmdlRGVjb2RlciAqcmMpDQorICB7DQorICAgIHVuc2lnbmVkIG0gPSAxOw0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtQml0czsgaSsrKQ0KKyAgICAgIG0gPSAobSA8PCAxKSArIHJjLT5EZWNvZGVCaXQoJlByb2JzW21dKTsNCisgICAgcmV0dXJuIG0gLSAoKHVuc2lnbmVkKTEgPDwgTnVtQml0cyk7DQorICB9DQorDQorICB1bnNpZ25lZCBSZXZlcnNlRGVjb2RlKENSYW5nZURlY29kZXIgKnJjKQ0KKyAgew0KKyAgICByZXR1cm4gQml0VHJlZVJldmVyc2VEZWNvZGUoUHJvYnMsIE51bUJpdHMsIHJjKTsNCisgIH0NCit9Ow0KKw0KKyNkZWZpbmUga051bVBvc0JpdHNNYXggNA0KKw0KKyNkZWZpbmUga051bVN0YXRlcyAxMg0KKyNkZWZpbmUga051bUxlblRvUG9zU3RhdGVzIDQNCisjZGVmaW5lIGtOdW1BbGlnbkJpdHMgNA0KKyNkZWZpbmUga1N0YXJ0UG9zTW9kZWxJbmRleCA0DQorI2RlZmluZSBrRW5kUG9zTW9kZWxJbmRleCAxNA0KKyNkZWZpbmUga051bUZ1bGxEaXN0YW5jZXMgKDEgPDwgKGtFbmRQb3NNb2RlbEluZGV4ID4+IDEpKQ0KKyNkZWZpbmUga01hdGNoTWluTGVuIDINCisNCitjbGFzcyBDTGVuRGVjb2Rlcg0KK3sNCisgIENQcm9iIENob2ljZTsNCisgIENQcm9iIENob2ljZTI7DQorICBDQml0VHJlZURlY29kZXI8Mz4gTG93Q29kZXJbMSA8PCBrTnVtUG9zQml0c01heF07DQorICBDQml0VHJlZURlY29kZXI8Mz4gTWlkQ29kZXJbMSA8PCBrTnVtUG9zQml0c01heF07DQorICBDQml0VHJlZURlY29kZXI8OD4gSGlnaENvZGVyOw0KKw0KK3B1YmxpYzoNCisNCisgIHZvaWQgSW5pdCgpDQorICB7DQorICAgIENob2ljZSA9IFBST0JfSU5JVF9WQUw7DQorICAgIENob2ljZTIgPSBQUk9CX0lOSVRfVkFMOw0KKyAgICBIaWdoQ29kZXIuSW5pdCgpOw0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgKDEgPDwga051bVBvc0JpdHNNYXgpOyBpKyspDQorICAgIHsNCisgICAgICBMb3dDb2RlcltpXS5Jbml0KCk7DQorICAgICAgTWlkQ29kZXJbaV0uSW5pdCgpOw0KKyAgICB9DQorICB9DQorDQorICB1bnNpZ25lZCBEZWNvZGUoQ1JhbmdlRGVjb2RlciAqcmMsIHVuc2lnbmVkIHBvc1N0YXRlKQ0KKyAgew0KKyAgICBpZiAocmMtPkRlY29kZUJpdCgmQ2hvaWNlKSA9PSAwKQ0KKyAgICAgIHJldHVybiBMb3dDb2Rlcltwb3NTdGF0ZV0uRGVjb2RlKHJjKTsNCisgICAgaWYgKHJjLT5EZWNvZGVCaXQoJkNob2ljZTIpID09IDApDQorICAgICAgcmV0dXJuIDggKyBNaWRDb2Rlcltwb3NTdGF0ZV0uRGVjb2RlKHJjKTsNCisgICAgcmV0dXJuIDE2ICsgSGlnaENvZGVyLkRlY29kZShyYyk7DQorICB9DQorfTsNCisNCit1bnNpZ25lZCBVcGRhdGVTdGF0ZV9MaXRlcmFsKHVuc2lnbmVkIHN0YXRlKQ0KK3sNCisgIGlmIChzdGF0ZSA8IDQpIHJldHVybiAwOw0KKyAgZWxzZSBpZiAoc3RhdGUgPCAxMCkgcmV0dXJuIHN0YXRlIC0gMzsNCisgIGVsc2UgcmV0dXJuIHN0YXRlIC0gNjsNCit9DQordW5zaWduZWQgVXBkYXRlU3RhdGVfTWF0Y2ggICAodW5zaWduZWQgc3RhdGUpIHsgcmV0dXJuIHN0YXRlIDwgNyA/IDcgOiAxMDsgfQ0KK3Vuc2lnbmVkIFVwZGF0ZVN0YXRlX1JlcCAgICAgKHVuc2lnbmVkIHN0YXRlKSB7IHJldHVybiBzdGF0ZSA8IDcgPyA4IDogMTE7IH0NCit1bnNpZ25lZCBVcGRhdGVTdGF0ZV9TaG9ydFJlcCh1bnNpZ25lZCBzdGF0ZSkgeyByZXR1cm4gc3RhdGUgPCA3ID8gOSA6IDExOyB9DQorDQorI2RlZmluZSBMWk1BX0RJQ19NSU4gKDEgPDwgMTIpDQorDQorY2xhc3MgQ0x6bWFEZWNvZGVyDQorew0KK3B1YmxpYzoNCisgIENSYW5nZURlY29kZXIgUmFuZ2VEZWM7DQorICBDT3V0V2luZG93IE91dFdpbmRvdzsNCisNCisgIGJvb2wgbWFya2VySXNNYW5kYXRvcnk7DQorICB1bnNpZ25lZCBsYywgcGIsIGxwOw0KKyAgVUludDMyIGRpY3RTaXplOw0KKyAgVUludDMyIGRpY3RTaXplSW5Qcm9wZXJ0aWVzOw0KKw0KKyAgdm9pZCBEZWNvZGVQcm9wZXJ0aWVzKGNvbnN0IEJ5dGUgKnByb3BlcnRpZXMpDQorICB7DQorICAgIHVuc2lnbmVkIGQgPSBwcm9wZXJ0aWVzWzBdOw0KKyAgICBpZiAoZCA+PSAoOSAqIDUgKiA1KSkNCisgICAgICB0aHJvdyAiSW5jb3JyZWN0IExaTUEgcHJvcGVydGllcyI7DQorICAgIGxjID0gZCAlIDk7DQorICAgIGQgLz0gOTsNCisgICAgcGIgPSBkIC8gNTsNCisgICAgbHAgPSBkICUgNTsNCisgICAgZGljdFNpemVJblByb3BlcnRpZXMgPSAwOw0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykNCisgICAgICBkaWN0U2l6ZUluUHJvcGVydGllcyB8PSAoVUludDMyKXByb3BlcnRpZXNbaSArIDFdIDw8ICg4ICogaSk7DQorICAgIGRpY3RTaXplID0gZGljdFNpemVJblByb3BlcnRpZXM7DQorICAgIGlmIChkaWN0U2l6ZSA8IExaTUFfRElDX01JTikNCisgICAgICBkaWN0U2l6ZSA9IExaTUFfRElDX01JTjsNCisgIH0NCisNCisgIENMem1hRGVjb2RlcigpOiBMaXRQcm9icyhOVUxMKSB7fQ0KKyAgfkNMem1hRGVjb2RlcigpIHsgZGVsZXRlIFtdTGl0UHJvYnM7IH0NCisNCisgIHZvaWQgQ3JlYXRlKCkNCisgIHsNCisgICAgT3V0V2luZG93LkNyZWF0ZShkaWN0U2l6ZSk7DQorICAgIENyZWF0ZUxpdGVyYWxzKCk7DQorICB9DQorDQorICBpbnQgRGVjb2RlKGJvb2wgdW5wYWNrU2l6ZURlZmluZWQsIFVJbnQ2NCB1bnBhY2tTaXplKTsNCisgIA0KK3ByaXZhdGU6DQorDQorICBDUHJvYiAqTGl0UHJvYnM7DQorDQorICB2b2lkIENyZWF0ZUxpdGVyYWxzKCkNCisgIHsNCisgICAgTGl0UHJvYnMgPSBuZXcgQ1Byb2JbKFVJbnQzMikweDMwMCA8PCAobGMgKyBscCldOw0KKyAgfQ0KKyAgDQorICB2b2lkIEluaXRMaXRlcmFscygpDQorICB7DQorICAgIFVJbnQzMiBudW0gPSAoVUludDMyKTB4MzAwIDw8IChsYyArIGxwKTsNCisgICAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBudW07IGkrKykNCisgICAgICBMaXRQcm9ic1tpXSA9IFBST0JfSU5JVF9WQUw7DQorICB9DQorICANCisgIHZvaWQgRGVjb2RlTGl0ZXJhbCh1bnNpZ25lZCBzdGF0ZSwgVUludDMyIHJlcDApDQorICB7DQorICAgIHVuc2lnbmVkIHByZXZCeXRlID0gMDsNCisgICAgaWYgKCFPdXRXaW5kb3cuSXNFbXB0eSgpKQ0KKyAgICAgIHByZXZCeXRlID0gT3V0V2luZG93LkdldEJ5dGUoMSk7DQorICAgIA0KKyAgICB1bnNpZ25lZCBzeW1ib2wgPSAxOw0KKyAgICB1bnNpZ25lZCBsaXRTdGF0ZSA9ICgoT3V0V2luZG93LlRvdGFsUG9zICYgKCgxIDw8IGxwKSAtIDEpKSA8PCBsYykgKyAocHJldkJ5dGUgPj4gKDggLSBsYykpOw0KKyAgICBDUHJvYiAqcHJvYnMgPSAmTGl0UHJvYnNbKFVJbnQzMikweDMwMCAqIGxpdFN0YXRlXTsNCisgICAgDQorICAgIGlmIChzdGF0ZSA+PSA3KQ0KKyAgICB7DQorICAgICAgdW5zaWduZWQgbWF0Y2hCeXRlID0gT3V0V2luZG93LkdldEJ5dGUocmVwMCArIDEpOw0KKyAgICAgIGRvDQorICAgICAgew0KKyAgICAgICAgdW5zaWduZWQgbWF0Y2hCaXQgPSAobWF0Y2hCeXRlID4+IDcpICYgMTsNCisgICAgICAgIG1hdGNoQnl0ZSA8PD0gMTsNCisgICAgICAgIHVuc2lnbmVkIGJpdCA9IFJhbmdlRGVjLkRlY29kZUJpdCgmcHJvYnNbKCgxICsgbWF0Y2hCaXQpIDw8IDgpICsgc3ltYm9sXSk7DQorICAgICAgICBzeW1ib2wgPSAoc3ltYm9sIDw8IDEpIHwgYml0Ow0KKyAgICAgICAgaWYgKG1hdGNoQml0ICE9IGJpdCkNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHdoaWxlIChzeW1ib2wgPCAweDEwMCk7DQorICAgIH0NCisgICAgd2hpbGUgKHN5bWJvbCA8IDB4MTAwKQ0KKyAgICAgIHN5bWJvbCA9IChzeW1ib2wgPDwgMSkgfCBSYW5nZURlYy5EZWNvZGVCaXQoJnByb2JzW3N5bWJvbF0pOw0KKyAgICBPdXRXaW5kb3cuUHV0Qnl0ZSgoQnl0ZSkoc3ltYm9sIC0gMHgxMDApKTsNCisgIH0NCisNCisgIENCaXRUcmVlRGVjb2Rlcjw2PiBQb3NTbG90RGVjb2RlcltrTnVtTGVuVG9Qb3NTdGF0ZXNdOw0KKyAgQ0JpdFRyZWVEZWNvZGVyPGtOdW1BbGlnbkJpdHM+IEFsaWduRGVjb2RlcjsNCisgIENQcm9iIFBvc0RlY29kZXJzWzEgKyBrTnVtRnVsbERpc3RhbmNlcyAtIGtFbmRQb3NNb2RlbEluZGV4XTsNCisgIA0KKyAgdm9pZCBJbml0RGlzdCgpDQorICB7DQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBrTnVtTGVuVG9Qb3NTdGF0ZXM7IGkrKykNCisgICAgICBQb3NTbG90RGVjb2RlcltpXS5Jbml0KCk7DQorICAgIEFsaWduRGVjb2Rlci5Jbml0KCk7DQorICAgIElOSVRfUFJPQlMoUG9zRGVjb2RlcnMpOw0KKyAgfQ0KKyAgDQorICB1bnNpZ25lZCBEZWNvZGVEaXN0YW5jZSh1bnNpZ25lZCBsZW4pDQorICB7DQorICAgIHVuc2lnbmVkIGxlblN0YXRlID0gbGVuOw0KKyAgICBpZiAobGVuU3RhdGUgPiBrTnVtTGVuVG9Qb3NTdGF0ZXMgLSAxKQ0KKyAgICAgIGxlblN0YXRlID0ga051bUxlblRvUG9zU3RhdGVzIC0gMTsNCisgICAgDQorICAgIHVuc2lnbmVkIHBvc1Nsb3QgPSBQb3NTbG90RGVjb2RlcltsZW5TdGF0ZV0uRGVjb2RlKCZSYW5nZURlYyk7DQorICAgIGlmIChwb3NTbG90IDwgNCkNCisgICAgICByZXR1cm4gcG9zU2xvdDsNCisgICAgDQorICAgIHVuc2lnbmVkIG51bURpcmVjdEJpdHMgPSAodW5zaWduZWQpKChwb3NTbG90ID4+IDEpIC0gMSk7DQorICAgIFVJbnQzMiBkaXN0ID0gKCgyIHwgKHBvc1Nsb3QgJiAxKSkgPDwgbnVtRGlyZWN0Qml0cyk7DQorICAgIGlmIChwb3NTbG90IDwga0VuZFBvc01vZGVsSW5kZXgpDQorICAgICAgZGlzdCArPSBCaXRUcmVlUmV2ZXJzZURlY29kZShQb3NEZWNvZGVycyArIGRpc3QgLSBwb3NTbG90LCBudW1EaXJlY3RCaXRzLCAmUmFuZ2VEZWMpOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBkaXN0ICs9IFJhbmdlRGVjLkRlY29kZURpcmVjdEJpdHMobnVtRGlyZWN0Qml0cyAtIGtOdW1BbGlnbkJpdHMpIDw8IGtOdW1BbGlnbkJpdHM7DQorICAgICAgZGlzdCArPSBBbGlnbkRlY29kZXIuUmV2ZXJzZURlY29kZSgmUmFuZ2VEZWMpOw0KKyAgICB9DQorICAgIHJldHVybiBkaXN0Ow0KKyAgfQ0KKw0KKyAgQ1Byb2IgSXNNYXRjaFtrTnVtU3RhdGVzIDw8IGtOdW1Qb3NCaXRzTWF4XTsNCisgIENQcm9iIElzUmVwW2tOdW1TdGF0ZXNdOw0KKyAgQ1Byb2IgSXNSZXBHMFtrTnVtU3RhdGVzXTsNCisgIENQcm9iIElzUmVwRzFba051bVN0YXRlc107DQorICBDUHJvYiBJc1JlcEcyW2tOdW1TdGF0ZXNdOw0KKyAgQ1Byb2IgSXNSZXAwTG9uZ1trTnVtU3RhdGVzIDw8IGtOdW1Qb3NCaXRzTWF4XTsNCisNCisgIENMZW5EZWNvZGVyIExlbkRlY29kZXI7DQorICBDTGVuRGVjb2RlciBSZXBMZW5EZWNvZGVyOw0KKw0KKyAgdm9pZCBJbml0KCkNCisgIHsNCisgICAgSW5pdExpdGVyYWxzKCk7DQorICAgIEluaXREaXN0KCk7DQorDQorICAgIElOSVRfUFJPQlMoSXNNYXRjaCk7DQorICAgIElOSVRfUFJPQlMoSXNSZXApOw0KKyAgICBJTklUX1BST0JTKElzUmVwRzApOw0KKyAgICBJTklUX1BST0JTKElzUmVwRzEpOw0KKyAgICBJTklUX1BST0JTKElzUmVwRzIpOw0KKyAgICBJTklUX1BST0JTKElzUmVwMExvbmcpOw0KKw0KKyAgICBMZW5EZWNvZGVyLkluaXQoKTsNCisgICAgUmVwTGVuRGVjb2Rlci5Jbml0KCk7DQorICB9DQorfTsNCisgICAgDQorDQorI2RlZmluZSBMWk1BX1JFU19FUlJPUiAgICAgICAgICAgICAgICAgICAwDQorI2RlZmluZSBMWk1BX1JFU19GSU5JU0hFRF9XSVRIX01BUktFUiAgICAxDQorI2RlZmluZSBMWk1BX1JFU19GSU5JU0hFRF9XSVRIT1VUX01BUktFUiAyDQorDQoraW50IENMem1hRGVjb2Rlcjo6RGVjb2RlKGJvb2wgdW5wYWNrU2l6ZURlZmluZWQsIFVJbnQ2NCB1bnBhY2tTaXplKQ0KK3sNCisgIEluaXQoKTsNCisgIFJhbmdlRGVjLkluaXQoKTsNCisNCisgIFVJbnQzMiByZXAwID0gMCwgcmVwMSA9IDAsIHJlcDIgPSAwLCByZXAzID0gMDsNCisgIHVuc2lnbmVkIHN0YXRlID0gMDsNCisgIA0KKyAgZm9yICg7OykNCisgIHsNCisgICAgaWYgKHVucGFja1NpemVEZWZpbmVkICYmIHVucGFja1NpemUgPT0gMCAmJiAhbWFya2VySXNNYW5kYXRvcnkpDQorICAgICAgaWYgKFJhbmdlRGVjLklzRmluaXNoZWRPSygpKQ0KKyAgICAgICAgcmV0dXJuIExaTUFfUkVTX0ZJTklTSEVEX1dJVEhPVVRfTUFSS0VSOw0KKw0KKyAgICB1bnNpZ25lZCBwb3NTdGF0ZSA9IE91dFdpbmRvdy5Ub3RhbFBvcyAmICgoMSA8PCBwYikgLSAxKTsNCisNCisgICAgaWYgKFJhbmdlRGVjLkRlY29kZUJpdCgmSXNNYXRjaFsoc3RhdGUgPDwga051bVBvc0JpdHNNYXgpICsgcG9zU3RhdGVdKSA9PSAwKQ0KKyAgICB7DQorICAgICAgaWYgKHVucGFja1NpemVEZWZpbmVkICYmIHVucGFja1NpemUgPT0gMCkNCisgICAgICAgIHJldHVybiBMWk1BX1JFU19FUlJPUjsNCisgICAgICBEZWNvZGVMaXRlcmFsKHN0YXRlLCByZXAwKTsNCisgICAgICBzdGF0ZSA9IFVwZGF0ZVN0YXRlX0xpdGVyYWwoc3RhdGUpOw0KKyAgICAgIHVucGFja1NpemUtLTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICANCisgICAgdW5zaWduZWQgbGVuOw0KKyAgICANCisgICAgaWYgKFJhbmdlRGVjLkRlY29kZUJpdCgmSXNSZXBbc3RhdGVdKSAhPSAwKQ0KKyAgICB7DQorICAgICAgaWYgKHVucGFja1NpemVEZWZpbmVkICYmIHVucGFja1NpemUgPT0gMCkNCisgICAgICAgIHJldHVybiBMWk1BX1JFU19FUlJPUjsNCisgICAgICBpZiAoT3V0V2luZG93LklzRW1wdHkoKSkNCisgICAgICAgIHJldHVybiBMWk1BX1JFU19FUlJPUjsNCisgICAgICBpZiAoUmFuZ2VEZWMuRGVjb2RlQml0KCZJc1JlcEcwW3N0YXRlXSkgPT0gMCkNCisgICAgICB7DQorICAgICAgICBpZiAoUmFuZ2VEZWMuRGVjb2RlQml0KCZJc1JlcDBMb25nWyhzdGF0ZSA8PCBrTnVtUG9zQml0c01heCkgKyBwb3NTdGF0ZV0pID09IDApDQorICAgICAgICB7DQorICAgICAgICAgIHN0YXRlID0gVXBkYXRlU3RhdGVfU2hvcnRSZXAoc3RhdGUpOw0KKyAgICAgICAgICBPdXRXaW5kb3cuUHV0Qnl0ZShPdXRXaW5kb3cuR2V0Qnl0ZShyZXAwICsgMSkpOw0KKyAgICAgICAgICB1bnBhY2tTaXplLS07DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgVUludDMyIGRpc3Q7DQorICAgICAgICBpZiAoUmFuZ2VEZWMuRGVjb2RlQml0KCZJc1JlcEcxW3N0YXRlXSkgPT0gMCkNCisgICAgICAgICAgZGlzdCA9IHJlcDE7DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIGlmIChSYW5nZURlYy5EZWNvZGVCaXQoJklzUmVwRzJbc3RhdGVdKSA9PSAwKQ0KKyAgICAgICAgICAgIGRpc3QgPSByZXAyOw0KKyAgICAgICAgICBlbHNlDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBkaXN0ID0gcmVwMzsNCisgICAgICAgICAgICByZXAzID0gcmVwMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICByZXAyID0gcmVwMTsNCisgICAgICAgIH0NCisgICAgICAgIHJlcDEgPSByZXAwOw0KKyAgICAgICAgcmVwMCA9IGRpc3Q7DQorICAgICAgfQ0KKyAgICAgIGxlbiA9IFJlcExlbkRlY29kZXIuRGVjb2RlKCZSYW5nZURlYywgcG9zU3RhdGUpOw0KKyAgICAgIHN0YXRlID0gVXBkYXRlU3RhdGVfUmVwKHN0YXRlKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICByZXAzID0gcmVwMjsNCisgICAgICByZXAyID0gcmVwMTsNCisgICAgICByZXAxID0gcmVwMDsNCisgICAgICBsZW4gPSBMZW5EZWNvZGVyLkRlY29kZSgmUmFuZ2VEZWMsIHBvc1N0YXRlKTsNCisgICAgICBzdGF0ZSA9IFVwZGF0ZVN0YXRlX01hdGNoKHN0YXRlKTsNCisgICAgICByZXAwID0gRGVjb2RlRGlzdGFuY2UobGVuKTsNCisgICAgICBpZiAocmVwMCA9PSAweEZGRkZGRkZGKQ0KKyAgICAgICAgcmV0dXJuIFJhbmdlRGVjLklzRmluaXNoZWRPSygpID8NCisgICAgICAgICAgICBMWk1BX1JFU19GSU5JU0hFRF9XSVRIX01BUktFUiA6DQorICAgICAgICAgICAgTFpNQV9SRVNfRVJST1I7DQorDQorICAgICAgaWYgKHVucGFja1NpemVEZWZpbmVkICYmIHVucGFja1NpemUgPT0gMCkNCisgICAgICAgIHJldHVybiBMWk1BX1JFU19FUlJPUjsNCisgICAgICBpZiAocmVwMCA+PSBkaWN0U2l6ZSB8fCAhT3V0V2luZG93LkNoZWNrRGlzdGFuY2UocmVwMCkpDQorICAgICAgICByZXR1cm4gTFpNQV9SRVNfRVJST1I7DQorICAgIH0NCisgICAgbGVuICs9IGtNYXRjaE1pbkxlbjsNCisgICAgYm9vbCBpc0Vycm9yID0gZmFsc2U7DQorICAgIGlmICh1bnBhY2tTaXplRGVmaW5lZCAmJiB1bnBhY2tTaXplIDwgbGVuKQ0KKyAgICB7DQorICAgICAgbGVuID0gKHVuc2lnbmVkKXVucGFja1NpemU7DQorICAgICAgaXNFcnJvciA9IHRydWU7DQorICAgIH0NCisgICAgT3V0V2luZG93LkNvcHlNYXRjaChyZXAwICsgMSwgbGVuKTsNCisgICAgdW5wYWNrU2l6ZSAtPSBsZW47DQorICAgIGlmIChpc0Vycm9yKQ0KKyAgICAgIHJldHVybiBMWk1BX1JFU19FUlJPUjsNCisgIH0NCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnQoY29uc3QgY2hhciAqcykNCit7DQorICBmcHV0cyhzLCBzdGRvdXQpOw0KK30NCisNCitzdGF0aWMgdm9pZCBQcmludEVycm9yKGNvbnN0IGNoYXIgKnMpDQorew0KKyAgZnB1dHMocywgc3RkZXJyKTsNCit9DQorDQorDQorI2RlZmluZSBDT05WRVJUX0lOVF9UT19TVFIoY2hhclR5cGUsIHRlbXBTaXplKSBcDQorDQordm9pZCBDb252ZXJ0VUludDY0VG9TdHJpbmcoVUludDY0IHZhbCwgY2hhciAqcykNCit7DQorICBjaGFyIHRlbXBbMzJdOw0KKyAgdW5zaWduZWQgaSA9IDA7DQorICB3aGlsZSAodmFsID49IDEwKQ0KKyAgew0KKyAgICB0ZW1wW2krK10gPSAoY2hhcikoJzAnICsgKHVuc2lnbmVkKSh2YWwgJSAxMCkpOw0KKyAgICB2YWwgLz0gMTA7DQorICB9DQorICAqcysrID0gKGNoYXIpKCcwJyArICh1bnNpZ25lZCl2YWwpOw0KKyAgd2hpbGUgKGkgIT0gMCkNCisgIHsNCisgICAgaS0tOw0KKyAgICAqcysrID0gdGVtcFtpXTsNCisgIH0NCisgICpzID0gMDsNCit9DQorDQordm9pZCBQcmludFVJbnQ2NChjb25zdCBjaGFyICp0aXRsZSwgVUludDY0IHYpDQorew0KKyAgUHJpbnQodGl0bGUpOw0KKyAgUHJpbnQoIiA6ICIpOw0KKyAgY2hhciBzWzMyXTsNCisgIENvbnZlcnRVSW50NjRUb1N0cmluZyh2LCBzKTsNCisgIFByaW50KHMpOw0KKyAgUHJpbnQoIiBieXRlcyBcbiIpOw0KK30NCisNCitpbnQgbWFpbjIoaW50IG51bUFyZ3MsIGNvbnN0IGNoYXIgKmFyZ3NbXSkNCit7DQorICBQcmludCgiXG5MWk1BIFJlZmVyZW5jZSBEZWNvZGVyIDkuMzEgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4gOiAyMDEzLTAyLTA2XG4iKTsNCisgIGlmIChudW1BcmdzID09IDEpDQorICAgIFByaW50KCJcblVzZTogbHptYVNwZWMgYS5sem1hIG91dEZpbGUiKTsNCisNCisgIGlmIChudW1BcmdzICE9IDMpDQorICAgIHRocm93ICJ5b3UgbXVzdCBzcGVjaWZ5IHR3byBwYXJhbWV0ZXJzIjsNCisNCisgIENJbnB1dFN0cmVhbSBpblN0cmVhbTsNCisgIGluU3RyZWFtLkZpbGUgPSBmb3BlbihhcmdzWzFdLCAicmIiKTsNCisgIGluU3RyZWFtLkluaXQoKTsNCisgIGlmIChpblN0cmVhbS5GaWxlID09IDApDQorICAgIHRocm93ICJDYW4ndCBvcGVuIGlucHV0IGZpbGUiOw0KKw0KKyAgQ0x6bWFEZWNvZGVyIGx6bWFEZWNvZGVyOw0KKyAgbHptYURlY29kZXIuT3V0V2luZG93Lk91dFN0cmVhbS5GaWxlID0gZm9wZW4oYXJnc1syXSwgIndiKyIpOw0KKyAgbHptYURlY29kZXIuT3V0V2luZG93Lk91dFN0cmVhbS5Jbml0KCk7DQorICBpZiAoaW5TdHJlYW0uRmlsZSA9PSAwKQ0KKyAgICB0aHJvdyAiQ2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSI7DQorDQorICBCeXRlIGhlYWRlclsxM107DQorICBpbnQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQ0KKyAgICBoZWFkZXJbaV0gPSBpblN0cmVhbS5SZWFkQnl0ZSgpOw0KKw0KKyAgbHptYURlY29kZXIuRGVjb2RlUHJvcGVydGllcyhoZWFkZXIpOw0KKw0KKyAgcHJpbnRmKCJcbmxjPSVkLCBscD0lZCwgcGI9JWQiLCBsem1hRGVjb2Rlci5sYywgbHptYURlY29kZXIubHAsIGx6bWFEZWNvZGVyLnBiKTsNCisgIHByaW50ZigiXG5EaWN0aW9uYXJ5IFNpemUgaW4gcHJvcGVydGllcyA9ICV1IiwgbHptYURlY29kZXIuZGljdFNpemVJblByb3BlcnRpZXMpOw0KKyAgcHJpbnRmKCJcbkRpY3Rpb25hcnkgU2l6ZSBmb3IgZGVjb2RpbmcgID0gJXUiLCBsem1hRGVjb2Rlci5kaWN0U2l6ZSk7DQorDQorICBVSW50NjQgdW5wYWNrU2l6ZSA9IDA7DQorICBib29sIHVucGFja1NpemVEZWZpbmVkID0gZmFsc2U7DQorICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQ0KKyAgew0KKyAgICBCeXRlIGIgPSBoZWFkZXJbNSArIGldOw0KKyAgICBpZiAoYiAhPSAweEZGKQ0KKyAgICAgIHVucGFja1NpemVEZWZpbmVkID0gdHJ1ZTsNCisgICAgdW5wYWNrU2l6ZSB8PSAoVUludDY0KWIgPDwgKDggKiBpKTsNCisgIH0NCisNCisgIGx6bWFEZWNvZGVyLm1hcmtlcklzTWFuZGF0b3J5ID0gIXVucGFja1NpemVEZWZpbmVkOw0KKw0KKyAgUHJpbnQoIlxuIik7DQorICBpZiAodW5wYWNrU2l6ZURlZmluZWQpDQorICAgIFByaW50VUludDY0KCJVbmNvbXByZXNzZWQgU2l6ZSIsIHVucGFja1NpemUpOw0KKyAgZWxzZQ0KKyAgICBQcmludCgiRW5kIG1hcmtlciBpcyBleHBlY3RlZFxuIik7DQorICBsem1hRGVjb2Rlci5SYW5nZURlYy5JblN0cmVhbSA9ICZpblN0cmVhbTsNCisNCisgIFByaW50KCJcbiIpOw0KKw0KKyAgbHptYURlY29kZXIuQ3JlYXRlKCk7DQorICAvLyB3ZSBzdXBwb3J0IHRoZSBzdHJlYW1zIHRoYXQgaGF2ZSB1bmNvbXByZXNzZWQgc2l6ZSBhbmQgbWFya2VyLg0KKyAgaW50IHJlcyA9IGx6bWFEZWNvZGVyLkRlY29kZSh1bnBhY2tTaXplRGVmaW5lZCwgdW5wYWNrU2l6ZSk7DQorDQorICBQcmludFVJbnQ2NCgiUmVhZCAgICAiLCBpblN0cmVhbS5Qcm9jZXNzZWQpOw0KKyAgUHJpbnRVSW50NjQoIldyaXR0ZW4gIiwgbHptYURlY29kZXIuT3V0V2luZG93Lk91dFN0cmVhbS5Qcm9jZXNzZWQpOw0KKw0KKyAgaWYgKHJlcyA9PSBMWk1BX1JFU19FUlJPUikNCisgICAgdGhyb3cgIkxaTUEgZGVjb2RpbmcgZXJyb3IiOw0KKyAgZWxzZSBpZiAocmVzID09IExaTUFfUkVTX0ZJTklTSEVEX1dJVEhPVVRfTUFSS0VSKQ0KKyAgICBQcmludCgiRmluaXNoZWQgd2l0aG91dCBlbmQgbWFya2VyIik7DQorICBlbHNlIGlmIChyZXMgPT0gTFpNQV9SRVNfRklOSVNIRURfV0lUSF9NQVJLRVIpDQorICB7DQorICAgIGlmICh1bnBhY2tTaXplRGVmaW5lZCkNCisgICAgew0KKyAgICAgIGlmIChsem1hRGVjb2Rlci5PdXRXaW5kb3cuT3V0U3RyZWFtLlByb2Nlc3NlZCAhPSB1bnBhY2tTaXplKQ0KKyAgICAgICAgdGhyb3cgIkZpbmlzaGVkIHdpdGggZW5kIG1hcmtlciBiZWZvcmUgdGhhbiBzcGVjaWZpZWQgc2l6ZSI7DQorICAgICAgUHJpbnQoIldhcm5pbmc6ICIpOw0KKyAgICB9DQorICAgIFByaW50KCJGaW5pc2hlZCB3aXRoIGVuZCBtYXJrZXIiKTsNCisgIH0NCisgIGVsc2UNCisgICAgdGhyb3cgIkludGVybmFsIEVycm9yIjsNCisNCisgIFByaW50KCJcbiIpOw0KKyAgDQorICBpZiAobHptYURlY29kZXIuUmFuZ2VEZWMuQ29ycnVwdGVkKQ0KKyAgew0KKyAgICBQcmludCgiXG5XYXJuaW5nOiBMWk1BIHN0cmVhbSBpcyBjb3JydXB0ZWRcbiIpOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KKw0KK2ludA0KKyAgI2lmZGVmIF9NU0NfVkVSDQorICAgIF9fY2RlY2wNCisgICNlbmRpZg0KK21haW4oaW50IG51bUFyZ3MsIGNvbnN0IGNoYXIgKmFyZ3NbXSkNCit7DQorICB0cnkgeyByZXR1cm4gbWFpbjIobnVtQXJncywgYXJncyk7IH0NCisgIGNhdGNoIChjb25zdCBjaGFyICpzKQ0KKyAgew0KKyAgICBQcmludEVycm9yKCJcbkVycm9yOlxuIik7DQorICAgIFByaW50RXJyb3Iocyk7DQorICAgIFByaW50RXJyb3IoIlxuIik7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgY2F0Y2goLi4uKQ0KKyAgew0KKyAgICBQcmludEVycm9yKCJcbkVycm9yXG4iKTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhDb24vN3ouaWNvIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWENvbi83ei5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmZmI3OAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhDb24vN3ouaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhDb24vU0ZYQ29uLmRzcCBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhDb24vU0ZYQ29uLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjM4MGIxCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWENvbi9TRlhDb24uZHNwCkBAIC0wLDAgKzEsODM3IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IlNGWENvbiIgLSBQYWNrYWdlIE93bmVyPTw0Pg0KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDANCisjICoqIERPIE5PVCBFRElUICoqDQorDQorIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzDQorDQorQ0ZHPVNGWENvbiAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJTRlhDb24ubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIlNGWENvbi5tYWsiIENGRz0iU0ZYQ29uIC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgIlNGWENvbiAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgIlNGWENvbiAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJTRlhDb24gLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL0d6IC9NRCAvVzQgL1dYIC9HWCAvTzEgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0QgIkVYVFJBQ1RfT05MWSIgL0QgIl9TRlgiIC9EICJOT19SRUFEX0ZST01fQ09ERVIiIC9ZdSJTdGRBZnguaCIgL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MTkgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MTkgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYgL291dDoiQzpcVXRpbFw3ekNvbi5leGUiIC9vcHQ6Tk9XSU45OA0KKyMgU1VCVFJBQ1QgTElOSzMyIC9wZGI6bm9uZQ0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJTRlhDb24gLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBDUFAgL25vbG9nbyAvR3ogL01UZCAvVzQgL1dYIC9HbSAvR1ggL1pJIC9PZCAvSSAiLi5cLi5cLi5cLi5cXCIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL0QgIkVYVFJBQ1RfT05MWSIgL0QgIl9TRlgiIC9EICJOT19SRUFEX0ZST01fQ09ERVIiIC9ZdSJTdGRBZnguaCIgL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDE5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDE5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJDOlxVdGlsXDd6Q29uLmV4ZSIgL3BkYnR5cGU6c2VwdA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiU0ZYQ29uIC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgIlNGWENvbiAtIFdpbjMyIERlYnVnIg0KKyMgQmVnaW4gR3JvdXAgIlNwZWMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc291cmNlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNvdXJjZS5yYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFN0ZEFmeC5jcHANCisjIEFERCBDUFAgL1ljIlN0ZEFmeC5oIg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFN0ZEFmeC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkFyY2hpdmUgQ29tbW9uIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ29kZXJNaXhlcjIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXENvZGVyTWl4ZXIyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ29kZXJNaXhlcjJNVC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ29kZXJNaXhlcjJNVC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXENyb3NzVGhyZWFkUHJvZ3Jlc3MuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXENyb3NzVGhyZWFkUHJvZ3Jlc3MuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxJdGVtTmFtZVV0aWxzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxJdGVtTmFtZVV0aWxzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cTXVsdGlTdHJlYW0uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXE11bHRpU3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cT3V0U3RyZWFtV2l0aENSQy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cT3V0U3RyZWFtV2l0aENSQy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkNvbnNvbGUiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb25zb2xlXENvbnNvbGVDbG9zZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29uc29sZVxDb25zb2xlQ2xvc2UuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb25zb2xlXEV4dHJhY3RDYWxsYmFja0NvbnNvbGUuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbnNvbGVcRXh0cmFjdENhbGxiYWNrQ29uc29sZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbnNvbGVcTGlzdC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29uc29sZVxMaXN0LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29uc29sZVxNYWluQXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbnNvbGVcT3BlbkNhbGxiYWNrQ29uc29sZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29uc29sZVxPcGVuQ2FsbGJhY2tDb25zb2xlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29uc29sZVxVc2VySW5wdXRVdGlscy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29uc29sZVxVc2VySW5wdXRVdGlscy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIjd6Ig0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekRlY29kZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekRlY29kZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pFeHRyYWN0LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6Rm9sZGVyT3V0U3RyZWFtLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6Rm9sZGVyT3V0U3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekhhbmRsZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pIYW5kbGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekhlYWRlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pJbi5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekluLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekl0ZW0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6UmVnaXN0ZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcU3BsaXRIYW5kbGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJDb21wcmVzcyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEJjajJDb2Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcQmNqMlJlZ2lzdGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xCY2pDb2Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcQmNqUmVnaXN0ZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEJyYW5jaENvZGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xDb3B5Q29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXENvcHlSZWdpc3Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcTHptYTJEZWNvZGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xMem1hMlJlZ2lzdGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xMem1hRGVjb2Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcTHptYVJlZ2lzdGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xQcG1kRGVjb2Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcUHBtZFJlZ2lzdGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJDcnlwdG8iDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDcnlwdG9cN3pBZXMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENyeXB0b1w3ekFlcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENyeXB0b1w3ekFlc1JlZ2lzdGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDcnlwdG9cTXlBZXMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENyeXB0b1xNeUFlcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIldpbmRvd3MiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXERMTC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xETEwuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXEVycm9yTXNnLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXEVycm9yTXNnLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlRGlyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXEZpbGVEaXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXEZpbGVGaW5kLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXEZpbGVGaW5kLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlSU8uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZUlPLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlTmFtZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlTmFtZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcUHJvcFZhcmlhbnQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcUHJvcFZhcmlhbnQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFByb3BWYXJpYW50Q29udi5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xQcm9wVmFyaWFudENvbnYuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFN5bmNocm9uaXphdGlvbi5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xTeW5jaHJvbml6YXRpb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJDb21tb24iDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cQ29tbWFuZExpbmVQYXJzZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxDb21tYW5kTGluZVBhcnNlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxDUkMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxDUkMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cSW50VG9TdHJpbmcuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxJbnRUb1N0cmluZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxNeVN0cmluZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15U3RyaW5nLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15VmVjdG9yLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cTXlWZWN0b3IuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cTmV3SGFuZGxlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE5ld0hhbmRsZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cU3RkSW5TdHJlYW0uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxTdGRJblN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxTdGRPdXRTdHJlYW0uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxTdGRPdXRTdHJlYW0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cU3RyaW5nQ29udmVydC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXFN0cmluZ0NvbnZlcnQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cVVRGQ29udmVydC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXFVURkNvbnZlcnQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cV2lsZGNhcmQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxXaWxkY2FyZC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIjd6aXAgQ29tbW9uIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXENyZWF0ZUNvZGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cQ3JlYXRlQ29kZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cQ1dyYXBwZXJzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cQ1dyYXBwZXJzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEZpbGVQYXRoQXV0b1JlbmFtZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEZpbGVQYXRoQXV0b1JlbmFtZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxGaWxlU3RyZWFtcy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEZpbGVTdHJlYW1zLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEZpbHRlckNvZGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cRmlsdGVyQ29kZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cSW5CdWZmZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxJbkJ1ZmZlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxMaW1pdGVkU3RyZWFtcy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXExpbWl0ZWRTdHJlYW1zLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXExvY2tlZFN0cmVhbS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXExvY2tlZFN0cmVhbS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxPZmZzZXRTdHJlYW0uY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxPZmZzZXRTdHJlYW0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cT3V0QnVmZmVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cT3V0QnVmZmVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXFByb2dyZXNzVXRpbHMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxQcm9ncmVzc1V0aWxzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXFByb3BJZC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXFN0cmVhbUJpbmRlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXFN0cmVhbUJpbmRlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxTdHJlYW1PYmplY3RzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cU3RyZWFtT2JqZWN0cy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxTdHJlYW1VdGlscy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXFN0cmVhbVV0aWxzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXFZpcnRUaHJlYWQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxWaXJ0VGhyZWFkLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiVUkiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBHcm91cCAiVUkgQ29tbW9uIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEFyY2hpdmVFeHRyYWN0Q2FsbGJhY2suY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxBcmNoaXZlRXh0cmFjdENhbGxiYWNrLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEFyY2hpdmVPcGVuQ2FsbGJhY2suY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxBcmNoaXZlT3BlbkNhbGxiYWNrLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXERlZmF1bHROYW1lLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cRGVmYXVsdE5hbWUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cRXhpdENvZGUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cRXh0cmFjdC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEV4dHJhY3QuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cRXh0cmFjdGluZ0ZpbGVQYXRoLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cRXh0cmFjdGluZ0ZpbGVQYXRoLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEV4dHJhY3RNb2RlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXExvYWRDb2RlY3MuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxMb2FkQ29kZWNzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXE9wZW5BcmNoaXZlLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cT3BlbkFyY2hpdmUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cUHJvcElEVXRpbHMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxQcm9wSURVdGlscy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiQyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcN3pDcmMuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcN3pDcmMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXDd6Q3JjT3B0LmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEFlcy5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xBZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEFlc09wdC5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xBbGxvYy5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xBbGxvYy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcQnJhLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xCcmE4Ni5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xDcHVBcmNoLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6bWEyRGVjLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6bWEyRGVjLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xMem1hRGVjLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6bWFEZWMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXFBwbWQ3LmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXFBwbWQ3LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xQcG1kN0RlYy5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xTaGEyNTYuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcU2hhMjU2LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xUaHJlYWRzLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXFRocmVhZHMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cN3ouaWNvDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcSUFyY2hpdmUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNmeENvbi5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYQ29uL1NGWENvbi5kc3cgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYQ29uL1NGWENvbi5kc3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiYzJiNwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhDb24vU0ZYQ29uLmRzdwpAQCAtMCwwICsxLDI5IEBACitNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBXb3Jrc3BhY2UgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMA0KKyMgV0FSTklORzogRE8gTk9UIEVESVQgT1IgREVMRVRFIFRISVMgV09SS1NQQUNFIEZJTEUhDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK1Byb2plY3Q6ICJTRlhDb24iPS5cU0ZYQ29uLmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitHbG9iYWw6DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTwzPg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYQ29uL1NmeENvbi5jcHAgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYQ29uL1NmeENvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1MjVmZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhDb24vU2Z4Q29uLmNwcApAQCAtMCwwICsxLDQ1MyBAQAorLy8gTWFpbi5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeUluaXRHdWlkLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9Db21tYW5kTGluZVBhcnNlci5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlFeGNlcHRpb24uaCINCisNCisjaWZkZWYgX1dJTjMyDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRExMLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZURpci5oIg0KKyNlbmRpZg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVOYW1lLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL1VJL0NvbW1vbi9FeGl0Q29kZS5oIg0KKyNpbmNsdWRlICIuLi8uLi9VSS9Db21tb24vRXh0cmFjdC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9VSS9Db25zb2xlL0V4dHJhY3RDYWxsYmFja0NvbnNvbGUuaCINCisjaW5jbHVkZSAiLi4vLi4vVUkvQ29uc29sZS9MaXN0LmgiDQorI2luY2x1ZGUgIi4uLy4uL1VJL0NvbnNvbGUvT3BlbkNhbGxiYWNrQ29uc29sZS5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9NeVZlcnNpb24uaCINCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQordXNpbmcgbmFtZXNwYWNlIE5GaWxlOw0KK3VzaW5nIG5hbWVzcGFjZSBORGlyOw0KK3VzaW5nIG5hbWVzcGFjZSBOQ29tbWFuZExpbmVQYXJzZXI7DQorDQorI2lmZGVmIF9XSU4zMg0KK0hJTlNUQU5DRSBnX2hJbnN0YW5jZSA9IDA7DQorI2VuZGlmDQoraW50IGdfQ29kZVBhZ2UgPSAtMTsNCitleHRlcm4gQ1N0ZE91dFN0cmVhbSAqZ19TdGRTdHJlYW07DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtDb3B5cmlnaHRTdHJpbmcgPQ0KKyJcbjctWmlwIFNGWCAiIE1ZX1ZFUlNJT05fQ09QWVJJR0hUX0RBVEUgIlxuIjsNCisNCitzdGF0aWMgY29uc3QgaW50IGtOdW1Td2l0Y2hlcyA9IDY7DQorDQorbmFtZXNwYWNlIE5LZXkgew0KK2VudW0gRW51bQ0KK3sNCisgIGtIZWxwMSA9IDAsDQorICBrSGVscDIsDQorICBrRGlzYWJsZVBlcmNlbnRzLA0KKyAga1llcywNCisgIGtQYXNzd29yZCwNCisgIGtPdXRwdXREaXINCit9Ow0KKw0KK30NCisNCituYW1lc3BhY2UgTlJlY3Vyc2VkVHlwZSB7DQorZW51bSBFRW51bQ0KK3sNCisgIGtSZWN1cnNlZCwNCisgIGtXaWxkY2FyZE9ubHlSZWN1cnNlZCwNCisgIGtOb25SZWN1cnNlZA0KK307DQorfQ0KKy8qDQorc3RhdGljIGNvbnN0IGNoYXIga1JlY3Vyc2VkSURDaGFyID0gJ1InOw0KK3N0YXRpYyBjb25zdCB3Y2hhcl90ICprUmVjdXJzZWRQb3N0Q2hhclNldCA9IEwiMC0iOw0KKw0KK25hbWVzcGFjZSBOUmVjdXJzZWRQb3N0Q2hhckluZGV4IHsNCisgIGVudW0gRUVudW0NCisgIHsNCisgICAga1dpbGRjYXJkUmVjdXJzaW9uT25seSA9IDAsDQorICAgIGtOb1JlY3Vyc2lvbiA9IDENCisgIH07DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBjaGFyIGtGaWxlTGlzdElEID0gJ0AnOw0KK3N0YXRpYyBjb25zdCBjaGFyIGtJbW1lZGlhdGVOYW1lSUQgPSAnISc7DQorDQorc3RhdGljIGNvbnN0IGNoYXIga1NvbWVDbHVkZVBvc3RTdHJpbmdNaW5TaXplID0gMjsgLy8gYXQgbGVhc3QgPEB8IT48Tj5hbWUgbXVzdCBiZQ0KK3N0YXRpYyBjb25zdCBjaGFyIGtTb21lQ2x1ZGVBZnRlclJlY3Vyc2VkUG9zdFN0cmluZ01pblNpemUgPSAyOyAvLyBhdCBsZWFzdCA8QHwhPjxOPmFtZSBtdXN0IGJlDQorKi8NCitzdGF0aWMgY29uc3QgQ1N3aXRjaEZvcm0ga1N3aXRjaEZvcm1zW2tOdW1Td2l0Y2hlc10gPQ0KK3sNCisgIHsgIj8iLCAgTlN3aXRjaFR5cGU6OmtTaW1wbGUgfSwNCisgIHsgIkgiLCAgTlN3aXRjaFR5cGU6OmtTaW1wbGUgfSwNCisgIHsgIkJEIiwgTlN3aXRjaFR5cGU6OmtTaW1wbGUgfSwNCisgIHsgIlkiLCAgTlN3aXRjaFR5cGU6OmtTaW1wbGUgfSwNCisgIHsgIlAiLCAgTlN3aXRjaFR5cGU6OmtTdHJpbmcsIGZhbHNlLCAxIH0sDQorICB7ICJPIiwgIE5Td2l0Y2hUeXBlOjprU3RyaW5nLCBmYWxzZSwgMSB9LA0KK307DQorDQorc3RhdGljIGNvbnN0IGludCBrTnVtQ29tbWFuZEZvcm1zID0gMzsNCisNCitzdGF0aWMgY29uc3QgTlJlY3Vyc2VkVHlwZTo6RUVudW0ga0NvbW1hbmRSZWN1cnNlZERlZmF1bHRba051bUNvbW1hbmRGb3Jtc10gPQ0KK3sNCisgIE5SZWN1cnNlZFR5cGU6OmtSZWN1cnNlZA0KK307DQorDQorLy8gc3RhdGljIGNvbnN0IGJvb2wga1Rlc3RFeHRyYWN0UmVjdXJzZWREZWZhdWx0ID0gdHJ1ZTsNCisvLyBzdGF0aWMgY29uc3QgYm9vbCBrQWRkUmVjdXJzZWREZWZhdWx0ID0gZmFsc2U7DQorDQorc3RhdGljIGNvbnN0IHdjaGFyX3QgKmtVbml2ZXJzYWxXaWxkY2FyZCA9IEwiKiI7DQorc3RhdGljIGNvbnN0IGludCBrQ29tbWFuZEluZGV4ID0gMDsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqa0hlbHBTdHJpbmcgPQ0KKyAgICAiXG5Vc2FnZTogN3pTRlggWzxjb21tYW5kPl0gWzxzd2l0Y2hlcz4uLi5dXG4iDQorICAgICJcbiINCisgICAgIjxDb21tYW5kcz5cbiINCisgICAgIiAgbDogTGlzdCBjb250ZW50cyBvZiBhcmNoaXZlXG4iDQorICAgICIgIHQ6IFRlc3QgaW50ZWdyaXR5IG9mIGFyY2hpdmVcbiINCisgICAgIiAgeDogZVh0cmFjdCBmaWxlcyB3aXRoIGZ1bGwgcGF0aG5hbWUgKGRlZmF1bHQpXG4iDQorICAgICI8U3dpdGNoZXM+XG4iDQorICAgIC8vICIgIC1iZCBEaXNhYmxlIHBlcmNlbnRhZ2UgaW5kaWNhdG9yXG4iDQorICAgICIgIC1ve0RpcmVjdG9yeX06IHNldCBPdXRwdXQgZGlyZWN0b3J5XG4iDQorICAgICIgIC1we1Bhc3N3b3JkfTogc2V0IFBhc3N3b3JkXG4iDQorICAgICIgIC15OiBhc3N1bWUgWWVzIG9uIGFsbCBxdWVyaWVzXG4iOw0KKw0KKw0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIGV4Y2VwdGlvbiBtZXNzYWdlcw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICprVXNlckVycm9yTWVzc2FnZSAgPSAiSW5jb3JyZWN0IGNvbW1hbmQgbGluZSI7IC8vIE5FeGl0Q29kZTo6a1VzZXJFcnJvcg0KKy8vIHN0YXRpYyBjb25zdCBjaGFyICprSW5jb3JyZWN0TGlzdEZpbGUgPSAiSW5jb3JyZWN0IHdpbGRjYXJkIGluIGxpc3RmaWxlIjsNCitzdGF0aWMgY29uc3QgY2hhciAqa0luY29ycmVjdFdpbGRjYXJkSW5Db21tYW5kTGluZSAgPSAiSW5jb3JyZWN0IHdpbGRjYXJkIGluIGNvbW1hbmQgbGluZSI7DQorDQorLy8gc3RhdGljIGNvbnN0IENTeXNTdHJpbmcga0ZpbGVJc05vdEFyY2hpdmVNZXNzYWdlQmVmb3JlID0gIkZpbGUgXCIiOw0KKy8vIHN0YXRpYyBjb25zdCBDU3lzU3RyaW5nIGtGaWxlSXNOb3RBcmNoaXZlTWVzc2FnZUFmdGVyID0gIlwiIGlzIG5vdCBhcmNoaXZlIjsNCisNCisvLyBzdGF0aWMgY29uc3QgY2hhciAqa1Byb2Nlc3NBcmNoaXZlTWVzc2FnZSA9ICIgYXJjaGl2ZTogIjsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqa0NhbnRGaW5kU0ZYID0gIiBjYW5ub3QgZmluZCBzZngiOw0KKw0KK25hbWVzcGFjZSBOQ29tbWFuZFR5cGUNCit7DQorICBlbnVtIEVFbnVtDQorICB7DQorICAgIGtUZXN0ID0gMCwNCisgICAga0Z1bGxFeHRyYWN0LA0KKyAgICBrTGlzdA0KKyAgfTsNCit9DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmdfQ29tbWFuZHMgPSAidHhsIjsNCisNCitzdHJ1Y3QgQ0FyY2hpdmVDb21tYW5kDQorew0KKyAgTkNvbW1hbmRUeXBlOjpFRW51bSBDb21tYW5kVHlwZTsNCisNCisgIE5SZWN1cnNlZFR5cGU6OkVFbnVtIERlZmF1bHRSZWN1cnNlZFR5cGUoKSBjb25zdDsNCit9Ow0KKw0KK2Jvb2wgUGFyc2VBcmNoaXZlQ29tbWFuZChjb25zdCBVU3RyaW5nICZjb21tYW5kU3RyaW5nLCBDQXJjaGl2ZUNvbW1hbmQgJmNvbW1hbmQpDQorew0KKyAgVVN0cmluZyBzID0gY29tbWFuZFN0cmluZzsNCisgIHMuTWFrZUxvd2VyX0FzY2lpKCk7DQorICBpZiAocy5MZW4oKSAhPSAxKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBpZiAoc1swXSA+PSAweDgwKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBpbnQgaW5kZXggPSBGaW5kQ2hhclBvc0luU3RyaW5nKGdfQ29tbWFuZHMsIChjaGFyKXNbMF0pOw0KKyAgaWYgKGluZGV4IDwgMCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgY29tbWFuZC5Db21tYW5kVHlwZSA9IChOQ29tbWFuZFR5cGU6OkVFbnVtKWluZGV4Ow0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK05SZWN1cnNlZFR5cGU6OkVFbnVtIENBcmNoaXZlQ29tbWFuZDo6RGVmYXVsdFJlY3Vyc2VkVHlwZSgpIGNvbnN0DQorew0KKyAgcmV0dXJuIGtDb21tYW5kUmVjdXJzZWREZWZhdWx0W0NvbW1hbmRUeXBlXTsNCit9DQorDQordm9pZCBQcmludEhlbHAodm9pZCkNCit7DQorICBnX1N0ZE91dCA8PCBrSGVscFN0cmluZzsNCit9DQorDQorc3RhdGljIHZvaWQgU2hvd01lc3NhZ2VBbmRUaHJvd0V4Y2VwdGlvbihjb25zdCBjaGFyICptZXNzYWdlLCBORXhpdENvZGU6OkVFbnVtIGNvZGUpDQorew0KKyAgZ19TdGRPdXQgPDwgbWVzc2FnZSA8PCBlbmRsOw0KKyAgdGhyb3cgY29kZTsNCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnRIZWxwQW5kRXhpdCgpIC8vIHl5eQ0KK3sNCisgIFByaW50SGVscCgpOw0KKyAgU2hvd01lc3NhZ2VBbmRUaHJvd0V4Y2VwdGlvbihrVXNlckVycm9yTWVzc2FnZSwgTkV4aXRDb2RlOjprVXNlckVycm9yKTsNCit9DQorDQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gZmlsZW5hbWVzIGZ1bmN0aW9ucw0KKw0KK3N0YXRpYyBib29sIEFkZE5hbWVUb0NlbnNvcihOV2lsZGNhcmQ6OkNDZW5zb3IgJndpbGRjYXJkQ2Vuc29yLA0KKyAgICBjb25zdCBVU3RyaW5nICZuYW1lLCBib29sIGluY2x1ZGUsIE5SZWN1cnNlZFR5cGU6OkVFbnVtIHR5cGUpDQorew0KKyAgLyoNCisgIGlmICghSXNXaWxkY2FyZEZpbGVQYXRoTGVnYWwobmFtZSkpDQorICAgIHJldHVybiBmYWxzZTsNCisgICovDQorICBib29sIGlzV2lsZGNhcmQgPSBEb2VzTmFtZUNvbnRhaW5XaWxkY2FyZChuYW1lKTsNCisgIGJvb2wgcmVjdXJzZWQgPSBmYWxzZTsNCisNCisgIHN3aXRjaCAodHlwZSkNCisgIHsNCisgICAgY2FzZSBOUmVjdXJzZWRUeXBlOjprV2lsZGNhcmRPbmx5UmVjdXJzZWQ6DQorICAgICAgcmVjdXJzZWQgPSBpc1dpbGRjYXJkOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIE5SZWN1cnNlZFR5cGU6OmtSZWN1cnNlZDoNCisgICAgICByZWN1cnNlZCA9IHRydWU7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgTlJlY3Vyc2VkVHlwZTo6a05vblJlY3Vyc2VkOg0KKyAgICAgIHJlY3Vyc2VkID0gZmFsc2U7DQorICAgICAgYnJlYWs7DQorICB9DQorICB3aWxkY2FyZENlbnNvci5BZGRQcmVJdGVtKGluY2x1ZGUsIG5hbWUsIHJlY3Vyc2VkLCB0cnVlKTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCit2b2lkIEFkZENvbW1hbmRMaW5lV2lsZGNhcmRUb0NlbnNvcihOV2lsZGNhcmQ6OkNDZW5zb3IgJndpbGRjYXJkQ2Vuc29yLA0KKyAgICBjb25zdCBVU3RyaW5nICZuYW1lLCBib29sIGluY2x1ZGUsIE5SZWN1cnNlZFR5cGU6OkVFbnVtIHR5cGUpDQorew0KKyAgaWYgKCFBZGROYW1lVG9DZW5zb3Iod2lsZGNhcmRDZW5zb3IsIG5hbWUsIGluY2x1ZGUsIHR5cGUpKQ0KKyAgICBTaG93TWVzc2FnZUFuZFRocm93RXhjZXB0aW9uKGtJbmNvcnJlY3RXaWxkY2FyZEluQ29tbWFuZExpbmUsIE5FeGl0Q29kZTo6a1VzZXJFcnJvcik7DQorfQ0KKw0KK3ZvaWQgQWRkVG9DZW5zb3JGcm9tTm9uU3dpdGNoZXNTdHJpbmdzKE5XaWxkY2FyZDo6Q0NlbnNvciAmd2lsZGNhcmRDZW5zb3IsDQorICAgIGNvbnN0IFVTdHJpbmdWZWN0b3IgJiAvKiBub25Td2l0Y2hTdHJpbmdzICovLCBOUmVjdXJzZWRUeXBlOjpFRW51bSB0eXBlLA0KKyAgICBib29sIC8qIHRoZXJlQXJlU3dpdGNoSW5jbHVkZVdpbGRjYXJkcyAqLykNCit7DQorICBBZGRDb21tYW5kTGluZVdpbGRjYXJkVG9DZW5zb3Iod2lsZGNhcmRDZW5zb3IsIGtVbml2ZXJzYWxXaWxkY2FyZCwgdHJ1ZSwgdHlwZSk7DQorfQ0KKw0KKw0KKyNpZm5kZWYgX1dJTjMyDQorc3RhdGljIHZvaWQgR2V0QXJndW1lbnRzKGludCBudW1BcmdzLCBjb25zdCBjaGFyICphcmdzW10sIFVTdHJpbmdWZWN0b3IgJnBhcnRzKQ0KK3sNCisgIHBhcnRzLkNsZWFyKCk7DQorICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykNCisgIHsNCisgICAgVVN0cmluZyBzID0gTXVsdGlCeXRlVG9Vbmljb2RlU3RyaW5nKGFyZ3NbaV0pOw0KKyAgICBwYXJ0cy5BZGQocyk7DQorICB9DQorfQ0KKyNlbmRpZg0KKw0KK2ludCBNYWluMigNCisgICNpZm5kZWYgX1dJTjMyDQorICBpbnQgbnVtQXJncywgY29uc3QgY2hhciAqYXJnc1tdDQorICAjZW5kaWYNCispDQorew0KKyAgI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkNCisgIFNldEZpbGVBcGlzVG9PRU0oKTsNCisgICNlbmRpZg0KKyAgDQorICBnX1N0ZE91dCA8PCBrQ29weXJpZ2h0U3RyaW5nOw0KKw0KKyAgVVN0cmluZ1ZlY3RvciBjb21tYW5kU3RyaW5nczsNCisgICNpZmRlZiBfV0lOMzINCisgIE5Db21tYW5kTGluZVBhcnNlcjo6U3BsaXRDb21tYW5kTGluZShHZXRDb21tYW5kTGluZVcoKSwgY29tbWFuZFN0cmluZ3MpOw0KKyAgI2Vsc2UNCisgIEdldEFyZ3VtZW50cyhudW1BcmdzLCBhcmdzLCBjb21tYW5kU3RyaW5ncyk7DQorICAjZW5kaWYNCisNCisgICNpZmRlZiBfV0lOMzINCisgIA0KKyAgRlN0cmluZyBhcmNQYXRoOw0KKyAgew0KKyAgICBGU3RyaW5nIHBhdGg7DQorICAgIE5ETEw6Ok15R2V0TW9kdWxlRmlsZU5hbWUocGF0aCk7DQorICAgIGlmICghTXlHZXRGdWxsUGF0aE5hbWUocGF0aCwgYXJjUGF0aCkpDQorICAgIHsNCisgICAgICBnX1N0ZE91dCA8PCAiR2V0RnVsbFBhdGhOYW1lIEVycm9yIjsNCisgICAgICByZXR1cm4gTkV4aXRDb2RlOjprRmF0YWxFcnJvcjsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgI2Vsc2UNCisNCisgIFVTdHJpbmcgYXJjUGF0aCA9IGNvbW1hbmRTdHJpbmdzLkZyb250KCk7DQorDQorICAjZW5kaWYNCisNCisgIGNvbW1hbmRTdHJpbmdzLkRlbGV0ZSgwKTsNCisNCisgIE5Db21tYW5kTGluZVBhcnNlcjo6Q1BhcnNlciBwYXJzZXIoa051bVN3aXRjaGVzKTsNCisgIHRyeQ0KKyAgew0KKyAgICBwYXJzZXIuUGFyc2VTdHJpbmdzKGtTd2l0Y2hGb3JtcywgY29tbWFuZFN0cmluZ3MpOw0KKyAgfQ0KKyAgY2F0Y2goLi4uKQ0KKyAgew0KKyAgICBQcmludEhlbHBBbmRFeGl0KCk7DQorICB9DQorDQorICBpZiAocGFyc2VyW05LZXk6OmtIZWxwMV0uVGhlcmVJcyB8fCBwYXJzZXJbTktleTo6a0hlbHAyXS5UaGVyZUlzKQ0KKyAgew0KKyAgICBQcmludEhlbHAoKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBjb25zdCBVU3RyaW5nVmVjdG9yICZub25Td2l0Y2hTdHJpbmdzID0gcGFyc2VyLk5vblN3aXRjaFN0cmluZ3M7DQorDQorICBpbnQgbnVtTm9uU3dpdGNoU3RyaW5ncyA9IG5vblN3aXRjaFN0cmluZ3MuU2l6ZSgpOw0KKw0KKyAgQ0FyY2hpdmVDb21tYW5kIGNvbW1hbmQ7DQorICBpZiAobnVtTm9uU3dpdGNoU3RyaW5ncyA9PSAwKQ0KKyAgICBjb21tYW5kLkNvbW1hbmRUeXBlID0gTkNvbW1hbmRUeXBlOjprRnVsbEV4dHJhY3Q7DQorICBlbHNlDQorICB7DQorICAgIGlmIChudW1Ob25Td2l0Y2hTdHJpbmdzID4gMSkNCisgICAgICBQcmludEhlbHBBbmRFeGl0KCk7DQorICAgIGlmICghUGFyc2VBcmNoaXZlQ29tbWFuZChub25Td2l0Y2hTdHJpbmdzW2tDb21tYW5kSW5kZXhdLCBjb21tYW5kKSkNCisgICAgICBQcmludEhlbHBBbmRFeGl0KCk7DQorICB9DQorDQorDQorICBOUmVjdXJzZWRUeXBlOjpFRW51bSByZWN1cnNlZFR5cGU7DQorICByZWN1cnNlZFR5cGUgPSBjb21tYW5kLkRlZmF1bHRSZWN1cnNlZFR5cGUoKTsNCisNCisgIE5XaWxkY2FyZDo6Q0NlbnNvciB3aWxkY2FyZENlbnNvcjsNCisgIA0KKyAgYm9vbCB0aGVyZUFyZVN3aXRjaEluY2x1ZGVXaWxkY2FyZHM7DQorICB0aGVyZUFyZVN3aXRjaEluY2x1ZGVXaWxkY2FyZHMgPSBmYWxzZTsNCisNCisgIEFkZFRvQ2Vuc29yRnJvbU5vblN3aXRjaGVzU3RyaW5ncyh3aWxkY2FyZENlbnNvciwgbm9uU3dpdGNoU3RyaW5ncywgcmVjdXJzZWRUeXBlLA0KKyAgICAgIHRoZXJlQXJlU3dpdGNoSW5jbHVkZVdpbGRjYXJkcyk7DQorDQorICBib29sIHllc1RvQWxsID0gcGFyc2VyW05LZXk6OmtZZXNdLlRoZXJlSXM7DQorDQorICAvLyBORXh0cmFjdE1vZGU6OkVFbnVtIGV4dHJhY3RNb2RlOw0KKyAgLy8gYm9vbCBpc0V4dHJhY3RHcm91cENvbW1hbmQgPSBjb21tYW5kLklzRnJvbUV4dHJhY3RHcm91cChleHRyYWN0TW9kZSk7DQorDQorICBib29sIHBhc3N3b3JkRW5hYmxlZCA9IHBhcnNlcltOS2V5OjprUGFzc3dvcmRdLlRoZXJlSXM7DQorDQorICBVU3RyaW5nIHBhc3N3b3JkOw0KKyAgaWYgKHBhc3N3b3JkRW5hYmxlZCkNCisgICAgcGFzc3dvcmQgPSBwYXJzZXJbTktleTo6a1Bhc3N3b3JkXS5Qb3N0U3RyaW5nc1swXTsNCisNCisgIGlmICghTkZpbmQ6OkRvZXNGaWxlRXhpc3QoYXJjUGF0aCkpDQorICAgIHRocm93IGtDYW50RmluZFNGWDsNCisgIA0KKyAgRlN0cmluZyBvdXRwdXREaXI7DQorICBpZiAocGFyc2VyW05LZXk6OmtPdXRwdXREaXJdLlRoZXJlSXMpDQorICB7DQorICAgIG91dHB1dERpciA9IHVzMmZzKHBhcnNlcltOS2V5OjprT3V0cHV0RGlyXS5Qb3N0U3RyaW5nc1swXSk7DQorICAgIE5OYW1lOjpOb3JtYWxpemVEaXJQYXRoUHJlZml4KG91dHB1dERpcik7DQorICB9DQorDQorDQorICB3aWxkY2FyZENlbnNvci5BZGRQYXRoc1RvQ2Vuc29yKE5XaWxkY2FyZDo6a19SZWxhdFBhdGgpOw0KKyAgDQorICB7DQorICAgIFVTdHJpbmdWZWN0b3IgdjEsIHYyOw0KKyAgICB2MS5BZGQoZnMydXMoYXJjUGF0aCkpOw0KKyAgICB2Mi5BZGQoZnMydXMoYXJjUGF0aCkpOw0KKyAgICBjb25zdCBOV2lsZGNhcmQ6OkNDZW5zb3JOb2RlICZ3aWxkY2FyZENlbnNvckhlYWQgPQ0KKyAgICAgIHdpbGRjYXJkQ2Vuc29yLlBhaXJzLkZyb250KCkuSGVhZDsNCisNCisgICAgQ0NvZGVjcyAqY29kZWNzID0gbmV3IENDb2RlY3M7DQorICAgIENNeUNvbVB0cjwNCisgICAgICAjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorICAgICAgSUNvbXByZXNzQ29kZWNzSW5mbw0KKyAgICAgICNlbHNlDQorICAgICAgSVVua25vd24NCisgICAgICAjZW5kaWYNCisgICAgICA+IGNvbXByZXNzQ29kZWNzSW5mbyA9IGNvZGVjczsNCisgICAgSFJFU1VMVCByZXN1bHQgPSBjb2RlY3MtPkxvYWQoKTsNCisgICAgaWYgKHJlc3VsdCAhPSBTX09LKQ0KKyAgICAgIHRocm93IENTeXN0ZW1FeGNlcHRpb24ocmVzdWx0KTsNCisNCisgICAgaWYgKGNvbW1hbmQuQ29tbWFuZFR5cGUgIT0gTkNvbW1hbmRUeXBlOjprTGlzdCkNCisgICAgew0KKyAgICAgIENFeHRyYWN0Q2FsbGJhY2tDb25zb2xlICplY3MgPSBuZXcgQ0V4dHJhY3RDYWxsYmFja0NvbnNvbGU7DQorICAgICAgQ015Q29tUHRyPElGb2xkZXJBcmNoaXZlRXh0cmFjdENhbGxiYWNrPiBleHRyYWN0Q2FsbGJhY2sgPSBlY3M7DQorICAgICAgZWNzLT5PdXRTdHJlYW0gPSBnX1N0ZFN0cmVhbTsNCisNCisgICAgICAjaWZuZGVmIF9OT19DUllQVE8NCisgICAgICBlY3MtPlBhc3N3b3JkSXNEZWZpbmVkID0gcGFzc3dvcmRFbmFibGVkOw0KKyAgICAgIGVjcy0+UGFzc3dvcmQgPSBwYXNzd29yZDsNCisgICAgICAjZW5kaWYNCisNCisgICAgICBlY3MtPkluaXQoKTsNCisNCisgICAgICBDT3BlbkNhbGxiYWNrQ29uc29sZSBvcGVuQ2FsbGJhY2s7DQorICAgICAgb3BlbkNhbGxiYWNrLk91dFN0cmVhbSA9IGdfU3RkU3RyZWFtOw0KKw0KKyAgICAgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgICAgIG9wZW5DYWxsYmFjay5QYXNzd29yZElzRGVmaW5lZCA9IHBhc3N3b3JkRW5hYmxlZDsNCisgICAgICBvcGVuQ2FsbGJhY2suUGFzc3dvcmQgPSBwYXNzd29yZDsNCisgICAgICAjZW5kaWYNCisNCisgICAgICBDRXh0cmFjdE9wdGlvbnMgZW87DQorICAgICAgZW8uU3RkT3V0TW9kZSA9IGZhbHNlOw0KKyAgICAgIGVvLlllc1RvQWxsID0geWVzVG9BbGw7DQorICAgICAgZW8uVGVzdE1vZGUgPSBjb21tYW5kLkNvbW1hbmRUeXBlID09IE5Db21tYW5kVHlwZTo6a1Rlc3Q7DQorICAgICAgZW8uUGF0aE1vZGUgPSBORXh0cmFjdDo6TlBhdGhNb2RlOjprRnVsbFBhdGhzOw0KKyAgICAgIGVvLk92ZXJ3cml0ZU1vZGUgPSB5ZXNUb0FsbCA/DQorICAgICAgICAgIE5FeHRyYWN0OjpOT3ZlcndyaXRlTW9kZTo6a092ZXJ3cml0ZSA6DQorICAgICAgICAgIE5FeHRyYWN0OjpOT3ZlcndyaXRlTW9kZTo6a0FzazsNCisgICAgICBlby5PdXRwdXREaXIgPSBvdXRwdXREaXI7DQorDQorICAgICAgVVN0cmluZyBlcnJvck1lc3NhZ2U7DQorICAgICAgQ0RlY29tcHJlc3NTdGF0IHN0YXQ7DQorICAgICAgSFJFU1VMVCByZXN1bHQgPSBFeHRyYWN0KA0KKyAgICAgICAgICBjb2RlY3MsIENPYmplY3RWZWN0b3I8Q09wZW5UeXBlPigpLCBDSW50VmVjdG9yKCksDQorICAgICAgICAgIHYxLCB2MiwNCisgICAgICAgICAgd2lsZGNhcmRDZW5zb3JIZWFkLA0KKyAgICAgICAgICBlbywgJm9wZW5DYWxsYmFjaywgZWNzLA0KKyAgICAgICAgICAvLyBOVUxMLCAvLyBoYXNoDQorICAgICAgICAgIGVycm9yTWVzc2FnZSwgc3RhdCk7DQorICAgICAgaWYgKCFlcnJvck1lc3NhZ2UuSXNFbXB0eSgpKQ0KKyAgICAgIHsNCisgICAgICAgICgqZ19TdGRTdHJlYW0pIDw8IGVuZGwgPDwgIkVycm9yOiAiIDw8IGVycm9yTWVzc2FnZTs7DQorICAgICAgICBpZiAocmVzdWx0ID09IFNfT0spDQorICAgICAgICAgIHJlc3VsdCA9IEVfRkFJTDsNCisgICAgICB9DQorDQorICAgICAgaWYgKGVjcy0+TnVtQXJjc1dpdGhFcnJvciAhPSAwIHx8IGVjcy0+TnVtRmlsZUVycm9ycyAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChlY3MtPk51bUFyY3NXaXRoRXJyb3IgIT0gMCkNCisgICAgICAgICAgKCpnX1N0ZFN0cmVhbSkgPDwgZW5kbCA8PCAiQXJjaGl2ZSBFcnJvcnMiIDw8IGVuZGw7DQorICAgICAgICBpZiAoZWNzLT5OdW1GaWxlRXJyb3JzICE9IDApDQorICAgICAgICAgICgqZ19TdGRTdHJlYW0pIDw8IGVuZGwgPDwgIlN1YiBpdGVtcyBFcnJvcnM6ICIgPDwgZWNzLT5OdW1GaWxlRXJyb3JzIDw8IGVuZGw7DQorICAgICAgICByZXR1cm4gTkV4aXRDb2RlOjprRmF0YWxFcnJvcjsNCisgICAgICB9DQorICAgICAgaWYgKHJlc3VsdCAhPSBTX09LKQ0KKyAgICAgICAgdGhyb3cgQ1N5c3RlbUV4Y2VwdGlvbihyZXN1bHQpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIFVJbnQ2NCBudW1FcnJvcnMgPSAwOw0KKyAgICAgIFVJbnQ2NCBudW1XYXJuaW5ncyA9IDA7DQorICAgICAgSFJFU1VMVCByZXN1bHQgPSBMaXN0QXJjaGl2ZXMoDQorICAgICAgICAgIGNvZGVjcywgQ09iamVjdFZlY3RvcjxDT3BlblR5cGU+KCksIENJbnRWZWN0b3IoKSwNCisgICAgICAgICAgZmFsc2UsIC8vIHN0ZEluTW9kZQ0KKyAgICAgICAgICB2MSwgdjIsDQorICAgICAgICAgIHRydWUsIC8vIHByb2Nlc3NBbHRTdHJlYW1zDQorICAgICAgICAgIGZhbHNlLCAvLyBzaG93QWx0U3RyZWFtcw0KKyAgICAgICAgICB3aWxkY2FyZENlbnNvckhlYWQsDQorICAgICAgICAgIHRydWUsIC8vIGVuYWJsZUhlYWRlcnMNCisgICAgICAgICAgZmFsc2UsIC8vIHRlY2hNb2RlDQorICAgICAgICAgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgICAgICAgICBwYXNzd29yZEVuYWJsZWQsIHBhc3N3b3JkLA0KKyAgICAgICAgICAjZW5kaWYNCisgICAgICAgICAgbnVtRXJyb3JzLCBudW1XYXJuaW5ncyk7DQorICAgICAgaWYgKG51bUVycm9ycyA+IDApDQorICAgICAgew0KKyAgICAgICAgZ19TdGRPdXQgPDwgZW5kbCA8PCAiRXJyb3JzOiAiIDw8IG51bUVycm9yczsNCisgICAgICAgIHJldHVybiBORXhpdENvZGU6OmtGYXRhbEVycm9yOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVzdWx0ICE9IFNfT0spDQorICAgICAgICB0aHJvdyBDU3lzdGVtRXhjZXB0aW9uKHJlc3VsdCk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAwOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYQ29uL1N0ZEFmeC5jcHAgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYQ29uL1N0ZEFmeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkM2IxZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhDb24vU3RkQWZ4LmNwcApAQCAtMCwwICsxLDMgQEAKKy8vIFN0ZEFmeC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWENvbi9TdGRBZnguaCBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhDb24vU3RkQWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkOWFjMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhDb24vU3RkQWZ4LmgKQEAgLTAsMCArMSw4IEBACisvLyBTdGRBZnguaA0KKw0KKyNpZm5kZWYgX19TVERBRlhfSA0KKyNkZWZpbmUgX19TVERBRlhfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vQ29tbW9uLmgiDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWENvbi9tYWtlZmlsZSBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhDb24vbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzNWQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhDb24vbWFrZWZpbGUKQEAgLTAsMCArMSwxMjQgQEAKK1BST0cgPSA3ekNvbi5zZngNCitNWV9DT05TT0xFID0gMQ0KK0NGTEFHUyA9ICQoQ0ZMQUdTKSBcDQorICAtREVYVFJBQ1RfT05MWSBcDQorICAtRE5PX1JFQURfRlJPTV9DT0RFUiBcDQorICAtRF9TRlggXA0KKw0KK0NVUlJFTlRfT0JKUyA9IFwNCisgICRPXFNmeENvbi5vYmogXA0KKw0KK0NPTlNPTEVfT0JKUyA9IFwNCisgICRPXENvbnNvbGVDbG9zZS5vYmogXA0KKyAgJE9cRXh0cmFjdENhbGxiYWNrQ29uc29sZS5vYmogXA0KKyAgJE9cTGlzdC5vYmogXA0KKyAgJE9cTWFpbkFyLm9iaiBcDQorICAkT1xPcGVuQ2FsbGJhY2tDb25zb2xlLm9iaiBcDQorICAkT1xVc2VySW5wdXRVdGlscy5vYmogXA0KKw0KK0NPTU1PTl9PQkpTID0gXA0KKyAgJE9cQ29tbWFuZExpbmVQYXJzZXIub2JqIFwNCisgICRPXENSQy5vYmogXA0KKyAgJE9cSW50VG9TdHJpbmcub2JqIFwNCisgICRPXE15U3RyaW5nLm9iaiBcDQorICAkT1xNeVZlY3Rvci5vYmogXA0KKyAgJE9cTmV3SGFuZGxlci5vYmogXA0KKyAgJE9cU3RkSW5TdHJlYW0ub2JqIFwNCisgICRPXFN0ZE91dFN0cmVhbS5vYmogXA0KKyAgJE9cU3RyaW5nQ29udmVydC5vYmogXA0KKyAgJE9cV2lsZGNhcmQub2JqIFwNCisgICRPXFVURkNvbnZlcnQub2JqIFwNCisNCitXSU5fT0JKUyA9IFwNCisgICRPXERMTC5vYmogXA0KKyAgJE9cRXJyb3JNc2cub2JqIFwNCisgICRPXEZpbGVEaXIub2JqIFwNCisgICRPXEZpbGVGaW5kLm9iaiBcDQorICAkT1xGaWxlSU8ub2JqIFwNCisgICRPXEZpbGVOYW1lLm9iaiBcDQorICAkT1xQcm9wVmFyaWFudC5vYmogXA0KKyAgJE9cUHJvcFZhcmlhbnRDb252Lm9iaiBcDQorICAkT1xTeW5jaHJvbml6YXRpb24ub2JqIFwNCisNCis3WklQX0NPTU1PTl9PQkpTID0gXA0KKyAgJE9cQ3JlYXRlQ29kZXIub2JqIFwNCisgICRPXENXcmFwcGVycy5vYmogXA0KKyAgJE9cRmlsZVBhdGhBdXRvUmVuYW1lLm9iaiBcDQorICAkT1xGaWxlU3RyZWFtcy5vYmogXA0KKyAgJE9cSW5CdWZmZXIub2JqIFwNCisgICRPXEZpbHRlckNvZGVyLm9iaiBcDQorICAkT1xMaW1pdGVkU3RyZWFtcy5vYmogXA0KKyAgJE9cTG9ja2VkU3RyZWFtLm9iaiBcDQorICAkT1xPdXRCdWZmZXIub2JqIFwNCisgICRPXFByb2dyZXNzVXRpbHMub2JqIFwNCisgICRPXFByb3BJZC5vYmogXA0KKyAgJE9cU3RyZWFtQmluZGVyLm9iaiBcDQorICAkT1xTdHJlYW1PYmplY3RzLm9iaiBcDQorICAkT1xTdHJlYW1VdGlscy5vYmogXA0KKyAgJE9cVmlydFRocmVhZC5vYmogXA0KKw0KK1VJX0NPTU1PTl9PQkpTID0gXA0KKyAgJE9cQXJjaGl2ZUV4dHJhY3RDYWxsYmFjay5vYmogXA0KKyAgJE9cQXJjaGl2ZU9wZW5DYWxsYmFjay5vYmogXA0KKyAgJE9cRGVmYXVsdE5hbWUub2JqIFwNCisgICRPXExvYWRDb2RlY3Mub2JqIFwNCisgICRPXEV4dHJhY3Qub2JqIFwNCisgICRPXEV4dHJhY3RpbmdGaWxlUGF0aC5vYmogXA0KKyAgJE9cT3BlbkFyY2hpdmUub2JqIFwNCisgICRPXFByb3BJRFV0aWxzLm9iaiBcDQorDQorQVJfT0JKUyA9IFwNCisgICRPXFNwbGl0SGFuZGxlci5vYmogXA0KKw0KK0FSX0NPTU1PTl9PQkpTID0gXA0KKyAgJE9cQ29kZXJNaXhlcjIub2JqIFwNCisgICRPXENvZGVyTWl4ZXIyTVQub2JqIFwNCisgICRPXENyb3NzVGhyZWFkUHJvZ3Jlc3Mub2JqIFwNCisgICRPXEl0ZW1OYW1lVXRpbHMub2JqIFwNCisgICRPXE11bHRpU3RyZWFtLm9iaiBcDQorICAkT1xPdXRTdHJlYW1XaXRoQ1JDLm9iaiBcDQorDQorDQorN1pfT0JKUyA9IFwNCisgICRPXDd6RGVjb2RlLm9iaiBcDQorICAkT1w3ekV4dHJhY3Qub2JqIFwNCisgICRPXDd6Rm9sZGVyT3V0U3RyZWFtLm9iaiBcDQorICAkT1w3ekhhbmRsZXIub2JqIFwNCisgICRPXDd6SW4ub2JqIFwNCisgICRPXDd6UmVnaXN0ZXIub2JqIFwNCisNCitDT01QUkVTU19PQkpTID0gXA0KKyAgJE9cQnJhbmNoQ29kZXIub2JqIFwNCisgICRPXEJjajJDb2Rlci5vYmogXA0KKyAgJE9cQmNqMlJlZ2lzdGVyLm9iaiBcDQorICAkT1xCY2pDb2Rlci5vYmogXA0KKyAgJE9cQmNqUmVnaXN0ZXIub2JqIFwNCisgICRPXENvcHlDb2Rlci5vYmogXA0KKyAgJE9cQ29weVJlZ2lzdGVyLm9iaiBcDQorICAkT1xMem1hMkRlY29kZXIub2JqIFwNCisgICRPXEx6bWEyUmVnaXN0ZXIub2JqIFwNCisgICRPXEx6bWFEZWNvZGVyLm9iaiBcDQorICAkT1xMem1hUmVnaXN0ZXIub2JqIFwNCisgICRPXFBwbWREZWNvZGVyLm9iaiBcDQorICAkT1xQcG1kUmVnaXN0ZXIub2JqIFwNCisNCitDUllQVE9fT0JKUyA9IFwNCisgICRPXDd6QWVzLm9iaiBcDQorICAkT1w3ekFlc1JlZ2lzdGVyLm9iaiBcDQorICAkT1xNeUFlcy5vYmogXA0KKw0KK0NfT0JKUyA9IFwNCisgICRPXEFsbG9jLm9iaiBcDQorICAkT1xCcmE4Ni5vYmogXA0KKyAgJE9cQ3B1QXJjaC5vYmogXA0KKyAgJE9cTHptYTJEZWMub2JqIFwNCisgICRPXEx6bWFEZWMub2JqIFwNCisgICRPXFBwbWQ3Lm9iaiBcDQorICAkT1xQcG1kN0RlYy5vYmogXA0KKyAgJE9cU2hhMjU2Lm9iaiBcDQorICAkT1xUaHJlYWRzLm9iaiBcDQorDQorIWluY2x1ZGUgIi4uLy4uL0Flcy5tYWsiDQorIWluY2x1ZGUgIi4uLy4uL0NyYy5tYWsiDQorDQorIWluY2x1ZGUgIi4uLy4uLzd6aXAubWFrIg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhDb24vcmVzb3VyY2UucmMgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYQ29uL3Jlc291cmNlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzQzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYQ29uL3Jlc291cmNlLnJjCkBAIC0wLDAgKzEsNSBAQAorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL0MvN3pWZXJzaW9uLnJjIg0KKw0KK01ZX1ZFUlNJT05fSU5GT19BUFAoIjd6IENvbnNvbGUgU0ZYIiwgIjd6LnNmeCIpDQorDQorMTAxIElDT04gIjd6LmljbyIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYU2V0dXAvRXh0cmFjdENhbGxiYWNrU2Z4LmNwcCBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9FeHRyYWN0Q2FsbGJhY2tTZnguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTE5NzgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYU2V0dXAvRXh0cmFjdENhbGxiYWNrU2Z4LmNwcApAQCAtMCwwICsxLDIzOCBAQAorLy8gRXh0cmFjdENhbGxiYWNrU2Z4LmgNCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9XaWxkY2FyZC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVEaXIuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlRmluZC5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVOYW1lLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvUHJvcFZhcmlhbnQuaCINCisNCisjaW5jbHVkZSAiRXh0cmFjdENhbGxiYWNrU2Z4LmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KK3VzaW5nIG5hbWVzcGFjZSBORmlsZTsNCit1c2luZyBuYW1lc3BhY2UgTkRpcjsNCisNCitzdGF0aWMgTFBDV1NUUiBrQ2FudERlbGV0ZUZpbGUgPSBMIkNhbiBub3QgZGVsZXRlIG91dHB1dCBmaWxlIjsNCitzdGF0aWMgTFBDV1NUUiBrQ2FudE9wZW5GaWxlID0gTCJDYW4gbm90IG9wZW4gb3V0cHV0IGZpbGUiOw0KK3N0YXRpYyBMUENXU1RSIGtVbnN1cHBvcnRlZE1ldGhvZCA9IEwiVW5zdXBwb3J0ZWQgTWV0aG9kIjsNCisNCit2b2lkIENFeHRyYWN0Q2FsbGJhY2tJbXA6OkluaXQoSUluQXJjaGl2ZSAqYXJjaGl2ZUhhbmRsZXIsDQorICAgIGNvbnN0IEZTdHJpbmcgJmRpcmVjdG9yeVBhdGgsDQorICAgIGNvbnN0IFVTdHJpbmcgJml0ZW1EZWZhdWx0TmFtZSwNCisgICAgY29uc3QgRklMRVRJTUUgJmRlZmF1bHRNVGltZSwNCisgICAgVUludDMyIGRlZmF1bHRBdHRyaWJ1dGVzKQ0KK3sNCisgIF9tZXNzYWdlLkVtcHR5KCk7DQorICBfaXNDb3JydXB0ID0gZmFsc2U7DQorICBfaXRlbURlZmF1bHROYW1lID0gaXRlbURlZmF1bHROYW1lOw0KKyAgX2RlZmF1bHRNVGltZSA9IGRlZmF1bHRNVGltZTsNCisgIF9kZWZhdWx0QXR0cmlidXRlcyA9IGRlZmF1bHRBdHRyaWJ1dGVzOw0KKyAgX2FyY2hpdmVIYW5kbGVyID0gYXJjaGl2ZUhhbmRsZXI7DQorICBfZGlyZWN0b3J5UGF0aCA9IGRpcmVjdG9yeVBhdGg7DQorICBOTmFtZTo6Tm9ybWFsaXplRGlyUGF0aFByZWZpeChfZGlyZWN0b3J5UGF0aCk7DQorfQ0KKw0KK0hSRVNVTFQgQ0V4dHJhY3RDYWxsYmFja0ltcDo6T3Blbl9DaGVja0JyZWFrKCkNCit7DQorICAjaWZuZGVmIF9OT19QUk9HUkVTUw0KKyAgcmV0dXJuIFByb2dyZXNzRGlhbG9nLlN5bmMuUHJvY2Vzc1N0b3BBbmRQYXVzZSgpOw0KKyAgI2Vsc2UNCisgIHJldHVybiBTX09LOw0KKyAgI2VuZGlmDQorfQ0KKw0KK0hSRVNVTFQgQ0V4dHJhY3RDYWxsYmFja0ltcDo6T3Blbl9TZXRUb3RhbChjb25zdCBVSW50NjQgKiAvKiBudW1GaWxlcyAqLywgY29uc3QgVUludDY0ICogLyogbnVtQnl0ZXMgKi8pDQorew0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ0V4dHJhY3RDYWxsYmFja0ltcDo6T3Blbl9TZXRDb21wbGV0ZWQoY29uc3QgVUludDY0ICogLyogbnVtRmlsZXMgKi8sIGNvbnN0IFVJbnQ2NCAqIC8qIG51bUJ5dGVzICovKQ0KK3sNCisgICNpZm5kZWYgX05PX1BST0dSRVNTDQorICByZXR1cm4gUHJvZ3Jlc3NEaWFsb2cuU3luYy5Qcm9jZXNzU3RvcEFuZFBhdXNlKCk7DQorICAjZWxzZQ0KKyAgcmV0dXJuIFNfT0s7DQorICAjZW5kaWYNCit9DQorDQorU1RETUVUSE9ESU1QIENFeHRyYWN0Q2FsbGJhY2tJbXA6OlNldFRvdGFsKFVJbnQ2NCBzaXplKQ0KK3sNCisgICNpZm5kZWYgX05PX1BST0dSRVNTDQorICBQcm9ncmVzc0RpYWxvZy5TeW5jLlNldFByb2dyZXNzKHNpemUsIDApOw0KKyAgI2VuZGlmDQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENFeHRyYWN0Q2FsbGJhY2tJbXA6OlNldENvbXBsZXRlZChjb25zdCBVSW50NjQgKmNvbXBsZXRlVmFsdWUpDQorew0KKyAgI2lmbmRlZiBfTk9fUFJPR1JFU1MNCisgIFJJTk9LKFByb2dyZXNzRGlhbG9nLlN5bmMuUHJvY2Vzc1N0b3BBbmRQYXVzZSgpKTsNCisgIGlmIChjb21wbGV0ZVZhbHVlICE9IE5VTEwpDQorICAgIFByb2dyZXNzRGlhbG9nLlN5bmMuU2V0UG9zKCpjb21wbGV0ZVZhbHVlKTsNCisgICNlbmRpZg0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3ZvaWQgQ0V4dHJhY3RDYWxsYmFja0ltcDo6Q3JlYXRlQ29tcGxleERpcmVjdG9yeShjb25zdCBVU3RyaW5nVmVjdG9yICZkaXJQYXRoUGFydHMpDQorew0KKyAgRlN0cmluZyBmdWxsUGF0aCA9IF9kaXJlY3RvcnlQYXRoOw0KKyAgRk9SX1ZFQ1RPUiAoaSwgZGlyUGF0aFBhcnRzKQ0KKyAgew0KKyAgICBmdWxsUGF0aCArPSB1czJmcyhkaXJQYXRoUGFydHNbaV0pOw0KKyAgICBDcmVhdGVEaXIoZnVsbFBhdGgpOw0KKyAgICBmdWxsUGF0aCArPSBGQ0hBUl9QQVRIX1NFUEFSQVRPUjsNCisgIH0NCit9DQorDQorU1RETUVUSE9ESU1QIENFeHRyYWN0Q2FsbGJhY2tJbXA6OkdldFN0cmVhbShVSW50MzIgaW5kZXgsDQorICAgIElTZXF1ZW50aWFsT3V0U3RyZWFtICoqb3V0U3RyZWFtLCBJbnQzMiBhc2tFeHRyYWN0TW9kZSkNCit7DQorICAjaWZuZGVmIF9OT19QUk9HUkVTUw0KKyAgaWYgKFByb2dyZXNzRGlhbG9nLlN5bmMuR2V0U3RvcHBlZCgpKQ0KKyAgICByZXR1cm4gRV9BQk9SVDsNCisgICNlbmRpZg0KKyAgX291dEZpbGVTdHJlYW0uUmVsZWFzZSgpOw0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3BWYXJpYW50TmFtZTsNCisgIFJJTk9LKF9hcmNoaXZlSGFuZGxlci0+R2V0UHJvcGVydHkoaW5kZXgsIGtwaWRQYXRoLCAmcHJvcFZhcmlhbnROYW1lKSk7DQorICBVU3RyaW5nIGZ1bGxQYXRoOw0KKyAgaWYgKHByb3BWYXJpYW50TmFtZS52dCA9PSBWVF9FTVBUWSkNCisgICAgZnVsbFBhdGggPSBfaXRlbURlZmF1bHROYW1lOw0KKyAgZWxzZQ0KKyAgew0KKyAgICBpZiAocHJvcFZhcmlhbnROYW1lLnZ0ICE9IFZUX0JTVFIpDQorICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgZnVsbFBhdGggPSBwcm9wVmFyaWFudE5hbWUuYnN0clZhbDsNCisgIH0NCisgIF9maWxlUGF0aCA9IGZ1bGxQYXRoOw0KKw0KKyAgaWYgKGFza0V4dHJhY3RNb2RlID09IE5BcmNoaXZlOjpORXh0cmFjdDo6TkFza01vZGU6OmtFeHRyYWN0KQ0KKyAgew0KKyAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgUklOT0soX2FyY2hpdmVIYW5kbGVyLT5HZXRQcm9wZXJ0eShpbmRleCwga3BpZEF0dHJpYiwgJnByb3ApKTsNCisgICAgaWYgKHByb3AudnQgPT0gVlRfRU1QVFkpDQorICAgICAgX3Byb2Nlc3NlZEZpbGVJbmZvLkF0dHJpYnV0ZXMgPSBfZGVmYXVsdEF0dHJpYnV0ZXM7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGlmIChwcm9wLnZ0ICE9IFZUX1VJNCkNCisgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgX3Byb2Nlc3NlZEZpbGVJbmZvLkF0dHJpYnV0ZXMgPSBwcm9wLnVsVmFsOw0KKyAgICB9DQorDQorICAgIFJJTk9LKF9hcmNoaXZlSGFuZGxlci0+R2V0UHJvcGVydHkoaW5kZXgsIGtwaWRJc0RpciwgJnByb3ApKTsNCisgICAgX3Byb2Nlc3NlZEZpbGVJbmZvLklzRGlyID0gVkFSSUFOVF9CT09MVG9Cb29sKHByb3AuYm9vbFZhbCk7DQorDQorICAgIGJvb2wgaXNBbnRpID0gZmFsc2U7DQorICAgIHsNCisgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcFRlbXA7DQorICAgICAgUklOT0soX2FyY2hpdmVIYW5kbGVyLT5HZXRQcm9wZXJ0eShpbmRleCwga3BpZElzQW50aSwgJnByb3BUZW1wKSk7DQorICAgICAgaWYgKHByb3BUZW1wLnZ0ID09IFZUX0JPT0wpDQorICAgICAgICBpc0FudGkgPSBWQVJJQU5UX0JPT0xUb0Jvb2wocHJvcFRlbXAuYm9vbFZhbCk7DQorICAgIH0NCisNCisgICAgUklOT0soX2FyY2hpdmVIYW5kbGVyLT5HZXRQcm9wZXJ0eShpbmRleCwga3BpZE1UaW1lLCAmcHJvcCkpOw0KKyAgICBzd2l0Y2gocHJvcC52dCkNCisgICAgew0KKyAgICAgIGNhc2UgVlRfRU1QVFk6IF9wcm9jZXNzZWRGaWxlSW5mby5NVGltZSA9IF9kZWZhdWx0TVRpbWU7IGJyZWFrOw0KKyAgICAgIGNhc2UgVlRfRklMRVRJTUU6IF9wcm9jZXNzZWRGaWxlSW5mby5NVGltZSA9IHByb3AuZmlsZXRpbWU7IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6IHJldHVybiBFX0ZBSUw7DQorICAgIH0NCisNCisgICAgVVN0cmluZ1ZlY3RvciBwYXRoUGFydHM7DQorICAgIFNwbGl0UGF0aFRvUGFydHMoZnVsbFBhdGgsIHBhdGhQYXJ0cyk7DQorICAgIGlmIChwYXRoUGFydHMuSXNFbXB0eSgpKQ0KKyAgICAgIHJldHVybiBFX0ZBSUw7DQorDQorICAgIFVTdHJpbmcgcHJvY2Vzc2VkUGF0aCA9IGZ1bGxQYXRoOw0KKw0KKyAgICBpZiAoIV9wcm9jZXNzZWRGaWxlSW5mby5Jc0RpcikNCisgICAgICBwYXRoUGFydHMuRGVsZXRlQmFjaygpOw0KKyAgICBpZiAoIXBhdGhQYXJ0cy5Jc0VtcHR5KCkpDQorICAgIHsNCisgICAgICBpZiAoIWlzQW50aSkNCisgICAgICAgIENyZWF0ZUNvbXBsZXhEaXJlY3RvcnkocGF0aFBhcnRzKTsNCisgICAgfQ0KKw0KKyAgICBGU3RyaW5nIGZ1bGxQcm9jZXNzZWRQYXRoID0gX2RpcmVjdG9yeVBhdGggKyB1czJmcyhwcm9jZXNzZWRQYXRoKTsNCisNCisgICAgaWYgKF9wcm9jZXNzZWRGaWxlSW5mby5Jc0RpcikNCisgICAgew0KKyAgICAgIF9kaXNrRmlsZVBhdGggPSBmdWxsUHJvY2Vzc2VkUGF0aDsNCisNCisgICAgICBpZiAoaXNBbnRpKQ0KKyAgICAgICAgUmVtb3ZlRGlyKF9kaXNrRmlsZVBhdGgpOw0KKyAgICAgIGVsc2UNCisgICAgICAgIFNldERpclRpbWUoX2Rpc2tGaWxlUGF0aCwgTlVMTCwgTlVMTCwgJl9wcm9jZXNzZWRGaWxlSW5mby5NVGltZSk7DQorICAgICAgcmV0dXJuIFNfT0s7DQorICAgIH0NCisNCisgICAgTkZpbmQ6OkNGaWxlSW5mbyBmaWxlSW5mbzsNCisgICAgaWYgKGZpbGVJbmZvLkZpbmQoZnVsbFByb2Nlc3NlZFBhdGgpKQ0KKyAgICB7DQorICAgICAgaWYgKCFEZWxldGVGaWxlQWx3YXlzKGZ1bGxQcm9jZXNzZWRQYXRoKSkNCisgICAgICB7DQorICAgICAgICBfbWVzc2FnZSA9IGtDYW50RGVsZXRlRmlsZTsNCisgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIGlmICghaXNBbnRpKQ0KKyAgICB7DQorICAgICAgX291dEZpbGVTdHJlYW1TcGVjID0gbmV3IENPdXRGaWxlU3RyZWFtOw0KKyAgICAgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gb3V0U3RyZWFtTG9jKF9vdXRGaWxlU3RyZWFtU3BlYyk7DQorICAgICAgaWYgKCFfb3V0RmlsZVN0cmVhbVNwZWMtPkNyZWF0ZShmdWxsUHJvY2Vzc2VkUGF0aCwgdHJ1ZSkpDQorICAgICAgew0KKyAgICAgICAgX21lc3NhZ2UgPSBrQ2FudE9wZW5GaWxlOw0KKyAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICB9DQorICAgICAgX291dEZpbGVTdHJlYW0gPSBvdXRTdHJlYW1Mb2M7DQorICAgICAgKm91dFN0cmVhbSA9IG91dFN0cmVhbUxvYy5EZXRhY2goKTsNCisgICAgfQ0KKyAgICBfZGlza0ZpbGVQYXRoID0gZnVsbFByb2Nlc3NlZFBhdGg7DQorICB9DQorICBlbHNlDQorICB7DQorICAgICpvdXRTdHJlYW0gPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRXh0cmFjdENhbGxiYWNrSW1wOjpQcmVwYXJlT3BlcmF0aW9uKEludDMyIGFza0V4dHJhY3RNb2RlKQ0KK3sNCisgIF9leHRyYWN0TW9kZSA9IChhc2tFeHRyYWN0TW9kZSA9PSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5Bc2tNb2RlOjprRXh0cmFjdCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENFeHRyYWN0Q2FsbGJhY2tJbXA6OlNldE9wZXJhdGlvblJlc3VsdChJbnQzMiByZXN1bHRFT3BlcmF0aW9uUmVzdWx0KQ0KK3sNCisgIHN3aXRjaChyZXN1bHRFT3BlcmF0aW9uUmVzdWx0KQ0KKyAgew0KKyAgICBjYXNlIE5BcmNoaXZlOjpORXh0cmFjdDo6Tk9wZXJhdGlvblJlc3VsdDo6a09LOg0KKyAgICAgIGJyZWFrOw0KKw0KKyAgICBkZWZhdWx0Og0KKyAgICB7DQorICAgICAgX291dEZpbGVTdHJlYW0uUmVsZWFzZSgpOw0KKyAgICAgIHN3aXRjaChyZXN1bHRFT3BlcmF0aW9uUmVzdWx0KQ0KKyAgICAgIHsNCisgICAgICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprVW5zdXBwb3J0ZWRNZXRob2Q6DQorICAgICAgICAgIF9tZXNzYWdlID0ga1Vuc3VwcG9ydGVkTWV0aG9kOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIF9pc0NvcnJ1cHQgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICB9DQorICB9DQorICBpZiAoX291dEZpbGVTdHJlYW0gIT0gTlVMTCkNCisgIHsNCisgICAgX291dEZpbGVTdHJlYW1TcGVjLT5TZXRNVGltZSgmX3Byb2Nlc3NlZEZpbGVJbmZvLk1UaW1lKTsNCisgICAgUklOT0soX291dEZpbGVTdHJlYW1TcGVjLT5DbG9zZSgpKTsNCisgIH0NCisgIF9vdXRGaWxlU3RyZWFtLlJlbGVhc2UoKTsNCisgIGlmIChfZXh0cmFjdE1vZGUpDQorICAgIFNldEZpbGVBdHRyaWIoX2Rpc2tGaWxlUGF0aCwgX3Byb2Nlc3NlZEZpbGVJbmZvLkF0dHJpYnV0ZXMpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9FeHRyYWN0Q2FsbGJhY2tTZnguaCBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9FeHRyYWN0Q2FsbGJhY2tTZnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2YwNGUwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFNldHVwL0V4dHJhY3RDYWxsYmFja1NmeC5oCkBAIC0wLDAgKzEsODYgQEAKKy8vIEV4dHJhY3RDYWxsYmFja1NmeC5oDQorDQorI2lmbmRlZiBfX0VYVFJBQ1RfQ0FMTEJBQ0tfU0ZYX0gNCisjZGVmaW5lIF9fRVhUUkFDVF9DQUxMQkFDS19TRlhfSA0KKw0KKyNpbmNsdWRlICJyZXNvdXJjZS5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1Jlc291cmNlU3RyaW5nLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0FyY2hpdmUvSUFyY2hpdmUuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0ZpbGVTdHJlYW1zLmgiDQorI2luY2x1ZGUgIi4uLy4uL0lDb2Rlci5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9VSS9GaWxlTWFuYWdlci9MYW5nVXRpbHMuaCINCisNCisjaWZuZGVmIF9OT19QUk9HUkVTUw0KKyNpbmNsdWRlICIuLi8uLi9VSS9GaWxlTWFuYWdlci9Qcm9ncmVzc0RpYWxvZy5oIg0KKyNlbmRpZg0KKyNpbmNsdWRlICIuLi8uLi9VSS9Db21tb24vQXJjaGl2ZU9wZW5DYWxsYmFjay5oIg0KKw0KK2NsYXNzIENFeHRyYWN0Q2FsbGJhY2tJbXA6DQorICBwdWJsaWMgSUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2ssDQorICBwdWJsaWMgSU9wZW5DYWxsYmFja1VJLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorcHVibGljOg0KKyAgDQorICBNWV9VTktOT1dOX0lNUA0KKw0KKyAgSU5URVJGQUNFX0lBcmNoaXZlRXh0cmFjdENhbGxiYWNrKDspDQorICBJTlRFUkZBQ0VfSU9wZW5DYWxsYmFja1VJKDspDQorDQorcHJpdmF0ZToNCisgIENNeUNvbVB0cjxJSW5BcmNoaXZlPiBfYXJjaGl2ZUhhbmRsZXI7DQorICBGU3RyaW5nIF9kaXJlY3RvcnlQYXRoOw0KKyAgVVN0cmluZyBfZmlsZVBhdGg7DQorICBGU3RyaW5nIF9kaXNrRmlsZVBhdGg7DQorDQorICBib29sIF9leHRyYWN0TW9kZTsNCisgIHN0cnVjdCBDUHJvY2Vzc2VkRmlsZUluZm8NCisgIHsNCisgICAgRklMRVRJTUUgTVRpbWU7DQorICAgIGJvb2wgSXNEaXI7DQorICAgIFVJbnQzMiBBdHRyaWJ1dGVzOw0KKyAgfSBfcHJvY2Vzc2VkRmlsZUluZm87DQorDQorICBDT3V0RmlsZVN0cmVhbSAqX291dEZpbGVTdHJlYW1TcGVjOw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsT3V0U3RyZWFtPiBfb3V0RmlsZVN0cmVhbTsNCisNCisgIFVTdHJpbmcgX2l0ZW1EZWZhdWx0TmFtZTsNCisgIEZJTEVUSU1FIF9kZWZhdWx0TVRpbWU7DQorICBVSW50MzIgX2RlZmF1bHRBdHRyaWJ1dGVzOw0KKw0KKyAgdm9pZCBDcmVhdGVDb21wbGV4RGlyZWN0b3J5KGNvbnN0IFVTdHJpbmdWZWN0b3IgJmRpclBhdGhQYXJ0cyk7DQorcHVibGljOg0KKyAgI2lmbmRlZiBfTk9fUFJPR1JFU1MNCisgIENQcm9ncmVzc0RpYWxvZyBQcm9ncmVzc0RpYWxvZzsNCisgICNlbmRpZg0KKw0KKyAgYm9vbCBfaXNDb3JydXB0Ow0KKyAgVVN0cmluZyBfbWVzc2FnZTsNCisNCisgIHZvaWQgSW5pdChJSW5BcmNoaXZlICphcmNoaXZlSGFuZGxlciwNCisgICAgY29uc3QgRlN0cmluZyAmZGlyZWN0b3J5UGF0aCwNCisgICAgY29uc3QgVVN0cmluZyAmaXRlbURlZmF1bHROYW1lLA0KKyAgICBjb25zdCBGSUxFVElNRSAmZGVmYXVsdE1UaW1lLA0KKyAgICBVSW50MzIgZGVmYXVsdEF0dHJpYnV0ZXMpOw0KKw0KKyAgI2lmbmRlZiBfTk9fUFJPR1JFU1MNCisgIEhSRVNVTFQgU3RhcnRQcm9ncmVzc0RpYWxvZyhjb25zdCBVU3RyaW5nICZ0aXRsZSwgTldpbmRvd3M6OkNUaHJlYWQgJnRocmVhZCkNCisgIHsNCisgICAgUHJvZ3Jlc3NEaWFsb2cuQ3JlYXRlKHRpdGxlLCB0aHJlYWQsIDApOw0KKyAgICB7DQorICAgICAgUHJvZ3Jlc3NEaWFsb2cuU2V0VGV4dChMYW5nU3RyaW5nKElEU19QUk9HUkVTU19FWFRSQUNUSU5HKSk7DQorICAgIH0NCisNCisgICAgUHJvZ3Jlc3NEaWFsb2cuU2hvdyhTV19TSE9XTk9STUFMKTsNCisgICAgcmV0dXJuIFNfT0s7DQorICB9DQorICB2aXJ0dWFsIH5DRXh0cmFjdENhbGxiYWNrSW1wKCkgeyBQcm9ncmVzc0RpYWxvZy5EZXN0cm95KCk7IH0NCisgICNlbmRpZg0KKw0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFNldHVwL0V4dHJhY3RFbmdpbmUuY3BwIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFNldHVwL0V4dHJhY3RFbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMGU5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYU2V0dXAvRXh0cmFjdEVuZ2luZS5jcHAKQEAgLTAsMCArMSwxMzggQEAKKy8vIEV4dHJhY3RFbmdpbmUuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVEaXIuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlTmFtZS5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1RocmVhZC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9VSS9Db21tb24vT3BlbkFyY2hpdmUuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vVUkvRmlsZU1hbmFnZXIvRm9ybWF0VXRpbHMuaCINCisjaW5jbHVkZSAiLi4vLi4vVUkvRmlsZU1hbmFnZXIvTGFuZ1V0aWxzLmgiDQorDQorI2luY2x1ZGUgIkV4dHJhY3RDYWxsYmFja1NmeC5oIg0KKyNpbmNsdWRlICJFeHRyYWN0RW5naW5lLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KK3VzaW5nIG5hbWVzcGFjZSBORmlsZTsNCit1c2luZyBuYW1lc3BhY2UgTkRpcjsNCisNCitzdGF0aWMgTFBDV1NUUiBrQ2FudEZpbmRBcmNoaXZlID0gTCJDYW4gbm90IGZpbmQgYXJjaGl2ZSBmaWxlIjsNCitzdGF0aWMgTFBDV1NUUiBrQ2FudE9wZW5BcmNoaXZlID0gTCJDYW4gbm90IG9wZW4gdGhlIGZpbGUgYXMgYXJjaGl2ZSI7DQorDQorc3RydWN0IENUaHJlYWRFeHRyYWN0aW5nDQorew0KKyAgQ0NvZGVjcyAqQ29kZWNzOw0KKyAgRlN0cmluZyBGaWxlTmFtZTsNCisgIEZTdHJpbmcgRGVzdEZvbGRlcjsNCisNCisgIENFeHRyYWN0Q2FsbGJhY2tJbXAgKkV4dHJhY3RDYWxsYmFja1NwZWM7DQorICBDTXlDb21QdHI8SUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2s+IEV4dHJhY3RDYWxsYmFjazsNCisNCisgIENBcmNoaXZlTGluayBBcmNoaXZlTGluazsNCisgIEhSRVNVTFQgUmVzdWx0Ow0KKyAgVVN0cmluZyBFcnJvck1lc3NhZ2U7DQorDQorICB2b2lkIFByb2Nlc3MyKCkNCisgIHsNCisgICAgTkZpbmQ6OkNGaWxlSW5mbyBmaTsNCisgICAgaWYgKCFmaS5GaW5kKEZpbGVOYW1lKSkNCisgICAgew0KKyAgICAgIEVycm9yTWVzc2FnZSA9IGtDYW50RmluZEFyY2hpdmU7DQorICAgICAgUmVzdWx0ID0gRV9GQUlMOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKw0KKyAgICBDT2JqZWN0VmVjdG9yPENPcGVuVHlwZT4gaW5jbDsNCisgICAgQ0ludFZlY3RvciBleGNsOw0KKyAgICBDT3Blbk9wdGlvbnMgb3B0aW9uczsNCisgICAgb3B0aW9ucy5jb2RlY3MgPSBDb2RlY3M7DQorICAgIG9wdGlvbnMudHlwZXMgPSAmaW5jbDsNCisgICAgb3B0aW9ucy5leGNsdWRlZEZvcm1hdHMgPSAmZXhjbDsNCisgICAgb3B0aW9ucy5maWxlUGF0aCA9IGZzMnVzKEZpbGVOYW1lKTsNCisgICAgDQorICAgIFJlc3VsdCA9IEFyY2hpdmVMaW5rLk9wZW4yKG9wdGlvbnMsIEV4dHJhY3RDYWxsYmFja1NwZWMpOw0KKyAgICBpZiAoUmVzdWx0ICE9IFNfT0spDQorICAgIHsNCisgICAgICBpZiAoUmVzdWx0ICE9IFNfT0spDQorICAgICAgICBFcnJvck1lc3NhZ2UgPSBrQ2FudE9wZW5BcmNoaXZlOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKw0KKyAgICBGU3RyaW5nIGRpclBhdGggPSBEZXN0Rm9sZGVyOw0KKyAgICBOTmFtZTo6Tm9ybWFsaXplRGlyUGF0aFByZWZpeChkaXJQYXRoKTsNCisgICAgDQorICAgIGlmICghQ3JlYXRlQ29tcGxleERpcihkaXJQYXRoKSkNCisgICAgew0KKyAgICAgIEVycm9yTWVzc2FnZSA9IE15Rm9ybWF0TmV3KElEU19DQU5OT1RfQ1JFQVRFX0ZPTERFUiwNCisgICAgICAgICNpZmRlZiBMQU5HDQorICAgICAgICAweDAyMDAwNjAzLA0KKyAgICAgICAgI2VuZGlmDQorICAgICAgICBmczJ1cyhkaXJQYXRoKSk7DQorICAgICAgUmVzdWx0ID0gRV9GQUlMOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKw0KKyAgICBFeHRyYWN0Q2FsbGJhY2tTcGVjLT5Jbml0KEFyY2hpdmVMaW5rLkdldEFyY2hpdmUoKSwgZGlyUGF0aCwgTCJEZWZhdWx0IiwgZmkuTVRpbWUsIDApOw0KKw0KKyAgICBSZXN1bHQgPSBBcmNoaXZlTGluay5HZXRBcmNoaXZlKCktPkV4dHJhY3QoMCwgKFVJbnQzMikoSW50MzIpLTEgLCBCb29sVG9JbnQoZmFsc2UpLCBFeHRyYWN0Q2FsbGJhY2spOw0KKyAgfQ0KKw0KKyAgdm9pZCBQcm9jZXNzKCkNCisgIHsNCisgICAgdHJ5DQorICAgIHsNCisgICAgICAjaWZuZGVmIF9OT19QUk9HUkVTUw0KKyAgICAgIENQcm9ncmVzc0Nsb3NlciBjbG9zZXIoRXh0cmFjdENhbGxiYWNrU3BlYy0+UHJvZ3Jlc3NEaWFsb2cpOw0KKyAgICAgICNlbmRpZg0KKyAgICAgIFByb2Nlc3MyKCk7DQorICAgIH0NCisgICAgY2F0Y2goLi4uKSB7IFJlc3VsdCA9IEVfRkFJTDsgfQ0KKyAgfQ0KKyAgDQorICBzdGF0aWMgVEhSRUFEX0ZVTkNfREVDTCBNeVRocmVhZEZ1bmN0aW9uKHZvaWQgKnBhcmFtKQ0KKyAgew0KKyAgICAoKENUaHJlYWRFeHRyYWN0aW5nICopcGFyYW0pLT5Qcm9jZXNzKCk7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KK307DQorDQorSFJFU1VMVCBFeHRyYWN0QXJjaGl2ZShDQ29kZWNzICpjb2RlY3MsIGNvbnN0IEZTdHJpbmcgJmZpbGVOYW1lLCBjb25zdCBGU3RyaW5nICZkZXN0Rm9sZGVyLA0KKyAgICBib29sIHNob3dQcm9ncmVzcywgYm9vbCAmaXNDb3JydXB0LCBVU3RyaW5nICZlcnJvck1lc3NhZ2UpDQorew0KKyAgaXNDb3JydXB0ID0gZmFsc2U7DQorICBDVGhyZWFkRXh0cmFjdGluZyB0Ow0KKw0KKyAgdC5Db2RlY3MgPSBjb2RlY3M7DQorICB0LkZpbGVOYW1lID0gZmlsZU5hbWU7DQorICB0LkRlc3RGb2xkZXIgPSBkZXN0Rm9sZGVyOw0KKw0KKyAgdC5FeHRyYWN0Q2FsbGJhY2tTcGVjID0gbmV3IENFeHRyYWN0Q2FsbGJhY2tJbXA7DQorICB0LkV4dHJhY3RDYWxsYmFjayA9IHQuRXh0cmFjdENhbGxiYWNrU3BlYzsNCisgIA0KKyAgI2lmbmRlZiBfTk9fUFJPR1JFU1MNCisNCisgIGlmIChzaG93UHJvZ3Jlc3MpDQorICB7DQorICAgIHQuRXh0cmFjdENhbGxiYWNrU3BlYy0+UHJvZ3Jlc3NEaWFsb2cuSWNvbklEID0gSURJX0lDT047DQorICAgIE5XaW5kb3dzOjpDVGhyZWFkIHRocmVhZDsNCisgICAgUklOT0sodGhyZWFkLkNyZWF0ZShDVGhyZWFkRXh0cmFjdGluZzo6TXlUaHJlYWRGdW5jdGlvbiwgJnQpKTsNCisgICAgDQorICAgIFVTdHJpbmcgdGl0bGU7DQorICAgIExhbmdTdHJpbmcoSURTX1BST0dSRVNTX0VYVFJBQ1RJTkcsIHRpdGxlKTsNCisgICAgdC5FeHRyYWN0Q2FsbGJhY2tTcGVjLT5TdGFydFByb2dyZXNzRGlhbG9nKHRpdGxlLCB0aHJlYWQpOw0KKyAgfQ0KKyAgZWxzZQ0KKw0KKyAgI2VuZGlmDQorICB7DQorICAgIHQuUHJvY2VzczIoKTsNCisgIH0NCisNCisgIGVycm9yTWVzc2FnZSA9IHQuRXJyb3JNZXNzYWdlOw0KKyAgaWYgKGVycm9yTWVzc2FnZS5Jc0VtcHR5KCkpDQorICAgIGVycm9yTWVzc2FnZSA9IHQuRXh0cmFjdENhbGxiYWNrU3BlYy0+X21lc3NhZ2U7DQorICBpc0NvcnJ1cHQgPSB0LkV4dHJhY3RDYWxsYmFja1NwZWMtPl9pc0NvcnJ1cHQ7DQorICByZXR1cm4gdC5SZXN1bHQ7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9FeHRyYWN0RW5naW5lLmggYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYU2V0dXAvRXh0cmFjdEVuZ2luZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYTk3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYU2V0dXAvRXh0cmFjdEVuZ2luZS5oCkBAIC0wLDAgKzEsMTEgQEAKKy8vIEV4dHJhY3RFbmdpbmUuaA0KKw0KKyNpZm5kZWYgX19FWFRSQUNUX0VOR0lORV9IDQorI2RlZmluZSBfX0VYVFJBQ1RfRU5HSU5FX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vVUkvQ29tbW9uL0xvYWRDb2RlY3MuaCINCisNCitIUkVTVUxUIEV4dHJhY3RBcmNoaXZlKENDb2RlY3MgKmNvZGVjcywgY29uc3QgRlN0cmluZyAmZmlsZU5hbWUsIGNvbnN0IEZTdHJpbmcgJmRlc3RGb2xkZXIsDQorICAgIGJvb2wgc2hvd1Byb2dyZXNzLCBib29sICZpc0NvcnJ1cHQsIFVTdHJpbmcgJmVycm9yTWVzc2FnZSk7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFNldHVwL1NGWFNldHVwLmRzcCBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9TRlhTZXR1cC5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyNDMxMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9TRlhTZXR1cC5kc3AKQEAgLTAsMCArMSw3NTIgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iU0ZYU2V0dXAiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIiAweDAxMDENCisNCitDRkc9U0ZYU2V0dXAgLSBXaW4zMiBEZWJ1Zw0KKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwNCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4NCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiU0ZYU2V0dXAubWFrIi4NCishTUVTU0FHRSANCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KKyFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIlNGWFNldHVwLm1hayIgQ0ZHPSJTRlhTZXR1cCAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJTRlhTZXR1cCAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFICJTRlhTZXR1cCAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAiU0ZYU2V0dXAgLSBXaW4zMiBSZWxlYXNlRCIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgDQorDQorIyBCZWdpbiBQcm9qZWN0DQorIyBQUk9QIEFsbG93UGVyQ29uZmlnRGVwZW5kZW5jaWVzIDANCisjIFBST1AgU2NjX1Byb2pOYW1lICIiDQorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiINCitDUFA9Y2wuZXhlDQorTVRMPW1pZGwuZXhlDQorUlNDPXJjLmV4ZQ0KKw0KKyFJRiAgIiQoQ0ZHKSIgPT0gIlNGWFNldHVwIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9HeiAvTVQgL1c0IC9XWCAvR1ggL08xIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJFWFRSQUNUX09OTFkiIC9EICJOT19SRUdJU1RSWSIgL0QgIl9TRlgiIC9EICJfTk9fQ1JZUFRPIiAvWXUiU3RkQWZ4LmgiIC9GRCAvYw0KKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBCQVNFIFJTQyAvbCAweDQxOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQxOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIgY29tY3RsMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYgL291dDoiQzpcVXRpbFw3elMuc2Z4IiAvb3B0Ok5PV0lOOTgNCisjIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0ZYU2V0dXAgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogL2MNCisjIEFERCBDUFAgL25vbG9nbyAvR3ogL01UZCAvVzQgL1dYIC9HbSAvR1ggL1pJIC9PZCAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiRVhUUkFDVF9PTkxZIiAvRCAiTk9fUkVHSVNUUlkiIC9EICJfU0ZYIiAvRCAiX05PX0NSWVBUTyIgL1l1IlN0ZEFmeC5oIiAvRkQgL0daIC9jDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDE5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDE5IC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBjb21jdGwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiQzpcVVRJTFw3elNmeFMuZXhlIiAvcGRidHlwZTpzZXB0DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIlNGWFNldHVwIC0gV2luMzIgUmVsZWFzZUQiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZUQiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZUQiDQorIyBQUk9QIEJBU0UgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlRCINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZUQiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08xIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJFWFRSQUNUX09OTFkiIC9EICJFWENMVURFX0NPTSIgL0QgIk5PX1JFR0lTVFJZIiAvRCAiX1NGWCIgL1l1IlN0ZEFmeC5oIiAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvR3ogL01EIC9XNCAvV1ggL0dYIC9PMSAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiRVhUUkFDVF9PTkxZIiAvRCAiTk9fUkVHSVNUUlkiIC9EICJfU0ZYIiAvRCAiX05PX0NSWVBUTyIgL1l1IlN0ZEFmeC5oIiAvRkQgL2MNCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MTkgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MTkgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBjb21jdGwzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL21hY2hpbmU6STM4NiAvb3V0OiJDOlxVVElMXDd6V2luU1IuZXhlIg0KKyMgU1VCVFJBQ1QgQkFTRSBMSU5LMzIgL2RlYnVnIC9ub2RlZmF1bHRsaWINCisjIEFERCBMSU5LMzIgY29tY3RsMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYgL291dDoiQzpcVXRpbFw3elNELnNmeCIgL29wdDpOT1dJTjk4DQorIyBTVUJUUkFDVCBMSU5LMzIgL3BkYjpub25lDQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJTRlhTZXR1cCAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJTRlhTZXR1cCAtIFdpbjMyIERlYnVnIg0KKyMgTmFtZSAiU0ZYU2V0dXAgLSBXaW4zMiBSZWxlYXNlRCINCisjIEJlZ2luIEdyb3VwICJTcGVjIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyZXNvdXJjZS5yYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFN0ZEFmeC5jcHANCisjIEFERCBDUFAgL1ljIlN0ZEFmeC5oIg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFN0ZEFmeC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkludGVyZmFjZSINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIjd6Ig0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekRlY29kZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekRlY29kZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pFeHRyYWN0LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6Rm9sZGVyT3V0U3RyZWFtLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6Rm9sZGVyT3V0U3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekhhbmRsZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pIYW5kbGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekhlYWRlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pJbi5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekluLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekl0ZW0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6UmVnaXN0ZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkFyY2hpdmUgQ29tbW9uIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ29kZXJNaXhlcjIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXENvZGVyTWl4ZXIyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ29kZXJNaXhlcjJNVC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ29kZXJNaXhlcjJNVC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXENyb3NzVGhyZWFkUHJvZ3Jlc3MuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXENyb3NzVGhyZWFkUHJvZ3Jlc3MuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxJdGVtTmFtZVV0aWxzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxJdGVtTmFtZVV0aWxzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cT3V0U3RyZWFtV2l0aENSQy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cT3V0U3RyZWFtV2l0aENSQy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkNvbXByZXNzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcQmNqMkNvZGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xCY2oyUmVnaXN0ZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEJjakNvZGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xCY2pSZWdpc3Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcQnJhbmNoQ29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXENvcHlDb2Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcQ29weVJlZ2lzdGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xMem1hMkRlY29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEx6bWEyRGVjb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEx6bWEyUmVnaXN0ZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEx6bWFEZWNvZGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xMem1hUmVnaXN0ZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkNvbW1vbiINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxDb21tYW5kTGluZVBhcnNlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXENvbW1hbmRMaW5lUGFyc2VyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXENSQy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXENSQy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxJbnRUb1N0cmluZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXEludFRvU3RyaW5nLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15U3RyaW5nLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cTXlTdHJpbmcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cTXlWZWN0b3IuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxNeVZlY3Rvci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxOZXdIYW5kbGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cTmV3SGFuZGxlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxTdHJpbmdDb252ZXJ0LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cU3RyaW5nQ29udmVydC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxUZXh0Q29uZmlnLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cVGV4dENvbmZpZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxVVEZDb252ZXJ0LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cVVRGQ29udmVydC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxXaWxkY2FyZC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXFdpbGRjYXJkLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiV2luZG93cyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIEdyb3VwICJDb250cm9sIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xDb250cm9sXERpYWxvZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xDb250cm9sXERpYWxvZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xETEwuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRExMLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xFcnJvck1zZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xFcnJvck1zZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZURpci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlRGlyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlRmluZC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlRmluZC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZUlPLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXEZpbGVJTy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZU5hbWUuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZU5hbWUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFByb3BWYXJpYW50LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFByb3BWYXJpYW50LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xSZXNvdXJjZVN0cmluZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xSZXNvdXJjZVN0cmluZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcU3luY2hyb25pemF0aW9uLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFN5bmNocm9uaXphdGlvbi5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcV2luZG93LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFdpbmRvdy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIjd6IENvbW1vbiINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxDcmVhdGVDb2Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXENyZWF0ZUNvZGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEZpbGVTdHJlYW1zLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cRmlsZVN0cmVhbXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cRmlsdGVyQ29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxGaWx0ZXJDb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxJbkJ1ZmZlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEluQnVmZmVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXExpbWl0ZWRTdHJlYW1zLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cTGltaXRlZFN0cmVhbXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cTG9ja2VkU3RyZWFtLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cTG9ja2VkU3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXE91dEJ1ZmZlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXE91dEJ1ZmZlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxQcm9ncmVzc1V0aWxzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cUHJvZ3Jlc3NVdGlscy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxQcm9wSWQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxTdHJlYW1CaW5kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxTdHJlYW1CaW5kZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cU3RyZWFtT2JqZWN0cy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXFN0cmVhbU9iamVjdHMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cU3RyZWFtVXRpbHMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxTdHJlYW1VdGlscy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxWaXJ0VGhyZWFkLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cVmlydFRocmVhZC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlVJIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gR3JvdXAgIkV4cGxvcmVyIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcRXhwbG9yZXJcTXlNZXNzYWdlcy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcRXhwbG9yZXJcTXlNZXNzYWdlcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlVJIENvbW1vbiINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxBcmNoaXZlT3BlbkNhbGxiYWNrLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cQXJjaGl2ZU9wZW5DYWxsYmFjay5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxEZWZhdWx0TmFtZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXERlZmF1bHROYW1lLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEV4dHJhY3RNb2RlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXExvYWRDb2RlY3MuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxMb2FkQ29kZWNzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXE9wZW5BcmNoaXZlLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cT3BlbkFyY2hpdmUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkZpbGUgTWFuYWdlciINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXEZpbGVNYW5hZ2VyXEZvcm1hdFV0aWxzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxGaWxlTWFuYWdlclxGb3JtYXRVdGlscy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXEZpbGVNYW5hZ2VyXExhbmdVdGlscy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXEZpbGVNYW5hZ2VyXFByb2dyZXNzRGlhbG9nLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxGaWxlTWFuYWdlclxQcm9ncmVzc0RpYWxvZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXDd6Q3JjLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXDd6Q3JjLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1w3ekNyY09wdC5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xBbGxvYy5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xBbGxvYy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcQnJhLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xCcmE4Ni5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xDcHVBcmNoLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXENwdUFyY2guaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6bWEyRGVjLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6bWEyRGVjLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xMem1hRGVjLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6bWFEZWMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXFRocmVhZHMuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcVGhyZWFkcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxFeHRyYWN0Q2FsbGJhY2tTZnguY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cRXh0cmFjdENhbGxiYWNrU2Z4LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxFeHRyYWN0RW5naW5lLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXEV4dHJhY3RFbmdpbmUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHNldHVwLmljbw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFNmeFNldHVwLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9TRlhTZXR1cC5kc3cgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYU2V0dXAvU0ZYU2V0dXAuZHN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NzAzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYU2V0dXAvU0ZYU2V0dXAuZHN3CkBAIC0wLDAgKzEsMjkgQEAKK01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSENCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIlNGWFNldHVwIj0uXFNGWFNldHVwLmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitHbG9iYWw6DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTwzPg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYU2V0dXAvU2Z4U2V0dXAuY3BwIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFNldHVwL1NmeFNldHVwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDJjMjYyCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFNldHVwL1NmeFNldHVwLmNwcApAQCAtMCwwICsxLDM1NiBAQAorLy8gTWFpbi5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeUluaXRHdWlkLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9Db21tYW5kTGluZVBhcnNlci5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vU3RyaW5nQ29udmVydC5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vVGV4dENvbmZpZy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0RMTC5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0Vycm9yTXNnLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZURpci5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVGaW5kLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZUlPLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZU5hbWUuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9OdENoZWNrLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvUmVzb3VyY2VTdHJpbmcuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vVUkvRXhwbG9yZXIvTXlNZXNzYWdlcy5oIg0KKw0KKyNpbmNsdWRlICJFeHRyYWN0RW5naW5lLmgiDQorDQorI2luY2x1ZGUgInJlc291cmNlLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KK3VzaW5nIG5hbWVzcGFjZSBORmlsZTsNCit1c2luZyBuYW1lc3BhY2UgTkRpcjsNCisNCitISU5TVEFOQ0UgZ19oSW5zdGFuY2U7DQorDQorc3RhdGljIENGU1RSIGtUZW1wRGlyUHJlZml4ID0gRlRFWFQoIjd6UyIpOw0KKw0KKyNkZWZpbmUgX1NIRUxMX0VYRUNVVEUNCisNCitzdGF0aWMgYm9vbCBSZWFkRGF0YVN0cmluZyhDRlNUUiBmaWxlTmFtZSwgTFBDU1RSIHN0YXJ0SUQsDQorICAgIExQQ1NUUiBlbmRJRCwgQVN0cmluZyAmc3RyaW5nUmVzdWx0KQ0KK3sNCisgIHN0cmluZ1Jlc3VsdC5FbXB0eSgpOw0KKyAgTklPOjpDSW5GaWxlIGluRmlsZTsNCisgIGlmICghaW5GaWxlLk9wZW4oZmlsZU5hbWUpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAoMSA8PCAxMik7DQorDQorICBCeXRlIGJ1ZmZlcltrQnVmZmVyU2l6ZV07DQorICBpbnQgc2lnbmF0dXJlU3RhcnRTaXplID0gTXlTdHJpbmdMZW4oc3RhcnRJRCk7DQorICBpbnQgc2lnbmF0dXJlRW5kU2l6ZSA9IE15U3RyaW5nTGVuKGVuZElEKTsNCisgIA0KKyAgVUludDMyIG51bUJ5dGVzUHJldiA9IDA7DQorICBib29sIHdyaXRlTW9kZSA9IGZhbHNlOw0KKyAgVUludDY0IHBvc1RvdGFsID0gMDsNCisgIGZvciAoOzspDQorICB7DQorICAgIGlmIChwb3NUb3RhbCA+ICgxIDw8IDIwKSkNCisgICAgICByZXR1cm4gKHN0cmluZ1Jlc3VsdC5Jc0VtcHR5KCkpOw0KKyAgICBVSW50MzIgbnVtUmVhZEJ5dGVzID0ga0J1ZmZlclNpemUgLSBudW1CeXRlc1ByZXY7DQorICAgIFVJbnQzMiBwcm9jZXNzZWRTaXplOw0KKyAgICBpZiAoIWluRmlsZS5SZWFkKGJ1ZmZlciArIG51bUJ5dGVzUHJldiwgbnVtUmVhZEJ5dGVzLCBwcm9jZXNzZWRTaXplKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIGlmIChwcm9jZXNzZWRTaXplID09IDApDQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIFVJbnQzMiBudW1CeXRlc0luQnVmZmVyID0gbnVtQnl0ZXNQcmV2ICsgcHJvY2Vzc2VkU2l6ZTsNCisgICAgVUludDMyIHBvcyA9IDA7DQorICAgIGZvciAoOzspDQorICAgIHsNCisgICAgICBpZiAod3JpdGVNb2RlKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChwb3MgPiBudW1CeXRlc0luQnVmZmVyIC0gc2lnbmF0dXJlRW5kU2l6ZSkNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBpZiAobWVtY21wKGJ1ZmZlciArIHBvcywgZW5kSUQsIHNpZ25hdHVyZUVuZFNpemUpID09IDApDQorICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgY2hhciBiID0gYnVmZmVyW3Bvc107DQorICAgICAgICBpZiAoYiA9PSAwKQ0KKyAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICBzdHJpbmdSZXN1bHQgKz0gYjsNCisgICAgICAgIHBvcysrOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgaWYgKHBvcyA+IG51bUJ5dGVzSW5CdWZmZXIgLSBzaWduYXR1cmVTdGFydFNpemUpDQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgaWYgKG1lbWNtcChidWZmZXIgKyBwb3MsIHN0YXJ0SUQsIHNpZ25hdHVyZVN0YXJ0U2l6ZSkgPT0gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgd3JpdGVNb2RlID0gdHJ1ZTsNCisgICAgICAgICAgcG9zICs9IHNpZ25hdHVyZVN0YXJ0U2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgICAgcG9zKys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIG51bUJ5dGVzUHJldiA9IG51bUJ5dGVzSW5CdWZmZXIgLSBwb3M7DQorICAgIHBvc1RvdGFsICs9IHBvczsNCisgICAgbWVtbW92ZShidWZmZXIsIGJ1ZmZlciArIHBvcywgbnVtQnl0ZXNQcmV2KTsNCisgIH0NCit9DQorDQorc3RhdGljIGNoYXIga1N0YXJ0SURbXSA9ICIsIUBJbnN0YWxsQCFVVEYtOCEiOw0KK3N0YXRpYyBjaGFyIGtFbmRJRFtdID0gIiwhQEluc3RhbGxFbmRAISI7DQorDQorY2xhc3MgQ0luc3RhbGxJREluaXQNCit7DQorcHVibGljOg0KKyAgQ0luc3RhbGxJREluaXQoKQ0KKyAgew0KKyAgICBrU3RhcnRJRFswXSA9ICc7JzsNCisgICAga0VuZElEWzBdID0gJzsnOw0KKyAgfTsNCit9IGdfQ0luc3RhbGxJREluaXQ7DQorDQorDQorI2RlZmluZSBOVF9DSEVDS19GQUlMX0FDVElPTiBTaG93RXJyb3JNZXNzYWdlKEwiVW5zdXBwb3J0ZWQgV2luZG93cyB2ZXJzaW9uIik7IHJldHVybiAxOw0KKw0KK3N0YXRpYyB2b2lkIFNob3dFcnJvck1lc3NhZ2VTcGVjKGNvbnN0IFVTdHJpbmcgJm5hbWUpDQorew0KKyAgVVN0cmluZyBtZXNzYWdlID0gTkVycm9yOjpNeUZvcm1hdE1lc3NhZ2UoOjpHZXRMYXN0RXJyb3IoKSk7DQorICBpbnQgcG9zID0gbWVzc2FnZS5GaW5kKEwiJTEiKTsNCisgIGlmIChwb3MgPj0gMCkNCisgIHsNCisgICAgbWVzc2FnZS5EZWxldGUocG9zLCAyKTsNCisgICAgbWVzc2FnZS5JbnNlcnQocG9zLCBuYW1lKTsNCisgIH0NCisgIFNob3dFcnJvck1lc3NhZ2UoTlVMTCwgbWVzc2FnZSk7DQorfQ0KKw0KK2ludCBBUElFTlRSWSBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdGFuY2UsIEhJTlNUQU5DRSAvKiBoUHJldkluc3RhbmNlICovLA0KKyAgICAjaWZkZWYgVU5ERVJfQ0UNCisgICAgTFBXU1RSDQorICAgICNlbHNlDQorICAgIExQU1RSDQorICAgICNlbmRpZg0KKyAgICAvKiBscENtZExpbmUgKi8saW50IC8qIG5DbWRTaG93ICovKQ0KK3sNCisgIGdfaEluc3RhbmNlID0gKEhJTlNUQU5DRSloSW5zdGFuY2U7DQorDQorICBOVF9DSEVDSw0KKw0KKyAgLy8gSW5pdENvbW1vbkNvbnRyb2xzKCk7DQorDQorICBVU3RyaW5nIGFyY2hpdmVOYW1lLCBzd2l0Y2hlczsNCisgICNpZmRlZiBfU0hFTExfRVhFQ1VURQ0KKyAgVVN0cmluZyBleGVjdXRlRmlsZSwgZXhlY3V0ZVBhcmFtZXRlcnM7DQorICAjZW5kaWYNCisgIE5Db21tYW5kTGluZVBhcnNlcjo6U3BsaXRDb21tYW5kTGluZShHZXRDb21tYW5kTGluZVcoKSwgYXJjaGl2ZU5hbWUsIHN3aXRjaGVzKTsNCisNCisgIEZTdHJpbmcgZnVsbFBhdGg7DQorICBORExMOjpNeUdldE1vZHVsZUZpbGVOYW1lKGZ1bGxQYXRoKTsNCisNCisgIHN3aXRjaGVzLlRyaW0oKTsNCisgIGJvb2wgYXNzdW1lWWVzID0gZmFsc2U7DQorICBpZiAoTXlTdHJpbmdDb21wYXJlTm9DYXNlX04oc3dpdGNoZXMsIEwiLXkiLCAyKSA9PSAwKQ0KKyAgew0KKyAgICBhc3N1bWVZZXMgPSB0cnVlOw0KKyAgICBzd2l0Y2hlcyA9IHN3aXRjaGVzLlB0cigyKTsNCisgICAgc3dpdGNoZXMuVHJpbSgpOw0KKyAgfQ0KKw0KKyAgQVN0cmluZyBjb25maWc7DQorICBpZiAoIVJlYWREYXRhU3RyaW5nKGZ1bGxQYXRoLCBrU3RhcnRJRCwga0VuZElELCBjb25maWcpKQ0KKyAgew0KKyAgICBpZiAoIWFzc3VtZVllcykNCisgICAgICBTaG93RXJyb3JNZXNzYWdlKEwiQ2FuJ3QgbG9hZCBjb25maWcgaW5mbyIpOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCisNCisgIFVTdHJpbmcgZGlyUHJlZml4ID0gTCIuIiBXU1RSSU5HX1BBVEhfU0VQQVJBVE9SOw0KKyAgVVN0cmluZyBhcHBMYXVuY2hlZDsNCisgIGJvb2wgc2hvd1Byb2dyZXNzID0gdHJ1ZTsNCisgIGlmICghY29uZmlnLklzRW1wdHkoKSkNCisgIHsNCisgICAgQ09iamVjdFZlY3RvcjxDVGV4dENvbmZpZ1BhaXI+IHBhaXJzOw0KKyAgICBpZiAoIUdldFRleHRDb25maWcoY29uZmlnLCBwYWlycykpDQorICAgIHsNCisgICAgICBpZiAoIWFzc3VtZVllcykNCisgICAgICAgIFNob3dFcnJvck1lc3NhZ2UoTCJDb25maWcgZmFpbGVkIik7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgICAgVVN0cmluZyBmcmllbmRseU5hbWUgPSBHZXRUZXh0Q29uZmlnVmFsdWUocGFpcnMsIEwiVGl0bGUiKTsNCisgICAgVVN0cmluZyBpbnN0YWxsUHJvbXB0ID0gR2V0VGV4dENvbmZpZ1ZhbHVlKHBhaXJzLCBMIkJlZ2luUHJvbXB0Iik7DQorICAgIFVTdHJpbmcgcHJvZ3Jlc3MgPSBHZXRUZXh0Q29uZmlnVmFsdWUocGFpcnMsIEwiUHJvZ3Jlc3MiKTsNCisgICAgaWYgKHByb2dyZXNzLklzRXF1YWxUb05vQ2FzZShMIm5vIikpDQorICAgICAgc2hvd1Byb2dyZXNzID0gZmFsc2U7DQorICAgIGludCBpbmRleCA9IEZpbmRUZXh0Q29uZmlnSXRlbShwYWlycywgTCJEaXJlY3RvcnkiKTsNCisgICAgaWYgKGluZGV4ID49IDApDQorICAgICAgZGlyUHJlZml4ID0gcGFpcnNbaW5kZXhdLlN0cmluZzsNCisgICAgaWYgKCFpbnN0YWxsUHJvbXB0LklzRW1wdHkoKSAmJiAhYXNzdW1lWWVzKQ0KKyAgICB7DQorICAgICAgaWYgKE1lc3NhZ2VCb3hXKDAsIGluc3RhbGxQcm9tcHQsIGZyaWVuZGx5TmFtZSwgTUJfWUVTTk8gfA0KKyAgICAgICAgICBNQl9JQ09OUVVFU1RJT04pICE9IElEWUVTKQ0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgYXBwTGF1bmNoZWQgPSBHZXRUZXh0Q29uZmlnVmFsdWUocGFpcnMsIEwiUnVuUHJvZ3JhbSIpOw0KKyAgICANCisgICAgI2lmZGVmIF9TSEVMTF9FWEVDVVRFDQorICAgIGV4ZWN1dGVGaWxlID0gR2V0VGV4dENvbmZpZ1ZhbHVlKHBhaXJzLCBMIkV4ZWN1dGVGaWxlIik7DQorICAgIGV4ZWN1dGVQYXJhbWV0ZXJzID0gR2V0VGV4dENvbmZpZ1ZhbHVlKHBhaXJzLCBMIkV4ZWN1dGVQYXJhbWV0ZXJzIik7DQorICAgICNlbmRpZg0KKyAgfQ0KKw0KKyAgQ1RlbXBEaXIgdGVtcERpcjsNCisgIGlmICghdGVtcERpci5DcmVhdGUoa1RlbXBEaXJQcmVmaXgpKQ0KKyAgew0KKyAgICBpZiAoIWFzc3VtZVllcykNCisgICAgICBTaG93RXJyb3JNZXNzYWdlKEwiQ2FuIG5vdCBjcmVhdGUgdGVtcCBmb2xkZXIgYXJjaGl2ZSIpOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCisNCisgIENDb2RlY3MgKmNvZGVjcyA9IG5ldyBDQ29kZWNzOw0KKyAgQ015Q29tUHRyPElVbmtub3duPiBjb21wcmVzc0NvZGVjc0luZm8gPSBjb2RlY3M7DQorICBIUkVTVUxUIHJlc3VsdCA9IGNvZGVjcy0+TG9hZCgpOw0KKyAgaWYgKHJlc3VsdCAhPSBTX09LKQ0KKyAgew0KKyAgICBTaG93RXJyb3JNZXNzYWdlKEwiQ2FuIG5vdCBsb2FkIGNvZGVjcyIpOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCisNCisgIGNvbnN0IEZTdHJpbmcgdGVtcERpclBhdGggPSB0ZW1wRGlyLkdldFBhdGgoKTsNCisgIC8vIHRlbXBEaXJQYXRoID0gTCJNOlxcMVxcIjsgLy8gdG8gdGVzdCBsb3cgZGlzayBzcGFjZQ0KKyAgew0KKyAgICBib29sIGlzQ29ycnVwdCA9IGZhbHNlOw0KKyAgICBVU3RyaW5nIGVycm9yTWVzc2FnZTsNCisgICAgSFJFU1VMVCByZXN1bHQgPSBFeHRyYWN0QXJjaGl2ZShjb2RlY3MsIGZ1bGxQYXRoLCB0ZW1wRGlyUGF0aCwgc2hvd1Byb2dyZXNzLA0KKyAgICAgIGlzQ29ycnVwdCwgZXJyb3JNZXNzYWdlKTsNCisgICAgDQorICAgIGlmIChyZXN1bHQgIT0gU19PSykNCisgICAgew0KKyAgICAgIGlmICghYXNzdW1lWWVzKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChyZXN1bHQgPT0gU19GQUxTRSB8fCBpc0NvcnJ1cHQpDQorICAgICAgICB7DQorICAgICAgICAgIE5XaW5kb3dzOjpNeUxvYWRTdHJpbmcoSURTX0VYVFJBQ1RJT05fRVJST1JfTUVTU0FHRSwgZXJyb3JNZXNzYWdlKTsNCisgICAgICAgICAgcmVzdWx0ID0gRV9GQUlMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJlc3VsdCAhPSBFX0FCT1JUKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLklzRW1wdHkoKSkNCisgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBORXJyb3I6Ok15Rm9ybWF0TWVzc2FnZShyZXN1bHQpOw0KKyAgICAgICAgICA6Ok1lc3NhZ2VCb3hXKDAsIGVycm9yTWVzc2FnZSwgTldpbmRvd3M6Ok15TG9hZFN0cmluZyhJRFNfRVhUUkFDVElPTl9FUlJPUl9USVRMRSksIE1CX0lDT05FUlJPUik7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICB9DQorDQorICAjaWZuZGVmIFVOREVSX0NFDQorICBDQ3VycmVudERpclJlc3RvcmVyIGN1cnJlbnREaXJSZXN0b3JlcjsNCisgIGlmICghU2V0Q3VycmVudERpcih0ZW1wRGlyUGF0aCkpDQorICAgIHJldHVybiAxOw0KKyAgI2VuZGlmDQorICANCisgIEhBTkRMRSBoUHJvY2VzcyA9IDA7DQorI2lmZGVmIF9TSEVMTF9FWEVDVVRFDQorICBpZiAoIWV4ZWN1dGVGaWxlLklzRW1wdHkoKSkNCisgIHsNCisgICAgQ1N5c1N0cmluZyBmaWxlUGF0aCA9IEdldFN5c3RlbVN0cmluZyhleGVjdXRlRmlsZSk7DQorICAgIFNIRUxMRVhFQ1VURUlORk8gZXhlY0luZm87DQorICAgIGV4ZWNJbmZvLmNiU2l6ZSA9IHNpemVvZihleGVjSW5mbyk7DQorICAgIGV4ZWNJbmZvLmZNYXNrID0gU0VFX01BU0tfTk9DTE9TRVBST0NFU1MNCisgICAgICAjaWZuZGVmIFVOREVSX0NFDQorICAgICAgfCBTRUVfTUFTS19GTEFHX0RERVdBSVQNCisgICAgICAjZW5kaWYNCisgICAgICA7DQorICAgIGV4ZWNJbmZvLmh3bmQgPSBOVUxMOw0KKyAgICBleGVjSW5mby5scFZlcmIgPSBOVUxMOw0KKyAgICBleGVjSW5mby5scEZpbGUgPSBmaWxlUGF0aDsNCisNCisgICAgaWYgKCFzd2l0Y2hlcy5Jc0VtcHR5KCkpDQorICAgIHsNCisgICAgICBpZiAoIWV4ZWN1dGVQYXJhbWV0ZXJzLklzRW1wdHkoKSkNCisgICAgICAgIGV4ZWN1dGVQYXJhbWV0ZXJzICs9IEwnICc7DQorICAgICAgZXhlY3V0ZVBhcmFtZXRlcnMgKz0gc3dpdGNoZXM7DQorICAgIH0NCisNCisgICAgQ1N5c1N0cmluZyBwYXJhbWV0ZXJzU3lzID0gR2V0U3lzdGVtU3RyaW5nKGV4ZWN1dGVQYXJhbWV0ZXJzKTsNCisgICAgaWYgKHBhcmFtZXRlcnNTeXMuSXNFbXB0eSgpKQ0KKyAgICAgIGV4ZWNJbmZvLmxwUGFyYW1ldGVycyA9IE5VTEw7DQorICAgIGVsc2UNCisgICAgICBleGVjSW5mby5scFBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzU3lzOw0KKw0KKyAgICBleGVjSW5mby5scERpcmVjdG9yeSA9IE5VTEw7DQorICAgIGV4ZWNJbmZvLm5TaG93ID0gU1dfU0hPV05PUk1BTDsNCisgICAgZXhlY0luZm8uaFByb2Nlc3MgPSAwOw0KKyAgICAvKiBCT09MIHN1Y2Nlc3MgPSAqLyA6OlNoZWxsRXhlY3V0ZUV4KCZleGVjSW5mbyk7DQorICAgIFVJTlQzMiByZXN1bHQgPSAoVUlOVDMyKShVSU5UX1BUUilleGVjSW5mby5oSW5zdEFwcDsNCisgICAgaWYocmVzdWx0IDw9IDMyKQ0KKyAgICB7DQorICAgICAgaWYgKCFhc3N1bWVZZXMpDQorICAgICAgICBTaG93RXJyb3JNZXNzYWdlKEwiQ2FuIG5vdCBvcGVuIGZpbGUiKTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBoUHJvY2VzcyA9IGV4ZWNJbmZvLmhQcm9jZXNzOw0KKyAgfQ0KKyAgZWxzZQ0KKyNlbmRpZg0KKyAgew0KKyAgICBpZiAoYXBwTGF1bmNoZWQuSXNFbXB0eSgpKQ0KKyAgICB7DQorICAgICAgYXBwTGF1bmNoZWQgPSBMInNldHVwLmV4ZSI7DQorICAgICAgaWYgKCFORmluZDo6RG9lc0ZpbGVFeGlzdCh1czJmcyhhcHBMYXVuY2hlZCkpKQ0KKyAgICAgIHsNCisgICAgICAgIGlmICghYXNzdW1lWWVzKQ0KKyAgICAgICAgICBTaG93RXJyb3JNZXNzYWdlKEwiQ2FuIG5vdCBmaW5kIHNldHVwLmV4ZSIpOw0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICB7DQorICAgICAgRlN0cmluZyBzMiA9IHRlbXBEaXJQYXRoOw0KKyAgICAgIE5OYW1lOjpOb3JtYWxpemVEaXJQYXRoUHJlZml4KHMyKTsNCisgICAgICBhcHBMYXVuY2hlZC5SZXBsYWNlKEwiJSVUIiBXU1RSSU5HX1BBVEhfU0VQQVJBVE9SLCBmczJ1cyhzMikpOw0KKyAgICB9DQorICAgIA0KKyAgICBVU3RyaW5nIGFwcE5hbWVGb3JFcnJvciA9IGFwcExhdW5jaGVkOyAvLyBhY3R1YWxseSB3ZSBuZWVkIHRvIHJ0ZW1vdmUgcGFyYW1ldGVycyBhbHNvDQorDQorICAgIGFwcExhdW5jaGVkLlJlcGxhY2UoTCIlJVQiLCBmczJ1cyh0ZW1wRGlyUGF0aCkpOw0KKw0KKyAgICBpZiAoIXN3aXRjaGVzLklzRW1wdHkoKSkNCisgICAgew0KKyAgICAgIGFwcExhdW5jaGVkICs9IEwnICc7DQorICAgICAgYXBwTGF1bmNoZWQgKz0gc3dpdGNoZXM7DQorICAgIH0NCisgICAgU1RBUlRVUElORk8gc3RhcnR1cEluZm87DQorICAgIHN0YXJ0dXBJbmZvLmNiID0gc2l6ZW9mKHN0YXJ0dXBJbmZvKTsNCisgICAgc3RhcnR1cEluZm8ubHBSZXNlcnZlZCA9IDA7DQorICAgIHN0YXJ0dXBJbmZvLmxwRGVza3RvcCA9IDA7DQorICAgIHN0YXJ0dXBJbmZvLmxwVGl0bGUgPSAwOw0KKyAgICBzdGFydHVwSW5mby5kd0ZsYWdzID0gMDsNCisgICAgc3RhcnR1cEluZm8uY2JSZXNlcnZlZDIgPSAwOw0KKyAgICBzdGFydHVwSW5mby5scFJlc2VydmVkMiA9IDA7DQorICAgIA0KKyAgICBQUk9DRVNTX0lORk9STUFUSU9OIHByb2Nlc3NJbmZvcm1hdGlvbjsNCisgICAgDQorICAgIENTeXNTdHJpbmcgYXBwTGF1bmNoZWRTeXMgPSBHZXRTeXN0ZW1TdHJpbmcoZGlyUHJlZml4ICsgYXBwTGF1bmNoZWQpOw0KKyAgICANCisgICAgQk9PTCBjcmVhdGVSZXN1bHQgPSBDcmVhdGVQcm9jZXNzKE5VTEwsIChMUFRTVFIpKExQQ1RTVFIpYXBwTGF1bmNoZWRTeXMsDQorICAgICAgTlVMTCwgTlVMTCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwgLyp0ZW1wRGlyLkdldFBhdGgoKSAqLywNCisgICAgICAmc3RhcnR1cEluZm8sICZwcm9jZXNzSW5mb3JtYXRpb24pOw0KKyAgICBpZiAoY3JlYXRlUmVzdWx0ID09IDApDQorICAgIHsNCisgICAgICBpZiAoIWFzc3VtZVllcykNCisgICAgICB7DQorICAgICAgICAvLyB3ZSBwcmludCBuYW1lIG9mIGV4ZSBmaWxlLCBpZiBlcnJvciBtZXNzYWdlIGlzDQorICAgICAgICAvLyBFUlJPUl9CQURfRVhFX0ZPUk1BVDogIiUxIGlzIG5vdCBhIHZhbGlkIFdpbjMyIGFwcGxpY2F0aW9uIi4NCisgICAgICAgIFNob3dFcnJvck1lc3NhZ2VTcGVjKGFwcE5hbWVGb3JFcnJvcik7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIDo6Q2xvc2VIYW5kbGUocHJvY2Vzc0luZm9ybWF0aW9uLmhUaHJlYWQpOw0KKyAgICBoUHJvY2VzcyA9IHByb2Nlc3NJbmZvcm1hdGlvbi5oUHJvY2VzczsNCisgIH0NCisgIGlmIChoUHJvY2VzcyAhPSAwKQ0KKyAgew0KKyAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGhQcm9jZXNzLCBJTkZJTklURSk7DQorICAgIDo6Q2xvc2VIYW5kbGUoaFByb2Nlc3MpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9TdGRBZnguY3BwIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFNldHVwL1N0ZEFmeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkM2IxZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9TdGRBZnguY3BwCkBAIC0wLDAgKzEsMyBAQAorLy8gU3RkQWZ4LmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYU2V0dXAvU3RkQWZ4LmggYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYU2V0dXAvU3RkQWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0MTBlZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9TdGRBZnguaApAQCAtMCwwICsxLDEzIEBACisvLyBTdGRBZnguaA0KKw0KKyNpZm5kZWYgX19TVERBRlhfSA0KKyNkZWZpbmUgX19TVERBRlhfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vQ29tbW9uLmgiDQorDQorI2luY2x1ZGUgPGNvbW1jdHJsLmg+DQorDQorLy8gI2RlZmluZSBwcmludGYoeCkgTk9fUFJJTlRGXyh4KQ0KKy8vICNkZWZpbmUgc3ByaW50Zih4KSBOT19TUFJJTlRGXyh4KQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9tYWtlZmlsZSBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9tYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2M2NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFNldHVwL21ha2VmaWxlCkBAIC0wLDAgKzEsMTA3IEBACitQUk9HID0gN3pTLnNmeA0KK0NGTEFHUyA9ICQoQ0ZMQUdTKSBcDQorICAtRE5PX1JFR0lTVFJZIFwNCisgIC1ERVhUUkFDVF9PTkxZIFwNCisgIC1ETk9fUkVBRF9GUk9NX0NPREVSIFwNCisgIC1EX1NGWCBcDQorICAtRF9OT19DUllQVE8gXA0KKw0KK0NVUlJFTlRfT0JKUyA9IFwNCisgICRPXFNmeFNldHVwLm9iaiBcDQorICAkT1xFeHRyYWN0Q2FsbGJhY2tTZngub2JqIFwNCisgICRPXEV4dHJhY3RFbmdpbmUub2JqIFwNCisNCitDT01NT05fT0JKUyA9IFwNCisgICRPXENvbW1hbmRMaW5lUGFyc2VyLm9iaiBcDQorICAkT1xDUkMub2JqIFwNCisgICRPXEludFRvU3RyaW5nLm9iaiBcDQorICAkT1xOZXdIYW5kbGVyLm9iaiBcDQorICAkT1xNeVN0cmluZy5vYmogXA0KKyAgJE9cU3RyaW5nQ29udmVydC5vYmogXA0KKyAgJE9cVGV4dENvbmZpZy5vYmogXA0KKyAgJE9cVVRGQ29udmVydC5vYmogXA0KKyAgJE9cTXlWZWN0b3Iub2JqIFwNCisgICRPXFdpbGRjYXJkLm9iaiBcDQorDQorV0lOX09CSlMgPSBcDQorICAkT1xETEwub2JqIFwNCisgICRPXEVycm9yTXNnLm9iaiBcDQorICAkT1xGaWxlRGlyLm9iaiBcDQorICAkT1xGaWxlRmluZC5vYmogXA0KKyAgJE9cRmlsZUlPLm9iaiBcDQorICAkT1xGaWxlTmFtZS5vYmogXA0KKyAgJE9cUHJvcFZhcmlhbnQub2JqIFwNCisgICRPXFJlc291cmNlU3RyaW5nLm9iaiBcDQorICAkT1xTeW5jaHJvbml6YXRpb24ub2JqIFwNCisgICRPXFdpbmRvdy5vYmogXA0KKw0KK1dJTl9DVFJMX09CSlMgPSBcDQorICAkT1xEaWFsb2cub2JqIFwNCisNCis3WklQX0NPTU1PTl9PQkpTID0gXA0KKyAgJE9cQ3JlYXRlQ29kZXIub2JqIFwNCisgICRPXEZpbGVTdHJlYW1zLm9iaiBcDQorICAkT1xJbkJ1ZmZlci5vYmogXA0KKyAgJE9cRmlsdGVyQ29kZXIub2JqIFwNCisgICRPXExpbWl0ZWRTdHJlYW1zLm9iaiBcDQorICAkT1xMb2NrZWRTdHJlYW0ub2JqIFwNCisgICRPXE91dEJ1ZmZlci5vYmogXA0KKyAgJE9cUHJvZ3Jlc3NVdGlscy5vYmogXA0KKyAgJE9cUHJvcElkLm9iaiBcDQorICAkT1xTdHJlYW1CaW5kZXIub2JqIFwNCisgICRPXFN0cmVhbU9iamVjdHMub2JqIFwNCisgICRPXFN0cmVhbVV0aWxzLm9iaiBcDQorICAkT1xWaXJ0VGhyZWFkLm9iaiBcDQorDQorVUlfQ09NTU9OX09CSlMgPSBcDQorICAkT1xBcmNoaXZlT3BlbkNhbGxiYWNrLm9iaiBcDQorICAkT1xEZWZhdWx0TmFtZS5vYmogXA0KKyAgJE9cTG9hZENvZGVjcy5vYmogXA0KKyAgJE9cT3BlbkFyY2hpdmUub2JqIFwNCisNCitFWFBMT1JFUl9PQkpTID0gXA0KKyAgJE9cTXlNZXNzYWdlcy5vYmogXA0KKw0KK0ZNX09CSlMgPSBcDQorICAkT1xGb3JtYXRVdGlscy5vYmogXA0KKyAgJE9cUHJvZ3Jlc3NEaWFsb2cub2JqIFwNCisNCitBUl9DT01NT05fT0JKUyA9IFwNCisgICRPXENvZGVyTWl4ZXIyLm9iaiBcDQorICAkT1xDb2Rlck1peGVyMk1ULm9iaiBcDQorICAkT1xDcm9zc1RocmVhZFByb2dyZXNzLm9iaiBcDQorICAkT1xJdGVtTmFtZVV0aWxzLm9iaiBcDQorICAkT1xPdXRTdHJlYW1XaXRoQ1JDLm9iaiBcDQorDQorN1pfT0JKUyA9IFwNCisgICRPXDd6RGVjb2RlLm9iaiBcDQorICAkT1w3ekV4dHJhY3Qub2JqIFwNCisgICRPXDd6Rm9sZGVyT3V0U3RyZWFtLm9iaiBcDQorICAkT1w3ekhhbmRsZXIub2JqIFwNCisgICRPXDd6SW4ub2JqIFwNCisgICRPXDd6UmVnaXN0ZXIub2JqIFwNCisNCitDT01QUkVTU19PQkpTID0gXA0KKyAgJE9cQnJhbmNoQ29kZXIub2JqIFwNCisgICRPXEJjajJDb2Rlci5vYmogXA0KKyAgJE9cQmNqMlJlZ2lzdGVyLm9iaiBcDQorICAkT1xCY2pDb2Rlci5vYmogXA0KKyAgJE9cQmNqUmVnaXN0ZXIub2JqIFwNCisgICRPXENvcHlDb2Rlci5vYmogXA0KKyAgJE9cQ29weVJlZ2lzdGVyLm9iaiBcDQorICAkT1xMem1hMkRlY29kZXIub2JqIFwNCisgICRPXEx6bWEyUmVnaXN0ZXIub2JqIFwNCisgICRPXEx6bWFEZWNvZGVyLm9iaiBcDQorICAkT1xMem1hUmVnaXN0ZXIub2JqIFwNCisNCitDX09CSlMgPSBcDQorICAkT1xBbGxvYy5vYmogXA0KKyAgJE9cQnJhODYub2JqIFwNCisgICRPXENwdUFyY2gub2JqIFwNCisgICRPXEx6bWEyRGVjLm9iaiBcDQorICAkT1xMem1hRGVjLm9iaiBcDQorICAkT1xUaHJlYWRzLm9iaiBcDQorDQorIWluY2x1ZGUgIi4uLy4uL0NyYy5tYWsiDQorDQorIWluY2x1ZGUgIi4uLy4uLzd6aXAubWFrIg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9yZXNvdXJjZS5oIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFNldHVwL3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzMTk3ZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9yZXNvdXJjZS5oCkBAIC0wLDAgKzEsNiBAQAorI2RlZmluZSBJRElfSUNPTiAgMQ0KKw0KKyNkZWZpbmUgSURTX0VYVFJBQ1RJT05fRVJST1JfVElUTEUgICAgICAgNw0KKyNkZWZpbmUgSURTX0VYVFJBQ1RJT05fRVJST1JfTUVTU0FHRSAgICAgOA0KKyNkZWZpbmUgSURTX0NBTk5PVF9DUkVBVEVfRk9MREVSICAgICAgMzAwMw0KKyNkZWZpbmUgSURTX1BST0dSRVNTX0VYVFJBQ1RJTkcgICAgICAgMzMwMA0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9yZXNvdXJjZS5yYyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhTZXR1cC9yZXNvdXJjZS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTE2MDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFNldHVwL3Jlc291cmNlLnJjCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9DLzd6VmVyc2lvbi5yYyINCisjaW5jbHVkZSAicmVzb3VyY2UuaCINCisNCitNWV9WRVJTSU9OX0lORk9fQVBQKCI3eiBTZXR1cCBTRlgiLCAiN3pTLnNmeCIpDQorDQorSURJX0lDT04gIElDT04gInNldHVwLmljbyINCisNCitTVFJJTkdUQUJMRQ0KK0JFR0lODQorICBJRFNfRVhUUkFDVElPTl9FUlJPUl9USVRMRSAgIkV4dHJhY3Rpb24gRmFpbGVkIg0KKyAgSURTX0VYVFJBQ1RJT05fRVJST1JfTUVTU0FHRSAgIkZpbGUgaXMgY29ycnVwdCINCisgIElEU19DQU5OT1RfQ1JFQVRFX0ZPTERFUiAgIkNhbm5vdCBjcmVhdGUgZm9sZGVyICd7MH0nIg0KKyAgSURTX1BST0dSRVNTX0VYVFJBQ1RJTkcgICJFeHRyYWN0aW5nIg0KK0VORA0KKw0KKyNpbmNsdWRlICIuLi8uLi9VSS9GaWxlTWFuYWdlci9Qcm9ncmVzc0RpYWxvZy5yYyINCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYU2V0dXAvc2V0dXAuaWNvIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFNldHVwL3NldHVwLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjQ1NWJlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFNldHVwL3NldHVwLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYV2luLzd6LmljbyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhXaW4vN3ouaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZmZiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYV2luLzd6LmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYV2luL1NGWFdpbi5kc3AgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYV2luL1NGWFdpbi5kc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExNTgyZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhXaW4vU0ZYV2luLmRzcApAQCAtMCwwICsxLDkzNyBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJTRlhXaW4iIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIiAweDAxMDENCisNCitDRkc9U0ZYV2luIC0gV2luMzIgRGVidWcNCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsDQorIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UgL2YgIlNGWFdpbi5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiU0ZYV2luLm1hayIgQ0ZHPSJTRlhXaW4gLSBXaW4zMiBEZWJ1ZyINCishTUVTU0FHRSANCishTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCishTUVTU0FHRSANCishTUVTU0FHRSAiU0ZYV2luIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBBcHBsaWNhdGlvbiIpDQorIU1FU1NBR0UgIlNGWFdpbiAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAiU0ZYV2luIC0gV2luMzIgUmVsZWFzZUQiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQXBwbGljYXRpb24iKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwDQorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIg0KKyMgUFJPUCBTY2NfTG9jYWxQYXRoICIiDQorQ1BQPWNsLmV4ZQ0KK01UTD1taWRsLmV4ZQ0KK1JTQz1yYy5leGUNCisNCishSUYgICIkKENGRykiID09ICJTRlhXaW4gLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL0d6IC9NRCAvVzQgL1dYIC9HWCAvTzEgL0QgIk5ERUJVRyIgL0QgIl9TRlhXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJFWFRSQUNUX09OTFkiIC9EICJOT19SRUdJU1RSWSIgL0QgIk5PX1JFQURfRlJPTV9DT0RFUiIgL0QgIl9TRlgiIC9ZdSJTdGRBZnguaCIgL0ZEIC9jDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDE5IC9kICJOREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDE5IC9kICJOREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvbWFjaGluZTpJMzg2IC9vdXQ6IkM6XFV0aWxcN3ouc2Z4IiAvb3B0Ok5PV0lOOTgNCisjIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0ZYV2luIC0gV2luMzIgRGVidWciDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL0d6IC9NVGQgL1c0IC9XWCAvR20gL0dYIC9aSSAvT2QgL0QgIl9ERUJVRyIgL0QgIl9TRlhXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJFWFRSQUNUX09OTFkiIC9EICJOT19SRUdJU1RSWSIgL0QgIk5PX1JFQURfRlJPTV9DT0RFUiIgL0QgIl9TRlgiIC9ZdSJTdGRBZnguaCIgL0ZEIC9HWiAvYw0KKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBCQVNFIFJTQyAvbCAweDQxOSAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQxOSAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiQzpcVXRpbFw3enNmeC5leGUiIC9wZGJ0eXBlOnNlcHQNCisNCishRUxTRUlGICAiJChDRkcpIiA9PSAiU0ZYV2luIC0gV2luMzIgUmVsZWFzZUQiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiU0ZYV2luX19fV2luMzJfUmVsZWFzZUQiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiU0ZYV2luX19fV2luMzJfUmVsZWFzZUQiDQorIyBQUk9QIEJBU0UgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICJTRlhXaW5fX19XaW4zMl9SZWxlYXNlRCINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiU0ZYV2luX19fV2luMzJfUmVsZWFzZUQiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL0d6IC9NVCAvVzMgL0dYIC9PMSAvSSAiLi5cLi5cLi5cXCIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIkVYVFJBQ1RfT05MWSIgL0QgIkVYQ0xVREVfQ09NIiAvRCAiTk9fUkVHSVNUUlkiIC9EICJfU0ZYIiAvWXUiU3RkQWZ4LmgiIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9HeiAvTUQgL1c0IC9XWCAvR1ggL08xIC9EICJOREVCVUciIC9EICJfU0ZYV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIl9NQkNTIiAvRCAiRVhUUkFDVF9PTkxZIiAvRCAiTk9fUkVHSVNUUlkiIC9EICJOT19SRUFEX0ZST01fQ09ERVIiIC9EICJfU0ZYIiAvWXUiU3RkQWZ4LmgiIC9GRCAvYw0KKyMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBCQVNFIFJTQyAvbCAweDQxOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQxOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYgL291dDoiQzpcVXRpbFw3ei5zZngiIC9vcHQ6Tk9XSU45OA0KKyMgU1VCVFJBQ1QgQkFTRSBMSU5LMzIgL3BkYjpub25lDQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9tYWNoaW5lOkkzODYgL291dDoiQzpcVXRpbFw3ekQuc2Z4IiAvb3B0Ok5PV0lOOTgNCisjIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgIlNGWFdpbiAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJTRlhXaW4gLSBXaW4zMiBEZWJ1ZyINCisjIE5hbWUgIlNGWFdpbiAtIFdpbjMyIFJlbGVhc2VEIg0KKyMgQmVnaW4gR3JvdXAgIlNwZWMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFN0ZEFmeC5jcHANCisjIEFERCBDUFAgL1ljIlN0ZEFmeC5oIg0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXFN0ZEFmeC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIjd6Ig0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekRlY29kZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekRlY29kZS5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pFeHRyYWN0LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6Rm9sZGVyT3V0U3RyZWFtLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXDd6XDd6Rm9sZGVyT3V0U3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekhhbmRsZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pIYW5kbGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekhlYWRlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcN3pcN3pJbi5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3ekluLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVw3elw3elJlZ2lzdGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXFNwbGl0SGFuZGxlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiQXJjaGl2ZSBDb21tb24iDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxDb2Rlck1peGVyMi5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ29kZXJNaXhlcjIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxDb2Rlck1peGVyMk1ULmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxDb2Rlck1peGVyMk1ULmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ3Jvc3NUaHJlYWRQcm9ncmVzcy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cQ3Jvc3NUaHJlYWRQcm9ncmVzcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXEl0ZW1OYW1lVXRpbHMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXEFyY2hpdmVcQ29tbW9uXEl0ZW1OYW1lVXRpbHMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxNdWx0aVN0cmVhbS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQXJjaGl2ZVxDb21tb25cTXVsdGlTdHJlYW0uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxPdXRTdHJlYW1XaXRoQ1JDLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxBcmNoaXZlXENvbW1vblxPdXRTdHJlYW1XaXRoQ1JDLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiQ29tcHJlc3MiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xCY2oyQ29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEJjajJSZWdpc3Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcQmNqQ29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEJjalJlZ2lzdGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xCcmFuY2hDb2Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcQ29weUNvZGVyLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21wcmVzc1xDb3B5UmVnaXN0ZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEx6bWEyRGVjb2Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcTHptYTJSZWdpc3Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcTHptYURlY29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXEx6bWFSZWdpc3Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tcHJlc3NcUHBtZERlY29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbXByZXNzXFBwbWRSZWdpc3Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiQ3J5cHRvIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ3J5cHRvXDd6QWVzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDcnlwdG9cN3pBZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDcnlwdG9cN3pBZXNSZWdpc3Rlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ3J5cHRvXE15QWVzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDcnlwdG9cTXlBZXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJEaWFsb2dzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcRmlsZU1hbmFnZXJcQnJvd3NlRGlhbG9nLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxGaWxlTWFuYWdlclxCcm93c2VEaWFsb2cuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxGaWxlTWFuYWdlclxDb21ib0RpYWxvZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcRmlsZU1hbmFnZXJcQ29tYm9EaWFsb2cuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxGaWxlTWFuYWdlclxNZXNzYWdlc0RpYWxvZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcRmlsZU1hbmFnZXJcTWVzc2FnZXNEaWFsb2cuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxGaWxlTWFuYWdlclxPdmVyd3JpdGVEaWFsb2cuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXEZpbGVNYW5hZ2VyXE92ZXJ3cml0ZURpYWxvZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXEZpbGVNYW5hZ2VyXFBhc3N3b3JkRGlhbG9nLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxGaWxlTWFuYWdlclxQYXNzd29yZERpYWxvZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXEZpbGVNYW5hZ2VyXFByb2dyZXNzRGlhbG9nMi5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcRmlsZU1hbmFnZXJcUHJvZ3Jlc3NEaWFsb2cyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiN3ppcCBDb21tb24iDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cQ3JlYXRlQ29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxDcmVhdGVDb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxDV3JhcHBlcnMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxDV3JhcHBlcnMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cRmlsZVBhdGhBdXRvUmVuYW1lLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cRmlsZVBhdGhBdXRvUmVuYW1lLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEZpbGVTdHJlYW1zLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cRmlsZVN0cmVhbXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cRmlsdGVyQ29kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxGaWx0ZXJDb2Rlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxJbkJ1ZmZlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEluQnVmZmVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXExpbWl0ZWRTdHJlYW1zLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cTGltaXRlZFN0cmVhbXMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cTG9ja2VkU3RyZWFtLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cTG9ja2VkU3RyZWFtLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXE91dEJ1ZmZlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXE91dEJ1ZmZlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxQcm9ncmVzc1V0aWxzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cUHJvZ3Jlc3NVdGlscy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxQcm9wSWQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxTdHJlYW1CaW5kZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxTdHJlYW1CaW5kZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cU3RyZWFtT2JqZWN0cy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXFN0cmVhbU9iamVjdHMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cU3RyZWFtVXRpbHMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxTdHJlYW1VdGlscy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxWaXJ0VGhyZWFkLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxDb21tb25cVmlydFRocmVhZC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIkZpbGUgTWFuYWdlciINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXEZpbGVNYW5hZ2VyXEV4dHJhY3RDYWxsYmFjay5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcRmlsZU1hbmFnZXJcRXh0cmFjdENhbGxiYWNrLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcRmlsZU1hbmFnZXJcRm9ybWF0VXRpbHMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXEZpbGVNYW5hZ2VyXEZvcm1hdFV0aWxzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcRmlsZU1hbmFnZXJcU3lzSWNvblV0aWxzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxGaWxlTWFuYWdlclxTeXNJY29uVXRpbHMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJXaW5kb3dzIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gR3JvdXAgIkNvbnRyb2wiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXENvbnRyb2xcQ29tYm9Cb3guY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcQ29udHJvbFxDb21ib0JveC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcQ29udHJvbFxEaWFsb2cuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcQ29udHJvbFxEaWFsb2cuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXENvbnRyb2xcTGlzdFZpZXcuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcQ29udHJvbFxMaXN0Vmlldy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xDb21tb25EaWFsb2cuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcQ29tbW9uRGlhbG9nLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xETEwuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRExMLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xFcnJvck1zZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xFcnJvck1zZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZURpci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlRGlyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlRmluZC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlRmluZC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZUlPLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXEZpbGVJTy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZU5hbWUuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZU5hbWUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFByb3BWYXJpYW50LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFByb3BWYXJpYW50LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xQcm9wVmFyaWFudENvbnYuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcUHJvcFZhcmlhbnRDb252LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xSZXNvdXJjZVN0cmluZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xSZXNvdXJjZVN0cmluZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcU2hlbGwuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcU2hlbGwuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFN5bmNocm9uaXphdGlvbi5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xTeW5jaHJvbml6YXRpb24uaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFdpbmRvdy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xXaW5kb3cuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJDb21tb24iDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cQ29tbWFuZExpbmVQYXJzZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxDb21tYW5kTGluZVBhcnNlci5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxDUkMuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxDUkMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cSW50VG9TdHJpbmcuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxJbnRUb1N0cmluZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxNeVN0cmluZy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15U3RyaW5nLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15VmVjdG9yLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cTXlWZWN0b3IuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cTmV3SGFuZGxlci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE5ld0hhbmRsZXIuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cU3RyaW5nQ29udmVydC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXFN0cmluZ0NvbnZlcnQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cV2lsZGNhcmQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxXaWxkY2FyZC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KKyMgQmVnaW4gR3JvdXAgIlVJIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gR3JvdXAgIlVJIENvbW1vbiINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxBcmNoaXZlRXh0cmFjdENhbGxiYWNrLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cQXJjaGl2ZUV4dHJhY3RDYWxsYmFjay5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxBcmNoaXZlT3BlbkNhbGxiYWNrLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cQXJjaGl2ZU9wZW5DYWxsYmFjay5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxEZWZhdWx0TmFtZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXERlZmF1bHROYW1lLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEV4dHJhY3QuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxFeHRyYWN0LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEV4dHJhY3RpbmdGaWxlUGF0aC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXEV4dHJhY3RpbmdGaWxlUGF0aC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxMb2FkQ29kZWNzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxDb21tb25cTG9hZENvZGVjcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXENvbW1vblxPcGVuQXJjaGl2ZS5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcQ29tbW9uXE9wZW5BcmNoaXZlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiR1VJIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcR1VJXEV4dHJhY3REaWFsb2cuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXEdVSVxFeHRyYWN0RGlhbG9nLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cVUlcR1VJXEV4dHJhY3RHVUkuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXFVJXEdVSVxFeHRyYWN0R1VJLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiRXhwbG9yZXIiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxFeHBsb3JlclxNeU1lc3NhZ2VzLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlxVSVxFeHBsb3JlclxNeU1lc3NhZ2VzLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICJDIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1w3ekNyYy5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1w3ekNyYy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcN3pDcmNPcHQuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcQWVzLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEFlcy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcQWVzT3B0LmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEFsbG9jLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEFsbG9jLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xCcmEuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEJyYTg2LmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXENwdUFyY2guYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcTHptYTJEZWMuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcTHptYTJEZWMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXEx6bWFEZWMuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcTHptYURlYy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcUHBtZDcuYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXC4uXENcUHBtZDcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXFBwbWQ3RGVjLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXFNoYTI1Ni5jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cLi5cQ1xUaHJlYWRzLmMNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXFRocmVhZHMuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cN3ouaWNvDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cN3oxLmljbw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc291cmNlLnJjDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU2Z4V2luLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhXaW4vU0ZYV2luLmRzdyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhXaW4vU0ZYV2luLmRzdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njk1ODAzCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFdpbi9TRlhXaW4uZHN3CkBAIC0wLDAgKzEsMjkgQEAKK01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSENCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIlNGWFdpbiI9LlxTRlhXaW4uZHNwIC0gUGFja2FnZSBPd25lcj08ND4NCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDQ+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK0dsb2JhbDoNCisNCitQYWNrYWdlPTw1Pg0KK3t7ew0KK319fQ0KKw0KK1BhY2thZ2U9PDM+DQore3t7DQorfX19DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhXaW4vU2Z4V2luLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhXaW4vU2Z4V2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmU5NDBmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFdpbi9TZnhXaW4uY3BwCkBAIC0wLDAgKzEsMjMzIEBACisvLyBNYWluLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSA8U2hsd2FwaS5oPg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlJbml0R3VpZC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vQ29tbWFuZExpbmVQYXJzZXIuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9ETEwuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9FcnJvck1zZy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVEaXIuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlTmFtZS5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL050Q2hlY2suaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9SZXNvdXJjZVN0cmluZy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9JQ29kZXIuaCINCisjaW5jbHVkZSAiLi4vLi4vSVBhc3N3b3JkLmgiDQorI2luY2x1ZGUgIi4uLy4uL0FyY2hpdmUvSUFyY2hpdmUuaCINCisjaW5jbHVkZSAiLi4vLi4vVUkvQ29tbW9uL0V4dHJhY3QuaCINCisjaW5jbHVkZSAiLi4vLi4vVUkvQ29tbW9uL0V4aXRDb2RlLmgiDQorI2luY2x1ZGUgIi4uLy4uL1VJL0V4cGxvcmVyL015TWVzc2FnZXMuaCINCisjaW5jbHVkZSAiLi4vLi4vVUkvRmlsZU1hbmFnZXIvTXlXaW5kb3dzTmV3LmgiDQorI2luY2x1ZGUgIi4uLy4uL1VJL0dVSS9FeHRyYWN0R1VJLmgiDQorI2luY2x1ZGUgIi4uLy4uL1VJL0dVSS9FeHRyYWN0UmVzLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KK3VzaW5nIG5hbWVzcGFjZSBORmlsZTsNCit1c2luZyBuYW1lc3BhY2UgTkRpcjsNCisNCitISU5TVEFOQ0UgZ19oSW5zdGFuY2U7DQorDQorI2lmbmRlZiBVTkRFUl9DRQ0KKw0KK0RXT1JEIGdfQ29tQ3RsMzJWZXJzaW9uOw0KKw0KK3N0YXRpYyBEV09SRCBHZXREbGxWZXJzaW9uKExQQ1RTVFIgZGxsTmFtZSkNCit7DQorICBEV09SRCBkd1ZlcnNpb24gPSAwOw0KKyAgSElOU1RBTkNFIGhpbnN0RGxsID0gTG9hZExpYnJhcnkoZGxsTmFtZSk7DQorICBpZiAoaGluc3REbGwpDQorICB7DQorICAgIERMTEdFVFZFUlNJT05QUk9DIHBEbGxHZXRWZXJzaW9uID0gKERMTEdFVFZFUlNJT05QUk9DKUdldFByb2NBZGRyZXNzKGhpbnN0RGxsLCAiRGxsR2V0VmVyc2lvbiIpOw0KKyAgICBpZiAocERsbEdldFZlcnNpb24pDQorICAgIHsNCisgICAgICBETExWRVJTSU9OSU5GTyBkdmk7DQorICAgICAgWmVyb01lbW9yeSgmZHZpLCBzaXplb2YoZHZpKSk7DQorICAgICAgZHZpLmNiU2l6ZSA9IHNpemVvZihkdmkpOw0KKyAgICAgIEhSRVNVTFQgaHIgPSAoKnBEbGxHZXRWZXJzaW9uKSgmZHZpKTsNCisgICAgICBpZiAoU1VDQ0VFREVEKGhyKSkNCisgICAgICAgIGR3VmVyc2lvbiA9IE1BS0VMT05HKGR2aS5kd01pbm9yVmVyc2lvbiwgZHZpLmR3TWFqb3JWZXJzaW9uKTsNCisgICAgfQ0KKyAgICBGcmVlTGlicmFyeShoaW5zdERsbCk7DQorICB9DQorICByZXR1cm4gZHdWZXJzaW9uOw0KK30NCisNCisjZW5kaWYNCisNCitib29sIGdfTFZOX0lURU1BQ1RJVkFURV9TdXBwb3J0ID0gdHJ1ZTsNCisNCitzdGF0aWMgY29uc3Qgd2NoYXJfdCAqa1Vua25vd25FeGNlcHRpb25NZXNzYWdlID0gTCJFUlJPUjogVW5rbm93biBFcnJvciEiOw0KKw0KK3ZvaWQgRXJyb3JNZXNzYWdlRm9ySFJFU1VMVChIUkVTVUxUIHJlcykNCit7DQorICBTaG93RXJyb3JNZXNzYWdlKEhSZXN1bHRUb01lc3NhZ2UocmVzKSk7DQorfQ0KKw0KK2ludCBBUElFTlRSWSBXaW5NYWluMigpDQorew0KKyAgLy8gT2xlSW5pdGlhbGl6ZSBpcyByZXF1aXJlZCBmb3IgUHJvZ3Jlc3NCYXIgaW4gVGFza0Jhci4NCisgICNpZm5kZWYgVU5ERVJfQ0UNCisgIE9sZUluaXRpYWxpemUoTlVMTCk7DQorICAjZW5kaWYNCisNCisgICNpZm5kZWYgVU5ERVJfQ0UNCisgIGdfQ29tQ3RsMzJWZXJzaW9uID0gOjpHZXREbGxWZXJzaW9uKFRFWFQoImNvbWN0bDMyLmRsbCIpKTsNCisgIGdfTFZOX0lURU1BQ1RJVkFURV9TdXBwb3J0ID0gKGdfQ29tQ3RsMzJWZXJzaW9uID49IE1BS0VMT05HKDcxLCA0KSk7DQorICAjZW5kaWYNCisgIA0KKyAgVVN0cmluZyBwYXNzd29yZDsNCisgIGJvb2wgYXNzdW1lWWVzID0gZmFsc2U7DQorICBib29sIG91dHB1dEZvbGRlckRlZmluZWQgPSBmYWxzZTsNCisgIEZTdHJpbmcgb3V0cHV0Rm9sZGVyOw0KKyAgVVN0cmluZ1ZlY3RvciBjb21tYW5kU3RyaW5nczsNCisgIE5Db21tYW5kTGluZVBhcnNlcjo6U3BsaXRDb21tYW5kTGluZShHZXRDb21tYW5kTGluZVcoKSwgY29tbWFuZFN0cmluZ3MpOw0KKw0KKyAgI2lmbmRlZiBVTkRFUl9DRQ0KKyAgaWYgKGNvbW1hbmRTdHJpbmdzLlNpemUoKSA+IDApDQorICAgIGNvbW1hbmRTdHJpbmdzLkRlbGV0ZSgwKTsNCisgICNlbmRpZg0KKw0KKyAgRk9SX1ZFQ1RPUiAoaSwgY29tbWFuZFN0cmluZ3MpDQorICB7DQorICAgIGNvbnN0IFVTdHJpbmcgJnMgPSBjb21tYW5kU3RyaW5nc1tpXTsNCisgICAgaWYgKHMuTGVuKCkgPiAxICYmIHNbMF0gPT0gJy0nKQ0KKyAgICB7DQorICAgICAgd2NoYXJfdCBjID0gTXlDaGFyTG93ZXJfQXNjaWkoc1sxXSk7DQorICAgICAgaWYgKGMgPT0gJ3knKQ0KKyAgICAgIHsNCisgICAgICAgIGFzc3VtZVllcyA9IHRydWU7DQorICAgICAgICBpZiAocy5MZW4oKSAhPSAyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBTaG93RXJyb3JNZXNzYWdlKEwiQmFkIGNvbW1hbmQiKTsNCisgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKGMgPT0gJ28nKQ0KKyAgICAgIHsNCisgICAgICAgIG91dHB1dEZvbGRlciA9IHVzMmZzKHMuUHRyKDIpKTsNCisgICAgICAgIE5OYW1lOjpOb3JtYWxpemVEaXJQYXRoUHJlZml4KG91dHB1dEZvbGRlcik7DQorICAgICAgICBvdXRwdXRGb2xkZXJEZWZpbmVkID0gIW91dHB1dEZvbGRlci5Jc0VtcHR5KCk7DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKGMgPT0gJ3AnKQ0KKyAgICAgIHsNCisgICAgICAgIHBhc3N3b3JkID0gcy5QdHIoMik7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBGU3RyaW5nIHBhdGg7DQorICBORExMOjpNeUdldE1vZHVsZUZpbGVOYW1lKHBhdGgpOw0KKw0KKyAgRlN0cmluZyBmdWxsUGF0aDsNCisgIGlmICghTXlHZXRGdWxsUGF0aE5hbWUocGF0aCwgZnVsbFBhdGgpKQ0KKyAgew0KKyAgICBTaG93RXJyb3JNZXNzYWdlKEwiRXJyb3IgMTMyOTQ4NCIpOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCisNCisgIENDb2RlY3MgKmNvZGVjcyA9IG5ldyBDQ29kZWNzOw0KKyAgQ015Q29tUHRyPElVbmtub3duPiBjb21wcmVzc0NvZGVjc0luZm8gPSBjb2RlY3M7DQorICBIUkVTVUxUIHJlc3VsdCA9IGNvZGVjcy0+TG9hZCgpOw0KKyAgaWYgKHJlc3VsdCAhPSBTX09LKQ0KKyAgew0KKyAgICBFcnJvck1lc3NhZ2VGb3JIUkVTVUxUKHJlc3VsdCk7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKw0KKyAgLy8gQ09wZW5DYWxsYmFja0dVSSBvcGVuQ2FsbGJhY2s7DQorDQorICAvLyBvcGVuQ2FsbGJhY2suUGFzc3dvcmRJc0RlZmluZWQgPSAhcGFzc3dvcmQuSXNFbXB0eSgpOw0KKyAgLy8gb3BlbkNhbGxiYWNrLlBhc3N3b3JkID0gcGFzc3dvcmQ7DQorDQorICBDRXh0cmFjdENhbGxiYWNrSW1wICplY3MgPSBuZXcgQ0V4dHJhY3RDYWxsYmFja0ltcDsNCisgIENNeUNvbVB0cjxJRm9sZGVyQXJjaGl2ZUV4dHJhY3RDYWxsYmFjaz4gZXh0cmFjdENhbGxiYWNrID0gZWNzOw0KKyAgZWNzLT5Jbml0KCk7DQorDQorICAjaWZuZGVmIF9OT19DUllQVE8NCisgIGVjcy0+UGFzc3dvcmRJc0RlZmluZWQgPSAhcGFzc3dvcmQuSXNFbXB0eSgpOw0KKyAgZWNzLT5QYXNzd29yZCA9IHBhc3N3b3JkOw0KKyAgI2VuZGlmDQorDQorICBDRXh0cmFjdE9wdGlvbnMgZW87DQorDQorICBGU3RyaW5nIGRpclByZWZpeDsNCisgIGlmICghR2V0T25seURpclByZWZpeChwYXRoLCBkaXJQcmVmaXgpKQ0KKyAgew0KKyAgICBTaG93RXJyb3JNZXNzYWdlKEwiRXJyb3IgMTMyOTQ4NSIpOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCisNCisgIGVvLk91dHB1dERpciA9IG91dHB1dEZvbGRlckRlZmluZWQgPyBvdXRwdXRGb2xkZXIgOiBkaXJQcmVmaXg7DQorICBlby5ZZXNUb0FsbCA9IGFzc3VtZVllczsNCisgIGVvLk92ZXJ3cml0ZU1vZGUgPSBhc3N1bWVZZXMgPw0KKyAgICAgIE5FeHRyYWN0OjpOT3ZlcndyaXRlTW9kZTo6a092ZXJ3cml0ZSA6DQorICAgICAgTkV4dHJhY3Q6Ok5PdmVyd3JpdGVNb2RlOjprQXNrOw0KKyAgZW8uUGF0aE1vZGUgPSBORXh0cmFjdDo6TlBhdGhNb2RlOjprRnVsbFBhdGhzOw0KKyAgZW8uVGVzdE1vZGUgPSBmYWxzZTsNCisgIA0KKyAgVVN0cmluZ1ZlY3RvciB2MSwgdjI7DQorICB2MS5BZGQoZnMydXMoZnVsbFBhdGgpKTsNCisgIHYyLkFkZChmczJ1cyhmdWxsUGF0aCkpOw0KKyAgTldpbGRjYXJkOjpDQ2Vuc29yTm9kZSB3aWxkY2FyZENlbnNvcjsNCisgIHdpbGRjYXJkQ2Vuc29yLkFkZEl0ZW0odHJ1ZSwgTCIqIiwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7DQorDQorICBib29sIG1lc3NhZ2VXYXNEaXNwbGF5ZWQgPSBmYWxzZTsNCisgIHJlc3VsdCA9IEV4dHJhY3RHVUkoY29kZWNzLA0KKyAgICAgIENPYmplY3RWZWN0b3I8Q09wZW5UeXBlPigpLCBDSW50VmVjdG9yKCksDQorICAgICAgdjEsIHYyLA0KKyAgICAgIHdpbGRjYXJkQ2Vuc29yLCBlbywgKGFzc3VtZVllcyA/IGZhbHNlOiB0cnVlKSwgbWVzc2FnZVdhc0Rpc3BsYXllZCwgZWNzKTsNCisNCisgIGlmIChyZXN1bHQgPT0gU19PSykNCisgIHsNCisgICAgaWYgKCFlY3MtPklzT0soKSkNCisgICAgICByZXR1cm4gTkV4aXRDb2RlOjprRmF0YWxFcnJvcjsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAocmVzdWx0ID09IEVfQUJPUlQpDQorICAgIHJldHVybiBORXhpdENvZGU6OmtVc2VyQnJlYWs7DQorICBpZiAoIW1lc3NhZ2VXYXNEaXNwbGF5ZWQpDQorICB7DQorICAgIGlmIChyZXN1bHQgPT0gU19GQUxTRSkNCisgICAgICBTaG93RXJyb3JNZXNzYWdlKEwiRXJyb3IgaW4gYXJjaGl2ZSIpOw0KKyAgICBlbHNlDQorICAgICAgRXJyb3JNZXNzYWdlRm9ySFJFU1VMVChyZXN1bHQpOw0KKyAgfQ0KKyAgaWYgKHJlc3VsdCA9PSBFX09VVE9GTUVNT1JZKQ0KKyAgICByZXR1cm4gTkV4aXRDb2RlOjprTWVtb3J5RXJyb3I7DQorICByZXR1cm4gTkV4aXRDb2RlOjprRmF0YWxFcnJvcjsNCit9DQorDQorI2RlZmluZSBOVF9DSEVDS19GQUlMX0FDVElPTiBTaG93RXJyb3JNZXNzYWdlKEwiVW5zdXBwb3J0ZWQgV2luZG93cyB2ZXJzaW9uIik7IHJldHVybiBORXhpdENvZGU6OmtGYXRhbEVycm9yOw0KKw0KK2ludCBBUElFTlRSWSBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdGFuY2UsIEhJTlNUQU5DRSAvKiBoUHJldkluc3RhbmNlICovLA0KKyAgI2lmZGVmIFVOREVSX0NFDQorICBMUFdTVFINCisgICNlbHNlDQorICBMUFNUUg0KKyAgI2VuZGlmDQorICAvKiBscENtZExpbmUgKi8sIGludCAvKiBuQ21kU2hvdyAqLykNCit7DQorICBnX2hJbnN0YW5jZSA9IChISU5TVEFOQ0UpaEluc3RhbmNlOw0KKw0KKyAgTlRfQ0hFQ0sNCisNCisgIHRyeQ0KKyAgew0KKyAgICByZXR1cm4gV2luTWFpbjIoKTsNCisgIH0NCisgIGNhdGNoKGNvbnN0IENOZXdFeGNlcHRpb24gJikNCisgIHsNCisgICAgRXJyb3JNZXNzYWdlRm9ySFJFU1VMVChFX09VVE9GTUVNT1JZKTsNCisgICAgcmV0dXJuIE5FeGl0Q29kZTo6a01lbW9yeUVycm9yOw0KKyAgfQ0KKyAgY2F0Y2goLi4uKQ0KKyAgew0KKyAgICBTaG93RXJyb3JNZXNzYWdlKGtVbmtub3duRXhjZXB0aW9uTWVzc2FnZSk7DQorICAgIHJldHVybiBORXhpdENvZGU6OmtGYXRhbEVycm9yOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYV2luL1N0ZEFmeC5jcHAgYi9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYV2luL1N0ZEFmeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkM2IxZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhXaW4vU3RkQWZ4LmNwcApAQCAtMCwwICsxLDMgQEAKKy8vIFN0ZEFmeC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFdpbi9TdGRBZnguaCBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhXaW4vU3RkQWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2M2VjYgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhXaW4vU3RkQWZ4LmgKQEAgLTAsMCArMSwxNCBAQAorLy8gU3RkQWZ4LmgNCisNCisjaWZuZGVmIF9fU1REQUZYX0gNCisjZGVmaW5lIF9fU1REQUZYX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0NvbW1vbi5oIg0KKw0KKyNpbmNsdWRlIDxjb21tY3RybC5oPg0KKyNpbmNsdWRlIDxTaGxPYmouaD4NCisNCisvLyAjZGVmaW5lIHByaW50Zih4KSBOT19QUklOVEZfKHgpDQorLy8gI2RlZmluZSBzcHJpbnRmKHgpIE5PX1NQUklOVEZfKHgpDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFdpbi9tYWtlZmlsZSBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhXaW4vbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4MDZjOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhXaW4vbWFrZWZpbGUKQEAgLTAsMCArMSwxNDMgQEAKK1BST0cgPSA3ei5zZngNCitDRkxBR1MgPSAkKENGTEFHUykgXA0KKyAgLUROT19SRUdJU1RSWSBcDQorICAtREVYVFJBQ1RfT05MWSBcDQorICAtRE5PX1JFQURfRlJPTV9DT0RFUiBcDQorICAtRF9TRlggXA0KKw0KKyFJRkRFRiBVTkRFUl9DRQ0KK0xJQlMgPSAkKExJQlMpIGNlc2hlbGwubGliIENvbW1jdHJsLmxpYg0KKyFFTFNFDQorTElCUyA9ICQoTElCUykgY29tY3RsMzIubGliIGNvbWRsZzMyLmxpYg0KKyFFTkRJRg0KKw0KK0NVUlJFTlRfT0JKUyA9IFwNCisgICRPXFNmeFdpbi5vYmogXA0KKw0KK0dVSV9PQkpTID0gXA0KKyAgJE9cRXh0cmFjdERpYWxvZy5vYmogXA0KKyAgJE9cRXh0cmFjdEdVSS5vYmogXA0KKw0KK0NPTU1PTl9PQkpTID0gXA0KKyAgJE9cQ1JDLm9iaiBcDQorICAkT1xDb21tYW5kTGluZVBhcnNlci5vYmogXA0KKyAgJE9cSW50VG9TdHJpbmcub2JqIFwNCisgICRPXE5ld0hhbmRsZXIub2JqIFwNCisgICRPXE15U3RyaW5nLm9iaiBcDQorICAkT1xTdHJpbmdDb252ZXJ0Lm9iaiBcDQorICAkT1xNeVZlY3Rvci5vYmogXA0KKyAgJE9cV2lsZGNhcmQub2JqIFwNCisNCitXSU5fT0JKUyA9IFwNCisgICRPXENvbW1vbkRpYWxvZy5vYmogXA0KKyAgJE9cRExMLm9iaiBcDQorICAkT1xFcnJvck1zZy5vYmogXA0KKyAgJE9cRmlsZURpci5vYmogXA0KKyAgJE9cRmlsZUZpbmQub2JqIFwNCisgICRPXEZpbGVJTy5vYmogXA0KKyAgJE9cRmlsZU5hbWUub2JqIFwNCisgICRPXFByb3BWYXJpYW50Lm9iaiBcDQorICAkT1xQcm9wVmFyaWFudENvbnYub2JqIFwNCisgICRPXFJlc291cmNlU3RyaW5nLm9iaiBcDQorICAkT1xTaGVsbC5vYmogXA0KKyAgJE9cU3luY2hyb25pemF0aW9uLm9iaiBcDQorICAkT1xXaW5kb3cub2JqIFwNCisNCitXSU5fQ1RSTF9PQkpTID0gXA0KKyAgJE9cQ29tYm9Cb3gub2JqIFwNCisgICRPXERpYWxvZy5vYmogXA0KKyAgJE9cTGlzdFZpZXcub2JqIFwNCisNCis3WklQX0NPTU1PTl9PQkpTID0gXA0KKyAgJE9cQ3JlYXRlQ29kZXIub2JqIFwNCisgICRPXENXcmFwcGVycy5vYmogXA0KKyAgJE9cRmlsZVBhdGhBdXRvUmVuYW1lLm9iaiBcDQorICAkT1xGaWxlU3RyZWFtcy5vYmogXA0KKyAgJE9cSW5CdWZmZXIub2JqIFwNCisgICRPXEZpbHRlckNvZGVyLm9iaiBcDQorICAkT1xMaW1pdGVkU3RyZWFtcy5vYmogXA0KKyAgJE9cTG9ja2VkU3RyZWFtLm9iaiBcDQorICAkT1xPdXRCdWZmZXIub2JqIFwNCisgICRPXFByb2dyZXNzVXRpbHMub2JqIFwNCisgICRPXFByb3BJZC5vYmogXA0KKyAgJE9cU3RyZWFtQmluZGVyLm9iaiBcDQorICAkT1xTdHJlYW1PYmplY3RzLm9iaiBcDQorICAkT1xTdHJlYW1VdGlscy5vYmogXA0KKyAgJE9cVmlydFRocmVhZC5vYmogXA0KKw0KK1VJX0NPTU1PTl9PQkpTID0gXA0KKyAgJE9cQXJjaGl2ZUV4dHJhY3RDYWxsYmFjay5vYmogXA0KKyAgJE9cQXJjaGl2ZU9wZW5DYWxsYmFjay5vYmogXA0KKyAgJE9cRGVmYXVsdE5hbWUub2JqIFwNCisgICRPXEV4dHJhY3Qub2JqIFwNCisgICRPXEV4dHJhY3RpbmdGaWxlUGF0aC5vYmogXA0KKyAgJE9cTG9hZENvZGVjcy5vYmogXA0KKyAgJE9cT3BlbkFyY2hpdmUub2JqIFwNCisNCitFWFBMT1JFUl9PQkpTID0gXA0KKyAgJE9cTXlNZXNzYWdlcy5vYmogXA0KKw0KK0ZNX09CSlMgPSBcDQorICAkT1xCcm93c2VEaWFsb2cub2JqIFwNCisgICRPXENvbWJvRGlhbG9nLm9iaiBcDQorICAkT1xFeHRyYWN0Q2FsbGJhY2sub2JqIFwNCisgICRPXEZvcm1hdFV0aWxzLm9iaiBcDQorICAkT1xPdmVyd3JpdGVEaWFsb2cub2JqIFwNCisgICRPXFBhc3N3b3JkRGlhbG9nLm9iaiBcDQorICAkT1xQcm9ncmVzc0RpYWxvZzIub2JqIFwNCisgICRPXFN5c0ljb25VdGlscy5vYmogXA0KKw0KK0FSX09CSlMgPSBcDQorICAkT1xTcGxpdEhhbmRsZXIub2JqIFwNCisNCitBUl9DT01NT05fT0JKUyA9IFwNCisgICRPXENvZGVyTWl4ZXIyLm9iaiBcDQorICAkT1xDb2Rlck1peGVyMk1ULm9iaiBcDQorICAkT1xDcm9zc1RocmVhZFByb2dyZXNzLm9iaiBcDQorICAkT1xJdGVtTmFtZVV0aWxzLm9iaiBcDQorICAkT1xNdWx0aVN0cmVhbS5vYmogXA0KKyAgJE9cT3V0U3RyZWFtV2l0aENSQy5vYmogXA0KKw0KKzdaX09CSlMgPSBcDQorICAkT1w3ekRlY29kZS5vYmogXA0KKyAgJE9cN3pFeHRyYWN0Lm9iaiBcDQorICAkT1w3ekZvbGRlck91dFN0cmVhbS5vYmogXA0KKyAgJE9cN3pIYW5kbGVyLm9iaiBcDQorICAkT1w3ekluLm9iaiBcDQorICAkT1w3elJlZ2lzdGVyLm9iaiBcDQorDQorQ09NUFJFU1NfT0JKUyA9IFwNCisgICRPXEJyYW5jaENvZGVyLm9iaiBcDQorICAkT1xCY2oyQ29kZXIub2JqIFwNCisgICRPXEJjajJSZWdpc3Rlci5vYmogXA0KKyAgJE9cQmNqQ29kZXIub2JqIFwNCisgICRPXEJjalJlZ2lzdGVyLm9iaiBcDQorICAkT1xDb3B5Q29kZXIub2JqIFwNCisgICRPXENvcHlSZWdpc3Rlci5vYmogXA0KKyAgJE9cTHptYTJEZWNvZGVyLm9iaiBcDQorICAkT1xMem1hMlJlZ2lzdGVyLm9iaiBcDQorICAkT1xMem1hRGVjb2Rlci5vYmogXA0KKyAgJE9cTHptYVJlZ2lzdGVyLm9iaiBcDQorICAkT1xQcG1kRGVjb2Rlci5vYmogXA0KKyAgJE9cUHBtZFJlZ2lzdGVyLm9iaiBcDQorDQorQ1JZUFRPX09CSlMgPSBcDQorICAkT1w3ekFlcy5vYmogXA0KKyAgJE9cN3pBZXNSZWdpc3Rlci5vYmogXA0KKyAgJE9cTXlBZXMub2JqIFwNCisgIA0KK0NfT0JKUyA9IFwNCisgICRPXEFsbG9jLm9iaiBcDQorICAkT1xCcmE4Ni5vYmogXA0KKyAgJE9cQ3B1QXJjaC5vYmogXA0KKyAgJE9cTHptYTJEZWMub2JqIFwNCisgICRPXEx6bWFEZWMub2JqIFwNCisgICRPXFBwbWQ3Lm9iaiBcDQorICAkT1xQcG1kN0RlYy5vYmogXA0KKyAgJE9cU2hhMjU2Lm9iaiBcDQorICAkT1xUaHJlYWRzLm9iaiBcDQorDQorIWluY2x1ZGUgIi4uLy4uL0Flcy5tYWsiDQorIWluY2x1ZGUgIi4uLy4uL0NyYy5tYWsiDQorDQorIWluY2x1ZGUgIi4uLy4uLzd6aXAubWFrIg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhXaW4vcmVzb3VyY2UuaCBiL2x6bWEvQ1BQLzd6aXAvQnVuZGxlcy9TRlhXaW4vcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWZhZTFiCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFdpbi9yZXNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKyNkZWZpbmUgSURJX0lDT04gIDENCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0J1bmRsZXMvU0ZYV2luL3Jlc291cmNlLnJjIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFdpbi9yZXNvdXJjZS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTI0ZmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9CdW5kbGVzL1NGWFdpbi9yZXNvdXJjZS5yYwpAQCAtMCwwICsxLDUwIEBACisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vQy83elZlcnNpb24ucmMiDQorI2luY2x1ZGUgIi4uLy4uL0d1aUNvbW1vbi5yYyINCisjaW5jbHVkZSAiLi4vLi4vVUkvR1VJL0V4dHJhY3REaWFsb2dSZXMuaCINCisjaW5jbHVkZSAiLi4vLi4vVUkvRmlsZU1hbmFnZXIvUHJvcGVydHlOYW1lUmVzLmgiDQorDQorI2luY2x1ZGUgInJlc291cmNlLmgiDQorDQorTVlfVkVSU0lPTl9JTkZPX0FQUCgiN3ogU0ZYIiwgIjd6LnNmeCIpDQorDQorI2RlZmluZSB4YyAyNDANCisjZGVmaW5lIHljIDY0DQorDQorSURJX0lDT04gSUNPTiAiN3ouaWNvIg0KKw0KK0lERF9FWFRSQUNUICBESUFMT0cgIDAsIDAsIHhzLCB5cyAgTVlfTU9EQUxfRElBTE9HX1NUWUxFICBNWV9GT05UDQorQ0FQVElPTiAiNy1aaXAgc2VsZi1leHRyYWN0aW5nIGFyY2hpdmUiDQorQkVHSU4NCisgIExURVhUICAgICAgICAgICJFJnh0cmFjdCB0bzoiLCBJRFRfRVhUUkFDVF9FWFRSQUNUX1RPLCBtLCBtLCB4YywgOA0KKyAgRURJVFRFWFQgICAgICAgSURDX0VYVFJBQ1RfUEFUSCwgbSwgMjEsIHhjIC0gYnhzRG90cyAtIDEyLCAxNCwgRVNfQVVUT0hTQ1JPTEwNCisgIFBVU0hCVVRUT04gICAgICIuLi4iLCBJREJfRVhUUkFDVF9TRVRfUEFUSCwgeHMgLSBtIC0gYnhzRG90cywgMjAsIGJ4c0RvdHMsIGJ5cywgV1NfR1JPVVANCisgIERFRlBVU0hCVVRUT04gICJFeHRyYWN0IiwgSURPSywgICAgIGJ4MiwgYnksIGJ4cywgYnlzLCBXU19HUk9VUA0KKyAgUFVTSEJVVFRPTiAgICAgIkNhbmNlbCIsICBJRENBTkNFTCwgYngxLCBieSwgYnhzLCBieXMNCitFTkQNCisNCisjaWZkZWYgVU5ERVJfQ0UNCisNCisjdW5kZWYgeGMNCisjZGVmaW5lIHhjIDE0NA0KKw0KK0lERF9FWFRSQUNUXzIgIERJQUxPRyAgMCwgMCwgeHMsIHlzICBNWV9NT0RBTF9ESUFMT0dfU1RZTEUgIE1ZX0ZPTlQNCitDQVBUSU9OICI3LVppcCBzZWxmLWV4dHJhY3RpbmcgYXJjaGl2ZSINCitCRUdJTg0KKyAgTFRFWFQgICAgICAgICAgIkUmeHRyYWN0IHRvOiIsIElEVF9FWFRSQUNUX0VYVFJBQ1RfVE8sIG0sIG0sIHhjIC0gYnhzRG90cyAtIDEyLCA4DQorICBFRElUVEVYVCAgICAgICBJRENfRVhUUkFDVF9QQVRILCBtLCBtICsgYnlzICsgNCwgeGMsIDE0LCBFU19BVVRPSFNDUk9MTA0KKyAgUFVTSEJVVFRPTiAgICAgIi4uLiIsIElEQl9FWFRSQUNUX1NFVF9QQVRILCB4cyAtIG0gLSBieHNEb3RzLCBtLCBieHNEb3RzLCBieXMsIFdTX0dST1VQDQorICBERUZQVVNIQlVUVE9OICAiRXh0cmFjdCIsIElET0ssICAgICBieDIsIGJ5LCBieHMsIGJ5cywgV1NfR1JPVVANCisgIFBVU0hCVVRUT04gICAgICJDYW5jZWwiLCAgSURDQU5DRUwsIGJ4MSwgYnksIGJ4cywgYnlzDQorRU5EDQorDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIi4uLy4uL1VJL0ZpbGVNYW5hZ2VyL092ZXJ3cml0ZURpYWxvZy5yYyINCisjaW5jbHVkZSAiLi4vLi4vVUkvRmlsZU1hbmFnZXIvUGFzc3dvcmREaWFsb2cucmMiDQorI2luY2x1ZGUgIi4uLy4uL1VJL0ZpbGVNYW5hZ2VyL1Byb2dyZXNzRGlhbG9nMi5yYyINCisjaW5jbHVkZSAiLi4vLi4vVUkvR1VJL0V4dHJhY3QucmMiDQorDQorU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUNCitCRUdJTg0KKyAgSURTX1BST1BfTVRJTUUgICAgICAgICJNb2RpZmllZCINCitFTkQNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9DV3JhcHBlcnMuY3BwIGIvbHptYS9DUFAvN3ppcC9Db21tb24vQ1dyYXBwZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDQyNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21tb24vQ1dyYXBwZXJzLmNwcApAQCAtMCwwICsxLDIzMCBAQAorLy8gQ1dyYXBwZXJzLmgNCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0MvQWxsb2MuaCINCisNCisjaW5jbHVkZSAiQ1dyYXBwZXJzLmgiDQorDQorI2luY2x1ZGUgIlN0cmVhbVV0aWxzLmgiDQorDQorI2RlZmluZSBQUk9HUkVTU19VTktOT1dOX1ZBTFVFICgoVUludDY0KShJbnQ2NCktMSkNCisNCisjZGVmaW5lIENPTlZFUlRfUFJfVkFMKHgpICh4ID09IFBST0dSRVNTX1VOS05PV05fVkFMVUUgPyBOVUxMIDogJngpDQorDQorc3RhdGljIFNSZXMgQ29tcHJlc3NQcm9ncmVzcyh2b2lkICpwcCwgVUludDY0IGluU2l6ZSwgVUludDY0IG91dFNpemUpIHRocm93KCkNCit7DQorICBDQ29tcHJlc3NQcm9ncmVzc1dyYXAgKnAgPSAoQ0NvbXByZXNzUHJvZ3Jlc3NXcmFwICopcHA7DQorICBwLT5SZXMgPSBwLT5Qcm9ncmVzcy0+U2V0UmF0aW9JbmZvKENPTlZFUlRfUFJfVkFMKGluU2l6ZSksIENPTlZFUlRfUFJfVkFMKG91dFNpemUpKTsNCisgIHJldHVybiAoU1JlcylwLT5SZXM7DQorfQ0KKw0KK0NDb21wcmVzc1Byb2dyZXNzV3JhcDo6Q0NvbXByZXNzUHJvZ3Jlc3NXcmFwKElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpIHRocm93KCkNCit7DQorICBwLlByb2dyZXNzID0gQ29tcHJlc3NQcm9ncmVzczsNCisgIFByb2dyZXNzID0gcHJvZ3Jlc3M7DQorICBSZXMgPSBTWl9PSzsNCit9DQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrU3RyZWFtU3RlcFNpemUgPSAoVUludDMyKTEgPDwgMzE7DQorDQorU1JlcyBIUkVTVUxUX1RvX1NSZXMoSFJFU1VMVCByZXMsIFNSZXMgZGVmYXVsdFJlcykNCit7DQorICBzd2l0Y2ggKHJlcykNCisgIHsNCisgICAgY2FzZSBTX09LOiByZXR1cm4gU1pfT0s7DQorICAgIGNhc2UgRV9PVVRPRk1FTU9SWTogcmV0dXJuIFNaX0VSUk9SX01FTTsNCisgICAgY2FzZSBFX0lOVkFMSURBUkc6IHJldHVybiBTWl9FUlJPUl9QQVJBTTsNCisgICAgY2FzZSBFX0FCT1JUOiByZXR1cm4gU1pfRVJST1JfUFJPR1JFU1M7DQorICAgIGNhc2UgU19GQUxTRTogcmV0dXJuIFNaX0VSUk9SX0RBVEE7DQorICAgIGNhc2UgRV9OT1RJTVBMOiByZXR1cm4gU1pfRVJST1JfVU5TVVBQT1JURUQ7DQorICB9DQorICByZXR1cm4gZGVmYXVsdFJlczsNCit9DQorDQorc3RhdGljIFNSZXMgTXlSZWFkKHZvaWQgKm9iamVjdCwgdm9pZCAqZGF0YSwgc2l6ZV90ICpzaXplKSB0aHJvdygpDQorew0KKyAgQ1NlcUluU3RyZWFtV3JhcCAqcCA9IChDU2VxSW5TdHJlYW1XcmFwICopb2JqZWN0Ow0KKyAgVUludDMyIGN1clNpemUgPSAoKCpzaXplIDwga1N0cmVhbVN0ZXBTaXplKSA/IChVSW50MzIpKnNpemUgOiBrU3RyZWFtU3RlcFNpemUpOw0KKyAgcC0+UmVzID0gKHAtPlN0cmVhbS0+UmVhZChkYXRhLCBjdXJTaXplLCAmY3VyU2l6ZSkpOw0KKyAgKnNpemUgPSBjdXJTaXplOw0KKyAgcC0+UHJvY2Vzc2VkICs9IGN1clNpemU7DQorICBpZiAocC0+UmVzID09IFNfT0spDQorICAgIHJldHVybiBTWl9PSzsNCisgIHJldHVybiBIUkVTVUxUX1RvX1NSZXMocC0+UmVzLCBTWl9FUlJPUl9SRUFEKTsNCit9DQorDQorc3RhdGljIHNpemVfdCBNeVdyaXRlKHZvaWQgKm9iamVjdCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHRocm93KCkNCit7DQorICBDU2VxT3V0U3RyZWFtV3JhcCAqcCA9IChDU2VxT3V0U3RyZWFtV3JhcCAqKW9iamVjdDsNCisgIGlmIChwLT5TdHJlYW0pDQorICB7DQorICAgIHAtPlJlcyA9IFdyaXRlU3RyZWFtKHAtPlN0cmVhbSwgZGF0YSwgc2l6ZSk7DQorICAgIGlmIChwLT5SZXMgIT0gMCkNCisgICAgICByZXR1cm4gMDsNCisgIH0NCisgIGVsc2UNCisgICAgcC0+UmVzID0gU19PSzsNCisgIHAtPlByb2Nlc3NlZCArPSBzaXplOw0KKyAgcmV0dXJuIHNpemU7DQorfQ0KKw0KK0NTZXFJblN0cmVhbVdyYXA6OkNTZXFJblN0cmVhbVdyYXAoSVNlcXVlbnRpYWxJblN0cmVhbSAqc3RyZWFtKSB0aHJvdygpDQorew0KKyAgcC5SZWFkID0gTXlSZWFkOw0KKyAgU3RyZWFtID0gc3RyZWFtOw0KKyAgUHJvY2Vzc2VkID0gMDsNCit9DQorDQorQ1NlcU91dFN0cmVhbVdyYXA6OkNTZXFPdXRTdHJlYW1XcmFwKElTZXF1ZW50aWFsT3V0U3RyZWFtICpzdHJlYW0pIHRocm93KCkNCit7DQorICBwLldyaXRlID0gTXlXcml0ZTsNCisgIFN0cmVhbSA9IHN0cmVhbTsNCisgIFJlcyA9IFNaX09LOw0KKyAgUHJvY2Vzc2VkID0gMDsNCit9DQorDQorSFJFU1VMVCBTUmVzVG9IUkVTVUxUKFNSZXMgcmVzKSB0aHJvdygpDQorew0KKyAgc3dpdGNoKHJlcykNCisgIHsNCisgICAgY2FzZSBTWl9PSzogcmV0dXJuIFNfT0s7DQorICAgIGNhc2UgU1pfRVJST1JfTUVNOiByZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisgICAgY2FzZSBTWl9FUlJPUl9QQVJBTTogcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgY2FzZSBTWl9FUlJPUl9QUk9HUkVTUzogcmV0dXJuIEVfQUJPUlQ7DQorICAgIGNhc2UgU1pfRVJST1JfREFUQTogcmV0dXJuIFNfRkFMU0U7DQorICAgIGNhc2UgU1pfRVJST1JfVU5TVVBQT1JURUQ6IHJldHVybiBFX05PVElNUEw7DQorICB9DQorICByZXR1cm4gRV9GQUlMOw0KK30NCisNCitzdGF0aWMgU1JlcyBJblN0cmVhbVdyYXBfUmVhZCh2b2lkICpwcCwgdm9pZCAqZGF0YSwgc2l6ZV90ICpzaXplKSB0aHJvdygpDQorew0KKyAgQ1NlZWtJblN0cmVhbVdyYXAgKnAgPSAoQ1NlZWtJblN0cmVhbVdyYXAgKilwcDsNCisgIFVJbnQzMiBjdXJTaXplID0gKCgqc2l6ZSA8IGtTdHJlYW1TdGVwU2l6ZSkgPyAoVUludDMyKSpzaXplIDoga1N0cmVhbVN0ZXBTaXplKTsNCisgIHAtPlJlcyA9IHAtPlN0cmVhbS0+UmVhZChkYXRhLCBjdXJTaXplLCAmY3VyU2l6ZSk7DQorICAqc2l6ZSA9IGN1clNpemU7DQorICByZXR1cm4gKHAtPlJlcyA9PSBTX09LKSA/IFNaX09LIDogU1pfRVJST1JfUkVBRDsNCit9DQorDQorc3RhdGljIFNSZXMgSW5TdHJlYW1XcmFwX1NlZWsodm9pZCAqcHAsIEludDY0ICpvZmZzZXQsIEVTelNlZWsgb3JpZ2luKSB0aHJvdygpDQorew0KKyAgQ1NlZWtJblN0cmVhbVdyYXAgKnAgPSAoQ1NlZWtJblN0cmVhbVdyYXAgKilwcDsNCisgIFVJbnQzMiBtb3ZlTWV0aG9kOw0KKyAgc3dpdGNoKG9yaWdpbikNCisgIHsNCisgICAgY2FzZSBTWl9TRUVLX1NFVDogbW92ZU1ldGhvZCA9IFNUUkVBTV9TRUVLX1NFVDsgYnJlYWs7DQorICAgIGNhc2UgU1pfU0VFS19DVVI6IG1vdmVNZXRob2QgPSBTVFJFQU1fU0VFS19DVVI7IGJyZWFrOw0KKyAgICBjYXNlIFNaX1NFRUtfRU5EOiBtb3ZlTWV0aG9kID0gU1RSRUFNX1NFRUtfRU5EOyBicmVhazsNCisgICAgZGVmYXVsdDogcmV0dXJuIFNaX0VSUk9SX1BBUkFNOw0KKyAgfQ0KKyAgVUludDY0IG5ld1Bvc2l0aW9uOw0KKyAgcC0+UmVzID0gcC0+U3RyZWFtLT5TZWVrKCpvZmZzZXQsIG1vdmVNZXRob2QsICZuZXdQb3NpdGlvbik7DQorICAqb2Zmc2V0ID0gKEludDY0KW5ld1Bvc2l0aW9uOw0KKyAgcmV0dXJuIChwLT5SZXMgPT0gU19PSykgPyBTWl9PSyA6IFNaX0VSUk9SX1JFQUQ7DQorfQ0KKw0KK0NTZWVrSW5TdHJlYW1XcmFwOjpDU2Vla0luU3RyZWFtV3JhcChJSW5TdHJlYW0gKnN0cmVhbSkgdGhyb3coKQ0KK3sNCisgIFN0cmVhbSA9IHN0cmVhbTsNCisgIHAuUmVhZCA9IEluU3RyZWFtV3JhcF9SZWFkOw0KKyAgcC5TZWVrID0gSW5TdHJlYW1XcmFwX1NlZWs7DQorICBSZXMgPSBTX09LOw0KK30NCisNCisNCisvKiAtLS0tLS0tLS0tIENCeXRlSW5CdWZXcmFwIC0tLS0tLS0tLS0gKi8NCisNCit2b2lkIENCeXRlSW5CdWZXcmFwOjpGcmVlKCkgdGhyb3coKQ0KK3sNCisgIDo6TWlkRnJlZShCdWYpOw0KKyAgQnVmID0gMDsNCit9DQorDQorYm9vbCBDQnl0ZUluQnVmV3JhcDo6QWxsb2MoVUludDMyIHNpemUpIHRocm93KCkNCit7DQorICBpZiAoQnVmID09IDAgfHwgc2l6ZSAhPSBTaXplKQ0KKyAgew0KKyAgICBGcmVlKCk7DQorICAgIExpbSA9IEN1ciA9IEJ1ZiA9IChCeXRlICopOjpNaWRBbGxvYygoc2l6ZV90KXNpemUpOw0KKyAgICBTaXplID0gc2l6ZTsNCisgIH0NCisgIHJldHVybiAoQnVmICE9IDApOw0KK30NCisNCitCeXRlIENCeXRlSW5CdWZXcmFwOjpSZWFkQnl0ZUZyb21OZXdCbG9jaygpIHRocm93KCkNCit7DQorICBpZiAoUmVzID09IFNfT0spDQorICB7DQorICAgIFVJbnQzMiBhdmFpbDsNCisgICAgUHJvY2Vzc2VkICs9IChDdXIgLSBCdWYpOw0KKyAgICBSZXMgPSBTdHJlYW0tPlJlYWQoQnVmLCBTaXplLCAmYXZhaWwpOw0KKyAgICBDdXIgPSBCdWY7DQorICAgIExpbSA9IEJ1ZiArIGF2YWlsOw0KKyAgICBpZiAoYXZhaWwgIT0gMCkNCisgICAgICByZXR1cm4gKkN1cisrOw0KKyAgfQ0KKyAgRXh0cmEgPSB0cnVlOw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBCeXRlIFdyYXBfUmVhZEJ5dGUodm9pZCAqcHApIHRocm93KCkNCit7DQorICBDQnl0ZUluQnVmV3JhcCAqcCA9IChDQnl0ZUluQnVmV3JhcCAqKXBwOw0KKyAgaWYgKHAtPkN1ciAhPSBwLT5MaW0pDQorICAgIHJldHVybiAqcC0+Q3VyKys7DQorICByZXR1cm4gcC0+UmVhZEJ5dGVGcm9tTmV3QmxvY2soKTsNCit9DQorDQorQ0J5dGVJbkJ1ZldyYXA6OkNCeXRlSW5CdWZXcmFwKCk6IEJ1ZigwKQ0KK3sNCisgIHAuUmVhZCA9IFdyYXBfUmVhZEJ5dGU7DQorfQ0KKw0KKw0KKy8qIC0tLS0tLS0tLS0gQ0J5dGVPdXRCdWZXcmFwIC0tLS0tLS0tLS0gKi8NCisNCit2b2lkIENCeXRlT3V0QnVmV3JhcDo6RnJlZSgpIHRocm93KCkNCit7DQorICA6Ok1pZEZyZWUoQnVmKTsNCisgIEJ1ZiA9IDA7DQorfQ0KKw0KK2Jvb2wgQ0J5dGVPdXRCdWZXcmFwOjpBbGxvYyhzaXplX3Qgc2l6ZSkgdGhyb3coKQ0KK3sNCisgIGlmIChCdWYgPT0gMCB8fCBzaXplICE9IFNpemUpDQorICB7DQorICAgIEZyZWUoKTsNCisgICAgQnVmID0gKEJ5dGUgKik6Ok1pZEFsbG9jKHNpemUpOw0KKyAgICBTaXplID0gc2l6ZTsNCisgIH0NCisgIHJldHVybiAoQnVmICE9IDApOw0KK30NCisNCitIUkVTVUxUIENCeXRlT3V0QnVmV3JhcDo6Rmx1c2goKSB0aHJvdygpDQorew0KKyAgaWYgKFJlcyA9PSBTX09LKQ0KKyAgew0KKyAgICBzaXplX3Qgc2l6ZSA9IChDdXIgLSBCdWYpOw0KKyAgICBSZXMgPSBXcml0ZVN0cmVhbShTdHJlYW0sIEJ1Ziwgc2l6ZSk7DQorICAgIGlmIChSZXMgPT0gU19PSykNCisgICAgICBQcm9jZXNzZWQgKz0gc2l6ZTsNCisgICAgQ3VyID0gQnVmOw0KKyAgfQ0KKyAgcmV0dXJuIFJlczsNCit9DQorDQorc3RhdGljIHZvaWQgV3JhcF9Xcml0ZUJ5dGUodm9pZCAqcHAsIEJ5dGUgYikgdGhyb3coKQ0KK3sNCisgIENCeXRlT3V0QnVmV3JhcCAqcCA9IChDQnl0ZU91dEJ1ZldyYXAgKilwcDsNCisgIEJ5dGUgKmRlc3QgPSBwLT5DdXI7DQorICAqZGVzdCA9IGI7DQorICBwLT5DdXIgPSArK2Rlc3Q7DQorICBpZiAoZGVzdCA9PSBwLT5MaW0pDQorICAgIHAtPkZsdXNoKCk7DQorfQ0KKw0KK0NCeXRlT3V0QnVmV3JhcDo6Q0J5dGVPdXRCdWZXcmFwKCkgdGhyb3coKTogQnVmKDApDQorew0KKyAgcC5Xcml0ZSA9IFdyYXBfV3JpdGVCeXRlOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9DV3JhcHBlcnMuaCBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0NXcmFwcGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NzIxMzMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9DV3JhcHBlcnMuaApAQCAtMCwwICsxLDExNCBAQAorLy8gQ1dyYXBwZXJzLmgNCisNCisjaWZuZGVmIF9fQ19XUkFQUEVSU19IDQorI2RlZmluZSBfX0NfV1JBUFBFUlNfSA0KKw0KKyNpbmNsdWRlICIuLi9JQ29kZXIuaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL015Q29tLmgiDQorDQorc3RydWN0IENDb21wcmVzc1Byb2dyZXNzV3JhcA0KK3sNCisgIElDb21wcmVzc1Byb2dyZXNzIHA7DQorICBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKlByb2dyZXNzOw0KKyAgSFJFU1VMVCBSZXM7DQorICANCisgIENDb21wcmVzc1Byb2dyZXNzV3JhcChJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKSB0aHJvdygpOw0KK307DQorDQorc3RydWN0IENTZXFJblN0cmVhbVdyYXANCit7DQorICBJU2VxSW5TdHJlYW0gcDsNCisgIElTZXF1ZW50aWFsSW5TdHJlYW0gKlN0cmVhbTsNCisgIEhSRVNVTFQgUmVzOw0KKyAgVUludDY0IFByb2Nlc3NlZDsNCisgIA0KKyAgQ1NlcUluU3RyZWFtV3JhcChJU2VxdWVudGlhbEluU3RyZWFtICpzdHJlYW0pIHRocm93KCk7DQorfTsNCisNCitzdHJ1Y3QgQ1NlZWtJblN0cmVhbVdyYXANCit7DQorICBJU2Vla0luU3RyZWFtIHA7DQorICBJSW5TdHJlYW0gKlN0cmVhbTsNCisgIEhSRVNVTFQgUmVzOw0KKyAgDQorICBDU2Vla0luU3RyZWFtV3JhcChJSW5TdHJlYW0gKnN0cmVhbSkgdGhyb3coKTsNCit9Ow0KKw0KK3N0cnVjdCBDU2VxT3V0U3RyZWFtV3JhcA0KK3sNCisgIElTZXFPdXRTdHJlYW0gcDsNCisgIElTZXF1ZW50aWFsT3V0U3RyZWFtICpTdHJlYW07DQorICBIUkVTVUxUIFJlczsNCisgIFVJbnQ2NCBQcm9jZXNzZWQ7DQorICANCisgIENTZXFPdXRTdHJlYW1XcmFwKElTZXF1ZW50aWFsT3V0U3RyZWFtICpzdHJlYW0pIHRocm93KCk7DQorfTsNCisNCitIUkVTVUxUIFNSZXNUb0hSRVNVTFQoU1JlcyByZXMpIHRocm93KCk7DQorDQorc3RydWN0IENCeXRlSW5CdWZXcmFwDQorew0KKyAgSUJ5dGVJbiBwOw0KKyAgY29uc3QgQnl0ZSAqQ3VyOw0KKyAgY29uc3QgQnl0ZSAqTGltOw0KKyAgQnl0ZSAqQnVmOw0KKyAgVUludDMyIFNpemU7DQorICBJU2VxdWVudGlhbEluU3RyZWFtICpTdHJlYW07DQorICBVSW50NjQgUHJvY2Vzc2VkOw0KKyAgYm9vbCBFeHRyYTsNCisgIEhSRVNVTFQgUmVzOw0KKyAgDQorICBDQnl0ZUluQnVmV3JhcCgpOw0KKyAgfkNCeXRlSW5CdWZXcmFwKCkgeyBGcmVlKCk7IH0NCisgIHZvaWQgRnJlZSgpIHRocm93KCk7DQorICBib29sIEFsbG9jKFVJbnQzMiBzaXplKSB0aHJvdygpOw0KKyAgdm9pZCBJbml0KCkNCisgIHsNCisgICAgTGltID0gQ3VyID0gQnVmOw0KKyAgICBQcm9jZXNzZWQgPSAwOw0KKyAgICBFeHRyYSA9IGZhbHNlOw0KKyAgICBSZXMgPSBTX09LOw0KKyAgfQ0KKyAgVUludDY0IEdldFByb2Nlc3NlZCgpIGNvbnN0IHsgcmV0dXJuIFByb2Nlc3NlZCArIChDdXIgLSBCdWYpOyB9DQorICBCeXRlIFJlYWRCeXRlRnJvbU5ld0Jsb2NrKCkgdGhyb3coKTsNCisgIEJ5dGUgUmVhZEJ5dGUoKQ0KKyAgew0KKyAgICBpZiAoQ3VyICE9IExpbSkNCisgICAgICByZXR1cm4gKkN1cisrOw0KKyAgICByZXR1cm4gUmVhZEJ5dGVGcm9tTmV3QmxvY2soKTsNCisgIH0NCit9Ow0KKw0KK3N0cnVjdCBDQnl0ZU91dEJ1ZldyYXANCit7DQorICBJQnl0ZU91dCBwOw0KKyAgQnl0ZSAqQ3VyOw0KKyAgY29uc3QgQnl0ZSAqTGltOw0KKyAgQnl0ZSAqQnVmOw0KKyAgc2l6ZV90IFNpemU7DQorICBJU2VxdWVudGlhbE91dFN0cmVhbSAqU3RyZWFtOw0KKyAgVUludDY0IFByb2Nlc3NlZDsNCisgIEhSRVNVTFQgUmVzOw0KKyAgDQorICBDQnl0ZU91dEJ1ZldyYXAoKSB0aHJvdygpOw0KKyAgfkNCeXRlT3V0QnVmV3JhcCgpIHsgRnJlZSgpOyB9DQorICB2b2lkIEZyZWUoKSB0aHJvdygpOw0KKyAgYm9vbCBBbGxvYyhzaXplX3Qgc2l6ZSkgdGhyb3coKTsNCisgIHZvaWQgSW5pdCgpDQorICB7DQorICAgIEN1ciA9IEJ1ZjsNCisgICAgTGltID0gQnVmICsgU2l6ZTsNCisgICAgUHJvY2Vzc2VkID0gMDsNCisgICAgUmVzID0gU19PSzsNCisgIH0NCisgIFVJbnQ2NCBHZXRQcm9jZXNzZWQoKSBjb25zdCB7IHJldHVybiBQcm9jZXNzZWQgKyAoQ3VyIC0gQnVmKTsgfQ0KKyAgSFJFU1VMVCBGbHVzaCgpIHRocm93KCk7DQorICB2b2lkIFdyaXRlQnl0ZShCeXRlIGIpDQorICB7DQorICAgICpDdXIrKyA9IGI7DQorICAgIGlmIChDdXIgPT0gTGltKQ0KKyAgICAgIEZsdXNoKCk7DQorICB9DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9DcmVhdGVDb2Rlci5jcHAgYi9sem1hL0NQUC83emlwL0NvbW1vbi9DcmVhdGVDb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlNGUwNQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0NyZWF0ZUNvZGVyLmNwcApAQCAtMCwwICsxLDM5MSBAQAorLy8gQ3JlYXRlQ29kZXIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9XaW5kb3dzL0RlZnMuaCINCisjaW5jbHVkZSAiLi4vLi4vV2luZG93cy9Qcm9wVmFyaWFudC5oIg0KKw0KKyNpbmNsdWRlICJDcmVhdGVDb2Rlci5oIg0KKw0KKyNpbmNsdWRlICJGaWx0ZXJDb2Rlci5oIg0KKyNpbmNsdWRlICJSZWdpc3RlckNvZGVjLmgiDQorDQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTnVtQ29kZWNzTWF4ID0gNjQ7DQordW5zaWduZWQgaW50IGdfTnVtQ29kZWNzID0gMDsNCitjb25zdCBDQ29kZWNJbmZvICpnX0NvZGVjc1trTnVtQ29kZWNzTWF4XTsNCit2b2lkIFJlZ2lzdGVyQ29kZWMoY29uc3QgQ0NvZGVjSW5mbyAqY29kZWNJbmZvKSB0aHJvdygpDQorew0KKyAgaWYgKGdfTnVtQ29kZWNzIDwga051bUNvZGVjc01heCkNCisgICAgZ19Db2RlY3NbZ19OdW1Db2RlY3MrK10gPSBjb2RlY0luZm87DQorfQ0KKw0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga051bUhhc2hlcnNNYXggPSAxNjsNCit1bnNpZ25lZCBpbnQgZ19OdW1IYXNoZXJzID0gMDsNCitjb25zdCBDSGFzaGVySW5mbyAqZ19IYXNoZXJzW2tOdW1IYXNoZXJzTWF4XTsNCit2b2lkIFJlZ2lzdGVySGFzaGVyKGNvbnN0IENIYXNoZXJJbmZvICpoYXNoSW5mbykgdGhyb3coKQ0KK3sNCisgIGlmIChnX051bUhhc2hlcnMgPCBrTnVtSGFzaGVyc01heCkNCisgICAgZ19IYXNoZXJzW2dfTnVtSGFzaGVycysrXSA9IGhhc2hJbmZvOw0KK30NCisNCisjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorc3RhdGljIEhSRVNVTFQgUmVhZE51bWJlck9mU3RyZWFtcyhJQ29tcHJlc3NDb2RlY3NJbmZvICpjb2RlY3NJbmZvLCBVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIFVJbnQzMiAmcmVzKQ0KK3sNCisgIE5XaW5kb3dzOjpOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgIFJJTk9LKGNvZGVjc0luZm8tPkdldFByb3BlcnR5KGluZGV4LCBwcm9wSUQsICZwcm9wKSk7DQorICBpZiAocHJvcC52dCA9PSBWVF9FTVBUWSkNCisgICAgcmVzID0gMTsNCisgIGVsc2UgaWYgKHByb3AudnQgPT0gVlRfVUk0KQ0KKyAgICByZXMgPSBwcm9wLnVsVmFsOw0KKyAgZWxzZQ0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0YXRpYyBIUkVTVUxUIFJlYWRJc0Fzc2lnbmVkUHJvcChJQ29tcHJlc3NDb2RlY3NJbmZvICpjb2RlY3NJbmZvLCBVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIGJvb2wgJnJlcykNCit7DQorICBOV2luZG93czo6TkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBSSU5PSyhjb2RlY3NJbmZvLT5HZXRQcm9wZXJ0eShpbmRleCwgcHJvcElELCAmcHJvcCkpOw0KKyAgaWYgKHByb3AudnQgPT0gVlRfRU1QVFkpDQorICAgIHJlcyA9IHRydWU7DQorICBlbHNlIGlmIChwcm9wLnZ0ID09IFZUX0JPT0wpDQorICAgIHJlcyA9IFZBUklBTlRfQk9PTFRvQm9vbChwcm9wLmJvb2xWYWwpOw0KKyAgZWxzZQ0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ0V4dGVybmFsQ29kZWNzOjpMb2FkQ29kZWNzKCkNCit7DQorICBpZiAoR2V0Q29kZWNzKQ0KKyAgew0KKyAgICBVSW50MzIgbnVtOw0KKyAgICBSSU5PSyhHZXRDb2RlY3MtPkdldE51bWJlck9mTWV0aG9kcygmbnVtKSk7DQorICAgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtOyBpKyspDQorICAgIHsNCisgICAgICBDQ29kZWNJbmZvRXggaW5mbzsNCisgICAgICBOV2luZG93czo6TkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgICAgUklOT0soR2V0Q29kZWNzLT5HZXRQcm9wZXJ0eShpLCBOTWV0aG9kUHJvcElEOjprSUQsICZwcm9wKSk7DQorICAgICAgLy8gaWYgKHByb3AudnQgIT0gVlRfQlNUUikNCisgICAgICAvLyBpbmZvLklkLklEU2l6ZSA9IChCeXRlKVN5c1N0cmluZ0J5dGVMZW4ocHJvcC5ic3RyVmFsKTsNCisgICAgICAvLyBtZW1jcHkoaW5mby5JZC5JRCwgcHJvcC5ic3RyVmFsLCBpbmZvLklkLklEU2l6ZSk7DQorICAgICAgaWYgKHByb3AudnQgIT0gVlRfVUk4KQ0KKyAgICAgICAgY29udGludWU7IC8vIG9sZCBJbnRlcmZhY2UNCisgICAgICBpbmZvLklkID0gcHJvcC51aFZhbC5RdWFkUGFydDsNCisgICAgICBwcm9wLkNsZWFyKCk7DQorICAgICAgDQorICAgICAgUklOT0soR2V0Q29kZWNzLT5HZXRQcm9wZXJ0eShpLCBOTWV0aG9kUHJvcElEOjprTmFtZSwgJnByb3ApKTsNCisgICAgICBpZiAocHJvcC52dCA9PSBWVF9CU1RSKQ0KKyAgICAgICAgaW5mby5OYW1lID0gcHJvcC5ic3RyVmFsOw0KKyAgICAgIGVsc2UgaWYgKHByb3AudnQgIT0gVlRfRU1QVFkpDQorICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICAgIA0KKyAgICAgIFJJTk9LKFJlYWROdW1iZXJPZlN0cmVhbXMoR2V0Q29kZWNzLCBpLCBOTWV0aG9kUHJvcElEOjprSW5TdHJlYW1zLCBpbmZvLk51bUluU3RyZWFtcykpOw0KKyAgICAgIFJJTk9LKFJlYWROdW1iZXJPZlN0cmVhbXMoR2V0Q29kZWNzLCBpLCBOTWV0aG9kUHJvcElEOjprT3V0U3RyZWFtcywgaW5mby5OdW1PdXRTdHJlYW1zKSk7DQorICAgICAgUklOT0soUmVhZElzQXNzaWduZWRQcm9wKEdldENvZGVjcywgaSwgTk1ldGhvZFByb3BJRDo6a0VuY29kZXJJc0Fzc2lnbmVkLCBpbmZvLkVuY29kZXJJc0Fzc2lnbmVkKSk7DQorICAgICAgUklOT0soUmVhZElzQXNzaWduZWRQcm9wKEdldENvZGVjcywgaSwgTk1ldGhvZFByb3BJRDo6a0RlY29kZXJJc0Fzc2lnbmVkLCBpbmZvLkRlY29kZXJJc0Fzc2lnbmVkKSk7DQorICAgICAgDQorICAgICAgQ29kZWNzLkFkZChpbmZvKTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKEdldEhhc2hlcnMpDQorICB7DQorICAgIFVJbnQzMiBudW0gPSBHZXRIYXNoZXJzLT5HZXROdW1IYXNoZXJzKCk7DQorICAgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtOyBpKyspDQorICAgIHsNCisgICAgICBDSGFzaGVySW5mb0V4IGluZm87DQorICAgICAgTldpbmRvd3M6Ok5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgICAgIFJJTk9LKEdldEhhc2hlcnMtPkdldEhhc2hlclByb3AoaSwgTk1ldGhvZFByb3BJRDo6a0lELCAmcHJvcCkpOw0KKyAgICAgIGlmIChwcm9wLnZ0ICE9IFZUX1VJOCkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGluZm8uSWQgPSBwcm9wLnVoVmFsLlF1YWRQYXJ0Ow0KKyAgICAgIHByb3AuQ2xlYXIoKTsNCisgICAgICANCisgICAgICBSSU5PSyhHZXRIYXNoZXJzLT5HZXRIYXNoZXJQcm9wKGksIE5NZXRob2RQcm9wSUQ6OmtOYW1lLCAmcHJvcCkpOw0KKyAgICAgIGlmIChwcm9wLnZ0ID09IFZUX0JTVFIpDQorICAgICAgICBpbmZvLk5hbWUgPSBwcm9wLmJzdHJWYWw7DQorICAgICAgZWxzZSBpZiAocHJvcC52dCAhPSBWVF9FTVBUWSkNCisgICAgICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICAgICAgDQorICAgICAgSGFzaGVycy5BZGQoaW5mbyk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCisjZW5kaWYNCisNCitib29sIEZpbmRNZXRob2QoREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgY29uc3QgVVN0cmluZyAmbmFtZSwgQ01ldGhvZElkICZtZXRob2RJZCwgVUludDMyICZudW1JblN0cmVhbXMsIFVJbnQzMiAmbnVtT3V0U3RyZWFtcykNCit7DQorICBVSW50MzIgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBnX051bUNvZGVjczsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCBDQ29kZWNJbmZvICZjb2RlYyA9ICpnX0NvZGVjc1tpXTsNCisgICAgaWYgKG5hbWUuSXNFcXVhbFRvTm9DYXNlKGNvZGVjLk5hbWUpKQ0KKyAgICB7DQorICAgICAgbWV0aG9kSWQgPSBjb2RlYy5JZDsNCisgICAgICBudW1JblN0cmVhbXMgPSBjb2RlYy5OdW1JblN0cmVhbXM7DQorICAgICAgbnVtT3V0U3RyZWFtcyA9IDE7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgIH0NCisgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisgIGlmIChfX2V4dGVybmFsQ29kZWNzKQ0KKyAgICBmb3IgKGkgPSAwOyBpIDwgKFVJbnQzMilfX2V4dGVybmFsQ29kZWNzLT5Db2RlY3MuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBjb25zdCBDQ29kZWNJbmZvRXggJmNvZGVjID0gX19leHRlcm5hbENvZGVjcy0+Q29kZWNzW2ldOw0KKyAgICAgIGlmIChjb2RlYy5OYW1lLklzRXF1YWxUb05vQ2FzZShuYW1lKSkNCisgICAgICB7DQorICAgICAgICBtZXRob2RJZCA9IGNvZGVjLklkOw0KKyAgICAgICAgbnVtSW5TdHJlYW1zID0gY29kZWMuTnVtSW5TdHJlYW1zOw0KKyAgICAgICAgbnVtT3V0U3RyZWFtcyA9IGNvZGVjLk51bU91dFN0cmVhbXM7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICNlbmRpZg0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIEZpbmRNZXRob2QoREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICBDTWV0aG9kSWQgbWV0aG9kSWQsIFVTdHJpbmcgJm5hbWUpDQorew0KKyAgVUludDMyIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgZ19OdW1Db2RlY3M7IGkrKykNCisgIHsNCisgICAgY29uc3QgQ0NvZGVjSW5mbyAmY29kZWMgPSAqZ19Db2RlY3NbaV07DQorICAgIGlmIChtZXRob2RJZCA9PSBjb2RlYy5JZCkNCisgICAgew0KKyAgICAgIG5hbWUgPSBjb2RlYy5OYW1lOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICB9DQorICAjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorICBpZiAoX19leHRlcm5hbENvZGVjcykNCisgICAgZm9yIChpID0gMDsgaSA8IChVSW50MzIpX19leHRlcm5hbENvZGVjcy0+Q29kZWNzLlNpemUoKTsgaSsrKQ0KKyAgICB7DQorICAgICAgY29uc3QgQ0NvZGVjSW5mb0V4ICZjb2RlYyA9IF9fZXh0ZXJuYWxDb2RlY3MtPkNvZGVjc1tpXTsNCisgICAgICBpZiAobWV0aG9kSWQgPT0gY29kZWMuSWQpDQorICAgICAgew0KKyAgICAgICAgbmFtZSA9IGNvZGVjLk5hbWU7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICNlbmRpZg0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIEZpbmRIYXNoTWV0aG9kKERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICBjb25zdCBVU3RyaW5nICZuYW1lLA0KKyAgQ01ldGhvZElkICZtZXRob2RJZCkNCit7DQorICBVSW50MzIgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBnX051bUhhc2hlcnM7IGkrKykNCisgIHsNCisgICAgY29uc3QgQ0hhc2hlckluZm8gJmNvZGVjID0gKmdfSGFzaGVyc1tpXTsNCisgICAgaWYgKG5hbWUuSXNFcXVhbFRvTm9DYXNlKGNvZGVjLk5hbWUpKQ0KKyAgICB7DQorICAgICAgbWV0aG9kSWQgPSBjb2RlYy5JZDsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgfQ0KKyAgI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKyAgaWYgKF9fZXh0ZXJuYWxDb2RlY3MpDQorICAgIGZvciAoaSA9IDA7IGkgPCAoVUludDMyKV9fZXh0ZXJuYWxDb2RlY3MtPkhhc2hlcnMuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBjb25zdCBDSGFzaGVySW5mb0V4ICZjb2RlYyA9IF9fZXh0ZXJuYWxDb2RlY3MtPkhhc2hlcnNbaV07DQorICAgICAgaWYgKGNvZGVjLk5hbWUuSXNFcXVhbFRvTm9DYXNlKG5hbWUpKQ0KKyAgICAgIHsNCisgICAgICAgIG1ldGhvZElkID0gY29kZWMuSWQ7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICNlbmRpZg0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCit2b2lkIEdldEhhc2hNZXRob2RzKERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgIENSZWNvcmRWZWN0b3I8Q01ldGhvZElkPiAmbWV0aG9kcykNCit7DQorICBtZXRob2RzLkNsZWFyQW5kU2V0U2l6ZShnX051bUhhc2hlcnMpOw0KKyAgVUludDMyIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgZ19OdW1IYXNoZXJzOyBpKyspDQorICAgIG1ldGhvZHNbaV0gPSAoKmdfSGFzaGVyc1tpXSkuSWQ7DQorICAjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorICBpZiAoX19leHRlcm5hbENvZGVjcykNCisgICAgZm9yIChpID0gMDsgaSA8IChVSW50MzIpX19leHRlcm5hbENvZGVjcy0+SGFzaGVycy5TaXplKCk7IGkrKykNCisgICAgICBtZXRob2RzLkFkZChfX2V4dGVybmFsQ29kZWNzLT5IYXNoZXJzW2ldLklkKTsNCisgICNlbmRpZg0KK30NCisNCitIUkVTVUxUIENyZWF0ZUNvZGVyKA0KKyAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgIENNZXRob2RJZCBtZXRob2RJZCwNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NGaWx0ZXI+ICZmaWx0ZXIsDQorICBDTXlDb21QdHI8SUNvbXByZXNzQ29kZXI+ICZjb2RlciwNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NDb2RlcjI+ICZjb2RlcjIsDQorICBib29sIGVuY29kZSwgYm9vbCBvbmx5Q29kZXIpDQorew0KKyAgVUludDMyIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgZ19OdW1Db2RlY3M7IGkrKykNCisgIHsNCisgICAgY29uc3QgQ0NvZGVjSW5mbyAmY29kZWMgPSAqZ19Db2RlY3NbaV07DQorICAgIGlmIChjb2RlYy5JZCA9PSBtZXRob2RJZCkNCisgICAgew0KKyAgICAgIGlmIChlbmNvZGUpDQorICAgICAgew0KKyAgICAgICAgaWYgKGNvZGVjLkNyZWF0ZUVuY29kZXIpDQorICAgICAgICB7DQorICAgICAgICAgIHZvaWQgKnAgPSBjb2RlYy5DcmVhdGVFbmNvZGVyKCk7DQorICAgICAgICAgIGlmIChjb2RlYy5Jc0ZpbHRlcikgZmlsdGVyID0gKElDb21wcmVzc0ZpbHRlciAqKXA7DQorICAgICAgICAgIGVsc2UgaWYgKGNvZGVjLk51bUluU3RyZWFtcyA9PSAxKSBjb2RlciA9IChJQ29tcHJlc3NDb2RlciAqKXA7DQorICAgICAgICAgIGVsc2UgY29kZXIyID0gKElDb21wcmVzc0NvZGVyMiAqKXA7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgICBpZiAoY29kZWMuQ3JlYXRlRGVjb2RlcikNCisgICAgICAgIHsNCisgICAgICAgICAgdm9pZCAqcCA9IGNvZGVjLkNyZWF0ZURlY29kZXIoKTsNCisgICAgICAgICAgaWYgKGNvZGVjLklzRmlsdGVyKSBmaWx0ZXIgPSAoSUNvbXByZXNzRmlsdGVyICopcDsNCisgICAgICAgICAgZWxzZSBpZiAoY29kZWMuTnVtSW5TdHJlYW1zID09IDEpIGNvZGVyID0gKElDb21wcmVzc0NvZGVyICopcDsNCisgICAgICAgICAgZWxzZSBjb2RlcjIgPSAoSUNvbXByZXNzQ29kZXIyICopcDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisgIGlmICghZmlsdGVyICYmICFjb2RlciAmJiAhY29kZXIyICYmIF9fZXh0ZXJuYWxDb2RlY3MpDQorICAgIGZvciAoaSA9IDA7IGkgPCAoVUludDMyKV9fZXh0ZXJuYWxDb2RlY3MtPkNvZGVjcy5TaXplKCk7IGkrKykNCisgICAgew0KKyAgICAgIGNvbnN0IENDb2RlY0luZm9FeCAmY29kZWMgPSBfX2V4dGVybmFsQ29kZWNzLT5Db2RlY3NbaV07DQorICAgICAgaWYgKGNvZGVjLklkID09IG1ldGhvZElkKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChlbmNvZGUpDQorICAgICAgICB7DQorICAgICAgICAgIGlmIChjb2RlYy5FbmNvZGVySXNBc3NpZ25lZCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChjb2RlYy5Jc1NpbXBsZUNvZGVjKCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgSFJFU1VMVCByZXN1bHQgPSBfX2V4dGVybmFsQ29kZWNzLT5HZXRDb2RlY3MtPkNyZWF0ZUVuY29kZXIoaSwgJklJRF9JQ29tcHJlc3NDb2RlciwgKHZvaWQgKiopJmNvZGVyKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gU19PSyAmJiByZXN1bHQgIT0gRV9OT0lOVEVSRkFDRSAmJiByZXN1bHQgIT0gQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRSkNCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICAgIGlmICghY29kZXIpDQorICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFJJTk9LKF9fZXh0ZXJuYWxDb2RlY3MtPkdldENvZGVjcy0+Q3JlYXRlRW5jb2RlcihpLCAmSUlEX0lDb21wcmVzc0ZpbHRlciwgKHZvaWQgKiopJmZpbHRlcikpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgUklOT0soX19leHRlcm5hbENvZGVjcy0+R2V0Q29kZWNzLT5DcmVhdGVFbmNvZGVyKGksICZJSURfSUNvbXByZXNzQ29kZXIyLCAodm9pZCAqKikmY29kZXIyKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICAgIGlmIChjb2RlYy5EZWNvZGVySXNBc3NpZ25lZCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChjb2RlYy5Jc1NpbXBsZUNvZGVjKCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgSFJFU1VMVCByZXN1bHQgPSBfX2V4dGVybmFsQ29kZWNzLT5HZXRDb2RlY3MtPkNyZWF0ZURlY29kZXIoaSwgJklJRF9JQ29tcHJlc3NDb2RlciwgKHZvaWQgKiopJmNvZGVyKTsNCisgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gU19PSyAmJiByZXN1bHQgIT0gRV9OT0lOVEVSRkFDRSAmJiByZXN1bHQgIT0gQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRSkNCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICAgIGlmICghY29kZXIpDQorICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFJJTk9LKF9fZXh0ZXJuYWxDb2RlY3MtPkdldENvZGVjcy0+Q3JlYXRlRGVjb2RlcihpLCAmSUlEX0lDb21wcmVzc0ZpbHRlciwgKHZvaWQgKiopJmZpbHRlcikpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgUklOT0soX19leHRlcm5hbENvZGVjcy0+R2V0Q29kZWNzLT5DcmVhdGVEZWNvZGVyKGksICZJSURfSUNvbXByZXNzQ29kZXIyLCAodm9pZCAqKikmY29kZXIyKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAjZW5kaWYNCisNCisgIGlmIChvbmx5Q29kZXIgJiYgZmlsdGVyKQ0KKyAgew0KKyAgICBDRmlsdGVyQ29kZXIgKmNvZGVyU3BlYyA9IG5ldyBDRmlsdGVyQ29kZXI7DQorICAgIGNvZGVyID0gY29kZXJTcGVjOw0KKyAgICBjb2RlclNwZWMtPkZpbHRlciA9IGZpbHRlcjsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENyZWF0ZUNvZGVyKA0KKyAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgIENNZXRob2RJZCBtZXRob2RJZCwNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NDb2Rlcj4gJmNvZGVyLA0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyMj4gJmNvZGVyMiwNCisgIGJvb2wgZW5jb2RlKQ0KK3sNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NGaWx0ZXI+IGZpbHRlcjsNCisgIHJldHVybiBDcmVhdGVDb2RlcigNCisgICAgRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgIG1ldGhvZElkLA0KKyAgICBmaWx0ZXIsIGNvZGVyLCBjb2RlcjIsIGVuY29kZSwgdHJ1ZSk7DQorfQ0KKw0KK0hSRVNVTFQgQ3JlYXRlQ29kZXIoDQorICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgQ01ldGhvZElkIG1ldGhvZElkLA0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyPiAmY29kZXIsIGJvb2wgZW5jb2RlKQ0KK3sNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NGaWx0ZXI+IGZpbHRlcjsNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NDb2RlcjI+IGNvZGVyMjsNCisgIHJldHVybiBDcmVhdGVDb2RlcigNCisgICAgRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgIG1ldGhvZElkLA0KKyAgICBjb2RlciwgY29kZXIyLCBlbmNvZGUpOw0KK30NCisNCitIUkVTVUxUIENyZWF0ZUZpbHRlcigNCisgIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICBDTWV0aG9kSWQgbWV0aG9kSWQsDQorICBDTXlDb21QdHI8SUNvbXByZXNzRmlsdGVyPiAmZmlsdGVyLA0KKyAgYm9vbCBlbmNvZGUpDQorew0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyPiBjb2RlcjsNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NDb2RlcjI+IGNvZGVyMjsNCisgIHJldHVybiBDcmVhdGVDb2RlcigNCisgICAgRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgIG1ldGhvZElkLA0KKyAgICBmaWx0ZXIsIGNvZGVyLCBjb2RlcjIsIGVuY29kZSwgZmFsc2UpOw0KK30NCisNCitIUkVTVUxUIENyZWF0ZUhhc2hlcigNCisgIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICBDTWV0aG9kSWQgbWV0aG9kSWQsDQorICBVU3RyaW5nICZuYW1lLA0KKyAgQ015Q29tUHRyPElIYXNoZXI+ICZoYXNoZXIpDQorew0KKyAgVUludDMyIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgZ19OdW1IYXNoZXJzOyBpKyspDQorICB7DQorICAgIGNvbnN0IENIYXNoZXJJbmZvICZjb2RlYyA9ICpnX0hhc2hlcnNbaV07DQorICAgIGlmIChjb2RlYy5JZCA9PSBtZXRob2RJZCkNCisgICAgew0KKyAgICAgIGhhc2hlciA9IChJSGFzaGVyICopY29kZWMuQ3JlYXRlSGFzaGVyKCk7DQorICAgICAgbmFtZSA9IGNvZGVjLk5hbWU7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisNCisgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisgIGlmICghaGFzaGVyICYmIF9fZXh0ZXJuYWxDb2RlY3MpDQorICAgIGZvciAoaSA9IDA7IGkgPCAoVUludDMyKV9fZXh0ZXJuYWxDb2RlY3MtPkhhc2hlcnMuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBjb25zdCBDSGFzaGVySW5mb0V4ICZjb2RlYyA9IF9fZXh0ZXJuYWxDb2RlY3MtPkhhc2hlcnNbaV07DQorICAgICAgaWYgKGNvZGVjLklkID09IG1ldGhvZElkKQ0KKyAgICAgIHsNCisgICAgICAgIG5hbWUgPSBjb2RlYy5OYW1lOw0KKyAgICAgICAgcmV0dXJuIF9fZXh0ZXJuYWxDb2RlY3MtPkdldEhhc2hlcnMtPkNyZWF0ZUhhc2hlcihpLCAmaGFzaGVyKTsNCisgICAgICB9DQorICAgIH0NCisgICNlbmRpZg0KKw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0NyZWF0ZUNvZGVyLmggYi9sem1hL0NQUC83emlwL0NvbW1vbi9DcmVhdGVDb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGMxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9DcmVhdGVDb2Rlci5oCkBAIC0wLDAgKzEsMTI3IEBACisvLyBDcmVhdGVDb2Rlci5oDQorDQorI2lmbmRlZiBfX0NSRUFURV9DT0RFUl9IDQorI2RlZmluZSBfX0NSRUFURV9DT0RFUl9IDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlTdHJpbmcuaCINCisjaW5jbHVkZSAiLi4vSUNvZGVyLmgiDQorDQorI2luY2x1ZGUgIk1ldGhvZElkLmgiDQorDQorI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKw0KK3N0cnVjdCBDQ29kZWNJbmZvRXgNCit7DQorICBVU3RyaW5nIE5hbWU7DQorICBDTWV0aG9kSWQgSWQ7DQorICBVSW50MzIgTnVtSW5TdHJlYW1zOw0KKyAgVUludDMyIE51bU91dFN0cmVhbXM7DQorICBib29sIEVuY29kZXJJc0Fzc2lnbmVkOw0KKyAgYm9vbCBEZWNvZGVySXNBc3NpZ25lZDsNCisgIA0KKyAgYm9vbCBJc1NpbXBsZUNvZGVjKCkgY29uc3QgeyByZXR1cm4gTnVtT3V0U3RyZWFtcyA9PSAxICYmIE51bUluU3RyZWFtcyA9PSAxOyB9DQorICBDQ29kZWNJbmZvRXgoKTogRW5jb2RlcklzQXNzaWduZWQoZmFsc2UpLCBEZWNvZGVySXNBc3NpZ25lZChmYWxzZSkge30NCit9Ow0KKw0KK3N0cnVjdCBDSGFzaGVySW5mb0V4DQorew0KKyAgVVN0cmluZyBOYW1lOw0KKyAgQ01ldGhvZElkIElkOw0KK307DQorDQorI2RlZmluZSBQVUJMSUNfSVNldENvbXByZXNzQ29kZWNzSW5mbyBwdWJsaWMgSVNldENvbXByZXNzQ29kZWNzSW5mbywNCisjZGVmaW5lIFFVRVJZX0VOVFJZX0lTZXRDb21wcmVzc0NvZGVjc0luZm8gTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoSVNldENvbXByZXNzQ29kZWNzSW5mbykNCisjZGVmaW5lIERFQ0xfSVNldENvbXByZXNzQ29kZWNzSW5mbyBTVERNRVRIT0QoU2V0Q29tcHJlc3NDb2RlY3NJbmZvKShJQ29tcHJlc3NDb2RlY3NJbmZvICpjb21wcmVzc0NvZGVjc0luZm8pOw0KKyNkZWZpbmUgSU1QTF9JU2V0Q29tcHJlc3NDb2RlY3NJbmZvMih4KSBcDQorU1RETUVUSE9ESU1QIHg6OlNldENvbXByZXNzQ29kZWNzSW5mbyhJQ29tcHJlc3NDb2RlY3NJbmZvICpjb21wcmVzc0NvZGVjc0luZm8pIHsgXA0KKyAgQ09NX1RSWV9CRUdJTiBfX2V4dGVybmFsQ29kZWNzLkdldENvZGVjcyA9IGNvbXByZXNzQ29kZWNzSW5mbzsgIHJldHVybiBfX2V4dGVybmFsQ29kZWNzLkxvYWRDb2RlY3MoKTsgQ09NX1RSWV9FTkQgfQ0KKyNkZWZpbmUgSU1QTF9JU2V0Q29tcHJlc3NDb2RlY3NJbmZvIElNUExfSVNldENvbXByZXNzQ29kZWNzSW5mbzIoQ0hhbmRsZXIpDQorDQorc3RydWN0IENFeHRlcm5hbENvZGVjcw0KK3sNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NDb2RlY3NJbmZvPiBHZXRDb2RlY3M7DQorICBDTXlDb21QdHI8SUhhc2hlcnM+IEdldEhhc2hlcnM7DQorDQorICBDT2JqZWN0VmVjdG9yPENDb2RlY0luZm9FeD4gQ29kZWNzOw0KKyAgQ09iamVjdFZlY3RvcjxDSGFzaGVySW5mb0V4PiBIYXNoZXJzOw0KKw0KKyAgSFJFU1VMVCBMb2FkQ29kZWNzKCk7DQorfTsNCisNCisjZGVmaW5lIEVYVEVSTkFMX0NPREVDU19WQVJTMiAmX19leHRlcm5hbENvZGVjcw0KKw0KKyNkZWZpbmUgREVDTF9FWFRFUk5BTF9DT0RFQ1NfVkFSUyBDRXh0ZXJuYWxDb2RlY3MgX19leHRlcm5hbENvZGVjczsNCisjZGVmaW5lIEVYVEVSTkFMX0NPREVDU19WQVJTIEVYVEVSTkFMX0NPREVDU19WQVJTMiwNCisNCisjZGVmaW5lIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTMiBjb25zdCBDRXh0ZXJuYWxDb2RlY3MgKl9fZXh0ZXJuYWxDb2RlY3MNCisjZGVmaW5lIEVYVEVSTkFMX0NPREVDU19MT0NfVkFSUzIgX19leHRlcm5hbENvZGVjcw0KKw0KKyNkZWZpbmUgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMyLA0KKyNkZWZpbmUgRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTIEVYVEVSTkFMX0NPREVDU19MT0NfVkFSUzIsDQorDQorI2Vsc2UNCisNCisjZGVmaW5lIFBVQkxJQ19JU2V0Q29tcHJlc3NDb2RlY3NJbmZvDQorI2RlZmluZSBRVUVSWV9FTlRSWV9JU2V0Q29tcHJlc3NDb2RlY3NJbmZvDQorI2RlZmluZSBERUNMX0lTZXRDb21wcmVzc0NvZGVjc0luZm8NCisjZGVmaW5lIElNUExfSVNldENvbXByZXNzQ29kZWNzSW5mbw0KKyNkZWZpbmUgRVhURVJOQUxfQ09ERUNTX1ZBUlMyDQorI2RlZmluZSBERUNMX0VYVEVSTkFMX0NPREVDU19WQVJTDQorI2RlZmluZSBFWFRFUk5BTF9DT0RFQ1NfVkFSUyBFWFRFUk5BTF9DT0RFQ1NfVkFSUzINCisjZGVmaW5lIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTMg0KKyNkZWZpbmUgRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTMg0KKyNkZWZpbmUgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisjZGVmaW5lIEVYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKw0KKyNlbmRpZg0KKw0KK2Jvb2wgRmluZE1ldGhvZCgNCisgIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICBjb25zdCBVU3RyaW5nICZuYW1lLCBDTWV0aG9kSWQgJm1ldGhvZElkLCBVSW50MzIgJm51bUluU3RyZWFtcywgVUludDMyICZudW1PdXRTdHJlYW1zKTsNCisNCitib29sIEZpbmRNZXRob2QoDQorICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgQ01ldGhvZElkIG1ldGhvZElkLCBVU3RyaW5nICZuYW1lKTsNCisNCitib29sIEZpbmRIYXNoTWV0aG9kKA0KKyAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgIGNvbnN0IFVTdHJpbmcgJm5hbWUsIENNZXRob2RJZCAmbWV0aG9kSWQpOw0KKw0KK3ZvaWQgR2V0SGFzaE1ldGhvZHMoDQorICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgQ1JlY29yZFZlY3RvcjxDTWV0aG9kSWQ+ICZtZXRob2RzKTsNCisNCitIUkVTVUxUIENyZWF0ZUNvZGVyKA0KKyAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgIENNZXRob2RJZCBtZXRob2RJZCwNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NGaWx0ZXI+ICZmaWx0ZXIsDQorICBDTXlDb21QdHI8SUNvbXByZXNzQ29kZXI+ICZjb2RlciwNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NDb2RlcjI+ICZjb2RlcjIsDQorICBib29sIGVuY29kZSwgYm9vbCBvbmx5Q29kZXIpOw0KKw0KK0hSRVNVTFQgQ3JlYXRlQ29kZXIoDQorICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgQ01ldGhvZElkIG1ldGhvZElkLA0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyPiAmY29kZXIsDQorICBDTXlDb21QdHI8SUNvbXByZXNzQ29kZXIyPiAmY29kZXIyLA0KKyAgYm9vbCBlbmNvZGUpOw0KKw0KK0hSRVNVTFQgQ3JlYXRlQ29kZXIoDQorICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgQ01ldGhvZElkIG1ldGhvZElkLA0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyPiAmY29kZXIsIGJvb2wgZW5jb2RlKTsNCisNCitIUkVTVUxUIENyZWF0ZUZpbHRlcigNCisgIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICBDTWV0aG9kSWQgbWV0aG9kSWQsDQorICBDTXlDb21QdHI8SUNvbXByZXNzRmlsdGVyPiAmZmlsdGVyLA0KKyAgYm9vbCBlbmNvZGUpOw0KKw0KK0hSRVNVTFQgQ3JlYXRlSGFzaGVyKA0KKyAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgIENNZXRob2RJZCBtZXRob2RJZCwNCisgIFVTdHJpbmcgJm5hbWUsDQorICBDTXlDb21QdHI8SUhhc2hlcj4gJmhhY2hlcik7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vRmlsZVBhdGhBdXRvUmVuYW1lLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0ZpbGVQYXRoQXV0b1JlbmFtZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxNTFjMAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0ZpbGVQYXRoQXV0b1JlbmFtZS5jcHAKQEAgLTAsMCArMSw1NSBAQAorLy8gRmlsZVBhdGhBdXRvUmVuYW1lLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0RlZnMuaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0ludFRvU3RyaW5nLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL1dpbmRvd3MvRmlsZUZpbmQuaCINCisNCisjaW5jbHVkZSAiRmlsZVBhdGhBdXRvUmVuYW1lLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KKw0KK3N0YXRpYyBib29sIE1ha2VBdXRvTmFtZShjb25zdCBGU3RyaW5nICZuYW1lLA0KKyAgICBjb25zdCBGU3RyaW5nICZleHRlbnNpb24sIHVuc2lnbmVkIHZhbHVlLCBGU3RyaW5nICZwYXRoKQ0KK3sNCisgIEZDaGFyIG51bWJlclsxNl07DQorICBDb252ZXJ0VUludDMyVG9TdHJpbmcodmFsdWUsIG51bWJlcik7DQorICBwYXRoID0gbmFtZTsNCisgIHBhdGggKz0gbnVtYmVyOw0KKyAgcGF0aCArPSBleHRlbnNpb247DQorICByZXR1cm4gTkZpbGU6Ok5GaW5kOjpEb2VzRmlsZU9yRGlyRXhpc3QocGF0aCk7DQorfQ0KKw0KK2Jvb2wgQXV0b1JlbmFtZVBhdGgoRlN0cmluZyAmZnVsbFByb2Nlc3NlZFBhdGgpDQorew0KKyAgRlN0cmluZyBwYXRoOw0KKyAgaW50IGRvdFBvcyA9IGZ1bGxQcm9jZXNzZWRQYXRoLlJldmVyc2VGaW5kKEZURVhUKCcuJykpOw0KKw0KKyAgaW50IHNsYXNoUG9zID0gZnVsbFByb2Nlc3NlZFBhdGguUmV2ZXJzZUZpbmQoRlRFWFQoJy8nKSk7DQorICAjaWZkZWYgX1dJTjMyDQorICBpbnQgc2xhc2gxUG9zID0gZnVsbFByb2Nlc3NlZFBhdGguUmV2ZXJzZUZpbmQoRlRFWFQoJ1xcJykpOw0KKyAgc2xhc2hQb3MgPSBNeU1heChzbGFzaFBvcywgc2xhc2gxUG9zKTsNCisgICNlbmRpZg0KKw0KKyAgRlN0cmluZyBuYW1lLCBleHRlbnNpb247DQorICBpZiAoZG90UG9zID4gc2xhc2hQb3MgJiYgZG90UG9zID4gMCkNCisgIHsNCisgICAgbmFtZS5TZXRGcm9tKGZ1bGxQcm9jZXNzZWRQYXRoLCBkb3RQb3MpOw0KKyAgICBleHRlbnNpb24gPSBmdWxsUHJvY2Vzc2VkUGF0aC5QdHIoZG90UG9zKTsNCisgIH0NCisgIGVsc2UNCisgICAgbmFtZSA9IGZ1bGxQcm9jZXNzZWRQYXRoOw0KKyAgbmFtZSArPSBMJ18nOw0KKyAgdW5zaWduZWQgbGVmdCA9IDEsIHJpZ2h0ID0gKDEgPDwgMzApOw0KKyAgd2hpbGUgKGxlZnQgIT0gcmlnaHQpDQorICB7DQorICAgIHVuc2lnbmVkIG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsNCisgICAgaWYgKE1ha2VBdXRvTmFtZShuYW1lLCBleHRlbnNpb24sIG1pZCwgcGF0aCkpDQorICAgICAgbGVmdCA9IG1pZCArIDE7DQorICAgIGVsc2UNCisgICAgICByaWdodCA9IG1pZDsNCisgIH0NCisgIHJldHVybiAhTWFrZUF1dG9OYW1lKG5hbWUsIGV4dGVuc2lvbiwgcmlnaHQsIGZ1bGxQcm9jZXNzZWRQYXRoKTsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vRmlsZVBhdGhBdXRvUmVuYW1lLmggYi9sem1hL0NQUC83emlwL0NvbW1vbi9GaWxlUGF0aEF1dG9SZW5hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjJkNzFiCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21tb24vRmlsZVBhdGhBdXRvUmVuYW1lLmgKQEAgLTAsMCArMSwxMCBAQAorLy8gRmlsZVBhdGhBdXRvUmVuYW1lLmgNCisNCisjaWZuZGVmIF9fRklMRV9QQVRIX0FVVE9fUkVOQU1FX0gNCisjZGVmaW5lIF9fRklMRV9QQVRIX0FVVE9fUkVOQU1FX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL015U3RyaW5nLmgiDQorDQorYm9vbCBBdXRvUmVuYW1lUGF0aChGU3RyaW5nICZmdWxsUHJvY2Vzc2VkUGF0aCk7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vRmlsZVN0cmVhbXMuY3BwIGIvbHptYS9DUFAvN3ppcC9Db21tb24vRmlsZVN0cmVhbXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Zjc5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9GaWxlU3RyZWFtcy5jcHAKQEAgLTAsMCArMSw0MzUgQEAKKy8vIEZpbGVTdHJlYW1zLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaWZuZGVmIF9XSU4zMg0KKyNpbmNsdWRlIDxmY250bC5oPg0KKyNpbmNsdWRlIDx1bmlzdGQuaD4NCisjaW5jbHVkZSA8ZXJybm8uaD4NCisjZW5kaWYNCisNCisjaWZkZWYgU1VQUE9SVF9ERVZJQ0VfRklMRQ0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0FsbG9jLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9EZWZzLmgiDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIkZpbGVTdHJlYW1zLmgiDQorDQorc3RhdGljIGlubGluZSBIUkVTVUxUIENvbnZlcnRCb29sVG9IUkVTVUxUKGJvb2wgcmVzdWx0KQ0KK3sNCisgICNpZmRlZiBfV0lOMzINCisgIGlmIChyZXN1bHQpDQorICAgIHJldHVybiBTX09LOw0KKyAgRFdPUkQgbGFzdEVycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsNCisgIGlmIChsYXN0RXJyb3IgPT0gMCkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIHJldHVybiBIUkVTVUxUX0ZST01fV0lOMzIobGFzdEVycm9yKTsNCisgICNlbHNlDQorICByZXR1cm4gcmVzdWx0ID8gU19PSzogRV9GQUlMOw0KKyAgI2VuZGlmDQorfQ0KKw0KKyNpZmRlZiBTVVBQT1JUX0RFVklDRV9GSUxFDQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrQ2x1c3RlclNpemUgPSAxIDw8IDE4Ow0KK0NJbkZpbGVTdHJlYW06OkNJbkZpbGVTdHJlYW0oKToNCisgIFZpcnRQb3MoMCksDQorICBQaHlQb3MoMCksDQorICBCdWYoMCksDQorICBCdWZTaXplKDApLA0KKyAgU3VwcG9ydEhhcmRMaW5rcyhmYWxzZSkNCit7DQorfQ0KKw0KKyNlbmRpZg0KKw0KK0NJbkZpbGVTdHJlYW06On5DSW5GaWxlU3RyZWFtKCkNCit7DQorICAjaWZkZWYgU1VQUE9SVF9ERVZJQ0VfRklMRQ0KKyAgTWlkRnJlZShCdWYpOw0KKyAgI2VuZGlmDQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSW5GaWxlU3RyZWFtOjpSZWFkKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgI2lmZGVmIFVTRV9XSU5fRklMRQ0KKyAgDQorICAjaWZkZWYgU1VQUE9SVF9ERVZJQ0VfRklMRQ0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gMDsNCisgIGlmIChzaXplID09IDApDQorICAgIHJldHVybiBTX09LOw0KKyAgaWYgKEZpbGUuSXNEZXZpY2VGaWxlKQ0KKyAgew0KKyAgICBpZiAoRmlsZS5TaXplRGVmaW5lZCkNCisgICAgew0KKyAgICAgIGlmIChWaXJ0UG9zID49IEZpbGUuU2l6ZSkNCisgICAgICAgIHJldHVybiBWaXJ0UG9zID09IEZpbGUuU2l6ZSA/IFNfT0sgOiBFX0ZBSUw7DQorICAgICAgVUludDY0IHJlbSA9IEZpbGUuU2l6ZSAtIFZpcnRQb3M7DQorICAgICAgaWYgKHNpemUgPiByZW0pDQorICAgICAgICBzaXplID0gKFVJbnQzMilyZW07DQorICAgIH0NCisgICAgZm9yICg7OykNCisgICAgew0KKyAgICAgIGNvbnN0IFVJbnQzMiBtYXNrID0ga0NsdXN0ZXJTaXplIC0gMTsNCisgICAgICBjb25zdCBVSW50NjQgbWFzazIgPSB+KFVJbnQ2NCltYXNrOw0KKyAgICAgIFVJbnQ2NCBhbGlnbmVkUG9zID0gVmlydFBvcyAmIG1hc2syOw0KKyAgICAgIGlmIChCdWZTaXplID4gMCAmJiBCdWZTdGFydFBvcyA9PSBhbGlnbmVkUG9zKQ0KKyAgICAgIHsNCisgICAgICAgIFVJbnQzMiBwb3MgPSAoVUludDMyKVZpcnRQb3MgJiBtYXNrOw0KKyAgICAgICAgaWYgKHBvcyA+PSBCdWZTaXplKQ0KKyAgICAgICAgICByZXR1cm4gU19PSzsNCisgICAgICAgIFVJbnQzMiByZW0gPSBNeU1pbihCdWZTaXplIC0gcG9zLCBzaXplKTsNCisgICAgICAgIG1lbWNweShkYXRhLCBCdWYgKyBwb3MsIHJlbSk7DQorICAgICAgICBWaXJ0UG9zICs9IHJlbTsNCisgICAgICAgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAgICAgICAqcHJvY2Vzc2VkU2l6ZSArPSByZW07DQorICAgICAgICByZXR1cm4gU19PSzsNCisgICAgICB9DQorICAgICAgDQorICAgICAgYm9vbCB1c2VCdWYgPSBmYWxzZTsNCisgICAgICBpZiAoKFZpcnRQb3MgJiBtYXNrKSAhPSAwIHx8ICgocHRyZGlmZl90KWRhdGEgJiBtYXNrKSAhPSAwICkNCisgICAgICAgIHVzZUJ1ZiA9IHRydWU7DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIFVJbnQ2NCBlbmQgPSBWaXJ0UG9zICsgc2l6ZTsNCisgICAgICAgIGlmICgoZW5kICYgbWFzaykgIT0gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgZW5kICY9IG1hc2syOw0KKyAgICAgICAgICBpZiAoZW5kIDw9IFZpcnRQb3MpDQorICAgICAgICAgICAgdXNlQnVmID0gdHJ1ZTsNCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHNpemUgPSAoVUludDMyKShlbmQgLSBWaXJ0UG9zKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKCF1c2VCdWYpDQorICAgICAgICBicmVhazsNCisgICAgICBpZiAoYWxpZ25lZFBvcyAhPSBQaHlQb3MpDQorICAgICAgew0KKyAgICAgICAgVUludDY0IHJlYWxOZXdQb3NpdGlvbjsNCisgICAgICAgIGJvb2wgcmVzdWx0ID0gRmlsZS5TZWVrKGFsaWduZWRQb3MsIEZJTEVfQkVHSU4sIHJlYWxOZXdQb3NpdGlvbik7DQorICAgICAgICBpZiAoIXJlc3VsdCkNCisgICAgICAgICAgcmV0dXJuIENvbnZlcnRCb29sVG9IUkVTVUxUKHJlc3VsdCk7DQorICAgICAgICBQaHlQb3MgPSByZWFsTmV3UG9zaXRpb247DQorICAgICAgfQ0KKw0KKyAgICAgIEJ1ZlN0YXJ0UG9zID0gYWxpZ25lZFBvczsNCisgICAgICBVSW50MzIgcmVhZFNpemUgPSBrQ2x1c3RlclNpemU7DQorICAgICAgaWYgKEZpbGUuU2l6ZURlZmluZWQpDQorICAgICAgICByZWFkU2l6ZSA9IChVSW50MzIpTXlNaW4oRmlsZS5TaXplIC0gUGh5UG9zLCAoVUludDY0KWtDbHVzdGVyU2l6ZSk7DQorDQorICAgICAgaWYgKCFCdWYpDQorICAgICAgew0KKyAgICAgICAgQnVmID0gKEJ5dGUgKilNaWRBbGxvYyhrQ2x1c3RlclNpemUpOw0KKyAgICAgICAgaWYgKCFCdWYpDQorICAgICAgICAgIHJldHVybiBFX09VVE9GTUVNT1JZOw0KKyAgICAgIH0NCisgICAgICBib29sIHJlc3VsdCA9IEZpbGUuUmVhZDEoQnVmLCByZWFkU2l6ZSwgQnVmU2l6ZSk7DQorICAgICAgaWYgKCFyZXN1bHQpDQorICAgICAgICByZXR1cm4gQ29udmVydEJvb2xUb0hSRVNVTFQocmVzdWx0KTsNCisNCisgICAgICBpZiAoQnVmU2l6ZSA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgUGh5UG9zICs9IEJ1ZlNpemU7DQorICAgIH0NCisNCisgICAgaWYgKFZpcnRQb3MgIT0gUGh5UG9zKQ0KKyAgICB7DQorICAgICAgVUludDY0IHJlYWxOZXdQb3NpdGlvbjsNCisgICAgICBib29sIHJlc3VsdCA9IEZpbGUuU2VlayhWaXJ0UG9zLCBGSUxFX0JFR0lOLCByZWFsTmV3UG9zaXRpb24pOw0KKyAgICAgIGlmICghcmVzdWx0KQ0KKyAgICAgICAgcmV0dXJuIENvbnZlcnRCb29sVG9IUkVTVUxUKHJlc3VsdCk7DQorICAgICAgUGh5UG9zID0gVmlydFBvcyA9IHJlYWxOZXdQb3NpdGlvbjsNCisgICAgfQ0KKyAgfQ0KKyAgI2VuZGlmDQorDQorICBVSW50MzIgcmVhbFByb2Nlc3NlZFNpemU7DQorICBib29sIHJlc3VsdCA9IEZpbGUuUmVhZFBhcnQoZGF0YSwgc2l6ZSwgcmVhbFByb2Nlc3NlZFNpemUpOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gcmVhbFByb2Nlc3NlZFNpemU7DQorICAjaWZkZWYgU1VQUE9SVF9ERVZJQ0VfRklMRQ0KKyAgVmlydFBvcyArPSByZWFsUHJvY2Vzc2VkU2l6ZTsNCisgIFBoeVBvcyArPSByZWFsUHJvY2Vzc2VkU2l6ZTsNCisgICNlbmRpZg0KKyAgcmV0dXJuIENvbnZlcnRCb29sVG9IUkVTVUxUKHJlc3VsdCk7DQorICANCisgICNlbHNlDQorICANCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IDA7DQorICBzc2l6ZV90IHJlcyA9IEZpbGUuUmVhZChkYXRhLCAoc2l6ZV90KXNpemUpOw0KKyAgaWYgKHJlcyA9PSAtMSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IChVSW50MzIpcmVzOw0KKyAgcmV0dXJuIFNfT0s7DQorDQorICAjZW5kaWYNCit9DQorDQorI2lmZGVmIFVOREVSX0NFDQorU1RETUVUSE9ESU1QIENTdGRJbkZpbGVTdHJlYW06OlJlYWQodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBzaXplX3QgczIgPSBmcmVhZChkYXRhLCAxLCBzaXplLCBzdGRpbik7DQorICBpbnQgZXJyb3IgPSBmZXJyb3Ioc3RkaW4pOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gczI7DQorICBpZiAoczIgPD0gc2l6ZSAmJiBlcnJvciA9PSAwKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIHJldHVybiBFX0ZBSUw7DQorfQ0KKyNlbHNlDQorU1RETUVUSE9ESU1QIENTdGRJbkZpbGVTdHJlYW06OlJlYWQodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICAjaWZkZWYgX1dJTjMyDQorICANCisgIERXT1JEIHJlYWxQcm9jZXNzZWRTaXplOw0KKyAgVUludDMyIHNpemVUZW1wID0gKDEgPDwgMjApOw0KKyAgaWYgKHNpemVUZW1wID4gc2l6ZSkNCisgICAgc2l6ZVRlbXAgPSBzaXplOw0KKyAgQk9PTCByZXMgPSA6OlJlYWRGaWxlKEdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKSwgZGF0YSwgc2l6ZVRlbXAsICZyZWFsUHJvY2Vzc2VkU2l6ZSwgTlVMTCk7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSByZWFsUHJvY2Vzc2VkU2l6ZTsNCisgIGlmIChyZXMgPT0gRkFMU0UgJiYgR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfQlJPS0VOX1BJUEUpDQorICAgIHJldHVybiBTX09LOw0KKyAgcmV0dXJuIENvbnZlcnRCb29sVG9IUkVTVUxUKHJlcyAhPSBGQUxTRSk7DQorICANCisgICNlbHNlDQorDQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSAwOw0KKyAgc3NpemVfdCByZXM7DQorICBkbw0KKyAgew0KKyAgICByZXMgPSByZWFkKDAsIGRhdGEsIChzaXplX3Qpc2l6ZSk7DQorICB9DQorICB3aGlsZSAocmVzIDwgMCAmJiAoZXJybm8gPT0gRUlOVFIpKTsNCisgIGlmIChyZXMgPT0gLTEpDQorICAgIHJldHVybiBFX0ZBSUw7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSAoVUludDMyKXJlczsNCisgIHJldHVybiBTX09LOw0KKyAgDQorICAjZW5kaWYNCit9DQorICANCisjZW5kaWYNCisNCitTVERNRVRIT0RJTVAgQ0luRmlsZVN0cmVhbTo6U2VlayhJbnQ2NCBvZmZzZXQsIFVJbnQzMiBzZWVrT3JpZ2luLCBVSW50NjQgKm5ld1Bvc2l0aW9uKQ0KK3sNCisgIGlmIChzZWVrT3JpZ2luID49IDMpDQorICAgIHJldHVybiBTVEdfRV9JTlZBTElERlVOQ1RJT047DQorDQorICAjaWZkZWYgVVNFX1dJTl9GSUxFDQorDQorICAjaWZkZWYgU1VQUE9SVF9ERVZJQ0VfRklMRQ0KKyAgaWYgKEZpbGUuSXNEZXZpY2VGaWxlICYmIChGaWxlLlNpemVEZWZpbmVkIHx8IHNlZWtPcmlnaW4gIT0gU1RSRUFNX1NFRUtfRU5EKSkNCisgIHsNCisgICAgc3dpdGNoIChzZWVrT3JpZ2luKQ0KKyAgICB7DQorICAgICAgY2FzZSBTVFJFQU1fU0VFS19TRVQ6IGJyZWFrOw0KKyAgICAgIGNhc2UgU1RSRUFNX1NFRUtfQ1VSOiBvZmZzZXQgKz0gVmlydFBvczsgYnJlYWs7DQorICAgICAgY2FzZSBTVFJFQU1fU0VFS19FTkQ6IG9mZnNldCArPSBGaWxlLlNpemU7IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6IHJldHVybiBTVEdfRV9JTlZBTElERlVOQ1RJT047DQorICAgIH0NCisgICAgaWYgKG9mZnNldCA8IDApDQorICAgICAgcmV0dXJuIEhSRVNVTFRfV0lOMzJfRVJST1JfTkVHQVRJVkVfU0VFSzsNCisgICAgVmlydFBvcyA9IG9mZnNldDsNCisgICAgaWYgKG5ld1Bvc2l0aW9uKQ0KKyAgICAgICpuZXdQb3NpdGlvbiA9IG9mZnNldDsNCisgICAgcmV0dXJuIFNfT0s7DQorICB9DQorICAjZW5kaWYNCisgIA0KKyAgVUludDY0IHJlYWxOZXdQb3NpdGlvbjsNCisgIGJvb2wgcmVzdWx0ID0gRmlsZS5TZWVrKG9mZnNldCwgc2Vla09yaWdpbiwgcmVhbE5ld1Bvc2l0aW9uKTsNCisgIA0KKyAgI2lmZGVmIFNVUFBPUlRfREVWSUNFX0ZJTEUNCisgIFBoeVBvcyA9IFZpcnRQb3MgPSByZWFsTmV3UG9zaXRpb247DQorICAjZW5kaWYNCisNCisgIGlmIChuZXdQb3NpdGlvbikNCisgICAgKm5ld1Bvc2l0aW9uID0gcmVhbE5ld1Bvc2l0aW9uOw0KKyAgcmV0dXJuIENvbnZlcnRCb29sVG9IUkVTVUxUKHJlc3VsdCk7DQorICANCisgICNlbHNlDQorICANCisgIG9mZl90IHJlcyA9IEZpbGUuU2Vlaygob2ZmX3Qpb2Zmc2V0LCBzZWVrT3JpZ2luKTsNCisgIGlmIChyZXMgPT0gLTEpDQorICAgIHJldHVybiBFX0ZBSUw7DQorICBpZiAobmV3UG9zaXRpb24pDQorICAgICpuZXdQb3NpdGlvbiA9IChVSW50NjQpcmVzOw0KKyAgcmV0dXJuIFNfT0s7DQorICANCisgICNlbmRpZg0KK30NCisNCitTVERNRVRIT0RJTVAgQ0luRmlsZVN0cmVhbTo6R2V0U2l6ZShVSW50NjQgKnNpemUpDQorew0KKyAgcmV0dXJuIENvbnZlcnRCb29sVG9IUkVTVUxUKEZpbGUuR2V0TGVuZ3RoKCpzaXplKSk7DQorfQ0KKw0KKyNpZmRlZiBVU0VfV0lOX0ZJTEUNCisNCitTVERNRVRIT0RJTVAgQ0luRmlsZVN0cmVhbTo6R2V0UHJvcHMoVUludDY0ICpzaXplLCBGSUxFVElNRSAqY1RpbWUsIEZJTEVUSU1FICphVGltZSwgRklMRVRJTUUgKm1UaW1lLCBVSW50MzIgKmF0dHJpYikNCit7DQorICBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBpbmZvOw0KKyAgaWYgKEZpbGUuR2V0RmlsZUluZm9ybWF0aW9uKCZpbmZvKSkNCisgIHsNCisgICAgaWYgKHNpemUpICpzaXplID0gKCgoVUludDY0KWluZm8ubkZpbGVTaXplSGlnaCkgPDwgMzIpICsgaW5mby5uRmlsZVNpemVMb3c7DQorICAgIGlmIChjVGltZSkgKmNUaW1lID0gaW5mby5mdENyZWF0aW9uVGltZTsNCisgICAgaWYgKGFUaW1lKSAqYVRpbWUgPSBpbmZvLmZ0TGFzdEFjY2Vzc1RpbWU7DQorICAgIGlmIChtVGltZSkgKm1UaW1lID0gaW5mby5mdExhc3RXcml0ZVRpbWU7DQorICAgIGlmIChhdHRyaWIpICphdHRyaWIgPSBpbmZvLmR3RmlsZUF0dHJpYnV0ZXM7DQorICAgIHJldHVybiBTX09LOw0KKyAgfQ0KKyAgcmV0dXJuIEdldExhc3RFcnJvcigpOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0luRmlsZVN0cmVhbTo6R2V0UHJvcHMyKENTdHJlYW1GaWxlUHJvcHMgKnByb3BzKQ0KK3sNCisgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGluZm87DQorICBpZiAoRmlsZS5HZXRGaWxlSW5mb3JtYXRpb24oJmluZm8pKQ0KKyAgew0KKyAgICBwcm9wcy0+U2l6ZSA9ICgoKFVJbnQ2NClpbmZvLm5GaWxlU2l6ZUhpZ2gpIDw8IDMyKSArIGluZm8ubkZpbGVTaXplTG93Ow0KKyAgICBwcm9wcy0+Vm9sSUQgPSBpbmZvLmR3Vm9sdW1lU2VyaWFsTnVtYmVyOw0KKyAgICBwcm9wcy0+RmlsZUlEX0xvdyA9ICgoKFVJbnQ2NClpbmZvLm5GaWxlSW5kZXhIaWdoKSA8PCAzMikgKyBpbmZvLm5GaWxlSW5kZXhMb3c7DQorICAgIHByb3BzLT5GaWxlSURfSGlnaCA9IDA7DQorICAgIHByb3BzLT5OdW1MaW5rcyA9IFN1cHBvcnRIYXJkTGlua3MgPyBpbmZvLm5OdW1iZXJPZkxpbmtzIDogMTsNCisgICAgcHJvcHMtPkF0dHJpYiA9IGluZm8uZHdGaWxlQXR0cmlidXRlczsNCisgICAgcHJvcHMtPkNUaW1lID0gaW5mby5mdENyZWF0aW9uVGltZTsNCisgICAgcHJvcHMtPkFUaW1lID0gaW5mby5mdExhc3RBY2Nlc3NUaW1lOw0KKyAgICBwcm9wcy0+TVRpbWUgPSBpbmZvLmZ0TGFzdFdyaXRlVGltZTsNCisgICAgcmV0dXJuIFNfT0s7DQorICB9DQorICByZXR1cm4gR2V0TGFzdEVycm9yKCk7DQorfQ0KKw0KKyNlbmRpZg0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ091dEZpbGVTdHJlYW0NCisNCitIUkVTVUxUIENPdXRGaWxlU3RyZWFtOjpDbG9zZSgpDQorew0KKyAgcmV0dXJuIENvbnZlcnRCb29sVG9IUkVTVUxUKEZpbGUuQ2xvc2UoKSk7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDT3V0RmlsZVN0cmVhbTo6V3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICAjaWZkZWYgVVNFX1dJTl9GSUxFDQorDQorICBVSW50MzIgcmVhbFByb2Nlc3NlZFNpemU7DQorICBib29sIHJlc3VsdCA9IEZpbGUuV3JpdGVQYXJ0KGRhdGEsIHNpemUsIHJlYWxQcm9jZXNzZWRTaXplKTsNCisgIFByb2Nlc3NlZFNpemUgKz0gcmVhbFByb2Nlc3NlZFNpemU7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSByZWFsUHJvY2Vzc2VkU2l6ZTsNCisgIHJldHVybiBDb252ZXJ0Qm9vbFRvSFJFU1VMVChyZXN1bHQpOw0KKyAgDQorICAjZWxzZQ0KKyAgDQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSAwOw0KKyAgc3NpemVfdCByZXMgPSBGaWxlLldyaXRlKGRhdGEsIChzaXplX3Qpc2l6ZSk7DQorICBpZiAocmVzID09IC0xKQ0KKyAgICByZXR1cm4gRV9GQUlMOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gKFVJbnQzMilyZXM7DQorICBQcm9jZXNzZWRTaXplICs9IHJlczsNCisgIHJldHVybiBTX09LOw0KKyAgDQorICAjZW5kaWYNCit9DQorICANCitTVERNRVRIT0RJTVAgQ091dEZpbGVTdHJlYW06OlNlZWsoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbikNCit7DQorICBpZiAoc2Vla09yaWdpbiA+PSAzKQ0KKyAgICByZXR1cm4gU1RHX0VfSU5WQUxJREZVTkNUSU9OOw0KKyAgI2lmZGVmIFVTRV9XSU5fRklMRQ0KKw0KKyAgVUludDY0IHJlYWxOZXdQb3NpdGlvbjsNCisgIGJvb2wgcmVzdWx0ID0gRmlsZS5TZWVrKG9mZnNldCwgc2Vla09yaWdpbiwgcmVhbE5ld1Bvc2l0aW9uKTsNCisgIGlmIChuZXdQb3NpdGlvbikNCisgICAgKm5ld1Bvc2l0aW9uID0gcmVhbE5ld1Bvc2l0aW9uOw0KKyAgcmV0dXJuIENvbnZlcnRCb29sVG9IUkVTVUxUKHJlc3VsdCk7DQorICANCisgICNlbHNlDQorICANCisgIG9mZl90IHJlcyA9IEZpbGUuU2Vlaygob2ZmX3Qpb2Zmc2V0LCBzZWVrT3JpZ2luKTsNCisgIGlmIChyZXMgPT0gLTEpDQorICAgIHJldHVybiBFX0ZBSUw7DQorICBpZiAobmV3UG9zaXRpb24pDQorICAgICpuZXdQb3NpdGlvbiA9IChVSW50NjQpcmVzOw0KKyAgcmV0dXJuIFNfT0s7DQorICANCisgICNlbmRpZg0KK30NCisNCitTVERNRVRIT0RJTVAgQ091dEZpbGVTdHJlYW06OlNldFNpemUoVUludDY0IG5ld1NpemUpDQorew0KKyAgI2lmZGVmIFVTRV9XSU5fRklMRQ0KKyAgVUludDY0IGN1cnJlbnRQb3M7DQorICBpZiAoIUZpbGUuU2VlaygwLCBGSUxFX0NVUlJFTlQsIGN1cnJlbnRQb3MpKQ0KKyAgICByZXR1cm4gRV9GQUlMOw0KKyAgYm9vbCByZXN1bHQgPSBGaWxlLlNldExlbmd0aChuZXdTaXplKTsNCisgIFVJbnQ2NCBjdXJyZW50UG9zMjsNCisgIHJlc3VsdCA9IHJlc3VsdCAmJiBGaWxlLlNlZWsoY3VycmVudFBvcywgY3VycmVudFBvczIpOw0KKyAgcmV0dXJuIHJlc3VsdCA/IFNfT0sgOiBFX0ZBSUw7DQorICAjZWxzZQ0KKyAgcmV0dXJuIEVfRkFJTDsNCisgICNlbmRpZg0KK30NCisNCisjaWZkZWYgVU5ERVJfQ0UNCitTVERNRVRIT0RJTVAgQ1N0ZE91dEZpbGVTdHJlYW06OldyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgc2l6ZV90IHMyID0gZndyaXRlKGRhdGEsIDEsIHNpemUsIHN0ZG91dCk7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSBzMjsNCisgIHJldHVybiAoczIgPT0gc2l6ZSkgPyBTX09LIDogRV9GQUlMOw0KK30NCisjZWxzZQ0KK1NURE1FVEhPRElNUCBDU3RkT3V0RmlsZVN0cmVhbTo6V3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSAwOw0KKw0KKyAgI2lmZGVmIF9XSU4zMg0KKyAgVUludDMyIHJlYWxQcm9jZXNzZWRTaXplOw0KKyAgQk9PTCByZXMgPSBUUlVFOw0KKyAgaWYgKHNpemUgPiAwKQ0KKyAgew0KKyAgICAvLyBTZWVtcyB0aGF0IFdpbmRvd3MgZG9lc24ndCBsaWtlIGJpZyBhbW91bnRzIHdyaXRpbmcgdG8gc3Rkb3V0Lg0KKyAgICAvLyBTbyB3ZSBsaW1pdCBwb3J0aW9ucyBieSAzMktCLg0KKyAgICBVSW50MzIgc2l6ZVRlbXAgPSAoMSA8PCAxNSk7DQorICAgIGlmIChzaXplVGVtcCA+IHNpemUpDQorICAgICAgc2l6ZVRlbXAgPSBzaXplOw0KKyAgICByZXMgPSA6OldyaXRlRmlsZShHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpLA0KKyAgICAgICAgZGF0YSwgc2l6ZVRlbXAsIChEV09SRCAqKSZyZWFsUHJvY2Vzc2VkU2l6ZSwgTlVMTCk7DQorICAgIHNpemUgLT0gcmVhbFByb2Nlc3NlZFNpemU7DQorICAgIGRhdGEgPSAoY29uc3Qgdm9pZCAqKSgoY29uc3QgQnl0ZSAqKWRhdGEgKyByZWFsUHJvY2Vzc2VkU2l6ZSk7DQorICAgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAgICpwcm9jZXNzZWRTaXplICs9IHJlYWxQcm9jZXNzZWRTaXplOw0KKyAgfQ0KKyAgcmV0dXJuIENvbnZlcnRCb29sVG9IUkVTVUxUKHJlcyAhPSBGQUxTRSk7DQorDQorICAjZWxzZQ0KKyAgDQorICBzc2l6ZV90IHJlczsNCisgIGRvDQorICB7DQorICAgIHJlcyA9IHdyaXRlKDEsIGRhdGEsIChzaXplX3Qpc2l6ZSk7DQorICB9DQorICB3aGlsZSAocmVzIDwgMCAmJiAoZXJybm8gPT0gRUlOVFIpKTsNCisgIGlmIChyZXMgPT0gLTEpDQorICAgIHJldHVybiBFX0ZBSUw7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSAoVUludDMyKXJlczsNCisgIHJldHVybiBTX09LOw0KKyAgDQorICByZXR1cm4gU19PSzsNCisgICNlbmRpZg0KK30NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9GaWxlU3RyZWFtcy5oIGIvbHptYS9DUFAvN3ppcC9Db21tb24vRmlsZVN0cmVhbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2QyZDFhCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21tb24vRmlsZVN0cmVhbXMuaApAQCAtMCwwICsxLDE0OCBAQAorLy8gRmlsZVN0cmVhbXMuaA0KKw0KKyNpZm5kZWYgX19GSUxFX1NUUkVBTVNfSA0KKyNkZWZpbmUgX19GSUxFX1NUUkVBTVNfSA0KKw0KKyNpZmRlZiBfV0lOMzINCisjZGVmaW5lIFVTRV9XSU5fRklMRQ0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlTdHJpbmcuaCINCisNCisjaWZkZWYgVVNFX1dJTl9GSUxFDQorI2luY2x1ZGUgIi4uLy4uL1dpbmRvd3MvRmlsZUlPLmgiDQorI2Vsc2UNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0NfRmlsZUlPLmgiDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKw0KKyNpbmNsdWRlICIuLi9JU3RyZWFtLmgiDQorDQorY2xhc3MgQ0luRmlsZVN0cmVhbToNCisgIHB1YmxpYyBJSW5TdHJlYW0sDQorICBwdWJsaWMgSVN0cmVhbUdldFNpemUsDQorICAjaWZkZWYgVVNFX1dJTl9GSUxFDQorICBwdWJsaWMgSVN0cmVhbUdldFByb3BzLA0KKyAgcHVibGljIElTdHJlYW1HZXRQcm9wczIsDQorICAjZW5kaWYNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KK3B1YmxpYzoNCisgICNpZmRlZiBVU0VfV0lOX0ZJTEUNCisgIE5XaW5kb3dzOjpORmlsZTo6TklPOjpDSW5GaWxlIEZpbGU7DQorICANCisgICNpZmRlZiBTVVBQT1JUX0RFVklDRV9GSUxFDQorICBVSW50NjQgVmlydFBvczsNCisgIFVJbnQ2NCBQaHlQb3M7DQorICBVSW50NjQgQnVmU3RhcnRQb3M7DQorICBCeXRlICpCdWY7DQorICBVSW50MzIgQnVmU2l6ZTsNCisgICNlbmRpZg0KKw0KKyAgI2Vsc2UNCisgIE5DOjpORmlsZTo6TklPOjpDSW5GaWxlIEZpbGU7DQorICAjZW5kaWYNCisNCisgIGJvb2wgU3VwcG9ydEhhcmRMaW5rczsNCisgIA0KKyAgdmlydHVhbCB+Q0luRmlsZVN0cmVhbSgpOw0KKw0KKyAgI2lmZGVmIFNVUFBPUlRfREVWSUNFX0ZJTEUNCisgIENJbkZpbGVTdHJlYW0oKTsNCisgICNlbmRpZg0KKyAgDQorICBib29sIE9wZW4oQ0ZTVFIgZmlsZU5hbWUpDQorICB7DQorICAgIHJldHVybiBGaWxlLk9wZW4oZmlsZU5hbWUpOw0KKyAgfQ0KKyAgDQorICBib29sIE9wZW5TaGFyZWQoQ0ZTVFIgZmlsZU5hbWUsIGJvb2wgc2hhcmVGb3JXcml0ZSkNCisgIHsNCisgICAgcmV0dXJuIEZpbGUuT3BlblNoYXJlZChmaWxlTmFtZSwgc2hhcmVGb3JXcml0ZSk7DQorICB9DQorDQorICBNWV9RVUVSWUlOVEVSRkFDRV9CRUdJTjIoSUluU3RyZWFtKQ0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoSVN0cmVhbUdldFNpemUpDQorICAjaWZkZWYgVVNFX1dJTl9GSUxFDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShJU3RyZWFtR2V0UHJvcHMpDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShJU3RyZWFtR2V0UHJvcHMyKQ0KKyAgI2VuZGlmDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTkQNCisgIE1ZX0FERFJFRl9SRUxFQVNFDQorDQorICBTVERNRVRIT0QoUmVhZCkodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorICBTVERNRVRIT0QoU2VlaykoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbik7DQorDQorICBTVERNRVRIT0QoR2V0U2l6ZSkoVUludDY0ICpzaXplKTsNCisgICNpZmRlZiBVU0VfV0lOX0ZJTEUNCisgIFNURE1FVEhPRChHZXRQcm9wcykoVUludDY0ICpzaXplLCBGSUxFVElNRSAqY1RpbWUsIEZJTEVUSU1FICphVGltZSwgRklMRVRJTUUgKm1UaW1lLCBVSW50MzIgKmF0dHJpYik7DQorICBTVERNRVRIT0QoR2V0UHJvcHMyKShDU3RyZWFtRmlsZVByb3BzICpwcm9wcyk7DQorICAjZW5kaWYNCit9Ow0KKw0KK2NsYXNzIENTdGRJbkZpbGVTdHJlYW06DQorICBwdWJsaWMgSVNlcXVlbnRpYWxJblN0cmVhbSwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QDQorDQorICB2aXJ0dWFsIH5DU3RkSW5GaWxlU3RyZWFtKCkge30NCisgIFNURE1FVEhPRChSZWFkKSh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCit9Ow0KKw0KK2NsYXNzIENPdXRGaWxlU3RyZWFtOg0KKyAgcHVibGljIElPdXRTdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCitwdWJsaWM6DQorICAjaWZkZWYgVVNFX1dJTl9GSUxFDQorICBOV2luZG93czo6TkZpbGU6Ok5JTzo6Q091dEZpbGUgRmlsZTsNCisgICNlbHNlDQorICBOQzo6TkZpbGU6Ok5JTzo6Q091dEZpbGUgRmlsZTsNCisgICNlbmRpZg0KKyAgdmlydHVhbCB+Q091dEZpbGVTdHJlYW0oKSB7fQ0KKyAgYm9vbCBDcmVhdGUoQ0ZTVFIgZmlsZU5hbWUsIGJvb2wgY3JlYXRlQWx3YXlzKQ0KKyAgew0KKyAgICBQcm9jZXNzZWRTaXplID0gMDsNCisgICAgcmV0dXJuIEZpbGUuQ3JlYXRlKGZpbGVOYW1lLCBjcmVhdGVBbHdheXMpOw0KKyAgfQ0KKyAgYm9vbCBPcGVuKENGU1RSIGZpbGVOYW1lLCBEV09SRCBjcmVhdGlvbkRpc3Bvc2l0aW9uKQ0KKyAgew0KKyAgICBQcm9jZXNzZWRTaXplID0gMDsNCisgICAgcmV0dXJuIEZpbGUuT3BlbihmaWxlTmFtZSwgY3JlYXRpb25EaXNwb3NpdGlvbik7DQorICB9DQorDQorICBIUkVTVUxUIENsb3NlKCk7DQorICANCisgIFVJbnQ2NCBQcm9jZXNzZWRTaXplOw0KKw0KKyAgI2lmZGVmIFVTRV9XSU5fRklMRQ0KKyAgYm9vbCBTZXRUaW1lKGNvbnN0IEZJTEVUSU1FICpjVGltZSwgY29uc3QgRklMRVRJTUUgKmFUaW1lLCBjb25zdCBGSUxFVElNRSAqbVRpbWUpDQorICB7DQorICAgIHJldHVybiBGaWxlLlNldFRpbWUoY1RpbWUsIGFUaW1lLCBtVGltZSk7DQorICB9DQorICBib29sIFNldE1UaW1lKGNvbnN0IEZJTEVUSU1FICptVGltZSkgeyAgcmV0dXJuIEZpbGUuU2V0TVRpbWUobVRpbWUpOyB9DQorICAjZW5kaWYNCisNCisNCisgIE1ZX1VOS05PV05fSU1QMShJT3V0U3RyZWFtKQ0KKw0KKyAgU1RETUVUSE9EKFdyaXRlKShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCisgIFNURE1FVEhPRChTZWVrKShJbnQ2NCBvZmZzZXQsIFVJbnQzMiBzZWVrT3JpZ2luLCBVSW50NjQgKm5ld1Bvc2l0aW9uKTsNCisgIFNURE1FVEhPRChTZXRTaXplKShVSW50NjQgbmV3U2l6ZSk7DQorfTsNCisNCitjbGFzcyBDU3RkT3V0RmlsZVN0cmVhbToNCisgIHB1YmxpYyBJU2VxdWVudGlhbE91dFN0cmVhbSwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QDQorDQorICB2aXJ0dWFsIH5DU3RkT3V0RmlsZVN0cmVhbSgpIHt9DQorICBTVERNRVRIT0QoV3JpdGUpKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vRmlsdGVyQ29kZXIuY3BwIGIvbHptYS9DUFAvN3ppcC9Db21tb24vRmlsdGVyQ29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDgyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9GaWx0ZXJDb2Rlci5jcHAKQEAgLTAsMCArMSwyNjUgQEAKKy8vIEZpbHRlckNvZGVyLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQy9BbGxvYy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vRGVmcy5oIg0KKw0KKyNpbmNsdWRlICJGaWx0ZXJDb2Rlci5oIg0KKyNpbmNsdWRlICJTdHJlYW1VdGlscy5oIg0KKw0KK3N0YXRpYyBjb25zdCBVSW50MzIga0J1ZmZlclNpemUgPSAxIDw8IDE3Ow0KKw0KK0NGaWx0ZXJDb2Rlcjo6Q0ZpbHRlckNvZGVyKCkNCit7DQorICBfYnVmZmVyID0gKEJ5dGUgKik6Ok1pZEFsbG9jKGtCdWZmZXJTaXplKTsNCisgIGlmIChfYnVmZmVyID09IDApDQorICAgIHRocm93IDE7DQorfQ0KKw0KK0NGaWx0ZXJDb2Rlcjo6fkNGaWx0ZXJDb2RlcigpDQorew0KKyAgOjpNaWRGcmVlKF9idWZmZXIpOw0KK30NCisNCitIUkVTVUxUIENGaWx0ZXJDb2Rlcjo6V3JpdGVXaXRoTGltaXQoSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSwgVUludDMyIHNpemUpDQorew0KKyAgaWYgKF9vdXRTaXplSXNEZWZpbmVkKQ0KKyAgew0KKyAgICBVSW50NjQgcmVtU2l6ZSA9IF9vdXRTaXplIC0gX25vd1BvczY0Ow0KKyAgICBpZiAoc2l6ZSA+IHJlbVNpemUpDQorICAgICAgc2l6ZSA9IChVSW50MzIpcmVtU2l6ZTsNCisgIH0NCisgIFJJTk9LKFdyaXRlU3RyZWFtKG91dFN0cmVhbSwgX2J1ZmZlciwgc2l6ZSkpOw0KKyAgX25vd1BvczY0ICs9IHNpemU7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENGaWx0ZXJDb2Rlcjo6Q29kZShJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSwgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSwNCisgICAgY29uc3QgVUludDY0ICogLyogaW5TaXplICovLCBjb25zdCBVSW50NjQgKm91dFNpemUsIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpDQorew0KKyAgUklOT0soSW5pdCgpKTsNCisgIFVJbnQzMiBidWZmZXJQb3MgPSAwOw0KKyAgX291dFNpemVJc0RlZmluZWQgPSAob3V0U2l6ZSAhPSAwKTsNCisgIGlmIChfb3V0U2l6ZUlzRGVmaW5lZCkNCisgICAgX291dFNpemUgPSAqb3V0U2l6ZTsNCisNCisgIHdoaWxlICghX291dFNpemVJc0RlZmluZWQgfHwgX25vd1BvczY0IDwgX291dFNpemUpDQorICB7DQorICAgIHNpemVfdCBwcm9jZXNzZWRTaXplID0ga0J1ZmZlclNpemUgLSBidWZmZXJQb3M7DQorICAgIA0KKyAgICAvLyBDaGFuZ2UgaXQ6IEl0IGNhbiBiZSBvcHRpbWl6ZWQgdXNpbmcgUmVhZFBhcnQNCisgICAgUklOT0soUmVhZFN0cmVhbShpblN0cmVhbSwgX2J1ZmZlciArIGJ1ZmZlclBvcywgJnByb2Nlc3NlZFNpemUpKTsNCisgICAgDQorICAgIFVJbnQzMiBlbmRQb3MgPSBidWZmZXJQb3MgKyAoVUludDMyKXByb2Nlc3NlZFNpemU7DQorDQorICAgIGJ1ZmZlclBvcyA9IEZpbHRlci0+RmlsdGVyKF9idWZmZXIsIGVuZFBvcyk7DQorICAgIGlmIChidWZmZXJQb3MgPiBlbmRQb3MpDQorICAgIHsNCisgICAgICBmb3IgKDsgZW5kUG9zIDwgYnVmZmVyUG9zOyBlbmRQb3MrKykNCisgICAgICAgIF9idWZmZXJbZW5kUG9zXSA9IDA7DQorICAgICAgYnVmZmVyUG9zID0gRmlsdGVyLT5GaWx0ZXIoX2J1ZmZlciwgZW5kUG9zKTsNCisgICAgfQ0KKw0KKyAgICBpZiAoYnVmZmVyUG9zID09IDApDQorICAgIHsNCisgICAgICBpZiAoZW5kUG9zID09IDApDQorICAgICAgICByZXR1cm4gU19PSzsNCisgICAgICByZXR1cm4gV3JpdGVXaXRoTGltaXQob3V0U3RyZWFtLCBlbmRQb3MpOw0KKyAgICB9DQorICAgIFJJTk9LKFdyaXRlV2l0aExpbWl0KG91dFN0cmVhbSwgYnVmZmVyUG9zKSk7DQorICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKQ0KKyAgICB7DQorICAgICAgUklOT0socHJvZ3Jlc3MtPlNldFJhdGlvSW5mbygmX25vd1BvczY0LCAmX25vd1BvczY0KSk7DQorICAgIH0NCisgICAgVUludDMyIGkgPSAwOw0KKyAgICB3aGlsZSAoYnVmZmVyUG9zIDwgZW5kUG9zKQ0KKyAgICAgIF9idWZmZXJbaSsrXSA9IF9idWZmZXJbYnVmZmVyUG9zKytdOw0KKyAgICBidWZmZXJQb3MgPSBpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRmlsdGVyQ29kZXI6OlNldE91dFN0cmVhbShJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtKQ0KK3sNCisgIF9idWZmZXJQb3MgPSAwOw0KKyAgX291dFN0cmVhbSA9IG91dFN0cmVhbTsNCisgIHJldHVybiBJbml0KCk7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRmlsdGVyQ29kZXI6OlJlbGVhc2VPdXRTdHJlYW0oKQ0KK3sNCisgIF9vdXRTdHJlYW0uUmVsZWFzZSgpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKw0KK1NURE1FVEhPRElNUCBDRmlsdGVyQ29kZXI6OldyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgaWYgKHByb2Nlc3NlZFNpemUgIT0gTlVMTCkNCisgICAgKnByb2Nlc3NlZFNpemUgPSAwOw0KKyAgd2hpbGUgKHNpemUgPiAwKQ0KKyAgew0KKyAgICBVSW50MzIgc2l6ZVRlbXAgPSBNeU1pbihzaXplLCBrQnVmZmVyU2l6ZSAtIF9idWZmZXJQb3MpOw0KKyAgICBtZW1jcHkoX2J1ZmZlciArIF9idWZmZXJQb3MsIGRhdGEsIHNpemVUZW1wKTsNCisgICAgc2l6ZSAtPSBzaXplVGVtcDsNCisgICAgaWYgKHByb2Nlc3NlZFNpemUgIT0gTlVMTCkNCisgICAgICAqcHJvY2Vzc2VkU2l6ZSArPSBzaXplVGVtcDsNCisgICAgZGF0YSA9IChjb25zdCBCeXRlICopZGF0YSArIHNpemVUZW1wOw0KKyAgICBVSW50MzIgZW5kUG9zID0gX2J1ZmZlclBvcyArIHNpemVUZW1wOw0KKyAgICBfYnVmZmVyUG9zID0gRmlsdGVyLT5GaWx0ZXIoX2J1ZmZlciwgZW5kUG9zKTsNCisgICAgaWYgKF9idWZmZXJQb3MgPT0gMCkNCisgICAgew0KKyAgICAgIF9idWZmZXJQb3MgPSBlbmRQb3M7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKF9idWZmZXJQb3MgPiBlbmRQb3MpDQorICAgIHsNCisgICAgICBpZiAoc2l6ZSAhPSAwKQ0KKyAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBSSU5PSyhXcml0ZVdpdGhMaW1pdChfb3V0U3RyZWFtLCBfYnVmZmVyUG9zKSk7DQorICAgIFVJbnQzMiBpID0gMDsNCisgICAgd2hpbGUgKF9idWZmZXJQb3MgPCBlbmRQb3MpDQorICAgICAgX2J1ZmZlcltpKytdID0gX2J1ZmZlcltfYnVmZmVyUG9zKytdOw0KKyAgICBfYnVmZmVyUG9zID0gaTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0ZpbHRlckNvZGVyOjpGbHVzaCgpDQorew0KKyAgaWYgKF9idWZmZXJQb3MgIT0gMCkNCisgIHsNCisgICAgLy8gX2J1ZmZlciBjb250YWlucyBvbmx5IGRhdGEgcmVmdXNlZCBieSBwcmV2aW91cyBGaWx0ZXItPkZpbHRlciBjYWxsLg0KKyAgICBVSW50MzIgZW5kUG9zID0gRmlsdGVyLT5GaWx0ZXIoX2J1ZmZlciwgX2J1ZmZlclBvcyk7DQorICAgIGlmIChlbmRQb3MgPiBfYnVmZmVyUG9zKQ0KKyAgICB7DQorICAgICAgZm9yICg7IF9idWZmZXJQb3MgPCBlbmRQb3M7IF9idWZmZXJQb3MrKykNCisgICAgICAgIF9idWZmZXJbX2J1ZmZlclBvc10gPSAwOw0KKyAgICAgIGlmIChGaWx0ZXItPkZpbHRlcihfYnVmZmVyLCBlbmRQb3MpICE9IGVuZFBvcykNCisgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgIH0NCisgICAgUklOT0soV3JpdGVXaXRoTGltaXQoX291dFN0cmVhbSwgX2J1ZmZlclBvcykpOw0KKyAgICBfYnVmZmVyUG9zID0gMDsNCisgIH0NCisgIENNeUNvbVB0cjxJT3V0U3RyZWFtRmx1c2g+IGZsdXNoOw0KKyAgX291dFN0cmVhbS5RdWVyeUludGVyZmFjZShJSURfSU91dFN0cmVhbUZsdXNoLCAmZmx1c2gpOw0KKyAgaWYgKGZsdXNoKQ0KKyAgICByZXR1cm4gZmx1c2gtPkZsdXNoKCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorDQordm9pZCBDRmlsdGVyQ29kZXI6OlNldEluU3RyZWFtX05vU3ViRmlsdGVySW5pdChJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSkNCit7DQorICBfY29udmVydGVkUG9zQmVnaW4gPSBfY29udmVydGVkUG9zRW5kID0gX2J1ZmZlclBvcyA9IDA7DQorICBfaW5TdHJlYW0gPSBpblN0cmVhbTsNCisgIEluaXQyKCk7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRmlsdGVyQ29kZXI6OlNldEluU3RyZWFtKElTZXF1ZW50aWFsSW5TdHJlYW0gKmluU3RyZWFtKQ0KK3sNCisgIFNldEluU3RyZWFtX05vU3ViRmlsdGVySW5pdChpblN0cmVhbSk7DQorICByZXR1cm4gSW5pdCgpOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0ZpbHRlckNvZGVyOjpSZWxlYXNlSW5TdHJlYW0oKQ0KK3sNCisgIF9pblN0cmVhbS5SZWxlYXNlKCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENGaWx0ZXJDb2Rlcjo6UmVhZCh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIGlmIChwcm9jZXNzZWRTaXplICE9IE5VTEwpDQorICAgICpwcm9jZXNzZWRTaXplID0gMDsNCisgIHdoaWxlIChzaXplID4gMCkNCisgIHsNCisgICAgaWYgKF9jb252ZXJ0ZWRQb3NCZWdpbiAhPSBfY29udmVydGVkUG9zRW5kKQ0KKyAgICB7DQorICAgICAgVUludDMyIHNpemVUZW1wID0gTXlNaW4oc2l6ZSwgX2NvbnZlcnRlZFBvc0VuZCAtIF9jb252ZXJ0ZWRQb3NCZWdpbik7DQorICAgICAgbWVtY3B5KGRhdGEsIF9idWZmZXIgKyBfY29udmVydGVkUG9zQmVnaW4sIHNpemVUZW1wKTsNCisgICAgICBfY29udmVydGVkUG9zQmVnaW4gKz0gc2l6ZVRlbXA7DQorICAgICAgZGF0YSA9ICh2b2lkICopKChCeXRlICopZGF0YSArIHNpemVUZW1wKTsNCisgICAgICBzaXplIC09IHNpemVUZW1wOw0KKyAgICAgIGlmIChwcm9jZXNzZWRTaXplICE9IE5VTEwpDQorICAgICAgICAqcHJvY2Vzc2VkU2l6ZSArPSBzaXplVGVtcDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBVSW50MzIgaTsNCisgICAgZm9yIChpID0gMDsgX2NvbnZlcnRlZFBvc0VuZCArIGkgPCBfYnVmZmVyUG9zOyBpKyspDQorICAgICAgX2J1ZmZlcltpXSA9IF9idWZmZXJbX2NvbnZlcnRlZFBvc0VuZCArIGldOw0KKyAgICBfYnVmZmVyUG9zID0gaTsNCisgICAgX2NvbnZlcnRlZFBvc0JlZ2luID0gX2NvbnZlcnRlZFBvc0VuZCA9IDA7DQorICAgIHNpemVfdCBwcm9jZXNzZWRTaXplVGVtcCA9IGtCdWZmZXJTaXplIC0gX2J1ZmZlclBvczsNCisgICAgUklOT0soUmVhZFN0cmVhbShfaW5TdHJlYW0sIF9idWZmZXIgKyBfYnVmZmVyUG9zLCAmcHJvY2Vzc2VkU2l6ZVRlbXApKTsNCisgICAgX2J1ZmZlclBvcyArPSAoVUludDMyKXByb2Nlc3NlZFNpemVUZW1wOw0KKyAgICBfY29udmVydGVkUG9zRW5kID0gRmlsdGVyLT5GaWx0ZXIoX2J1ZmZlciwgX2J1ZmZlclBvcyk7DQorICAgIGlmIChfY29udmVydGVkUG9zRW5kID09IDApDQorICAgIHsNCisgICAgICBpZiAoX2J1ZmZlclBvcyA9PSAwKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgX2NvbnZlcnRlZFBvc0VuZCA9IF9idWZmZXJQb3M7IC8vIGNoZWNrIGl0DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKF9jb252ZXJ0ZWRQb3NFbmQgPiBfYnVmZmVyUG9zKQ0KKyAgICB7DQorICAgICAgZm9yICg7IF9idWZmZXJQb3MgPCBfY29udmVydGVkUG9zRW5kOyBfYnVmZmVyUG9zKyspDQorICAgICAgICBfYnVmZmVyW19idWZmZXJQb3NdID0gMDsNCisgICAgICBfY29udmVydGVkUG9zRW5kID0gRmlsdGVyLT5GaWx0ZXIoX2J1ZmZlciwgX2J1ZmZlclBvcyk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCisjaWZuZGVmIF9OT19DUllQVE8NCisNCitTVERNRVRIT0RJTVAgQ0ZpbHRlckNvZGVyOjpDcnlwdG9TZXRQYXNzd29yZChjb25zdCBCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSkNCit7DQorICByZXR1cm4gX3NldFBhc3N3b3JkLT5DcnlwdG9TZXRQYXNzd29yZChkYXRhLCBzaXplKTsNCit9DQorDQorU1RETUVUSE9ESU1QIENGaWx0ZXJDb2Rlcjo6U2V0S2V5KGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKQ0KK3sNCisgIHJldHVybiBfY3J5cHRvUHJvcGVydGllcy0+U2V0S2V5KGRhdGEsIHNpemUpOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0ZpbHRlckNvZGVyOjpTZXRJbml0VmVjdG9yKGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKQ0KK3sNCisgIHJldHVybiBfY3J5cHRvUHJvcGVydGllcy0+U2V0SW5pdFZlY3RvcihkYXRhLCBzaXplKTsNCit9DQorDQorI2VuZGlmDQorDQorI2lmbmRlZiBFWFRSQUNUX09OTFkNCitTVERNRVRIT0RJTVAgQ0ZpbHRlckNvZGVyOjpTZXRDb2RlclByb3BlcnRpZXMoY29uc3QgUFJPUElEICpwcm9wSURzLA0KKyAgICAgIGNvbnN0IFBST1BWQVJJQU5UICpwcm9wZXJ0aWVzLCBVSW50MzIgbnVtUHJvcGVydGllcykNCit7DQorICByZXR1cm4gX1NldENvZGVyUHJvcGVydGllcy0+U2V0Q29kZXJQcm9wZXJ0aWVzKHByb3BJRHMsIHByb3BlcnRpZXMsIG51bVByb3BlcnRpZXMpOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0ZpbHRlckNvZGVyOjpXcml0ZUNvZGVyUHJvcGVydGllcyhJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtKQ0KK3sNCisgIHJldHVybiBfd3JpdGVDb2RlclByb3BlcnRpZXMtPldyaXRlQ29kZXJQcm9wZXJ0aWVzKG91dFN0cmVhbSk7DQorfQ0KKw0KKy8qDQorU1RETUVUSE9ESU1QIENGaWx0ZXJDb2Rlcjo6UmVzZXRTYWx0KCkNCit7DQorICByZXR1cm4gX0NyeXB0b1Jlc2V0U2FsdC0+UmVzZXRTYWx0KCk7DQorfQ0KKyovDQorDQorU1RETUVUSE9ESU1QIENGaWx0ZXJDb2Rlcjo6UmVzZXRJbml0VmVjdG9yKCkNCit7DQorICByZXR1cm4gX0NyeXB0b1Jlc2V0SW5pdFZlY3Rvci0+UmVzZXRJbml0VmVjdG9yKCk7DQorfQ0KKyNlbmRpZg0KKw0KK1NURE1FVEhPRElNUCBDRmlsdGVyQ29kZXI6OlNldERlY29kZXJQcm9wZXJ0aWVzMihjb25zdCBCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSkNCit7DQorICByZXR1cm4gX3NldERlY29kZXJQcm9wZXJ0aWVzLT5TZXREZWNvZGVyUHJvcGVydGllczIoZGF0YSwgc2l6ZSk7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0ZpbHRlckNvZGVyLmggYi9sem1hL0NQUC83emlwL0NvbW1vbi9GaWx0ZXJDb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZTg3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9GaWx0ZXJDb2Rlci5oCkBAIC0wLDAgKzEsMTQyIEBACisvLyBGaWx0ZXJDb2Rlci5oDQorDQorI2lmbmRlZiBfX0ZJTFRFUl9DT0RFUl9IDQorI2RlZmluZSBfX0ZJTFRFUl9DT0RFUl9IDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKyNpbmNsdWRlICIuLi9JQ29kZXIuaCINCisjaW5jbHVkZSAiLi4vSVBhc3N3b3JkLmgiDQorDQorI2RlZmluZSBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWV9BRyhpLCBzdWIwLCBzdWIpIGVsc2UgaWYgKGlpZCA9PSBJSURfICMjIGkpIFwNCisgIHsgaWYgKCFzdWIpIFJJTk9LKHN1YjAtPlF1ZXJ5SW50ZXJmYWNlKElJRF8gIyMgaSwgKHZvaWQgKiopJnN1YikpIFwNCisgICAgKm91dE9iamVjdCA9ICh2b2lkICopKGkgKil0aGlzOyB9DQorDQorY2xhc3MgQ0ZpbHRlckNvZGVyOg0KKyAgcHVibGljIElDb21wcmVzc0NvZGVyLA0KKyAgcHVibGljIElDb21wcmVzc1NldEluU3RyZWFtLA0KKyAgcHVibGljIElTZXF1ZW50aWFsSW5TdHJlYW0sDQorICBwdWJsaWMgSUNvbXByZXNzU2V0T3V0U3RyZWFtLA0KKyAgcHVibGljIElTZXF1ZW50aWFsT3V0U3RyZWFtLA0KKyAgcHVibGljIElPdXRTdHJlYW1GbHVzaCwNCisNCisgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgcHVibGljIElDcnlwdG9TZXRQYXNzd29yZCwNCisgIHB1YmxpYyBJQ3J5cHRvUHJvcGVydGllcywNCisgICNlbmRpZg0KKyAgI2lmbmRlZiBFWFRSQUNUX09OTFkNCisgIHB1YmxpYyBJQ29tcHJlc3NTZXRDb2RlclByb3BlcnRpZXMsDQorICBwdWJsaWMgSUNvbXByZXNzV3JpdGVDb2RlclByb3BlcnRpZXMsDQorICAvLyBwdWJsaWMgSUNyeXB0b1Jlc2V0U2FsdCwNCisgIHB1YmxpYyBJQ3J5cHRvUmVzZXRJbml0VmVjdG9yLA0KKyAgI2VuZGlmDQorICBwdWJsaWMgSUNvbXByZXNzU2V0RGVjb2RlclByb3BlcnRpZXMyLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorcHJvdGVjdGVkOg0KKyAgQnl0ZSAqX2J1ZmZlcjsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbEluU3RyZWFtPiBfaW5TdHJlYW07DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IF9vdXRTdHJlYW07DQorICBVSW50MzIgX2J1ZmZlclBvczsNCisgIFVJbnQzMiBfY29udmVydGVkUG9zQmVnaW47DQorICBVSW50MzIgX2NvbnZlcnRlZFBvc0VuZDsNCisgIGJvb2wgX291dFNpemVJc0RlZmluZWQ7DQorICBVSW50NjQgX291dFNpemU7DQorICBVSW50NjQgX25vd1BvczY0Ow0KKw0KKyAgdm9pZCBJbml0MigpDQorICB7DQorICAgIF9ub3dQb3M2NCA9IDA7DQorICAgIF9vdXRTaXplSXNEZWZpbmVkID0gZmFsc2U7DQorICB9DQorDQorICBIUkVTVUxUIEluaXQoKQ0KKyAgew0KKyAgICBJbml0MigpOw0KKyAgICByZXR1cm4gRmlsdGVyLT5Jbml0KCk7DQorICB9DQorDQorICBDTXlDb21QdHI8SUNyeXB0b1NldFBhc3N3b3JkPiBfc2V0UGFzc3dvcmQ7DQorICBDTXlDb21QdHI8SUNyeXB0b1Byb3BlcnRpZXM+IF9jcnlwdG9Qcm9wZXJ0aWVzOw0KKyAgI2lmbmRlZiBFWFRSQUNUX09OTFkNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NTZXRDb2RlclByb3BlcnRpZXM+IF9TZXRDb2RlclByb3BlcnRpZXM7DQorICBDTXlDb21QdHI8SUNvbXByZXNzV3JpdGVDb2RlclByb3BlcnRpZXM+IF93cml0ZUNvZGVyUHJvcGVydGllczsNCisgIC8vIENNeUNvbVB0cjxJQ3J5cHRvUmVzZXRTYWx0PiBfQ3J5cHRvUmVzZXRTYWx0Ow0KKyAgQ015Q29tUHRyPElDcnlwdG9SZXNldEluaXRWZWN0b3I+IF9DcnlwdG9SZXNldEluaXRWZWN0b3I7DQorICAjZW5kaWYNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NTZXREZWNvZGVyUHJvcGVydGllczI+IF9zZXREZWNvZGVyUHJvcGVydGllczsNCitwdWJsaWM6DQorICBDTXlDb21QdHI8SUNvbXByZXNzRmlsdGVyPiBGaWx0ZXI7DQorDQorICBDRmlsdGVyQ29kZXIoKTsNCisgIH5DRmlsdGVyQ29kZXIoKTsNCisgIEhSRVNVTFQgV3JpdGVXaXRoTGltaXQoSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSwgVUludDMyIHNpemUpOw0KKw0KK3B1YmxpYzoNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0JFR0lOMihJQ29tcHJlc3NDb2RlcikNCisgICAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoSUNvbXByZXNzU2V0SW5TdHJlYW0pDQorICAgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKElTZXF1ZW50aWFsSW5TdHJlYW0pDQorICAgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKElDb21wcmVzc1NldE91dFN0cmVhbSkNCisgICAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoSVNlcXVlbnRpYWxPdXRTdHJlYW0pDQorICAgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKElPdXRTdHJlYW1GbHVzaCkNCisNCisgICAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICAgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZX0FHKElDcnlwdG9TZXRQYXNzd29yZCwgRmlsdGVyLCBfc2V0UGFzc3dvcmQpDQorICAgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZX0FHKElDcnlwdG9Qcm9wZXJ0aWVzLCBGaWx0ZXIsIF9jcnlwdG9Qcm9wZXJ0aWVzKQ0KKyAgICAjZW5kaWYNCisNCisgICAgI2lmbmRlZiBFWFRSQUNUX09OTFkNCisgICAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUllfQUcoSUNvbXByZXNzU2V0Q29kZXJQcm9wZXJ0aWVzLCBGaWx0ZXIsIF9TZXRDb2RlclByb3BlcnRpZXMpDQorICAgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZX0FHKElDb21wcmVzc1dyaXRlQ29kZXJQcm9wZXJ0aWVzLCBGaWx0ZXIsIF93cml0ZUNvZGVyUHJvcGVydGllcykNCisgICAgLy8gTVlfUVVFUllJTlRFUkZBQ0VfRU5UUllfQUcoSUNyeXB0b1Jlc2V0U2FsdCwgRmlsdGVyLCBfQ3J5cHRvUmVzZXRTYWx0KQ0KKyAgICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWV9BRyhJQ3J5cHRvUmVzZXRJbml0VmVjdG9yLCBGaWx0ZXIsIF9DcnlwdG9SZXNldEluaXRWZWN0b3IpDQorICAgICNlbmRpZg0KKw0KKyAgICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWV9BRyhJQ29tcHJlc3NTZXREZWNvZGVyUHJvcGVydGllczIsIEZpbHRlciwgX3NldERlY29kZXJQcm9wZXJ0aWVzKQ0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5EDQorICBNWV9BRERSRUZfUkVMRUFTRQ0KKyAgU1RETUVUSE9EKENvZGUpKElTZXF1ZW50aWFsSW5TdHJlYW0gKmluU3RyZWFtLCBJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtLA0KKyAgICAgIGNvbnN0IFVJbnQ2NCAqaW5TaXplLCBjb25zdCBVSW50NjQgKm91dFNpemUsIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpOw0KKyAgU1RETUVUSE9EKFJlbGVhc2VJblN0cmVhbSkoKTsNCisgIFNURE1FVEhPRChTZXRJblN0cmVhbSkoSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0pOw0KKyAgU1RETUVUSE9EKFJlYWQpKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOyBcDQorICBTVERNRVRIT0QoU2V0T3V0U3RyZWFtKShJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtKTsNCisgIFNURE1FVEhPRChSZWxlYXNlT3V0U3RyZWFtKSgpOw0KKyAgU1RETUVUSE9EKFdyaXRlKShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCisgIFNURE1FVEhPRChGbHVzaCkoKTsNCisNCisgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgU1RETUVUSE9EKENyeXB0b1NldFBhc3N3b3JkKShjb25zdCBCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSk7DQorDQorICBTVERNRVRIT0QoU2V0S2V5KShjb25zdCBCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSk7DQorICBTVERNRVRIT0QoU2V0SW5pdFZlY3RvcikoY29uc3QgQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpOw0KKyAgI2VuZGlmDQorICAjaWZuZGVmIEVYVFJBQ1RfT05MWQ0KKyAgU1RETUVUSE9EKFNldENvZGVyUHJvcGVydGllcykoY29uc3QgUFJPUElEICpwcm9wSURzLA0KKyAgICAgIGNvbnN0IFBST1BWQVJJQU5UICpwcm9wZXJ0aWVzLCBVSW50MzIgbnVtUHJvcGVydGllcyk7DQorICBTVERNRVRIT0QoV3JpdGVDb2RlclByb3BlcnRpZXMpKElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0pOw0KKyAgLy8gU1RETUVUSE9EKFJlc2V0U2FsdCkoKTsNCisgIFNURE1FVEhPRChSZXNldEluaXRWZWN0b3IpKCk7DQorICAjZW5kaWYNCisgIFNURE1FVEhPRChTZXREZWNvZGVyUHJvcGVydGllczIpKGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsNCisNCisgIHZvaWQgU2V0SW5TdHJlYW1fTm9TdWJGaWx0ZXJJbml0KElTZXF1ZW50aWFsSW5TdHJlYW0gKmluU3RyZWFtKTsNCisNCit9Ow0KKw0KK2NsYXNzIENJblN0cmVhbVJlbGVhc2VyDQorew0KK3B1YmxpYzoNCisgIENGaWx0ZXJDb2RlciAqRmlsdGVyQ29kZXI7DQorICBDSW5TdHJlYW1SZWxlYXNlcigpOiBGaWx0ZXJDb2RlcigwKSB7fQ0KKyAgfkNJblN0cmVhbVJlbGVhc2VyKCkgeyBpZiAoRmlsdGVyQ29kZXIpIEZpbHRlckNvZGVyLT5SZWxlYXNlSW5TdHJlYW0oKTsgfQ0KK307DQorDQorY2xhc3MgQ091dFN0cmVhbVJlbGVhc2VyDQorew0KK3B1YmxpYzoNCisgIENGaWx0ZXJDb2RlciAqRmlsdGVyQ29kZXI7DQorICBDT3V0U3RyZWFtUmVsZWFzZXIoKTogRmlsdGVyQ29kZXIoMCkge30NCisgIH5DT3V0U3RyZWFtUmVsZWFzZXIoKSB7IGlmIChGaWx0ZXJDb2RlcikgRmlsdGVyQ29kZXItPlJlbGVhc2VPdXRTdHJlYW0oKTsgfQ0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vSW5CdWZmZXIuY3BwIGIvbHptYS9DUFAvN3ppcC9Db21tb24vSW5CdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjVkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9JbkJ1ZmZlci5jcHAKQEAgLTAsMCArMSwxMzUgQEAKKy8vIEluQnVmZmVyLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQy9BbGxvYy5oIg0KKw0KKyNpbmNsdWRlICJJbkJ1ZmZlci5oIg0KKw0KK0NJbkJ1ZmZlckJhc2U6OkNJbkJ1ZmZlckJhc2UoKSB0aHJvdygpOg0KKyAgX2J1ZigwKSwNCisgIF9idWZMaW0oMCksDQorICBfYnVmQmFzZSgwKSwNCisgIF9zdHJlYW0oMCksDQorICBfcHJvY2Vzc2VkU2l6ZSgwKSwNCisgIF9idWZTaXplKDApLA0KKyAgX3dhc0ZpbmlzaGVkKGZhbHNlKSwNCisgIE51bUV4dHJhQnl0ZXMoMCkNCit7fQ0KKw0KK2Jvb2wgQ0luQnVmZmVyOjpDcmVhdGUoc2l6ZV90IGJ1ZlNpemUpIHRocm93KCkNCit7DQorICBjb25zdCB1bnNpZ25lZCBrTWluQmxvY2tTaXplID0gMTsNCisgIGlmIChidWZTaXplIDwga01pbkJsb2NrU2l6ZSkNCisgICAgYnVmU2l6ZSA9IGtNaW5CbG9ja1NpemU7DQorICBpZiAoX2J1ZkJhc2UgIT0gMCAmJiBfYnVmU2l6ZSA9PSBidWZTaXplKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIEZyZWUoKTsNCisgIF9idWZTaXplID0gYnVmU2l6ZTsNCisgIF9idWZCYXNlID0gKEJ5dGUgKik6Ok1pZEFsbG9jKGJ1ZlNpemUpOw0KKyAgcmV0dXJuIChfYnVmQmFzZSAhPSAwKTsNCit9DQorDQordm9pZCBDSW5CdWZmZXI6OkZyZWUoKSB0aHJvdygpDQorew0KKyAgOjpNaWRGcmVlKF9idWZCYXNlKTsNCisgIF9idWZCYXNlID0gMDsNCit9DQorDQordm9pZCBDSW5CdWZmZXJCYXNlOjpJbml0KCkgdGhyb3coKQ0KK3sNCisgIF9wcm9jZXNzZWRTaXplID0gMDsNCisgIF9idWYgPSBfYnVmQmFzZTsNCisgIF9idWZMaW0gPSBfYnVmOw0KKyAgX3dhc0ZpbmlzaGVkID0gZmFsc2U7DQorICAjaWZkZWYgX05PX0VYQ0VQVElPTlMNCisgIEVycm9yQ29kZSA9IFNfT0s7DQorICAjZW5kaWYNCisgIE51bUV4dHJhQnl0ZXMgPSAwOw0KK30NCisNCitib29sIENJbkJ1ZmZlckJhc2U6OlJlYWRCbG9jaygpDQorew0KKyAgI2lmZGVmIF9OT19FWENFUFRJT05TDQorICBpZiAoRXJyb3JDb2RlICE9IFNfT0spDQorICAgIHJldHVybiBmYWxzZTsNCisgICNlbmRpZg0KKyAgaWYgKF93YXNGaW5pc2hlZCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgX3Byb2Nlc3NlZFNpemUgKz0gKF9idWYgLSBfYnVmQmFzZSk7DQorICBfYnVmID0gX2J1ZkJhc2U7DQorICBfYnVmTGltID0gX2J1ZkJhc2U7DQorICBVSW50MzIgcHJvY2Vzc2VkOw0KKyAgLy8gRklYX01FOiB3ZSBjYW4gaW1wcm92ZSBpdCB0byBzdXBwb3J0IChfYnVmU2l6ZSA+PSAoMSA8PCAzMikpDQorICBIUkVTVUxUIHJlc3VsdCA9IF9zdHJlYW0tPlJlYWQoX2J1ZkJhc2UsIChVSW50MzIpX2J1ZlNpemUsICZwcm9jZXNzZWQpOw0KKyAgI2lmZGVmIF9OT19FWENFUFRJT05TDQorICBFcnJvckNvZGUgPSByZXN1bHQ7DQorICAjZWxzZQ0KKyAgaWYgKHJlc3VsdCAhPSBTX09LKQ0KKyAgICB0aHJvdyBDSW5CdWZmZXJFeGNlcHRpb24ocmVzdWx0KTsNCisgICNlbmRpZg0KKyAgX2J1ZkxpbSA9IF9idWYgKyBwcm9jZXNzZWQ7DQorICBfd2FzRmluaXNoZWQgPSAocHJvY2Vzc2VkID09IDApOw0KKyAgcmV0dXJuICFfd2FzRmluaXNoZWQ7DQorfQ0KKw0KK2Jvb2wgQ0luQnVmZmVyQmFzZTo6UmVhZEJ5dGVfRnJvbU5ld0Jsb2NrKEJ5dGUgJmIpDQorew0KKyAgaWYgKCFSZWFkQmxvY2soKSkNCisgIHsNCisgICAgTnVtRXh0cmFCeXRlcysrOw0KKyAgICBiID0gMHhGRjsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKyAgYiA9ICpfYnVmKys7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorQnl0ZSBDSW5CdWZmZXJCYXNlOjpSZWFkQnl0ZV9Gcm9tTmV3QmxvY2soKQ0KK3sNCisgIGlmICghUmVhZEJsb2NrKCkpDQorICB7DQorICAgIE51bUV4dHJhQnl0ZXMrKzsNCisgICAgcmV0dXJuIDB4RkY7DQorICB9DQorICByZXR1cm4gKl9idWYrKzsNCit9DQorDQorc2l6ZV90IENJbkJ1ZmZlckJhc2U6OlJlYWRCeXRlcyhCeXRlICpidWYsIHNpemVfdCBzaXplKQ0KK3sNCisgIGlmICgoc2l6ZV90KShfYnVmTGltIC0gX2J1ZikgPj0gc2l6ZSkNCisgIHsNCisgICAgY29uc3QgQnl0ZSAqc3JjID0gX2J1ZjsNCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspDQorICAgICAgYnVmW2ldID0gc3JjW2ldOw0KKyAgICBfYnVmICs9IHNpemU7DQorICAgIHJldHVybiBzaXplOw0KKyAgfQ0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspDQorICB7DQorICAgIGlmIChfYnVmID49IF9idWZMaW0pDQorICAgICAgaWYgKCFSZWFkQmxvY2soKSkNCisgICAgICAgIHJldHVybiBpOw0KKyAgICBidWZbaV0gPSAqX2J1ZisrOw0KKyAgfQ0KKyAgcmV0dXJuIHNpemU7DQorfQ0KKw0KK3NpemVfdCBDSW5CdWZmZXJCYXNlOjpTa2lwKHNpemVfdCBzaXplKQ0KK3sNCisgIHNpemVfdCBwcm9jZXNzZWQgPSAwOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgc2l6ZV90IHJlbSA9IChfYnVmTGltIC0gX2J1Zik7DQorICAgIGlmIChyZW0gPj0gc2l6ZSkNCisgICAgew0KKyAgICAgIF9idWYgKz0gc2l6ZTsNCisgICAgICByZXR1cm4gcHJvY2Vzc2VkICsgc2l6ZTsNCisgICAgfQ0KKyAgICBfYnVmICs9IHJlbTsNCisgICAgcHJvY2Vzc2VkICs9IHJlbTsNCisgICAgc2l6ZSAtPSByZW07DQorICAgIGlmICghUmVhZEJsb2NrKCkpDQorICAgICAgcmV0dXJuIHByb2Nlc3NlZDsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vSW5CdWZmZXIuaCBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0luQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1M2IzNwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0luQnVmZmVyLmgKQEAgLTAsMCArMSw5MCBAQAorLy8gSW5CdWZmZXIuaA0KKw0KKyNpZm5kZWYgX19JTl9CVUZGRVJfSA0KKyNkZWZpbmUgX19JTl9CVUZGRVJfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlFeGNlcHRpb24uaCINCisjaW5jbHVkZSAiLi4vSVN0cmVhbS5oIg0KKw0KKyNpZm5kZWYgX05PX0VYQ0VQVElPTlMNCitzdHJ1Y3QgQ0luQnVmZmVyRXhjZXB0aW9uOiBwdWJsaWMgQ1N5c3RlbUV4Y2VwdGlvbg0KK3sNCisgIENJbkJ1ZmZlckV4Y2VwdGlvbihIUkVTVUxUIGVycm9yQ29kZSk6IENTeXN0ZW1FeGNlcHRpb24oZXJyb3JDb2RlKSB7fQ0KK307DQorI2VuZGlmDQorDQorY2xhc3MgQ0luQnVmZmVyQmFzZQ0KK3sNCitwcm90ZWN0ZWQ6DQorICBCeXRlICpfYnVmOw0KKyAgQnl0ZSAqX2J1ZkxpbTsNCisgIEJ5dGUgKl9idWZCYXNlOw0KKw0KKyAgSVNlcXVlbnRpYWxJblN0cmVhbSAqX3N0cmVhbTsNCisgIFVJbnQ2NCBfcHJvY2Vzc2VkU2l6ZTsNCisgIHNpemVfdCBfYnVmU2l6ZTsgLy8gYWN0dWFsbHkgaXQncyBudW1iZXIgb2YgQnl0ZXMgZm9yIG5leHQgcmVhZC4gVGhlIGJ1ZiBjYW4gYmUgbGFyZ2VyDQorICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdXAgdG8gMzItYml0cyB2YWx1ZXMgbm93IGFyZSBzdXBwb3J0ZWQhDQorICBib29sIF93YXNGaW5pc2hlZDsNCisNCisgIGJvb2wgUmVhZEJsb2NrKCk7DQorICBib29sIFJlYWRCeXRlX0Zyb21OZXdCbG9jayhCeXRlICZiKTsNCisgIEJ5dGUgUmVhZEJ5dGVfRnJvbU5ld0Jsb2NrKCk7DQorDQorcHVibGljOg0KKyAgI2lmZGVmIF9OT19FWENFUFRJT05TDQorICBIUkVTVUxUIEVycm9yQ29kZTsNCisgICNlbmRpZg0KKyAgVUludDMyIE51bUV4dHJhQnl0ZXM7DQorDQorICBDSW5CdWZmZXJCYXNlKCkgdGhyb3coKTsNCisNCisgIFVJbnQ2NCBHZXRTdHJlYW1TaXplKCkgY29uc3QgeyByZXR1cm4gX3Byb2Nlc3NlZFNpemUgKyAoX2J1ZiAtIF9idWZCYXNlKTsgfQ0KKyAgVUludDY0IEdldFByb2Nlc3NlZFNpemUoKSBjb25zdCB7IHJldHVybiBfcHJvY2Vzc2VkU2l6ZSArIE51bUV4dHJhQnl0ZXMgKyAoX2J1ZiAtIF9idWZCYXNlKTsgfQ0KKyAgYm9vbCBXYXNGaW5pc2hlZCgpIGNvbnN0IHsgcmV0dXJuIF93YXNGaW5pc2hlZDsgfQ0KKw0KKyAgdm9pZCBTZXRTdHJlYW0oSVNlcXVlbnRpYWxJblN0cmVhbSAqc3RyZWFtKSB7IF9zdHJlYW0gPSBzdHJlYW07IH0NCisgIA0KKyAgdm9pZCBTZXRCdWYoQnl0ZSAqYnVmLCBzaXplX3QgYnVmU2l6ZSwgc2l6ZV90IGVuZCwgc2l6ZV90IHBvcykNCisgIHsNCisgICAgX2J1ZkJhc2UgPSBidWY7DQorICAgIF9idWZTaXplID0gYnVmU2l6ZTsNCisgICAgX3Byb2Nlc3NlZFNpemUgPSAwOw0KKyAgICBfYnVmID0gYnVmICsgcG9zOw0KKyAgICBfYnVmTGltID0gYnVmICsgZW5kOw0KKyAgICBfd2FzRmluaXNoZWQgPSBmYWxzZTsNCisgICAgI2lmZGVmIF9OT19FWENFUFRJT05TDQorICAgIEVycm9yQ29kZSA9IFNfT0s7DQorICAgICNlbmRpZg0KKyAgICBOdW1FeHRyYUJ5dGVzID0gMDsNCisgIH0NCisNCisgIHZvaWQgSW5pdCgpIHRocm93KCk7DQorDQorICBib29sIFJlYWRCeXRlKEJ5dGUgJmIpDQorICB7DQorICAgIGlmIChfYnVmID49IF9idWZMaW0pDQorICAgICAgcmV0dXJuIFJlYWRCeXRlX0Zyb21OZXdCbG9jayhiKTsNCisgICAgYiA9ICpfYnVmKys7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgDQorICBCeXRlIFJlYWRCeXRlKCkNCisgIHsNCisgICAgaWYgKF9idWYgPj0gX2J1ZkxpbSkNCisgICAgICByZXR1cm4gUmVhZEJ5dGVfRnJvbU5ld0Jsb2NrKCk7DQorICAgIHJldHVybiAqX2J1ZisrOw0KKyAgfQ0KKyAgDQorICBzaXplX3QgUmVhZEJ5dGVzKEJ5dGUgKmJ1Ziwgc2l6ZV90IHNpemUpOw0KKyAgc2l6ZV90IFNraXAoc2l6ZV90IHNpemUpOw0KK307DQorDQorY2xhc3MgQ0luQnVmZmVyOiBwdWJsaWMgQ0luQnVmZmVyQmFzZQ0KK3sNCitwdWJsaWM6DQorICB+Q0luQnVmZmVyKCkgeyBGcmVlKCk7IH0NCisgIGJvb2wgQ3JlYXRlKHNpemVfdCBidWZTaXplKSB0aHJvdygpOyAvLyBvbmx5IHVwIHRvIDMyLWJpdHMgdmFsdWVzIG5vdyBhcmUgc3VwcG9ydGVkIQ0KKyAgdm9pZCBGcmVlKCkgdGhyb3coKTsNCit9Ow0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0luT3V0VGVtcEJ1ZmZlci5jcHAgYi9sem1hL0NQUC83emlwL0NvbW1vbi9Jbk91dFRlbXBCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MWQwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9Jbk91dFRlbXBCdWZmZXIuY3BwCkBAIC0wLDAgKzEsMTE5IEBACisvLyBJbk91dFRlbXBCdWZmZXIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DLzd6Q3JjLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9EZWZzLmgiDQorDQorI2luY2x1ZGUgIkluT3V0VGVtcEJ1ZmZlci5oIg0KKyNpbmNsdWRlICJTdHJlYW1VdGlscy5oIg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCit1c2luZyBuYW1lc3BhY2UgTkZpbGU7DQordXNpbmcgbmFtZXNwYWNlIE5EaXI7DQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrVGVtcEJ1ZlNpemUgPSAoMSA8PCAyMCk7DQorDQorc3RhdGljIENGU1RSIGtUZW1wRmlsZVByZWZpeFN0cmluZyA9IEZURVhUKCI3enQiKTsNCisNCitDSW5PdXRUZW1wQnVmZmVyOjpDSW5PdXRUZW1wQnVmZmVyKCk6IF9idWYoTlVMTCkgeyB9DQorDQordm9pZCBDSW5PdXRUZW1wQnVmZmVyOjpDcmVhdGUoKQ0KK3sNCisgIGlmICghX2J1ZikNCisgICAgX2J1ZiA9IG5ldyBCeXRlW2tUZW1wQnVmU2l6ZV07DQorfQ0KKw0KK0NJbk91dFRlbXBCdWZmZXI6On5DSW5PdXRUZW1wQnVmZmVyKCkNCit7DQorICBkZWxldGUgW11fYnVmOw0KK30NCisNCit2b2lkIENJbk91dFRlbXBCdWZmZXI6OkluaXRXcml0aW5nKCkNCit7DQorICBfYnVmUG9zID0gMDsNCisgIF90ZW1wRmlsZUNyZWF0ZWQgPSBmYWxzZTsNCisgIF9zaXplID0gMDsNCisgIF9jcmMgPSBDUkNfSU5JVF9WQUw7DQorfQ0KKw0KK2Jvb2wgQ0luT3V0VGVtcEJ1ZmZlcjo6V3JpdGVUb0ZpbGUoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUpDQorew0KKyAgaWYgKHNpemUgPT0gMCkNCisgICAgcmV0dXJuIHRydWU7DQorICBpZiAoIV90ZW1wRmlsZUNyZWF0ZWQpDQorICB7DQorICAgIGlmICghX3RlbXBGaWxlLkNyZWF0ZVJhbmRvbUluVGVtcEZvbGRlcihrVGVtcEZpbGVQcmVmaXhTdHJpbmcsICZfb3V0RmlsZSkpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBfdGVtcEZpbGVDcmVhdGVkID0gdHJ1ZTsNCisgIH0NCisgIFVJbnQzMiBwcm9jZXNzZWQ7DQorICBpZiAoIV9vdXRGaWxlLldyaXRlKGRhdGEsIHNpemUsIHByb2Nlc3NlZCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIF9jcmMgPSBDcmNVcGRhdGUoX2NyYywgZGF0YSwgcHJvY2Vzc2VkKTsNCisgIF9zaXplICs9IHByb2Nlc3NlZDsNCisgIHJldHVybiAocHJvY2Vzc2VkID09IHNpemUpOw0KK30NCisNCitib29sIENJbk91dFRlbXBCdWZmZXI6OldyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplKQ0KK3sNCisgIGlmIChfYnVmUG9zIDwga1RlbXBCdWZTaXplKQ0KKyAgew0KKyAgICBVSW50MzIgY3VyID0gTXlNaW4oa1RlbXBCdWZTaXplIC0gX2J1ZlBvcywgc2l6ZSk7DQorICAgIG1lbWNweShfYnVmICsgX2J1ZlBvcywgZGF0YSwgY3VyKTsNCisgICAgX2NyYyA9IENyY1VwZGF0ZShfY3JjLCBkYXRhLCBjdXIpOw0KKyAgICBfYnVmUG9zICs9IGN1cjsNCisgICAgc2l6ZSAtPSBjdXI7DQorICAgIGRhdGEgPSAoKGNvbnN0IEJ5dGUgKilkYXRhKSArIGN1cjsNCisgICAgX3NpemUgKz0gY3VyOw0KKyAgfQ0KKyAgcmV0dXJuIFdyaXRlVG9GaWxlKGRhdGEsIHNpemUpOw0KK30NCisNCitIUkVTVUxUIENJbk91dFRlbXBCdWZmZXI6OldyaXRlVG9TdHJlYW0oSVNlcXVlbnRpYWxPdXRTdHJlYW0gKnN0cmVhbSkNCit7DQorICBpZiAoIV9vdXRGaWxlLkNsb3NlKCkpDQorICAgIHJldHVybiBFX0ZBSUw7DQorDQorICBVSW50NjQgc2l6ZSA9IDA7DQorICBVSW50MzIgY3JjID0gQ1JDX0lOSVRfVkFMOw0KKw0KKyAgaWYgKF9idWZQb3MgPiAwKQ0KKyAgew0KKyAgICBSSU5PSyhXcml0ZVN0cmVhbShzdHJlYW0sIF9idWYsIF9idWZQb3MpKTsNCisgICAgY3JjID0gQ3JjVXBkYXRlKGNyYywgX2J1ZiwgX2J1ZlBvcyk7DQorICAgIHNpemUgKz0gX2J1ZlBvczsNCisgIH0NCisgIGlmIChfdGVtcEZpbGVDcmVhdGVkKQ0KKyAgew0KKyAgICBOSU86OkNJbkZpbGUgaW5GaWxlOw0KKyAgICBpZiAoIWluRmlsZS5PcGVuKF90ZW1wRmlsZS5HZXRQYXRoKCkpKQ0KKyAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgIHdoaWxlIChzaXplIDwgX3NpemUpDQorICAgIHsNCisgICAgICBVSW50MzIgcHJvY2Vzc2VkOw0KKyAgICAgIGlmICghaW5GaWxlLlJlYWRQYXJ0KF9idWYsIGtUZW1wQnVmU2l6ZSwgcHJvY2Vzc2VkKSkNCisgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgaWYgKHByb2Nlc3NlZCA9PSAwKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgUklOT0soV3JpdGVTdHJlYW0oc3RyZWFtLCBfYnVmLCBwcm9jZXNzZWQpKTsNCisgICAgICBjcmMgPSBDcmNVcGRhdGUoY3JjLCBfYnVmLCBwcm9jZXNzZWQpOw0KKyAgICAgIHNpemUgKz0gcHJvY2Vzc2VkOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gKF9jcmMgPT0gY3JjICYmIHNpemUgPT0gX3NpemUpID8gU19PSyA6IEVfRkFJTDsNCit9DQorDQorU1RETUVUSE9ESU1QIENTZXF1ZW50aWFsT3V0VGVtcEJ1ZmZlckltcDo6V3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkKQ0KK3sNCisgIGlmICghX2J1Zi0+V3JpdGUoZGF0YSwgc2l6ZSkpDQorICB7DQorICAgIGlmIChwcm9jZXNzZWQgIT0gTlVMTCkNCisgICAgICAqcHJvY2Vzc2VkID0gMDsNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIH0NCisgIGlmIChwcm9jZXNzZWQgIT0gTlVMTCkNCisgICAgKnByb2Nlc3NlZCA9IHNpemU7DQorICByZXR1cm4gU19PSzsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vSW5PdXRUZW1wQnVmZmVyLmggYi9sem1hL0NQUC83emlwL0NvbW1vbi9Jbk91dFRlbXBCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBlNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21tb24vSW5PdXRUZW1wQnVmZmVyLmgKQEAgLTAsMCArMSw0NiBAQAorLy8gSW5PdXRUZW1wQnVmZmVyLmgNCisNCisjaWZuZGVmIF9fSU5fT1VUX1RFTVBfQlVGRkVSX0gNCisjZGVmaW5lIF9fSU5fT1VUX1RFTVBfQlVGRkVSX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL015Q29tLmgiDQorI2luY2x1ZGUgIi4uLy4uL1dpbmRvd3MvRmlsZURpci5oIg0KKw0KKyNpbmNsdWRlICIuLi9JU3RyZWFtLmgiDQorDQorY2xhc3MgQ0luT3V0VGVtcEJ1ZmZlcg0KK3sNCisgIE5XaW5kb3dzOjpORmlsZTo6TkRpcjo6Q1RlbXBGaWxlIF90ZW1wRmlsZTsNCisgIE5XaW5kb3dzOjpORmlsZTo6TklPOjpDT3V0RmlsZSBfb3V0RmlsZTsNCisgIEJ5dGUgKl9idWY7DQorICBVSW50MzIgX2J1ZlBvczsNCisgIGJvb2wgX3RlbXBGaWxlQ3JlYXRlZDsNCisgIFVJbnQ2NCBfc2l6ZTsNCisgIFVJbnQzMiBfY3JjOw0KKw0KKyAgYm9vbCBXcml0ZVRvRmlsZShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSk7DQorcHVibGljOg0KKyAgQ0luT3V0VGVtcEJ1ZmZlcigpOw0KKyAgfkNJbk91dFRlbXBCdWZmZXIoKTsNCisgIHZvaWQgQ3JlYXRlKCk7DQorDQorICB2b2lkIEluaXRXcml0aW5nKCk7DQorICBib29sIFdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplKTsNCisNCisgIEhSRVNVTFQgV3JpdGVUb1N0cmVhbShJU2VxdWVudGlhbE91dFN0cmVhbSAqc3RyZWFtKTsNCisgIFVJbnQ2NCBHZXREYXRhU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9zaXplOyB9DQorfTsNCisNCitjbGFzcyBDU2VxdWVudGlhbE91dFRlbXBCdWZmZXJJbXA6DQorICBwdWJsaWMgSVNlcXVlbnRpYWxPdXRTdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIENJbk91dFRlbXBCdWZmZXIgKl9idWY7DQorcHVibGljOg0KKyAgdm9pZCBJbml0KENJbk91dFRlbXBCdWZmZXIgKmJ1ZmZlcikgIHsgX2J1ZiA9IGJ1ZmZlcjsgfQ0KKyAgTVlfVU5LTk9XTl9JTVANCisNCisgIFNURE1FVEhPRChXcml0ZSkoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9MaW1pdGVkU3RyZWFtcy5jcHAgYi9sem1hL0NQUC83emlwL0NvbW1vbi9MaW1pdGVkU3RyZWFtcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc0Y2FjMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0xpbWl0ZWRTdHJlYW1zLmNwcApAQCAtMCwwICsxLDM0OSBAQAorLy8gTGltaXRlZFN0cmVhbXMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJMaW1pdGVkU3RyZWFtcy5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vRGVmcy5oIg0KKw0KK1NURE1FVEhPRElNUCBDTGltaXRlZFNlcXVlbnRpYWxJblN0cmVhbTo6UmVhZCh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIFVJbnQzMiByZWFsUHJvY2Vzc2VkU2l6ZSA9IDA7DQorICBVSW50MzIgc2l6ZVRvUmVhZCA9IChVSW50MzIpTXlNaW4oKF9zaXplIC0gX3BvcyksIChVSW50NjQpc2l6ZSk7DQorICBIUkVTVUxUIHJlc3VsdCA9IFNfT0s7DQorICBpZiAoc2l6ZVRvUmVhZCA+IDApDQorICB7DQorICAgIHJlc3VsdCA9IF9zdHJlYW0tPlJlYWQoZGF0YSwgc2l6ZVRvUmVhZCwgJnJlYWxQcm9jZXNzZWRTaXplKTsNCisgICAgX3BvcyArPSByZWFsUHJvY2Vzc2VkU2l6ZTsNCisgICAgaWYgKHJlYWxQcm9jZXNzZWRTaXplID09IDApDQorICAgICAgX3dhc0ZpbmlzaGVkID0gdHJ1ZTsNCisgIH0NCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IHJlYWxQcm9jZXNzZWRTaXplOw0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQorDQorU1RETUVUSE9ESU1QIENMaW1pdGVkSW5TdHJlYW06OlJlYWQodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSAwOw0KKyAgaWYgKF92aXJ0UG9zID49IF9zaXplKQ0KKyAgew0KKyAgICAvLyA5LjMxOiBGaXhlZC4gV2luZG93cyBkb2Vzbid0IHJldHVybiBlcnJvciBpbiBSZWFkRmlsZSBhbmQgSVN0cmVhbS0+UmVhZCBpbiB0aGF0IGNhc2UuDQorICAgIHJldHVybiBTX09LOw0KKyAgICAvLyByZXR1cm4gKF92aXJ0UG9zID09IF9zaXplKSA/IFNfT0s6IEVfRkFJTDsgLy8gRVJST1JfSEFORExFX0VPRg0KKyAgfQ0KKyAgVUludDY0IHJlbSA9IF9zaXplIC0gX3ZpcnRQb3M7DQorICBpZiAocmVtIDwgc2l6ZSkNCisgICAgc2l6ZSA9IChVSW50MzIpcmVtOw0KKyAgVUludDY0IG5ld1BvcyA9IF9zdGFydE9mZnNldCArIF92aXJ0UG9zOw0KKyAgaWYgKG5ld1BvcyAhPSBfcGh5c1BvcykNCisgIHsNCisgICAgX3BoeXNQb3MgPSBuZXdQb3M7DQorICAgIFJJTk9LKFNlZWtUb1BoeXMoKSk7DQorICB9DQorICBIUkVTVUxUIHJlcyA9IF9zdHJlYW0tPlJlYWQoZGF0YSwgc2l6ZSwgJnNpemUpOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gc2l6ZTsNCisgIF9waHlzUG9zICs9IHNpemU7DQorICBfdmlydFBvcyArPSBzaXplOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorU1RETUVUSE9ESU1QIENMaW1pdGVkSW5TdHJlYW06OlNlZWsoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbikNCit7DQorICBzd2l0Y2ggKHNlZWtPcmlnaW4pDQorICB7DQorICAgIGNhc2UgU1RSRUFNX1NFRUtfU0VUOiBicmVhazsNCisgICAgY2FzZSBTVFJFQU1fU0VFS19DVVI6IG9mZnNldCArPSBfdmlydFBvczsgYnJlYWs7DQorICAgIGNhc2UgU1RSRUFNX1NFRUtfRU5EOiBvZmZzZXQgKz0gX3NpemU7IGJyZWFrOw0KKyAgICBkZWZhdWx0OiByZXR1cm4gU1RHX0VfSU5WQUxJREZVTkNUSU9OOw0KKyAgfQ0KKyAgaWYgKG9mZnNldCA8IDApDQorICAgIHJldHVybiBIUkVTVUxUX1dJTjMyX0VSUk9SX05FR0FUSVZFX1NFRUs7DQorICBfdmlydFBvcyA9IG9mZnNldDsNCisgIGlmIChuZXdQb3NpdGlvbikNCisgICAgKm5ld1Bvc2l0aW9uID0gX3ZpcnRQb3M7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDcmVhdGVMaW1pdGVkSW5TdHJlYW0oSUluU3RyZWFtICppblN0cmVhbSwgVUludDY0IHBvcywgVUludDY0IHNpemUsIElTZXF1ZW50aWFsSW5TdHJlYW0gKipyZXNTdHJlYW0pDQorew0KKyAgKnJlc1N0cmVhbSA9IDA7DQorICBDTGltaXRlZEluU3RyZWFtICpzdHJlYW1TcGVjID0gbmV3IENMaW1pdGVkSW5TdHJlYW07DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gc3RyZWFtVGVtcCA9IHN0cmVhbVNwZWM7DQorICBzdHJlYW1TcGVjLT5TZXRTdHJlYW0oaW5TdHJlYW0pOw0KKyAgUklOT0soc3RyZWFtU3BlYy0+SW5pdEFuZFNlZWsocG9zLCBzaXplKSk7DQorICBzdHJlYW1TcGVjLT5TZWVrVG9TdGFydCgpOw0KKyAgKnJlc1N0cmVhbSA9IHN0cmVhbVRlbXAuRGV0YWNoKCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENDbHVzdGVySW5TdHJlYW06OlJlYWQodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSAwOw0KKyAgaWYgKF92aXJ0UG9zID49IFNpemUpDQorICAgIHJldHVybiBTX09LOw0KKw0KKyAgaWYgKF9jdXJSZW0gPT0gMCkNCisgIHsNCisgICAgVUludDMyIGJsb2NrU2l6ZSA9IChVSW50MzIpMSA8PCBCbG9ja1NpemVMb2c7DQorICAgIFVJbnQzMiB2aXJ0QmxvY2sgPSAoVUludDMyKShfdmlydFBvcyA+PiBCbG9ja1NpemVMb2cpOw0KKyAgICBVSW50MzIgb2Zmc2V0SW5CbG9jayA9IChVSW50MzIpX3ZpcnRQb3MgJiAoYmxvY2tTaXplIC0gMSk7DQorICAgIFVJbnQzMiBwaHlCbG9jayA9IFZlY3Rvclt2aXJ0QmxvY2tdOw0KKyAgICBVSW50NjQgbmV3UG9zID0gU3RhcnRPZmZzZXQgKyAoKFVJbnQ2NClwaHlCbG9jayA8PCBCbG9ja1NpemVMb2cpICsgb2Zmc2V0SW5CbG9jazsNCisgICAgaWYgKG5ld1BvcyAhPSBfcGh5c1BvcykNCisgICAgew0KKyAgICAgIF9waHlzUG9zID0gbmV3UG9zOw0KKyAgICAgIFJJTk9LKFNlZWtUb1BoeXMoKSk7DQorICAgIH0NCisgICAgX2N1clJlbSA9IGJsb2NrU2l6ZSAtIG9mZnNldEluQmxvY2s7DQorICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjQgJiYgKHZpcnRCbG9jayArIGkpIDwgKFVJbnQzMilWZWN0b3IuU2l6ZSgpICYmIHBoeUJsb2NrICsgaSA9PSBWZWN0b3JbdmlydEJsb2NrICsgaV07IGkrKykNCisgICAgICBfY3VyUmVtICs9IChVSW50MzIpMSA8PCBCbG9ja1NpemVMb2c7DQorICAgIFVJbnQ2NCByZW0gPSBTaXplIC0gX3ZpcnRQb3M7DQorICAgIGlmIChfY3VyUmVtID4gcmVtKQ0KKyAgICAgIF9jdXJSZW0gPSAoVUludDMyKXJlbTsNCisgIH0NCisgIGlmIChzaXplID4gX2N1clJlbSkNCisgICAgc2l6ZSA9IF9jdXJSZW07DQorICBIUkVTVUxUIHJlcyA9IFN0cmVhbS0+UmVhZChkYXRhLCBzaXplLCAmc2l6ZSk7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSBzaXplOw0KKyAgX3BoeXNQb3MgKz0gc2l6ZTsNCisgIF92aXJ0UG9zICs9IHNpemU7DQorICBfY3VyUmVtIC09IHNpemU7DQorICByZXR1cm4gcmVzOw0KK30NCisgDQorU1RETUVUSE9ESU1QIENDbHVzdGVySW5TdHJlYW06OlNlZWsoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbikNCit7DQorICBzd2l0Y2ggKHNlZWtPcmlnaW4pDQorICB7DQorICAgIGNhc2UgU1RSRUFNX1NFRUtfU0VUOiBicmVhazsNCisgICAgY2FzZSBTVFJFQU1fU0VFS19DVVI6IG9mZnNldCArPSBfdmlydFBvczsgYnJlYWs7DQorICAgIGNhc2UgU1RSRUFNX1NFRUtfRU5EOiBvZmZzZXQgKz0gU2l6ZTsgYnJlYWs7DQorICAgIGRlZmF1bHQ6IHJldHVybiBTVEdfRV9JTlZBTElERlVOQ1RJT047DQorICB9DQorICBpZiAob2Zmc2V0IDwgMCkNCisgICAgcmV0dXJuIEhSRVNVTFRfV0lOMzJfRVJST1JfTkVHQVRJVkVfU0VFSzsNCisgIGlmIChfdmlydFBvcyAhPSAoVUludDY0KW9mZnNldCkNCisgICAgX2N1clJlbSA9IDA7DQorICBfdmlydFBvcyA9IG9mZnNldDsNCisgIGlmIChuZXdQb3NpdGlvbikNCisgICAgKm5ld1Bvc2l0aW9uID0gb2Zmc2V0Ow0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKw0KK1NURE1FVEhPRElNUCBDRXh0ZW50c1N0cmVhbTo6UmVhZCh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IDA7DQorICBpZiAoX3ZpcnRQb3MgPj0gRXh0ZW50cy5CYWNrKCkuVmlydCkNCisgICAgcmV0dXJuIFNfT0s7DQorICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIA0KKyAgdW5zaWduZWQgbGVmdCA9IDAsIHJpZ2h0ID0gRXh0ZW50cy5TaXplKCkgLSAxOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgdW5zaWduZWQgbWlkID0gKGxlZnQgKyByaWdodCkgLyAyOw0KKyAgICBpZiAobWlkID09IGxlZnQpDQorICAgICAgYnJlYWs7DQorICAgIGlmIChfdmlydFBvcyA8IEV4dGVudHNbbWlkXS5WaXJ0KQ0KKyAgICAgIHJpZ2h0ID0gbWlkOw0KKyAgICBlbHNlDQorICAgICAgbGVmdCA9IG1pZDsNCisgIH0NCisgIA0KKyAgY29uc3QgQ1NlZWtFeHRlbnQgJmV4dGVudCA9IEV4dGVudHNbbGVmdF07DQorICBVSW50NjQgcGh5UG9zID0gZXh0ZW50LlBoeSArIChfdmlydFBvcyAtIGV4dGVudC5WaXJ0KTsNCisgIGlmIChfbmVlZFN0YXJ0U2VlayB8fCBfcGh5UG9zICE9IHBoeVBvcykNCisgIHsNCisgICAgX25lZWRTdGFydFNlZWsgPSBmYWxzZTsNCisgICAgX3BoeVBvcyA9IHBoeVBvczsNCisgICAgUklOT0soU2Vla1RvUGh5cygpKTsNCisgIH0NCisgIA0KKyAgVUludDY0IHJlbSA9IEV4dGVudHNbbGVmdCArIDFdLlZpcnQgLSBfdmlydFBvczsNCisgIGlmIChzaXplID4gcmVtKQ0KKyAgICBzaXplID0gKFVJbnQzMilyZW07DQorICANCisgIEhSRVNVTFQgcmVzID0gU3RyZWFtLT5SZWFkKGRhdGEsIHNpemUsICZzaXplKTsNCisgIF9waHlQb3MgKz0gc2l6ZTsNCisgIF92aXJ0UG9zICs9IHNpemU7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSBzaXplOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorU1RETUVUSE9ESU1QIENFeHRlbnRzU3RyZWFtOjpTZWVrKEludDY0IG9mZnNldCwgVUludDMyIHNlZWtPcmlnaW4sIFVJbnQ2NCAqbmV3UG9zaXRpb24pDQorew0KKyAgc3dpdGNoIChzZWVrT3JpZ2luKQ0KKyAgew0KKyAgICBjYXNlIFNUUkVBTV9TRUVLX1NFVDogYnJlYWs7DQorICAgIGNhc2UgU1RSRUFNX1NFRUtfQ1VSOiBvZmZzZXQgKz0gX3ZpcnRQb3M7IGJyZWFrOw0KKyAgICBjYXNlIFNUUkVBTV9TRUVLX0VORDogb2Zmc2V0ICs9IEV4dGVudHMuQmFjaygpLlZpcnQ7IGJyZWFrOw0KKyAgICBkZWZhdWx0OiByZXR1cm4gU1RHX0VfSU5WQUxJREZVTkNUSU9OOw0KKyAgfQ0KKyAgaWYgKG9mZnNldCA8IDApDQorICAgIHJldHVybiBIUkVTVUxUX1dJTjMyX0VSUk9SX05FR0FUSVZFX1NFRUs7DQorICBfdmlydFBvcyA9IG9mZnNldDsNCisgIGlmIChuZXdQb3NpdGlvbikNCisgICAgKm5ld1Bvc2l0aW9uID0gX3ZpcnRQb3M7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorDQorU1RETUVUSE9ESU1QIENMaW1pdGVkU2VxdWVudGlhbE91dFN0cmVhbTo6V3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBIUkVTVUxUIHJlc3VsdCA9IFNfT0s7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSAwOw0KKyAgaWYgKHNpemUgPiBfc2l6ZSkNCisgIHsNCisgICAgaWYgKF9zaXplID09IDApDQorICAgIHsNCisgICAgICBfb3ZlcmZsb3cgPSB0cnVlOw0KKyAgICAgIGlmICghX292ZXJmbG93SXNBbGxvd2VkKQ0KKyAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgICAgICpwcm9jZXNzZWRTaXplID0gc2l6ZTsNCisgICAgICByZXR1cm4gU19PSzsNCisgICAgfQ0KKyAgICBzaXplID0gKFVJbnQzMilfc2l6ZTsNCisgIH0NCisgIGlmIChfc3RyZWFtKQ0KKyAgICByZXN1bHQgPSBfc3RyZWFtLT5Xcml0ZShkYXRhLCBzaXplLCAmc2l6ZSk7DQorICBfc2l6ZSAtPSBzaXplOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gc2l6ZTsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKw0KKw0KK1NURE1FVEhPRElNUCBDVGFpbEluU3RyZWFtOjpSZWFkKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgVUludDMyIGN1cjsNCisgIEhSRVNVTFQgcmVzID0gU3RyZWFtLT5SZWFkKGRhdGEsIHNpemUsICZjdXIpOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gY3VyOw0KKyAgX3ZpcnRQb3MgKz0gY3VyOw0KKyAgcmV0dXJuIHJlczsNCit9DQorICANCitTVERNRVRIT0RJTVAgQ1RhaWxJblN0cmVhbTo6U2VlayhJbnQ2NCBvZmZzZXQsIFVJbnQzMiBzZWVrT3JpZ2luLCBVSW50NjQgKm5ld1Bvc2l0aW9uKQ0KK3sNCisgIHN3aXRjaCAoc2Vla09yaWdpbikNCisgIHsNCisgICAgY2FzZSBTVFJFQU1fU0VFS19TRVQ6IGJyZWFrOw0KKyAgICBjYXNlIFNUUkVBTV9TRUVLX0NVUjogb2Zmc2V0ICs9IF92aXJ0UG9zOyBicmVhazsNCisgICAgY2FzZSBTVFJFQU1fU0VFS19FTkQ6DQorICAgIHsNCisgICAgICBVSW50NjQgcG9zID0gMDsNCisgICAgICBSSU5PSyhTdHJlYW0tPlNlZWsob2Zmc2V0LCBTVFJFQU1fU0VFS19FTkQsICZwb3MpKTsNCisgICAgICBpZiAocG9zIDwgT2Zmc2V0KQ0KKyAgICAgICAgcmV0dXJuIEhSRVNVTFRfV0lOMzJfRVJST1JfTkVHQVRJVkVfU0VFSzsNCisgICAgICBfdmlydFBvcyA9IHBvcyAtIE9mZnNldDsNCisgICAgICBpZiAobmV3UG9zaXRpb24pDQorICAgICAgICAqbmV3UG9zaXRpb24gPSBfdmlydFBvczsNCisgICAgICByZXR1cm4gU19PSzsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiByZXR1cm4gU1RHX0VfSU5WQUxJREZVTkNUSU9OOw0KKyAgfQ0KKyAgaWYgKG9mZnNldCA8IDApDQorICAgIHJldHVybiBIUkVTVUxUX1dJTjMyX0VSUk9SX05FR0FUSVZFX1NFRUs7DQorICBfdmlydFBvcyA9IG9mZnNldDsNCisgIGlmIChuZXdQb3NpdGlvbikNCisgICAgKm5ld1Bvc2l0aW9uID0gX3ZpcnRQb3M7DQorICByZXR1cm4gU3RyZWFtLT5TZWVrKE9mZnNldCArIF92aXJ0UG9zLCBTVFJFQU1fU0VFS19TRVQsIE5VTEwpOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0xpbWl0ZWRDYWNoZWRJblN0cmVhbTo6UmVhZCh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IDA7DQorICBpZiAoX3ZpcnRQb3MgPj0gX3NpemUpDQorICB7DQorICAgIC8vIDkuMzE6IEZpeGVkLiBXaW5kb3dzIGRvZXNuJ3QgcmV0dXJuIGVycm9yIGluIFJlYWRGaWxlIGFuZCBJU3RyZWFtLT5SZWFkIGluIHRoYXQgY2FzZS4NCisgICAgcmV0dXJuIFNfT0s7DQorICAgIC8vIHJldHVybiAoX3ZpcnRQb3MgPT0gX3NpemUpID8gU19PSzogRV9GQUlMOyAvLyBFUlJPUl9IQU5ETEVfRU9GDQorICB9DQorICBVSW50NjQgcmVtID0gX3NpemUgLSBfdmlydFBvczsNCisgIGlmIChyZW0gPCBzaXplKQ0KKyAgICBzaXplID0gKFVJbnQzMilyZW07DQorDQorICBVSW50NjQgbmV3UG9zID0gX3N0YXJ0T2Zmc2V0ICsgX3ZpcnRQb3M7DQorICBVSW50NjQgb2Zmc2V0SW5DYWNoZSA9IG5ld1BvcyAtIF9jYWNoZVBoeVBvczsNCisgIEhSRVNVTFQgcmVzID0gU19PSzsNCisgIGlmIChuZXdQb3MgPj0gX2NhY2hlUGh5UG9zICYmDQorICAgICAgb2Zmc2V0SW5DYWNoZSA8PSBfY2FjaGVTaXplICYmDQorICAgICAgc2l6ZSA8PSBfY2FjaGVTaXplIC0gKHNpemVfdClvZmZzZXRJbkNhY2hlKQ0KKyAgICBtZW1jcHkoZGF0YSwgX2NhY2hlICsgKHNpemVfdClvZmZzZXRJbkNhY2hlLCBzaXplKTsNCisgIGVsc2UNCisgIHsNCisgICAgaWYgKG5ld1BvcyAhPSBfcGh5c1BvcykNCisgICAgew0KKyAgICAgIF9waHlzUG9zID0gbmV3UG9zOw0KKyAgICAgIFJJTk9LKFNlZWtUb1BoeXMoKSk7DQorICAgIH0NCisgICAgcmVzID0gX3N0cmVhbS0+UmVhZChkYXRhLCBzaXplLCAmc2l6ZSk7DQorICAgIF9waHlzUG9zICs9IHNpemU7DQorICB9DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSBzaXplOw0KKyAgX3ZpcnRQb3MgKz0gc2l6ZTsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDTGltaXRlZENhY2hlZEluU3RyZWFtOjpTZWVrKEludDY0IG9mZnNldCwgVUludDMyIHNlZWtPcmlnaW4sIFVJbnQ2NCAqbmV3UG9zaXRpb24pDQorew0KKyAgc3dpdGNoIChzZWVrT3JpZ2luKQ0KKyAgew0KKyAgICBjYXNlIFNUUkVBTV9TRUVLX1NFVDogYnJlYWs7DQorICAgIGNhc2UgU1RSRUFNX1NFRUtfQ1VSOiBvZmZzZXQgKz0gX3ZpcnRQb3M7IGJyZWFrOw0KKyAgICBjYXNlIFNUUkVBTV9TRUVLX0VORDogb2Zmc2V0ICs9IF9zaXplOyBicmVhazsNCisgICAgZGVmYXVsdDogcmV0dXJuIFNUR19FX0lOVkFMSURGVU5DVElPTjsNCisgIH0NCisgIGlmIChvZmZzZXQgPCAwKQ0KKyAgICByZXR1cm4gSFJFU1VMVF9XSU4zMl9FUlJPUl9ORUdBVElWRV9TRUVLOw0KKyAgX3ZpcnRQb3MgPSBvZmZzZXQ7DQorICBpZiAobmV3UG9zaXRpb24pDQorICAgICpuZXdQb3NpdGlvbiA9IF92aXJ0UG9zOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDVGFpbE91dFN0cmVhbTo6V3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBVSW50MzIgY3VyOw0KKyAgSFJFU1VMVCByZXMgPSBTdHJlYW0tPldyaXRlKGRhdGEsIHNpemUsICZjdXIpOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gY3VyOw0KKyAgX3ZpcnRQb3MgKz0gY3VyOw0KKyAgaWYgKF92aXJ0U2l6ZSA8IF92aXJ0UG9zKQ0KKyAgICBfdmlydFNpemUgPSBfdmlydFBvczsNCisgIHJldHVybiByZXM7DQorfQ0KKyAgDQorU1RETUVUSE9ESU1QIENUYWlsT3V0U3RyZWFtOjpTZWVrKEludDY0IG9mZnNldCwgVUludDMyIHNlZWtPcmlnaW4sIFVJbnQ2NCAqbmV3UG9zaXRpb24pDQorew0KKyAgc3dpdGNoIChzZWVrT3JpZ2luKQ0KKyAgew0KKyAgICBjYXNlIFNUUkVBTV9TRUVLX1NFVDogYnJlYWs7DQorICAgIGNhc2UgU1RSRUFNX1NFRUtfQ1VSOiBvZmZzZXQgKz0gX3ZpcnRQb3M7IGJyZWFrOw0KKyAgICBjYXNlIFNUUkVBTV9TRUVLX0VORDogb2Zmc2V0ICs9IF92aXJ0U2l6ZTsgYnJlYWs7DQorICAgIGRlZmF1bHQ6IHJldHVybiBTVEdfRV9JTlZBTElERlVOQ1RJT047DQorICB9DQorICBpZiAob2Zmc2V0IDwgMCkNCisgICAgcmV0dXJuIEhSRVNVTFRfV0lOMzJfRVJST1JfTkVHQVRJVkVfU0VFSzsNCisgIF92aXJ0UG9zID0gb2Zmc2V0Ow0KKyAgaWYgKG5ld1Bvc2l0aW9uKQ0KKyAgICAqbmV3UG9zaXRpb24gPSBfdmlydFBvczsNCisgIHJldHVybiBTdHJlYW0tPlNlZWsoT2Zmc2V0ICsgX3ZpcnRQb3MsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCk7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDVGFpbE91dFN0cmVhbTo6U2V0U2l6ZShVSW50NjQgbmV3U2l6ZSkNCit7DQorICBfdmlydFNpemUgPSBuZXdTaXplOw0KKyAgcmV0dXJuIFN0cmVhbS0+U2V0U2l6ZShPZmZzZXQgKyBuZXdTaXplKTsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vTGltaXRlZFN0cmVhbXMuaCBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0xpbWl0ZWRTdHJlYW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4OTUwMgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0xpbWl0ZWRTdHJlYW1zLmgKQEAgLTAsMCArMSwyNTEgQEAKKy8vIExpbWl0ZWRTdHJlYW1zLmgNCisNCisjaWZuZGVmIF9fTElNSVRFRF9TVFJFQU1TX0gNCisjZGVmaW5lIF9fTElNSVRFRF9TVFJFQU1TX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL015QnVmZmVyLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlWZWN0b3IuaCINCisjaW5jbHVkZSAiLi4vSVN0cmVhbS5oIg0KKw0KK2NsYXNzIENMaW1pdGVkU2VxdWVudGlhbEluU3RyZWFtOg0KKyAgcHVibGljIElTZXF1ZW50aWFsSW5TdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbEluU3RyZWFtPiBfc3RyZWFtOw0KKyAgVUludDY0IF9zaXplOw0KKyAgVUludDY0IF9wb3M7DQorICBib29sIF93YXNGaW5pc2hlZDsNCitwdWJsaWM6DQorICB2b2lkIFNldFN0cmVhbShJU2VxdWVudGlhbEluU3RyZWFtICpzdHJlYW0pIHsgX3N0cmVhbSA9IHN0cmVhbTsgfQ0KKyAgdm9pZCBSZWxlYXNlU3RyZWFtKCkgeyBfc3RyZWFtLlJlbGVhc2UoKTsgfQ0KKyAgdm9pZCBJbml0KFVJbnQ2NCBzdHJlYW1TaXplKQ0KKyAgew0KKyAgICBfc2l6ZSA9IHN0cmVhbVNpemU7DQorICAgIF9wb3MgPSAwOw0KKyAgICBfd2FzRmluaXNoZWQgPSBmYWxzZTsNCisgIH0NCisgDQorICBNWV9VTktOT1dOX0lNUDEoSVNlcXVlbnRpYWxJblN0cmVhbSkNCisNCisgIFNURE1FVEhPRChSZWFkKSh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCisgIFVJbnQ2NCBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gX3BvczsgfQ0KKyAgYm9vbCBXYXNGaW5pc2hlZCgpIGNvbnN0IHsgcmV0dXJuIF93YXNGaW5pc2hlZDsgfQ0KK307DQorDQorY2xhc3MgQ0xpbWl0ZWRJblN0cmVhbToNCisgIHB1YmxpYyBJSW5TdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIENNeUNvbVB0cjxJSW5TdHJlYW0+IF9zdHJlYW07DQorICBVSW50NjQgX3ZpcnRQb3M7DQorICBVSW50NjQgX3BoeXNQb3M7DQorICBVSW50NjQgX3NpemU7DQorICBVSW50NjQgX3N0YXJ0T2Zmc2V0Ow0KKw0KKyAgSFJFU1VMVCBTZWVrVG9QaHlzKCkgeyByZXR1cm4gX3N0cmVhbS0+U2VlayhfcGh5c1BvcywgU1RSRUFNX1NFRUtfU0VULCBOVUxMKTsgfQ0KK3B1YmxpYzoNCisgIHZvaWQgU2V0U3RyZWFtKElJblN0cmVhbSAqc3RyZWFtKSB7IF9zdHJlYW0gPSBzdHJlYW07IH0NCisgIEhSRVNVTFQgSW5pdEFuZFNlZWsoVUludDY0IHN0YXJ0T2Zmc2V0LCBVSW50NjQgc2l6ZSkNCisgIHsNCisgICAgX3N0YXJ0T2Zmc2V0ID0gc3RhcnRPZmZzZXQ7DQorICAgIF9waHlzUG9zID0gc3RhcnRPZmZzZXQ7DQorICAgIF92aXJ0UG9zID0gMDsNCisgICAgX3NpemUgPSBzaXplOw0KKyAgICByZXR1cm4gU2Vla1RvUGh5cygpOw0KKyAgfQ0KKyANCisgIE1ZX1VOS05PV05fSU1QMihJU2VxdWVudGlhbEluU3RyZWFtLCBJSW5TdHJlYW0pDQorDQorICBTVERNRVRIT0QoUmVhZCkodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorICBTVERNRVRIT0QoU2VlaykoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbik7DQorDQorICBIUkVTVUxUIFNlZWtUb1N0YXJ0KCkgeyByZXR1cm4gU2VlaygwLCBTVFJFQU1fU0VFS19TRVQsIE5VTEwpOyB9DQorfTsNCisNCitIUkVTVUxUIENyZWF0ZUxpbWl0ZWRJblN0cmVhbShJSW5TdHJlYW0gKmluU3RyZWFtLCBVSW50NjQgcG9zLCBVSW50NjQgc2l6ZSwgSVNlcXVlbnRpYWxJblN0cmVhbSAqKnJlc1N0cmVhbSk7DQorDQorY2xhc3MgQ0NsdXN0ZXJJblN0cmVhbToNCisgIHB1YmxpYyBJSW5TdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIFVJbnQ2NCBfdmlydFBvczsNCisgIFVJbnQ2NCBfcGh5c1BvczsNCisgIFVJbnQzMiBfY3VyUmVtOw0KK3B1YmxpYzoNCisgIENNeUNvbVB0cjxJSW5TdHJlYW0+IFN0cmVhbTsNCisgIFVJbnQ2NCBTdGFydE9mZnNldDsNCisgIFVJbnQ2NCBTaXplOw0KKyAgdW5zaWduZWQgQmxvY2tTaXplTG9nOw0KKyAgQ1JlY29yZFZlY3RvcjxVSW50MzI+IFZlY3RvcjsNCisNCisgIEhSRVNVTFQgU2Vla1RvUGh5cygpIHsgcmV0dXJuIFN0cmVhbS0+U2VlayhfcGh5c1BvcywgU1RSRUFNX1NFRUtfU0VULCBOVUxMKTsgfQ0KKw0KKyAgSFJFU1VMVCBJbml0QW5kU2VlaygpDQorICB7DQorICAgIF9jdXJSZW0gPSAwOw0KKyAgICBfdmlydFBvcyA9IDA7DQorICAgIF9waHlzUG9zID0gU3RhcnRPZmZzZXQ7DQorICAgIGlmIChWZWN0b3IuU2l6ZSgpID4gMCkNCisgICAgew0KKyAgICAgIF9waHlzUG9zID0gU3RhcnRPZmZzZXQgKyAoVmVjdG9yWzBdIDw8IEJsb2NrU2l6ZUxvZyk7DQorICAgICAgcmV0dXJuIFNlZWtUb1BoeXMoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gU19PSzsNCisgIH0NCisNCisgIE1ZX1VOS05PV05fSU1QMihJU2VxdWVudGlhbEluU3RyZWFtLCBJSW5TdHJlYW0pDQorDQorICBTVERNRVRIT0QoUmVhZCkodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorICBTVERNRVRIT0QoU2VlaykoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbik7DQorfTsNCisNCitzdHJ1Y3QgQ1NlZWtFeHRlbnQNCit7DQorICBVSW50NjQgUGh5Ow0KKyAgVUludDY0IFZpcnQ7DQorfTsNCisNCitjbGFzcyBDRXh0ZW50c1N0cmVhbToNCisgIHB1YmxpYyBJSW5TdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIFVJbnQ2NCBfcGh5UG9zOw0KKyAgVUludDY0IF92aXJ0UG9zOw0KKyAgYm9vbCBfbmVlZFN0YXJ0U2VlazsNCisNCisgIEhSRVNVTFQgU2Vla1RvUGh5cygpIHsgcmV0dXJuIFN0cmVhbS0+U2VlayhfcGh5UG9zLCBTVFJFQU1fU0VFS19TRVQsIE5VTEwpOyB9DQorDQorcHVibGljOg0KKyAgQ015Q29tUHRyPElJblN0cmVhbT4gU3RyZWFtOw0KKyAgQ1JlY29yZFZlY3RvcjxDU2Vla0V4dGVudD4gRXh0ZW50czsNCisNCisgIE1ZX1VOS05PV05fSU1QMihJU2VxdWVudGlhbEluU3RyZWFtLCBJSW5TdHJlYW0pDQorICBTVERNRVRIT0QoUmVhZCkodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorICBTVERNRVRIT0QoU2VlaykoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbik7DQorICB2b2lkIFJlbGVhc2VTdHJlYW0oKSB7IFN0cmVhbS5SZWxlYXNlKCk7IH0NCisNCisgIHZvaWQgSW5pdCgpDQorICB7DQorICAgIF92aXJ0UG9zID0gMDsNCisgICAgX3BoeVBvcyA9IDA7DQorICAgIF9uZWVkU3RhcnRTZWVrID0gdHJ1ZTsNCisgIH0NCit9Ow0KKw0KK2NsYXNzIENMaW1pdGVkU2VxdWVudGlhbE91dFN0cmVhbToNCisgIHB1YmxpYyBJU2VxdWVudGlhbE91dFN0cmVhbSwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsT3V0U3RyZWFtPiBfc3RyZWFtOw0KKyAgVUludDY0IF9zaXplOw0KKyAgYm9vbCBfb3ZlcmZsb3c7DQorICBib29sIF9vdmVyZmxvd0lzQWxsb3dlZDsNCitwdWJsaWM6DQorICBNWV9VTktOT1dOX0lNUDEoSVNlcXVlbnRpYWxPdXRTdHJlYW0pDQorICBTVERNRVRIT0QoV3JpdGUpKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KKyAgdm9pZCBTZXRTdHJlYW0oSVNlcXVlbnRpYWxPdXRTdHJlYW0gKnN0cmVhbSkgeyBfc3RyZWFtID0gc3RyZWFtOyB9DQorICB2b2lkIFJlbGVhc2VTdHJlYW0oKSB7IF9zdHJlYW0uUmVsZWFzZSgpOyB9DQorICB2b2lkIEluaXQoVUludDY0IHNpemUsIGJvb2wgb3ZlcmZsb3dJc0FsbG93ZWQgPSBmYWxzZSkNCisgIHsNCisgICAgX3NpemUgPSBzaXplOw0KKyAgICBfb3ZlcmZsb3cgPSBmYWxzZTsNCisgICAgX292ZXJmbG93SXNBbGxvd2VkID0gb3ZlcmZsb3dJc0FsbG93ZWQ7DQorICB9DQorICBib29sIElzRmluaXNoZWRPSygpIGNvbnN0IHsgcmV0dXJuIChfc2l6ZSA9PSAwICYmICFfb3ZlcmZsb3cpOyB9DQorICBVSW50NjQgR2V0UmVtKCkgY29uc3QgeyByZXR1cm4gX3NpemU7IH0NCit9Ow0KKw0KKw0KK2NsYXNzIENUYWlsSW5TdHJlYW06DQorICBwdWJsaWMgSUluU3RyZWFtLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBVSW50NjQgX3ZpcnRQb3M7DQorcHVibGljOg0KKyAgQ015Q29tUHRyPElJblN0cmVhbT4gU3RyZWFtOw0KKyAgVUludDY0IE9mZnNldDsNCisNCisgIHZvaWQgSW5pdCgpDQorICB7DQorICAgIF92aXJ0UG9zID0gMDsNCisgIH0NCisgDQorICBNWV9VTktOT1dOX0lNUDIoSVNlcXVlbnRpYWxJblN0cmVhbSwgSUluU3RyZWFtKQ0KKw0KKyAgU1RETUVUSE9EKFJlYWQpKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KKyAgU1RETUVUSE9EKFNlZWspKEludDY0IG9mZnNldCwgVUludDMyIHNlZWtPcmlnaW4sIFVJbnQ2NCAqbmV3UG9zaXRpb24pOw0KKw0KKyAgSFJFU1VMVCBTZWVrVG9TdGFydCgpIHsgcmV0dXJuIFN0cmVhbS0+U2VlayhPZmZzZXQsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCk7IH0NCit9Ow0KKw0KK2NsYXNzIENMaW1pdGVkQ2FjaGVkSW5TdHJlYW06DQorICBwdWJsaWMgSUluU3RyZWFtLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBDTXlDb21QdHI8SUluU3RyZWFtPiBfc3RyZWFtOw0KKyAgVUludDY0IF92aXJ0UG9zOw0KKyAgVUludDY0IF9waHlzUG9zOw0KKyAgVUludDY0IF9zaXplOw0KKyAgVUludDY0IF9zdGFydE9mZnNldDsNCisgIA0KKyAgY29uc3QgQnl0ZSAqX2NhY2hlOw0KKyAgc2l6ZV90IF9jYWNoZVNpemU7DQorICBzaXplX3QgX2NhY2hlUGh5UG9zOw0KKw0KKw0KKyAgSFJFU1VMVCBTZWVrVG9QaHlzKCkgeyByZXR1cm4gX3N0cmVhbS0+U2VlayhfcGh5c1BvcywgU1RSRUFNX1NFRUtfU0VULCBOVUxMKTsgfQ0KK3B1YmxpYzoNCisgIENCeXRlQnVmZmVyIEJ1ZmZlcjsNCisNCisgIHZvaWQgU2V0U3RyZWFtKElJblN0cmVhbSAqc3RyZWFtKSB7IF9zdHJlYW0gPSBzdHJlYW07IH0NCisgIHZvaWQgU2V0Q2FjaGUoc2l6ZV90IGNhY2hlU2l6ZSwgc2l6ZV90IGNhY2hlUG9zKQ0KKyAgew0KKyAgICBfY2FjaGUgPSBCdWZmZXI7DQorICAgIF9jYWNoZVNpemUgPSBjYWNoZVNpemU7DQorICAgIF9jYWNoZVBoeVBvcyA9IGNhY2hlUG9zOw0KKyAgfQ0KKw0KKyAgSFJFU1VMVCBJbml0QW5kU2VlayhVSW50NjQgc3RhcnRPZmZzZXQsIFVJbnQ2NCBzaXplKQ0KKyAgew0KKyAgICBfc3RhcnRPZmZzZXQgPSBzdGFydE9mZnNldDsNCisgICAgX3BoeXNQb3MgPSBzdGFydE9mZnNldDsNCisgICAgX3ZpcnRQb3MgPSAwOw0KKyAgICBfc2l6ZSA9IHNpemU7DQorICAgIHJldHVybiBTZWVrVG9QaHlzKCk7DQorICB9DQorIA0KKyAgTVlfVU5LTk9XTl9JTVAyKElTZXF1ZW50aWFsSW5TdHJlYW0sIElJblN0cmVhbSkNCisNCisgIFNURE1FVEhPRChSZWFkKSh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCisgIFNURE1FVEhPRChTZWVrKShJbnQ2NCBvZmZzZXQsIFVJbnQzMiBzZWVrT3JpZ2luLCBVSW50NjQgKm5ld1Bvc2l0aW9uKTsNCisNCisgIEhSRVNVTFQgU2Vla1RvU3RhcnQoKSB7IHJldHVybiBTZWVrKDAsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCk7IH0NCit9Ow0KKw0KK2NsYXNzIENUYWlsT3V0U3RyZWFtOg0KKyAgcHVibGljIElPdXRTdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIFVJbnQ2NCBfdmlydFBvczsNCisgIFVJbnQ2NCBfdmlydFNpemU7DQorcHVibGljOg0KKyAgQ015Q29tUHRyPElPdXRTdHJlYW0+IFN0cmVhbTsNCisgIFVJbnQ2NCBPZmZzZXQ7DQorICANCisgIHZpcnR1YWwgfkNUYWlsT3V0U3RyZWFtKCkge30NCisNCisgIE1ZX1VOS05PV05fSU1QMihJU2VxdWVudGlhbE91dFN0cmVhbSwgSU91dFN0cmVhbSkNCisNCisgIHZvaWQgSW5pdCgpDQorICB7DQorICAgIF92aXJ0UG9zID0gMDsNCisgICAgX3ZpcnRTaXplID0gMDsNCisgIH0NCisNCisgIFNURE1FVEhPRChXcml0ZSkoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorICBTVERNRVRIT0QoU2VlaykoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbik7DQorICBTVERNRVRIT0QoU2V0U2l6ZSkoVUludDY0IG5ld1NpemUpOw0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vTG9ja2VkU3RyZWFtLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0xvY2tlZFN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFiYmY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0xvY2tlZFN0cmVhbS5jcHAKQEAgLTAsMCArMSwyMyBAQAorLy8gTG9ja2VkU3RyZWFtLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiTG9ja2VkU3RyZWFtLmgiDQorDQorSFJFU1VMVCBDTG9ja2VkSW5TdHJlYW06OlJlYWQoVUludDY0IHN0YXJ0UG9zLCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwNCisgIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBOV2luZG93czo6TlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbkxvY2sgbG9jayhfY3JpdGljYWxTZWN0aW9uKTsNCisgIFJJTk9LKF9zdHJlYW0tPlNlZWsoc3RhcnRQb3MsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCkpOw0KKyAgcmV0dXJuIF9zdHJlYW0tPlJlYWQoZGF0YSwgc2l6ZSwgcHJvY2Vzc2VkU2l6ZSk7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDTG9ja2VkU2VxdWVudGlhbEluU3RyZWFtSW1wOjpSZWFkKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgVUludDMyIHJlYWxQcm9jZXNzZWRTaXplID0gMDsNCisgIEhSRVNVTFQgcmVzdWx0ID0gX2xvY2tlZEluU3RyZWFtLT5SZWFkKF9wb3MsIGRhdGEsIHNpemUsICZyZWFsUHJvY2Vzc2VkU2l6ZSk7DQorICBfcG9zICs9IHJlYWxQcm9jZXNzZWRTaXplOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUgIT0gTlVMTCkNCisgICAgKnByb2Nlc3NlZFNpemUgPSByZWFsUHJvY2Vzc2VkU2l6ZTsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0xvY2tlZFN0cmVhbS5oIGIvbHptYS9DUFAvN3ppcC9Db21tb24vTG9ja2VkU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyZTIyYQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL0xvY2tlZFN0cmVhbS5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIExvY2tlZFN0cmVhbS5oDQorDQorI2lmbmRlZiBfX0xPQ0tFRFNUUkVBTV9IDQorI2RlZmluZSBfX0xPQ0tFRFNUUkVBTV9IDQorDQorI2luY2x1ZGUgIi4uLy4uL1dpbmRvd3MvU3luY2hyb25pemF0aW9uLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKyNpbmNsdWRlICIuLi9JU3RyZWFtLmgiDQorDQorY2xhc3MgQ0xvY2tlZEluU3RyZWFtDQorew0KKyAgQ015Q29tUHRyPElJblN0cmVhbT4gX3N0cmVhbTsNCisgIE5XaW5kb3dzOjpOU3luY2hyb25pemF0aW9uOjpDQ3JpdGljYWxTZWN0aW9uIF9jcml0aWNhbFNlY3Rpb247DQorcHVibGljOg0KKyAgdm9pZCBJbml0KElJblN0cmVhbSAqc3RyZWFtKQ0KKyAgICB7IF9zdHJlYW0gPSBzdHJlYW07IH0NCisgIEhSRVNVTFQgUmVhZChVSW50NjQgc3RhcnRQb3MsIHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KK307DQorDQorY2xhc3MgQ0xvY2tlZFNlcXVlbnRpYWxJblN0cmVhbUltcDoNCisgIHB1YmxpYyBJU2VxdWVudGlhbEluU3RyZWFtLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBDTG9ja2VkSW5TdHJlYW0gKl9sb2NrZWRJblN0cmVhbTsNCisgIFVJbnQ2NCBfcG9zOw0KK3B1YmxpYzoNCisgIHZvaWQgSW5pdChDTG9ja2VkSW5TdHJlYW0gKmxvY2tlZEluU3RyZWFtLCBVSW50NjQgc3RhcnRQb3MpDQorICB7DQorICAgIF9sb2NrZWRJblN0cmVhbSA9IGxvY2tlZEluU3RyZWFtOw0KKyAgICBfcG9zID0gc3RhcnRQb3M7DQorICB9DQorDQorICBNWV9VTktOT1dOX0lNUA0KKw0KKyAgU1RETUVUSE9EKFJlYWQpKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vTWV0aG9kSWQuY3BwIGIvbHptYS9DUFAvN3ppcC9Db21tb24vTWV0aG9kSWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMDdlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9NZXRob2RJZC5jcHAKQEAgLTAsMCArMSwzIEBACisvLyBNZXRob2RJZC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vTWV0aG9kSWQuaCBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL01ldGhvZElkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhOWY0OQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL01ldGhvZElkLmgKQEAgLTAsMCArMSwxMCBAQAorLy8gTWV0aG9kSWQuaA0KKw0KKyNpZm5kZWYgX183Wl9NRVRIT0RfSURfSA0KKyNkZWZpbmUgX183Wl9NRVRIT0RfSURfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlUeXBlcy5oIg0KKw0KK3R5cGVkZWYgVUludDY0IENNZXRob2RJZDsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9NZXRob2RQcm9wcy5jcHAgYi9sem1hL0NQUC83emlwL0NvbW1vbi9NZXRob2RQcm9wcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3MzUxMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL01ldGhvZFByb3BzLmNwcApAQCAtMCwwICsxLDQ0MSBAQAorLy8gTWV0aG9kUHJvcHMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vU3RyaW5nVG9JbnQuaCINCisNCisjaW5jbHVkZSAiTWV0aG9kUHJvcHMuaCINCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQorDQorYm9vbCBTdHJpbmdUb0Jvb2woY29uc3QgVVN0cmluZyAmcywgYm9vbCAmcmVzKQ0KK3sNCisgIGlmIChzLklzRW1wdHkoKSB8fCBzID09IEwiKyIgfHwgU3RyaW5nc0FyZUVxdWFsTm9DYXNlX0FzY2lpKHMsICJPTiIpKQ0KKyAgew0KKyAgICByZXMgPSB0cnVlOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIGlmIChzID09IEwiLSIgfHwgU3RyaW5nc0FyZUVxdWFsTm9DYXNlX0FzY2lpKHMsICJPRkYiKSkNCisgIHsNCisgICAgcmVzID0gZmFsc2U7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitIUkVTVUxUIFBST1BWQVJJQU5UX3RvX2Jvb2woY29uc3QgUFJPUFZBUklBTlQgJnByb3AsIGJvb2wgJmRlc3QpDQorew0KKyAgc3dpdGNoIChwcm9wLnZ0KQ0KKyAgew0KKyAgICBjYXNlIFZUX0VNUFRZOiBkZXN0ID0gdHJ1ZTsgcmV0dXJuIFNfT0s7DQorICAgIGNhc2UgVlRfQk9PTDogZGVzdCA9IChwcm9wLmJvb2xWYWwgIT0gVkFSSUFOVF9GQUxTRSk7IHJldHVybiBTX09LOw0KKyAgICBjYXNlIFZUX0JTVFI6IHJldHVybiBTdHJpbmdUb0Jvb2wocHJvcC5ic3RyVmFsLCBkZXN0KSA/IFNfT0sgOiBFX0lOVkFMSURBUkc7DQorICB9DQorICByZXR1cm4gRV9JTlZBTElEQVJHOw0KK30NCisNCit1bnNpZ25lZCBQYXJzZVN0cmluZ1RvVUludDMyKGNvbnN0IFVTdHJpbmcgJnNyY1N0cmluZywgVUludDMyICZudW1iZXIpDQorew0KKyAgY29uc3Qgd2NoYXJfdCAqc3RhcnQgPSBzcmNTdHJpbmc7DQorICBjb25zdCB3Y2hhcl90ICplbmQ7DQorICBudW1iZXIgPSBDb252ZXJ0U3RyaW5nVG9VSW50MzIoc3RhcnQsICZlbmQpOw0KKyAgcmV0dXJuICh1bnNpZ25lZCkoZW5kIC0gc3RhcnQpOw0KK30NCisNCitIUkVTVUxUIFBhcnNlUHJvcFRvVUludDMyKGNvbnN0IFVTdHJpbmcgJm5hbWUsIGNvbnN0IFBST1BWQVJJQU5UICZwcm9wLCBVSW50MzIgJnJlc1ZhbHVlKQ0KK3sNCisgIC8vID1WVF9VSTQNCisgIC8vID1WVF9FTVBUWQ0KKyAgLy8ge3N0cmluZ1VJbnQzMn09VlRfRU1QVFkNCisNCisgIGlmIChwcm9wLnZ0ID09IFZUX1VJNCkNCisgIHsNCisgICAgaWYgKCFuYW1lLklzRW1wdHkoKSkNCisgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICByZXNWYWx1ZSA9IHByb3AudWxWYWw7DQorICAgIHJldHVybiBTX09LOw0KKyAgfQ0KKyAgaWYgKHByb3AudnQgIT0gVlRfRU1QVFkpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICBpZiAobmFtZS5Jc0VtcHR5KCkpDQorICAgIHJldHVybiBTX09LOw0KKyAgVUludDMyIHY7DQorICBpZiAoUGFyc2VTdHJpbmdUb1VJbnQzMihuYW1lLCB2KSAhPSBuYW1lLkxlbigpKQ0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgcmVzVmFsdWUgPSB2Ow0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgUGFyc2VNdFByb3AoY29uc3QgVVN0cmluZyAmbmFtZSwgY29uc3QgUFJPUFZBUklBTlQgJnByb3AsIFVJbnQzMiBkZWZhdWx0TnVtVGhyZWFkcywgVUludDMyICZudW1UaHJlYWRzKQ0KK3sNCisgIGlmIChuYW1lLklzRW1wdHkoKSkNCisgIHsNCisgICAgc3dpdGNoIChwcm9wLnZ0KQ0KKyAgICB7DQorICAgICAgY2FzZSBWVF9VSTQ6DQorICAgICAgICBudW1UaHJlYWRzID0gcHJvcC51bFZhbDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgew0KKyAgICAgICAgYm9vbCB2YWw7DQorICAgICAgICBSSU5PSyhQUk9QVkFSSUFOVF90b19ib29sKHByb3AsIHZhbCkpOw0KKyAgICAgICAgbnVtVGhyZWFkcyA9ICh2YWwgPyBkZWZhdWx0TnVtVGhyZWFkcyA6IDEpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBTX09LOw0KKyAgfQ0KKyAgaWYgKHByb3AudnQgIT0gVlRfRU1QVFkpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICByZXR1cm4gUGFyc2VQcm9wVG9VSW50MzIobmFtZSwgcHJvcCwgbnVtVGhyZWFkcyk7DQorfQ0KKw0KK3N0YXRpYyBIUkVTVUxUIFN0cmluZ1RvRGljdFNpemUoY29uc3QgVVN0cmluZyAmcywgVUludDMyICZkaWNTaXplKQ0KK3sNCisgIGNvbnN0IHdjaGFyX3QgKmVuZDsNCisgIFVJbnQzMiBudW1iZXIgPSBDb252ZXJ0U3RyaW5nVG9VSW50MzIocywgJmVuZCk7DQorICB1bnNpZ25lZCBudW1EaWdpdHMgPSAodW5zaWduZWQpKGVuZCAtIHMpOw0KKyAgaWYgKG51bURpZ2l0cyA9PSAwIHx8IHMuTGVuKCkgPiBudW1EaWdpdHMgKyAxKQ0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgY29uc3QgdW5zaWduZWQga0xvZ0RpY3RTaXplTGltaXQgPSAzMjsNCisgIGlmIChzLkxlbigpID09IG51bURpZ2l0cykNCisgIHsNCisgICAgaWYgKG51bWJlciA+PSBrTG9nRGljdFNpemVMaW1pdCkNCisgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICBkaWNTaXplID0gKFVJbnQzMikxIDw8ICh1bnNpZ25lZCludW1iZXI7DQorICAgIHJldHVybiBTX09LOw0KKyAgfQ0KKyAgdW5zaWduZWQgbnVtQml0czsNCisgIHN3aXRjaCAoTXlDaGFyTG93ZXJfQXNjaWkoc1tudW1EaWdpdHNdKSkNCisgIHsNCisgICAgY2FzZSAnYic6IGRpY1NpemUgPSBudW1iZXI7IHJldHVybiBTX09LOw0KKyAgICBjYXNlICdrJzogbnVtQml0cyA9IDEwOyBicmVhazsNCisgICAgY2FzZSAnbSc6IG51bUJpdHMgPSAyMDsgYnJlYWs7DQorICAgIGNhc2UgJ2cnOiBudW1CaXRzID0gMzA7IGJyZWFrOw0KKyAgICBkZWZhdWx0OiByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgfQ0KKyAgaWYgKG51bWJlciA+PSAoKFVJbnQzMikxIDw8IChrTG9nRGljdFNpemVMaW1pdCAtIG51bUJpdHMpKSkNCisgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgIGRpY1NpemUgPSBudW1iZXIgPDwgbnVtQml0czsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBQUk9QVkFSSUFOVF90b19EaWN0U2l6ZShjb25zdCBQUk9QVkFSSUFOVCAmcHJvcCwgVUludDMyICZyZXNWYWx1ZSkNCit7DQorICBpZiAocHJvcC52dCA9PSBWVF9VSTQpDQorICB7DQorICAgIFVJbnQzMiB2ID0gcHJvcC51bFZhbDsNCisgICAgaWYgKHYgPj0gMzIpDQorICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgcmVzVmFsdWUgPSAoVUludDMyKTEgPDwgdjsNCisgICAgcmV0dXJuIFNfT0s7DQorICB9DQorICBpZiAocHJvcC52dCA9PSBWVF9CU1RSKQ0KKyAgICByZXR1cm4gU3RyaW5nVG9EaWN0U2l6ZShwcm9wLmJzdHJWYWwsIHJlc1ZhbHVlKTsNCisgIHJldHVybiBFX0lOVkFMSURBUkc7DQorfQ0KKw0KK3ZvaWQgQ1Byb3BzOjpBZGRQcm9wMzIoUFJPUElEIHByb3BpZCwgVUludDMyIGxldmVsKQ0KK3sNCisgIENQcm9wIHByb3A7DQorICBwcm9wLklzT3B0aW9uYWwgPSB0cnVlOw0KKyAgcHJvcC5JZCA9IHByb3BpZDsNCisgIHByb3AuVmFsdWUgPSAoVUludDMyKWxldmVsOw0KKyAgUHJvcHMuQWRkKHByb3ApOw0KK30NCisNCitjbGFzcyBDQ29kZXJQcm9wcw0KK3sNCisgIFBST1BJRCAqX3Byb3BJRHM7DQorICBOQ09NOjpDUHJvcFZhcmlhbnQgKl9wcm9wczsNCisgIHVuc2lnbmVkIF9udW1Qcm9wczsNCisgIHVuc2lnbmVkIF9udW1Qcm9wc01heDsNCitwdWJsaWM6DQorICBDQ29kZXJQcm9wcyh1bnNpZ25lZCBudW1Qcm9wc01heCkNCisgIHsNCisgICAgX251bVByb3BzTWF4ID0gbnVtUHJvcHNNYXg7DQorICAgIF9udW1Qcm9wcyA9IDA7DQorICAgIF9wcm9wSURzID0gbmV3IFBST1BJRFtudW1Qcm9wc01heF07DQorICAgIF9wcm9wcyA9IG5ldyBOQ09NOjpDUHJvcFZhcmlhbnRbbnVtUHJvcHNNYXhdOw0KKyAgfQ0KKyAgfkNDb2RlclByb3BzKCkNCisgIHsNCisgICAgZGVsZXRlIFtdX3Byb3BJRHM7DQorICAgIGRlbGV0ZSBbXV9wcm9wczsNCisgIH0NCisgIHZvaWQgQWRkUHJvcChjb25zdCBDUHJvcCAmcHJvcCk7DQorICBIUkVTVUxUIFNldFByb3BzKElDb21wcmVzc1NldENvZGVyUHJvcGVydGllcyAqc2V0Q29kZXJQcm9wZXJ0aWVzKQ0KKyAgew0KKyAgICByZXR1cm4gc2V0Q29kZXJQcm9wZXJ0aWVzLT5TZXRDb2RlclByb3BlcnRpZXMoX3Byb3BJRHMsIF9wcm9wcywgX251bVByb3BzKTsNCisgIH0NCit9Ow0KKw0KK3ZvaWQgQ0NvZGVyUHJvcHM6OkFkZFByb3AoY29uc3QgQ1Byb3AgJnByb3ApDQorew0KKyAgaWYgKF9udW1Qcm9wcyA+PSBfbnVtUHJvcHNNYXgpDQorICAgIHRocm93IDE7DQorICBfcHJvcElEc1tfbnVtUHJvcHNdID0gcHJvcC5JZDsNCisgIF9wcm9wc1tfbnVtUHJvcHNdID0gcHJvcC5WYWx1ZTsNCisgIF9udW1Qcm9wcysrOw0KK30NCisNCitIUkVTVUxUIENQcm9wczo6U2V0Q29kZXJQcm9wcyhJQ29tcHJlc3NTZXRDb2RlclByb3BlcnRpZXMgKnNjcCwgY29uc3QgVUludDY0ICpkYXRhU2l6ZVJlZHVjZSkgY29uc3QNCit7DQorICBDQ29kZXJQcm9wcyBjb2RlclByb3BzKFByb3BzLlNpemUoKSArIChkYXRhU2l6ZVJlZHVjZSA/IDEgOiAwKSk7DQorICBGT1JfVkVDVE9SIChpLCBQcm9wcykNCisgICAgY29kZXJQcm9wcy5BZGRQcm9wKFByb3BzW2ldKTsNCisgIGlmIChkYXRhU2l6ZVJlZHVjZSkNCisgIHsNCisgICAgQ1Byb3AgcHJvcDsNCisgICAgcHJvcC5JZCA9IE5Db2RlclByb3BJRDo6a1JlZHVjZVNpemU7DQorICAgIHByb3AuVmFsdWUgPSAqZGF0YVNpemVSZWR1Y2U7DQorICAgIGNvZGVyUHJvcHMuQWRkUHJvcChwcm9wKTsNCisgIH0NCisgIHJldHVybiBjb2RlclByb3BzLlNldFByb3BzKHNjcCk7DQorfQ0KKw0KKw0KK2ludCBDTWV0aG9kUHJvcHM6OkZpbmRQcm9wKFBST1BJRCBpZCkgY29uc3QNCit7DQorICBmb3IgKGludCBpID0gUHJvcHMuU2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pDQorICAgIGlmIChQcm9wc1tpXS5JZCA9PSBpZCkNCisgICAgICByZXR1cm4gaTsNCisgIHJldHVybiAtMTsNCit9DQorDQoraW50IENNZXRob2RQcm9wczo6R2V0TGV2ZWwoKSBjb25zdA0KK3sNCisgIGludCBpID0gRmluZFByb3AoTkNvZGVyUHJvcElEOjprTGV2ZWwpOw0KKyAgaWYgKGkgPCAwKQ0KKyAgICByZXR1cm4gNTsNCisgIGlmIChQcm9wc1tpXS5WYWx1ZS52dCAhPSBWVF9VSTQpDQorICAgIHJldHVybiA5Ow0KKyAgVUludDMyIGxldmVsID0gUHJvcHNbaV0uVmFsdWUudWxWYWw7DQorICByZXR1cm4gbGV2ZWwgPiA5ID8gOSA6IChpbnQpbGV2ZWw7DQorfQ0KKw0KK3N0cnVjdCBDTmFtZVRvUHJvcElEDQorew0KKyAgVkFSVFlQRSBWYXJUeXBlOw0KKyAgY29uc3QgY2hhciAqTmFtZTsNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBDTmFtZVRvUHJvcElEIGdfTmFtZVRvUHJvcElEW10gPQ0KK3sNCisgIHsgVlRfVUk0LCAiIiB9LA0KKyAgeyBWVF9VSTQsICJkIiB9LA0KKyAgeyBWVF9VSTQsICJtZW0iIH0sDQorICB7IFZUX1VJNCwgIm8iIH0sDQorICB7IFZUX1VJNCwgImMiIH0sDQorICB7IFZUX1VJNCwgInBiIiB9LA0KKyAgeyBWVF9VSTQsICJsYyIgfSwNCisgIHsgVlRfVUk0LCAibHAiIH0sDQorICB7IFZUX1VJNCwgImZiIiB9LA0KKyAgeyBWVF9CU1RSLCAibWYiIH0sDQorICB7IFZUX1VJNCwgIm1jIiB9LA0KKyAgeyBWVF9VSTQsICJwYXNzIiB9LA0KKyAgeyBWVF9VSTQsICJhIiB9LA0KKyAgeyBWVF9VSTQsICJtdCIgfSwNCisgIHsgVlRfQk9PTCwgImVvcyIgfSwNCisgIHsgVlRfVUk0LCAieCIgfSwNCisgIHsgVlRfVUk0LCAicmVkdWNlU2l6ZSIgfQ0KK307DQorDQorc3RhdGljIGludCBGaW5kUHJvcElkRXhhY3QoY29uc3QgVVN0cmluZyAmbmFtZSkNCit7DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQVJSQVlfU0laRShnX05hbWVUb1Byb3BJRCk7IGkrKykNCisgICAgaWYgKFN0cmluZ3NBcmVFcXVhbE5vQ2FzZV9Bc2NpaShuYW1lLCBnX05hbWVUb1Byb3BJRFtpXS5OYW1lKSkNCisgICAgICByZXR1cm4gaTsNCisgIHJldHVybiAtMTsNCit9DQorDQorc3RhdGljIGJvb2wgQ29udmVydFByb3BlcnR5KGNvbnN0IFBST1BWQVJJQU5UICZzcmNQcm9wLCBWQVJUWVBFIHZhclR5cGUsIE5DT006OkNQcm9wVmFyaWFudCAmZGVzdFByb3ApDQorew0KKyAgaWYgKHZhclR5cGUgPT0gc3JjUHJvcC52dCkNCisgIHsNCisgICAgZGVzdFByb3AgPSBzcmNQcm9wOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIGlmICh2YXJUeXBlID09IFZUX0JPT0wpDQorICB7DQorICAgIGJvb2wgcmVzOw0KKyAgICBpZiAoUFJPUFZBUklBTlRfdG9fYm9vbChzcmNQcm9wLCByZXMpICE9IFNfT0spDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBkZXN0UHJvcCA9IHJlczsNCisgICAgcmV0dXJuIHRydWU7DQorICB9DQorICBpZiAoc3JjUHJvcC52dCA9PSBWVF9FTVBUWSkNCisgIHsNCisgICAgZGVzdFByb3AgPSBzcmNQcm9wOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIHJldHVybiBmYWxzZTsNCit9DQorICAgIA0KK3N0YXRpYyB2b2lkIFNwbGl0UGFyYW1zKGNvbnN0IFVTdHJpbmcgJnNyY1N0cmluZywgVVN0cmluZ1ZlY3RvciAmc3ViU3RyaW5ncykNCit7DQorICBzdWJTdHJpbmdzLkNsZWFyKCk7DQorICBVU3RyaW5nIHM7DQorICBpbnQgbGVuID0gc3JjU3RyaW5nLkxlbigpOw0KKyAgaWYgKGxlbiA9PSAwKQ0KKyAgICByZXR1cm47DQorICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQ0KKyAgew0KKyAgICB3Y2hhcl90IGMgPSBzcmNTdHJpbmdbaV07DQorICAgIGlmIChjID09IEwnOicpDQorICAgIHsNCisgICAgICBzdWJTdHJpbmdzLkFkZChzKTsNCisgICAgICBzLkVtcHR5KCk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAgIHMgKz0gYzsNCisgIH0NCisgIHN1YlN0cmluZ3MuQWRkKHMpOw0KK30NCisNCitzdGF0aWMgdm9pZCBTcGxpdFBhcmFtKGNvbnN0IFVTdHJpbmcgJnBhcmFtLCBVU3RyaW5nICZuYW1lLCBVU3RyaW5nICZ2YWx1ZSkNCit7DQorICBpbnQgZXFQb3MgPSBwYXJhbS5GaW5kKEwnPScpOw0KKyAgaWYgKGVxUG9zID49IDApDQorICB7DQorICAgIG5hbWUuU2V0RnJvbShwYXJhbSwgZXFQb3MpOw0KKyAgICB2YWx1ZSA9IHBhcmFtLlB0cihlcVBvcyArIDEpOw0KKyAgICByZXR1cm47DQorICB9DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHBhcmFtLkxlbigpOyBpKyspDQorICB7DQorICAgIHdjaGFyX3QgYyA9IHBhcmFtW2ldOw0KKyAgICBpZiAoYyA+PSBMJzAnICYmIGMgPD0gTCc5JykNCisgICAgICBicmVhazsNCisgIH0NCisgIG5hbWUuU2V0RnJvbShwYXJhbSwgaSk7DQorICB2YWx1ZSA9IHBhcmFtLlB0cihpKTsNCit9DQorDQorc3RhdGljIGJvb2wgSXNMb2dTaXplUHJvcChQUk9QSUQgcHJvcGlkKQ0KK3sNCisgIHN3aXRjaCAocHJvcGlkKQ0KKyAgew0KKyAgICBjYXNlIE5Db2RlclByb3BJRDo6a0RpY3Rpb25hcnlTaXplOg0KKyAgICBjYXNlIE5Db2RlclByb3BJRDo6a1VzZWRNZW1vcnlTaXplOg0KKyAgICBjYXNlIE5Db2RlclByb3BJRDo6a0Jsb2NrU2l6ZToNCisgICAgY2FzZSBOQ29kZXJQcm9wSUQ6OmtSZWR1Y2VTaXplOg0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitIUkVTVUxUIENNZXRob2RQcm9wczo6U2V0UGFyYW0oY29uc3QgVVN0cmluZyAmbmFtZSwgY29uc3QgVVN0cmluZyAmdmFsdWUpDQorew0KKyAgaW50IGluZGV4ID0gRmluZFByb3BJZEV4YWN0KG5hbWUpOw0KKyAgaWYgKGluZGV4IDwgMCkNCisgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgIGNvbnN0IENOYW1lVG9Qcm9wSUQgJm5hbWVUb1Byb3BJRCA9IGdfTmFtZVRvUHJvcElEW2luZGV4XTsNCisgIENQcm9wIHByb3A7DQorICBwcm9wLklkID0gaW5kZXg7DQorDQorICBpZiAoSXNMb2dTaXplUHJvcChwcm9wLklkKSkNCisgIHsNCisgICAgVUludDMyIGRpY1NpemU7DQorICAgIFJJTk9LKFN0cmluZ1RvRGljdFNpemUodmFsdWUsIGRpY1NpemUpKTsNCisgICAgcHJvcC5WYWx1ZSA9IGRpY1NpemU7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wVmFsdWU7DQorICAgIGlmIChuYW1lVG9Qcm9wSUQuVmFyVHlwZSA9PSBWVF9CU1RSKQ0KKyAgICAgIHByb3BWYWx1ZSA9IHZhbHVlOw0KKyAgICBlbHNlIGlmIChuYW1lVG9Qcm9wSUQuVmFyVHlwZSA9PSBWVF9CT09MKQ0KKyAgICB7DQorICAgICAgYm9vbCByZXM7DQorICAgICAgaWYgKCFTdHJpbmdUb0Jvb2wodmFsdWUsIHJlcykpDQorICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICAgIHByb3BWYWx1ZSA9IHJlczsNCisgICAgfQ0KKyAgICBlbHNlIGlmICghdmFsdWUuSXNFbXB0eSgpKQ0KKyAgICB7DQorICAgICAgVUludDMyIG51bWJlcjsNCisgICAgICBpZiAoUGFyc2VTdHJpbmdUb1VJbnQzMih2YWx1ZSwgbnVtYmVyKSA9PSB2YWx1ZS5MZW4oKSkNCisgICAgICAgIHByb3BWYWx1ZSA9IG51bWJlcjsNCisgICAgICBlbHNlDQorICAgICAgICBwcm9wVmFsdWUgPSB2YWx1ZTsNCisgICAgfQ0KKyAgICBpZiAoIUNvbnZlcnRQcm9wZXJ0eShwcm9wVmFsdWUsIG5hbWVUb1Byb3BJRC5WYXJUeXBlLCBwcm9wLlZhbHVlKSkNCisgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgfQ0KKyAgUHJvcHMuQWRkKHByb3ApOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ01ldGhvZFByb3BzOjpQYXJzZVBhcmFtc0Zyb21TdHJpbmcoY29uc3QgVVN0cmluZyAmc3JjU3RyaW5nKQ0KK3sNCisgIFVTdHJpbmdWZWN0b3IgcGFyYW1zOw0KKyAgU3BsaXRQYXJhbXMoc3JjU3RyaW5nLCBwYXJhbXMpOw0KKyAgRk9SX1ZFQ1RPUiAoaSwgcGFyYW1zKQ0KKyAgew0KKyAgICBjb25zdCBVU3RyaW5nICZwYXJhbSA9IHBhcmFtc1tpXTsNCisgICAgVVN0cmluZyBuYW1lLCB2YWx1ZTsNCisgICAgU3BsaXRQYXJhbShwYXJhbSwgbmFtZSwgdmFsdWUpOw0KKyAgICBSSU5PSyhTZXRQYXJhbShuYW1lLCB2YWx1ZSkpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ01ldGhvZFByb3BzOjpQYXJzZVBhcmFtc0Zyb21QUk9QVkFSSUFOVChjb25zdCBVU3RyaW5nICZyZWFsTmFtZSwgY29uc3QgUFJPUFZBUklBTlQgJnZhbHVlKQ0KK3sNCisgIGlmIChyZWFsTmFtZS5MZW4oKSA9PSAwKQ0KKyAgew0KKyAgICAvLyBbZW1wdHldPW1ldGhvZA0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgfQ0KKyAgaWYgKHZhbHVlLnZ0ID09IFZUX0VNUFRZKQ0KKyAgew0KKyAgICAvLyB7cmVhbE5hbWV9PVtlbXB0eV0NCisgICAgVVN0cmluZyBuYW1lLCB2YWx1ZTsNCisgICAgU3BsaXRQYXJhbShyZWFsTmFtZSwgbmFtZSwgdmFsdWUpOw0KKyAgICByZXR1cm4gU2V0UGFyYW0obmFtZSwgdmFsdWUpOw0KKyAgfQ0KKyAgDQorICAvLyB7cmVhbE5hbWV9PXZhbHVlDQorICBpbnQgaW5kZXggPSBGaW5kUHJvcElkRXhhY3QocmVhbE5hbWUpOw0KKyAgaWYgKGluZGV4IDwgMCkNCisgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgIGNvbnN0IENOYW1lVG9Qcm9wSUQgJm5hbWVUb1Byb3BJRCA9IGdfTmFtZVRvUHJvcElEW2luZGV4XTsNCisgIENQcm9wIHByb3A7DQorICBwcm9wLklkID0gaW5kZXg7DQorICANCisgIGlmIChJc0xvZ1NpemVQcm9wKHByb3AuSWQpKQ0KKyAgew0KKyAgICBVSW50MzIgZGljU2l6ZTsNCisgICAgUklOT0soUFJPUFZBUklBTlRfdG9fRGljdFNpemUodmFsdWUsIGRpY1NpemUpKTsNCisgICAgcHJvcC5WYWx1ZSA9IGRpY1NpemU7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIGlmICghQ29udmVydFByb3BlcnR5KHZhbHVlLCBuYW1lVG9Qcm9wSUQuVmFyVHlwZSwgcHJvcC5WYWx1ZSkpDQorICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgIH0NCisgIFByb3BzLkFkZChwcm9wKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENPbmVNZXRob2RJbmZvOjpQYXJzZU1ldGhvZEZyb21TdHJpbmcoY29uc3QgVVN0cmluZyAmcykNCit7DQorICBpbnQgc3BsaXRQb3MgPSBzLkZpbmQoJzonKTsNCisgIE1ldGhvZE5hbWUgPSBzOw0KKyAgaWYgKHNwbGl0UG9zIDwgMCkNCisgICAgcmV0dXJuIFNfT0s7DQorICBNZXRob2ROYW1lLkRlbGV0ZUZyb20oc3BsaXRQb3MpOw0KKyAgcmV0dXJuIFBhcnNlUGFyYW1zRnJvbVN0cmluZyhzLlB0cihzcGxpdFBvcyArIDEpKTsNCit9DQorDQorSFJFU1VMVCBDT25lTWV0aG9kSW5mbzo6UGFyc2VNZXRob2RGcm9tUFJPUFZBUklBTlQoY29uc3QgVVN0cmluZyAmcmVhbE5hbWUsIGNvbnN0IFBST1BWQVJJQU5UICZ2YWx1ZSkNCit7DQorICBpZiAoIXJlYWxOYW1lLklzRW1wdHkoKSAmJiAhU3RyaW5nc0FyZUVxdWFsTm9DYXNlX0FzY2lpKHJlYWxOYW1lLCAibSIpKQ0KKyAgICByZXR1cm4gUGFyc2VQYXJhbXNGcm9tUFJPUFZBUklBTlQocmVhbE5hbWUsIHZhbHVlKTsNCisgIC8vIC1te059PW1ldGhvZA0KKyAgaWYgKHZhbHVlLnZ0ICE9IFZUX0JTVFIpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICByZXR1cm4gUGFyc2VNZXRob2RGcm9tU3RyaW5nKHZhbHVlLmJzdHJWYWwpOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9NZXRob2RQcm9wcy5oIGIvbHptYS9DUFAvN3ppcC9Db21tb24vTWV0aG9kUHJvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzJiMjc2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21tb24vTWV0aG9kUHJvcHMuaApAQCAtMCwwICsxLDE4NSBAQAorLy8gTWV0aG9kUHJvcHMuaA0KKw0KKyNpZm5kZWYgX183Wl9NRVRIT0RfUFJPUFNfSA0KKyNkZWZpbmUgX183Wl9NRVRIT0RfUFJPUFNfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlTdHJpbmcuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vV2luZG93cy9Qcm9wVmFyaWFudC5oIg0KKw0KKyNpbmNsdWRlICIuLi9JQ29kZXIuaCINCisNCitib29sIFN0cmluZ1RvQm9vbChjb25zdCBVU3RyaW5nICZzLCBib29sICZyZXMpOw0KK0hSRVNVTFQgUFJPUFZBUklBTlRfdG9fYm9vbChjb25zdCBQUk9QVkFSSUFOVCAmcHJvcCwgYm9vbCAmZGVzdCk7DQordW5zaWduZWQgUGFyc2VTdHJpbmdUb1VJbnQzMihjb25zdCBVU3RyaW5nICZzcmNTdHJpbmcsIFVJbnQzMiAmbnVtYmVyKTsNCitIUkVTVUxUIFBhcnNlUHJvcFRvVUludDMyKGNvbnN0IFVTdHJpbmcgJm5hbWUsIGNvbnN0IFBST1BWQVJJQU5UICZwcm9wLCBVSW50MzIgJnJlc1ZhbHVlKTsNCisNCitIUkVTVUxUIFBhcnNlTXRQcm9wKGNvbnN0IFVTdHJpbmcgJm5hbWUsIGNvbnN0IFBST1BWQVJJQU5UICZwcm9wLCBVSW50MzIgZGVmYXVsdE51bVRocmVhZHMsIFVJbnQzMiAmbnVtVGhyZWFkcyk7DQorDQorc3RydWN0IENQcm9wDQorew0KKyAgUFJPUElEIElkOw0KKyAgYm9vbCBJc09wdGlvbmFsOw0KKyAgTldpbmRvd3M6Ok5DT006OkNQcm9wVmFyaWFudCBWYWx1ZTsNCisgIENQcm9wKCk6IElzT3B0aW9uYWwoZmFsc2UpIHt9DQorfTsNCisNCitzdHJ1Y3QgQ1Byb3BzDQorew0KKyAgQ09iamVjdFZlY3RvcjxDUHJvcD4gUHJvcHM7DQorDQorICB2b2lkIENsZWFyKCkgeyBQcm9wcy5DbGVhcigpOyB9DQorDQorICBib29sIEFyZVRoZXJlTm9uT3B0aW9uYWxQcm9wcygpIGNvbnN0DQorICB7DQorICAgIEZPUl9WRUNUT1IgKGksIFByb3BzKQ0KKyAgICAgIGlmICghUHJvcHNbaV0uSXNPcHRpb25hbCkNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorDQorICB2b2lkIEFkZFByb3AzMihQUk9QSUQgcHJvcGlkLCBVSW50MzIgbGV2ZWwpOw0KKw0KKyAgdm9pZCBBZGRQcm9wU3RyaW5nKFBST1BJRCBwcm9waWQsIGNvbnN0IHdjaGFyX3QgKnMpDQorICB7DQorICAgIENQcm9wIHByb3A7DQorICAgIHByb3AuSXNPcHRpb25hbCA9IHRydWU7DQorICAgIHByb3AuSWQgPSBwcm9waWQ7DQorICAgIHByb3AuVmFsdWUgPSBzOw0KKyAgICBQcm9wcy5BZGQocHJvcCk7DQorICB9DQorDQorICBIUkVTVUxUIFNldENvZGVyUHJvcHMoSUNvbXByZXNzU2V0Q29kZXJQcm9wZXJ0aWVzICpzY3AsIGNvbnN0IFVJbnQ2NCAqZGF0YVNpemVSZWR1Y2UpIGNvbnN0Ow0KK307DQorDQorY2xhc3MgQ01ldGhvZFByb3BzOiBwdWJsaWMgQ1Byb3BzDQorew0KKyAgSFJFU1VMVCBTZXRQYXJhbShjb25zdCBVU3RyaW5nICZuYW1lLCBjb25zdCBVU3RyaW5nICZ2YWx1ZSk7DQorcHVibGljOg0KKyAgaW50IEdldExldmVsKCkgY29uc3Q7DQorICBpbnQgR2V0X051bVRocmVhZHMoKSBjb25zdA0KKyAgew0KKyAgICBpbnQgaSA9IEZpbmRQcm9wKE5Db2RlclByb3BJRDo6a051bVRocmVhZHMpOw0KKyAgICBpZiAoaSA+PSAwKQ0KKyAgICAgIGlmIChQcm9wc1tpXS5WYWx1ZS52dCA9PSBWVF9VSTQpDQorICAgICAgICByZXR1cm4gKGludClQcm9wc1tpXS5WYWx1ZS51bFZhbDsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKw0KKyAgYm9vbCBHZXRfRGljU2l6ZShVSW50MzIgJnJlcykgY29uc3QNCisgIHsNCisgICAgcmVzID0gMDsNCisgICAgaW50IGkgPSBGaW5kUHJvcChOQ29kZXJQcm9wSUQ6OmtEaWN0aW9uYXJ5U2l6ZSk7DQorICAgIGlmIChpID49IDApDQorICAgICAgaWYgKFByb3BzW2ldLlZhbHVlLnZ0ID09IFZUX1VJNCkNCisgICAgICB7DQorICAgICAgICByZXMgPSBQcm9wc1tpXS5WYWx1ZS51bFZhbDsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKw0KKyAgaW50IEZpbmRQcm9wKFBST1BJRCBpZCkgY29uc3Q7DQorDQorICBVSW50MzIgR2V0X0x6bWFfQWxnbygpIGNvbnN0DQorICB7DQorICAgIGludCBpID0gRmluZFByb3AoTkNvZGVyUHJvcElEOjprQWxnb3JpdGhtKTsNCisgICAgaWYgKGkgPj0gMCkNCisgICAgICBpZiAoUHJvcHNbaV0uVmFsdWUudnQgPT0gVlRfVUk0KQ0KKyAgICAgICAgcmV0dXJuIFByb3BzW2ldLlZhbHVlLnVsVmFsOw0KKyAgICByZXR1cm4gR2V0TGV2ZWwoKSA+PSA1ID8gMSA6IDA7DQorICB9DQorDQorICBVSW50MzIgR2V0X0x6bWFfRGljU2l6ZSgpIGNvbnN0DQorICB7DQorICAgIGludCBpID0gRmluZFByb3AoTkNvZGVyUHJvcElEOjprRGljdGlvbmFyeVNpemUpOw0KKyAgICBpZiAoaSA+PSAwKQ0KKyAgICAgIGlmIChQcm9wc1tpXS5WYWx1ZS52dCA9PSBWVF9VSTQpDQorICAgICAgICByZXR1cm4gUHJvcHNbaV0uVmFsdWUudWxWYWw7DQorICAgIGludCBsZXZlbCA9IEdldExldmVsKCk7DQorICAgIHJldHVybiBsZXZlbCA8PSA1ID8gKDEgPDwgKGxldmVsICogMiArIDE0KSkgOiAobGV2ZWwgPT0gNiA/ICgxIDw8IDI1KSA6ICgxIDw8IDI2KSk7DQorICB9DQorDQorICBVSW50MzIgR2V0X0x6bWFfTnVtVGhyZWFkcyhib29sICZmaXhlZE51bWJlcikgY29uc3QNCisgIHsNCisgICAgZml4ZWROdW1iZXIgPSBmYWxzZTsNCisgICAgaW50IG51bVRocmVhZHMgPSBHZXRfTnVtVGhyZWFkcygpOw0KKyAgICBpZiAobnVtVGhyZWFkcyA+PSAwKQ0KKyAgICB7DQorICAgICAgZml4ZWROdW1iZXIgPSB0cnVlOw0KKyAgICAgIHJldHVybiBudW1UaHJlYWRzIDwgMiA/IDEgOiAyOw0KKyAgICB9DQorICAgIHJldHVybiBHZXRfTHptYV9BbGdvKCkgPT0gMCA/IDEgOiAyOw0KKyAgfQ0KKw0KKyAgVUludDMyIEdldF9CWmlwMl9OdW1UaHJlYWRzKGJvb2wgJmZpeGVkTnVtYmVyKSBjb25zdA0KKyAgew0KKyAgICBmaXhlZE51bWJlciA9IGZhbHNlOw0KKyAgICBpbnQgbnVtVGhyZWFkcyA9IEdldF9OdW1UaHJlYWRzKCk7DQorICAgIGlmIChudW1UaHJlYWRzID49IDApDQorICAgIHsNCisgICAgICBmaXhlZE51bWJlciA9IHRydWU7DQorICAgICAgaWYgKG51bVRocmVhZHMgPCAxKSByZXR1cm4gMTsNCisgICAgICBpZiAobnVtVGhyZWFkcyA+IDY0KSByZXR1cm4gNjQ7DQorICAgICAgcmV0dXJuIG51bVRocmVhZHM7DQorICAgIH0NCisgICAgcmV0dXJuIDE7DQorICB9DQorDQorICBVSW50MzIgR2V0X0JaaXAyX0Jsb2NrU2l6ZSgpIGNvbnN0DQorICB7DQorICAgIGludCBpID0gRmluZFByb3AoTkNvZGVyUHJvcElEOjprRGljdGlvbmFyeVNpemUpOw0KKyAgICBpZiAoaSA+PSAwKQ0KKyAgICAgIGlmIChQcm9wc1tpXS5WYWx1ZS52dCA9PSBWVF9VSTQpDQorICAgICAgew0KKyAgICAgICAgVUludDMyIGJsb2NrU2l6ZSA9IFByb3BzW2ldLlZhbHVlLnVsVmFsOw0KKyAgICAgICAgY29uc3QgVUludDMyIGtEaWNTaXplTWluID0gMTAwMDAwOw0KKyAgICAgICAgY29uc3QgVUludDMyIGtEaWNTaXplTWF4ID0gOTAwMDAwOw0KKyAgICAgICAgaWYgKGJsb2NrU2l6ZSA8IGtEaWNTaXplTWluKSBibG9ja1NpemUgPSBrRGljU2l6ZU1pbjsNCisgICAgICAgIGlmIChibG9ja1NpemUgPiBrRGljU2l6ZU1heCkgYmxvY2tTaXplID0ga0RpY1NpemVNYXg7DQorICAgICAgICByZXR1cm4gYmxvY2tTaXplOw0KKyAgICAgIH0NCisgICAgaW50IGxldmVsID0gR2V0TGV2ZWwoKTsNCisgICAgcmV0dXJuIDEwMDAwMCAqIChsZXZlbCA+PSA1ID8gOSA6IChsZXZlbCA+PSAxID8gbGV2ZWwgKiAyIC0gMTogMSkpOw0KKyAgfQ0KKw0KKyAgVUludDMyIEdldF9QcG1kX01lbVNpemUoKSBjb25zdA0KKyAgew0KKyAgICBpbnQgaSA9IEZpbmRQcm9wKE5Db2RlclByb3BJRDo6a1VzZWRNZW1vcnlTaXplKTsNCisgICAgaWYgKGkgPj0gMCkNCisgICAgICBpZiAoUHJvcHNbaV0uVmFsdWUudnQgPT0gVlRfVUk0KQ0KKyAgICAgICAgcmV0dXJuIFByb3BzW2ldLlZhbHVlLnVsVmFsOw0KKyAgICBpbnQgbGV2ZWwgPSBHZXRMZXZlbCgpOw0KKyAgICByZXR1cm4gbGV2ZWwgPj0gOSA/ICgxOTIgPDwgMjApIDogKChVSW50MzIpMSA8PCAobGV2ZWwgKyAxOSkpOw0KKyAgfQ0KKw0KKyAgdm9pZCBBZGRMZXZlbFByb3AoVUludDMyIGxldmVsKQ0KKyAgew0KKyAgICBBZGRQcm9wMzIoTkNvZGVyUHJvcElEOjprTGV2ZWwsIGxldmVsKTsNCisgIH0NCisNCisgIHZvaWQgQWRkTnVtVGhyZWFkc1Byb3AoVUludDMyIG51bVRocmVhZHMpDQorICB7DQorICAgIEFkZFByb3AzMihOQ29kZXJQcm9wSUQ6OmtOdW1UaHJlYWRzLCBudW1UaHJlYWRzKTsNCisgIH0NCisNCisgIEhSRVNVTFQgUGFyc2VQYXJhbXNGcm9tU3RyaW5nKGNvbnN0IFVTdHJpbmcgJnNyY1N0cmluZyk7DQorICBIUkVTVUxUIFBhcnNlUGFyYW1zRnJvbVBST1BWQVJJQU5UKGNvbnN0IFVTdHJpbmcgJnJlYWxOYW1lLCBjb25zdCBQUk9QVkFSSUFOVCAmdmFsdWUpOw0KK307DQorDQorY2xhc3MgQ09uZU1ldGhvZEluZm86IHB1YmxpYyBDTWV0aG9kUHJvcHMNCit7DQorcHVibGljOg0KKyAgVVN0cmluZyBNZXRob2ROYW1lOw0KKyAgDQorICB2b2lkIENsZWFyKCkNCisgIHsNCisgICAgQ01ldGhvZFByb3BzOjpDbGVhcigpOw0KKyAgICBNZXRob2ROYW1lLkVtcHR5KCk7DQorICB9DQorICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBNZXRob2ROYW1lLklzRW1wdHkoKSAmJiBQcm9wcy5Jc0VtcHR5KCk7IH0NCisgIEhSRVNVTFQgUGFyc2VNZXRob2RGcm9tUFJPUFZBUklBTlQoY29uc3QgVVN0cmluZyAmcmVhbE5hbWUsIGNvbnN0IFBST1BWQVJJQU5UICZ2YWx1ZSk7DQorICBIUkVTVUxUIFBhcnNlTWV0aG9kRnJvbVN0cmluZyhjb25zdCBVU3RyaW5nICZzKTsNCit9Ow0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL09mZnNldFN0cmVhbS5jcHAgYi9sem1hL0NQUC83emlwL0NvbW1vbi9PZmZzZXRTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMDFjN2YKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9PZmZzZXRTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMzkgQEAKKy8vIE9mZnNldFN0cmVhbS5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9EZWZzLmgiDQorDQorI2luY2x1ZGUgIk9mZnNldFN0cmVhbS5oIg0KKw0KK0hSRVNVTFQgQ09mZnNldE91dFN0cmVhbTo6SW5pdChJT3V0U3RyZWFtICpzdHJlYW0sIFVJbnQ2NCBvZmZzZXQpDQorew0KKyAgX29mZnNldCA9IG9mZnNldDsNCisgIF9zdHJlYW0gPSBzdHJlYW07DQorICByZXR1cm4gX3N0cmVhbS0+U2VlayhvZmZzZXQsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCk7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDT2Zmc2V0T3V0U3RyZWFtOjpXcml0ZShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIHJldHVybiBfc3RyZWFtLT5Xcml0ZShkYXRhLCBzaXplLCBwcm9jZXNzZWRTaXplKTsNCit9DQorDQorU1RETUVUSE9ESU1QIENPZmZzZXRPdXRTdHJlYW06OlNlZWsoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbikNCit7DQorICBVSW50NjQgYWJzb2x1dGVOZXdQb3NpdGlvbjsNCisgIGlmIChzZWVrT3JpZ2luID09IFNUUkVBTV9TRUVLX1NFVCkNCisgIHsNCisgICAgaWYgKG9mZnNldCA8IDApDQorICAgICAgcmV0dXJuIEhSRVNVTFRfV0lOMzJfRVJST1JfTkVHQVRJVkVfU0VFSzsNCisgICAgb2Zmc2V0ICs9IF9vZmZzZXQ7DQorICB9DQorICBIUkVTVUxUIHJlc3VsdCA9IF9zdHJlYW0tPlNlZWsob2Zmc2V0LCBzZWVrT3JpZ2luLCAmYWJzb2x1dGVOZXdQb3NpdGlvbik7DQorICBpZiAobmV3UG9zaXRpb24pDQorICAgICpuZXdQb3NpdGlvbiA9IGFic29sdXRlTmV3UG9zaXRpb24gLSBfb2Zmc2V0Ow0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQorDQorU1RETUVUSE9ESU1QIENPZmZzZXRPdXRTdHJlYW06OlNldFNpemUoVUludDY0IG5ld1NpemUpDQorew0KKyAgcmV0dXJuIF9zdHJlYW0tPlNldFNpemUoX29mZnNldCArIG5ld1NpemUpOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9PZmZzZXRTdHJlYW0uaCBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL09mZnNldFN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODM1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9PZmZzZXRTdHJlYW0uaApAQCAtMCwwICsxLDI2IEBACisvLyBPZmZzZXRTdHJlYW0uaA0KKw0KKyNpZm5kZWYgX19PRkZTRVRfU1RSRUFNX0gNCisjZGVmaW5lIF9fT0ZGU0VUX1NUUkVBTV9IDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKw0KKyNpbmNsdWRlICIuLi9JU3RyZWFtLmgiDQorDQorY2xhc3MgQ09mZnNldE91dFN0cmVhbToNCisgIHB1YmxpYyBJT3V0U3RyZWFtLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBVSW50NjQgX29mZnNldDsNCisgIENNeUNvbVB0cjxJT3V0U3RyZWFtPiBfc3RyZWFtOw0KK3B1YmxpYzoNCisgIEhSRVNVTFQgSW5pdChJT3V0U3RyZWFtICpzdHJlYW0sIFVJbnQ2NCBvZmZzZXQpOw0KKyAgDQorICBNWV9VTktOT1dOX0lNUA0KKw0KKyAgU1RETUVUSE9EKFdyaXRlKShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCisgIFNURE1FVEhPRChTZWVrKShJbnQ2NCBvZmZzZXQsIFVJbnQzMiBzZWVrT3JpZ2luLCBVSW50NjQgKm5ld1Bvc2l0aW9uKTsNCisgIFNURE1FVEhPRChTZXRTaXplKShVSW50NjQgbmV3U2l6ZSk7DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9PdXRCdWZmZXIuY3BwIGIvbHptYS9DUFAvN3ppcC9Db21tb24vT3V0QnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjhkYzhkCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21tb24vT3V0QnVmZmVyLmNwcApAQCAtMCwwICsxLDExMSBAQAorLy8gT3V0QnVmZmVyLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQy9BbGxvYy5oIg0KKw0KKyNpbmNsdWRlICJPdXRCdWZmZXIuaCINCisNCitib29sIENPdXRCdWZmZXI6OkNyZWF0ZShVSW50MzIgYnVmU2l6ZSkgdGhyb3coKQ0KK3sNCisgIGNvbnN0IFVJbnQzMiBrTWluQmxvY2tTaXplID0gMTsNCisgIGlmIChidWZTaXplIDwga01pbkJsb2NrU2l6ZSkNCisgICAgYnVmU2l6ZSA9IGtNaW5CbG9ja1NpemU7DQorICBpZiAoX2J1ZiAhPSAwICYmIF9idWZTaXplID09IGJ1ZlNpemUpDQorICAgIHJldHVybiB0cnVlOw0KKyAgRnJlZSgpOw0KKyAgX2J1ZlNpemUgPSBidWZTaXplOw0KKyAgX2J1ZiA9IChCeXRlICopOjpNaWRBbGxvYyhidWZTaXplKTsNCisgIHJldHVybiAoX2J1ZiAhPSAwKTsNCit9DQorDQordm9pZCBDT3V0QnVmZmVyOjpGcmVlKCkgdGhyb3coKQ0KK3sNCisgIDo6TWlkRnJlZShfYnVmKTsNCisgIF9idWYgPSAwOw0KK30NCisNCit2b2lkIENPdXRCdWZmZXI6OkluaXQoKSB0aHJvdygpDQorew0KKyAgX3N0cmVhbVBvcyA9IDA7DQorICBfbGltaXRQb3MgPSBfYnVmU2l6ZTsNCisgIF9wb3MgPSAwOw0KKyAgX3Byb2Nlc3NlZFNpemUgPSAwOw0KKyAgX292ZXJEaWN0ID0gZmFsc2U7DQorICAjaWZkZWYgX05PX0VYQ0VQVElPTlMNCisgIEVycm9yQ29kZSA9IFNfT0s7DQorICAjZW5kaWYNCit9DQorDQorVUludDY0IENPdXRCdWZmZXI6OkdldFByb2Nlc3NlZFNpemUoKSBjb25zdCB0aHJvdygpDQorew0KKyAgVUludDY0IHJlcyA9IF9wcm9jZXNzZWRTaXplICsgX3BvcyAtIF9zdHJlYW1Qb3M7DQorICBpZiAoX3N0cmVhbVBvcyA+IF9wb3MpDQorICAgIHJlcyArPSBfYnVmU2l6ZTsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KKw0KK0hSRVNVTFQgQ091dEJ1ZmZlcjo6Rmx1c2hQYXJ0KCkgdGhyb3coKQ0KK3sNCisgIC8vIF9zdHJlYW1Qb3MgPCBfYnVmU2l6ZQ0KKyAgVUludDMyIHNpemUgPSAoX3N0cmVhbVBvcyA+PSBfcG9zKSA/IChfYnVmU2l6ZSAtIF9zdHJlYW1Qb3MpIDogKF9wb3MgLSBfc3RyZWFtUG9zKTsNCisgIEhSRVNVTFQgcmVzdWx0ID0gU19PSzsNCisgICNpZmRlZiBfTk9fRVhDRVBUSU9OUw0KKyAgcmVzdWx0ID0gRXJyb3JDb2RlOw0KKyAgI2VuZGlmDQorICBpZiAoX2J1ZjIgIT0gMCkNCisgIHsNCisgICAgbWVtY3B5KF9idWYyLCBfYnVmICsgX3N0cmVhbVBvcywgc2l6ZSk7DQorICAgIF9idWYyICs9IHNpemU7DQorICB9DQorDQorICBpZiAoX3N0cmVhbSAhPSAwDQorICAgICAgI2lmZGVmIF9OT19FWENFUFRJT05TDQorICAgICAgJiYgKEVycm9yQ29kZSA9PSBTX09LKQ0KKyAgICAgICNlbmRpZg0KKyAgICAgKQ0KKyAgew0KKyAgICBVSW50MzIgcHJvY2Vzc2VkU2l6ZSA9IDA7DQorICAgIHJlc3VsdCA9IF9zdHJlYW0tPldyaXRlKF9idWYgKyBfc3RyZWFtUG9zLCBzaXplLCAmcHJvY2Vzc2VkU2l6ZSk7DQorICAgIHNpemUgPSBwcm9jZXNzZWRTaXplOw0KKyAgfQ0KKyAgX3N0cmVhbVBvcyArPSBzaXplOw0KKyAgaWYgKF9zdHJlYW1Qb3MgPT0gX2J1ZlNpemUpDQorICAgIF9zdHJlYW1Qb3MgPSAwOw0KKyAgaWYgKF9wb3MgPT0gX2J1ZlNpemUpDQorICB7DQorICAgIF9vdmVyRGljdCA9IHRydWU7DQorICAgIF9wb3MgPSAwOw0KKyAgfQ0KKyAgX2xpbWl0UG9zID0gKF9zdHJlYW1Qb3MgPiBfcG9zKSA/IF9zdHJlYW1Qb3MgOiBfYnVmU2l6ZTsNCisgIF9wcm9jZXNzZWRTaXplICs9IHNpemU7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisNCitIUkVTVUxUIENPdXRCdWZmZXI6OkZsdXNoKCkgdGhyb3coKQ0KK3sNCisgICNpZmRlZiBfTk9fRVhDRVBUSU9OUw0KKyAgaWYgKEVycm9yQ29kZSAhPSBTX09LKQ0KKyAgICByZXR1cm4gRXJyb3JDb2RlOw0KKyAgI2VuZGlmDQorDQorICB3aGlsZSAoX3N0cmVhbVBvcyAhPSBfcG9zKQ0KKyAgew0KKyAgICBIUkVTVUxUIHJlc3VsdCA9IEZsdXNoUGFydCgpOw0KKyAgICBpZiAocmVzdWx0ICE9IFNfT0spDQorICAgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCit2b2lkIENPdXRCdWZmZXI6OkZsdXNoV2l0aENoZWNrKCkNCit7DQorICBIUkVTVUxUIHJlc3VsdCA9IEZsdXNoKCk7DQorICAjaWZkZWYgX05PX0VYQ0VQVElPTlMNCisgIEVycm9yQ29kZSA9IHJlc3VsdDsNCisgICNlbHNlDQorICBpZiAocmVzdWx0ICE9IFNfT0spDQorICAgIHRocm93IENPdXRCdWZmZXJFeGNlcHRpb24ocmVzdWx0KTsNCisgICNlbmRpZg0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9PdXRCdWZmZXIuaCBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL091dEJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwY2UyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9PdXRCdWZmZXIuaApAQCAtMCwwICsxLDYzIEBACisvLyBPdXRCdWZmZXIuaA0KKw0KKyNpZm5kZWYgX19PVVRfQlVGRkVSX0gNCisjZGVmaW5lIF9fT1VUX0JVRkZFUl9IDQorDQorI2luY2x1ZGUgIi4uL0lTdHJlYW0uaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL015Q29tLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUV4Y2VwdGlvbi5oIg0KKw0KKyNpZm5kZWYgX05PX0VYQ0VQVElPTlMNCitzdHJ1Y3QgQ091dEJ1ZmZlckV4Y2VwdGlvbjogcHVibGljIENTeXN0ZW1FeGNlcHRpb24NCit7DQorICBDT3V0QnVmZmVyRXhjZXB0aW9uKEhSRVNVTFQgZXJyb3JDb2RlKTogQ1N5c3RlbUV4Y2VwdGlvbihlcnJvckNvZGUpIHt9DQorfTsNCisjZW5kaWYNCisNCitjbGFzcyBDT3V0QnVmZmVyDQorew0KK3Byb3RlY3RlZDoNCisgIEJ5dGUgKl9idWY7DQorICBVSW50MzIgX3BvczsNCisgIFVJbnQzMiBfbGltaXRQb3M7DQorICBVSW50MzIgX3N0cmVhbVBvczsNCisgIFVJbnQzMiBfYnVmU2l6ZTsNCisgIElTZXF1ZW50aWFsT3V0U3RyZWFtICpfc3RyZWFtOw0KKyAgVUludDY0IF9wcm9jZXNzZWRTaXplOw0KKyAgQnl0ZSAgKl9idWYyOw0KKyAgYm9vbCBfb3ZlckRpY3Q7DQorDQorICBIUkVTVUxUIEZsdXNoUGFydCgpIHRocm93KCk7DQorcHVibGljOg0KKyAgI2lmZGVmIF9OT19FWENFUFRJT05TDQorICBIUkVTVUxUIEVycm9yQ29kZTsNCisgICNlbmRpZg0KKw0KKyAgQ091dEJ1ZmZlcigpOiBfYnVmKDApLCBfcG9zKDApLCBfc3RyZWFtKDApLCBfYnVmMigwKSB7fQ0KKyAgfkNPdXRCdWZmZXIoKSB7IEZyZWUoKTsgfQ0KKyAgDQorICBib29sIENyZWF0ZShVSW50MzIgYnVmU2l6ZSkgdGhyb3coKTsNCisgIHZvaWQgRnJlZSgpIHRocm93KCk7DQorDQorICB2b2lkIFNldE1lbVN0cmVhbShCeXRlICpidWYpIHsgX2J1ZjIgPSBidWY7IH0NCisgIHZvaWQgU2V0U3RyZWFtKElTZXF1ZW50aWFsT3V0U3RyZWFtICpzdHJlYW0pIHsgX3N0cmVhbSA9IHN0cmVhbTsgfQ0KKyAgdm9pZCBJbml0KCkgdGhyb3coKTsNCisgIEhSRVNVTFQgRmx1c2goKSB0aHJvdygpOw0KKyAgdm9pZCBGbHVzaFdpdGhDaGVjaygpOw0KKw0KKyAgdm9pZCBXcml0ZUJ5dGUoQnl0ZSBiKQ0KKyAgew0KKyAgICBfYnVmW19wb3MrK10gPSBiOw0KKyAgICBpZiAoX3BvcyA9PSBfbGltaXRQb3MpDQorICAgICAgRmx1c2hXaXRoQ2hlY2soKTsNCisgIH0NCisgIHZvaWQgV3JpdGVCeXRlcyhjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkNCisgIHsNCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspDQorICAgICAgV3JpdGVCeXRlKCgoY29uc3QgQnl0ZSAqKWRhdGEpW2ldKTsNCisgIH0NCisNCisgIFVJbnQ2NCBHZXRQcm9jZXNzZWRTaXplKCkgY29uc3QgdGhyb3coKTsNCit9Ow0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1Byb2dyZXNzVXRpbHMuY3BwIGIvbHptYS9DUFAvN3ppcC9Db21tb24vUHJvZ3Jlc3NVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlNTA0YQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1Byb2dyZXNzVXRpbHMuY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8vIFByb2dyZXNzVXRpbHMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJQcm9ncmVzc1V0aWxzLmgiDQorDQorQ0xvY2FsUHJvZ3Jlc3M6OkNMb2NhbFByb2dyZXNzKCkNCit7DQorICBQcm9ncmVzc09mZnNldCA9IEluU2l6ZSA9IE91dFNpemUgPSAwOw0KKyAgU2VuZFJhdGlvID0gU2VuZFByb2dyZXNzID0gdHJ1ZTsNCit9DQorDQordm9pZCBDTG9jYWxQcm9ncmVzczo6SW5pdChJUHJvZ3Jlc3MgKnByb2dyZXNzLCBib29sIGluU2l6ZUlzTWFpbikNCit7DQorICBfcmF0aW9Qcm9ncmVzcy5SZWxlYXNlKCk7DQorICBfcHJvZ3Jlc3MgPSBwcm9ncmVzczsNCisgIF9wcm9ncmVzcy5RdWVyeUludGVyZmFjZShJSURfSUNvbXByZXNzUHJvZ3Jlc3NJbmZvLCAmX3JhdGlvUHJvZ3Jlc3MpOw0KKyAgX2luU2l6ZUlzTWFpbiA9IGluU2l6ZUlzTWFpbjsNCit9DQorDQorU1RETUVUSE9ESU1QIENMb2NhbFByb2dyZXNzOjpTZXRSYXRpb0luZm8oY29uc3QgVUludDY0ICppblNpemUsIGNvbnN0IFVJbnQ2NCAqb3V0U2l6ZSkNCit7DQorICBVSW50NjQgaW5TaXplTmV3ID0gSW5TaXplLCBvdXRTaXplTmV3ID0gT3V0U2l6ZTsNCisgIGlmIChpblNpemUpDQorICAgIGluU2l6ZU5ldyArPSAoKmluU2l6ZSk7DQorICBpZiAob3V0U2l6ZSkNCisgICAgb3V0U2l6ZU5ldyArPSAoKm91dFNpemUpOw0KKyAgaWYgKFNlbmRSYXRpbyAmJiBfcmF0aW9Qcm9ncmVzcykNCisgIHsNCisgICAgUklOT0soX3JhdGlvUHJvZ3Jlc3MtPlNldFJhdGlvSW5mbygmaW5TaXplTmV3LCAmb3V0U2l6ZU5ldykpOw0KKyAgfQ0KKyAgaW5TaXplTmV3ICs9IFByb2dyZXNzT2Zmc2V0Ow0KKyAgb3V0U2l6ZU5ldyArPSBQcm9ncmVzc09mZnNldDsNCisgIGlmIChTZW5kUHJvZ3Jlc3MpDQorICAgIHJldHVybiBfcHJvZ3Jlc3MtPlNldENvbXBsZXRlZChfaW5TaXplSXNNYWluID8gJmluU2l6ZU5ldyA6ICZvdXRTaXplTmV3KTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENMb2NhbFByb2dyZXNzOjpTZXRDdXIoKQ0KK3sNCisgIHJldHVybiBTZXRSYXRpb0luZm8oTlVMTCwgTlVMTCk7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1Byb2dyZXNzVXRpbHMuaCBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1Byb2dyZXNzVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjIwNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21tb24vUHJvZ3Jlc3NVdGlscy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFByb2dyZXNzVXRpbHMuaA0KKw0KKyNpZm5kZWYgX19QUk9HUkVTU1VUSUxTX0gNCisjZGVmaW5lIF9fUFJPR1JFU1NVVElMU19IDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKw0KKyNpbmNsdWRlICIuLi9JQ29kZXIuaCINCisjaW5jbHVkZSAiLi4vSVByb2dyZXNzLmgiDQorDQorY2xhc3MgQ0xvY2FsUHJvZ3Jlc3M6DQorICBwdWJsaWMgSUNvbXByZXNzUHJvZ3Jlc3NJbmZvLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBDTXlDb21QdHI8SVByb2dyZXNzPiBfcHJvZ3Jlc3M7DQorICBDTXlDb21QdHI8SUNvbXByZXNzUHJvZ3Jlc3NJbmZvPiBfcmF0aW9Qcm9ncmVzczsNCisgIGJvb2wgX2luU2l6ZUlzTWFpbjsNCitwdWJsaWM6DQorICBVSW50NjQgUHJvZ3Jlc3NPZmZzZXQ7DQorICBVSW50NjQgSW5TaXplOw0KKyAgVUludDY0IE91dFNpemU7DQorICBib29sIFNlbmRSYXRpbzsNCisgIGJvb2wgU2VuZFByb2dyZXNzOw0KKw0KKyAgQ0xvY2FsUHJvZ3Jlc3MoKTsNCisgIHZvaWQgSW5pdChJUHJvZ3Jlc3MgKnByb2dyZXNzLCBib29sIGluU2l6ZUlzTWFpbik7DQorICBIUkVTVUxUIFNldEN1cigpOw0KKw0KKyAgTVlfVU5LTk9XTl9JTVANCisNCisgIFNURE1FVEhPRChTZXRSYXRpb0luZm8pKGNvbnN0IFVJbnQ2NCAqaW5TaXplLCBjb25zdCBVSW50NjQgKm91dFNpemUpOw0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vUHJvcElkLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1Byb3BJZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyYjk0NAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1Byb3BJZC5jcHAKQEAgLTAsMCArMSw5OSBAQAorLy8gUHJvcElkLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vUHJvcElELmgiDQorDQorLy8gVkFSVFlQRQ0KK0J5dGUgazd6X1BST1BJRF9Ub19WQVJUWVBFW2twaWRfTlVNX0RFRklORURdID0NCit7DQorICBWVF9FTVBUWSwNCisgIFZUX1VJNCwNCisgIFZUX1VJNCwNCisgIFZUX0JTVFIsDQorICBWVF9CU1RSLA0KKyAgVlRfQlNUUiwNCisgIFZUX0JPT0wsDQorICBWVF9VSTgsDQorICBWVF9VSTgsDQorICBWVF9VSTQsDQorICBWVF9GSUxFVElNRSwNCisgIFZUX0ZJTEVUSU1FLA0KKyAgVlRfRklMRVRJTUUsDQorICBWVF9CT09MLA0KKyAgVlRfQk9PTCwNCisgIFZUX0JPT0wsDQorICBWVF9CT09MLA0KKyAgVlRfQk9PTCwNCisgIFZUX1VJNCwNCisgIFZUX1VJNCwNCisgIFZUX0JTVFIsDQorICBWVF9CT09MLA0KKyAgVlRfQlNUUiwNCisgIFZUX0JTVFIsDQorICBWVF9CU1RSLA0KKyAgVlRfQlNUUiwNCisgIFZUX0JTVFIsDQorICBWVF9VSTgsDQorICBWVF9CU1RSLA0KKyAgVlRfVUk4LA0KKyAgVlRfQlNUUiwNCisgIFZUX1VJOCwNCisgIFZUX1VJOCwNCisgIFZUX0JTVFIsIC8vIG9yIFZUX1VJOCBrcGlkVW5wYWNrVmVyDQorICBWVF9VSTQsIC8vIG9yIFZUX1VJOCBrcGlkVm9sdW1lDQorICBWVF9CT09MLA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk0LA0KKyAgVlRfQk9PTCwNCisgIFZUX0JPT0wsDQorICBWVF9CU1RSLA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk0LCAvLyBrcGlkQ2hlY2tzdW0NCisgIFZUX0JTVFIsDQorICBWVF9VSTgsDQorICBWVF9CU1RSLCAvLyBvciBWVF9VSTgga3BpZElkDQorICBWVF9CU1RSLA0KKyAgVlRfQlNUUiwNCisgIFZUX1VJNCwNCisgIFZUX1VJNCwNCisgIFZUX0JTVFIsDQorICBWVF9CU1RSLA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk0LA0KKyAgVlRfQlNUUiwNCisgIFZUX0JTVFIsDQorICBWVF9CU1RSLA0KKyAgVlRfQlNUUiwgLy8ga3BpZE50U2VjdXJlDQorICBWVF9CT09MLA0KKyAgVlRfQk9PTCwNCisgIFZUX0JPT0wsDQorICBWVF9CT09MLA0KKyAgVlRfQlNUUiwgLy8gU0hBLTENCisgIFZUX0JTVFIsIC8vIFNIQS0yNTYNCisgIFZUX0JTVFIsDQorICBWVF9VSTgsDQorICBWVF9VSTQsDQorICBWVF9VSTQsDQorICBWVF9CU1RSLA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk4LA0KKyAgVlRfQlNUUiwNCisgIFZUX0JTVFIsDQorICBWVF9CU1RSLA0KKyAgVlRfQk9PTCwNCisgIFZUX0JPT0wsDQorICBWVF9CT09MLA0KKyAgVlRfVUk4LA0KKyAgVlRfVUk4DQorfTsNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9SZWdpc3RlckFyYy5oIGIvbHptYS9DUFAvN3ppcC9Db21tb24vUmVnaXN0ZXJBcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGNmMWJmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21tb24vUmVnaXN0ZXJBcmMuaApAQCAtMCwwICsxLDU1IEBACisvLyBSZWdpc3RlckFyYy5oDQorDQorI2lmbmRlZiBfX1JFR0lTVEVSX0FSQ19IDQorI2RlZmluZSBfX1JFR0lTVEVSX0FSQ19IDQorDQorI2luY2x1ZGUgIi4uL0FyY2hpdmUvSUFyY2hpdmUuaCINCisNCitzdHJ1Y3QgQ0FyY0luZm8NCit7DQorICBjb25zdCBjaGFyICpOYW1lOw0KKyAgY29uc3QgY2hhciAqRXh0Ow0KKyAgY29uc3QgY2hhciAqQWRkRXh0Ow0KKyAgDQorICBCeXRlIENsYXNzSWQ7DQorICANCisgIEJ5dGUgU2lnbmF0dXJlU2l6ZTsNCisgIEJ5dGUgU2lnbmF0dXJlWzIwXTsNCisgIFVJbnQxNiBTaWduYXR1cmVPZmZzZXQ7DQorICANCisgIFVJbnQxNiBGbGFnczsNCisNCisgIEZ1bmNfQ3JlYXRlSW5BcmNoaXZlIENyZWF0ZUluQXJjaGl2ZTsNCisgIEZ1bmNfQ3JlYXRlT3V0QXJjaGl2ZSBDcmVhdGVPdXRBcmNoaXZlOw0KKyAgRnVuY19Jc0FyYyBJc0FyYzsNCisNCisgIGJvb2wgSXNNdWx0aVNpZ25hdHVyZSgpIGNvbnN0IHsgcmV0dXJuIChGbGFncyAmIE5BcmNJbmZvRmxhZ3M6OmtNdWx0aVNpZ25hdHVyZSkgIT0gMDsgfQ0KK307DQorDQordm9pZCBSZWdpc3RlckFyYyhjb25zdCBDQXJjSW5mbyAqYXJjSW5mbykgdGhyb3coKTsNCisNCisjZGVmaW5lIFJFR0lTVEVSX0FSQ19OQU1FKHgpIENSZWdpc3RlciAjIyB4DQorDQorI2RlZmluZSBSRUdJU1RFUl9BUkMoeCkgc3RydWN0IFJFR0lTVEVSX0FSQ19OQU1FKHgpIHsgXA0KKyAgICBSRUdJU1RFUl9BUkNfTkFNRSh4KSgpIHsgUmVnaXN0ZXJBcmMoJmdfQXJjSW5mbyk7IH19OyBcDQorICAgIHN0YXRpYyBSRUdJU1RFUl9BUkNfTkFNRSh4KSBnX1JlZ2lzdGVyQXJjOw0KKw0KKyNkZWZpbmUgUkVHSVNURVJfQVJDX0RFQ19TSUcoeCkgc3RydWN0IFJFR0lTVEVSX0FSQ19OQU1FKHgpIHsgXA0KKyAgICBSRUdJU1RFUl9BUkNfTkFNRSh4KSgpIHsgZ19BcmNJbmZvLlNpZ25hdHVyZVswXS0tOyBSZWdpc3RlckFyYygmZ19BcmNJbmZvKTsgfX07IFwNCisgICAgc3RhdGljIFJFR0lTVEVSX0FSQ19OQU1FKHgpIGdfUmVnaXN0ZXJBcmM7DQorDQorDQorI2RlZmluZSBJTVBfQ3JlYXRlQXJjSW5fMihjKSBcDQorICBzdGF0aWMgSUluQXJjaGl2ZSAqQ3JlYXRlQXJjKCkgeyByZXR1cm4gbmV3IGM7IH0NCisNCisjZGVmaW5lIElNUF9DcmVhdGVBcmNJbiBJTVBfQ3JlYXRlQXJjSW5fMihDSGFuZGxlcikNCisNCisjaWZkZWYgRVhUUkFDVF9PTkxZDQorICAjZGVmaW5lIElNUF9DcmVhdGVBcmNPdXQNCisgICNkZWZpbmUgUkVGX0NyZWF0ZUFyY19QYWlyIENyZWF0ZUFyYywgTlVMTA0KKyNlbHNlDQorICAjZGVmaW5lIElNUF9DcmVhdGVBcmNPdXQgc3RhdGljIElPdXRBcmNoaXZlICpDcmVhdGVBcmNPdXQoKSB7IHJldHVybiBuZXcgQ0hhbmRsZXI7IH0NCisgICNkZWZpbmUgUkVGX0NyZWF0ZUFyY19QYWlyIENyZWF0ZUFyYywgQ3JlYXRlQXJjT3V0DQorI2VuZGlmDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vUmVnaXN0ZXJDb2RlYy5oIGIvbHptYS9DUFAvN3ppcC9Db21tb24vUmVnaXN0ZXJDb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MWRjY2IKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9SZWdpc3RlckNvZGVjLmgKQEAgLTAsMCArMSw1MSBAQAorLy8gUmVnaXN0ZXJDb2RlYy5oDQorDQorI2lmbmRlZiBfX1JFR0lTVEVSX0NPREVDX0gNCisjZGVmaW5lIF9fUkVHSVNURVJfQ09ERUNfSA0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vTWV0aG9kSWQuaCINCisjaW5jbHVkZSAiLi4vSUNvZGVyLmgiDQorDQordHlwZWRlZiB2b2lkICogKCpDcmVhdGVDb2RlY1ApKCk7DQorc3RydWN0IENDb2RlY0luZm8NCit7DQorICBDcmVhdGVDb2RlY1AgQ3JlYXRlRGVjb2RlcjsNCisgIENyZWF0ZUNvZGVjUCBDcmVhdGVFbmNvZGVyOw0KKyAgQ01ldGhvZElkIElkOw0KKyAgY29uc3Qgd2NoYXJfdCAqTmFtZTsNCisgIFVJbnQzMiBOdW1JblN0cmVhbXM7DQorICBib29sIElzRmlsdGVyOw0KK307DQorDQordm9pZCBSZWdpc3RlckNvZGVjKGNvbnN0IENDb2RlY0luZm8gKmNvZGVjSW5mbykgdGhyb3coKTsNCisNCisjZGVmaW5lIFJFR0lTVEVSX0NPREVDX05BTUUoeCkgQ1JlZ2lzdGVyQ29kZWMgIyMgeA0KKw0KKyNkZWZpbmUgUkVHSVNURVJfQ09ERUMoeCkgc3RydWN0IFJFR0lTVEVSX0NPREVDX05BTUUoeCkgeyBcDQorICAgIFJFR0lTVEVSX0NPREVDX05BTUUoeCkoKSB7IFJlZ2lzdGVyQ29kZWMoJmdfQ29kZWNJbmZvKTsgfX07IFwNCisgICAgc3RhdGljIFJFR0lTVEVSX0NPREVDX05BTUUoeCkgZ19SZWdpc3RlckNvZGVjOw0KKw0KKyNkZWZpbmUgUkVHSVNURVJfQ09ERUNTX05BTUUoeCkgQ1JlZ2lzdGVyQ29kZWNzICMjIHgNCisjZGVmaW5lIFJFR0lTVEVSX0NPREVDUyh4KSBzdHJ1Y3QgUkVHSVNURVJfQ09ERUNTX05BTUUoeCkgeyBcDQorICAgIFJFR0lTVEVSX0NPREVDU19OQU1FKHgpKCkgeyBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQVJSQVlfU0laRShnX0NvZGVjc0luZm8pOyBpKyspIFwNCisgICAgUmVnaXN0ZXJDb2RlYygmZ19Db2RlY3NJbmZvW2ldKTsgfX07IFwNCisgICAgc3RhdGljIFJFR0lTVEVSX0NPREVDU19OQU1FKHgpIGdfUmVnaXN0ZXJDb2RlY3M7DQorDQorDQorc3RydWN0IENIYXNoZXJJbmZvDQorew0KKyAgSUhhc2hlciAqICgqQ3JlYXRlSGFzaGVyKSgpOw0KKyAgQ01ldGhvZElkIElkOw0KKyAgY29uc3Qgd2NoYXJfdCAqTmFtZTsNCisgIFVJbnQzMiBEaWdlc3RTaXplOw0KK307DQorDQordm9pZCBSZWdpc3Rlckhhc2hlcihjb25zdCBDSGFzaGVySW5mbyAqaGFzaGVyKSB0aHJvdygpOw0KKw0KKyNkZWZpbmUgUkVHSVNURVJfSEFTSEVSX05BTUUoeCkgQ1JlZ2lzdGVySGFzaGVyICMjIHgNCisNCisjZGVmaW5lIFJFR0lTVEVSX0hBU0hFUih4KSBzdHJ1Y3QgUkVHSVNURVJfSEFTSEVSX05BTUUoeCkgeyBcDQorICAgIFJFR0lTVEVSX0hBU0hFUl9OQU1FKHgpKCkgeyBSZWdpc3Rlckhhc2hlcigmZ19IYXNoZXJJbmZvKTsgfX07IFwNCisgICAgc3RhdGljIFJFR0lTVEVSX0hBU0hFUl9OQU1FKHgpIGdfUmVnaXN0ZXJIYXNoZXI7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vU3RkQWZ4LmggYi9sem1hL0NQUC83emlwL0NvbW1vbi9TdGRBZnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmEwODhmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21tb24vU3RkQWZ4LmgKQEAgLTAsMCArMSw4IEBACisvLyBTdGRBZnguaA0KKw0KKyNpZm5kZWYgX19TVERBRlhfSA0KKyNkZWZpbmUgX19TVERBRlhfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vQ29tbW9uLmgiDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vU3RyZWFtQmluZGVyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1N0cmVhbUJpbmRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkMDU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1N0cmVhbUJpbmRlci5jcHAKQEAgLTAsMCArMSwxMjYgQEAKKy8vIFN0cmVhbUJpbmRlci5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKw0KKyNpbmNsdWRlICJTdHJlYW1CaW5kZXIuaCINCisNCitjbGFzcyBDQmluZGVySW5TdHJlYW06DQorICBwdWJsaWMgSVNlcXVlbnRpYWxJblN0cmVhbSwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KKyAgQ1N0cmVhbUJpbmRlciAqX2JpbmRlcjsNCitwdWJsaWM6DQorICBNWV9VTktOT1dOX0lNUA0KKyAgU1RETUVUSE9EKFJlYWQpKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KKyAgfkNCaW5kZXJJblN0cmVhbSgpIHsgX2JpbmRlci0+Q2xvc2VSZWFkKCk7IH0NCisgIENCaW5kZXJJblN0cmVhbShDU3RyZWFtQmluZGVyICpiaW5kZXIpOiBfYmluZGVyKGJpbmRlcikge30NCit9Ow0KKw0KK1NURE1FVEhPRElNUCBDQmluZGVySW5TdHJlYW06OlJlYWQodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCisgIHsgcmV0dXJuIF9iaW5kZXItPlJlYWQoZGF0YSwgc2l6ZSwgcHJvY2Vzc2VkU2l6ZSk7IH0NCisNCitjbGFzcyBDQmluZGVyT3V0U3RyZWFtOg0KKyAgcHVibGljIElTZXF1ZW50aWFsT3V0U3RyZWFtLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBDU3RyZWFtQmluZGVyICpfYmluZGVyOw0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QDQorICBTVERNRVRIT0QoV3JpdGUpKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KKyAgfkNCaW5kZXJPdXRTdHJlYW0oKSB7IF9iaW5kZXItPkNsb3NlV3JpdGUoKTsgfQ0KKyAgQ0JpbmRlck91dFN0cmVhbShDU3RyZWFtQmluZGVyICpiaW5kZXIpOiBfYmluZGVyKGJpbmRlcikge30NCit9Ow0KKw0KK1NURE1FVEhPRElNUCBDQmluZGVyT3V0U3RyZWFtOjpXcml0ZShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KKyAgeyByZXR1cm4gX2JpbmRlci0+V3JpdGUoZGF0YSwgc2l6ZSwgcHJvY2Vzc2VkU2l6ZSk7IH0NCisNCisNCisNCitXUmVzIENTdHJlYW1CaW5kZXI6OkNyZWF0ZUV2ZW50cygpDQorew0KKyAgUklOT0soX2NhbldyaXRlX0V2ZW50LkNyZWF0ZSh0cnVlKSk7DQorICBSSU5PSyhfY2FuUmVhZF9FdmVudC5DcmVhdGUoKSk7DQorICByZXR1cm4gX3JlYWRpbmdXYXNDbG9zZWRfRXZlbnQuQ3JlYXRlKCk7DQorfQ0KKw0KK3ZvaWQgQ1N0cmVhbUJpbmRlcjo6UmVJbml0KCkNCit7DQorICBfd2FpdFdyaXRlID0gdHJ1ZTsNCisgIF9jYW5SZWFkX0V2ZW50LlJlc2V0KCk7DQorICBfcmVhZGluZ1dhc0Nsb3NlZF9FdmVudC5SZXNldCgpOw0KKyAgUHJvY2Vzc2VkU2l6ZSA9IDA7DQorfQ0KKw0KKw0KK3ZvaWQgQ1N0cmVhbUJpbmRlcjo6Q3JlYXRlU3RyZWFtcyhJU2VxdWVudGlhbEluU3RyZWFtICoqaW5TdHJlYW0sIElTZXF1ZW50aWFsT3V0U3RyZWFtICoqb3V0U3RyZWFtKQ0KK3sNCisgIF93YWl0V3JpdGUgPSB0cnVlOw0KKyAgX2J1ZlNpemUgPSAwOw0KKyAgX2J1ZiA9IE5VTEw7DQorICBQcm9jZXNzZWRTaXplID0gMDsNCisNCisgIENCaW5kZXJJblN0cmVhbSAqaW5TdHJlYW1TcGVjID0gbmV3IENCaW5kZXJJblN0cmVhbSh0aGlzKTsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbEluU3RyZWFtPiBpblN0cmVhbUxvYyhpblN0cmVhbVNwZWMpOw0KKyAgKmluU3RyZWFtID0gaW5TdHJlYW1Mb2MuRGV0YWNoKCk7DQorDQorICBDQmluZGVyT3V0U3RyZWFtICpvdXRTdHJlYW1TcGVjID0gbmV3IENCaW5kZXJPdXRTdHJlYW0odGhpcyk7DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IG91dFN0cmVhbUxvYyhvdXRTdHJlYW1TcGVjKTsNCisgICpvdXRTdHJlYW0gPSBvdXRTdHJlYW1Mb2MuRGV0YWNoKCk7DQorfQ0KKw0KKy8vIChfY2FuUmVhZF9FdmVudCAmJiBfYnVmU2l6ZSA9PSAwKSBtZWFucyB0aGF0IHN0cmVhbSBpcyBmaW5pc2hlZC4NCisNCitIUkVTVUxUIENTdHJlYW1CaW5kZXI6OlJlYWQodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSAwOw0KKyAgaWYgKHNpemUgIT0gMCkNCisgIHsNCisgICAgaWYgKF93YWl0V3JpdGUpDQorICAgIHsNCisgICAgICBSSU5PSyhfY2FuUmVhZF9FdmVudC5Mb2NrKCkpOw0KKyAgICAgIF93YWl0V3JpdGUgPSBmYWxzZTsNCisgICAgfQ0KKyAgICBpZiAoc2l6ZSA+IF9idWZTaXplKQ0KKyAgICAgIHNpemUgPSBfYnVmU2l6ZTsNCisgICAgaWYgKHNpemUgIT0gMCkNCisgICAgew0KKyAgICAgIG1lbWNweShkYXRhLCBfYnVmLCBzaXplKTsNCisgICAgICBfYnVmID0gKChjb25zdCBCeXRlICopX2J1ZikgKyBzaXplOw0KKyAgICAgIFByb2Nlc3NlZFNpemUgKz0gc2l6ZTsNCisgICAgICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgICAgICpwcm9jZXNzZWRTaXplID0gc2l6ZTsNCisgICAgICBfYnVmU2l6ZSAtPSBzaXplOw0KKyAgICAgIGlmIChfYnVmU2l6ZSA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgIF93YWl0V3JpdGUgPSB0cnVlOw0KKyAgICAgICAgX2NhblJlYWRfRXZlbnQuUmVzZXQoKTsNCisgICAgICAgIF9jYW5Xcml0ZV9FdmVudC5TZXQoKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENTdHJlYW1CaW5kZXI6OldyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gMDsNCisgIGlmIChzaXplICE9IDApDQorICB7DQorICAgIF9idWYgPSBkYXRhOw0KKyAgICBfYnVmU2l6ZSA9IHNpemU7DQorICAgIF9jYW5Xcml0ZV9FdmVudC5SZXNldCgpOw0KKyAgICBfY2FuUmVhZF9FdmVudC5TZXQoKTsNCisNCisgICAgSEFORExFIGV2ZW50c1syXSA9IHsgX2NhbldyaXRlX0V2ZW50LCBfcmVhZGluZ1dhc0Nsb3NlZF9FdmVudCB9Ow0KKyAgICBEV09SRCB3YWl0UmVzdWx0ID0gOjpXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsIGV2ZW50cywgRkFMU0UsIElORklOSVRFKTsNCisgICAgaWYgKHdhaXRSZXN1bHQgIT0gV0FJVF9PQkpFQ1RfMCArIDApDQorICAgICAgcmV0dXJuIFNfRkFMU0U7DQorICAgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAgICpwcm9jZXNzZWRTaXplID0gc2l6ZTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9TdHJlYW1CaW5kZXIuaCBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1N0cmVhbUJpbmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNzMzZjkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9TdHJlYW1CaW5kZXIuaApAQCAtMCwwICsxLDM0IEBACisvLyBTdHJlYW1CaW5kZXIuaA0KKw0KKyNpZm5kZWYgX19TVFJFQU1fQklOREVSX0gNCisjZGVmaW5lIF9fU1RSRUFNX0JJTkRFUl9IDQorDQorI2luY2x1ZGUgIi4uLy4uL1dpbmRvd3MvU3luY2hyb25pemF0aW9uLmgiDQorDQorI2luY2x1ZGUgIi4uL0lTdHJlYW0uaCINCisNCitjbGFzcyBDU3RyZWFtQmluZGVyDQorew0KKyAgTldpbmRvd3M6Ok5TeW5jaHJvbml6YXRpb246OkNNYW51YWxSZXNldEV2ZW50IF9jYW5Xcml0ZV9FdmVudDsNCisgIE5XaW5kb3dzOjpOU3luY2hyb25pemF0aW9uOjpDTWFudWFsUmVzZXRFdmVudCBfY2FuUmVhZF9FdmVudDsNCisgIE5XaW5kb3dzOjpOU3luY2hyb25pemF0aW9uOjpDTWFudWFsUmVzZXRFdmVudCBfcmVhZGluZ1dhc0Nsb3NlZF9FdmVudDsNCisgIGJvb2wgX3dhaXRXcml0ZTsNCisgIFVJbnQzMiBfYnVmU2l6ZTsNCisgIGNvbnN0IHZvaWQgKl9idWY7DQorcHVibGljOg0KKyAgVUludDY0IFByb2Nlc3NlZFNpemU7DQorDQorICBXUmVzIENyZWF0ZUV2ZW50cygpOw0KKyAgdm9pZCBDcmVhdGVTdHJlYW1zKElTZXF1ZW50aWFsSW5TdHJlYW0gKippblN0cmVhbSwgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKipvdXRTdHJlYW0pOw0KKyAgdm9pZCBSZUluaXQoKTsNCisgIEhSRVNVTFQgUmVhZCh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCisgIEhSRVNVTFQgV3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorICB2b2lkIENsb3NlUmVhZCgpIHsgX3JlYWRpbmdXYXNDbG9zZWRfRXZlbnQuU2V0KCk7IH0NCisgIHZvaWQgQ2xvc2VXcml0ZSgpDQorICB7DQorICAgIC8vIF9idWZTaXplIG11c3QgYmUgPSAwDQorICAgIF9jYW5SZWFkX0V2ZW50LlNldCgpOw0KKyAgfQ0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vU3RyZWFtT2JqZWN0cy5jcHAgYi9sem1hL0NQUC83emlwL0NvbW1vbi9TdHJlYW1PYmplY3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzA5ODQyCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21tb24vU3RyZWFtT2JqZWN0cy5jcHAKQEAgLTAsMCArMSwyNTAgQEAKKy8vIFN0cmVhbU9iamVjdHMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQy9BbGxvYy5oIg0KKw0KKyNpbmNsdWRlICJTdHJlYW1PYmplY3RzLmgiDQorDQorU1RETUVUSE9ESU1QIENCdWZJblN0cmVhbTo6UmVhZCh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IDA7DQorICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIGlmIChfcG9zID49IF9zaXplKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIHNpemVfdCByZW0gPSBfc2l6ZSAtIChzaXplX3QpX3BvczsNCisgIGlmIChyZW0gPiBzaXplKQ0KKyAgICByZW0gPSAoc2l6ZV90KXNpemU7DQorICBtZW1jcHkoZGF0YSwgX2RhdGEgKyAoc2l6ZV90KV9wb3MsIHJlbSk7DQorICBfcG9zICs9IHJlbTsNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IChVSW50MzIpcmVtOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQnVmSW5TdHJlYW06OlNlZWsoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbikNCit7DQorICBzd2l0Y2ggKHNlZWtPcmlnaW4pDQorICB7DQorICAgIGNhc2UgU1RSRUFNX1NFRUtfU0VUOiBicmVhazsNCisgICAgY2FzZSBTVFJFQU1fU0VFS19DVVI6IG9mZnNldCArPSBfcG9zOyBicmVhazsNCisgICAgY2FzZSBTVFJFQU1fU0VFS19FTkQ6IG9mZnNldCArPSBfc2l6ZTsgYnJlYWs7DQorICAgIGRlZmF1bHQ6IHJldHVybiBTVEdfRV9JTlZBTElERlVOQ1RJT047DQorICB9DQorICBpZiAob2Zmc2V0IDwgMCkNCisgICAgcmV0dXJuIEhSRVNVTFRfV0lOMzJfRVJST1JfTkVHQVRJVkVfU0VFSzsNCisgIF9wb3MgPSBvZmZzZXQ7DQorICBpZiAobmV3UG9zaXRpb24pDQorICAgICpuZXdQb3NpdGlvbiA9IG9mZnNldDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCisvKg0KK3ZvaWQgQ3JlYXRlX0J1ZkluU3RyZWFtX1dpdGhSZWZlcmVuY2UoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIElTZXF1ZW50aWFsSW5TdHJlYW0gKipzdHJlYW0pDQorew0KKyAgQ0J1ZkluU3RyZWFtICppblN0cmVhbVNwZWMgPSBuZXcgQ0J1ZkluU3RyZWFtOw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IHN0cmVhbVRlbXAgPSBpblN0cmVhbVNwZWM7DQorICBpblN0cmVhbVNwZWMtPkluaXQoKGNvbnN0IEJ5dGUgKilkYXRhLCBzaXplKTsNCisgICpzdHJlYW0gPSBzdHJlYW1UZW1wLkRldGFjaCgpOw0KK30NCisqLw0KKw0KK3ZvaWQgQ3JlYXRlX0J1ZkluU3RyZWFtX1dpdGhOZXdCdWYoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIElTZXF1ZW50aWFsSW5TdHJlYW0gKipzdHJlYW0pDQorew0KKyAgQ1JlZmVyZW5jZUJ1ZiAqcmVmZXJlbmNlQnVmID0gbmV3IENSZWZlcmVuY2VCdWY7DQorICBDTXlDb21QdHI8SVVua25vd24+IHJlZiA9IHJlZmVyZW5jZUJ1ZjsNCisgIHJlZmVyZW5jZUJ1Zi0+QnVmLkNvcHlGcm9tKChjb25zdCBCeXRlICopZGF0YSwgc2l6ZSk7DQorDQorICBDQnVmSW5TdHJlYW0gKmluU3RyZWFtU3BlYyA9IG5ldyBDQnVmSW5TdHJlYW07DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gc3RyZWFtVGVtcCA9IGluU3RyZWFtU3BlYzsNCisgIGluU3RyZWFtU3BlYy0+SW5pdChyZWZlcmVuY2VCdWYpOw0KKyAgKnN0cmVhbSA9IHN0cmVhbVRlbXAuRGV0YWNoKCk7DQorfQ0KKw0KK3ZvaWQgQ0J5dGVEeW5CdWZmZXI6OkZyZWUoKSB0aHJvdygpDQorew0KKyAgZnJlZShfYnVmKTsNCisgIF9idWYgPSAwOw0KKyAgX2NhcGFjaXR5ID0gMDsNCit9DQorDQorYm9vbCBDQnl0ZUR5bkJ1ZmZlcjo6RW5zdXJlQ2FwYWNpdHkoc2l6ZV90IGNhcCkgdGhyb3coKQ0KK3sNCisgIGlmIChjYXAgPD0gX2NhcGFjaXR5KQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIHNpemVfdCBkZWx0YTsNCisgIGlmIChfY2FwYWNpdHkgPiA2NCkNCisgICAgZGVsdGEgPSBfY2FwYWNpdHkgLyA0Ow0KKyAgZWxzZSBpZiAoX2NhcGFjaXR5ID4gOCkNCisgICAgZGVsdGEgPSAxNjsNCisgIGVsc2UNCisgICAgZGVsdGEgPSA0Ow0KKyAgY2FwID0gTXlNYXgoX2NhcGFjaXR5ICsgZGVsdGEsIGNhcCk7DQorICBCeXRlICpidWYgPSAoQnl0ZSAqKXJlYWxsb2MoX2J1ZiwgY2FwKTsNCisgIGlmICghYnVmKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBfYnVmID0gYnVmOw0KKyAgX2NhcGFjaXR5ID0gY2FwOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK0J5dGUgKkNEeW5CdWZTZXFPdXRTdHJlYW06OkdldEJ1ZlB0ckZvcldyaXRpbmcoc2l6ZV90IGFkZFNpemUpDQorew0KKyAgYWRkU2l6ZSArPSBfc2l6ZTsNCisgIGlmIChhZGRTaXplIDwgX3NpemUpDQorICAgIHJldHVybiBOVUxMOw0KKyAgaWYgKCFfYnVmZmVyLkVuc3VyZUNhcGFjaXR5KGFkZFNpemUpKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIHJldHVybiAoQnl0ZSAqKV9idWZmZXIgKyBfc2l6ZTsNCit9DQorDQordm9pZCBDRHluQnVmU2VxT3V0U3RyZWFtOjpDb3B5VG9CdWZmZXIoQ0J5dGVCdWZmZXIgJmRlc3QpIGNvbnN0DQorew0KKyAgZGVzdC5Db3B5RnJvbSgoY29uc3QgQnl0ZSAqKV9idWZmZXIsIF9zaXplKTsNCit9DQorDQorU1RETUVUSE9ESU1QIENEeW5CdWZTZXFPdXRTdHJlYW06OldyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gMDsNCisgIGlmIChzaXplID09IDApDQorICAgIHJldHVybiBTX09LOw0KKyAgQnl0ZSAqYnVmID0gR2V0QnVmUHRyRm9yV3JpdGluZyhzaXplKTsNCisgIGlmICghYnVmKQ0KKyAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisgIG1lbWNweShidWYsIGRhdGEsIHNpemUpOw0KKyAgVXBkYXRlU2l6ZShzaXplKTsNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IHNpemU7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENCdWZQdHJTZXFPdXRTdHJlYW06OldyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgc2l6ZV90IHJlbSA9IF9zaXplIC0gX3BvczsNCisgIGlmIChyZW0gPiBzaXplKQ0KKyAgICByZW0gPSAoc2l6ZV90KXNpemU7DQorICBtZW1jcHkoX2J1ZmZlciArIF9wb3MsIGRhdGEsIHJlbSk7DQorICBfcG9zICs9IHJlbTsNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IChVSW50MzIpcmVtOw0KKyAgcmV0dXJuIChyZW0gIT0gMCB8fCBzaXplID09IDApID8gU19PSyA6IEVfRkFJTDsNCit9DQorDQorU1RETUVUSE9ESU1QIENTZXF1ZW50aWFsT3V0U3RyZWFtU2l6ZUNvdW50OjpXcml0ZShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIFVJbnQzMiByZWFsUHJvY2Vzc2VkU2l6ZTsNCisgIEhSRVNVTFQgcmVzdWx0ID0gX3N0cmVhbS0+V3JpdGUoZGF0YSwgc2l6ZSwgJnJlYWxQcm9jZXNzZWRTaXplKTsNCisgIF9zaXplICs9IHJlYWxQcm9jZXNzZWRTaXplOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gcmVhbFByb2Nlc3NlZFNpemU7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisNCitzdGF0aWMgY29uc3QgVUludDY0IGtFbXB0eVRhZyA9IChVSW50NjQpKEludDY0KS0xOw0KKw0KK3ZvaWQgQ0NhY2hlZEluU3RyZWFtOjpGcmVlKCkgdGhyb3coKQ0KK3sNCisgIE15RnJlZShfdGFncyk7DQorICBfdGFncyA9IDA7DQorICBNaWRGcmVlKF9kYXRhKTsNCisgIF9kYXRhID0gMDsNCit9DQorDQorYm9vbCBDQ2FjaGVkSW5TdHJlYW06OkFsbG9jKHVuc2lnbmVkIGJsb2NrU2l6ZUxvZywgdW5zaWduZWQgbnVtQmxvY2tzTG9nKSB0aHJvdygpDQorew0KKyAgdW5zaWduZWQgc2l6ZUxvZyA9IGJsb2NrU2l6ZUxvZyArIG51bUJsb2Nrc0xvZzsNCisgIGlmIChzaXplTG9nID49IHNpemVvZihzaXplX3QpICogOCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgc2l6ZV90IGRhdGFTaXplID0gKHNpemVfdCkxIDw8IHNpemVMb2c7DQorICBpZiAoX2RhdGEgPT0gMCB8fCBkYXRhU2l6ZSAhPSBfZGF0YVNpemUpDQorICB7DQorICAgIE1pZEZyZWUoX2RhdGEpOw0KKyAgICBfZGF0YSA9IChCeXRlICopTWlkQWxsb2MoZGF0YVNpemUpOw0KKyAgICBpZiAoX2RhdGEgPT0gMCkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIF9kYXRhU2l6ZSA9IGRhdGFTaXplOw0KKyAgfQ0KKyAgaWYgKF90YWdzID09IDAgfHwgbnVtQmxvY2tzTG9nICE9IF9udW1CbG9ja3NMb2cpDQorICB7DQorICAgIE15RnJlZShfdGFncyk7DQorICAgIF90YWdzID0gKFVJbnQ2NCAqKU15QWxsb2Moc2l6ZW9mKFVJbnQ2NCkgPDwgbnVtQmxvY2tzTG9nKTsNCisgICAgaWYgKF90YWdzID09IDApDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBfbnVtQmxvY2tzTG9nID0gbnVtQmxvY2tzTG9nOw0KKyAgfQ0KKyAgX2Jsb2NrU2l6ZUxvZyA9IGJsb2NrU2l6ZUxvZzsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCit2b2lkIENDYWNoZWRJblN0cmVhbTo6SW5pdChVSW50NjQgc2l6ZSkgdGhyb3coKQ0KK3sNCisgIF9zaXplID0gc2l6ZTsNCisgIF9wb3MgPSAwOw0KKyAgc2l6ZV90IG51bUJsb2NrcyA9IChzaXplX3QpMSA8PCBfbnVtQmxvY2tzTG9nOw0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1CbG9ja3M7IGkrKykNCisgICAgX3RhZ3NbaV0gPSBrRW1wdHlUYWc7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQ2FjaGVkSW5TdHJlYW06OlJlYWQodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgKnByb2Nlc3NlZFNpemUgPSAwOw0KKyAgaWYgKHNpemUgPT0gMCkNCisgICAgcmV0dXJuIFNfT0s7DQorICBpZiAoX3BvcyA+PSBfc2l6ZSkNCisgICAgcmV0dXJuIFNfT0s7DQorDQorICB7DQorICAgIFVJbnQ2NCByZW0gPSBfc2l6ZSAtIF9wb3M7DQorICAgIGlmIChzaXplID4gcmVtKQ0KKyAgICAgIHNpemUgPSAoVUludDMyKXJlbTsNCisgIH0NCisNCisgIHdoaWxlIChzaXplICE9IDApDQorICB7DQorICAgIFVJbnQ2NCBjYWNoZVRhZyA9IF9wb3MgPj4gX2Jsb2NrU2l6ZUxvZzsNCisgICAgc2l6ZV90IGNhY2hlSW5kZXggPSAoc2l6ZV90KWNhY2hlVGFnICYgKCgoc2l6ZV90KTEgPDwgX251bUJsb2Nrc0xvZykgLSAxKTsNCisgICAgQnl0ZSAqcCA9IF9kYXRhICsgKGNhY2hlSW5kZXggPDwgX2Jsb2NrU2l6ZUxvZyk7DQorICAgIGlmIChfdGFnc1tjYWNoZUluZGV4XSAhPSBjYWNoZVRhZykNCisgICAgew0KKyAgICAgIFVJbnQ2NCByZW1JbkJsb2NrID0gX3NpemUgLSAoY2FjaGVUYWcgPDwgX2Jsb2NrU2l6ZUxvZyk7DQorICAgICAgc2l6ZV90IGJsb2NrU2l6ZSA9IChzaXplX3QpMSA8PCBfYmxvY2tTaXplTG9nOw0KKyAgICAgIGlmIChibG9ja1NpemUgPiByZW1JbkJsb2NrKQ0KKyAgICAgICAgYmxvY2tTaXplID0gKHNpemVfdClyZW1JbkJsb2NrOw0KKyAgICAgIFJJTk9LKFJlYWRCbG9jayhjYWNoZVRhZywgcCwgYmxvY2tTaXplKSk7DQorICAgICAgX3RhZ3NbY2FjaGVJbmRleF0gPSBjYWNoZVRhZzsNCisgICAgfQ0KKyAgICBzaXplX3Qgb2Zmc2V0ID0gKHNpemVfdClfcG9zICYgKCgoc2l6ZV90KTEgPDwgX2Jsb2NrU2l6ZUxvZykgLSAxKTsNCisgICAgVUludDMyIGN1ciA9IChVSW50MzIpTXlNaW4oKChzaXplX3QpMSA8PCBfYmxvY2tTaXplTG9nKSAtIG9mZnNldCwgKHNpemVfdClzaXplKTsNCisgICAgbWVtY3B5KGRhdGEsIHAgKyBvZmZzZXQsIGN1cik7DQorICAgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAgICpwcm9jZXNzZWRTaXplICs9IGN1cjsNCisgICAgZGF0YSA9ICh2b2lkICopKChjb25zdCBCeXRlICopZGF0YSArIGN1cik7DQorICAgIF9wb3MgKz0gY3VyOw0KKyAgICBzaXplIC09IGN1cjsNCisgIH0NCisNCisgIHJldHVybiBTX09LOw0KK30NCisgDQorU1RETUVUSE9ESU1QIENDYWNoZWRJblN0cmVhbTo6U2VlayhJbnQ2NCBvZmZzZXQsIFVJbnQzMiBzZWVrT3JpZ2luLCBVSW50NjQgKm5ld1Bvc2l0aW9uKQ0KK3sNCisgIHN3aXRjaCAoc2Vla09yaWdpbikNCisgIHsNCisgICAgY2FzZSBTVFJFQU1fU0VFS19TRVQ6IGJyZWFrOw0KKyAgICBjYXNlIFNUUkVBTV9TRUVLX0NVUjogb2Zmc2V0ICs9IF9wb3M7IGJyZWFrOw0KKyAgICBjYXNlIFNUUkVBTV9TRUVLX0VORDogb2Zmc2V0ICs9IF9zaXplOyBicmVhazsNCisgICAgZGVmYXVsdDogcmV0dXJuIFNUR19FX0lOVkFMSURGVU5DVElPTjsNCisgIH0NCisgIGlmIChvZmZzZXQgPCAwKQ0KKyAgICByZXR1cm4gSFJFU1VMVF9XSU4zMl9FUlJPUl9ORUdBVElWRV9TRUVLOw0KKyAgX3BvcyA9IG9mZnNldDsNCisgIGlmIChuZXdQb3NpdGlvbikNCisgICAgKm5ld1Bvc2l0aW9uID0gb2Zmc2V0Ow0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1N0cmVhbU9iamVjdHMuaCBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1N0cmVhbU9iamVjdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmMzNWI4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21tb24vU3RyZWFtT2JqZWN0cy5oCkBAIC0wLDAgKzEsMTQwIEBACisvLyBTdHJlYW1PYmplY3RzLmgNCisNCisjaWZuZGVmIF9fU1RSRUFNX09CSkVDVFNfSA0KKyNkZWZpbmUgX19TVFJFQU1fT0JKRUNUU19IDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUJ1ZmZlci5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlDb20uaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL015VmVjdG9yLmgiDQorDQorI2luY2x1ZGUgIi4uL0lTdHJlYW0uaCINCisNCitzdHJ1Y3QgQ1JlZmVyZW5jZUJ1ZjoNCisgIHB1YmxpYyBJVW5rbm93biwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KKyAgQ0J5dGVCdWZmZXIgQnVmOw0KKyAgTVlfVU5LTk9XTl9JTVANCit9Ow0KKw0KK2NsYXNzIENCdWZJblN0cmVhbToNCisgIHB1YmxpYyBJSW5TdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIGNvbnN0IEJ5dGUgKl9kYXRhOw0KKyAgVUludDY0IF9wb3M7DQorICBzaXplX3QgX3NpemU7DQorICBDTXlDb21QdHI8SVVua25vd24+IF9yZWY7DQorcHVibGljOg0KKyAgdm9pZCBJbml0KGNvbnN0IEJ5dGUgKmRhdGEsIHNpemVfdCBzaXplLCBJVW5rbm93biAqcmVmID0gMCkNCisgIHsNCisgICAgX2RhdGEgPSBkYXRhOw0KKyAgICBfc2l6ZSA9IHNpemU7DQorICAgIF9wb3MgPSAwOw0KKyAgICBfcmVmID0gcmVmOw0KKyAgfQ0KKyAgdm9pZCBJbml0KENSZWZlcmVuY2VCdWYgKnJlZikgeyBJbml0KHJlZi0+QnVmLCByZWYtPkJ1Zi5TaXplKCksIHJlZik7IH0NCisNCisgIE1ZX1VOS05PV05fSU1QMihJU2VxdWVudGlhbEluU3RyZWFtLCBJSW5TdHJlYW0pDQorICBTVERNRVRIT0QoUmVhZCkodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorICBTVERNRVRIT0QoU2VlaykoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbik7DQorfTsNCisNCisvLyB2b2lkIENyZWF0ZV9CdWZJblN0cmVhbV9XaXRoUmVmZXJlbmNlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBJU2VxdWVudGlhbEluU3RyZWFtICoqc3RyZWFtKTsNCit2b2lkIENyZWF0ZV9CdWZJblN0cmVhbV9XaXRoTmV3QnVmKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBJU2VxdWVudGlhbEluU3RyZWFtICoqc3RyZWFtKTsNCisNCitjbGFzcyBDQnl0ZUR5bkJ1ZmZlcg0KK3sNCisgIHNpemVfdCBfY2FwYWNpdHk7DQorICBCeXRlICpfYnVmOw0KK3B1YmxpYzoNCisgIENCeXRlRHluQnVmZmVyKCk6IF9jYXBhY2l0eSgwKSwgX2J1ZigwKSB7fTsNCisgIC8vIHRoZXJlIGlzIG5vIGNvcHkgY29uc3RydWN0b3IuIFNvIGRvbid0IGNvcHkgdGhpcyBvYmplY3QuDQorICB+Q0J5dGVEeW5CdWZmZXIoKSB7IEZyZWUoKTsgfQ0KKyAgdm9pZCBGcmVlKCkgdGhyb3coKTsNCisgIHNpemVfdCBHZXRDYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIF9jYXBhY2l0eTsgfQ0KKyAgb3BlcmF0b3IgQnl0ZSooKSBjb25zdCB7IHJldHVybiBfYnVmOyB9Ow0KKyAgb3BlcmF0b3IgY29uc3QgQnl0ZSooKSBjb25zdCB7IHJldHVybiBfYnVmOyB9Ow0KKyAgYm9vbCBFbnN1cmVDYXBhY2l0eShzaXplX3QgY2FwYWNpdHkpIHRocm93KCk7DQorfTsNCisNCitjbGFzcyBDRHluQnVmU2VxT3V0U3RyZWFtOg0KKyAgcHVibGljIElTZXF1ZW50aWFsT3V0U3RyZWFtLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBDQnl0ZUR5bkJ1ZmZlciBfYnVmZmVyOw0KKyAgc2l6ZV90IF9zaXplOw0KK3B1YmxpYzoNCisgIENEeW5CdWZTZXFPdXRTdHJlYW0oKTogX3NpemUoMCkge30NCisgIHZvaWQgSW5pdCgpIHsgX3NpemUgPSAwOyAgfQ0KKyAgc2l6ZV90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBfc2l6ZTsgfQ0KKyAgY29uc3QgQnl0ZSAqR2V0QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gX2J1ZmZlcjsgfQ0KKyAgdm9pZCBDb3B5VG9CdWZmZXIoQ0J5dGVCdWZmZXIgJmRlc3QpIGNvbnN0Ow0KKyAgQnl0ZSAqR2V0QnVmUHRyRm9yV3JpdGluZyhzaXplX3QgYWRkU2l6ZSk7DQorICB2b2lkIFVwZGF0ZVNpemUoc2l6ZV90IGFkZFNpemUpIHsgX3NpemUgKz0gYWRkU2l6ZTsgfQ0KKw0KKyAgTVlfVU5LTk9XTl9JTVAxKElTZXF1ZW50aWFsT3V0U3RyZWFtKQ0KKyAgU1RETUVUSE9EKFdyaXRlKShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCit9Ow0KKw0KK2NsYXNzIENCdWZQdHJTZXFPdXRTdHJlYW06DQorICBwdWJsaWMgSVNlcXVlbnRpYWxPdXRTdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIEJ5dGUgKl9idWZmZXI7DQorICBzaXplX3QgX3NpemU7DQorICBzaXplX3QgX3BvczsNCitwdWJsaWM6DQorICB2b2lkIEluaXQoQnl0ZSAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkNCisgIHsNCisgICAgX2J1ZmZlciA9IGJ1ZmZlcjsNCisgICAgX3BvcyA9IDA7DQorICAgIF9zaXplID0gc2l6ZTsNCisgIH0NCisgIHNpemVfdCBHZXRQb3MoKSBjb25zdCB7IHJldHVybiBfcG9zOyB9DQorDQorICBNWV9VTktOT1dOX0lNUDEoSVNlcXVlbnRpYWxPdXRTdHJlYW0pDQorICBTVERNRVRIT0QoV3JpdGUpKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KK307DQorDQorY2xhc3MgQ1NlcXVlbnRpYWxPdXRTdHJlYW1TaXplQ291bnQ6DQorICBwdWJsaWMgSVNlcXVlbnRpYWxPdXRTdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gX3N0cmVhbTsNCisgIFVJbnQ2NCBfc2l6ZTsNCitwdWJsaWM6DQorICB2b2lkIFNldFN0cmVhbShJU2VxdWVudGlhbE91dFN0cmVhbSAqc3RyZWFtKSB7IF9zdHJlYW0gPSBzdHJlYW07IH0NCisgIHZvaWQgSW5pdCgpIHsgX3NpemUgPSAwOyB9DQorICBVSW50NjQgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9zaXplOyB9DQorDQorICBNWV9VTktOT1dOX0lNUDEoSVNlcXVlbnRpYWxPdXRTdHJlYW0pDQorICBTVERNRVRIT0QoV3JpdGUpKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KK307DQorDQorY2xhc3MgQ0NhY2hlZEluU3RyZWFtOg0KKyAgcHVibGljIElJblN0cmVhbSwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KKyAgVUludDY0ICpfdGFnczsNCisgIEJ5dGUgKl9kYXRhOw0KKyAgc2l6ZV90IF9kYXRhU2l6ZTsNCisgIHVuc2lnbmVkIF9ibG9ja1NpemVMb2c7DQorICB1bnNpZ25lZCBfbnVtQmxvY2tzTG9nOw0KKyAgVUludDY0IF9zaXplOw0KKyAgVUludDY0IF9wb3M7DQorcHJvdGVjdGVkOg0KKyAgdmlydHVhbCBIUkVTVUxUIFJlYWRCbG9jayhVSW50NjQgYmxvY2tJbmRleCwgQnl0ZSAqZGVzdCwgc2l6ZV90IGJsb2NrU2l6ZSkgPSAwOw0KK3B1YmxpYzoNCisgIENDYWNoZWRJblN0cmVhbSgpOiBfdGFncygwKSwgX2RhdGEoMCkge30NCisgIHZpcnR1YWwgfkNDYWNoZWRJblN0cmVhbSgpIHsgRnJlZSgpOyB9IC8vIHRoZSBkZXN0cnVjdG9yIG11c3QgYmUgdmlydHVhbCAocmVsZWFzZSBjYWxscyBpdCkgISEhDQorICB2b2lkIEZyZWUoKSB0aHJvdygpOw0KKyAgYm9vbCBBbGxvYyh1bnNpZ25lZCBibG9ja1NpemVMb2csIHVuc2lnbmVkIG51bUJsb2Nrc0xvZykgdGhyb3coKTsNCisgIHZvaWQgSW5pdChVSW50NjQgc2l6ZSkgdGhyb3coKTsNCisNCisgIE1ZX1VOS05PV05fSU1QMihJU2VxdWVudGlhbEluU3RyZWFtLCBJSW5TdHJlYW0pDQorICBTVERNRVRIT0QoUmVhZCkodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorICBTVERNRVRIT0QoU2VlaykoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbik7DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9TdHJlYW1VdGlscy5jcHAgYi9sem1hL0NQUC83emlwL0NvbW1vbi9TdHJlYW1VdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5ZGUyMwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1N0cmVhbVV0aWxzLmNwcApAQCAtMCwwICsxLDU2IEBACisvLyBTdHJlYW1VdGlscy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIlN0cmVhbVV0aWxzLmgiDQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrQmxvY2tTaXplID0gKChVSW50MzIpMSA8PCAzMSk7DQorDQorSFJFU1VMVCBSZWFkU3RyZWFtKElTZXF1ZW50aWFsSW5TdHJlYW0gKnN0cmVhbSwgdm9pZCAqZGF0YSwgc2l6ZV90ICpwcm9jZXNzZWRTaXplKSB0aHJvdygpDQorew0KKyAgc2l6ZV90IHNpemUgPSAqcHJvY2Vzc2VkU2l6ZTsNCisgICpwcm9jZXNzZWRTaXplID0gMDsNCisgIHdoaWxlIChzaXplICE9IDApDQorICB7DQorICAgIFVJbnQzMiBjdXJTaXplID0gKHNpemUgPCBrQmxvY2tTaXplKSA/IChVSW50MzIpc2l6ZSA6IGtCbG9ja1NpemU7DQorICAgIFVJbnQzMiBwcm9jZXNzZWRTaXplTG9jOw0KKyAgICBIUkVTVUxUIHJlcyA9IHN0cmVhbS0+UmVhZChkYXRhLCBjdXJTaXplLCAmcHJvY2Vzc2VkU2l6ZUxvYyk7DQorICAgICpwcm9jZXNzZWRTaXplICs9IHByb2Nlc3NlZFNpemVMb2M7DQorICAgIGRhdGEgPSAodm9pZCAqKSgoQnl0ZSAqKWRhdGEgKyBwcm9jZXNzZWRTaXplTG9jKTsNCisgICAgc2l6ZSAtPSBwcm9jZXNzZWRTaXplTG9jOw0KKyAgICBSSU5PSyhyZXMpOw0KKyAgICBpZiAocHJvY2Vzc2VkU2l6ZUxvYyA9PSAwKQ0KKyAgICAgIHJldHVybiBTX09LOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgUmVhZFN0cmVhbV9GQUxTRShJU2VxdWVudGlhbEluU3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB0aHJvdygpDQorew0KKyAgc2l6ZV90IHByb2Nlc3NlZFNpemUgPSBzaXplOw0KKyAgUklOT0soUmVhZFN0cmVhbShzdHJlYW0sIGRhdGEsICZwcm9jZXNzZWRTaXplKSk7DQorICByZXR1cm4gKHNpemUgPT0gcHJvY2Vzc2VkU2l6ZSkgPyBTX09LIDogU19GQUxTRTsNCit9DQorDQorSFJFU1VMVCBSZWFkU3RyZWFtX0ZBSUwoSVNlcXVlbnRpYWxJblN0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgdGhyb3coKQ0KK3sNCisgIHNpemVfdCBwcm9jZXNzZWRTaXplID0gc2l6ZTsNCisgIFJJTk9LKFJlYWRTdHJlYW0oc3RyZWFtLCBkYXRhLCAmcHJvY2Vzc2VkU2l6ZSkpOw0KKyAgcmV0dXJuIChzaXplID09IHByb2Nlc3NlZFNpemUpID8gU19PSyA6IEVfRkFJTDsNCit9DQorDQorSFJFU1VMVCBXcml0ZVN0cmVhbShJU2VxdWVudGlhbE91dFN0cmVhbSAqc3RyZWFtLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgdGhyb3coKQ0KK3sNCisgIHdoaWxlIChzaXplICE9IDApDQorICB7DQorICAgIFVJbnQzMiBjdXJTaXplID0gKHNpemUgPCBrQmxvY2tTaXplKSA/IChVSW50MzIpc2l6ZSA6IGtCbG9ja1NpemU7DQorICAgIFVJbnQzMiBwcm9jZXNzZWRTaXplTG9jOw0KKyAgICBIUkVTVUxUIHJlcyA9IHN0cmVhbS0+V3JpdGUoZGF0YSwgY3VyU2l6ZSwgJnByb2Nlc3NlZFNpemVMb2MpOw0KKyAgICBkYXRhID0gKGNvbnN0IHZvaWQgKikoKGNvbnN0IEJ5dGUgKilkYXRhICsgcHJvY2Vzc2VkU2l6ZUxvYyk7DQorICAgIHNpemUgLT0gcHJvY2Vzc2VkU2l6ZUxvYzsNCisgICAgUklOT0socmVzKTsNCisgICAgaWYgKHByb2Nlc3NlZFNpemVMb2MgPT0gMCkNCisgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1N0cmVhbVV0aWxzLmggYi9sem1hL0NQUC83emlwL0NvbW1vbi9TdHJlYW1VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OWE4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbW1vbi9TdHJlYW1VdGlscy5oCkBAIC0wLDAgKzEsMTMgQEAKKy8vIFN0cmVhbVV0aWxzLmgNCisNCisjaWZuZGVmIF9fU1RSRUFNX1VUSUxTX0gNCisjZGVmaW5lIF9fU1RSRUFNX1VUSUxTX0gNCisNCisjaW5jbHVkZSAiLi4vSVN0cmVhbS5oIg0KKw0KK0hSRVNVTFQgUmVhZFN0cmVhbShJU2VxdWVudGlhbEluU3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEsIHNpemVfdCAqc2l6ZSkgdGhyb3coKTsNCitIUkVTVUxUIFJlYWRTdHJlYW1fRkFMU0UoSVNlcXVlbnRpYWxJblN0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgdGhyb3coKTsNCitIUkVTVUxUIFJlYWRTdHJlYW1fRkFJTChJU2VxdWVudGlhbEluU3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB0aHJvdygpOw0KK0hSRVNVTFQgV3JpdGVTdHJlYW0oSVNlcXVlbnRpYWxPdXRTdHJlYW0gKnN0cmVhbSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHRocm93KCk7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vVW5pcUJsb2Nrcy5jcHAgYi9sem1hL0NQUC83emlwL0NvbW1vbi9VbmlxQmxvY2tzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODA4Zjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21tb24vVW5pcUJsb2Nrcy5jcHAKQEAgLTAsMCArMSw1NiBAQAorLy8gVW5pcUJsb2Nrcy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIlVuaXFCbG9ja3MuaCINCisNCitpbnQgQ1VuaXFCbG9ja3M6OkFkZFVuaXEoY29uc3QgQnl0ZSAqZGF0YSwgc2l6ZV90IHNpemUpDQorew0KKyAgdW5zaWduZWQgbGVmdCA9IDAsIHJpZ2h0ID0gU29ydGVkLlNpemUoKTsNCisgIHdoaWxlIChsZWZ0ICE9IHJpZ2h0KQ0KKyAgew0KKyAgICB1bnNpZ25lZCBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7DQorICAgIGludCBpbmRleCA9IFNvcnRlZFttaWRdOw0KKyAgICBjb25zdCBDQnl0ZUJ1ZmZlciAmYnVmID0gQnVmc1tpbmRleF07DQorICAgIHNpemVfdCBzaXplTWlkID0gYnVmLlNpemUoKTsNCisgICAgaWYgKHNpemUgPCBzaXplTWlkKQ0KKyAgICAgIHJpZ2h0ID0gbWlkOw0KKyAgICBlbHNlIGlmIChzaXplID4gc2l6ZU1pZCkNCisgICAgICBsZWZ0ID0gbWlkICsgMTsNCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgaW50IGNtcCA9IG1lbWNtcChkYXRhLCBidWYsIHNpemUpOw0KKyAgICAgIGlmIChjbXAgPT0gMCkNCisgICAgICAgIHJldHVybiBpbmRleDsNCisgICAgICBpZiAoY21wIDwgMCkNCisgICAgICAgIHJpZ2h0ID0gbWlkOw0KKyAgICAgIGVsc2UNCisgICAgICAgIGxlZnQgPSBtaWQgKyAxOw0KKyAgICB9DQorICB9DQorICBpbnQgaW5kZXggPSBCdWZzLlNpemUoKTsNCisgIFNvcnRlZC5JbnNlcnQobGVmdCwgaW5kZXgpOw0KKyAgQ0J5dGVCdWZmZXIgJmJ1ZiA9IEJ1ZnMuQWRkTmV3KCk7DQorICBidWYuQ29weUZyb20oZGF0YSwgc2l6ZSk7DQorICByZXR1cm4gaW5kZXg7DQorfQ0KKw0KK1VJbnQ2NCBDVW5pcUJsb2Nrczo6R2V0VG90YWxTaXplSW5CeXRlcygpIGNvbnN0DQorew0KKyAgVUludDY0IHNpemUgPSAwOw0KKyAgRk9SX1ZFQ1RPUiAoaSwgQnVmcykNCisgICAgc2l6ZSArPSBCdWZzW2ldLlNpemUoKTsNCisgIHJldHVybiBzaXplOw0KK30NCisNCit2b2lkIENVbmlxQmxvY2tzOjpHZXRSZXZlcnNlTWFwKCkNCit7DQorICB1bnNpZ25lZCBudW0gPSBTb3J0ZWQuU2l6ZSgpOw0KKyAgQnVmSW5kZXhUb1NvcnRlZEluZGV4LkNsZWFyQW5kU2V0U2l6ZShudW0pOw0KKyAgaW50ICpwID0gJkJ1ZkluZGV4VG9Tb3J0ZWRJbmRleFswXTsNCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspDQorICAgIHBbaV0gPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQ0KKyAgICBwW1NvcnRlZFtpXV0gPSBpOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9VbmlxQmxvY2tzLmggYi9sem1hL0NQUC83emlwL0NvbW1vbi9VbmlxQmxvY2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwZGZiOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1VuaXFCbG9ja3MuaApAQCAtMCwwICsxLDMwIEBACisvLyBVbmlxQmxvY2tzLmgNCisNCisjaWZuZGVmIF9fVU5JUV9CTE9DS1NfSA0KKyNkZWZpbmUgX19VTklRX0JMT0NLU19IDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeVR5cGVzLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUJ1ZmZlci5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlWZWN0b3IuaCINCisNCitzdHJ1Y3QgQ1VuaXFCbG9ja3MNCit7DQorICBDT2JqZWN0VmVjdG9yPENCeXRlQnVmZmVyPiBCdWZzOw0KKyAgQ0ludFZlY3RvciBTb3J0ZWQ7DQorICBDSW50VmVjdG9yIEJ1ZkluZGV4VG9Tb3J0ZWRJbmRleDsNCisNCisgIGludCBBZGRVbmlxKGNvbnN0IEJ5dGUgKmRhdGEsIHNpemVfdCBzaXplKTsNCisgIFVJbnQ2NCBHZXRUb3RhbFNpemVJbkJ5dGVzKCkgY29uc3Q7DQorICB2b2lkIEdldFJldmVyc2VNYXAoKTsNCisNCisgIGJvb2wgSXNPbmx5RW1wdHkoKSBjb25zdA0KKyAgew0KKyAgICBpZiAoQnVmcy5TaXplKCkgPT0gMCkNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgaWYgKEJ1ZnMuU2l6ZSgpID4gMSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIHJldHVybiBCdWZzWzBdLlNpemUoKSA9PSAwOw0KKyAgfQ0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21tb24vVmlydFRocmVhZC5jcHAgYi9sem1hL0NQUC83emlwL0NvbW1vbi9WaXJ0VGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2Y5YWNkCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21tb24vVmlydFRocmVhZC5jcHAKQEAgLTAsMCArMSw0OCBAQAorLy8gVmlydFRocmVhZC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIlZpcnRUaHJlYWQuaCINCisNCitzdGF0aWMgVEhSRUFEX0ZVTkNfREVDTCBDb2RlclRocmVhZCh2b2lkICpwKQ0KK3sNCisgIGZvciAoOzspDQorICB7DQorICAgIENWaXJ0VGhyZWFkICp0ID0gKENWaXJ0VGhyZWFkICopcDsNCisgICAgdC0+U3RhcnRFdmVudC5Mb2NrKCk7DQorICAgIGlmICh0LT5FeGl0KQ0KKyAgICAgIHJldHVybiAwOw0KKyAgICB0LT5FeGVjdXRlKCk7DQorICAgIHQtPkZpbmlzaGVkRXZlbnQuU2V0KCk7DQorICB9DQorfQ0KKw0KK1dSZXMgQ1ZpcnRUaHJlYWQ6OkNyZWF0ZSgpDQorew0KKyAgUklOT0soU3RhcnRFdmVudC5DcmVhdGVJZk5vdENyZWF0ZWQoKSk7DQorICBSSU5PSyhGaW5pc2hlZEV2ZW50LkNyZWF0ZUlmTm90Q3JlYXRlZCgpKTsNCisgIFN0YXJ0RXZlbnQuUmVzZXQoKTsNCisgIEZpbmlzaGVkRXZlbnQuUmVzZXQoKTsNCisgIEV4aXQgPSBmYWxzZTsNCisgIGlmIChUaHJlYWQuSXNDcmVhdGVkKCkpDQorICAgIHJldHVybiBTX09LOw0KKyAgcmV0dXJuIFRocmVhZC5DcmVhdGUoQ29kZXJUaHJlYWQsIHRoaXMpOw0KK30NCisNCit2b2lkIENWaXJ0VGhyZWFkOjpTdGFydCgpDQorew0KKyAgRXhpdCA9IGZhbHNlOw0KKyAgU3RhcnRFdmVudC5TZXQoKTsNCit9DQorDQordm9pZCBDVmlydFRocmVhZDo6V2FpdFRocmVhZEZpbmlzaCgpDQorew0KKyAgRXhpdCA9IHRydWU7DQorICBpZiAoU3RhcnRFdmVudC5Jc0NyZWF0ZWQoKSkNCisgICAgU3RhcnRFdmVudC5TZXQoKTsNCisgIGlmIChUaHJlYWQuSXNDcmVhdGVkKCkpDQorICB7DQorICAgIFRocmVhZC5XYWl0KCk7DQorICAgIFRocmVhZC5DbG9zZSgpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbW1vbi9WaXJ0VGhyZWFkLmggYi9sem1hL0NQUC83emlwL0NvbW1vbi9WaXJ0VGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3MTEwMwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tbW9uL1ZpcnRUaHJlYWQuaApAQCAtMCwwICsxLDI0IEBACisvLyBWaXJ0VGhyZWFkLmgNCisNCisjaWZuZGVmIF9fVklSVF9USFJFQURfSA0KKyNkZWZpbmUgX19WSVJUX1RIUkVBRF9IDQorDQorI2luY2x1ZGUgIi4uLy4uL1dpbmRvd3MvU3luY2hyb25pemF0aW9uLmgiDQorI2luY2x1ZGUgIi4uLy4uL1dpbmRvd3MvVGhyZWFkLmgiDQorDQorc3RydWN0IENWaXJ0VGhyZWFkDQorew0KKyAgTldpbmRvd3M6Ok5TeW5jaHJvbml6YXRpb246OkNBdXRvUmVzZXRFdmVudCBTdGFydEV2ZW50Ow0KKyAgTldpbmRvd3M6Ok5TeW5jaHJvbml6YXRpb246OkNBdXRvUmVzZXRFdmVudCBGaW5pc2hlZEV2ZW50Ow0KKyAgTldpbmRvd3M6OkNUaHJlYWQgVGhyZWFkOw0KKyAgYm9vbCBFeGl0Ow0KKw0KKyAgfkNWaXJ0VGhyZWFkKCkgeyBXYWl0VGhyZWFkRmluaXNoKCk7IH0NCisgIHZvaWQgV2FpdFRocmVhZEZpbmlzaCgpOyAvLyBjYWxsIGl0IGluIGRlc3RydWN0b3Igb2YgY2hpbGQgY2xhc3MgIQ0KKyAgV1JlcyBDcmVhdGUoKTsNCisgIHZvaWQgU3RhcnQoKTsNCisgIHZpcnR1YWwgdm9pZCBFeGVjdXRlKCkgPSAwOw0KKyAgdm9pZCBXYWl0RXhlY3V0ZUZpbmlzaCgpIHsgRmluaXNoZWRFdmVudC5Mb2NrKCk7IH0NCit9Ow0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQmNqMkNvZGVyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQmNqMkNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzY5OTRjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9CY2oyQ29kZXIuY3BwCkBAIC0wLDAgKzEsMzY2IEBACisvLyBCY2oyQ29kZXIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0FsbG9jLmgiDQorDQorI2luY2x1ZGUgIkJjajJDb2Rlci5oIg0KKw0KK25hbWVzcGFjZSBOQ29tcHJlc3Mgew0KK25hbWVzcGFjZSBOQmNqMiB7DQorDQoraW5saW5lIGJvb2wgSXNKY2MoQnl0ZSBiMCwgQnl0ZSBiMSkgeyByZXR1cm4gKGIwID09IDB4MEYgJiYgKGIxICYgMHhGMCkgPT0gMHg4MCk7IH0NCitpbmxpbmUgYm9vbCBJc0ooQnl0ZSBiMCwgQnl0ZSBiMSkgeyByZXR1cm4gKChiMSAmIDB4RkUpID09IDB4RTggfHwgSXNKY2MoYjAsIGIxKSk7IH0NCitpbmxpbmUgdW5zaWduZWQgR2V0SW5kZXgoQnl0ZSBiMCwgQnl0ZSBiMSkgeyByZXR1cm4gKChiMSA9PSAweEU4KSA/IGIwIDogKChiMSA9PSAweEU5KSA/IDI1NiA6IDI1NykpOyB9DQorDQorI2lmbmRlZiBFWFRSQUNUX09OTFkNCisNCitzdGF0aWMgY29uc3QgdW5zaWduZWQga0J1ZlNpemUgPSAxIDw8IDE3Ow0KKw0KKyNkZWZpbmUgTlVNX0JJVFMgMg0KKyNkZWZpbmUgU0lHTl9CSVQgKDEgPDwgTlVNX0JJVFMpDQorI2RlZmluZSBNQVNLX0hJR0ggKDB4MTAwIC0gKDEgPDwgKE5VTV9CSVRTICsgMSkpKQ0KKw0KK3N0YXRpYyBjb25zdCBVSW50MzIga0RlZmF1bHRMaW1pdCA9ICgxIDw8ICgyNCArIE5VTV9CSVRTKSk7DQorDQorc3RhdGljIGJvb2wgaW5saW5lIFRlc3Q4Nk1TQnl0ZShCeXRlIGIpDQorew0KKyAgcmV0dXJuICgoKGIpICsgU0lHTl9CSVQpICYgTUFTS19ISUdIKSA9PSAwOw0KK30NCisNCitDRW5jb2Rlcjo6fkNFbmNvZGVyKCkNCit7DQorICA6Ok1pZEZyZWUoX2J1Zik7DQorfQ0KKw0KK0hSRVNVTFQgQ0VuY29kZXI6OkZsdXNoKCkNCit7DQorICBSSU5PSyhfbWFpblN0cmVhbS5GbHVzaCgpKTsNCisgIFJJTk9LKF9jYWxsU3RyZWFtLkZsdXNoKCkpOw0KKyAgUklOT0soX2p1bXBTdHJlYW0uRmx1c2goKSk7DQorICBfcmMuRmx1c2hEYXRhKCk7DQorICByZXR1cm4gX3JjLkZsdXNoU3RyZWFtKCk7DQorfQ0KKw0KK0hSRVNVTFQgQ0VuY29kZXI6OkNvZGVSZWFsKElTZXF1ZW50aWFsSW5TdHJlYW0gKippblN0cmVhbXMsIGNvbnN0IFVJbnQ2NCAqKmluU2l6ZXMsIFVJbnQzMiBudW1JblN0cmVhbXMsDQorICAgIElTZXF1ZW50aWFsT3V0U3RyZWFtICoqb3V0U3RyZWFtcywgY29uc3QgVUludDY0ICoqIC8qIG91dFNpemVzICovLCBVSW50MzIgbnVtT3V0U3RyZWFtcywNCisgICAgSUNvbXByZXNzUHJvZ3Jlc3NJbmZvICpwcm9ncmVzcykNCit7DQorICBpZiAobnVtSW5TdHJlYW1zICE9IDEgfHwgbnVtT3V0U3RyZWFtcyAhPSA0KQ0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKw0KKyAgaWYgKCFfbWFpblN0cmVhbS5DcmVhdGUoMSA8PCAxOCkpIHJldHVybiBFX09VVE9GTUVNT1JZOw0KKyAgaWYgKCFfY2FsbFN0cmVhbS5DcmVhdGUoMSA8PCAxOCkpIHJldHVybiBFX09VVE9GTUVNT1JZOw0KKyAgaWYgKCFfanVtcFN0cmVhbS5DcmVhdGUoMSA8PCAxOCkpIHJldHVybiBFX09VVE9GTUVNT1JZOw0KKyAgaWYgKCFfcmMuQ3JlYXRlKDEgPDwgMjApKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisgIGlmIChfYnVmID09IDApDQorICB7DQorICAgIF9idWYgPSAoQnl0ZSAqKU1pZEFsbG9jKGtCdWZTaXplKTsNCisgICAgaWYgKF9idWYgPT0gMCkNCisgICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisgIH0NCisNCisgIGJvb2wgc2l6ZUlzRGVmaW5lZCA9IGZhbHNlOw0KKyAgVUludDY0IGluU2l6ZSA9IDA7DQorICBpZiAoaW5TaXplcykNCisgICAgaWYgKGluU2l6ZXNbMF0pDQorICAgIHsNCisgICAgICBpblNpemUgPSAqaW5TaXplc1swXTsNCisgICAgICBpZiAoaW5TaXplIDw9IGtEZWZhdWx0TGltaXQpDQorICAgICAgICBzaXplSXNEZWZpbmVkID0gdHJ1ZTsNCisgICAgfQ0KKw0KKyAgSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0gPSBpblN0cmVhbXNbMF07DQorDQorICBfbWFpblN0cmVhbS5TZXRTdHJlYW0ob3V0U3RyZWFtc1swXSk7IF9tYWluU3RyZWFtLkluaXQoKTsNCisgIF9jYWxsU3RyZWFtLlNldFN0cmVhbShvdXRTdHJlYW1zWzFdKTsgX2NhbGxTdHJlYW0uSW5pdCgpOw0KKyAgX2p1bXBTdHJlYW0uU2V0U3RyZWFtKG91dFN0cmVhbXNbMl0pOyBfanVtcFN0cmVhbS5Jbml0KCk7DQorICBfcmMuU2V0U3RyZWFtKG91dFN0cmVhbXNbM10pOyBfcmMuSW5pdCgpOw0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDI1NiArIDI7IGkrKykNCisgICAgX3N0YXR1c0VuY29kZXJbaV0uSW5pdCgpOw0KKw0KKyAgQ015Q29tUHRyPElDb21wcmVzc0dldFN1YlN0cmVhbVNpemU+IGdldFN1YlN0cmVhbVNpemU7DQorICB7DQorICAgIGluU3RyZWFtLT5RdWVyeUludGVyZmFjZShJSURfSUNvbXByZXNzR2V0U3ViU3RyZWFtU2l6ZSwgKHZvaWQgKiopJmdldFN1YlN0cmVhbVNpemUpOw0KKyAgfQ0KKw0KKyAgVUludDMyIG5vd1BvcyA9IDA7DQorICBVSW50NjQgbm93UG9zNjQgPSAwOw0KKyAgVUludDMyIGJ1ZlBvcyA9IDA7DQorDQorICBCeXRlIHByZXZCeXRlID0gMDsNCisNCisgIFVJbnQ2NCBzdWJTdHJlYW1JbmRleCA9IDA7DQorICBVSW50NjQgc3ViU3RyZWFtU3RhcnRQb3MgPSAwOw0KKyAgVUludDY0IHN1YlN0cmVhbUVuZFBvcyA9IDA7DQorDQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBVSW50MzIgcHJvY2Vzc2VkU2l6ZSA9IDA7DQorICAgIGZvciAoOzspDQorICAgIHsNCisgICAgICBVSW50MzIgc2l6ZSA9IGtCdWZTaXplIC0gKGJ1ZlBvcyArIHByb2Nlc3NlZFNpemUpOw0KKyAgICAgIFVJbnQzMiBwcm9jZXNzZWRTaXplTG9jOw0KKyAgICAgIGlmIChzaXplID09IDApDQorICAgICAgICBicmVhazsNCisgICAgICBSSU5PSyhpblN0cmVhbS0+UmVhZChfYnVmICsgYnVmUG9zICsgcHJvY2Vzc2VkU2l6ZSwgc2l6ZSwgJnByb2Nlc3NlZFNpemVMb2MpKTsNCisgICAgICBpZiAocHJvY2Vzc2VkU2l6ZUxvYyA9PSAwKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgcHJvY2Vzc2VkU2l6ZSArPSBwcm9jZXNzZWRTaXplTG9jOw0KKyAgICB9DQorICAgIFVJbnQzMiBlbmRQb3MgPSBidWZQb3MgKyBwcm9jZXNzZWRTaXplOw0KKyAgICANCisgICAgaWYgKGVuZFBvcyA8IDUpDQorICAgIHsNCisgICAgICAvLyBjaGFuZ2UgaXQNCisgICAgICBmb3IgKGJ1ZlBvcyA9IDA7IGJ1ZlBvcyA8IGVuZFBvczsgYnVmUG9zKyspDQorICAgICAgew0KKyAgICAgICAgQnl0ZSBiID0gX2J1ZltidWZQb3NdOw0KKyAgICAgICAgX21haW5TdHJlYW0uV3JpdGVCeXRlKGIpOw0KKyAgICAgICAgVUludDMyIGluZGV4Ow0KKyAgICAgICAgaWYgKGIgPT0gMHhFOCkNCisgICAgICAgICAgaW5kZXggPSBwcmV2Qnl0ZTsNCisgICAgICAgIGVsc2UgaWYgKGIgPT0gMHhFOSkNCisgICAgICAgICAgaW5kZXggPSAyNTY7DQorICAgICAgICBlbHNlIGlmIChJc0pjYyhwcmV2Qnl0ZSwgYikpDQorICAgICAgICAgIGluZGV4ID0gMjU3Ow0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICBwcmV2Qnl0ZSA9IGI7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgX3N0YXR1c0VuY29kZXJbaW5kZXhdLkVuY29kZSgmX3JjLCAwKTsNCisgICAgICAgIHByZXZCeXRlID0gYjsNCisgICAgICB9DQorICAgICAgcmV0dXJuIEZsdXNoKCk7DQorICAgIH0NCisNCisgICAgYnVmUG9zID0gMDsNCisNCisgICAgVUludDMyIGxpbWl0ID0gZW5kUG9zIC0gNTsNCisgICAgd2hpbGUgKGJ1ZlBvcyA8PSBsaW1pdCkNCisgICAgew0KKyAgICAgIEJ5dGUgYiA9IF9idWZbYnVmUG9zXTsNCisgICAgICBfbWFpblN0cmVhbS5Xcml0ZUJ5dGUoYik7DQorICAgICAgaWYgKCFJc0oocHJldkJ5dGUsIGIpKQ0KKyAgICAgIHsNCisgICAgICAgIGJ1ZlBvcysrOw0KKyAgICAgICAgcHJldkJ5dGUgPSBiOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIEJ5dGUgbmV4dEJ5dGUgPSBfYnVmW2J1ZlBvcyArIDRdOw0KKyAgICAgIFVJbnQzMiBzcmMgPQ0KKyAgICAgICAgKFVJbnQzMihuZXh0Qnl0ZSkgPDwgMjQpIHwNCisgICAgICAgIChVSW50MzIoX2J1ZltidWZQb3MgKyAzXSkgPDwgMTYpIHwNCisgICAgICAgIChVSW50MzIoX2J1ZltidWZQb3MgKyAyXSkgPDwgOCkgfA0KKyAgICAgICAgKF9idWZbYnVmUG9zICsgMV0pOw0KKyAgICAgIFVJbnQzMiBkZXN0ID0gKG5vd1BvcyArIGJ1ZlBvcyArIDUpICsgc3JjOw0KKyAgICAgIC8vIGlmIChUZXN0ODZNU0J5dGUobmV4dEJ5dGUpKQ0KKyAgICAgIGJvb2wgY29udmVydDsNCisgICAgICBpZiAoZ2V0U3ViU3RyZWFtU2l6ZSkNCisgICAgICB7DQorICAgICAgICBVSW50NjQgY3VycmVudFBvcyA9IChub3dQb3M2NCArIGJ1ZlBvcyk7DQorICAgICAgICB3aGlsZSAoc3ViU3RyZWFtRW5kUG9zIDwgY3VycmVudFBvcykNCisgICAgICAgIHsNCisgICAgICAgICAgVUludDY0IHN1YlN0cmVhbVNpemU7DQorICAgICAgICAgIEhSRVNVTFQgcmVzdWx0ID0gZ2V0U3ViU3RyZWFtU2l6ZS0+R2V0U3ViU3RyZWFtU2l6ZShzdWJTdHJlYW1JbmRleCwgJnN1YlN0cmVhbVNpemUpOw0KKyAgICAgICAgICBpZiAocmVzdWx0ID09IFNfT0spDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBzdWJTdHJlYW1TdGFydFBvcyA9IHN1YlN0cmVhbUVuZFBvczsNCisgICAgICAgICAgICBzdWJTdHJlYW1FbmRQb3MgKz0gc3ViU3RyZWFtU2l6ZTsNCisgICAgICAgICAgICBzdWJTdHJlYW1JbmRleCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSBTX0ZBTFNFIHx8IHJlc3VsdCA9PSBFX05PVElNUEwpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBnZXRTdWJTdHJlYW1TaXplLlJlbGVhc2UoKTsNCisgICAgICAgICAgICBzdWJTdHJlYW1TdGFydFBvcyA9IDA7DQorICAgICAgICAgICAgc3ViU3RyZWFtRW5kUG9zID0gc3ViU3RyZWFtU3RhcnRQb3MgLSAxOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGdldFN1YlN0cmVhbVNpemUgPT0gTlVMTCkNCisgICAgICAgIHsNCisgICAgICAgICAgaWYgKHNpemVJc0RlZmluZWQpDQorICAgICAgICAgICAgY29udmVydCA9IChkZXN0IDwgaW5TaXplKTsNCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIGNvbnZlcnQgPSBUZXN0ODZNU0J5dGUobmV4dEJ5dGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSBpZiAoc3ViU3RyZWFtRW5kUG9zIC0gc3ViU3RyZWFtU3RhcnRQb3MgPiBrRGVmYXVsdExpbWl0KQ0KKyAgICAgICAgICBjb252ZXJ0ID0gVGVzdDg2TVNCeXRlKG5leHRCeXRlKTsNCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgVUludDY0IGRlc3Q2NCA9IChjdXJyZW50UG9zICsgNSkgKyBJbnQ2NChJbnQzMihzcmMpKTsNCisgICAgICAgICAgY29udmVydCA9IChkZXN0NjQgPj0gc3ViU3RyZWFtU3RhcnRQb3MgJiYgZGVzdDY0IDwgc3ViU3RyZWFtRW5kUG9zKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZWxzZSBpZiAoc2l6ZUlzRGVmaW5lZCkNCisgICAgICAgIGNvbnZlcnQgPSAoZGVzdCA8IGluU2l6ZSk7DQorICAgICAgZWxzZQ0KKyAgICAgICAgY29udmVydCA9IFRlc3Q4Nk1TQnl0ZShuZXh0Qnl0ZSk7DQorICAgICAgdW5zaWduZWQgaW5kZXggPSBHZXRJbmRleChwcmV2Qnl0ZSwgYik7DQorICAgICAgaWYgKGNvbnZlcnQpDQorICAgICAgew0KKyAgICAgICAgX3N0YXR1c0VuY29kZXJbaW5kZXhdLkVuY29kZSgmX3JjLCAxKTsNCisgICAgICAgIGJ1ZlBvcyArPSA1Ow0KKyAgICAgICAgQ091dEJ1ZmZlciAmcyA9IChiID09IDB4RTgpID8gX2NhbGxTdHJlYW0gOiBfanVtcFN0cmVhbTsNCisgICAgICAgIGZvciAoaW50IGkgPSAyNDsgaSA+PSAwOyBpIC09IDgpDQorICAgICAgICAgIHMuV3JpdGVCeXRlKChCeXRlKShkZXN0ID4+IGkpKTsNCisgICAgICAgIHByZXZCeXRlID0gbmV4dEJ5dGU7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBfc3RhdHVzRW5jb2RlcltpbmRleF0uRW5jb2RlKCZfcmMsIDApOw0KKyAgICAgICAgYnVmUG9zKys7DQorICAgICAgICBwcmV2Qnl0ZSA9IGI7DQorICAgICAgfQ0KKyAgICB9DQorICAgIG5vd1BvcyArPSBidWZQb3M7DQorICAgIG5vd1BvczY0ICs9IGJ1ZlBvczsNCisNCisgICAgaWYgKHByb2dyZXNzKQ0KKyAgICB7DQorICAgICAgLyoNCisgICAgICBjb25zdCBVSW50NjQgY29tcHJlc3NlZFNpemUgPQ0KKyAgICAgICAgX21haW5TdHJlYW0uR2V0UHJvY2Vzc2VkU2l6ZSgpICsNCisgICAgICAgIF9jYWxsU3RyZWFtLkdldFByb2Nlc3NlZFNpemUoKSArDQorICAgICAgICBfanVtcFN0cmVhbS5HZXRQcm9jZXNzZWRTaXplKCkgKw0KKyAgICAgICAgX3JjLkdldFByb2Nlc3NlZFNpemUoKTsNCisgICAgICAqLw0KKyAgICAgIFJJTk9LKHByb2dyZXNzLT5TZXRSYXRpb0luZm8oJm5vd1BvczY0LCBOVUxMKSk7DQorICAgIH0NCisgDQorICAgIFVJbnQzMiBpID0gMDsNCisgICAgd2hpbGUgKGJ1ZlBvcyA8IGVuZFBvcykNCisgICAgICBfYnVmW2krK10gPSBfYnVmW2J1ZlBvcysrXTsNCisgICAgYnVmUG9zID0gaTsNCisgIH0NCit9DQorDQorU1RETUVUSE9ESU1QIENFbmNvZGVyOjpDb2RlKElTZXF1ZW50aWFsSW5TdHJlYW0gKippblN0cmVhbXMsIGNvbnN0IFVJbnQ2NCAqKmluU2l6ZXMsIFVJbnQzMiBudW1JblN0cmVhbXMsDQorICAgIElTZXF1ZW50aWFsT3V0U3RyZWFtICoqb3V0U3RyZWFtcywgY29uc3QgVUludDY0ICoqb3V0U2l6ZXMsIFVJbnQzMiBudW1PdXRTdHJlYW1zLA0KKyAgICBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKQ0KK3sNCisgIHRyeQ0KKyAgew0KKyAgICByZXR1cm4gQ29kZVJlYWwoaW5TdHJlYW1zLCBpblNpemVzLCBudW1JblN0cmVhbXMsIG91dFN0cmVhbXMsIG91dFNpemVzLG51bU91dFN0cmVhbXMsIHByb2dyZXNzKTsNCisgIH0NCisgIGNhdGNoKGNvbnN0IENPdXRCdWZmZXJFeGNlcHRpb24gJmUpIHsgcmV0dXJuIGUuRXJyb3JDb2RlOyB9DQorICBjYXRjaCguLi4pIHsgcmV0dXJuIFNfRkFMU0U7IH0NCit9DQorDQorI2VuZGlmDQorDQorDQorU1RETUVUSE9ESU1QIENEZWNvZGVyOjpTZXRJbkJ1ZlNpemUoVUludDMyIHN0cmVhbUluZGV4LCBVSW50MzIgc2l6ZSkgeyBfaW5CdWZTaXplc1tzdHJlYW1JbmRleF0gPSBzaXplOyByZXR1cm4gU19PSzsgfQ0KK1NURE1FVEhPRElNUCBDRGVjb2Rlcjo6U2V0T3V0QnVmU2l6ZShVSW50MzIgLCBVSW50MzIgc2l6ZSkgeyBfb3V0QnVmU2l6ZSA9IHNpemU7IHJldHVybiBTX09LOyB9DQorDQorQ0RlY29kZXI6OkNEZWNvZGVyKCk6DQorICBfb3V0QnVmU2l6ZSgxIDw8IDE2KQ0KK3sNCisgIF9pbkJ1ZlNpemVzWzBdID0gMSA8PCAyMDsNCisgIF9pbkJ1ZlNpemVzWzFdID0gMSA8PCAyMDsNCisgIF9pbkJ1ZlNpemVzWzJdID0gMSA8PCAyMDsNCisgIF9pbkJ1ZlNpemVzWzNdID0gMSA8PCAyMDsNCit9DQorDQorSFJFU1VMVCBDRGVjb2Rlcjo6Q29kZVJlYWwoSVNlcXVlbnRpYWxJblN0cmVhbSAqKmluU3RyZWFtcywgY29uc3QgVUludDY0ICoqIC8qIGluU2l6ZXMgKi8sIFVJbnQzMiBudW1JblN0cmVhbXMsDQorICAgIElTZXF1ZW50aWFsT3V0U3RyZWFtICoqb3V0U3RyZWFtcywgY29uc3QgVUludDY0ICoqIC8qIG91dFNpemVzICovLCBVSW50MzIgbnVtT3V0U3RyZWFtcywNCisgICAgSUNvbXByZXNzUHJvZ3Jlc3NJbmZvICpwcm9ncmVzcykNCit7DQorICBpZiAobnVtSW5TdHJlYW1zICE9IDQgfHwgbnVtT3V0U3RyZWFtcyAhPSAxKQ0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKw0KKyAgaWYgKCFfbWFpblN0cmVhbS5DcmVhdGUoX2luQnVmU2l6ZXNbMF0pKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisgIGlmICghX2NhbGxTdHJlYW0uQ3JlYXRlKF9pbkJ1ZlNpemVzWzFdKSkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7DQorICBpZiAoIV9qdW1wU3RyZWFtLkNyZWF0ZShfaW5CdWZTaXplc1syXSkpIHJldHVybiBFX09VVE9GTUVNT1JZOw0KKyAgaWYgKCFfcmMuQ3JlYXRlKF9pbkJ1ZlNpemVzWzNdKSkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7DQorICBpZiAoIV9vdXRTdHJlYW0uQ3JlYXRlKF9vdXRCdWZTaXplKSkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7DQorDQorICBfbWFpblN0cmVhbS5TZXRTdHJlYW0oaW5TdHJlYW1zWzBdKTsNCisgIF9jYWxsU3RyZWFtLlNldFN0cmVhbShpblN0cmVhbXNbMV0pOw0KKyAgX2p1bXBTdHJlYW0uU2V0U3RyZWFtKGluU3RyZWFtc1syXSk7DQorICBfcmMuU2V0U3RyZWFtKGluU3RyZWFtc1szXSk7DQorICBfb3V0U3RyZWFtLlNldFN0cmVhbShvdXRTdHJlYW1zWzBdKTsNCisNCisgIF9tYWluU3RyZWFtLkluaXQoKTsNCisgIF9jYWxsU3RyZWFtLkluaXQoKTsNCisgIF9qdW1wU3RyZWFtLkluaXQoKTsNCisgIF9yYy5Jbml0KCk7DQorICBfb3V0U3RyZWFtLkluaXQoKTsNCisNCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAyNTYgKyAyOyBpKyspDQorICAgIF9zdGF0dXNEZWNvZGVyW2ldLkluaXQoKTsNCisNCisgIEJ5dGUgcHJldkJ5dGUgPSAwOw0KKyAgVUludDMyIHByb2Nlc3NlZEJ5dGVzID0gMDsNCisgIGZvciAoOzspDQorICB7DQorICAgIGlmIChwcm9jZXNzZWRCeXRlcyA+PSAoMSA8PCAyMCkgJiYgcHJvZ3Jlc3MpDQorICAgIHsNCisgICAgICAvKg0KKyAgICAgIGNvbnN0IFVJbnQ2NCBjb21wcmVzc2VkU2l6ZSA9DQorICAgICAgICBfbWFpblN0cmVhbS5HZXRQcm9jZXNzZWRTaXplKCkgKw0KKyAgICAgICAgX2NhbGxTdHJlYW0uR2V0UHJvY2Vzc2VkU2l6ZSgpICsNCisgICAgICAgIF9qdW1wU3RyZWFtLkdldFByb2Nlc3NlZFNpemUoKSArDQorICAgICAgICBfcmMuR2V0UHJvY2Vzc2VkU2l6ZSgpOw0KKyAgICAgICovDQorICAgICAgY29uc3QgVUludDY0IG5vd1BvczY0ID0gX291dFN0cmVhbS5HZXRQcm9jZXNzZWRTaXplKCk7DQorICAgICAgUklOT0socHJvZ3Jlc3MtPlNldFJhdGlvSW5mbyhOVUxMLCAmbm93UG9zNjQpKTsNCisgICAgICBwcm9jZXNzZWRCeXRlcyA9IDA7DQorICAgIH0NCisgICAgVUludDMyIGk7DQorICAgIEJ5dGUgYiA9IDA7DQorICAgIGNvbnN0IFVJbnQzMiBrQnVyc3RTaXplID0gKDEgPDwgMTgpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwga0J1cnN0U2l6ZTsgaSsrKQ0KKyAgICB7DQorICAgICAgaWYgKCFfbWFpblN0cmVhbS5SZWFkQnl0ZShiKSkNCisgICAgICAgIHJldHVybiBfb3V0U3RyZWFtLkZsdXNoKCk7DQorICAgICAgX291dFN0cmVhbS5Xcml0ZUJ5dGUoYik7DQorICAgICAgaWYgKElzSihwcmV2Qnl0ZSwgYikpDQorICAgICAgICBicmVhazsNCisgICAgICBwcmV2Qnl0ZSA9IGI7DQorICAgIH0NCisgICAgcHJvY2Vzc2VkQnl0ZXMgKz0gaTsNCisgICAgaWYgKGkgPT0ga0J1cnN0U2l6ZSkNCisgICAgICBjb250aW51ZTsNCisgICAgdW5zaWduZWQgaW5kZXggPSBHZXRJbmRleChwcmV2Qnl0ZSwgYik7DQorICAgIGlmIChfc3RhdHVzRGVjb2RlcltpbmRleF0uRGVjb2RlKCZfcmMpID09IDEpDQorICAgIHsNCisgICAgICBVSW50MzIgc3JjID0gMDsNCisgICAgICBDSW5CdWZmZXIgJnMgPSAoYiA9PSAweEU4KSA/IF9jYWxsU3RyZWFtIDogX2p1bXBTdHJlYW07DQorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDQ7IGkrKykNCisgICAgICB7DQorICAgICAgICBCeXRlIGIwOw0KKyAgICAgICAgaWYgKCFzLlJlYWRCeXRlKGIwKSkNCisgICAgICAgICAgcmV0dXJuIFNfRkFMU0U7DQorICAgICAgICBzcmMgPDw9IDg7DQorICAgICAgICBzcmMgfD0gKChVSW50MzIpYjApOw0KKyAgICAgIH0NCisgICAgICBVSW50MzIgZGVzdCA9IHNyYyAtIChVSW50MzIoX291dFN0cmVhbS5HZXRQcm9jZXNzZWRTaXplKCkpICsgNCkgOw0KKyAgICAgIF9vdXRTdHJlYW0uV3JpdGVCeXRlKChCeXRlKShkZXN0KSk7DQorICAgICAgX291dFN0cmVhbS5Xcml0ZUJ5dGUoKEJ5dGUpKGRlc3QgPj4gOCkpOw0KKyAgICAgIF9vdXRTdHJlYW0uV3JpdGVCeXRlKChCeXRlKShkZXN0ID4+IDE2KSk7DQorICAgICAgX291dFN0cmVhbS5Xcml0ZUJ5dGUoKEJ5dGUpKGRlc3QgPj4gMjQpKTsNCisgICAgICBwcmV2Qnl0ZSA9IChCeXRlKShkZXN0ID4+IDI0KTsNCisgICAgICBwcm9jZXNzZWRCeXRlcyArPSA0Ow0KKyAgICB9DQorICAgIGVsc2UNCisgICAgICBwcmV2Qnl0ZSA9IGI7DQorICB9DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRGVjb2Rlcjo6Q29kZShJU2VxdWVudGlhbEluU3RyZWFtICoqaW5TdHJlYW1zLCBjb25zdCBVSW50NjQgKippblNpemVzLCBVSW50MzIgbnVtSW5TdHJlYW1zLA0KKyAgICBJU2VxdWVudGlhbE91dFN0cmVhbSAqKm91dFN0cmVhbXMsIGNvbnN0IFVJbnQ2NCAqKm91dFNpemVzLCBVSW50MzIgbnVtT3V0U3RyZWFtcywNCisgICAgSUNvbXByZXNzUHJvZ3Jlc3NJbmZvICpwcm9ncmVzcykNCit7DQorICB0cnkNCisgIHsNCisgICAgcmV0dXJuIENvZGVSZWFsKGluU3RyZWFtcywgaW5TaXplcywgbnVtSW5TdHJlYW1zLCBvdXRTdHJlYW1zLCBvdXRTaXplcyxudW1PdXRTdHJlYW1zLCBwcm9ncmVzcyk7DQorICB9DQorICBjYXRjaChjb25zdCBDSW5CdWZmZXJFeGNlcHRpb24gJmUpIHsgcmV0dXJuIGUuRXJyb3JDb2RlOyB9DQorICBjYXRjaChjb25zdCBDT3V0QnVmZmVyRXhjZXB0aW9uICZlKSB7IHJldHVybiBlLkVycm9yQ29kZTsgfQ0KKyAgY2F0Y2goLi4uKSB7IHJldHVybiBTX0ZBTFNFOyB9DQorfQ0KKw0KK319DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9CY2oyQ29kZXIuaCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQmNqMkNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2OTk0ZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQmNqMkNvZGVyLmgKQEAgLTAsMCArMSw4MiBAQAorLy8gQmNqMkNvZGVyLmgNCisNCisjaWZuZGVmIF9fQ09NUFJFU1NfQkNKMl9DT0RFUl9IDQorI2RlZmluZSBfX0NPTVBSRVNTX0JDSjJfQ09ERVJfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlDb20uaCINCisNCisjaW5jbHVkZSAiLi4vSUNvZGVyLmgiDQorDQorI2luY2x1ZGUgIlJhbmdlQ29kZXJCaXQuaCINCisNCituYW1lc3BhY2UgTkNvbXByZXNzIHsNCituYW1lc3BhY2UgTkJjajIgew0KKw0KK2NvbnN0IHVuc2lnbmVkIGtOdW1Nb3ZlQml0cyA9IDU7DQorDQorI2lmbmRlZiBFWFRSQUNUX09OTFkNCisNCitjbGFzcyBDRW5jb2RlcjoNCisgIHB1YmxpYyBJQ29tcHJlc3NDb2RlcjIsDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIEJ5dGUgKl9idWY7DQorDQorICBDT3V0QnVmZmVyIF9tYWluU3RyZWFtOw0KKyAgQ091dEJ1ZmZlciBfY2FsbFN0cmVhbTsNCisgIENPdXRCdWZmZXIgX2p1bXBTdHJlYW07DQorICBOUmFuZ2VDb2Rlcjo6Q0VuY29kZXIgX3JjOw0KKyAgTlJhbmdlQ29kZXI6OkNCaXRFbmNvZGVyPGtOdW1Nb3ZlQml0cz4gX3N0YXR1c0VuY29kZXJbMjU2ICsgMl07DQorDQorICBIUkVTVUxUIEZsdXNoKCk7DQorDQorcHVibGljOg0KKyAgTVlfVU5LTk9XTl9JTVANCisNCisgIEhSRVNVTFQgQ29kZVJlYWwoSVNlcXVlbnRpYWxJblN0cmVhbSAqKmluU3RyZWFtcywgY29uc3QgVUludDY0ICoqaW5TaXplcywgVUludDMyIG51bUluU3RyZWFtcywNCisgICAgICBJU2VxdWVudGlhbE91dFN0cmVhbSAqKm91dFN0cmVhbXMsIGNvbnN0IFVJbnQ2NCAqKm91dFNpemVzLCBVSW50MzIgbnVtT3V0U3RyZWFtcywNCisgICAgICBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKTsNCisgIFNURE1FVEhPRChDb2RlKShJU2VxdWVudGlhbEluU3RyZWFtICoqaW5TdHJlYW1zLCBjb25zdCBVSW50NjQgKippblNpemVzLCBVSW50MzIgbnVtSW5TdHJlYW1zLA0KKyAgICAgIElTZXF1ZW50aWFsT3V0U3RyZWFtICoqb3V0U3RyZWFtcywgY29uc3QgVUludDY0ICoqb3V0U2l6ZXMsIFVJbnQzMiBudW1PdXRTdHJlYW1zLA0KKyAgICAgIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpOw0KKyAgDQorICBDRW5jb2RlcigpOiBfYnVmKDApIHt9Ow0KKyAgfkNFbmNvZGVyKCk7DQorfTsNCisNCisjZW5kaWYNCisNCitjbGFzcyBDRGVjb2RlcjoNCisgIHB1YmxpYyBJQ29tcHJlc3NDb2RlcjIsDQorICBwdWJsaWMgSUNvbXByZXNzU2V0QnVmU2l6ZSwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KKyAgQ0luQnVmZmVyIF9tYWluU3RyZWFtOw0KKyAgQ0luQnVmZmVyIF9jYWxsU3RyZWFtOw0KKyAgQ0luQnVmZmVyIF9qdW1wU3RyZWFtOw0KKyAgTlJhbmdlQ29kZXI6OkNEZWNvZGVyIF9yYzsNCisgIE5SYW5nZUNvZGVyOjpDQml0RGVjb2RlcjxrTnVtTW92ZUJpdHM+IF9zdGF0dXNEZWNvZGVyWzI1NiArIDJdOw0KKw0KKyAgQ091dEJ1ZmZlciBfb3V0U3RyZWFtOw0KKyAgVUludDMyIF9pbkJ1ZlNpemVzWzRdOw0KKyAgVUludDMyIF9vdXRCdWZTaXplOw0KKw0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QMShJQ29tcHJlc3NTZXRCdWZTaXplKTsNCisgIA0KKyAgSFJFU1VMVCBDb2RlUmVhbChJU2VxdWVudGlhbEluU3RyZWFtICoqaW5TdHJlYW1zLCBjb25zdCBVSW50NjQgKippblNpemVzLCBVSW50MzIgbnVtSW5TdHJlYW1zLA0KKyAgICAgIElTZXF1ZW50aWFsT3V0U3RyZWFtICoqb3V0U3RyZWFtcywgY29uc3QgVUludDY0ICoqb3V0U2l6ZXMsIFVJbnQzMiBudW1PdXRTdHJlYW1zLA0KKyAgICAgIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpOw0KKyAgU1RETUVUSE9EKENvZGUpKElTZXF1ZW50aWFsSW5TdHJlYW0gKippblN0cmVhbXMsIGNvbnN0IFVJbnQ2NCAqKmluU2l6ZXMsIFVJbnQzMiBudW1JblN0cmVhbXMsDQorICAgICAgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKipvdXRTdHJlYW1zLCBjb25zdCBVSW50NjQgKipvdXRTaXplcywgVUludDMyIG51bU91dFN0cmVhbXMsDQorICAgICAgSUNvbXByZXNzUHJvZ3Jlc3NJbmZvICpwcm9ncmVzcyk7DQorDQorICBTVERNRVRIT0QoU2V0SW5CdWZTaXplKShVSW50MzIgc3RyZWFtSW5kZXgsIFVJbnQzMiBzaXplKTsNCisgIFNURE1FVEhPRChTZXRPdXRCdWZTaXplKShVSW50MzIgc3RyZWFtSW5kZXgsIFVJbnQzMiBzaXplKTsNCisNCisgIENEZWNvZGVyKCk7DQorfTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQmNqMlJlZ2lzdGVyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQmNqMlJlZ2lzdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDYzZjNmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9CY2oyUmVnaXN0ZXIuY3BwCkBAIC0wLDAgKzEsMTkgQEAKKy8vIEJjajJSZWdpc3Rlci5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9SZWdpc3RlckNvZGVjLmgiDQorDQorI2luY2x1ZGUgIkJjajJDb2Rlci5oIg0KKw0KK3N0YXRpYyB2b2lkICpDcmVhdGVDb2RlYygpIHsgcmV0dXJuICh2b2lkICopKElDb21wcmVzc0NvZGVyMiAqKShuZXcgTkNvbXByZXNzOjpOQmNqMjo6Q0RlY29kZXIoKSk7IH0NCisjaWZuZGVmIEVYVFJBQ1RfT05MWQ0KK3N0YXRpYyB2b2lkICpDcmVhdGVDb2RlY091dCgpIHsgcmV0dXJuICh2b2lkICopKElDb21wcmVzc0NvZGVyMiAqKShuZXcgTkNvbXByZXNzOjpOQmNqMjo6Q0VuY29kZXIoKSk7ICB9DQorI2Vsc2UNCisjZGVmaW5lIENyZWF0ZUNvZGVjT3V0IDANCisjZW5kaWYNCisNCitzdGF0aWMgQ0NvZGVjSW5mbyBnX0NvZGVjSW5mbyA9DQorICB7IENyZWF0ZUNvZGVjLCBDcmVhdGVDb2RlY091dCwgMHgwMzAzMDExQiwgTCJCQ0oyIiwgNCwgZmFsc2UgfTsNCisNCitSRUdJU1RFUl9DT0RFQyhCQ0oyKQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQmNqQ29kZXIuY3BwIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9CY2pDb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4YzU3MwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQmNqQ29kZXIuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKy8vIEJjakNvZGVyLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiQmNqQ29kZXIuaCINCisNCitVSW50MzIgQ0JDSl94ODZfRW5jb2Rlcjo6U3ViRmlsdGVyKEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKQ0KK3sNCisgIHJldHVybiAoVUludDMyKTo6eDg2X0NvbnZlcnQoZGF0YSwgc2l6ZSwgX2J1ZmZlclBvcywgJl9wcmV2TWFzaywgMSk7DQorfQ0KKw0KK1VJbnQzMiBDQkNKX3g4Nl9EZWNvZGVyOjpTdWJGaWx0ZXIoQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpDQorew0KKyAgcmV0dXJuIChVSW50MzIpOjp4ODZfQ29udmVydChkYXRhLCBzaXplLCBfYnVmZmVyUG9zLCAmX3ByZXZNYXNrLCAwKTsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9CY2pDb2Rlci5oIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9CY2pDb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NmQ1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0JjakNvZGVyLmgKQEAgLTAsMCArMSwxOSBAQAorLy8gQmNqQ29kZXIuaA0KKw0KKyNpZm5kZWYgX19DT01QUkVTU19CQ0pfQ09ERVJfSA0KKyNkZWZpbmUgX19DT01QUkVTU19CQ0pfQ09ERVJfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0JyYS5oIg0KKw0KKyNpbmNsdWRlICJCcmFuY2hDb2Rlci5oIg0KKw0KK3N0cnVjdCBDQnJhbmNoODYNCit7DQorICBVSW50MzIgX3ByZXZNYXNrOw0KKyAgdm9pZCB4ODZJbml0KCkgeyB4ODZfQ29udmVydF9Jbml0KF9wcmV2TWFzayk7IH0NCit9Ow0KKw0KK015Q2xhc3NCKEJDSl94ODYsIDB4MDEsIDMsIENCcmFuY2g4NiAsDQorICAgIHZpcnR1YWwgdm9pZCBTdWJJbml0KCkgeyB4ODZJbml0KCk7IH0pDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9CY2pSZWdpc3Rlci5jcHAgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0JjalJlZ2lzdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWU1M2M2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9CY2pSZWdpc3Rlci5jcHAKQEAgLTAsMCArMSwxOSBAQAorLy8gQmNqUmVnaXN0ZXIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vUmVnaXN0ZXJDb2RlYy5oIg0KKw0KKyNpbmNsdWRlICJCY2pDb2Rlci5oIg0KKw0KK3N0YXRpYyB2b2lkICpDcmVhdGVDb2RlYygpIHsgcmV0dXJuICh2b2lkICopKElDb21wcmVzc0ZpbHRlciAqKShuZXcgQ0JDSl94ODZfRGVjb2RlcigpKTsgfQ0KKyNpZm5kZWYgRVhUUkFDVF9PTkxZDQorc3RhdGljIHZvaWQgKkNyZWF0ZUNvZGVjT3V0KCkgeyByZXR1cm4gKHZvaWQgKikoSUNvbXByZXNzRmlsdGVyICopKG5ldyBDQkNKX3g4Nl9FbmNvZGVyKCkpOyAgfQ0KKyNlbHNlDQorI2RlZmluZSBDcmVhdGVDb2RlY091dCAwDQorI2VuZGlmDQorDQorc3RhdGljIENDb2RlY0luZm8gZ19Db2RlY0luZm8gPQ0KKyAgeyBDcmVhdGVDb2RlYywgQ3JlYXRlQ29kZWNPdXQsIDB4MDMwMzAxMDMsIEwiQkNKIiwgMSwgdHJ1ZSB9Ow0KKw0KK1JFR0lTVEVSX0NPREVDKEJDSikNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbXByZXNzL0JyYW5jaENvZGVyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQnJhbmNoQ29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYWNjNjYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0JyYW5jaENvZGVyLmNwcApAQCAtMCwwICsxLDE5IEBACisvLyBCcmFuY2hDb2Rlci5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIkJyYW5jaENvZGVyLmgiDQorDQorU1RETUVUSE9ESU1QIENCcmFuY2hDb252ZXJ0ZXI6OkluaXQoKQ0KK3sNCisgIF9idWZmZXJQb3MgPSAwOw0KKyAgU3ViSW5pdCgpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUF8oVUludDMyKSBDQnJhbmNoQ29udmVydGVyOjpGaWx0ZXIoQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpDQorew0KKyAgVUludDMyIHByb2Nlc3NlZFNpemUgPSBTdWJGaWx0ZXIoZGF0YSwgc2l6ZSk7DQorICBfYnVmZmVyUG9zICs9IHByb2Nlc3NlZFNpemU7DQorICByZXR1cm4gcHJvY2Vzc2VkU2l6ZTsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9CcmFuY2hDb2Rlci5oIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9CcmFuY2hDb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzI4NmEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0JyYW5jaENvZGVyLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gQnJhbmNoQ29kZXIuaA0KKw0KKyNpZm5kZWYgX19DT01QUkVTU19CUkFOQ0hfQ09ERVJfSA0KKyNkZWZpbmUgX19DT01QUkVTU19CUkFOQ0hfQ09ERVJfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlDb20uaCINCisNCisjaW5jbHVkZSAiLi4vSUNvZGVyLmgiDQorDQorY2xhc3MgQ0JyYW5jaENvbnZlcnRlcjoNCisgIHB1YmxpYyBJQ29tcHJlc3NGaWx0ZXIsDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCitwcm90ZWN0ZWQ6DQorICBVSW50MzIgX2J1ZmZlclBvczsNCisgIHZpcnR1YWwgdm9pZCBTdWJJbml0KCkge30NCisgIHZpcnR1YWwgVUludDMyIFN1YkZpbHRlcihCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSkgPSAwOw0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QOw0KKyAgU1RETUVUSE9EKEluaXQpKCk7DQorICBTVERNRVRIT0RfKFVJbnQzMiwgRmlsdGVyKShCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSk7DQorfTsNCisNCisjZGVmaW5lIE15Q2xhc3NFbmNvZGVyQShOYW1lKSBjbGFzcyBDICMjIE5hbWU6IHB1YmxpYyBDQnJhbmNoQ29udmVydGVyIFwNCisgIHsgcHVibGljOiBVSW50MzIgU3ViRmlsdGVyKEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsgfTsNCisNCisjZGVmaW5lIE15Q2xhc3NEZWNvZGVyQShOYW1lKSBjbGFzcyBDICMjIE5hbWU6IHB1YmxpYyBDQnJhbmNoQ29udmVydGVyIFwNCisgIHsgcHVibGljOiBVSW50MzIgU3ViRmlsdGVyKEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsgfTsNCisNCisjZGVmaW5lIE15Q2xhc3NFbmNvZGVyQihOYW1lLCBBRERfSVRFTVMsIEFERF9JTklUKSBjbGFzcyBDICMjIE5hbWU6IHB1YmxpYyBDQnJhbmNoQ29udmVydGVyLCBwdWJsaWMgQUREX0lURU1TIFwNCisgIHsgcHVibGljOiBVSW50MzIgU3ViRmlsdGVyKEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsgQUREX0lOSVR9Ow0KKw0KKyNkZWZpbmUgTXlDbGFzc0RlY29kZXJCKE5hbWUsIEFERF9JVEVNUywgQUREX0lOSVQpIGNsYXNzIEMgIyMgTmFtZTogcHVibGljIENCcmFuY2hDb252ZXJ0ZXIsIHB1YmxpYyBBRERfSVRFTVMgXA0KKyAgeyBwdWJsaWM6IFVJbnQzMiBTdWJGaWx0ZXIoQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpOyBBRERfSU5JVH07DQorDQorI2RlZmluZSBNeUNsYXNzQShOYW1lLCBpZCwgc3ViSWQpICBcDQorTXlDbGFzc0VuY29kZXJBKE5hbWUgIyMgX0VuY29kZXIpIFwNCitNeUNsYXNzRGVjb2RlckEoTmFtZSAjIyBfRGVjb2RlcikNCisNCisjZGVmaW5lIE15Q2xhc3NCKE5hbWUsIGlkLCBzdWJJZCwgQUREX0lURU1TLCBBRERfSU5JVCkgIFwNCitNeUNsYXNzRW5jb2RlckIoTmFtZSAjIyBfRW5jb2RlciwgQUREX0lURU1TLCBBRERfSU5JVCkgXA0KK015Q2xhc3NEZWNvZGVyQihOYW1lICMjIF9EZWNvZGVyLCBBRERfSVRFTVMsIEFERF9JTklUKQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQnJhbmNoTWlzYy5jcHAgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0JyYW5jaE1pc2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYzc5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0JyYW5jaE1pc2MuY3BwCkBAIC0wLDAgKzEsMjEgQEAKKy8vIEJyYW5jaE1pc2MuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0JyYS5oIg0KKw0KKyNpbmNsdWRlICJCcmFuY2hNaXNjLmgiDQorDQorI2RlZmluZSBTVUJfRklMVEVSX0lNUDIobmFtZSwgY29kZXJTdHIsIGNvZGVyTnVtKSBcDQorICBVSW50MzIgQ0JDXyAjIyBuYW1lICMjIGNvZGVyU3RyOjpTdWJGaWx0ZXIoQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpIFwNCisgIHsgcmV0dXJuIChVSW50MzIpOjpuYW1lICMjIENvbnZlcnQoZGF0YSwgc2l6ZSwgX2J1ZmZlclBvcywgY29kZXJOdW0pOyB9DQorDQorI2RlZmluZSBTVUJfRklMVEVSX0lNUChuYW1lKSBcDQorICBTVUJfRklMVEVSX0lNUDIobmFtZSwgRW5jb2RlciwgMSkgXA0KKyAgU1VCX0ZJTFRFUl9JTVAyKG5hbWUsIERlY29kZXIsIDApIFwNCisNCitTVUJfRklMVEVSX0lNUChBUk1fKQ0KK1NVQl9GSUxURVJfSU1QKEFSTVRfKQ0KK1NVQl9GSUxURVJfSU1QKFBQQ18pDQorU1VCX0ZJTFRFUl9JTVAoU1BBUkNfKQ0KK1NVQl9GSUxURVJfSU1QKElBNjRfKQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQnJhbmNoTWlzYy5oIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9CcmFuY2hNaXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzZTkyMwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQnJhbmNoTWlzYy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8vIEJyYW5jaE1pc2MuaA0KKw0KKyNpZm5kZWYgX19DT01QUkVTU19CUkFOQ0hfTUlTQ19IDQorI2RlZmluZSBfX0NPTVBSRVNTX0JSQU5DSF9NSVNDX0gNCisNCisjaW5jbHVkZSAiQnJhbmNoQ29kZXIuaCINCisNCitNeUNsYXNzQShCQ19BUk0sICAgMHgwNSwgMSkNCitNeUNsYXNzQShCQ19BUk1ULCAgMHgwNywgMSkNCitNeUNsYXNzQShCQ19QUEMsICAgMHgwMiwgNSkNCitNeUNsYXNzQShCQ19TUEFSQywgMHgwOCwgNSkNCitNeUNsYXNzQShCQ19JQTY0LCAgMHgwNCwgMSkNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbXByZXNzL0JyYW5jaFJlZ2lzdGVyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQnJhbmNoUmVnaXN0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNTVkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0JyYW5jaFJlZ2lzdGVyLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBCcmFuY2hSZWdpc3Rlci5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9SZWdpc3RlckNvZGVjLmgiDQorDQorI2luY2x1ZGUgIkJyYW5jaE1pc2MuaCINCisNCisjZGVmaW5lIENSRUFURV9DT0RFQyh4KSBcDQorICBzdGF0aWMgdm9pZCAqQ3JlYXRlQ29kZWMgIyMgeCgpIHsgcmV0dXJuICh2b2lkICopKElDb21wcmVzc0ZpbHRlciAqKShuZXcgQyAjIyB4ICMjIF9EZWNvZGVyKTsgfSBcDQorICBzdGF0aWMgdm9pZCAqQ3JlYXRlQ29kZWMgIyMgeCAjIyBPdXQoKSB7IHJldHVybiAodm9pZCAqKShJQ29tcHJlc3NGaWx0ZXIgKikobmV3IEMgIyMgeCAjIyBfRW5jb2Rlcik7IH0NCisNCitDUkVBVEVfQ09ERUMoQkNfUFBDKQ0KK0NSRUFURV9DT0RFQyhCQ19JQTY0KQ0KK0NSRUFURV9DT0RFQyhCQ19BUk0pDQorQ1JFQVRFX0NPREVDKEJDX0FSTVQpDQorQ1JFQVRFX0NPREVDKEJDX1NQQVJDKQ0KKw0KKyNkZWZpbmUgTUVUSE9EX0lURU0oeCwgaWQxLCBpZDIsIG5hbWUpIHsgQ3JlYXRlQ29kZWMgIyMgeCwgQ3JlYXRlQ29kZWMgIyMgeCAjIyBPdXQsIDB4MDMwMzAwMDAgKyAoaWQxICogMjU2KSArIGlkMiwgbmFtZSwgMSwgdHJ1ZSAgfQ0KKw0KK3N0YXRpYyBDQ29kZWNJbmZvIGdfQ29kZWNzSW5mb1tdID0NCit7DQorICBNRVRIT0RfSVRFTShCQ19QUEMsICAgMHgwMiwgMHgwNSwgTCJQUEMiKSwNCisgIE1FVEhPRF9JVEVNKEJDX0lBNjQsICAweDA0LCAxLCBMIklBNjQiKSwNCisgIE1FVEhPRF9JVEVNKEJDX0FSTSwgICAweDA1LCAxLCBMIkFSTSIpLA0KKyAgTUVUSE9EX0lURU0oQkNfQVJNVCwgIDB4MDcsIDEsIEwiQVJNVCIpLA0KKyAgTUVUSE9EX0lURU0oQkNfU1BBUkMsIDB4MDgsIDB4MDUsIEwiU1BBUkMiKQ0KK307DQorDQorUkVHSVNURVJfQ09ERUNTKEJyYW5jaCkNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbXByZXNzL0J5dGVTd2FwLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQnl0ZVN3YXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDI4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0J5dGVTd2FwLmNwcApAQCAtMCwwICsxLDczIEBACisvLyBCeXRlU3dhcC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKw0KKyNpbmNsdWRlICIuLi9JQ29kZXIuaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL1JlZ2lzdGVyQ29kZWMuaCINCisNCitjbGFzcyBDQnl0ZVN3YXAyOg0KKyAgcHVibGljIElDb21wcmVzc0ZpbHRlciwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QDQorICBTVERNRVRIT0QoSW5pdCkoKTsNCisgIFNURE1FVEhPRF8oVUludDMyLCBGaWx0ZXIpKEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsNCit9Ow0KKw0KK2NsYXNzIENCeXRlU3dhcDQ6DQorICBwdWJsaWMgSUNvbXByZXNzRmlsdGVyLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorcHVibGljOg0KKyAgTVlfVU5LTk9XTl9JTVANCisgIFNURE1FVEhPRChJbml0KSgpOw0KKyAgU1RETUVUSE9EXyhVSW50MzIsIEZpbHRlcikoQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpOw0KK307DQorDQorU1RETUVUSE9ESU1QIENCeXRlU3dhcDI6OkluaXQoKSB7IHJldHVybiBTX09LOyB9DQorDQorU1RETUVUSE9ESU1QXyhVSW50MzIpIENCeXRlU3dhcDI6OkZpbHRlcihCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSkNCit7DQorICBjb25zdCBVSW50MzIga1N0ZXAgPSAyOw0KKyAgVUludDMyIGk7DQorICBmb3IgKGkgPSAwOyBpICsga1N0ZXAgPD0gc2l6ZTsgaSArPSBrU3RlcCkNCisgIHsNCisgICAgQnl0ZSBiID0gZGF0YVtpXTsNCisgICAgZGF0YVtpXSA9IGRhdGFbaSArIDFdOw0KKyAgICBkYXRhW2kgKyAxXSA9IGI7DQorICB9DQorICByZXR1cm4gaTsNCit9DQorDQorU1RETUVUSE9ESU1QIENCeXRlU3dhcDQ6OkluaXQoKSB7IHJldHVybiBTX09LOyB9DQorDQorU1RETUVUSE9ESU1QXyhVSW50MzIpIENCeXRlU3dhcDQ6OkZpbHRlcihCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSkNCit7DQorICBjb25zdCBVSW50MzIga1N0ZXAgPSA0Ow0KKyAgVUludDMyIGk7DQorICBmb3IgKGkgPSAwOyBpICsga1N0ZXAgPD0gc2l6ZTsgaSArPSBrU3RlcCkNCisgIHsNCisgICAgQnl0ZSBiMCA9IGRhdGFbaV07DQorICAgIEJ5dGUgYjEgPSBkYXRhW2kgKyAxXTsNCisgICAgZGF0YVtpXSA9IGRhdGFbaSArIDNdOw0KKyAgICBkYXRhW2kgKyAxXSA9IGRhdGFbaSArIDJdOw0KKyAgICBkYXRhW2kgKyAyXSA9IGIxOw0KKyAgICBkYXRhW2kgKyAzXSA9IGIwOw0KKyAgfQ0KKyAgcmV0dXJuIGk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkICpDcmVhdGVDb2RlYzIoKSB7IHJldHVybiAodm9pZCAqKShJQ29tcHJlc3NGaWx0ZXIgKikobmV3IENCeXRlU3dhcDIpOyB9DQorc3RhdGljIHZvaWQgKkNyZWF0ZUNvZGVjNCgpIHsgcmV0dXJuICh2b2lkICopKElDb21wcmVzc0ZpbHRlciAqKShuZXcgQ0J5dGVTd2FwNCk7IH0NCisNCitzdGF0aWMgQ0NvZGVjSW5mbyBnX0NvZGVjc0luZm9bXSA9DQorew0KKyAgeyBDcmVhdGVDb2RlYzIsIENyZWF0ZUNvZGVjMiwgMHgwMjAzMDIsIEwiU3dhcDIiLCAxLCB0cnVlIH0sDQorICB7IENyZWF0ZUNvZGVjNCwgQ3JlYXRlQ29kZWM0LCAweDAyMDMwNCwgTCJTd2FwNCIsIDEsIHRydWUgfQ0KK307DQorDQorUkVHSVNURVJfQ09ERUNTKEJ5dGVTd2FwKQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQ29kZWNFeHBvcnRzLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQ29kZWNFeHBvcnRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjkxZDVkCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Db2RlY0V4cG9ydHMuY3BwCkBAIC0wLDAgKzEsMjgzIEBACisvLyBDb2RlY0V4cG9ydHMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0NwdUFyY2guaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0NvbVRyeS5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlDb20uaCINCisNCisjaW5jbHVkZSAiLi4vLi4vV2luZG93cy9Qcm9wVmFyaWFudC5oIg0KKw0KKyNpbmNsdWRlICIuLi9JQ29kZXIuaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL1JlZ2lzdGVyQ29kZWMuaCINCisNCitleHRlcm4gdW5zaWduZWQgaW50IGdfTnVtQ29kZWNzOw0KK2V4dGVybiBjb25zdCBDQ29kZWNJbmZvICpnX0NvZGVjc1tdOw0KKw0KK2V4dGVybiB1bnNpZ25lZCBpbnQgZ19OdW1IYXNoZXJzOw0KK2V4dGVybiBjb25zdCBDSGFzaGVySW5mbyAqZ19IYXNoZXJzW107DQorDQorc3RhdGljIGNvbnN0IFVJbnQxNiBrRGVjb2RlSWQgPSAweDI3OTA7DQorc3RhdGljIGNvbnN0IFVJbnQxNiBrRW5jb2RlSWQgPSAweDI3OTE7DQorc3RhdGljIGNvbnN0IFVJbnQxNiBrSGFzaGVySWQgPSAweDI3OTI7DQorDQorREVGSU5FX0dVSUQoQ0xTSURfQ0NvZGVjLA0KKzB4MjMxNzBGNjksIDB4NDBDMSwga0RlY29kZUlkLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsNCisNCitzdGF0aWMgaW5saW5lIEhSRVNVTFQgU2V0UHJvcFN0cmluZyhjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgc2l6ZSwgUFJPUFZBUklBTlQgKnZhbHVlKQ0KK3sNCisgIGlmICgodmFsdWUtPmJzdHJWYWwgPSA6OlN5c0FsbG9jU3RyaW5nQnl0ZUxlbihzLCBzaXplKSkgIT0gMCkNCisgICAgdmFsdWUtPnZ0ID0gVlRfQlNUUjsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitzdGF0aWMgaW5saW5lIEhSRVNVTFQgU2V0UHJvcEdVSUQoY29uc3QgR1VJRCAmZ3VpZCwgUFJPUFZBUklBTlQgKnZhbHVlKQ0KK3sNCisgIHJldHVybiBTZXRQcm9wU3RyaW5nKChjb25zdCBjaGFyICopJmd1aWQsIHNpemVvZihHVUlEKSwgdmFsdWUpOw0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBTZXRDbGFzc0lEKENNZXRob2RJZCBpZCwgVUludDE2IHR5cGVJZCwgUFJPUFZBUklBTlQgKnZhbHVlKQ0KK3sNCisgIEdVSUQgY2xzSWQ7DQorICBjbHNJZC5EYXRhMSA9IENMU0lEX0NDb2RlYy5EYXRhMTsNCisgIGNsc0lkLkRhdGEyID0gQ0xTSURfQ0NvZGVjLkRhdGEyOw0KKyAgY2xzSWQuRGF0YTMgPSB0eXBlSWQ7DQorICBTZXRVaTY0KGNsc0lkLkRhdGE0LCBpZCk7DQorICByZXR1cm4gU2V0UHJvcEdVSUQoY2xzSWQsIHZhbHVlKTsNCit9DQorDQorc3RhdGljIEhSRVNVTFQgRmluZENvZGVjQ2xhc3NJZChjb25zdCBHVUlEICpjbHNJRCwgVUludDMyIGlzQ29kZXIyLCBib29sIGlzRmlsdGVyLCBib29sICZlbmNvZGUsIGludCAmaW5kZXgpDQorew0KKyAgaW5kZXggPSAtMTsNCisgIGlmIChjbHNJRC0+RGF0YTEgIT0gQ0xTSURfQ0NvZGVjLkRhdGExIHx8DQorICAgICAgY2xzSUQtPkRhdGEyICE9IENMU0lEX0NDb2RlYy5EYXRhMikNCisgICAgcmV0dXJuIFNfT0s7DQorICBlbmNvZGUgPSB0cnVlOw0KKyAgaWYgKGNsc0lELT5EYXRhMyA9PSBrRGVjb2RlSWQpDQorICAgIGVuY29kZSA9IGZhbHNlOw0KKyAgZWxzZSBpZiAoY2xzSUQtPkRhdGEzICE9IGtFbmNvZGVJZCkNCisgICAgcmV0dXJuIFNfT0s7DQorICBVSW50NjQgaWQgPSBHZXRVaTY0KGNsc0lELT5EYXRhNCk7DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZ19OdW1Db2RlY3M7IGkrKykNCisgIHsNCisgICAgY29uc3QgQ0NvZGVjSW5mbyAmY29kZWMgPSAqZ19Db2RlY3NbaV07DQorICAgIGlmIChpZCAhPSBjb2RlYy5JZCB8fCBlbmNvZGUgJiYgIWNvZGVjLkNyZWF0ZUVuY29kZXIgfHwgIWVuY29kZSAmJiAhY29kZWMuQ3JlYXRlRGVjb2RlcikNCisgICAgICBjb250aW51ZTsNCisgICAgaWYgKCFpc0ZpbHRlciAmJiBjb2RlYy5Jc0ZpbHRlciB8fCBpc0ZpbHRlciAmJiAhY29kZWMuSXNGaWx0ZXIgfHwNCisgICAgICAgIGNvZGVjLk51bUluU3RyZWFtcyAhPSAxICYmICFpc0NvZGVyMiB8fCBjb2RlYy5OdW1JblN0cmVhbXMgPT0gMSAmJiBpc0NvZGVyMikNCisgICAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsNCisgICAgaW5kZXggPSBpOw0KKyAgICByZXR1cm4gU19PSzsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERBUEkgQ3JlYXRlQ29kZXIyKGJvb2wgZW5jb2RlLCBpbnQgaW5kZXgsIGNvbnN0IEdVSUQgKmlpZCwgdm9pZCAqKm91dE9iamVjdCkNCit7DQorICBDT01fVFJZX0JFR0lODQorICAqb3V0T2JqZWN0ID0gMDsNCisgIGJvb2wgaXNDb2RlciA9ICgqaWlkID09IElJRF9JQ29tcHJlc3NDb2RlcikgIT0gMDsNCisgIGJvb2wgaXNDb2RlcjIgPSAoKmlpZCA9PSBJSURfSUNvbXByZXNzQ29kZXIyKSAhPSAwOw0KKyAgYm9vbCBpc0ZpbHRlciA9ICgqaWlkID09IElJRF9JQ29tcHJlc3NGaWx0ZXIpICE9IDA7DQorICBjb25zdCBDQ29kZWNJbmZvICZjb2RlYyA9ICpnX0NvZGVjc1tpbmRleF07DQorICBpZiAoIWlzRmlsdGVyICYmIGNvZGVjLklzRmlsdGVyIHx8IGlzRmlsdGVyICYmICFjb2RlYy5Jc0ZpbHRlciB8fA0KKyAgICAgIGNvZGVjLk51bUluU3RyZWFtcyAhPSAxICYmICFpc0NvZGVyMiB8fCBjb2RlYy5OdW1JblN0cmVhbXMgPT0gMSAmJiBpc0NvZGVyMikNCisgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7DQorICBpZiAoZW5jb2RlKQ0KKyAgew0KKyAgICBpZiAoIWNvZGVjLkNyZWF0ZUVuY29kZXIpDQorICAgICAgcmV0dXJuIENMQVNTX0VfQ0xBU1NOT1RBVkFJTEFCTEU7DQorICAgICpvdXRPYmplY3QgPSBjb2RlYy5DcmVhdGVFbmNvZGVyKCk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIGlmICghY29kZWMuQ3JlYXRlRGVjb2RlcikNCisgICAgICByZXR1cm4gQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRTsNCisgICAgKm91dE9iamVjdCA9IGNvZGVjLkNyZWF0ZURlY29kZXIoKTsNCisgIH0NCisgIGlmICgqb3V0T2JqZWN0KQ0KKyAgew0KKyAgICBpZiAoaXNDb2RlcikNCisgICAgICAoKElDb21wcmVzc0NvZGVyICopKm91dE9iamVjdCktPkFkZFJlZigpOw0KKyAgICBlbHNlIGlmIChpc0NvZGVyMikNCisgICAgICAoKElDb21wcmVzc0NvZGVyMiAqKSpvdXRPYmplY3QpLT5BZGRSZWYoKTsNCisgICAgZWxzZQ0KKyAgICAgICgoSUNvbXByZXNzRmlsdGVyICopKm91dE9iamVjdCktPkFkZFJlZigpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorICBDT01fVFJZX0VORA0KK30NCisNCitTVERBUEkgQ3JlYXRlQ29kZXIoY29uc3QgR1VJRCAqY2xzaWQsIGNvbnN0IEdVSUQgKmlpZCwgdm9pZCAqKm91dE9iamVjdCkNCit7DQorICBDT01fVFJZX0JFR0lODQorICAqb3V0T2JqZWN0ID0gMDsNCisgIGJvb2wgaXNDb2RlciA9ICgqaWlkID09IElJRF9JQ29tcHJlc3NDb2RlcikgIT0gMDsNCisgIGJvb2wgaXNDb2RlcjIgPSAoKmlpZCA9PSBJSURfSUNvbXByZXNzQ29kZXIyKSAhPSAwOw0KKyAgYm9vbCBpc0ZpbHRlciA9ICgqaWlkID09IElJRF9JQ29tcHJlc3NGaWx0ZXIpICE9IDA7DQorICBpZiAoIWlzQ29kZXIgJiYgIWlzQ29kZXIyICYmICFpc0ZpbHRlcikNCisgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7DQorICBib29sIGVuY29kZTsNCisgIGludCBjb2RlY0luZGV4Ow0KKyAgSFJFU1VMVCByZXMgPSBGaW5kQ29kZWNDbGFzc0lkKGNsc2lkLCBpc0NvZGVyMiwgaXNGaWx0ZXIsIGVuY29kZSwgY29kZWNJbmRleCk7DQorICBpZiAocmVzICE9IFNfT0spDQorICAgIHJldHVybiByZXM7DQorICBpZiAoY29kZWNJbmRleCA8IDApDQorICAgIHJldHVybiBDTEFTU19FX0NMQVNTTk9UQVZBSUxBQkxFOw0KKw0KKyAgY29uc3QgQ0NvZGVjSW5mbyAmY29kZWMgPSAqZ19Db2RlY3NbY29kZWNJbmRleF07DQorICBpZiAoZW5jb2RlKQ0KKyAgICAqb3V0T2JqZWN0ID0gY29kZWMuQ3JlYXRlRW5jb2RlcigpOw0KKyAgZWxzZQ0KKyAgICAqb3V0T2JqZWN0ID0gY29kZWMuQ3JlYXRlRGVjb2RlcigpOw0KKyAgaWYgKCpvdXRPYmplY3QpDQorICB7DQorICAgIGlmIChpc0NvZGVyKQ0KKyAgICAgICgoSUNvbXByZXNzQ29kZXIgKikqb3V0T2JqZWN0KS0+QWRkUmVmKCk7DQorICAgIGVsc2UgaWYgKGlzQ29kZXIyKQ0KKyAgICAgICgoSUNvbXByZXNzQ29kZXIyICopKm91dE9iamVjdCktPkFkZFJlZigpOw0KKyAgICBlbHNlDQorICAgICAgKChJQ29tcHJlc3NGaWx0ZXIgKikqb3V0T2JqZWN0KS0+QWRkUmVmKCk7DQorICB9DQorICByZXR1cm4gU19PSzsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KK1NUREFQSSBHZXRNZXRob2RQcm9wZXJ0eShVSW50MzIgY29kZWNJbmRleCwgUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKQ0KK3sNCisgIDo6VmFyaWFudENsZWFyKChWQVJJQU5UQVJHICopdmFsdWUpOw0KKyAgY29uc3QgQ0NvZGVjSW5mbyAmY29kZWMgPSAqZ19Db2RlY3NbY29kZWNJbmRleF07DQorICBzd2l0Y2ggKHByb3BJRCkNCisgIHsNCisgICAgY2FzZSBOTWV0aG9kUHJvcElEOjprSUQ6DQorICAgICAgdmFsdWUtPnVoVmFsLlF1YWRQYXJ0ID0gKFVJbnQ2NCljb2RlYy5JZDsNCisgICAgICB2YWx1ZS0+dnQgPSBWVF9VSTg7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgTk1ldGhvZFByb3BJRDo6a05hbWU6DQorICAgICAgaWYgKCh2YWx1ZS0+YnN0clZhbCA9IDo6U3lzQWxsb2NTdHJpbmcoY29kZWMuTmFtZSkpICE9IDApDQorICAgICAgICB2YWx1ZS0+dnQgPSBWVF9CU1RSOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIE5NZXRob2RQcm9wSUQ6OmtEZWNvZGVyOg0KKyAgICAgIGlmIChjb2RlYy5DcmVhdGVEZWNvZGVyKQ0KKyAgICAgICAgcmV0dXJuIFNldENsYXNzSUQoY29kZWMuSWQsIGtEZWNvZGVJZCwgdmFsdWUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIE5NZXRob2RQcm9wSUQ6OmtFbmNvZGVyOg0KKyAgICAgIGlmIChjb2RlYy5DcmVhdGVFbmNvZGVyKQ0KKyAgICAgICAgcmV0dXJuIFNldENsYXNzSUQoY29kZWMuSWQsIGtFbmNvZGVJZCwgdmFsdWUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIE5NZXRob2RQcm9wSUQ6OmtJblN0cmVhbXM6DQorICAgICAgaWYgKGNvZGVjLk51bUluU3RyZWFtcyAhPSAxKQ0KKyAgICAgIHsNCisgICAgICAgIHZhbHVlLT52dCA9IFZUX1VJNDsNCisgICAgICAgIHZhbHVlLT51bFZhbCA9IChVTE9ORyljb2RlYy5OdW1JblN0cmVhbXM7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NUREFQSSBHZXROdW1iZXJPZk1ldGhvZHMoVUlOVDMyICpudW1Db2RlY3MpDQorew0KKyAgKm51bUNvZGVjcyA9IGdfTnVtQ29kZWNzOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKw0KK3N0YXRpYyBpbnQgRmluZEhhc2hlckNsYXNzSWQoY29uc3QgR1VJRCAqY2xzSUQpDQorew0KKyAgaWYgKGNsc0lELT5EYXRhMSAhPSBDTFNJRF9DQ29kZWMuRGF0YTEgfHwNCisgICAgICBjbHNJRC0+RGF0YTIgIT0gQ0xTSURfQ0NvZGVjLkRhdGEyIHx8DQorICAgICAgY2xzSUQtPkRhdGEzICE9IGtIYXNoZXJJZCkNCisgICAgcmV0dXJuIC0xOw0KKyAgVUludDY0IGlkID0gR2V0VWk2NChjbHNJRC0+RGF0YTQpOw0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGdfTnVtQ29kZWNzOyBpKyspDQorICAgIGlmIChpZCA9PSBnX0hhc2hlcnNbaV0tPklkKQ0KKyAgICAgIHJldHVybiBpOw0KKyAgcmV0dXJuIC0xOw0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBDcmVhdGVIYXNoZXIyKFVJbnQzMiBpbmRleCwgSUhhc2hlciAqKmhhc2hlcikNCit7DQorICBDT01fVFJZX0JFR0lODQorICAqaGFzaGVyID0gZ19IYXNoZXJzW2luZGV4XS0+Q3JlYXRlSGFzaGVyKCk7DQorICBpZiAoKmhhc2hlcikNCisgICAgKCpoYXNoZXIpLT5BZGRSZWYoKTsNCisgIHJldHVybiBTX09LOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorU1REQVBJIENyZWF0ZUhhc2hlcihjb25zdCBHVUlEICpjbHNpZCwgSUhhc2hlciAqKm91dE9iamVjdCkNCit7DQorICBDT01fVFJZX0JFR0lODQorICAqb3V0T2JqZWN0ID0gMDsNCisgIGludCBpbmRleCA9IEZpbmRIYXNoZXJDbGFzc0lkKGNsc2lkKTsNCisgIGlmIChpbmRleCA8IDApDQorICAgIHJldHVybiBDTEFTU19FX0NMQVNTTk9UQVZBSUxBQkxFOw0KKyAgcmV0dXJuIENyZWF0ZUhhc2hlcjIoaW5kZXgsIG91dE9iamVjdCk7DQorICBDT01fVFJZX0VORA0KK30NCisNCitTVERBUEkgR2V0SGFzaGVyUHJvcChVSW50MzIgY29kZWNJbmRleCwgUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKQ0KK3sNCisgIDo6VmFyaWFudENsZWFyKChWQVJJQU5UQVJHICopdmFsdWUpOw0KKyAgY29uc3QgQ0hhc2hlckluZm8gJmNvZGVjID0gKmdfSGFzaGVyc1tjb2RlY0luZGV4XTsNCisgIHN3aXRjaCAocHJvcElEKQ0KKyAgew0KKyAgICBjYXNlIE5NZXRob2RQcm9wSUQ6OmtJRDoNCisgICAgICB2YWx1ZS0+dWhWYWwuUXVhZFBhcnQgPSAoVUludDY0KWNvZGVjLklkOw0KKyAgICAgIHZhbHVlLT52dCA9IFZUX1VJODsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBOTWV0aG9kUHJvcElEOjprTmFtZToNCisgICAgICBpZiAoKHZhbHVlLT5ic3RyVmFsID0gOjpTeXNBbGxvY1N0cmluZyhjb2RlYy5OYW1lKSkgIT0gMCkNCisgICAgICAgIHZhbHVlLT52dCA9IFZUX0JTVFI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgTk1ldGhvZFByb3BJRDo6a0VuY29kZXI6DQorICAgICAgaWYgKGNvZGVjLkNyZWF0ZUhhc2hlcikNCisgICAgICAgIHJldHVybiBTZXRDbGFzc0lEKGNvZGVjLklkLCBrSGFzaGVySWQsIHZhbHVlKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBOTWV0aG9kUHJvcElEOjprRGlnZXN0U2l6ZToNCisgICAgICB2YWx1ZS0+dWxWYWwgPSAoVUxPTkcpY29kZWMuRGlnZXN0U2l6ZTsNCisgICAgICB2YWx1ZS0+dnQgPSBWVF9VSTQ7DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorY2xhc3MgQ0hhc2hlcnM6DQorICBwdWJsaWMgSUhhc2hlcnMsDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCitwdWJsaWM6DQorICBNWV9VTktOT1dOX0lNUDEoSUhhc2hlcnMpDQorDQorICBTVERNRVRIT0RfKFVJbnQzMiwgR2V0TnVtSGFzaGVycykoKTsNCisgIFNURE1FVEhPRChHZXRIYXNoZXJQcm9wKShVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIFBST1BWQVJJQU5UICp2YWx1ZSk7DQorICBTVERNRVRIT0QoQ3JlYXRlSGFzaGVyKShVSW50MzIgaW5kZXgsIElIYXNoZXIgKipoYXNoZXIpOw0KK307DQorDQorU1REQVBJIEdldEhhc2hlcnMoSUhhc2hlcnMgKipoYXNoZXJzKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgICpoYXNoZXJzID0gbmV3IENIYXNoZXJzOw0KKyAgaWYgKCpoYXNoZXJzKQ0KKyAgICAoKmhhc2hlcnMpLT5BZGRSZWYoKTsNCisgIHJldHVybiBTX09LOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorU1RETUVUSE9ESU1QXyhVSW50MzIpIENIYXNoZXJzOjpHZXROdW1IYXNoZXJzKCkNCit7DQorICByZXR1cm4gZ19OdW1IYXNoZXJzOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0hhc2hlcnM6OkdldEhhc2hlclByb3AoVUludDMyIGluZGV4LCBQUk9QSUQgcHJvcElELCBQUk9QVkFSSUFOVCAqdmFsdWUpDQorew0KKyAgcmV0dXJuIDo6R2V0SGFzaGVyUHJvcChpbmRleCwgcHJvcElELCB2YWx1ZSk7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFzaGVyczo6Q3JlYXRlSGFzaGVyKFVJbnQzMiBpbmRleCwgSUhhc2hlciAqKmhhc2hlcikNCit7DQorICByZXR1cm4gOjpDcmVhdGVIYXNoZXIyKGluZGV4LCBoYXNoZXIpOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbXByZXNzL0NvcHlDb2Rlci5jcHAgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0NvcHlDb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhYjg1ZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQ29weUNvZGVyLmNwcApAQCAtMCwwICsxLDc0IEBACisvLyBDb21wcmVzcy9Db3B5Q29kZXIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0FsbG9jLmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9TdHJlYW1VdGlscy5oIg0KKw0KKyNpbmNsdWRlICJDb3B5Q29kZXIuaCINCisNCituYW1lc3BhY2UgTkNvbXByZXNzIHsNCisNCitzdGF0aWMgY29uc3QgVUludDMyIGtCdWZmZXJTaXplID0gMSA8PCAxNzsNCisNCitDQ29weUNvZGVyOjp+Q0NvcHlDb2RlcigpDQorew0KKyAgOjpNaWRGcmVlKF9idWZmZXIpOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0NvcHlDb2Rlcjo6Q29kZShJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSwNCisgICAgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSwNCisgICAgY29uc3QgVUludDY0ICogLyogaW5TaXplICovLCBjb25zdCBVSW50NjQgKm91dFNpemUsDQorICAgIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpDQorew0KKyAgaWYgKCFfYnVmZmVyKQ0KKyAgew0KKyAgICBfYnVmZmVyID0gKEJ5dGUgKik6Ok1pZEFsbG9jKGtCdWZmZXJTaXplKTsNCisgICAgaWYgKCFfYnVmZmVyKQ0KKyAgICAgIHJldHVybiBFX09VVE9GTUVNT1JZOw0KKyAgfQ0KKw0KKyAgVG90YWxTaXplID0gMDsNCisgIGZvciAoOzspDQorICB7DQorICAgIFVJbnQzMiBzaXplID0ga0J1ZmZlclNpemU7DQorICAgIGlmIChvdXRTaXplICYmIHNpemUgPiAqb3V0U2l6ZSAtIFRvdGFsU2l6ZSkNCisgICAgICBzaXplID0gKFVJbnQzMikoKm91dFNpemUgLSBUb3RhbFNpemUpOw0KKyAgICBSSU5PSyhpblN0cmVhbS0+UmVhZChfYnVmZmVyLCBzaXplLCAmc2l6ZSkpOw0KKyAgICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBpZiAob3V0U3RyZWFtKQ0KKyAgICB7DQorICAgICAgUklOT0soV3JpdGVTdHJlYW0ob3V0U3RyZWFtLCBfYnVmZmVyLCBzaXplKSk7DQorICAgIH0NCisgICAgVG90YWxTaXplICs9IHNpemU7DQorICAgIGlmIChwcm9ncmVzcykNCisgICAgew0KKyAgICAgIFJJTk9LKHByb2dyZXNzLT5TZXRSYXRpb0luZm8oJlRvdGFsU2l6ZSwgJlRvdGFsU2l6ZSkpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENDb3B5Q29kZXI6OkdldEluU3RyZWFtUHJvY2Vzc2VkU2l6ZShVSW50NjQgKnZhbHVlKQ0KK3sNCisgICp2YWx1ZSA9IFRvdGFsU2l6ZTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENvcHlTdHJlYW0oSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0sIElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpDQorew0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyPiBjb3B5Q29kZXIgPSBuZXcgQ0NvcHlDb2RlcjsNCisgIHJldHVybiBjb3B5Q29kZXItPkNvZGUoaW5TdHJlYW0sIG91dFN0cmVhbSwgTlVMTCwgTlVMTCwgcHJvZ3Jlc3MpOw0KK30NCisNCitIUkVTVUxUIENvcHlTdHJlYW1fRXhhY3RTaXplKElTZXF1ZW50aWFsSW5TdHJlYW0gKmluU3RyZWFtLCBJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtLCBVSW50NjQgc2l6ZSwgSUNvbXByZXNzUHJvZ3Jlc3NJbmZvICpwcm9ncmVzcykNCit7DQorICBOQ29tcHJlc3M6OkNDb3B5Q29kZXIgKmNvcHlDb2RlclNwZWMgPSBuZXcgTkNvbXByZXNzOjpDQ29weUNvZGVyOw0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyPiBjb3B5Q29kZXIgPSBjb3B5Q29kZXJTcGVjOw0KKyAgUklOT0soY29weUNvZGVyLT5Db2RlKGluU3RyZWFtLCBvdXRTdHJlYW0sIE5VTEwsICZzaXplLCBwcm9ncmVzcykpOw0KKyAgcmV0dXJuIGNvcHlDb2RlclNwZWMtPlRvdGFsU2l6ZSA9PSBzaXplID8gU19PSyA6IEVfRkFJTDsNCit9DQorDQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvQ29weUNvZGVyLmggYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0NvcHlDb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NDI2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0NvcHlDb2Rlci5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvbXByZXNzL0NvcHlDb2Rlci5oDQorDQorI2lmbmRlZiBfX0NPTVBSRVNTX0NPUFlfQ09ERVJfSA0KKyNkZWZpbmUgX19DT01QUkVTU19DT1BZX0NPREVSX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL015Q29tLmgiDQorDQorI2luY2x1ZGUgIi4uL0lDb2Rlci5oIg0KKw0KK25hbWVzcGFjZSBOQ29tcHJlc3Mgew0KKw0KK2NsYXNzIENDb3B5Q29kZXI6DQorICBwdWJsaWMgSUNvbXByZXNzQ29kZXIsDQorICBwdWJsaWMgSUNvbXByZXNzR2V0SW5TdHJlYW1Qcm9jZXNzZWRTaXplLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBCeXRlICpfYnVmZmVyOw0KK3B1YmxpYzoNCisgIFVJbnQ2NCBUb3RhbFNpemU7DQorICBDQ29weUNvZGVyKCk6IFRvdGFsU2l6ZSgwKSwgX2J1ZmZlcigwKSB7fTsNCisgIH5DQ29weUNvZGVyKCk7DQorDQorICBNWV9VTktOT1dOX0lNUDEoSUNvbXByZXNzR2V0SW5TdHJlYW1Qcm9jZXNzZWRTaXplKQ0KKw0KKyAgU1RETUVUSE9EKENvZGUpKElTZXF1ZW50aWFsSW5TdHJlYW0gKmluU3RyZWFtLCBJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtLA0KKyAgICAgIGNvbnN0IFVJbnQ2NCAqaW5TaXplLCBjb25zdCBVSW50NjQgKm91dFNpemUsIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpOw0KKyAgU1RETUVUSE9EKEdldEluU3RyZWFtUHJvY2Vzc2VkU2l6ZSkoVUludDY0ICp2YWx1ZSk7DQorfTsNCisNCitIUkVTVUxUIENvcHlTdHJlYW0oSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0sIElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpOw0KK0hSRVNVTFQgQ29weVN0cmVhbV9FeGFjdFNpemUoSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0sIElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sIFVJbnQ2NCBzaXplLCBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKTsNCisNCit9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Db3B5UmVnaXN0ZXIuY3BwIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Db3B5UmVnaXN0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjI0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0NvcHlSZWdpc3Rlci5jcHAKQEAgLTAsMCArMSwxNCBAQAorLy8gQ29weVJlZ2lzdGVyLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL1JlZ2lzdGVyQ29kZWMuaCINCisNCisjaW5jbHVkZSAiQ29weUNvZGVyLmgiDQorDQorc3RhdGljIHZvaWQgKkNyZWF0ZUNvZGVjKCkgeyByZXR1cm4gKHZvaWQgKikoSUNvbXByZXNzQ29kZXIgKikobmV3IE5Db21wcmVzczo6Q0NvcHlDb2Rlcik7IH0NCisNCitzdGF0aWMgQ0NvZGVjSW5mbyBnX0NvZGVjSW5mbyA9DQoreyBDcmVhdGVDb2RlYywgQ3JlYXRlQ29kZWMsIDB4MDAsIEwiQ29weSIsIDEsIGZhbHNlIH07DQorDQorUkVHSVNURVJfQ09ERUMoQ29weSkNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbXByZXNzL0RlbHRhRmlsdGVyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvRGVsdGFGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZjcwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0RlbHRhRmlsdGVyLmNwcApAQCAtMCwwICsxLDEyNSBAQAorLy8gRGVsdGFGaWx0ZXIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0RlbHRhLmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9SZWdpc3RlckNvZGVjLmgiDQorDQorI2luY2x1ZGUgIkJyYW5jaENvZGVyLmgiDQorDQorc3RydWN0IENEZWx0YQ0KK3sNCisgIHVuc2lnbmVkIF9kZWx0YTsNCisgIEJ5dGUgX3N0YXRlW0RFTFRBX1NUQVRFX1NJWkVdOw0KKyAgQ0RlbHRhKCk6IF9kZWx0YSgxKSB7fQ0KKyAgdm9pZCBEZWx0YUluaXQoKSB7IERlbHRhX0luaXQoX3N0YXRlKTsgfQ0KK307DQorDQorY2xhc3MgQ0RlbHRhRW5jb2RlcjoNCisgIHB1YmxpYyBJQ29tcHJlc3NGaWx0ZXIsDQorICBwdWJsaWMgSUNvbXByZXNzU2V0Q29kZXJQcm9wZXJ0aWVzLA0KKyAgcHVibGljIElDb21wcmVzc1dyaXRlQ29kZXJQcm9wZXJ0aWVzLA0KKyAgQ0RlbHRhLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorcHVibGljOg0KKyAgTVlfVU5LTk9XTl9JTVAyKElDb21wcmVzc1NldENvZGVyUHJvcGVydGllcywgSUNvbXByZXNzV3JpdGVDb2RlclByb3BlcnRpZXMpDQorICBTVERNRVRIT0QoSW5pdCkoKTsNCisgIFNURE1FVEhPRF8oVUludDMyLCBGaWx0ZXIpKEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsNCisgIFNURE1FVEhPRChTZXRDb2RlclByb3BlcnRpZXMpKGNvbnN0IFBST1BJRCAqcHJvcElEcywgY29uc3QgUFJPUFZBUklBTlQgKnByb3BzLCBVSW50MzIgbnVtUHJvcHMpOw0KKyAgU1RETUVUSE9EKFdyaXRlQ29kZXJQcm9wZXJ0aWVzKShJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtKTsNCit9Ow0KKw0KK2NsYXNzIENEZWx0YURlY29kZXI6DQorICBwdWJsaWMgSUNvbXByZXNzRmlsdGVyLA0KKyAgcHVibGljIElDb21wcmVzc1NldERlY29kZXJQcm9wZXJ0aWVzMiwNCisgIENEZWx0YSwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QMShJQ29tcHJlc3NTZXREZWNvZGVyUHJvcGVydGllczIpDQorICBTVERNRVRIT0QoSW5pdCkoKTsNCisgIFNURE1FVEhPRF8oVUludDMyLCBGaWx0ZXIpKEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsNCisgIFNURE1FVEhPRChTZXREZWNvZGVyUHJvcGVydGllczIpKGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsNCit9Ow0KKw0KK1NURE1FVEhPRElNUCBDRGVsdGFFbmNvZGVyOjpJbml0KCkNCit7DQorICBEZWx0YUluaXQoKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVBfKFVJbnQzMikgQ0RlbHRhRW5jb2Rlcjo6RmlsdGVyKEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKQ0KK3sNCisgIERlbHRhX0VuY29kZShfc3RhdGUsIF9kZWx0YSwgZGF0YSwgc2l6ZSk7DQorICByZXR1cm4gc2l6ZTsNCit9DQorDQorU1RETUVUSE9ESU1QIENEZWx0YUVuY29kZXI6OlNldENvZGVyUHJvcGVydGllcyhjb25zdCBQUk9QSUQgKnByb3BJRHMsIGNvbnN0IFBST1BWQVJJQU5UICpwcm9wcywgVUludDMyIG51bVByb3BzKQ0KK3sNCisgIFVJbnQzMiBkZWx0YSA9IF9kZWx0YTsNCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtUHJvcHM7IGkrKykNCisgIHsNCisgICAgY29uc3QgUFJPUFZBUklBTlQgJnByb3AgPSBwcm9wc1tpXTsNCisgICAgUFJPUElEIHByb3BJRCA9IHByb3BJRHNbaV07DQorICAgIGlmIChwcm9wSUQgPj0gTkNvZGVyUHJvcElEOjprUmVkdWNlU2l6ZSkNCisgICAgICBjb250aW51ZTsNCisgICAgaWYgKHByb3AudnQgIT0gVlRfVUk0KQ0KKyAgICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICAgIHN3aXRjaCAocHJvcElEKQ0KKyAgICB7DQorICAgICAgY2FzZSBOQ29kZXJQcm9wSUQ6OmtEZWZhdWx0UHJvcDoNCisgICAgICAgIGRlbHRhID0gKFVJbnQzMilwcm9wLnVsVmFsOw0KKyAgICAgICAgaWYgKGRlbHRhIDwgMSB8fCBkZWx0YSA+IDI1NikNCisgICAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgTkNvZGVyUHJvcElEOjprTnVtVGhyZWFkczogYnJlYWs7DQorICAgICAgY2FzZSBOQ29kZXJQcm9wSUQ6OmtMZXZlbDogYnJlYWs7DQorICAgICAgZGVmYXVsdDogcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgfQ0KKyAgfQ0KKyAgX2RlbHRhID0gZGVsdGE7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENEZWx0YUVuY29kZXI6OldyaXRlQ29kZXJQcm9wZXJ0aWVzKElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0pDQorew0KKyAgQnl0ZSBwcm9wID0gKEJ5dGUpKF9kZWx0YSAtIDEpOw0KKyAgcmV0dXJuIG91dFN0cmVhbS0+V3JpdGUoJnByb3AsIDEsIE5VTEwpOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0RlbHRhRGVjb2Rlcjo6SW5pdCgpDQorew0KKyAgRGVsdGFJbml0KCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QXyhVSW50MzIpIENEZWx0YURlY29kZXI6OkZpbHRlcihCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSkNCit7DQorICBEZWx0YV9EZWNvZGUoX3N0YXRlLCBfZGVsdGEsIGRhdGEsIHNpemUpOw0KKyAgcmV0dXJuIHNpemU7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRGVsdGFEZWNvZGVyOjpTZXREZWNvZGVyUHJvcGVydGllczIoY29uc3QgQnl0ZSAqcHJvcHMsIFVJbnQzMiBzaXplKQ0KK3sNCisgIGlmIChzaXplICE9IDEpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICBfZGVsdGEgPSAodW5zaWduZWQpcHJvcHNbMF0gKyAxOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKyNkZWZpbmUgQ1JFQVRFX0NPREVDKHgpIFwNCisgIHN0YXRpYyB2b2lkICpDcmVhdGVDb2RlYyAjIyB4KCkgeyByZXR1cm4gKHZvaWQgKikoSUNvbXByZXNzRmlsdGVyICopKG5ldyBDICMjIHggIyMgRGVjb2Rlcik7IH0gXA0KKyAgc3RhdGljIHZvaWQgKkNyZWF0ZUNvZGVjICMjIHggIyMgT3V0KCkgeyByZXR1cm4gKHZvaWQgKikoSUNvbXByZXNzRmlsdGVyICopKG5ldyBDICMjIHggIyMgRW5jb2Rlcik7IH0NCisNCitDUkVBVEVfQ09ERUMoRGVsdGEpDQorDQorI2RlZmluZSBNRVRIT0RfSVRFTSh4LCBpZCwgbmFtZSkgeyBDcmVhdGVDb2RlYyAjIyB4LCBDcmVhdGVDb2RlYyAjIyB4ICMjIE91dCwgaWQsIG5hbWUsIDEsIHRydWUgIH0NCisNCitzdGF0aWMgQ0NvZGVjSW5mbyBnX0NvZGVjc0luZm9bXSA9DQorew0KKyAgTUVUSE9EX0lURU0oRGVsdGEsIDMsIEwiRGVsdGEiKQ0KK307DQorDQorUkVHSVNURVJfQ09ERUNTKERlbHRhKQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvTHptYTJEZWNvZGVyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvTHptYTJEZWNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDNkODMwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Mem1hMkRlY29kZXIuY3BwCkBAIC0wLDAgKzEsMTg5IEBACisvLyBMem1hMkRlY29kZXIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0FsbG9jLmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9TdHJlYW1VdGlscy5oIg0KKw0KKyNpbmNsdWRlICJMem1hMkRlY29kZXIuaCINCisNCitzdGF0aWMgSFJFU1VMVCBTUmVzVG9IUkVTVUxUKFNSZXMgcmVzKQ0KK3sNCisgIHN3aXRjaChyZXMpDQorICB7DQorICAgIGNhc2UgU1pfT0s6IHJldHVybiBTX09LOw0KKyAgICBjYXNlIFNaX0VSUk9SX01FTTogcmV0dXJuIEVfT1VUT0ZNRU1PUlk7DQorICAgIGNhc2UgU1pfRVJST1JfUEFSQU06IHJldHVybiBFX0lOVkFMSURBUkc7DQorICAgIC8vIGNhc2UgU1pfRVJST1JfUFJPR1JFU1M6IHJldHVybiBFX0FCT1JUOw0KKyAgICBjYXNlIFNaX0VSUk9SX0RBVEE6IHJldHVybiBTX0ZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIEVfRkFJTDsNCit9DQorDQorbmFtZXNwYWNlIE5Db21wcmVzcyB7DQorbmFtZXNwYWNlIE5Mem1hMiB7DQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrSW5CdWZTaXplID0gMSA8PCAyMDsNCisNCitDRGVjb2Rlcjo6Q0RlY29kZXIoKTogX2luQnVmKDApLCBfb3V0U2l6ZURlZmluZWQoZmFsc2UpDQorew0KKyAgTHptYTJEZWNfQ29uc3RydWN0KCZfc3RhdGUpOw0KK30NCisNCitzdGF0aWMgdm9pZCAqU3pBbGxvYyh2b2lkICpwLCBzaXplX3Qgc2l6ZSkgeyBwID0gcDsgcmV0dXJuIE15QWxsb2Moc2l6ZSk7IH0NCitzdGF0aWMgdm9pZCBTekZyZWUodm9pZCAqcCwgdm9pZCAqYWRkcmVzcykgeyBwID0gcDsgTXlGcmVlKGFkZHJlc3MpOyB9DQorc3RhdGljIElTekFsbG9jIGdfQWxsb2MgPSB7IFN6QWxsb2MsIFN6RnJlZSB9Ow0KKw0KK0NEZWNvZGVyOjp+Q0RlY29kZXIoKQ0KK3sNCisgIEx6bWEyRGVjX0ZyZWUoJl9zdGF0ZSwgJmdfQWxsb2MpOw0KKyAgTXlGcmVlKF9pbkJ1Zik7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRGVjb2Rlcjo6U2V0RGVjb2RlclByb3BlcnRpZXMyKGNvbnN0IEJ5dGUgKnByb3AsIFVJbnQzMiBzaXplKQ0KK3sNCisgIGlmIChzaXplICE9IDEpIHJldHVybiBTWl9FUlJPUl9VTlNVUFBPUlRFRDsNCisgIFJJTk9LKFNSZXNUb0hSRVNVTFQoTHptYTJEZWNfQWxsb2NhdGUoJl9zdGF0ZSwgcHJvcFswXSwgJmdfQWxsb2MpKSk7DQorICBpZiAoX2luQnVmID09IDApDQorICB7DQorICAgIF9pbkJ1ZiA9IChCeXRlICopTXlBbGxvYyhrSW5CdWZTaXplKTsNCisgICAgaWYgKF9pbkJ1ZiA9PSAwKQ0KKyAgICAgIHJldHVybiBFX09VVE9GTUVNT1JZOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRGVjb2Rlcjo6R2V0SW5TdHJlYW1Qcm9jZXNzZWRTaXplKFVJbnQ2NCAqdmFsdWUpIHsgKnZhbHVlID0gX2luU2l6ZVByb2Nlc3NlZDsgcmV0dXJuIFNfT0s7IH0NCitTVERNRVRIT0RJTVAgQ0RlY29kZXI6OlNldEluU3RyZWFtKElTZXF1ZW50aWFsSW5TdHJlYW0gKmluU3RyZWFtKSB7IF9pblN0cmVhbSA9IGluU3RyZWFtOyByZXR1cm4gU19PSzsgfQ0KK1NURE1FVEhPRElNUCBDRGVjb2Rlcjo6UmVsZWFzZUluU3RyZWFtKCkgeyBfaW5TdHJlYW0uUmVsZWFzZSgpOyByZXR1cm4gU19PSzsgfQ0KKw0KK1NURE1FVEhPRElNUCBDRGVjb2Rlcjo6U2V0T3V0U3RyZWFtU2l6ZShjb25zdCBVSW50NjQgKm91dFNpemUpDQorew0KKyAgX291dFNpemVEZWZpbmVkID0gKG91dFNpemUgIT0gTlVMTCk7DQorICBpZiAoX291dFNpemVEZWZpbmVkKQ0KKyAgICBfb3V0U2l6ZSA9ICpvdXRTaXplOw0KKw0KKyAgTHptYTJEZWNfSW5pdCgmX3N0YXRlKTsNCisgIA0KKyAgX2luUG9zID0gX2luU2l6ZSA9IDA7DQorICBfaW5TaXplUHJvY2Vzc2VkID0gX291dFNpemVQcm9jZXNzZWQgPSAwOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRGVjb2Rlcjo6Q29kZShJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSwNCisgICAgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSwgY29uc3QgVUludDY0ICogLyogaW5TaXplICovLA0KKyAgICBjb25zdCBVSW50NjQgKm91dFNpemUsIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpDQorew0KKyAgaWYgKF9pbkJ1ZiA9PSAwKQ0KKyAgICByZXR1cm4gU19GQUxTRTsNCisgIFNldE91dFN0cmVhbVNpemUob3V0U2l6ZSk7DQorDQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBpZiAoX2luUG9zID09IF9pblNpemUpDQorICAgIHsNCisgICAgICBfaW5Qb3MgPSBfaW5TaXplID0gMDsNCisgICAgICBSSU5PSyhpblN0cmVhbS0+UmVhZChfaW5CdWYsIGtJbkJ1ZlNpemUsICZfaW5TaXplKSk7DQorICAgIH0NCisNCisgICAgU2l6ZVQgZGljUG9zID0gX3N0YXRlLmRlY29kZXIuZGljUG9zOw0KKyAgICBTaXplVCBjdXJTaXplID0gX3N0YXRlLmRlY29kZXIuZGljQnVmU2l6ZSAtIGRpY1BvczsNCisgICAgY29uc3QgVUludDMyIGtTdGVwU2l6ZSA9ICgoVUludDMyKTEgPDwgMjIpOw0KKyAgICBpZiAoY3VyU2l6ZSA+IGtTdGVwU2l6ZSkNCisgICAgICBjdXJTaXplID0gKFNpemVUKWtTdGVwU2l6ZTsNCisgICAgDQorICAgIEVMem1hRmluaXNoTW9kZSBmaW5pc2hNb2RlID0gTFpNQV9GSU5JU0hfQU5ZOw0KKyAgICBpZiAoX291dFNpemVEZWZpbmVkKQ0KKyAgICB7DQorICAgICAgY29uc3QgVUludDY0IHJlbSA9IF9vdXRTaXplIC0gX291dFNpemVQcm9jZXNzZWQ7DQorICAgICAgaWYgKHJlbSA8IGN1clNpemUpDQorICAgICAgew0KKyAgICAgICAgY3VyU2l6ZSA9IChTaXplVClyZW07DQorICAgICAgICAvKg0KKyAgICAgICAgLy8gZmluaXNoTW9kZSA9IExaTUFfRklOSVNIX0VORDsNCisgICAgICAgIHdlIGNhbid0IHVzZSBMWk1BX0ZJTklTSF9FTkQgaGVyZSB0byBhbGxvdyBwYXJ0aWFsIGRlY29kaW5nDQorICAgICAgICAqLw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBTaXplVCBpblNpemVQcm9jZXNzZWQgPSBfaW5TaXplIC0gX2luUG9zOw0KKyAgICBFTHptYVN0YXR1cyBzdGF0dXM7DQorICAgIFNSZXMgcmVzID0gTHptYTJEZWNfRGVjb2RlVG9EaWMoJl9zdGF0ZSwgZGljUG9zICsgY3VyU2l6ZSwgX2luQnVmICsgX2luUG9zLCAmaW5TaXplUHJvY2Vzc2VkLCBmaW5pc2hNb2RlLCAmc3RhdHVzKTsNCisNCisgICAgX2luUG9zICs9IChVSW50MzIpaW5TaXplUHJvY2Vzc2VkOw0KKyAgICBfaW5TaXplUHJvY2Vzc2VkICs9IGluU2l6ZVByb2Nlc3NlZDsNCisgICAgU2l6ZVQgb3V0U2l6ZVByb2Nlc3NlZCA9IF9zdGF0ZS5kZWNvZGVyLmRpY1BvcyAtIGRpY1BvczsNCisgICAgX291dFNpemVQcm9jZXNzZWQgKz0gb3V0U2l6ZVByb2Nlc3NlZDsNCisNCisgICAgYm9vbCBmaW5pc2hlZCA9IChpblNpemVQcm9jZXNzZWQgPT0gMCAmJiBvdXRTaXplUHJvY2Vzc2VkID09IDApOw0KKyAgICBib29sIHN0b3BEZWNvZGluZyA9IChfb3V0U2l6ZURlZmluZWQgJiYgX291dFNpemVQcm9jZXNzZWQgPj0gX291dFNpemUpOw0KKw0KKyAgICBpZiAocmVzICE9IDAgfHwgX3N0YXRlLmRlY29kZXIuZGljUG9zID09IF9zdGF0ZS5kZWNvZGVyLmRpY0J1ZlNpemUgfHwgZmluaXNoZWQgfHwgc3RvcERlY29kaW5nKQ0KKyAgICB7DQorICAgICAgSFJFU1VMVCByZXMyID0gV3JpdGVTdHJlYW0ob3V0U3RyZWFtLCBfc3RhdGUuZGVjb2Rlci5kaWMsIF9zdGF0ZS5kZWNvZGVyLmRpY1Bvcyk7DQorICAgICAgaWYgKHJlcyAhPSAwKQ0KKyAgICAgICAgcmV0dXJuIFNfRkFMU0U7DQorICAgICAgUklOT0socmVzMik7DQorICAgICAgaWYgKHN0b3BEZWNvZGluZykNCisgICAgICAgIHJldHVybiBTX09LOw0KKyAgICAgIGlmIChmaW5pc2hlZCkNCisgICAgICAgIHJldHVybiAoc3RhdHVzID09IExaTUFfU1RBVFVTX0ZJTklTSEVEX1dJVEhfTUFSSyA/IFNfT0sgOiBTX0ZBTFNFKTsNCisgICAgfQ0KKyAgICBpZiAoX3N0YXRlLmRlY29kZXIuZGljUG9zID09IF9zdGF0ZS5kZWNvZGVyLmRpY0J1ZlNpemUpDQorICAgICAgX3N0YXRlLmRlY29kZXIuZGljUG9zID0gMDsNCisNCisgICAgaWYgKHByb2dyZXNzICE9IE5VTEwpDQorICAgIHsNCisgICAgICBSSU5PSyhwcm9ncmVzcy0+U2V0UmF0aW9JbmZvKCZfaW5TaXplUHJvY2Vzc2VkLCAmX291dFNpemVQcm9jZXNzZWQpKTsNCisgICAgfQ0KKyAgfQ0KK30NCisNCisjaWZuZGVmIE5PX1JFQURfRlJPTV9DT0RFUg0KKw0KK1NURE1FVEhPRElNUCBDRGVjb2Rlcjo6UmVhZCh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IDA7DQorICBkbw0KKyAgew0KKyAgICBpZiAoX2luUG9zID09IF9pblNpemUpDQorICAgIHsNCisgICAgICBfaW5Qb3MgPSBfaW5TaXplID0gMDsNCisgICAgICBSSU5PSyhfaW5TdHJlYW0tPlJlYWQoX2luQnVmLCBrSW5CdWZTaXplLCAmX2luU2l6ZSkpOw0KKyAgICB9DQorICAgIHsNCisgICAgICBTaXplVCBpblByb2Nlc3NlZCA9IF9pblNpemUgLSBfaW5Qb3M7DQorDQorICAgICAgaWYgKF9vdXRTaXplRGVmaW5lZCkNCisgICAgICB7DQorICAgICAgICBjb25zdCBVSW50NjQgcmVtID0gX291dFNpemUgLSBfb3V0U2l6ZVByb2Nlc3NlZDsNCisgICAgICAgIGlmIChyZW0gPCBzaXplKQ0KKyAgICAgICAgICBzaXplID0gKFVJbnQzMilyZW07DQorICAgICAgfQ0KKw0KKyAgICAgIFNpemVUIG91dFByb2Nlc3NlZCA9IHNpemU7DQorICAgICAgRUx6bWFTdGF0dXMgc3RhdHVzOw0KKyAgICAgIFNSZXMgcmVzID0gTHptYTJEZWNfRGVjb2RlVG9CdWYoJl9zdGF0ZSwgKEJ5dGUgKilkYXRhLCAmb3V0UHJvY2Vzc2VkLA0KKyAgICAgICAgICBfaW5CdWYgKyBfaW5Qb3MsICZpblByb2Nlc3NlZCwgTFpNQV9GSU5JU0hfQU5ZLCAmc3RhdHVzKTsNCisgICAgICBfaW5Qb3MgKz0gKFVJbnQzMilpblByb2Nlc3NlZDsNCisgICAgICBfaW5TaXplUHJvY2Vzc2VkICs9IGluUHJvY2Vzc2VkOw0KKyAgICAgIF9vdXRTaXplUHJvY2Vzc2VkICs9IG91dFByb2Nlc3NlZDsNCisgICAgICBzaXplIC09IChVSW50MzIpb3V0UHJvY2Vzc2VkOw0KKyAgICAgIGRhdGEgPSAoQnl0ZSAqKWRhdGEgKyBvdXRQcm9jZXNzZWQ7DQorICAgICAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICAgICAqcHJvY2Vzc2VkU2l6ZSArPSAoVUludDMyKW91dFByb2Nlc3NlZDsNCisgICAgICBSSU5PSyhTUmVzVG9IUkVTVUxUKHJlcykpOw0KKyAgICAgIGlmIChpblByb2Nlc3NlZCA9PSAwICYmIG91dFByb2Nlc3NlZCA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgIH0NCisgIH0NCisgIHdoaWxlIChzaXplICE9IDApOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKyNlbmRpZg0KKw0KK319DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Mem1hMkRlY29kZXIuaCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvTHptYTJEZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0MDA5NwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvTHptYTJEZWNvZGVyLmgKQEAgLTAsMCArMSw3MyBAQAorLy8gTHptYTJEZWNvZGVyLmgNCisNCisjaWZuZGVmIF9fTFpNQTJfREVDT0RFUl9IDQorI2RlZmluZSBfX0xaTUEyX0RFQ09ERVJfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0x6bWEyRGVjLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKw0KKyNpbmNsdWRlICIuLi9JQ29kZXIuaCINCisNCituYW1lc3BhY2UgTkNvbXByZXNzIHsNCituYW1lc3BhY2UgTkx6bWEyIHsNCisNCitjbGFzcyBDRGVjb2RlcjoNCisgIHB1YmxpYyBJQ29tcHJlc3NDb2RlciwNCisgIHB1YmxpYyBJQ29tcHJlc3NTZXREZWNvZGVyUHJvcGVydGllczIsDQorICBwdWJsaWMgSUNvbXByZXNzR2V0SW5TdHJlYW1Qcm9jZXNzZWRTaXplLA0KKyAgI2lmbmRlZiBOT19SRUFEX0ZST01fQ09ERVINCisgIHB1YmxpYyBJQ29tcHJlc3NTZXRJblN0cmVhbSwNCisgIHB1YmxpYyBJQ29tcHJlc3NTZXRPdXRTdHJlYW1TaXplLA0KKyAgcHVibGljIElTZXF1ZW50aWFsSW5TdHJlYW0sDQorICAjZW5kaWYNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IF9pblN0cmVhbTsNCisgIEJ5dGUgKl9pbkJ1ZjsNCisgIFVJbnQzMiBfaW5Qb3M7DQorICBVSW50MzIgX2luU2l6ZTsNCisgIENMem1hMkRlYyBfc3RhdGU7DQorICBib29sIF9vdXRTaXplRGVmaW5lZDsNCisgIFVJbnQ2NCBfb3V0U2l6ZTsNCisgIFVJbnQ2NCBfaW5TaXplUHJvY2Vzc2VkOw0KKyAgVUludDY0IF9vdXRTaXplUHJvY2Vzc2VkOw0KK3B1YmxpYzoNCisNCisgICNpZm5kZWYgTk9fUkVBRF9GUk9NX0NPREVSDQorICBNWV9VTktOT1dOX0lNUDUoDQorICAgICAgSUNvbXByZXNzU2V0RGVjb2RlclByb3BlcnRpZXMyLA0KKyAgICAgIElDb21wcmVzc0dldEluU3RyZWFtUHJvY2Vzc2VkU2l6ZSwNCisgICAgICBJQ29tcHJlc3NTZXRJblN0cmVhbSwNCisgICAgICBJQ29tcHJlc3NTZXRPdXRTdHJlYW1TaXplLA0KKyAgICAgIElTZXF1ZW50aWFsSW5TdHJlYW0pDQorICAjZWxzZQ0KKyAgTVlfVU5LTk9XTl9JTVAyKA0KKyAgICAgIElDb21wcmVzc1NldERlY29kZXJQcm9wZXJ0aWVzMiwNCisgICAgICBJQ29tcHJlc3NHZXRJblN0cmVhbVByb2Nlc3NlZFNpemUpDQorICAjZW5kaWYNCisNCisgIFNURE1FVEhPRChDb2RlKShJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSwNCisgICAgICBJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtLCBjb25zdCBVSW50NjQgKl9pblNpemUsIGNvbnN0IFVJbnQ2NCAqb3V0U2l6ZSwNCisgICAgICBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKTsNCisNCisgIFNURE1FVEhPRChTZXREZWNvZGVyUHJvcGVydGllczIpKGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsNCisNCisgIFNURE1FVEhPRChHZXRJblN0cmVhbVByb2Nlc3NlZFNpemUpKFVJbnQ2NCAqdmFsdWUpOw0KKw0KKyAgU1RETUVUSE9EKFNldEluU3RyZWFtKShJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSk7DQorICBTVERNRVRIT0QoUmVsZWFzZUluU3RyZWFtKSgpOw0KKyAgU1RETUVUSE9EKFNldE91dFN0cmVhbVNpemUpKGNvbnN0IFVJbnQ2NCAqb3V0U2l6ZSk7DQorDQorICAjaWZuZGVmIE5PX1JFQURfRlJPTV9DT0RFUg0KKyAgU1RETUVUSE9EKFJlYWQpKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KKyAgI2VuZGlmDQorDQorICBDRGVjb2RlcigpOw0KKyAgdmlydHVhbCB+Q0RlY29kZXIoKTsNCisNCit9Ow0KKw0KK319DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Mem1hMkVuY29kZXIuY3BwIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Mem1hMkVuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MWYxNDYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0x6bWEyRW5jb2Rlci5jcHAKQEAgLTAsMCArMSw5NCBAQAorLy8gTHptYTJFbmNvZGVyLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQy9BbGxvYy5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vQ1dyYXBwZXJzLmgiDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9TdHJlYW1VdGlscy5oIg0KKw0KKyNpbmNsdWRlICJMem1hMkVuY29kZXIuaCINCisNCituYW1lc3BhY2UgTkNvbXByZXNzIHsNCisNCituYW1lc3BhY2UgTkx6bWEgew0KKw0KK0hSRVNVTFQgU2V0THptYVByb3AoUFJPUElEIHByb3BJRCwgY29uc3QgUFJPUFZBUklBTlQgJnByb3AsIENMem1hRW5jUHJvcHMgJmVwKTsNCisNCit9DQorDQorbmFtZXNwYWNlIE5Mem1hMiB7DQorDQorc3RhdGljIHZvaWQgKlN6QmlnQWxsb2Modm9pZCAqLCBzaXplX3Qgc2l6ZSkgeyByZXR1cm4gQmlnQWxsb2Moc2l6ZSk7IH0NCitzdGF0aWMgdm9pZCBTekJpZ0ZyZWUodm9pZCAqLCB2b2lkICphZGRyZXNzKSB7IEJpZ0ZyZWUoYWRkcmVzcyk7IH0NCitzdGF0aWMgSVN6QWxsb2MgZ19CaWdBbGxvYyA9IHsgU3pCaWdBbGxvYywgU3pCaWdGcmVlIH07DQorDQorc3RhdGljIHZvaWQgKlN6QWxsb2Modm9pZCAqLCBzaXplX3Qgc2l6ZSkgeyByZXR1cm4gTXlBbGxvYyhzaXplKTsgfQ0KK3N0YXRpYyB2b2lkIFN6RnJlZSh2b2lkICosIHZvaWQgKmFkZHJlc3MpIHsgTXlGcmVlKGFkZHJlc3MpOyB9DQorc3RhdGljIElTekFsbG9jIGdfQWxsb2MgPSB7IFN6QWxsb2MsIFN6RnJlZSB9Ow0KKw0KK0NFbmNvZGVyOjpDRW5jb2RlcigpDQorew0KKyAgX2VuY29kZXIgPSAwOw0KKyAgX2VuY29kZXIgPSBMem1hMkVuY19DcmVhdGUoJmdfQWxsb2MsICZnX0JpZ0FsbG9jKTsNCisgIGlmIChfZW5jb2RlciA9PSAwKQ0KKyAgICB0aHJvdyAxOw0KK30NCisNCitDRW5jb2Rlcjo6fkNFbmNvZGVyKCkNCit7DQorICBpZiAoX2VuY29kZXIgIT0gMCkNCisgICAgTHptYTJFbmNfRGVzdHJveShfZW5jb2Rlcik7DQorfQ0KKw0KK0hSRVNVTFQgU2V0THptYTJQcm9wKFBST1BJRCBwcm9wSUQsIGNvbnN0IFBST1BWQVJJQU5UICZwcm9wLCBDTHptYTJFbmNQcm9wcyAmbHptYTJQcm9wcykNCit7DQorICBzd2l0Y2ggKHByb3BJRCkNCisgIHsNCisgICAgY2FzZSBOQ29kZXJQcm9wSUQ6OmtCbG9ja1NpemU6DQorICAgICAgaWYgKHByb3AudnQgIT0gVlRfVUk0KSByZXR1cm4gRV9JTlZBTElEQVJHOyBsem1hMlByb3BzLmJsb2NrU2l6ZSA9IHByb3AudWxWYWw7IGJyZWFrOw0KKyAgICBjYXNlIE5Db2RlclByb3BJRDo6a051bVRocmVhZHM6DQorICAgICAgaWYgKHByb3AudnQgIT0gVlRfVUk0KSByZXR1cm4gRV9JTlZBTElEQVJHOyBsem1hMlByb3BzLm51bVRvdGFsVGhyZWFkcyA9IChpbnQpKHByb3AudWxWYWwpOyBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBSSU5PSyhOTHptYTo6U2V0THptYVByb3AocHJvcElELCBwcm9wLCBsem1hMlByb3BzLmx6bWFQcm9wcykpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRW5jb2Rlcjo6U2V0Q29kZXJQcm9wZXJ0aWVzKGNvbnN0IFBST1BJRCAqcHJvcElEcywNCisgICAgY29uc3QgUFJPUFZBUklBTlQgKmNvZGVyUHJvcHMsIFVJbnQzMiBudW1Qcm9wcykNCit7DQorICBDTHptYTJFbmNQcm9wcyBsem1hMlByb3BzOw0KKyAgTHptYTJFbmNQcm9wc19Jbml0KCZsem1hMlByb3BzKTsNCisNCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtUHJvcHM7IGkrKykNCisgIHsNCisgICAgUklOT0soU2V0THptYTJQcm9wKHByb3BJRHNbaV0sIGNvZGVyUHJvcHNbaV0sIGx6bWEyUHJvcHMpKTsNCisgIH0NCisgIHJldHVybiBTUmVzVG9IUkVTVUxUKEx6bWEyRW5jX1NldFByb3BzKF9lbmNvZGVyLCAmbHptYTJQcm9wcykpOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0VuY29kZXI6OldyaXRlQ29kZXJQcm9wZXJ0aWVzKElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0pDQorew0KKyAgQnl0ZSBwcm9wID0gTHptYTJFbmNfV3JpdGVQcm9wZXJ0aWVzKF9lbmNvZGVyKTsNCisgIHJldHVybiBXcml0ZVN0cmVhbShvdXRTdHJlYW0sICZwcm9wLCAxKTsNCit9DQorDQorU1RETUVUSE9ESU1QIENFbmNvZGVyOjpDb2RlKElTZXF1ZW50aWFsSW5TdHJlYW0gKmluU3RyZWFtLCBJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtLA0KKyAgICBjb25zdCBVSW50NjQgKiAvKiBpblNpemUgKi8sIGNvbnN0IFVJbnQ2NCAqIC8qIG91dFNpemUgKi8sIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpDQorew0KKyAgQ1NlcUluU3RyZWFtV3JhcCBpbldyYXAoaW5TdHJlYW0pOw0KKyAgQ1NlcU91dFN0cmVhbVdyYXAgb3V0V3JhcChvdXRTdHJlYW0pOw0KKyAgQ0NvbXByZXNzUHJvZ3Jlc3NXcmFwIHByb2dyZXNzV3JhcChwcm9ncmVzcyk7DQorDQorICBTUmVzIHJlcyA9IEx6bWEyRW5jX0VuY29kZShfZW5jb2RlciwgJm91dFdyYXAucCwgJmluV3JhcC5wLCBwcm9ncmVzcyA/ICZwcm9ncmVzc1dyYXAucCA6IE5VTEwpOw0KKyAgaWYgKHJlcyA9PSBTWl9FUlJPUl9SRUFEICYmIGluV3JhcC5SZXMgIT0gU19PSykNCisgICAgcmV0dXJuIGluV3JhcC5SZXM7DQorICBpZiAocmVzID09IFNaX0VSUk9SX1dSSVRFICYmIG91dFdyYXAuUmVzICE9IFNfT0spDQorICAgIHJldHVybiBvdXRXcmFwLlJlczsNCisgIGlmIChyZXMgPT0gU1pfRVJST1JfUFJPR1JFU1MgJiYgcHJvZ3Jlc3NXcmFwLlJlcyAhPSBTX09LKQ0KKyAgICByZXR1cm4gcHJvZ3Jlc3NXcmFwLlJlczsNCisgIHJldHVybiBTUmVzVG9IUkVTVUxUKHJlcyk7DQorfQ0KKyAgDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbXByZXNzL0x6bWEyRW5jb2Rlci5oIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Mem1hMkVuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzQzNzAyCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Mem1hMkVuY29kZXIuaApAQCAtMCwwICsxLDM2IEBACisvLyBMem1hMkVuY29kZXIuaA0KKw0KKyNpZm5kZWYgX19MWk1BMl9FTkNPREVSX0gNCisjZGVmaW5lIF9fTFpNQTJfRU5DT0RFUl9IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0MvTHptYTJFbmMuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL015Q29tLmgiDQorDQorI2luY2x1ZGUgIi4uL0lDb2Rlci5oIg0KKw0KK25hbWVzcGFjZSBOQ29tcHJlc3Mgew0KK25hbWVzcGFjZSBOTHptYTIgew0KKw0KK2NsYXNzIENFbmNvZGVyOg0KKyAgcHVibGljIElDb21wcmVzc0NvZGVyLA0KKyAgcHVibGljIElDb21wcmVzc1NldENvZGVyUHJvcGVydGllcywNCisgIHB1YmxpYyBJQ29tcHJlc3NXcml0ZUNvZGVyUHJvcGVydGllcywNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KKyAgQ0x6bWEyRW5jSGFuZGxlIF9lbmNvZGVyOw0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QMihJQ29tcHJlc3NTZXRDb2RlclByb3BlcnRpZXMsIElDb21wcmVzc1dyaXRlQ29kZXJQcm9wZXJ0aWVzKQ0KKyANCisgIFNURE1FVEhPRChDb2RlKShJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSwgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSwNCisgICAgICBjb25zdCBVSW50NjQgKmluU2l6ZSwgY29uc3QgVUludDY0ICpvdXRTaXplLCBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKTsNCisgIFNURE1FVEhPRChTZXRDb2RlclByb3BlcnRpZXMpKGNvbnN0IFBST1BJRCAqcHJvcElEcywgY29uc3QgUFJPUFZBUklBTlQgKnByb3BzLCBVSW50MzIgbnVtUHJvcHMpOw0KKyAgU1RETUVUSE9EKFdyaXRlQ29kZXJQcm9wZXJ0aWVzKShJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtKTsNCisNCisgIENFbmNvZGVyKCk7DQorICB2aXJ0dWFsIH5DRW5jb2RlcigpOw0KK307DQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbXByZXNzL0x6bWEyUmVnaXN0ZXIuY3BwIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Mem1hMlJlZ2lzdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODQzMGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Mem1hMlJlZ2lzdGVyLmNwcApAQCAtMCwwICsxLDIwIEBACisvLyBMem1hMlJlZ2lzdGVyLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL1JlZ2lzdGVyQ29kZWMuaCINCisNCisjaW5jbHVkZSAiTHptYTJEZWNvZGVyLmgiDQorDQorc3RhdGljIHZvaWQgKkNyZWF0ZUNvZGVjKCkgeyByZXR1cm4gKHZvaWQgKikoSUNvbXByZXNzQ29kZXIgKikobmV3IE5Db21wcmVzczo6Tkx6bWEyOjpDRGVjb2Rlcik7IH0NCisjaWZuZGVmIEVYVFJBQ1RfT05MWQ0KKyNpbmNsdWRlICJMem1hMkVuY29kZXIuaCINCitzdGF0aWMgdm9pZCAqQ3JlYXRlQ29kZWNPdXQoKSB7IHJldHVybiAodm9pZCAqKShJQ29tcHJlc3NDb2RlciAqKShuZXcgTkNvbXByZXNzOjpOTHptYTI6OkNFbmNvZGVyKTsgIH0NCisjZWxzZQ0KKyNkZWZpbmUgQ3JlYXRlQ29kZWNPdXQgMA0KKyNlbmRpZg0KKw0KK3N0YXRpYyBDQ29kZWNJbmZvIGdfQ29kZWNJbmZvID0NCisgIHsgQ3JlYXRlQ29kZWMsIENyZWF0ZUNvZGVjT3V0LCAweDIxLCBMIkxaTUEyIiwgMSwgZmFsc2UgfTsNCisNCitSRUdJU1RFUl9DT0RFQyhMWk1BMikNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbXByZXNzL0x6bWFEZWNvZGVyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvTHptYURlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZmI3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0x6bWFEZWNvZGVyLmNwcApAQCAtMCwwICsxLDI2NiBAQAorLy8gTHptYURlY29kZXIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0FsbG9jLmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9TdHJlYW1VdGlscy5oIg0KKw0KKyNpbmNsdWRlICJMem1hRGVjb2Rlci5oIg0KKw0KK3N0YXRpYyBIUkVTVUxUIFNSZXNUb0hSRVNVTFQoU1JlcyByZXMpDQorew0KKyAgc3dpdGNoKHJlcykNCisgIHsNCisgICAgY2FzZSBTWl9PSzogcmV0dXJuIFNfT0s7DQorICAgIGNhc2UgU1pfRVJST1JfTUVNOiByZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisgICAgY2FzZSBTWl9FUlJPUl9QQVJBTTogcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgY2FzZSBTWl9FUlJPUl9VTlNVUFBPUlRFRDogcmV0dXJuIEVfTk9USU1QTDsNCisgICAgY2FzZSBTWl9FUlJPUl9EQVRBOiByZXR1cm4gU19GQUxTRTsNCisgIH0NCisgIHJldHVybiBFX0ZBSUw7DQorfQ0KKw0KK25hbWVzcGFjZSBOQ29tcHJlc3Mgew0KK25hbWVzcGFjZSBOTHptYSB7DQorDQorQ0RlY29kZXI6OkNEZWNvZGVyKCk6IF9pbkJ1ZigwKSwgX3Byb3BzV2VyZVNldChmYWxzZSksIF9vdXRTaXplRGVmaW5lZChmYWxzZSksDQorICBfaW5CdWZTaXplKDEgPDwgMjApLA0KKyAgX291dEJ1ZlNpemUoMSA8PCAyMiksDQorICBGaW5pc2hTdHJlYW0oZmFsc2UpLA0KKyAgTmVlZE1vcmVJbnB1dChmYWxzZSkNCit7DQorICBfaW5TaXplUHJvY2Vzc2VkID0gMDsNCisgIF9pblBvcyA9IF9pblNpemUgPSAwOw0KKyAgTHptYURlY19Db25zdHJ1Y3QoJl9zdGF0ZSk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkICpTekFsbG9jKHZvaWQgKnAsIHNpemVfdCBzaXplKSB7IHAgPSBwOyByZXR1cm4gTXlBbGxvYyhzaXplKTsgfQ0KK3N0YXRpYyB2b2lkIFN6RnJlZSh2b2lkICpwLCB2b2lkICphZGRyZXNzKSB7IHAgPSBwOyBNeUZyZWUoYWRkcmVzcyk7IH0NCitzdGF0aWMgSVN6QWxsb2MgZ19BbGxvYyA9IHsgU3pBbGxvYywgU3pGcmVlIH07DQorDQorQ0RlY29kZXI6On5DRGVjb2RlcigpDQorew0KKyAgTHptYURlY19GcmVlKCZfc3RhdGUsICZnX0FsbG9jKTsNCisgIE15RnJlZShfaW5CdWYpOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0RlY29kZXI6OlNldEluQnVmU2l6ZShVSW50MzIgLCBVSW50MzIgc2l6ZSkgeyBfaW5CdWZTaXplID0gc2l6ZTsgcmV0dXJuIFNfT0s7IH0NCitTVERNRVRIT0RJTVAgQ0RlY29kZXI6OlNldE91dEJ1ZlNpemUoVUludDMyICwgVUludDMyIHNpemUpIHsgX291dEJ1ZlNpemUgPSBzaXplOyByZXR1cm4gU19PSzsgfQ0KKw0KK0hSRVNVTFQgQ0RlY29kZXI6OkNyZWF0ZUlucHV0QnVmZmVyKCkNCit7DQorICBpZiAoX2luQnVmID09IDAgfHwgX2luQnVmU2l6ZSAhPSBfaW5CdWZTaXplQWxsb2NhdGVkKQ0KKyAgew0KKyAgICBNeUZyZWUoX2luQnVmKTsNCisgICAgX2luQnVmID0gKEJ5dGUgKilNeUFsbG9jKF9pbkJ1ZlNpemUpOw0KKyAgICBpZiAoX2luQnVmID09IDApDQorICAgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7DQorICAgIF9pbkJ1ZlNpemVBbGxvY2F0ZWQgPSBfaW5CdWZTaXplOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRGVjb2Rlcjo6U2V0RGVjb2RlclByb3BlcnRpZXMyKGNvbnN0IEJ5dGUgKnByb3AsIFVJbnQzMiBzaXplKQ0KK3sNCisgIFJJTk9LKFNSZXNUb0hSRVNVTFQoTHptYURlY19BbGxvY2F0ZSgmX3N0YXRlLCBwcm9wLCBzaXplLCAmZ19BbGxvYykpKTsNCisgIF9wcm9wc1dlcmVTZXQgPSB0cnVlOw0KKyAgcmV0dXJuIENyZWF0ZUlucHV0QnVmZmVyKCk7DQorfQ0KKw0KK3ZvaWQgQ0RlY29kZXI6OlNldE91dFN0cmVhbVNpemVSZXN1bWUoY29uc3QgVUludDY0ICpvdXRTaXplKQ0KK3sNCisgIF9vdXRTaXplRGVmaW5lZCA9IChvdXRTaXplICE9IE5VTEwpOw0KKyAgaWYgKF9vdXRTaXplRGVmaW5lZCkNCisgICAgX291dFNpemUgPSAqb3V0U2l6ZTsNCisgIF9vdXRTaXplUHJvY2Vzc2VkID0gMDsNCisgIF93clBvcyA9IDA7DQorICBMem1hRGVjX0luaXQoJl9zdGF0ZSk7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRGVjb2Rlcjo6U2V0T3V0U3RyZWFtU2l6ZShjb25zdCBVSW50NjQgKm91dFNpemUpDQorew0KKyAgX2luU2l6ZVByb2Nlc3NlZCA9IDA7DQorICBfaW5Qb3MgPSBfaW5TaXplID0gMDsNCisgIE5lZWRNb3JlSW5wdXQgPSBmYWxzZTsNCisgIFNldE91dFN0cmVhbVNpemVSZXN1bWUob3V0U2l6ZSk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDRGVjb2Rlcjo6Q29kZVNwZWMoSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0sIElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpDQorew0KKyAgaWYgKF9pbkJ1ZiA9PSAwIHx8ICFfcHJvcHNXZXJlU2V0KQ0KKyAgICByZXR1cm4gU19GQUxTRTsNCisNCisgIFVJbnQ2NCBzdGFydEluUHJvZ3Jlc3MgPSBfaW5TaXplUHJvY2Vzc2VkOw0KKw0KKyAgU2l6ZVQgbmV4dCA9IChfc3RhdGUuZGljQnVmU2l6ZSAtIF9zdGF0ZS5kaWNQb3MgPCBfb3V0QnVmU2l6ZSkgPyBfc3RhdGUuZGljQnVmU2l6ZSA6IChfc3RhdGUuZGljUG9zICsgX291dEJ1ZlNpemUpOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgaWYgKF9pblBvcyA9PSBfaW5TaXplKQ0KKyAgICB7DQorICAgICAgX2luUG9zID0gX2luU2l6ZSA9IDA7DQorICAgICAgUklOT0soaW5TdHJlYW0tPlJlYWQoX2luQnVmLCBfaW5CdWZTaXplQWxsb2NhdGVkLCAmX2luU2l6ZSkpOw0KKyAgICB9DQorDQorICAgIFNpemVUIGRpY1BvcyA9IF9zdGF0ZS5kaWNQb3M7DQorICAgIFNpemVUIGN1clNpemUgPSBuZXh0IC0gZGljUG9zOw0KKyAgICANCisgICAgRUx6bWFGaW5pc2hNb2RlIGZpbmlzaE1vZGUgPSBMWk1BX0ZJTklTSF9BTlk7DQorICAgIGlmIChfb3V0U2l6ZURlZmluZWQpDQorICAgIHsNCisgICAgICBjb25zdCBVSW50NjQgcmVtID0gX291dFNpemUgLSBfb3V0U2l6ZVByb2Nlc3NlZDsNCisgICAgICBpZiAocmVtIDw9IGN1clNpemUpDQorICAgICAgew0KKyAgICAgICAgY3VyU2l6ZSA9IChTaXplVClyZW07DQorICAgICAgICBpZiAoRmluaXNoU3RyZWFtKQ0KKyAgICAgICAgICBmaW5pc2hNb2RlID0gTFpNQV9GSU5JU0hfRU5EOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBTaXplVCBpblNpemVQcm9jZXNzZWQgPSBfaW5TaXplIC0gX2luUG9zOw0KKyAgICBFTHptYVN0YXR1cyBzdGF0dXM7DQorICAgIFNSZXMgcmVzID0gTHptYURlY19EZWNvZGVUb0RpYygmX3N0YXRlLCBkaWNQb3MgKyBjdXJTaXplLCBfaW5CdWYgKyBfaW5Qb3MsICZpblNpemVQcm9jZXNzZWQsIGZpbmlzaE1vZGUsICZzdGF0dXMpOw0KKw0KKyAgICBfaW5Qb3MgKz0gKFVJbnQzMilpblNpemVQcm9jZXNzZWQ7DQorICAgIF9pblNpemVQcm9jZXNzZWQgKz0gaW5TaXplUHJvY2Vzc2VkOw0KKyAgICBTaXplVCBvdXRTaXplUHJvY2Vzc2VkID0gX3N0YXRlLmRpY1BvcyAtIGRpY1BvczsNCisgICAgX291dFNpemVQcm9jZXNzZWQgKz0gb3V0U2l6ZVByb2Nlc3NlZDsNCisNCisgICAgYm9vbCBmaW5pc2hlZCA9IChpblNpemVQcm9jZXNzZWQgPT0gMCAmJiBvdXRTaXplUHJvY2Vzc2VkID09IDApOw0KKyAgICBib29sIHN0b3BEZWNvZGluZyA9IChfb3V0U2l6ZURlZmluZWQgJiYgX291dFNpemVQcm9jZXNzZWQgPj0gX291dFNpemUpOw0KKw0KKyAgICBpZiAocmVzICE9IDAgfHwgX3N0YXRlLmRpY1BvcyA9PSBuZXh0IHx8IGZpbmlzaGVkIHx8IHN0b3BEZWNvZGluZykNCisgICAgew0KKyAgICAgIEhSRVNVTFQgcmVzMiA9IFdyaXRlU3RyZWFtKG91dFN0cmVhbSwgX3N0YXRlLmRpYyArIF93clBvcywgX3N0YXRlLmRpY1BvcyAtIF93clBvcyk7DQorDQorICAgICAgX3dyUG9zID0gX3N0YXRlLmRpY1BvczsNCisgICAgICBpZiAoX3N0YXRlLmRpY1BvcyA9PSBfc3RhdGUuZGljQnVmU2l6ZSkNCisgICAgICB7DQorICAgICAgICBfc3RhdGUuZGljUG9zID0gMDsNCisgICAgICAgIF93clBvcyA9IDA7DQorICAgICAgfQ0KKyAgICAgIG5leHQgPSAoX3N0YXRlLmRpY0J1ZlNpemUgLSBfc3RhdGUuZGljUG9zIDwgX291dEJ1ZlNpemUpID8gX3N0YXRlLmRpY0J1ZlNpemUgOiAoX3N0YXRlLmRpY1BvcyArIF9vdXRCdWZTaXplKTsNCisNCisgICAgICBpZiAocmVzICE9IDApDQorICAgICAgICByZXR1cm4gU19GQUxTRTsNCisgICAgICBSSU5PSyhyZXMyKTsNCisgICAgICBpZiAoc3RvcERlY29kaW5nKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChzdGF0dXMgPT0gTFpNQV9TVEFUVVNfTkVFRFNfTU9SRV9JTlBVVCkNCisgICAgICAgICAgTmVlZE1vcmVJbnB1dCA9IHRydWU7DQorICAgICAgICBpZiAoRmluaXNoU3RyZWFtICYmDQorICAgICAgICAgICAgICBzdGF0dXMgIT0gTFpNQV9TVEFUVVNfRklOSVNIRURfV0lUSF9NQVJLICYmDQorICAgICAgICAgICAgICBzdGF0dXMgIT0gTFpNQV9TVEFUVVNfTUFZQkVfRklOSVNIRURfV0lUSE9VVF9NQVJLKQ0KKyAgICAgICAgICByZXR1cm4gU19GQUxTRTsNCisgICAgICAgIHJldHVybiBTX09LOw0KKyAgICAgIH0NCisgICAgICBpZiAoZmluaXNoZWQpDQorICAgICAgew0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBMWk1BX1NUQVRVU19ORUVEU19NT1JFX0lOUFVUKQ0KKyAgICAgICAgICBOZWVkTW9yZUlucHV0ID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiAoc3RhdHVzID09IExaTUFfU1RBVFVTX0ZJTklTSEVEX1dJVEhfTUFSSyA/IFNfT0sgOiBTX0ZBTFNFKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKHByb2dyZXNzKQ0KKyAgICB7DQorICAgICAgVUludDY0IGluU2l6ZSA9IF9pblNpemVQcm9jZXNzZWQgLSBzdGFydEluUHJvZ3Jlc3M7DQorICAgICAgUklOT0socHJvZ3Jlc3MtPlNldFJhdGlvSW5mbygmaW5TaXplLCAmX291dFNpemVQcm9jZXNzZWQpKTsNCisgICAgfQ0KKyAgfQ0KK30NCisNCitTVERNRVRIT0RJTVAgQ0RlY29kZXI6OkNvZGUoSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0sIElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sDQorICAgIGNvbnN0IFVJbnQ2NCAqIC8qIGluU2l6ZSAqLywgY29uc3QgVUludDY0ICpvdXRTaXplLCBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKQ0KK3sNCisgIGlmIChfaW5CdWYgPT0gMCkNCisgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgIFNldE91dFN0cmVhbVNpemUob3V0U2l6ZSk7DQorICByZXR1cm4gQ29kZVNwZWMoaW5TdHJlYW0sIG91dFN0cmVhbSwgcHJvZ3Jlc3MpOw0KK30NCisNCisjaWZuZGVmIE5PX1JFQURfRlJPTV9DT0RFUg0KKw0KK1NURE1FVEhPRElNUCBDRGVjb2Rlcjo6U2V0SW5TdHJlYW0oSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0pIHsgX2luU3RyZWFtID0gaW5TdHJlYW07IHJldHVybiBTX09LOyB9DQorU1RETUVUSE9ESU1QIENEZWNvZGVyOjpSZWxlYXNlSW5TdHJlYW0oKSB7IF9pblN0cmVhbS5SZWxlYXNlKCk7IHJldHVybiBTX09LOyB9DQorDQorU1RETUVUSE9ESU1QIENEZWNvZGVyOjpSZWFkKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgaWYgKHByb2Nlc3NlZFNpemUpDQorICAgICpwcm9jZXNzZWRTaXplID0gMDsNCisgIGRvDQorICB7DQorICAgIGlmIChfaW5Qb3MgPT0gX2luU2l6ZSkNCisgICAgew0KKyAgICAgIF9pblBvcyA9IF9pblNpemUgPSAwOw0KKyAgICAgIFJJTk9LKF9pblN0cmVhbS0+UmVhZChfaW5CdWYsIF9pbkJ1ZlNpemVBbGxvY2F0ZWQsICZfaW5TaXplKSk7DQorICAgIH0NCisgICAgew0KKyAgICAgIFNpemVUIGluUHJvY2Vzc2VkID0gX2luU2l6ZSAtIF9pblBvczsNCisNCisgICAgICBpZiAoX291dFNpemVEZWZpbmVkKQ0KKyAgICAgIHsNCisgICAgICAgIGNvbnN0IFVJbnQ2NCByZW0gPSBfb3V0U2l6ZSAtIF9vdXRTaXplUHJvY2Vzc2VkOw0KKyAgICAgICAgaWYgKHJlbSA8IHNpemUpDQorICAgICAgICAgIHNpemUgPSAoVUludDMyKXJlbTsNCisgICAgICB9DQorDQorICAgICAgU2l6ZVQgb3V0UHJvY2Vzc2VkID0gc2l6ZTsNCisgICAgICBFTHptYVN0YXR1cyBzdGF0dXM7DQorICAgICAgU1JlcyByZXMgPSBMem1hRGVjX0RlY29kZVRvQnVmKCZfc3RhdGUsIChCeXRlICopZGF0YSwgJm91dFByb2Nlc3NlZCwNCisgICAgICAgICAgX2luQnVmICsgX2luUG9zLCAmaW5Qcm9jZXNzZWQsIExaTUFfRklOSVNIX0FOWSwgJnN0YXR1cyk7DQorICAgICAgX2luUG9zICs9IChVSW50MzIpaW5Qcm9jZXNzZWQ7DQorICAgICAgX2luU2l6ZVByb2Nlc3NlZCArPSBpblByb2Nlc3NlZDsNCisgICAgICBfb3V0U2l6ZVByb2Nlc3NlZCArPSBvdXRQcm9jZXNzZWQ7DQorICAgICAgc2l6ZSAtPSAoVUludDMyKW91dFByb2Nlc3NlZDsNCisgICAgICBkYXRhID0gKEJ5dGUgKilkYXRhICsgb3V0UHJvY2Vzc2VkOw0KKyAgICAgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAgICAgKnByb2Nlc3NlZFNpemUgKz0gKFVJbnQzMilvdXRQcm9jZXNzZWQ7DQorICAgICAgUklOT0soU1Jlc1RvSFJFU1VMVChyZXMpKTsNCisgICAgICBpZiAoaW5Qcm9jZXNzZWQgPT0gMCAmJiBvdXRQcm9jZXNzZWQgPT0gMCkNCisgICAgICAgIHJldHVybiBTX09LOw0KKyAgICB9DQorICB9DQorICB3aGlsZSAoc2l6ZSAhPSAwKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENEZWNvZGVyOjpDb2RlUmVzdW1lKElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sIGNvbnN0IFVJbnQ2NCAqb3V0U2l6ZSwgSUNvbXByZXNzUHJvZ3Jlc3NJbmZvICpwcm9ncmVzcykNCit7DQorICBTZXRPdXRTdHJlYW1TaXplUmVzdW1lKG91dFNpemUpOw0KKyAgcmV0dXJuIENvZGVTcGVjKF9pblN0cmVhbSwgb3V0U3RyZWFtLCBwcm9ncmVzcyk7DQorfQ0KKw0KK0hSRVNVTFQgQ0RlY29kZXI6OlJlYWRGcm9tSW5wdXRTdHJlYW0odm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBSSU5PSyhDcmVhdGVJbnB1dEJ1ZmZlcigpKTsNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IDA7DQorICB3aGlsZSAoc2l6ZSA+IDApDQorICB7DQorICAgIGlmIChfaW5Qb3MgPT0gX2luU2l6ZSkNCisgICAgew0KKyAgICAgIF9pblBvcyA9IF9pblNpemUgPSAwOw0KKyAgICAgIFJJTk9LKF9pblN0cmVhbS0+UmVhZChfaW5CdWYsIF9pbkJ1ZlNpemVBbGxvY2F0ZWQsICZfaW5TaXplKSk7DQorICAgICAgaWYgKF9pblNpemUgPT0gMCkNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHsNCisgICAgICBVSW50MzIgY3VyU2l6ZSA9IF9pblNpemUgLSBfaW5Qb3M7DQorICAgICAgaWYgKGN1clNpemUgPiBzaXplKQ0KKyAgICAgICAgY3VyU2l6ZSA9IHNpemU7DQorICAgICAgbWVtY3B5KGRhdGEsIF9pbkJ1ZiArIF9pblBvcywgY3VyU2l6ZSk7DQorICAgICAgX2luUG9zICs9IGN1clNpemU7DQorICAgICAgX2luU2l6ZVByb2Nlc3NlZCArPSBjdXJTaXplOw0KKyAgICAgIHNpemUgLT0gY3VyU2l6ZTsNCisgICAgICBkYXRhID0gKEJ5dGUgKilkYXRhICsgY3VyU2l6ZTsNCisgICAgICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgICAgICpwcm9jZXNzZWRTaXplICs9IGN1clNpemU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCisjZW5kaWYNCisNCit9fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvTHptYURlY29kZXIuaCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvTHptYURlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTFmYmY5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Mem1hRGVjb2Rlci5oCkBAIC0wLDAgKzEsODggQEAKKy8vIEx6bWFEZWNvZGVyLmgNCisNCisjaWZuZGVmIF9fTFpNQV9ERUNPREVSX0gNCisjZGVmaW5lIF9fTFpNQV9ERUNPREVSX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQy9Mem1hRGVjLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKyNpbmNsdWRlICIuLi9JQ29kZXIuaCINCisNCituYW1lc3BhY2UgTkNvbXByZXNzIHsNCituYW1lc3BhY2UgTkx6bWEgew0KKw0KK2NsYXNzIENEZWNvZGVyOg0KKyAgcHVibGljIElDb21wcmVzc0NvZGVyLA0KKyAgcHVibGljIElDb21wcmVzc1NldERlY29kZXJQcm9wZXJ0aWVzMiwNCisgIHB1YmxpYyBJQ29tcHJlc3NTZXRCdWZTaXplLA0KKyAgI2lmbmRlZiBOT19SRUFEX0ZST01fQ09ERVINCisgIHB1YmxpYyBJQ29tcHJlc3NTZXRJblN0cmVhbSwNCisgIHB1YmxpYyBJQ29tcHJlc3NTZXRPdXRTdHJlYW1TaXplLA0KKyAgcHVibGljIElTZXF1ZW50aWFsSW5TdHJlYW0sDQorICAjZW5kaWYNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IF9pblN0cmVhbTsNCisgIEJ5dGUgKl9pbkJ1ZjsNCisgIFVJbnQzMiBfaW5Qb3M7DQorICBVSW50MzIgX2luU2l6ZTsNCisgIENMem1hRGVjIF9zdGF0ZTsNCisgIGJvb2wgX3Byb3BzV2VyZVNldDsNCisgIGJvb2wgX291dFNpemVEZWZpbmVkOw0KKyAgVUludDY0IF9vdXRTaXplOw0KKyAgVUludDY0IF9pblNpemVQcm9jZXNzZWQ7DQorICBVSW50NjQgX291dFNpemVQcm9jZXNzZWQ7DQorDQorICBVSW50MzIgX2luQnVmU2l6ZUFsbG9jYXRlZDsNCisgIFVJbnQzMiBfaW5CdWZTaXplOw0KKyAgVUludDMyIF9vdXRCdWZTaXplOw0KKyAgU2l6ZVQgX3dyUG9zOw0KKw0KKyAgSFJFU1VMVCBDcmVhdGVJbnB1dEJ1ZmZlcigpOw0KKyAgSFJFU1VMVCBDb2RlU3BlYyhJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSwgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSwgSUNvbXByZXNzUHJvZ3Jlc3NJbmZvICpwcm9ncmVzcyk7DQorICB2b2lkIFNldE91dFN0cmVhbVNpemVSZXN1bWUoY29uc3QgVUludDY0ICpvdXRTaXplKTsNCisNCitwdWJsaWM6DQorICBNWV9RVUVSWUlOVEVSRkFDRV9CRUdJTjIoSUNvbXByZXNzQ29kZXIpDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShJQ29tcHJlc3NTZXREZWNvZGVyUHJvcGVydGllczIpDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShJQ29tcHJlc3NTZXRCdWZTaXplKQ0KKyAgI2lmbmRlZiBOT19SRUFEX0ZST01fQ09ERVINCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKElDb21wcmVzc1NldEluU3RyZWFtKQ0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoSUNvbXByZXNzU2V0T3V0U3RyZWFtU2l6ZSkNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKElTZXF1ZW50aWFsSW5TdHJlYW0pDQorICAjZW5kaWYNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VORA0KKyAgTVlfQUREUkVGX1JFTEVBU0UNCisNCisgIFNURE1FVEhPRChDb2RlKShJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSwgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSwNCisgICAgICBjb25zdCBVSW50NjQgKmluU2l6ZSwgY29uc3QgVUludDY0ICpvdXRTaXplLCBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKTsNCisgIFNURE1FVEhPRChTZXREZWNvZGVyUHJvcGVydGllczIpKGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsNCisgIFNURE1FVEhPRChTZXRPdXRTdHJlYW1TaXplKShjb25zdCBVSW50NjQgKm91dFNpemUpOw0KKyAgU1RETUVUSE9EKFNldEluQnVmU2l6ZSkoVUludDMyIHN0cmVhbUluZGV4LCBVSW50MzIgc2l6ZSk7DQorICBTVERNRVRIT0QoU2V0T3V0QnVmU2l6ZSkoVUludDMyIHN0cmVhbUluZGV4LCBVSW50MzIgc2l6ZSk7DQorDQorICAjaWZuZGVmIE5PX1JFQURfRlJPTV9DT0RFUg0KKyAgDQorICBTVERNRVRIT0QoU2V0SW5TdHJlYW0pKElTZXF1ZW50aWFsSW5TdHJlYW0gKmluU3RyZWFtKTsNCisgIFNURE1FVEhPRChSZWxlYXNlSW5TdHJlYW0pKCk7DQorICBTVERNRVRIT0QoUmVhZCkodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorDQorICBIUkVTVUxUIENvZGVSZXN1bWUoSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSwgY29uc3QgVUludDY0ICpvdXRTaXplLCBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKTsNCisgIEhSRVNVTFQgUmVhZEZyb21JbnB1dFN0cmVhbSh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCisgIFVJbnQ2NCBHZXRJbnB1dFByb2Nlc3NlZFNpemUoKSBjb25zdCB7IHJldHVybiBfaW5TaXplUHJvY2Vzc2VkOyB9DQorDQorICAjZW5kaWYNCisNCisgIGJvb2wgRmluaXNoU3RyZWFtOyAvLyBzZXQgaXQgYmVmb3JlIGRlY29kaW5nLCBpZiB5b3UgbmVlZCB0byBkZWNvZGUgZnVsbCBMWk1BIHN0cmVhbQ0KKyAgDQorICBib29sIE5lZWRNb3JlSW5wdXQ7IC8vIGl0J3Mgc2V0IGJ5IGRlY29kZXIsIGlmIGl0IG5lZWRzIG1vcmUgaW5wdXQgZGF0YSB0byBkZWNvZGUgc3RyZWFtDQorDQorICBDRGVjb2RlcigpOw0KKyAgdmlydHVhbCB+Q0RlY29kZXIoKTsNCisNCisgIFVJbnQ2NCBHZXRPdXRwdXRQcm9jZXNzZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX291dFNpemVQcm9jZXNzZWQ7IH0NCit9Ow0KKw0KK319DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Mem1hRW5jb2Rlci5jcHAgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0x6bWFFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmZlYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Mem1hRW5jb2Rlci5jcHAKQEAgLTAsMCArMSwxNjEgQEAKKy8vIEx6bWFFbmNvZGVyLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQy9BbGxvYy5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vQ1dyYXBwZXJzLmgiDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9TdHJlYW1VdGlscy5oIg0KKw0KKyNpbmNsdWRlICJMem1hRW5jb2Rlci5oIg0KKw0KK25hbWVzcGFjZSBOQ29tcHJlc3Mgew0KK25hbWVzcGFjZSBOTHptYSB7DQorDQorc3RhdGljIHZvaWQgKlN6QmlnQWxsb2Modm9pZCAqLCBzaXplX3Qgc2l6ZSkgeyByZXR1cm4gQmlnQWxsb2Moc2l6ZSk7IH0NCitzdGF0aWMgdm9pZCBTekJpZ0ZyZWUodm9pZCAqLCB2b2lkICphZGRyZXNzKSB7IEJpZ0ZyZWUoYWRkcmVzcyk7IH0NCitzdGF0aWMgSVN6QWxsb2MgZ19CaWdBbGxvYyA9IHsgU3pCaWdBbGxvYywgU3pCaWdGcmVlIH07DQorDQorc3RhdGljIHZvaWQgKlN6QWxsb2Modm9pZCAqLCBzaXplX3Qgc2l6ZSkgeyByZXR1cm4gTXlBbGxvYyhzaXplKTsgfQ0KK3N0YXRpYyB2b2lkIFN6RnJlZSh2b2lkICosIHZvaWQgKmFkZHJlc3MpIHsgTXlGcmVlKGFkZHJlc3MpOyB9DQorc3RhdGljIElTekFsbG9jIGdfQWxsb2MgPSB7IFN6QWxsb2MsIFN6RnJlZSB9Ow0KKw0KK0NFbmNvZGVyOjpDRW5jb2RlcigpDQorew0KKyAgX2VuY29kZXIgPSAwOw0KKyAgX2VuY29kZXIgPSBMem1hRW5jX0NyZWF0ZSgmZ19BbGxvYyk7DQorICBpZiAoX2VuY29kZXIgPT0gMCkNCisgICAgdGhyb3cgMTsNCit9DQorDQorQ0VuY29kZXI6On5DRW5jb2RlcigpDQorew0KKyAgaWYgKF9lbmNvZGVyICE9IDApDQorICAgIEx6bWFFbmNfRGVzdHJveShfZW5jb2RlciwgJmdfQWxsb2MsICZnX0JpZ0FsbG9jKTsNCit9DQorDQoraW5saW5lIHdjaGFyX3QgR2V0VXBwZXJDaGFyKHdjaGFyX3QgYykNCit7DQorICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpDQorICAgIGMgLT0gMHgyMDsNCisgIHJldHVybiBjOw0KK30NCisNCitzdGF0aWMgaW50IFBhcnNlTWF0Y2hGaW5kZXIoY29uc3Qgd2NoYXJfdCAqcywgaW50ICpidE1vZGUsIGludCAqbnVtSGFzaEJ5dGVzKQ0KK3sNCisgIHdjaGFyX3QgYyA9IEdldFVwcGVyQ2hhcigqcysrKTsNCisgIGlmIChjID09IEwnSCcpDQorICB7DQorICAgIGlmIChHZXRVcHBlckNoYXIoKnMrKykgIT0gTCdDJykNCisgICAgICByZXR1cm4gMDsNCisgICAgaW50IG51bUhhc2hCeXRlc0xvYyA9IChpbnQpKCpzKysgLSBMJzAnKTsNCisgICAgaWYgKG51bUhhc2hCeXRlc0xvYyA8IDQgfHwgbnVtSGFzaEJ5dGVzTG9jID4gNCkNCisgICAgICByZXR1cm4gMDsNCisgICAgaWYgKCpzKysgIT0gMCkNCisgICAgICByZXR1cm4gMDsNCisgICAgKmJ0TW9kZSA9IDA7DQorICAgICpudW1IYXNoQnl0ZXMgPSBudW1IYXNoQnl0ZXNMb2M7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgaWYgKGMgIT0gTCdCJykNCisgICAgcmV0dXJuIDA7DQorDQorICBpZiAoR2V0VXBwZXJDaGFyKCpzKyspICE9IEwnVCcpDQorICAgIHJldHVybiAwOw0KKyAgaW50IG51bUhhc2hCeXRlc0xvYyA9IChpbnQpKCpzKysgLSBMJzAnKTsNCisgIGlmIChudW1IYXNoQnl0ZXNMb2MgPCAyIHx8IG51bUhhc2hCeXRlc0xvYyA+IDQpDQorICAgIHJldHVybiAwOw0KKyAgYyA9IEdldFVwcGVyQ2hhcigqcysrKTsNCisgIGlmIChjICE9IEwnXDAnKQ0KKyAgICByZXR1cm4gMDsNCisgICpidE1vZGUgPSAxOw0KKyAgKm51bUhhc2hCeXRlcyA9IG51bUhhc2hCeXRlc0xvYzsNCisgIHJldHVybiAxOw0KK30NCisNCisjZGVmaW5lIFNFVF9QUk9QXzMyKF9pZF8sIF9kZXN0XykgY2FzZSBOQ29kZXJQcm9wSUQ6Ol9pZF86IGVwLl9kZXN0XyA9IHY7IGJyZWFrOw0KKw0KK0hSRVNVTFQgU2V0THptYVByb3AoUFJPUElEIHByb3BJRCwgY29uc3QgUFJPUFZBUklBTlQgJnByb3AsIENMem1hRW5jUHJvcHMgJmVwKQ0KK3sNCisgIGlmIChwcm9wSUQgPT0gTkNvZGVyUHJvcElEOjprTWF0Y2hGaW5kZXIpDQorICB7DQorICAgIGlmIChwcm9wLnZ0ICE9IFZUX0JTVFIpDQorICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgcmV0dXJuIFBhcnNlTWF0Y2hGaW5kZXIocHJvcC5ic3RyVmFsLCAmZXAuYnRNb2RlLCAmZXAubnVtSGFzaEJ5dGVzKSA/IFNfT0sgOiBFX0lOVkFMSURBUkc7DQorICB9DQorICBpZiAocHJvcElEID4gTkNvZGVyUHJvcElEOjprUmVkdWNlU2l6ZSkNCisgICAgcmV0dXJuIFNfT0s7DQorICBpZiAocHJvcElEID09IE5Db2RlclByb3BJRDo6a1JlZHVjZVNpemUpDQorICB7DQorICAgIGlmIChwcm9wLnZ0ID09IFZUX1VJOCkNCisgICAgICBlcC5yZWR1Y2VTaXplID0gcHJvcC51aFZhbC5RdWFkUGFydDsNCisgICAgcmV0dXJuIFNfT0s7DQorICB9DQorICBpZiAocHJvcC52dCAhPSBWVF9VSTQpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICBVSW50MzIgdiA9IHByb3AudWxWYWw7DQorICBzd2l0Y2ggKHByb3BJRCkNCisgIHsNCisgICAgY2FzZSBOQ29kZXJQcm9wSUQ6OmtEZWZhdWx0UHJvcDogaWYgKHYgPiAzMSkgcmV0dXJuIEVfSU5WQUxJREFSRzsgZXAuZGljdFNpemUgPSAoVUludDMyKTEgPDwgKHVuc2lnbmVkKXY7IGJyZWFrOw0KKyAgICBTRVRfUFJPUF8zMihrTGV2ZWwsIGxldmVsKQ0KKyAgICBTRVRfUFJPUF8zMihrTnVtRmFzdEJ5dGVzLCBmYikNCisgICAgU0VUX1BST1BfMzIoa01hdGNoRmluZGVyQ3ljbGVzLCBtYykNCisgICAgU0VUX1BST1BfMzIoa0FsZ29yaXRobSwgYWxnbykNCisgICAgU0VUX1BST1BfMzIoa0RpY3Rpb25hcnlTaXplLCBkaWN0U2l6ZSkNCisgICAgU0VUX1BST1BfMzIoa1Bvc1N0YXRlQml0cywgcGIpDQorICAgIFNFVF9QUk9QXzMyKGtMaXRQb3NCaXRzLCBscCkNCisgICAgU0VUX1BST1BfMzIoa0xpdENvbnRleHRCaXRzLCBsYykNCisgICAgU0VUX1BST1BfMzIoa051bVRocmVhZHMsIG51bVRocmVhZHMpDQorICAgIGRlZmF1bHQ6IHJldHVybiBFX0lOVkFMSURBUkc7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENFbmNvZGVyOjpTZXRDb2RlclByb3BlcnRpZXMoY29uc3QgUFJPUElEICpwcm9wSURzLA0KKyAgICBjb25zdCBQUk9QVkFSSUFOVCAqY29kZXJQcm9wcywgVUludDMyIG51bVByb3BzKQ0KK3sNCisgIENMem1hRW5jUHJvcHMgcHJvcHM7DQorICBMem1hRW5jUHJvcHNfSW5pdCgmcHJvcHMpOw0KKw0KKyAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBudW1Qcm9wczsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCBQUk9QVkFSSUFOVCAmcHJvcCA9IGNvZGVyUHJvcHNbaV07DQorICAgIFBST1BJRCBwcm9wSUQgPSBwcm9wSURzW2ldOw0KKyAgICBzd2l0Y2ggKHByb3BJRCkNCisgICAgew0KKyAgICAgIGNhc2UgTkNvZGVyUHJvcElEOjprRW5kTWFya2VyOg0KKyAgICAgICAgaWYgKHByb3AudnQgIT0gVlRfQk9PTCkgcmV0dXJuIEVfSU5WQUxJREFSRzsgcHJvcHMud3JpdGVFbmRNYXJrID0gKHByb3AuYm9vbFZhbCAhPSBWQVJJQU5UX0ZBTFNFKTsgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIFJJTk9LKFNldEx6bWFQcm9wKHByb3BJRCwgcHJvcCwgcHJvcHMpKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFNSZXNUb0hSRVNVTFQoTHptYUVuY19TZXRQcm9wcyhfZW5jb2RlciwgJnByb3BzKSk7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRW5jb2Rlcjo6V3JpdGVDb2RlclByb3BlcnRpZXMoSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSkNCit7DQorICBCeXRlIHByb3BzW0xaTUFfUFJPUFNfU0laRV07DQorICBzaXplX3Qgc2l6ZSA9IExaTUFfUFJPUFNfU0laRTsNCisgIFJJTk9LKEx6bWFFbmNfV3JpdGVQcm9wZXJ0aWVzKF9lbmNvZGVyLCBwcm9wcywgJnNpemUpKTsNCisgIHJldHVybiBXcml0ZVN0cmVhbShvdXRTdHJlYW0sIHByb3BzLCBzaXplKTsNCit9DQorDQorU1RETUVUSE9ESU1QIENFbmNvZGVyOjpDb2RlKElTZXF1ZW50aWFsSW5TdHJlYW0gKmluU3RyZWFtLCBJU2VxdWVudGlhbE91dFN0cmVhbSAqb3V0U3RyZWFtLA0KKyAgICBjb25zdCBVSW50NjQgKiAvKiBpblNpemUgKi8sIGNvbnN0IFVJbnQ2NCAqIC8qIG91dFNpemUgKi8sIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpDQorew0KKyAgQ1NlcUluU3RyZWFtV3JhcCBpbldyYXAoaW5TdHJlYW0pOw0KKyAgQ1NlcU91dFN0cmVhbVdyYXAgb3V0V3JhcChvdXRTdHJlYW0pOw0KKyAgQ0NvbXByZXNzUHJvZ3Jlc3NXcmFwIHByb2dyZXNzV3JhcChwcm9ncmVzcyk7DQorDQorICBTUmVzIHJlcyA9IEx6bWFFbmNfRW5jb2RlKF9lbmNvZGVyLCAmb3V0V3JhcC5wLCAmaW5XcmFwLnAsIHByb2dyZXNzID8gJnByb2dyZXNzV3JhcC5wIDogTlVMTCwgJmdfQWxsb2MsICZnX0JpZ0FsbG9jKTsNCisgIF9pbnB1dFByb2Nlc3NlZCA9IGluV3JhcC5Qcm9jZXNzZWQ7DQorICBpZiAocmVzID09IFNaX0VSUk9SX1JFQUQgJiYgaW5XcmFwLlJlcyAhPSBTX09LKQ0KKyAgICByZXR1cm4gaW5XcmFwLlJlczsNCisgIGlmIChyZXMgPT0gU1pfRVJST1JfV1JJVEUgJiYgb3V0V3JhcC5SZXMgIT0gU19PSykNCisgICAgcmV0dXJuIG91dFdyYXAuUmVzOw0KKyAgaWYgKHJlcyA9PSBTWl9FUlJPUl9QUk9HUkVTUyAmJiBwcm9ncmVzc1dyYXAuUmVzICE9IFNfT0spDQorICAgIHJldHVybiBwcm9ncmVzc1dyYXAuUmVzOw0KKyAgcmV0dXJuIFNSZXNUb0hSRVNVTFQocmVzKTsNCit9DQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbXByZXNzL0x6bWFFbmNvZGVyLmggYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0x6bWFFbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiMzBhOQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvTHptYUVuY29kZXIuaApAQCAtMCwwICsxLDM4IEBACisvLyBMem1hRW5jb2Rlci5oDQorDQorI2lmbmRlZiBfX0xaTUFfRU5DT0RFUl9IDQorI2RlZmluZSBfX0xaTUFfRU5DT0RFUl9IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0MvTHptYUVuYy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlDb20uaCINCisNCisjaW5jbHVkZSAiLi4vSUNvZGVyLmgiDQorDQorbmFtZXNwYWNlIE5Db21wcmVzcyB7DQorbmFtZXNwYWNlIE5Mem1hIHsNCisNCitjbGFzcyBDRW5jb2RlcjoNCisgIHB1YmxpYyBJQ29tcHJlc3NDb2RlciwNCisgIHB1YmxpYyBJQ29tcHJlc3NTZXRDb2RlclByb3BlcnRpZXMsDQorICBwdWJsaWMgSUNvbXByZXNzV3JpdGVDb2RlclByb3BlcnRpZXMsDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIENMem1hRW5jSGFuZGxlIF9lbmNvZGVyOw0KKyAgVUludDY0IF9pbnB1dFByb2Nlc3NlZDsNCitwdWJsaWM6DQorICBNWV9VTktOT1dOX0lNUDIoSUNvbXByZXNzU2V0Q29kZXJQcm9wZXJ0aWVzLCBJQ29tcHJlc3NXcml0ZUNvZGVyUHJvcGVydGllcykNCisgICAgDQorICBTVERNRVRIT0QoQ29kZSkoSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0sIElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sDQorICAgICAgY29uc3QgVUludDY0ICppblNpemUsIGNvbnN0IFVJbnQ2NCAqb3V0U2l6ZSwgSUNvbXByZXNzUHJvZ3Jlc3NJbmZvICpwcm9ncmVzcyk7DQorICBTVERNRVRIT0QoU2V0Q29kZXJQcm9wZXJ0aWVzKShjb25zdCBQUk9QSUQgKnByb3BJRHMsIGNvbnN0IFBST1BWQVJJQU5UICpwcm9wcywgVUludDMyIG51bVByb3BzKTsNCisgIFNURE1FVEhPRChXcml0ZUNvZGVyUHJvcGVydGllcykoSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSk7DQorDQorICBDRW5jb2RlcigpOw0KKyAgdmlydHVhbCB+Q0VuY29kZXIoKTsNCisgIFVJbnQ2NCBHZXRJbnB1dFByb2Nlc3NlZFNpemUoKSBjb25zdCB7IHJldHVybiBfaW5wdXRQcm9jZXNzZWQ7IH0NCit9Ow0KKw0KK319DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Mem1hUmVnaXN0ZXIuY3BwIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9Mem1hUmVnaXN0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNjdlYWYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL0x6bWFSZWdpc3Rlci5jcHAKQEAgLTAsMCArMSwyMCBAQAorLy8gTHptYVJlZ2lzdGVyLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL1JlZ2lzdGVyQ29kZWMuaCINCisNCisjaW5jbHVkZSAiTHptYURlY29kZXIuaCINCisNCitzdGF0aWMgdm9pZCAqQ3JlYXRlQ29kZWMoKSB7IHJldHVybiAodm9pZCAqKShJQ29tcHJlc3NDb2RlciAqKShuZXcgTkNvbXByZXNzOjpOTHptYTo6Q0RlY29kZXIpOyB9DQorI2lmbmRlZiBFWFRSQUNUX09OTFkNCisjaW5jbHVkZSAiTHptYUVuY29kZXIuaCINCitzdGF0aWMgdm9pZCAqQ3JlYXRlQ29kZWNPdXQoKSB7IHJldHVybiAodm9pZCAqKShJQ29tcHJlc3NDb2RlciAqKShuZXcgTkNvbXByZXNzOjpOTHptYTo6Q0VuY29kZXIpOyAgfQ0KKyNlbHNlDQorI2RlZmluZSBDcmVhdGVDb2RlY091dCAwDQorI2VuZGlmDQorDQorc3RhdGljIENDb2RlY0luZm8gZ19Db2RlY0luZm8gPQ0KKyAgeyBDcmVhdGVDb2RlYywgQ3JlYXRlQ29kZWNPdXQsIDB4MDMwMTAxLCBMIkxaTUEiLCAxLCBmYWxzZSB9Ow0KKw0KK1JFR0lTVEVSX0NPREVDKExaTUEpDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9QcG1kRGVjb2Rlci5jcHAgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL1BwbWREZWNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzczMTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9QcG1kRGVjb2Rlci5jcHAKQEAgLTAsMCArMSwxNjcgQEAKKy8vIFBwbWREZWNvZGVyLmNwcA0KKy8vIDIwMDktMDMtMTEgOiBJZ29yIFBhdmxvdiA6IFB1YmxpYyBkb21haW4NCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0MvQWxsb2MuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQy9DcHVBcmNoLmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9TdHJlYW1VdGlscy5oIg0KKw0KKyNpbmNsdWRlICJQcG1kRGVjb2Rlci5oIg0KKw0KK25hbWVzcGFjZSBOQ29tcHJlc3Mgew0KK25hbWVzcGFjZSBOUHBtZCB7DQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrQnVmU2l6ZSA9ICgxIDw8IDIwKTsNCisNCitlbnVtDQorew0KKyAga1N0YXR1c19OZWVkSW5pdCwNCisgIGtTdGF0dXNfTm9ybWFsLA0KKyAga1N0YXR1c19GaW5pc2hlZCwNCisgIGtTdGF0dXNfRXJyb3INCit9Ow0KKw0KK3N0YXRpYyB2b2lkICpTekJpZ0FsbG9jKHZvaWQgKiwgc2l6ZV90IHNpemUpIHsgcmV0dXJuIEJpZ0FsbG9jKHNpemUpOyB9DQorc3RhdGljIHZvaWQgU3pCaWdGcmVlKHZvaWQgKiwgdm9pZCAqYWRkcmVzcykgeyBCaWdGcmVlKGFkZHJlc3MpOyB9DQorc3RhdGljIElTekFsbG9jIGdfQmlnQWxsb2MgPSB7IFN6QmlnQWxsb2MsIFN6QmlnRnJlZSB9Ow0KKw0KK0NEZWNvZGVyOjp+Q0RlY29kZXIoKQ0KK3sNCisgIDo6TWlkRnJlZShfb3V0QnVmKTsNCisgIFBwbWQ3X0ZyZWUoJl9wcG1kLCAmZ19CaWdBbGxvYyk7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRGVjb2Rlcjo6U2V0RGVjb2RlclByb3BlcnRpZXMyKGNvbnN0IEJ5dGUgKnByb3BzLCBVSW50MzIgc2l6ZSkNCit7DQorICBpZiAoc2l6ZSA8IDUpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICBfb3JkZXIgPSBwcm9wc1swXTsNCisgIFVJbnQzMiBtZW1TaXplID0gR2V0VWkzMihwcm9wcyArIDEpOw0KKyAgaWYgKF9vcmRlciA8IFBQTUQ3X01JTl9PUkRFUiB8fA0KKyAgICAgIF9vcmRlciA+IFBQTUQ3X01BWF9PUkRFUiB8fA0KKyAgICAgIG1lbVNpemUgPCBQUE1EN19NSU5fTUVNX1NJWkUgfHwNCisgICAgICBtZW1TaXplID4gUFBNRDdfTUFYX01FTV9TSVpFKQ0KKyAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgaWYgKCFfaW5TdHJlYW0uQWxsb2MoMSA8PCAyMCkpDQorICAgIHJldHVybiBFX09VVE9GTUVNT1JZOw0KKyAgaWYgKCFQcG1kN19BbGxvYygmX3BwbWQsIG1lbVNpemUsICZnX0JpZ0FsbG9jKSkNCisgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDRGVjb2Rlcjo6Q29kZVNwZWMoQnl0ZSAqbWVtU3RyZWFtLCBVSW50MzIgc2l6ZSkNCit7DQorICBzd2l0Y2goX3N0YXR1cykNCisgIHsNCisgICAgY2FzZSBrU3RhdHVzX0ZpbmlzaGVkOiByZXR1cm4gU19PSzsNCisgICAgY2FzZSBrU3RhdHVzX0Vycm9yOiByZXR1cm4gU19GQUxTRTsNCisgICAgY2FzZSBrU3RhdHVzX05lZWRJbml0Og0KKyAgICAgIF9pblN0cmVhbS5Jbml0KCk7DQorICAgICAgaWYgKCFQcG1kN3pfUmFuZ2VEZWNfSW5pdCgmX3JhbmdlRGVjKSkNCisgICAgICB7DQorICAgICAgICBfc3RhdHVzID0ga1N0YXR1c19FcnJvcjsNCisgICAgICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgICAgIH0NCisgICAgICBfc3RhdHVzID0ga1N0YXR1c19Ob3JtYWw7DQorICAgICAgUHBtZDdfSW5pdCgmX3BwbWQsIF9vcmRlcik7DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAoX291dFNpemVEZWZpbmVkKQ0KKyAgew0KKyAgICBjb25zdCBVSW50NjQgcmVtID0gX291dFNpemUgLSBfcHJvY2Vzc2VkU2l6ZTsNCisgICAgaWYgKHNpemUgPiByZW0pDQorICAgICAgc2l6ZSA9IChVSW50MzIpcmVtOw0KKyAgfQ0KKw0KKyAgVUludDMyIGk7DQorICBpbnQgc3ltID0gMDsNCisgIGZvciAoaSA9IDA7IGkgIT0gc2l6ZTsgaSsrKQ0KKyAgew0KKyAgICBzeW0gPSBQcG1kN19EZWNvZGVTeW1ib2woJl9wcG1kLCAmX3JhbmdlRGVjLnApOw0KKyAgICBpZiAoX2luU3RyZWFtLkV4dHJhIHx8IHN5bSA8IDApDQorICAgICAgYnJlYWs7DQorICAgIG1lbVN0cmVhbVtpXSA9IChCeXRlKXN5bTsNCisgIH0NCisNCisgIF9wcm9jZXNzZWRTaXplICs9IGk7DQorICBpZiAoX2luU3RyZWFtLkV4dHJhKQ0KKyAgew0KKyAgICBfc3RhdHVzID0ga1N0YXR1c19FcnJvcjsNCisgICAgcmV0dXJuIF9pblN0cmVhbS5SZXM7DQorICB9DQorICBpZiAoc3ltIDwgMCkNCisgICAgX3N0YXR1cyA9IChzeW0gPCAtMSkgPyBrU3RhdHVzX0Vycm9yIDoga1N0YXR1c19GaW5pc2hlZDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0RlY29kZXI6OkNvZGUoSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0sIElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sDQorICAgIGNvbnN0IFVJbnQ2NCAqIC8qIGluU2l6ZSAqLywgY29uc3QgVUludDY0ICpvdXRTaXplLCBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKQ0KK3sNCisgIGlmICghX291dEJ1ZikNCisgIHsNCisgICAgX291dEJ1ZiA9IChCeXRlICopOjpNaWRBbGxvYyhrQnVmU2l6ZSk7DQorICAgIGlmICghX291dEJ1ZikNCisgICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisgIH0NCisgIA0KKyAgX2luU3RyZWFtLlN0cmVhbSA9IGluU3RyZWFtOw0KKyAgU2V0T3V0U3RyZWFtU2l6ZShvdXRTaXplKTsNCisNCisgIGRvDQorICB7DQorICAgIGNvbnN0IFVJbnQ2NCBzdGFydFBvcyA9IF9wcm9jZXNzZWRTaXplOw0KKyAgICBIUkVTVUxUIHJlcyA9IENvZGVTcGVjKF9vdXRCdWYsIGtCdWZTaXplKTsNCisgICAgc2l6ZV90IHByb2Nlc3NlZCA9IChzaXplX3QpKF9wcm9jZXNzZWRTaXplIC0gc3RhcnRQb3MpOw0KKyAgICBSSU5PSyhXcml0ZVN0cmVhbShvdXRTdHJlYW0sIF9vdXRCdWYsIHByb2Nlc3NlZCkpOw0KKyAgICBSSU5PSyhyZXMpOw0KKyAgICBpZiAoX3N0YXR1cyA9PSBrU3RhdHVzX0ZpbmlzaGVkKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBpZiAocHJvZ3Jlc3MpDQorICAgIHsNCisgICAgICBVSW50NjQgaW5TaXplID0gX2luU3RyZWFtLkdldFByb2Nlc3NlZCgpOw0KKyAgICAgIFJJTk9LKHByb2dyZXNzLT5TZXRSYXRpb0luZm8oJmluU2l6ZSwgJl9wcm9jZXNzZWRTaXplKSk7DQorICAgIH0NCisgIH0NCisgIHdoaWxlICghX291dFNpemVEZWZpbmVkIHx8IF9wcm9jZXNzZWRTaXplIDwgX291dFNpemUpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRGVjb2Rlcjo6U2V0T3V0U3RyZWFtU2l6ZShjb25zdCBVSW50NjQgKm91dFNpemUpDQorew0KKyAgX291dFNpemVEZWZpbmVkID0gKG91dFNpemUgIT0gTlVMTCk7DQorICBpZiAoX291dFNpemVEZWZpbmVkKQ0KKyAgICBfb3V0U2l6ZSA9ICpvdXRTaXplOw0KKyAgX3Byb2Nlc3NlZFNpemUgPSAwOw0KKyAgX3N0YXR1cyA9IGtTdGF0dXNfTmVlZEluaXQ7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorI2lmbmRlZiBOT19SRUFEX0ZST01fQ09ERVINCisNCitTVERNRVRIT0RJTVAgQ0RlY29kZXI6OlNldEluU3RyZWFtKElTZXF1ZW50aWFsSW5TdHJlYW0gKmluU3RyZWFtKQ0KK3sNCisgIEluU2VxU3RyZWFtID0gaW5TdHJlYW07DQorICBfaW5TdHJlYW0uU3RyZWFtID0gaW5TdHJlYW07DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENEZWNvZGVyOjpSZWxlYXNlSW5TdHJlYW0oKQ0KK3sNCisgIEluU2VxU3RyZWFtLlJlbGVhc2UoKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0RlY29kZXI6OlJlYWQodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkNCit7DQorICBjb25zdCBVSW50NjQgc3RhcnRQb3MgPSBfcHJvY2Vzc2VkU2l6ZTsNCisgIEhSRVNVTFQgcmVzID0gQ29kZVNwZWMoKEJ5dGUgKilkYXRhLCBzaXplKTsNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IChVSW50MzIpKF9wcm9jZXNzZWRTaXplIC0gc3RhcnRQb3MpOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorI2VuZGlmDQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbXByZXNzL1BwbWREZWNvZGVyLmggYi9sem1hL0NQUC83emlwL0NvbXByZXNzL1BwbWREZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxZDFkMAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvUHBtZERlY29kZXIuaApAQCAtMCwwICsxLDc4IEBACisvLyBQcG1kRGVjb2Rlci5oDQorLy8gMjAwOS0wMy0xMSA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbg0KKw0KKyNpZm5kZWYgX19DT01QUkVTU19QUE1EX0RFQ09ERVJfSA0KKyNkZWZpbmUgX19DT01QUkVTU19QUE1EX0RFQ09ERVJfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL1BwbWQ3LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vQ1dyYXBwZXJzLmgiDQorDQorI2luY2x1ZGUgIi4uL0lDb2Rlci5oIg0KKw0KK25hbWVzcGFjZSBOQ29tcHJlc3Mgew0KK25hbWVzcGFjZSBOUHBtZCB7DQorDQorY2xhc3MgQ0RlY29kZXIgOg0KKyAgcHVibGljIElDb21wcmVzc0NvZGVyLA0KKyAgcHVibGljIElDb21wcmVzc1NldERlY29kZXJQcm9wZXJ0aWVzMiwNCisgICNpZm5kZWYgTk9fUkVBRF9GUk9NX0NPREVSDQorICBwdWJsaWMgSUNvbXByZXNzU2V0SW5TdHJlYW0sDQorICBwdWJsaWMgSUNvbXByZXNzU2V0T3V0U3RyZWFtU2l6ZSwNCisgIHB1YmxpYyBJU2VxdWVudGlhbEluU3RyZWFtLA0KKyAgI2VuZGlmDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIEJ5dGUgKl9vdXRCdWY7DQorICBDUHBtZDd6X1JhbmdlRGVjIF9yYW5nZURlYzsNCisgIENCeXRlSW5CdWZXcmFwIF9pblN0cmVhbTsNCisgIENQcG1kNyBfcHBtZDsNCisNCisgIEJ5dGUgX29yZGVyOw0KKyAgYm9vbCBfb3V0U2l6ZURlZmluZWQ7DQorICBpbnQgX3N0YXR1czsNCisgIFVJbnQ2NCBfb3V0U2l6ZTsNCisgIFVJbnQ2NCBfcHJvY2Vzc2VkU2l6ZTsNCisNCisgIEhSRVNVTFQgQ29kZVNwZWMoQnl0ZSAqbWVtU3RyZWFtLCBVSW50MzIgc2l6ZSk7DQorDQorcHVibGljOg0KKw0KKyAgI2lmbmRlZiBOT19SRUFEX0ZST01fQ09ERVINCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbEluU3RyZWFtPiBJblNlcVN0cmVhbTsNCisgIE1ZX1VOS05PV05fSU1QNCgNCisgICAgICBJQ29tcHJlc3NTZXREZWNvZGVyUHJvcGVydGllczIsDQorICAgICAgSUNvbXByZXNzU2V0SW5TdHJlYW0sDQorICAgICAgSUNvbXByZXNzU2V0T3V0U3RyZWFtU2l6ZSwNCisgICAgICBJU2VxdWVudGlhbEluU3RyZWFtKQ0KKyAgI2Vsc2UNCisgIE1ZX1VOS05PV05fSU1QMSgNCisgICAgICBJQ29tcHJlc3NTZXREZWNvZGVyUHJvcGVydGllczIpDQorICAjZW5kaWYNCisNCisgIFNURE1FVEhPRChDb2RlKShJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSwgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSwNCisgICAgICBjb25zdCBVSW50NjQgKmluU2l6ZSwgY29uc3QgVUludDY0ICpvdXRTaXplLCBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKTsNCisgIFNURE1FVEhPRChTZXREZWNvZGVyUHJvcGVydGllczIpKGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsNCisgIFNURE1FVEhPRChTZXRPdXRTdHJlYW1TaXplKShjb25zdCBVSW50NjQgKm91dFNpemUpOw0KKw0KKyAgI2lmbmRlZiBOT19SRUFEX0ZST01fQ09ERVINCisgIFNURE1FVEhPRChTZXRJblN0cmVhbSkoSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0pOw0KKyAgU1RETUVUSE9EKFJlbGVhc2VJblN0cmVhbSkoKTsNCisgIFNURE1FVEhPRChSZWFkKSh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCisgICNlbmRpZg0KKw0KKyAgQ0RlY29kZXIoKTogX291dEJ1ZihOVUxMKSwgX291dFNpemVEZWZpbmVkKGZhbHNlKQ0KKyAgew0KKyAgICBQcG1kN3pfUmFuZ2VEZWNfQ3JlYXRlVlRhYmxlKCZfcmFuZ2VEZWMpOw0KKyAgICBfcmFuZ2VEZWMuU3RyZWFtID0gJl9pblN0cmVhbS5wOw0KKyAgICBQcG1kN19Db25zdHJ1Y3QoJl9wcG1kKTsNCisgIH0NCisNCisgIH5DRGVjb2RlcigpOw0KK307DQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbXByZXNzL1BwbWRFbmNvZGVyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvUHBtZEVuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzIwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL1BwbWRFbmNvZGVyLmNwcApAQCAtMCwwICsxLDE1NiBAQAorLy8gUHBtZEVuY29kZXIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0FsbG9jLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0MvQ3B1QXJjaC5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vU3RyZWFtVXRpbHMuaCINCisNCisjaW5jbHVkZSAiUHBtZEVuY29kZXIuaCINCisNCituYW1lc3BhY2UgTkNvbXByZXNzIHsNCituYW1lc3BhY2UgTlBwbWQgew0KKw0KK3N0YXRpYyBjb25zdCBVSW50MzIga0J1ZlNpemUgPSAoMSA8PCAyMCk7DQorDQorc3RhdGljIHZvaWQgKlN6QmlnQWxsb2Modm9pZCAqLCBzaXplX3Qgc2l6ZSkgeyByZXR1cm4gQmlnQWxsb2Moc2l6ZSk7IH0NCitzdGF0aWMgdm9pZCBTekJpZ0ZyZWUodm9pZCAqLCB2b2lkICphZGRyZXNzKSB7IEJpZ0ZyZWUoYWRkcmVzcyk7IH0NCitzdGF0aWMgSVN6QWxsb2MgZ19CaWdBbGxvYyA9IHsgU3pCaWdBbGxvYywgU3pCaWdGcmVlIH07DQorDQorc3RhdGljIGNvbnN0IEJ5dGUga09yZGVyc1sxMF0gPSB7IDMsIDQsIDQsIDUsIDUsIDYsIDgsIDE2LCAyNCwgMzIgfTsNCisNCit2b2lkIENFbmNQcm9wczo6Tm9ybWFsaXplKGludCBsZXZlbCkNCit7DQorICBpZiAobGV2ZWwgPCAwKSBsZXZlbCA9IDU7DQorICBpZiAobGV2ZWwgPiA5KSBsZXZlbCA9IDk7DQorICBpZiAoTWVtU2l6ZSA9PSAoVUludDMyKShJbnQzMiktMSkNCisgICAgTWVtU2l6ZSA9IGxldmVsID49IDkgPyAoKFVJbnQzMikxOTIgPDwgMjApIDogKChVSW50MzIpMSA8PCAobGV2ZWwgKyAxOSkpOw0KKyAgY29uc3QgdW5zaWduZWQga011bHQgPSAxNjsNCisgIGlmIChNZW1TaXplIC8ga011bHQgPiBSZWR1Y2VTaXplKQ0KKyAgew0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxNjsgaSA8PSAzMTsgaSsrKQ0KKyAgICB7DQorICAgICAgVUludDMyIG0gPSAoVUludDMyKTEgPDwgaTsNCisgICAgICBpZiAoUmVkdWNlU2l6ZSA8PSBtIC8ga011bHQpDQorICAgICAgew0KKyAgICAgICAgaWYgKE1lbVNpemUgPiBtKQ0KKyAgICAgICAgICBNZW1TaXplID0gbTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKE9yZGVyID09IC0xKSBPcmRlciA9IGtPcmRlcnNbbGV2ZWxdOw0KK30NCisNCitDRW5jb2Rlcjo6Q0VuY29kZXIoKToNCisgIF9pbkJ1ZihOVUxMKQ0KK3sNCisgIF9wcm9wcy5Ob3JtYWxpemUoLTEpOw0KKyAgX3JhbmdlRW5jLlN0cmVhbSA9ICZfb3V0U3RyZWFtLnA7DQorICBQcG1kN19Db25zdHJ1Y3QoJl9wcG1kKTsNCit9DQorDQorQ0VuY29kZXI6On5DRW5jb2RlcigpDQorew0KKyAgOjpNaWRGcmVlKF9pbkJ1Zik7DQorICBQcG1kN19GcmVlKCZfcHBtZCwgJmdfQmlnQWxsb2MpOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0VuY29kZXI6OlNldENvZGVyUHJvcGVydGllcyhjb25zdCBQUk9QSUQgKnByb3BJRHMsIGNvbnN0IFBST1BWQVJJQU5UICpjb2RlclByb3BzLCBVSW50MzIgbnVtUHJvcHMpDQorew0KKyAgaW50IGxldmVsID0gLTE7DQorICBDRW5jUHJvcHMgcHJvcHM7DQorICBmb3IgKFVJbnQzMiBpID0gMDsgaSA8IG51bVByb3BzOyBpKyspDQorICB7DQorICAgIGNvbnN0IFBST1BWQVJJQU5UICZwcm9wID0gY29kZXJQcm9wc1tpXTsNCisgICAgUFJPUElEIHByb3BJRCA9IHByb3BJRHNbaV07DQorICAgIGlmIChwcm9wSUQgPiBOQ29kZXJQcm9wSUQ6OmtSZWR1Y2VTaXplKQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICBpZiAocHJvcElEID09IE5Db2RlclByb3BJRDo6a1JlZHVjZVNpemUpDQorICAgIHsNCisgICAgICBpZiAocHJvcC52dCA9PSBWVF9VSTggJiYgcHJvcC51aFZhbC5RdWFkUGFydCA8IChVSW50MzIpKEludDMyKS0xKQ0KKyAgICAgICAgcHJvcHMuUmVkdWNlU2l6ZSA9IChVSW50MzIpcHJvcC51aFZhbC5RdWFkUGFydDsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAocHJvcC52dCAhPSBWVF9VSTQpDQorICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgVUludDMyIHYgPSAoVUludDMyKXByb3AudWxWYWw7DQorICAgIHN3aXRjaCAocHJvcElEKQ0KKyAgICB7DQorICAgICAgY2FzZSBOQ29kZXJQcm9wSUQ6OmtVc2VkTWVtb3J5U2l6ZToNCisgICAgICAgIGlmICh2IDwgKDEgPDwgMTYpIHx8IHYgPiBQUE1EN19NQVhfTUVNX1NJWkUgfHwgKHYgJiAzKSAhPSAwKQ0KKyAgICAgICAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKyAgICAgICAgcHJvcHMuTWVtU2l6ZSA9IHY7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIE5Db2RlclByb3BJRDo6a09yZGVyOg0KKyAgICAgICAgaWYgKHYgPCAyIHx8IHYgPiAzMikNCisgICAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgICAgIHByb3BzLk9yZGVyID0gKEJ5dGUpdjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgTkNvZGVyUHJvcElEOjprTnVtVGhyZWFkczogYnJlYWs7DQorICAgICAgY2FzZSBOQ29kZXJQcm9wSUQ6OmtMZXZlbDogbGV2ZWwgPSAoaW50KXY7IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6IHJldHVybiBFX0lOVkFMSURBUkc7DQorICAgIH0NCisgIH0NCisgIHByb3BzLk5vcm1hbGl6ZShsZXZlbCk7DQorICBfcHJvcHMgPSBwcm9wczsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0VuY29kZXI6OldyaXRlQ29kZXJQcm9wZXJ0aWVzKElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0pDQorew0KKyAgY29uc3QgVUludDMyIGtQcm9wU2l6ZSA9IDU7DQorICBCeXRlIHByb3BzW2tQcm9wU2l6ZV07DQorICBwcm9wc1swXSA9IChCeXRlKV9wcm9wcy5PcmRlcjsNCisgIFNldFVpMzIocHJvcHMgKyAxLCBfcHJvcHMuTWVtU2l6ZSk7DQorICByZXR1cm4gV3JpdGVTdHJlYW0ob3V0U3RyZWFtLCBwcm9wcywga1Byb3BTaXplKTsNCit9DQorDQorSFJFU1VMVCBDRW5jb2Rlcjo6Q29kZShJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSwgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSwNCisgICAgY29uc3QgVUludDY0ICogLyogaW5TaXplICovLCBjb25zdCBVSW50NjQgKiAvKiBvdXRTaXplICovLCBJQ29tcHJlc3NQcm9ncmVzc0luZm8gKnByb2dyZXNzKQ0KK3sNCisgIGlmICghX2luQnVmKQ0KKyAgew0KKyAgICBfaW5CdWYgPSAoQnl0ZSAqKTo6TWlkQWxsb2Moa0J1ZlNpemUpOw0KKyAgICBpZiAoIV9pbkJ1ZikNCisgICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisgIH0NCisgIGlmICghX291dFN0cmVhbS5BbGxvYygxIDw8IDIwKSkNCisgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7DQorICBpZiAoIVBwbWQ3X0FsbG9jKCZfcHBtZCwgX3Byb3BzLk1lbVNpemUsICZnX0JpZ0FsbG9jKSkNCisgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7DQorDQorICBfb3V0U3RyZWFtLlN0cmVhbSA9IG91dFN0cmVhbTsNCisgIF9vdXRTdHJlYW0uSW5pdCgpOw0KKw0KKyAgUHBtZDd6X1JhbmdlRW5jX0luaXQoJl9yYW5nZUVuYyk7DQorICBQcG1kN19Jbml0KCZfcHBtZCwgX3Byb3BzLk9yZGVyKTsNCisNCisgIFVJbnQ2NCBwcm9jZXNzZWQgPSAwOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgVUludDMyIHNpemU7DQorICAgIFJJTk9LKGluU3RyZWFtLT5SZWFkKF9pbkJ1Ziwga0J1ZlNpemUsICZzaXplKSk7DQorICAgIGlmIChzaXplID09IDApDQorICAgIHsNCisgICAgICAvLyBXZSBkb24ndCB3cml0ZSBFbmRNYXJrIGluIFBQTUQtN3ouDQorICAgICAgLy8gUHBtZDdfRW5jb2RlU3ltYm9sKCZfcHBtZCwgJl9yYW5nZUVuYywgLTEpOw0KKyAgICAgIFBwbWQ3el9SYW5nZUVuY19GbHVzaERhdGEoJl9yYW5nZUVuYyk7DQorICAgICAgcmV0dXJuIF9vdXRTdHJlYW0uRmx1c2goKTsNCisgICAgfQ0KKyAgICBmb3IgKFVJbnQzMiBpID0gMDsgaSA8IHNpemU7IGkrKykNCisgICAgew0KKyAgICAgIFBwbWQ3X0VuY29kZVN5bWJvbCgmX3BwbWQsICZfcmFuZ2VFbmMsIF9pbkJ1ZltpXSk7DQorICAgICAgUklOT0soX291dFN0cmVhbS5SZXMpOw0KKyAgICB9DQorICAgIHByb2Nlc3NlZCArPSBzaXplOw0KKyAgICBpZiAocHJvZ3Jlc3MpDQorICAgIHsNCisgICAgICBVSW50NjQgb3V0U2l6ZSA9IF9vdXRTdHJlYW0uR2V0UHJvY2Vzc2VkKCk7DQorICAgICAgUklOT0socHJvZ3Jlc3MtPlNldFJhdGlvSW5mbygmcHJvY2Vzc2VkLCAmb3V0U2l6ZSkpOw0KKyAgICB9DQorICB9DQorfQ0KKw0KK319DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9QcG1kRW5jb2Rlci5oIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9QcG1kRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Y2U0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL1BwbWRFbmNvZGVyLmgKQEAgLTAsMCArMSw1NyBAQAorLy8gUHBtZEVuY29kZXIuaA0KKw0KKyNpZm5kZWYgX19DT01QUkVTU19QUE1EX0VOQ09ERVJfSA0KKyNkZWZpbmUgX19DT01QUkVTU19QUE1EX0VOQ09ERVJfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL1BwbWQ3LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKw0KKyNpbmNsdWRlICIuLi9JQ29kZXIuaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0NXcmFwcGVycy5oIg0KKw0KK25hbWVzcGFjZSBOQ29tcHJlc3Mgew0KK25hbWVzcGFjZSBOUHBtZCB7DQorDQorc3RydWN0IENFbmNQcm9wcw0KK3sNCisgIFVJbnQzMiBNZW1TaXplOw0KKyAgVUludDMyIFJlZHVjZVNpemU7DQorICBpbnQgT3JkZXI7DQorICANCisgIENFbmNQcm9wcygpDQorICB7DQorICAgIE1lbVNpemUgPSAoVUludDMyKShJbnQzMiktMTsNCisgICAgUmVkdWNlU2l6ZSA9IChVSW50MzIpKEludDMyKS0xOw0KKyAgICBPcmRlciA9IC0xOw0KKyAgfQ0KKyAgdm9pZCBOb3JtYWxpemUoaW50IGxldmVsKTsNCit9Ow0KKw0KK2NsYXNzIENFbmNvZGVyIDoNCisgIHB1YmxpYyBJQ29tcHJlc3NDb2RlciwNCisgIHB1YmxpYyBJQ29tcHJlc3NTZXRDb2RlclByb3BlcnRpZXMsDQorICBwdWJsaWMgSUNvbXByZXNzV3JpdGVDb2RlclByb3BlcnRpZXMsDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIEJ5dGUgKl9pbkJ1ZjsNCisgIENCeXRlT3V0QnVmV3JhcCBfb3V0U3RyZWFtOw0KKyAgQ1BwbWQ3el9SYW5nZUVuYyBfcmFuZ2VFbmM7DQorICBDUHBtZDcgX3BwbWQ7DQorICBDRW5jUHJvcHMgX3Byb3BzOw0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QMigNCisgICAgICBJQ29tcHJlc3NTZXRDb2RlclByb3BlcnRpZXMsDQorICAgICAgSUNvbXByZXNzV3JpdGVDb2RlclByb3BlcnRpZXMpDQorICBTVERNRVRIT0QoQ29kZSkoSVNlcXVlbnRpYWxJblN0cmVhbSAqaW5TdHJlYW0sIElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0sDQorICAgICAgY29uc3QgVUludDY0ICppblNpemUsIGNvbnN0IFVJbnQ2NCAqb3V0U2l6ZSwgSUNvbXByZXNzUHJvZ3Jlc3NJbmZvICpwcm9ncmVzcyk7DQorICBTVERNRVRIT0QoU2V0Q29kZXJQcm9wZXJ0aWVzKShjb25zdCBQUk9QSUQgKnByb3BJRHMsIGNvbnN0IFBST1BWQVJJQU5UICpwcm9wcywgVUludDMyIG51bVByb3BzKTsNCisgIFNURE1FVEhPRChXcml0ZUNvZGVyUHJvcGVydGllcykoSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSk7DQorICBDRW5jb2RlcigpOw0KKyAgfkNFbmNvZGVyKCk7DQorfTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvUHBtZFJlZ2lzdGVyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvUHBtZFJlZ2lzdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmZkMDA3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9QcG1kUmVnaXN0ZXIuY3BwCkBAIC0wLDAgKzEsMjEgQEAKKy8vIFBwbWRSZWdpc3Rlci5jcHANCisvLyAyMDA5LTA1LTMwIDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vUmVnaXN0ZXJDb2RlYy5oIg0KKw0KKyNpbmNsdWRlICJQcG1kRGVjb2Rlci5oIg0KKw0KK3N0YXRpYyB2b2lkICpDcmVhdGVDb2RlYygpIHsgcmV0dXJuICh2b2lkICopKElDb21wcmVzc0NvZGVyICopKG5ldyBOQ29tcHJlc3M6Ok5QcG1kOjpDRGVjb2Rlcik7IH0NCisjaWZuZGVmIEVYVFJBQ1RfT05MWQ0KKyNpbmNsdWRlICJQcG1kRW5jb2Rlci5oIg0KK3N0YXRpYyB2b2lkICpDcmVhdGVDb2RlY091dCgpIHsgcmV0dXJuICh2b2lkICopKElDb21wcmVzc0NvZGVyICopKG5ldyBOQ29tcHJlc3M6Ok5QcG1kOjpDRW5jb2Rlcik7ICB9DQorI2Vsc2UNCisjZGVmaW5lIENyZWF0ZUNvZGVjT3V0IDANCisjZW5kaWYNCisNCitzdGF0aWMgQ0NvZGVjSW5mbyBnX0NvZGVjSW5mbyA9DQorICB7IENyZWF0ZUNvZGVjLCBDcmVhdGVDb2RlY091dCwgMHgwMzA0MDEsIEwiUFBNRCIsIDEsIGZhbHNlIH07DQorDQorUkVHSVNURVJfQ09ERUMoUFBNRCkNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NvbXByZXNzL1JhbmdlQ29kZXIuaCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvUmFuZ2VDb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjU0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NvbXByZXNzL1JhbmdlQ29kZXIuaApAQCAtMCwwICsxLDIwMSBAQAorLy8gQ29tcHJlc3MvUmFuZ2VDb2Rlci5oDQorLy8gMjAxMy0wMS0xMCA6IElnb3IgUGF2bG92IDogUHVibGljIGRvbWFpbg0KKw0KKyNpZm5kZWYgX19DT01QUkVTU19SQU5HRV9DT0RFUl9IDQorI2RlZmluZSBfX0NPTVBSRVNTX1JBTkdFX0NPREVSX0gNCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0luQnVmZmVyLmgiDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9PdXRCdWZmZXIuaCINCisNCituYW1lc3BhY2UgTkNvbXByZXNzIHsNCituYW1lc3BhY2UgTlJhbmdlQ29kZXIgew0KKw0KK2NvbnN0IHVuc2lnbmVkIGtOdW1Ub3BCaXRzID0gMjQ7DQorY29uc3QgVUludDMyIGtUb3BWYWx1ZSA9ICgxIDw8IGtOdW1Ub3BCaXRzKTsNCisNCitjbGFzcyBDRW5jb2Rlcg0KK3sNCisgIFVJbnQzMiBfY2FjaGVTaXplOw0KKyAgQnl0ZSBfY2FjaGU7DQorcHVibGljOg0KKyAgVUludDY0IExvdzsNCisgIFVJbnQzMiBSYW5nZTsNCisgIENPdXRCdWZmZXIgU3RyZWFtOw0KKyAgYm9vbCBDcmVhdGUoVUludDMyIGJ1ZlNpemUpIHsgcmV0dXJuIFN0cmVhbS5DcmVhdGUoYnVmU2l6ZSk7IH0NCisNCisgIHZvaWQgU2V0U3RyZWFtKElTZXF1ZW50aWFsT3V0U3RyZWFtICpzdHJlYW0pIHsgU3RyZWFtLlNldFN0cmVhbShzdHJlYW0pOyB9DQorICB2b2lkIEluaXQoKQ0KKyAgew0KKyAgICBTdHJlYW0uSW5pdCgpOw0KKyAgICBMb3cgPSAwOw0KKyAgICBSYW5nZSA9IDB4RkZGRkZGRkY7DQorICAgIF9jYWNoZVNpemUgPSAxOw0KKyAgICBfY2FjaGUgPSAwOw0KKyAgfQ0KKw0KKyAgdm9pZCBGbHVzaERhdGEoKQ0KKyAgew0KKyAgICAvLyBMb3cgKz0gMTsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspDQorICAgICAgU2hpZnRMb3coKTsNCisgIH0NCisNCisgIEhSRVNVTFQgRmx1c2hTdHJlYW0oKSB7IHJldHVybiBTdHJlYW0uRmx1c2goKTsgIH0NCisNCisgIHZvaWQgRW5jb2RlKFVJbnQzMiBzdGFydCwgVUludDMyIHNpemUsIFVJbnQzMiB0b3RhbCkNCisgIHsNCisgICAgTG93ICs9IHN0YXJ0ICogKFJhbmdlIC89IHRvdGFsKTsNCisgICAgUmFuZ2UgKj0gc2l6ZTsNCisgICAgd2hpbGUgKFJhbmdlIDwga1RvcFZhbHVlKQ0KKyAgICB7DQorICAgICAgUmFuZ2UgPDw9IDg7DQorICAgICAgU2hpZnRMb3coKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgdm9pZCBTaGlmdExvdygpDQorICB7DQorICAgIGlmICgoVUludDMyKUxvdyA8IChVSW50MzIpMHhGRjAwMDAwMCB8fCAodW5zaWduZWQpKExvdyA+PiAzMikgIT0gMCkNCisgICAgew0KKyAgICAgIEJ5dGUgdGVtcCA9IF9jYWNoZTsNCisgICAgICBkbw0KKyAgICAgIHsNCisgICAgICAgIFN0cmVhbS5Xcml0ZUJ5dGUoKEJ5dGUpKHRlbXAgKyAoQnl0ZSkoTG93ID4+IDMyKSkpOw0KKyAgICAgICAgdGVtcCA9IDB4RkY7DQorICAgICAgfQ0KKyAgICAgIHdoaWxlICgtLV9jYWNoZVNpemUgIT0gMCk7DQorICAgICAgX2NhY2hlID0gKEJ5dGUpKChVSW50MzIpTG93ID4+IDI0KTsNCisgICAgfQ0KKyAgICBfY2FjaGVTaXplKys7DQorICAgIExvdyA9IChVSW50MzIpTG93IDw8IDg7DQorICB9DQorICANCisgIHZvaWQgRW5jb2RlRGlyZWN0Qml0cyhVSW50MzIgdmFsdWUsIGludCBudW1CaXRzKQ0KKyAgew0KKyAgICBmb3IgKG51bUJpdHMtLTsgbnVtQml0cyA+PSAwOyBudW1CaXRzLS0pDQorICAgIHsNCisgICAgICBSYW5nZSA+Pj0gMTsNCisgICAgICBMb3cgKz0gUmFuZ2UgJiAoMCAtICgodmFsdWUgPj4gbnVtQml0cykgJiAxKSk7DQorICAgICAgaWYgKFJhbmdlIDwga1RvcFZhbHVlKQ0KKyAgICAgIHsNCisgICAgICAgIFJhbmdlIDw8PSA4Ow0KKyAgICAgICAgU2hpZnRMb3coKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIHZvaWQgRW5jb2RlQml0KFVJbnQzMiBzaXplMCwgVUludDMyIG51bVRvdGFsQml0cywgVUludDMyIHN5bWJvbCkNCisgIHsNCisgICAgVUludDMyIG5ld0JvdW5kID0gKFJhbmdlID4+IG51bVRvdGFsQml0cykgKiBzaXplMDsNCisgICAgaWYgKHN5bWJvbCA9PSAwKQ0KKyAgICAgIFJhbmdlID0gbmV3Qm91bmQ7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIExvdyArPSBuZXdCb3VuZDsNCisgICAgICBSYW5nZSAtPSBuZXdCb3VuZDsNCisgICAgfQ0KKyAgICB3aGlsZSAoUmFuZ2UgPCBrVG9wVmFsdWUpDQorICAgIHsNCisgICAgICBSYW5nZSA8PD0gODsNCisgICAgICBTaGlmdExvdygpOw0KKyAgICB9DQorICB9DQorDQorICBVSW50NjQgR2V0UHJvY2Vzc2VkU2l6ZSgpIHsgcmV0dXJuIFN0cmVhbS5HZXRQcm9jZXNzZWRTaXplKCkgKyBfY2FjaGVTaXplICsgNDsgfQ0KK307DQorDQorY2xhc3MgQ0RlY29kZXINCit7DQorcHVibGljOg0KKyAgQ0luQnVmZmVyIFN0cmVhbTsNCisgIFVJbnQzMiBSYW5nZTsNCisgIFVJbnQzMiBDb2RlOw0KKyAgYm9vbCBDcmVhdGUoVUludDMyIGJ1ZlNpemUpIHsgcmV0dXJuIFN0cmVhbS5DcmVhdGUoYnVmU2l6ZSk7IH0NCisNCisgIHZvaWQgTm9ybWFsaXplKCkNCisgIHsNCisgICAgd2hpbGUgKFJhbmdlIDwga1RvcFZhbHVlKQ0KKyAgICB7DQorICAgICAgQ29kZSA9IChDb2RlIDw8IDgpIHwgU3RyZWFtLlJlYWRCeXRlKCk7DQorICAgICAgUmFuZ2UgPDw9IDg7DQorICAgIH0NCisgIH0NCisgIA0KKyAgdm9pZCBTZXRTdHJlYW0oSVNlcXVlbnRpYWxJblN0cmVhbSAqc3RyZWFtKSB7IFN0cmVhbS5TZXRTdHJlYW0oc3RyZWFtKTsgfQ0KKyAgdm9pZCBJbml0KCkNCisgIHsNCisgICAgU3RyZWFtLkluaXQoKTsNCisgICAgQ29kZSA9IDA7DQorICAgIFJhbmdlID0gMHhGRkZGRkZGRjsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspDQorICAgICAgQ29kZSA9IChDb2RlIDw8IDgpIHwgU3RyZWFtLlJlYWRCeXRlKCk7DQorICB9DQorDQorICBVSW50MzIgR2V0VGhyZXNob2xkKFVJbnQzMiB0b3RhbCkNCisgIHsNCisgICAgcmV0dXJuIChDb2RlKSAvIChSYW5nZSAvPSB0b3RhbCk7DQorICB9DQorDQorICB2b2lkIERlY29kZShVSW50MzIgc3RhcnQsIFVJbnQzMiBzaXplKQ0KKyAgew0KKyAgICBDb2RlIC09IHN0YXJ0ICogUmFuZ2U7DQorICAgIFJhbmdlICo9IHNpemU7DQorICAgIE5vcm1hbGl6ZSgpOw0KKyAgfQ0KKw0KKyAgVUludDMyIERlY29kZURpcmVjdEJpdHMoaW50IG51bVRvdGFsQml0cykNCisgIHsNCisgICAgVUludDMyIHJhbmdlID0gUmFuZ2U7DQorICAgIFVJbnQzMiBjb2RlID0gQ29kZTsNCisgICAgVUludDMyIHJlc3VsdCA9IDA7DQorICAgIGZvciAoaW50IGkgPSBudW1Ub3RhbEJpdHM7IGkgIT0gMDsgaS0tKQ0KKyAgICB7DQorICAgICAgcmFuZ2UgPj49IDE7DQorICAgICAgLyoNCisgICAgICByZXN1bHQgPDw9IDE7DQorICAgICAgaWYgKGNvZGUgPj0gcmFuZ2UpDQorICAgICAgew0KKyAgICAgICAgY29kZSAtPSByYW5nZTsNCisgICAgICAgIHJlc3VsdCB8PSAxOw0KKyAgICAgIH0NCisgICAgICAqLw0KKyAgICAgIFVJbnQzMiB0ID0gKGNvZGUgLSByYW5nZSkgPj4gMzE7DQorICAgICAgY29kZSAtPSByYW5nZSAmICh0IC0gMSk7DQorICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCAxKSB8ICgxIC0gdCk7DQorDQorICAgICAgaWYgKHJhbmdlIDwga1RvcFZhbHVlKQ0KKyAgICAgIHsNCisgICAgICAgIGNvZGUgPSAoY29kZSA8PCA4KSB8IFN0cmVhbS5SZWFkQnl0ZSgpOw0KKyAgICAgICAgcmFuZ2UgPDw9IDg7DQorICAgICAgfQ0KKyAgICB9DQorICAgIFJhbmdlID0gcmFuZ2U7DQorICAgIENvZGUgPSBjb2RlOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgVUludDMyIERlY29kZUJpdChVSW50MzIgc2l6ZTAsIFVJbnQzMiBudW1Ub3RhbEJpdHMpDQorICB7DQorICAgIFVJbnQzMiBuZXdCb3VuZCA9IChSYW5nZSA+PiBudW1Ub3RhbEJpdHMpICogc2l6ZTA7DQorICAgIFVJbnQzMiBzeW1ib2w7DQorICAgIGlmIChDb2RlIDwgbmV3Qm91bmQpDQorICAgIHsNCisgICAgICBzeW1ib2wgPSAwOw0KKyAgICAgIFJhbmdlID0gbmV3Qm91bmQ7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgc3ltYm9sID0gMTsNCisgICAgICBDb2RlIC09IG5ld0JvdW5kOw0KKyAgICAgIFJhbmdlIC09IG5ld0JvdW5kOw0KKyAgICB9DQorICAgIE5vcm1hbGl6ZSgpOw0KKyAgICByZXR1cm4gc3ltYm9sOw0KKyAgfQ0KKw0KKyAgVUludDY0IEdldFByb2Nlc3NlZFNpemUoKSB7IHJldHVybiBTdHJlYW0uR2V0UHJvY2Vzc2VkU2l6ZSgpOyB9DQorfTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvUmFuZ2VDb2RlckJpdC5oIGIvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9SYW5nZUNvZGVyQml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3YThkZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvUmFuZ2VDb2RlckJpdC5oCkBAIC0wLDAgKzEsMTE0IEBACisvLyBDb21wcmVzcy9SYW5nZUNvZGVyQml0LmgNCisvLyAyMDEzLTAxLTEwIDogSWdvciBQYXZsb3YgOiBQdWJsaWMgZG9tYWluDQorDQorI2lmbmRlZiBfX0NPTVBSRVNTX1JBTkdFX0NPREVSX0JJVF9IDQorI2RlZmluZSBfX0NPTVBSRVNTX1JBTkdFX0NPREVSX0JJVF9IDQorDQorI2luY2x1ZGUgIlJhbmdlQ29kZXIuaCINCisNCituYW1lc3BhY2UgTkNvbXByZXNzIHsNCituYW1lc3BhY2UgTlJhbmdlQ29kZXIgew0KKw0KK2NvbnN0IHVuc2lnbmVkIGtOdW1CaXRNb2RlbFRvdGFsQml0cyA9IDExOw0KK2NvbnN0IFVJbnQzMiBrQml0TW9kZWxUb3RhbCA9ICgxIDw8IGtOdW1CaXRNb2RlbFRvdGFsQml0cyk7DQorDQorY29uc3QgdW5zaWduZWQga051bU1vdmVSZWR1Y2luZ0JpdHMgPSA0Ow0KKw0KK2NvbnN0IHVuc2lnbmVkIGtOdW1CaXRQcmljZVNoaWZ0Qml0cyA9IDQ7DQorY29uc3QgVUludDMyIGtCaXRQcmljZSA9IDEgPDwga051bUJpdFByaWNlU2hpZnRCaXRzOw0KKw0KK2V4dGVybiBVSW50MzIgUHJvYlByaWNlc1trQml0TW9kZWxUb3RhbCA+PiBrTnVtTW92ZVJlZHVjaW5nQml0c107DQorDQordGVtcGxhdGUgPHVuc2lnbmVkIG51bU1vdmVCaXRzPg0KK2NsYXNzIENCaXRNb2RlbA0KK3sNCitwdWJsaWM6DQorICBVSW50MzIgUHJvYjsNCisgIHZvaWQgVXBkYXRlTW9kZWwoVUludDMyIHN5bWJvbCkNCisgIHsNCisgICAgLyoNCisgICAgUHJvYiAtPSAoUHJvYiArICgoc3ltYm9sIC0gMSkgJiAoKDEgPDwgbnVtTW92ZUJpdHMpIC0gMSkpKSA+PiBudW1Nb3ZlQml0czsNCisgICAgUHJvYiArPSAoMSAtIHN5bWJvbCkgPDwgKGtOdW1CaXRNb2RlbFRvdGFsQml0cyAtIG51bU1vdmVCaXRzKTsNCisgICAgKi8NCisgICAgaWYgKHN5bWJvbCA9PSAwKQ0KKyAgICAgIFByb2IgKz0gKGtCaXRNb2RlbFRvdGFsIC0gUHJvYikgPj4gbnVtTW92ZUJpdHM7DQorICAgIGVsc2UNCisgICAgICBQcm9iIC09IChQcm9iKSA+PiBudW1Nb3ZlQml0czsNCisgIH0NCitwdWJsaWM6DQorICB2b2lkIEluaXQoKSB7IFByb2IgPSBrQml0TW9kZWxUb3RhbCAvIDI7IH0NCit9Ow0KKw0KK3RlbXBsYXRlIDx1bnNpZ25lZCBudW1Nb3ZlQml0cz4NCitjbGFzcyBDQml0RW5jb2RlcjogcHVibGljIENCaXRNb2RlbDxudW1Nb3ZlQml0cz4NCit7DQorcHVibGljOg0KKyAgdm9pZCBFbmNvZGUoQ0VuY29kZXIgKmVuY29kZXIsIFVJbnQzMiBzeW1ib2wpDQorICB7DQorICAgIC8qDQorICAgIGVuY29kZXItPkVuY29kZUJpdCh0aGlzLT5Qcm9iLCBrTnVtQml0TW9kZWxUb3RhbEJpdHMsIHN5bWJvbCk7DQorICAgIHRoaXMtPlVwZGF0ZU1vZGVsKHN5bWJvbCk7DQorICAgICovDQorICAgIFVJbnQzMiBuZXdCb3VuZCA9IChlbmNvZGVyLT5SYW5nZSA+PiBrTnVtQml0TW9kZWxUb3RhbEJpdHMpICogdGhpcy0+UHJvYjsNCisgICAgaWYgKHN5bWJvbCA9PSAwKQ0KKyAgICB7DQorICAgICAgZW5jb2Rlci0+UmFuZ2UgPSBuZXdCb3VuZDsNCisgICAgICB0aGlzLT5Qcm9iICs9IChrQml0TW9kZWxUb3RhbCAtIHRoaXMtPlByb2IpID4+IG51bU1vdmVCaXRzOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGVuY29kZXItPkxvdyArPSBuZXdCb3VuZDsNCisgICAgICBlbmNvZGVyLT5SYW5nZSAtPSBuZXdCb3VuZDsNCisgICAgICB0aGlzLT5Qcm9iIC09ICh0aGlzLT5Qcm9iKSA+PiBudW1Nb3ZlQml0czsNCisgICAgfQ0KKyAgICBpZiAoZW5jb2Rlci0+UmFuZ2UgPCBrVG9wVmFsdWUpDQorICAgIHsNCisgICAgICBlbmNvZGVyLT5SYW5nZSA8PD0gODsNCisgICAgICBlbmNvZGVyLT5TaGlmdExvdygpOw0KKyAgICB9DQorICB9DQorICBVSW50MzIgR2V0UHJpY2UoVUludDMyIHN5bWJvbCkgY29uc3QNCisgIHsNCisgICAgcmV0dXJuIFByb2JQcmljZXNbKHRoaXMtPlByb2IgXiAoKC0oaW50KShJbnQzMilzeW1ib2wpKSAmIChrQml0TW9kZWxUb3RhbCAtIDEpKSA+PiBrTnVtTW92ZVJlZHVjaW5nQml0c107DQorICB9DQorICBVSW50MzIgR2V0UHJpY2UwKCkgY29uc3QgeyByZXR1cm4gUHJvYlByaWNlc1t0aGlzLT5Qcm9iID4+IGtOdW1Nb3ZlUmVkdWNpbmdCaXRzXTsgfQ0KKyAgVUludDMyIEdldFByaWNlMSgpIGNvbnN0IHsgcmV0dXJuIFByb2JQcmljZXNbKHRoaXMtPlByb2IgXiAoa0JpdE1vZGVsVG90YWwgLSAxKSkgPj4ga051bU1vdmVSZWR1Y2luZ0JpdHNdOyB9DQorfTsNCisNCisNCit0ZW1wbGF0ZSA8dW5zaWduZWQgbnVtTW92ZUJpdHM+DQorY2xhc3MgQ0JpdERlY29kZXI6IHB1YmxpYyBDQml0TW9kZWw8bnVtTW92ZUJpdHM+DQorew0KK3B1YmxpYzoNCisgIFVJbnQzMiBEZWNvZGUoQ0RlY29kZXIgKmRlY29kZXIpDQorICB7DQorICAgIFVJbnQzMiBuZXdCb3VuZCA9IChkZWNvZGVyLT5SYW5nZSA+PiBrTnVtQml0TW9kZWxUb3RhbEJpdHMpICogdGhpcy0+UHJvYjsNCisgICAgaWYgKGRlY29kZXItPkNvZGUgPCBuZXdCb3VuZCkNCisgICAgew0KKyAgICAgIGRlY29kZXItPlJhbmdlID0gbmV3Qm91bmQ7DQorICAgICAgdGhpcy0+UHJvYiArPSAoa0JpdE1vZGVsVG90YWwgLSB0aGlzLT5Qcm9iKSA+PiBudW1Nb3ZlQml0czsNCisgICAgICBpZiAoZGVjb2Rlci0+UmFuZ2UgPCBrVG9wVmFsdWUpDQorICAgICAgew0KKyAgICAgICAgZGVjb2Rlci0+Q29kZSA9IChkZWNvZGVyLT5Db2RlIDw8IDgpIHwgZGVjb2Rlci0+U3RyZWFtLlJlYWRCeXRlKCk7DQorICAgICAgICBkZWNvZGVyLT5SYW5nZSA8PD0gODsNCisgICAgICB9DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgZGVjb2Rlci0+UmFuZ2UgLT0gbmV3Qm91bmQ7DQorICAgICAgZGVjb2Rlci0+Q29kZSAtPSBuZXdCb3VuZDsNCisgICAgICB0aGlzLT5Qcm9iIC09ICh0aGlzLT5Qcm9iKSA+PiBudW1Nb3ZlQml0czsNCisgICAgICBpZiAoZGVjb2Rlci0+UmFuZ2UgPCBrVG9wVmFsdWUpDQorICAgICAgew0KKyAgICAgICAgZGVjb2Rlci0+Q29kZSA9IChkZWNvZGVyLT5Db2RlIDw8IDgpIHwgZGVjb2Rlci0+U3RyZWFtLlJlYWRCeXRlKCk7DQorICAgICAgICBkZWNvZGVyLT5SYW5nZSA8PD0gODsNCisgICAgICB9DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgIH0NCit9Ow0KKw0KK319DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9Db21wcmVzcy9TdGRBZnguaCBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvU3RkQWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhMDg4ZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ29tcHJlc3MvU3RkQWZ4LmgKQEAgLTAsMCArMSw4IEBACisvLyBTdGRBZnguaA0KKw0KKyNpZm5kZWYgX19TVERBRlhfSA0KKyNkZWZpbmUgX19TVERBRlhfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vQ29tbW9uLmgiDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9DcmMubWFrIGIvbHptYS9DUFAvN3ppcC9DcmMubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NGY4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NyYy5tYWsKQEAgLTAsMCArMSw4IEBACitDX09CSlMgPSAkKENfT0JKUykgXA0KKyAgJE9cN3pDcmMub2JqDQorIUlGICIkKENQVSkiID09ICJJQTY0IiB8fCAiJChDUFUpIiA9PSAiTUlQUyINCitDX09CSlMgPSAkKENfT0JKUykgXA0KKyFFTFNFDQorQVNNX09CSlMgPSAkKEFTTV9PQkpTKSBcDQorIUVORElGDQorICAkT1w3ekNyY09wdC5vYmoNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NyYzY0Lm1hayBiL2x6bWEvQ1BQLzd6aXAvQ3JjNjQubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTU2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NyYzY0Lm1hawpAQCAtMCwwICsxLDggQEAKK0NfT0JKUyA9ICQoQ19PQkpTKSBcDQorICAkT1xYekNyYzY0Lm9iag0KKyFJRiAiJChDUFUpIiA9PSAiSUE2NCIgfHwgIiQoQ1BVKSIgPT0gIk1JUFMiIHx8ICIkKENQVSkiID09ICJBUk0iDQorQ19PQkpTID0gJChDX09CSlMpIFwNCishRUxTRQ0KK0FTTV9PQkpTID0gJChBU01fT0JKUykgXA0KKyFFTkRJRg0KKyAgJE9cWHpDcmM2NE9wdC5vYmoNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0NyeXB0by83ekFlcy5jcHAgYi9sem1hL0NQUC83emlwL0NyeXB0by83ekFlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjODQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ3J5cHRvLzd6QWVzLmNwcApAQCAtMCwwICsxLDI0MCBAQAorLy8gN3pBZXMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL1NoYTI1Ni5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9XaW5kb3dzL1N5bmNocm9uaXphdGlvbi5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vU3RyZWFtT2JqZWN0cy5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vU3RyZWFtVXRpbHMuaCINCisNCisjaW5jbHVkZSAiN3pBZXMuaCINCisjaW5jbHVkZSAiTXlBZXMuaCINCisNCisjaWZuZGVmIEVYVFJBQ1RfT05MWQ0KKyNpbmNsdWRlICJSYW5kR2VuLmgiDQorI2VuZGlmDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KKw0KK25hbWVzcGFjZSBOQ3J5cHRvIHsNCituYW1lc3BhY2UgTlNldmVuWiB7DQorDQorYm9vbCBDS2V5SW5mbzo6SXNFcXVhbFRvKGNvbnN0IENLZXlJbmZvICZhKSBjb25zdA0KK3sNCisgIGlmIChTYWx0U2l6ZSAhPSBhLlNhbHRTaXplIHx8IE51bUN5Y2xlc1Bvd2VyICE9IGEuTnVtQ3ljbGVzUG93ZXIpDQorICAgIHJldHVybiBmYWxzZTsNCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgU2FsdFNpemU7IGkrKykNCisgICAgaWYgKFNhbHRbaV0gIT0gYS5TYWx0W2ldKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgIHJldHVybiAoUGFzc3dvcmQgPT0gYS5QYXNzd29yZCk7DQorfQ0KKw0KK3ZvaWQgQ0tleUluZm86OkNhbGN1bGF0ZURpZ2VzdCgpDQorew0KKyAgaWYgKE51bUN5Y2xlc1Bvd2VyID09IDB4M0YpDQorICB7DQorICAgIFVJbnQzMiBwb3M7DQorICAgIGZvciAocG9zID0gMDsgcG9zIDwgU2FsdFNpemU7IHBvcysrKQ0KKyAgICAgIEtleVtwb3NdID0gU2FsdFtwb3NdOw0KKyAgICBmb3IgKFVJbnQzMiBpID0gMDsgaSA8IFBhc3N3b3JkLlNpemUoKSAmJiBwb3MgPCBrS2V5U2l6ZTsgaSsrKQ0KKyAgICAgIEtleVtwb3MrK10gPSBQYXNzd29yZFtpXTsNCisgICAgZm9yICg7IHBvcyA8IGtLZXlTaXplOyBwb3MrKykNCisgICAgICBLZXlbcG9zXSA9IDA7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIENTaGEyNTYgc2hhOw0KKyAgICBTaGEyNTZfSW5pdCgmc2hhKTsNCisgICAgY29uc3QgVUludDY0IG51bVJvdW5kcyA9IChVSW50NjQpMSA8PCBOdW1DeWNsZXNQb3dlcjsNCisgICAgQnl0ZSB0ZW1wWzhdID0geyAwLDAsMCwwLDAsMCwwLDAgfTsNCisgICAgZm9yIChVSW50NjQgcm91bmQgPSAwOyByb3VuZCA8IG51bVJvdW5kczsgcm91bmQrKykNCisgICAgew0KKyAgICAgIFNoYTI1Nl9VcGRhdGUoJnNoYSwgU2FsdCwgKHNpemVfdClTYWx0U2l6ZSk7DQorICAgICAgU2hhMjU2X1VwZGF0ZSgmc2hhLCBQYXNzd29yZCwgUGFzc3dvcmQuU2l6ZSgpKTsNCisgICAgICBTaGEyNTZfVXBkYXRlKCZzaGEsIHRlbXAsIDgpOw0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKQ0KKyAgICAgICAgaWYgKCsrKHRlbXBbaV0pICE9IDApDQorICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIFNoYTI1Nl9GaW5hbCgmc2hhLCBLZXkpOw0KKyAgfQ0KK30NCisNCitib29sIENLZXlJbmZvQ2FjaGU6OkZpbmQoQ0tleUluZm8gJmtleSkNCit7DQorICBGT1JfVkVDVE9SIChpLCBLZXlzKQ0KKyAgew0KKyAgICBjb25zdCBDS2V5SW5mbyAmY2FjaGVkID0gS2V5c1tpXTsNCisgICAgaWYgKGtleS5Jc0VxdWFsVG8oY2FjaGVkKSkNCisgICAgew0KKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwga0tleVNpemU7IGorKykNCisgICAgICAgIGtleS5LZXlbal0gPSBjYWNoZWQuS2V5W2pdOw0KKyAgICAgIGlmIChpICE9IDApDQorICAgICAgICBLZXlzLk1vdmVUb0Zyb250KGkpOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK3ZvaWQgQ0tleUluZm9DYWNoZTo6QWRkKENLZXlJbmZvICZrZXkpDQorew0KKyAgaWYgKEZpbmQoa2V5KSkNCisgICAgcmV0dXJuOw0KKyAgaWYgKEtleXMuU2l6ZSgpID49IFNpemUpDQorICAgIEtleXMuRGVsZXRlQmFjaygpOw0KKyAgS2V5cy5JbnNlcnQoMCwga2V5KTsNCit9DQorDQorc3RhdGljIENLZXlJbmZvQ2FjaGUgZ19HbG9iYWxLZXlDYWNoZSgzMik7DQorc3RhdGljIE5TeW5jaHJvbml6YXRpb246OkNDcml0aWNhbFNlY3Rpb24gZ19HbG9iYWxLZXlDYWNoZUNyaXRpY2FsU2VjdGlvbjsNCisNCitDQmFzZTo6Q0Jhc2UoKToNCisgIF9jYWNoZWRLZXlzKDE2KSwNCisgIF9pdlNpemUoMCkNCit7DQorICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZihfaXYpOyBpKyspDQorICAgIF9pdltpXSA9IDA7DQorfQ0KKw0KK3ZvaWQgQ0Jhc2U6OkNhbGN1bGF0ZURpZ2VzdCgpDQorew0KKyAgTlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbkxvY2sgbG9jayhnX0dsb2JhbEtleUNhY2hlQ3JpdGljYWxTZWN0aW9uKTsNCisgIGlmIChfY2FjaGVkS2V5cy5GaW5kKF9rZXkpKQ0KKyAgICBnX0dsb2JhbEtleUNhY2hlLkFkZChfa2V5KTsNCisgIGVsc2UNCisgIHsNCisgICAgaWYgKCFnX0dsb2JhbEtleUNhY2hlLkZpbmQoX2tleSkpDQorICAgIHsNCisgICAgICBfa2V5LkNhbGN1bGF0ZURpZ2VzdCgpOw0KKyAgICAgIGdfR2xvYmFsS2V5Q2FjaGUuQWRkKF9rZXkpOw0KKyAgICB9DQorICAgIF9jYWNoZWRLZXlzLkFkZChfa2V5KTsNCisgIH0NCit9DQorDQorI2lmbmRlZiBFWFRSQUNUX09OTFkNCisNCisvKg0KK1NURE1FVEhPRElNUCBDRW5jb2Rlcjo6UmVzZXRTYWx0KCkNCit7DQorICBfa2V5LlNhbHRTaXplID0gNDsNCisgIGdfUmFuZG9tR2VuZXJhdG9yLkdlbmVyYXRlKF9rZXkuU2FsdCwgX2tleS5TYWx0U2l6ZSk7DQorICByZXR1cm4gU19PSzsNCit9DQorKi8NCisNCitTVERNRVRIT0RJTVAgQ0VuY29kZXI6OlJlc2V0SW5pdFZlY3RvcigpDQorew0KKyAgX2l2U2l6ZSA9IDg7DQorICBnX1JhbmRvbUdlbmVyYXRvci5HZW5lcmF0ZShfaXYsICh1bnNpZ25lZClfaXZTaXplKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0VuY29kZXI6OldyaXRlQ29kZXJQcm9wZXJ0aWVzKElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0pDQorew0KKyAgIC8vIF9rZXkuSW5pdCgpOw0KKyAgIGZvciAoVUludDMyIGkgPSBfaXZTaXplOyBpIDwgc2l6ZW9mKF9pdik7IGkrKykNCisgICAgX2l2W2ldID0gMDsNCisNCisgIFVJbnQzMiBpdlNpemUgPSBfaXZTaXplOw0KKyAgDQorICAvLyBfa2V5Lk51bUN5Y2xlc1Bvd2VyID0gMHgzRjsNCisgIF9rZXkuTnVtQ3ljbGVzUG93ZXIgPSAxOTsNCisNCisgIEJ5dGUgZmlyc3RCeXRlID0gKEJ5dGUpKF9rZXkuTnVtQ3ljbGVzUG93ZXIgfA0KKyAgICAoKChfa2V5LlNhbHRTaXplID09IDApID8gMCA6IDEpIDw8IDcpIHwNCisgICAgKCgoaXZTaXplID09IDApID8gMCA6IDEpIDw8IDYpKTsNCisgIFJJTk9LKG91dFN0cmVhbS0+V3JpdGUoJmZpcnN0Qnl0ZSwgMSwgTlVMTCkpOw0KKyAgaWYgKF9rZXkuU2FsdFNpemUgPT0gMCAmJiBpdlNpemUgPT0gMCkNCisgICAgcmV0dXJuIFNfT0s7DQorICBCeXRlIHNhbHRTaXplU3BlYyA9IChCeXRlKSgoX2tleS5TYWx0U2l6ZSA9PSAwKSA/IDAgOiAoX2tleS5TYWx0U2l6ZSAtIDEpKTsNCisgIEJ5dGUgaXZTaXplU3BlYyA9IChCeXRlKSgoaXZTaXplID09IDApID8gMCA6IChpdlNpemUgLSAxKSk7DQorICBCeXRlIHNlY29uZEJ5dGUgPSAoQnl0ZSkoKChzYWx0U2l6ZVNwZWMpIDw8IDQpIHwgaXZTaXplU3BlYyk7DQorICBSSU5PSyhvdXRTdHJlYW0tPldyaXRlKCZzZWNvbmRCeXRlLCAxLCBOVUxMKSk7DQorICBpZiAoX2tleS5TYWx0U2l6ZSA+IDApDQorICB7DQorICAgIFJJTk9LKFdyaXRlU3RyZWFtKG91dFN0cmVhbSwgX2tleS5TYWx0LCBfa2V5LlNhbHRTaXplKSk7DQorICB9DQorICBpZiAoaXZTaXplID4gMCkNCisgIHsNCisgICAgUklOT0soV3JpdGVTdHJlYW0ob3V0U3RyZWFtLCBfaXYsIGl2U2l6ZSkpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ0VuY29kZXI6OkNyZWF0ZUZpbHRlcigpDQorew0KKyAgX2Flc0ZpbHRlciA9IG5ldyBDQWVzQ2JjRW5jb2RlcihrS2V5U2l6ZSk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorI2VuZGlmDQorDQorU1RETUVUSE9ESU1QIENEZWNvZGVyOjpTZXREZWNvZGVyUHJvcGVydGllczIoY29uc3QgQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpDQorew0KKyAgX2tleS5Jbml0KCk7DQorICBVSW50MzIgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoX2l2KTsgaSsrKQ0KKyAgICBfaXZbaV0gPSAwOw0KKyAgaWYgKHNpemUgPT0gMCkNCisgICAgcmV0dXJuIFNfT0s7DQorICBVSW50MzIgcG9zID0gMDsNCisgIEJ5dGUgZmlyc3RCeXRlID0gZGF0YVtwb3MrK107DQorDQorICBfa2V5Lk51bUN5Y2xlc1Bvd2VyID0gZmlyc3RCeXRlICYgMHgzRjsNCisgIGlmICgoZmlyc3RCeXRlICYgMHhDMCkgPT0gMCkNCisgICAgcmV0dXJuIFNfT0s7DQorICBfa2V5LlNhbHRTaXplID0gKGZpcnN0Qnl0ZSA+PiA3KSAmIDE7DQorICBVSW50MzIgaXZTaXplID0gKGZpcnN0Qnl0ZSA+PiA2KSAmIDE7DQorDQorICBpZiAocG9zID49IHNpemUpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICBCeXRlIHNlY29uZEJ5dGUgPSBkYXRhW3BvcysrXTsNCisgIA0KKyAgX2tleS5TYWx0U2l6ZSArPSAoc2Vjb25kQnl0ZSA+PiA0KTsNCisgIGl2U2l6ZSArPSAoc2Vjb25kQnl0ZSAmIDB4MEYpOw0KKyAgDQorICBpZiAocG9zICsgX2tleS5TYWx0U2l6ZSArIGl2U2l6ZSA+IHNpemUpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICBmb3IgKGkgPSAwOyBpIDwgX2tleS5TYWx0U2l6ZTsgaSsrKQ0KKyAgICBfa2V5LlNhbHRbaV0gPSBkYXRhW3BvcysrXTsNCisgIGZvciAoaSA9IDA7IGkgPCBpdlNpemU7IGkrKykNCisgICAgX2l2W2ldID0gZGF0YVtwb3MrK107DQorICByZXR1cm4gKF9rZXkuTnVtQ3ljbGVzUG93ZXIgPD0gMjQpID8gU19PSyA6ICBFX05PVElNUEw7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQmFzZUNvZGVyOjpDcnlwdG9TZXRQYXNzd29yZChjb25zdCBCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSkNCit7DQorICBfa2V5LlBhc3N3b3JkLkNvcHlGcm9tKGRhdGEsIChzaXplX3Qpc2l6ZSk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENCYXNlQ29kZXI6OkluaXQoKQ0KK3sNCisgIENhbGN1bGF0ZURpZ2VzdCgpOw0KKyAgaWYgKF9hZXNGaWx0ZXIgPT0gMCkNCisgIHsNCisgICAgUklOT0soQ3JlYXRlRmlsdGVyKCkpOw0KKyAgfQ0KKyAgQ015Q29tUHRyPElDcnlwdG9Qcm9wZXJ0aWVzPiBjcDsNCisgIFJJTk9LKF9hZXNGaWx0ZXIuUXVlcnlJbnRlcmZhY2UoSUlEX0lDcnlwdG9Qcm9wZXJ0aWVzLCAmY3ApKTsNCisgIFJJTk9LKGNwLT5TZXRLZXkoX2tleS5LZXksIHNpemVvZihfa2V5LktleSkpKTsNCisgIFJJTk9LKGNwLT5TZXRJbml0VmVjdG9yKF9pdiwgc2l6ZW9mKF9pdikpKTsNCisgIHJldHVybiBfYWVzRmlsdGVyLT5Jbml0KCk7DQorfQ0KKw0KK1NURE1FVEhPRElNUF8oVUludDMyKSBDQmFzZUNvZGVyOjpGaWx0ZXIoQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpDQorew0KKyAgcmV0dXJuIF9hZXNGaWx0ZXItPkZpbHRlcihkYXRhLCBzaXplKTsNCit9DQorDQorSFJFU1VMVCBDRGVjb2Rlcjo6Q3JlYXRlRmlsdGVyKCkNCit7DQorICBfYWVzRmlsdGVyID0gbmV3IENBZXNDYmNEZWNvZGVyKGtLZXlTaXplKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCit9fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ3J5cHRvLzd6QWVzLmggYi9sem1hL0NQUC83emlwL0NyeXB0by83ekFlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTEyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NyeXB0by83ekFlcy5oCkBAIC0wLDAgKzEsMTE3IEBACisvLyA3ekFlcy5oDQorDQorI2lmbmRlZiBfX0NSWVBUT183Wl9BRVNfSA0KKyNkZWZpbmUgX19DUllQVE9fN1pfQUVTX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL015QnVmZmVyLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlWZWN0b3IuaCINCisNCisjaW5jbHVkZSAiLi4vSUNvZGVyLmgiDQorI2luY2x1ZGUgIi4uL0lQYXNzd29yZC5oIg0KKw0KK25hbWVzcGFjZSBOQ3J5cHRvIHsNCituYW1lc3BhY2UgTlNldmVuWiB7DQorDQorY29uc3QgaW50IGtLZXlTaXplID0gMzI7DQorDQorY2xhc3MgQ0tleUluZm8NCit7DQorcHVibGljOg0KKyAgaW50IE51bUN5Y2xlc1Bvd2VyOw0KKyAgVUludDMyIFNhbHRTaXplOw0KKyAgQnl0ZSBTYWx0WzE2XTsNCisgIENCeXRlQnVmZmVyIFBhc3N3b3JkOw0KKyAgQnl0ZSBLZXlba0tleVNpemVdOw0KKw0KKyAgYm9vbCBJc0VxdWFsVG8oY29uc3QgQ0tleUluZm8gJmEpIGNvbnN0Ow0KKyAgdm9pZCBDYWxjdWxhdGVEaWdlc3QoKTsNCisNCisgIENLZXlJbmZvKCkgeyBJbml0KCk7IH0NCisgIHZvaWQgSW5pdCgpDQorICB7DQorICAgIE51bUN5Y2xlc1Bvd2VyID0gMDsNCisgICAgU2FsdFNpemUgPSAwOw0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZihTYWx0KTsgaSsrKQ0KKyAgICAgIFNhbHRbaV0gPSAwOw0KKyAgfQ0KK307DQorDQorY2xhc3MgQ0tleUluZm9DYWNoZQ0KK3sNCisgIHVuc2lnbmVkIFNpemU7DQorICBDT2JqZWN0VmVjdG9yPENLZXlJbmZvPiBLZXlzOw0KK3B1YmxpYzoNCisgIENLZXlJbmZvQ2FjaGUodW5zaWduZWQgc2l6ZSk6IFNpemUoc2l6ZSkge30NCisgIGJvb2wgRmluZChDS2V5SW5mbyAma2V5KTsNCisgIC8vIEhSRVNVTFQgQ2FsY3VsYXRlKENLZXlJbmZvICZrZXkpOw0KKyAgdm9pZCBBZGQoQ0tleUluZm8gJmtleSk7DQorfTsNCisNCitjbGFzcyBDQmFzZQ0KK3sNCisgIENLZXlJbmZvQ2FjaGUgX2NhY2hlZEtleXM7DQorcHJvdGVjdGVkOg0KKyAgQ0tleUluZm8gX2tleTsNCisgIEJ5dGUgX2l2WzE2XTsNCisgIFVJbnQzMiBfaXZTaXplOw0KKyAgdm9pZCBDYWxjdWxhdGVEaWdlc3QoKTsNCisgIENCYXNlKCk7DQorfTsNCisNCitjbGFzcyBDQmFzZUNvZGVyOg0KKyAgcHVibGljIElDb21wcmVzc0ZpbHRlciwNCisgIHB1YmxpYyBJQ3J5cHRvU2V0UGFzc3dvcmQsDQorICBwdWJsaWMgQ015VW5rbm93bkltcCwNCisgIHB1YmxpYyBDQmFzZQ0KK3sNCitwcm90ZWN0ZWQ6DQorICBDTXlDb21QdHI8SUNvbXByZXNzRmlsdGVyPiBfYWVzRmlsdGVyOw0KKw0KKyAgdmlydHVhbCBIUkVTVUxUIENyZWF0ZUZpbHRlcigpID0gMDsNCisgICNpZm5kZWYgQ1JZUFRPX0FFUw0KKyAgSFJFU1VMVCBDcmVhdGVGaWx0ZXJGcm9tRExMKFJFRkNMU0lEIGNsc0lEKTsNCisgICNlbmRpZg0KK3B1YmxpYzoNCisgIFNURE1FVEhPRChJbml0KSgpOw0KKyAgU1RETUVUSE9EXyhVSW50MzIsIEZpbHRlcikoQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpOw0KKyAgDQorICBTVERNRVRIT0QoQ3J5cHRvU2V0UGFzc3dvcmQpKGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsNCit9Ow0KKw0KKyNpZm5kZWYgRVhUUkFDVF9PTkxZDQorDQorY2xhc3MgQ0VuY29kZXI6DQorICBwdWJsaWMgQ0Jhc2VDb2RlciwNCisgIHB1YmxpYyBJQ29tcHJlc3NXcml0ZUNvZGVyUHJvcGVydGllcywNCisgIC8vIHB1YmxpYyBJQ3J5cHRvUmVzZXRTYWx0LA0KKyAgcHVibGljIElDcnlwdG9SZXNldEluaXRWZWN0b3INCit7DQorICB2aXJ0dWFsIEhSRVNVTFQgQ3JlYXRlRmlsdGVyKCk7DQorcHVibGljOg0KKyAgTVlfVU5LTk9XTl9JTVAzKA0KKyAgICAgIElDcnlwdG9TZXRQYXNzd29yZCwNCisgICAgICBJQ29tcHJlc3NXcml0ZUNvZGVyUHJvcGVydGllcywNCisgICAgICAvLyBJQ3J5cHRvUmVzZXRTYWx0LA0KKyAgICAgIElDcnlwdG9SZXNldEluaXRWZWN0b3IpDQorICBTVERNRVRIT0QoV3JpdGVDb2RlclByb3BlcnRpZXMpKElTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW0pOw0KKyAgLy8gU1RETUVUSE9EKFJlc2V0U2FsdCkoKTsNCisgIFNURE1FVEhPRChSZXNldEluaXRWZWN0b3IpKCk7DQorfTsNCisjZW5kaWYNCisNCitjbGFzcyBDRGVjb2RlcjoNCisgIHB1YmxpYyBDQmFzZUNvZGVyLA0KKyAgcHVibGljIElDb21wcmVzc1NldERlY29kZXJQcm9wZXJ0aWVzMg0KK3sNCisgIHZpcnR1YWwgSFJFU1VMVCBDcmVhdGVGaWx0ZXIoKTsNCitwdWJsaWM6DQorICBNWV9VTktOT1dOX0lNUDIoDQorICAgICAgSUNyeXB0b1NldFBhc3N3b3JkLA0KKyAgICAgIElDb21wcmVzc1NldERlY29kZXJQcm9wZXJ0aWVzMikNCisgIFNURE1FVEhPRChTZXREZWNvZGVyUHJvcGVydGllczIpKGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsNCit9Ow0KKw0KK319DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9DcnlwdG8vN3pBZXNSZWdpc3Rlci5jcHAgYi9sem1hL0NQUC83emlwL0NyeXB0by83ekFlc1JlZ2lzdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Y4YWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9DcnlwdG8vN3pBZXNSZWdpc3Rlci5jcHAKQEAgLTAsMCArMSwxOCBAQAorLy8gN3pBZXNSZWdpc3Rlci5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9SZWdpc3RlckNvZGVjLmgiDQorI2luY2x1ZGUgIjd6QWVzLmgiDQorDQorc3RhdGljIHZvaWQgKkNyZWF0ZUNvZGVjKCkgeyByZXR1cm4gKHZvaWQgKikoSUNvbXByZXNzRmlsdGVyICopKG5ldyBOQ3J5cHRvOjpOU2V2ZW5aOjpDRGVjb2RlcigpKTsgfQ0KKyNpZm5kZWYgRVhUUkFDVF9PTkxZDQorc3RhdGljIHZvaWQgKkNyZWF0ZUNvZGVjT3V0KCkgeyByZXR1cm4gKHZvaWQgKikoSUNvbXByZXNzRmlsdGVyICopKG5ldyBOQ3J5cHRvOjpOU2V2ZW5aOjpDRW5jb2RlcigpKTsgfQ0KKyNlbHNlDQorI2RlZmluZSBDcmVhdGVDb2RlY091dCAwDQorI2VuZGlmDQorDQorc3RhdGljIENDb2RlY0luZm8gZ19Db2RlY0luZm8gPQ0KKyAgeyBDcmVhdGVDb2RlYywgQ3JlYXRlQ29kZWNPdXQsIDB4MDZGMTA3MDEsIEwiN3pBRVMiLCAxLCB0cnVlIH07DQorDQorUkVHSVNURVJfQ09ERUMoN3pBRVMpDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9DcnlwdG8vTXlBZXMuY3BwIGIvbHptYS9DUFAvN3ppcC9DcnlwdG8vTXlBZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMzk5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NyeXB0by9NeUFlcy5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8vIENyeXB0by9NeUFlcy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0MvQ3B1QXJjaC5oIg0KKw0KKyNpbmNsdWRlICJNeUFlcy5oIg0KKw0KK25hbWVzcGFjZSBOQ3J5cHRvIHsNCisNCitzdGF0aWMgc3RydWN0IENBZXNUYWJJbml0IHsgQ0Flc1RhYkluaXQoKSB7IEFlc0dlblRhYmxlcygpO30gfSBnX0Flc1RhYkluaXQ7DQorDQorQ0Flc0NiY0NvZGVyOjpDQWVzQ2JjQ29kZXIoYm9vbCBlbmNvZGVNb2RlLCB1bnNpZ25lZCBrZXlTaXplKToNCisgIF9rZXlTaXplKGtleVNpemUpLA0KKyAgX2tleUlzU2V0KGZhbHNlKSwNCisgIF9lbmNvZGVNb2RlKGVuY29kZU1vZGUpDQorew0KKyAgX29mZnNldCA9ICgoMCAtICh1bnNpZ25lZCkocHRyZGlmZl90KV9hZXMpICYgMHhGKSAvIHNpemVvZihVSW50MzIpOw0KKyAgbWVtc2V0KF9pdiwgMCwgQUVTX0JMT0NLX1NJWkUpOw0KKyAgU2V0RnVuY3Rpb25zKDApOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0Flc0NiY0NvZGVyOjpJbml0KCkNCit7DQorICBBZXNDYmNfSW5pdChfYWVzICsgX29mZnNldCwgX2l2KTsNCisgIHJldHVybiBfa2V5SXNTZXQgPyBTX09LIDogRV9GQUlMOw0KK30NCisNCitTVERNRVRIT0RJTVBfKFVJbnQzMikgQ0Flc0NiY0NvZGVyOjpGaWx0ZXIoQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpDQorew0KKyAgaWYgKCFfa2V5SXNTZXQpDQorICAgIHJldHVybiAwOw0KKyAgaWYgKHNpemUgPT0gMCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoc2l6ZSA8IEFFU19CTE9DS19TSVpFKQ0KKyAgICByZXR1cm4gQUVTX0JMT0NLX1NJWkU7DQorICBzaXplID4+PSA0Ow0KKyAgX2NvZGVGdW5jKF9hZXMgKyBfb2Zmc2V0LCBkYXRhLCBzaXplKTsNCisgIHJldHVybiBzaXplIDw8IDQ7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQWVzQ2JjQ29kZXI6OlNldEtleShjb25zdCBCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSkNCit7DQorICBpZiAoKHNpemUgJiAweDcpICE9IDAgfHwgc2l6ZSA8IDE2IHx8IHNpemUgPiAzMikNCisgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgIGlmIChfa2V5U2l6ZSAhPSAwICYmIHNpemUgIT0gX2tleVNpemUpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICBBRVNfU0VUX0tFWV9GVU5DIHNldEtleUZ1bmMgPSBfZW5jb2RlTW9kZSA/IEFlc19TZXRLZXlfRW5jIDogQWVzX1NldEtleV9EZWM7DQorICBzZXRLZXlGdW5jKF9hZXMgKyBfb2Zmc2V0ICsgNCwgZGF0YSwgc2l6ZSk7DQorICBfa2V5SXNTZXQgPSB0cnVlOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQWVzQ2JjQ29kZXI6OlNldEluaXRWZWN0b3IoY29uc3QgQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpDQorew0KKyAgaWYgKHNpemUgIT0gQUVTX0JMT0NLX1NJWkUpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICBtZW1jcHkoX2l2LCBkYXRhLCBzaXplKTsNCisgIENBZXNDYmNDb2Rlcjo6SW5pdCgpOyAvLyBkb24ndCBjYWxsIHZpcnR1YWwgZnVuY3Rpb24gaGVyZSAhISENCisgIHJldHVybiBTX09LOw0KK30NCisNCitFWFRFUk5fQ19CRUdJTg0KKw0KK3ZvaWQgTVlfRkFTVF9DQUxMIEFlc0NiY19FbmNvZGUoVUludDMyICppdkFlcywgQnl0ZSAqZGF0YSwgc2l6ZV90IG51bUJsb2Nrcyk7DQordm9pZCBNWV9GQVNUX0NBTEwgQWVzQ2JjX0RlY29kZShVSW50MzIgKml2QWVzLCBCeXRlICpkYXRhLCBzaXplX3QgbnVtQmxvY2tzKTsNCit2b2lkIE1ZX0ZBU1RfQ0FMTCBBZXNDdHJfQ29kZShVSW50MzIgKml2QWVzLCBCeXRlICpkYXRhLCBzaXplX3QgbnVtQmxvY2tzKTsNCisNCit2b2lkIE1ZX0ZBU1RfQ0FMTCBBZXNDYmNfRW5jb2RlX0ludGVsKFVJbnQzMiAqaXZBZXMsIEJ5dGUgKmRhdGEsIHNpemVfdCBudW1CbG9ja3MpOw0KK3ZvaWQgTVlfRkFTVF9DQUxMIEFlc0NiY19EZWNvZGVfSW50ZWwoVUludDMyICppdkFlcywgQnl0ZSAqZGF0YSwgc2l6ZV90IG51bUJsb2Nrcyk7DQordm9pZCBNWV9GQVNUX0NBTEwgQWVzQ3RyX0NvZGVfSW50ZWwoVUludDMyICppdkFlcywgQnl0ZSAqZGF0YSwgc2l6ZV90IG51bUJsb2Nrcyk7DQorDQorRVhURVJOX0NfRU5EDQorDQorYm9vbCBDQWVzQ2JjQ29kZXI6OlNldEZ1bmN0aW9ucyhVSW50MzIgYWxnbykNCit7DQorICBfY29kZUZ1bmMgPSBfZW5jb2RlTW9kZSA/DQorICAgICAgZ19BZXNDYmNfRW5jb2RlIDoNCisgICAgICBnX0Flc0NiY19EZWNvZGU7DQorICBpZiAoYWxnbyA9PSAxKQ0KKyAgew0KKyAgICBfY29kZUZ1bmMgPSBfZW5jb2RlTW9kZSA/DQorICAgICAgICBBZXNDYmNfRW5jb2RlOg0KKyAgICAgICAgQWVzQ2JjX0RlY29kZTsNCisgIH0NCisgIGlmIChhbGdvID09IDIpDQorICB7DQorICAgICNpZmRlZiBNWV9DUFVfWDg2X09SX0FNRDY0DQorICAgIGlmIChnX0Flc0NiY19FbmNvZGUgIT0gQWVzQ2JjX0VuY29kZV9JbnRlbCkNCisgICAgI2VuZGlmDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQWVzQ2JjQ29kZXI6OlNldENvZGVyUHJvcGVydGllcyhjb25zdCBQUk9QSUQgKnByb3BJRHMsIGNvbnN0IFBST1BWQVJJQU5UICpjb2RlclByb3BzLCBVSW50MzIgbnVtUHJvcHMpDQorew0KKyAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBudW1Qcm9wczsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCBQUk9QVkFSSUFOVCAmcHJvcCA9IGNvZGVyUHJvcHNbaV07DQorICAgIGlmIChwcm9wSURzW2ldID09IE5Db2RlclByb3BJRDo6a0RlZmF1bHRQcm9wKQ0KKyAgICB7DQorICAgICAgaWYgKHByb3AudnQgIT0gVlRfVUk0KQ0KKyAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgICBpZiAoIVNldEZ1bmN0aW9ucyhwcm9wLnVsVmFsKSkNCisgICAgICAgIHJldHVybiBFX05PVElNUEw7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9DcnlwdG8vTXlBZXMuaCBiL2x6bWEvQ1BQLzd6aXAvQ3J5cHRvL015QWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmM2ZhNwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ3J5cHRvL015QWVzLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ3J5cHRvL015QWVzLmgNCisNCisjaWZuZGVmIF9fQ1JZUFRPX01ZX0FFU19IDQorI2RlZmluZSBfX0NSWVBUT19NWV9BRVNfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL0Flcy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTXlDb20uaCINCisNCisjaW5jbHVkZSAiLi4vSUNvZGVyLmgiDQorDQorbmFtZXNwYWNlIE5DcnlwdG8gew0KKw0KK2NsYXNzIENBZXNDYmNDb2RlcjoNCisgIHB1YmxpYyBJQ29tcHJlc3NGaWx0ZXIsDQorICBwdWJsaWMgSUNyeXB0b1Byb3BlcnRpZXMsDQorICBwdWJsaWMgSUNvbXByZXNzU2V0Q29kZXJQcm9wZXJ0aWVzLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBBRVNfQ09ERV9GVU5DIF9jb2RlRnVuYzsNCisgIHVuc2lnbmVkIF9vZmZzZXQ7DQorICB1bnNpZ25lZCBfa2V5U2l6ZTsNCisgIGJvb2wgX2tleUlzU2V0Ow0KKyAgYm9vbCBfZW5jb2RlTW9kZTsNCisgIFVJbnQzMiBfYWVzW0FFU19OVU1fSVZNUktfV09SRFMgKyAzXTsNCisgIEJ5dGUgX2l2W0FFU19CTE9DS19TSVpFXTsNCisNCisgIGJvb2wgU2V0RnVuY3Rpb25zKFVJbnQzMiBhbGdvKTsNCitwdWJsaWM6DQorICBDQWVzQ2JjQ29kZXIoYm9vbCBlbmNvZGVNb2RlLCB1bnNpZ25lZCBrZXlTaXplKTsNCisgIE1ZX1VOS05PV05fSU1QMihJQ3J5cHRvUHJvcGVydGllcywgSUNvbXByZXNzU2V0Q29kZXJQcm9wZXJ0aWVzKQ0KKyAgU1RETUVUSE9EKEluaXQpKCk7DQorICBTVERNRVRIT0RfKFVJbnQzMiwgRmlsdGVyKShCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSk7DQorICBTVERNRVRIT0QoU2V0S2V5KShjb25zdCBCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSk7DQorICBTVERNRVRIT0QoU2V0SW5pdFZlY3RvcikoY29uc3QgQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpOw0KKyAgU1RETUVUSE9EKFNldENvZGVyUHJvcGVydGllcykoY29uc3QgUFJPUElEICpwcm9wSURzLCBjb25zdCBQUk9QVkFSSUFOVCAqcHJvcHMsIFVJbnQzMiBudW1Qcm9wcyk7DQorfTsNCisNCitzdHJ1Y3QgQ0Flc0NiY0VuY29kZXI6IHB1YmxpYyBDQWVzQ2JjQ29kZXINCit7DQorICBDQWVzQ2JjRW5jb2Rlcih1bnNpZ25lZCBrZXlTaXplID0gMCk6IENBZXNDYmNDb2Rlcih0cnVlLCBrZXlTaXplKSB7fQ0KK307DQorDQorc3RydWN0IENBZXNDYmNEZWNvZGVyOiBwdWJsaWMgQ0Flc0NiY0NvZGVyDQorew0KKyAgQ0Flc0NiY0RlY29kZXIodW5zaWduZWQga2V5U2l6ZSA9IDApOiBDQWVzQ2JjQ29kZXIoZmFsc2UsIGtleVNpemUpIHt9DQorfTsNCisNCisNCit9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9DcnlwdG8vTXlBZXNSZWcuY3BwIGIvbHptYS9DUFAvN3ppcC9DcnlwdG8vTXlBZXNSZWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MTViMWQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0NyeXB0by9NeUFlc1JlZy5jcHAKQEAgLTAsMCArMSwxOSBAQAorLy8gTXlBZXNSZWcuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vUmVnaXN0ZXJDb2RlYy5oIg0KKw0KKyNpbmNsdWRlICJNeUFlcy5oIg0KKw0KK3N0YXRpYyB2b2lkICpDcmVhdGVDb2RlY0NiYygpIHsgcmV0dXJuICh2b2lkICopKElDb21wcmVzc0ZpbHRlciAqKShuZXcgTkNyeXB0bzo6Q0Flc0NiY0RlY29kZXIoMzIpKTsgfQ0KKyNpZm5kZWYgRVhUUkFDVF9PTkxZDQorc3RhdGljIHZvaWQgKkNyZWF0ZUNvZGVjQ2JjT3V0KCkgeyByZXR1cm4gKHZvaWQgKikoSUNvbXByZXNzRmlsdGVyICopKG5ldyBOQ3J5cHRvOjpDQWVzQ2JjRW5jb2RlcigzMikpOyB9DQorI2Vsc2UNCisjZGVmaW5lIENyZWF0ZUNvZGVjQ2JjT3V0IDANCisjZW5kaWYNCisNCitzdGF0aWMgQ0NvZGVjSW5mbyBnX0NvZGVjSW5mbyA9DQorICB7IENyZWF0ZUNvZGVjQ2JjLCBDcmVhdGVDb2RlY0NiY091dCwgMHgwNkYwMDE4MSwgTCJBRVMyNTZDQkMiLCAxLCB0cnVlIH07DQorUkVHSVNURVJfQ09ERUMoQUVTMjU2Q0JDKQ0KKw0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ3J5cHRvL1JhbmRHZW4uY3BwIGIvbHptYS9DUFAvN3ppcC9DcnlwdG8vUmFuZEdlbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzNjYyYQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ3J5cHRvL1JhbmRHZW4uY3BwCkBAIC0wLDAgKzEsMTE1IEBACisvLyBSYW5kR2VuLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vV2luZG93cy9TeW5jaHJvbml6YXRpb24uaCINCisNCisjaW5jbHVkZSAiUmFuZEdlbi5oIg0KKw0KKyNpZm5kZWYgX1dJTjMyDQorI2luY2x1ZGUgPHVuaXN0ZC5oPg0KKyNkZWZpbmUgVVNFX1BPU0lYX1RJTUUNCisjZGVmaW5lIFVTRV9QT1NJWF9USU1FMg0KKyNlbmRpZg0KKw0KKyNpZmRlZiBVU0VfUE9TSVhfVElNRQ0KKyNpbmNsdWRlIDx0aW1lLmg+DQorI2lmZGVmIFVTRV9QT1NJWF9USU1FMg0KKyNpbmNsdWRlIDxzeXMvdGltZS5oPg0KKyNlbmRpZg0KKyNlbmRpZg0KKw0KKy8vIFRoaXMgaXMgbm90IHZlcnkgZ29vZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4NCisvLyBQbGVhc2UgdXNlIGl0IG9ubHkgZm9yIHNhbHQuDQorLy8gRmlyc3QgZ2VuZXJhdGVkIGRhdGEgYmxvY2sgZGVwZW5kcyBmcm9tIHRpbWVyIGFuZCBwcm9jZXNzSUQuDQorLy8gT3RoZXIgZ2VuZXJhdGVkIGRhdGEgYmxvY2tzIGRlcGVuZCBmcm9tIHByZXZpb3VzIHN0YXRlDQorLy8gTWF5YmUgaXQncyBwb3NzaWJsZSB0byByZXN0b3JlIG9yaWdpbmFsIHRpbWVyIHZhbHVlIGZyb20gZ2VuZXJhdGVkIHZhbHVlLg0KKw0KKyNkZWZpbmUgSEFTSF9VUEQoeCkgU2hhMjU2X1VwZGF0ZSgmaGFzaCwgKGNvbnN0IEJ5dGUgKikmeCwgc2l6ZW9mKHgpKTsNCisNCit2b2lkIENSYW5kb21HZW5lcmF0b3I6OkluaXQoKQ0KK3sNCisgIENTaGEyNTYgaGFzaDsNCisgIFNoYTI1Nl9Jbml0KCZoYXNoKTsNCisNCisgICNpZmRlZiBfV0lOMzINCisgIERXT1JEIHcgPSA6OkdldEN1cnJlbnRQcm9jZXNzSWQoKTsNCisgIEhBU0hfVVBEKHcpOw0KKyAgdyA9IDo6R2V0Q3VycmVudFRocmVhZElkKCk7DQorICBIQVNIX1VQRCh3KTsNCisgICNlbHNlDQorICBwaWRfdCBwaWQgPSBnZXRwaWQoKTsNCisgIEhBU0hfVVBEKHBpZCk7DQorICBwaWQgPSBnZXRwcGlkKCk7DQorICBIQVNIX1VQRChwaWQpOw0KKyAgI2VuZGlmDQorDQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwNCisgICAgI2lmZGVmIF9ERUJVRw0KKyAgICAyOw0KKyAgICAjZWxzZQ0KKyAgICAxMDAwOw0KKyAgICAjZW5kaWYNCisgICAgaSsrKQ0KKyAgew0KKyAgICAjaWZkZWYgX1dJTjMyDQorICAgIExBUkdFX0lOVEVHRVIgdjsNCisgICAgaWYgKDo6UXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnYpKQ0KKyAgICAgIEhBU0hfVVBEKHYuUXVhZFBhcnQpOw0KKyAgICAjZW5kaWYNCisNCisgICAgI2lmZGVmIFVTRV9QT1NJWF9USU1FDQorICAgICNpZmRlZiBVU0VfUE9TSVhfVElNRTINCisgICAgdGltZXZhbCB2Ow0KKyAgICBpZiAoZ2V0dGltZW9mZGF5KCZ2LCAwKSA9PSAwKQ0KKyAgICB7DQorICAgICAgSEFTSF9VUEQodi50dl9zZWMpOw0KKyAgICAgIEhBU0hfVVBEKHYudHZfdXNlYyk7DQorICAgIH0NCisgICAgI2VuZGlmDQorICAgIHRpbWVfdCB2MiA9IHRpbWUoTlVMTCk7DQorICAgIEhBU0hfVVBEKHYyKTsNCisgICAgI2VuZGlmDQorDQorICAgIERXT1JEIHRpY2tDb3VudCA9IDo6R2V0VGlja0NvdW50KCk7DQorICAgIEhBU0hfVVBEKHRpY2tDb3VudCk7DQorICAgIA0KKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgMTAwOyBqKyspDQorICAgIHsNCisgICAgICBTaGEyNTZfRmluYWwoJmhhc2gsIF9idWZmKTsNCisgICAgICBTaGEyNTZfSW5pdCgmaGFzaCk7DQorICAgICAgU2hhMjU2X1VwZGF0ZSgmaGFzaCwgX2J1ZmYsIFNIQTI1Nl9ESUdFU1RfU0laRSk7DQorICAgIH0NCisgIH0NCisgIFNoYTI1Nl9GaW5hbCgmaGFzaCwgX2J1ZmYpOw0KKyAgX25lZWRJbml0ID0gZmFsc2U7DQorfQ0KKw0KK3N0YXRpYyBOV2luZG93czo6TlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbiBnX0NyaXRpY2FsU2VjdGlvbjsNCisNCit2b2lkIENSYW5kb21HZW5lcmF0b3I6OkdlbmVyYXRlKEJ5dGUgKmRhdGEsIHVuc2lnbmVkIHNpemUpDQorew0KKyAgZ19Dcml0aWNhbFNlY3Rpb24uRW50ZXIoKTsNCisgIGlmIChfbmVlZEluaXQpDQorICAgIEluaXQoKTsNCisgIHdoaWxlIChzaXplID4gMCkNCisgIHsNCisgICAgQ1NoYTI1NiBoYXNoOw0KKyAgICANCisgICAgU2hhMjU2X0luaXQoJmhhc2gpOw0KKyAgICBTaGEyNTZfVXBkYXRlKCZoYXNoLCBfYnVmZiwgU0hBMjU2X0RJR0VTVF9TSVpFKTsNCisgICAgU2hhMjU2X0ZpbmFsKCZoYXNoLCBfYnVmZik7DQorICAgIA0KKyAgICBTaGEyNTZfSW5pdCgmaGFzaCk7DQorICAgIFVJbnQzMiBzYWx0ID0gMHhGNjcyQUJEMTsNCisgICAgSEFTSF9VUEQoc2FsdCk7DQorICAgIFNoYTI1Nl9VcGRhdGUoJmhhc2gsIF9idWZmLCBTSEEyNTZfRElHRVNUX1NJWkUpOw0KKyAgICBCeXRlIGJ1ZmZbU0hBMjU2X0RJR0VTVF9TSVpFXTsNCisgICAgU2hhMjU2X0ZpbmFsKCZoYXNoLCBidWZmKTsNCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFNIQTI1Nl9ESUdFU1RfU0laRSAmJiBzaXplID4gMDsgaSsrLCBzaXplLS0pDQorICAgICAgKmRhdGErKyA9IGJ1ZmZbaV07DQorICB9DQorICBnX0NyaXRpY2FsU2VjdGlvbi5MZWF2ZSgpOw0KK30NCisNCitDUmFuZG9tR2VuZXJhdG9yIGdfUmFuZG9tR2VuZXJhdG9yOw0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ3J5cHRvL1JhbmRHZW4uaCBiL2x6bWEvQ1BQLzd6aXAvQ3J5cHRvL1JhbmRHZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQ0NDUwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9DcnlwdG8vUmFuZEdlbi5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vIFJhbmRHZW4uaA0KKw0KKyNpZm5kZWYgX19DUllQVE9fUkFORF9HRU5fSA0KKyNkZWZpbmUgX19DUllQVE9fUkFORF9HRU5fSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9DL1NoYTI1Ni5oIg0KKw0KK2NsYXNzIENSYW5kb21HZW5lcmF0b3INCit7DQorICBCeXRlIF9idWZmW1NIQTI1Nl9ESUdFU1RfU0laRV07DQorICBib29sIF9uZWVkSW5pdDsNCisNCisgIHZvaWQgSW5pdCgpOw0KK3B1YmxpYzoNCisgIENSYW5kb21HZW5lcmF0b3IoKTogX25lZWRJbml0KHRydWUpIHt9Ow0KKyAgdm9pZCBHZW5lcmF0ZShCeXRlICpkYXRhLCB1bnNpZ25lZCBzaXplKTsNCit9Ow0KKw0KK2V4dGVybiBDUmFuZG9tR2VuZXJhdG9yIGdfUmFuZG9tR2VuZXJhdG9yOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvQ3J5cHRvL1N0ZEFmeC5oIGIvbHptYS9DUFAvN3ppcC9DcnlwdG8vU3RkQWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhMDg4ZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvQ3J5cHRvL1N0ZEFmeC5oCkBAIC0wLDAgKzEsOCBAQAorLy8gU3RkQWZ4LmgNCisNCisjaWZuZGVmIF9fU1REQUZYX0gNCisjZGVmaW5lIF9fU1REQUZYX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0NvbW1vbi5oIg0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvR3VpQ29tbW9uLnJjIGIvbHptYS9DUFAvN3ppcC9HdWlDb21tb24ucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExMDE3YgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvR3VpQ29tbW9uLnJjCkBAIC0wLDAgKzEsODEgQEAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+DQorDQorLy8gI2luY2x1ZGUgPHdpbm50Lmg+DQorLy8gI2luY2x1ZGUgPFdpblVzZXIuaD4NCisNCisvLyBmb3IgV2luZG93cyBDRToNCisjaW5jbHVkZSA8Q29tbUN0cmwuaD4NCisNCisNCitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUw0KKw0KKyN1bmRlZiBtDQorI3VuZGVmIGJ4cw0KKyN1bmRlZiBieXMNCisjdW5kZWYgYnhzRG90cw0KKyN1bmRlZiB5DQorI3VuZGVmIHhjDQorI3VuZGVmIHljDQorI3VuZGVmIHhzDQorI3VuZGVmIHlzDQorI3VuZGVmIGJ4DQorI3VuZGVmIGJ4MQ0KKyN1bmRlZiBieDINCisjdW5kZWYgYngzDQorI3VuZGVmIGJ5DQorI3VuZGVmIGJ5MQ0KKyN1bmRlZiBieTINCisjdW5kZWYgYnkzDQorI3VuZGVmIGdTcGFjZQ0KKyN1bmRlZiBnU2l6ZQ0KKyN1bmRlZiBtYXJnMg0KKyN1bmRlZiBtYXJnMw0KKw0KKyN1bmRlZiBNWV9ESUFMT0cNCisjdW5kZWYgTVlfUkVTSVpFX0RJQUxPRw0KKyN1bmRlZiBNWV9QQUdFDQorDQorI2RlZmluZSBtIDgNCisjZGVmaW5lIGJ4cyA2NA0KKyNkZWZpbmUgYnlzIDE2DQorI2RlZmluZSBieHNEb3RzIDIwDQorDQorI2RlZmluZSB4cyAoeGMgKyBtICsgbSkNCisjZGVmaW5lIHlzICh5YyArIG0gKyBtKQ0KKw0KKyNkZWZpbmUgYngxICh4cyAtIG0gLSBieHMpDQorI2RlZmluZSBieDIgKGJ4MSAtIG0gLSBieHMpDQorI2RlZmluZSBieDMgKGJ4MiAtIG0gLSBieHMpDQorI2RlZmluZSBieCBieDENCisNCisjZGVmaW5lIGJ5MSAoeXMgLSBtIC0gYnlzKQ0KKyNkZWZpbmUgYnkyIChieTEgLSBtIC0gYnlzKQ0KKyNkZWZpbmUgYnkgYnkxDQorDQorDQorI2RlZmluZSBNWV9NT0RBTF9ESUFMT0dfU1RZTEUgIFNUWUxFICBEU19NT0RBTEZSQU1FIHwgRFNfQ0VOVEVSIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQ0KKw0KKyNkZWZpbmUgTVlfTU9EQUxfUkVTSVpFX0RJQUxPR19TVFlMRSAgTVlfTU9EQUxfRElBTE9HX1NUWUxFIHwgV1NfTUlOSU1JWkVCT1ggfCBXU19NQVhJTUlaRUJPWCB8IFdTX1NJWkVCT1ggfCBXU19USElDS0ZSQU1FDQorDQorI2RlZmluZSBNWV9QQUdFX1NUWUxFICBTVFlMRSAgV1NfQ0hJTEQgfCBXU19ESVNBQkxFRCB8IFdTX0NBUFRJT04NCisNCisjZGVmaW5lIE1ZX0ZPTlQgIEZPTlQgOCwgIk1TIFNoZWxsIERsZyINCisNCisjZGVmaW5lIFNNQUxMX1BBR0VfU0laRV9YIDEyMA0KKw0KKy8vICNkZWZpbmUgTVlfRElBTE9HICAgICAgICAgRElBTE9HIDAsIDAsIHhzLCB5cyAgTVlfTU9EQUxfRElBTE9HX1NUWUxFICBNWV9GT05UDQorLy8gI2RlZmluZSBNWV9SRVNJWkVfRElBTE9HICBESUFMT0cgMCwgMCwgeHMsIHlzICBNWV9NT0RBTF9SRVNJWkVfRElBTE9HX1NUWUxFICBNWV9GT05UDQorI2RlZmluZSBNWV9QQUdFICAgICAgICAgICBESUFMT0cgMCwgMCwgeHMsIHlzICBNWV9QQUdFX1NUWUxFICBNWV9GT05UDQorDQorI2RlZmluZSBPS19DQU5DRUwgXA0KKyAgREVGUFVTSEJVVFRPTiAgIk9LIiwgICAgIElET0ssICAgICBieDIsIGJ5LCBieHMsIGJ5cyBcDQorICBQVVNIQlVUVE9OICAgICAiQ2FuY2VsIiwgSURDQU5DRUwsIGJ4MSwgYnksIGJ4cywgYnlzDQorDQorDQorI2RlZmluZSBNWV9DT01CTyAgQ0JTX0RST1BET1dOTElTVCB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QDQorI2RlZmluZSBNWV9DT01CT19TT1JURUQgIE1ZX0NPTUJPIHwgQ0JTX1NPUlQNCisjZGVmaW5lIE1ZX0NPTUJPX1dJVEhfRURJVCAgQ0JTX0RST1BET1dOIHwgQ0JTX0FVVE9IU0NST0xMIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AgDQorDQorI2RlZmluZSBNWV9DSEVDS0JPWCAiQnV0dG9uIiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfVEFCU1RPUA0KKw0KKyNkZWZpbmUgTVlfVEVYVF9OT1BSRUZJWCA4LCBTU19OT1BSRUZJWA0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvR3VpZC50eHQgYi9sem1hL0NQUC83emlwL0d1aWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMDE2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0d1aWQudHh0CkBAIC0wLDAgKzEsMTkyIEBACit7MjMxNzBGNjktNDBDMS0yNzhBLTAwMDAtMDB5eTAweHgwMDAwfQ0KKw0KKzAwIElQcm9ncmVzcy5oDQorDQorICAwNSAgSVByb2dyZXNzDQorDQorMDEgSUZvbGRlckFyY2hpdmUuaA0KKw0KKyAgLy8gMDUgIElBcmNoaXZlRm9sZGVyICAgLy8gb2xkIA0KKyAgLy8gMDYgIElJbkZvbGRlckFyY2hpdmUgLy8gb2xkDQorICAwNyAgSUZpbGVFeHRyYWN0Q2FsbGJhY2suaDo6SUZvbGRlckFyY2hpdmVFeHRyYWN0Q2FsbGJhY2sNCisgIC8vIDBBICBJT3V0Rm9sZGVyQXJjaGl2ZQ0KKyAgMEIgIElGb2xkZXJBcmNoaXZlVXBkYXRlQ2FsbGJhY2sNCisgIDBDICBBZ2VudC5oOjpJQXJjaGl2ZUZvbGRlckludGVybmFsDQorICAwRCAgSUFyY2hpdmVGb2xkZXINCisgIDBFICBJSW5Gb2xkZXJBcmNoaXZlDQorICAwRiAgSU91dEZvbGRlckFyY2hpdmUNCisgIDIwICBJRmlsZUV4dHJhY3RDYWxsYmFjay5oOjpJR2V0UHJvcA0KKyAgMzAgIElGaWxlRXh0cmFjdENhbGxiYWNrLmg6OklGb2xkZXJFeHRyYWN0VG9TdHJlYW1DYWxsYmFjaw0KKw0KKzAzIElTdHJlYW0uaA0KKw0KKyAgMDEgIElTZXF1ZW50aWFsSW5TdHJlYW0NCisgIDAyICBJU2VxdWVudGlhbE91dFN0cmVhbQ0KKyAgMDMgIElJblN0cmVhbQ0KKyAgMDQgIElPdXRTdHJlYW0NCisgIDA2ICBJU3RyZWFtR2V0U2l6ZQ0KKyAgMDcgIElPdXRTdHJlYW1GbHVzaA0KKyAgMDggIElTdHJlYW1HZXRQcm9wcw0KKyAgMDkgIElTdHJlYW1HZXRQcm9wczINCisNCisNCiswNCBJQ29kZXIuaA0KKw0KKyAgMDQgIElDb21wcmVzc1Byb2dyZXNzSW5mbw0KKyAgMDUgIElDb21wcmVzc0NvZGVyDQorICAxOCAgSUNvbXByZXNzQ29kZXIyDQorICAyMCAgSUNvbXByZXNzU2V0Q29kZXJQcm9wZXJ0aWVzDQorICAyMSAgSUNvbXByZXNzU2V0RGVjb2RlclByb3BlcnRpZXMgLy8NCisgIDIyICBJQ29tcHJlc3NTZXREZWNvZGVyUHJvcGVydGllczINCisgIDIzICBJQ29tcHJlc3NXcml0ZUNvZGVyUHJvcGVydGllcw0KKyAgMjQgIElDb21wcmVzc0dldEluU3RyZWFtUHJvY2Vzc2VkU2l6ZQ0KKyAgMjUgIElDb21wcmVzc1NldENvZGVyTXQNCisgIDMwICBJQ29tcHJlc3NHZXRTdWJTdHJlYW1TaXplDQorICAzMSAgSUNvbXByZXNzU2V0SW5TdHJlYW0NCisgIDMyICBJQ29tcHJlc3NTZXRPdXRTdHJlYW0NCisgIDMzICBJQ29tcHJlc3NTZXRJblN0cmVhbVNpemUNCisgIDM0ICBJQ29tcHJlc3NTZXRPdXRTdHJlYW1TaXplDQorICAzNSAgSUNvbXByZXNzU2V0QnVmU2l6ZQ0KKyAgNDAgIElDb21wcmVzc0ZpbHRlcg0KKyAgNjAgIElDb21wcmVzc0NvZGVjc0luZm8NCisgIDYxICBJU2V0Q29tcHJlc3NDb2RlY3NJbmZvDQorICA4MCAgSUNyeXB0b1Byb3BlcnRpZXMNCisgIDg4ICBJQ3J5cHRvUmVzZXRTYWx0DQorICA4QyAgSUNyeXB0b1Jlc2V0SW5pdFZlY3Rvcg0KKyAgOTAgIElDcnlwdG9TZXRQYXNzd29yZA0KKyAgQTAgIElDcnlwdG9TZXRDUkMNCisgIEMwICBJSGFzaGVyDQorICBDMSAgSUhhc2hlcnMNCisNCisNCiswNSBJUGFzc3dvcmQuaA0KKw0KKyAgMTAgSUNyeXB0b0dldFRleHRQYXNzd29yZA0KKyAgMTEgSUNyeXB0b0dldFRleHRQYXNzd29yZDINCisNCisNCiswNiBJQXJjaGl2ZS5oDQorDQorICAwMyAgSVNldFByb3BlcnRpZXMNCisgIDA0ICBJQXJjaGl2ZUtlZXBNb2RlRm9yTmV4dE9wZW4NCisgIDA1ICBJQXJjaGl2ZUFsbG93VGFpbA0KKw0KKyAgMTAgIElBcmNoaXZlT3BlbkNhbGxiYWNrDQorICAyMCAgSUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2sNCisgIDMwICBJQXJjaGl2ZU9wZW5Wb2x1bWVDYWxsYmFjaw0KKyAgNDAgIElJbkFyY2hpdmVHZXRTdHJlYW0NCisgIDUwICBJQXJjaGl2ZU9wZW5TZXRTdWJBcmNoaXZlTmFtZQ0KKyAgNjAgIElJbkFyY2hpdmUNCisgIDYxICBJQXJjaGl2ZU9wZW5TZXENCisgIDcwICBJQXJjaGl2ZUdldFJhd1Byb3BzDQorICA3MSAgSUFyY2hpdmVHZXRSb290UHJvcHMNCisNCisgIDgwICBJQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrDQorICA4MiAgSUFyY2hpdmVVcGRhdGVDYWxsYmFjazINCisgIEEwICBJT3V0QXJjaGl2ZQ0KKw0KKw0KKw0KKzA4IElGb2xkZXIuaA0KKw0KKyAgMDAgSUZvbGRlckZvbGRlcg0KKyAgMDEgSUVudW1Qcm9wZXJ0aWVzDQorICAwMiBJRm9sZGVyR2V0VHlwZUlEDQorICAwMyBJRm9sZGVyR2V0UGF0aA0KKyAgMDQgSUZvbGRlcldhc0NoYW5nZWQNCisgIDA1IC8vIElGb2xkZXJSZWxvYWQNCisgIDA2IC8vIElGb2xkZXJPcGVyYXRpb25zIG9sZA0KKyAgMDcgSUZvbGRlckdldFN5c3RlbUljb25JbmRleA0KKyAgMDggSUZvbGRlckdldEl0ZW1GdWxsU2l6ZQ0KKyAgMDkgSUZvbGRlckNsb25lDQorICAwQSBJRm9sZGVyU2V0RmxhdE1vZGUNCisgIDBCIElGb2xkZXJPcGVyYXRpb25zRXh0cmFjdENhbGxiYWNrDQorICAwQyAvLyANCisgIDBEIC8vIA0KKyAgMEUgSUZvbGRlclByb3BlcnRpZXMNCisgIDBGIA0KKyAgMTAgSUZvbGRlckFyY1Byb3BzDQorICAxMSBJR2V0Rm9sZGVyQXJjUHJvcHMNCisgIDEyIC8vIElGb2xkZXJPcGVyYXRpb25zDQorICAxMyBJRm9sZGVyT3BlcmF0aW9ucw0KKyAgMTQgSUZvbGRlckNhbGNJdGVtRnVsbFNpemUNCisgIDE1IElGb2xkZXJDb21wYXJlDQorICAxNiBJRm9sZGVyR2V0SXRlbU5hbWUNCisNCisNCiswOSBJRm9sZGVyLmggOjogRk9MREVSX01BTkFHRVJfSU5URVJGQUNFDQorDQorICAwMCAtIDA0IC8vIG9sZCBJRm9sZGVyTWFuYWdlcg0KKyAgMDUgSUZvbGRlck1hbmFnZXINCisNCisNCisvLyAwQSBQbHVnaW5JbnRlcmZhY2UuaA0KKyAgMDAgSUluaXRDb250ZXh0TWVudQ0KKyAgMDEgSVBsdWdpbk9wdGlvbnNDYWxsYmFjaw0KKyAgMDIgSVBsdWdpbk9wdGlvbnMNCisNCisNCitIYW5kbGVyIEdVSURzOg0KKw0KK3syMzE3MEY2OS00MEMxLTI3OEEtMTAwMC0wMDAxMTB4eDAwMDB9DQorDQorICAwMSBaaXANCisgIDAyIEJaaXAyDQorICAwMyBSYXINCisgIDA0IEFyag0KKyAgMDUgWg0KKyAgMDYgTHpoDQorICAwNyA3eg0KKyAgMDggQ2FiDQorICAwOSBOc2lzDQorICAwQSBsem1hDQorICAwQiBsem1hODYNCisgIDBDIHh6DQorICAwRCBwcG1kDQorDQorICBDRCBJSGV4DQorICBDRSBIeHMNCisgIENGIFRFDQorICBEMCBVRUZJYw0KKyAgRDEgVUVGSXMNCisgIEQyIFNxdWFzaEZTDQorICBEMyBDcmFtRlMNCisgIEQ0IEFQTQ0KKyAgRDUgTXNseg0KKyAgRDYgRmx2DQorICBENyBTd2YNCisgIEQ4IFN3ZmMNCisgIEQ5IE50ZnMNCisgIERBIEZhdA0KKyAgREIgTWJyDQorICBEQyBWaGQNCisgIEREIFBlDQorICBERSBFbGYNCisgIERGIE1hY2gtTw0KKyAgRTAgVWRmDQorICBFMSBYYXINCisgIEUyIE11Yg0KKyAgRTMgSGZzDQorICBFNCBEbWcNCisgIEU1IENvbXBvdW5kDQorICBFNiBXaW0NCisgIEU3IElzbw0KKyAgRTggDQorICBFOSBDaG0NCisgIEVBIFNwbGl0DQorICBFQiBScG0NCisgIEVDIERlYg0KKyAgRUQgQ3Bpbw0KKyAgRUUgVGFyDQorICBFRiBHWmlwDQorDQorezIzMTcwRjY5LTQwQzEtMjc4QS0xMDAwLTAwMDEwMDAzMDAwMH0gQ0FnZW50QXJjaGl2ZUhhbmRsZQ0KK3syMzE3MEY2OS00MEMxLTI3OEEtMTAwMC0wMDAxMDAwMjAwMDB9IENvbnRleHRNZW51Lmg6OkNaaXBDb250ZXh0TWVudQ0KKw0KK3syMzE3MEY2OS00MEMxLTI3OEItIG9sZCBjb2RlY3MgY2xzaWRzDQorDQorezIzMTcwRjY5LTQwQzEtMjc4RC0xMDAwLTAwMDEwMDAyMDAwMH0gT3B0aW9uc0RpYWxvZy5oOjpDTFNJRF9DU2V2ZW5aaXBPcHRpb25zDQorDQorezIzMTcwRjY5LTQwQzEtMjc5MC1pZH0gQ29kZWMgRGVjb2RlcnMNCit7MjMxNzBGNjktNDBDMS0yNzkxLWlkfSBDb2RlYyBFbmNvZGVycw0KK3syMzE3MEY2OS00MEMxLTI3OTItaWR9IEhhc2hlcnMNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0lDb2Rlci5oIGIvbHptYS9DUFAvN3ppcC9JQ29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTUzYWRjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9JQ29kZXIuaApAQCAtMCwwICsxLDIxMSBAQAorLy8gSUNvZGVyLmgNCisNCisjaWZuZGVmIF9fSUNPREVSX0gNCisjZGVmaW5lIF9fSUNPREVSX0gNCisNCisjaW5jbHVkZSAiSVN0cmVhbS5oIg0KKw0KKyNkZWZpbmUgQ09ERVJfSU5URVJGQUNFKGksIHgpIERFQ0xfSU5URVJGQUNFKGksIDQsIHgpDQorDQorQ09ERVJfSU5URVJGQUNFKElDb21wcmVzc1Byb2dyZXNzSW5mbywgMHgwNCkNCit7DQorICBTVERNRVRIT0QoU2V0UmF0aW9JbmZvKShjb25zdCBVSW50NjQgKmluU2l6ZSwgY29uc3QgVUludDY0ICpvdXRTaXplKSBQVVJFOw0KK307DQorDQorQ09ERVJfSU5URVJGQUNFKElDb21wcmVzc0NvZGVyLCAweDA1KQ0KK3sNCisgIFNURE1FVEhPRChDb2RlKShJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSwgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSwNCisgICAgICBjb25zdCBVSW50NjQgKmluU2l6ZSwgY29uc3QgVUludDY0ICpvdXRTaXplLA0KKyAgICAgIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpIFBVUkU7DQorfTsNCisNCitDT0RFUl9JTlRFUkZBQ0UoSUNvbXByZXNzQ29kZXIyLCAweDE4KQ0KK3sNCisgIFNURE1FVEhPRChDb2RlKShJU2VxdWVudGlhbEluU3RyZWFtICoqaW5TdHJlYW1zLCBjb25zdCBVSW50NjQgKippblNpemVzLCBVSW50MzIgbnVtSW5TdHJlYW1zLA0KKyAgICAgIElTZXF1ZW50aWFsT3V0U3RyZWFtICoqb3V0U3RyZWFtcywgY29uc3QgVUludDY0ICoqb3V0U2l6ZXMsIFVJbnQzMiBudW1PdXRTdHJlYW1zLA0KKyAgICAgIElDb21wcmVzc1Byb2dyZXNzSW5mbyAqcHJvZ3Jlc3MpIFBVUkU7DQorfTsNCisNCituYW1lc3BhY2UgTkNvZGVyUHJvcElEDQorew0KKyAgZW51bSBFRW51bQ0KKyAgew0KKyAgICBrRGVmYXVsdFByb3AgPSAwLA0KKyAgICBrRGljdGlvbmFyeVNpemUsDQorICAgIGtVc2VkTWVtb3J5U2l6ZSwNCisgICAga09yZGVyLA0KKyAgICBrQmxvY2tTaXplLA0KKyAgICBrUG9zU3RhdGVCaXRzLA0KKyAgICBrTGl0Q29udGV4dEJpdHMsDQorICAgIGtMaXRQb3NCaXRzLA0KKyAgICBrTnVtRmFzdEJ5dGVzLA0KKyAgICBrTWF0Y2hGaW5kZXIsDQorICAgIGtNYXRjaEZpbmRlckN5Y2xlcywNCisgICAga051bVBhc3NlcywNCisgICAga0FsZ29yaXRobSwNCisgICAga051bVRocmVhZHMsDQorICAgIGtFbmRNYXJrZXIsDQorICAgIGtMZXZlbCwNCisgICAga1JlZHVjZVNpemUgLy8gZXN0aW1hdGVkIHNpemUgb2YgZGF0YSB0aGF0IHdpbGwgYmUgY29tcHJlc3NlZC4gRW5jb2RlciBjYW4gdXNlIHRoaXMgdmFsdWUgdG8gcmVkdWNlIGRpY3Rpb25hcnkgc2l6ZS4NCisgIH07DQorfQ0KKw0KK0NPREVSX0lOVEVSRkFDRShJQ29tcHJlc3NTZXRDb2RlclByb3BlcnRpZXMsIDB4MjApDQorew0KKyAgU1RETUVUSE9EKFNldENvZGVyUHJvcGVydGllcykoY29uc3QgUFJPUElEICpwcm9wSURzLCBjb25zdCBQUk9QVkFSSUFOVCAqcHJvcHMsIFVJbnQzMiBudW1Qcm9wcykgUFVSRTsNCit9Ow0KKw0KKy8qDQorQ09ERVJfSU5URVJGQUNFKElDb21wcmVzc1NldENvZGVyUHJvcGVydGllcywgMHgyMSkNCit7DQorICBTVERNRVRIT0QoU2V0RGVjb2RlclByb3BlcnRpZXMpKElTZXF1ZW50aWFsSW5TdHJlYW0gKmluU3RyZWFtKSBQVVJFOw0KK307DQorKi8NCisNCitDT0RFUl9JTlRFUkZBQ0UoSUNvbXByZXNzU2V0RGVjb2RlclByb3BlcnRpZXMyLCAweDIyKQ0KK3sNCisgIFNURE1FVEhPRChTZXREZWNvZGVyUHJvcGVydGllczIpKGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKSBQVVJFOw0KK307DQorDQorQ09ERVJfSU5URVJGQUNFKElDb21wcmVzc1dyaXRlQ29kZXJQcm9wZXJ0aWVzLCAweDIzKQ0KK3sNCisgIFNURE1FVEhPRChXcml0ZUNvZGVyUHJvcGVydGllcykoSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSkgUFVSRTsNCit9Ow0KKw0KK0NPREVSX0lOVEVSRkFDRShJQ29tcHJlc3NHZXRJblN0cmVhbVByb2Nlc3NlZFNpemUsIDB4MjQpDQorew0KKyAgU1RETUVUSE9EKEdldEluU3RyZWFtUHJvY2Vzc2VkU2l6ZSkoVUludDY0ICp2YWx1ZSkgUFVSRTsNCit9Ow0KKw0KK0NPREVSX0lOVEVSRkFDRShJQ29tcHJlc3NTZXRDb2Rlck10LCAweDI1KQ0KK3sNCisgIFNURE1FVEhPRChTZXROdW1iZXJPZlRocmVhZHMpKFVJbnQzMiBudW1UaHJlYWRzKSBQVVJFOw0KK307DQorDQorQ09ERVJfSU5URVJGQUNFKElDb21wcmVzc0dldFN1YlN0cmVhbVNpemUsIDB4MzApDQorew0KKyAgU1RETUVUSE9EKEdldFN1YlN0cmVhbVNpemUpKFVJbnQ2NCBzdWJTdHJlYW0sIFVJbnQ2NCAqdmFsdWUpIFBVUkU7DQorfTsNCisNCitDT0RFUl9JTlRFUkZBQ0UoSUNvbXByZXNzU2V0SW5TdHJlYW0sIDB4MzEpDQorew0KKyAgU1RETUVUSE9EKFNldEluU3RyZWFtKShJU2VxdWVudGlhbEluU3RyZWFtICppblN0cmVhbSkgUFVSRTsNCisgIFNURE1FVEhPRChSZWxlYXNlSW5TdHJlYW0pKCkgUFVSRTsNCit9Ow0KKw0KK0NPREVSX0lOVEVSRkFDRShJQ29tcHJlc3NTZXRPdXRTdHJlYW0sIDB4MzIpDQorew0KKyAgU1RETUVUSE9EKFNldE91dFN0cmVhbSkoSVNlcXVlbnRpYWxPdXRTdHJlYW0gKm91dFN0cmVhbSkgUFVSRTsNCisgIFNURE1FVEhPRChSZWxlYXNlT3V0U3RyZWFtKSgpIFBVUkU7DQorfTsNCisNCitDT0RFUl9JTlRFUkZBQ0UoSUNvbXByZXNzU2V0SW5TdHJlYW1TaXplLCAweDMzKQ0KK3sNCisgIFNURE1FVEhPRChTZXRJblN0cmVhbVNpemUpKGNvbnN0IFVJbnQ2NCAqaW5TaXplKSBQVVJFOw0KK307DQorDQorQ09ERVJfSU5URVJGQUNFKElDb21wcmVzc1NldE91dFN0cmVhbVNpemUsIDB4MzQpDQorew0KKyAgU1RETUVUSE9EKFNldE91dFN0cmVhbVNpemUpKGNvbnN0IFVJbnQ2NCAqb3V0U2l6ZSkgUFVSRTsNCit9Ow0KKw0KK0NPREVSX0lOVEVSRkFDRShJQ29tcHJlc3NTZXRCdWZTaXplLCAweDM1KQ0KK3sNCisgIFNURE1FVEhPRChTZXRJbkJ1ZlNpemUpKFVJbnQzMiBzdHJlYW1JbmRleCwgVUludDMyIHNpemUpIFBVUkU7DQorICBTVERNRVRIT0QoU2V0T3V0QnVmU2l6ZSkoVUludDMyIHN0cmVhbUluZGV4LCBVSW50MzIgc2l6ZSkgUFVSRTsNCit9Ow0KKw0KK0NPREVSX0lOVEVSRkFDRShJQ29tcHJlc3NGaWx0ZXIsIDB4NDApDQorew0KKyAgU1RETUVUSE9EKEluaXQpKCkgUFVSRTsNCisgIFNURE1FVEhPRF8oVUludDMyLCBGaWx0ZXIpKEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKSBQVVJFOw0KKyAgLy8gRmlsdGVyIGNvbnZlcnRzIGFzIG1vc3QgYXMgcG9zc2libGUgYnl0ZXMNCisgIC8vIEZpbHRlciByZXR1cm4gb3V0U2l6ZSAoVUludDMyKQ0KKyAgLy8gaWYgKG91dFNpemUgPD0gc2l6ZSk6IEZpbHRlciBoYXZlIGNvbnZlcnRlZCBvdXRTaXplIGJ5dGVzDQorICAvLyBpZiAob3V0U2l6ZSA+IHNpemUpOiBGaWx0ZXIgaGF2ZSBub3QgY29udmVydGVkIGFueXRoaW5nLg0KKyAgLy8gICAgICBhbmQgaXQgbmVlZHMgYXQgbGVhc3Qgb3V0U2l6ZSBieXRlcyB0byBjb252ZXJ0IG9uZSBibG9jaw0KKyAgLy8gICAgICAoaXQncyBmb3IgY3J5cHRvIGJsb2NrIGFsZ29yaXRobXMpLg0KK307DQorDQorQ09ERVJfSU5URVJGQUNFKElDb21wcmVzc0NvZGVjc0luZm8sIDB4NjApDQorew0KKyAgU1RETUVUSE9EKEdldE51bWJlck9mTWV0aG9kcykoVUludDMyICpudW1NZXRob2RzKSBQVVJFOw0KKyAgU1RETUVUSE9EKEdldFByb3BlcnR5KShVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIFBST1BWQVJJQU5UICp2YWx1ZSkgUFVSRTsNCisgIFNURE1FVEhPRChDcmVhdGVEZWNvZGVyKShVSW50MzIgaW5kZXgsIGNvbnN0IEdVSUQgKmlpZCwgdm9pZCAqKmNvZGVyKSBQVVJFOw0KKyAgU1RETUVUSE9EKENyZWF0ZUVuY29kZXIpKFVJbnQzMiBpbmRleCwgY29uc3QgR1VJRCAqaWlkLCB2b2lkICoqY29kZXIpIFBVUkU7DQorfTsNCitDT0RFUl9JTlRFUkZBQ0UoSVNldENvbXByZXNzQ29kZWNzSW5mbywgMHg2MSkNCit7DQorICBTVERNRVRIT0QoU2V0Q29tcHJlc3NDb2RlY3NJbmZvKShJQ29tcHJlc3NDb2RlY3NJbmZvICpjb21wcmVzc0NvZGVjc0luZm8pIFBVUkU7DQorfTsNCisNCitDT0RFUl9JTlRFUkZBQ0UoSUNyeXB0b1Byb3BlcnRpZXMsIDB4ODApDQorew0KKyAgU1RETUVUSE9EKFNldEtleSkoY29uc3QgQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpIFBVUkU7DQorICBTVERNRVRIT0QoU2V0SW5pdFZlY3RvcikoY29uc3QgQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpIFBVUkU7DQorfTsNCisNCisvKg0KK0NPREVSX0lOVEVSRkFDRShJQ3J5cHRvUmVzZXRTYWx0LCAweDg4KQ0KK3sNCisgIFNURE1FVEhPRChSZXNldFNhbHQpKCkgUFVSRTsNCit9Ow0KKyovDQorDQorQ09ERVJfSU5URVJGQUNFKElDcnlwdG9SZXNldEluaXRWZWN0b3IsIDB4OEMpDQorew0KKyAgU1RETUVUSE9EKFJlc2V0SW5pdFZlY3RvcikoKSBQVVJFOw0KK307DQorDQorQ09ERVJfSU5URVJGQUNFKElDcnlwdG9TZXRQYXNzd29yZCwgMHg5MCkNCit7DQorICBTVERNRVRIT0QoQ3J5cHRvU2V0UGFzc3dvcmQpKGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKSBQVVJFOw0KK307DQorDQorQ09ERVJfSU5URVJGQUNFKElDcnlwdG9TZXRDUkMsIDB4QTApDQorew0KKyAgU1RETUVUSE9EKENyeXB0b1NldENSQykoVUludDMyIGNyYykgUFVSRTsNCit9Ow0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBJdCdzIGZvciBETEwgZmlsZQ0KK25hbWVzcGFjZSBOTWV0aG9kUHJvcElEDQorew0KKyAgZW51bSBFRW51bQ0KKyAgew0KKyAgICBrSUQsDQorICAgIGtOYW1lLA0KKyAgICBrRGVjb2RlciwNCisgICAga0VuY29kZXIsDQorICAgIGtJblN0cmVhbXMsDQorICAgIGtPdXRTdHJlYW1zLA0KKyAgICBrRGVzY3JpcHRpb24sDQorICAgIGtEZWNvZGVySXNBc3NpZ25lZCwNCisgICAga0VuY29kZXJJc0Fzc2lnbmVkLA0KKyAgICBrRGlnZXN0U2l6ZQ0KKyAgfTsNCit9DQorDQorQ09ERVJfSU5URVJGQUNFKElIYXNoZXIsIDB4QzApDQorew0KKyAgU1RETUVUSE9EXyh2b2lkLCBJbml0KSgpIFBVUkU7DQorICBTVERNRVRIT0RfKHZvaWQsIFVwZGF0ZSkoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUpIFBVUkU7DQorICBTVERNRVRIT0RfKHZvaWQsIEZpbmFsKShCeXRlICpkaWdlc3QpIFBVUkU7DQorICBTVERNRVRIT0RfKFVJbnQzMiwgR2V0RGlnZXN0U2l6ZSkoKSBQVVJFOw0KK307DQorDQorQ09ERVJfSU5URVJGQUNFKElIYXNoZXJzLCAweEMxKQ0KK3sNCisgIFNURE1FVEhPRF8oVUludDMyLCBHZXROdW1IYXNoZXJzKSgpIFBVUkU7DQorICBTVERNRVRIT0QoR2V0SGFzaGVyUHJvcCkoVUludDMyIGluZGV4LCBQUk9QSUQgcHJvcElELCBQUk9QVkFSSUFOVCAqdmFsdWUpIFBVUkU7DQorICBTVERNRVRIT0QoQ3JlYXRlSGFzaGVyKShVSW50MzIgaW5kZXgsIElIYXNoZXIgKipoYXNoZXIpIFBVUkU7DQorfTsNCisNCitleHRlcm4gIkMiDQorew0KKyAgdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkgKkZ1bmNfR2V0TnVtYmVyT2ZNZXRob2RzKShVSW50MzIgKm51bU1ldGhvZHMpOw0KKyAgdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkgKkZ1bmNfR2V0TWV0aG9kUHJvcGVydHkpKFVJbnQzMiBpbmRleCwgUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKTsNCisgIHR5cGVkZWYgSFJFU1VMVCAoV0lOQVBJICpGdW5jX0dldEhhc2hlcnMpKElIYXNoZXJzICoqaGFzaGVycyk7DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvSURlY2wuaCBiL2x6bWEvQ1BQLzd6aXAvSURlY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhiYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9JRGVjbC5oCkBAIC0wLDAgKzEsMTUgQEAKKy8vIElEZWNsLmgNCisNCisjaWZuZGVmIF9fSURFQ0xfSA0KKyNkZWZpbmUgX19JREVDTF9IDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9NeVVua25vd24uaCINCisNCisjZGVmaW5lIERFQ0xfSU5URVJGQUNFX1NVQihpLCBiYXNlLCBncm91cElkLCBzdWJJZCkgXA0KK0RFRklORV9HVUlEKElJRF8gIyMgaSwgXA0KKzB4MjMxNzBGNjksIDB4NDBDMSwgMHgyNzhBLCAwLCAwLCAwLCAoZ3JvdXBJZCksIDAsIChzdWJJZCksIDAsIDApOyBcDQorc3RydWN0IGk6IHB1YmxpYyBiYXNlDQorDQorI2RlZmluZSBERUNMX0lOVEVSRkFDRShpLCBncm91cElkLCBzdWJJZCkgREVDTF9JTlRFUkZBQ0VfU1VCKGksIElVbmtub3duLCBncm91cElkLCBzdWJJZCkNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0lQYXNzd29yZC5oIGIvbHptYS9DUFAvN3ppcC9JUGFzc3dvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzY2MDA3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9JUGFzc3dvcmQuaApAQCAtMCwwICsxLDIzIEBACisvLyBJUGFzc3dvcmQuaA0KKw0KKyNpZm5kZWYgX19JUEFTU1dPUkRfSA0KKyNkZWZpbmUgX19JUEFTU1dPUkRfSA0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlUeXBlcy5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlVbmtub3duLmgiDQorDQorI2luY2x1ZGUgIklEZWNsLmgiDQorDQorI2RlZmluZSBQQVNTV09SRF9JTlRFUkZBQ0UoaSwgeCkgREVDTF9JTlRFUkZBQ0UoaSwgNSwgeCkNCisNCitQQVNTV09SRF9JTlRFUkZBQ0UoSUNyeXB0b0dldFRleHRQYXNzd29yZCwgMHgxMCkNCit7DQorICBTVERNRVRIT0QoQ3J5cHRvR2V0VGV4dFBhc3N3b3JkKShCU1RSICpwYXNzd29yZCkgUFVSRTsNCit9Ow0KKw0KK1BBU1NXT1JEX0lOVEVSRkFDRShJQ3J5cHRvR2V0VGV4dFBhc3N3b3JkMiwgMHgxMSkNCit7DQorICBTVERNRVRIT0QoQ3J5cHRvR2V0VGV4dFBhc3N3b3JkMikoSW50MzIgKnBhc3N3b3JkSXNEZWZpbmVkLCBCU1RSICpwYXNzd29yZCkgUFVSRTsNCit9Ow0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvSVByb2dyZXNzLmggYi9sem1hL0NQUC83emlwL0lQcm9ncmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OGY0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0lQcm9ncmVzcy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vIEludGVyZmFjZS9JUHJvZ3Jlc3MuaA0KKw0KKyNpZm5kZWYgX19JUFJPR1JFU1NfSA0KKyNkZWZpbmUgX19JUFJPR1JFU1NfSA0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlUeXBlcy5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlVbmtub3duLmgiDQorDQorI2luY2x1ZGUgIklEZWNsLmgiDQorDQorI2RlZmluZSBJTlRFUkZBQ0VfSVByb2dyZXNzKHgpIFwNCisgIFNURE1FVEhPRChTZXRUb3RhbCkoVUludDY0IHRvdGFsKSB4OyBcDQorICBTVERNRVRIT0QoU2V0Q29tcGxldGVkKShjb25zdCBVSW50NjQgKmNvbXBsZXRlVmFsdWUpIHg7IFwNCisNCitERUNMX0lOVEVSRkFDRShJUHJvZ3Jlc3MsIDAsIDUpDQorew0KKyAgSU5URVJGQUNFX0lQcm9ncmVzcyhQVVJFKQ0KK307DQorDQorLyoNCisvLyB7MjMxNzBGNjktNDBDMS0yNzhBLTAwMDAtMDAwMDAwMDUwMDAyfQ0KK0RFRklORV9HVUlEKElJRF9JUHJvZ3Jlc3MyLA0KKzB4MjMxNzBGNjksIDB4NDBDMSwgMHgyNzhBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAyKTsNCitNSURMX0lOVEVSRkFDRSgiMjMxNzBGNjktNDBDMS0yNzhBLTAwMDAtMDAwMDAwMDUwMDAyIikNCitJUHJvZ3Jlc3MyOiBwdWJsaWMgSVVua25vd24NCit7DQorcHVibGljOg0KKyAgU1RETUVUSE9EKFNldFRvdGFsKShjb25zdCBVSW50NjQgKnRvdGFsKSBQVVJFOw0KKyAgU1RETUVUSE9EKFNldENvbXBsZXRlZCkoY29uc3QgVUludDY0ICpjb21wbGV0ZVZhbHVlKSBQVVJFOw0KK307DQorKi8NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL0lTdHJlYW0uaCBiL2x6bWEvQ1BQLzd6aXAvSVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNDdkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL0lTdHJlYW0uaApAQCAtMCwwICsxLDEyNyBAQAorLy8gSVN0cmVhbS5oDQorDQorI2lmbmRlZiBfX0lTVFJFQU1fSA0KKyNkZWZpbmUgX19JU1RSRUFNX0gNCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL015VHlwZXMuaCINCisjaW5jbHVkZSAiLi4vQ29tbW9uL015VW5rbm93bi5oIg0KKw0KKyNpbmNsdWRlICJJRGVjbC5oIg0KKw0KKyNkZWZpbmUgU1RSRUFNX0lOVEVSRkFDRV9TVUIoaSwgYmFzZSwgeCkgREVDTF9JTlRFUkZBQ0VfU1VCKGksIGJhc2UsIDMsIHgpDQorI2RlZmluZSBTVFJFQU1fSU5URVJGQUNFKGksIHgpIFNUUkVBTV9JTlRFUkZBQ0VfU1VCKGksIElVbmtub3duLCB4KQ0KKw0KK1NUUkVBTV9JTlRFUkZBQ0UoSVNlcXVlbnRpYWxJblN0cmVhbSwgMHgwMSkNCit7DQorICBTVERNRVRIT0QoUmVhZCkodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkgUFVSRTsNCisgIA0KKyAgLyoNCisgIFRoZSByZXF1aXJlbWVudCBmb3IgY2FsbGVyOiAocHJvY2Vzc2VkU2l6ZSAhPSBOVUxMKS4NCisgIFRoZSBjYWxsZWUgY2FuIGFsbG93IChwcm9jZXNzZWRTaXplID09IE5VTEwpIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuDQorICAgIA0KKyAgaWYgKHNpemUgPT0gMCksIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBTX09LIGFuZCAoKnByb2Nlc3NlZFNpemUpIGlzIHNldCB0byAwLg0KKw0KKyAgaWYgKHNpemUgIT0gMCkNCisgIHsNCisgICAgUGFydGlhbCByZWFkIGlzIGFsbG93ZWQ6ICgqcHJvY2Vzc2VkU2l6ZSA8PSBhdmFpbF9zaXplICYmICpwcm9jZXNzZWRTaXplIDw9IHNpemUpLA0KKyAgICAgIHdoZXJlIChhdmFpbF9zaXplKSBpcyB0aGUgc2l6ZSBvZiByZW1haW5pbmcgYnl0ZXMgaW4gc3RyZWFtLg0KKyAgICBJZiAoYXZhaWxfc2l6ZSAhPSAwKSwgdGhpcyBmdW5jdGlvbiBtdXN0IHJlYWQgYXQgbGVhc3QgMSBieXRlOiAoKnByb2Nlc3NlZFNpemUgPiAwKS4NCisgICAgWW91IG11c3QgY2FsbCBSZWFkKCkgaW4gbG9vcCwgaWYgeW91IG5lZWQgdG8gcmVhZCBleGFjdCBhbW91bnQgb2YgZGF0YS4NCisgIH0NCisNCisgIElmIHNlZWsgcG9pbnRlciBiZWZvcmUgUmVhZCgpIGNhbGwgd2FzIGNoYW5nZWQgdG8gcG9zaXRpb24gcGFzdCB0aGUgZW5kIG9mIHN0cmVhbToNCisgICAgaWYgKHNlZWtfcG9pbnRlciA+PSBzdHJlYW1fc2l6ZSksIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBTX09LIGFuZCAoKnByb2Nlc3NlZFNpemUpIGlzIHNldCB0byAwLg0KKyAgDQorICBFUlJPUiBDQVNFUzoNCisgICAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZXJyb3IgY29kZSwgdGhlbiAoKnByb2Nlc3NlZFNpemUpIGlzIHNpemUgb2YNCisgICAgZGF0YSB3cml0dGVuIHRvIChkYXRhKSBidWZmZXIgKGl0IGNhbiBiZSBkYXRhIGJlZm9yZSBlcnJvciBvciBkYXRhIHdpdGggZXJyb3JzKS4NCisgICAgVGhlIHJlY29tbWVuZGVkIHdheSBmb3IgY2FsbGVlIHRvIHdvcmsgd2l0aCByZWFkaW5nIGVycm9yczoNCisgICAgICAxKSB3cml0ZSBwYXJ0IG9mIGRhdGEgYmVmb3JlIGVycm9yIHRvIChkYXRhKSBidWZmZXIgYW5kIHJldHVybiBTX09LLg0KKyAgICAgIDIpIHJldHVybiBlcnJvciBjb2RlIGZvciBmdXJ0aGVyIGNhbGxzIG9mIFJlYWQoKS4NCisgICovDQorfTsNCisNCitTVFJFQU1fSU5URVJGQUNFKElTZXF1ZW50aWFsT3V0U3RyZWFtLCAweDAyKQ0KK3sNCisgIFNURE1FVEhPRChXcml0ZSkoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSkgUFVSRTsNCisgIA0KKyAgLyoNCisgIFRoZSByZXF1aXJlbWVudCBmb3IgY2FsbGVyOiAocHJvY2Vzc2VkU2l6ZSAhPSBOVUxMKS4NCisgIFRoZSBjYWxsZWUgY2FuIGFsbG93IChwcm9jZXNzZWRTaXplID09IE5VTEwpIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuDQorDQorICBpZiAoc2l6ZSAhPSAwKQ0KKyAgew0KKyAgICBQYXJ0aWFsIHdyaXRlIGlzIGFsbG93ZWQ6ICgqcHJvY2Vzc2VkU2l6ZSA8PSBzaXplKSwNCisgICAgYnV0IHRoaXMgZnVuY3Rpb24gbXVzdCB3cml0ZSBhdCBsZWFzdCAxIGJ5dGU6ICgqcHJvY2Vzc2VkU2l6ZSA+IDApLg0KKyAgICBZb3UgbXVzdCBjYWxsIFdyaXRlKCkgaW4gbG9vcCwgaWYgeW91IG5lZWQgdG8gd3JpdGUgZXhhY3QgYW1vdW50IG9mIGRhdGEuDQorICB9DQorDQorICBFUlJPUiBDQVNFUzoNCisgICAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZXJyb3IgY29kZSwgdGhlbiAoKnByb2Nlc3NlZFNpemUpIGlzIHNpemUgb2YNCisgICAgZGF0YSB3cml0dGVuIGZyb20gKGRhdGEpIGJ1ZmZlci4NCisgICovDQorfTsNCisNCisjaWZkZWYgX19IUkVTVUxUX0ZST01fV0lOMzINCisjZGVmaW5lIEhSRVNVTFRfV0lOMzJfRVJST1JfTkVHQVRJVkVfU0VFSyBfX0hSRVNVTFRfRlJPTV9XSU4zMihFUlJPUl9ORUdBVElWRV9TRUVLKQ0KKyNlbHNlDQorI2RlZmluZSBIUkVTVUxUX1dJTjMyX0VSUk9SX05FR0FUSVZFX1NFRUsgICBIUkVTVUxUX0ZST01fV0lOMzIoRVJST1JfTkVHQVRJVkVfU0VFSykNCisjZW5kaWYNCisNCisvKiAgU2VlaygpIEZ1bmN0aW9uDQorICBJZiB5b3Ugc2VlayBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLCBTZWVrKCkgZnVuY3Rpb24gcmV0dXJucyBlcnJvciBjb2RlOg0KKyAgICAgIFJlY29tbWVuZGVkIGVycm9yIGNvZGUgaXMgX19IUkVTVUxUX0ZST01fV0lOMzIoRVJST1JfTkVHQVRJVkVfU0VFSykuDQorICAgICAgb3IgU1RHX0VfSU5WQUxJREZVTkNUSU9ODQorICAgICAgDQorICBJdCBpcyBhbGxvd2VkIHRvIHNlZWsgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uDQorDQorDQorICBpZiBTZWVrKCkgcmV0dXJucyBlcnJvciwgdGhlbiB0aGUgdmFsdWUgb2YgKm5ld1Bvc2l0aW9uIGlzIHVuZGVmaW5lZC4NCisqLw0KKw0KK1NUUkVBTV9JTlRFUkZBQ0VfU1VCKElJblN0cmVhbSwgSVNlcXVlbnRpYWxJblN0cmVhbSwgMHgwMykNCit7DQorICBTVERNRVRIT0QoU2VlaykoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbikgUFVSRTsNCit9Ow0KKw0KK1NUUkVBTV9JTlRFUkZBQ0VfU1VCKElPdXRTdHJlYW0sIElTZXF1ZW50aWFsT3V0U3RyZWFtLCAweDA0KQ0KK3sNCisgIFNURE1FVEhPRChTZWVrKShJbnQ2NCBvZmZzZXQsIFVJbnQzMiBzZWVrT3JpZ2luLCBVSW50NjQgKm5ld1Bvc2l0aW9uKSBQVVJFOw0KKyAgU1RETUVUSE9EKFNldFNpemUpKFVJbnQ2NCBuZXdTaXplKSBQVVJFOw0KK307DQorDQorU1RSRUFNX0lOVEVSRkFDRShJU3RyZWFtR2V0U2l6ZSwgMHgwNikNCit7DQorICBTVERNRVRIT0QoR2V0U2l6ZSkoVUludDY0ICpzaXplKSBQVVJFOw0KK307DQorDQorU1RSRUFNX0lOVEVSRkFDRShJT3V0U3RyZWFtRmx1c2gsIDB4MDcpDQorew0KKyAgU1RETUVUSE9EKEZsdXNoKSgpIFBVUkU7DQorfTsNCisNCisNCitTVFJFQU1fSU5URVJGQUNFKElTdHJlYW1HZXRQcm9wcywgMHgwOCkNCit7DQorICBTVERNRVRIT0QoR2V0UHJvcHMpKFVJbnQ2NCAqc2l6ZSwgRklMRVRJTUUgKmNUaW1lLCBGSUxFVElNRSAqYVRpbWUsIEZJTEVUSU1FICptVGltZSwgVUludDMyICphdHRyaWIpIFBVUkU7DQorfTsNCisNCitzdHJ1Y3QgQ1N0cmVhbUZpbGVQcm9wcw0KK3sNCisgIFVJbnQ2NCBTaXplOw0KKyAgVUludDY0IFZvbElEOw0KKyAgVUludDY0IEZpbGVJRF9Mb3c7DQorICBVSW50NjQgRmlsZUlEX0hpZ2g7DQorICBVSW50MzIgTnVtTGlua3M7DQorICBVSW50MzIgQXR0cmliOw0KKyAgRklMRVRJTUUgQ1RpbWU7DQorICBGSUxFVElNRSBBVGltZTsNCisgIEZJTEVUSU1FIE1UaW1lOw0KK307DQorDQorU1RSRUFNX0lOVEVSRkFDRShJU3RyZWFtR2V0UHJvcHMyLCAweDA5KQ0KK3sNCisgIFNURE1FVEhPRChHZXRQcm9wczIpKENTdHJlYW1GaWxlUHJvcHMgKnByb3BzKSBQVVJFOw0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9NeVZlcnNpb24uaCBiL2x6bWEvQ1BQLzd6aXAvTXlWZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlNmM1OAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvTXlWZXJzaW9uLmgKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSAiLi5cLi5cQ1w3elZlcnNpb24uaCINCisNCisjdW5kZWYgTVlfQ09QWVJJR0hUDQorI3VuZGVmIE1ZX1ZFUlNJT05fQ09QWVJJR0hUX0RBVEUNCisjZGVmaW5lIE1ZX0NPUFlSSUdIVCAiQ29weXJpZ2h0IChjKSAxOTk5LTIwMTQgSWdvciBQYXZsb3YiDQorI2RlZmluZSBNWV9WRVJTSU9OX0NPUFlSSUdIVF9EQVRFIE1ZX1ZFUlNJT04gIiAgIiBNWV9DT1BZUklHSFQgIiAgIiBNWV9EQVRFDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9NeVZlcnNpb25JbmZvLnJjIGIvbHptYS9DUFAvN3ppcC9NeVZlcnNpb25JbmZvLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZGY4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL015VmVyc2lvbkluZm8ucmMKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAiTXlWZXJzaW9uLmgiDQorI2luY2x1ZGUgIi4uXC4uXENcN3pWZXJzaW9uLnJjIg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvUHJvcElELmggYi9sem1hL0NQUC83emlwL1Byb3BJRC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMmFjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1Byb3BJRC5oCkBAIC0wLDAgKzEsMTI0IEBACisvLyBQcm9wSUQuaA0KKw0KKyNpZm5kZWYgX183WklQX1BST1BfSURfSA0KKyNkZWZpbmUgX183WklQX1BST1BfSURfSA0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlUeXBlcy5oIg0KKw0KK2VudW0NCit7DQorICBrcGlkTm9Qcm9wZXJ0eSA9IDAsDQorICBrcGlkTWFpblN1YmZpbGUsDQorICBrcGlkSGFuZGxlckl0ZW1JbmRleCwNCisgIGtwaWRQYXRoLA0KKyAga3BpZE5hbWUsDQorICBrcGlkRXh0ZW5zaW9uLA0KKyAga3BpZElzRGlyLA0KKyAga3BpZFNpemUsDQorICBrcGlkUGFja1NpemUsDQorICBrcGlkQXR0cmliLA0KKyAga3BpZENUaW1lLA0KKyAga3BpZEFUaW1lLA0KKyAga3BpZE1UaW1lLA0KKyAga3BpZFNvbGlkLA0KKyAga3BpZENvbW1lbnRlZCwNCisgIGtwaWRFbmNyeXB0ZWQsDQorICBrcGlkU3BsaXRCZWZvcmUsDQorICBrcGlkU3BsaXRBZnRlciwNCisgIGtwaWREaWN0aW9uYXJ5U2l6ZSwNCisgIGtwaWRDUkMsDQorICBrcGlkVHlwZSwNCisgIGtwaWRJc0FudGksDQorICBrcGlkTWV0aG9kLA0KKyAga3BpZEhvc3RPUywNCisgIGtwaWRGaWxlU3lzdGVtLA0KKyAga3BpZFVzZXIsDQorICBrcGlkR3JvdXAsDQorICBrcGlkQmxvY2ssDQorICBrcGlkQ29tbWVudCwNCisgIGtwaWRQb3NpdGlvbiwNCisgIGtwaWRQcmVmaXgsDQorICBrcGlkTnVtU3ViRGlycywNCisgIGtwaWROdW1TdWJGaWxlcywNCisgIGtwaWRVbnBhY2tWZXIsDQorICBrcGlkVm9sdW1lLA0KKyAga3BpZElzVm9sdW1lLA0KKyAga3BpZE9mZnNldCwNCisgIGtwaWRMaW5rcywNCisgIGtwaWROdW1CbG9ja3MsDQorICBrcGlkTnVtVm9sdW1lcywNCisgIGtwaWRUaW1lVHlwZSwNCisgIGtwaWRCaXQ2NCwNCisgIGtwaWRCaWdFbmRpYW4sDQorICBrcGlkQ3B1LA0KKyAga3BpZFBoeVNpemUsDQorICBrcGlkSGVhZGVyc1NpemUsDQorICBrcGlkQ2hlY2tzdW0sDQorICBrcGlkQ2hhcmFjdHMsDQorICBrcGlkVmEsDQorICBrcGlkSWQsDQorICBrcGlkU2hvcnROYW1lLA0KKyAga3BpZENyZWF0b3JBcHAsDQorICBrcGlkU2VjdG9yU2l6ZSwNCisgIGtwaWRQb3NpeEF0dHJpYiwNCisgIGtwaWRTeW1MaW5rLA0KKyAga3BpZEVycm9yLA0KKyAga3BpZFRvdGFsU2l6ZSwNCisgIGtwaWRGcmVlU3BhY2UsDQorICBrcGlkQ2x1c3RlclNpemUsDQorICBrcGlkVm9sdW1lTmFtZSwNCisgIGtwaWRMb2NhbE5hbWUsDQorICBrcGlkUHJvdmlkZXIsDQorICBrcGlkTnRTZWN1cmUsDQorICBrcGlkSXNBbHRTdHJlYW0sDQorICBrcGlkSXNBdXgsDQorICBrcGlkSXNEZWxldGVkLA0KKyAga3BpZElzVHJlZSwNCisgIGtwaWRTaGExLA0KKyAga3BpZFNoYTI1NiwNCisgIGtwaWRFcnJvclR5cGUsDQorICBrcGlkTnVtRXJyb3JzLA0KKyAga3BpZEVycm9yRmxhZ3MsDQorICBrcGlkV2FybmluZ0ZsYWdzLA0KKyAga3BpZFdhcm5pbmcsDQorICBrcGlkTnVtU3RyZWFtcywNCisgIGtwaWROdW1BbHRTdHJlYW1zLA0KKyAga3BpZEFsdFN0cmVhbXNTaXplLA0KKyAga3BpZFZpcnR1YWxTaXplLA0KKyAga3BpZFVucGFja1NpemUsDQorICBrcGlkVG90YWxQaHlTaXplLA0KKyAga3BpZFZvbHVtZUluZGV4LA0KKyAga3BpZFN1YlR5cGUsDQorICBrcGlkU2hvcnRDb21tZW50LA0KKyAga3BpZENvZGVQYWdlLA0KKyAga3BpZElzTm90QXJjVHlwZSwNCisgIGtwaWRQaHlTaXplQ2FudEJlRGV0ZWN0ZWQsDQorICBrcGlkWmVyb3NUYWlsSXNBbGxvd2VkLA0KKyAga3BpZFRhaWxTaXplLA0KKyAga3BpZEVtYmVkZGVkU3R1YlNpemUsDQorICBrcGlkTnRSZXBhcnNlLA0KKyAga3BpZEhhcmRMaW5rLA0KKyAga3BpZElOb2RlLA0KKyAga3BpZFN0cmVhbUlkLA0KKw0KKyAga3BpZF9OVU1fREVGSU5FRCwNCisNCisgIGtwaWRVc2VyRGVmaW5lZCA9IDB4MTAwMDANCit9Ow0KKw0KK2V4dGVybiBCeXRlIGs3el9QUk9QSURfVG9fVkFSVFlQRVtrcGlkX05VTV9ERUZJTkVEXTsgLy8gVkFSVFlQRQ0KKw0KK2NvbnN0IFVJbnQzMiBrcHZfRXJyb3JGbGFnc19Jc05vdEFyYyAgICAgICAgICAgICAgPSAxIDw8IDA7DQorY29uc3QgVUludDMyIGtwdl9FcnJvckZsYWdzX0hlYWRlcnNFcnJvciAgICAgICAgICA9IDEgPDwgMTsNCitjb25zdCBVSW50MzIga3B2X0Vycm9yRmxhZ3NfRW5jcnlwdGVkSGVhZGVyc0Vycm9yID0gMSA8PCAyOw0KK2NvbnN0IFVJbnQzMiBrcHZfRXJyb3JGbGFnc19VbmF2YWlsYWJsZVN0YXJ0ICAgICAgPSAxIDw8IDM7DQorY29uc3QgVUludDMyIGtwdl9FcnJvckZsYWdzX1VuY29uZmlybWVkU3RhcnQgICAgICA9IDEgPDwgNDsNCitjb25zdCBVSW50MzIga3B2X0Vycm9yRmxhZ3NfVW5leHBlY3RlZEVuZCAgICAgICAgID0gMSA8PCA1Ow0KK2NvbnN0IFVJbnQzMiBrcHZfRXJyb3JGbGFnc19EYXRhQWZ0ZXJFbmQgICAgICAgICAgPSAxIDw8IDY7DQorY29uc3QgVUludDMyIGtwdl9FcnJvckZsYWdzX1Vuc3VwcG9ydGVkTWV0aG9kICAgICA9IDEgPDwgNzsNCitjb25zdCBVSW50MzIga3B2X0Vycm9yRmxhZ3NfVW5zdXBwb3J0ZWRGZWF0dXJlICAgID0gMSA8PCA4Ow0KK2NvbnN0IFVJbnQzMiBrcHZfRXJyb3JGbGFnc19EYXRhRXJyb3IgICAgICAgICAgICAgPSAxIDw8IDk7DQorY29uc3QgVUludDMyIGtwdl9FcnJvckZsYWdzX0NyY0Vycm9yICAgICAgICAgICAgICA9IDEgPDwgMTA7DQorLy8gY29uc3QgVUludDMyIGtwdl9FcnJvckZsYWdzX1Vuc3VwcG9ydGVkICAgICAgICAgICA9IDEgPDwgMTE7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9TdWJCdWlsZC5tYWsgYi9sem1hL0NQUC83emlwL1N1YkJ1aWxkLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzQ5ZDNiCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9TdWJCdWlsZC5tYWsKQEAgLTAsMCArMSwzIEBACisJY2QgJChARCkNCisJJChNQUtFKSAtbm9sb2dvICQoVEFSR0VUUykNCisJY2QgLi4NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NsaWVudDd6L0NsaWVudDd6LmNwcCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ2xpZW50N3ovQ2xpZW50N3ouY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMWViNTYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NsaWVudDd6L0NsaWVudDd6LmNwcApAQCAtMCwwICsxLDkyMyBAQAorLy8gQ2xpZW50N3ouY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vRGVmcy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlJbml0R3VpZC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vSW50VG9TdHJpbmcuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9ETEwuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlRGlyLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZUZpbmQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlTmFtZS5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL050Q2hlY2suaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9Qcm9wVmFyaWFudC5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1Byb3BWYXJpYW50Q29udi5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vRmlsZVN0cmVhbXMuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQXJjaGl2ZS9JQXJjaGl2ZS5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9JUGFzc3dvcmQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vQy83elZlcnNpb24uaCINCisNCisjaWZkZWYgX1dJTjMyDQorSElOU1RBTkNFIGdfaEluc3RhbmNlID0gMDsNCisjZW5kaWYNCisNCisvLyBUb3UgY2FuIGZpbmQgdGhlIGxpc3Qgb2YgYWxsIEdVSURzIGluIEd1aWQudHh0IGZpbGUuDQorLy8gdXNlIGFub3RoZXIgQ0xTSURzLCBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IG90aGVyIGZvcm1hdHMgKHppcCwgcmFyLCAuLi4pLg0KKy8vIHsyMzE3MEY2OS00MEMxLTI3OEEtMTAwMC0wMDAxMTAwNzAwMDB9DQorREVGSU5FX0dVSUQoQ0xTSURfQ0Zvcm1hdDd6LA0KKyAgMHgyMzE3MEY2OSwgMHg0MEMxLCAweDI3OEEsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MTAsIDB4MDcsIDB4MDAsIDB4MDApOw0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCit1c2luZyBuYW1lc3BhY2UgTkZpbGU7DQordXNpbmcgbmFtZXNwYWNlIE5EaXI7DQorDQorI2RlZmluZSBrRGxsTmFtZSAiN3ouZGxsIg0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICprQ29weXJpZ2h0U3RyaW5nID0gIlxuNy1aaXAgIiBNWV9WRVJTSU9ODQorIiAoIiAga0RsbE5hbWUgIiBjbGllbnQpICINCitNWV9DT1BZUklHSFQgIiAiIE1ZX0RBVEUgIlxuIjsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqa0hlbHBTdHJpbmcgPQ0KKyJVc2FnZTogQ2xpZW50N3ouZXhlIFthIHwgbCB8IHggXSBhcmNoaXZlLjd6IFtmaWxlTmFtZSAuLi5dXG4iDQorIkV4YW1wbGVzOlxuIg0KKyIgIENsaWVudDd6LmV4ZSBhIGFyY2hpdmUuN3ogZjEudHh0IGYyLnR4dCAgOiBjb21wcmVzcyB0d28gZmlsZXMgdG8gYXJjaGl2ZS43elxuIg0KKyIgIENsaWVudDd6LmV4ZSBsIGFyY2hpdmUuN3ogICA6IExpc3QgY29udGVudHMgb2YgYXJjaGl2ZS43elxuIg0KKyIgIENsaWVudDd6LmV4ZSB4IGFyY2hpdmUuN3ogICA6IGVYdHJhY3QgZmlsZXMgZnJvbSBhcmNoaXZlLjd6XG4iOw0KKw0KKw0KK3N0YXRpYyBBU3RyaW5nIEZTdHJpbmdUb0NvbnNvbGVTdHJpbmcoY29uc3QgRlN0cmluZyAmcykNCit7DQorICByZXR1cm4gR2V0T2VtU3RyaW5nKGZzMnVzKHMpKTsNCit9DQorDQorc3RhdGljIEZTdHJpbmcgQ21kU3RyaW5nVG9GU3RyaW5nKGNvbnN0IGNoYXIgKnMpDQorew0KKyAgcmV0dXJuIHVzMmZzKEdldFVuaWNvZGVTdHJpbmcocykpOw0KK30NCisNCitzdGF0aWMgdm9pZCBQcmludFN0cmluZyhjb25zdCBVU3RyaW5nICZzKQ0KK3sNCisgIHByaW50ZigiJXMiLCAoTFBDU1RSKUdldE9lbVN0cmluZyhzKSk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFByaW50U3RyaW5nKGNvbnN0IEFTdHJpbmcgJnMpDQorew0KKyAgcHJpbnRmKCIlcyIsIChMUENTVFIpcyk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFByaW50TmV3TGluZSgpDQorew0KKyAgUHJpbnRTdHJpbmcoIlxuIik7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFByaW50U3RyaW5nTG4oY29uc3QgQVN0cmluZyAmcykNCit7DQorICBQcmludFN0cmluZyhzKTsNCisgIFByaW50TmV3TGluZSgpOw0KK30NCisNCitzdGF0aWMgdm9pZCBQcmludEVycm9yKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGNvbnN0IEZTdHJpbmcgJm5hbWUpDQorew0KKyAgcHJpbnRmKCJFcnJvcjogJXMiLCAoTFBDU1RSKW1lc3NhZ2UpOw0KKyAgUHJpbnROZXdMaW5lKCk7DQorICBQcmludFN0cmluZyhGU3RyaW5nVG9Db25zb2xlU3RyaW5nKG5hbWUpKTsNCisgIFByaW50TmV3TGluZSgpOw0KK30NCisNCitzdGF0aWMgdm9pZCBQcmludEVycm9yKGNvbnN0IEFTdHJpbmcgJnMpDQorew0KKyAgUHJpbnROZXdMaW5lKCk7DQorICBQcmludFN0cmluZyhzKTsNCisgIFByaW50TmV3TGluZSgpOw0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBJc0FyY2hpdmVJdGVtUHJvcChJSW5BcmNoaXZlICphcmNoaXZlLCBVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIGJvb2wgJnJlc3VsdCkNCit7DQorICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgIFJJTk9LKGFyY2hpdmUtPkdldFByb3BlcnR5KGluZGV4LCBwcm9wSUQsICZwcm9wKSk7DQorICBpZiAocHJvcC52dCA9PSBWVF9CT09MKQ0KKyAgICByZXN1bHQgPSBWQVJJQU5UX0JPT0xUb0Jvb2wocHJvcC5ib29sVmFsKTsNCisgIGVsc2UgaWYgKHByb3AudnQgPT0gVlRfRU1QVFkpDQorICAgIHJlc3VsdCA9IGZhbHNlOw0KKyAgZWxzZQ0KKyAgICByZXR1cm4gRV9GQUlMOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0YXRpYyBIUkVTVUxUIElzQXJjaGl2ZUl0ZW1Gb2xkZXIoSUluQXJjaGl2ZSAqYXJjaGl2ZSwgVUludDMyIGluZGV4LCBib29sICZyZXN1bHQpDQorew0KKyAgcmV0dXJuIElzQXJjaGl2ZUl0ZW1Qcm9wKGFyY2hpdmUsIGluZGV4LCBrcGlkSXNEaXIsIHJlc3VsdCk7DQorfQ0KKw0KKw0KK3N0YXRpYyBjb25zdCB3Y2hhcl90ICprRW1wdHlGaWxlQWxpYXMgPSBMIltDb250ZW50XSI7DQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBBcmNoaXZlIE9wZW4gY2FsbGJhY2sgY2xhc3MNCisNCisNCitjbGFzcyBDQXJjaGl2ZU9wZW5DYWxsYmFjazoNCisgIHB1YmxpYyBJQXJjaGl2ZU9wZW5DYWxsYmFjaywNCisgIHB1YmxpYyBJQ3J5cHRvR2V0VGV4dFBhc3N3b3JkLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorcHVibGljOg0KKyAgTVlfVU5LTk9XTl9JTVAxKElDcnlwdG9HZXRUZXh0UGFzc3dvcmQpDQorDQorICBTVERNRVRIT0QoU2V0VG90YWwpKGNvbnN0IFVJbnQ2NCAqZmlsZXMsIGNvbnN0IFVJbnQ2NCAqYnl0ZXMpOw0KKyAgU1RETUVUSE9EKFNldENvbXBsZXRlZCkoY29uc3QgVUludDY0ICpmaWxlcywgY29uc3QgVUludDY0ICpieXRlcyk7DQorDQorICBTVERNRVRIT0QoQ3J5cHRvR2V0VGV4dFBhc3N3b3JkKShCU1RSICpwYXNzd29yZCk7DQorDQorICBib29sIFBhc3N3b3JkSXNEZWZpbmVkOw0KKyAgVVN0cmluZyBQYXNzd29yZDsNCisNCisgIENBcmNoaXZlT3BlbkNhbGxiYWNrKCkgOiBQYXNzd29yZElzRGVmaW5lZChmYWxzZSkge30NCit9Ow0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZU9wZW5DYWxsYmFjazo6U2V0VG90YWwoY29uc3QgVUludDY0ICogLyogZmlsZXMgKi8sIGNvbnN0IFVJbnQ2NCAqIC8qIGJ5dGVzICovKQ0KK3sNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVPcGVuQ2FsbGJhY2s6OlNldENvbXBsZXRlZChjb25zdCBVSW50NjQgKiAvKiBmaWxlcyAqLywgY29uc3QgVUludDY0ICogLyogYnl0ZXMgKi8pDQorew0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKyAgDQorU1RETUVUSE9ESU1QIENBcmNoaXZlT3BlbkNhbGxiYWNrOjpDcnlwdG9HZXRUZXh0UGFzc3dvcmQoQlNUUiAqcGFzc3dvcmQpDQorew0KKyAgaWYgKCFQYXNzd29yZElzRGVmaW5lZCkNCisgIHsNCisgICAgLy8gWW91IGNhbiBhc2sgcmVhbCBwYXNzd29yZCBoZXJlIGZyb20gdXNlcg0KKyAgICAvLyBQYXNzd29yZCA9IEdldFBhc3N3b3JkKE91dFN0cmVhbSk7DQorICAgIC8vIFBhc3N3b3JkSXNEZWZpbmVkID0gdHJ1ZTsNCisgICAgUHJpbnRFcnJvcigiUGFzc3dvcmQgaXMgbm90IGRlZmluZWQiKTsNCisgICAgcmV0dXJuIEVfQUJPUlQ7DQorICB9DQorICByZXR1cm4gU3RyaW5nVG9Cc3RyKFBhc3N3b3JkLCBwYXNzd29yZCk7DQorfQ0KKw0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQXJjaGl2ZSBFeHRyYWN0aW5nIGNhbGxiYWNrIGNsYXNzDQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtUZXN0aW5nU3RyaW5nICAgID0gICJUZXN0aW5nICAgICAiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprRXh0cmFjdGluZ1N0cmluZyA9ICAiRXh0cmFjdGluZyAgIjsNCitzdGF0aWMgY29uc3QgY2hhciAqa1NraXBwaW5nU3RyaW5nICAgPSAgIlNraXBwaW5nICAgICI7DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtVbnN1cHBvcnRlZE1ldGhvZCA9ICJVbnN1cHBvcnRlZCBNZXRob2QiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprQ1JDRmFpbGVkID0gIkNSQyBGYWlsZWQiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprRGF0YUVycm9yID0gIkRhdGEgRXJyb3IiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprVW5hdmFpbGFibGVEYXRhID0gIlVuYXZhaWxhYmxlIGRhdGEiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprVW5leHBlY3RlZEVuZCA9ICJVbmV4cGVjdGVkIGVuZCBvZiBkYXRhIjsNCitzdGF0aWMgY29uc3QgY2hhciAqa0RhdGFBZnRlckVuZCA9ICJUaGVyZSBhcmUgc29tZSBkYXRhIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHBheWxvYWQgZGF0YSI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtJc05vdEFyYyA9ICJJcyBub3QgYXJjaGl2ZSI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtIZWFkZXJzRXJyb3IgPSAiSGVhZGVycyBFcnJvciI7DQorDQorY2xhc3MgQ0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2s6DQorICBwdWJsaWMgSUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2ssDQorICBwdWJsaWMgSUNyeXB0b0dldFRleHRQYXNzd29yZCwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QMShJQ3J5cHRvR2V0VGV4dFBhc3N3b3JkKQ0KKw0KKyAgLy8gSVByb2dyZXNzDQorICBTVERNRVRIT0QoU2V0VG90YWwpKFVJbnQ2NCBzaXplKTsNCisgIFNURE1FVEhPRChTZXRDb21wbGV0ZWQpKGNvbnN0IFVJbnQ2NCAqY29tcGxldGVWYWx1ZSk7DQorDQorICAvLyBJQXJjaGl2ZUV4dHJhY3RDYWxsYmFjaw0KKyAgU1RETUVUSE9EKEdldFN0cmVhbSkoVUludDMyIGluZGV4LCBJU2VxdWVudGlhbE91dFN0cmVhbSAqKm91dFN0cmVhbSwgSW50MzIgYXNrRXh0cmFjdE1vZGUpOw0KKyAgU1RETUVUSE9EKFByZXBhcmVPcGVyYXRpb24pKEludDMyIGFza0V4dHJhY3RNb2RlKTsNCisgIFNURE1FVEhPRChTZXRPcGVyYXRpb25SZXN1bHQpKEludDMyIHJlc3VsdEVPcGVyYXRpb25SZXN1bHQpOw0KKw0KKyAgLy8gSUNyeXB0b0dldFRleHRQYXNzd29yZA0KKyAgU1RETUVUSE9EKENyeXB0b0dldFRleHRQYXNzd29yZCkoQlNUUiAqYVBhc3N3b3JkKTsNCisNCitwcml2YXRlOg0KKyAgQ015Q29tUHRyPElJbkFyY2hpdmU+IF9hcmNoaXZlSGFuZGxlcjsNCisgIEZTdHJpbmcgX2RpcmVjdG9yeVBhdGg7ICAvLyBPdXRwdXQgZGlyZWN0b3J5DQorICBVU3RyaW5nIF9maWxlUGF0aDsgICAgICAgLy8gbmFtZSBpbnNpZGUgYXJjdmhpdmUNCisgIEZTdHJpbmcgX2Rpc2tGaWxlUGF0aDsgICAvLyBmdWxsIHBhdGggdG8gZmlsZSBvbiBkaXNrDQorICBib29sIF9leHRyYWN0TW9kZTsNCisgIHN0cnVjdCBDUHJvY2Vzc2VkRmlsZUluZm8NCisgIHsNCisgICAgRklMRVRJTUUgTVRpbWU7DQorICAgIFVJbnQzMiBBdHRyaWI7DQorICAgIGJvb2wgaXNEaXI7DQorICAgIGJvb2wgQXR0cmliRGVmaW5lZDsNCisgICAgYm9vbCBNVGltZURlZmluZWQ7DQorICB9IF9wcm9jZXNzZWRGaWxlSW5mbzsNCisNCisgIENPdXRGaWxlU3RyZWFtICpfb3V0RmlsZVN0cmVhbVNwZWM7DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IF9vdXRGaWxlU3RyZWFtOw0KKw0KK3B1YmxpYzoNCisgIHZvaWQgSW5pdChJSW5BcmNoaXZlICphcmNoaXZlSGFuZGxlciwgY29uc3QgRlN0cmluZyAmZGlyZWN0b3J5UGF0aCk7DQorDQorICBVSW50NjQgTnVtRXJyb3JzOw0KKyAgYm9vbCBQYXNzd29yZElzRGVmaW5lZDsNCisgIFVTdHJpbmcgUGFzc3dvcmQ7DQorDQorICBDQXJjaGl2ZUV4dHJhY3RDYWxsYmFjaygpIDogUGFzc3dvcmRJc0RlZmluZWQoZmFsc2UpIHt9DQorfTsNCisNCit2b2lkIENBcmNoaXZlRXh0cmFjdENhbGxiYWNrOjpJbml0KElJbkFyY2hpdmUgKmFyY2hpdmVIYW5kbGVyLCBjb25zdCBGU3RyaW5nICZkaXJlY3RvcnlQYXRoKQ0KK3sNCisgIE51bUVycm9ycyA9IDA7DQorICBfYXJjaGl2ZUhhbmRsZXIgPSBhcmNoaXZlSGFuZGxlcjsNCisgIF9kaXJlY3RvcnlQYXRoID0gZGlyZWN0b3J5UGF0aDsNCisgIE5OYW1lOjpOb3JtYWxpemVEaXJQYXRoUHJlZml4KF9kaXJlY3RvcnlQYXRoKTsNCit9DQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlRXh0cmFjdENhbGxiYWNrOjpTZXRUb3RhbChVSW50NjQgLyogc2l6ZSAqLykNCit7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlRXh0cmFjdENhbGxiYWNrOjpTZXRDb21wbGV0ZWQoY29uc3QgVUludDY0ICogLyogY29tcGxldGVWYWx1ZSAqLykNCit7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlRXh0cmFjdENhbGxiYWNrOjpHZXRTdHJlYW0oVUludDMyIGluZGV4LA0KKyAgICBJU2VxdWVudGlhbE91dFN0cmVhbSAqKm91dFN0cmVhbSwgSW50MzIgYXNrRXh0cmFjdE1vZGUpDQorew0KKyAgKm91dFN0cmVhbSA9IDA7DQorICBfb3V0RmlsZVN0cmVhbS5SZWxlYXNlKCk7DQorDQorICB7DQorICAgIC8vIEdldCBOYW1lDQorICAgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgICBSSU5PSyhfYXJjaGl2ZUhhbmRsZXItPkdldFByb3BlcnR5KGluZGV4LCBrcGlkUGF0aCwgJnByb3ApKTsNCisgICAgDQorICAgIFVTdHJpbmcgZnVsbFBhdGg7DQorICAgIGlmIChwcm9wLnZ0ID09IFZUX0VNUFRZKQ0KKyAgICAgIGZ1bGxQYXRoID0ga0VtcHR5RmlsZUFsaWFzOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBpZiAocHJvcC52dCAhPSBWVF9CU1RSKQ0KKyAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICBmdWxsUGF0aCA9IHByb3AuYnN0clZhbDsNCisgICAgfQ0KKyAgICBfZmlsZVBhdGggPSBmdWxsUGF0aDsNCisgIH0NCisNCisgIGlmIChhc2tFeHRyYWN0TW9kZSAhPSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5Bc2tNb2RlOjprRXh0cmFjdCkNCisgICAgcmV0dXJuIFNfT0s7DQorDQorICB7DQorICAgIC8vIEdldCBBdHRyaWINCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgIFJJTk9LKF9hcmNoaXZlSGFuZGxlci0+R2V0UHJvcGVydHkoaW5kZXgsIGtwaWRBdHRyaWIsICZwcm9wKSk7DQorICAgIGlmIChwcm9wLnZ0ID09IFZUX0VNUFRZKQ0KKyAgICB7DQorICAgICAgX3Byb2Nlc3NlZEZpbGVJbmZvLkF0dHJpYiA9IDA7DQorICAgICAgX3Byb2Nlc3NlZEZpbGVJbmZvLkF0dHJpYkRlZmluZWQgPSBmYWxzZTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBpZiAocHJvcC52dCAhPSBWVF9VSTQpDQorICAgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICAgIF9wcm9jZXNzZWRGaWxlSW5mby5BdHRyaWIgPSBwcm9wLnVsVmFsOw0KKyAgICAgIF9wcm9jZXNzZWRGaWxlSW5mby5BdHRyaWJEZWZpbmVkID0gdHJ1ZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgUklOT0soSXNBcmNoaXZlSXRlbUZvbGRlcihfYXJjaGl2ZUhhbmRsZXIsIGluZGV4LCBfcHJvY2Vzc2VkRmlsZUluZm8uaXNEaXIpKTsNCisNCisgIHsNCisgICAgLy8gR2V0IE1vZGlmaWVkIFRpbWUNCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgIFJJTk9LKF9hcmNoaXZlSGFuZGxlci0+R2V0UHJvcGVydHkoaW5kZXgsIGtwaWRNVGltZSwgJnByb3ApKTsNCisgICAgX3Byb2Nlc3NlZEZpbGVJbmZvLk1UaW1lRGVmaW5lZCA9IGZhbHNlOw0KKyAgICBzd2l0Y2gocHJvcC52dCkNCisgICAgew0KKyAgICAgIGNhc2UgVlRfRU1QVFk6DQorICAgICAgICAvLyBfcHJvY2Vzc2VkRmlsZUluZm8uTVRpbWUgPSBfdXRjTVRpbWVEZWZhdWx0Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBWVF9GSUxFVElNRToNCisgICAgICAgIF9wcm9jZXNzZWRGaWxlSW5mby5NVGltZSA9IHByb3AuZmlsZXRpbWU7DQorICAgICAgICBfcHJvY2Vzc2VkRmlsZUluZm8uTVRpbWVEZWZpbmVkID0gdHJ1ZTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICB9DQorDQorICB9DQorICB7DQorICAgIC8vIEdldCBTaXplDQorICAgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgICBSSU5PSyhfYXJjaGl2ZUhhbmRsZXItPkdldFByb3BlcnR5KGluZGV4LCBrcGlkU2l6ZSwgJnByb3ApKTsNCisgICAgVUludDY0IG5ld0ZpbGVTaXplOw0KKyAgICAvKiBib29sIG5ld0ZpbGVTaXplRGVmaW5lZCA9ICovIENvbnZlcnRQcm9wVmFyaWFudFRvVUludDY0KHByb3AsIG5ld0ZpbGVTaXplKTsNCisgIH0NCisNCisgIA0KKyAgew0KKyAgICAvLyBDcmVhdGUgZm9sZGVycyBmb3IgZmlsZQ0KKyAgICBpbnQgc2xhc2hQb3MgPSBfZmlsZVBhdGguUmV2ZXJzZUZpbmQoV0NIQVJfUEFUSF9TRVBBUkFUT1IpOw0KKyAgICBpZiAoc2xhc2hQb3MgPj0gMCkNCisgICAgICBDcmVhdGVDb21wbGV4RGlyKF9kaXJlY3RvcnlQYXRoICsgdXMyZnMoX2ZpbGVQYXRoLkxlZnQoc2xhc2hQb3MpKSk7DQorICB9DQorDQorICBGU3RyaW5nIGZ1bGxQcm9jZXNzZWRQYXRoID0gX2RpcmVjdG9yeVBhdGggKyB1czJmcyhfZmlsZVBhdGgpOw0KKyAgX2Rpc2tGaWxlUGF0aCA9IGZ1bGxQcm9jZXNzZWRQYXRoOw0KKw0KKyAgaWYgKF9wcm9jZXNzZWRGaWxlSW5mby5pc0RpcikNCisgIHsNCisgICAgQ3JlYXRlQ29tcGxleERpcihmdWxsUHJvY2Vzc2VkUGF0aCk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIE5GaW5kOjpDRmlsZUluZm8gZmk7DQorICAgIGlmIChmaS5GaW5kKGZ1bGxQcm9jZXNzZWRQYXRoKSkNCisgICAgew0KKyAgICAgIGlmICghRGVsZXRlRmlsZUFsd2F5cyhmdWxsUHJvY2Vzc2VkUGF0aCkpDQorICAgICAgew0KKyAgICAgICAgUHJpbnRFcnJvcigiQ2FuIG5vdCBkZWxldGUgb3V0cHV0IGZpbGUiLCBmdWxsUHJvY2Vzc2VkUGF0aCk7DQorICAgICAgICByZXR1cm4gRV9BQk9SVDsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIF9vdXRGaWxlU3RyZWFtU3BlYyA9IG5ldyBDT3V0RmlsZVN0cmVhbTsNCisgICAgQ015Q29tUHRyPElTZXF1ZW50aWFsT3V0U3RyZWFtPiBvdXRTdHJlYW1Mb2MoX291dEZpbGVTdHJlYW1TcGVjKTsNCisgICAgaWYgKCFfb3V0RmlsZVN0cmVhbVNwZWMtPk9wZW4oZnVsbFByb2Nlc3NlZFBhdGgsIENSRUFURV9BTFdBWVMpKQ0KKyAgICB7DQorICAgICAgUHJpbnRFcnJvcigiQ2FuIG5vdCBvcGVuIG91dHB1dCBmaWxlIiwgZnVsbFByb2Nlc3NlZFBhdGgpOw0KKyAgICAgIHJldHVybiBFX0FCT1JUOw0KKyAgICB9DQorICAgIF9vdXRGaWxlU3RyZWFtID0gb3V0U3RyZWFtTG9jOw0KKyAgICAqb3V0U3RyZWFtID0gb3V0U3RyZWFtTG9jLkRldGFjaCgpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZUV4dHJhY3RDYWxsYmFjazo6UHJlcGFyZU9wZXJhdGlvbihJbnQzMiBhc2tFeHRyYWN0TW9kZSkNCit7DQorICBfZXh0cmFjdE1vZGUgPSBmYWxzZTsNCisgIHN3aXRjaCAoYXNrRXh0cmFjdE1vZGUpDQorICB7DQorICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOQXNrTW9kZTo6a0V4dHJhY3Q6ICBfZXh0cmFjdE1vZGUgPSB0cnVlOyBicmVhazsNCisgIH07DQorICBzd2l0Y2ggKGFza0V4dHJhY3RNb2RlKQ0KKyAgew0KKyAgICBjYXNlIE5BcmNoaXZlOjpORXh0cmFjdDo6TkFza01vZGU6OmtFeHRyYWN0OiAgUHJpbnRTdHJpbmcoa0V4dHJhY3RpbmdTdHJpbmcpOyBicmVhazsNCisgICAgY2FzZSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5Bc2tNb2RlOjprVGVzdDogIFByaW50U3RyaW5nKGtUZXN0aW5nU3RyaW5nKTsgYnJlYWs7DQorICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOQXNrTW9kZTo6a1NraXA6ICBQcmludFN0cmluZyhrU2tpcHBpbmdTdHJpbmcpOyBicmVhazsNCisgIH07DQorICBQcmludFN0cmluZyhfZmlsZVBhdGgpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZUV4dHJhY3RDYWxsYmFjazo6U2V0T3BlcmF0aW9uUmVzdWx0KEludDMyIG9wZXJhdGlvblJlc3VsdCkNCit7DQorICBzd2l0Y2ggKG9wZXJhdGlvblJlc3VsdCkNCisgIHsNCisgICAgY2FzZSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtPSzoNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgew0KKyAgICAgIE51bUVycm9ycysrOw0KKyAgICAgIFByaW50U3RyaW5nKCIgIDogICIpOw0KKyAgICAgIGNvbnN0IGNoYXIgKnMgPSBOVUxMOw0KKyAgICAgIHN3aXRjaCAob3BlcmF0aW9uUmVzdWx0KQ0KKyAgICAgIHsNCisgICAgICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprVW5zdXBwb3J0ZWRNZXRob2Q6DQorICAgICAgICAgIHMgPSBrVW5zdXBwb3J0ZWRNZXRob2Q7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtDUkNFcnJvcjoNCisgICAgICAgICAgcyA9IGtDUkNGYWlsZWQ7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtEYXRhRXJyb3I6DQorICAgICAgICAgIHMgPSBrRGF0YUVycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprVW5hdmFpbGFibGU6DQorICAgICAgICAgIHMgPSBrVW5hdmFpbGFibGVEYXRhOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprVW5leHBlY3RlZEVuZDoNCisgICAgICAgICAgcyA9IGtVbmV4cGVjdGVkRW5kOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprRGF0YUFmdGVyRW5kOg0KKyAgICAgICAgICBzID0ga0RhdGFBZnRlckVuZDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIE5BcmNoaXZlOjpORXh0cmFjdDo6Tk9wZXJhdGlvblJlc3VsdDo6a0lzTm90QXJjOg0KKyAgICAgICAgICBzID0ga0lzTm90QXJjOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprSGVhZGVyc0Vycm9yOg0KKyAgICAgICAgICBzID0ga0hlYWRlcnNFcnJvcjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChzKQ0KKyAgICAgIHsNCisgICAgICAgIFByaW50U3RyaW5nKCJFcnJvciA6ICIpOw0KKyAgICAgICAgUHJpbnRTdHJpbmcocyk7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBjaGFyIHRlbXBbMTZdOw0KKyAgICAgICAgQ29udmVydFVJbnQzMlRvU3RyaW5nKG9wZXJhdGlvblJlc3VsdCwgdGVtcCk7DQorICAgICAgICBQcmludFN0cmluZygiRXJyb3IgIyIpOw0KKyAgICAgICAgUHJpbnRTdHJpbmcodGVtcCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBpZiAoX291dEZpbGVTdHJlYW0gIT0gTlVMTCkNCisgIHsNCisgICAgaWYgKF9wcm9jZXNzZWRGaWxlSW5mby5NVGltZURlZmluZWQpDQorICAgICAgX291dEZpbGVTdHJlYW1TcGVjLT5TZXRNVGltZSgmX3Byb2Nlc3NlZEZpbGVJbmZvLk1UaW1lKTsNCisgICAgUklOT0soX291dEZpbGVTdHJlYW1TcGVjLT5DbG9zZSgpKTsNCisgIH0NCisgIF9vdXRGaWxlU3RyZWFtLlJlbGVhc2UoKTsNCisgIGlmIChfZXh0cmFjdE1vZGUgJiYgX3Byb2Nlc3NlZEZpbGVJbmZvLkF0dHJpYkRlZmluZWQpDQorICAgIFNldEZpbGVBdHRyaWIoX2Rpc2tGaWxlUGF0aCwgX3Byb2Nlc3NlZEZpbGVJbmZvLkF0dHJpYik7DQorICBQcmludE5ld0xpbmUoKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2s6OkNyeXB0b0dldFRleHRQYXNzd29yZChCU1RSICpwYXNzd29yZCkNCit7DQorICBpZiAoIVBhc3N3b3JkSXNEZWZpbmVkKQ0KKyAgew0KKyAgICAvLyBZb3UgY2FuIGFzayByZWFsIHBhc3N3b3JkIGhlcmUgZnJvbSB1c2VyDQorICAgIC8vIFBhc3N3b3JkID0gR2V0UGFzc3dvcmQoT3V0U3RyZWFtKTsNCisgICAgLy8gUGFzc3dvcmRJc0RlZmluZWQgPSB0cnVlOw0KKyAgICBQcmludEVycm9yKCJQYXNzd29yZCBpcyBub3QgZGVmaW5lZCIpOw0KKyAgICByZXR1cm4gRV9BQk9SVDsNCisgIH0NCisgIHJldHVybiBTdHJpbmdUb0JzdHIoUGFzc3dvcmQsIHBhc3N3b3JkKTsNCit9DQorDQorDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBBcmNoaXZlIENyZWF0aW5nIGNhbGxiYWNrIGNsYXNzDQorDQorc3RydWN0IENEaXJJdGVtDQorew0KKyAgVUludDY0IFNpemU7DQorICBGSUxFVElNRSBDVGltZTsNCisgIEZJTEVUSU1FIEFUaW1lOw0KKyAgRklMRVRJTUUgTVRpbWU7DQorICBVU3RyaW5nIE5hbWU7DQorICBGU3RyaW5nIEZ1bGxQYXRoOw0KKyAgVUludDMyIEF0dHJpYjsNCisNCisgIGJvb2wgaXNEaXIoKSBjb25zdCB7IHJldHVybiAoQXR0cmliICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSAhPSAwIDsgfQ0KK307DQorDQorY2xhc3MgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazoNCisgIHB1YmxpYyBJQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrMiwNCisgIHB1YmxpYyBJQ3J5cHRvR2V0VGV4dFBhc3N3b3JkMiwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KK3B1YmxpYzoNCisgIE1ZX1VOS05PV05fSU1QMihJQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrMiwgSUNyeXB0b0dldFRleHRQYXNzd29yZDIpDQorDQorICAvLyBJUHJvZ3Jlc3MNCisgIFNURE1FVEhPRChTZXRUb3RhbCkoVUludDY0IHNpemUpOw0KKyAgU1RETUVUSE9EKFNldENvbXBsZXRlZCkoY29uc3QgVUludDY0ICpjb21wbGV0ZVZhbHVlKTsNCisNCisgIC8vIElVcGRhdGVDYWxsYmFjazINCisgIFNURE1FVEhPRChFbnVtUHJvcGVydGllcykoSUVudW1TVEFUUFJPUFNURyAqKmVudW1lcmF0b3IpOw0KKyAgU1RETUVUSE9EKEdldFVwZGF0ZUl0ZW1JbmZvKShVSW50MzIgaW5kZXgsDQorICAgICAgSW50MzIgKm5ld0RhdGEsIEludDMyICpuZXdQcm9wZXJ0aWVzLCBVSW50MzIgKmluZGV4SW5BcmNoaXZlKTsNCisgIFNURE1FVEhPRChHZXRQcm9wZXJ0eSkoVUludDMyIGluZGV4LCBQUk9QSUQgcHJvcElELCBQUk9QVkFSSUFOVCAqdmFsdWUpOw0KKyAgU1RETUVUSE9EKEdldFN0cmVhbSkoVUludDMyIGluZGV4LCBJU2VxdWVudGlhbEluU3RyZWFtICoqaW5TdHJlYW0pOw0KKyAgU1RETUVUSE9EKFNldE9wZXJhdGlvblJlc3VsdCkoSW50MzIgb3BlcmF0aW9uUmVzdWx0KTsNCisgIFNURE1FVEhPRChHZXRWb2x1bWVTaXplKShVSW50MzIgaW5kZXgsIFVJbnQ2NCAqc2l6ZSk7DQorICBTVERNRVRIT0QoR2V0Vm9sdW1lU3RyZWFtKShVSW50MzIgaW5kZXgsIElTZXF1ZW50aWFsT3V0U3RyZWFtICoqdm9sdW1lU3RyZWFtKTsNCisNCisgIFNURE1FVEhPRChDcnlwdG9HZXRUZXh0UGFzc3dvcmQyKShJbnQzMiAqcGFzc3dvcmRJc0RlZmluZWQsIEJTVFIgKnBhc3N3b3JkKTsNCisNCitwdWJsaWM6DQorICBDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gVm9sdW1lc1NpemVzOw0KKyAgVVN0cmluZyBWb2xOYW1lOw0KKyAgVVN0cmluZyBWb2xFeHQ7DQorDQorICBGU3RyaW5nIERpclByZWZpeDsNCisgIGNvbnN0IENPYmplY3RWZWN0b3I8Q0Rpckl0ZW0+ICpEaXJJdGVtczsNCisNCisgIGJvb2wgUGFzc3dvcmRJc0RlZmluZWQ7DQorICBVU3RyaW5nIFBhc3N3b3JkOw0KKyAgYm9vbCBBc2tQYXNzd29yZDsNCisNCisgIGJvb2wgbV9OZWVkQmVDbG9zZWQ7DQorDQorICBGU3RyaW5nVmVjdG9yIEZhaWxlZEZpbGVzOw0KKyAgQ1JlY29yZFZlY3RvcjxIUkVTVUxUPiBGYWlsZWRDb2RlczsNCisNCisgIENBcmNoaXZlVXBkYXRlQ2FsbGJhY2soKTogUGFzc3dvcmRJc0RlZmluZWQoZmFsc2UpLCBBc2tQYXNzd29yZChmYWxzZSksIERpckl0ZW1zKDApIHt9Ow0KKw0KKyAgfkNBcmNoaXZlVXBkYXRlQ2FsbGJhY2soKSB7IEZpbmlsaXplKCk7IH0NCisgIEhSRVNVTFQgRmluaWxpemUoKTsNCisNCisgIHZvaWQgSW5pdChjb25zdCBDT2JqZWN0VmVjdG9yPENEaXJJdGVtPiAqZGlySXRlbXMpDQorICB7DQorICAgIERpckl0ZW1zID0gZGlySXRlbXM7DQorICAgIG1fTmVlZEJlQ2xvc2VkID0gZmFsc2U7DQorICAgIEZhaWxlZEZpbGVzLkNsZWFyKCk7DQorICAgIEZhaWxlZENvZGVzLkNsZWFyKCk7DQorICB9DQorfTsNCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazo6U2V0VG90YWwoVUludDY0IC8qIHNpemUgKi8pDQorew0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrOjpTZXRDb21wbGV0ZWQoY29uc3QgVUludDY0ICogLyogY29tcGxldGVWYWx1ZSAqLykNCit7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlVXBkYXRlQ2FsbGJhY2s6OkVudW1Qcm9wZXJ0aWVzKElFbnVtU1RBVFBST1BTVEcgKiogLyogZW51bWVyYXRvciAqLykNCit7DQorICByZXR1cm4gRV9OT1RJTVBMOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazo6R2V0VXBkYXRlSXRlbUluZm8oVUludDMyIC8qIGluZGV4ICovLA0KKyAgICAgIEludDMyICpuZXdEYXRhLCBJbnQzMiAqbmV3UHJvcGVydGllcywgVUludDMyICppbmRleEluQXJjaGl2ZSkNCit7DQorICBpZiAobmV3RGF0YSAhPSBOVUxMKQ0KKyAgICAqbmV3RGF0YSA9IEJvb2xUb0ludCh0cnVlKTsNCisgIGlmIChuZXdQcm9wZXJ0aWVzICE9IE5VTEwpDQorICAgICpuZXdQcm9wZXJ0aWVzID0gQm9vbFRvSW50KHRydWUpOw0KKyAgaWYgKGluZGV4SW5BcmNoaXZlICE9IE5VTEwpDQorICAgICppbmRleEluQXJjaGl2ZSA9IChVSW50MzIpKEludDMyKS0xOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrOjpHZXRQcm9wZXJ0eShVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIFBST1BWQVJJQU5UICp2YWx1ZSkNCit7DQorICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgIA0KKyAgaWYgKHByb3BJRCA9PSBrcGlkSXNBbnRpKQ0KKyAgew0KKyAgICBwcm9wID0gZmFsc2U7DQorICAgIHByb3AuRGV0YWNoKHZhbHVlKTsNCisgICAgcmV0dXJuIFNfT0s7DQorICB9DQorDQorICB7DQorICAgIGNvbnN0IENEaXJJdGVtICZkaXJJdGVtID0gKCpEaXJJdGVtcylbaW5kZXhdOw0KKyAgICBzd2l0Y2gocHJvcElEKQ0KKyAgICB7DQorICAgICAgY2FzZSBrcGlkUGF0aDogIHByb3AgPSBkaXJJdGVtLk5hbWU7IGJyZWFrOw0KKyAgICAgIGNhc2Uga3BpZElzRGlyOiAgcHJvcCA9IGRpckl0ZW0uaXNEaXIoKTsgYnJlYWs7DQorICAgICAgY2FzZSBrcGlkU2l6ZTogIHByb3AgPSBkaXJJdGVtLlNpemU7IGJyZWFrOw0KKyAgICAgIGNhc2Uga3BpZEF0dHJpYjogIHByb3AgPSBkaXJJdGVtLkF0dHJpYjsgYnJlYWs7DQorICAgICAgY2FzZSBrcGlkQ1RpbWU6ICBwcm9wID0gZGlySXRlbS5DVGltZTsgYnJlYWs7DQorICAgICAgY2FzZSBrcGlkQVRpbWU6ICBwcm9wID0gZGlySXRlbS5BVGltZTsgYnJlYWs7DQorICAgICAgY2FzZSBrcGlkTVRpbWU6ICBwcm9wID0gZGlySXRlbS5NVGltZTsgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHByb3AuRGV0YWNoKHZhbHVlKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENBcmNoaXZlVXBkYXRlQ2FsbGJhY2s6OkZpbmlsaXplKCkNCit7DQorICBpZiAobV9OZWVkQmVDbG9zZWQpDQorICB7DQorICAgIFByaW50TmV3TGluZSgpOw0KKyAgICBtX05lZWRCZUNsb3NlZCA9IGZhbHNlOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIEdldFN0cmVhbTIoY29uc3Qgd2NoYXJfdCAqbmFtZSkNCit7DQorICBQcmludFN0cmluZygiQ29tcHJlc3NpbmcgICIpOw0KKyAgaWYgKG5hbWVbMF0gPT0gMCkNCisgICAgbmFtZSA9IGtFbXB0eUZpbGVBbGlhczsNCisgIFByaW50U3RyaW5nKG5hbWUpOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazo6R2V0U3RyZWFtKFVJbnQzMiBpbmRleCwgSVNlcXVlbnRpYWxJblN0cmVhbSAqKmluU3RyZWFtKQ0KK3sNCisgIFJJTk9LKEZpbmlsaXplKCkpOw0KKw0KKyAgY29uc3QgQ0Rpckl0ZW0gJmRpckl0ZW0gPSAoKkRpckl0ZW1zKVtpbmRleF07DQorICBHZXRTdHJlYW0yKGRpckl0ZW0uTmFtZSk7DQorIA0KKyAgaWYgKGRpckl0ZW0uaXNEaXIoKSkNCisgICAgcmV0dXJuIFNfT0s7DQorDQorICB7DQorICAgIENJbkZpbGVTdHJlYW0gKmluU3RyZWFtU3BlYyA9IG5ldyBDSW5GaWxlU3RyZWFtOw0KKyAgICBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gaW5TdHJlYW1Mb2MoaW5TdHJlYW1TcGVjKTsNCisgICAgRlN0cmluZyBwYXRoID0gRGlyUHJlZml4ICsgZGlySXRlbS5GdWxsUGF0aDsNCisgICAgaWYgKCFpblN0cmVhbVNwZWMtPk9wZW4ocGF0aCkpDQorICAgIHsNCisgICAgICBEV09SRCBzeXNFcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7DQorICAgICAgRmFpbGVkQ29kZXMuQWRkKHN5c0Vycm9yKTsNCisgICAgICBGYWlsZWRGaWxlcy5BZGQocGF0aCk7DQorICAgICAgLy8gaWYgKHN5c3RlbUVycm9yID09IEVSUk9SX1NIQVJJTkdfVklPTEFUSU9OKQ0KKyAgICAgIHsNCisgICAgICAgIFByaW50TmV3TGluZSgpOw0KKyAgICAgICAgUHJpbnRFcnJvcigiV0FSTklORzogY2FuJ3Qgb3BlbiBmaWxlIik7DQorICAgICAgICAvLyBQcmludFN0cmluZyhORXJyb3I6Ok15Rm9ybWF0TWVzc2FnZVcoc3lzdGVtRXJyb3IpKTsNCisgICAgICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgICAgIH0NCisgICAgICAvLyByZXR1cm4gc3lzRXJyb3I7DQorICAgIH0NCisgICAgKmluU3RyZWFtID0gaW5TdHJlYW1Mb2MuRGV0YWNoKCk7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlVXBkYXRlQ2FsbGJhY2s6OlNldE9wZXJhdGlvblJlc3VsdChJbnQzMiAvKiBvcGVyYXRpb25SZXN1bHQgKi8pDQorew0KKyAgbV9OZWVkQmVDbG9zZWQgPSB0cnVlOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrOjpHZXRWb2x1bWVTaXplKFVJbnQzMiBpbmRleCwgVUludDY0ICpzaXplKQ0KK3sNCisgIGlmIChWb2x1bWVzU2l6ZXMuU2l6ZSgpID09IDApDQorICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgaWYgKGluZGV4ID49IChVSW50MzIpVm9sdW1lc1NpemVzLlNpemUoKSkNCisgICAgaW5kZXggPSBWb2x1bWVzU2l6ZXMuU2l6ZSgpIC0gMTsNCisgICpzaXplID0gVm9sdW1lc1NpemVzW2luZGV4XTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazo6R2V0Vm9sdW1lU3RyZWFtKFVJbnQzMiBpbmRleCwgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKip2b2x1bWVTdHJlYW0pDQorew0KKyAgd2NoYXJfdCB0ZW1wWzE2XTsNCisgIENvbnZlcnRVSW50MzJUb1N0cmluZyhpbmRleCArIDEsIHRlbXApOw0KKyAgVVN0cmluZyByZXMgPSB0ZW1wOw0KKyAgd2hpbGUgKHJlcy5MZW4oKSA8IDIpDQorICAgIHJlcyA9IFVTdHJpbmcoTCcwJykgKyByZXM7DQorICBVU3RyaW5nIGZpbGVOYW1lID0gVm9sTmFtZTsNCisgIGZpbGVOYW1lICs9IEwnLic7DQorICBmaWxlTmFtZSArPSByZXM7DQorICBmaWxlTmFtZSArPSBWb2xFeHQ7DQorICBDT3V0RmlsZVN0cmVhbSAqc3RyZWFtU3BlYyA9IG5ldyBDT3V0RmlsZVN0cmVhbTsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gc3RyZWFtTG9jKHN0cmVhbVNwZWMpOw0KKyAgaWYgKCFzdHJlYW1TcGVjLT5DcmVhdGUodXMyZnMoZmlsZU5hbWUpLCBmYWxzZSkpDQorICAgIHJldHVybiA6OkdldExhc3RFcnJvcigpOw0KKyAgKnZvbHVtZVN0cmVhbSA9IHN0cmVhbUxvYy5EZXRhY2goKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazo6Q3J5cHRvR2V0VGV4dFBhc3N3b3JkMihJbnQzMiAqcGFzc3dvcmRJc0RlZmluZWQsIEJTVFIgKnBhc3N3b3JkKQ0KK3sNCisgIGlmICghUGFzc3dvcmRJc0RlZmluZWQpDQorICB7DQorICAgIGlmIChBc2tQYXNzd29yZCkNCisgICAgew0KKyAgICAgIC8vIFlvdSBjYW4gYXNrIHJlYWwgcGFzc3dvcmQgaGVyZSBmcm9tIHVzZXINCisgICAgICAvLyBQYXNzd29yZCA9IEdldFBhc3N3b3JkKE91dFN0cmVhbSk7DQorICAgICAgLy8gUGFzc3dvcmRJc0RlZmluZWQgPSB0cnVlOw0KKyAgICAgIFByaW50RXJyb3IoIlBhc3N3b3JkIGlzIG5vdCBkZWZpbmVkIik7DQorICAgICAgcmV0dXJuIEVfQUJPUlQ7DQorICAgIH0NCisgIH0NCisgICpwYXNzd29yZElzRGVmaW5lZCA9IEJvb2xUb0ludChQYXNzd29yZElzRGVmaW5lZCk7DQorICByZXR1cm4gU3RyaW5nVG9Cc3RyKFBhc3N3b3JkLCBwYXNzd29yZCk7DQorfQ0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gTWFpbiBmdW5jdGlvbg0KKw0KKyNkZWZpbmUgTlRfQ0hFQ0tfRkFJTF9BQ1RJT04gUHJpbnRFcnJvcigiVW5zdXBwb3J0ZWQgV2luZG93cyB2ZXJzaW9uIik7IHJldHVybiAxOw0KKw0KK2ludCBNWV9DREVDTCBtYWluKGludCBudW1BcmdzLCBjb25zdCBjaGFyICphcmdzW10pDQorew0KKyAgTlRfQ0hFQ0sNCisNCisgIFByaW50U3RyaW5nTG4oa0NvcHlyaWdodFN0cmluZyk7DQorDQorICBpZiAobnVtQXJncyA8IDMpDQorICB7DQorICAgIFByaW50U3RyaW5nTG4oa0hlbHBTdHJpbmcpOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIE5ETEw6OkNMaWJyYXJ5IGxpYjsNCisgIGlmICghbGliLkxvYWQoTkRMTDo6R2V0TW9kdWxlRGlyUHJlZml4KCkgKyBGVEVYVChrRGxsTmFtZSkpKQ0KKyAgew0KKyAgICBQcmludEVycm9yKCJDYW4gbm90IGxvYWQgNy16aXAgbGlicmFyeSIpOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIEZ1bmNfQ3JlYXRlT2JqZWN0IGNyZWF0ZU9iamVjdEZ1bmMgPSAoRnVuY19DcmVhdGVPYmplY3QpbGliLkdldFByb2MoIkNyZWF0ZU9iamVjdCIpOw0KKyAgaWYgKCFjcmVhdGVPYmplY3RGdW5jKQ0KKyAgew0KKyAgICBQcmludEVycm9yKCJDYW4gbm90IGdldCBDcmVhdGVPYmplY3QiKTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorDQorICBjaGFyIGM7DQorICB7DQorICAgIEFTdHJpbmcgY29tbWFuZCA9IGFyZ3NbMV07DQorICAgIGlmIChjb21tYW5kLkxlbigpICE9IDEpDQorICAgIHsNCisgICAgICBQcmludEVycm9yKCJpbmNvcnJlY3QgY29tbWFuZCIpOw0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIGMgPSAoY2hhcilNeUNoYXJMb3dlcl9Bc2NpaShjb21tYW5kWzBdKTsNCisgIH0NCisgIEZTdHJpbmcgYXJjaGl2ZU5hbWUgPSBDbWRTdHJpbmdUb0ZTdHJpbmcoYXJnc1syXSk7DQorICBpZiAoYyA9PSAnYScpDQorICB7DQorICAgIC8vIGNyZWF0ZSBhcmNoaXZlIGNvbW1hbmQNCisgICAgaWYgKG51bUFyZ3MgPCA0KQ0KKyAgICB7DQorICAgICAgUHJpbnRTdHJpbmdMbihrSGVscFN0cmluZyk7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgICAgQ09iamVjdFZlY3RvcjxDRGlySXRlbT4gZGlySXRlbXM7DQorICAgIHsNCisgICAgICBpbnQgaTsNCisgICAgICBmb3IgKGkgPSAzOyBpIDwgbnVtQXJnczsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgIENEaXJJdGVtIGRpOw0KKyAgICAgICAgRlN0cmluZyBuYW1lID0gQ21kU3RyaW5nVG9GU3RyaW5nKGFyZ3NbaV0pOw0KKyAgICAgICAgDQorICAgICAgICBORmluZDo6Q0ZpbGVJbmZvIGZpOw0KKyAgICAgICAgaWYgKCFmaS5GaW5kKG5hbWUpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBQcmludEVycm9yKCJDYW4ndCBmaW5kIGZpbGUiLCBuYW1lKTsNCisgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGRpLkF0dHJpYiA9IGZpLkF0dHJpYjsNCisgICAgICAgIGRpLlNpemUgPSBmaS5TaXplOw0KKyAgICAgICAgZGkuQ1RpbWUgPSBmaS5DVGltZTsNCisgICAgICAgIGRpLkFUaW1lID0gZmkuQVRpbWU7DQorICAgICAgICBkaS5NVGltZSA9IGZpLk1UaW1lOw0KKyAgICAgICAgZGkuTmFtZSA9IGZzMnVzKG5hbWUpOw0KKyAgICAgICAgZGkuRnVsbFBhdGggPSBuYW1lOw0KKyAgICAgICAgZGlySXRlbXMuQWRkKGRpKTsNCisgICAgICB9DQorICAgIH0NCisgICAgQ091dEZpbGVTdHJlYW0gKm91dEZpbGVTdHJlYW1TcGVjID0gbmV3IENPdXRGaWxlU3RyZWFtOw0KKyAgICBDTXlDb21QdHI8SU91dFN0cmVhbT4gb3V0RmlsZVN0cmVhbSA9IG91dEZpbGVTdHJlYW1TcGVjOw0KKyAgICBpZiAoIW91dEZpbGVTdHJlYW1TcGVjLT5DcmVhdGUoYXJjaGl2ZU5hbWUsIGZhbHNlKSkNCisgICAgew0KKyAgICAgIFByaW50RXJyb3IoImNhbid0IGNyZWF0ZSBhcmNoaXZlIGZpbGUiKTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKw0KKyAgICBDTXlDb21QdHI8SU91dEFyY2hpdmU+IG91dEFyY2hpdmU7DQorICAgIGlmIChjcmVhdGVPYmplY3RGdW5jKCZDTFNJRF9DRm9ybWF0N3osICZJSURfSU91dEFyY2hpdmUsICh2b2lkICoqKSZvdXRBcmNoaXZlKSAhPSBTX09LKQ0KKyAgICB7DQorICAgICAgUHJpbnRFcnJvcigiQ2FuIG5vdCBnZXQgY2xhc3Mgb2JqZWN0Iik7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisNCisgICAgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjayAqdXBkYXRlQ2FsbGJhY2tTcGVjID0gbmV3IENBcmNoaXZlVXBkYXRlQ2FsbGJhY2s7DQorICAgIENNeUNvbVB0cjxJQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrMj4gdXBkYXRlQ2FsbGJhY2sodXBkYXRlQ2FsbGJhY2tTcGVjKTsNCisgICAgdXBkYXRlQ2FsbGJhY2tTcGVjLT5Jbml0KCZkaXJJdGVtcyk7DQorICAgIC8vIHVwZGF0ZUNhbGxiYWNrU3BlYy0+UGFzc3dvcmRJc0RlZmluZWQgPSB0cnVlOw0KKyAgICAvLyB1cGRhdGVDYWxsYmFja1NwZWMtPlBhc3N3b3JkID0gTCIxIjsNCisNCisgICAgLyoNCisgICAgew0KKyAgICAgIGNvbnN0IHdjaGFyX3QgKm5hbWVzW10gPQ0KKyAgICAgIHsNCisgICAgICAgIEwicyIsDQorICAgICAgICBMIngiDQorICAgICAgfTsNCisgICAgICBjb25zdCB1bnNpZ25lZCBrTnVtUHJvcHMgPSBBUlJBWV9TSVpFKG5hbWVzKTsNCisgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgdmFsdWVzW2tOdW1Qcm9wc10gPQ0KKyAgICAgIHsNCisgICAgICAgIGZhbHNlLCAgICAvLyBzb2xpZCBtb2RlIE9GRg0KKyAgICAgICAgKFVJbnQzMik5IC8vIGNvbXByZXNzaW9uIGxldmVsID0gOSAtIHVsdHJhDQorICAgICAgfTsNCisgICAgICBDTXlDb21QdHI8SVNldFByb3BlcnRpZXM+IHNldFByb3BlcnRpZXM7DQorICAgICAgb3V0QXJjaGl2ZS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lTZXRQcm9wZXJ0aWVzLCAodm9pZCAqKikmc2V0UHJvcGVydGllcyk7DQorICAgICAgaWYgKCFzZXRQcm9wZXJ0aWVzKQ0KKyAgICAgIHsNCisgICAgICAgIFByaW50RXJyb3IoIklTZXRQcm9wZXJ0aWVzIHVuc3VwcG9ydGVkIik7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgICB9DQorICAgICAgUklOT0soc2V0UHJvcGVydGllcy0+U2V0UHJvcGVydGllcyhuYW1lcywgdmFsdWVzLCBrTnVtUHJvcHMpKTsNCisgICAgfQ0KKyAgICAqLw0KKyAgICANCisgICAgSFJFU1VMVCByZXN1bHQgPSBvdXRBcmNoaXZlLT5VcGRhdGVJdGVtcyhvdXRGaWxlU3RyZWFtLCBkaXJJdGVtcy5TaXplKCksIHVwZGF0ZUNhbGxiYWNrKTsNCisgICAgdXBkYXRlQ2FsbGJhY2tTcGVjLT5GaW5pbGl6ZSgpOw0KKyAgICBpZiAocmVzdWx0ICE9IFNfT0spDQorICAgIHsNCisgICAgICBQcmludEVycm9yKCJVcGRhdGUgRXJyb3IiKTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBGT1JfVkVDVE9SIChpLCB1cGRhdGVDYWxsYmFja1NwZWMtPkZhaWxlZEZpbGVzKQ0KKyAgICB7DQorICAgICAgUHJpbnROZXdMaW5lKCk7DQorICAgICAgUHJpbnRFcnJvcigiRXJyb3IgZm9yIGZpbGUiLCB1cGRhdGVDYWxsYmFja1NwZWMtPkZhaWxlZEZpbGVzW2ldKTsNCisgICAgfQ0KKyAgICBpZiAodXBkYXRlQ2FsbGJhY2tTcGVjLT5GYWlsZWRGaWxlcy5TaXplKCkgIT0gMCkNCisgICAgICByZXR1cm4gMTsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgaWYgKG51bUFyZ3MgIT0gMykNCisgICAgew0KKyAgICAgIFByaW50U3RyaW5nTG4oa0hlbHBTdHJpbmcpOw0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9DQorDQorICAgIGJvb2wgbGlzdENvbW1hbmQ7DQorICAgIGlmIChjID09ICdsJykNCisgICAgICBsaXN0Q29tbWFuZCA9IHRydWU7DQorICAgIGVsc2UgaWYgKGMgPT0gJ3gnKQ0KKyAgICAgIGxpc3RDb21tYW5kID0gZmFsc2U7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIFByaW50RXJyb3IoImluY29ycmVjdCBjb21tYW5kIik7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgIA0KKyAgICBDTXlDb21QdHI8SUluQXJjaGl2ZT4gYXJjaGl2ZTsNCisgICAgaWYgKGNyZWF0ZU9iamVjdEZ1bmMoJkNMU0lEX0NGb3JtYXQ3eiwgJklJRF9JSW5BcmNoaXZlLCAodm9pZCAqKikmYXJjaGl2ZSkgIT0gU19PSykNCisgICAgew0KKyAgICAgIFByaW50RXJyb3IoIkNhbiBub3QgZ2V0IGNsYXNzIG9iamVjdCIpOw0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIA0KKyAgICBDSW5GaWxlU3RyZWFtICpmaWxlU3BlYyA9IG5ldyBDSW5GaWxlU3RyZWFtOw0KKyAgICBDTXlDb21QdHI8SUluU3RyZWFtPiBmaWxlID0gZmlsZVNwZWM7DQorICAgIA0KKyAgICBpZiAoIWZpbGVTcGVjLT5PcGVuKGFyY2hpdmVOYW1lKSkNCisgICAgew0KKyAgICAgIFByaW50RXJyb3IoIkNhbiBub3Qgb3BlbiBhcmNoaXZlIGZpbGUiLCBhcmNoaXZlTmFtZSk7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisNCisgICAgew0KKyAgICAgIENBcmNoaXZlT3BlbkNhbGxiYWNrICpvcGVuQ2FsbGJhY2tTcGVjID0gbmV3IENBcmNoaXZlT3BlbkNhbGxiYWNrOw0KKyAgICAgIENNeUNvbVB0cjxJQXJjaGl2ZU9wZW5DYWxsYmFjaz4gb3BlbkNhbGxiYWNrKG9wZW5DYWxsYmFja1NwZWMpOw0KKyAgICAgIG9wZW5DYWxsYmFja1NwZWMtPlBhc3N3b3JkSXNEZWZpbmVkID0gZmFsc2U7DQorICAgICAgLy8gb3BlbkNhbGxiYWNrU3BlYy0+UGFzc3dvcmRJc0RlZmluZWQgPSB0cnVlOw0KKyAgICAgIC8vIG9wZW5DYWxsYmFja1NwZWMtPlBhc3N3b3JkID0gTCIxIjsNCisgICAgICANCisgICAgICBpZiAoYXJjaGl2ZS0+T3BlbihmaWxlLCAwLCBvcGVuQ2FsbGJhY2spICE9IFNfT0spDQorICAgICAgew0KKyAgICAgICAgUHJpbnRFcnJvcigiQ2FuIG5vdCBvcGVuIGZpbGUgYXMgYXJjaGl2ZSIsIGFyY2hpdmVOYW1lKTsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgaWYgKGxpc3RDb21tYW5kKQ0KKyAgICB7DQorICAgICAgLy8gTGlzdCBjb21tYW5kDQorICAgICAgVUludDMyIG51bUl0ZW1zID0gMDsNCisgICAgICBhcmNoaXZlLT5HZXROdW1iZXJPZkl0ZW1zKCZudW1JdGVtcyk7DQorICAgICAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgIHsNCisgICAgICAgICAgLy8gR2V0IHVuY29tcHJlc3NlZCBzaXplIG9mIGZpbGUNCisgICAgICAgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgICAgICAgIGFyY2hpdmUtPkdldFByb3BlcnR5KGksIGtwaWRTaXplLCAmcHJvcCk7DQorICAgICAgICAgIGNoYXIgc1szMl07DQorICAgICAgICAgIENvbnZlcnRQcm9wVmFyaWFudFRvU2hvcnRTdHJpbmcocHJvcCwgcyk7DQorICAgICAgICAgIFByaW50U3RyaW5nKHMpOw0KKyAgICAgICAgICBQcmludFN0cmluZygiICAiKTsNCisgICAgICAgIH0NCisgICAgICAgIHsNCisgICAgICAgICAgLy8gR2V0IG5hbWUgb2YgZmlsZQ0KKyAgICAgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgICAgICAgYXJjaGl2ZS0+R2V0UHJvcGVydHkoaSwga3BpZFBhdGgsICZwcm9wKTsNCisgICAgICAgICAgaWYgKHByb3AudnQgPT0gVlRfQlNUUikNCisgICAgICAgICAgICBQcmludFN0cmluZyhwcm9wLmJzdHJWYWwpOw0KKyAgICAgICAgICBlbHNlIGlmIChwcm9wLnZ0ICE9IFZUX0VNUFRZKQ0KKyAgICAgICAgICAgIFByaW50U3RyaW5nKCJFUlJPUiEiKTsNCisgICAgICAgIH0NCisgICAgICAgIFByaW50TmV3TGluZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAvLyBFeHRyYWN0IGNvbW1hbmQNCisgICAgICBDQXJjaGl2ZUV4dHJhY3RDYWxsYmFjayAqZXh0cmFjdENhbGxiYWNrU3BlYyA9IG5ldyBDQXJjaGl2ZUV4dHJhY3RDYWxsYmFjazsNCisgICAgICBDTXlDb21QdHI8SUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2s+IGV4dHJhY3RDYWxsYmFjayhleHRyYWN0Q2FsbGJhY2tTcGVjKTsNCisgICAgICBleHRyYWN0Q2FsbGJhY2tTcGVjLT5Jbml0KGFyY2hpdmUsIEZURVhUKCIiKSk7IC8vIHNlY29uZCBwYXJhbWV0ZXIgaXMgb3V0cHV0IGZvbGRlciBwYXRoDQorICAgICAgZXh0cmFjdENhbGxiYWNrU3BlYy0+UGFzc3dvcmRJc0RlZmluZWQgPSBmYWxzZTsNCisgICAgICAvLyBleHRyYWN0Q2FsbGJhY2tTcGVjLT5QYXNzd29yZElzRGVmaW5lZCA9IHRydWU7DQorICAgICAgLy8gZXh0cmFjdENhbGxiYWNrU3BlYy0+UGFzc3dvcmQgPSBMIjEiOw0KKyAgICAgIEhSRVNVTFQgcmVzdWx0ID0gYXJjaGl2ZS0+RXh0cmFjdChOVUxMLCAoVUludDMyKShJbnQzMikoLTEpLCBmYWxzZSwgZXh0cmFjdENhbGxiYWNrKTsNCisgICAgICBpZiAocmVzdWx0ICE9IFNfT0spDQorICAgICAgew0KKyAgICAgICAgUHJpbnRFcnJvcigiRXh0cmFjdCBFcnJvciIpOw0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gMDsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9DbGllbnQ3ei9DbGllbnQ3ei5kc3AgYi9sem1hL0NQUC83emlwL1VJL0NsaWVudDd6L0NsaWVudDd6LmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTQ3MTFjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9DbGllbnQ3ei9DbGllbnQ3ei5kc3AKQEAgLTAsMCArMSwyMzUgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iQ2xpZW50N3oiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyAqKiBETyBOT1QgRURJVCAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz1DbGllbnQ3eiAtIFdpbjMyIERlYnVnDQorIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJDbGllbnQ3ei5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFDQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiQ2xpZW50N3oubWFrIiBDRkc9IkNsaWVudDd6IC0gV2luMzIgRGVidWciDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6DQorIU1FU1NBR0UgDQorIU1FU1NBR0UgIkNsaWVudDd6IC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSAiQ2xpZW50N3ogLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikNCishTUVTU0FHRSANCisNCisjIEJlZ2luIFByb2plY3QNCisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiQ2xpZW50N3ogLSBXaW4zMiBSZWxlYXNlIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KKyMgUFJPUCBUYXJnZXRfRGlyICIiDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWXUic3RkYWZ4LmgiIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzQgL1dYIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1l1InN0ZGFmeC5oIiAvRkQgL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQxOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQxOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NiAvb3V0OiJSZWxlYXNlLzd6Y2wuZXhlIg0KKw0KKyFFTFNFSUYgICIkKENGRykiID09ICJDbGllbnQ3eiAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWXUic3RkYWZ4LmgiIC9GRCAvR1ogL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzQgL1dYIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWXUic3RkYWZ4LmgiIC9GRCAvR1ogL2MNCisjIEFERCBCQVNFIFJTQyAvbCAweDQxOSAvZCAiX0RFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQxOSAvZCAiX0RFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiRGVidWcvN3pjbC5leGUiIC9wZGJ0eXBlOnNlcHQNCisNCishRU5ESUYgDQorDQorIyBCZWdpbiBUYXJnZXQNCisNCisjIE5hbWUgIkNsaWVudDd6IC0gV2luMzIgUmVsZWFzZSINCisjIE5hbWUgIkNsaWVudDd6IC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBHcm91cCAiU3BlYyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXHJlc291cmNlLnJjDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU3RkQWZ4LmNwcA0KKyMgQUREIENQUCAvWWMic3RkYWZ4LmgiDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cU3RkQWZ4LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiV2luZG93cyINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRExMLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXERMTC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZURpci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlRGlyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlRmluZC5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xGaWxlRmluZC5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZUlPLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXEZpbGVJTy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZU5hbWUuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcRmlsZU5hbWUuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFByb3BWYXJpYW50LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxXaW5kb3dzXFByb3BWYXJpYW50LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cV2luZG93c1xQcm9wVmFyaWFudENvbnYuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXFdpbmRvd3NcUHJvcFZhcmlhbnRDb252LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiQ29tbW9uIg0KKw0KKyMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIg0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXEludFRvU3RyaW5nLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cSW50VG9TdHJpbmcuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cTXlTdHJpbmcuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxNeVN0cmluZy5oDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxNeVZlY3Rvci5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE15VmVjdG9yLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXE5ld0hhbmRsZXIuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxOZXdIYW5kbGVyLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXFN0cmluZ0NvbnZlcnQuY3BwDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXENvbW1vblxTdHJpbmdDb252ZXJ0LmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cLi5cQ29tbW9uXFdpbGRjYXJkLmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlxDb21tb25cV2lsZGNhcmQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgR3JvdXANCisjIEJlZ2luIEdyb3VwICI3emlwIENvbW1vbiINCisNCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXENvbW1vblxGaWxlU3RyZWFtcy5jcHANCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Li5cLi5cQ29tbW9uXEZpbGVTdHJlYW1zLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIEdyb3VwDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXENsaWVudDd6LmNwcA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uLlwuLlwuLlwuLlxDXFNvcnQuaA0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ2xpZW50N3ovQ2xpZW50N3ouZHN3IGIvbHptYS9DUFAvN3ppcC9VSS9DbGllbnQ3ei9DbGllbnQ3ei5kc3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyNjg1MQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ2xpZW50N3ovQ2xpZW50N3ouZHN3CkBAIC0wLDAgKzEsMjkgQEAKK01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFdvcmtzcGFjZSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQorIyBXQVJOSU5HOiBETyBOT1QgRURJVCBPUiBERUxFVEUgVEhJUyBXT1JLU1BBQ0UgRklMRSENCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorUHJvamVjdDogIkNsaWVudDd6Ij0uXENsaWVudDd6LmRzcCAtIFBhY2thZ2UgT3duZXI9PDQ+DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTw0Pg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitHbG9iYWw6DQorDQorUGFja2FnZT08NT4NCit7e3sNCit9fX0NCisNCitQYWNrYWdlPTwzPg0KK3t7ew0KK319fQ0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NsaWVudDd6L1N0ZEFmeC5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NsaWVudDd6L1N0ZEFmeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkM2IxZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ2xpZW50N3ovU3RkQWZ4LmNwcApAQCAtMCwwICsxLDMgQEAKKy8vIFN0ZEFmeC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9DbGllbnQ3ei9TdGRBZnguaCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ2xpZW50N3ovU3RkQWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkOWFjMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ2xpZW50N3ovU3RkQWZ4LmgKQEAgLTAsMCArMSw4IEBACisvLyBTdGRBZnguaA0KKw0KKyNpZm5kZWYgX19TVERBRlhfSA0KKyNkZWZpbmUgX19TVERBRlhfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vQ29tbW9uLmgiDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9DbGllbnQ3ei9tYWtlZmlsZSBiL2x6bWEvQ1BQLzd6aXAvVUkvQ2xpZW50N3ovbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2OGYxNgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ2xpZW50N3ovbWFrZWZpbGUKQEAgLTAsMCArMSwyOCBAQAorUFJPRyA9IDd6Y2wuZXhlDQorTVlfQ09OU09MRSA9IDENCisNCitDVVJSRU5UX09CSlMgPSBcDQorICAkT1xDbGllbnQ3ei5vYmogXA0KKw0KK0NPTU1PTl9PQkpTID0gXA0KKyAgJE9cSW50VG9TdHJpbmcub2JqIFwNCisgICRPXE5ld0hhbmRsZXIub2JqIFwNCisgICRPXE15U3RyaW5nLm9iaiBcDQorICAkT1xTdHJpbmdDb252ZXJ0Lm9iaiBcDQorICAkT1xTdHJpbmdUb0ludC5vYmogXA0KKyAgJE9cTXlWZWN0b3Iub2JqIFwNCisgICRPXFdpbGRjYXJkLm9iaiBcDQorDQorV0lOX09CSlMgPSBcDQorICAkT1xETEwub2JqIFwNCisgICRPXEZpbGVEaXIub2JqIFwNCisgICRPXEZpbGVGaW5kLm9iaiBcDQorICAkT1xGaWxlSU8ub2JqIFwNCisgICRPXEZpbGVOYW1lLm9iaiBcDQorICAkT1xQcm9wVmFyaWFudC5vYmogXA0KKyAgJE9cUHJvcFZhcmlhbnRDb252Lm9iaiBcDQorDQorN1pJUF9DT01NT05fT0JKUyA9IFwNCisgICRPXEZpbGVTdHJlYW1zLm9iaiBcDQorDQorIWluY2x1ZGUgIi4uLy4uLzd6aXAubWFrIg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ2xpZW50N3ovcmVzb3VyY2UucmMgYi9sem1hL0NQUC83emlwL1VJL0NsaWVudDd6L3Jlc291cmNlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MDg2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NsaWVudDd6L3Jlc291cmNlLnJjCkBAIC0wLDAgKzEsMyBAQAorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL0MvN3pWZXJzaW9uLnJjIg0KKw0KK01ZX1ZFUlNJT05fSU5GT19BUFAoIjctWmlwIGNsaWVudCIsICI3emNsIikNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9BcmNoaXZlQ29tbWFuZExpbmUuY3BwIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vQXJjaGl2ZUNvbW1hbmRMaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTBlYWIwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vQXJjaGl2ZUNvbW1hbmRMaW5lLmNwcApAQCAtMCwwICsxLDEyNTcgQEAKKy8vIEFyY2hpdmVDb21tYW5kTGluZS5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorI3VuZGVmIHByaW50Zg0KKyN1bmRlZiBzcHJpbnRmDQorDQorI2lmZGVmIF9XSU4zMg0KKyNpZm5kZWYgVU5ERVJfQ0UNCisjaW5jbHVkZSA8aW8uaD4NCisjZW5kaWYNCisjZW5kaWYNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0xpc3RGaWxlVXRpbHMuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ1RvSW50LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZURpci5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVOYW1lLmgiDQorI2lmZGVmIF9XSU4zMg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVNYXBwaW5nLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvU3luY2hyb25pemF0aW9uLmgiDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIkFyY2hpdmVDb21tYW5kTGluZS5oIg0KKyNpbmNsdWRlICJFbnVtRGlySXRlbXMuaCINCisjaW5jbHVkZSAiU29ydFV0aWxzLmgiDQorI2luY2x1ZGUgIlVwZGF0ZS5oIg0KKyNpbmNsdWRlICJVcGRhdGVBY3Rpb24uaCINCisNCitleHRlcm4gYm9vbCBnX0Nhc2VTZW5zaXRpdmU7DQorDQorI2lmZGVmIFVOREVSX0NFDQorDQorI2RlZmluZSBNWV9JU19URVJNSU5BTCh4KSBmYWxzZTsNCisNCisjZWxzZQ0KKw0KKyNpZiBfTVNDX1ZFUiA+PSAxNDAwDQorI2RlZmluZSBNWV9pc2F0dHlfZmlsZW5vKHgpIF9pc2F0dHkoX2ZpbGVubyh4KSkNCisjZWxzZQ0KKyNkZWZpbmUgTVlfaXNhdHR5X2ZpbGVubyh4KSBpc2F0dHkoZmlsZW5vKHgpKQ0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgTVlfSVNfVEVSTUlOQUwoeCkgKE1ZX2lzYXR0eV9maWxlbm8oeCkgIT0gMCk7DQorDQorI2VuZGlmDQorDQordXNpbmcgbmFtZXNwYWNlIE5Db21tYW5kTGluZVBhcnNlcjsNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQordXNpbmcgbmFtZXNwYWNlIE5GaWxlOw0KKw0KK3N0YXRpYyBib29sIFN0cmluZ1RvVUludDMyKGNvbnN0IHdjaGFyX3QgKnMsIFVJbnQzMiAmdikNCit7DQorICBpZiAoKnMgPT0gMCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgY29uc3Qgd2NoYXJfdCAqZW5kOw0KKyAgdiA9IENvbnZlcnRTdHJpbmdUb1VJbnQzMihzLCAmZW5kKTsNCisgIHJldHVybiAqZW5kID09IDA7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIEFkZE5ld0xpbmUoVVN0cmluZyAmcykNCit7DQorICBzICs9IEwnXG4nOw0KK30NCisNCitDQXJjQ21kTGluZUV4Y2VwdGlvbjo6Q0FyY0NtZExpbmVFeGNlcHRpb24oY29uc3QgY2hhciAqYSwgY29uc3Qgd2NoYXJfdCAqdSkNCit7DQorICAoKnRoaXMpICs9IE11bHRpQnl0ZVRvVW5pY29kZVN0cmluZyhhKTsNCisgIGlmICh1KQ0KKyAgew0KKyAgICBBZGROZXdMaW5lKCp0aGlzKTsNCisgICAgKCp0aGlzKSArPSB1Ow0KKyAgfQ0KK30NCisNCitpbnQgZ19Db2RlUGFnZSA9IC0xOw0KKw0KK25hbWVzcGFjZSBOS2V5IHsNCitlbnVtIEVudW0NCit7DQorICBrSGVscDEgPSAwLA0KKyAga0hlbHAyLA0KKyAga0hlbHAzLA0KKyAga0Rpc2FibGVIZWFkZXJzLA0KKyAga0Rpc2FibGVQZXJjZW50cywNCisgIGtBcmNoaXZlVHlwZSwNCisgIGtZZXMsDQorICAjaWZuZGVmIF9OT19DUllQVE8NCisgIGtQYXNzd29yZCwNCisgICNlbmRpZg0KKyAga1Byb3BlcnR5LA0KKyAga091dHB1dERpciwNCisgIGtXb3JraW5nRGlyLA0KKyAga0luY2x1ZGUsDQorICBrRXhjbHVkZSwNCisgIGtBckluY2x1ZGUsDQorICBrQXJFeGNsdWRlLA0KKyAga05vQXJOYW1lLA0KKyAga1VwZGF0ZSwNCisgIGtWb2x1bWUsDQorICBrUmVjdXJzZWQsDQorICBrU2Z4LA0KKyAga1N0ZEluLA0KKyAga1N0ZE91dCwNCisgIGtPdmVyd3JpdGUsDQorICBrRW1haWwsDQorICBrU2hvd0RpYWxvZywNCisgIGtMYXJnZVBhZ2VzLA0KKyAga0xpc3RmaWxlQ2hhclNldCwNCisgIGtDb25zb2xlQ2hhclNldCwNCisgIGtUZWNoTW9kZSwNCisgIGtTaGFyZUZvcldyaXRlLA0KKyAga0Nhc2VTZW5zaXRpdmUsDQorICBrSGFzaCwNCisgIGtBcmNOYW1lTW9kZSwNCisNCisgIGtEaXNhYmxlV2lsZGNhcmRQYXJzaW5nLA0KKyAga0VsaW1EdXAsDQorICBrRnVsbFBhdGhNb2RlLA0KKyAgDQorICBrSGFyZExpbmtzLA0KKyAga1N5bUxpbmtzLA0KKyAga050U2VjdXJpdHksDQorICBrQWx0U3RyZWFtcywNCisgIGtSZXBsYWNlQ29sb25Gb3JBbHRTdHJlYW0sDQorICBrV3JpdGVUb0FsdFN0cmVhbUlmQ29sb24sDQorDQorICBrRGVsZXRlQWZ0ZXJDb21wcmVzc2luZywNCisgIGtTZXRBcmNNVGltZSwNCisgIGtFeGNsdWRlZEFyY1R5cGUNCit9Ow0KKw0KK30NCisNCisNCitzdGF0aWMgY29uc3Qgd2NoYXJfdCBrUmVjdXJzZWRJRENoYXIgPSAncic7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtSZWN1cnNlZFBvc3RDaGFyU2V0ID0gIjAtIjsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqa19BcmNOYW1lTW9kZV9Qb3N0Q2hhclNldCA9ICJzZWEiOw0KKw0KK3N0YXRpYyBpbmxpbmUgY29uc3QgRUFyY05hbWVNb2RlIFBhcnNlQXJjTmFtZU1vZGUoaW50IHBvc3RDaGFySW5kZXgpDQorew0KKyAgc3dpdGNoIChwb3N0Q2hhckluZGV4KQ0KKyAgew0KKyAgICBjYXNlIDE6IHJldHVybiBrX0FyY05hbWVNb2RlX0V4YWN0Ow0KKyAgICBjYXNlIDI6IHJldHVybiBrX0FyY05hbWVNb2RlX0FkZDsNCisgICAgZGVmYXVsdDogcmV0dXJuIGtfQXJjTmFtZU1vZGVfU21hcnQ7DQorICB9DQorfQ0KKw0KK25hbWVzcGFjZSBOUmVjdXJzZWRQb3N0Q2hhckluZGV4IHsNCisgIGVudW0gRUVudW0NCisgIHsNCisgICAga1dpbGRjYXJkUmVjdXJzaW9uT25seSA9IDAsDQorICAgIGtOb1JlY3Vyc2lvbiA9IDENCisgIH07DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBjaGFyIGtJbW1lZGlhdGVOYW1lSUQgPSAnISc7DQorc3RhdGljIGNvbnN0IGNoYXIga01hcE5hbWVJRCA9ICcjJzsNCitzdGF0aWMgY29uc3QgY2hhciBrRmlsZUxpc3RJRCA9ICdAJzsNCisNCitzdGF0aWMgY29uc3QgY2hhciBrU29tZUNsdWRlUG9zdFN0cmluZ01pblNpemUgPSAyOyAvLyBhdCBsZWFzdCA8QHwhPjxOPmFtZSBtdXN0IGJlDQorc3RhdGljIGNvbnN0IGNoYXIga1NvbWVDbHVkZUFmdGVyUmVjdXJzZWRQb3N0U3RyaW5nTWluU2l6ZSA9IDI7IC8vIGF0IGxlYXN0IDxAfCE+PE4+YW1lIG11c3QgYmUNCisNCitzdGF0aWMgY29uc3QgY2hhciAqa092ZXJ3cml0ZVBvc3RDaGFyU2V0ID0gImFzdXQiOw0KKw0KK05FeHRyYWN0OjpOT3ZlcndyaXRlTW9kZTo6RUVudW0ga19PdmVyd3JpdGVNb2Rlc1tdID0NCit7DQorICBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OmtPdmVyd3JpdGUsDQorICBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OmtTa2lwLA0KKyAgTkV4dHJhY3Q6Ok5PdmVyd3JpdGVNb2RlOjprUmVuYW1lLA0KKyAgTkV4dHJhY3Q6Ok5PdmVyd3JpdGVNb2RlOjprUmVuYW1lRXhpc3RpbmcNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBDU3dpdGNoRm9ybSBrU3dpdGNoRm9ybXNbXSA9DQorew0KKyAgeyAiPyIgfSwNCisgIHsgImgiIH0sDQorICB7ICItaGVscCIgfSwNCisgIHsgImJhIiB9LA0KKyAgeyAiYmQiIH0sDQorICB7ICJ0IiwgIE5Td2l0Y2hUeXBlOjprU3RyaW5nLCBmYWxzZSwgMSB9LA0KKyAgeyAieSIgfSwNCisgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgeyAicCIsICBOU3dpdGNoVHlwZTo6a1N0cmluZyB9LA0KKyAgI2VuZGlmDQorICB7ICJtIiwgIE5Td2l0Y2hUeXBlOjprU3RyaW5nLCB0cnVlLCAxIH0sDQorICB7ICJvIiwgIE5Td2l0Y2hUeXBlOjprU3RyaW5nLCBmYWxzZSwgMSB9LA0KKyAgeyAidyIsICBOU3dpdGNoVHlwZTo6a1N0cmluZyB9LA0KKyAgeyAiaSIsICBOU3dpdGNoVHlwZTo6a1N0cmluZywgdHJ1ZSwga1NvbWVDbHVkZVBvc3RTdHJpbmdNaW5TaXplfSwNCisgIHsgIngiLCAgTlN3aXRjaFR5cGU6OmtTdHJpbmcsIHRydWUsIGtTb21lQ2x1ZGVQb3N0U3RyaW5nTWluU2l6ZX0sDQorICB7ICJhaSIsIE5Td2l0Y2hUeXBlOjprU3RyaW5nLCB0cnVlLCBrU29tZUNsdWRlUG9zdFN0cmluZ01pblNpemV9LA0KKyAgeyAiYXgiLCBOU3dpdGNoVHlwZTo6a1N0cmluZywgdHJ1ZSwga1NvbWVDbHVkZVBvc3RTdHJpbmdNaW5TaXplfSwNCisgIHsgImFuIiB9LA0KKyAgeyAidSIsICBOU3dpdGNoVHlwZTo6a1N0cmluZywgdHJ1ZSwgMX0sDQorICB7ICJ2IiwgIE5Td2l0Y2hUeXBlOjprU3RyaW5nLCB0cnVlLCAxfSwNCisgIHsgInIiLCAgTlN3aXRjaFR5cGU6OmtDaGFyLCBmYWxzZSwgMCwga1JlY3Vyc2VkUG9zdENoYXJTZXQgfSwNCisgIHsgInNmeCIsIE5Td2l0Y2hUeXBlOjprU3RyaW5nIH0sDQorICB7ICJzaSIsIE5Td2l0Y2hUeXBlOjprU3RyaW5nIH0sDQorICB7ICJzbyIgfSwNCisgIHsgImFvIiwgTlN3aXRjaFR5cGU6OmtDaGFyLCBmYWxzZSwgMSwga092ZXJ3cml0ZVBvc3RDaGFyU2V0fSwNCisgIHsgInNlbWwiLCBOU3dpdGNoVHlwZTo6a1N0cmluZywgZmFsc2UsIDB9LA0KKyAgeyAiYWQiIH0sDQorICB7ICJzbHAiLCBOU3dpdGNoVHlwZTo6a01pbnVzIH0sDQorICB7ICJzY3MiLCBOU3dpdGNoVHlwZTo6a1N0cmluZyB9LA0KKyAgeyAic2NjIiwgTlN3aXRjaFR5cGU6OmtTdHJpbmcgfSwNCisgIHsgInNsdCIgfSwNCisgIHsgInNzdyIgfSwNCisgIHsgInNzYyIsIE5Td2l0Y2hUeXBlOjprTWludXMgfSwNCisgIHsgInNjcmMiLCBOU3dpdGNoVHlwZTo6a1N0cmluZywgdHJ1ZSwgMCB9LA0KKyAgeyAic2EiLCAgTlN3aXRjaFR5cGU6OmtDaGFyLCBmYWxzZSwgMSwga19BcmNOYW1lTW9kZV9Qb3N0Q2hhclNldCB9LA0KKyAgDQorICB7ICJzcGQiIH0sDQorICB7ICJzcGUiLCBOU3dpdGNoVHlwZTo6a01pbnVzIH0sDQorICB7ICJzcGYiLCBOU3dpdGNoVHlwZTo6a1N0cmluZywgZmFsc2UsIDAgfSwNCisgIA0KKyAgeyAic25oIiwgTlN3aXRjaFR5cGU6OmtNaW51cyB9LA0KKyAgeyAic25sIiwgTlN3aXRjaFR5cGU6OmtNaW51cyB9LA0KKyAgeyAic25pIiB9LA0KKyAgeyAic25zIiwgTlN3aXRjaFR5cGU6OmtNaW51cyB9LA0KKyAgDQorICB7ICJzbnIiIH0sDQorICB7ICJzbmMiIH0sDQorICANCisgIHsgInNkZWwiIH0sDQorICB7ICJzdGwiIH0sDQorICB7ICJzdHgiLCBOU3dpdGNoVHlwZTo6a1N0cmluZywgdHJ1ZSwgMSB9DQorfTsNCisNCitzdGF0aWMgY29uc3Qgd2NoYXJfdCAqa1VuaXZlcnNhbFdpbGRjYXJkID0gTCIqIjsNCitzdGF0aWMgY29uc3QgaW50IGtNaW5Ob25Td2l0Y2hXb3JkcyA9IDE7DQorc3RhdGljIGNvbnN0IGludCBrQ29tbWFuZEluZGV4ID0gMDsNCisNCisvLyBzdGF0aWMgY29uc3QgY2hhciAqa1VzZXJFcnJvck1lc3NhZ2UgID0gIkluY29ycmVjdCBjb21tYW5kIGxpbmUiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprQ2Fubm90RmluZExpc3RGaWxlID0gIkNhbm5vdCBmaW5kIGxpc3RmaWxlIjsNCitzdGF0aWMgY29uc3QgY2hhciAqa0luY29ycmVjdExpc3RGaWxlID0gIkluY29ycmVjdCBpdGVtIGluIGxpc3RmaWxlLlxuQ2hlY2sgY2hhcnNldCBlbmNvZGluZyBhbmQgLXNjcyBzd2l0Y2guIjsNCisvLyBzdGF0aWMgY29uc3QgY2hhciAqa0luY29ycmVjdFdpbGRjYXJkSW5MaXN0RmlsZSA9ICJJbmNvcnJlY3Qgd2lsZGNhcmQgaW4gbGlzdGZpbGUiOw0KKy8vIHN0YXRpYyBjb25zdCBjaGFyICprSW5jb3JyZWN0V2lsZGNhcmRJbkNvbW1hbmRMaW5lICA9ICJJbmNvcnJlY3Qgd2lsZGNhcmQgaW4gY29tbWFuZCBsaW5lIjsNCitzdGF0aWMgY29uc3QgY2hhciAqa1Rlcm1pbmFsT3V0RXJyb3IgPSAiSSB3b24ndCB3cml0ZSBjb21wcmVzc2VkIGRhdGEgdG8gYSB0ZXJtaW5hbCI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtTYW1lVGVybWluYWxFcnJvciA9ICJJIHdvbid0IHdyaXRlIGRhdGEgYW5kIHByb2dyYW0ncyBtZXNzYWdlcyB0byBzYW1lIHRlcm1pbmFsIjsNCitzdGF0aWMgY29uc3QgY2hhciAqa0VtcHR5RmlsZVBhdGggPSAiRW1wdHkgZmlsZSBwYXRoIjsNCitzdGF0aWMgY29uc3QgY2hhciAqa0Nhbm5vdEZpbmRBcmNoaXZlID0gIkNhbm5vdCBmaW5kIGFyY2hpdmUiOw0KKw0KK2Jvb2wgQ0FyY0NvbW1hbmQ6OklzRnJvbUV4dHJhY3RHcm91cCgpIGNvbnN0DQorew0KKyAgc3dpdGNoIChDb21tYW5kVHlwZSkNCisgIHsNCisgICAgY2FzZSBOQ29tbWFuZFR5cGU6OmtUZXN0Og0KKyAgICBjYXNlIE5Db21tYW5kVHlwZTo6a0V4dHJhY3Q6DQorICAgIGNhc2UgTkNvbW1hbmRUeXBlOjprRXh0cmFjdEZ1bGw6DQorICAgICAgcmV0dXJuIHRydWU7DQorICB9DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK05FeHRyYWN0OjpOUGF0aE1vZGU6OkVFbnVtIENBcmNDb21tYW5kOjpHZXRQYXRoTW9kZSgpIGNvbnN0DQorew0KKyAgc3dpdGNoIChDb21tYW5kVHlwZSkNCisgIHsNCisgICAgY2FzZSBOQ29tbWFuZFR5cGU6OmtUZXN0Og0KKyAgICBjYXNlIE5Db21tYW5kVHlwZTo6a0V4dHJhY3RGdWxsOg0KKyAgICAgIHJldHVybiBORXh0cmFjdDo6TlBhdGhNb2RlOjprRnVsbFBhdGhzOw0KKyAgfQ0KKyAgcmV0dXJuIE5FeHRyYWN0OjpOUGF0aE1vZGU6OmtOb1BhdGhzOw0KK30NCisNCitib29sIENBcmNDb21tYW5kOjpJc0Zyb21VcGRhdGVHcm91cCgpIGNvbnN0DQorew0KKyAgc3dpdGNoIChDb21tYW5kVHlwZSkNCisgIHsNCisgICAgY2FzZSBOQ29tbWFuZFR5cGU6OmtBZGQ6DQorICAgIGNhc2UgTkNvbW1hbmRUeXBlOjprVXBkYXRlOg0KKyAgICBjYXNlIE5Db21tYW5kVHlwZTo6a0RlbGV0ZToNCisgICAgY2FzZSBOQ29tbWFuZFR5cGU6OmtSZW5hbWU6DQorICAgICAgcmV0dXJuIHRydWU7DQorICB9DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK3N0YXRpYyBOUmVjdXJzZWRUeXBlOjpFRW51bSBHZXRSZWN1cnNlZFR5cGVGcm9tSW5kZXgoaW50IGluZGV4KQ0KK3sNCisgIHN3aXRjaCAoaW5kZXgpDQorICB7DQorICAgIGNhc2UgTlJlY3Vyc2VkUG9zdENoYXJJbmRleDo6a1dpbGRjYXJkUmVjdXJzaW9uT25seToNCisgICAgICByZXR1cm4gTlJlY3Vyc2VkVHlwZTo6a1dpbGRjYXJkT25seVJlY3Vyc2VkOw0KKyAgICBjYXNlIE5SZWN1cnNlZFBvc3RDaGFySW5kZXg6OmtOb1JlY3Vyc2lvbjoNCisgICAgICByZXR1cm4gTlJlY3Vyc2VkVHlwZTo6a05vblJlY3Vyc2VkOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBOUmVjdXJzZWRUeXBlOjprUmVjdXJzZWQ7DQorICB9DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICpnX0NvbW1hbmRzID0gImF1ZHRleGxiaWgiOw0KKw0KK3N0YXRpYyBib29sIFBhcnNlQXJjaGl2ZUNvbW1hbmQoY29uc3QgVVN0cmluZyAmY29tbWFuZFN0cmluZywgQ0FyY0NvbW1hbmQgJmNvbW1hbmQpDQorew0KKyAgVVN0cmluZyBzID0gY29tbWFuZFN0cmluZzsNCisgIHMuTWFrZUxvd2VyX0FzY2lpKCk7DQorICBpZiAocy5MZW4oKSA9PSAxKQ0KKyAgew0KKyAgICBpZiAoc1swXSA+IDB4N0YpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBpbnQgaW5kZXggPSBGaW5kQ2hhclBvc0luU3RyaW5nKGdfQ29tbWFuZHMsIChjaGFyKXNbMF0pOw0KKyAgICBpZiAoaW5kZXggPCAwKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgY29tbWFuZC5Db21tYW5kVHlwZSA9IChOQ29tbWFuZFR5cGU6OkVFbnVtKWluZGV4Ow0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIGlmIChzLkxlbigpID09IDIgJiYgc1swXSA9PSAncicgJiYgc1sxXSA9PSAnbicpDQorICB7DQorICAgIGNvbW1hbmQuQ29tbWFuZFR5cGUgPSAoTkNvbW1hbmRUeXBlOjprUmVuYW1lKTsNCisgICAgcmV0dXJuIHRydWU7DQorICB9DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIGZpbGVuYW1lcyBmdW5jdGlvbnMNCisNCitzdGF0aWMgdm9pZCBBZGROYW1lVG9DZW5zb3IoTldpbGRjYXJkOjpDQ2Vuc29yICZjZW5zb3IsDQorICAgIGNvbnN0IFVTdHJpbmcgJm5hbWUsIGJvb2wgaW5jbHVkZSwgTlJlY3Vyc2VkVHlwZTo6RUVudW0gdHlwZSwgYm9vbCB3aWxkY2FyZE1hdGNoaW5nKQ0KK3sNCisgIGJvb2wgcmVjdXJzZWQgPSBmYWxzZTsNCisNCisgIHN3aXRjaCAodHlwZSkNCisgIHsNCisgICAgY2FzZSBOUmVjdXJzZWRUeXBlOjprV2lsZGNhcmRPbmx5UmVjdXJzZWQ6DQorICAgICAgcmVjdXJzZWQgPSBEb2VzTmFtZUNvbnRhaW5XaWxkY2FyZChuYW1lKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBOUmVjdXJzZWRUeXBlOjprUmVjdXJzZWQ6DQorICAgICAgcmVjdXJzZWQgPSB0cnVlOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgY2Vuc29yLkFkZFByZUl0ZW0oaW5jbHVkZSwgbmFtZSwgcmVjdXJzZWQsIHdpbGRjYXJkTWF0Y2hpbmcpOw0KK30NCisNCitzdGF0aWMgdm9pZCBBZGRSZW5hbWVQYWlyKENPYmplY3RWZWN0b3I8Q1JlbmFtZVBhaXI+ICpyZW5hbWVQYWlycywNCisgICAgY29uc3QgVVN0cmluZyAmb2xkTmFtZSwgY29uc3QgVVN0cmluZyAmbmV3TmFtZSwgTlJlY3Vyc2VkVHlwZTo6RUVudW0gdHlwZSwNCisgICAgYm9vbCB3aWxkY2FyZE1hdGNoaW5nKQ0KK3sNCisgIENSZW5hbWVQYWlyICZwYWlyID0gcmVuYW1lUGFpcnMtPkFkZE5ldygpOw0KKyAgcGFpci5PbGROYW1lID0gb2xkTmFtZTsNCisgIHBhaXIuTmV3TmFtZSA9IG5ld05hbWU7DQorICBwYWlyLlJlY3Vyc2VkVHlwZSA9IHR5cGU7DQorICBwYWlyLldpbGRjYXJkUGFyc2luZyA9IHdpbGRjYXJkTWF0Y2hpbmc7DQorDQorICBpZiAoIXBhaXIuUHJlcGFyZSgpKQ0KKyAgew0KKyAgICBVU3RyaW5nIHZhbDsNCisgICAgdmFsICs9IHBhaXIuT2xkTmFtZTsNCisgICAgQWRkTmV3TGluZSh2YWwpOw0KKyAgICB2YWwgKz0gcGFpci5OZXdOYW1lOw0KKyAgICBBZGROZXdMaW5lKHZhbCk7DQorICAgIGlmICh0eXBlID09IE5SZWN1cnNlZFR5cGU6OmtSZWN1cnNlZCkNCisgICAgICB2YWwgKz0gTCItciI7DQorICAgIGVsc2UgaWYgKHR5cGUgPT0gTlJlY3Vyc2VkVHlwZTo6a1JlY3Vyc2VkKQ0KKyAgICAgIHZhbCArPSBMIi1yMCI7DQorICAgIHRocm93IENBcmNDbWRMaW5lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCByZW5hbWUgY29tbWFuZDoiLCB2YWwpOw0KKyAgfQ0KK30NCisNCitzdGF0aWMgdm9pZCBBZGRUb0NlbnNvckZyb21MaXN0RmlsZSgNCisgICAgQ09iamVjdFZlY3RvcjxDUmVuYW1lUGFpcj4gKnJlbmFtZVBhaXJzLA0KKyAgICBOV2lsZGNhcmQ6OkNDZW5zb3IgJmNlbnNvciwNCisgICAgTFBDV1NUUiBmaWxlTmFtZSwgYm9vbCBpbmNsdWRlLCBOUmVjdXJzZWRUeXBlOjpFRW51bSB0eXBlLCBib29sIHdpbGRjYXJkTWF0Y2hpbmcsIEludDMyIGNvZGVQYWdlKQ0KK3sNCisgIFVTdHJpbmdWZWN0b3IgbmFtZXM7DQorICBpZiAoIU5GaW5kOjpEb2VzRmlsZUV4aXN0KHVzMmZzKGZpbGVOYW1lKSkpDQorICAgIHRocm93IENBcmNDbWRMaW5lRXhjZXB0aW9uKGtDYW5ub3RGaW5kTGlzdEZpbGUsIGZpbGVOYW1lKTsNCisgIGlmICghUmVhZE5hbWVzRnJvbUxpc3RGaWxlKHVzMmZzKGZpbGVOYW1lKSwgbmFtZXMsIGNvZGVQYWdlKSkNCisgICAgdGhyb3cgQ0FyY0NtZExpbmVFeGNlcHRpb24oa0luY29ycmVjdExpc3RGaWxlLCBmaWxlTmFtZSk7DQorICBpZiAocmVuYW1lUGFpcnMpDQorICB7DQorICAgIGlmICgobmFtZXMuU2l6ZSgpICYgMSkgIT0gMCkNCisgICAgICB0aHJvdyBDQXJjQ21kTGluZUV4Y2VwdGlvbihrSW5jb3JyZWN0TGlzdEZpbGUsIGZpbGVOYW1lKTsNCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5hbWVzLlNpemUoKTsgaSArPSAyKQ0KKyAgICB7DQorICAgICAgLy8gY2hhbmdlIHR5cGUgISEhIQ0KKyAgICAgIEFkZFJlbmFtZVBhaXIocmVuYW1lUGFpcnMsIG5hbWVzW2ldLCBuYW1lc1tpICsgMV0sIHR5cGUsIHdpbGRjYXJkTWF0Y2hpbmcpOw0KKyAgICB9DQorICB9DQorICBlbHNlDQorICAgIEZPUl9WRUNUT1IgKGksIG5hbWVzKQ0KKyAgICAgIEFkZE5hbWVUb0NlbnNvcihjZW5zb3IsIG5hbWVzW2ldLCBpbmNsdWRlLCB0eXBlLCB3aWxkY2FyZE1hdGNoaW5nKTsNCit9DQorDQorc3RhdGljIHZvaWQgQWRkVG9DZW5zb3JGcm9tTm9uU3dpdGNoZXNTdHJpbmdzKA0KKyAgICBDT2JqZWN0VmVjdG9yPENSZW5hbWVQYWlyPiAqcmVuYW1lUGFpcnMsDQorICAgIHVuc2lnbmVkIHN0YXJ0SW5kZXgsDQorICAgIE5XaWxkY2FyZDo6Q0NlbnNvciAmY2Vuc29yLA0KKyAgICBjb25zdCBVU3RyaW5nVmVjdG9yICZub25Td2l0Y2hTdHJpbmdzLCBOUmVjdXJzZWRUeXBlOjpFRW51bSB0eXBlLA0KKyAgICBib29sIHdpbGRjYXJkTWF0Y2hpbmcsDQorICAgIGJvb2wgdGhlcmVBcmVTd2l0Y2hJbmNsdWRlcywgSW50MzIgY29kZVBhZ2UpDQorew0KKyAgaWYgKChyZW5hbWVQYWlycyB8fCBub25Td2l0Y2hTdHJpbmdzLlNpemUoKSA9PSBzdGFydEluZGV4KSAmJiAhdGhlcmVBcmVTd2l0Y2hJbmNsdWRlcykNCisgICAgQWRkTmFtZVRvQ2Vuc29yKGNlbnNvciwga1VuaXZlcnNhbFdpbGRjYXJkLCB0cnVlLCB0eXBlLA0KKyAgICAgICAgdHJ1ZSAvLyB3aWxkY2FyZE1hdGNoaW5nDQorICAgICAgICApOw0KKw0KKyAgaW50IG9sZEluZGV4ID0gLTE7DQorICANCisgIGZvciAodW5zaWduZWQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBub25Td2l0Y2hTdHJpbmdzLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCBVU3RyaW5nICZzID0gbm9uU3dpdGNoU3RyaW5nc1tpXTsNCisgICAgaWYgKHMuSXNFbXB0eSgpKQ0KKyAgICAgIHRocm93IENBcmNDbWRMaW5lRXhjZXB0aW9uKGtFbXB0eUZpbGVQYXRoKTsNCisgICAgaWYgKHNbMF0gPT0ga0ZpbGVMaXN0SUQpDQorICAgICAgQWRkVG9DZW5zb3JGcm9tTGlzdEZpbGUocmVuYW1lUGFpcnMsIGNlbnNvciwgcy5QdHIoMSksIHRydWUsIHR5cGUsIHdpbGRjYXJkTWF0Y2hpbmcsIGNvZGVQYWdlKTsNCisgICAgZWxzZSBpZiAocmVuYW1lUGFpcnMpDQorICAgIHsNCisgICAgICBpZiAob2xkSW5kZXggPT0gLTEpDQorICAgICAgICBvbGRJbmRleCA9IHN0YXJ0SW5kZXg7DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIC8vIE5SZWN1cnNlZFR5cGU6OkVFbnVtIHR5cGUgaXMgdXNlZCBmb3IgZ2xvYmFsIHdpbGRjYXJkICgtaSEgc3dpdGNoZXMpDQorICAgICAgICBBZGRSZW5hbWVQYWlyKHJlbmFtZVBhaXJzLCBub25Td2l0Y2hTdHJpbmdzW29sZEluZGV4XSwgcywgTlJlY3Vyc2VkVHlwZTo6a05vblJlY3Vyc2VkLCB3aWxkY2FyZE1hdGNoaW5nKTsNCisgICAgICAgIC8vIEFkZFJlbmFtZVBhaXIocmVuYW1lUGFpcnMsIG5vblN3aXRjaFN0cmluZ3Nbb2xkSW5kZXhdLCBzLCB0eXBlKTsNCisgICAgICAgIG9sZEluZGV4ID0gLTE7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2UNCisgICAgICBBZGROYW1lVG9DZW5zb3IoY2Vuc29yLCBzLCB0cnVlLCB0eXBlLCB3aWxkY2FyZE1hdGNoaW5nKTsNCisgIH0NCisgIA0KKyAgaWYgKG9sZEluZGV4ICE9IC0xKQ0KKyAgew0KKyAgICB0aHJvdyBDQXJjQ21kTGluZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gc2Vjb25kIGZpbGUgbmFtZSBmb3IgcmVuYW1lIHBhaXI6Iiwgbm9uU3dpdGNoU3RyaW5nc1tvbGRJbmRleF0pOw0KKyAgfQ0KK30NCisNCisjaWZkZWYgX1dJTjMyDQorDQorc3RydWN0IENFdmVudFNldEVuZA0KK3sNCisgIFVTdHJpbmcgTmFtZTsNCisgIA0KKyAgQ0V2ZW50U2V0RW5kKGNvbnN0IHdjaGFyX3QgKm5hbWUpOiBOYW1lKG5hbWUpIHt9DQorICB+Q0V2ZW50U2V0RW5kKCkNCisgIHsNCisgICAgTlN5bmNocm9uaXphdGlvbjo6Q01hbnVhbFJlc2V0RXZlbnQgZXZlbnQ7DQorICAgIGlmIChldmVudC5PcGVuKEVWRU5UX01PRElGWV9TVEFURSwgZmFsc2UsIEdldFN5c3RlbVN0cmluZyhOYW1lKSkgPT0gMCkNCisgICAgICBldmVudC5TZXQoKTsNCisgIH0NCit9Ow0KKw0KK2NvbnN0IGNoYXIgKmtfSW5jb3JyZWN0TWFwQ29tbWFuZCA9ICJJbmNvcnJlY3QgTWFwIGNvbW1hbmQiOw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICpQYXJzZU1hcFdpdGhQYXRocygNCisgICAgTldpbGRjYXJkOjpDQ2Vuc29yICZjZW5zb3IsDQorICAgIGNvbnN0IFVTdHJpbmcgJnMyLCBib29sIGluY2x1ZGUsDQorICAgIE5SZWN1cnNlZFR5cGU6OkVFbnVtIGNvbW1vblJlY3Vyc2VkVHlwZSwNCisgICAgYm9vbCB3aWxkY2FyZE1hdGNoaW5nKQ0KK3sNCisgIFVTdHJpbmcgcyA9IHMyOw0KKyAgaW50IHBvcyA9IHMuRmluZChMJzonKTsNCisgIGlmIChwb3MgPCAwKQ0KKyAgICByZXR1cm4ga19JbmNvcnJlY3RNYXBDb21tYW5kOw0KKyAgaW50IHBvczIgPSBzLkZpbmQoTCc6JywgcG9zICsgMSk7DQorICBpZiAocG9zMiA8IDApDQorICAgIHJldHVybiBrX0luY29ycmVjdE1hcENvbW1hbmQ7DQorDQorICBDRXZlbnRTZXRFbmQgZXZlbnRTZXRFbmQoKGNvbnN0IHdjaGFyX3QgKilzICsgKHBvczIgKyAxKSk7DQorICBzLkRlbGV0ZUZyb20ocG9zMik7DQorICBVSW50MzIgc2l6ZTsNCisgIGlmICghU3RyaW5nVG9VSW50MzIocy5QdHIocG9zICsgMSksIHNpemUpDQorICAgICAgfHwgc2l6ZSA8IHNpemVvZih3Y2hhcl90KQ0KKyAgICAgIHx8IHNpemUgPiAoKFVJbnQzMikxIDw8IDMxKQ0KKyAgICAgIHx8IHNpemUgJSBzaXplb2Yod2NoYXJfdCkgIT0gMCkNCisgICAgcmV0dXJuICJVbnN1cHBvcnRlZCBNYXAgZGF0YSBzaXplIjsNCisNCisgIHMuRGVsZXRlRnJvbShwb3MpOw0KKyAgQ0ZpbGVNYXBwaW5nIG1hcDsNCisgIGlmIChtYXAuT3BlbihGSUxFX01BUF9SRUFELCBHZXRTeXN0ZW1TdHJpbmcocykpICE9IDApDQorICAgIHJldHVybiAiQ2FuIG5vdCBvcGVuIG1hcHBpbmciOw0KKyAgTFBWT0lEIGRhdGEgPSBtYXAuTWFwKEZJTEVfTUFQX1JFQUQsIDAsIHNpemUpOw0KKyAgaWYgKCFkYXRhKQ0KKyAgICByZXR1cm4gIk1hcFZpZXdPZkZpbGUgZXJyb3IiOw0KKyAgQ0ZpbGVVbm1hcHBlciB1bm1hcHBlcihkYXRhKTsNCisNCisgIFVTdHJpbmcgbmFtZTsNCisgIGNvbnN0IHdjaGFyX3QgKnAgPSAoY29uc3Qgd2NoYXJfdCAqKWRhdGE7DQorICBpZiAoKnAgIT0gMCkgLy8gZGF0YSBmb3JtYXQgbWFya2VyDQorICAgIHJldHVybiAiVW5zdXBwb3J0ZWQgTWFwIGRhdGEiOw0KKyAgVUludDMyIG51bUNoYXJzID0gc2l6ZSAvIHNpemVvZih3Y2hhcl90KTsNCisgIGZvciAoVUludDMyIGkgPSAxOyBpIDwgbnVtQ2hhcnM7IGkrKykNCisgIHsNCisgICAgd2NoYXJfdCBjID0gcFtpXTsNCisgICAgaWYgKGMgPT0gMCkNCisgICAgew0KKyAgICAgIC8vIE1lc3NhZ2VCb3hXKDAsIG5hbWUsIEwiNy1aaXAiLCAwKTsNCisgICAgICBBZGROYW1lVG9DZW5zb3IoY2Vuc29yLCBuYW1lLCBpbmNsdWRlLCBjb21tb25SZWN1cnNlZFR5cGUsIHdpbGRjYXJkTWF0Y2hpbmcpOw0KKyAgICAgIG5hbWUuRW1wdHkoKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgbmFtZSArPSBjOw0KKyAgfQ0KKyAgaWYgKCFuYW1lLklzRW1wdHkoKSkNCisgICAgcmV0dXJuICJNYXAgZGF0YSBlcnJvciI7DQorDQorICByZXR1cm4gTlVMTDsNCit9DQorDQorI2VuZGlmDQorDQorc3RhdGljIHZvaWQgQWRkU3dpdGNoV2lsZGNhcmRzVG9DZW5zb3IoDQorICAgIE5XaWxkY2FyZDo6Q0NlbnNvciAmY2Vuc29yLA0KKyAgICBjb25zdCBVU3RyaW5nVmVjdG9yICZzdHJpbmdzLCBib29sIGluY2x1ZGUsDQorICAgIE5SZWN1cnNlZFR5cGU6OkVFbnVtIGNvbW1vblJlY3Vyc2VkVHlwZSwNCisgICAgYm9vbCB3aWxkY2FyZE1hdGNoaW5nLA0KKyAgICBJbnQzMiBjb2RlUGFnZSkNCit7DQorICBjb25zdCBjaGFyICplcnJvck1lc3NhZ2UgPSBOVUxMOw0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdzLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCBVU3RyaW5nICZuYW1lID0gc3RyaW5nc1tpXTsNCisgICAgTlJlY3Vyc2VkVHlwZTo6RUVudW0gcmVjdXJzZWRUeXBlOw0KKyAgICB1bnNpZ25lZCBwb3MgPSAwOw0KKyAgICANCisgICAgaWYgKG5hbWUuTGVuKCkgPCBrU29tZUNsdWRlUG9zdFN0cmluZ01pblNpemUpDQorICAgIHsNCisgICAgICBlcnJvck1lc3NhZ2UgPSAiVG9vIHNob3J0IHN3aXRjaCI7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgDQorICAgIGlmICg6Ok15Q2hhckxvd2VyX0FzY2lpKG5hbWVbcG9zXSkgPT0ga1JlY3Vyc2VkSURDaGFyKQ0KKyAgICB7DQorICAgICAgcG9zKys7DQorICAgICAgd2NoYXJfdCBjID0gbmFtZVtwb3NdOw0KKyAgICAgIGludCBpbmRleCA9IC0xOw0KKyAgICAgIGlmIChjIDw9IDB4N0YpDQorICAgICAgICBpbmRleCA9IEZpbmRDaGFyUG9zSW5TdHJpbmcoa1JlY3Vyc2VkUG9zdENoYXJTZXQsIChjaGFyKWMpOw0KKyAgICAgIHJlY3Vyc2VkVHlwZSA9IEdldFJlY3Vyc2VkVHlwZUZyb21JbmRleChpbmRleCk7DQorICAgICAgaWYgKGluZGV4ID49IDApDQorICAgICAgICBwb3MrKzsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgcmVjdXJzZWRUeXBlID0gY29tbW9uUmVjdXJzZWRUeXBlOw0KKyAgICANCisgICAgaWYgKG5hbWUuTGVuKCkgPCBwb3MgKyBrU29tZUNsdWRlQWZ0ZXJSZWN1cnNlZFBvc3RTdHJpbmdNaW5TaXplKQ0KKyAgICB7DQorICAgICAgZXJyb3JNZXNzYWdlID0gIlRvbyBzaG9ydCBzd2l0Y2giOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIA0KKyAgICBVU3RyaW5nIHRhaWwgPSBuYW1lLlB0cihwb3MgKyAxKTsNCisgICAgDQorICAgIGlmIChuYW1lW3Bvc10gPT0ga0ltbWVkaWF0ZU5hbWVJRCkNCisgICAgICBBZGROYW1lVG9DZW5zb3IoY2Vuc29yLCB0YWlsLCBpbmNsdWRlLCByZWN1cnNlZFR5cGUsIHdpbGRjYXJkTWF0Y2hpbmcpOw0KKyAgICBlbHNlIGlmIChuYW1lW3Bvc10gPT0ga0ZpbGVMaXN0SUQpDQorICAgICAgQWRkVG9DZW5zb3JGcm9tTGlzdEZpbGUoTlVMTCwgY2Vuc29yLCB0YWlsLCBpbmNsdWRlLCByZWN1cnNlZFR5cGUsIHdpbGRjYXJkTWF0Y2hpbmcsIGNvZGVQYWdlKTsNCisgICAgI2lmZGVmIF9XSU4zMg0KKyAgICBlbHNlIGlmIChuYW1lW3Bvc10gPT0ga01hcE5hbWVJRCkNCisgICAgew0KKyAgICAgIGVycm9yTWVzc2FnZSA9IFBhcnNlTWFwV2l0aFBhdGhzKGNlbnNvciwgdGFpbCwgaW5jbHVkZSwgcmVjdXJzZWRUeXBlLCB3aWxkY2FyZE1hdGNoaW5nKTsNCisgICAgICBpZiAoZXJyb3JNZXNzYWdlKQ0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgI2VuZGlmDQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGVycm9yTWVzc2FnZSA9ICJJbmNvcnJlY3Qgd2lsZGNhcmMgdHlwZSBtYXJrZXIiOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoaSAhPSBzdHJpbmdzLlNpemUoKSkNCisgICAgdGhyb3cgQ0FyY0NtZExpbmVFeGNlcHRpb24oZXJyb3JNZXNzYWdlLCBzdHJpbmdzW2ldKTsNCit9DQorDQorI2lmZGVmIF9XSU4zMg0KKw0KKy8vIFRoaXMgY29kZSBjb252ZXJ0cyBhbGwgc2hvcnQgZmlsZSBuYW1lcyB0byBsb25nIGZpbGUgbmFtZXMuDQorDQorc3RhdGljIHZvaWQgQ29udmVydFRvTG9uZ05hbWUoY29uc3QgVVN0cmluZyAmcHJlZml4LCBVU3RyaW5nICZuYW1lKQ0KK3sNCisgIGlmIChuYW1lLklzRW1wdHkoKSB8fCBEb2VzTmFtZUNvbnRhaW5XaWxkY2FyZChuYW1lKSkNCisgICAgcmV0dXJuOw0KKyAgTkZpbmQ6OkNGaWxlSW5mbyBmaTsNCisgIGNvbnN0IEZTdHJpbmcgcGF0aCA9IHVzMmZzKHByZWZpeCArIG5hbWUpOw0KKyAgaWYgKE5GaWxlOjpOTmFtZTo6SXNEZXZpY2VQYXRoKHBhdGgpKQ0KKyAgICByZXR1cm47DQorICBpZiAoZmkuRmluZChwYXRoKSkNCisgICAgbmFtZSA9IGZzMnVzKGZpLk5hbWUpOw0KK30NCisNCitzdGF0aWMgdm9pZCBDb252ZXJ0VG9Mb25nTmFtZXMoY29uc3QgVVN0cmluZyAmcHJlZml4LCBDT2JqZWN0VmVjdG9yPE5XaWxkY2FyZDo6Q0l0ZW0+ICZpdGVtcykNCit7DQorICBGT1JfVkVDVE9SIChpLCBpdGVtcykNCisgIHsNCisgICAgTldpbGRjYXJkOjpDSXRlbSAmaXRlbSA9IGl0ZW1zW2ldOw0KKyAgICBpZiAoaXRlbS5SZWN1cnNpdmUgfHwgaXRlbS5QYXRoUGFydHMuU2l6ZSgpICE9IDEpDQorICAgICAgY29udGludWU7DQorICAgIGlmIChwcmVmaXguSXNFbXB0eSgpICYmIGl0ZW0uSXNEcml2ZUl0ZW0oKSkNCisgICAgICBjb250aW51ZTsNCisgICAgQ29udmVydFRvTG9uZ05hbWUocHJlZml4LCBpdGVtLlBhdGhQYXJ0cy5Gcm9udCgpKTsNCisgIH0NCit9DQorDQorc3RhdGljIHZvaWQgQ29udmVydFRvTG9uZ05hbWVzKGNvbnN0IFVTdHJpbmcgJnByZWZpeCwgTldpbGRjYXJkOjpDQ2Vuc29yTm9kZSAmbm9kZSkNCit7DQorICBDb252ZXJ0VG9Mb25nTmFtZXMocHJlZml4LCBub2RlLkluY2x1ZGVJdGVtcyk7DQorICBDb252ZXJ0VG9Mb25nTmFtZXMocHJlZml4LCBub2RlLkV4Y2x1ZGVJdGVtcyk7DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IG5vZGUuU3ViTm9kZXMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIFVTdHJpbmcgJm5hbWUgPSBub2RlLlN1Yk5vZGVzW2ldLk5hbWU7DQorICAgIGlmIChwcmVmaXguSXNFbXB0eSgpICYmIE5XaWxkY2FyZDo6SXNEcml2ZUNvbG9uTmFtZShuYW1lKSkNCisgICAgICBjb250aW51ZTsNCisgICAgQ29udmVydFRvTG9uZ05hbWUocHJlZml4LCBuYW1lKTsNCisgIH0NCisgIC8vIG1peCBmb2xkZXJzIHdpdGggc2FtZSBuYW1lDQorICBmb3IgKGkgPSAwOyBpIDwgbm9kZS5TdWJOb2Rlcy5TaXplKCk7IGkrKykNCisgIHsNCisgICAgTldpbGRjYXJkOjpDQ2Vuc29yTm9kZSAmbmV4dE5vZGUxID0gbm9kZS5TdWJOb2Rlc1tpXTsNCisgICAgZm9yICh1bnNpZ25lZCBqID0gaSArIDE7IGogPCBub2RlLlN1Yk5vZGVzLlNpemUoKTspDQorICAgIHsNCisgICAgICBjb25zdCBOV2lsZGNhcmQ6OkNDZW5zb3JOb2RlICZuZXh0Tm9kZTIgPSBub2RlLlN1Yk5vZGVzW2pdOw0KKyAgICAgIGlmIChuZXh0Tm9kZTEuTmFtZS5Jc0VxdWFsVG9Ob0Nhc2UobmV4dE5vZGUyLk5hbWUpKQ0KKyAgICAgIHsNCisgICAgICAgIG5leHROb2RlMS5JbmNsdWRlSXRlbXMgKz0gbmV4dE5vZGUyLkluY2x1ZGVJdGVtczsNCisgICAgICAgIG5leHROb2RlMS5FeGNsdWRlSXRlbXMgKz0gbmV4dE5vZGUyLkV4Y2x1ZGVJdGVtczsNCisgICAgICAgIG5vZGUuU3ViTm9kZXMuRGVsZXRlKGopOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgICBqKys7DQorICAgIH0NCisgIH0NCisgIGZvciAoaSA9IDA7IGkgPCBub2RlLlN1Yk5vZGVzLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICBOV2lsZGNhcmQ6OkNDZW5zb3JOb2RlICZuZXh0Tm9kZSA9IG5vZGUuU3ViTm9kZXNbaV07DQorICAgIENvbnZlcnRUb0xvbmdOYW1lcyhwcmVmaXggKyBuZXh0Tm9kZS5OYW1lICsgV0NIQVJfUEFUSF9TRVBBUkFUT1IsIG5leHROb2RlKTsNCisgIH0NCit9DQorDQordm9pZCBDb252ZXJ0VG9Mb25nTmFtZXMoTldpbGRjYXJkOjpDQ2Vuc29yICZjZW5zb3IpDQorew0KKyAgRk9SX1ZFQ1RPUiAoaSwgY2Vuc29yLlBhaXJzKQ0KKyAgew0KKyAgICBOV2lsZGNhcmQ6OkNQYWlyICZwYWlyID0gY2Vuc29yLlBhaXJzW2ldOw0KKyAgICBDb252ZXJ0VG9Mb25nTmFtZXMocGFpci5QcmVmaXgsIHBhaXIuSGVhZCk7DQorICB9DQorfQ0KKw0KKyNlbmRpZg0KKw0KKy8qDQorc3RhdGljIE5VcGRhdGVBcmNoaXZlOjpOUGFpckFjdGlvbjo6RUVudW0gR2V0VXBkYXRlUGFpckFjdGlvblR5cGUoaW50IGkpDQorew0KKyAgc3dpdGNoIChpKQ0KKyAgew0KKyAgICBjYXNlIE5VcGRhdGVBcmNoaXZlOjpOUGFpckFjdGlvbjo6a0lnbm9yZTogcmV0dXJuIE5VcGRhdGVBcmNoaXZlOjpOUGFpckFjdGlvbjo6a0lnbm9yZTsNCisgICAgY2FzZSBOVXBkYXRlQXJjaGl2ZTo6TlBhaXJBY3Rpb246OmtDb3B5OiByZXR1cm4gTlVwZGF0ZUFyY2hpdmU6Ok5QYWlyQWN0aW9uOjprQ29weTsNCisgICAgY2FzZSBOVXBkYXRlQXJjaGl2ZTo6TlBhaXJBY3Rpb246OmtDb21wcmVzczogcmV0dXJuIE5VcGRhdGVBcmNoaXZlOjpOUGFpckFjdGlvbjo6a0NvbXByZXNzOw0KKyAgICBjYXNlIE5VcGRhdGVBcmNoaXZlOjpOUGFpckFjdGlvbjo6a0NvbXByZXNzQXNBbnRpOiByZXR1cm4gTlVwZGF0ZUFyY2hpdmU6Ok5QYWlyQWN0aW9uOjprQ29tcHJlc3NBc0FudGk7DQorICB9DQorICB0aHJvdyA5ODExMTYwMzsNCit9DQorKi8NCisNCitzdGF0aWMgY29uc3Qgd2NoYXJfdCAqa1VwZGF0ZVBhaXJTdGF0ZUlEU2V0ID0gTCJwcXJ4eXp3IjsNCitzdGF0aWMgY29uc3QgaW50IGtVcGRhdGVQYWlyU3RhdGVOb3RTdXBwb3J0ZWRBY3Rpb25zW10gPSB7MiwgMiwgMSwgLTEsIC0xLCAtMSwgLTF9Ow0KKw0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrTnVtVXBkYXRlUGFpckFjdGlvbnMgPSA0Ow0KK3N0YXRpYyBjb25zdCBjaGFyICprVXBkYXRlSWdub3JlSXRzZWxmUG9zdFN0cmluZ0lEID0gIi0iOw0KK3N0YXRpYyBjb25zdCB3Y2hhcl90IGtVcGRhdGVOZXdBcmNoaXZlUG9zdENoYXJJRCA9ICchJzsNCisNCisNCitzdGF0aWMgYm9vbCBQYXJzZVVwZGF0ZUNvbW1hbmRTdHJpbmcyKGNvbnN0IFVTdHJpbmcgJmNvbW1hbmQsDQorICAgIE5VcGRhdGVBcmNoaXZlOjpDQWN0aW9uU2V0ICZhY3Rpb25TZXQsIFVTdHJpbmcgJnBvc3RTdHJpbmcpDQorew0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNvbW1hbmQuTGVuKCk7KQ0KKyAgew0KKyAgICB3Y2hhcl90IGMgPSBNeUNoYXJMb3dlcl9Bc2NpaShjb21tYW5kW2ldKTsNCisgICAgaW50IHN0YXRlUG9zID0gRmluZENoYXJQb3NJblN0cmluZyhrVXBkYXRlUGFpclN0YXRlSURTZXQsIGMpOw0KKyAgICBpZiAoc3RhdGVQb3MgPCAwKQ0KKyAgICB7DQorICAgICAgcG9zdFN0cmluZyA9IGNvbW1hbmQuUHRyKGkpOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICAgIGkrKzsNCisgICAgaWYgKGkgPj0gY29tbWFuZC5MZW4oKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIGMgPSBjb21tYW5kW2ldOw0KKyAgICBpZiAoYyA8ICcwJyB8fCBjID49ICcwJyArIGtOdW1VcGRhdGVQYWlyQWN0aW9ucykNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIGludCBhY3Rpb25Qb3MgPSBjIC0gJzAnOw0KKyAgICBhY3Rpb25TZXQuU3RhdGVBY3Rpb25zW3N0YXRlUG9zXSA9IChOVXBkYXRlQXJjaGl2ZTo6TlBhaXJBY3Rpb246OkVFbnVtKShhY3Rpb25Qb3MpOw0KKyAgICBpZiAoa1VwZGF0ZVBhaXJTdGF0ZU5vdFN1cHBvcnRlZEFjdGlvbnNbc3RhdGVQb3NdID09IGFjdGlvblBvcykNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIGkrKzsNCisgIH0NCisgIHBvc3RTdHJpbmcuRW1wdHkoKTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitzdGF0aWMgdm9pZCBQYXJzZVVwZGF0ZUNvbW1hbmRTdHJpbmcoQ1VwZGF0ZU9wdGlvbnMgJm9wdGlvbnMsDQorICAgIGNvbnN0IFVTdHJpbmdWZWN0b3IgJnVwZGF0ZVBvc3RTdHJpbmdzLA0KKyAgICBjb25zdCBOVXBkYXRlQXJjaGl2ZTo6Q0FjdGlvblNldCAmZGVmYXVsdEFjdGlvblNldCkNCit7DQorICBjb25zdCBjaGFyICplcnJvck1lc3NhZ2UgPSAiaW5jb3JyZWN0IHVwZGF0ZSBzd2l0Y2ggY29tbWFuZCI7DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHVwZGF0ZVBvc3RTdHJpbmdzLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCBVU3RyaW5nICZ1cGRhdGVTdHJpbmcgPSB1cGRhdGVQb3N0U3RyaW5nc1tpXTsNCisgICAgaWYgKHVwZGF0ZVN0cmluZy5Jc0VxdWFsVG8oa1VwZGF0ZUlnbm9yZUl0c2VsZlBvc3RTdHJpbmdJRCkpDQorICAgIHsNCisgICAgICBpZiAob3B0aW9ucy5VcGRhdGVBcmNoaXZlSXRzZWxmKQ0KKyAgICAgIHsNCisgICAgICAgIG9wdGlvbnMuVXBkYXRlQXJjaGl2ZUl0c2VsZiA9IGZhbHNlOw0KKyAgICAgICAgb3B0aW9ucy5Db21tYW5kcy5EZWxldGUoMCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIE5VcGRhdGVBcmNoaXZlOjpDQWN0aW9uU2V0IGFjdGlvblNldCA9IGRlZmF1bHRBY3Rpb25TZXQ7DQorDQorICAgICAgVVN0cmluZyBwb3N0U3RyaW5nOw0KKyAgICAgIGlmICghUGFyc2VVcGRhdGVDb21tYW5kU3RyaW5nMih1cGRhdGVTdHJpbmcsIGFjdGlvblNldCwgcG9zdFN0cmluZykpDQorICAgICAgICBicmVhazsNCisgICAgICBpZiAocG9zdFN0cmluZy5Jc0VtcHR5KCkpDQorICAgICAgew0KKyAgICAgICAgaWYgKG9wdGlvbnMuVXBkYXRlQXJjaGl2ZUl0c2VsZikNCisgICAgICAgICAgb3B0aW9ucy5Db21tYW5kc1swXS5BY3Rpb25TZXQgPSBhY3Rpb25TZXQ7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBpZiAocG9zdFN0cmluZ1swXSAhPSBrVXBkYXRlTmV3QXJjaGl2ZVBvc3RDaGFySUQpDQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgQ1VwZGF0ZUFyY2hpdmVDb21tYW5kIHVjOw0KKyAgICAgICAgVVN0cmluZyBhcmNoaXZlUGF0aCA9IHBvc3RTdHJpbmcuUHRyKDEpOw0KKyAgICAgICAgaWYgKGFyY2hpdmVQYXRoLklzRW1wdHkoKSkNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB1Yy5Vc2VyQXJjaGl2ZVBhdGggPSBhcmNoaXZlUGF0aDsNCisgICAgICAgIHVjLkFjdGlvblNldCA9IGFjdGlvblNldDsNCisgICAgICAgIG9wdGlvbnMuQ29tbWFuZHMuQWRkKHVjKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChpICE9IHVwZGF0ZVBvc3RTdHJpbmdzLlNpemUoKSkNCisgICAgdGhyb3cgQ0FyY0NtZExpbmVFeGNlcHRpb24oZXJyb3JNZXNzYWdlLCB1cGRhdGVQb3N0U3RyaW5nc1tpXSk7DQorfQ0KKw0KK2Jvb2wgUGFyc2VDb21wbGV4U2l6ZShjb25zdCB3Y2hhcl90ICpzLCBVSW50NjQgJnJlc3VsdCk7DQorDQorc3RhdGljIHZvaWQgU2V0QWRkQ29tbWFuZE9wdGlvbnMoDQorICAgIE5Db21tYW5kVHlwZTo6RUVudW0gY29tbWFuZFR5cGUsDQorICAgIGNvbnN0IENQYXJzZXIgJnBhcnNlciwNCisgICAgQ1VwZGF0ZU9wdGlvbnMgJm9wdGlvbnMpDQorew0KKyAgTlVwZGF0ZUFyY2hpdmU6OkNBY3Rpb25TZXQgZGVmYXVsdEFjdGlvblNldDsNCisgIHN3aXRjaCAoY29tbWFuZFR5cGUpDQorICB7DQorICAgIGNhc2UgTkNvbW1hbmRUeXBlOjprQWRkOg0KKyAgICAgIGRlZmF1bHRBY3Rpb25TZXQgPSBOVXBkYXRlQXJjaGl2ZTo6a19BY3Rpb25TZXRfQWRkOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIE5Db21tYW5kVHlwZTo6a0RlbGV0ZToNCisgICAgICBkZWZhdWx0QWN0aW9uU2V0ID0gTlVwZGF0ZUFyY2hpdmU6OmtfQWN0aW9uU2V0X0RlbGV0ZTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBkZWZhdWx0QWN0aW9uU2V0ID0gTlVwZGF0ZUFyY2hpdmU6OmtfQWN0aW9uU2V0X1VwZGF0ZTsNCisgIH0NCisgIA0KKyAgb3B0aW9ucy5VcGRhdGVBcmNoaXZlSXRzZWxmID0gdHJ1ZTsNCisgIA0KKyAgb3B0aW9ucy5Db21tYW5kcy5DbGVhcigpOw0KKyAgQ1VwZGF0ZUFyY2hpdmVDb21tYW5kIHVwZGF0ZU1haW5Db21tYW5kOw0KKyAgdXBkYXRlTWFpbkNvbW1hbmQuQWN0aW9uU2V0ID0gZGVmYXVsdEFjdGlvblNldDsNCisgIG9wdGlvbnMuQ29tbWFuZHMuQWRkKHVwZGF0ZU1haW5Db21tYW5kKTsNCisgIGlmIChwYXJzZXJbTktleTo6a1VwZGF0ZV0uVGhlcmVJcykNCisgICAgUGFyc2VVcGRhdGVDb21tYW5kU3RyaW5nKG9wdGlvbnMsIHBhcnNlcltOS2V5OjprVXBkYXRlXS5Qb3N0U3RyaW5ncywNCisgICAgICAgIGRlZmF1bHRBY3Rpb25TZXQpOw0KKyAgaWYgKHBhcnNlcltOS2V5OjprV29ya2luZ0Rpcl0uVGhlcmVJcykNCisgIHsNCisgICAgY29uc3QgVVN0cmluZyAmcG9zdFN0cmluZyA9IHBhcnNlcltOS2V5OjprV29ya2luZ0Rpcl0uUG9zdFN0cmluZ3NbMF07DQorICAgIGlmIChwb3N0U3RyaW5nLklzRW1wdHkoKSkNCisgICAgICBORGlyOjpNeUdldFRlbXBQYXRoKG9wdGlvbnMuV29ya2luZ0Rpcik7DQorICAgIGVsc2UNCisgICAgICBvcHRpb25zLldvcmtpbmdEaXIgPSB1czJmcyhwb3N0U3RyaW5nKTsNCisgIH0NCisgIG9wdGlvbnMuU2Z4TW9kZSA9IHBhcnNlcltOS2V5OjprU2Z4XS5UaGVyZUlzOw0KKyAgaWYgKG9wdGlvbnMuU2Z4TW9kZSkNCisgICAgb3B0aW9ucy5TZnhNb2R1bGUgPSB1czJmcyhwYXJzZXJbTktleTo6a1NmeF0uUG9zdFN0cmluZ3NbMF0pOw0KKw0KKyAgaWYgKHBhcnNlcltOS2V5OjprVm9sdW1lXS5UaGVyZUlzKQ0KKyAgew0KKyAgICBjb25zdCBVU3RyaW5nVmVjdG9yICZzdiA9IHBhcnNlcltOS2V5OjprVm9sdW1lXS5Qb3N0U3RyaW5nczsNCisgICAgRk9SX1ZFQ1RPUiAoaSwgc3YpDQorICAgIHsNCisgICAgICBVSW50NjQgc2l6ZTsNCisgICAgICBpZiAoIVBhcnNlQ29tcGxleFNpemUoc3ZbaV0sIHNpemUpIHx8IHNpemUgPT0gMCkNCisgICAgICAgIHRocm93IENBcmNDbWRMaW5lRXhjZXB0aW9uKCJJbmNvcnJlY3Qgdm9sdW1lIHNpemU6Iiwgc3ZbaV0pOw0KKyAgICAgIG9wdGlvbnMuVm9sdW1lc1NpemVzLkFkZChzaXplKTsNCisgICAgfQ0KKyAgfQ0KK30NCisNCitzdGF0aWMgdm9pZCBTZXRNZXRob2RPcHRpb25zKGNvbnN0IENQYXJzZXIgJnBhcnNlciwgQ09iamVjdFZlY3RvcjxDUHJvcGVydHk+ICZwcm9wZXJ0aWVzKQ0KK3sNCisgIGlmIChwYXJzZXJbTktleTo6a1Byb3BlcnR5XS5UaGVyZUlzKQ0KKyAgew0KKyAgICBGT1JfVkVDVE9SIChpLCBwYXJzZXJbTktleTo6a1Byb3BlcnR5XS5Qb3N0U3RyaW5ncykNCisgICAgew0KKyAgICAgIENQcm9wZXJ0eSBwcm9wOw0KKyAgICAgIHByb3AuTmFtZSA9IHBhcnNlcltOS2V5OjprUHJvcGVydHldLlBvc3RTdHJpbmdzW2ldOw0KKyAgICAgIGludCBpbmRleCA9IHByb3AuTmFtZS5GaW5kKEwnPScpOw0KKyAgICAgIGlmIChpbmRleCA+PSAwKQ0KKyAgICAgIHsNCisgICAgICAgIHByb3AuVmFsdWUgPSBwcm9wLk5hbWUuUHRyKGluZGV4ICsgMSk7DQorICAgICAgICBwcm9wLk5hbWUuRGVsZXRlRnJvbShpbmRleCk7DQorICAgICAgfQ0KKyAgICAgIHByb3BlcnRpZXMuQWRkKHByb3ApOw0KKyAgICB9DQorICB9DQorfQ0KKw0KK0NBcmNDbWRMaW5lUGFyc2VyOjpDQXJjQ21kTGluZVBhcnNlcigpOiBwYXJzZXIoQVJSQVlfU0laRShrU3dpdGNoRm9ybXMpKSB7fQ0KKw0KK3ZvaWQgQ0FyY0NtZExpbmVQYXJzZXI6OlBhcnNlMShjb25zdCBVU3RyaW5nVmVjdG9yICZjb21tYW5kU3RyaW5ncywNCisgICAgQ0FyY0NtZExpbmVPcHRpb25zICZvcHRpb25zKQ0KK3sNCisgIGlmICghcGFyc2VyLlBhcnNlU3RyaW5ncyhrU3dpdGNoRm9ybXMsIGNvbW1hbmRTdHJpbmdzKSkNCisgICAgdGhyb3cgQ0FyY0NtZExpbmVFeGNlcHRpb24ocGFyc2VyLkVycm9yTWVzc2FnZSwgcGFyc2VyLkVycm9yTGluZSk7DQorDQorICBvcHRpb25zLklzSW5UZXJtaW5hbCA9IE1ZX0lTX1RFUk1JTkFMKHN0ZGluKTsNCisgIG9wdGlvbnMuSXNTdGRPdXRUZXJtaW5hbCA9IE1ZX0lTX1RFUk1JTkFMKHN0ZG91dCk7DQorICBvcHRpb25zLklzU3RkRXJyVGVybWluYWwgPSBNWV9JU19URVJNSU5BTChzdGRlcnIpOw0KKyAgb3B0aW9ucy5TdGRJbk1vZGUgPSBwYXJzZXJbTktleTo6a1N0ZEluXS5UaGVyZUlzOw0KKyAgb3B0aW9ucy5TdGRPdXRNb2RlID0gcGFyc2VyW05LZXk6OmtTdGRPdXRdLlRoZXJlSXM7DQorICBvcHRpb25zLkVuYWJsZUhlYWRlcnMgPSAhcGFyc2VyW05LZXk6OmtEaXNhYmxlSGVhZGVyc10uVGhlcmVJczsNCisgIG9wdGlvbnMuSGVscE1vZGUgPSBwYXJzZXJbTktleTo6a0hlbHAxXS5UaGVyZUlzIHx8IHBhcnNlcltOS2V5OjprSGVscDJdLlRoZXJlSXMgIHx8IHBhcnNlcltOS2V5OjprSGVscDNdLlRoZXJlSXM7DQorDQorICBpZiAocGFyc2VyW05LZXk6OmtDYXNlU2Vuc2l0aXZlXS5UaGVyZUlzKQ0KKyAgew0KKyAgICBnX0Nhc2VTZW5zaXRpdmUgPSAhcGFyc2VyW05LZXk6OmtDYXNlU2Vuc2l0aXZlXS5XaXRoTWludXM7DQorICAgIG9wdGlvbnMuQ2FzZVNlbnNpdGl2ZUNoYW5nZSA9IHRydWU7DQorICAgIG9wdGlvbnMuQ2FzZVNlbnNpdGl2ZSA9IGdfQ2FzZVNlbnNpdGl2ZTsNCisgIH0NCisNCisgICNpZmRlZiBfV0lOMzINCisgIG9wdGlvbnMuTGFyZ2VQYWdlcyA9IGZhbHNlOw0KKyAgaWYgKHBhcnNlcltOS2V5OjprTGFyZ2VQYWdlc10uVGhlcmVJcykNCisgIHsNCisgICAgb3B0aW9ucy5MYXJnZVBhZ2VzID0gIXBhcnNlcltOS2V5OjprTGFyZ2VQYWdlc10uV2l0aE1pbnVzOw0KKyAgfQ0KKyAgI2VuZGlmDQorfQ0KKw0KK3N0cnVjdCBDQ29kZVBhZ2VQYWlyDQorew0KKyAgY29uc3QgY2hhciAqTmFtZTsNCisgIEludDMyIENvZGVQYWdlOw0KK307DQorDQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtOdW1CeXRlT25seUNvZGVQYWdlcyA9IDM7DQorDQorc3RhdGljIENDb2RlUGFnZVBhaXIgZ19Db2RlUGFnZVBhaXJzW10gPQ0KK3sNCisgIHsgInV0Zi04IiwgQ1BfVVRGOCB9LA0KKyAgeyAid2luIiwgQ1BfQUNQIH0sDQorICB7ICJkb3MiLCBDUF9PRU1DUCB9LA0KKyAgeyAidXRmLTE2bGUiLCBNWV9fQ1BfVVRGMTYgfSwNCisgIHsgInV0Zi0xNmJlIiwgTVlfX0NQX1VURjE2QkUgfQ0KK307DQorDQorc3RhdGljIEludDMyIEZpbmRDaGFyc2V0KGNvbnN0IE5Db21tYW5kTGluZVBhcnNlcjo6Q1BhcnNlciAmcGFyc2VyLCBpbnQga2V5SW5kZXgsDQorICAgIGJvb2wgYnl0ZU9ubHlDb2RlUGFnZXMsIEludDMyIGRlZmF1bHRWYWwpDQorew0KKyAgaWYgKCFwYXJzZXJba2V5SW5kZXhdLlRoZXJlSXMpDQorICAgIHJldHVybiBkZWZhdWx0VmFsOw0KKw0KKyAgVVN0cmluZyBuYW1lID0gcGFyc2VyW2tleUluZGV4XS5Qb3N0U3RyaW5ncy5CYWNrKCk7DQorICBVSW50MzIgdjsNCisgIGlmIChTdHJpbmdUb1VJbnQzMihuYW1lLCB2KSkNCisgICAgaWYgKHYgPCAoKFVJbnQzMikxIDw8IDE2KSkNCisgICAgICByZXR1cm4gKEludDMyKXY7DQorICBuYW1lLk1ha2VMb3dlcl9Bc2NpaSgpOw0KKyAgdW5zaWduZWQgbnVtID0gYnl0ZU9ubHlDb2RlUGFnZXMgPyBrTnVtQnl0ZU9ubHlDb2RlUGFnZXMgOiBBUlJBWV9TSVpFKGdfQ29kZVBhZ2VQYWlycyk7DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOzsgaSsrKQ0KKyAgew0KKyAgICBpZiAoaSA9PSBudW0pIC8vIHRvIGRpc2FibGUgd2FybmluZ3MgZnJvbSBkaWZmZXJlbnQgY29tcGlsZXJzDQorICAgICAgdGhyb3cgQ0FyY0NtZExpbmVFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGNoYXJzZXQ6IiwgbmFtZSk7DQorICAgIGNvbnN0IENDb2RlUGFnZVBhaXIgJnBhaXIgPSBnX0NvZGVQYWdlUGFpcnNbaV07DQorICAgIGlmIChuYW1lLklzRXF1YWxUbyhwYWlyLk5hbWUpKQ0KKyAgICAgIHJldHVybiBwYWlyLkNvZGVQYWdlOw0KKyAgfQ0KK30NCisNCit2b2lkIEVudW1lcmF0ZURpckl0ZW1zQW5kU29ydCgNCisgICAgYm9vbCBzdG9yZUFsdFN0cmVhbXMsDQorICAgIE5XaWxkY2FyZDo6Q0NlbnNvciAmY2Vuc29yLA0KKyAgICBOV2lsZGNhcmQ6OkVDZW5zb3JQYXRoTW9kZSBjZW5zb3JQYXRoTW9kZSwNCisgICAgY29uc3QgVVN0cmluZyAmYWRkUGF0aFByZWZpeCwNCisgICAgVVN0cmluZ1ZlY3RvciAmc29ydGVkUGF0aHMsDQorICAgIFVTdHJpbmdWZWN0b3IgJnNvcnRlZEZ1bGxQYXRocykNCit7DQorICBVU3RyaW5nVmVjdG9yIHBhdGhzOw0KKyAgew0KKyAgICBDRGlySXRlbXMgZGlySXRlbXM7DQorICAgIHsNCisgICAgICBkaXJJdGVtcy5TY2FuQWx0U3RyZWFtcyA9IHN0b3JlQWx0U3RyZWFtczsNCisgICAgICBIUkVTVUxUIHJlcyA9IEVudW1lcmF0ZUl0ZW1zKGNlbnNvciwgY2Vuc29yUGF0aE1vZGUsIGFkZFBhdGhQcmVmaXgsIGRpckl0ZW1zLCBOVUxMKTsNCisgICAgICBpZiAocmVzICE9IFNfT0sgfHwgZGlySXRlbXMuRXJyb3JQYXRocy5TaXplKCkgPiAwKQ0KKyAgICAgIHsNCisgICAgICAgIFVTdHJpbmcgZXJyb3JQYXRoOw0KKyAgICAgICAgaWYgKGRpckl0ZW1zLkVycm9yUGF0aHMuU2l6ZSgpID4gMCkNCisgICAgICAgICAgZXJyb3JQYXRoID0gZnMydXMoZGlySXRlbXMuRXJyb3JQYXRoc1swXSk7DQorICAgICAgICB0aHJvdyBDQXJjQ21kTGluZUV4Y2VwdGlvbihrQ2Fubm90RmluZEFyY2hpdmUsDQorICAgICAgICAgICAgZGlySXRlbXMuRXJyb3JQYXRocy5TaXplKCkgPiAwID8gKGNvbnN0IHdjaGFyX3QgKillcnJvclBhdGggOiBOVUxMKTsNCisgICAgICB9DQorICAgIH0NCisgICAgRk9SX1ZFQ1RPUiAoaSwgZGlySXRlbXMuSXRlbXMpDQorICAgIHsNCisgICAgICBjb25zdCBDRGlySXRlbSAmZGlySXRlbSA9IGRpckl0ZW1zLkl0ZW1zW2ldOw0KKyAgICAgIGlmICghZGlySXRlbS5Jc0RpcigpKQ0KKyAgICAgICAgcGF0aHMuQWRkKGRpckl0ZW1zLkdldFBoeVBhdGgoaSkpOw0KKyAgICB9DQorICB9DQorICANCisgIGlmIChwYXRocy5TaXplKCkgPT0gMCkNCisgICAgdGhyb3cgQ0FyY0NtZExpbmVFeGNlcHRpb24oa0Nhbm5vdEZpbmRBcmNoaXZlKTsNCisgIA0KKyAgVVN0cmluZ1ZlY3RvciBmdWxsUGF0aHM7DQorICANCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgcGF0aHMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIEZTdHJpbmcgZnVsbFBhdGg7DQorICAgIE5GaWxlOjpORGlyOjpNeUdldEZ1bGxQYXRoTmFtZSh1czJmcyhwYXRoc1tpXSksIGZ1bGxQYXRoKTsNCisgICAgZnVsbFBhdGhzLkFkZChmczJ1cyhmdWxsUGF0aCkpOw0KKyAgfQ0KKyAgQ1VJbnRWZWN0b3IgaW5kaWNlczsNCisgIFNvcnRGaWxlTmFtZXMoZnVsbFBhdGhzLCBpbmRpY2VzKTsNCisgIHNvcnRlZFBhdGhzLkNsZWFyQW5kUmVzZXJ2ZShpbmRpY2VzLlNpemUoKSk7DQorICBzb3J0ZWRGdWxsUGF0aHMuQ2xlYXJBbmRSZXNlcnZlKGluZGljZXMuU2l6ZSgpKTsNCisgIGZvciAoaSA9IDA7IGkgPCBpbmRpY2VzLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICB1bnNpZ25lZCBpbmRleCA9IGluZGljZXNbaV07DQorICAgIHNvcnRlZFBhdGhzLkFkZEluUmVzZXJ2ZWQocGF0aHNbaW5kZXhdKTsNCisgICAgc29ydGVkRnVsbFBhdGhzLkFkZEluUmVzZXJ2ZWQoZnVsbFBhdGhzW2luZGV4XSk7DQorICAgIGlmIChpID4gMCAmJiBDb21wYXJlRmlsZU5hbWVzKHNvcnRlZEZ1bGxQYXRoc1tpXSwgc29ydGVkRnVsbFBhdGhzW2kgLSAxXSkgPT0gMCkNCisgICAgICB0aHJvdyBDQXJjQ21kTGluZUV4Y2VwdGlvbigiRHVwbGljYXRlIGFyY2hpdmUgcGF0aDoiLCBzb3J0ZWRGdWxsUGF0aHNbaV0pOw0KKyAgfQ0KK30NCisNCitzdGF0aWMgdm9pZCBTZXRCb29sUGFpcihOQ29tbWFuZExpbmVQYXJzZXI6OkNQYXJzZXIgJnBhcnNlciwgdW5zaWduZWQgc3dpdGNoSUQsIENCb29sUGFpciAmYnApDQorew0KKyAgYnAuRGVmID0gcGFyc2VyW3N3aXRjaElEXS5UaGVyZUlzOw0KKyAgaWYgKGJwLkRlZikNCisgICAgYnAuVmFsID0gIXBhcnNlcltzd2l0Y2hJRF0uV2l0aE1pbnVzOw0KK30NCisNCit2b2lkIENBcmNDbWRMaW5lUGFyc2VyOjpQYXJzZTIoQ0FyY0NtZExpbmVPcHRpb25zICZvcHRpb25zKQ0KK3sNCisgIGNvbnN0IFVTdHJpbmdWZWN0b3IgJm5vblN3aXRjaFN0cmluZ3MgPSBwYXJzZXIuTm9uU3dpdGNoU3RyaW5nczsNCisgIGludCBudW1Ob25Td2l0Y2hTdHJpbmdzID0gbm9uU3dpdGNoU3RyaW5ncy5TaXplKCk7DQorICBpZiAobnVtTm9uU3dpdGNoU3RyaW5ncyA8IGtNaW5Ob25Td2l0Y2hXb3JkcykNCisgICAgdGhyb3cgQ0FyY0NtZExpbmVFeGNlcHRpb24oIlRoZSBjb21tYW5kIG11c3QgYmUgc3BjaWZpZWQiKTsNCisNCisgIGlmICghUGFyc2VBcmNoaXZlQ29tbWFuZChub25Td2l0Y2hTdHJpbmdzW2tDb21tYW5kSW5kZXhdLCBvcHRpb25zLkNvbW1hbmQpKQ0KKyAgICB0aHJvdyBDQXJjQ21kTGluZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgY29tbWFuZDoiLCBub25Td2l0Y2hTdHJpbmdzW2tDb21tYW5kSW5kZXhdKTsNCisNCisgIG9wdGlvbnMuVGVjaE1vZGUgPSBwYXJzZXJbTktleTo6a1RlY2hNb2RlXS5UaGVyZUlzOw0KKyAgaWYgKHBhcnNlcltOS2V5OjprSGFzaF0uVGhlcmVJcykNCisgICAgb3B0aW9ucy5IYXNoTWV0aG9kcyA9IHBhcnNlcltOS2V5OjprSGFzaF0uUG9zdFN0cmluZ3M7DQorICANCisgIGlmIChwYXJzZXJbTktleTo6a0VsaW1EdXBdLlRoZXJlSXMpDQorICB7DQorICAgIG9wdGlvbnMuRXh0cmFjdE9wdGlvbnMuRWxpbUR1cC5EZWYgPSB0cnVlOw0KKyAgICBvcHRpb25zLkV4dHJhY3RPcHRpb25zLkVsaW1EdXAuVmFsID0gIXBhcnNlcltOS2V5OjprRWxpbUR1cF0uV2l0aE1pbnVzOw0KKyAgfQ0KKyAgDQorICBOV2lsZGNhcmQ6OkVDZW5zb3JQYXRoTW9kZSBjZW5zb3JQYXRoTW9kZSA9IE5XaWxkY2FyZDo6a19SZWxhdFBhdGg7DQorICBib29sIGZ1bGxQYXRoTW9kZSA9IHBhcnNlcltOS2V5OjprRnVsbFBhdGhNb2RlXS5UaGVyZUlzOw0KKyAgaWYgKGZ1bGxQYXRoTW9kZSkNCisgIHsNCisgICAgY2Vuc29yUGF0aE1vZGUgPSBOV2lsZGNhcmQ6OmtfQWJzUGF0aDsNCisgICAgY29uc3QgVVN0cmluZyAmcyA9IHBhcnNlcltOS2V5OjprRnVsbFBhdGhNb2RlXS5Qb3N0U3RyaW5nc1swXTsNCisgICAgaWYgKCFzLklzRW1wdHkoKSkNCisgICAgew0KKyAgICAgIGlmIChzID09IEwiMiIpDQorICAgICAgICBjZW5zb3JQYXRoTW9kZSA9IE5XaWxkY2FyZDo6a19GdWxsUGF0aDsNCisgICAgICBlbHNlDQorICAgICAgICB0aHJvdyBDQXJjQ21kTGluZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgLXNwZjoiLCBzKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgTlJlY3Vyc2VkVHlwZTo6RUVudW0gcmVjdXJzZWRUeXBlOw0KKyAgaWYgKHBhcnNlcltOS2V5OjprUmVjdXJzZWRdLlRoZXJlSXMpDQorICAgIHJlY3Vyc2VkVHlwZSA9IEdldFJlY3Vyc2VkVHlwZUZyb21JbmRleChwYXJzZXJbTktleTo6a1JlY3Vyc2VkXS5Qb3N0Q2hhckluZGV4KTsNCisgIGVsc2UNCisgICAgcmVjdXJzZWRUeXBlID0gTlJlY3Vyc2VkVHlwZTo6a05vblJlY3Vyc2VkOw0KKw0KKyAgYm9vbCB3aWxkY2FyZE1hdGNoaW5nID0gdHJ1ZTsNCisgIGlmIChwYXJzZXJbTktleTo6a0Rpc2FibGVXaWxkY2FyZFBhcnNpbmddLlRoZXJlSXMpDQorICAgIHdpbGRjYXJkTWF0Y2hpbmcgPSBmYWxzZTsNCisNCisgIGdfQ29kZVBhZ2UgPSBGaW5kQ2hhcnNldChwYXJzZXIsIE5LZXk6OmtDb25zb2xlQ2hhclNldCwgdHJ1ZSwgLTEpOw0KKyAgSW50MzIgY29kZVBhZ2UgPSBGaW5kQ2hhcnNldChwYXJzZXIsIE5LZXk6OmtMaXN0ZmlsZUNoYXJTZXQsIGZhbHNlLCBDUF9VVEY4KTsNCisNCisgIGJvb2wgdGhlcmVBcmVTd2l0Y2hJbmNsdWRlcyA9IGZhbHNlOw0KKyAgDQorICBpZiAocGFyc2VyW05LZXk6OmtJbmNsdWRlXS5UaGVyZUlzKQ0KKyAgew0KKyAgICB0aGVyZUFyZVN3aXRjaEluY2x1ZGVzID0gdHJ1ZTsNCisgICAgQWRkU3dpdGNoV2lsZGNhcmRzVG9DZW5zb3Iob3B0aW9ucy5DZW5zb3IsDQorICAgICAgICBwYXJzZXJbTktleTo6a0luY2x1ZGVdLlBvc3RTdHJpbmdzLCB0cnVlLCByZWN1cnNlZFR5cGUsIHdpbGRjYXJkTWF0Y2hpbmcsIGNvZGVQYWdlKTsNCisgIH0NCisNCisgIGlmIChwYXJzZXJbTktleTo6a0V4Y2x1ZGVdLlRoZXJlSXMpDQorICAgIEFkZFN3aXRjaFdpbGRjYXJkc1RvQ2Vuc29yKG9wdGlvbnMuQ2Vuc29yLA0KKyAgICAgICAgcGFyc2VyW05LZXk6OmtFeGNsdWRlXS5Qb3N0U3RyaW5ncywgZmFsc2UsIHJlY3Vyc2VkVHlwZSwgd2lsZGNhcmRNYXRjaGluZywgY29kZVBhZ2UpOw0KKyANCisgIGludCBjdXJDb21tYW5kSW5kZXggPSBrQ29tbWFuZEluZGV4ICsgMTsNCisgIGJvb2wgdGhlcmVJc0FyY2hpdmVOYW1lID0gIXBhcnNlcltOS2V5OjprTm9Bck5hbWVdLlRoZXJlSXMgJiYNCisgICAgICBvcHRpb25zLkNvbW1hbmQuQ29tbWFuZFR5cGUgIT0gTkNvbW1hbmRUeXBlOjprQmVuY2htYXJrICYmDQorICAgICAgb3B0aW9ucy5Db21tYW5kLkNvbW1hbmRUeXBlICE9IE5Db21tYW5kVHlwZTo6a0luZm8gJiYNCisgICAgICBvcHRpb25zLkNvbW1hbmQuQ29tbWFuZFR5cGUgIT0gTkNvbW1hbmRUeXBlOjprSGFzaDsNCisNCisgIGJvb2wgaXNFeHRyYWN0R3JvdXBDb21tYW5kID0gb3B0aW9ucy5Db21tYW5kLklzRnJvbUV4dHJhY3RHcm91cCgpOw0KKyAgYm9vbCBpc0V4dHJhY3RPckxpc3QgPSBpc0V4dHJhY3RHcm91cENvbW1hbmQgfHwgb3B0aW9ucy5Db21tYW5kLkNvbW1hbmRUeXBlID09IE5Db21tYW5kVHlwZTo6a0xpc3Q7DQorICBib29sIGlzUmVuYW1lID0gb3B0aW9ucy5Db21tYW5kLkNvbW1hbmRUeXBlID09IE5Db21tYW5kVHlwZTo6a1JlbmFtZTsNCisNCisgIGlmICgoaXNFeHRyYWN0T3JMaXN0IHx8IGlzUmVuYW1lKSAmJiBvcHRpb25zLlN0ZEluTW9kZSkNCisgICAgdGhlcmVJc0FyY2hpdmVOYW1lID0gZmFsc2U7DQorDQorICBpZiAocGFyc2VyW05LZXk6OmtBcmNOYW1lTW9kZV0uVGhlcmVJcykNCisgICAgb3B0aW9ucy5VcGRhdGVPcHRpb25zLkFyY05hbWVNb2RlID0gUGFyc2VBcmNOYW1lTW9kZShwYXJzZXJbTktleTo6a0FyY05hbWVNb2RlXS5Qb3N0Q2hhckluZGV4KTsNCisNCisgIGlmICh0aGVyZUlzQXJjaGl2ZU5hbWUpDQorICB7DQorICAgIGlmIChjdXJDb21tYW5kSW5kZXggPj0gbnVtTm9uU3dpdGNoU3RyaW5ncykNCisgICAgICB0aHJvdyBDQXJjQ21kTGluZUV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgYXJjaGl2ZSBuYW1lIik7DQorICAgIG9wdGlvbnMuQXJjaGl2ZU5hbWUgPSBub25Td2l0Y2hTdHJpbmdzW2N1ckNvbW1hbmRJbmRleCsrXTsNCisgICAgaWYgKG9wdGlvbnMuQXJjaGl2ZU5hbWUuSXNFbXB0eSgpKQ0KKyAgICAgIHRocm93IENBcmNDbWRMaW5lRXhjZXB0aW9uKCJBcmNoaXZlIG5hbWUgY2Fubm90IGJ5IGVtcHR5Iik7DQorICB9DQorDQorICBBZGRUb0NlbnNvckZyb21Ob25Td2l0Y2hlc1N0cmluZ3MoaXNSZW5hbWUgPyAmb3B0aW9ucy5VcGRhdGVPcHRpb25zLlJlbmFtZVBhaXJzIDogTlVMTCwNCisgICAgICBjdXJDb21tYW5kSW5kZXgsIG9wdGlvbnMuQ2Vuc29yLA0KKyAgICAgIG5vblN3aXRjaFN0cmluZ3MsIHJlY3Vyc2VkVHlwZSwgd2lsZGNhcmRNYXRjaGluZywNCisgICAgICB0aGVyZUFyZVN3aXRjaEluY2x1ZGVzLCBjb2RlUGFnZSk7DQorDQorICBvcHRpb25zLlllc1RvQWxsID0gcGFyc2VyW05LZXk6OmtZZXNdLlRoZXJlSXM7DQorDQorDQorICAjaWZuZGVmIF9OT19DUllQVE8NCisgIG9wdGlvbnMuUGFzc3dvcmRFbmFibGVkID0gcGFyc2VyW05LZXk6OmtQYXNzd29yZF0uVGhlcmVJczsNCisgIGlmIChvcHRpb25zLlBhc3N3b3JkRW5hYmxlZCkNCisgICAgb3B0aW9ucy5QYXNzd29yZCA9IHBhcnNlcltOS2V5OjprUGFzc3dvcmRdLlBvc3RTdHJpbmdzWzBdOw0KKyAgI2VuZGlmDQorDQorICBvcHRpb25zLlNob3dEaWFsb2cgPSBwYXJzZXJbTktleTo6a1Nob3dEaWFsb2ddLlRoZXJlSXM7DQorDQorICBpZiAocGFyc2VyW05LZXk6OmtBcmNoaXZlVHlwZV0uVGhlcmVJcykNCisgICAgb3B0aW9ucy5BcmNUeXBlID0gcGFyc2VyW05LZXk6OmtBcmNoaXZlVHlwZV0uUG9zdFN0cmluZ3NbMF07DQorDQorICBvcHRpb25zLkV4Y2x1ZGVkQXJjVHlwZXMgPSBwYXJzZXJbTktleTo6a0V4Y2x1ZGVkQXJjVHlwZV0uUG9zdFN0cmluZ3M7DQorDQorICBTZXRNZXRob2RPcHRpb25zKHBhcnNlciwgb3B0aW9ucy5Qcm9wZXJ0aWVzKTsNCisNCisgIG9wdGlvbnMuRW5hYmxlUGVyY2VudHMgPSAhcGFyc2VyW05LZXk6OmtEaXNhYmxlUGVyY2VudHNdLlRoZXJlSXM7DQorICANCisgIGlmIChvcHRpb25zLkVuYWJsZVBlcmNlbnRzKQ0KKyAgew0KKyAgICBpZiAoKG9wdGlvbnMuU3RkT3V0TW9kZSAmJiAhb3B0aW9ucy5Jc1N0ZEVyclRlcm1pbmFsKSB8fA0KKyAgICAgICghb3B0aW9ucy5TdGRPdXRNb2RlICYmICFvcHRpb25zLklzU3RkT3V0VGVybWluYWwpKQ0KKyAgICAgIG9wdGlvbnMuRW5hYmxlUGVyY2VudHMgPSBmYWxzZTsNCisgIH0NCisNCisgIGlmIChwYXJzZXJbTktleTo6a050U2VjdXJpdHldLlRoZXJlSXMpIG9wdGlvbnMuTnRTZWN1cml0eS5TZXRUcnVlVHJ1ZSgpOw0KKw0KKyAgU2V0Qm9vbFBhaXIocGFyc2VyLCBOS2V5OjprQWx0U3RyZWFtcywgb3B0aW9ucy5BbHRTdHJlYW1zKTsNCisgIFNldEJvb2xQYWlyKHBhcnNlciwgTktleTo6a0hhcmRMaW5rcywgb3B0aW9ucy5IYXJkTGlua3MpOw0KKyAgU2V0Qm9vbFBhaXIocGFyc2VyLCBOS2V5OjprU3ltTGlua3MsIG9wdGlvbnMuU3ltTGlua3MpOw0KKw0KKyAgaWYgKGlzRXh0cmFjdE9yTGlzdCkNCisgIHsNCisgICAgQ0V4dHJhY3RPcHRpb25zQmFzZSAmZW8gPSBvcHRpb25zLkV4dHJhY3RPcHRpb25zOw0KKw0KKyAgICB7DQorICAgICAgQ0V4dHJhY3ROdE9wdGlvbnMgJm50ID0gZW8uTnRPcHRpb25zOw0KKyAgICAgIG50Lk50U2VjdXJpdHkgPSBvcHRpb25zLk50U2VjdXJpdHk7DQorDQorICAgICAgbnQuQWx0U3RyZWFtcyA9IG9wdGlvbnMuQWx0U3RyZWFtczsNCisgICAgICBpZiAoIW9wdGlvbnMuQWx0U3RyZWFtcy5EZWYpDQorICAgICAgICBudC5BbHRTdHJlYW1zLlZhbCA9IHRydWU7DQorDQorICAgICAgbnQuSGFyZExpbmtzID0gb3B0aW9ucy5IYXJkTGlua3M7DQorICAgICAgaWYgKCFvcHRpb25zLkhhcmRMaW5rcy5EZWYpDQorICAgICAgICBudC5IYXJkTGlua3MuVmFsID0gdHJ1ZTsNCisNCisgICAgICBudC5TeW1MaW5rcyA9IG9wdGlvbnMuU3ltTGlua3M7DQorICAgICAgaWYgKCFvcHRpb25zLlN5bUxpbmtzLkRlZikNCisgICAgICAgIG50LlN5bUxpbmtzLlZhbCA9IHRydWU7DQorDQorICAgICAgbnQuUmVwbGFjZUNvbG9uRm9yQWx0U3RyZWFtID0gcGFyc2VyW05LZXk6OmtSZXBsYWNlQ29sb25Gb3JBbHRTdHJlYW1dLlRoZXJlSXM7DQorICAgICAgbnQuV3JpdGVUb0FsdFN0cmVhbUlmQ29sb24gPSBwYXJzZXJbTktleTo6a1dyaXRlVG9BbHRTdHJlYW1JZkNvbG9uXS5UaGVyZUlzOw0KKyAgICB9DQorICAgICAgDQorICAgIG9wdGlvbnMuQ2Vuc29yLkFkZFBhdGhzVG9DZW5zb3IoTldpbGRjYXJkOjprX0Fic1BhdGgpOw0KKyAgICBvcHRpb25zLkNlbnNvci5FeHRlbmRFeGNsdWRlKCk7DQorDQorICAgIC8vIGFyZSB0aGVyZSBwYXRocyB0aGF0IGxvb2sgYXMgbm9uLXJlbGF0aXZlICghUHJlZml4LklzRW1wdHkoKSkNCisgICAgaWYgKCFvcHRpb25zLkNlbnNvci5BbGxBcmVSZWxhdGl2ZSgpKQ0KKyAgICAgIHRocm93IENBcmNDbWRMaW5lRXhjZXB0aW9uKCJDYW5ub3QgdXNlIGFic29sdXRlIHBhdGhuYW1lcyBmb3IgdGhpcyBjb21tYW5kIik7DQorDQorICAgIE5XaWxkY2FyZDo6Q0NlbnNvciBhcmNDZW5zb3I7DQorDQorICAgIGlmIChwYXJzZXJbTktleTo6a0FySW5jbHVkZV0uVGhlcmVJcykNCisgICAgICBBZGRTd2l0Y2hXaWxkY2FyZHNUb0NlbnNvcihhcmNDZW5zb3IsIHBhcnNlcltOS2V5OjprQXJJbmNsdWRlXS5Qb3N0U3RyaW5ncywgdHJ1ZSwgTlJlY3Vyc2VkVHlwZTo6a05vblJlY3Vyc2VkLCB3aWxkY2FyZE1hdGNoaW5nLCBjb2RlUGFnZSk7DQorICAgIGlmIChwYXJzZXJbTktleTo6a0FyRXhjbHVkZV0uVGhlcmVJcykNCisgICAgICBBZGRTd2l0Y2hXaWxkY2FyZHNUb0NlbnNvcihhcmNDZW5zb3IsIHBhcnNlcltOS2V5OjprQXJFeGNsdWRlXS5Qb3N0U3RyaW5ncywgZmFsc2UsIE5SZWN1cnNlZFR5cGU6OmtOb25SZWN1cnNlZCwgd2lsZGNhcmRNYXRjaGluZywgY29kZVBhZ2UpOw0KKw0KKyAgICBpZiAodGhlcmVJc0FyY2hpdmVOYW1lKQ0KKyAgICAgIEFkZE5hbWVUb0NlbnNvcihhcmNDZW5zb3IsIG9wdGlvbnMuQXJjaGl2ZU5hbWUsIHRydWUsIE5SZWN1cnNlZFR5cGU6OmtOb25SZWN1cnNlZCwgd2lsZGNhcmRNYXRjaGluZyk7DQorDQorICAgIGFyY0NlbnNvci5BZGRQYXRoc1RvQ2Vuc29yKE5XaWxkY2FyZDo6a19SZWxhdFBhdGgpOw0KKw0KKyAgICAjaWZkZWYgX1dJTjMyDQorICAgIENvbnZlcnRUb0xvbmdOYW1lcyhhcmNDZW5zb3IpOw0KKyAgICAjZW5kaWYNCisNCisgICAgYXJjQ2Vuc29yLkV4dGVuZEV4Y2x1ZGUoKTsNCisNCisgICAgaWYgKG9wdGlvbnMuU3RkSW5Nb2RlKQ0KKyAgICB7DQorICAgICAgVVN0cmluZyBhcmNOYW1lID0gcGFyc2VyW05LZXk6OmtTdGRJbl0uUG9zdFN0cmluZ3MuRnJvbnQoKTsNCisgICAgICBvcHRpb25zLkFyY2hpdmVQYXRoc1NvcnRlZC5BZGQoYXJjTmFtZSk7DQorICAgICAgb3B0aW9ucy5BcmNoaXZlUGF0aHNGdWxsU29ydGVkLkFkZChhcmNOYW1lKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBFbnVtZXJhdGVEaXJJdGVtc0FuZFNvcnQoDQorICAgICAgICAgIGZhbHNlLCAgICAgLy8gc2NhbkFsdFN0cmVhbXMNCisgICAgICAgICAgYXJjQ2Vuc29yLA0KKyAgICAgICAgICBOV2lsZGNhcmQ6OmtfUmVsYXRQYXRoLA0KKyAgICAgICAgICBVU3RyaW5nKCksIC8vIGFkZFBhdGhQcmVmaXgNCisgICAgICAgICAgb3B0aW9ucy5BcmNoaXZlUGF0aHNTb3J0ZWQsDQorICAgICAgICAgIG9wdGlvbnMuQXJjaGl2ZVBhdGhzRnVsbFNvcnRlZCk7DQorICAgIH0NCisgICAgDQorICAgIGlmIChpc0V4dHJhY3RHcm91cENvbW1hbmQpDQorICAgIHsNCisgICAgICBpZiAob3B0aW9ucy5TdGRPdXRNb2RlICYmIG9wdGlvbnMuSXNTdGRPdXRUZXJtaW5hbCAmJiBvcHRpb25zLklzU3RkRXJyVGVybWluYWwpDQorICAgICAgICB0aHJvdyBDQXJjQ21kTGluZUV4Y2VwdGlvbihrU2FtZVRlcm1pbmFsRXJyb3IpOw0KKyAgICAgIGlmIChwYXJzZXJbTktleTo6a091dHB1dERpcl0uVGhlcmVJcykNCisgICAgICB7DQorICAgICAgICBlby5PdXRwdXREaXIgPSB1czJmcyhwYXJzZXJbTktleTo6a091dHB1dERpcl0uUG9zdFN0cmluZ3NbMF0pOw0KKyAgICAgICAgTkZpbGU6Ok5OYW1lOjpOb3JtYWxpemVEaXJQYXRoUHJlZml4KGVvLk91dHB1dERpcik7DQorICAgICAgfQ0KKw0KKyAgICAgIGVvLk92ZXJ3cml0ZU1vZGUgPSBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OmtBc2s7DQorICAgICAgaWYgKHBhcnNlcltOS2V5OjprT3ZlcndyaXRlXS5UaGVyZUlzKQ0KKyAgICAgIHsNCisgICAgICAgIGVvLk92ZXJ3cml0ZU1vZGUgPSBrX092ZXJ3cml0ZU1vZGVzW3BhcnNlcltOS2V5OjprT3ZlcndyaXRlXS5Qb3N0Q2hhckluZGV4XTsNCisgICAgICAgIGVvLk92ZXJ3cml0ZU1vZGVfRm9yY2UgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBlbHNlIGlmIChvcHRpb25zLlllc1RvQWxsKQ0KKyAgICAgIHsNCisgICAgICAgIGVvLk92ZXJ3cml0ZU1vZGUgPSBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OmtPdmVyd3JpdGU7DQorICAgICAgICBlby5PdmVyd3JpdGVNb2RlX0ZvcmNlID0gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisNCisgICAgZW8uUGF0aE1vZGUgPSBvcHRpb25zLkNvbW1hbmQuR2V0UGF0aE1vZGUoKTsNCisgICAgaWYgKGNlbnNvclBhdGhNb2RlID09IE5XaWxkY2FyZDo6a19BYnNQYXRoKQ0KKyAgICB7DQorICAgICAgZW8uUGF0aE1vZGUgPSBORXh0cmFjdDo6TlBhdGhNb2RlOjprQWJzUGF0aHM7DQorICAgICAgZW8uUGF0aE1vZGVfRm9yY2UgPSB0cnVlOw0KKyAgICB9DQorICAgIGVsc2UgaWYgKGNlbnNvclBhdGhNb2RlID09IE5XaWxkY2FyZDo6a19GdWxsUGF0aCkNCisgICAgew0KKyAgICAgIGVvLlBhdGhNb2RlID0gTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6a0Z1bGxQYXRoczsNCisgICAgICBlby5QYXRoTW9kZV9Gb3JjZSA9IHRydWU7DQorICAgIH0NCisgIH0NCisgIGVsc2UgaWYgKG9wdGlvbnMuQ29tbWFuZC5Jc0Zyb21VcGRhdGVHcm91cCgpKQ0KKyAgew0KKyAgICBpZiAocGFyc2VyW05LZXk6OmtBckluY2x1ZGVdLlRoZXJlSXMpDQorICAgICAgdGhyb3cgQ0FyY0NtZExpbmVFeGNlcHRpb24oIi1haSBzd2l0Y2ggaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBjb21tYW5kIik7DQorDQorICAgIENVcGRhdGVPcHRpb25zICZ1cGRhdGVPcHRpb25zID0gb3B0aW9ucy5VcGRhdGVPcHRpb25zOw0KKw0KKyAgICBTZXRBZGRDb21tYW5kT3B0aW9ucyhvcHRpb25zLkNvbW1hbmQuQ29tbWFuZFR5cGUsIHBhcnNlciwgdXBkYXRlT3B0aW9ucyk7DQorICAgIA0KKyAgICB1cGRhdGVPcHRpb25zLk1ldGhvZE1vZGUuUHJvcGVydGllcyA9IG9wdGlvbnMuUHJvcGVydGllczsNCisNCisgICAgaWYgKHBhcnNlcltOS2V5OjprU2hhcmVGb3JXcml0ZV0uVGhlcmVJcykNCisgICAgICB1cGRhdGVPcHRpb25zLk9wZW5TaGFyZUZvcldyaXRlID0gdHJ1ZTsNCisNCisgICAgdXBkYXRlT3B0aW9ucy5QYXRoTW9kZSA9IGNlbnNvclBhdGhNb2RlOw0KKw0KKyAgICB1cGRhdGVPcHRpb25zLkFsdFN0cmVhbXMgPSBvcHRpb25zLkFsdFN0cmVhbXM7DQorICAgIHVwZGF0ZU9wdGlvbnMuTnRTZWN1cml0eSA9IG9wdGlvbnMuTnRTZWN1cml0eTsNCisgICAgdXBkYXRlT3B0aW9ucy5IYXJkTGlua3MgPSBvcHRpb25zLkhhcmRMaW5rczsNCisgICAgdXBkYXRlT3B0aW9ucy5TeW1MaW5rcyA9IG9wdGlvbnMuU3ltTGlua3M7DQorDQorICAgIHVwZGF0ZU9wdGlvbnMuRU1haWxNb2RlID0gcGFyc2VyW05LZXk6OmtFbWFpbF0uVGhlcmVJczsNCisgICAgaWYgKHVwZGF0ZU9wdGlvbnMuRU1haWxNb2RlKQ0KKyAgICB7DQorICAgICAgdXBkYXRlT3B0aW9ucy5FTWFpbEFkZHJlc3MgPSBwYXJzZXJbTktleTo6a0VtYWlsXS5Qb3N0U3RyaW5ncy5Gcm9udCgpOw0KKyAgICAgIGlmICh1cGRhdGVPcHRpb25zLkVNYWlsQWRkcmVzcy5MZW4oKSA+IDApDQorICAgICAgICBpZiAodXBkYXRlT3B0aW9ucy5FTWFpbEFkZHJlc3NbMF0gPT0gTCcuJykNCisgICAgICAgIHsNCisgICAgICAgICAgdXBkYXRlT3B0aW9ucy5FTWFpbFJlbW92ZUFmdGVyID0gdHJ1ZTsNCisgICAgICAgICAgdXBkYXRlT3B0aW9ucy5FTWFpbEFkZHJlc3MuRGVsZXRlKDApOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHVwZGF0ZU9wdGlvbnMuU3RkT3V0TW9kZSA9IG9wdGlvbnMuU3RkT3V0TW9kZTsNCisgICAgdXBkYXRlT3B0aW9ucy5TdGRJbk1vZGUgPSBvcHRpb25zLlN0ZEluTW9kZTsNCisNCisgICAgdXBkYXRlT3B0aW9ucy5EZWxldGVBZnRlckNvbXByZXNzaW5nID0gcGFyc2VyW05LZXk6OmtEZWxldGVBZnRlckNvbXByZXNzaW5nXS5UaGVyZUlzOw0KKyAgICB1cGRhdGVPcHRpb25zLlNldEFyY01UaW1lID0gcGFyc2VyW05LZXk6OmtTZXRBcmNNVGltZV0uVGhlcmVJczsNCisNCisgICAgaWYgKHVwZGF0ZU9wdGlvbnMuU3RkT3V0TW9kZSAmJiB1cGRhdGVPcHRpb25zLkVNYWlsTW9kZSkNCisgICAgICB0aHJvdyBDQXJjQ21kTGluZUV4Y2VwdGlvbigic3Rkb3V0IG1vZGUgYW5kIGVtYWlsIG1vZGUgY2Fubm90IGJlIGNvbWJpbmVkIik7DQorICAgIGlmICh1cGRhdGVPcHRpb25zLlN0ZE91dE1vZGUgJiYgb3B0aW9ucy5Jc1N0ZE91dFRlcm1pbmFsKQ0KKyAgICAgIHRocm93IENBcmNDbWRMaW5lRXhjZXB0aW9uKGtUZXJtaW5hbE91dEVycm9yKTsNCisgICAgaWYgKHVwZGF0ZU9wdGlvbnMuU3RkSW5Nb2RlKQ0KKyAgICAgIHVwZGF0ZU9wdGlvbnMuU3RkSW5GaWxlTmFtZSA9IHBhcnNlcltOS2V5OjprU3RkSW5dLlBvc3RTdHJpbmdzLkZyb250KCk7DQorDQorICAgIGlmIChvcHRpb25zLkNvbW1hbmQuQ29tbWFuZFR5cGUgPT0gTkNvbW1hbmRUeXBlOjprUmVuYW1lKQ0KKyAgICAgIGlmICh1cGRhdGVPcHRpb25zLkNvbW1hbmRzLlNpemUoKSAhPSAxKQ0KKyAgICAgICAgdGhyb3cgQ0FyY0NtZExpbmVFeGNlcHRpb24oIk9ubHkgb25lIGFyY2hpdmUgY2FuIGJlIGNyZWF0ZWQgd2l0aCByZW5hbWUgY29tbWFuZCIpOw0KKyAgfQ0KKyAgZWxzZSBpZiAob3B0aW9ucy5Db21tYW5kLkNvbW1hbmRUeXBlID09IE5Db21tYW5kVHlwZTo6a0JlbmNobWFyaykNCisgIHsNCisgICAgb3B0aW9ucy5OdW1JdGVyYXRpb25zID0gMTsNCisgICAgaWYgKGN1ckNvbW1hbmRJbmRleCA8IG51bU5vblN3aXRjaFN0cmluZ3MpDQorICAgIHsNCisgICAgICBpZiAoIVN0cmluZ1RvVUludDMyKG5vblN3aXRjaFN0cmluZ3NbY3VyQ29tbWFuZEluZGV4XSwgb3B0aW9ucy5OdW1JdGVyYXRpb25zKSkNCisgICAgICAgIHRocm93IENBcmNDbWRMaW5lRXhjZXB0aW9uKCJJbmNvcnJlY3QgTnVtYmVyIG9mIGJlbm1jaG1hcmsgaXRlcmF0aW9ucyIsIG5vblN3aXRjaFN0cmluZ3NbY3VyQ29tbWFuZEluZGV4XSk7DQorICAgICAgY3VyQ29tbWFuZEluZGV4Kys7DQorICAgIH0NCisgIH0NCisgIGVsc2UgaWYgKG9wdGlvbnMuQ29tbWFuZC5Db21tYW5kVHlwZSA9PSBOQ29tbWFuZFR5cGU6OmtIYXNoKQ0KKyAgew0KKyAgICBvcHRpb25zLkNlbnNvci5BZGRQYXRoc1RvQ2Vuc29yKGNlbnNvclBhdGhNb2RlKTsNCisgICAgb3B0aW9ucy5DZW5zb3IuRXh0ZW5kRXhjbHVkZSgpOw0KKw0KKyAgICBDSGFzaE9wdGlvbnMgJmhhc2hPcHRpb25zID0gb3B0aW9ucy5IYXNoT3B0aW9uczsNCisgICAgaGFzaE9wdGlvbnMuUGF0aE1vZGUgPSBjZW5zb3JQYXRoTW9kZTsNCisgICAgaGFzaE9wdGlvbnMuTWV0aG9kcyA9IG9wdGlvbnMuSGFzaE1ldGhvZHM7DQorICAgIGlmIChwYXJzZXJbTktleTo6a1NoYXJlRm9yV3JpdGVdLlRoZXJlSXMpDQorICAgICAgaGFzaE9wdGlvbnMuT3BlblNoYXJlRm9yV3JpdGUgPSB0cnVlOw0KKyAgICBoYXNoT3B0aW9ucy5TdGRJbk1vZGUgPSBvcHRpb25zLlN0ZEluTW9kZTsNCisgICAgaGFzaE9wdGlvbnMuQWx0U3RyZWFtc01vZGUgPSBvcHRpb25zLkFsdFN0cmVhbXMuVmFsOw0KKyAgfQ0KKyAgZWxzZSBpZiAob3B0aW9ucy5Db21tYW5kLkNvbW1hbmRUeXBlID09IE5Db21tYW5kVHlwZTo6a0luZm8pDQorICB7DQorICB9DQorICBlbHNlDQorICAgIHRocm93IDk4MTU2NzY3MTE7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0FyY2hpdmVDb21tYW5kTGluZS5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vQXJjaGl2ZUNvbW1hbmRMaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0MTg2ZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0FyY2hpdmVDb21tYW5kTGluZS5oCkBAIC0wLDAgKzEsMTIyIEBACisvLyBBcmNoaXZlQ29tbWFuZExpbmUuaA0KKw0KKyNpZm5kZWYgX19BUkNISVZFX0NPTU1BTkRfTElORV9IDQorI2RlZmluZSBfX0FSQ0hJVkVfQ09NTUFORF9MSU5FX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0NvbW1hbmRMaW5lUGFyc2VyLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9XaWxkY2FyZC5oIg0KKw0KKyNpbmNsdWRlICJFeHRyYWN0LmgiDQorI2luY2x1ZGUgIkhhc2hDYWxjLmgiDQorI2luY2x1ZGUgIlVwZGF0ZS5oIg0KKw0KK3N0cnVjdCBDQXJjQ21kTGluZUV4Y2VwdGlvbjogcHVibGljIFVTdHJpbmcNCit7DQorICBDQXJjQ21kTGluZUV4Y2VwdGlvbihjb25zdCBjaGFyICphLCBjb25zdCB3Y2hhcl90ICp1ID0gTlVMTCk7DQorfTsNCisNCituYW1lc3BhY2UgTkNvbW1hbmRUeXBlIHsgZW51bSBFRW51bQ0KK3sNCisgIGtBZGQgPSAwLA0KKyAga1VwZGF0ZSwNCisgIGtEZWxldGUsDQorICBrVGVzdCwNCisgIGtFeHRyYWN0LA0KKyAga0V4dHJhY3RGdWxsLA0KKyAga0xpc3QsDQorICBrQmVuY2htYXJrLA0KKyAga0luZm8sDQorICBrSGFzaCwNCisgIGtSZW5hbWUNCit9O30NCisNCitzdHJ1Y3QgQ0FyY0NvbW1hbmQNCit7DQorICBOQ29tbWFuZFR5cGU6OkVFbnVtIENvbW1hbmRUeXBlOw0KKw0KKyAgYm9vbCBJc0Zyb21FeHRyYWN0R3JvdXAoKSBjb25zdDsNCisgIGJvb2wgSXNGcm9tVXBkYXRlR3JvdXAoKSBjb25zdDsNCisgIGJvb2wgSXNUZXN0Q29tbWFuZCgpIGNvbnN0IHsgcmV0dXJuIENvbW1hbmRUeXBlID09IE5Db21tYW5kVHlwZTo6a1Rlc3Q7IH0NCisgIE5FeHRyYWN0OjpOUGF0aE1vZGU6OkVFbnVtIEdldFBhdGhNb2RlKCkgY29uc3Q7DQorfTsNCisNCitzdHJ1Y3QgQ0FyY0NtZExpbmVPcHRpb25zDQorew0KKyAgYm9vbCBIZWxwTW9kZTsNCisNCisgICNpZmRlZiBfV0lOMzINCisgIGJvb2wgTGFyZ2VQYWdlczsNCisgICNlbmRpZg0KKyAgYm9vbCBDYXNlU2Vuc2l0aXZlQ2hhbmdlOw0KKyAgYm9vbCBDYXNlU2Vuc2l0aXZlOw0KKw0KKyAgYm9vbCBJc0luVGVybWluYWw7DQorICBib29sIElzU3RkT3V0VGVybWluYWw7DQorICBib29sIElzU3RkRXJyVGVybWluYWw7DQorICBib29sIFN0ZEluTW9kZTsNCisgIGJvb2wgU3RkT3V0TW9kZTsNCisgIGJvb2wgRW5hYmxlSGVhZGVyczsNCisNCisgIGJvb2wgWWVzVG9BbGw7DQorICBib29sIFNob3dEaWFsb2c7DQorICBOV2lsZGNhcmQ6OkNDZW5zb3IgQ2Vuc29yOw0KKw0KKyAgQ0FyY0NvbW1hbmQgQ29tbWFuZDsNCisgIFVTdHJpbmcgQXJjaGl2ZU5hbWU7DQorDQorICAjaWZuZGVmIF9OT19DUllQVE8NCisgIGJvb2wgUGFzc3dvcmRFbmFibGVkOw0KKyAgVVN0cmluZyBQYXNzd29yZDsNCisgICNlbmRpZg0KKw0KKyAgYm9vbCBUZWNoTW9kZTsNCisgIA0KKyAgVVN0cmluZ1ZlY3RvciBIYXNoTWV0aG9kczsNCisNCisgIGJvb2wgQXBwZW5kTmFtZTsNCisgIFVTdHJpbmdWZWN0b3IgQXJjaGl2ZVBhdGhzU29ydGVkOw0KKyAgVVN0cmluZ1ZlY3RvciBBcmNoaXZlUGF0aHNGdWxsU29ydGVkOw0KKyAgQ09iamVjdFZlY3RvcjxDUHJvcGVydHk+IFByb3BlcnRpZXM7DQorDQorICBDRXh0cmFjdE9wdGlvbnNCYXNlIEV4dHJhY3RPcHRpb25zOw0KKw0KKyAgQ0Jvb2xQYWlyIE50U2VjdXJpdHk7DQorICBDQm9vbFBhaXIgQWx0U3RyZWFtczsNCisgIENCb29sUGFpciBIYXJkTGlua3M7DQorICBDQm9vbFBhaXIgU3ltTGlua3M7DQorDQorICBDVXBkYXRlT3B0aW9ucyBVcGRhdGVPcHRpb25zOw0KKyAgQ0hhc2hPcHRpb25zIEhhc2hPcHRpb25zOw0KKyAgVVN0cmluZyBBcmNUeXBlOw0KKyAgVVN0cmluZ1ZlY3RvciBFeGNsdWRlZEFyY1R5cGVzOw0KKyAgYm9vbCBFbmFibGVQZXJjZW50czsNCisNCisgIC8vIEJlbmNobWFyaw0KKyAgVUludDMyIE51bUl0ZXJhdGlvbnM7DQorDQorICBDQXJjQ21kTGluZU9wdGlvbnMoKToNCisgICAgICBTdGRJbk1vZGUoZmFsc2UpLA0KKyAgICAgIFN0ZE91dE1vZGUoZmFsc2UpLA0KKyAgICAgIENhc2VTZW5zaXRpdmVDaGFuZ2UoZmFsc2UpLA0KKyAgICAgIENhc2VTZW5zaXRpdmUoZmFsc2UpDQorICAgICAge307DQorfTsNCisNCitjbGFzcyBDQXJjQ21kTGluZVBhcnNlcg0KK3sNCisgIE5Db21tYW5kTGluZVBhcnNlcjo6Q1BhcnNlciBwYXJzZXI7DQorcHVibGljOg0KKyAgQ0FyY0NtZExpbmVQYXJzZXIoKTsNCisgIHZvaWQgUGFyc2UxKGNvbnN0IFVTdHJpbmdWZWN0b3IgJmNvbW1hbmRTdHJpbmdzLCBDQXJjQ21kTGluZU9wdGlvbnMgJm9wdGlvbnMpOw0KKyAgdm9pZCBQYXJzZTIoQ0FyY0NtZExpbmVPcHRpb25zICZvcHRpb25zKTsNCit9Ow0KKw0KK3ZvaWQgRW51bWVyYXRlRGlySXRlbXNBbmRTb3J0KA0KKyAgICBib29sIHN0b3JlQWx0U3RyZWFtcywNCisgICAgTldpbGRjYXJkOjpDQ2Vuc29yICZjZW5zb3IsDQorICAgIE5XaWxkY2FyZDo6RUNlbnNvclBhdGhNb2RlIHBhdGhNb2RlLA0KKyAgICBjb25zdCBVU3RyaW5nICZhZGRQYXRoUHJlZml4LA0KKyAgICBVU3RyaW5nVmVjdG9yICZzb3J0ZWRQYXRocywNCisgICAgVVN0cmluZ1ZlY3RvciAmc29ydGVkRnVsbFBhdGhzKTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9BcmNoaXZlRXh0cmFjdENhbGxiYWNrLmNwcCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTk0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9BcmNoaXZlRXh0cmFjdENhbGxiYWNrLmNwcApAQCAtMCwwICsxLDExOTEgQEAKKy8vIEFyY2hpdmVFeHRyYWN0Q2FsbGJhY2suY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyN1bmRlZiBzcHJpbnRmDQorI3VuZGVmIHByaW50Zg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vQ29tVHJ5LmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9XaWxkY2FyZC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVEaXIuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlRmluZC5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVOYW1lLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvUHJvcFZhcmlhbnQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9Qcm9wVmFyaWFudENvbnYuaCINCisNCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKSAgJiYgIWRlZmluZWQoX1NGWCkNCisjZGVmaW5lIF9VU0VfU0VDVVJJVFlfQ09ERQ0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1NlY3VyaXR5VXRpbHMuaCINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0ZpbGVQYXRoQXV0b1JlbmFtZS5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vRXh0cmFjdGluZ0ZpbGVQYXRoLmgiDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9Qcm9wSURVdGlscy5oIg0KKw0KKyNpbmNsdWRlICJBcmNoaXZlRXh0cmFjdENhbGxiYWNrLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KK3VzaW5nIG5hbWVzcGFjZSBORmlsZTsNCit1c2luZyBuYW1lc3BhY2UgTkRpcjsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqa0NhbnRBdXRvUmVuYW1lID0gIkNhbiBub3QgY3JlYXRlIGZpbGUgd2l0aCBhdXRvIG5hbWUiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprQ2FudFJlbmFtZUZpbGUgPSAiQ2FuIG5vdCByZW5hbWUgZXhpc3RpbmcgZmlsZSI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtDYW50RGVsZXRlT3V0cHV0RmlsZSA9ICJDYW4gbm90IGRlbGV0ZSBvdXRwdXQgZmlsZSI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtDYW50RGVsZXRlT3V0cHV0RGlyID0gIkNhbiBub3QgZGVsZXRlIG91dHB1dCBmb2xkZXIiOw0KKw0KKw0KKyNpZm5kZWYgX1NGWA0KKw0KK1NURE1FVEhPRElNUCBDT3V0U3RyZWFtV2l0aEhhc2g6OldyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgSFJFU1VMVCByZXN1bHQgPSBTX09LOw0KKyAgaWYgKF9zdHJlYW0pDQorICAgIHJlc3VsdCA9IF9zdHJlYW0tPldyaXRlKGRhdGEsIHNpemUsICZzaXplKTsNCisgIGlmIChfY2FsY3VsYXRlKQ0KKyAgICBfaGFzaC0+VXBkYXRlKGRhdGEsIHNpemUpOw0KKyAgX3NpemUgKz0gc2l6ZTsNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IHNpemU7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisNCisjZW5kaWYNCisNCisjaWZkZWYgX1VTRV9TRUNVUklUWV9DT0RFDQorYm9vbCBJbml0TG9jYWxQcml2aWxlZ2VzKCkNCit7DQorICBOU2VjdXJpdHk6OkNBY2Nlc3NUb2tlbiB0b2tlbjsNCisgIGlmICghdG9rZW4uT3BlblByb2Nlc3NUb2tlbihHZXRDdXJyZW50UHJvY2VzcygpLA0KKyAgICAgIFRPS0VOX1FVRVJZIHwgVE9LRU5fQURKVVNUX1BSSVZJTEVHRVMpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICBUT0tFTl9QUklWSUxFR0VTIHRwOw0KKyANCisgIHRwLlByaXZpbGVnZUNvdW50ID0gMTsNCisgIHRwLlByaXZpbGVnZXNbMF0uQXR0cmlidXRlcyA9IFNFX1BSSVZJTEVHRV9FTkFCTEVEOw0KKyAgDQorICBpZiAgKCE6Okxvb2t1cFByaXZpbGVnZVZhbHVlKE5VTEwsIFNFX1NFQ1VSSVRZX05BTUUsICZ0cC5Qcml2aWxlZ2VzWzBdLkx1aWQpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBpZiAoIXRva2VuLkFkanVzdFByaXZpbGVnZXMoJnRwKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9TVUNDRVNTKTsNCit9DQorI2VuZGlmDQorDQorI2lmZGVmIFNVUFBPUlRfTElOS1MNCisNCitpbnQgQ0hhcmRMaW5rTm9kZTo6Q29tcGFyZShjb25zdCBDSGFyZExpbmtOb2RlICZhKSBjb25zdA0KK3sNCisgIGlmIChTdHJlYW1JZCA8IGEuU3RyZWFtSWQpIHJldHVybiAtMTsNCisgIGlmIChTdHJlYW1JZCA+IGEuU3RyZWFtSWQpIHJldHVybiAxOw0KKyAgcmV0dXJuIE15Q29tcGFyZShJTm9kZSwgYS5JTm9kZSk7DQorfQ0KKw0KK0hSRVNVTFQgQXJjaGl2ZV9HZXRfSGFyZExpbmtOb2RlKElJbkFyY2hpdmUgKmFyY2hpdmUsIFVJbnQzMiBpbmRleCwgQ0hhcmRMaW5rTm9kZSAmaCwgYm9vbCAmZGVmaW5lZCkNCit7DQorICBoLklOb2RlID0gMDsNCisgIGguU3RyZWFtSWQgPSAoVUludDY0KShJbnQ2NCktMTsNCisgIGRlZmluZWQgPSBmYWxzZTsNCisgIHsNCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgIFJJTk9LKGFyY2hpdmUtPkdldFByb3BlcnR5KGluZGV4LCBrcGlkSU5vZGUsICZwcm9wKSk7DQorICAgIGlmICghQ29udmVydFByb3BWYXJpYW50VG9VSW50NjQocHJvcCwgaC5JTm9kZSkpDQorICAgICAgcmV0dXJuIFNfT0s7DQorICB9DQorICB7DQorICAgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgICBSSU5PSyhhcmNoaXZlLT5HZXRQcm9wZXJ0eShpbmRleCwga3BpZFN0cmVhbUlkLCAmcHJvcCkpOw0KKyAgICBDb252ZXJ0UHJvcFZhcmlhbnRUb1VJbnQ2NChwcm9wLCBoLlN0cmVhbUlkKTsNCisgIH0NCisgIGRlZmluZWQgPSB0cnVlOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKw0KK0hSRVNVTFQgQ0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2s6OlByZXBhcmVIYXJkTGlua3MoY29uc3QgQ1JlY29yZFZlY3RvcjxVSW50MzI+ICpyZWFsSW5kaWNlcykNCit7DQorICBfaGFyZExpbmtzLkNsZWFyKCk7DQorDQorICBpZiAoIV9hcmMtPkFza19JTm9kZSkNCisgICAgcmV0dXJuIFNfT0s7DQorICANCisgIElJbkFyY2hpdmUgKmFyY2hpdmUgPSBfYXJjLT5BcmNoaXZlOw0KKyAgQ1JlY29yZFZlY3RvcjxDSGFyZExpbmtOb2RlPiAmaGFyZElEcyA9IF9oYXJkTGlua3MuSURzOw0KKw0KKyAgew0KKyAgICBVSW50MzIgbnVtSXRlbXM7DQorICAgIGlmIChyZWFsSW5kaWNlcykNCisgICAgICBudW1JdGVtcyA9IHJlYWxJbmRpY2VzLT5TaXplKCk7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIFJJTk9LKGFyY2hpdmUtPkdldE51bWJlck9mSXRlbXMoJm51bUl0ZW1zKSk7DQorICAgIH0NCisNCisgICAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKQ0KKyAgICB7DQorICAgICAgQ0hhcmRMaW5rTm9kZSBoOw0KKyAgICAgIGJvb2wgZGVmaW5lZDsNCisgICAgICBSSU5PSyhBcmNoaXZlX0dldF9IYXJkTGlua05vZGUoYXJjaGl2ZSwgcmVhbEluZGljZXMgPyAoKnJlYWxJbmRpY2VzKVtpXSA6IGksIGgsIGRlZmluZWQpKTsNCisgICAgICBpZiAoZGVmaW5lZCkNCisgICAgICAgIGhhcmRJRHMuQWRkKGgpOw0KKyAgICB9DQorICB9DQorICANCisgIGhhcmRJRHMuU29ydDIoKTsNCisgIA0KKyAgew0KKyAgICAvLyB3ZWUga2VlcCBvbmx5IGl0ZW1zIHRoYXQgaGF2ZSAyIG9yIG1vcmUgaXRlbXMNCisgICAgdW5zaWduZWQgayA9IDA7DQorICAgIHVuc2lnbmVkIG51bVNhbWUgPSAxOw0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgaGFyZElEcy5TaXplKCk7IGkrKykNCisgICAgew0KKyAgICAgIGlmIChoYXJkSURzW2ldLkNvbXBhcmUoaGFyZElEc1tpIC0gMV0pICE9IDApDQorICAgICAgICBudW1TYW1lID0gMTsNCisgICAgICBlbHNlIGlmICgrK251bVNhbWUgPT0gMikNCisgICAgICB7DQorICAgICAgICBpZiAoaSAtIDEgIT0gaykNCisgICAgICAgICAgaGFyZElEc1trXSA9IGhhcmRJRHNbaSAtIDFdOw0KKyAgICAgICAgaysrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBoYXJkSURzLkRlbGV0ZUZyb20oayk7DQorICB9DQorICANCisgIF9oYXJkTGlua3MuUHJlcGFyZUxpbmtzKCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorI2VuZGlmDQorDQorQ0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2s6OkNBcmNoaXZlRXh0cmFjdENhbGxiYWNrKCk6DQorICAgIFdyaXRlQ1RpbWUodHJ1ZSksDQorICAgIFdyaXRlQVRpbWUodHJ1ZSksDQorICAgIFdyaXRlTVRpbWUodHJ1ZSksDQorICAgIF9tdWx0aUFyY2hpdmVzKGZhbHNlKQ0KK3sNCisgIExvY2FsUHJvZ3Jlc3NTcGVjID0gbmV3IENMb2NhbFByb2dyZXNzKCk7DQorICBfbG9jYWxQcm9ncmVzcyA9IExvY2FsUHJvZ3Jlc3NTcGVjOw0KKw0KKyAgI2lmZGVmIF9VU0VfU0VDVVJJVFlfQ09ERQ0KKyAgX3NhY2xFbmFibGVkID0gSW5pdExvY2FsUHJpdmlsZWdlcygpOw0KKyAgI2VuZGlmDQorfQ0KKw0KK3ZvaWQgQ0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2s6OkluaXQoDQorICAgIGNvbnN0IENFeHRyYWN0TnRPcHRpb25zICZudE9wdGlvbnMsDQorICAgIGNvbnN0IE5XaWxkY2FyZDo6Q0NlbnNvck5vZGUgKndpbGRjYXJkQ2Vuc29yLA0KKyAgICBjb25zdCBDQXJjICphcmMsDQorICAgIElGb2xkZXJBcmNoaXZlRXh0cmFjdENhbGxiYWNrICpleHRyYWN0Q2FsbGJhY2syLA0KKyAgICBib29sIHN0ZE91dE1vZGUsIGJvb2wgdGVzdE1vZGUsDQorICAgIGNvbnN0IEZTdHJpbmcgJmRpcmVjdG9yeVBhdGgsDQorICAgIGNvbnN0IFVTdHJpbmdWZWN0b3IgJnJlbW92ZVBhdGhQYXJ0cywNCisgICAgVUludDY0IHBhY2tTaXplKQ0KK3sNCisgIF9leHRyYWN0ZWRGb2xkZXJQYXRocy5DbGVhcigpOw0KKyAgX2V4dHJhY3RlZEZvbGRlckluZGljZXMuQ2xlYXIoKTsNCisgIA0KKyAgI2lmZGVmIFNVUFBPUlRfTElOS1MNCisgIF9oYXJkTGlua3MuQ2xlYXIoKTsNCisgICNlbmRpZg0KKw0KKyAgX250T3B0aW9ucyA9IG50T3B0aW9uczsNCisgIF93aWxkY2FyZENlbnNvciA9IHdpbGRjYXJkQ2Vuc29yOw0KKw0KKyAgX3N0ZE91dE1vZGUgPSBzdGRPdXRNb2RlOw0KKyAgX3Rlc3RNb2RlID0gdGVzdE1vZGU7DQorICBfdW5wVG90YWwgPSAxOw0KKyAgX3BhY2tUb3RhbCA9IHBhY2tTaXplOw0KKw0KKyAgX2V4dHJhY3RDYWxsYmFjazIgPSBleHRyYWN0Q2FsbGJhY2syOw0KKyAgX2NvbXByZXNzUHJvZ3Jlc3MuUmVsZWFzZSgpOw0KKyAgX2V4dHJhY3RDYWxsYmFjazIuUXVlcnlJbnRlcmZhY2UoSUlEX0lDb21wcmVzc1Byb2dyZXNzSW5mbywgJl9jb21wcmVzc1Byb2dyZXNzKTsNCisNCisgICNpZm5kZWYgX1NGWA0KKw0KKyAgX2V4dHJhY3RDYWxsYmFjazIuUXVlcnlJbnRlcmZhY2UoSUlEX0lGb2xkZXJFeHRyYWN0VG9TdHJlYW1DYWxsYmFjaywgJkV4dHJhY3RUb1N0cmVhbUNhbGxiYWNrKTsNCisgIGlmIChFeHRyYWN0VG9TdHJlYW1DYWxsYmFjaykNCisgIHsNCisgICAgSW50MzIgdXNlU3RyZWFtcyA9IDA7DQorICAgIGlmIChFeHRyYWN0VG9TdHJlYW1DYWxsYmFjay0+VXNlRXh0cmFjdFRvU3RyZWFtKCZ1c2VTdHJlYW1zKSAhPSBTX09LKQ0KKyAgICAgIHVzZVN0cmVhbXMgPSAwOw0KKyAgICBpZiAodXNlU3RyZWFtcyA9PSAwKQ0KKyAgICAgIEV4dHJhY3RUb1N0cmVhbUNhbGxiYWNrLlJlbGVhc2UoKTsNCisgIH0NCisgIA0KKyAgI2VuZGlmDQorDQorICBMb2NhbFByb2dyZXNzU3BlYy0+SW5pdChleHRyYWN0Q2FsbGJhY2syLCB0cnVlKTsNCisgIExvY2FsUHJvZ3Jlc3NTcGVjLT5TZW5kUHJvZ3Jlc3MgPSBmYWxzZTsNCisgDQorICBfcmVtb3ZlUGF0aFBhcnRzID0gcmVtb3ZlUGF0aFBhcnRzOw0KKyAgX2Jhc2VQYXJlbnRGb2xkZXIgPSAoVUludDMyKShJbnQzMiktMTsNCisgIF91c2VfYmFzZVBhcmVudEZvbGRlcl9tb2RlID0gZmFsc2U7DQorDQorICBfYXJjID0gYXJjOw0KKyAgX2RpcmVjdG9yeVBhdGggPSBkaXJlY3RvcnlQYXRoOw0KKyAgTk5hbWU6Ok5vcm1hbGl6ZURpclBhdGhQcmVmaXgoX2RpcmVjdG9yeVBhdGgpOw0KKyAgTkRpcjo6TXlHZXRGdWxsUGF0aE5hbWUoZGlyZWN0b3J5UGF0aCwgX2RpcmVjdG9yeVBhdGhGdWxsKTsNCit9DQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlRXh0cmFjdENhbGxiYWNrOjpTZXRUb3RhbChVSW50NjQgc2l6ZSkNCit7DQorICBDT01fVFJZX0JFR0lODQorICBfdW5wVG90YWwgPSBzaXplOw0KKyAgaWYgKCFfbXVsdGlBcmNoaXZlcyAmJiBfZXh0cmFjdENhbGxiYWNrMikNCisgICAgcmV0dXJuIF9leHRyYWN0Q2FsbGJhY2syLT5TZXRUb3RhbChzaXplKTsNCisgIHJldHVybiBTX09LOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorc3RhdGljIHZvaWQgTm9ybWFsaXplVmFscyhVSW50NjQgJnYxLCBVSW50NjQgJnYyKQ0KK3sNCisgIGNvbnN0IFVJbnQ2NCBrTWF4ID0gKFVJbnQ2NCkxIDw8IDMxOw0KKyAgd2hpbGUgKHYxID4ga01heCkNCisgIHsNCisgICAgdjEgPj49IDE7DQorICAgIHYyID4+PSAxOw0KKyAgfQ0KK30NCisNCitzdGF0aWMgVUludDY0IE15TXVsdERpdjY0KFVJbnQ2NCB1bnBDdXIsIFVJbnQ2NCB1bnBUb3RhbCwgVUludDY0IHBhY2tUb3RhbCkNCit7DQorICBOb3JtYWxpemVWYWxzKHBhY2tUb3RhbCwgdW5wVG90YWwpOw0KKyAgTm9ybWFsaXplVmFscyh1bnBDdXIsIHVucFRvdGFsKTsNCisgIGlmICh1bnBUb3RhbCA9PSAwKQ0KKyAgICB1bnBUb3RhbCA9IDE7DQorICByZXR1cm4gdW5wQ3VyICogcGFja1RvdGFsIC8gdW5wVG90YWw7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZUV4dHJhY3RDYWxsYmFjazo6U2V0Q29tcGxldGVkKGNvbnN0IFVJbnQ2NCAqY29tcGxldGVWYWx1ZSkNCit7DQorICBDT01fVFJZX0JFR0lODQorICBpZiAoIV9leHRyYWN0Q2FsbGJhY2syKQ0KKyAgICByZXR1cm4gU19PSzsNCisNCisgIGlmIChfbXVsdGlBcmNoaXZlcykNCisgIHsNCisgICAgaWYgKGNvbXBsZXRlVmFsdWUgIT0gTlVMTCkNCisgICAgew0KKyAgICAgIFVJbnQ2NCBwYWNrQ3VyID0gTG9jYWxQcm9ncmVzc1NwZWMtPkluU2l6ZSArIE15TXVsdERpdjY0KCpjb21wbGV0ZVZhbHVlLCBfdW5wVG90YWwsIF9wYWNrVG90YWwpOw0KKyAgICAgIHJldHVybiBfZXh0cmFjdENhbGxiYWNrMi0+U2V0Q29tcGxldGVkKCZwYWNrQ3VyKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIF9leHRyYWN0Q2FsbGJhY2syLT5TZXRDb21wbGV0ZWQoY29tcGxldGVWYWx1ZSk7DQorICBDT01fVFJZX0VORA0KK30NCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2s6OlNldFJhdGlvSW5mbyhjb25zdCBVSW50NjQgKmluU2l6ZSwgY29uc3QgVUludDY0ICpvdXRTaXplKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIHJldHVybiBfbG9jYWxQcm9ncmVzcy0+U2V0UmF0aW9JbmZvKGluU2l6ZSwgb3V0U2l6ZSk7DQorICBDT01fVFJZX0VORA0KK30NCisNCisjZGVmaW5lIElTX0xFVFRFUl9DSEFSKGMpICgoYykgPj0gJ2EnICYmIChjKSA8PSAneicgfHwgKGMpID49ICdBJyAmJiAoYykgPD0gJ1onKQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBJc0RyaXZlTmFtZShjb25zdCBVU3RyaW5nICZzKQ0KK3sNCisgIHJldHVybiBzLkxlbigpID09IDIgJiYgc1sxXSA9PSAnOicgJiYgSVNfTEVUVEVSX0NIQVIoc1swXSk7DQorfQ0KKw0KK3ZvaWQgQ0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2s6OkNyZWF0ZUNvbXBsZXhEaXJlY3RvcnkoY29uc3QgVVN0cmluZ1ZlY3RvciAmZGlyUGF0aFBhcnRzLCBGU3RyaW5nICZmdWxsUGF0aCkNCit7DQorICBib29sIGlzQWJzUGF0aCA9IGZhbHNlOw0KKyAgDQorICBpZiAoIWRpclBhdGhQYXJ0cy5Jc0VtcHR5KCkpDQorICB7DQorICAgIGNvbnN0IFVTdHJpbmcgJnMgPSBkaXJQYXRoUGFydHNbMF07DQorICAgIGlmIChzLklzRW1wdHkoKSkNCisgICAgICBpc0Fic1BhdGggPSB0cnVlOw0KKyAgICAjaWZkZWYgX1dJTjMyDQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGlmIChkaXJQYXRoUGFydHMuU2l6ZSgpID4gMSAmJiBJc0RyaXZlTmFtZShzKSkNCisgICAgICAgIGlzQWJzUGF0aCA9IHRydWU7DQorICAgIH0NCisgICAgI2VuZGlmDQorICB9DQorICANCisgIGlmIChfcGF0aE1vZGUgPT0gTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6a0Fic1BhdGhzICYmIGlzQWJzUGF0aCkNCisgICAgZnVsbFBhdGguRW1wdHkoKTsNCisgIGVsc2UNCisgICAgZnVsbFBhdGggPSBfZGlyZWN0b3J5UGF0aDsNCisNCisgIEZPUl9WRUNUT1IgKGksIGRpclBhdGhQYXJ0cykNCisgIHsNCisgICAgaWYgKGkgPiAwKQ0KKyAgICAgIGZ1bGxQYXRoICs9IEZDSEFSX1BBVEhfU0VQQVJBVE9SOw0KKyAgICBjb25zdCBVU3RyaW5nICZzID0gZGlyUGF0aFBhcnRzW2ldOw0KKyAgICBmdWxsUGF0aCArPSB1czJmcyhzKTsNCisgICAgI2lmZGVmIF9XSU4zMg0KKyAgICBpZiAoX3BhdGhNb2RlID09IE5FeHRyYWN0OjpOUGF0aE1vZGU6OmtBYnNQYXRocykNCisgICAgICBpZiAoaSA9PSAwICYmIElzRHJpdmVOYW1lKHMpKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICNlbmRpZg0KKyAgICBDcmVhdGVEaXIoZnVsbFBhdGgpOw0KKyAgfQ0KK30NCisNCitIUkVTVUxUIENBcmNoaXZlRXh0cmFjdENhbGxiYWNrOjpHZXRUaW1lKGludCBpbmRleCwgUFJPUElEIHByb3BJRCwgRklMRVRJTUUgJmZpbGV0aW1lLCBib29sICZmaWxldGltZUlzRGVmaW5lZCkNCit7DQorICBmaWxldGltZUlzRGVmaW5lZCA9IGZhbHNlOw0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBSSU5PSyhfYXJjLT5BcmNoaXZlLT5HZXRQcm9wZXJ0eShpbmRleCwgcHJvcElELCAmcHJvcCkpOw0KKyAgaWYgKHByb3AudnQgPT0gVlRfRklMRVRJTUUpDQorICB7DQorICAgIGZpbGV0aW1lID0gcHJvcC5maWxldGltZTsNCisgICAgZmlsZXRpbWVJc0RlZmluZWQgPSAoZmlsZXRpbWUuZHdIaWdoRGF0ZVRpbWUgIT0gMCB8fCBmaWxldGltZS5kd0xvd0RhdGVUaW1lICE9IDApOw0KKyAgfQ0KKyAgZWxzZSBpZiAocHJvcC52dCAhPSBWVF9FTVBUWSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENBcmNoaXZlRXh0cmFjdENhbGxiYWNrOjpHZXRVbnBhY2tTaXplKCkNCit7DQorICByZXR1cm4gX2FyYy0+R2V0SXRlbVNpemUoX2luZGV4LCBfY3VyU2l6ZSwgX2N1clNpemVEZWZpbmVkKTsNCit9DQorDQorSFJFU1VMVCBDQXJjaGl2ZUV4dHJhY3RDYWxsYmFjazo6U2VuZE1lc3NhZ2VFcnJvcihjb25zdCBjaGFyICptZXNzYWdlLCBjb25zdCBGU3RyaW5nICZwYXRoKQ0KK3sNCisgIHJldHVybiBfZXh0cmFjdENhbGxiYWNrMi0+TWVzc2FnZUVycm9yKA0KKyAgICAgIFVTdHJpbmcoTCJFUlJPUjogIikgKw0KKyAgICAgIEdldFVuaWNvZGVTdHJpbmcobWVzc2FnZSkgKyBMIjogIiArIGZzMnVzKHBhdGgpKTsNCit9DQorDQorSFJFU1VMVCBDQXJjaGl2ZUV4dHJhY3RDYWxsYmFjazo6U2VuZE1lc3NhZ2VFcnJvcjIoY29uc3QgY2hhciAqbWVzc2FnZSwgY29uc3QgRlN0cmluZyAmcGF0aDEsIGNvbnN0IEZTdHJpbmcgJnBhdGgyKQ0KK3sNCisgIHJldHVybiBfZXh0cmFjdENhbGxiYWNrMi0+TWVzc2FnZUVycm9yKA0KKyAgICAgIFVTdHJpbmcoTCJFUlJPUjogIikgKw0KKyAgICAgIEdldFVuaWNvZGVTdHJpbmcobWVzc2FnZSkgKyBVU3RyaW5nKEwiOiAiKSArIGZzMnVzKHBhdGgxKSArIFVTdHJpbmcoTCIgOiAiKSArIGZzMnVzKHBhdGgyKSk7DQorfQ0KKw0KKyNpZm5kZWYgX1NGWA0KKw0KK1NURE1FVEhPRElNUCBDR2V0UHJvcDo6R2V0UHJvcChQUk9QSUQgcHJvcElELCBQUk9QVkFSSUFOVCAqdmFsdWUpDQorew0KKyAgaWYgKHByb3BJRCA9PSBrcGlkTmFtZSkNCisgIHsNCisgICAgQ09NX1RSWV9CRUdJTg0KKyAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcCA9IE5hbWUuUHRyKCk7DQorICAgIHByb3AuRGV0YWNoKHZhbHVlKTsNCisgICAgcmV0dXJuIFNfT0s7DQorICAgIENPTV9UUllfRU5EDQorICB9DQorICByZXR1cm4gQXJjLT5BcmNoaXZlLT5HZXRQcm9wZXJ0eShJbmRleEluQXJjLCBwcm9wSUQsIHZhbHVlKTsNCit9DQorDQorI2VuZGlmDQorDQorDQorI2lmZGVmIFNVUFBPUlRfTElOS1MNCisNCitzdGF0aWMgVVN0cmluZyBHZXREaXJQcmVmaXhPZihjb25zdCBVU3RyaW5nICZzcmMpDQorew0KKyAgVVN0cmluZyBzID0gc3JjOw0KKyAgaWYgKCFzLklzRW1wdHkoKSkNCisgIHsNCisgICAgaWYgKHMuQmFjaygpID09IFdDSEFSX1BBVEhfU0VQQVJBVE9SKQ0KKyAgICAgIHMuRGVsZXRlQmFjaygpOw0KKyAgICBpbnQgcG9zID0gcy5SZXZlcnNlRmluZChXQ0hBUl9QQVRIX1NFUEFSQVRPUik7DQorICAgIHMuRGVsZXRlRnJvbShwb3MgKyAxKTsNCisgIH0NCisgIHJldHVybiBzOw0KK30NCisNCitzdGF0aWMgYm9vbCBJc1NhZmVQYXRoKGNvbnN0IFVTdHJpbmcgJnBhdGgpDQorew0KKyAgVVN0cmluZ1ZlY3RvciBwYXJ0czsNCisgIFNwbGl0UGF0aFRvUGFydHMocGF0aCwgcGFydHMpOw0KKyAgaW50IGxldmVsID0gMDsNCisgIEZPUl9WRUNUT1IoaSwgcGFydHMpDQorICB7DQorICAgIGNvbnN0IFVTdHJpbmcgJnMgPSBwYXJ0c1tpXTsNCisgICAgaWYgKHMuSXNFbXB0eSgpKQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICBpZiAocyA9PSBMIi4iKQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICBpZiAocyA9PSBMIi4uIikNCisgICAgew0KKyAgICAgIGlmIChsZXZlbCA8PSAwKQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGxldmVsLS07DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAgIGxldmVsKys7DQorICB9DQorICByZXR1cm4gbGV2ZWwgPiAwOw0KK30NCisNCisjZW5kaWYNCisNCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2s6OkdldFN0cmVhbShVSW50MzIgaW5kZXgsIElTZXF1ZW50aWFsT3V0U3RyZWFtICoqb3V0U3RyZWFtLCBJbnQzMiBhc2tFeHRyYWN0TW9kZSkNCit7DQorICBDT01fVFJZX0JFR0lODQorDQorICAqb3V0U3RyZWFtID0gMDsNCisNCisgICNpZm5kZWYgX1NGWA0KKyAgaWYgKF9oYXNoU3RyZWFtKQ0KKyAgICBfaGFzaFN0cmVhbVNwZWMtPlJlbGVhc2VTdHJlYW0oKTsNCisgIF9oYXNoU3RyZWFtV2FzVXNlZCA9IGZhbHNlOw0KKyAgI2VuZGlmDQorDQorICBfb3V0RmlsZVN0cmVhbS5SZWxlYXNlKCk7DQorDQorICBfZW5jcnlwdGVkID0gZmFsc2U7DQorICBfaXNTcGxpdCA9IGZhbHNlOw0KKyAgX2lzQWx0U3RyZWFtID0gZmFsc2U7DQorICBfY3VyU2l6ZSA9IDA7DQorICBfY3VyU2l6ZURlZmluZWQgPSBmYWxzZTsNCisgIF9pbmRleCA9IGluZGV4Ow0KKw0KKyAgVVN0cmluZyBmdWxsUGF0aDsNCisNCisgIElJbkFyY2hpdmUgKmFyY2hpdmUgPSBfYXJjLT5BcmNoaXZlOw0KKyAgUklOT0soX2FyYy0+R2V0SXRlbVBhdGgoaW5kZXgsIGZ1bGxQYXRoKSk7DQorICBSSU5PSyhBcmNoaXZlX0lzSXRlbV9Gb2xkZXIoYXJjaGl2ZSwgaW5kZXgsIF9maS5Jc0RpcikpOw0KKw0KKyAgX2ZpbGVQYXRoID0gZnVsbFBhdGg7DQorDQorICB7DQorICAgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgICBSSU5PSyhhcmNoaXZlLT5HZXRQcm9wZXJ0eShpbmRleCwga3BpZFBvc2l0aW9uLCAmcHJvcCkpOw0KKyAgICBpZiAocHJvcC52dCAhPSBWVF9FTVBUWSkNCisgICAgew0KKyAgICAgIGlmIChwcm9wLnZ0ICE9IFZUX1VJOCkNCisgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgX3Bvc2l0aW9uID0gcHJvcC51aFZhbC5RdWFkUGFydDsNCisgICAgICBfaXNTcGxpdCA9IHRydWU7DQorICAgIH0NCisgIH0NCisNCisgICNpZmRlZiBTVVBQT1JUX0xJTktTDQorICANCisgIGJvb2wgaXNIYXJkTGluayA9IGZhbHNlOw0KKyAgYm9vbCBpc0p1bmN0aW9uID0gZmFsc2U7DQorICBib29sIGlzUmVsYXRpdmUgPSBmYWxzZTsNCisNCisgIFVTdHJpbmcgbGlua1BhdGg7DQorICAvLyBSSU5PSyhBcmNoaXZlX0dldEl0ZW1Cb29sUHJvcChhcmNoaXZlLCBpbmRleCwga3BpZElzSGFyZExpbmssIGlzSGFyZExpbmspKTsNCisgIC8vIGlmIChpc0hhcmRMaW5rKQ0KKyAgew0KKyAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgUklOT0soYXJjaGl2ZS0+R2V0UHJvcGVydHkoaW5kZXgsIGtwaWRIYXJkTGluaywgJnByb3ApKTsNCisgICAgaWYgKHByb3AudnQgPT0gVlRfQlNUUikNCisgICAgew0KKyAgICAgIGlzSGFyZExpbmsgPSB0cnVlOw0KKyAgICAgIGxpbmtQYXRoID0gcHJvcC5ic3RyVmFsOw0KKyAgICAgIGlzUmVsYXRpdmUgPSBmYWxzZTsgLy8gVEFSOiBoYXJkIGxpbmtzIGFyZSBmcm9tIHJvb3QgZm9sZGVyIG9mIGFyY2hpdmUNCisgICAgfQ0KKyAgICBlbHNlIGlmIChwcm9wLnZ0ID09IFZUX0VNUFRZKQ0KKyAgICB7DQorICAgICAgLy8gbGlua1BhdGguRW1wdHkoKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgcmV0dXJuIEVfRkFJTDsNCisgIH0NCisgIHsNCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgIFJJTk9LKGFyY2hpdmUtPkdldFByb3BlcnR5KGluZGV4LCBrcGlkU3ltTGluaywgJnByb3ApKTsNCisgICAgaWYgKHByb3AudnQgPT0gVlRfQlNUUikNCisgICAgew0KKyAgICAgIGlzSGFyZExpbmsgPSBmYWxzZTsNCisgICAgICBsaW5rUGF0aCA9IHByb3AuYnN0clZhbDsNCisgICAgICBpc1JlbGF0aXZlID0gdHJ1ZTsgLy8gVEFSOiBzeW1ib2xpYyBsaW5rcyBhcmUgcmVsYXRpdmUNCisgICAgfQ0KKyAgICBlbHNlIGlmIChwcm9wLnZ0ID09IFZUX0VNUFRZKQ0KKyAgICB7DQorICAgICAgLy8gbGlua1BhdGguRW1wdHkoKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgcmV0dXJuIEVfRkFJTDsNCisgIH0NCisNCisgIGJvb2wgaXNPa1JlcGFyc2UgPSBmYWxzZTsNCisNCisgIGlmIChsaW5rUGF0aC5Jc0VtcHR5KCkgJiYgX2FyYy0+R2V0UmF3UHJvcHMpDQorICB7DQorICAgIGNvbnN0IHZvaWQgKmRhdGE7DQorICAgIFVJbnQzMiBkYXRhU2l6ZTsNCisgICAgVUludDMyIHByb3BUeXBlOw0KKyAgICBfYXJjLT5HZXRSYXdQcm9wcy0+R2V0UmF3UHJvcChfaW5kZXgsIGtwaWROdFJlcGFyc2UsICZkYXRhLCAmZGF0YVNpemUsICZwcm9wVHlwZSk7DQorICAgIGlmIChkYXRhU2l6ZSAhPSAwKQ0KKyAgICB7DQorICAgICAgaWYgKHByb3BUeXBlICE9IE5Qcm9wRGF0YVR5cGU6OmtSYXcpDQorICAgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICAgIFVTdHJpbmcgczsNCisgICAgICBDUmVwYXJzZUF0dHIgcmVwYXJzZTsNCisgICAgICBpc09rUmVwYXJzZSA9IHJlcGFyc2UuUGFyc2UoKGNvbnN0IEJ5dGUgKilkYXRhLCBkYXRhU2l6ZSk7DQorICAgICAgaWYgKGlzT2tSZXBhcnNlKQ0KKyAgICAgIHsNCisgICAgICAgIGlzSGFyZExpbmsgPSBmYWxzZTsNCisgICAgICAgIGxpbmtQYXRoID0gcmVwYXJzZS5HZXRQYXRoKCk7DQorICAgICAgICBpc0p1bmN0aW9uID0gcmVwYXJzZS5Jc01vdW50UG9pbnQoKTsNCisgICAgICAgIGlzUmVsYXRpdmUgPSByZXBhcnNlLklzUmVsYXRpdmUoKTsNCisgICAgICAgICNpZm5kZWYgX1dJTjMyDQorICAgICAgICBsaW5rUGF0aC5SZXBsYWNlKFdDSEFSX1BBVEhfU0VQQVJBVE9SLCAnLycsICk7DQorICAgICAgICAjZW5kaWYNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIGlmICghbGlua1BhdGguSXNFbXB0eSgpKQ0KKyAgew0KKyAgICAjaWZkZWYgX1dJTjMyDQorICAgIGxpbmtQYXRoLlJlcGxhY2UoJy8nLCBXQ0hBUl9QQVRIX1NFUEFSQVRPUik7DQorICAgICNlbmRpZg0KKyAgICANCisgICAgZm9yICg7OykNCisgICAgLy8gd2hpbGUgKE5OYW1lOjpJc0Fic29sdXRlUGF0aChsaW5rUGF0aCkpDQorICAgIHsNCisgICAgICB1bnNpZ25lZCBuID0gTk5hbWU6OkdldFJvb3RQcmVmaXhTaXplKGxpbmtQYXRoKTsNCisgICAgICBpZiAobiA9PSAwKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgaXNSZWxhdGl2ZSA9IGZhbHNlOw0KKyAgICAgIGxpbmtQYXRoLkRlbGV0ZUZyb250YWwobik7DQorICAgIH0NCisgIH0NCisNCisgIGlmICghbGlua1BhdGguSXNFbXB0eSgpICYmICFpc1JlbGF0aXZlICYmIF9yZW1vdmVQYXRoUGFydHMuU2l6ZSgpICE9IDApDQorICB7DQorICAgIFVTdHJpbmdWZWN0b3IgcGF0aFBhcnRzOw0KKyAgICBTcGxpdFBhdGhUb1BhcnRzKGxpbmtQYXRoLCBwYXRoUGFydHMpOw0KKyAgICBib29sIGJhZFByZWZpeCA9IGZhbHNlOw0KKyAgICBGT1JfVkVDVE9SIChpLCBfcmVtb3ZlUGF0aFBhcnRzKQ0KKyAgICB7DQorICAgICAgaWYgKENvbXBhcmVGaWxlTmFtZXMoX3JlbW92ZVBhdGhQYXJ0c1tpXSwgcGF0aFBhcnRzW2ldKSAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgIGJhZFByZWZpeCA9IHRydWU7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiYWRQcmVmaXgpDQorICAgICAgcGF0aFBhcnRzLkRlbGV0ZUZyb250YWwoX3JlbW92ZVBhdGhQYXJ0cy5TaXplKCkpOw0KKyAgICBsaW5rUGF0aCA9IE1ha2VQYXRoTmFtZUZyb21QYXJ0cyhwYXRoUGFydHMpOw0KKyAgfQ0KKw0KKyAgI2VuZGlmDQorICANCisgIFJJTk9LKEFyY2hpdmVfR2V0SXRlbUJvb2xQcm9wKGFyY2hpdmUsIGluZGV4LCBrcGlkRW5jcnlwdGVkLCBfZW5jcnlwdGVkKSk7DQorDQorICBSSU5PSyhHZXRVbnBhY2tTaXplKCkpOw0KKw0KKyAgUklOT0soQXJjaGl2ZV9Jc0l0ZW1fQWx0U3RyZWFtKGFyY2hpdmUsIGluZGV4LCBfaXNBbHRTdHJlYW0pKTsNCisNCisgIGlmICghX250T3B0aW9ucy5BbHRTdHJlYW1zLlZhbCAmJiBfaXNBbHRTdHJlYW0pDQorICAgIHJldHVybiBTX09LOw0KKw0KKyAgaWYgKF93aWxkY2FyZENlbnNvcikNCisgIHsNCisgICAgaWYgKCFfd2lsZGNhcmRDZW5zb3ItPkNoZWNrUGF0aChfaXNBbHRTdHJlYW0sIGZ1bGxQYXRoLCAhX2ZpLklzRGlyKSkNCisgICAgICByZXR1cm4gU19PSzsNCisgIH0NCisNCisNCisgIFVTdHJpbmdWZWN0b3IgcGF0aFBhcnRzOw0KKw0KKyAgaWYgKF91c2VfYmFzZVBhcmVudEZvbGRlcl9tb2RlKQ0KKyAgew0KKyAgICBpbnQgYmFzZVBhcmVudCA9IF9iYXNlUGFyZW50Rm9sZGVyOw0KKyAgICBpZiAoX3BhdGhNb2RlID09IE5FeHRyYWN0OjpOUGF0aE1vZGU6OmtGdWxsUGF0aHMgfHwNCisgICAgICAgIF9wYXRoTW9kZSA9PSBORXh0cmFjdDo6TlBhdGhNb2RlOjprQWJzUGF0aHMpDQorICAgICAgYmFzZVBhcmVudCA9IC0xOw0KKyAgICBSSU5PSyhfYXJjLT5HZXRJdGVtUGF0aFRvUGFyZW50KGluZGV4LCBiYXNlUGFyZW50LCBwYXRoUGFydHMpKTsNCisgICAgaWYgKF9wYXRoTW9kZSA9PSBORXh0cmFjdDo6TlBhdGhNb2RlOjprTm9QYXRocyAmJiAhcGF0aFBhcnRzLklzRW1wdHkoKSkNCisgICAgICBwYXRoUGFydHMuRGVsZXRlRnJvbnRhbChwYXRoUGFydHMuU2l6ZSgpIC0gMSk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIFNwbGl0UGF0aFRvUGFydHMoZnVsbFBhdGgsIHBhdGhQYXJ0cyk7DQorICAgIA0KKyAgICBpZiAocGF0aFBhcnRzLklzRW1wdHkoKSkNCisgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICB1bnNpZ25lZCBudW1SZW1vdmVQYXRoUGFydHMgPSAwOw0KKyAgICANCisgICAgc3dpdGNoIChfcGF0aE1vZGUpDQorICAgIHsNCisgICAgICBjYXNlIE5FeHRyYWN0OjpOUGF0aE1vZGU6OmtDdXJQYXRoczoNCisgICAgICB7DQorICAgICAgICBib29sIGJhZFByZWZpeCA9IGZhbHNlOw0KKyAgICAgICAgaWYgKHBhdGhQYXJ0cy5TaXplKCkgPD0gX3JlbW92ZVBhdGhQYXJ0cy5TaXplKCkpDQorICAgICAgICAgIGJhZFByZWZpeCA9IHRydWU7DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIEZPUl9WRUNUT1IgKGksIF9yZW1vdmVQYXRoUGFydHMpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoIV9yZW1vdmVQYXRoUGFydHNbaV0uSXNFcXVhbFRvTm9DYXNlKHBhdGhQYXJ0c1tpXSkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgYmFkUHJlZml4ID0gdHJ1ZTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJhZFByZWZpeCkNCisgICAgICAgIHsNCisgICAgICAgICAgaWYgKGFza0V4dHJhY3RNb2RlID09IE5BcmNoaXZlOjpORXh0cmFjdDo6TkFza01vZGU6OmtFeHRyYWN0ICYmICFfdGVzdE1vZGUpDQorICAgICAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgICAgbnVtUmVtb3ZlUGF0aFBhcnRzID0gX3JlbW92ZVBhdGhQYXJ0cy5TaXplKCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBORXh0cmFjdDo6TlBhdGhNb2RlOjprTm9QYXRoczoNCisgICAgICB7DQorICAgICAgICBudW1SZW1vdmVQYXRoUGFydHMgPSBwYXRoUGFydHMuU2l6ZSgpIC0gMTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICAvKg0KKyAgICAgIGNhc2UgTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6a0Z1bGxQYXRoczoNCisgICAgICBjYXNlIE5FeHRyYWN0OjpOUGF0aE1vZGU6OmtBYnNQYXRoczoNCisgICAgICAgIGJyZWFrOw0KKyAgICAgICovDQorICAgIH0NCisgICAgDQorICAgIHBhdGhQYXJ0cy5EZWxldGVGcm9udGFsKG51bVJlbW92ZVBhdGhQYXJ0cyk7DQorICB9DQorDQorICAjaWZuZGVmIF9TRlgNCisNCisgIGlmIChFeHRyYWN0VG9TdHJlYW1DYWxsYmFjaykNCisgIHsNCisgICAgaWYgKCFHZXRQcm9wKQ0KKyAgICB7DQorICAgICAgR2V0UHJvcF9TcGVjID0gbmV3IENHZXRQcm9wOw0KKyAgICAgIEdldFByb3AgPSBHZXRQcm9wX1NwZWM7DQorICAgIH0NCisgICAgR2V0UHJvcF9TcGVjLT5BcmMgPSBfYXJjOw0KKyAgICBHZXRQcm9wX1NwZWMtPkluZGV4SW5BcmMgPSBpbmRleDsNCisgICAgR2V0UHJvcF9TcGVjLT5OYW1lID0gTWFrZVBhdGhOYW1lRnJvbVBhcnRzKHBhdGhQYXJ0cyk7DQorDQorICAgIHJldHVybiBFeHRyYWN0VG9TdHJlYW1DYWxsYmFjay0+R2V0U3RyZWFtNyhHZXRQcm9wX1NwZWMtPk5hbWUsIF9maS5Jc0Rpciwgb3V0U3RyZWFtLCBhc2tFeHRyYWN0TW9kZSwgR2V0UHJvcCk7DQorICB9DQorDQorICAjZW5kaWYNCisNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gb3V0U3RyZWFtTG9jOw0KKw0KK2lmIChhc2tFeHRyYWN0TW9kZSA9PSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5Bc2tNb2RlOjprRXh0cmFjdCAmJiAhX3Rlc3RNb2RlKQ0KK3sNCisgIGlmIChfc3RkT3V0TW9kZSkNCisgIHsNCisgICAgb3V0U3RyZWFtTG9jID0gbmV3IENTdGRPdXRGaWxlU3RyZWFtOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICB7DQorICAgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgICAgUklOT0soYXJjaGl2ZS0+R2V0UHJvcGVydHkoaW5kZXgsIGtwaWRBdHRyaWIsICZwcm9wKSk7DQorICAgICAgaWYgKHByb3AudnQgPT0gVlRfVUk0KQ0KKyAgICAgIHsNCisgICAgICAgIF9maS5BdHRyaWIgPSBwcm9wLnVsVmFsOw0KKyAgICAgICAgX2ZpLkF0dHJpYkRlZmluZWQgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICBlbHNlIGlmIChwcm9wLnZ0ID09IFZUX0VNUFRZKQ0KKyAgICAgICAgX2ZpLkF0dHJpYkRlZmluZWQgPSBmYWxzZTsNCisgICAgICBlbHNlDQorICAgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICB9DQorDQorICAgIFJJTk9LKEdldFRpbWUoaW5kZXgsIGtwaWRDVGltZSwgX2ZpLkNUaW1lLCBfZmkuQ1RpbWVEZWZpbmVkKSk7DQorICAgIFJJTk9LKEdldFRpbWUoaW5kZXgsIGtwaWRBVGltZSwgX2ZpLkFUaW1lLCBfZmkuQVRpbWVEZWZpbmVkKSk7DQorICAgIFJJTk9LKEdldFRpbWUoaW5kZXgsIGtwaWRNVGltZSwgX2ZpLk1UaW1lLCBfZmkuTVRpbWVEZWZpbmVkKSk7DQorDQorICAgIGJvb2wgaXNBbnRpID0gZmFsc2U7DQorICAgIFJJTk9LKF9hcmMtPklzSXRlbUFudGkoaW5kZXgsIGlzQW50aSkpOw0KKw0KKyAgICBib29sIHJlcGxhY2UgPSBfaXNBbHRTdHJlYW0gPw0KKyAgICAgICAgX250T3B0aW9ucy5SZXBsYWNlQ29sb25Gb3JBbHRTdHJlYW0gOg0KKyAgICAgICAgIV9udE9wdGlvbnMuV3JpdGVUb0FsdFN0cmVhbUlmQ29sb247DQorDQorICAgIGlmIChfcGF0aE1vZGUgIT0gTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6a0Fic1BhdGhzKQ0KKyAgICAgIE1ha2VDb3JyZWN0UGF0aChfZGlyZWN0b3J5UGF0aC5Jc0VtcHR5KCksIHBhdGhQYXJ0cywgcmVwbGFjZSk7DQorICAgIENvcnJlY3RfSWZFbXB0eUxhc3RQYXJ0KHBhdGhQYXJ0cyk7DQorICAgIFVTdHJpbmcgcHJvY2Vzc2VkUGF0aCA9IE1ha2VQYXRoTmFtZUZyb21QYXJ0cyhwYXRoUGFydHMpOw0KKyAgICANCisgICAgaWYgKCFpc0FudGkpDQorICAgIHsNCisgICAgICBpZiAoIV9maS5Jc0RpcikNCisgICAgICB7DQorICAgICAgICBpZiAoIXBhdGhQYXJ0cy5Jc0VtcHR5KCkpDQorICAgICAgICAgIHBhdGhQYXJ0cy5EZWxldGVCYWNrKCk7DQorICAgICAgfQ0KKyAgICANCisgICAgICBpZiAoIXBhdGhQYXJ0cy5Jc0VtcHR5KCkpDQorICAgICAgew0KKyAgICAgICAgRlN0cmluZyBmdWxsUGF0aE5ldzsNCisgICAgICAgIENyZWF0ZUNvbXBsZXhEaXJlY3RvcnkocGF0aFBhcnRzLCBmdWxsUGF0aE5ldyk7DQorICAgICAgICBpZiAoX2ZpLklzRGlyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBfZXh0cmFjdGVkRm9sZGVyUGF0aHMuQWRkKGZ1bGxQYXRoTmV3KTsNCisgICAgICAgICAgX2V4dHJhY3RlZEZvbGRlckluZGljZXMuQWRkKGluZGV4KTsNCisgICAgICAgICAgU2V0RGlyVGltZShmdWxsUGF0aE5ldywNCisgICAgICAgICAgICAoV3JpdGVDVGltZSAmJiBfZmkuQ1RpbWVEZWZpbmVkKSA/ICZfZmkuQ1RpbWUgOiBOVUxMLA0KKyAgICAgICAgICAgIChXcml0ZUFUaW1lICYmIF9maS5BVGltZURlZmluZWQpID8gJl9maS5BVGltZSA6IE5VTEwsDQorICAgICAgICAgICAgKFdyaXRlTVRpbWUgJiYgX2ZpLk1UaW1lRGVmaW5lZCkgPyAmX2ZpLk1UaW1lIDogKF9hcmMtPk1UaW1lRGVmaW5lZCA/ICZfYXJjLT5NVGltZSA6IE5VTEwpKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisNCisNCisgICAgRlN0cmluZyBmdWxsUHJvY2Vzc2VkUGF0aCA9IHVzMmZzKHByb2Nlc3NlZFBhdGgpOw0KKyAgICBpZiAoX3BhdGhNb2RlICE9IE5FeHRyYWN0OjpOUGF0aE1vZGU6OmtBYnNQYXRocyB8fA0KKyAgICAgICAgIU5OYW1lOjpJc0Fic29sdXRlUGF0aChwcm9jZXNzZWRQYXRoKSkNCisgICAgICBmdWxsUHJvY2Vzc2VkUGF0aCA9IF9kaXJlY3RvcnlQYXRoICsgZnVsbFByb2Nlc3NlZFBhdGg7DQorDQorICAgIGlmIChfZmkuSXNEaXIpDQorICAgIHsNCisgICAgICBfZGlza0ZpbGVQYXRoID0gZnVsbFByb2Nlc3NlZFBhdGg7DQorICAgICAgaWYgKGlzQW50aSkNCisgICAgICAgIFJlbW92ZURpcihfZGlza0ZpbGVQYXRoKTsNCisgICAgICAjaWZkZWYgU1VQUE9SVF9MSU5LUw0KKyAgICAgIGlmIChsaW5rUGF0aC5Jc0VtcHR5KCkpDQorICAgICAgI2VuZGlmDQorICAgICAgICByZXR1cm4gU19PSzsNCisgICAgfQ0KKyAgICBlbHNlIGlmICghX2lzU3BsaXQpDQorICAgIHsNCisgICAgTkZpbmQ6OkNGaWxlSW5mbyBmaWxlSW5mbzsNCisgICAgaWYgKGZpbGVJbmZvLkZpbmQoZnVsbFByb2Nlc3NlZFBhdGgpKQ0KKyAgICB7DQorICAgICAgc3dpdGNoIChfb3ZlcndyaXRlTW9kZSkNCisgICAgICB7DQorICAgICAgICBjYXNlIE5FeHRyYWN0OjpOT3ZlcndyaXRlTW9kZTo6a1NraXA6DQorICAgICAgICAgIHJldHVybiBTX09LOw0KKyAgICAgICAgY2FzZSBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OmtBc2s6DQorICAgICAgICB7DQorICAgICAgICAgIGludCBzbGFzaFBvcyA9IGZ1bGxQcm9jZXNzZWRQYXRoLlJldmVyc2VGaW5kKEZURVhUKCcvJykpOw0KKyAgICAgICAgICAjaWZkZWYgX1dJTjMyDQorICAgICAgICAgIGludCBzbGFzaDFQb3MgPSBmdWxsUHJvY2Vzc2VkUGF0aC5SZXZlcnNlRmluZChGVEVYVCgnXFwnKSk7DQorICAgICAgICAgIHNsYXNoUG9zID0gTXlNYXgoc2xhc2hQb3MsIHNsYXNoMVBvcyk7DQorICAgICAgICAgICNlbmRpZg0KKyAgICAgICAgICBGU3RyaW5nIHJlYWxGdWxsUHJvY2Vzc2VkUGF0aCA9IGZ1bGxQcm9jZXNzZWRQYXRoLkxlZnQoc2xhc2hQb3MgKyAxKSArIGZpbGVJbmZvLk5hbWU7DQorDQorICAgICAgICAgIEludDMyIG92ZXJ3aXRlUmVzdWx0Ow0KKyAgICAgICAgICBSSU5PSyhfZXh0cmFjdENhbGxiYWNrMi0+QXNrT3ZlcndyaXRlKA0KKyAgICAgICAgICAgICAgZnMydXMocmVhbEZ1bGxQcm9jZXNzZWRQYXRoKSwgJmZpbGVJbmZvLk1UaW1lLCAmZmlsZUluZm8uU2l6ZSwgZnVsbFBhdGgsDQorICAgICAgICAgICAgICBfZmkuTVRpbWVEZWZpbmVkID8gJl9maS5NVGltZSA6IE5VTEwsDQorICAgICAgICAgICAgICBfY3VyU2l6ZURlZmluZWQgPyAmX2N1clNpemUgOiBOVUxMLA0KKyAgICAgICAgICAgICAgJm92ZXJ3aXRlUmVzdWx0KSkNCisNCisgICAgICAgICAgc3dpdGNoIChvdmVyd2l0ZVJlc3VsdCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGNhc2UgTk92ZXJ3cml0ZUFuc3dlcjo6a0NhbmNlbDogcmV0dXJuIEVfQUJPUlQ7DQorICAgICAgICAgICAgY2FzZSBOT3ZlcndyaXRlQW5zd2VyOjprTm86IHJldHVybiBTX09LOw0KKyAgICAgICAgICAgIGNhc2UgTk92ZXJ3cml0ZUFuc3dlcjo6a05vVG9BbGw6IF9vdmVyd3JpdGVNb2RlID0gTkV4dHJhY3Q6Ok5PdmVyd3JpdGVNb2RlOjprU2tpcDsgcmV0dXJuIFNfT0s7DQorICAgICAgICAgICAgY2FzZSBOT3ZlcndyaXRlQW5zd2VyOjprWWVzOiBicmVhazsNCisgICAgICAgICAgICBjYXNlIE5PdmVyd3JpdGVBbnN3ZXI6OmtZZXNUb0FsbDogX292ZXJ3cml0ZU1vZGUgPSBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OmtPdmVyd3JpdGU7IGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgTk92ZXJ3cml0ZUFuc3dlcjo6a0F1dG9SZW5hbWU6IF9vdmVyd3JpdGVNb2RlID0gTkV4dHJhY3Q6Ok5PdmVyd3JpdGVNb2RlOjprUmVuYW1lOyBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoX292ZXJ3cml0ZU1vZGUgPT0gTkV4dHJhY3Q6Ok5PdmVyd3JpdGVNb2RlOjprUmVuYW1lKQ0KKyAgICAgIHsNCisgICAgICAgIGlmICghQXV0b1JlbmFtZVBhdGgoZnVsbFByb2Nlc3NlZFBhdGgpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBSSU5PSyhTZW5kTWVzc2FnZUVycm9yKGtDYW50QXV0b1JlbmFtZSwgZnVsbFByb2Nlc3NlZFBhdGgpKTsNCisgICAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZWxzZSBpZiAoX292ZXJ3cml0ZU1vZGUgPT0gTkV4dHJhY3Q6Ok5PdmVyd3JpdGVNb2RlOjprUmVuYW1lRXhpc3RpbmcpDQorICAgICAgew0KKyAgICAgICAgRlN0cmluZyBleGlzdFBhdGggPSBmdWxsUHJvY2Vzc2VkUGF0aDsNCisgICAgICAgIGlmICghQXV0b1JlbmFtZVBhdGgoZXhpc3RQYXRoKSkNCisgICAgICAgIHsNCisgICAgICAgICAgUklOT0soU2VuZE1lc3NhZ2VFcnJvcihrQ2FudEF1dG9SZW5hbWUsIGZ1bGxQcm9jZXNzZWRQYXRoKSk7DQorICAgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgICB9DQorICAgICAgICAvLyBNeU1vdmVGaWxlIGNhbiByYW5hbWUgZm9sZGVycy4gU28gaXQncyBPSyB0byB1c2UgaXQgZm9sZGVycyB0b28NCisgICAgICAgIGlmICghTXlNb3ZlRmlsZShmdWxsUHJvY2Vzc2VkUGF0aCwgZXhpc3RQYXRoKSkNCisgICAgICAgIHsNCisgICAgICAgICAgUklOT0soU2VuZE1lc3NhZ2VFcnJvcihrQ2FudFJlbmFtZUZpbGUsIGZ1bGxQcm9jZXNzZWRQYXRoKSk7DQorICAgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBpZiAoZmlsZUluZm8uSXNEaXIoKSkNCisgICAgICAgIHsNCisgICAgICAgICAgLy8gZG8gd2UgbmVlZCB0byBkZWxldGUgYWxsIGZpbGVzIGluIGZvbGRlcj8NCisgICAgICAgICAgaWYgKCFSZW1vdmVEaXIoZnVsbFByb2Nlc3NlZFBhdGgpKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgUklOT0soU2VuZE1lc3NhZ2VFcnJvcihrQ2FudERlbGV0ZU91dHB1dERpciwgZnVsbFByb2Nlc3NlZFBhdGgpKTsNCisgICAgICAgICAgICByZXR1cm4gU19PSzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSBpZiAoIURlbGV0ZUZpbGVBbHdheXMoZnVsbFByb2Nlc3NlZFBhdGgpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBSSU5PSyhTZW5kTWVzc2FnZUVycm9yKGtDYW50RGVsZXRlT3V0cHV0RmlsZSwgZnVsbFByb2Nlc3NlZFBhdGgpKTsNCisgICAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgICAgIC8vIHJldHVybiBFX0ZBSUw7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIH0NCisgICAgX2Rpc2tGaWxlUGF0aCA9IGZ1bGxQcm9jZXNzZWRQYXRoOw0KKyAgICANCisNCisgICAgaWYgKCFpc0FudGkpDQorICAgIHsNCisgICAgICAjaWZkZWYgU1VQUE9SVF9MSU5LUw0KKw0KKyAgICAgIGlmICghbGlua1BhdGguSXNFbXB0eSgpKQ0KKyAgICAgIHsNCisgICAgICAgICNpZm5kZWYgVU5ERVJfQ0UNCisNCisgICAgICAgIFVTdHJpbmcgcmVsYXRQYXRoOw0KKyAgICAgICAgaWYgKGlzUmVsYXRpdmUpDQorICAgICAgICAgIHJlbGF0UGF0aCA9IEdldERpclByZWZpeE9mKF9maWxlUGF0aCk7DQorICAgICAgICByZWxhdFBhdGggKz0gbGlua1BhdGg7DQorICAgICAgICANCisgICAgICAgIGlmICghSXNTYWZlUGF0aChyZWxhdFBhdGgpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBSSU5PSyhTZW5kTWVzc2FnZUVycm9yKCJEYW5nZXJvdXMgbGluayBwYXRoIHdhcyBpZ25vcmVkIiwgdXMyZnMocmVsYXRQYXRoKSkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICBGU3RyaW5nIGV4aXN0UGF0aDsNCisgICAgICAgICAgaWYgKGlzSGFyZExpbmsgfHwgIWlzUmVsYXRpdmUpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoIU5OYW1lOjpHZXRGdWxsUGF0aChfZGlyZWN0b3J5UGF0aEZ1bGwsIHVzMmZzKHJlbGF0UGF0aCksIGV4aXN0UGF0aCkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgUklOT0soU2VuZE1lc3NhZ2VFcnJvcigiSW5jb3JyZWN0IHBhdGgiLCB1czJmcyhyZWxhdFBhdGgpKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIGVsc2UNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGV4aXN0UGF0aCA9IHVzMmZzKGxpbmtQYXRoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICANCisgICAgICAgICAgaWYgKCFleGlzdFBhdGguSXNFbXB0eSgpKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGlzSGFyZExpbmspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgaWYgKCFNeUNyZWF0ZUhhcmRMaW5rKGZ1bGxQcm9jZXNzZWRQYXRoLCBleGlzdFBhdGgpKQ0KKyAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBSSU5PSyhTZW5kTWVzc2FnZUVycm9yMigiQ2FuIG5vdCBjcmVhdGUgaGFyZCBsaW5rIiwgZnVsbFByb2Nlc3NlZFBhdGgsIGV4aXN0UGF0aCkpOw0KKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gU19PSzsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAoX250T3B0aW9ucy5TeW1MaW5rcy5WYWwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgLy8gYm9vbCBpc1N5bUxpbmsgPSB0cnVlOyAvLyA9IGZhbHNlIGZvciBqdW5jdGlvbg0KKyAgICAgICAgICAgICAgaWYgKF9maS5Jc0RpciAmJiAhaXNSZWxhdGl2ZSkNCisgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gaWYgaXQncyBiZWZvcmUgVmlzdGEgd2UgdXNlIEp1bmN0aW9uIFBvaW50DQorICAgICAgICAgICAgICAgIC8vIGlzSnVuY3Rpb24gPSB0cnVlOw0KKyAgICAgICAgICAgICAgICAvLyBjb252ZXJ0VG9BYnMgPSB0cnVlOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICBDQnl0ZUJ1ZmZlciBkYXRhOw0KKyAgICAgICAgICAgICAgaWYgKEZpbGxMaW5rRGF0YShkYXRhLCBmczJ1cyhleGlzdFBhdGgpLCAhaXNKdW5jdGlvbikpDQorICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIENSZXBhcnNlQXR0ciBhdHRyOw0KKyAgICAgICAgICAgICAgICBpZiAoIWF0dHIuUGFyc2UoZGF0YSwgZGF0YS5TaXplKCkpKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgcmV0dXJuIEVfRkFJTDsgLy8gIkludGVybmFsIGNvbnZlcnNpb24gZXJyb3IiOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICBpZiAoIU5GaWxlOjpOSU86OlNldFJlcGFyc2VEYXRhKGZ1bGxQcm9jZXNzZWRQYXRoLCBfZmkuSXNEaXIsIGRhdGEsIChEV09SRClkYXRhLlNpemUoKSkpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBSSU5PSyhTZW5kTWVzc2FnZUVycm9yKCJDYW4gbm90IHNldCByZXBhcnNlIGRhdGEiLCBmdWxsUHJvY2Vzc2VkUGF0aCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgICNlbmRpZg0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgI2VuZGlmIC8vIFNVUFBPUlRfTElOS1MNCisgICAgICB7DQorICAgICAgICBib29sIG5lZWRXcml0ZUZpbGUgPSB0cnVlOw0KKyAgICAgICAgDQorICAgICAgICAjaWZkZWYgU1VQUE9SVF9MSU5LUw0KKyAgICAgICAgaWYgKCFfaGFyZExpbmtzLklEcy5Jc0VtcHR5KCkpDQorICAgICAgICB7DQorICAgICAgICAgIENIYXJkTGlua05vZGUgaDsNCisgICAgICAgICAgYm9vbCBkZWZpbmVkOw0KKyAgICAgICAgICBSSU5PSyhBcmNoaXZlX0dldF9IYXJkTGlua05vZGUoYXJjaGl2ZSwgaW5kZXgsIGgsIGRlZmluZWQpKTsNCisgICAgICAgICAgaWYgKGRlZmluZWQpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICBpbnQgbGlua0luZGV4ID0gX2hhcmRMaW5rcy5JRHMuRmluZEluU29ydGVkMihoKTsNCisgICAgICAgICAgICAgIGlmIChsaW5rSW5kZXggPj0gMCkNCisgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRlN0cmluZyAmaGwgPSBfaGFyZExpbmtzLkxpbmtzW2xpbmtJbmRleF07DQorICAgICAgICAgICAgICAgIGlmIChobC5Jc0VtcHR5KCkpDQorICAgICAgICAgICAgICAgICAgaGwgPSBmdWxsUHJvY2Vzc2VkUGF0aDsNCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgaWYgKCFNeUNyZWF0ZUhhcmRMaW5rKGZ1bGxQcm9jZXNzZWRQYXRoLCBobCkpDQorICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgUklOT0soU2VuZE1lc3NhZ2VFcnJvcjIoIkNhbiBub3QgY3JlYXRlIGhhcmQgbGluayIsIGZ1bGxQcm9jZXNzZWRQYXRoLCBobCkpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgIG5lZWRXcml0ZUZpbGUgPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZGlmDQorICAgICAgICANCisgICAgICAgIGlmIChuZWVkV3JpdGVGaWxlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBfb3V0RmlsZVN0cmVhbVNwZWMgPSBuZXcgQ091dEZpbGVTdHJlYW07DQorICAgICAgICAgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gb3V0U3RyZWFtTG9jKF9vdXRGaWxlU3RyZWFtU3BlYyk7DQorICAgICAgICAgIGlmICghX291dEZpbGVTdHJlYW1TcGVjLT5PcGVuKGZ1bGxQcm9jZXNzZWRQYXRoLCBfaXNTcGxpdCA/IE9QRU5fQUxXQVlTOiBDUkVBVEVfQUxXQVlTKSkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIC8vIGlmICg6OkdldExhc3RFcnJvcigpICE9IEVSUk9SX0ZJTEVfRVhJU1RTIHx8ICFpc1NwbGl0KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIFJJTk9LKFNlbmRNZXNzYWdlRXJyb3IoIkNhbiBub3Qgb3BlbiBvdXRwdXQgZmlsZSAiLCBmdWxsUHJvY2Vzc2VkUGF0aCkpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChfaXNTcGxpdCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIFJJTk9LKF9vdXRGaWxlU3RyZWFtU3BlYy0+U2VlayhfcG9zaXRpb24sIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCkpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIF9vdXRGaWxlU3RyZWFtID0gb3V0U3RyZWFtTG9jOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgb3V0U3RyZWFtTG9jID0gX291dEZpbGVTdHJlYW07DQorICB9DQorfQ0KKw0KKyAgI2lmbmRlZiBfU0ZYDQorDQorICBpZiAoX2hhc2hTdHJlYW0pDQorICB7DQorICAgIGlmIChhc2tFeHRyYWN0TW9kZSA9PSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5Bc2tNb2RlOjprRXh0cmFjdCB8fA0KKyAgICAgICAgYXNrRXh0cmFjdE1vZGUgPT0gTkFyY2hpdmU6Ok5FeHRyYWN0OjpOQXNrTW9kZTo6a1Rlc3QpDQorICAgIHsNCisgICAgICBfaGFzaFN0cmVhbVNwZWMtPlNldFN0cmVhbShvdXRTdHJlYW1Mb2MpOw0KKyAgICAgIG91dFN0cmVhbUxvYyA9IF9oYXNoU3RyZWFtOw0KKyAgICAgIF9oYXNoU3RyZWFtU3BlYy0+SW5pdCh0cnVlKTsNCisgICAgICBfaGFzaFN0cmVhbVdhc1VzZWQgPSB0cnVlOw0KKyAgICB9DQorICB9DQorDQorICAjZW5kaWYNCisNCisgIGlmIChvdXRTdHJlYW1Mb2MpDQorICAgICpvdXRTdHJlYW0gPSBvdXRTdHJlYW1Mb2MuRGV0YWNoKCk7DQorICByZXR1cm4gU19PSzsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZUV4dHJhY3RDYWxsYmFjazo6UHJlcGFyZU9wZXJhdGlvbihJbnQzMiBhc2tFeHRyYWN0TW9kZSkNCit7DQorICBDT01fVFJZX0JFR0lODQorDQorICAjaWZuZGVmIF9TRlgNCisgIGlmIChFeHRyYWN0VG9TdHJlYW1DYWxsYmFjaykNCisgICAgcmV0dXJuIEV4dHJhY3RUb1N0cmVhbUNhbGxiYWNrLT5QcmVwYXJlT3BlcmF0aW9uNyhhc2tFeHRyYWN0TW9kZSk7DQorICAjZW5kaWYNCisgIA0KKyAgX2V4dHJhY3RNb2RlID0gZmFsc2U7DQorICBzd2l0Y2ggKGFza0V4dHJhY3RNb2RlKQ0KKyAgew0KKyAgICBjYXNlIE5BcmNoaXZlOjpORXh0cmFjdDo6TkFza01vZGU6OmtFeHRyYWN0Og0KKyAgICAgIGlmIChfdGVzdE1vZGUpDQorICAgICAgICBhc2tFeHRyYWN0TW9kZSA9IE5BcmNoaXZlOjpORXh0cmFjdDo6TkFza01vZGU6OmtUZXN0Ow0KKyAgICAgIGVsc2UNCisgICAgICAgIF9leHRyYWN0TW9kZSA9IHRydWU7DQorICAgICAgYnJlYWs7DQorICB9Ow0KKyAgcmV0dXJuIF9leHRyYWN0Q2FsbGJhY2syLT5QcmVwYXJlT3BlcmF0aW9uKF9maWxlUGF0aCwgX2ZpLklzRGlyLA0KKyAgICAgIGFza0V4dHJhY3RNb2RlLCBfaXNTcGxpdCA/ICZfcG9zaXRpb246IDApOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlRXh0cmFjdENhbGxiYWNrOjpTZXRPcGVyYXRpb25SZXN1bHQoSW50MzIgb3BlcmF0aW9uUmVzdWx0KQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisNCisgICNpZm5kZWYgX1NGWA0KKyAgaWYgKEV4dHJhY3RUb1N0cmVhbUNhbGxiYWNrKQ0KKyAgICByZXR1cm4gRXh0cmFjdFRvU3RyZWFtQ2FsbGJhY2stPlNldE9wZXJhdGlvblJlc3VsdDcob3BlcmF0aW9uUmVzdWx0LCBfZW5jcnlwdGVkKTsNCisgICNlbmRpZg0KKw0KKyAgI2lmbmRlZiBfU0ZYDQorDQorICBpZiAoX2hhc2hTdHJlYW1XYXNVc2VkKQ0KKyAgew0KKyAgICBfaGFzaFN0cmVhbVNwZWMtPl9oYXNoLT5GaW5hbChfZmkuSXNEaXIsIF9pc0FsdFN0cmVhbSwgX2ZpbGVQYXRoKTsNCisgICAgX2N1clNpemUgPSBfaGFzaFN0cmVhbVNwZWMtPkdldFNpemUoKTsNCisgICAgX2N1clNpemVEZWZpbmVkID0gdHJ1ZTsNCisgICAgX2hhc2hTdHJlYW1TcGVjLT5SZWxlYXNlU3RyZWFtKCk7DQorICAgIF9oYXNoU3RyZWFtV2FzVXNlZCA9IGZhbHNlOw0KKyAgfQ0KKw0KKyAgI2VuZGlmDQorDQorICBpZiAoX291dEZpbGVTdHJlYW0pDQorICB7DQorICAgIF9vdXRGaWxlU3RyZWFtU3BlYy0+U2V0VGltZSgNCisgICAgICAgIChXcml0ZUNUaW1lICYmIF9maS5DVGltZURlZmluZWQpID8gJl9maS5DVGltZSA6IE5VTEwsDQorICAgICAgICAoV3JpdGVBVGltZSAmJiBfZmkuQVRpbWVEZWZpbmVkKSA/ICZfZmkuQVRpbWUgOiBOVUxMLA0KKyAgICAgICAgKFdyaXRlTVRpbWUgJiYgX2ZpLk1UaW1lRGVmaW5lZCkgPyAmX2ZpLk1UaW1lIDogKF9hcmMtPk1UaW1lRGVmaW5lZCA/ICZfYXJjLT5NVGltZSA6IE5VTEwpKTsNCisgICAgX2N1clNpemUgPSBfb3V0RmlsZVN0cmVhbVNwZWMtPlByb2Nlc3NlZFNpemU7DQorICAgIF9jdXJTaXplRGVmaW5lZCA9IHRydWU7DQorICAgIFJJTk9LKF9vdXRGaWxlU3RyZWFtU3BlYy0+Q2xvc2UoKSk7DQorICAgIF9vdXRGaWxlU3RyZWFtLlJlbGVhc2UoKTsNCisgIH0NCisgIA0KKyAgI2lmZGVmIF9VU0VfU0VDVVJJVFlfQ09ERQ0KKyAgaWYgKF9udE9wdGlvbnMuTnRTZWN1cml0eS5WYWwgJiYgX2FyYy0+R2V0UmF3UHJvcHMpDQorICB7DQorICAgIGNvbnN0IHZvaWQgKmRhdGE7DQorICAgIFVJbnQzMiBkYXRhU2l6ZTsNCisgICAgVUludDMyIHByb3BUeXBlOw0KKyAgICBfYXJjLT5HZXRSYXdQcm9wcy0+R2V0UmF3UHJvcChfaW5kZXgsIGtwaWROdFNlY3VyZSwgJmRhdGEsICZkYXRhU2l6ZSwgJnByb3BUeXBlKTsNCisgICAgaWYgKGRhdGFTaXplICE9IDApDQorICAgIHsNCisgICAgICBpZiAocHJvcFR5cGUgIT0gTlByb3BEYXRhVHlwZTo6a1JhdykNCisgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgaWYgKENoZWNrTnRTZWN1cmUoKGNvbnN0IEJ5dGUgKilkYXRhLCBkYXRhU2l6ZSkpDQorICAgICAgew0KKyAgICAgICAgU0VDVVJJVFlfSU5GT1JNQVRJT04gc2VjdXJJbmZvID0gREFDTF9TRUNVUklUWV9JTkZPUk1BVElPTiB8IEdST1VQX1NFQ1VSSVRZX0lORk9STUFUSU9OIHwgT1dORVJfU0VDVVJJVFlfSU5GT1JNQVRJT047DQorICAgICAgICBpZiAoX3NhY2xFbmFibGVkKQ0KKyAgICAgICAgICBzZWN1ckluZm8gfD0gU0FDTF9TRUNVUklUWV9JTkZPUk1BVElPTjsNCisgICAgICAgIDo6U2V0RmlsZVNlY3VyaXR5VyhmczJ1cyhfZGlza0ZpbGVQYXRoKSwgc2VjdXJJbmZvLCAoUFNFQ1VSSVRZX0RFU0NSSVBUT1IpKHZvaWQgKilkYXRhKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgICNlbmRpZg0KKw0KKyAgaWYgKCFfY3VyU2l6ZURlZmluZWQpDQorICAgIEdldFVucGFja1NpemUoKTsNCisgIGlmIChfY3VyU2l6ZURlZmluZWQpDQorICB7DQorICAgIGlmIChfaXNBbHRTdHJlYW0pDQorICAgICAgQWx0U3RyZWFtc19VbnBhY2tTaXplICs9IF9jdXJTaXplOw0KKyAgICBlbHNlDQorICAgICAgVW5wYWNrU2l6ZSArPSBfY3VyU2l6ZTsNCisgIH0NCisgICAgDQorICBpZiAoX2ZpLklzRGlyKQ0KKyAgICBOdW1Gb2xkZXJzKys7DQorICBlbHNlIGlmIChfaXNBbHRTdHJlYW0pDQorICAgIE51bUFsdFN0cmVhbXMrKzsNCisgIGVsc2UNCisgICAgTnVtRmlsZXMrKzsNCisNCisgIGlmIChfZXh0cmFjdE1vZGUgJiYgX2ZpLkF0dHJpYkRlZmluZWQpDQorICAgIFNldEZpbGVBdHRyaWIoX2Rpc2tGaWxlUGF0aCwgX2ZpLkF0dHJpYik7DQorICBSSU5PSyhfZXh0cmFjdENhbGxiYWNrMi0+U2V0T3BlcmF0aW9uUmVzdWx0KG9wZXJhdGlvblJlc3VsdCwgX2VuY3J5cHRlZCkpOw0KKyAgcmV0dXJuIFNfT0s7DQorICBDT01fVFJZX0VORA0KK30NCisNCisvKg0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZUV4dHJhY3RDYWxsYmFjazo6R2V0SW5TdHJlYW0oDQorICAgIGNvbnN0IHdjaGFyX3QgKm5hbWUsIElTZXF1ZW50aWFsSW5TdHJlYW0gKippblN0cmVhbSkNCit7DQorICBDT01fVFJZX0JFR0lODQorICBDSW5GaWxlU3RyZWFtICppbkZpbGUgPSBuZXcgQ0luRmlsZVN0cmVhbTsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbEluU3RyZWFtPiBpblN0cmVhbVRlbXAgPSBpbkZpbGU7DQorICBpZiAoIWluRmlsZS0+T3Blbihfc3JjRGlyZWN0b3J5UHJlZml4ICsgbmFtZSkpDQorICAgIHJldHVybiA6OkdldExhc3RFcnJvcigpOw0KKyAgKmluU3RyZWFtID0gaW5TdHJlYW1UZW1wLkRldGFjaCgpOw0KKyAgcmV0dXJuIFNfT0s7DQorICBDT01fVFJZX0VORA0KK30NCisqLw0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZUV4dHJhY3RDYWxsYmFjazo6Q3J5cHRvR2V0VGV4dFBhc3N3b3JkKEJTVFIgKnBhc3N3b3JkKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIGlmICghX2NyeXB0b0dldFRleHRQYXNzd29yZCkNCisgIHsNCisgICAgUklOT0soX2V4dHJhY3RDYWxsYmFjazIuUXVlcnlJbnRlcmZhY2UoSUlEX0lDcnlwdG9HZXRUZXh0UGFzc3dvcmQsDQorICAgICAgICAmX2NyeXB0b0dldFRleHRQYXNzd29yZCkpOw0KKyAgfQ0KKyAgcmV0dXJuIF9jcnlwdG9HZXRUZXh0UGFzc3dvcmQtPkNyeXB0b0dldFRleHRQYXNzd29yZChwYXNzd29yZCk7DQorICBDT01fVFJZX0VORA0KK30NCisNCisNCitzdHJ1Y3QgQ0V4dHJSZWZTb3J0UGFpcg0KK3sNCisgIGludCBMZW47DQorICBpbnQgSW5kZXg7DQorDQorICBpbnQgQ29tcGFyZShjb25zdCBDRXh0clJlZlNvcnRQYWlyICZhKSBjb25zdDsNCit9Ow0KKw0KKyNkZWZpbmUgUklOT1ooeCkgeyBpbnQgX190dCA9ICh4KTsgaWYgKF9fdHQgIT0gMCkgcmV0dXJuIF9fdHQ7IH0NCisNCitpbnQgQ0V4dHJSZWZTb3J0UGFpcjo6Q29tcGFyZShjb25zdCBDRXh0clJlZlNvcnRQYWlyICZhKSBjb25zdA0KK3sNCisgIFJJTk9aKC1NeUNvbXBhcmUoTGVuLCBhLkxlbikpOw0KKyAgcmV0dXJuIE15Q29tcGFyZShJbmRleCwgYS5JbmRleCk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgR2V0TnVtU2xhc2hlcyhjb25zdCBGQ2hhciAqcykNCit7DQorICBmb3IgKGludCBudW1TbGFzaGVzID0gMDs7KQ0KKyAgew0KKyAgICBGQ2hhciBjID0gKnMrKzsNCisgICAgaWYgKGMgPT0gMCkNCisgICAgICByZXR1cm4gbnVtU2xhc2hlczsNCisgICAgaWYgKA0KKyAgICAgICAgI2lmZGVmIF9XSU4zMg0KKyAgICAgICAgYyA9PSBGVEVYVCgnXFwnKSB8fA0KKyAgICAgICAgI2VuZGlmDQorICAgICAgICBjID09IEZURVhUKCcvJykpDQorICAgICAgbnVtU2xhc2hlcysrOw0KKyAgfQ0KK30NCisNCitIUkVTVUxUIENBcmNoaXZlRXh0cmFjdENhbGxiYWNrOjpTZXREaXJzVGltZXMoKQ0KK3sNCisgIENSZWNvcmRWZWN0b3I8Q0V4dHJSZWZTb3J0UGFpcj4gcGFpcnM7DQorICBwYWlycy5DbGVhckFuZFNldFNpemUoX2V4dHJhY3RlZEZvbGRlclBhdGhzLlNpemUoKSk7DQorICB1bnNpZ25lZCBpOw0KKyAgDQorICBmb3IgKGkgPSAwOyBpIDwgX2V4dHJhY3RlZEZvbGRlclBhdGhzLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICBDRXh0clJlZlNvcnRQYWlyICZwYWlyID0gcGFpcnNbaV07DQorICAgIHBhaXIuSW5kZXggPSBpOw0KKyAgICBwYWlyLkxlbiA9IEdldE51bVNsYXNoZXMoX2V4dHJhY3RlZEZvbGRlclBhdGhzW2ldKTsNCisgIH0NCisgIA0KKyAgcGFpcnMuU29ydDIoKTsNCisgIA0KKyAgZm9yIChpID0gMDsgaSA8IHBhaXJzLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICBpbnQgcGFpckluZGV4ID0gcGFpcnNbaV0uSW5kZXg7DQorICAgIGludCBpbmRleCA9IF9leHRyYWN0ZWRGb2xkZXJJbmRpY2VzW3BhaXJJbmRleF07DQorDQorICAgIEZJTEVUSU1FIENUaW1lOw0KKyAgICBGSUxFVElNRSBBVGltZTsNCisgICAgRklMRVRJTUUgTVRpbWU7DQorICANCisgICAgYm9vbCBDVGltZURlZmluZWQ7DQorICAgIGJvb2wgQVRpbWVEZWZpbmVkOw0KKyAgICBib29sIE1UaW1lRGVmaW5lZDsNCisNCisgICAgUklOT0soR2V0VGltZShpbmRleCwga3BpZENUaW1lLCBDVGltZSwgQ1RpbWVEZWZpbmVkKSk7DQorICAgIFJJTk9LKEdldFRpbWUoaW5kZXgsIGtwaWRBVGltZSwgQVRpbWUsIEFUaW1lRGVmaW5lZCkpOw0KKyAgICBSSU5PSyhHZXRUaW1lKGluZGV4LCBrcGlkTVRpbWUsIE1UaW1lLCBNVGltZURlZmluZWQpKTsNCisNCisgICAgLy8gcHJpbnRmKCJcbiVTIiwgX2V4dHJhY3RlZEZvbGRlclBhdGhzW3BhaXJJbmRleF0pOw0KKyAgICBTZXREaXJUaW1lKF9leHRyYWN0ZWRGb2xkZXJQYXRoc1twYWlySW5kZXhdLA0KKyAgICAgIChXcml0ZUNUaW1lICYmIENUaW1lRGVmaW5lZCkgPyAmQ1RpbWUgOiBOVUxMLA0KKyAgICAgIChXcml0ZUFUaW1lICYmIEFUaW1lRGVmaW5lZCkgPyAmQVRpbWUgOiBOVUxMLA0KKyAgICAgIChXcml0ZU1UaW1lICYmIE1UaW1lRGVmaW5lZCkgPyAmTVRpbWUgOiAoX2FyYy0+TVRpbWVEZWZpbmVkID8gJl9hcmMtPk1UaW1lIDogTlVMTCkpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2suaCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDAwNTMyCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vQXJjaGl2ZUV4dHJhY3RDYWxsYmFjay5oCkBAIC0wLDAgKzEsMjk5IEBACisvLyBBcmNoaXZlRXh0cmFjdENhbGxiYWNrLmgNCisNCisjaWZuZGVmIF9fQVJDSElWRV9FWFRSQUNUX0NBTExCQUNLX0gNCisjZGVmaW5lIF9fQVJDSElWRV9FWFRSQUNUX0NBTExCQUNLX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015Q29tLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9XaWxkY2FyZC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9JUGFzc3dvcmQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0ZpbGVTdHJlYW1zLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9Qcm9ncmVzc1V0aWxzLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0FyY2hpdmUvSUFyY2hpdmUuaCINCisNCisjaW5jbHVkZSAiRXh0cmFjdE1vZGUuaCINCisjaW5jbHVkZSAiSUZpbGVFeHRyYWN0Q2FsbGJhY2suaCINCisjaW5jbHVkZSAiT3BlbkFyY2hpdmUuaCINCisNCisjaW5jbHVkZSAiSGFzaENhbGMuaCINCisNCisjaWZuZGVmIF9TRlgNCisNCitjbGFzcyBDT3V0U3RyZWFtV2l0aEhhc2g6DQorICBwdWJsaWMgSVNlcXVlbnRpYWxPdXRTdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gX3N0cmVhbTsNCisgIFVJbnQ2NCBfc2l6ZTsNCisgIGJvb2wgX2NhbGN1bGF0ZTsNCitwdWJsaWM6DQorICBJSGFzaENhbGMgKl9oYXNoOw0KKw0KKyAgTVlfVU5LTk9XTl9JTVANCisgIFNURE1FVEhPRChXcml0ZSkoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorICB2b2lkIFNldFN0cmVhbShJU2VxdWVudGlhbE91dFN0cmVhbSAqc3RyZWFtKSB7IF9zdHJlYW0gPSBzdHJlYW07IH0NCisgIHZvaWQgUmVsZWFzZVN0cmVhbSgpIHsgX3N0cmVhbS5SZWxlYXNlKCk7IH0NCisgIHZvaWQgSW5pdChib29sIGNhbGN1bGF0ZSA9IHRydWUpDQorICB7DQorICAgIEluaXRDUkMoKTsNCisgICAgX3NpemUgPSAwOw0KKyAgICBfY2FsY3VsYXRlID0gY2FsY3VsYXRlOw0KKyAgfQ0KKyAgdm9pZCBFbmFibGVDYWxjKGJvb2wgY2FsY3VsYXRlKSB7IF9jYWxjdWxhdGUgPSBjYWxjdWxhdGU7IH0NCisgIHZvaWQgSW5pdENSQygpIHsgX2hhc2gtPkluaXRGb3JOZXdGaWxlKCk7IH0NCisgIFVJbnQ2NCBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gX3NpemU7IH0NCit9Ow0KKw0KKyNlbmRpZg0KKw0KK3N0cnVjdCBDRXh0cmFjdE50T3B0aW9ucw0KK3sNCisgIENCb29sUGFpciBOdFNlY3VyaXR5Ow0KKyAgQ0Jvb2xQYWlyIFN5bUxpbmtzOw0KKyAgQ0Jvb2xQYWlyIEhhcmRMaW5rczsNCisgIENCb29sUGFpciBBbHRTdHJlYW1zOw0KKyAgYm9vbCBSZXBsYWNlQ29sb25Gb3JBbHRTdHJlYW07DQorICBib29sIFdyaXRlVG9BbHRTdHJlYW1JZkNvbG9uOw0KKw0KKyAgQ0V4dHJhY3ROdE9wdGlvbnMoKToNCisgICAgICBSZXBsYWNlQ29sb25Gb3JBbHRTdHJlYW0oZmFsc2UpLA0KKyAgICAgIFdyaXRlVG9BbHRTdHJlYW1JZkNvbG9uKGZhbHNlKQ0KKyAgew0KKyAgICBTeW1MaW5rcy5WYWwgPSB0cnVlOw0KKyAgICBIYXJkTGlua3MuVmFsID0gdHJ1ZTsNCisgICAgQWx0U3RyZWFtcy5WYWwgPSB0cnVlOw0KKyAgfQ0KK307DQorDQorI2lmbmRlZiBfU0ZYDQorDQorY2xhc3MgQ0dldFByb3A6DQorICBwdWJsaWMgSUdldFByb3AsDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCitwdWJsaWM6DQorICBjb25zdCBDQXJjICpBcmM7DQorICBVSW50MzIgSW5kZXhJbkFyYzsNCisgIFVTdHJpbmcgTmFtZTsgLy8gcmVsYXRpdmUgcGF0aA0KKw0KKyAgTVlfVU5LTk9XTl9JTVAxKElHZXRQcm9wKQ0KKyAgSU5URVJGQUNFX0lHZXRQcm9wKDspDQorfTsNCisNCisjZW5kaWYNCisNCisjaWZuZGVmIF9TRlgNCisjaWZuZGVmIFVOREVSX0NFDQorDQorI2RlZmluZSBTVVBQT1JUX0xJTktTDQorDQorI2VuZGlmDQorI2VuZGlmDQorDQorDQorI2lmZGVmIFNVUFBPUlRfTElOS1MNCisNCitzdHJ1Y3QgQ0hhcmRMaW5rTm9kZQ0KK3sNCisgIFVJbnQ2NCBTdHJlYW1JZDsNCisgIFVJbnQ2NCBJTm9kZTsNCisNCisgIGludCBDb21wYXJlKGNvbnN0IENIYXJkTGlua05vZGUgJmEpIGNvbnN0Ow0KK307DQorDQorY2xhc3MgQ0hhcmRMaW5rcw0KK3sNCitwdWJsaWM6DQorICBDUmVjb3JkVmVjdG9yPENIYXJkTGlua05vZGU+IElEczsNCisgIENPYmplY3RWZWN0b3I8RlN0cmluZz4gTGlua3M7DQorDQorICB2b2lkIENsZWFyKCkNCisgIHsNCisgICAgSURzLkNsZWFyKCk7DQorICAgIExpbmtzLkNsZWFyKCk7DQorICB9DQorDQorICB2b2lkIFByZXBhcmVMaW5rcygpDQorICB7DQorICAgIHdoaWxlIChMaW5rcy5TaXplKCkgPCBJRHMuU2l6ZSgpKQ0KKyAgICAgIExpbmtzLkFkZE5ldygpOw0KKyAgfQ0KK307DQorDQorI2VuZGlmDQorDQorY2xhc3MgQ0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2s6DQorICBwdWJsaWMgSUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2ssDQorICAvLyBwdWJsaWMgSUFyY2hpdmVWb2x1bWVFeHRyYWN0Q2FsbGJhY2ssDQorICBwdWJsaWMgSUNyeXB0b0dldFRleHRQYXNzd29yZCwNCisgIHB1YmxpYyBJQ29tcHJlc3NQcm9ncmVzc0luZm8sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIGNvbnN0IENBcmMgKl9hcmM7DQorICBDRXh0cmFjdE50T3B0aW9ucyBfbnRPcHRpb25zOw0KKw0KKyAgY29uc3QgTldpbGRjYXJkOjpDQ2Vuc29yTm9kZSAqX3dpbGRjYXJkQ2Vuc29yOw0KKyAgQ015Q29tUHRyPElGb2xkZXJBcmNoaXZlRXh0cmFjdENhbGxiYWNrPiBfZXh0cmFjdENhbGxiYWNrMjsNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NQcm9ncmVzc0luZm8+IF9jb21wcmVzc1Byb2dyZXNzOw0KKyAgQ015Q29tUHRyPElDcnlwdG9HZXRUZXh0UGFzc3dvcmQ+IF9jcnlwdG9HZXRUZXh0UGFzc3dvcmQ7DQorICBGU3RyaW5nIF9kaXJlY3RvcnlQYXRoOw0KKyAgRlN0cmluZyBfZGlyZWN0b3J5UGF0aEZ1bGw7DQorICBORXh0cmFjdDo6TlBhdGhNb2RlOjpFRW51bSBfcGF0aE1vZGU7DQorICBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OkVFbnVtIF9vdmVyd3JpdGVNb2RlOw0KKw0KKyAgI2lmbmRlZiBfU0ZYDQorDQorICBDTXlDb21QdHI8SUZvbGRlckV4dHJhY3RUb1N0cmVhbUNhbGxiYWNrPiBFeHRyYWN0VG9TdHJlYW1DYWxsYmFjazsNCisgIENHZXRQcm9wICpHZXRQcm9wX1NwZWM7DQorICBDTXlDb21QdHI8SUdldFByb3A+IEdldFByb3A7DQorICANCisgICNlbmRpZg0KKw0KKyAgRlN0cmluZyBfZGlza0ZpbGVQYXRoOw0KKyAgVVN0cmluZyBfZmlsZVBhdGg7DQorICBVSW50NjQgX3Bvc2l0aW9uOw0KKyAgYm9vbCBfaXNTcGxpdDsNCisgIGJvb2wgX2lzQWx0U3RyZWFtOw0KKw0KKyAgYm9vbCBfZXh0cmFjdE1vZGU7DQorDQorICBib29sIFdyaXRlQ1RpbWU7DQorICBib29sIFdyaXRlQVRpbWU7DQorICBib29sIFdyaXRlTVRpbWU7DQorDQorICBib29sIF9lbmNyeXB0ZWQ7DQorDQorICBzdHJ1Y3QgQ1Byb2Nlc3NlZEZpbGVJbmZvDQorICB7DQorICAgIEZJTEVUSU1FIENUaW1lOw0KKyAgICBGSUxFVElNRSBBVGltZTsNCisgICAgRklMRVRJTUUgTVRpbWU7DQorICAgIFVJbnQzMiBBdHRyaWI7DQorICANCisgICAgYm9vbCBDVGltZURlZmluZWQ7DQorICAgIGJvb2wgQVRpbWVEZWZpbmVkOw0KKyAgICBib29sIE1UaW1lRGVmaW5lZDsNCisgICAgYm9vbCBBdHRyaWJEZWZpbmVkOw0KKw0KKyAgICBib29sIElzRGlyOw0KKyAgfSBfZmk7DQorDQorICBVSW50MzIgX2luZGV4Ow0KKyAgVUludDY0IF9jdXJTaXplOw0KKyAgYm9vbCBfY3VyU2l6ZURlZmluZWQ7DQorICBDT3V0RmlsZVN0cmVhbSAqX291dEZpbGVTdHJlYW1TcGVjOw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsT3V0U3RyZWFtPiBfb3V0RmlsZVN0cmVhbTsNCisNCisgICNpZm5kZWYgX1NGWA0KKyAgDQorICBDT3V0U3RyZWFtV2l0aEhhc2ggKl9oYXNoU3RyZWFtU3BlYzsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gX2hhc2hTdHJlYW07DQorICBib29sIF9oYXNoU3RyZWFtV2FzVXNlZDsNCisgIA0KKyAgI2VuZGlmDQorDQorICBVU3RyaW5nVmVjdG9yIF9yZW1vdmVQYXRoUGFydHM7DQorICBib29sIF91c2VfYmFzZVBhcmVudEZvbGRlcl9tb2RlOw0KKyAgVUludDMyIF9iYXNlUGFyZW50Rm9sZGVyOw0KKw0KKyAgYm9vbCBfc3RkT3V0TW9kZTsNCisgIGJvb2wgX3Rlc3RNb2RlOw0KKyAgYm9vbCBfbXVsdGlBcmNoaXZlczsNCisNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NQcm9ncmVzc0luZm8+IF9sb2NhbFByb2dyZXNzOw0KKyAgVUludDY0IF9wYWNrVG90YWw7DQorICBVSW50NjQgX3VucFRvdGFsOw0KKw0KKyAgRlN0cmluZ1ZlY3RvciBfZXh0cmFjdGVkRm9sZGVyUGF0aHM7DQorICBDUmVjb3JkVmVjdG9yPFVJbnQzMj4gX2V4dHJhY3RlZEZvbGRlckluZGljZXM7DQorDQorICAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKSAmJiAhZGVmaW5lZChfU0ZYKQ0KKyAgYm9vbCBfc2FjbEVuYWJsZWQ7DQorICAjZW5kaWYNCisNCisgIHZvaWQgQ3JlYXRlQ29tcGxleERpcmVjdG9yeShjb25zdCBVU3RyaW5nVmVjdG9yICZkaXJQYXRoUGFydHMsIEZTdHJpbmcgJmZ1bGxQYXRoKTsNCisgIEhSRVNVTFQgR2V0VGltZShpbnQgaW5kZXgsIFBST1BJRCBwcm9wSUQsIEZJTEVUSU1FICZmaWxldGltZSwgYm9vbCAmZmlsZXRpbWVJc0RlZmluZWQpOw0KKyAgSFJFU1VMVCBHZXRVbnBhY2tTaXplKCk7DQorDQorICBIUkVTVUxUIFNlbmRNZXNzYWdlRXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSwgY29uc3QgRlN0cmluZyAmcGF0aCk7DQorICBIUkVTVUxUIFNlbmRNZXNzYWdlRXJyb3IyKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGNvbnN0IEZTdHJpbmcgJnBhdGgxLCBjb25zdCBGU3RyaW5nICZwYXRoMik7DQorDQorcHVibGljOg0KKw0KKyAgQ0xvY2FsUHJvZ3Jlc3MgKkxvY2FsUHJvZ3Jlc3NTcGVjOw0KKw0KKyAgVUludDY0IE51bUZvbGRlcnM7DQorICBVSW50NjQgTnVtRmlsZXM7DQorICBVSW50NjQgTnVtQWx0U3RyZWFtczsNCisgIFVJbnQ2NCBVbnBhY2tTaXplOw0KKyAgVUludDY0IEFsdFN0cmVhbXNfVW5wYWNrU2l6ZTsNCisgIA0KKyAgTVlfVU5LTk9XTl9JTVAyKElDcnlwdG9HZXRUZXh0UGFzc3dvcmQsIElDb21wcmVzc1Byb2dyZXNzSW5mbykNCisgIC8vIENPTV9JTlRFUkZBQ0VfRU5UUlkoSUFyY2hpdmVWb2x1bWVFeHRyYWN0Q2FsbGJhY2spDQorDQorICBJTlRFUkZBQ0VfSUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2soOykNCisNCisgIFNURE1FVEhPRChTZXRSYXRpb0luZm8pKGNvbnN0IFVJbnQ2NCAqaW5TaXplLCBjb25zdCBVSW50NjQgKm91dFNpemUpOw0KKw0KKyAgLy8gSUFyY2hpdmVWb2x1bWVFeHRyYWN0Q2FsbGJhY2sNCisgIC8vIFNURE1FVEhPRChHZXRJblN0cmVhbSkoY29uc3Qgd2NoYXJfdCAqbmFtZSwgSVNlcXVlbnRpYWxJblN0cmVhbSAqKmluU3RyZWFtKTsNCisNCisgIFNURE1FVEhPRChDcnlwdG9HZXRUZXh0UGFzc3dvcmQpKEJTVFIgKnBhc3N3b3JkKTsNCisNCisgIENBcmNoaXZlRXh0cmFjdENhbGxiYWNrKCk7DQorDQorICB2b2lkIEluaXRGb3JNdWx0aShib29sIG11bHRpQXJjaGl2ZXMsDQorICAgICAgTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6RUVudW0gcGF0aE1vZGUsDQorICAgICAgTkV4dHJhY3Q6Ok5PdmVyd3JpdGVNb2RlOjpFRW51bSBvdmVyd3JpdGVNb2RlKQ0KKyAgew0KKyAgICBfbXVsdGlBcmNoaXZlcyA9IG11bHRpQXJjaGl2ZXM7DQorICAgIF9wYXRoTW9kZSA9IHBhdGhNb2RlOw0KKyAgICBfb3ZlcndyaXRlTW9kZSA9IG92ZXJ3cml0ZU1vZGU7DQorICAgIE51bUZvbGRlcnMgPSBOdW1GaWxlcyA9IE51bUFsdFN0cmVhbXMgPSBVbnBhY2tTaXplID0gQWx0U3RyZWFtc19VbnBhY2tTaXplID0gMDsNCisgIH0NCisNCisgICNpZm5kZWYgX1NGWA0KKw0KKyAgdm9pZCBTZXRIYXNoTWV0aG9kcyhJSGFzaENhbGMgKmhhc2gpDQorICB7DQorICAgIGlmICghaGFzaCkNCisgICAgICByZXR1cm47DQorICAgIF9oYXNoU3RyZWFtU3BlYyA9IG5ldyBDT3V0U3RyZWFtV2l0aEhhc2g7DQorICAgIF9oYXNoU3RyZWFtID0gX2hhc2hTdHJlYW1TcGVjOw0KKyAgICBfaGFzaFN0cmVhbVNwZWMtPl9oYXNoID0gaGFzaDsNCisgIH0NCisNCisgICNlbmRpZg0KKw0KKyAgdm9pZCBJbml0KA0KKyAgICAgIGNvbnN0IENFeHRyYWN0TnRPcHRpb25zICZudE9wdGlvbnMsDQorICAgICAgY29uc3QgTldpbGRjYXJkOjpDQ2Vuc29yTm9kZSAqd2lsZGNhcmRDZW5zb3IsDQorICAgICAgY29uc3QgQ0FyYyAqYXJjLA0KKyAgICAgIElGb2xkZXJBcmNoaXZlRXh0cmFjdENhbGxiYWNrICpleHRyYWN0Q2FsbGJhY2syLA0KKyAgICAgIGJvb2wgc3RkT3V0TW9kZSwgYm9vbCB0ZXN0TW9kZSwNCisgICAgICBjb25zdCBGU3RyaW5nICZkaXJlY3RvcnlQYXRoLA0KKyAgICAgIGNvbnN0IFVTdHJpbmdWZWN0b3IgJnJlbW92ZVBhdGhQYXJ0cywNCisgICAgICBVSW50NjQgcGFja1NpemUpOw0KKw0KKyAgI2lmZGVmIFNVUFBPUlRfTElOS1MNCitwcml2YXRlOg0KKyAgQ0hhcmRMaW5rcyBfaGFyZExpbmtzOw0KK3B1YmxpYzoNCisgIC8vIGNhbGwgUHJlcGFyZUhhcmRMaW5rcygpIGFmdGVyIEluaXQoKQ0KKyAgSFJFU1VMVCBQcmVwYXJlSGFyZExpbmtzKGNvbnN0IENSZWNvcmRWZWN0b3I8VUludDMyPiAqcmVhbEluZGljZXMpOyAgLy8gTlVMTCBtZWFucyBhbGwgaXRlbXMNCisgICNlbmRpZg0KKw0KKyAgLy8gY2FsbCBpdCBhZnRlciBJbml0KCkNCisNCisgIHZvaWQgU2V0QmFzZVBhcmVudEZvbGRlckluZGV4KFVJbnQzMiBpbmRleEluQXJjKQ0KKyAgew0KKyAgICBfdXNlX2Jhc2VQYXJlbnRGb2xkZXJfbW9kZSA9IHRydWU7DQorICAgIF9iYXNlUGFyZW50Rm9sZGVyID0gaW5kZXhJbkFyYzsNCisgIH0NCisNCisgIEhSRVNVTFQgU2V0RGlyc1RpbWVzKCk7DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9BcmNoaXZlTmFtZS5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9BcmNoaXZlTmFtZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FiYzk1NQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0FyY2hpdmVOYW1lLmNwcApAQCAtMCwwICsxLDcwIEBACisvLyBBcmNoaXZlTmFtZS5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZURpci5oIg0KKw0KKyNpbmNsdWRlICJFeHRyYWN0aW5nRmlsZVBhdGguaCINCisjaW5jbHVkZSAiQXJjaGl2ZU5hbWUuaCINCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQorDQorVVN0cmluZyBDcmVhdGVBcmNoaXZlTmFtZShjb25zdCBORmlsZTo6TkZpbmQ6OkNGaWxlSW5mbyBmaWxlSW5mbywgYm9vbCBrZWVwTmFtZSkNCit7DQorICBGU3RyaW5nIHJlc3VsdE5hbWUgPSBmaWxlSW5mby5OYW1lOw0KKyAgaWYgKCFmaWxlSW5mby5Jc0RpcigpICYmICFrZWVwTmFtZSkNCisgIHsNCisgICAgaW50IGRvdFBvcyA9IHJlc3VsdE5hbWUuUmV2ZXJzZUZpbmQoRlRFWFQoJy4nKSk7DQorICAgIGlmIChkb3RQb3MgPiAwKQ0KKyAgICB7DQorICAgICAgRlN0cmluZyBhcmNoaXZlTmFtZTIgPSByZXN1bHROYW1lLkxlZnQoZG90UG9zKTsNCisgICAgICBpZiAoYXJjaGl2ZU5hbWUyLlJldmVyc2VGaW5kKEZURVhUKCcuJykpIDwgMCkNCisgICAgICAgIHJlc3VsdE5hbWUgPSBhcmNoaXZlTmFtZTI7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBHZXRDb3JyZWN0RnNQYXRoKGZzMnVzKHJlc3VsdE5hbWUpKTsNCit9DQorDQorc3RhdGljIEZTdHJpbmcgQ3JlYXRlQXJjaGl2ZU5hbWUyKGNvbnN0IEZTdHJpbmcgJnNyY05hbWUsIGJvb2wgZnJvbVByZXYsIGJvb2wga2VlcE5hbWUpDQorew0KKyAgRlN0cmluZyByZXN1bHROYW1lID0gRlRFWFQoIkFyY2hpdmUiKTsNCisgIGlmIChmcm9tUHJldikNCisgIHsNCisgICAgRlN0cmluZyBkaXJQcmVmaXg7DQorICAgIGlmIChORmlsZTo6TkRpcjo6R2V0T25seURpclByZWZpeChzcmNOYW1lLCBkaXJQcmVmaXgpKQ0KKyAgICB7DQorICAgICAgaWYgKGRpclByZWZpeC5MZW4oKSA+IDApDQorICAgICAgICBpZiAoZGlyUHJlZml4LkJhY2soKSA9PSBGQ0hBUl9QQVRIX1NFUEFSQVRPUikNCisgICAgICAgIHsNCisgICAgICAgICAgZGlyUHJlZml4LkRlbGV0ZUJhY2soKTsNCisgICAgICAgICAgTkZpbGU6Ok5GaW5kOjpDRmlsZUluZm8gZmlsZUluZm87DQorICAgICAgICAgIGlmIChmaWxlSW5mby5GaW5kKGRpclByZWZpeCkpDQorICAgICAgICAgICAgcmVzdWx0TmFtZSA9IGZpbGVJbmZvLk5hbWU7DQorICAgICAgICB9DQorICAgIH0NCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgTkZpbGU6Ok5GaW5kOjpDRmlsZUluZm8gZmlsZUluZm87DQorICAgIGlmICghZmlsZUluZm8uRmluZChzcmNOYW1lKSkNCisgICAgICAvLyByZXR1cm4gcmVzdWx0TmFtZTsNCisgICAgICByZXR1cm4gc3JjTmFtZTsNCisgICAgcmVzdWx0TmFtZSA9IGZpbGVJbmZvLk5hbWU7DQorICAgIGlmICghZmlsZUluZm8uSXNEaXIoKSAmJiAha2VlcE5hbWUpDQorICAgIHsNCisgICAgICBpbnQgZG90UG9zID0gcmVzdWx0TmFtZS5SZXZlcnNlRmluZCgnLicpOw0KKyAgICAgIGlmIChkb3RQb3MgPiAwKQ0KKyAgICAgIHsNCisgICAgICAgIEZTdHJpbmcgYXJjaGl2ZU5hbWUyID0gcmVzdWx0TmFtZS5MZWZ0KGRvdFBvcyk7DQorICAgICAgICBpZiAoYXJjaGl2ZU5hbWUyLlJldmVyc2VGaW5kKEZURVhUKCcuJykpIDwgMCkNCisgICAgICAgICAgcmVzdWx0TmFtZSA9IGFyY2hpdmVOYW1lMjsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiByZXN1bHROYW1lOw0KK30NCisNCitVU3RyaW5nIENyZWF0ZUFyY2hpdmVOYW1lKGNvbnN0IFVTdHJpbmcgJnNyY05hbWUsIGJvb2wgZnJvbVByZXYsIGJvb2wga2VlcE5hbWUpDQorew0KKyAgcmV0dXJuIEdldENvcnJlY3RGc1BhdGgoZnMydXMoQ3JlYXRlQXJjaGl2ZU5hbWUyKHVzMmZzKHNyY05hbWUpLCBmcm9tUHJldiwga2VlcE5hbWUpKSk7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0FyY2hpdmVOYW1lLmggYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9BcmNoaXZlTmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2N2NmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9BcmNoaXZlTmFtZS5oCkBAIC0wLDAgKzEsMTMgQEAKKy8vIEFyY2hpdmVOYW1lLmgNCisNCisjaWZuZGVmIF9fQVJDSElWRV9OQU1FX0gNCisjZGVmaW5lIF9fQVJDSElWRV9OQU1FX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015U3RyaW5nLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZUZpbmQuaCINCisNCitVU3RyaW5nIENyZWF0ZUFyY2hpdmVOYW1lKGNvbnN0IFVTdHJpbmcgJnNyY05hbWUsIGJvb2wgZnJvbVByZXYsIGJvb2wga2VlcE5hbWUpOw0KK1VTdHJpbmcgQ3JlYXRlQXJjaGl2ZU5hbWUoY29uc3QgTldpbmRvd3M6Ok5GaWxlOjpORmluZDo6Q0ZpbGVJbmZvIGZpbGVJbmZvLCBib29sIGtlZXBOYW1lKTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9BcmNoaXZlT3BlbkNhbGxiYWNrLmNwcCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0FyY2hpdmVPcGVuQ2FsbGJhY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNjhkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9BcmNoaXZlT3BlbkNhbGxiYWNrLmNwcApAQCAtMCwwICsxLDEyNSBAQAorLy8gQXJjaGl2ZU9wZW5DYWxsYmFjay5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9Db21UcnkuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlTmFtZS5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1Byb3BWYXJpYW50LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9GaWxlU3RyZWFtcy5oIg0KKw0KKyNpbmNsdWRlICJBcmNoaXZlT3BlbkNhbGxiYWNrLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KKw0KK1NURE1FVEhPRElNUCBDT3BlbkNhbGxiYWNrSW1wOjpTZXRUb3RhbChjb25zdCBVSW50NjQgKmZpbGVzLCBjb25zdCBVSW50NjQgKmJ5dGVzKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIGlmIChSZU9wZW5DYWxsYmFjaykNCisgICAgcmV0dXJuIFJlT3BlbkNhbGxiYWNrLT5TZXRUb3RhbChmaWxlcywgYnl0ZXMpOw0KKyAgaWYgKCFDYWxsYmFjaykNCisgICAgcmV0dXJuIFNfT0s7DQorICByZXR1cm4gQ2FsbGJhY2stPk9wZW5fU2V0VG90YWwoZmlsZXMsIGJ5dGVzKTsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KK1NURE1FVEhPRElNUCBDT3BlbkNhbGxiYWNrSW1wOjpTZXRDb21wbGV0ZWQoY29uc3QgVUludDY0ICpmaWxlcywgY29uc3QgVUludDY0ICpieXRlcykNCit7DQorICBDT01fVFJZX0JFR0lODQorICBpZiAoUmVPcGVuQ2FsbGJhY2spDQorICAgIHJldHVybiBSZU9wZW5DYWxsYmFjay0+U2V0Q29tcGxldGVkKGZpbGVzLCBieXRlcyk7DQorICBpZiAoIUNhbGxiYWNrKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIHJldHVybiBDYWxsYmFjay0+T3Blbl9TZXRDb21wbGV0ZWQoZmlsZXMsIGJ5dGVzKTsNCisgIENPTV9UUllfRU5EDQorfQ0KKyAgDQorU1RETUVUSE9ESU1QIENPcGVuQ2FsbGJhY2tJbXA6OkdldFByb3BlcnR5KFBST1BJRCBwcm9wSUQsIFBST1BWQVJJQU5UICp2YWx1ZSkNCit7DQorICBDT01fVFJZX0JFR0lODQorICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgIGlmIChfc3ViQXJjaGl2ZU1vZGUpDQorICAgIHN3aXRjaChwcm9wSUQpDQorICAgIHsNCisgICAgICBjYXNlIGtwaWROYW1lOiBwcm9wID0gX3N1YkFyY2hpdmVOYW1lOyBicmVhazsNCisgICAgfQ0KKyAgZWxzZQ0KKyAgICBzd2l0Y2gocHJvcElEKQ0KKyAgICB7DQorICAgICAgY2FzZSBrcGlkTmFtZTogIHByb3AgPSBfZmlsZUluZm8uTmFtZTsgYnJlYWs7DQorICAgICAgY2FzZSBrcGlkSXNEaXI6ICBwcm9wID0gX2ZpbGVJbmZvLklzRGlyKCk7IGJyZWFrOw0KKyAgICAgIGNhc2Uga3BpZFNpemU6ICBwcm9wID0gX2ZpbGVJbmZvLlNpemU7IGJyZWFrOw0KKyAgICAgIGNhc2Uga3BpZEF0dHJpYjogIHByb3AgPSAoVUludDMyKV9maWxlSW5mby5BdHRyaWI7IGJyZWFrOw0KKyAgICAgIGNhc2Uga3BpZENUaW1lOiAgcHJvcCA9IF9maWxlSW5mby5DVGltZTsgYnJlYWs7DQorICAgICAgY2FzZSBrcGlkQVRpbWU6ICBwcm9wID0gX2ZpbGVJbmZvLkFUaW1lOyBicmVhazsNCisgICAgICBjYXNlIGtwaWRNVGltZTogIHByb3AgPSBfZmlsZUluZm8uTVRpbWU7IGJyZWFrOw0KKyAgICB9DQorICBwcm9wLkRldGFjaCh2YWx1ZSk7DQorICByZXR1cm4gU19PSzsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KK3N0cnVjdCBDSW5GaWxlU3RyZWFtVm9sOiBwdWJsaWMgQ0luRmlsZVN0cmVhbQ0KK3sNCisgIGludCBGaWxlTmFtZUluZGV4Ow0KKyAgQ09wZW5DYWxsYmFja0ltcCAqT3BlbkNhbGxiYWNrSW1wOw0KKyAgQ015Q29tUHRyPElBcmNoaXZlT3BlbkNhbGxiYWNrPiBPcGVuQ2FsbGJhY2tSZWY7DQorIA0KKyAgfkNJbkZpbGVTdHJlYW1Wb2woKQ0KKyAgew0KKyAgICBpZiAoT3BlbkNhbGxiYWNrUmVmKQ0KKyAgICAgIE9wZW5DYWxsYmFja0ltcC0+RmlsZU5hbWVzX1dhc1VzZWRbRmlsZU5hbWVJbmRleF0gPSBmYWxzZTsNCisgIH0NCit9Ow0KKw0KK1NURE1FVEhPRElNUCBDT3BlbkNhbGxiYWNrSW1wOjpHZXRTdHJlYW0oY29uc3Qgd2NoYXJfdCAqbmFtZSwgSUluU3RyZWFtICoqaW5TdHJlYW0pDQorew0KKyAgQ09NX1RSWV9CRUdJTg0KKyAgKmluU3RyZWFtID0gTlVMTDsNCisgIGlmIChfc3ViQXJjaGl2ZU1vZGUpDQorICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgaWYgKENhbGxiYWNrKQ0KKyAgew0KKyAgICBSSU5PSyhDYWxsYmFjay0+T3Blbl9DaGVja0JyZWFrKCkpOw0KKyAgfQ0KKyAgRlN0cmluZyBmdWxsUGF0aDsNCisgIGlmICghTkZpbGU6Ok5OYW1lOjpHZXRGdWxsUGF0aChfZm9sZGVyUHJlZml4LCB1czJmcyhuYW1lKSwgZnVsbFBhdGgpKQ0KKyAgICByZXR1cm4gU19GQUxTRTsNCisgIGlmICghX2ZpbGVJbmZvLkZpbmQoZnVsbFBhdGgpKQ0KKyAgICByZXR1cm4gU19GQUxTRTsNCisgIGlmIChfZmlsZUluZm8uSXNEaXIoKSkNCisgICAgcmV0dXJuIFNfRkFMU0U7DQorICBDSW5GaWxlU3RyZWFtVm9sICppbkZpbGUgPSBuZXcgQ0luRmlsZVN0cmVhbVZvbDsNCisgIENNeUNvbVB0cjxJSW5TdHJlYW0+IGluU3RyZWFtVGVtcCA9IGluRmlsZTsNCisgIGlmICghaW5GaWxlLT5PcGVuKGZ1bGxQYXRoKSkNCisgICAgcmV0dXJuIDo6R2V0TGFzdEVycm9yKCk7DQorDQorICBGaWxlU2l6ZXMuQWRkKF9maWxlSW5mby5TaXplKTsNCisgIEZpbGVOYW1lcy5BZGQobmFtZSk7DQorICBpbkZpbGUtPkZpbGVOYW1lSW5kZXggPSBGaWxlTmFtZXNfV2FzVXNlZC5BZGQodHJ1ZSk7DQorICBpbkZpbGUtPk9wZW5DYWxsYmFja0ltcCA9IHRoaXM7DQorICBpbkZpbGUtPk9wZW5DYWxsYmFja1JlZiA9IHRoaXM7DQorICAvLyBUb3RhbFNpemUgKz0gX2ZpbGVJbmZvLlNpemU7DQorICAqaW5TdHJlYW0gPSBpblN0cmVhbVRlbXAuRGV0YWNoKCk7DQorICByZXR1cm4gU19PSzsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KKyNpZm5kZWYgX05PX0NSWVBUTw0KK1NURE1FVEhPRElNUCBDT3BlbkNhbGxiYWNrSW1wOjpDcnlwdG9HZXRUZXh0UGFzc3dvcmQoQlNUUiAqcGFzc3dvcmQpDQorew0KKyAgQ09NX1RSWV9CRUdJTg0KKyAgaWYgKFJlT3BlbkNhbGxiYWNrKQ0KKyAgew0KKyAgICBDTXlDb21QdHI8SUNyeXB0b0dldFRleHRQYXNzd29yZD4gZ2V0VGV4dFBhc3N3b3JkOw0KKyAgICBSZU9wZW5DYWxsYmFjay5RdWVyeUludGVyZmFjZShJSURfSUNyeXB0b0dldFRleHRQYXNzd29yZCwgJmdldFRleHRQYXNzd29yZCk7DQorICAgIGlmIChnZXRUZXh0UGFzc3dvcmQpDQorICAgICAgcmV0dXJuIGdldFRleHRQYXNzd29yZC0+Q3J5cHRvR2V0VGV4dFBhc3N3b3JkKHBhc3N3b3JkKTsNCisgIH0NCisgIGlmICghQ2FsbGJhY2spDQorICAgIHJldHVybiBFX05PVElNUEw7DQorICByZXR1cm4gQ2FsbGJhY2stPk9wZW5fQ3J5cHRvR2V0VGV4dFBhc3N3b3JkKHBhc3N3b3JkKTsNCisgIENPTV9UUllfRU5EDQorfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0FyY2hpdmVPcGVuQ2FsbGJhY2suaCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0FyY2hpdmVPcGVuQ2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2IzNjE4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vQXJjaGl2ZU9wZW5DYWxsYmFjay5oCkBAIC0wLDAgKzEsMTExIEBACisvLyBBcmNoaXZlT3BlbkNhbGxiYWNrLmgNCisNCisjaWZuZGVmIF9fQVJDSElWRV9PUEVOX0NBTExCQUNLX0gNCisjZGVmaW5lIF9fQVJDSElWRV9PUEVOX0NBTExCQUNLX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015Q29tLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZUZpbmQuaCINCisNCisjaWZuZGVmIF9OT19DUllQVE8NCisjaW5jbHVkZSAiLi4vLi4vSVBhc3N3b3JkLmgiDQorI2VuZGlmDQorI2luY2x1ZGUgIi4uLy4uL0FyY2hpdmUvSUFyY2hpdmUuaCINCisNCisjaWZkZWYgX05PX0NSWVBUTw0KKw0KKyNkZWZpbmUgSU5URVJGQUNFX0lPcGVuQ2FsbGJhY2tVSV9DcnlwdG8oeCkNCisNCisjZWxzZQ0KKw0KKyNkZWZpbmUgSU5URVJGQUNFX0lPcGVuQ2FsbGJhY2tVSV9DcnlwdG8oeCkgXA0KKyAgdmlydHVhbCBIUkVTVUxUIE9wZW5fQ3J5cHRvR2V0VGV4dFBhc3N3b3JkKEJTVFIgKnBhc3N3b3JkKSB4OyBcDQorICB2aXJ0dWFsIEhSRVNVTFQgT3Blbl9HZXRQYXNzd29yZElmQW55KGJvb2wgJnBhc3N3b3JkSXNEZWZpbmVkLCBVU3RyaW5nICZwYXNzd29yZCkgeDsgXA0KKyAgdmlydHVhbCBib29sIE9wZW5fV2FzUGFzc3dvcmRBc2tlZCgpIHg7IFwNCisgIHZpcnR1YWwgdm9pZCBPcGVuX0NsZWFyUGFzc3dvcmRXYXNBc2tlZEZsYWcoKSB4OyBcDQorICANCisjZW5kaWYNCisNCisjZGVmaW5lIElOVEVSRkFDRV9JT3BlbkNhbGxiYWNrVUkoeCkgXA0KKyAgdmlydHVhbCBIUkVTVUxUIE9wZW5fQ2hlY2tCcmVhaygpIHg7IFwNCisgIHZpcnR1YWwgSFJFU1VMVCBPcGVuX1NldFRvdGFsKGNvbnN0IFVJbnQ2NCAqZmlsZXMsIGNvbnN0IFVJbnQ2NCAqYnl0ZXMpIHg7IFwNCisgIHZpcnR1YWwgSFJFU1VMVCBPcGVuX1NldENvbXBsZXRlZChjb25zdCBVSW50NjQgKmZpbGVzLCBjb25zdCBVSW50NjQgKmJ5dGVzKSB4OyBcDQorICBJTlRFUkZBQ0VfSU9wZW5DYWxsYmFja1VJX0NyeXB0byh4KQ0KKw0KK3N0cnVjdCBJT3BlbkNhbGxiYWNrVUkNCit7DQorICBJTlRFUkZBQ0VfSU9wZW5DYWxsYmFja1VJKD0wKQ0KK307DQorDQorY2xhc3MgQ09wZW5DYWxsYmFja0ltcDoNCisgIHB1YmxpYyBJQXJjaGl2ZU9wZW5DYWxsYmFjaywNCisgIHB1YmxpYyBJQXJjaGl2ZU9wZW5Wb2x1bWVDYWxsYmFjaywNCisgIHB1YmxpYyBJQXJjaGl2ZU9wZW5TZXRTdWJBcmNoaXZlTmFtZSwNCisgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgcHVibGljIElDcnlwdG9HZXRUZXh0UGFzc3dvcmQsDQorICAjZW5kaWYNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KK3B1YmxpYzoNCisgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgTVlfVU5LTk9XTl9JTVAzKA0KKyAgICAgIElBcmNoaXZlT3BlblZvbHVtZUNhbGxiYWNrLA0KKyAgICAgIElDcnlwdG9HZXRUZXh0UGFzc3dvcmQsDQorICAgICAgSUFyY2hpdmVPcGVuU2V0U3ViQXJjaGl2ZU5hbWUNCisgICAgICApDQorICAjZWxzZQ0KKyAgTVlfVU5LTk9XTl9JTVAyKA0KKyAgICAgIElBcmNoaXZlT3BlblZvbHVtZUNhbGxiYWNrLA0KKyAgICAgIElBcmNoaXZlT3BlblNldFN1YkFyY2hpdmVOYW1lDQorICAgICAgKQ0KKyAgI2VuZGlmDQorDQorICBJTlRFUkZBQ0VfSUFyY2hpdmVPcGVuQ2FsbGJhY2soOykNCisgIElOVEVSRkFDRV9JQXJjaGl2ZU9wZW5Wb2x1bWVDYWxsYmFjayg7KQ0KKw0KKyAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICBTVERNRVRIT0QoQ3J5cHRvR2V0VGV4dFBhc3N3b3JkKShCU1RSICpwYXNzd29yZCk7DQorICAjZW5kaWYNCisNCisgIFNURE1FVEhPRChTZXRTdWJBcmNoaXZlTmFtZShjb25zdCB3Y2hhcl90ICpuYW1lKSkNCisgIHsNCisgICAgX3N1YkFyY2hpdmVNb2RlID0gdHJ1ZTsNCisgICAgX3N1YkFyY2hpdmVOYW1lID0gbmFtZTsNCisgICAgLy8gVG90YWxTaXplID0gMDsNCisgICAgcmV0dXJuIFNfT0s7DQorICB9DQorDQorcHJpdmF0ZToNCisgIEZTdHJpbmcgX2ZvbGRlclByZWZpeDsNCisgIE5XaW5kb3dzOjpORmlsZTo6TkZpbmQ6OkNGaWxlSW5mbyBfZmlsZUluZm87DQorICBib29sIF9zdWJBcmNoaXZlTW9kZTsNCisgIFVTdHJpbmcgX3N1YkFyY2hpdmVOYW1lOw0KKw0KK3B1YmxpYzoNCisgIFVTdHJpbmdWZWN0b3IgRmlsZU5hbWVzOw0KKyAgQ0Jvb2xWZWN0b3IgRmlsZU5hbWVzX1dhc1VzZWQ7DQorICBDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gRmlsZVNpemVzOw0KKw0KKyAgSU9wZW5DYWxsYmFja1VJICpDYWxsYmFjazsNCisgIENNeUNvbVB0cjxJQXJjaGl2ZU9wZW5DYWxsYmFjaz4gUmVPcGVuQ2FsbGJhY2s7DQorICAvLyBVSW50NjQgVG90YWxTaXplOw0KKw0KKyAgQ09wZW5DYWxsYmFja0ltcCgpOiBDYWxsYmFjayhOVUxMKSB7fQ0KKyAgdm9pZCBJbml0KGNvbnN0IEZTdHJpbmcgJmZvbGRlclByZWZpeCwgY29uc3QgRlN0cmluZyAmZmlsZU5hbWUpDQorICB7DQorICAgIF9mb2xkZXJQcmVmaXggPSBmb2xkZXJQcmVmaXg7DQorICAgIGlmICghX2ZpbGVJbmZvLkZpbmQoX2ZvbGRlclByZWZpeCArIGZpbGVOYW1lKSkNCisgICAgICB0aHJvdyAyMDEyMTExODsNCisgICAgRmlsZU5hbWVzLkNsZWFyKCk7DQorICAgIEZpbGVOYW1lc19XYXNVc2VkLkNsZWFyKCk7DQorICAgIEZpbGVTaXplcy5DbGVhcigpOw0KKyAgICBfc3ViQXJjaGl2ZU1vZGUgPSBmYWxzZTsNCisgICAgLy8gVG90YWxTaXplID0gMDsNCisgIH0NCisgIGJvb2wgU2V0U2Vjb25kRmlsZUluZm8oQ0ZTVFIgbmV3TmFtZSkNCisgIHsNCisgICAgcmV0dXJuIF9maWxlSW5mby5GaW5kKG5ld05hbWUpICYmICFfZmlsZUluZm8uSXNEaXIoKTsNCisgIH0NCit9Ow0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0JlbmNoLmNwcCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0JlbmNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGRjM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vQmVuY2guY3BwCkBAIC0wLDAgKzEsMjU0NCBAQAorLy8gQmVuY2guY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpZm5kZWYgX1dJTjMyDQorI2RlZmluZSBVU0VfUE9TSVhfVElNRQ0KKyNkZWZpbmUgVVNFX1BPU0lYX1RJTUUyDQorI2VuZGlmDQorDQorI2lmZGVmIFVTRV9QT1NJWF9USU1FDQorI2luY2x1ZGUgPHRpbWUuaD4NCisjaWZkZWYgVVNFX1BPU0lYX1RJTUUyDQorI2luY2x1ZGUgPHN5cy90aW1lLmg+DQorI2VuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIF9XSU4zMg0KKyNkZWZpbmUgVVNFX0FMTE9DQQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBVU0VfQUxMT0NBDQorI2lmZGVmIF9XSU4zMg0KKyNpbmNsdWRlIDxtYWxsb2MuaD4NCisjZWxzZQ0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjZW5kaWYNCisjZW5kaWYNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vQy83ekNyYy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9DL0FsbG9jLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL0MvQ3B1QXJjaC5oIg0KKw0KKyNpZiAhZGVmaW5lZChfN1pJUF9TVCkgfHwgZGVmaW5lZChfV0lOMzIpDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvU3lzdGVtLmgiDQorI2VuZGlmDQorDQorI2lmbmRlZiBfN1pJUF9TVA0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1N5bmNocm9uaXphdGlvbi5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1RocmVhZC5oIg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vSW50VG9TdHJpbmcuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ1RvSW50LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9NZXRob2RQcm9wcy5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vU3RyZWFtVXRpbHMuaCINCisNCisjaW5jbHVkZSAiQmVuY2guaCINCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQorDQorc3RhdGljIGNvbnN0IFVJbnQ2NCBrQ29tcGxleEluQ29tbWFuZHMgPSAoVUludDY0KTEgPDwNCisgICNpZmRlZiBVTkRFUl9DRQ0KKyAgICAzMTsNCisgICNlbHNlDQorICAgIDM0Ow0KKyAgI2VuZGlmDQorDQorc3RhdGljIGNvbnN0IFVJbnQ2NCBrQ29tcGxleEluU2Vjb25kcyA9IDQ7DQorDQorc3RhdGljIHZvaWQgU2V0Q29tcGxleENvbW1hbmRzKFVJbnQzMiBjb21wbGV4SW5TZWNvbmRzLCBVSW50NjQgY3B1RnJlcSwgVUludDY0ICZjb21wbGV4SW5Db21tYW5kcykNCit7DQorICBjb21wbGV4SW5Db21tYW5kcyA9IGtDb21wbGV4SW5Db21tYW5kczsNCisgIGNvbnN0IFVJbnQ2NCBrTWluRnJlcSA9IChVSW50NjQpMTAwMDAwMCAqIDMwOw0KKyAgY29uc3QgVUludDY0IGtNYXhGcmVxID0gKFVJbnQ2NCkxMDAwMDAwICogMjAwMDA7DQorICBpZiAoY3B1RnJlcSA8IGtNaW5GcmVxKSBjcHVGcmVxID0ga01pbkZyZXE7DQorICBpZiAoY3B1RnJlcSA8IGtNYXhGcmVxKQ0KKyAgew0KKyAgICBpZiAoY29tcGxleEluU2Vjb25kcyAhPSAwKQ0KKyAgICAgIGNvbXBsZXhJbkNvbW1hbmRzID0gY29tcGxleEluU2Vjb25kcyAqIGNwdUZyZXE7DQorICAgIGVsc2UNCisgICAgICBjb21wbGV4SW5Db21tYW5kcyA9IGNwdUZyZXEgPj4gMjsNCisgIH0NCit9DQorDQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtOdW1IYXNoRGljdEJpdHMgPSAxNzsNCitzdGF0aWMgY29uc3QgVUludDMyIGtGaWx0ZXJVbnBhY2tTaXplID0gKDQ4IDw8IDEwKTsNCisNCitzdGF0aWMgY29uc3QgdW5zaWduZWQga09sZEx6bWFEaWN0Qml0cyA9IDMwOw0KKw0KK3N0YXRpYyBjb25zdCBVSW50MzIga0FkZGl0aW9uYWxTaXplID0gKDEgPDwgMTYpOw0KK3N0YXRpYyBjb25zdCBVSW50MzIga0NvbXByZXNzZWRBZGRpdGlvbmFsU2l6ZSA9ICgxIDw8IDEwKTsNCitzdGF0aWMgY29uc3QgVUludDMyIGtNYXhMem1hUHJvcFNpemUgPSA1Ow0KKw0KK2NsYXNzIENCYXNlUmFuZG9tR2VuZXJhdG9yDQorew0KKyAgVUludDMyIEExOw0KKyAgVUludDMyIEEyOw0KK3B1YmxpYzoNCisgIENCYXNlUmFuZG9tR2VuZXJhdG9yKCkgeyBJbml0KCk7IH0NCisgIHZvaWQgSW5pdCgpIHsgQTEgPSAzNjI0MzYwNjk7IEEyID0gNTIxMjg4NjI5O30NCisgIFVJbnQzMiBHZXRSbmQoKQ0KKyAgew0KKyAgICByZXR1cm4NCisgICAgICAoKEExID0gMzY5NjkgKiAoQTEgJiAweGZmZmYpICsgKEExID4+IDE2KSkgPDwgMTYpICsNCisgICAgICAoKEEyID0gMTgwMDAgKiAoQTIgJiAweGZmZmYpICsgKEEyID4+IDE2KSkgKTsNCisgIH0NCit9Ow0KKw0KK2NsYXNzIENCZW5jaEJ1ZmZlcg0KK3sNCitwdWJsaWM6DQorICBzaXplX3QgQnVmZmVyU2l6ZTsNCisgIEJ5dGUgKkJ1ZmZlcjsNCisNCisgIENCZW5jaEJ1ZmZlcigpOiBCdWZmZXIoMCkge30NCisgIHZpcnR1YWwgfkNCZW5jaEJ1ZmZlcigpIHsgRnJlZSgpOyB9DQorICB2b2lkIEZyZWUoKQ0KKyAgew0KKyAgICA6Ok1pZEZyZWUoQnVmZmVyKTsNCisgICAgQnVmZmVyID0gMDsNCisgIH0NCisgIGJvb2wgQWxsb2Moc2l6ZV90IGJ1ZmZlclNpemUpDQorICB7DQorICAgIGlmIChCdWZmZXIgIT0gMCAmJiBCdWZmZXJTaXplID09IGJ1ZmZlclNpemUpDQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIEZyZWUoKTsNCisgICAgQnVmZmVyID0gKEJ5dGUgKik6Ok1pZEFsbG9jKGJ1ZmZlclNpemUpOw0KKyAgICBCdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsNCisgICAgcmV0dXJuIChCdWZmZXIgIT0gMCB8fCBidWZmZXJTaXplID09IDApOw0KKyAgfQ0KK307DQorDQorY2xhc3MgQ0JlbmNoUmFuZG9tR2VuZXJhdG9yOiBwdWJsaWMgQ0JlbmNoQnVmZmVyDQorew0KKyAgQ0Jhc2VSYW5kb21HZW5lcmF0b3IgKlJHOw0KK3B1YmxpYzoNCisgIHZvaWQgU2V0KENCYXNlUmFuZG9tR2VuZXJhdG9yICpyZykgeyBSRyA9IHJnOyB9DQorICBVSW50MzIgR2V0VmFsKFVJbnQzMiAmcmVzLCB1bnNpZ25lZCBudW1CaXRzKQ0KKyAgew0KKyAgICBVSW50MzIgdmFsID0gcmVzICYgKCgoVUludDMyKTEgPDwgbnVtQml0cykgLSAxKTsNCisgICAgcmVzID4+PSBudW1CaXRzOw0KKyAgICByZXR1cm4gdmFsOw0KKyAgfQ0KKyAgVUludDMyIEdldExlbihVSW50MzIgJnJlcykNCisgIHsNCisgICAgVUludDMyIGxlbiA9IEdldFZhbChyZXMsIDIpOw0KKyAgICByZXR1cm4gR2V0VmFsKHJlcywgMSArIGxlbik7DQorICB9DQorDQorICB2b2lkIEdlbmVyYXRlU2ltcGxlUmFuZG9tKCkNCisgIHsNCisgICAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBCdWZmZXJTaXplOyBpKyspDQorICAgICAgQnVmZmVyW2ldID0gKEJ5dGUpUkctPkdldFJuZCgpOw0KKyAgfQ0KKw0KKyAgdm9pZCBHZW5lcmF0ZSh1bnNpZ25lZCBkaWN0Qml0cykNCisgIHsNCisgICAgVUludDMyIHBvcyA9IDA7DQorICAgIFVJbnQzMiByZXAwID0gMTsNCisgICAgd2hpbGUgKHBvcyA8IEJ1ZmZlclNpemUpDQorICAgIHsNCisgICAgICBVSW50MzIgcmVzID0gUkctPkdldFJuZCgpOw0KKyAgICAgIHJlcyA+Pj0gMTsNCisgICAgICBpZiAoR2V0VmFsKHJlcywgMSkgPT0gMCB8fCBwb3MgPCAxMDI0KQ0KKyAgICAgICAgQnVmZmVyW3BvcysrXSA9IChCeXRlKShyZXMgJiAweEZGKTsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgVUludDMyIGxlbjsNCisgICAgICAgIGxlbiA9IDEgKyBHZXRMZW4ocmVzKTsNCisgICAgICAgIGlmIChHZXRWYWwocmVzLCAzKSAhPSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBsZW4gKz0gR2V0TGVuKHJlcyk7DQorICAgICAgICAgIGRvDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBVSW50MzIgcHBwID0gR2V0VmFsKHJlcywgNSkgKyA2Ow0KKyAgICAgICAgICAgIHJlcyA9IFJHLT5HZXRSbmQoKTsNCisgICAgICAgICAgICBpZiAocHBwID4gZGljdEJpdHMpDQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICByZXAwID0gLyogKDEgPDwgcHBwKSArKi8gIEdldFZhbChyZXMsIHBwcCk7DQorICAgICAgICAgICAgcmVzID0gUkctPkdldFJuZCgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdoaWxlIChyZXAwID49IHBvcyk7DQorICAgICAgICAgIHJlcDArKzsNCisgICAgICAgIH0NCisNCisgICAgICAgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbGVuICYmIHBvcyA8IEJ1ZmZlclNpemU7IGkrKywgcG9zKyspDQorICAgICAgICAgIEJ1ZmZlcltwb3NdID0gQnVmZmVyW3BvcyAtIHJlcDBdOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK307DQorDQorDQorY2xhc3MgQ0JlbmNobWFya0luU3RyZWFtOg0KKyAgcHVibGljIElTZXF1ZW50aWFsSW5TdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIGNvbnN0IEJ5dGUgKkRhdGE7DQorICBzaXplX3QgUG9zOw0KKyAgc2l6ZV90IFNpemU7DQorcHVibGljOg0KKyAgTVlfVU5LTk9XTl9JTVANCisgIHZvaWQgSW5pdChjb25zdCBCeXRlICpkYXRhLCBzaXplX3Qgc2l6ZSkNCisgIHsNCisgICAgRGF0YSA9IGRhdGE7DQorICAgIFNpemUgPSBzaXplOw0KKyAgICBQb3MgPSAwOw0KKyAgfQ0KKyAgU1RETUVUSE9EKFJlYWQpKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KK307DQorDQorU1RETUVUSE9ESU1QIENCZW5jaG1hcmtJblN0cmVhbTo6UmVhZCh2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIHNpemVfdCByZW1haW4gPSBTaXplIC0gUG9zOw0KKyAgVUludDMyIGtNYXhCbG9ja1NpemUgPSAoMSA8PCAyMCk7DQorICBpZiAoc2l6ZSA+IGtNYXhCbG9ja1NpemUpDQorICAgIHNpemUgPSBrTWF4QmxvY2tTaXplOw0KKyAgaWYgKHNpemUgPiByZW1haW4pDQorICAgIHNpemUgPSAoVUludDMyKXJlbWFpbjsNCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KKyAgICAoKEJ5dGUgKilkYXRhKVtpXSA9IERhdGFbUG9zICsgaV07DQorICBQb3MgKz0gc2l6ZTsNCisgIGlmKHByb2Nlc3NlZFNpemUgIT0gTlVMTCkNCisgICAgKnByb2Nlc3NlZFNpemUgPSBzaXplOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKyAgDQorY2xhc3MgQ0JlbmNobWFya091dFN0cmVhbToNCisgIHB1YmxpYyBJU2VxdWVudGlhbE91dFN0cmVhbSwNCisgIHB1YmxpYyBDQmVuY2hCdWZmZXIsDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIC8vIGJvb2wgX292ZXJmbG93Ow0KK3B1YmxpYzoNCisgIFVJbnQzMiBQb3M7DQorICBib29sIFJlYWxDb3B5Ow0KKyAgYm9vbCBDYWxjQ3JjOw0KKyAgVUludDMyIENyYzsNCisNCisgIC8vIENCZW5jaG1hcmtPdXRTdHJlYW0oKTogX292ZXJmbG93KGZhbHNlKSB7fQ0KKyAgdm9pZCBJbml0KGJvb2wgcmVhbENvcHksIGJvb2wgY2FsY0NyYykNCisgIHsNCisgICAgQ3JjID0gQ1JDX0lOSVRfVkFMOw0KKyAgICBSZWFsQ29weSA9IHJlYWxDb3B5Ow0KKyAgICBDYWxjQ3JjID0gY2FsY0NyYzsNCisgICAgLy8gX292ZXJmbG93ID0gZmFsc2U7DQorICAgIFBvcyA9IDA7DQorICB9DQorICBNWV9VTktOT1dOX0lNUA0KKyAgU1RETUVUSE9EKFdyaXRlKShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCit9Ow0KKw0KK1NURE1FVEhPRElNUCBDQmVuY2htYXJrT3V0U3RyZWFtOjpXcml0ZShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIHNpemVfdCBjdXJTaXplID0gQnVmZmVyU2l6ZSAtIFBvczsNCisgIGlmIChjdXJTaXplID4gc2l6ZSkNCisgICAgY3VyU2l6ZSA9IHNpemU7DQorICBpZiAoUmVhbENvcHkpDQorICAgIG1lbWNweShCdWZmZXIgKyBQb3MsIGRhdGEsIGN1clNpemUpOw0KKyAgaWYgKENhbGNDcmMpDQorICAgIENyYyA9IENyY1VwZGF0ZShDcmMsIGRhdGEsIGN1clNpemUpOw0KKyAgUG9zICs9IChVSW50MzIpY3VyU2l6ZTsNCisgIGlmKHByb2Nlc3NlZFNpemUgIT0gTlVMTCkNCisgICAgKnByb2Nlc3NlZFNpemUgPSAoVUludDMyKWN1clNpemU7DQorICBpZiAoY3VyU2l6ZSAhPSBzaXplKQ0KKyAgew0KKyAgICAvLyBfb3ZlcmZsb3cgPSB0cnVlOw0KKyAgICByZXR1cm4gRV9GQUlMOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKyAgDQorY2xhc3MgQ0NyY091dFN0cmVhbToNCisgIHB1YmxpYyBJU2VxdWVudGlhbE91dFN0cmVhbSwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KK3B1YmxpYzoNCisgIGJvb2wgQ2FsY0NyYzsNCisgIFVJbnQzMiBDcmM7DQorICBNWV9VTktOT1dOX0lNUA0KKyAgICANCisgIENDcmNPdXRTdHJlYW0oKTogQ2FsY0NyYyh0cnVlKSB7fTsNCisgIHZvaWQgSW5pdCgpIHsgQ3JjID0gQ1JDX0lOSVRfVkFMOyB9DQorICBTVERNRVRIT0QoV3JpdGUpKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpOw0KK307DQorDQorU1RETUVUSE9ESU1QIENDcmNPdXRTdHJlYW06OldyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgKnByb2Nlc3NlZFNpemUpDQorew0KKyAgaWYgKENhbGNDcmMpDQorICAgIENyYyA9IENyY1VwZGF0ZShDcmMsIGRhdGEsIHNpemUpOw0KKyAgaWYgKHByb2Nlc3NlZFNpemUgIT0gTlVMTCkNCisgICAgKnByb2Nlc3NlZFNpemUgPSBzaXplOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKyAgDQorc3RhdGljIFVJbnQ2NCBHZXRUaW1lQ291bnQoKQ0KK3sNCisgICNpZmRlZiBVU0VfUE9TSVhfVElNRQ0KKyAgI2lmZGVmIFVTRV9QT1NJWF9USU1FMg0KKyAgdGltZXZhbCB2Ow0KKyAgaWYgKGdldHRpbWVvZmRheSgmdiwgMCkgPT0gMCkNCisgICAgcmV0dXJuIChVSW50NjQpKHYudHZfc2VjKSAqIDEwMDAwMDAgKyB2LnR2X3VzZWM7DQorICByZXR1cm4gKFVJbnQ2NCl0aW1lKE5VTEwpICogMTAwMDAwMDsNCisgICNlbHNlDQorICByZXR1cm4gdGltZShOVUxMKTsNCisgICNlbmRpZg0KKyAgI2Vsc2UNCisgIC8qDQorICBMQVJHRV9JTlRFR0VSIHZhbHVlOw0KKyAgaWYgKDo6UXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnZhbHVlKSkNCisgICAgcmV0dXJuIHZhbHVlLlF1YWRQYXJ0Ow0KKyAgKi8NCisgIHJldHVybiBHZXRUaWNrQ291bnQoKTsNCisgICNlbmRpZg0KK30NCisNCitzdGF0aWMgVUludDY0IEdldEZyZXEoKQ0KK3sNCisgICNpZmRlZiBVU0VfUE9TSVhfVElNRQ0KKyAgI2lmZGVmIFVTRV9QT1NJWF9USU1FMg0KKyAgcmV0dXJuIDEwMDAwMDA7DQorICAjZWxzZQ0KKyAgcmV0dXJuIDE7DQorICAjZW5kaWYNCisgICNlbHNlDQorICAvKg0KKyAgTEFSR0VfSU5URUdFUiB2YWx1ZTsNCisgIGlmICg6OlF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJnZhbHVlKSkNCisgICAgcmV0dXJuIHZhbHVlLlF1YWRQYXJ0Ow0KKyAgKi8NCisgIHJldHVybiAxMDAwOw0KKyAgI2VuZGlmDQorfQ0KKw0KKyNpZmRlZiBVU0VfUE9TSVhfVElNRQ0KKw0KK3N0cnVjdCBDVXNlclRpbWUNCit7DQorICBVSW50NjQgU3VtOw0KKyAgY2xvY2tfdCBQcmV2Ow0KKyAgDQorICB2b2lkIEluaXQoKQ0KKyAgew0KKyAgICBQcmV2ID0gY2xvY2soKTsNCisgICAgU3VtID0gMDsNCisgIH0NCisNCisgIFVJbnQ2NCBHZXRVc2VyVGltZSgpDQorICB7DQorICAgIGNsb2NrX3QgdiA9IGNsb2NrKCk7DQorICAgIFN1bSArPSB2IC0gUHJldjsNCisgICAgUHJldiA9IHY7DQorICAgIHJldHVybiBTdW07DQorICB9DQorfTsNCisNCisjZWxzZQ0KKw0KK3N0YXRpYyBpbmxpbmUgVUludDY0IEdldFRpbWU2NChjb25zdCBGSUxFVElNRSAmdCkgeyByZXR1cm4gKChVSW50NjQpdC5kd0hpZ2hEYXRlVGltZSA8PCAzMikgfCB0LmR3TG93RGF0ZVRpbWU7IH0NCitVSW50NjQgR2V0V2luVXNlclRpbWUoKQ0KK3sNCisgIEZJTEVUSU1FIGNyZWF0aW9uVGltZSwgZXhpdFRpbWUsIGtlcm5lbFRpbWUsIHVzZXJUaW1lOw0KKyAgaWYgKA0KKyAgI2lmZGVmIFVOREVSX0NFDQorICAgIDo6R2V0VGhyZWFkVGltZXMoOjpHZXRDdXJyZW50VGhyZWFkKCkNCisgICNlbHNlDQorICAgIDo6R2V0UHJvY2Vzc1RpbWVzKDo6R2V0Q3VycmVudFByb2Nlc3MoKQ0KKyAgI2VuZGlmDQorICAgICwgJmNyZWF0aW9uVGltZSwgJmV4aXRUaW1lLCAma2VybmVsVGltZSwgJnVzZXJUaW1lKSAhPSAwKQ0KKyAgICByZXR1cm4gR2V0VGltZTY0KHVzZXJUaW1lKSArIEdldFRpbWU2NChrZXJuZWxUaW1lKTsNCisgIHJldHVybiAoVUludDY0KUdldFRpY2tDb3VudCgpICogMTAwMDA7DQorfQ0KKw0KK3N0cnVjdCBDVXNlclRpbWUNCit7DQorICBVSW50NjQgU3RhcnRUaW1lOw0KKw0KKyAgdm9pZCBJbml0KCkgeyBTdGFydFRpbWUgPSBHZXRXaW5Vc2VyVGltZSgpOyB9DQorICBVSW50NjQgR2V0VXNlclRpbWUoKSB7IHJldHVybiBHZXRXaW5Vc2VyVGltZSgpIC0gU3RhcnRUaW1lOyB9DQorfTsNCisNCisjZW5kaWYNCisNCitzdGF0aWMgVUludDY0IEdldFVzZXJGcmVxKCkNCit7DQorICAjaWZkZWYgVVNFX1BPU0lYX1RJTUUNCisgIHJldHVybiBDTE9DS1NfUEVSX1NFQzsNCisgICNlbHNlDQorICByZXR1cm4gMTAwMDAwMDA7DQorICAjZW5kaWYNCit9DQorDQorY2xhc3MgQ0JlbmNoUHJvZ3Jlc3NTdGF0dXMNCit7DQorICAjaWZuZGVmIF83WklQX1NUDQorICBOU3luY2hyb25pemF0aW9uOjpDQ3JpdGljYWxTZWN0aW9uIENTOw0KKyAgI2VuZGlmDQorcHVibGljOg0KKyAgSFJFU1VMVCBSZXM7DQorICBib29sIEVuY29kZU1vZGU7DQorICB2b2lkIFNldFJlc3VsdChIUkVTVUxUIHJlcykNCisgIHsNCisgICAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgICBOU3luY2hyb25pemF0aW9uOjpDQ3JpdGljYWxTZWN0aW9uTG9jayBsb2NrKENTKTsNCisgICAgI2VuZGlmDQorICAgIFJlcyA9IHJlczsNCisgIH0NCisgIEhSRVNVTFQgR2V0UmVzdWx0KCkNCisgIHsNCisgICAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgICBOU3luY2hyb25pemF0aW9uOjpDQ3JpdGljYWxTZWN0aW9uTG9jayBsb2NrKENTKTsNCisgICAgI2VuZGlmDQorICAgIHJldHVybiBSZXM7DQorICB9DQorfTsNCisNCitzdHJ1Y3QgQ0JlbmNoSW5mb0NhbGMNCit7DQorICBDQmVuY2hJbmZvIEJlbmNoSW5mbzsNCisgIENVc2VyVGltZSBVc2VyVGltZTsNCisNCisgIHZvaWQgU2V0U3RhcnRUaW1lKCk7DQorICB2b2lkIFNldEZpbmlzaFRpbWUoQ0JlbmNoSW5mbyAmZGVzdCk7DQorfTsNCisNCit2b2lkIENCZW5jaEluZm9DYWxjOjpTZXRTdGFydFRpbWUoKQ0KK3sNCisgIEJlbmNoSW5mby5HbG9iYWxGcmVxID0gR2V0RnJlcSgpOw0KKyAgQmVuY2hJbmZvLlVzZXJGcmVxID0gR2V0VXNlckZyZXEoKTsNCisgIEJlbmNoSW5mby5HbG9iYWxUaW1lID0gOjpHZXRUaW1lQ291bnQoKTsNCisgIEJlbmNoSW5mby5Vc2VyVGltZSA9IDA7DQorICBVc2VyVGltZS5Jbml0KCk7DQorfQ0KKw0KK3ZvaWQgQ0JlbmNoSW5mb0NhbGM6OlNldEZpbmlzaFRpbWUoQ0JlbmNoSW5mbyAmZGVzdCkNCit7DQorICBkZXN0ID0gQmVuY2hJbmZvOw0KKyAgZGVzdC5HbG9iYWxUaW1lID0gOjpHZXRUaW1lQ291bnQoKSAtIEJlbmNoSW5mby5HbG9iYWxUaW1lOw0KKyAgZGVzdC5Vc2VyVGltZSA9IFVzZXJUaW1lLkdldFVzZXJUaW1lKCk7DQorfQ0KKw0KK2NsYXNzIENCZW5jaFByb2dyZXNzSW5mbzoNCisgIHB1YmxpYyBJQ29tcHJlc3NQcm9ncmVzc0luZm8sDQorICBwdWJsaWMgQ015VW5rbm93bkltcCwNCisgIHB1YmxpYyBDQmVuY2hJbmZvQ2FsYw0KK3sNCitwdWJsaWM6DQorICBDQmVuY2hQcm9ncmVzc1N0YXR1cyAqU3RhdHVzOw0KKyAgSFJFU1VMVCBSZXM7DQorICBJQmVuY2hDYWxsYmFjayAqQ2FsbGJhY2s7DQorDQorICBDQmVuY2hQcm9ncmVzc0luZm8oKTogQ2FsbGJhY2soMCkge30NCisgIE1ZX1VOS05PV05fSU1QDQorICBTVERNRVRIT0QoU2V0UmF0aW9JbmZvKShjb25zdCBVSW50NjQgKmluU2l6ZSwgY29uc3QgVUludDY0ICpvdXRTaXplKTsNCit9Ow0KKw0KK1NURE1FVEhPRElNUCBDQmVuY2hQcm9ncmVzc0luZm86OlNldFJhdGlvSW5mbyhjb25zdCBVSW50NjQgKmluU2l6ZSwgY29uc3QgVUludDY0ICpvdXRTaXplKQ0KK3sNCisgIEhSRVNVTFQgcmVzID0gU3RhdHVzLT5HZXRSZXN1bHQoKTsNCisgIGlmIChyZXMgIT0gU19PSykNCisgICAgcmV0dXJuIHJlczsNCisgIGlmICghQ2FsbGJhY2spDQorICAgIHJldHVybiByZXM7DQorICBDQmVuY2hJbmZvIGluZm87DQorICBTZXRGaW5pc2hUaW1lKGluZm8pOw0KKyAgaWYgKFN0YXR1cy0+RW5jb2RlTW9kZSkNCisgIHsNCisgICAgaW5mby5VbnBhY2tTaXplID0gQmVuY2hJbmZvLlVucGFja1NpemUgKyAqaW5TaXplOw0KKyAgICBpbmZvLlBhY2tTaXplID0gQmVuY2hJbmZvLlBhY2tTaXplICsgKm91dFNpemU7DQorICAgIHJlcyA9IENhbGxiYWNrLT5TZXRFbmNvZGVSZXN1bHQoaW5mbywgZmFsc2UpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBpbmZvLlBhY2tTaXplID0gQmVuY2hJbmZvLlBhY2tTaXplICsgKmluU2l6ZTsNCisgICAgaW5mby5VbnBhY2tTaXplID0gQmVuY2hJbmZvLlVucGFja1NpemUgKyAqb3V0U2l6ZTsNCisgICAgcmVzID0gQ2FsbGJhY2stPlNldERlY29kZVJlc3VsdChpbmZvLCBmYWxzZSk7DQorICB9DQorICBpZiAocmVzICE9IFNfT0spDQorICAgIFN0YXR1cy0+U2V0UmVzdWx0KHJlcyk7DQorICByZXR1cm4gcmVzOw0KK30NCisNCitzdGF0aWMgY29uc3QgaW50IGtTdWJCaXRzID0gODsNCisNCitzdGF0aWMgVUludDMyIEdldExvZ1NpemUoVUludDMyIHNpemUpDQorew0KKyAgZm9yIChpbnQgaSA9IGtTdWJCaXRzOyBpIDwgMzI7IGkrKykNCisgICAgZm9yIChVSW50MzIgaiA9IDA7IGogPCAoMSA8PCBrU3ViQml0cyk7IGorKykNCisgICAgICBpZiAoc2l6ZSA8PSAoKChVSW50MzIpMSkgPDwgaSkgKyAoaiA8PCAoaSAtIGtTdWJCaXRzKSkpDQorICAgICAgICByZXR1cm4gKGkgPDwga1N1YkJpdHMpICsgajsNCisgIHJldHVybiAoMzIgPDwga1N1YkJpdHMpOw0KK30NCisNCitzdGF0aWMgdm9pZCBOb3JtYWxpemVWYWxzKFVJbnQ2NCAmdjEsIFVJbnQ2NCAmdjIpDQorew0KKyAgd2hpbGUgKHYxID4gMTAwMDAwMCkNCisgIHsNCisgICAgdjEgPj49IDE7DQorICAgIHYyID4+PSAxOw0KKyAgfQ0KK30NCisNCitVSW50NjQgQ0JlbmNoSW5mbzo6R2V0VXNhZ2UoKSBjb25zdA0KK3sNCisgIFVJbnQ2NCB1c2VyVGltZSA9IFVzZXJUaW1lOw0KKyAgVUludDY0IHVzZXJGcmVxID0gVXNlckZyZXE7DQorICBVSW50NjQgZ2xvYmFsVGltZSA9IEdsb2JhbFRpbWU7DQorICBVSW50NjQgZ2xvYmFsRnJlcSA9IEdsb2JhbEZyZXE7DQorICBOb3JtYWxpemVWYWxzKHVzZXJUaW1lLCB1c2VyRnJlcSk7DQorICBOb3JtYWxpemVWYWxzKGdsb2JhbEZyZXEsIGdsb2JhbFRpbWUpOw0KKyAgaWYgKHVzZXJGcmVxID09IDApDQorICAgIHVzZXJGcmVxID0gMTsNCisgIGlmIChnbG9iYWxUaW1lID09IDApDQorICAgIGdsb2JhbFRpbWUgPSAxOw0KKyAgcmV0dXJuIHVzZXJUaW1lICogZ2xvYmFsRnJlcSAqIDEwMDAwMDAgLyB1c2VyRnJlcSAvIGdsb2JhbFRpbWU7DQorfQ0KKw0KK1VJbnQ2NCBDQmVuY2hJbmZvOjpHZXRSYXRpbmdQZXJVc2FnZShVSW50NjQgcmF0aW5nKSBjb25zdA0KK3sNCisgIFVJbnQ2NCB1c2VyVGltZSA9IFVzZXJUaW1lOw0KKyAgVUludDY0IHVzZXJGcmVxID0gVXNlckZyZXE7DQorICBVSW50NjQgZ2xvYmFsVGltZSA9IEdsb2JhbFRpbWU7DQorICBVSW50NjQgZ2xvYmFsRnJlcSA9IEdsb2JhbEZyZXE7DQorICBOb3JtYWxpemVWYWxzKHVzZXJGcmVxLCB1c2VyVGltZSk7DQorICBOb3JtYWxpemVWYWxzKGdsb2JhbFRpbWUsIGdsb2JhbEZyZXEpOw0KKyAgaWYgKGdsb2JhbEZyZXEgPT0gMCkNCisgICAgZ2xvYmFsRnJlcSA9IDE7DQorICBpZiAodXNlclRpbWUgPT0gMCkNCisgICAgdXNlclRpbWUgPSAxOw0KKyAgcmV0dXJuIHVzZXJGcmVxICogZ2xvYmFsVGltZSAvIGdsb2JhbEZyZXEgKiByYXRpbmcgLyB1c2VyVGltZTsNCit9DQorDQorc3RhdGljIFVJbnQ2NCBNeU11bHREaXY2NChVSW50NjQgdmFsdWUsIFVJbnQ2NCBlbGFwc2VkVGltZSwgVUludDY0IGZyZXEpDQorew0KKyAgVUludDY0IGVsVGltZSA9IGVsYXBzZWRUaW1lOw0KKyAgTm9ybWFsaXplVmFscyhmcmVxLCBlbFRpbWUpOw0KKyAgaWYgKGVsVGltZSA9PSAwKQ0KKyAgICBlbFRpbWUgPSAxOw0KKyAgcmV0dXJuIHZhbHVlICogZnJlcSAvIGVsVGltZTsNCit9DQorDQorVUludDY0IENCZW5jaEluZm86OkdldFNwZWVkKFVJbnQ2NCBudW1Db21tYW5kcykgY29uc3QNCit7DQorICByZXR1cm4gTXlNdWx0RGl2NjQobnVtQ29tbWFuZHMsIEdsb2JhbFRpbWUsIEdsb2JhbEZyZXEpOw0KK30NCisNCitzdHJ1Y3QgQ0JlbmNoUHJvcHMNCit7DQorICBib29sIEx6bWFSYXRpbmdNb2RlOw0KKyAgDQorICBVSW50MzIgRW5jQ29tcGxleDsNCisgIFVJbnQzMiBEZWNDb21wbGV4Q29tcHI7DQorICBVSW50MzIgRGVjQ29tcGxleFVuYzsNCisNCisgIENCZW5jaFByb3BzKCk6IEx6bWFSYXRpbmdNb2RlKGZhbHNlKSB7fQ0KKyAgdm9pZCBTZXRMem1hQ29tcGV4aXR5KCk7DQorDQorICBVSW50NjQgR2VDb21wckNvbW1hbmRzKFVJbnQ2NCB1bnBhY2tTaXplKQ0KKyAgew0KKyAgICByZXR1cm4gdW5wYWNrU2l6ZSAqIEVuY0NvbXBsZXg7DQorICB9DQorDQorICBVSW50NjQgR2VEZWNvbXByQ29tbWFuZHMoVUludDY0IHBhY2tTaXplLCBVSW50NjQgdW5wYWNrU2l6ZSkNCisgIHsNCisgICAgcmV0dXJuIChwYWNrU2l6ZSAqIERlY0NvbXBsZXhDb21wciArIHVucGFja1NpemUgKiBEZWNDb21wbGV4VW5jKTsNCisgIH0NCisNCisgIFVJbnQ2NCBHZXRDb21wcmVzc1JhdGluZyhVSW50MzIgZGljdFNpemUsIFVJbnQ2NCBlbGFwc2VkVGltZSwgVUludDY0IGZyZXEsIFVJbnQ2NCBzaXplKTsNCisgIFVJbnQ2NCBHZXREZWNvbXByZXNzUmF0aW5nKFVJbnQ2NCBlbGFwc2VkVGltZSwgVUludDY0IGZyZXEsIFVJbnQ2NCBvdXRTaXplLCBVSW50NjQgaW5TaXplLCBVSW50NjQgbnVtSXRlcmF0aW9ucyk7DQorfTsNCisNCit2b2lkIENCZW5jaFByb3BzOjpTZXRMem1hQ29tcGV4aXR5KCkNCit7DQorICBFbmNDb21wbGV4ID0gMTIwMDsNCisgIERlY0NvbXBsZXhVbmMgPSA0Ow0KKyAgRGVjQ29tcGxleENvbXByID0gMTkwOw0KKyAgTHptYVJhdGluZ01vZGUgPSB0cnVlOw0KK30NCisNCitVSW50NjQgQ0JlbmNoUHJvcHM6OkdldENvbXByZXNzUmF0aW5nKFVJbnQzMiBkaWN0U2l6ZSwgVUludDY0IGVsYXBzZWRUaW1lLCBVSW50NjQgZnJlcSwgVUludDY0IHNpemUpDQorew0KKyAgaWYgKGRpY3RTaXplIDwgKDEgPDwga0JlbmNoTWluRGljTG9nU2l6ZSkpDQorICAgIGRpY3RTaXplID0gKDEgPDwga0JlbmNoTWluRGljTG9nU2l6ZSk7DQorICBVSW50NjQgZW5jQ29tcGxleCA9IEVuY0NvbXBsZXg7DQorICBpZiAoTHptYVJhdGluZ01vZGUpDQorICB7DQorICAgIFVJbnQ2NCB0ID0gR2V0TG9nU2l6ZShkaWN0U2l6ZSkgLSAoa0JlbmNoTWluRGljTG9nU2l6ZSA8PCBrU3ViQml0cyk7DQorICAgIGVuY0NvbXBsZXggPSA4NzAgKyAoKHQgKiB0ICogNSkgPj4gKDIgKiBrU3ViQml0cykpOw0KKyAgfQ0KKyAgVUludDY0IG51bUNvbW1hbmRzID0gKFVJbnQ2NClzaXplICogZW5jQ29tcGxleDsNCisgIHJldHVybiBNeU11bHREaXY2NChudW1Db21tYW5kcywgZWxhcHNlZFRpbWUsIGZyZXEpOw0KK30NCisNCitVSW50NjQgQ0JlbmNoUHJvcHM6OkdldERlY29tcHJlc3NSYXRpbmcoVUludDY0IGVsYXBzZWRUaW1lLCBVSW50NjQgZnJlcSwgVUludDY0IG91dFNpemUsIFVJbnQ2NCBpblNpemUsIFVJbnQ2NCBudW1JdGVyYXRpb25zKQ0KK3sNCisgIFVJbnQ2NCBudW1Db21tYW5kcyA9IChpblNpemUgKiBEZWNDb21wbGV4Q29tcHIgKyBvdXRTaXplICogRGVjQ29tcGxleFVuYykgKiBudW1JdGVyYXRpb25zOw0KKyAgcmV0dXJuIE15TXVsdERpdjY0KG51bUNvbW1hbmRzLCBlbGFwc2VkVGltZSwgZnJlcSk7DQorfQ0KKw0KK1VJbnQ2NCBHZXRDb21wcmVzc1JhdGluZyhVSW50MzIgZGljdFNpemUsIFVJbnQ2NCBlbGFwc2VkVGltZSwgVUludDY0IGZyZXEsIFVJbnQ2NCBzaXplKQ0KK3sNCisgIENCZW5jaFByb3BzIHByb3BzOw0KKyAgcHJvcHMuU2V0THptYUNvbXBleGl0eSgpOw0KKyAgcmV0dXJuIHByb3BzLkdldENvbXByZXNzUmF0aW5nKGRpY3RTaXplLCBlbGFwc2VkVGltZSwgZnJlcSwgc2l6ZSk7DQorfQ0KKw0KK1VJbnQ2NCBHZXREZWNvbXByZXNzUmF0aW5nKFVJbnQ2NCBlbGFwc2VkVGltZSwgVUludDY0IGZyZXEsIFVJbnQ2NCBvdXRTaXplLCBVSW50NjQgaW5TaXplLCBVSW50NjQgbnVtSXRlcmF0aW9ucykNCit7DQorICBDQmVuY2hQcm9wcyBwcm9wczsNCisgIHByb3BzLlNldEx6bWFDb21wZXhpdHkoKTsNCisgIHJldHVybiBwcm9wcy5HZXREZWNvbXByZXNzUmF0aW5nKGVsYXBzZWRUaW1lLCBmcmVxLCBvdXRTaXplLCBpblNpemUsIG51bUl0ZXJhdGlvbnMpOw0KK30NCisNCitzdHJ1Y3QgQ0VuY29kZXJJbmZvOw0KKw0KK3N0cnVjdCBDRW5jb2RlckluZm8NCit7DQorICAjaWZuZGVmIF83WklQX1NUDQorICBOV2luZG93czo6Q1RocmVhZCB0aHJlYWRbMl07DQorICBVSW50MzIgTnVtRGVjb2RlclN1YlRocmVhZHM7DQorICAjZW5kaWYNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NDb2Rlcj4gX2VuY29kZXI7DQorICBDTXlDb21QdHI8SUNvbXByZXNzRmlsdGVyPiBfZW5jb2RlckZpbHRlcjsNCisgIENCZW5jaFByb2dyZXNzSW5mbyAqcHJvZ3Jlc3NJbmZvU3BlY1syXTsNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NQcm9ncmVzc0luZm8+IHByb2dyZXNzSW5mb1syXTsNCisgIFVJbnQ2NCBOdW1JdGVyYXRpb25zOw0KKyAgI2lmZGVmIFVTRV9BTExPQ0ENCisgIHNpemVfdCBBbGxvY2FTaXplOw0KKyAgI2VuZGlmDQorDQorICBCeXRlIF9rZXlbMzJdOw0KKyAgQnl0ZSBfaXZbMTZdOw0KKyAgQnl0ZSBfcHN3WzE2XTsNCisgIGJvb2wgQ2hlY2tDcmNfRW5jOw0KKyAgYm9vbCBDaGVja0NyY19EZWM7DQorDQorICBzdHJ1Y3QgQ0RlY29kZXJJbmZvDQorICB7DQorICAgIENFbmNvZGVySW5mbyAqRW5jb2RlcjsNCisgICAgVUludDMyIERlY29kZXJJbmRleDsNCisgICAgI2lmZGVmIFVTRV9BTExPQ0ENCisgICAgc2l6ZV90IEFsbG9jYVNpemU7DQorICAgICNlbmRpZg0KKyAgICBib29sIENhbGxiYWNrTW9kZTsNCisgIH07DQorICBDRGVjb2RlckluZm8gZGVjb2RlcnNJbmZvWzJdOw0KKw0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyPiBfZGVjb2RlcnNbMl07DQorICBDTXlDb21QdHI8SUNvbXByZXNzRmlsdGVyPiBfZGVjb2RlckZpbHRlcjsNCisNCisgIEhSRVNVTFQgUmVzdWx0c1syXTsNCisgIENCZW5jaG1hcmtPdXRTdHJlYW0gKm91dFN0cmVhbVNwZWM7DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IG91dFN0cmVhbTsNCisgIElCZW5jaENhbGxiYWNrICpjYWxsYmFjazsNCisgIElCZW5jaFByaW50Q2FsbGJhY2sgKnByaW50Q2FsbGJhY2s7DQorICBVSW50MzIgY3JjOw0KKyAgVUludDMyIGtCdWZmZXJTaXplOw0KKyAgVUludDMyIGNvbXByZXNzZWRTaXplOw0KKyAgQ0JlbmNoUmFuZG9tR2VuZXJhdG9yIHJnOw0KKyAgQ0JlbmNoQnVmZmVyIHJnQ29weTsgLy8gaXQgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQgISEhDQorICBDQmVuY2htYXJrT3V0U3RyZWFtICpwcm9wU3RyZWFtU3BlYzsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gcHJvcFN0cmVhbTsNCisNCisgIC8vIGZvciBkZWNvZGUNCisgIENPbmVNZXRob2RJbmZvIF9tZXRob2Q7DQorICBVSW50MzIgX3VuY29tcHJlc3NlZERhdGFTaXplOw0KKw0KKyAgSFJFU1VMVCBJbml0KA0KKyAgICAgIGNvbnN0IENPbmVNZXRob2RJbmZvICZtZXRob2QsDQorICAgICAgVUludDMyIHVuY29tcHJlc3NlZERhdGFTaXplLA0KKyAgICAgIHVuc2lnbmVkIGdlbmVyYXRlRGljdEJpdHMsDQorICAgICAgQ0Jhc2VSYW5kb21HZW5lcmF0b3IgKnJnKTsNCisgIEhSRVNVTFQgRW5jb2RlKCk7DQorICBIUkVTVUxUIERlY29kZShVSW50MzIgZGVjb2RlckluZGV4KTsNCisNCisgIENFbmNvZGVySW5mbygpOg0KKyAgICBDaGVja0NyY19FbmModHJ1ZSksDQorICAgIENoZWNrQ3JjX0RlYyh0cnVlKSwNCisgICAgb3V0U3RyZWFtU3BlYygwKSwgY2FsbGJhY2soMCksIHByaW50Q2FsbGJhY2soMCksIHByb3BTdHJlYW1TcGVjKDApIHt9DQorDQorICAjaWZuZGVmIF83WklQX1NUDQorICBzdGF0aWMgVEhSRUFEX0ZVTkNfREVDTCBFbmNvZGVUaHJlYWRGdW5jdGlvbih2b2lkICpwYXJhbSkNCisgIHsNCisgICAgSFJFU1VMVCByZXM7DQorICAgIENFbmNvZGVySW5mbyAqZW5jb2RlciA9IChDRW5jb2RlckluZm8gKilwYXJhbTsNCisgICAgdHJ5DQorICAgIHsNCisgICAgICAjaWZkZWYgVVNFX0FMTE9DQQ0KKyAgICAgIGFsbG9jYShlbmNvZGVyLT5BbGxvY2FTaXplKTsNCisgICAgICAjZW5kaWYNCisgICAgICByZXMgPSBlbmNvZGVyLT5FbmNvZGUoKTsNCisgICAgICBlbmNvZGVyLT5SZXN1bHRzWzBdID0gcmVzOw0KKyAgICB9DQorICAgIGNhdGNoKC4uLikNCisgICAgew0KKyAgICAgIHJlcyA9IEVfRkFJTDsNCisgICAgfQ0KKyAgICBpZiAocmVzICE9IFNfT0spDQorICAgICAgZW5jb2Rlci0+cHJvZ3Jlc3NJbmZvU3BlY1swXS0+U3RhdHVzLT5TZXRSZXN1bHQocmVzKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBzdGF0aWMgVEhSRUFEX0ZVTkNfREVDTCBEZWNvZGVUaHJlYWRGdW5jdGlvbih2b2lkICpwYXJhbSkNCisgIHsNCisgICAgQ0RlY29kZXJJbmZvICpkZWNvZGVyID0gKENEZWNvZGVySW5mbyAqKXBhcmFtOw0KKyAgICAjaWZkZWYgVVNFX0FMTE9DQQ0KKyAgICBhbGxvY2EoZGVjb2Rlci0+QWxsb2NhU2l6ZSk7DQorICAgICNlbmRpZg0KKyAgICBDRW5jb2RlckluZm8gKmVuY29kZXIgPSBkZWNvZGVyLT5FbmNvZGVyOw0KKyAgICBlbmNvZGVyLT5SZXN1bHRzW2RlY29kZXItPkRlY29kZXJJbmRleF0gPSBlbmNvZGVyLT5EZWNvZGUoZGVjb2Rlci0+RGVjb2RlckluZGV4KTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorDQorICBIUkVTVUxUIENyZWF0ZUVuY29kZXJUaHJlYWQoKQ0KKyAgew0KKyAgICByZXR1cm4gdGhyZWFkWzBdLkNyZWF0ZShFbmNvZGVUaHJlYWRGdW5jdGlvbiwgdGhpcyk7DQorICB9DQorDQorICBIUkVTVUxUIENyZWF0ZURlY29kZXJUaHJlYWQoaW50IGluZGV4LCBib29sIGNhbGxiYWNrTW9kZQ0KKyAgICAgICNpZmRlZiBVU0VfQUxMT0NBDQorICAgICAgLCBzaXplX3QgYWxsb2NhU2l6ZQ0KKyAgICAgICNlbmRpZg0KKyAgICAgICkNCisgIHsNCisgICAgQ0RlY29kZXJJbmZvICZkZWNvZGVyID0gZGVjb2RlcnNJbmZvW2luZGV4XTsNCisgICAgZGVjb2Rlci5EZWNvZGVySW5kZXggPSBpbmRleDsNCisgICAgZGVjb2Rlci5FbmNvZGVyID0gdGhpczsNCisgICAgI2lmZGVmIFVTRV9BTExPQ0ENCisgICAgZGVjb2Rlci5BbGxvY2FTaXplID0gYWxsb2NhU2l6ZTsNCisgICAgI2VuZGlmDQorICAgIGRlY29kZXIuQ2FsbGJhY2tNb2RlID0gY2FsbGJhY2tNb2RlOw0KKyAgICByZXR1cm4gdGhyZWFkW2luZGV4XS5DcmVhdGUoRGVjb2RlVGhyZWFkRnVuY3Rpb24sICZkZWNvZGVyKTsNCisgIH0NCisgICNlbmRpZg0KK307DQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrX0xaTUEgID0gMHgwMzAxMDE7DQorDQorSFJFU1VMVCBDRW5jb2RlckluZm86OkluaXQoDQorICAgIGNvbnN0IENPbmVNZXRob2RJbmZvICZtZXRob2QsDQorICAgIFVJbnQzMiB1bmNvbXByZXNzZWREYXRhU2l6ZSwNCisgICAgdW5zaWduZWQgZ2VuZXJhdGVEaWN0Qml0cywNCisgICAgQ0Jhc2VSYW5kb21HZW5lcmF0b3IgKnJnTG9jKQ0KK3sNCisgIHJnLlNldChyZ0xvYyk7DQorICBrQnVmZmVyU2l6ZSA9IHVuY29tcHJlc3NlZERhdGFTaXplOw0KKyAgVUludDMyIGtDb21wcmVzc2VkQnVmZmVyU2l6ZSA9DQorICAgICAga0J1ZmZlclNpemUgKyBrQ29tcHJlc3NlZEFkZGl0aW9uYWxTaXplOw0KKyAgICAgIC8vIChrQnVmZmVyU2l6ZSAtIGtCdWZmZXJTaXplIC8gNCkgKyBrQ29tcHJlc3NlZEFkZGl0aW9uYWxTaXplOw0KKyAgaWYgKCFyZy5BbGxvYyhrQnVmZmVyU2l6ZSkpDQorICAgIHJldHVybiBFX09VVE9GTUVNT1JZOw0KKyAgaWYgKGdlbmVyYXRlRGljdEJpdHMgPT0gMCkNCisgICAgcmcuR2VuZXJhdGVTaW1wbGVSYW5kb20oKTsNCisgIGVsc2UNCisgICAgcmcuR2VuZXJhdGUoZ2VuZXJhdGVEaWN0Qml0cyk7DQorICBjcmMgPSBDcmNDYWxjKHJnLkJ1ZmZlciwgcmcuQnVmZmVyU2l6ZSk7DQorDQorICBpZiAoX2VuY29kZXJGaWx0ZXIpDQorICB7DQorICAgIGlmICghcmdDb3B5LkFsbG9jKHJnLkJ1ZmZlclNpemUpKQ0KKyAgICAgIHJldHVybiBFX09VVE9GTUVNT1JZOw0KKyAgfQ0KKw0KKw0KKyAgb3V0U3RyZWFtU3BlYyA9IG5ldyBDQmVuY2htYXJrT3V0U3RyZWFtOw0KKyAgaWYgKCFvdXRTdHJlYW1TcGVjLT5BbGxvYyhrQ29tcHJlc3NlZEJ1ZmZlclNpemUpKQ0KKyAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisNCisgIG91dFN0cmVhbSA9IG91dFN0cmVhbVNwZWM7DQorDQorICBwcm9wU3RyZWFtU3BlYyA9IDA7DQorICBpZiAoIXByb3BTdHJlYW0pDQorICB7DQorICAgIHByb3BTdHJlYW1TcGVjID0gbmV3IENCZW5jaG1hcmtPdXRTdHJlYW07DQorICAgIHByb3BTdHJlYW0gPSBwcm9wU3RyZWFtU3BlYzsNCisgIH0NCisgIGlmICghcHJvcFN0cmVhbVNwZWMtPkFsbG9jKGtNYXhMem1hUHJvcFNpemUpKQ0KKyAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisgIHByb3BTdHJlYW1TcGVjLT5Jbml0KHRydWUsIGZhbHNlKTsNCisgIA0KKyANCisgIENNeUNvbVB0cjxJVW5rbm93bj4gY29kZXI7DQorICBpZiAoX2VuY29kZXJGaWx0ZXIpDQorICAgIGNvZGVyID0gX2VuY29kZXJGaWx0ZXI7DQorICBlbHNlDQorICAgIGNvZGVyID0gX2VuY29kZXI7DQorICB7DQorICAgIENNeUNvbVB0cjxJQ29tcHJlc3NTZXRDb2RlclByb3BlcnRpZXM+IHNjcDsNCisgICAgY29kZXIuUXVlcnlJbnRlcmZhY2UoSUlEX0lDb21wcmVzc1NldENvZGVyUHJvcGVydGllcywgJnNjcCk7DQorICAgIGlmIChzY3ApDQorICAgIHsNCisgICAgICBVSW50NjQgcmVkdWNlU2l6ZSA9IHVuY29tcHJlc3NlZERhdGFTaXplOw0KKyAgICAgIFJJTk9LKG1ldGhvZC5TZXRDb2RlclByb3BzKHNjcCwgJnJlZHVjZVNpemUpKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBpZiAobWV0aG9kLkFyZVRoZXJlTm9uT3B0aW9uYWxQcm9wcygpKQ0KKyAgICAgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgICAgfQ0KKw0KKyAgICBDTXlDb21QdHI8SUNvbXByZXNzV3JpdGVDb2RlclByb3BlcnRpZXM+IHdyaXRlQ29kZXJQcm9wczsNCisgICAgY29kZXIuUXVlcnlJbnRlcmZhY2UoSUlEX0lDb21wcmVzc1dyaXRlQ29kZXJQcm9wZXJ0aWVzLCAmd3JpdGVDb2RlclByb3BzKTsNCisgICAgaWYgKHdyaXRlQ29kZXJQcm9wcykNCisgICAgew0KKyAgICAgIFJJTk9LKHdyaXRlQ29kZXJQcm9wcy0+V3JpdGVDb2RlclByb3BlcnRpZXMocHJvcFN0cmVhbSkpOw0KKyAgICB9DQorDQorICAgIHsNCisgICAgICBDTXlDb21QdHI8SUNyeXB0b1NldFBhc3N3b3JkPiBzcDsNCisgICAgICBjb2Rlci5RdWVyeUludGVyZmFjZShJSURfSUNyeXB0b1NldFBhc3N3b3JkLCAmc3ApOw0KKyAgICAgIGlmIChzcCkNCisgICAgICB7DQorICAgICAgICBSSU5PSyhzcC0+Q3J5cHRvU2V0UGFzc3dvcmQoX3Bzdywgc2l6ZW9mKF9wc3cpKSk7DQorDQorICAgICAgICAvLyB3ZSBtdXN0IGNhbGwgZW5jb2Rpbmcgb25lIHRpbWUgdG8gY2FsY3VsYXRlIHBhc3N3b3JkIGtleSBmb3Iga2V5IGNhY2hlLg0KKyAgICAgICAgLy8gaXQgbXVzdCBiZSBhZnRlciBXcml0ZUNvZGVyUHJvcGVydGllcyENCisgICAgICAgIENCZW5jaG1hcmtJblN0cmVhbSAqaW5TdHJlYW1TcGVjID0gbmV3IENCZW5jaG1hcmtJblN0cmVhbTsNCisgICAgICAgIENNeUNvbVB0cjxJU2VxdWVudGlhbEluU3RyZWFtPiBpblN0cmVhbSA9IGluU3RyZWFtU3BlYzsNCisgICAgICAgIEJ5dGUgdGVtcFsxNl07DQorICAgICAgICBtZW1zZXQodGVtcCwgMCwgc2l6ZW9mKHRlbXApKTsNCisgICAgICAgIGluU3RyZWFtU3BlYy0+SW5pdCh0ZW1wLCBzaXplb2YodGVtcCkpOw0KKyAgICAgICAgDQorICAgICAgICBDQ3JjT3V0U3RyZWFtICpvdXRTdHJlYW1TcGVjID0gbmV3IENDcmNPdXRTdHJlYW07DQorICAgICAgICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IG91dFN0cmVhbSA9IG91dFN0cmVhbVNwZWM7DQorICAgICAgICBvdXRTdHJlYW1TcGVjLT5Jbml0KCk7DQorICAgICAgICANCisgICAgICAgIGlmIChfZW5jb2RlckZpbHRlcikNCisgICAgICAgIHsNCisgICAgICAgICAgX2VuY29kZXJGaWx0ZXItPkluaXQoKTsNCisgICAgICAgICAgX2VuY29kZXJGaWx0ZXItPkZpbHRlcih0ZW1wLCBzaXplb2YodGVtcCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICBSSU5PSyhfZW5jb2Rlci0+Q29kZShpblN0cmVhbSwgb3V0U3RyZWFtLCAwLCAwLCBOVUxMKSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorDQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDRW5jb2RlckluZm86OkVuY29kZSgpDQorew0KKyAgQ0JlbmNoSW5mbyAmYmkgPSBwcm9ncmVzc0luZm9TcGVjWzBdLT5CZW5jaEluZm87DQorICBiaS5VbnBhY2tTaXplID0gMDsNCisgIGJpLlBhY2tTaXplID0gMDsNCisgIENNeUNvbVB0cjxJQ3J5cHRvUHJvcGVydGllcz4gY3A7DQorICBDTXlDb21QdHI8SVVua25vd24+IGNvZGVyOw0KKyAgaWYgKF9lbmNvZGVyRmlsdGVyKQ0KKyAgICBjb2RlciA9IF9lbmNvZGVyRmlsdGVyOw0KKyAgZWxzZQ0KKyAgICBjb2RlciA9IF9lbmNvZGVyOw0KKyAgY29kZXIuUXVlcnlJbnRlcmZhY2UoSUlEX0lDcnlwdG9Qcm9wZXJ0aWVzLCAmY3ApOw0KKyAgQ0JlbmNobWFya0luU3RyZWFtICppblN0cmVhbVNwZWMgPSBuZXcgQ0JlbmNobWFya0luU3RyZWFtOw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IGluU3RyZWFtID0gaW5TdHJlYW1TcGVjOw0KKyAgVUludDY0IHByZXYgPSAwOw0KKw0KKyAgVUludDMyIGNyY1ByZXYgPSAwOw0KKw0KKyAgaWYgKGNwKQ0KKyAgew0KKyAgICBSSU5PSyhjcC0+U2V0S2V5KF9rZXksIHNpemVvZihfa2V5KSkpOw0KKyAgICBSSU5PSyhjcC0+U2V0SW5pdFZlY3RvcihfaXYsIHNpemVvZihfaXYpKSk7DQorICB9DQorDQorICBmb3IgKFVJbnQ2NCBpID0gMDsgaSA8IE51bUl0ZXJhdGlvbnM7IGkrKykNCisgIHsNCisgICAgaWYgKHByaW50Q2FsbGJhY2sgJiYgYmkuVW5wYWNrU2l6ZSAtIHByZXYgPiAoMSA8PCAyMCkpDQorICAgIHsNCisgICAgICBSSU5PSyhwcmludENhbGxiYWNrLT5DaGVja0JyZWFrKCkpOw0KKyAgICAgIHByZXYgPSBiaS5VbnBhY2tTaXplOw0KKyAgICB9DQorICAgIA0KKyAgICBib29sIGlzTGFzdCA9IChpID09IE51bUl0ZXJhdGlvbnMgLSAxKTsNCisgICAgYm9vbCBjYWxjQ3JjID0gKChpc0xhc3QgfHwgKGkgJiAweDdGKSA9PSAwIHx8IENoZWNrQ3JjX0VuYykgJiYgTnVtSXRlcmF0aW9ucyAhPSAxKTsNCisgICAgb3V0U3RyZWFtU3BlYy0+SW5pdChpc0xhc3QsIGNhbGNDcmMpOw0KKyAgICANCisgICAgaWYgKF9lbmNvZGVyRmlsdGVyKQ0KKyAgICB7DQorICAgICAgbWVtY3B5KHJnQ29weS5CdWZmZXIsIHJnLkJ1ZmZlciwgcmcuQnVmZmVyU2l6ZSk7DQorICAgICAgX2VuY29kZXJGaWx0ZXItPkluaXQoKTsNCisgICAgICBfZW5jb2RlckZpbHRlci0+RmlsdGVyKHJnQ29weS5CdWZmZXIsIChVSW50MzIpcmcuQnVmZmVyU2l6ZSk7DQorICAgICAgUklOT0soV3JpdGVTdHJlYW0ob3V0U3RyZWFtLCByZ0NvcHkuQnVmZmVyLCByZy5CdWZmZXJTaXplKSk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgaW5TdHJlYW1TcGVjLT5Jbml0KHJnLkJ1ZmZlciwgcmcuQnVmZmVyU2l6ZSk7DQorICAgICAgUklOT0soX2VuY29kZXItPkNvZGUoaW5TdHJlYW0sIG91dFN0cmVhbSwgMCwgMCwgcHJvZ3Jlc3NJbmZvWzBdKSk7DQorICAgIH0NCisNCisgICAgVUludDMyIGNyY05ldyA9IENSQ19HRVRfRElHRVNUKG91dFN0cmVhbVNwZWMtPkNyYyk7DQorICAgIGlmIChpID09IDApDQorICAgICAgY3JjUHJldiA9IGNyY05ldzsNCisgICAgZWxzZSBpZiAoY2FsY0NyYyAmJiBjcmNQcmV2ICE9IGNyY05ldykNCisgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICBjb21wcmVzc2VkU2l6ZSA9IG91dFN0cmVhbVNwZWMtPlBvczsNCisgICAgYmkuVW5wYWNrU2l6ZSArPSByZy5CdWZmZXJTaXplOw0KKyAgICBiaS5QYWNrU2l6ZSArPSBjb21wcmVzc2VkU2l6ZTsNCisgIH0NCisgIF9lbmNvZGVyLlJlbGVhc2UoKTsNCisgIF9lbmNvZGVyRmlsdGVyLlJlbGVhc2UoKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENFbmNvZGVySW5mbzo6RGVjb2RlKFVJbnQzMiBkZWNvZGVySW5kZXgpDQorew0KKyAgQ0JlbmNobWFya0luU3RyZWFtICppblN0cmVhbVNwZWMgPSBuZXcgQ0JlbmNobWFya0luU3RyZWFtOw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IGluU3RyZWFtID0gaW5TdHJlYW1TcGVjOw0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyPiAmZGVjb2RlciA9IF9kZWNvZGVyc1tkZWNvZGVySW5kZXhdOw0KKyAgQ015Q29tUHRyPElVbmtub3duPiBjb2RlcjsNCisgIGlmIChfZGVjb2RlckZpbHRlcikNCisgIHsNCisgICAgaWYgKGRlY29kZXJJbmRleCAhPSAwKQ0KKyAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgIGNvZGVyID0gX2RlY29kZXJGaWx0ZXI7DQorICB9DQorICBlbHNlDQorICAgIGNvZGVyID0gZGVjb2RlcjsNCisNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NTZXREZWNvZGVyUHJvcGVydGllczI+IHNldERlY1Byb3BzOw0KKyAgY29kZXIuUXVlcnlJbnRlcmZhY2UoSUlEX0lDb21wcmVzc1NldERlY29kZXJQcm9wZXJ0aWVzMiwgJnNldERlY1Byb3BzKTsNCisgIGlmICghc2V0RGVjUHJvcHMgJiYgcHJvcFN0cmVhbVNwZWMtPlBvcyAhPSAwKQ0KKyAgICByZXR1cm4gRV9GQUlMOw0KKw0KKyAgQ0NyY091dFN0cmVhbSAqY3JjT3V0U3RyZWFtU3BlYyA9IG5ldyBDQ3JjT3V0U3RyZWFtOw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsT3V0U3RyZWFtPiBjcmNPdXRTdHJlYW0gPSBjcmNPdXRTdHJlYW1TcGVjOw0KKyAgICANCisgIENCZW5jaFByb2dyZXNzSW5mbyAqcGkgPSBwcm9ncmVzc0luZm9TcGVjW2RlY29kZXJJbmRleF07DQorICBwaS0+QmVuY2hJbmZvLlVucGFja1NpemUgPSAwOw0KKyAgcGktPkJlbmNoSW5mby5QYWNrU2l6ZSA9IDA7DQorDQorICAjaWZuZGVmIF83WklQX1NUDQorICB7DQorICAgIENNeUNvbVB0cjxJQ29tcHJlc3NTZXRDb2Rlck10PiBzZXRDb2Rlck10Ow0KKyAgICBjb2Rlci5RdWVyeUludGVyZmFjZShJSURfSUNvbXByZXNzU2V0Q29kZXJNdCwgJnNldENvZGVyTXQpOw0KKyAgICBpZiAoc2V0Q29kZXJNdCkNCisgICAgew0KKyAgICAgIFJJTk9LKHNldENvZGVyTXQtPlNldE51bWJlck9mVGhyZWFkcyhOdW1EZWNvZGVyU3ViVGhyZWFkcykpOw0KKyAgICB9DQorICB9DQorICAjZW5kaWYNCisNCisgIENNeUNvbVB0cjxJQ29tcHJlc3NTZXRDb2RlclByb3BlcnRpZXM+IHNjcDsNCisgIGNvZGVyLlF1ZXJ5SW50ZXJmYWNlKElJRF9JQ29tcHJlc3NTZXRDb2RlclByb3BlcnRpZXMsICZzY3ApOw0KKyAgaWYgKHNjcCkNCisgIHsNCisgICAgVUludDY0IHJlZHVjZVNpemUgPSBfdW5jb21wcmVzc2VkRGF0YVNpemU7DQorICAgIFJJTk9LKF9tZXRob2QuU2V0Q29kZXJQcm9wcyhzY3AsICZyZWR1Y2VTaXplKSk7DQorICB9DQorDQorICBDTXlDb21QdHI8SUNyeXB0b1Byb3BlcnRpZXM+IGNwOw0KKyAgY29kZXIuUXVlcnlJbnRlcmZhY2UoSUlEX0lDcnlwdG9Qcm9wZXJ0aWVzLCAmY3ApOw0KKyAgDQorICBpZiAoc2V0RGVjUHJvcHMpDQorICB7DQorICAgIFJJTk9LKHNldERlY1Byb3BzLT5TZXREZWNvZGVyUHJvcGVydGllczIocHJvcFN0cmVhbVNwZWMtPkJ1ZmZlciwgcHJvcFN0cmVhbVNwZWMtPlBvcykpOw0KKyAgfQ0KKw0KKyAgew0KKyAgICBDTXlDb21QdHI8SUNyeXB0b1NldFBhc3N3b3JkPiBzcDsNCisgICAgY29kZXIuUXVlcnlJbnRlcmZhY2UoSUlEX0lDcnlwdG9TZXRQYXNzd29yZCwgJnNwKTsNCisgICAgaWYgKHNwKQ0KKyAgICB7DQorICAgICAgUklOT0soc3AtPkNyeXB0b1NldFBhc3N3b3JkKF9wc3csIHNpemVvZihfcHN3KSkpOw0KKyAgICB9DQorICB9DQorDQorICBVSW50NjQgcHJldiA9IDA7DQorICANCisgIGlmIChjcCkNCisgIHsNCisgICAgUklOT0soY3AtPlNldEtleShfa2V5LCBzaXplb2YoX2tleSkpKTsNCisgICAgUklOT0soY3AtPlNldEluaXRWZWN0b3IoX2l2LCBzaXplb2YoX2l2KSkpOw0KKyAgfQ0KKw0KKyAgZm9yIChVSW50NjQgaSA9IDA7IGkgPCBOdW1JdGVyYXRpb25zOyBpKyspDQorICB7DQorICAgIGlmIChwcmludENhbGxiYWNrICYmIHBpLT5CZW5jaEluZm8uVW5wYWNrU2l6ZSAtIHByZXYgPiAoMSA8PCAyMCkpDQorICAgIHsNCisgICAgICBSSU5PSyhwcmludENhbGxiYWNrLT5DaGVja0JyZWFrKCkpOw0KKyAgICAgIHByZXYgPSBwaS0+QmVuY2hJbmZvLlVucGFja1NpemU7DQorICAgIH0NCisNCisgICAgaW5TdHJlYW1TcGVjLT5Jbml0KG91dFN0cmVhbVNwZWMtPkJ1ZmZlciwgY29tcHJlc3NlZFNpemUpOw0KKyAgICBjcmNPdXRTdHJlYW1TcGVjLT5Jbml0KCk7DQorICAgIA0KKyAgICBVSW50NjQgb3V0U2l6ZSA9IGtCdWZmZXJTaXplOw0KKyAgICBjcmNPdXRTdHJlYW1TcGVjLT5DYWxjQ3JjID0gKChpICYgMHg3RikgPT0gMCB8fCBDaGVja0NyY19EZWMpOw0KKyAgICBpZiAoX2RlY29kZXJGaWx0ZXIpDQorICAgIHsNCisgICAgICBpZiAoY29tcHJlc3NlZFNpemUgPiByZ0NvcHkuQnVmZmVyU2l6ZSkNCisgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgbWVtY3B5KHJnQ29weS5CdWZmZXIsIG91dFN0cmVhbVNwZWMtPkJ1ZmZlciwgY29tcHJlc3NlZFNpemUpOw0KKyAgICAgIF9kZWNvZGVyRmlsdGVyLT5Jbml0KCk7DQorICAgICAgX2RlY29kZXJGaWx0ZXItPkZpbHRlcihyZ0NvcHkuQnVmZmVyLCBjb21wcmVzc2VkU2l6ZSk7DQorICAgICAgUklOT0soV3JpdGVTdHJlYW0oY3JjT3V0U3RyZWFtLCByZ0NvcHkuQnVmZmVyLCByZy5CdWZmZXJTaXplKSk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgUklOT0soZGVjb2Rlci0+Q29kZShpblN0cmVhbSwgY3JjT3V0U3RyZWFtLCAwLCAmb3V0U2l6ZSwgcHJvZ3Jlc3NJbmZvW2RlY29kZXJJbmRleF0pKTsNCisgICAgfQ0KKyAgICBpZiAoY3JjT3V0U3RyZWFtU3BlYy0+Q2FsY0NyYyAmJiBDUkNfR0VUX0RJR0VTVChjcmNPdXRTdHJlYW1TcGVjLT5DcmMpICE9IGNyYykNCisgICAgICByZXR1cm4gU19GQUxTRTsNCisgICAgcGktPkJlbmNoSW5mby5VbnBhY2tTaXplICs9IGtCdWZmZXJTaXplOw0KKyAgICBwaS0+QmVuY2hJbmZvLlBhY2tTaXplICs9IGNvbXByZXNzZWRTaXplOw0KKyAgfQ0KKyAgZGVjb2Rlci5SZWxlYXNlKCk7DQorICBfZGVjb2RlckZpbHRlci5SZWxlYXNlKCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrTnVtVGhyZWFkc01heCA9ICgxIDw8IDEyKTsNCisNCitzdHJ1Y3QgQ0JlbmNoRW5jb2RlcnMNCit7DQorICBDRW5jb2RlckluZm8gKmVuY29kZXJzOw0KKyAgQ0JlbmNoRW5jb2RlcnMoVUludDMyIG51bSk6IGVuY29kZXJzKDApIHsgZW5jb2RlcnMgPSBuZXcgQ0VuY29kZXJJbmZvW251bV07IH0NCisgIH5DQmVuY2hFbmNvZGVycygpIHsgZGVsZXRlIFtdZW5jb2RlcnM7IH0NCit9Ow0KKw0KK3N0YXRpYyBVSW50NjQgR2V0TnVtSXRlcmF0aW9ucyhVSW50NjQgbnVtQ29tbWFuZHMsIFVJbnQ2NCBjb21wbGV4SW5Db21tYW5kcykNCit7DQorICBpZiAobnVtQ29tbWFuZHMgPCAoMSA8PCA0KSkNCisgICAgbnVtQ29tbWFuZHMgPSAoMSA8PCA0KTsNCisgIFVJbnQ2NCByZXMgPSBjb21wbGV4SW5Db21tYW5kcyAvIG51bUNvbW1hbmRzOw0KKyAgcmV0dXJuIChyZXMgPT0gMCA/IDEgOiByZXMpOw0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBNZXRob2RCZW5jaCgNCisgICAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgVUludDY0IGNvbXBsZXhJbkNvbW1hbmRzLA0KKyAgICBib29sIG9sZEx6bWFCZW5jaE1vZGUsDQorICAgIFVJbnQzMiBudW1UaHJlYWRzLA0KKyAgICBjb25zdCBDT25lTWV0aG9kSW5mbyAmbWV0aG9kMiwNCisgICAgVUludDMyIHVuY29tcHJlc3NlZERhdGFTaXplLA0KKyAgICB1bnNpZ25lZCBnZW5lcmF0ZURpY3RCaXRzLA0KKyAgICBJQmVuY2hQcmludENhbGxiYWNrICpwcmludENhbGxiYWNrLA0KKyAgICBJQmVuY2hDYWxsYmFjayAqY2FsbGJhY2ssDQorICAgIENCZW5jaFByb3BzICpiZW5jaFByb3BzKQ0KK3sNCisgIENPbmVNZXRob2RJbmZvIG1ldGhvZCA9IG1ldGhvZDI7DQorICBVSW50NjQgbWV0aG9kSWQ7DQorICBVSW50MzIgbnVtSW5TdHJlYW1zLCBudW1PdXRTdHJlYW1zOw0KKyAgaWYgKCFGaW5kTWV0aG9kKA0KKyAgICAgIEVYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICAgIG1ldGhvZC5NZXRob2ROYW1lLCBtZXRob2RJZCwgbnVtSW5TdHJlYW1zLCBudW1PdXRTdHJlYW1zKSkNCisgICAgcmV0dXJuIEVfTk9USU1QTDsNCisgIGlmIChudW1JblN0cmVhbXMgIT0gMSB8fCBudW1PdXRTdHJlYW1zICE9IDEpDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorDQorICBVSW50MzIgbnVtRW5jb2RlclRocmVhZHMgPSAxOw0KKyAgVUludDMyIG51bVN1YkRlY29kZXJUaHJlYWRzID0gMTsNCisgIA0KKyAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgICBudW1FbmNvZGVyVGhyZWFkcyA9IG51bVRocmVhZHM7DQorDQorICAgIGlmIChvbGRMem1hQmVuY2hNb2RlICYmIG1ldGhvZElkID09IGtfTFpNQSkNCisgICAgew0KKyAgICAgIGJvb2wgZml4ZWROdW1iZXI7DQorICAgICAgVUludDMyIG51bUx6bWFUaHJlYWRzID0gbWV0aG9kLkdldF9Mem1hX051bVRocmVhZHMoZml4ZWROdW1iZXIpOw0KKyAgICAgIGlmICghZml4ZWROdW1iZXIgJiYgbnVtVGhyZWFkcyA9PSAxKQ0KKyAgICAgICAgbWV0aG9kLkFkZE51bVRocmVhZHNQcm9wKDEpOw0KKyAgICAgIGlmIChudW1UaHJlYWRzID4gMSAmJiBudW1Mem1hVGhyZWFkcyA+IDEpDQorICAgICAgew0KKyAgICAgICAgbnVtRW5jb2RlclRocmVhZHMgPSBudW1UaHJlYWRzIC8gMjsNCisgICAgICAgIG51bVN1YkRlY29kZXJUaHJlYWRzID0gMjsNCisgICAgICB9DQorICAgIH0NCisgICNlbmRpZg0KKw0KKyAgQ0JlbmNoRW5jb2RlcnMgZW5jb2RlcnNTcGVjKG51bUVuY29kZXJUaHJlYWRzKTsNCisgIENFbmNvZGVySW5mbyAqZW5jb2RlcnMgPSBlbmNvZGVyc1NwZWMuZW5jb2RlcnM7DQorDQorICBVSW50MzIgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBudW1FbmNvZGVyVGhyZWFkczsgaSsrKQ0KKyAgew0KKyAgICBDRW5jb2RlckluZm8gJmVuY29kZXIgPSBlbmNvZGVyc1tpXTsNCisgICAgZW5jb2Rlci5jYWxsYmFjayA9IChpID09IDApID8gY2FsbGJhY2sgOiAwOw0KKyAgICBlbmNvZGVyLnByaW50Q2FsbGJhY2sgPSBwcmludENhbGxiYWNrOw0KKw0KKyAgICBDTXlDb21QdHI8SUNvbXByZXNzQ29kZXIyPiBjb2RlcjI7DQorICAgIFJJTk9LKENyZWF0ZUNvZGVyKEVYVEVSTkFMX0NPREVDU19MT0NfVkFSUyBtZXRob2RJZCwNCisgICAgICAgIGVuY29kZXIuX2VuY29kZXJGaWx0ZXIsIGVuY29kZXIuX2VuY29kZXIsIGNvZGVyMiwgdHJ1ZSwgZmFsc2UpKTsNCisgICAgaWYgKCFlbmNvZGVyLl9lbmNvZGVyICYmICFlbmNvZGVyLl9lbmNvZGVyRmlsdGVyKQ0KKyAgICAgIHJldHVybiBFX05PVElNUEw7DQorICAgIC8vIGVuY29kZXIuX2VuY29kZXJGaWx0ZXIuUmVsZWFzZSgpOyAvLyB3ZSBjYW4gZGlzYWJsZSBmaWx0ZXIgdG8gY2hlY2sgdGhlIHNwZWVkIG9mIEZpbHRlckNvZGVyLg0KKw0KKyAgICBlbmNvZGVyLkNoZWNrQ3JjX0VuYyA9IChiZW5jaFByb3BzLT5FbmNDb21wbGV4KSA+IDMwIDsNCisgICAgZW5jb2Rlci5DaGVja0NyY19EZWMgPSAoYmVuY2hQcm9wcy0+RGVjQ29tcGxleENvbXByICsgYmVuY2hQcm9wcy0+RGVjQ29tcGxleFVuYykgPiAzMCA7DQorDQorICAgIG1lbXNldChlbmNvZGVyLl9pdiwgMCwgc2l6ZW9mKGVuY29kZXIuX2l2KSk7DQorICAgIG1lbXNldChlbmNvZGVyLl9rZXksIDAsIHNpemVvZihlbmNvZGVyLl9rZXkpKTsNCisgICAgbWVtc2V0KGVuY29kZXIuX3BzdywgMCwgc2l6ZW9mKGVuY29kZXIuX3BzdykpOw0KKw0KKyAgICBmb3IgKFVJbnQzMiBqID0gMDsgaiA8IG51bVN1YkRlY29kZXJUaHJlYWRzOyBqKyspDQorICAgIHsNCisgICAgICBDTXlDb21QdHI8SUNvbXByZXNzQ29kZXIyPiBjb2RlcjJkZTsNCisgICAgICBDTXlDb21QdHI8SUNvbXByZXNzQ29kZXI+ICZkZWNvZGVyID0gZW5jb2Rlci5fZGVjb2RlcnNbal07DQorICAgICAgUklOT0soQ3JlYXRlQ29kZXIoRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTIG1ldGhvZElkLA0KKyAgICAgICAgZW5jb2Rlci5fZGVjb2RlckZpbHRlciwgZGVjb2RlciwgY29kZXIyZGUsIGZhbHNlLCBmYWxzZSkpOw0KKyAgICAgIGlmICghZW5jb2Rlci5fZGVjb2RlckZpbHRlciAmJiAhZGVjb2RlcikNCisgICAgICAgIHJldHVybiBFX05PVElNUEw7DQorICAgIH0NCisgIH0NCisNCisgIENCYXNlUmFuZG9tR2VuZXJhdG9yIHJnOw0KKyAgcmcuSW5pdCgpOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bUVuY29kZXJUaHJlYWRzOyBpKyspDQorICB7DQorICAgIENFbmNvZGVySW5mbyAmZW5jb2RlciA9IGVuY29kZXJzW2ldOw0KKyAgICBlbmNvZGVyLl9tZXRob2QgPSBtZXRob2Q7DQorICAgIGVuY29kZXIuX3VuY29tcHJlc3NlZERhdGFTaXplID0gdW5jb21wcmVzc2VkRGF0YVNpemU7DQorICAgIFJJTk9LKGVuY29kZXJzW2ldLkluaXQobWV0aG9kLCB1bmNvbXByZXNzZWREYXRhU2l6ZSwgZ2VuZXJhdGVEaWN0Qml0cywgJnJnKSk7DQorICB9DQorDQorICBDQmVuY2hQcm9ncmVzc1N0YXR1cyBzdGF0dXM7DQorICBzdGF0dXMuUmVzID0gU19PSzsNCisgIHN0YXR1cy5FbmNvZGVNb2RlID0gdHJ1ZTsNCisNCisgIGZvciAoaSA9IDA7IGkgPCBudW1FbmNvZGVyVGhyZWFkczsgaSsrKQ0KKyAgew0KKyAgICBDRW5jb2RlckluZm8gJmVuY29kZXIgPSBlbmNvZGVyc1tpXTsNCisgICAgZW5jb2Rlci5OdW1JdGVyYXRpb25zID0gR2V0TnVtSXRlcmF0aW9ucyhiZW5jaFByb3BzLT5HZUNvbXByQ29tbWFuZHModW5jb21wcmVzc2VkRGF0YVNpemUpLCBjb21wbGV4SW5Db21tYW5kcyk7DQorDQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKQ0KKyAgICB7DQorICAgICAgQ0JlbmNoUHJvZ3Jlc3NJbmZvICpzcGVjID0gbmV3IENCZW5jaFByb2dyZXNzSW5mbzsNCisgICAgICBlbmNvZGVyLnByb2dyZXNzSW5mb1NwZWNbal0gPSBzcGVjOw0KKyAgICAgIGVuY29kZXIucHJvZ3Jlc3NJbmZvW2pdID0gc3BlYzsNCisgICAgICBzcGVjLT5TdGF0dXMgPSAmc3RhdHVzOw0KKyAgICB9DQorICAgIGlmIChpID09IDApDQorICAgIHsNCisgICAgICBDQmVuY2hQcm9ncmVzc0luZm8gKmJwaSA9IGVuY29kZXIucHJvZ3Jlc3NJbmZvU3BlY1swXTsNCisgICAgICBicGktPkNhbGxiYWNrID0gY2FsbGJhY2s7DQorICAgICAgYnBpLT5CZW5jaEluZm8uTnVtSXRlcmF0aW9ucyA9IG51bUVuY29kZXJUaHJlYWRzOw0KKyAgICAgIGJwaS0+U2V0U3RhcnRUaW1lKCk7DQorICAgIH0NCisNCisgICAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgICBpZiAobnVtRW5jb2RlclRocmVhZHMgPiAxKQ0KKyAgICB7DQorICAgICAgI2lmZGVmIFVTRV9BTExPQ0ENCisgICAgICBlbmNvZGVyLkFsbG9jYVNpemUgPSAoaSAqIDE2ICogMjEpICYgMHg3RkY7DQorICAgICAgI2VuZGlmDQorICAgICAgUklOT0soZW5jb2Rlci5DcmVhdGVFbmNvZGVyVGhyZWFkKCkpDQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAjZW5kaWYNCisgICAgew0KKyAgICAgIFJJTk9LKGVuY29kZXIuRW5jb2RlKCkpOw0KKyAgICB9DQorICB9DQorICAjaWZuZGVmIF83WklQX1NUDQorICBpZiAobnVtRW5jb2RlclRocmVhZHMgPiAxKQ0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRW5jb2RlclRocmVhZHM7IGkrKykNCisgICAgICBlbmNvZGVyc1tpXS50aHJlYWRbMF0uV2FpdCgpOw0KKyAgI2VuZGlmDQorDQorICBSSU5PSyhzdGF0dXMuUmVzKTsNCisNCisgIENCZW5jaEluZm8gaW5mbzsNCisNCisgIGVuY29kZXJzWzBdLnByb2dyZXNzSW5mb1NwZWNbMF0tPlNldEZpbmlzaFRpbWUoaW5mbyk7DQorICBpbmZvLlVucGFja1NpemUgPSAwOw0KKyAgaW5mby5QYWNrU2l6ZSA9IDA7DQorICBpbmZvLk51bUl0ZXJhdGlvbnMgPSBlbmNvZGVyc1swXS5OdW1JdGVyYXRpb25zOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bUVuY29kZXJUaHJlYWRzOyBpKyspDQorICB7DQorICAgIENFbmNvZGVySW5mbyAmZW5jb2RlciA9IGVuY29kZXJzW2ldOw0KKyAgICBpbmZvLlVucGFja1NpemUgKz0gZW5jb2Rlci5rQnVmZmVyU2l6ZTsNCisgICAgaW5mby5QYWNrU2l6ZSArPSBlbmNvZGVyLmNvbXByZXNzZWRTaXplOw0KKyAgfQ0KKyAgUklOT0soY2FsbGJhY2stPlNldEVuY29kZVJlc3VsdChpbmZvLCB0cnVlKSk7DQorDQorDQorICBzdGF0dXMuUmVzID0gU19PSzsNCisgIHN0YXR1cy5FbmNvZGVNb2RlID0gZmFsc2U7DQorDQorICBVSW50MzIgbnVtRGVjb2RlclRocmVhZHMgPSBudW1FbmNvZGVyVGhyZWFkcyAqIG51bVN1YkRlY29kZXJUaHJlYWRzOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bUVuY29kZXJUaHJlYWRzOyBpKyspDQorICB7DQorICAgIENFbmNvZGVySW5mbyAmZW5jb2RlciA9IGVuY29kZXJzW2ldOw0KKw0KKyAgICBpZiAoaSA9PSAwKQ0KKyAgICB7DQorICAgICAgZW5jb2Rlci5OdW1JdGVyYXRpb25zID0gR2V0TnVtSXRlcmF0aW9ucyhiZW5jaFByb3BzLT5HZURlY29tcHJDb21tYW5kcyhlbmNvZGVyLmNvbXByZXNzZWRTaXplLCBlbmNvZGVyLmtCdWZmZXJTaXplKSwgY29tcGxleEluQ29tbWFuZHMpOw0KKyAgICAgIENCZW5jaFByb2dyZXNzSW5mbyAqYnBpID0gZW5jb2Rlci5wcm9ncmVzc0luZm9TcGVjWzBdOw0KKyAgICAgIGJwaS0+Q2FsbGJhY2sgPSBjYWxsYmFjazsNCisgICAgICBicGktPkJlbmNoSW5mby5OdW1JdGVyYXRpb25zID0gbnVtRGVjb2RlclRocmVhZHM7DQorICAgICAgYnBpLT5TZXRTdGFydFRpbWUoKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgZW5jb2Rlci5OdW1JdGVyYXRpb25zID0gZW5jb2RlcnNbMF0uTnVtSXRlcmF0aW9uczsNCisNCisgICAgI2lmbmRlZiBfN1pJUF9TVA0KKyAgICB7DQorICAgICAgaW50IG51bVN1YlRocmVhZHMgPSBtZXRob2QuR2V0X051bVRocmVhZHMoKTsNCisgICAgICBlbmNvZGVyLk51bURlY29kZXJTdWJUaHJlYWRzID0gKG51bVN1YlRocmVhZHMgPD0gMCkgPyAxIDogbnVtU3ViVGhyZWFkczsNCisgICAgfQ0KKyAgICBpZiAobnVtRGVjb2RlclRocmVhZHMgPiAxKQ0KKyAgICB7DQorICAgICAgZm9yIChVSW50MzIgaiA9IDA7IGogPCBudW1TdWJEZWNvZGVyVGhyZWFkczsgaisrKQ0KKyAgICAgIHsNCisgICAgICAgIEhSRVNVTFQgcmVzID0gZW5jb2Rlci5DcmVhdGVEZWNvZGVyVGhyZWFkKGosIChpID09IDAgJiYgaiA9PSAwKQ0KKyAgICAgICAgICAgICNpZmRlZiBVU0VfQUxMT0NBDQorICAgICAgICAgICAgLCAoKGkgKiBudW1TdWJEZWNvZGVyVGhyZWFkcyArIGopICogMTYgKiAyMSkgJiAweDdGRg0KKyAgICAgICAgICAgICNlbmRpZg0KKyAgICAgICAgICAgICk7DQorICAgICAgICBSSU5PSyhyZXMpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBlbHNlDQorICAgICNlbmRpZg0KKyAgICB7DQorICAgICAgUklOT0soZW5jb2Rlci5EZWNvZGUoMCkpOw0KKyAgICB9DQorICB9DQorICAjaWZuZGVmIF83WklQX1NUDQorICBIUkVTVUxUIHJlcyA9IFNfT0s7DQorICBpZiAobnVtRGVjb2RlclRocmVhZHMgPiAxKQ0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRW5jb2RlclRocmVhZHM7IGkrKykNCisgICAgICBmb3IgKFVJbnQzMiBqID0gMDsgaiA8IG51bVN1YkRlY29kZXJUaHJlYWRzOyBqKyspDQorICAgICAgew0KKyAgICAgICAgQ0VuY29kZXJJbmZvICZlbmNvZGVyID0gZW5jb2RlcnNbaV07DQorICAgICAgICBlbmNvZGVyLnRocmVhZFtqXS5XYWl0KCk7DQorICAgICAgICBpZiAoZW5jb2Rlci5SZXN1bHRzW2pdICE9IFNfT0spDQorICAgICAgICAgIHJlcyA9IGVuY29kZXIuUmVzdWx0c1tqXTsNCisgICAgICB9DQorICBSSU5PSyhyZXMpOw0KKyAgI2VuZGlmDQorICBSSU5PSyhzdGF0dXMuUmVzKTsNCisgIGVuY29kZXJzWzBdLnByb2dyZXNzSW5mb1NwZWNbMF0tPlNldEZpbmlzaFRpbWUoaW5mbyk7DQorICAjaWZuZGVmIF83WklQX1NUDQorICAjaWZkZWYgVU5ERVJfQ0UNCisgIGlmIChudW1EZWNvZGVyVGhyZWFkcyA+IDEpDQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1FbmNvZGVyVGhyZWFkczsgaSsrKQ0KKyAgICAgIGZvciAoVUludDMyIGogPSAwOyBqIDwgbnVtU3ViRGVjb2RlclRocmVhZHM7IGorKykNCisgICAgICB7DQorICAgICAgICBGSUxFVElNRSBjcmVhdGlvblRpbWUsIGV4aXRUaW1lLCBrZXJuZWxUaW1lLCB1c2VyVGltZTsNCisgICAgICAgIGlmICg6OkdldFRocmVhZFRpbWVzKGVuY29kZXJzW2ldLnRocmVhZFtqXSwgJmNyZWF0aW9uVGltZSwgJmV4aXRUaW1lLCAma2VybmVsVGltZSwgJnVzZXJUaW1lKSAhPSAwKQ0KKyAgICAgICAgICBpbmZvLlVzZXJUaW1lICs9IEdldFRpbWU2NCh1c2VyVGltZSkgKyBHZXRUaW1lNjQoa2VybmVsVGltZSk7DQorICAgICAgfQ0KKyAgI2VuZGlmDQorICAjZW5kaWYNCisgIGluZm8uVW5wYWNrU2l6ZSA9IDA7DQorICBpbmZvLlBhY2tTaXplID0gMDsNCisgIGluZm8uTnVtSXRlcmF0aW9ucyA9IG51bVN1YkRlY29kZXJUaHJlYWRzICogZW5jb2RlcnNbMF0uTnVtSXRlcmF0aW9uczsNCisgIGZvciAoaSA9IDA7IGkgPCBudW1FbmNvZGVyVGhyZWFkczsgaSsrKQ0KKyAgew0KKyAgICBDRW5jb2RlckluZm8gJmVuY29kZXIgPSBlbmNvZGVyc1tpXTsNCisgICAgaW5mby5VbnBhY2tTaXplICs9IGVuY29kZXIua0J1ZmZlclNpemU7DQorICAgIGluZm8uUGFja1NpemUgKz0gZW5jb2Rlci5jb21wcmVzc2VkU2l6ZTsNCisgIH0NCisgIFJJTk9LKGNhbGxiYWNrLT5TZXREZWNvZGVSZXN1bHQoaW5mbywgZmFsc2UpKTsNCisgIFJJTk9LKGNhbGxiYWNrLT5TZXREZWNvZGVSZXN1bHQoaW5mbywgdHJ1ZSkpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKw0KK2lubGluZSBVSW50NjQgR2V0TFpNQVVzYWdlKGJvb2wgbXVsdGlUaHJlYWQsIFVJbnQzMiBkaWN0aW9uYXJ5KQ0KK3sNCisgIFVJbnQzMiBocyA9IGRpY3Rpb25hcnkgLSAxOw0KKyAgaHMgfD0gKGhzID4+IDEpOw0KKyAgaHMgfD0gKGhzID4+IDIpOw0KKyAgaHMgfD0gKGhzID4+IDQpOw0KKyAgaHMgfD0gKGhzID4+IDgpOw0KKyAgaHMgPj49IDE7DQorICBocyB8PSAweEZGRkY7DQorICBpZiAoaHMgPiAoMSA8PCAyNCkpDQorICAgIGhzID4+PSAxOw0KKyAgaHMrKzsNCisgIHJldHVybiAoKGhzICsgKDEgPDwgMTYpKSArIChVSW50NjQpZGljdGlvbmFyeSAqIDIpICogNCArIChVSW50NjQpZGljdGlvbmFyeSAqIDMgLyAyICsNCisgICAgICAoMSA8PCAyMCkgKyAobXVsdGlUaHJlYWQgPyAoNiA8PCAyMCkgOiAwKTsNCit9DQorDQorVUludDY0IEdldEJlbmNoTWVtb3J5VXNhZ2UoVUludDMyIG51bVRocmVhZHMsIFVJbnQzMiBkaWN0aW9uYXJ5KQ0KK3sNCisgIGNvbnN0IFVJbnQzMiBrQnVmZmVyU2l6ZSA9IGRpY3Rpb25hcnk7DQorICBjb25zdCBVSW50MzIga0NvbXByZXNzZWRCdWZmZXJTaXplID0gKGtCdWZmZXJTaXplIC8gMik7DQorICBVSW50MzIgbnVtU3ViVGhyZWFkcyA9IChudW1UaHJlYWRzID4gMSkgPyAyIDogMTsNCisgIFVJbnQzMiBudW1CaWdUaHJlYWRzID0gbnVtVGhyZWFkcyAvIG51bVN1YlRocmVhZHM7DQorICByZXR1cm4gKGtCdWZmZXJTaXplICsga0NvbXByZXNzZWRCdWZmZXJTaXplICsNCisgICAgR2V0TFpNQVVzYWdlKChudW1UaHJlYWRzID4gMSksIGRpY3Rpb25hcnkpICsgKDIgPDwgMjApKSAqIG51bUJpZ1RocmVhZHM7DQorfQ0KKw0KK3N0YXRpYyBIUkVTVUxUIENyY0JpZyhjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDY0IG51bUl0ZXJhdGlvbnMsDQorICAgIGNvbnN0IFVJbnQzMiAqY2hlY2tTdW0sIElIYXNoZXIgKmhmLA0KKyAgICBJQmVuY2hQcmludENhbGxiYWNrICpjYWxsYmFjaykNCit7DQorICBCeXRlIGhhc2hbNjRdOw0KKyAgVUludDY0IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGhhc2gpOyBpKyspDQorICAgIGhhc2hbaV0gPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bUl0ZXJhdGlvbnM7IGkrKykNCisgIHsNCisgICAgaWYgKGNhbGxiYWNrICYmIChpICYgMHhGRikgPT0gMCkNCisgICAgew0KKyAgICAgIFJJTk9LKGNhbGxiYWNrLT5DaGVja0JyZWFrKCkpOw0KKyAgICB9DQorICAgIGhmLT5Jbml0KCk7DQorICAgIGhmLT5VcGRhdGUoZGF0YSwgc2l6ZSk7DQorICAgIGhmLT5GaW5hbChoYXNoKTsNCisgICAgVUludDMyIGhhc2hTaXplID0gaGYtPkdldERpZ2VzdFNpemUoKTsNCisgICAgaWYgKGhhc2hTaXplID4gc2l6ZW9mKGhhc2gpKQ0KKyAgICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgICBVSW50MzIgc3VtID0gMDsNCisgICAgZm9yIChVSW50MzIgaiA9IDA7IGogPCBoYXNoU2l6ZTsgaiArPSA0KQ0KKyAgICAgIHN1bSBePSBHZXRVaTMyKGhhc2ggKyBqKTsNCisgICAgaWYgKGNoZWNrU3VtICYmIHN1bSAhPSAqY2hlY2tTdW0pDQorICAgIHsNCisgICAgICAvLyBwcmludGYoIiAlMDhYICIsIHN1bSk7DQorICAgICAgcmV0dXJuIFNfRkFMU0U7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitVSW50MzIgZ19CZW5jaENwdUZyZXFUZW1wID0gMTsNCisNCisjZGVmaW5lIFlZMSBzdW0gKz0gdmFsOyBzdW0gXj0gdmFsOw0KKyNkZWZpbmUgWVkzIFlZMSBZWTEgWVkxIFlZMQ0KKyNkZWZpbmUgWVk1IFlZMyBZWTMgWVkzIFlZMw0KKyNkZWZpbmUgWVk3IFlZNSBZWTUgWVk1IFlZNQ0KK3N0YXRpYyBjb25zdCBVSW50MzIga051bUZyZXFDb21tYW5kcyA9IDEyODsNCisNCitzdGF0aWMgVUludDMyIENvdW50Q3B1RnJlcShVSW50MzIgc3VtLCBVSW50MzIgbnVtLCBVSW50MzIgdmFsKQ0KK3sNCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtOyBpKyspDQorICB7DQorICAgIFlZNw0KKyAgfQ0KKyAgcmV0dXJuIHN1bTsNCit9DQorDQorI2lmbmRlZiBfN1pJUF9TVA0KKw0KK3N0cnVjdCBDRnJlcUluZm8NCit7DQorICBOV2luZG93czo6Q1RocmVhZCBUaHJlYWQ7DQorICBJQmVuY2hQcmludENhbGxiYWNrICpDYWxsYmFjazsNCisgIEhSRVNVTFQgQ2FsbGJhY2tSZXM7DQorICBVSW50MzIgVmFsUmVzOw0KKyAgVUludDMyIFNpemU7DQorICBVSW50NjQgTnVtSXRlcmF0aW9uczsNCisNCisgIHZvaWQgV2FpdCgpDQorICB7DQorICAgIFRocmVhZC5XYWl0KCk7DQorICAgIFRocmVhZC5DbG9zZSgpOw0KKyAgfQ0KK307DQorDQorc3RhdGljIFRIUkVBRF9GVU5DX0RFQ0wgRnJlcVRocmVhZEZ1bmN0aW9uKHZvaWQgKnBhcmFtKQ0KK3sNCisgIENGcmVxSW5mbyAqcCA9IChDRnJlcUluZm8gKilwYXJhbTsNCisNCisgIFVJbnQzMiBzdW0gPSBnX0JlbmNoQ3B1RnJlcVRlbXA7DQorICBmb3IgKFVJbnQ2NCBrID0gcC0+TnVtSXRlcmF0aW9uczsgayA+IDA7IGstLSkNCisgIHsNCisgICAgcC0+Q2FsbGJhY2tSZXMgPSBwLT5DYWxsYmFjay0+Q2hlY2tCcmVhaygpOw0KKyAgICBpZiAocC0+Q2FsbGJhY2tSZXMgIT0gU19PSykNCisgICAgICByZXR1cm4gMDsNCisgICAgc3VtID0gQ291bnRDcHVGcmVxKHN1bSwgcC0+U2l6ZSwgZ19CZW5jaENwdUZyZXFUZW1wKTsNCisgIH0NCisgIHAtPlZhbFJlcyA9IHN1bTsNCisgIHJldHVybiAwOw0KK30NCisNCitzdHJ1Y3QgQ0ZyZXFUaHJlYWRzDQorew0KKyAgQ0ZyZXFJbmZvICpJdGVtczsNCisgIFVJbnQzMiBOdW1UaHJlYWRzOw0KKw0KKyAgQ0ZyZXFUaHJlYWRzKCk6IEl0ZW1zKDApLCBOdW1UaHJlYWRzKDApIHt9DQorICB2b2lkIFdhaXRBbGwoKQ0KKyAgew0KKyAgICBmb3IgKFVJbnQzMiBpID0gMDsgaSA8IE51bVRocmVhZHM7IGkrKykNCisgICAgICBJdGVtc1tpXS5XYWl0KCk7DQorICAgIE51bVRocmVhZHMgPSAwOw0KKyAgfQ0KKyAgfkNGcmVxVGhyZWFkcygpDQorICB7DQorICAgIFdhaXRBbGwoKTsNCisgICAgZGVsZXRlIFtdSXRlbXM7DQorICB9DQorfTsNCisNCitzdHJ1Y3QgQ0NyY0luZm8NCit7DQorICBOV2luZG93czo6Q1RocmVhZCBUaHJlYWQ7DQorICBJQmVuY2hQcmludENhbGxiYWNrICpDYWxsYmFjazsNCisgIEhSRVNVTFQgQ2FsbGJhY2tSZXM7DQorDQorICBjb25zdCBCeXRlICpEYXRhOw0KKyAgVUludDMyIFNpemU7DQorICBVSW50NjQgTnVtSXRlcmF0aW9uczsNCisgIGJvb2wgQ2hlY2tTdW1EZWZpbmVkOw0KKyAgVUludDMyIENoZWNrU3VtOw0KKyAgQ015Q29tUHRyPElIYXNoZXI+IEhhc2hlcjsNCisgIEhSRVNVTFQgUmVzOw0KKw0KKyAgdm9pZCBXYWl0KCkNCisgIHsNCisgICAgVGhyZWFkLldhaXQoKTsNCisgICAgVGhyZWFkLkNsb3NlKCk7DQorICB9DQorfTsNCisNCitzdGF0aWMgVEhSRUFEX0ZVTkNfREVDTCBDcmNUaHJlYWRGdW5jdGlvbih2b2lkICpwYXJhbSkNCit7DQorICBDQ3JjSW5mbyAqcCA9IChDQ3JjSW5mbyAqKXBhcmFtOw0KKyAgcC0+UmVzID0gQ3JjQmlnKHAtPkRhdGEsIHAtPlNpemUsIHAtPk51bUl0ZXJhdGlvbnMsDQorICAgICAgcC0+Q2hlY2tTdW1EZWZpbmVkID8gJnAtPkNoZWNrU3VtIDogTlVMTCwgcC0+SGFzaGVyLA0KKyAgICAgIHAtPkNhbGxiYWNrKTsNCisgIHJldHVybiAwOw0KK30NCisNCitzdHJ1Y3QgQ0NyY1RocmVhZHMNCit7DQorICBDQ3JjSW5mbyAqSXRlbXM7DQorICBVSW50MzIgTnVtVGhyZWFkczsNCisNCisgIENDcmNUaHJlYWRzKCk6IEl0ZW1zKDApLCBOdW1UaHJlYWRzKDApIHt9DQorICB2b2lkIFdhaXRBbGwoKQ0KKyAgew0KKyAgICBmb3IgKFVJbnQzMiBpID0gMDsgaSA8IE51bVRocmVhZHM7IGkrKykNCisgICAgICBJdGVtc1tpXS5XYWl0KCk7DQorICAgIE51bVRocmVhZHMgPSAwOw0KKyAgfQ0KKyAgfkNDcmNUaHJlYWRzKCkNCisgIHsNCisgICAgV2FpdEFsbCgpOw0KKyAgICBkZWxldGUgW11JdGVtczsNCisgIH0NCit9Ow0KKw0KKyNlbmRpZg0KKw0KK3N0YXRpYyBVSW50MzIgQ3JjQ2FsYzEoY29uc3QgQnl0ZSAqYnVmLCBVSW50MzIgc2l6ZSkNCit7DQorICBVSW50MzIgY3JjID0gQ1JDX0lOSVRfVkFMOzsNCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KKyAgICBjcmMgPSBDUkNfVVBEQVRFX0JZVEUoY3JjLCBidWZbaV0pOw0KKyAgcmV0dXJuIENSQ19HRVRfRElHRVNUKGNyYyk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFJhbmRHZW4oQnl0ZSAqYnVmLCBVSW50MzIgc2l6ZSwgQ0Jhc2VSYW5kb21HZW5lcmF0b3IgJlJHKQ0KK3sNCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KKyAgICBidWZbaV0gPSAoQnl0ZSlSRy5HZXRSbmQoKTsNCit9DQorDQorc3RhdGljIFVJbnQzMiBSYW5kR2VuQ3JjKEJ5dGUgKmJ1ZiwgVUludDMyIHNpemUsIENCYXNlUmFuZG9tR2VuZXJhdG9yICZSRykNCit7DQorICBSYW5kR2VuKGJ1Ziwgc2l6ZSwgUkcpOw0KKyAgcmV0dXJuIENyY0NhbGMxKGJ1Ziwgc2l6ZSk7DQorfQ0KKw0KK2Jvb2wgQ3JjSW50ZXJuYWxUZXN0KCkNCit7DQorICBDQmVuY2hCdWZmZXIgYnVmZmVyOw0KKyAgY29uc3QgVUludDMyIGtCdWZmZXJTaXplMCA9ICgxIDw8IDgpOw0KKyAgY29uc3QgVUludDMyIGtCdWZmZXJTaXplMSA9ICgxIDw8IDEwKTsNCisgIGNvbnN0IFVJbnQzMiBrQ2hlY2tTaXplID0gKDEgPDwgNSk7DQorICBpZiAoIWJ1ZmZlci5BbGxvYyhrQnVmZmVyU2l6ZTAgKyBrQnVmZmVyU2l6ZTEpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBCeXRlICpidWYgPSBidWZmZXIuQnVmZmVyOw0KKyAgVUludDMyIGk7DQorICBmb3IgKGkgPSAwOyBpIDwga0J1ZmZlclNpemUwOyBpKyspDQorICAgIGJ1ZltpXSA9IChCeXRlKWk7DQorICBVSW50MzIgY3JjMSA9IENyY0NhbGMxKGJ1Ziwga0J1ZmZlclNpemUwKTsNCisgIGlmIChjcmMxICE9IDB4MjkwNThDNzMpDQorICAgIHJldHVybiBmYWxzZTsNCisgIENCYXNlUmFuZG9tR2VuZXJhdG9yIFJHOw0KKyAgUmFuZEdlbihidWYgKyBrQnVmZmVyU2l6ZTAsIGtCdWZmZXJTaXplMSwgUkcpOw0KKyAgZm9yIChpID0gMDsgaSA8IGtCdWZmZXJTaXplMCArIGtCdWZmZXJTaXplMSAtIGtDaGVja1NpemU7IGkrKykNCisgICAgZm9yIChVSW50MzIgaiA9IDA7IGogPCBrQ2hlY2tTaXplOyBqKyspDQorICAgICAgaWYgKENyY0NhbGMxKGJ1ZiArIGksIGopICE9IENyY0NhbGMoYnVmICsgaSwgaikpDQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorc3RydWN0IENCZW5jaE1ldGhvZA0KK3sNCisgIHVuc2lnbmVkIERpY3RCaXRzOw0KKyAgVUludDMyIEVuY0NvbXBsZXg7DQorICBVSW50MzIgRGVjQ29tcGxleENvbXByOw0KKyAgVUludDMyIERlY0NvbXBsZXhVbmM7DQorICBjb25zdCBjaGFyICpOYW1lOw0KK307DQorDQorc3RhdGljIGNvbnN0IENCZW5jaE1ldGhvZCBnX0JlbmNoW10gPQ0KK3sNCisgIHsgMTcsICAzNTcsICAxNDUsICAgMjAsICJMWk1BOngxIiB9LA0KKyAgeyAyNCwgMTIyMCwgIDE0NSwgICAyMCwgIkxaTUE6eDU6bXQxIiB9LA0KKyAgeyAyNCwgMTIyMCwgIDE0NSwgICAyMCwgIkxaTUE6eDU6bXQyIiB9LA0KKyAgeyAxNiwgIDEyNCwgICA0MCwgICAxNCwgIkRlZmxhdGU6eDEiIH0sDQorICB7IDE2LCAgMzc2LCAgIDQwLCAgIDE0LCAiRGVmbGF0ZTp4NSIgfSwNCisgIHsgMTYsIDEwODIsICAgNDAsICAgMTQsICJEZWZsYXRlOng3IiB9LA0KKyAgeyAxNywgIDQyMiwgICA0MCwgICAxNCwgIkRlZmxhdGU2NDp4NSIgfSwNCisgIHsgMTUsICA1OTAsICAgNjksICAgNjksICJCWmlwMjp4MSIgfSwNCisgIHsgMTksICA4MTUsICAxMjIsICAxMjIsICJCWmlwMjp4NSIgfSwNCisgIHsgMTksICA4MTUsICAxMjIsICAxMjIsICJCWmlwMjp4NTptdDIiIH0sDQorICB7IDE5LCAyNTMwLCAgMTIyLCAgMTIyLCAiQlppcDI6eDciIH0sDQorICB7IDE4LCAxMDEwLCAgICAwLCAxMTUwLCAiUFBNRDp4MSIgfSwNCisgIHsgMjIsIDE2NTUsICAgIDAsIDE4MzAsICJQUE1EOng1IiB9LA0KKyAgeyAgMCwgICAgNiwgICAgMCwgICAgNiwgIkRlbHRhOjQiIH0sDQorICB7ICAwLCAgICA0LCAgICAwLCAgICA0LCAiQkNKIiB9LA0KKyAgeyAgMCwgICAyNCwgICAgMCwgICAyNCwgIkFFUzI1NkNCQzoxIiB9LA0KKyAgeyAgMCwgICAgOCwgICAgMCwgICAgMiwgIkFFUzI1NkNCQzoyIiB9DQorfTsNCisNCitzdHJ1Y3QgQ0JlbmNoSGFzaA0KK3sNCisgIFVJbnQzMiBDb21wbGV4Ow0KKyAgVUludDMyIENoZWNrU3VtOw0KKyAgY29uc3QgY2hhciAqTmFtZTsNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBDQmVuY2hIYXNoIGdfSGFzaFtdID0NCit7DQorICB7ICAgNTU4LCAweDhGOEZFREFCLCAiQ1JDMzI6NCIgfSwNCisgIHsgICAzMzksIDB4OEY4RkVEQUIsICJDUkMzMjo4IiB9LA0KKyAgeyAgIDUxMiwgMHhERjFDMTdDQywgIkNSQzY0IiB9LA0KKyAgeyAxMTkwMCwgMHgyRDc5RkYyRSwgIlNIQTI1NiIgfSwNCisgIHsgIDUyMzAsIDB4NEMyNTEzMkIsICJTSEExIiB9DQorfTsNCisNCitzdHJ1Y3QgQ1RvdGFsQmVuY2hSZXMNCit7DQorICBVSW50NjQgTnVtSXRlcmF0aW9uczsNCisgIFVJbnQ2NCBSYXRpbmc7DQorICBVSW50NjQgVXNhZ2U7DQorICBVSW50NjQgUlBVOw0KKyAgdm9pZCBJbml0KCkgeyBOdW1JdGVyYXRpb25zID0gMDsgUmF0aW5nID0gMDsgVXNhZ2UgPSAwOyBSUFUgPSAwOyB9DQorICB2b2lkIFNldFN1bShjb25zdCBDVG90YWxCZW5jaFJlcyAmcjEsIGNvbnN0IENUb3RhbEJlbmNoUmVzICZyMikNCisgIHsNCisgICAgUmF0aW5nID0gKHIxLlJhdGluZyArIHIyLlJhdGluZyk7DQorICAgIFVzYWdlID0gKHIxLlVzYWdlICsgcjIuVXNhZ2UpOw0KKyAgICBSUFUgPSAocjEuUlBVICsgcjIuUlBVKTsNCisgICAgTnVtSXRlcmF0aW9ucyA9IChyMS5OdW1JdGVyYXRpb25zICsgcjIuTnVtSXRlcmF0aW9ucyk7DQorICB9DQorfTsNCisNCitzdGF0aWMgdm9pZCBQcmludE51bWJlcihJQmVuY2hQcmludENhbGxiYWNrICZmLCBVSW50NjQgdmFsdWUsIGludCBzaXplKQ0KK3sNCisgIGNoYXIgc1sxMjhdOw0KKyAgaW50IHN0YXJ0UG9zID0gKGludClzaXplb2YocykgLSAzMjsNCisgIG1lbXNldChzLCAnICcsIHN0YXJ0UG9zKTsNCisgIENvbnZlcnRVSW50NjRUb1N0cmluZyh2YWx1ZSwgcyArIHN0YXJ0UG9zKTsNCisgIC8vIGlmICh3aXRoU3BhY2UpDQorICB7DQorICAgIHN0YXJ0UG9zLS07DQorICAgIHNpemUrKzsNCisgIH0NCisgIGludCBsZW4gPSAoaW50KXN0cmxlbihzICsgc3RhcnRQb3MpOw0KKyAgaWYgKHNpemUgPiBsZW4pDQorICB7DQorICAgIHN0YXJ0UG9zIC09IChzaXplIC0gbGVuKTsNCisgICAgaWYgKHN0YXJ0UG9zIDwgMCkNCisgICAgICBzdGFydFBvcyA9IDA7DQorICB9DQorICBmLlByaW50KHMgKyBzdGFydFBvcyk7DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBpbnQga0ZpZWxkU2l6ZV9OYW1lID0gMTI7DQorc3RhdGljIGNvbnN0IGludCBrRmllbGRTaXplX1NtYWxsTmFtZSA9IDQ7DQorc3RhdGljIGNvbnN0IGludCBrRmllbGRTaXplX1NwZWVkID0gOTsNCitzdGF0aWMgY29uc3QgaW50IGtGaWVsZFNpemVfVXNhZ2UgPSA1Ow0KK3N0YXRpYyBjb25zdCBpbnQga0ZpZWxkU2l6ZV9SVSA9IDY7DQorc3RhdGljIGNvbnN0IGludCBrRmllbGRTaXplX1JhdGluZyA9IDY7DQorc3RhdGljIGNvbnN0IGludCBrRmllbGRTaXplX0VVID0gNTsNCitzdGF0aWMgY29uc3QgaW50IGtGaWVsZFNpemVfRWZmZWMgPSA1Ow0KKw0KK3N0YXRpYyBjb25zdCBpbnQga0ZpZWxkU2l6ZV9Ub3RhbFNpemUgPSA0ICsga0ZpZWxkU2l6ZV9TcGVlZCArIGtGaWVsZFNpemVfVXNhZ2UgKyBrRmllbGRTaXplX1JVICsga0ZpZWxkU2l6ZV9SYXRpbmc7DQorc3RhdGljIGNvbnN0IGludCBrRmllbGRTaXplX0VVQW5kRWZmZWMgPSAyICsga0ZpZWxkU2l6ZV9FVSArIGtGaWVsZFNpemVfRWZmZWM7DQorDQorDQorc3RhdGljIHZvaWQgUHJpbnRSYXRpbmcoSUJlbmNoUHJpbnRDYWxsYmFjayAmZiwgVUludDY0IHJhdGluZywgaW50IHNpemUpDQorew0KKyAgUHJpbnROdW1iZXIoZiwgKHJhdGluZyArIDUwMDAwMCkgLyAxMDAwMDAwLCBzaXplKTsNCit9DQorDQorDQorc3RhdGljIHZvaWQgUHJpbnRQZXJjZW50cyhJQmVuY2hQcmludENhbGxiYWNrICZmLCBVSW50NjQgdmFsLCBVSW50NjQgZGl2aWRlciwgaW50IHNpemUpDQorew0KKyAgUHJpbnROdW1iZXIoZiwgKHZhbCAqIDEwMCArIGRpdmlkZXIgLyAyKSAvIGRpdmlkZXIsIHNpemUpOw0KK30NCisNCitzdGF0aWMgdm9pZCBQcmludENoYXJzKElCZW5jaFByaW50Q2FsbGJhY2sgJmYsIGNoYXIgYywgaW50IHNpemUpDQorew0KKyAgY2hhciBzWzI1Nl07DQorICBtZW1zZXQocywgKEJ5dGUpYywgc2l6ZSk7DQorICBzW3NpemVdID0gMDsNCisgIGYuUHJpbnQocyk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFByaW50U3BhY2VzKElCZW5jaFByaW50Q2FsbGJhY2sgJmYsIGludCBzaXplKQ0KK3sNCisgIFByaW50Q2hhcnMoZiwgJyAnLCBzaXplKTsNCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnRSZXN1bHRzKElCZW5jaFByaW50Q2FsbGJhY2sgJmYsIFVJbnQ2NCB1c2FnZSwgVUludDY0IHJwdSwgVUludDY0IHJhdGluZywgYm9vbCBzaG93RnJlcSwgVUludDY0IGNwdUZyZXEpDQorew0KKyAgUHJpbnROdW1iZXIoZiwgKHVzYWdlICsgNTAwMCkgLyAxMDAwMCwga0ZpZWxkU2l6ZV9Vc2FnZSk7DQorICBQcmludFJhdGluZyhmLCBycHUsIGtGaWVsZFNpemVfUlUpOw0KKyAgUHJpbnRSYXRpbmcoZiwgcmF0aW5nLCBrRmllbGRTaXplX1JhdGluZyk7DQorICBpZiAoc2hvd0ZyZXEpDQorICB7DQorICAgIGlmIChjcHVGcmVxID09IDApDQorICAgICAgUHJpbnRTcGFjZXMoZiwga0ZpZWxkU2l6ZV9FVUFuZEVmZmVjKTsNCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgVUludDY0IGRkZCA9IGNwdUZyZXEgKiB1c2FnZSAvIDEwMDsNCisgICAgICBpZiAoZGRkID09IDApDQorICAgICAgICBkZGQgPSAxOw0KKyAgICAgIFByaW50UGVyY2VudHMoZiwgKHJhdGluZyAqIDEwMDAwKSwgZGRkLCBrRmllbGRTaXplX0VVKTsNCisgICAgICBQcmludFBlcmNlbnRzKGYsIHJhdGluZywgY3B1RnJlcSwga0ZpZWxkU2l6ZV9FZmZlYyk7DQorICAgIH0NCisgIH0NCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnRSZXN1bHRzKElCZW5jaFByaW50Q2FsbGJhY2sgKmYsIGNvbnN0IENCZW5jaEluZm8gJmluZm8sIFVJbnQ2NCByYXRpbmcsIGJvb2wgc2hvd0ZyZXEsIFVJbnQ2NCBjcHVGcmVxLCBDVG90YWxCZW5jaFJlcyAqcmVzKQ0KK3sNCisgIFVJbnQ2NCBzcGVlZCA9IGluZm8uR2V0U3BlZWQoaW5mby5VbnBhY2tTaXplICogaW5mby5OdW1JdGVyYXRpb25zKTsNCisgIGlmIChmKQ0KKyAgew0KKyAgICBpZiAoc3BlZWQgIT0gMCkNCisgICAgICBQcmludE51bWJlcigqZiwgc3BlZWQgLyAxMDI0LCBrRmllbGRTaXplX1NwZWVkKTsNCisgICAgZWxzZQ0KKyAgICAgIFByaW50U3BhY2VzKCpmLCAxICsga0ZpZWxkU2l6ZV9TcGVlZCk7DQorICB9DQorICBVSW50NjQgdXNhZ2UgPSBpbmZvLkdldFVzYWdlKCk7DQorICBVSW50NjQgcnB1ID0gaW5mby5HZXRSYXRpbmdQZXJVc2FnZShyYXRpbmcpOw0KKyAgaWYgKGYpDQorICB7DQorICAgIFByaW50UmVzdWx0cygqZiwgdXNhZ2UsIHJwdSwgcmF0aW5nLCBzaG93RnJlcSwgY3B1RnJlcSk7DQorICB9DQorDQorICBpZiAocmVzKQ0KKyAgew0KKyAgICByZXMtPk51bUl0ZXJhdGlvbnMrKzsNCisgICAgcmVzLT5SUFUgKz0gcnB1Ow0KKyAgICByZXMtPlJhdGluZyArPSByYXRpbmc7DQorICAgIHJlcy0+VXNhZ2UgKz0gdXNhZ2U7DQorICB9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFByaW50VG90YWxzKElCZW5jaFByaW50Q2FsbGJhY2sgJmYsIGJvb2wgc2hvd0ZyZXEsIFVJbnQ2NCBjcHVGcmVxLCBjb25zdCBDVG90YWxCZW5jaFJlcyAmcmVzKQ0KK3sNCisgIFByaW50U3BhY2VzKGYsIDEgKyBrRmllbGRTaXplX1NwZWVkKTsNCisgIFVJbnQ2NCBudW1JdGVyYXRpb25zID0gcmVzLk51bUl0ZXJhdGlvbnM7DQorICBpZiAobnVtSXRlcmF0aW9ucyA9PSAwKQ0KKyAgICBudW1JdGVyYXRpb25zID0gMTsNCisgIFByaW50UmVzdWx0cyhmLCByZXMuVXNhZ2UgLyBudW1JdGVyYXRpb25zLCByZXMuUlBVIC8gbnVtSXRlcmF0aW9ucywgcmVzLlJhdGluZyAvIG51bUl0ZXJhdGlvbnMsIHNob3dGcmVxLCBjcHVGcmVxKTsNCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnRSZXF1aXJlbWVudHMoSUJlbmNoUHJpbnRDYWxsYmFjayAmZiwgY29uc3QgY2hhciAqc2l6ZVN0cmluZywgVUludDY0IHNpemUsIGNvbnN0IGNoYXIgKnRocmVhZHNTdHJpbmcsIFVJbnQzMiBudW1UaHJlYWRzKQ0KK3sNCisgIGYuUHJpbnQoIlJBTSAiKTsNCisgIGYuUHJpbnQoc2l6ZVN0cmluZyk7DQorICBQcmludE51bWJlcihmLCAoc2l6ZSA+PiAyMCksIDYpOw0KKyAgZi5QcmludCgiIE1CLCAgIyAiKTsNCisgIGYuUHJpbnQodGhyZWFkc1N0cmluZyk7DQorICBQcmludE51bWJlcihmLCBudW1UaHJlYWRzLCAzKTsNCisgIGYuTmV3TGluZSgpOw0KK30NCisNCitzdHJ1Y3QgQ0JlbmNoQ2FsbGJhY2tUb1ByaW50OiBwdWJsaWMgSUJlbmNoQ2FsbGJhY2sNCit7DQorICBDQmVuY2hQcm9wcyBCZW5jaFByb3BzOw0KKyAgQ1RvdGFsQmVuY2hSZXMgRW5jb2RlUmVzOw0KKyAgQ1RvdGFsQmVuY2hSZXMgRGVjb2RlUmVzOw0KKyAgSUJlbmNoUHJpbnRDYWxsYmFjayAqX2ZpbGU7DQorICBVSW50MzIgRGljdFNpemU7DQorDQorICBib29sIFVzZTJDb2x1bW5zOw0KKyAgaW50IE5hbWVGaWVsZFNpemU7DQorDQorICBib29sIFNob3dGcmVxOw0KKyAgVUludDY0IENwdUZyZXE7DQorDQorICBDQmVuY2hDYWxsYmFja1RvUHJpbnQoKTogVXNlMkNvbHVtbnMoZmFsc2UpLCBOYW1lRmllbGRTaXplKDApLCBTaG93RnJlcShmYWxzZSksIENwdUZyZXEoMCkge30NCisNCisgIHZvaWQgSW5pdCgpIHsgRW5jb2RlUmVzLkluaXQoKTsgRGVjb2RlUmVzLkluaXQoKTsgfQ0KKyAgdm9pZCBQcmludChjb25zdCBjaGFyICpzKTsNCisgIHZvaWQgTmV3TGluZSgpOw0KKyAgDQorICBIUkVTVUxUIFNldEZyZXEoYm9vbCBzaG93RnJlcSwgVUludDY0IGNwdUZyZXEpOw0KKyAgSFJFU1VMVCBTZXRFbmNvZGVSZXN1bHQoY29uc3QgQ0JlbmNoSW5mbyAmaW5mbywgYm9vbCBmaW5hbCk7DQorICBIUkVTVUxUIFNldERlY29kZVJlc3VsdChjb25zdCBDQmVuY2hJbmZvICZpbmZvLCBib29sIGZpbmFsKTsNCit9Ow0KKw0KK0hSRVNVTFQgQ0JlbmNoQ2FsbGJhY2tUb1ByaW50OjpTZXRGcmVxKGJvb2wgc2hvd0ZyZXEsIFVJbnQ2NCBjcHVGcmVxKQ0KK3sNCisgIFNob3dGcmVxID0gc2hvd0ZyZXE7DQorICBDcHVGcmVxID0gY3B1RnJlcTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENCZW5jaENhbGxiYWNrVG9QcmludDo6U2V0RW5jb2RlUmVzdWx0KGNvbnN0IENCZW5jaEluZm8gJmluZm8sIGJvb2wgZmluYWwpDQorew0KKyAgUklOT0soX2ZpbGUtPkNoZWNrQnJlYWsoKSk7DQorICBpZiAoZmluYWwpDQorICB7DQorICAgIFVJbnQ2NCByYXRpbmcgPSBCZW5jaFByb3BzLkdldENvbXByZXNzUmF0aW5nKERpY3RTaXplLCBpbmZvLkdsb2JhbFRpbWUsIGluZm8uR2xvYmFsRnJlcSwgaW5mby5VbnBhY2tTaXplICogaW5mby5OdW1JdGVyYXRpb25zKTsNCisgICAgUHJpbnRSZXN1bHRzKF9maWxlLCBpbmZvLCByYXRpbmcsIFNob3dGcmVxLCBDcHVGcmVxLCAmRW5jb2RlUmVzKTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitzdGF0aWMgY29uc3QgY2hhciAqa1NlcCA9ICIgIHwgIjsNCisNCitIUkVTVUxUIENCZW5jaENhbGxiYWNrVG9QcmludDo6U2V0RGVjb2RlUmVzdWx0KGNvbnN0IENCZW5jaEluZm8gJmluZm8sIGJvb2wgZmluYWwpDQorew0KKyAgUklOT0soX2ZpbGUtPkNoZWNrQnJlYWsoKSk7DQorICBpZiAoZmluYWwpDQorICB7DQorICAgIFVJbnQ2NCByYXRpbmcgPSBCZW5jaFByb3BzLkdldERlY29tcHJlc3NSYXRpbmcoaW5mby5HbG9iYWxUaW1lLCBpbmZvLkdsb2JhbEZyZXEsIGluZm8uVW5wYWNrU2l6ZSwgaW5mby5QYWNrU2l6ZSwgaW5mby5OdW1JdGVyYXRpb25zKTsNCisgICAgaWYgKFVzZTJDb2x1bW5zKQ0KKyAgICAgIF9maWxlLT5QcmludChrU2VwKTsNCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgX2ZpbGUtPk5ld0xpbmUoKTsNCisgICAgICBQcmludFNwYWNlcygqX2ZpbGUsIE5hbWVGaWVsZFNpemUpOw0KKyAgICB9DQorICAgIENCZW5jaEluZm8gaW5mbzIgPSBpbmZvOw0KKyAgICBpbmZvMi5VbnBhY2tTaXplICo9IGluZm8yLk51bUl0ZXJhdGlvbnM7DQorICAgIGluZm8yLlBhY2tTaXplICo9IGluZm8yLk51bUl0ZXJhdGlvbnM7DQorICAgIGluZm8yLk51bUl0ZXJhdGlvbnMgPSAxOw0KKyAgICBQcmludFJlc3VsdHMoX2ZpbGUsIGluZm8yLCByYXRpbmcsIFNob3dGcmVxLCBDcHVGcmVxLCAmRGVjb2RlUmVzKTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCit2b2lkIENCZW5jaENhbGxiYWNrVG9QcmludDo6UHJpbnQoY29uc3QgY2hhciAqcykNCit7DQorICBfZmlsZS0+UHJpbnQocyk7DQorfQ0KKw0KK3ZvaWQgQ0JlbmNoQ2FsbGJhY2tUb1ByaW50OjpOZXdMaW5lKCkNCit7DQorICBfZmlsZS0+TmV3TGluZSgpOw0KK30NCisNCit2b2lkIFByaW50TGVmdChJQmVuY2hQcmludENhbGxiYWNrICZmLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBzaXplKQ0KK3sNCisgIGYuUHJpbnQocyk7DQorICBpbnQgbnVtU3BhY2VzID0gc2l6ZSAtIE15U3RyaW5nTGVuKHMpOw0KKyAgaWYgKG51bVNwYWNlcyA+IDApDQorICAgIFByaW50U3BhY2VzKGYsIG51bVNwYWNlcyk7DQorfQ0KKw0KK3ZvaWQgUHJpbnRSaWdodChJQmVuY2hQcmludENhbGxiYWNrICZmLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBzaXplKQ0KK3sNCisgIGludCBudW1TcGFjZXMgPSBzaXplIC0gTXlTdHJpbmdMZW4ocyk7DQorICBpZiAobnVtU3BhY2VzID4gMCkNCisgICAgUHJpbnRTcGFjZXMoZiwgbnVtU3BhY2VzKTsNCisgIGYuUHJpbnQocyk7DQorfQ0KKw0KK3N0YXRpYyBIUkVTVUxUIFRvdGFsQmVuY2goDQorICAgIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgIFVJbnQ2NCBjb21wbGV4SW5Db21tYW5kcywNCisgICAgVUludDMyIG51bVRocmVhZHMsIGJvb2wgZm9yY2VVbnBhY2tTaXplLCBVSW50MzIgdW5wYWNrU2l6ZSwgSUJlbmNoUHJpbnRDYWxsYmFjayAqcHJpbnRDYWxsYmFjaywgQ0JlbmNoQ2FsbGJhY2tUb1ByaW50ICpjYWxsYmFjaykNCit7DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQVJSQVlfU0laRShnX0JlbmNoKTsgaSsrKQ0KKyAgew0KKyAgICBDQmVuY2hNZXRob2QgYmVuY2ggPSBnX0JlbmNoW2ldOw0KKyAgICBQcmludExlZnQoKmNhbGxiYWNrLT5fZmlsZSwgYmVuY2guTmFtZSwga0ZpZWxkU2l6ZV9OYW1lKTsNCisgICAgY2FsbGJhY2stPkJlbmNoUHJvcHMuRGVjQ29tcGxleFVuYyA9IGJlbmNoLkRlY0NvbXBsZXhVbmM7DQorICAgIGNhbGxiYWNrLT5CZW5jaFByb3BzLkRlY0NvbXBsZXhDb21wciA9IGJlbmNoLkRlY0NvbXBsZXhDb21wcjsNCisgICAgY2FsbGJhY2stPkJlbmNoUHJvcHMuRW5jQ29tcGxleCA9IGJlbmNoLkVuY0NvbXBsZXg7DQorICAgIENPbmVNZXRob2RJbmZvIG1ldGhvZDsNCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3BWYXJpYW50Ow0KKyAgICBwcm9wVmFyaWFudCA9IGJlbmNoLk5hbWU7DQorICAgIFJJTk9LKG1ldGhvZC5QYXJzZU1ldGhvZEZyb21QUk9QVkFSSUFOVChMIiIsIHByb3BWYXJpYW50KSk7DQorDQorICAgIFVJbnQzMiB1bnBhY2tTaXplMiA9IHVucGFja1NpemU7DQorICAgIGlmICghZm9yY2VVbnBhY2tTaXplICYmIGJlbmNoLkRpY3RCaXRzID09IDApDQorICAgICAgdW5wYWNrU2l6ZTIgPSBrRmlsdGVyVW5wYWNrU2l6ZTsNCisNCisgICAgSFJFU1VMVCByZXMgPSBNZXRob2RCZW5jaCgNCisgICAgICAgIEVYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICAgICAgY29tcGxleEluQ29tbWFuZHMsDQorICAgICAgICBmYWxzZSwgbnVtVGhyZWFkcywgbWV0aG9kLCB1bnBhY2tTaXplMiwgYmVuY2guRGljdEJpdHMsDQorICAgICAgICBwcmludENhbGxiYWNrLCBjYWxsYmFjaywgJmNhbGxiYWNrLT5CZW5jaFByb3BzKTsNCisgICAgaWYgKHJlcyA9PSBFX05PVElNUEwpDQorICAgIHsNCisgICAgICAvLyBjYWxsYmFjay0+UHJpbnQoIiAtLS0iKTsNCisgICAgICAvLyB3ZSBuZWVkIGFkZGl0aW9uYWwgZW1wdHkgbGluZSBhcyBsaW5lIGZvciBkZWNvbXByZXNzaW9uIHJlc3VsdHMNCisgICAgICBpZiAoIWNhbGxiYWNrLT5Vc2UyQ29sdW1ucykNCisgICAgICAgIGNhbGxiYWNrLT5OZXdMaW5lKCk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgUklOT0socmVzKTsNCisgICAgfQ0KKyAgICBjYWxsYmFjay0+TmV3TGluZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKw0KK3N0YXRpYyBIUkVTVUxUIEZyZXFCZW5jaCgNCisgICAgVUludDY0IGNvbXBsZXhJbkNvbW1hbmRzLA0KKyAgICBVSW50MzIgbnVtVGhyZWFkcywNCisgICAgSUJlbmNoUHJpbnRDYWxsYmFjayAqX2ZpbGUsDQorICAgIGJvb2wgc2hvd0ZyZXEsDQorICAgIFVJbnQ2NCAmY3B1RnJlcSwNCisgICAgVUludDMyICZyZXMpDQorew0KKyAgcmVzID0gMDsNCisgIGNwdUZyZXEgPSAwOw0KKw0KKyAgVUludDMyIGJ1ZmZlclNpemUgPSAxIDw8IDIwOw0KKyAgVUludDMyIGNvbXBsZXhpdHkgPSBrTnVtRnJlcUNvbW1hbmRzOw0KKyAgaWYgKG51bVRocmVhZHMgPT0gMCkNCisgICAgbnVtVGhyZWFkcyA9IDE7DQorDQorICAjaWZkZWYgXzdaSVBfU1QNCisgIG51bVRocmVhZHMgPSAxOw0KKyAgI2VuZGlmDQorDQorICBVSW50MzIgYnNpemUgPSAoYnVmZmVyU2l6ZSA9PSAwID8gMSA6IGJ1ZmZlclNpemUpOw0KKyAgVUludDY0IG51bUl0ZXJhdGlvbnMgPSBjb21wbGV4SW5Db21tYW5kcyAvIGNvbXBsZXhpdHkgLyBic2l6ZTsNCisgIGlmIChudW1JdGVyYXRpb25zID09IDApDQorICAgIG51bUl0ZXJhdGlvbnMgPSAxOw0KKw0KKyAgQ0JlbmNoSW5mb0NhbGMgcHJvZ3Jlc3NJbmZvU3BlYzsNCisNCisgICNpZm5kZWYgXzdaSVBfU1QNCisgIENGcmVxVGhyZWFkcyB0aHJlYWRzOw0KKyAgaWYgKG51bVRocmVhZHMgPiAxKQ0KKyAgew0KKyAgICB0aHJlYWRzLkl0ZW1zID0gbmV3IENGcmVxSW5mb1tudW1UaHJlYWRzXTsNCisgICAgVUludDMyIGk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1UaHJlYWRzOyBpKyspDQorICAgIHsNCisgICAgICBDRnJlcUluZm8gJmluZm8gPSB0aHJlYWRzLkl0ZW1zW2ldOw0KKyAgICAgIGluZm8uQ2FsbGJhY2sgPSBfZmlsZTsNCisgICAgICBpbmZvLkNhbGxiYWNrUmVzID0gU19PSzsNCisgICAgICBpbmZvLk51bUl0ZXJhdGlvbnMgPSBudW1JdGVyYXRpb25zOw0KKyAgICAgIGluZm8uU2l6ZSA9IGJ1ZmZlclNpemU7DQorICAgIH0NCisgICAgcHJvZ3Jlc3NJbmZvU3BlYy5TZXRTdGFydFRpbWUoKTsNCisgICAgZm9yIChpID0gMDsgaSA8IG51bVRocmVhZHM7IGkrKykNCisgICAgew0KKyAgICAgIENGcmVxSW5mbyAmaW5mbyA9IHRocmVhZHMuSXRlbXNbaV07DQorICAgICAgUklOT0soaW5mby5UaHJlYWQuQ3JlYXRlKEZyZXFUaHJlYWRGdW5jdGlvbiwgJmluZm8pKTsNCisgICAgICB0aHJlYWRzLk51bVRocmVhZHMrKzsNCisgICAgfQ0KKyAgICB0aHJlYWRzLldhaXRBbGwoKTsNCisgICAgZm9yIChpID0gMDsgaSA8IG51bVRocmVhZHM7IGkrKykNCisgICAgew0KKyAgICAgIFJJTk9LKHRocmVhZHMuSXRlbXNbaV0uQ2FsbGJhY2tSZXMpOw0KKyAgICB9DQorICB9DQorICBlbHNlDQorICAjZW5kaWYNCisgIHsNCisgICAgcHJvZ3Jlc3NJbmZvU3BlYy5TZXRTdGFydFRpbWUoKTsNCisgICAgVUludDMyIHN1bSA9IGdfQmVuY2hDcHVGcmVxVGVtcDsNCisgICAgZm9yIChVSW50NjQgayA9IG51bUl0ZXJhdGlvbnM7IGsgPiAwOyBrLS0pDQorICAgIHsNCisgICAgICBSSU5PSyhfZmlsZS0+Q2hlY2tCcmVhaygpKTsNCisgICAgICBzdW0gPSBDb3VudENwdUZyZXEoc3VtLCBidWZmZXJTaXplLCBnX0JlbmNoQ3B1RnJlcVRlbXApOw0KKyAgICB9DQorICAgIHJlcyArPSBzdW07DQorICB9DQorICBDQmVuY2hJbmZvIGluZm87DQorICBwcm9ncmVzc0luZm9TcGVjLlNldEZpbmlzaFRpbWUoaW5mbyk7DQorDQorICBpbmZvLlVucGFja1NpemUgPSAwOw0KKyAgaW5mby5QYWNrU2l6ZSA9IDA7DQorICBpbmZvLk51bUl0ZXJhdGlvbnMgPSAxOw0KKw0KKyAgaWYgKF9maWxlKQ0KKyAgew0KKyAgICB7DQorICAgICAgVUludDY0IG51bUNvbW1hbmRzID0gKFVJbnQ2NCludW1JdGVyYXRpb25zICogYnVmZmVyU2l6ZSAqIG51bVRocmVhZHMgKiBjb21wbGV4aXR5Ow0KKyAgICAgIFVJbnQ2NCByYXRpbmcgPSBpbmZvLkdldFNwZWVkKG51bUNvbW1hbmRzKTsNCisgICAgICBjcHVGcmVxID0gcmF0aW5nIC8gbnVtVGhyZWFkczsNCisgICAgICBQcmludFJlc3VsdHMoX2ZpbGUsIGluZm8sIHJhdGluZywgc2hvd0ZyZXEsIHNob3dGcmVxID8gY3B1RnJlcSA6IDAsIE5VTEwpOw0KKyAgICB9DQorICAgIFJJTk9LKF9maWxlLT5DaGVja0JyZWFrKCkpOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKw0KKw0KK3N0YXRpYyBIUkVTVUxUIENyY0JlbmNoKA0KKyAgICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICBVSW50NjQgY29tcGxleEluQ29tbWFuZHMsDQorICAgIFVJbnQzMiBudW1UaHJlYWRzLCBVSW50MzIgYnVmZmVyU2l6ZSwNCisgICAgVUludDY0ICZzcGVlZCwNCisgICAgVUludDMyIGNvbXBsZXhpdHksDQorICAgIGNvbnN0IFVJbnQzMiAqY2hlY2tTdW0sDQorICAgIGNvbnN0IENPbmVNZXRob2RJbmZvICZtZXRob2QsDQorICAgIElCZW5jaFByaW50Q2FsbGJhY2sgKl9maWxlLA0KKyAgICBDVG90YWxCZW5jaFJlcyAqZW5jb2RlUmVzLA0KKyAgICBib29sIHNob3dGcmVxLCBVSW50NjQgY3B1RnJlcSkNCit7DQorICBpZiAobnVtVGhyZWFkcyA9PSAwKQ0KKyAgICBudW1UaHJlYWRzID0gMTsNCisNCisgICNpZmRlZiBfN1pJUF9TVA0KKyAgbnVtVGhyZWFkcyA9IDE7DQorICAjZW5kaWYNCisNCisgIFVTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5NZXRob2ROYW1lOw0KKyAgLy8gbWV0aG9kTmFtZS5SZW1vdmVDaGFyKEwnLScpOw0KKyAgQ01ldGhvZElkIGhhc2hJRDsNCisgIGlmICghRmluZEhhc2hNZXRob2QoDQorICAgICAgRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgICAgbWV0aG9kTmFtZSwgaGFzaElEKSkNCisgICAgcmV0dXJuIEVfTk9USU1QTDsNCisNCisgIENCZW5jaEJ1ZmZlciBidWZmZXI7DQorICBzaXplX3QgdG90YWxTaXplID0gKHNpemVfdClidWZmZXJTaXplICogbnVtVGhyZWFkczsNCisgIGlmICh0b3RhbFNpemUgLyBudW1UaHJlYWRzICE9IGJ1ZmZlclNpemUpDQorICAgIHJldHVybiBFX09VVE9GTUVNT1JZOw0KKyAgaWYgKCFidWZmZXIuQWxsb2ModG90YWxTaXplKSkNCisgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7DQorDQorICBCeXRlICpidWYgPSBidWZmZXIuQnVmZmVyOw0KKyAgQ0Jhc2VSYW5kb21HZW5lcmF0b3IgUkc7DQorICBVSW50MzIgYnNpemUgPSAoYnVmZmVyU2l6ZSA9PSAwID8gMSA6IGJ1ZmZlclNpemUpOw0KKyAgVUludDY0IG51bUl0ZXJhdGlvbnMgPSBjb21wbGV4SW5Db21tYW5kcyAqIDI1NiAvIGNvbXBsZXhpdHkgLyBic2l6ZTsNCisgIGlmIChudW1JdGVyYXRpb25zID09IDApDQorICAgIG51bUl0ZXJhdGlvbnMgPSAxOw0KKw0KKyAgQ0JlbmNoSW5mb0NhbGMgcHJvZ3Jlc3NJbmZvU3BlYzsNCisNCisgICNpZm5kZWYgXzdaSVBfU1QNCisgIENDcmNUaHJlYWRzIHRocmVhZHM7DQorICBpZiAobnVtVGhyZWFkcyA+IDEpDQorICB7DQorICAgIHRocmVhZHMuSXRlbXMgPSBuZXcgQ0NyY0luZm9bbnVtVGhyZWFkc107DQorICAgIFVJbnQzMiBpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGhyZWFkczsgaSsrKQ0KKyAgICB7DQorICAgICAgQ0NyY0luZm8gJmluZm8gPSB0aHJlYWRzLkl0ZW1zW2ldOw0KKyAgICAgIFVTdHJpbmcgbmFtZTsNCisgICAgICBSSU5PSyhDcmVhdGVIYXNoZXIoRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTIGhhc2hJRCwgbmFtZSwgaW5mby5IYXNoZXIpKTsNCisgICAgICBpZiAoIWluZm8uSGFzaGVyKQ0KKyAgICAgICAgcmV0dXJuIEVfTk9USU1QTDsNCisgICAgICBDTXlDb21QdHI8SUNvbXByZXNzU2V0Q29kZXJQcm9wZXJ0aWVzPiBzY3A7DQorICAgICAgaW5mby5IYXNoZXIuUXVlcnlJbnRlcmZhY2UoSUlEX0lDb21wcmVzc1NldENvZGVyUHJvcGVydGllcywgJnNjcCk7DQorICAgICAgaWYgKHNjcCkNCisgICAgICB7DQorICAgICAgICBVSW50NjQgcmVkdWNlU2l6ZSA9IDE7DQorICAgICAgICBSSU5PSyhtZXRob2QuU2V0Q29kZXJQcm9wcyhzY3AsICZyZWR1Y2VTaXplKSk7DQorICAgICAgfQ0KKw0KKyAgICAgIEJ5dGUgKmRhdGEgPSBidWYgKyAoc2l6ZV90KWJ1ZmZlclNpemUgKiBpOw0KKyAgICAgIGluZm8uQ2FsbGJhY2sgPSBfZmlsZTsNCisgICAgICBpbmZvLkRhdGEgPSBkYXRhOw0KKyAgICAgIGluZm8uTnVtSXRlcmF0aW9ucyA9IG51bUl0ZXJhdGlvbnM7DQorICAgICAgaW5mby5TaXplID0gYnVmZmVyU2l6ZTsNCisgICAgICAvKiBpbmZvLkNyYyA9ICovIFJhbmRHZW5DcmMoZGF0YSwgYnVmZmVyU2l6ZSwgUkcpOw0KKyAgICAgIGluZm8uQ2hlY2tTdW1EZWZpbmVkID0gZmFsc2U7DQorICAgICAgaWYgKGNoZWNrU3VtKQ0KKyAgICAgIHsNCisgICAgICAgIGluZm8uQ2hlY2tTdW0gPSAqY2hlY2tTdW07DQorICAgICAgICBpbmZvLkNoZWNrU3VtRGVmaW5lZCA9IChjaGVja1N1bSAmJiAoaSA9PSAwKSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHByb2dyZXNzSW5mb1NwZWMuU2V0U3RhcnRUaW1lKCk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1UaHJlYWRzOyBpKyspDQorICAgIHsNCisgICAgICBDQ3JjSW5mbyAmaW5mbyA9IHRocmVhZHMuSXRlbXNbaV07DQorICAgICAgUklOT0soaW5mby5UaHJlYWQuQ3JlYXRlKENyY1RocmVhZEZ1bmN0aW9uLCAmaW5mbykpOw0KKyAgICAgIHRocmVhZHMuTnVtVGhyZWFkcysrOw0KKyAgICB9DQorICAgIHRocmVhZHMuV2FpdEFsbCgpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGhyZWFkczsgaSsrKQ0KKyAgICB7DQorICAgICAgUklOT0sodGhyZWFkcy5JdGVtc1tpXS5SZXMpOw0KKyAgICB9DQorICB9DQorICBlbHNlDQorICAjZW5kaWYNCisgIHsNCisgICAgLyogVUludDMyIGNyYyA9ICovIFJhbmRHZW5DcmMoYnVmLCBidWZmZXJTaXplLCBSRyk7DQorICAgIHByb2dyZXNzSW5mb1NwZWMuU2V0U3RhcnRUaW1lKCk7DQorICAgIENNeUNvbVB0cjxJSGFzaGVyPiBoYXNoZXI7DQorICAgIFVTdHJpbmcgbmFtZTsNCisgICAgUklOT0soQ3JlYXRlSGFzaGVyKEVYVEVSTkFMX0NPREVDU19MT0NfVkFSUyBoYXNoSUQsIG5hbWUsIGhhc2hlcikpOw0KKyAgICBpZiAoIWhhc2hlcikNCisgICAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgICBDTXlDb21QdHI8SUNvbXByZXNzU2V0Q29kZXJQcm9wZXJ0aWVzPiBzY3A7DQorICAgIGhhc2hlci5RdWVyeUludGVyZmFjZShJSURfSUNvbXByZXNzU2V0Q29kZXJQcm9wZXJ0aWVzLCAmc2NwKTsNCisgICAgaWYgKHNjcCkNCisgICAgew0KKyAgICAgIFVJbnQ2NCByZWR1Y2VTaXplID0gMTsNCisgICAgICBSSU5PSyhtZXRob2QuU2V0Q29kZXJQcm9wcyhzY3AsICZyZWR1Y2VTaXplKSk7DQorICAgIH0NCisgICAgUklOT0soQ3JjQmlnKGJ1ZiwgYnVmZmVyU2l6ZSwgbnVtSXRlcmF0aW9ucywgY2hlY2tTdW0sIGhhc2hlciwgX2ZpbGUpKTsNCisgIH0NCisgIENCZW5jaEluZm8gaW5mbzsNCisgIHByb2dyZXNzSW5mb1NwZWMuU2V0RmluaXNoVGltZShpbmZvKTsNCisNCisgIFVJbnQ2NCB1bnBTaXplID0gbnVtSXRlcmF0aW9ucyAqIGJ1ZmZlclNpemU7DQorICBVSW50NjQgdW5wU2l6ZVRocmVhZHMgPSB1bnBTaXplICogbnVtVGhyZWFkczsNCisgIGluZm8uVW5wYWNrU2l6ZSA9IHVucFNpemVUaHJlYWRzOw0KKyAgaW5mby5QYWNrU2l6ZSA9IHVucFNpemVUaHJlYWRzOw0KKyAgaW5mby5OdW1JdGVyYXRpb25zID0gMTsNCisNCisgIGlmIChfZmlsZSkNCisgIHsNCisgICAgew0KKyAgICAgIFVJbnQ2NCBudW1Db21tYW5kcyA9IHVucFNpemVUaHJlYWRzICogY29tcGxleGl0eSAvIDI1NjsNCisgICAgICBVSW50NjQgcmF0aW5nID0gaW5mby5HZXRTcGVlZChudW1Db21tYW5kcyk7DQorICAgICAgUHJpbnRSZXN1bHRzKF9maWxlLCBpbmZvLCByYXRpbmcsIHNob3dGcmVxLCBjcHVGcmVxLCBlbmNvZGVSZXMpOw0KKyAgICB9DQorICAgIFJJTk9LKF9maWxlLT5DaGVja0JyZWFrKCkpOw0KKyAgfQ0KKw0KKyAgc3BlZWQgPSBpbmZvLkdldFNwZWVkKHVucFNpemVUaHJlYWRzKTsNCisNCisgIHJldHVybiBTX09LOw0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBUb3RhbEJlbmNoX0hhc2goDQorICAgIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgIFVJbnQ2NCBjb21wbGV4SW5Db21tYW5kcywNCisgICAgVUludDMyIG51bVRocmVhZHMsIFVJbnQzMiBidWZTaXplLA0KKyAgICBJQmVuY2hQcmludENhbGxiYWNrICpwcmludENhbGxiYWNrLCBDQmVuY2hDYWxsYmFja1RvUHJpbnQgKmNhbGxiYWNrLA0KKyAgICBDVG90YWxCZW5jaFJlcyAqZW5jb2RlUmVzLA0KKyAgICBib29sIHNob3dGcmVxLCBVSW50NjQgY3B1RnJlcSkNCit7DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQVJSQVlfU0laRShnX0hhc2gpOyBpKyspDQorICB7DQorICAgIGNvbnN0IENCZW5jaEhhc2ggJmJlbmNoID0gZ19IYXNoW2ldOw0KKyAgICBQcmludExlZnQoKmNhbGxiYWNrLT5fZmlsZSwgYmVuY2guTmFtZSwga0ZpZWxkU2l6ZV9OYW1lKTsNCisgICAgLy8gY2FsbGJhY2stPkJlbmNoUHJvcHMuRGVjQ29tcGxleFVuYyA9IGJlbmNoLkRlY0NvbXBsZXhVbmM7DQorICAgIC8vIGNhbGxiYWNrLT5CZW5jaFByb3BzLkRlY0NvbXBsZXhDb21wciA9IGJlbmNoLkRlY0NvbXBsZXhDb21wcjsNCisgICAgLy8gY2FsbGJhY2stPkJlbmNoUHJvcHMuRW5jQ29tcGxleCA9IGJlbmNoLkVuY0NvbXBsZXg7DQorDQorICAgIENPbmVNZXRob2RJbmZvIG1ldGhvZDsNCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3BWYXJpYW50Ow0KKyAgICBwcm9wVmFyaWFudCA9IGJlbmNoLk5hbWU7DQorICAgIFJJTk9LKG1ldGhvZC5QYXJzZU1ldGhvZEZyb21QUk9QVkFSSUFOVChMIiIsIHByb3BWYXJpYW50KSk7DQorDQorICAgIFVJbnQ2NCBzcGVlZDsNCisgICAgSFJFU1VMVCByZXMgPSBDcmNCZW5jaCgNCisgICAgICAgIEVYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICAgICAgY29tcGxleEluQ29tbWFuZHMsDQorICAgICAgICBudW1UaHJlYWRzLCBidWZTaXplLA0KKyAgICAgICAgc3BlZWQsDQorICAgICAgICBiZW5jaC5Db21wbGV4LCAmYmVuY2guQ2hlY2tTdW0sIG1ldGhvZCwNCisgICAgICAgIHByaW50Q2FsbGJhY2ssIGVuY29kZVJlcywgc2hvd0ZyZXEsIGNwdUZyZXEpOw0KKyAgICBpZiAocmVzID09IEVfTk9USU1QTCkNCisgICAgew0KKyAgICAgIC8vIGNhbGxiYWNrLT5QcmludCgiIC0tLSIpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIFJJTk9LKHJlcyk7DQorICAgIH0NCisgICAgY2FsbGJhY2stPk5ld0xpbmUoKTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitzdHJ1Y3QgQ1RlbXBWYWx1ZXMNCit7DQorICBVSW50NjQgKlZhbHVlczsNCisgIENUZW1wVmFsdWVzKFVJbnQzMiBudW0pIHsgVmFsdWVzID0gbmV3IFVJbnQ2NFtudW1dOyB9DQorICB+Q1RlbXBWYWx1ZXMoKSB7IGRlbGV0ZSBbXVZhbHVlczsgfQ0KK307DQorDQorc3RhdGljIHZvaWQgUGFyc2VOdW1iZXJTdHJpbmcoY29uc3QgVVN0cmluZyAmcywgTkNPTTo6Q1Byb3BWYXJpYW50ICZwcm9wKQ0KK3sNCisgIGNvbnN0IHdjaGFyX3QgKmVuZDsNCisgIFVJbnQ2NCByZXN1bHQgPSBDb252ZXJ0U3RyaW5nVG9VSW50NjQocywgJmVuZCk7DQorICBpZiAoKmVuZCAhPSAwIHx8IHMuSXNFbXB0eSgpKQ0KKyAgICBwcm9wID0gczsNCisgIGVsc2UgaWYgKHJlc3VsdCA8PSAoVUludDMyKTB4RkZGRkZGRkYpDQorICAgIHByb3AgPSAoVUludDMyKXJlc3VsdDsNCisgIGVsc2UNCisgICAgcHJvcCA9IHJlc3VsdDsNCit9DQorDQorc3RhdGljIFVJbnQzMiBHZXROdW1UaHJlYWRzTmV4dCh1bnNpZ25lZCBpLCBVSW50MzIgbnVtVGhyZWFkcykNCit7DQorICBpZiAoaSA8IDIpDQorICAgIHJldHVybiBpICsgMTsNCisgIGkgLT0gMTsNCisgIFVJbnQzMiBudW0gPSAoVUludDMyKSgyICsgKGkgJiAxKSkgPDwgKGkgPj4gMSk7DQorICByZXR1cm4gKG51bSA8PSBudW1UaHJlYWRzKSA/IG51bSA6IG51bVRocmVhZHM7DQorfQ0KKw0KK3N0YXRpYyBib29sIEFyZVNhbWVNZXRob2ROYW1lcyhjb25zdCBjaGFyICpmdWxsTmFtZSwgY29uc3Qgd2NoYXJfdCAqc2hvcnROYW1lKQ0KK3sNCisgIGZvciAoOzspDQorICB7DQorICAgIHdjaGFyX3QgYzIgPSAqc2hvcnROYW1lKys7DQorICAgIGlmIChjMiA9PSAwKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICBjaGFyIGMxID0gKmZ1bGxOYW1lKys7DQorICAgIGlmICgodW5zaWduZWQgY2hhcilNeUNoYXJMb3dlcl9Bc2NpaShjMSkgIT0gTXlDaGFyTG93ZXJfQXNjaWkoYzIpKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgIH0NCit9DQorDQorSFJFU1VMVCBCZW5jaCgNCisgICAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgSUJlbmNoUHJpbnRDYWxsYmFjayAqcHJpbnRDYWxsYmFjaywNCisgICAgSUJlbmNoQ2FsbGJhY2sgKmJlbmNoQ2FsbGJhY2ssDQorICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q1Byb3BlcnR5PiAmcHJvcHMsDQorICAgIFVJbnQzMiBudW1JdGVyYXRpb25zLA0KKyAgICBib29sIG11bHRpRGljdCkNCit7DQorICBpZiAoIUNyY0ludGVybmFsVGVzdCgpKQ0KKyAgICByZXR1cm4gU19GQUxTRTsNCisNCisgIFVJbnQzMiBudW1DUFVzID0gMTsNCisgIFVJbnQ2NCByYW1TaXplID0gKFVJbnQ2NCk1MTIgPDwgMjA7DQorICAjaWZuZGVmIF83WklQX1NUDQorICBudW1DUFVzID0gTlN5c3RlbTo6R2V0TnVtYmVyT2ZQcm9jZXNzb3JzKCk7DQorICAjZW5kaWYNCisgICNpZiAhZGVmaW5lZChfN1pJUF9TVCkgfHwgZGVmaW5lZChfV0lOMzIpDQorICByYW1TaXplID0gTlN5c3RlbTo6R2V0UmFtU2l6ZSgpOw0KKyAgI2VuZGlmDQorICBVSW50MzIgbnVtVGhyZWFkcyA9IG51bUNQVXM7DQorDQorICBVSW50MzIgdGVzdFRpbWUgPSBrQ29tcGxleEluU2Vjb25kczsNCisNCisgIENPbmVNZXRob2RJbmZvIG1ldGhvZDsNCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgcHJvcHMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIGNvbnN0IENQcm9wZXJ0eSAmcHJvcGVydHkgPSBwcm9wc1tpXTsNCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3BWYXJpYW50Ow0KKyAgICBVU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eS5OYW1lOw0KKyAgICBuYW1lLk1ha2VMb3dlcl9Bc2NpaSgpOw0KKyAgICBpZiAoIXByb3BlcnR5LlZhbHVlLklzRW1wdHkoKSkNCisgICAgICBQYXJzZU51bWJlclN0cmluZyhwcm9wZXJ0eS5WYWx1ZSwgcHJvcFZhcmlhbnQpOw0KKyAgICBpZiAobmFtZS5Jc0VxdWFsVG8oInRlc3R0aW1lIikpDQorICAgIHsNCisgICAgICBSSU5PSyhQYXJzZVByb3BUb1VJbnQzMihMIiIsIHByb3BWYXJpYW50LCB0ZXN0VGltZSkpOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChuYW1lLklzUHJlZml4ZWRCeShMIm10IikpDQorICAgIHsNCisgICAgICAjaWZuZGVmIF83WklQX1NUDQorICAgICAgUklOT0soUGFyc2VNdFByb3AobmFtZS5QdHIoMiksIHByb3BWYXJpYW50LCBudW1DUFVzLCBudW1UaHJlYWRzKSk7DQorICAgICAgI2VuZGlmDQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgUklOT0sobWV0aG9kLlBhcnNlTWV0aG9kRnJvbVBST1BWQVJJQU5UKG5hbWUsIHByb3BWYXJpYW50KSk7DQorICB9DQorDQorICBpZiAocHJpbnRDYWxsYmFjaykNCisgIHsNCisgICAgcHJpbnRDYWxsYmFjay0+UHJpbnQoIkNQVSBGcmVxOiIpOw0KKyAgfQ0KKw0KKyAgVUludDY0IGNvbXBsZXhJbkNvbW1hbmRzID0ga0NvbXBsZXhJbkNvbW1hbmRzOw0KKw0KKyAgaWYgKHByaW50Q2FsbGJhY2spDQorICB7DQorICAgIFVJbnQ2NCBudW1NaWxDb21tYW5kcyA9ICgxIDw8IDYpOw0KKw0KKyAgICBmb3IgKGludCBqaiA9IDA7OyBqaisrKQ0KKyAgICB7DQorICAgICAgVUludDY0IHN0YXJ0ID0gOjpHZXRUaW1lQ291bnQoKTsNCisgICAgICBVSW50MzIgc3VtID0gKFVJbnQzMilzdGFydDsNCisgICAgICBzdW0gPSBDb3VudENwdUZyZXEoc3VtLCAoVUludDMyKShudW1NaWxDb21tYW5kcyAqIDEwMDAwMDAgLyBrTnVtRnJlcUNvbW1hbmRzKSwgZ19CZW5jaENwdUZyZXFUZW1wKTsNCisgICAgICBzdGFydCA9IDo6R2V0VGltZUNvdW50KCkgLSBzdGFydDsNCisgICAgICBpZiAoc3RhcnQgPT0gMCkNCisgICAgICAgIHN0YXJ0ID0gMTsNCisgICAgICBVSW50NjQgZnJlcSA9IEdldEZyZXEoKTsNCisgICAgICBVSW50NjQgbWlwc1ZhbCA9IG51bU1pbENvbW1hbmRzICogZnJlcSAvIHN0YXJ0Ow0KKyAgICAgIGlmIChwcmludENhbGxiYWNrKQ0KKyAgICAgICAgUHJpbnROdW1iZXIoKnByaW50Q2FsbGJhY2ssIG1pcHNWYWwsIDUgKyAoKHN1bSA+PiAzMSkgJiAxKSk7DQorICAgICAgaWYgKGpqID49IDMpDQorICAgICAgew0KKyAgICAgICAgU2V0Q29tcGxleENvbW1hbmRzKHRlc3RUaW1lLCBtaXBzVmFsICogMTAwMDAwMCwgY29tcGxleEluQ29tbWFuZHMpOw0KKyAgICAgICAgaWYgKGpqID49IDggfHwgc3RhcnQgPj0gZnJlcSkNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICAvLyBicmVhazsgLy8gY2hhbmdlIGl0DQorICAgICAgICBudW1NaWxDb21tYW5kcyA8PD0gMTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChwcmludENhbGxiYWNrKQ0KKyAgew0KKyAgICBwcmludENhbGxiYWNrLT5OZXdMaW5lKCk7DQorICAgIHByaW50Q2FsbGJhY2stPk5ld0xpbmUoKTsNCisgICAgUHJpbnRSZXF1aXJlbWVudHMoKnByaW50Q2FsbGJhY2ssICJzaXplOiAiLCByYW1TaXplLCAiQ1BVIGhhcmR3YXJlIHRocmVhZHM6IiwgbnVtQ1BVcyk7DQorICB9DQorDQorICBpZiAobnVtVGhyZWFkcyA8IDEgfHwgbnVtVGhyZWFkcyA+IGtOdW1UaHJlYWRzTWF4KQ0KKyAgICByZXR1cm4gRV9JTlZBTElEQVJHOw0KKw0KKyAgVUludDMyIGRpY3Q7DQorICBib29sIGRpY3RJc0RlZmluZWQgPSBtZXRob2QuR2V0X0RpY1NpemUoZGljdCk7DQorDQorICBpZiAobWV0aG9kLk1ldGhvZE5hbWUuSXNFbXB0eSgpKQ0KKyAgICBtZXRob2QuTWV0aG9kTmFtZSA9IEwiTFpNQSI7DQorDQorICBpZiAoYmVuY2hDYWxsYmFjaykNCisgIHsNCisgICAgQ0JlbmNoUHJvcHMgYmVuY2hQcm9wczsNCisgICAgYmVuY2hQcm9wcy5TZXRMem1hQ29tcGV4aXR5KCk7DQorICAgIFVJbnQzMiBkaWN0U2l6ZSA9IG1ldGhvZC5HZXRfTHptYV9EaWNTaXplKCk7DQorICAgIFVJbnQzMiB1bmNvbXByZXNzZWREYXRhU2l6ZSA9IGtBZGRpdGlvbmFsU2l6ZSArIGRpY3RTaXplOw0KKyAgICByZXR1cm4gTWV0aG9kQmVuY2goDQorICAgICAgICBFWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgICAgIGNvbXBsZXhJbkNvbW1hbmRzLA0KKyAgICAgICAgdHJ1ZSwgbnVtVGhyZWFkcywNCisgICAgICAgIG1ldGhvZCwgdW5jb21wcmVzc2VkRGF0YVNpemUsDQorICAgICAgICBrT2xkTHptYURpY3RCaXRzLCBwcmludENhbGxiYWNrLCBiZW5jaENhbGxiYWNrLCAmYmVuY2hQcm9wcyk7DQorICB9DQorDQorICBVU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuTWV0aG9kTmFtZTsNCisgIGlmIChtZXRob2ROYW1lLklzRXF1YWxUb05vQ2FzZShMIkNSQyIpKQ0KKyAgICBtZXRob2ROYW1lID0gTCJjcmMzMiI7DQorICBtZXRob2QuTWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7DQorICBDTWV0aG9kSWQgaGFzaElEOw0KKyAgaWYgKEZpbmRIYXNoTWV0aG9kKEVYVEVSTkFMX0NPREVDU19MT0NfVkFSUyBtZXRob2ROYW1lLCBoYXNoSUQpKQ0KKyAgew0KKyAgICBpZiAoIXByaW50Q2FsbGJhY2spDQorICAgICAgcmV0dXJuIFNfRkFMU0U7DQorICAgIElCZW5jaFByaW50Q2FsbGJhY2sgJmYgPSAqcHJpbnRDYWxsYmFjazsNCisgICAgaWYgKCFkaWN0SXNEZWZpbmVkKQ0KKyAgICAgIGRpY3QgPSAoMSA8PCAyNCk7DQorDQorDQorICAgIC8vIG1ldGhob2ROYW1lLlJlbW92ZUNoYXIoTCctJyk7DQorICAgIFVJbnQzMiBjb21wbGV4aXR5ID0gMTAwMDA7DQorICAgIGNvbnN0IFVJbnQzMiAqY2hlY2tTdW0gPSBOVUxMOw0KKyAgICB7DQorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ19IYXNoKTsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgIGNvbnN0IENCZW5jaEhhc2ggJmggPSBnX0hhc2hbaV07DQorICAgICAgICBpZiAoQXJlU2FtZU1ldGhvZE5hbWVzKGguTmFtZSwgbWV0aG9kTmFtZSkpDQorICAgICAgICB7DQorICAgICAgICAgIGNvbXBsZXhpdHkgPSBoLkNvbXBsZXg7DQorICAgICAgICAgIGNoZWNrU3VtID0gJmguQ2hlY2tTdW07DQorICAgICAgICAgIGlmIChzdHJjbXAoaC5OYW1lLCAiQ1JDMzI6NCIpICE9IDApDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIGYuTmV3TGluZSgpOw0KKyAgICBmLlByaW50KCJTaXplIik7DQorICAgIGNvbnN0IGludCBrRmllbGRTaXplX0NyY1NwZWVkID0gNjsNCisgICAgdW5zaWduZWQgbnVtVGhyZWFkc1Rlc3RzID0gMDsNCisgICAgZm9yICg7OykNCisgICAgew0KKyAgICAgIFVJbnQzMiB0ID0gR2V0TnVtVGhyZWFkc05leHQobnVtVGhyZWFkc1Rlc3RzLCBudW1UaHJlYWRzKTsNCisgICAgICBQcmludE51bWJlcihmLCB0LCBrRmllbGRTaXplX0NyY1NwZWVkKTsNCisgICAgICBudW1UaHJlYWRzVGVzdHMrKzsNCisgICAgICBpZiAodCA+PSBudW1UaHJlYWRzKQ0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZi5OZXdMaW5lKCk7DQorICAgIGYuTmV3TGluZSgpOw0KKyAgICBDVGVtcFZhbHVlcyBzcGVlZFRvdGFscyhudW1UaHJlYWRzVGVzdHMpOw0KKyAgICB7DQorICAgICAgZm9yICh1bnNpZ25lZCB0aSA9IDA7IHRpIDwgbnVtVGhyZWFkc1Rlc3RzOyB0aSsrKQ0KKyAgICAgICAgc3BlZWRUb3RhbHMuVmFsdWVzW3RpXSA9IDA7DQorICAgIH0NCisgICAgDQorICAgIFVJbnQ2NCBudW1TdGVwcyA9IDA7DQorICAgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtSXRlcmF0aW9uczsgaSsrKQ0KKyAgICB7DQorICAgICAgZm9yICh1bnNpZ25lZCBwb3cgPSAxMDsgcG93IDwgMzI7IHBvdysrKQ0KKyAgICAgIHsNCisgICAgICAgIFVJbnQzMiBidWZTaXplID0gKFVJbnQzMikxIDw8IHBvdzsNCisgICAgICAgIGlmIChidWZTaXplID4gZGljdCkNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjaGFyIHNbMTZdOw0KKyAgICAgICAgQ29udmVydFVJbnQzMlRvU3RyaW5nKHBvdywgcyk7DQorICAgICAgICBpbnQgcG9zID0gTXlTdHJpbmdMZW4ocyk7DQorICAgICAgICBzW3BvcysrXSA9ICc6JzsNCisgICAgICAgIHNbcG9zKytdID0gJyAnOw0KKyAgICAgICAgc1twb3NdID0gMDsNCisgICAgICAgIGYuUHJpbnQocyk7DQorDQorICAgICAgICBmb3IgKHVuc2lnbmVkIHRpID0gMDsgdGkgPCBudW1UaHJlYWRzVGVzdHM7IHRpKyspDQorICAgICAgICB7DQorICAgICAgICAgIFJJTk9LKGYuQ2hlY2tCcmVhaygpKTsNCisgICAgICAgICAgVUludDMyIHQgPSBHZXROdW1UaHJlYWRzTmV4dCh0aSwgbnVtVGhyZWFkcyk7DQorICAgICAgICAgIFVJbnQ2NCBzcGVlZCA9IDA7DQorICAgICAgICAgIFJJTk9LKENyY0JlbmNoKEVYVEVSTkFMX0NPREVDU19MT0NfVkFSUyBjb21wbGV4SW5Db21tYW5kcywNCisgICAgICAgICAgICAgIHQsIGJ1ZlNpemUsIHNwZWVkLCBjb21wbGV4aXR5LA0KKyAgICAgICAgICAgICAgKHBvdyA9PSBrTnVtSGFzaERpY3RCaXRzKSA/IGNoZWNrU3VtIDogTlVMTCwgbWV0aG9kLCBOVUxMLCBOVUxMLCBmYWxzZSwgMCkpOw0KKyAgICAgICAgICBQcmludE51bWJlcihmLCAoc3BlZWQgPj4gMjApLCBrRmllbGRTaXplX0NyY1NwZWVkKTsNCisgICAgICAgICAgc3BlZWRUb3RhbHMuVmFsdWVzW3RpXSArPSBzcGVlZDsNCisgICAgICAgIH0NCisgICAgICAgIGYuTmV3TGluZSgpOw0KKyAgICAgICAgbnVtU3RlcHMrKzsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKG51bVN0ZXBzICE9IDApDQorICAgIHsNCisgICAgICBmLk5ld0xpbmUoKTsNCisgICAgICBmLlByaW50KCJBdmc6Iik7DQorICAgICAgZm9yICh1bnNpZ25lZCB0aSA9IDA7IHRpIDwgbnVtVGhyZWFkc1Rlc3RzOyB0aSsrKQ0KKyAgICAgIHsNCisgICAgICAgIFByaW50TnVtYmVyKGYsICgoc3BlZWRUb3RhbHMuVmFsdWVzW3RpXSAvIG51bVN0ZXBzKSA+PiAyMCksIGtGaWVsZFNpemVfQ3JjU3BlZWQpOw0KKyAgICAgIH0NCisgICAgICBmLk5ld0xpbmUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gU19PSzsNCisgIH0NCisNCisgIGJvb2wgdXNlMkNvbHVtbnMgPSBmYWxzZTsNCisNCisgIENCZW5jaENhbGxiYWNrVG9QcmludCBjYWxsYmFjazsNCisgIGNhbGxiYWNrLkluaXQoKTsNCisgIGNhbGxiYWNrLl9maWxlID0gcHJpbnRDYWxsYmFjazsNCisNCisgIGlmICghZGljdElzRGVmaW5lZCkNCisgIHsNCisgICAgaW50IGRpY1NpemVMb2c7DQorICAgIGZvciAoZGljU2l6ZUxvZyA9IDI1OyBkaWNTaXplTG9nID4ga0JlbmNoTWluRGljTG9nU2l6ZTsgZGljU2l6ZUxvZy0tKQ0KKyAgICAgIGlmIChHZXRCZW5jaE1lbW9yeVVzYWdlKG51bVRocmVhZHMsICgoVUludDMyKTEgPDwgZGljU2l6ZUxvZykpICsgKDggPDwgMjApIDw9IHJhbVNpemUpDQorICAgICAgICBicmVhazsNCisgICAgZGljdCA9ICgxIDw8IGRpY1NpemVMb2cpOw0KKyAgfQ0KKw0KKyAgSUJlbmNoUHJpbnRDYWxsYmFjayAmZiA9ICpwcmludENhbGxiYWNrOw0KKyAgUHJpbnRSZXF1aXJlbWVudHMoZiwgInVzYWdlOiIsIEdldEJlbmNoTWVtb3J5VXNhZ2UobnVtVGhyZWFkcywgZGljdCksICJCZW5jaG1hcmsgdGhyZWFkczogICAiLCBudW1UaHJlYWRzKTsNCisNCisgIGJvb2wgdG90YWxCZW5jaE1vZGUgPSAobWV0aG9kLk1ldGhvZE5hbWUgPT0gTCIqIik7DQorICBmLk5ld0xpbmUoKTsNCisNCisgIGlmICh0b3RhbEJlbmNoTW9kZSkNCisgIHsNCisgICAgY2FsbGJhY2suTmFtZUZpZWxkU2l6ZSA9IGtGaWVsZFNpemVfTmFtZTsNCisgICAgdXNlMkNvbHVtbnMgPSBmYWxzZTsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgY2FsbGJhY2suTmFtZUZpZWxkU2l6ZSA9IGtGaWVsZFNpemVfU21hbGxOYW1lOw0KKyAgICB1c2UyQ29sdW1ucyA9IHRydWU7DQorICB9DQorICBjYWxsYmFjay5Vc2UyQ29sdW1ucyA9IHVzZTJDb2x1bW5zOw0KKw0KKyAgYm9vbCBzaG93RnJlcSA9IGZhbHNlOw0KKyAgVUludDY0IGNwdUZyZXEgPSAwOw0KKw0KKyAgaWYgKHRvdGFsQmVuY2hNb2RlKQ0KKyAgew0KKyAgICBzaG93RnJlcSA9IHRydWU7DQorICB9DQorDQorICBpbnQgZmlsZWxkU2l6ZSA9IGtGaWVsZFNpemVfVG90YWxTaXplOw0KKyAgaWYgKHNob3dGcmVxKQ0KKyAgICBmaWxlbGRTaXplICs9IGtGaWVsZFNpemVfRVVBbmRFZmZlYzsNCisNCisgIGlmICh1c2UyQ29sdW1ucykNCisgIHsNCisgICAgUHJpbnRTcGFjZXMoZiwgY2FsbGJhY2suTmFtZUZpZWxkU2l6ZSk7DQorICAgIFByaW50UmlnaHQoZiwgIkNvbXByZXNzaW5nIiwgZmlsZWxkU2l6ZSk7DQorICAgIGYuUHJpbnQoa1NlcCk7DQorICAgIFByaW50UmlnaHQoZiwgIkRlY29tcHJlc3NpbmciLCBmaWxlbGRTaXplKTsNCisgIH0NCisgIGYuTmV3TGluZSgpOw0KKyAgUHJpbnRMZWZ0KGYsIHRvdGFsQmVuY2hNb2RlID8gIk1ldGhvZCIgOiAiRGljdCIsIGNhbGxiYWNrLk5hbWVGaWVsZFNpemUpOw0KKw0KKyAgaW50IGo7DQorDQorICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQ0KKyAgew0KKyAgICBQcmludFJpZ2h0KGYsICJTcGVlZCIsIGtGaWVsZFNpemVfU3BlZWQgKyAxKTsNCisgICAgUHJpbnRSaWdodChmLCAiVXNhZ2UiLCBrRmllbGRTaXplX1VzYWdlICsgMSk7DQorICAgIFByaW50UmlnaHQoZiwgIlIvVSIsIGtGaWVsZFNpemVfUlUgKyAxKTsNCisgICAgUHJpbnRSaWdodChmLCAiUmF0aW5nIiwga0ZpZWxkU2l6ZV9SYXRpbmcgKyAxKTsNCisgICAgaWYgKHNob3dGcmVxKQ0KKyAgICB7DQorICAgICAgUHJpbnRSaWdodChmLCAiRS9VIiwga0ZpZWxkU2l6ZV9FVSArIDEpOw0KKyAgICAgIFByaW50UmlnaHQoZiwgIkVmZmVjIiwga0ZpZWxkU2l6ZV9FZmZlYyArIDEpOw0KKyAgICB9DQorICAgIGlmICghdXNlMkNvbHVtbnMpDQorICAgICAgYnJlYWs7DQorICAgIGlmIChqID09IDApDQorICAgICAgZi5QcmludChrU2VwKTsNCisgIH0NCisgIA0KKyAgZi5OZXdMaW5lKCk7DQorICBQcmludFNwYWNlcyhmLCBjYWxsYmFjay5OYW1lRmllbGRTaXplKTsNCisgIA0KKyAgZm9yIChqID0gMDsgaiA8IDI7IGorKykNCisgIHsNCisgICAgUHJpbnRSaWdodChmLCAiS0IvcyIsIGtGaWVsZFNpemVfU3BlZWQgKyAxKTsNCisgICAgUHJpbnRSaWdodChmLCAiJSIsIGtGaWVsZFNpemVfVXNhZ2UgKyAxKTsNCisgICAgUHJpbnRSaWdodChmLCAiTUlQUyIsIGtGaWVsZFNpemVfUlUgKyAxKTsNCisgICAgUHJpbnRSaWdodChmLCAiTUlQUyIsIGtGaWVsZFNpemVfUmF0aW5nICsgMSk7DQorICAgIGlmIChzaG93RnJlcSkNCisgICAgew0KKyAgICAgIFByaW50UmlnaHQoZiwgIiUiLCBrRmllbGRTaXplX0VVICsgMSk7DQorICAgICAgUHJpbnRSaWdodChmLCAiJSIsIGtGaWVsZFNpemVfRWZmZWMgKyAxKTsNCisgICAgfQ0KKyAgICBpZiAoIXVzZTJDb2x1bW5zKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBpZiAoaiA9PSAwKQ0KKyAgICAgIGYuUHJpbnQoa1NlcCk7DQorICB9DQorICANCisgIGYuTmV3TGluZSgpOw0KKyAgZi5OZXdMaW5lKCk7DQorDQorICBpZiAodG90YWxCZW5jaE1vZGUpDQorICB7DQorICAgIGlmICghZGljdElzRGVmaW5lZCkNCisgICAgICBkaWN0ID0NCisgICAgICAgICNpZmRlZiBVTkRFUl9DRQ0KKyAgICAgICAgICAoVUludDY0KTEgPDwgMjA7DQorICAgICAgICAjZWxzZQ0KKyAgICAgICAgICAoVUludDY0KTEgPDwgMjQ7DQorICAgICAgICAjZW5kaWYNCisgICAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBudW1JdGVyYXRpb25zOyBpKyspDQorICAgIHsNCisgICAgICBpZiAoaSAhPSAwKQ0KKyAgICAgICAgcHJpbnRDYWxsYmFjay0+TmV3TGluZSgpOw0KKyAgICAgIEhSRVNVTFQgcmVzOw0KKw0KKyAgICAgIGludCBmcmVxVGVzdDsNCisgICAgICBjb25zdCBpbnQga051bUNwdVRlc3RzID0gMzsNCisgICAgICBmb3IgKGZyZXFUZXN0ID0gMDsgZnJlcVRlc3QgPCBrTnVtQ3B1VGVzdHM7IGZyZXFUZXN0KyspDQorICAgICAgew0KKyAgICAgICAgUHJpbnRMZWZ0KGYsICJDUFUiLCBrRmllbGRTaXplX05hbWUpOw0KKyAgICAgICAgVUludDMyIHJlc1ZhbDsNCisgICAgICAgIFJJTk9LKEZyZXFCZW5jaChjb21wbGV4SW5Db21tYW5kcywgbnVtVGhyZWFkcywgcHJpbnRDYWxsYmFjaywgZnJlcVRlc3QgPT0ga051bUNwdVRlc3RzIC0gMSwgY3B1RnJlcSwgcmVzVmFsKSk7DQorICAgICAgICBjYWxsYmFjay5OZXdMaW5lKCk7DQorDQorICAgICAgICBpZiAoZnJlcVRlc3QgPT0ga051bUNwdVRlc3RzIC0gMSkNCisgICAgICAgICAgU2V0Q29tcGxleENvbW1hbmRzKHRlc3RUaW1lLCBjcHVGcmVxLCBjb21wbGV4SW5Db21tYW5kcyk7DQorICAgICAgfQ0KKyAgICAgIGNhbGxiYWNrLk5ld0xpbmUoKTsNCisNCisgICAgICBjYWxsYmFjay5TZXRGcmVxKHRydWUsIGNwdUZyZXEpOw0KKyAgICAgIHJlcyA9IFRvdGFsQmVuY2goRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTIGNvbXBsZXhJbkNvbW1hbmRzLCBudW1UaHJlYWRzLCBkaWN0SXNEZWZpbmVkLCBkaWN0LCBwcmludENhbGxiYWNrLCAmY2FsbGJhY2spOw0KKyAgICAgIFJJTk9LKHJlcyk7DQorDQorICAgICAgcmVzID0gVG90YWxCZW5jaF9IYXNoKEVYVEVSTkFMX0NPREVDU19MT0NfVkFSUyBjb21wbGV4SW5Db21tYW5kcywgbnVtVGhyZWFkcywNCisgICAgICAgICAgMSA8PCBrTnVtSGFzaERpY3RCaXRzLCBwcmludENhbGxiYWNrLCAmY2FsbGJhY2ssICZjYWxsYmFjay5FbmNvZGVSZXMsIHRydWUsIGNwdUZyZXEpOw0KKyAgICAgIFJJTk9LKHJlcyk7DQorDQorICAgICAgY2FsbGJhY2suTmV3TGluZSgpOw0KKyAgICAgIHsNCisgICAgICAgIFByaW50TGVmdChmLCAiQ1BVIiwga0ZpZWxkU2l6ZV9OYW1lKTsNCisgICAgICAgIFVJbnQzMiByZXNWYWw7DQorICAgICAgICBVSW50NjQgY3B1RnJlcUxhc3RUZW1wID0gY3B1RnJlcTsNCisgICAgICAgIFJJTk9LKEZyZXFCZW5jaChjb21wbGV4SW5Db21tYW5kcywgbnVtVGhyZWFkcywgcHJpbnRDYWxsYmFjaywgZmFsc2UsIGNwdUZyZXFMYXN0VGVtcCwgcmVzVmFsKSk7DQorICAgICAgICBjYWxsYmFjay5OZXdMaW5lKCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBlbHNlDQorICB7DQorICAgIGJvb2wgbmVlZFNldENvbXBsZXhpdHkgPSB0cnVlOw0KKyAgICBpZiAoIW1ldGhvZE5hbWUuSXNFcXVhbFRvTm9DYXNlKEwiTFpNQSIpKQ0KKyAgICB7DQorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ19CZW5jaCk7IGkrKykNCisgICAgICB7DQorICAgICAgICBjb25zdCBDQmVuY2hNZXRob2QgJmggPSBnX0JlbmNoW2ldOw0KKyAgICAgICAgQVN0cmluZyBzID0gaC5OYW1lOw0KKyAgICAgICAgaWYgKEFyZVNhbWVNZXRob2ROYW1lcyhoLk5hbWUsIG1ldGhvZE5hbWUpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBjYWxsYmFjay5CZW5jaFByb3BzLkVuY0NvbXBsZXggPSBoLkVuY0NvbXBsZXg7DQorICAgICAgICAgIGNhbGxiYWNrLkJlbmNoUHJvcHMuRGVjQ29tcGxleENvbXByID0gaC5EZWNDb21wbGV4Q29tcHI7DQorICAgICAgICAgIGNhbGxiYWNrLkJlbmNoUHJvcHMuRGVjQ29tcGxleFVuYyA9IGguRGVjQ29tcGxleFVuYzs7DQorICAgICAgICAgIG5lZWRTZXRDb21wbGV4aXR5ID0gZmFsc2U7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobmVlZFNldENvbXBsZXhpdHkpDQorICAgICAgY2FsbGJhY2suQmVuY2hQcm9wcy5TZXRMem1hQ29tcGV4aXR5KCk7DQorDQorICBmb3IgKGkgPSAwOyBpIDwgbnVtSXRlcmF0aW9uczsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCB1bnNpZ25lZCBrU3RhcnREaWNMb2cgPSAyMjsNCisgICAgdW5zaWduZWQgcG93ID0gKGRpY3QgPCAoKFVJbnQzMikxIDw8IGtTdGFydERpY0xvZykpID8ga0JlbmNoTWluRGljTG9nU2l6ZSA6IGtTdGFydERpY0xvZzsNCisgICAgaWYgKCFtdWx0aURpY3QpDQorICAgICAgcG93ID0gMzE7DQorICAgIHdoaWxlICgoKFVJbnQzMikxIDw8IHBvdykgPiBkaWN0ICYmIHBvdyA+IDApDQorICAgICAgcG93LS07DQorICAgIGZvciAoOyAoKFVJbnQzMikxIDw8IHBvdykgPD0gZGljdDsgcG93KyspDQorICAgIHsNCisgICAgICBjaGFyIHNbMTZdOw0KKyAgICAgIENvbnZlcnRVSW50MzJUb1N0cmluZyhwb3csIHMpOw0KKyAgICAgIHVuc2lnbmVkIHBvcyA9IE15U3RyaW5nTGVuKHMpOw0KKyAgICAgIHNbcG9zKytdID0gJzonOw0KKyAgICAgIHNbcG9zXSA9IDA7DQorICAgICAgUHJpbnRMZWZ0KGYsIHMsIGtGaWVsZFNpemVfU21hbGxOYW1lKTsNCisgICAgICBjYWxsYmFjay5EaWN0U2l6ZSA9IChVSW50MzIpMSA8PCBwb3c7DQorDQorICAgICAgQ09uZU1ldGhvZEluZm8gbWV0aG9kMiA9IG1ldGhvZDsNCisNCisgICAgICBpZiAoU3RyaW5nc0FyZUVxdWFsTm9DYXNlX0FzY2lpKG1ldGhvZDIuTWV0aG9kTmFtZSwgTCJMWk1BIikpDQorICAgICAgew0KKyAgICAgICAgLy8gV2UgYWRkIGRpY3Rpb25hcnkgc2l6ZSBwcm9wZXJ0eS4NCisgICAgICAgIC8vIG1ldGhvZDIgY2FuIGhhdmUgdHdvIGRpZmZlcmVudCBkaWN0aW9uYXJ5IHNpemUgcHJvcGVydGllcy4NCisgICAgICAgIC8vIEFuZCBsYXN0IHByb3BlcnR5IGlzIG1haW4uDQorICAgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcFZhcmlhbnQgPSAoVUludDMyKXBvdzsNCisgICAgICAgIFJJTk9LKG1ldGhvZDIuUGFyc2VNZXRob2RGcm9tUFJPUFZBUklBTlQoTCJkIiwgcHJvcFZhcmlhbnQpKTsNCisgICAgICB9DQorDQorICAgICAgVUludDMyIHVuY29tcHJlc3NlZERhdGFTaXplID0gY2FsbGJhY2suRGljdFNpemU7DQorICAgICAgaWYgKHVuY29tcHJlc3NlZERhdGFTaXplID49ICgxIDw8IDE4KSkNCisgICAgICAgIHVuY29tcHJlc3NlZERhdGFTaXplICs9IGtBZGRpdGlvbmFsU2l6ZTsNCisNCisgICAgICBIUkVTVUxUIHJlcyA9IE1ldGhvZEJlbmNoKA0KKyAgICAgICAgICBFWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgICAgICAgY29tcGxleEluQ29tbWFuZHMsDQorICAgICAgICAgIHRydWUsIG51bVRocmVhZHMsDQorICAgICAgICAgIG1ldGhvZDIsIHVuY29tcHJlc3NlZERhdGFTaXplLA0KKyAgICAgICAgICBrT2xkTHptYURpY3RCaXRzLCBwcmludENhbGxiYWNrLCAmY2FsbGJhY2ssICZjYWxsYmFjay5CZW5jaFByb3BzKTsNCisgICAgICBmLk5ld0xpbmUoKTsNCisgICAgICBSSU5PSyhyZXMpOw0KKyAgICAgIGlmICghbXVsdGlEaWN0KQ0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIH0NCisNCisgIFByaW50Q2hhcnMoZiwgJy0nLCBjYWxsYmFjay5OYW1lRmllbGRTaXplICsgZmlsZWxkU2l6ZSk7DQorICANCisgIGlmICh1c2UyQ29sdW1ucykNCisgIHsNCisgICAgZi5QcmludChrU2VwKTsNCisgICAgUHJpbnRDaGFycyhmLCAnLScsIGZpbGVsZFNpemUpOw0KKyAgfQ0KKyAgZi5OZXdMaW5lKCk7DQorICBpZiAodXNlMkNvbHVtbnMpDQorICB7DQorICAgIFByaW50TGVmdChmLCAiQXZyOiIsIGNhbGxiYWNrLk5hbWVGaWVsZFNpemUpOw0KKyAgICBQcmludFRvdGFscyhmLCBzaG93RnJlcSwgY3B1RnJlcSwgY2FsbGJhY2suRW5jb2RlUmVzKTsNCisgICAgZi5QcmludChrU2VwKTsNCisgICAgUHJpbnRUb3RhbHMoZiwgc2hvd0ZyZXEsIGNwdUZyZXEsIGNhbGxiYWNrLkRlY29kZVJlcyk7DQorICAgIGYuTmV3TGluZSgpOw0KKyAgfQ0KKyAgUHJpbnRMZWZ0KGYsICJUb3Q6IiwgY2FsbGJhY2suTmFtZUZpZWxkU2l6ZSk7DQorICBDVG90YWxCZW5jaFJlcyBtaWRSZXM7DQorICBtaWRSZXMuU2V0U3VtKGNhbGxiYWNrLkVuY29kZVJlcywgY2FsbGJhY2suRGVjb2RlUmVzKTsNCisgIFByaW50VG90YWxzKGYsIHNob3dGcmVxLCBjcHVGcmVxLCBtaWRSZXMpOw0KKyAgZi5OZXdMaW5lKCk7DQorICByZXR1cm4gU19PSzsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vQmVuY2guaCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0JlbmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmMjk0MgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0JlbmNoLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gQmVuY2guaA0KKw0KKyNpZm5kZWYgX183WklQX0JFTkNIX0gNCisjZGVmaW5lIF9fN1pJUF9CRU5DSF9IDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9DcmVhdGVDb2Rlci5oIg0KKyNpbmNsdWRlICIuLi8uLi9VSS9Db21tb24vUHJvcGVydHkuaCINCisNCitzdHJ1Y3QgQ0JlbmNoSW5mbw0KK3sNCisgIFVJbnQ2NCBHbG9iYWxUaW1lOw0KKyAgVUludDY0IEdsb2JhbEZyZXE7DQorICBVSW50NjQgVXNlclRpbWU7DQorICBVSW50NjQgVXNlckZyZXE7DQorICBVSW50NjQgVW5wYWNrU2l6ZTsNCisgIFVJbnQ2NCBQYWNrU2l6ZTsNCisgIFVJbnQ2NCBOdW1JdGVyYXRpb25zOw0KKyAgDQorICBDQmVuY2hJbmZvKCk6IE51bUl0ZXJhdGlvbnMoMCkge30NCisgIFVJbnQ2NCBHZXRVc2FnZSgpIGNvbnN0Ow0KKyAgVUludDY0IEdldFJhdGluZ1BlclVzYWdlKFVJbnQ2NCByYXRpbmcpIGNvbnN0Ow0KKyAgVUludDY0IEdldFNwZWVkKFVJbnQ2NCBudW1Db21tYW5kcykgY29uc3Q7DQorfTsNCisNCitzdHJ1Y3QgSUJlbmNoQ2FsbGJhY2sNCit7DQorICB2aXJ0dWFsIEhSRVNVTFQgU2V0RnJlcShib29sIHNob3dGcmVxLCBVSW50NjQgY3B1RnJlcSkgPSAwOw0KKyAgdmlydHVhbCBIUkVTVUxUIFNldEVuY29kZVJlc3VsdChjb25zdCBDQmVuY2hJbmZvICZpbmZvLCBib29sIGZpbmFsKSA9IDA7DQorICB2aXJ0dWFsIEhSRVNVTFQgU2V0RGVjb2RlUmVzdWx0KGNvbnN0IENCZW5jaEluZm8gJmluZm8sIGJvb2wgZmluYWwpID0gMDsNCit9Ow0KKw0KK1VJbnQ2NCBHZXRDb21wcmVzc1JhdGluZyhVSW50MzIgZGljdFNpemUsIFVJbnQ2NCBlbGFwc2VkVGltZSwgVUludDY0IGZyZXEsIFVJbnQ2NCBzaXplKTsNCitVSW50NjQgR2V0RGVjb21wcmVzc1JhdGluZyhVSW50NjQgZWxhcHNlZFRpbWUsIFVJbnQ2NCBmcmVxLCBVSW50NjQgb3V0U2l6ZSwgVUludDY0IGluU2l6ZSwgVUludDY0IG51bUl0ZXJhdGlvbnMpOw0KKw0KK2NvbnN0IGludCBrQmVuY2hNaW5EaWNMb2dTaXplID0gMTg7DQorDQorVUludDY0IEdldEJlbmNoTWVtb3J5VXNhZ2UoVUludDMyIG51bVRocmVhZHMsIFVJbnQzMiBkaWN0aW9uYXJ5KTsNCisNCitzdHJ1Y3QgSUJlbmNoUHJpbnRDYWxsYmFjaw0KK3sNCisgIHZpcnR1YWwgdm9pZCBQcmludChjb25zdCBjaGFyICpzKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgTmV3TGluZSgpID0gMDsNCisgIHZpcnR1YWwgSFJFU1VMVCBDaGVja0JyZWFrKCkgPSAwOw0KK307DQorDQorSFJFU1VMVCBCZW5jaCgNCisgICAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgSUJlbmNoUHJpbnRDYWxsYmFjayAqcHJpbnRDYWxsYmFjaywNCisgICAgSUJlbmNoQ2FsbGJhY2sgKmJlbmNoQ2FsbGJhY2ssDQorICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q1Byb3BlcnR5PiAmcHJvcHMsDQorICAgIFVJbnQzMiBudW1JdGVyYXRpb25zLA0KKyAgICBib29sIG11bHRpRGljdA0KKyAgICApOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0RlZmF1bHROYW1lLmNwcCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0RlZmF1bHROYW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTY4YzA2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vRGVmYXVsdE5hbWUuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8vIERlZmF1bHROYW1lLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiRGVmYXVsdE5hbWUuaCINCisNCitzdGF0aWMgVVN0cmluZyBHZXREZWZhdWx0TmFtZTMoY29uc3QgVVN0cmluZyAmZmlsZU5hbWUsDQorICAgIGNvbnN0IFVTdHJpbmcgJmV4dGVuc2lvbiwgY29uc3QgVVN0cmluZyAmYWRkU3ViRXh0ZW5zaW9uKQ0KK3sNCisgIGludCBleHRMZW5ndGggPSBleHRlbnNpb24uTGVuKCk7DQorICBpbnQgZmlsZU5hbWVMZW5ndGggPSBmaWxlTmFtZS5MZW4oKTsNCisgIGlmIChmaWxlTmFtZUxlbmd0aCA+IGV4dExlbmd0aCArIDEpDQorICB7DQorICAgIGludCBkb3RQb3MgPSBmaWxlTmFtZUxlbmd0aCAtIChleHRMZW5ndGggKyAxKTsNCisgICAgaWYgKGZpbGVOYW1lW2RvdFBvc10gPT0gJy4nKQ0KKyAgICAgIGlmIChleHRlbnNpb24uSXNFcXVhbFRvTm9DYXNlKGZpbGVOYW1lLlB0cihkb3RQb3MgKyAxKSkpDQorICAgICAgICByZXR1cm4gZmlsZU5hbWUuTGVmdChkb3RQb3MpICsgYWRkU3ViRXh0ZW5zaW9uOw0KKyAgfQ0KKyAgaW50IGRvdFBvcyA9IGZpbGVOYW1lLlJldmVyc2VGaW5kKEwnLicpOw0KKyAgaWYgKGRvdFBvcyA+IDApDQorICAgIHJldHVybiBmaWxlTmFtZS5MZWZ0KGRvdFBvcykgKyBhZGRTdWJFeHRlbnNpb247DQorDQorICBpZiAoYWRkU3ViRXh0ZW5zaW9uLklzRW1wdHkoKSkNCisgICAgcmV0dXJuIGZpbGVOYW1lICsgTCJ+IjsNCisgIGVsc2UNCisgICAgcmV0dXJuIGZpbGVOYW1lICsgYWRkU3ViRXh0ZW5zaW9uOw0KK30NCisNCitVU3RyaW5nIEdldERlZmF1bHROYW1lMihjb25zdCBVU3RyaW5nICZmaWxlTmFtZSwNCisgICAgY29uc3QgVVN0cmluZyAmZXh0ZW5zaW9uLCBjb25zdCBVU3RyaW5nICZhZGRTdWJFeHRlbnNpb24pDQorew0KKyAgVVN0cmluZyBuYW1lID0gR2V0RGVmYXVsdE5hbWUzKGZpbGVOYW1lLCBleHRlbnNpb24sIGFkZFN1YkV4dGVuc2lvbik7DQorICBuYW1lLlRyaW1SaWdodCgpOw0KKyAgcmV0dXJuIG5hbWU7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0RlZmF1bHROYW1lLmggYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9EZWZhdWx0TmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODRjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9EZWZhdWx0TmFtZS5oCkBAIC0wLDAgKzEsMTEgQEAKKy8vIERlZmF1bHROYW1lLmgNCisNCisjaWZuZGVmIF9fREVGQVVMVF9OQU1FX0gNCisjZGVmaW5lIF9fREVGQVVMVF9OQU1FX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015U3RyaW5nLmgiDQorDQorVVN0cmluZyBHZXREZWZhdWx0TmFtZTIoY29uc3QgVVN0cmluZyAmZmlsZU5hbWUsDQorICAgIGNvbnN0IFVTdHJpbmcgJmV4dGVuc2lvbiwgY29uc3QgVVN0cmluZyAmYWRkU3ViRXh0ZW5zaW9uKTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9EaXJJdGVtLmggYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9EaXJJdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0MjlhYgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0Rpckl0ZW0uaApAQCAtMCwwICsxLDEyNiBAQAorLy8gRGlySXRlbS5oDQorDQorI2lmbmRlZiBfX0RJUl9JVEVNX0gNCisjZGVmaW5lIF9fRElSX0lURU1fSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlTdHJpbmcuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlRmluZC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vVW5pcUJsb2Nrcy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9BcmNoaXZlL0lBcmNoaXZlLmgiDQorDQorc3RydWN0IENEaXJJdGVtDQorew0KKyAgVUludDY0IFNpemU7DQorICBGSUxFVElNRSBDVGltZTsNCisgIEZJTEVUSU1FIEFUaW1lOw0KKyAgRklMRVRJTUUgTVRpbWU7DQorICBVU3RyaW5nIE5hbWU7DQorICANCisgICNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoVU5ERVJfQ0UpDQorICAvLyBVU3RyaW5nIFNob3J0TmFtZTsNCisgIENCeXRlQnVmZmVyIFJlcGFyc2VEYXRhOw0KKyAgQ0J5dGVCdWZmZXIgUmVwYXJzZURhdGEyOyAvLyBmaXhlZCAocmVkdWNlZCkgYWJzb2x1dGUgbGlua3MNCisNCisgIGJvb2wgQXJlUmVwYXJzZURhdGEoKSBjb25zdCB7IHJldHVybiBSZXBhcnNlRGF0YS5TaXplKCkgIT0gMCB8fCBSZXBhcnNlRGF0YTIuU2l6ZSgpICE9IDA7IH0NCisgICNlbmRpZg0KKyAgDQorICBVSW50MzIgQXR0cmliOw0KKyAgaW50IFBoeVBhcmVudDsNCisgIGludCBMb2dQYXJlbnQ7DQorICBpbnQgU2VjdXJlSW5kZXg7DQorDQorICBib29sIElzQWx0U3RyZWFtOw0KKyAgDQorICBDRGlySXRlbSgpOiBQaHlQYXJlbnQoLTEpLCBMb2dQYXJlbnQoLTEpLCBTZWN1cmVJbmRleCgtMSksIElzQWx0U3RyZWFtKGZhbHNlKSB7fQ0KKyAgYm9vbCBJc0RpcigpIGNvbnN0IHsgcmV0dXJuIChBdHRyaWIgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpICE9IDAgOyB9DQorfTsNCisNCitjbGFzcyBDRGlySXRlbXMNCit7DQorICBVU3RyaW5nVmVjdG9yIFByZWZpeGVzOw0KKyAgQ0ludFZlY3RvciBQaHlQYXJlbnRzOw0KKyAgQ0ludFZlY3RvciBMb2dQYXJlbnRzOw0KKw0KKyAgVVN0cmluZyBHZXRQcmVmaXhlc1BhdGgoY29uc3QgQ0ludFZlY3RvciAmcGFyZW50cywgaW50IGluZGV4LCBjb25zdCBVU3RyaW5nICZuYW1lKSBjb25zdDsNCisNCisgIHZvaWQgRW51bWVyYXRlRGlyKGludCBwaHlQYXJlbnQsIGludCBsb2dQYXJlbnQsIGNvbnN0IEZTdHJpbmcgJnBoeVByZWZpeCk7DQorDQorcHVibGljOg0KKyAgQ09iamVjdFZlY3RvcjxDRGlySXRlbT4gSXRlbXM7DQorDQorICBib29sIFN5bUxpbmtzOw0KKw0KKyAgYm9vbCBTY2FuQWx0U3RyZWFtczsNCisgIEZTdHJpbmdWZWN0b3IgRXJyb3JQYXRoczsNCisgIENSZWNvcmRWZWN0b3I8RFdPUkQ+IEVycm9yQ29kZXM7DQorICBVSW50NjQgVG90YWxTaXplOw0KKw0KKw0KKyAgI2lmbmRlZiBVTkRFUl9DRQ0KKyAgdm9pZCBTZXRMaW5rSW5mbyhDRGlySXRlbSAmZGlySXRlbSwgY29uc3QgTldpbmRvd3M6Ok5GaWxlOjpORmluZDo6Q0ZpbGVJbmZvICZmaSwNCisgICAgICBjb25zdCBGU3RyaW5nICZwaHlQcmVmaXgpOw0KKyAgI2VuZGlmDQorDQorICB2b2lkIEFkZEVycm9yKGNvbnN0IEZTdHJpbmcgJnBhdGgsIERXT1JEIGVycm9yQ29kZSkNCisgIHsNCisgICAgRXJyb3JDb2Rlcy5BZGQoZXJyb3JDb2RlKTsNCisgICAgRXJyb3JQYXRocy5BZGQocGF0aCk7DQorICB9DQorDQorICB2b2lkIEFkZEVycm9yKGNvbnN0IEZTdHJpbmcgJnBhdGgpDQorICB7DQorICAgIEFkZEVycm9yKHBhdGgsIDo6R2V0TGFzdEVycm9yKCkpOw0KKyAgfQ0KKw0KKyAgI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkNCisNCisgIENVbmlxQmxvY2tzIFNlY3VyZUJsb2NrczsNCisgIENCeXRlQnVmZmVyIFRlbXBTZWN1cmVCdWY7DQorICBib29sIF9zYWNsRW5hYmxlZDsNCisgIGJvb2wgUmVhZFNlY3VyZTsNCisgIA0KKyAgdm9pZCBBZGRTZWN1cml0eUl0ZW0oY29uc3QgRlN0cmluZyAmcGF0aCwgaW50ICZzZWN1cmVJbmRleCk7DQorDQorICAjZW5kaWYNCisNCisgIENEaXJJdGVtcygpOw0KKw0KKyAgaW50IEdldE51bUZvbGRlcnMoKSBjb25zdCB7IHJldHVybiBQcmVmaXhlcy5TaXplKCk7IH0NCisgIFVTdHJpbmcgR2V0UGh5UGF0aCh1bnNpZ25lZCBpbmRleCkgY29uc3Q7DQorICBVU3RyaW5nIEdldExvZ1BhdGgodW5zaWduZWQgaW5kZXgpIGNvbnN0Ow0KKw0KKyAgdW5zaWduZWQgQWRkUHJlZml4KGludCBwaHlQYXJlbnQsIGludCBsb2dQYXJlbnQsIGNvbnN0IFVTdHJpbmcgJnByZWZpeCk7DQorICB2b2lkIERlbGV0ZUxhc3RQcmVmaXgoKTsNCisgIHZvaWQgRW51bWVyYXRlSXRlbXMyKA0KKyAgICBjb25zdCBGU3RyaW5nICZwaHlQcmVmaXgsDQorICAgIGNvbnN0IFVTdHJpbmcgJmxvZ1ByZWZpeCwNCisgICAgY29uc3QgRlN0cmluZ1ZlY3RvciAmZmlsZVBhdGhzLA0KKyAgICBGU3RyaW5nVmVjdG9yICpyZXF1ZXN0ZWRQYXRocyk7DQorDQorICAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKyAgdm9pZCBGaWxsRml4ZWRSZXBhcnNlKCk7DQorICAjZW5kaWYNCisNCisgIHZvaWQgUmVzZXJ2ZURvd24oKTsNCit9Ow0KKw0KK3N0cnVjdCBDQXJjSXRlbQ0KK3sNCisgIFVJbnQ2NCBTaXplOw0KKyAgRklMRVRJTUUgTVRpbWU7DQorICBVU3RyaW5nIE5hbWU7DQorICBib29sIElzRGlyOw0KKyAgYm9vbCBJc0FsdFN0cmVhbTsNCisgIGJvb2wgU2l6ZURlZmluZWQ7DQorICBib29sIE1UaW1lRGVmaW5lZDsNCisgIGJvb2wgQ2Vuc29yZWQ7DQorICBVSW50MzIgSW5kZXhJblNlcnZlcjsNCisgIGludCBUaW1lVHlwZTsNCisgIA0KKyAgQ0FyY0l0ZW0oKTogSXNEaXIoZmFsc2UpLCBJc0FsdFN0cmVhbShmYWxzZSksIFNpemVEZWZpbmVkKGZhbHNlKSwgTVRpbWVEZWZpbmVkKGZhbHNlKSwgQ2Vuc29yZWQoZmFsc2UpLCBUaW1lVHlwZSgtMSkge30NCit9Ow0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0VudW1EaXJJdGVtcy5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9FbnVtRGlySXRlbXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OGE2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9FbnVtRGlySXRlbXMuY3BwCkBAIC0wLDAgKzEsNzU3IEBACisvLyBFbnVtRGlySXRlbXMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vV2lsZGNhcmQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlRGlyLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZUlPLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZU5hbWUuaCINCisNCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKyNkZWZpbmUgX1VTRV9TRUNVUklUWV9DT0RFDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvU2VjdXJpdHlVdGlscy5oIg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICJFbnVtRGlySXRlbXMuaCINCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQordXNpbmcgbmFtZXNwYWNlIE5GaWxlOw0KK3VzaW5nIG5hbWVzcGFjZSBOTmFtZTsNCisNCit2b2lkIEFkZERpckZpbGVJbmZvKGludCBwaHlQYXJlbnQsIGludCBsb2dQYXJlbnQsIGludCBzZWN1cmVJbmRleCwNCisgICAgY29uc3QgTkZpbmQ6OkNGaWxlSW5mbyAmZmksIENPYmplY3RWZWN0b3I8Q0Rpckl0ZW0+ICZkaXJJdGVtcykNCit7DQorICBDRGlySXRlbSBkaTsNCisgIGRpLlNpemUgPSBmaS5TaXplOw0KKyAgZGkuQ1RpbWUgPSBmaS5DVGltZTsNCisgIGRpLkFUaW1lID0gZmkuQVRpbWU7DQorICBkaS5NVGltZSA9IGZpLk1UaW1lOw0KKyAgZGkuQXR0cmliID0gZmkuQXR0cmliOw0KKyAgZGkuSXNBbHRTdHJlYW0gPSBmaS5Jc0FsdFN0cmVhbTsNCisgIGRpLlBoeVBhcmVudCA9IHBoeVBhcmVudDsNCisgIGRpLkxvZ1BhcmVudCA9IGxvZ1BhcmVudDsNCisgIGRpLlNlY3VyZUluZGV4ID0gc2VjdXJlSW5kZXg7DQorICBkaS5OYW1lID0gZnMydXMoZmkuTmFtZSk7DQorICAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKyAgLy8gZGkuU2hvcnROYW1lID0gZnMydXMoZmkuU2hvcnROYW1lKTsNCisgICNlbmRpZg0KKyAgZGlySXRlbXMuQWRkKGRpKTsNCit9DQorDQorVVN0cmluZyBDRGlySXRlbXM6OkdldFByZWZpeGVzUGF0aChjb25zdCBDSW50VmVjdG9yICZwYXJlbnRzLCBpbnQgaW5kZXgsIGNvbnN0IFVTdHJpbmcgJm5hbWUpIGNvbnN0DQorew0KKyAgVVN0cmluZyBwYXRoOw0KKyAgdW5zaWduZWQgbGVuID0gbmFtZS5MZW4oKTsNCisgIGludCBpOw0KKyAgZm9yIChpID0gaW5kZXg7IGkgPj0gMDsgaSA9IHBhcmVudHNbaV0pDQorICAgIGxlbiArPSBQcmVmaXhlc1tpXS5MZW4oKTsNCisgIHVuc2lnbmVkIHRvdGFsTGVuID0gbGVuOw0KKyAgd2NoYXJfdCAqcCA9IHBhdGguR2V0QnVmZmVyKGxlbik7DQorICBwW2xlbl0gPSAwOw0KKyAgbGVuIC09IG5hbWUuTGVuKCk7DQorICBtZW1jcHkocCArIGxlbiwgKGNvbnN0IHdjaGFyX3QgKiluYW1lLCBuYW1lLkxlbigpICogc2l6ZW9mKHdjaGFyX3QpKTsNCisgIGZvciAoaSA9IGluZGV4OyBpID49IDA7IGkgPSBwYXJlbnRzW2ldKQ0KKyAgew0KKyAgICBjb25zdCBVU3RyaW5nICZzID0gUHJlZml4ZXNbaV07DQorICAgIGxlbiAtPSBzLkxlbigpOw0KKyAgICBtZW1jcHkocCArIGxlbiwgKGNvbnN0IHdjaGFyX3QgKilzLCBzLkxlbigpICogc2l6ZW9mKHdjaGFyX3QpKTsNCisgIH0NCisgIHBhdGguUmVsZWFzZUJ1ZmZlcih0b3RhbExlbik7DQorICByZXR1cm4gcGF0aDsNCit9DQorDQorVVN0cmluZyBDRGlySXRlbXM6OkdldFBoeVBhdGgodW5zaWduZWQgaW5kZXgpIGNvbnN0DQorew0KKyAgY29uc3QgQ0Rpckl0ZW0gJmRpID0gSXRlbXNbaW5kZXhdOw0KKyAgcmV0dXJuIEdldFByZWZpeGVzUGF0aChQaHlQYXJlbnRzLCBkaS5QaHlQYXJlbnQsIGRpLk5hbWUpOw0KK30NCisNCitVU3RyaW5nIENEaXJJdGVtczo6R2V0TG9nUGF0aCh1bnNpZ25lZCBpbmRleCkgY29uc3QNCit7DQorICBjb25zdCBDRGlySXRlbSAmZGkgPSBJdGVtc1tpbmRleF07DQorICByZXR1cm4gR2V0UHJlZml4ZXNQYXRoKExvZ1BhcmVudHMsIGRpLkxvZ1BhcmVudCwgZGkuTmFtZSk7DQorfQ0KKw0KK3ZvaWQgQ0Rpckl0ZW1zOjpSZXNlcnZlRG93bigpDQorew0KKyAgUHJlZml4ZXMuUmVzZXJ2ZURvd24oKTsNCisgIFBoeVBhcmVudHMuUmVzZXJ2ZURvd24oKTsNCisgIExvZ1BhcmVudHMuUmVzZXJ2ZURvd24oKTsNCisgIEl0ZW1zLlJlc2VydmVEb3duKCk7DQorfQ0KKw0KK3Vuc2lnbmVkIENEaXJJdGVtczo6QWRkUHJlZml4KGludCBwaHlQYXJlbnQsIGludCBsb2dQYXJlbnQsIGNvbnN0IFVTdHJpbmcgJnByZWZpeCkNCit7DQorICBQaHlQYXJlbnRzLkFkZChwaHlQYXJlbnQpOw0KKyAgTG9nUGFyZW50cy5BZGQobG9nUGFyZW50KTsNCisgIHJldHVybiBQcmVmaXhlcy5BZGQocHJlZml4KTsNCit9DQorDQordm9pZCBDRGlySXRlbXM6OkRlbGV0ZUxhc3RQcmVmaXgoKQ0KK3sNCisgIFBoeVBhcmVudHMuRGVsZXRlQmFjaygpOw0KKyAgTG9nUGFyZW50cy5EZWxldGVCYWNrKCk7DQorICBQcmVmaXhlcy5EZWxldGVCYWNrKCk7DQorfQ0KKw0KK2Jvb2wgSW5pdExvY2FsUHJpdmlsZWdlcygpOw0KKw0KK0NEaXJJdGVtczo6Q0Rpckl0ZW1zKCk6DQorICAgIFN5bUxpbmtzKGZhbHNlKSwNCisgICAgVG90YWxTaXplKDApDQorICAgICNpZmRlZiBfVVNFX1NFQ1VSSVRZX0NPREUNCisgICAgLCBSZWFkU2VjdXJlKGZhbHNlKQ0KKyAgICAjZW5kaWYNCit7DQorICAjaWZkZWYgX1VTRV9TRUNVUklUWV9DT0RFDQorICBfc2FjbEVuYWJsZWQgPSBJbml0TG9jYWxQcml2aWxlZ2VzKCk7DQorICAjZW5kaWYNCit9DQorDQorI2lmZGVmIF9VU0VfU0VDVVJJVFlfQ09ERQ0KKw0KK3ZvaWQgQ0Rpckl0ZW1zOjpBZGRTZWN1cml0eUl0ZW0oY29uc3QgRlN0cmluZyAmcGF0aCwgaW50ICZzZWN1cmVJbmRleCkNCit7DQorICBzZWN1cmVJbmRleCA9IC0xOw0KKw0KKyAgU0VDVVJJVFlfSU5GT1JNQVRJT04gc2VjdXJJbmZvID0NCisgICAgICBEQUNMX1NFQ1VSSVRZX0lORk9STUFUSU9OIHwNCisgICAgICBHUk9VUF9TRUNVUklUWV9JTkZPUk1BVElPTiB8DQorICAgICAgT1dORVJfU0VDVVJJVFlfSU5GT1JNQVRJT047DQorICBpZiAoX3NhY2xFbmFibGVkKQ0KKyAgICBzZWN1ckluZm8gfD0gU0FDTF9TRUNVUklUWV9JTkZPUk1BVElPTjsNCisNCisgIERXT1JEIGVycm9yQ29kZSA9IDA7DQorICBEV09SRCBzZWN1cmVTaXplOw0KKyAgQk9PTCByZXMgPSA6OkdldEZpbGVTZWN1cml0eVcoZnMydXMocGF0aCksIHNlY3VySW5mbywgKFBTRUNVUklUWV9ERVNDUklQVE9SKShCeXRlICopVGVtcFNlY3VyZUJ1ZiwgKERXT1JEKVRlbXBTZWN1cmVCdWYuU2l6ZSgpLCAmc2VjdXJlU2l6ZSk7DQorICBpZiAocmVzKQ0KKyAgew0KKyAgICBpZiAoc2VjdXJlU2l6ZSA9PSAwKQ0KKyAgICAgIHJldHVybjsNCisgICAgaWYgKHNlY3VyZVNpemUgPiBUZW1wU2VjdXJlQnVmLlNpemUoKSkNCisgICAgICBlcnJvckNvZGUgPSBFUlJPUl9JTlZBTElEX0ZVTkNUSU9OOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBlcnJvckNvZGUgPSBHZXRMYXN0RXJyb3IoKTsNCisgICAgaWYgKGVycm9yQ29kZSA9PSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKQ0KKyAgICB7DQorICAgICAgaWYgKHNlY3VyZVNpemUgPD0gVGVtcFNlY3VyZUJ1Zi5TaXplKCkpDQorICAgICAgICBlcnJvckNvZGUgPSBFUlJPUl9JTlZBTElEX0ZVTkNUSU9OOw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBUZW1wU2VjdXJlQnVmLkFsbG9jKHNlY3VyZVNpemUpOw0KKyAgICAgICAgcmVzID0gOjpHZXRGaWxlU2VjdXJpdHlXKGZzMnVzKHBhdGgpLCBzZWN1ckluZm8sIChQU0VDVVJJVFlfREVTQ1JJUFRPUikoQnl0ZSAqKVRlbXBTZWN1cmVCdWYsIChEV09SRClUZW1wU2VjdXJlQnVmLlNpemUoKSwgJnNlY3VyZVNpemUpOw0KKyAgICAgICAgaWYgKHJlcykNCisgICAgICAgIHsNCisgICAgICAgICAgaWYgKHNlY3VyZVNpemUgIT0gVGVtcFNlY3VyZUJ1Zi5TaXplKCkpDQorICAgICAgICAgICAgZXJyb3JDb2RlID0gRVJST1JfSU5WQUxJRF9GVU5DVElPTjs7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICAgIGVycm9yQ29kZSA9IEdldExhc3RFcnJvcigpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHJlcykNCisgIHsNCisgICAgc2VjdXJlSW5kZXggPSBTZWN1cmVCbG9ja3MuQWRkVW5pcShUZW1wU2VjdXJlQnVmLCBzZWN1cmVTaXplKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGVycm9yQ29kZSA9PSAwKQ0KKyAgICBlcnJvckNvZGUgPSBFUlJPUl9JTlZBTElEX0ZVTkNUSU9OOw0KKyAgQWRkRXJyb3IocGF0aCwgZXJyb3JDb2RlKTsNCit9DQorDQorI2VuZGlmDQorDQordm9pZCBDRGlySXRlbXM6OkVudW1lcmF0ZURpcihpbnQgcGh5UGFyZW50LCBpbnQgbG9nUGFyZW50LCBjb25zdCBGU3RyaW5nICZwaHlQcmVmaXgpDQorew0KKyAgTkZpbmQ6OkNFbnVtZXJhdG9yIGVudW1lcmF0b3IocGh5UHJlZml4ICsgRkNIQVJfQU5ZX01BU0spOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgTkZpbmQ6OkNGaWxlSW5mbyBmaTsNCisgICAgYm9vbCBmb3VuZDsNCisgICAgaWYgKCFlbnVtZXJhdG9yLk5leHQoZmksIGZvdW5kKSkNCisgICAgew0KKyAgICAgIEFkZEVycm9yKHBoeVByZWZpeCk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmICghZm91bmQpDQorICAgICAgYnJlYWs7DQorDQorICAgIGludCBzZWN1cmVJbmRleCA9IC0xOw0KKyAgICAjaWZkZWYgX1VTRV9TRUNVUklUWV9DT0RFDQorICAgIGlmIChSZWFkU2VjdXJlKQ0KKyAgICAgIEFkZFNlY3VyaXR5SXRlbShwaHlQcmVmaXggKyBmaS5OYW1lLCBzZWN1cmVJbmRleCk7DQorICAgICNlbmRpZg0KKyAgICANCisgICAgQWRkRGlyRmlsZUluZm8ocGh5UGFyZW50LCBsb2dQYXJlbnQsIHNlY3VyZUluZGV4LCBmaSwgSXRlbXMpOw0KKyAgICANCisgICAgaWYgKGZpLklzRGlyKCkpDQorICAgIHsNCisgICAgICBjb25zdCBGU3RyaW5nIG5hbWUyID0gZmkuTmFtZSArIEZDSEFSX1BBVEhfU0VQQVJBVE9SOw0KKyAgICAgIHVuc2lnbmVkIHBhcmVudCA9IEFkZFByZWZpeChwaHlQYXJlbnQsIGxvZ1BhcmVudCwgZnMydXMobmFtZTIpKTsNCisgICAgICBFbnVtZXJhdGVEaXIocGFyZW50LCBwYXJlbnQsIHBoeVByZWZpeCArIG5hbWUyKTsNCisgICAgfQ0KKyAgfQ0KK30NCisNCit2b2lkIENEaXJJdGVtczo6RW51bWVyYXRlSXRlbXMyKA0KKyAgICBjb25zdCBGU3RyaW5nICZwaHlQcmVmaXgsDQorICAgIGNvbnN0IFVTdHJpbmcgJmxvZ1ByZWZpeCwNCisgICAgY29uc3QgRlN0cmluZ1ZlY3RvciAmZmlsZVBhdGhzLA0KKyAgICBGU3RyaW5nVmVjdG9yICpyZXF1ZXN0ZWRQYXRocykNCit7DQorICBpbnQgcGh5UGFyZW50ID0gcGh5UHJlZml4LklzRW1wdHkoKSA/IC0xIDogQWRkUHJlZml4KC0xLCAtMSwgZnMydXMocGh5UHJlZml4KSk7DQorICBpbnQgbG9nUGFyZW50ID0gbG9nUHJlZml4LklzRW1wdHkoKSA/IC0xIDogQWRkUHJlZml4KC0xLCAtMSwgbG9nUHJlZml4KTsNCisNCisgIEZPUl9WRUNUT1IgKGksIGZpbGVQYXRocykNCisgIHsNCisgICAgY29uc3QgRlN0cmluZyAmZmlsZVBhdGggPSBmaWxlUGF0aHNbaV07DQorICAgIE5GaW5kOjpDRmlsZUluZm8gZmk7DQorICAgIGNvbnN0IEZTdHJpbmcgcGh5UGF0aCA9IHBoeVByZWZpeCArIGZpbGVQYXRoOw0KKyAgICBpZiAoIWZpLkZpbmQocGh5UGF0aCkpDQorICAgIHsNCisgICAgICBBZGRFcnJvcihwaHlQYXRoKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAocmVxdWVzdGVkUGF0aHMpDQorICAgICAgcmVxdWVzdGVkUGF0aHMtPkFkZChwaHlQYXRoKTsNCisNCisgICAgaW50IGRlbGltaXRlciA9IGZpbGVQYXRoLlJldmVyc2VGaW5kKEZDSEFSX1BBVEhfU0VQQVJBVE9SKTsNCisgICAgRlN0cmluZyBwaHlQcmVmaXhDdXI7DQorICAgIGludCBwaHlQYXJlbnRDdXIgPSBwaHlQYXJlbnQ7DQorICAgIGlmIChkZWxpbWl0ZXIgPj0gMCkNCisgICAgew0KKyAgICAgIHBoeVByZWZpeEN1ci5TZXRGcm9tKGZpbGVQYXRoLCBkZWxpbWl0ZXIgKyAxKTsNCisgICAgICBwaHlQYXJlbnRDdXIgPSBBZGRQcmVmaXgocGh5UGFyZW50LCBsb2dQYXJlbnQsIGZzMnVzKHBoeVByZWZpeEN1cikpOw0KKyAgICB9DQorDQorICAgIGludCBzZWN1cmVJbmRleCA9IC0xOw0KKyAgICAjaWZkZWYgX1VTRV9TRUNVUklUWV9DT0RFDQorICAgIGlmIChSZWFkU2VjdXJlKQ0KKyAgICAgIEFkZFNlY3VyaXR5SXRlbShwaHlQYXRoLCBzZWN1cmVJbmRleCk7DQorICAgICNlbmRpZg0KKw0KKyAgICBBZGREaXJGaWxlSW5mbyhwaHlQYXJlbnRDdXIsIGxvZ1BhcmVudCwgc2VjdXJlSW5kZXgsIGZpLCBJdGVtcyk7DQorICAgIA0KKyAgICBpZiAoZmkuSXNEaXIoKSkNCisgICAgew0KKyAgICAgIGNvbnN0IEZTdHJpbmcgbmFtZTIgPSBmaS5OYW1lICsgRkNIQVJfUEFUSF9TRVBBUkFUT1I7DQorICAgICAgdW5zaWduZWQgcGFyZW50ID0gQWRkUHJlZml4KHBoeVBhcmVudEN1ciwgbG9nUGFyZW50LCBmczJ1cyhuYW1lMikpOw0KKyAgICAgIEVudW1lcmF0ZURpcihwYXJlbnQsIHBhcmVudCwgcGh5UHJlZml4ICsgcGh5UHJlZml4Q3VyICsgbmFtZTIpOw0KKyAgICB9DQorICB9DQorICBSZXNlcnZlRG93bigpOw0KK30NCisNCisNCisNCisNCisNCisNCitzdGF0aWMgSFJFU1VMVCBFbnVtZXJhdGVEaXJJdGVtcygNCisgICAgY29uc3QgTldpbGRjYXJkOjpDQ2Vuc29yTm9kZSAmY3VyTm9kZSwNCisgICAgaW50IHBoeVBhcmVudCwgaW50IGxvZ1BhcmVudCwgY29uc3QgRlN0cmluZyAmcGh5UHJlZml4LA0KKyAgICBjb25zdCBVU3RyaW5nVmVjdG9yICZhZGRBcmNoaXZlUHJlZml4LA0KKyAgICBDRGlySXRlbXMgJmRpckl0ZW1zLA0KKyAgICBib29sIGVudGVyVG9TdWJGb2xkZXJzLA0KKyAgICBJRW51bURpckl0ZW1DYWxsYmFjayAqY2FsbGJhY2spOw0KKw0KK3N0YXRpYyBIUkVTVUxUIEVudW1lcmF0ZURpckl0ZW1zX1NwZWMoDQorICAgIGNvbnN0IE5XaWxkY2FyZDo6Q0NlbnNvck5vZGUgJmN1ck5vZGUsDQorICAgIGludCBwaHlQYXJlbnQsIGludCBsb2dQYXJlbnQsIGNvbnN0IEZTdHJpbmcgJmN1ckZvbGRlck5hbWUsDQorICAgIGNvbnN0IEZTdHJpbmcgJnBoeVByZWZpeCwNCisgICAgY29uc3QgVVN0cmluZ1ZlY3RvciAmYWRkQXJjaGl2ZVByZWZpeCwNCisgICAgQ0Rpckl0ZW1zICZkaXJJdGVtcywNCisgICAgYm9vbCBlbnRlclRvU3ViRm9sZGVycywNCisgICAgSUVudW1EaXJJdGVtQ2FsbGJhY2sgKmNhbGxiYWNrKQ0KK3sNCisgIGNvbnN0IEZTdHJpbmcgbmFtZTIgPSBjdXJGb2xkZXJOYW1lICsgRkNIQVJfUEFUSF9TRVBBUkFUT1I7DQorICB1bnNpZ25lZCBwYXJlbnQgPSBkaXJJdGVtcy5BZGRQcmVmaXgocGh5UGFyZW50LCBsb2dQYXJlbnQsIGZzMnVzKG5hbWUyKSk7DQorICB1bnNpZ25lZCBudW1JdGVtcyA9IGRpckl0ZW1zLkl0ZW1zLlNpemUoKTsNCisgIEhSRVNVTFQgcmVzID0gRW51bWVyYXRlRGlySXRlbXMoDQorICAgICAgY3VyTm9kZSwgcGFyZW50LCBwYXJlbnQsIHBoeVByZWZpeCArIG5hbWUyLA0KKyAgICAgIGFkZEFyY2hpdmVQcmVmaXgsIGRpckl0ZW1zLCBlbnRlclRvU3ViRm9sZGVycywgY2FsbGJhY2spOw0KKyAgaWYgKG51bUl0ZW1zID09IGRpckl0ZW1zLkl0ZW1zLlNpemUoKSkNCisgICAgZGlySXRlbXMuRGVsZXRlTGFzdFByZWZpeCgpOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorI2lmbmRlZiBVTkRFUl9DRQ0KKw0KK3N0YXRpYyB2b2lkIEVudW1lcmF0ZUFsdFN0cmVhbXMoDQorICAgIGNvbnN0IE5GaW5kOjpDRmlsZUluZm8gJmZpLA0KKyAgICBjb25zdCBOV2lsZGNhcmQ6OkNDZW5zb3JOb2RlICZjdXJOb2RlLA0KKyAgICBpbnQgcGh5UGFyZW50LCBpbnQgbG9nUGFyZW50LCBjb25zdCBGU3RyaW5nICZwaHlQcmVmaXgsDQorICAgIGNvbnN0IFVTdHJpbmdWZWN0b3IgJmFkZEFyY2hpdmVQcmVmaXgsICAvLyBwcmVmaXggZnJvbSBjdXJOb2RlDQorICAgIENEaXJJdGVtcyAmZGlySXRlbXMpDQorew0KKyAgY29uc3QgRlN0cmluZyBmdWxsUGF0aCA9IHBoeVByZWZpeCArIGZpLk5hbWU7DQorICBORmluZDo6Q1N0cmVhbUVudW1lcmF0b3IgZW51bWVyYXRvcihmdWxsUGF0aCk7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBORmluZDo6Q1N0cmVhbUluZm8gc2k7DQorICAgIGJvb2wgZm91bmQ7DQorICAgIGlmICghZW51bWVyYXRvci5OZXh0KHNpLCBmb3VuZCkpDQorICAgIHsNCisgICAgICBkaXJJdGVtcy5BZGRFcnJvcihmdWxsUGF0aCArIEZURVhUKCI6KiIpLCAoRFdPUkQpRV9GQUlMKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoIWZvdW5kKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBpZiAoc2kuSXNNYWluU3RyZWFtKCkpDQorICAgICAgY29udGludWU7DQorICAgIFVTdHJpbmdWZWN0b3IgYWRkQXJjaGl2ZVByZWZpeE5ldyA9IGFkZEFyY2hpdmVQcmVmaXg7DQorICAgIFVTdHJpbmcgcmVkdWNlZE5hbWUgPSBzaS5HZXRSZWR1Y2VkTmFtZSgpOw0KKyAgICBhZGRBcmNoaXZlUHJlZml4TmV3LkJhY2soKSArPSByZWR1Y2VkTmFtZTsNCisgICAgaWYgKGN1ck5vZGUuQ2hlY2tQYXRoVG9Sb290KGZhbHNlLCBhZGRBcmNoaXZlUHJlZml4TmV3LCB0cnVlKSkNCisgICAgICBjb250aW51ZTsNCisgICAgTkZpbmQ6OkNGaWxlSW5mbyBmaTIgPSBmaTsNCisgICAgZmkyLk5hbWUgKz0gdXMyZnMocmVkdWNlZE5hbWUpOw0KKyAgICBmaTIuU2l6ZSA9IHNpLlNpemU7DQorICAgIGZpMi5BdHRyaWIgJj0gfkZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWTsNCisgICAgZmkyLklzQWx0U3RyZWFtID0gdHJ1ZTsNCisgICAgQWRkRGlyRmlsZUluZm8ocGh5UGFyZW50LCBsb2dQYXJlbnQsIC0xLCBmaTIsIGRpckl0ZW1zLkl0ZW1zKTsNCisgICAgZGlySXRlbXMuVG90YWxTaXplICs9IGZpMi5TaXplOw0KKyAgfQ0KK30NCisNCit2b2lkIENEaXJJdGVtczo6U2V0TGlua0luZm8oQ0Rpckl0ZW0gJmRpckl0ZW0sIGNvbnN0IE5GaW5kOjpDRmlsZUluZm8gJmZpLA0KKyAgICBjb25zdCBGU3RyaW5nICZwaHlQcmVmaXgpDQorew0KKyAgaWYgKCFTeW1MaW5rcyB8fCAhZmkuSGFzUmVwYXJzZVBvaW50KCkpDQorICAgIHJldHVybjsNCisgIGNvbnN0IEZTdHJpbmcgcGF0aCA9IHBoeVByZWZpeCArIGZpLk5hbWU7DQorICBDQnl0ZUJ1ZmZlciAmYnVmID0gZGlySXRlbS5SZXBhcnNlRGF0YTsNCisgIGlmIChOSU86OkdldFJlcGFyc2VEYXRhKHBhdGgsIGJ1ZikpDQorICB7DQorICAgIENSZXBhcnNlQXR0ciBhdHRyOw0KKyAgICBpZiAoYXR0ci5QYXJzZShidWYsIGJ1Zi5TaXplKCkpKQ0KKyAgICAgIHJldHVybjsNCisgIH0NCisgIEFkZEVycm9yKHBhdGgpOw0KKyAgYnVmLkZyZWUoKTsNCit9DQorDQorI2VuZGlmDQorDQorc3RhdGljIEhSRVNVTFQgRW51bWVyYXRlRm9ySXRlbSgNCisgICAgTkZpbmQ6OkNGaWxlSW5mbyAmZmksDQorICAgIGNvbnN0IE5XaWxkY2FyZDo6Q0NlbnNvck5vZGUgJmN1ck5vZGUsDQorICAgIGludCBwaHlQYXJlbnQsIGludCBsb2dQYXJlbnQsIGNvbnN0IEZTdHJpbmcgJnBoeVByZWZpeCwNCisgICAgY29uc3QgVVN0cmluZ1ZlY3RvciAmYWRkQXJjaGl2ZVByZWZpeCwgIC8vIHByZWZpeCBmcm9tIGN1ck5vZGUNCisgICAgQ0Rpckl0ZW1zICZkaXJJdGVtcywNCisgICAgYm9vbCBlbnRlclRvU3ViRm9sZGVycywNCisgICAgSUVudW1EaXJJdGVtQ2FsbGJhY2sgKmNhbGxiYWNrKQ0KK3sNCisgIGNvbnN0IFVTdHJpbmcgbmFtZSA9IGZzMnVzKGZpLk5hbWUpOw0KKyAgYm9vbCBlbnRlclRvU3ViRm9sZGVyczIgPSBlbnRlclRvU3ViRm9sZGVyczsNCisgIFVTdHJpbmdWZWN0b3IgYWRkQXJjaGl2ZVByZWZpeE5ldyA9IGFkZEFyY2hpdmVQcmVmaXg7DQorICBhZGRBcmNoaXZlUHJlZml4TmV3LkFkZChuYW1lKTsNCisgIHsNCisgICAgVVN0cmluZ1ZlY3RvciBhZGRBcmNoaXZlUHJlZml4TmV3VGVtcChhZGRBcmNoaXZlUHJlZml4TmV3KTsNCisgICAgaWYgKGN1ck5vZGUuQ2hlY2tQYXRoVG9Sb290KGZhbHNlLCBhZGRBcmNoaXZlUHJlZml4TmV3VGVtcCwgIWZpLklzRGlyKCkpKQ0KKyAgICAgIHJldHVybiBTX09LOw0KKyAgfQ0KKyAgaW50IGRpckl0ZW1JbmRleCA9IC0xOw0KKyAgDQorICBpZiAoY3VyTm9kZS5DaGVja1BhdGhUb1Jvb3QodHJ1ZSwgYWRkQXJjaGl2ZVByZWZpeE5ldywgIWZpLklzRGlyKCkpKQ0KKyAgew0KKyAgICBpbnQgc2VjdXJlSW5kZXggPSAtMTsNCisgICAgI2lmZGVmIF9VU0VfU0VDVVJJVFlfQ09ERQ0KKyAgICBpZiAoZGlySXRlbXMuUmVhZFNlY3VyZSkNCisgICAgICBkaXJJdGVtcy5BZGRTZWN1cml0eUl0ZW0ocGh5UHJlZml4ICsgZmkuTmFtZSwgc2VjdXJlSW5kZXgpOw0KKyAgICAjZW5kaWYNCisgICAgDQorICAgIGRpckl0ZW1JbmRleCA9IGRpckl0ZW1zLkl0ZW1zLlNpemUoKTsNCisgICAgQWRkRGlyRmlsZUluZm8ocGh5UGFyZW50LCBsb2dQYXJlbnQsIHNlY3VyZUluZGV4LCBmaSwgZGlySXRlbXMuSXRlbXMpOw0KKyAgICBkaXJJdGVtcy5Ub3RhbFNpemUgKz0gZmkuU2l6ZTsNCisgICAgaWYgKGZpLklzRGlyKCkpDQorICAgICAgZW50ZXJUb1N1YkZvbGRlcnMyID0gdHJ1ZTsNCisgIH0NCisNCisgICNpZm5kZWYgVU5ERVJfQ0UNCisgIGlmIChkaXJJdGVtcy5TY2FuQWx0U3RyZWFtcykNCisgIHsNCisgICAgRW51bWVyYXRlQWx0U3RyZWFtcyhmaSwgY3VyTm9kZSwgcGh5UGFyZW50LCBsb2dQYXJlbnQsIHBoeVByZWZpeCwNCisgICAgICAgIGFkZEFyY2hpdmVQcmVmaXhOZXcsIGRpckl0ZW1zKTsNCisgIH0NCisNCisgIGlmIChkaXJJdGVtSW5kZXggPj0gMCkNCisgIHsNCisgICAgQ0Rpckl0ZW0gJmRpckl0ZW0gPSBkaXJJdGVtcy5JdGVtc1tkaXJJdGVtSW5kZXhdOw0KKyAgICBkaXJJdGVtcy5TZXRMaW5rSW5mbyhkaXJJdGVtLCBmaSwgcGh5UHJlZml4KTsNCisgICAgaWYgKGRpckl0ZW0uUmVwYXJzZURhdGEuU2l6ZSgpICE9IDApDQorICAgICAgcmV0dXJuIFNfT0s7DQorICB9DQorICAjZW5kaWYNCisgIA0KKyAgaWYgKCFmaS5Jc0RpcigpKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIA0KKyAgY29uc3QgTldpbGRjYXJkOjpDQ2Vuc29yTm9kZSAqbmV4dE5vZGUgPSAwOw0KKyAgaWYgKGFkZEFyY2hpdmVQcmVmaXguSXNFbXB0eSgpKQ0KKyAgew0KKyAgICBpbnQgaW5kZXggPSBjdXJOb2RlLkZpbmRTdWJOb2RlKG5hbWUpOw0KKyAgICBpZiAoaW5kZXggPj0gMCkNCisgICAgICBuZXh0Tm9kZSA9ICZjdXJOb2RlLlN1Yk5vZGVzW2luZGV4XTsNCisgIH0NCisgIGlmICghZW50ZXJUb1N1YkZvbGRlcnMyICYmIG5leHROb2RlID09IDApDQorICAgIHJldHVybiBTX09LOw0KKyAgDQorICBhZGRBcmNoaXZlUHJlZml4TmV3ID0gYWRkQXJjaGl2ZVByZWZpeDsNCisgIGlmIChuZXh0Tm9kZSA9PSAwKQ0KKyAgew0KKyAgICBuZXh0Tm9kZSA9ICZjdXJOb2RlOw0KKyAgICBhZGRBcmNoaXZlUHJlZml4TmV3LkFkZChuYW1lKTsNCisgIH0NCisgIA0KKyAgcmV0dXJuIEVudW1lcmF0ZURpckl0ZW1zX1NwZWMoDQorICAgICAgKm5leHROb2RlLCBwaHlQYXJlbnQsIGxvZ1BhcmVudCwgZmkuTmFtZSwgcGh5UHJlZml4LA0KKyAgICAgIGFkZEFyY2hpdmVQcmVmaXhOZXcsDQorICAgICAgZGlySXRlbXMsDQorICAgICAgZW50ZXJUb1N1YkZvbGRlcnMyLCBjYWxsYmFjayk7DQorfQ0KKw0KKw0KK3N0YXRpYyBib29sIENhblVzZUZzRGlyZWN0KGNvbnN0IE5XaWxkY2FyZDo6Q0NlbnNvck5vZGUgJmN1ck5vZGUpDQorew0KKyAgRk9SX1ZFQ1RPUiAoaSwgY3VyTm9kZS5JbmNsdWRlSXRlbXMpDQorICB7DQorICAgIGNvbnN0IE5XaWxkY2FyZDo6Q0l0ZW0gJml0ZW0gPSBjdXJOb2RlLkluY2x1ZGVJdGVtc1tpXTsNCisgICAgaWYgKGl0ZW0uUmVjdXJzaXZlIHx8IGl0ZW0uUGF0aFBhcnRzLlNpemUoKSAhPSAxKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgY29uc3QgVVN0cmluZyAmbmFtZSA9IGl0ZW0uUGF0aFBhcnRzLkZyb250KCk7DQorICAgIGlmIChuYW1lLklzRW1wdHkoKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIA0KKyAgICAvKiBXaW5kb3dzIGRvZXNuJ3Qgc3VwcG9ydCBmaWxlIG5hbWUgd2l0aCB3aWxkY2FyZC4NCisgICAgICAgYnV0IGlmIGFub3RoZXIgc3lzdGVtIHN1cHBvcnRzIGZpbGUgbmFtZSB3aXRoIHdpbGRjYXJkLA0KKyAgICAgICBhbmQgd2lsZGNhcmQgbW9kZSBpcyBkaXNhYmxlZCwgd2UgY2FuIGlnbm9yZSB3aWxkY2FyZCBpbiBuYW1lICovDQorICAgIC8qDQorICAgIGlmICghaXRlbS5XaWxkY2FyZFBhcnNpbmcpDQorICAgICAgY29udGludWU7DQorICAgICovDQorICAgIGlmIChEb2VzTmFtZUNvbnRhaW5XaWxkY2FyZChuYW1lKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorDQorc3RhdGljIEhSRVNVTFQgRW51bWVyYXRlRGlySXRlbXMoDQorICAgIGNvbnN0IE5XaWxkY2FyZDo6Q0NlbnNvck5vZGUgJmN1ck5vZGUsDQorICAgIGludCBwaHlQYXJlbnQsIGludCBsb2dQYXJlbnQsIGNvbnN0IEZTdHJpbmcgJnBoeVByZWZpeCwNCisgICAgY29uc3QgVVN0cmluZ1ZlY3RvciAmYWRkQXJjaGl2ZVByZWZpeCwgIC8vIHByZWZpeCBmcm9tIGN1ck5vZGUNCisgICAgQ0Rpckl0ZW1zICZkaXJJdGVtcywNCisgICAgYm9vbCBlbnRlclRvU3ViRm9sZGVycywNCisgICAgSUVudW1EaXJJdGVtQ2FsbGJhY2sgKmNhbGxiYWNrKQ0KK3sNCisgIGlmICghZW50ZXJUb1N1YkZvbGRlcnMpDQorICAgIGlmIChjdXJOb2RlLk5lZWRDaGVja1N1YkRpcnMoKSkNCisgICAgICBlbnRlclRvU3ViRm9sZGVycyA9IHRydWU7DQorICBpZiAoY2FsbGJhY2spDQorICAgIFJJTk9LKGNhbGxiYWNrLT5TY2FuUHJvZ3Jlc3MoZGlySXRlbXMuR2V0TnVtRm9sZGVycygpLCBkaXJJdGVtcy5JdGVtcy5TaXplKCksIGRpckl0ZW1zLlRvdGFsU2l6ZSwgZnMydXMocGh5UHJlZml4KSwgdHJ1ZSkpOw0KKw0KKyAgLy8gdHJ5IGRpcmVjdF9uYW1lcyBjYXNlIGF0IGZpcnN0DQorICBpZiAoYWRkQXJjaGl2ZVByZWZpeC5Jc0VtcHR5KCkgJiYgIWVudGVyVG9TdWJGb2xkZXJzKQ0KKyAgew0KKyAgICBpZiAoQ2FuVXNlRnNEaXJlY3QoY3VyTm9kZSkpDQorICAgIHsNCisgICAgICAvLyBhbGwgbmFtZXMgYXJlIGRpcmVjdCAobm8gd2lsZGNhcmRzKQ0KKyAgICAgIC8vIHNvIHdlIGRvbid0IG5lZWQgZmlsZV9zeXN0ZW0ncyBkaXIgZW51bWVyYXRvcg0KKyAgICAgIENSZWNvcmRWZWN0b3I8Ym9vbD4gbmVlZEVudGVyVmVjdG9yOw0KKyAgICAgIHVuc2lnbmVkIGk7DQorDQorICAgICAgZm9yIChpID0gMDsgaSA8IGN1ck5vZGUuSW5jbHVkZUl0ZW1zLlNpemUoKTsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgIGNvbnN0IE5XaWxkY2FyZDo6Q0l0ZW0gJml0ZW0gPSBjdXJOb2RlLkluY2x1ZGVJdGVtc1tpXTsNCisgICAgICAgIGNvbnN0IFVTdHJpbmcgJm5hbWUgPSBpdGVtLlBhdGhQYXJ0cy5Gcm9udCgpOw0KKyAgICAgICAgY29uc3QgRlN0cmluZyBmdWxsUGF0aCA9IHBoeVByZWZpeCArIHVzMmZzKG5hbWUpOw0KKyAgICAgICAgTkZpbmQ6OkNGaWxlSW5mbyBmaTsNCisgICAgICAgICNpZmRlZiBfV0lOMzINCisgICAgICAgIGlmIChwaHlQcmVmaXguSXNFbXB0eSgpICYmIGl0ZW0uSXNEcml2ZUl0ZW0oKSkNCisgICAgICAgIHsNCisgICAgICAgICAgZmkuU2V0QXNEaXIoKTsNCisgICAgICAgICAgZmkuTmFtZSA9IGZ1bGxQYXRoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgI2VuZGlmDQorICAgICAgICBpZiAoIWZpLkZpbmQoZnVsbFBhdGgpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBkaXJJdGVtcy5BZGRFcnJvcihmdWxsUGF0aCk7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYm9vbCBpc0RpciA9IGZpLklzRGlyKCk7DQorICAgICAgICBpZiAoaXNEaXIgJiYgIWl0ZW0uRm9yRGlyIHx8ICFpc0RpciAmJiAhaXRlbS5Gb3JGaWxlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBkaXJJdGVtcy5BZGRFcnJvcihmdWxsUGF0aCwgKERXT1JEKUVfRkFJTCk7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgew0KKyAgICAgICAgICBVU3RyaW5nVmVjdG9yIHBhdGhQYXJ0czsNCisgICAgICAgICAgcGF0aFBhcnRzLkFkZChmczJ1cyhmaS5OYW1lKSk7DQorICAgICAgICAgIGlmIChjdXJOb2RlLkNoZWNrUGF0aFRvUm9vdChmYWxzZSwgcGF0aFBhcnRzLCAhaXNEaXIpKQ0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpbnQgc2VjdXJlSW5kZXggPSAtMTsNCisgICAgICAgICNpZmRlZiBfVVNFX1NFQ1VSSVRZX0NPREUNCisgICAgICAgIGlmIChkaXJJdGVtcy5SZWFkU2VjdXJlKQ0KKyAgICAgICAgICBkaXJJdGVtcy5BZGRTZWN1cml0eUl0ZW0oZnVsbFBhdGgsIHNlY3VyZUluZGV4KTsNCisgICAgICAgICNlbmRpZg0KKw0KKyAgICAgICAgQWRkRGlyRmlsZUluZm8ocGh5UGFyZW50LCBsb2dQYXJlbnQsIHNlY3VyZUluZGV4LCBmaSwgZGlySXRlbXMuSXRlbXMpOw0KKw0KKyAgICAgICAgI2lmbmRlZiBVTkRFUl9DRQ0KKyAgICAgICAgew0KKyAgICAgICAgICBDRGlySXRlbSAmZGlySXRlbSA9IGRpckl0ZW1zLkl0ZW1zLkJhY2soKTsNCisgICAgICAgICAgZGlySXRlbXMuU2V0TGlua0luZm8oZGlySXRlbSwgZmksIHBoeVByZWZpeCk7DQorICAgICAgICAgIGlmIChkaXJJdGVtLlJlcGFyc2VEYXRhLlNpemUoKSAhPSAwKQ0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZGlmDQorDQorICAgICAgICBkaXJJdGVtcy5Ub3RhbFNpemUgKz0gZmkuU2l6ZTsNCisNCisgICAgICAgICNpZm5kZWYgVU5ERVJfQ0UNCisgICAgICAgIGlmIChkaXJJdGVtcy5TY2FuQWx0U3RyZWFtcykNCisgICAgICAgIHsNCisgICAgICAgICAgVVN0cmluZ1ZlY3RvciBwYXRoUGFydHM7DQorICAgICAgICAgIHBhdGhQYXJ0cy5BZGQoZnMydXMoZmkuTmFtZSkpOw0KKyAgICAgICAgICBFbnVtZXJhdGVBbHRTdHJlYW1zKGZpLCBjdXJOb2RlLCBwaHlQYXJlbnQsIGxvZ1BhcmVudCwgcGh5UHJlZml4LA0KKyAgICAgICAgICAgICAgcGF0aFBhcnRzLCBkaXJJdGVtcyk7DQorICAgICAgICB9DQorICAgICAgICAjZW5kaWYNCisNCisgICAgICAgIGlmICghaXNEaXIpDQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgDQorICAgICAgICBVU3RyaW5nVmVjdG9yIGFkZEFyY2hpdmVQcmVmaXhOZXc7DQorICAgICAgICBjb25zdCBOV2lsZGNhcmQ6OkNDZW5zb3JOb2RlICpuZXh0Tm9kZSA9IDA7DQorICAgICAgICBpbnQgaW5kZXggPSBjdXJOb2RlLkZpbmRTdWJOb2RlKG5hbWUpOw0KKyAgICAgICAgaWYgKGluZGV4ID49IDApDQorICAgICAgICB7DQorICAgICAgICAgIGZvciAoaW50IHQgPSBuZWVkRW50ZXJWZWN0b3IuU2l6ZSgpOyB0IDw9IGluZGV4OyB0KyspDQorICAgICAgICAgICAgbmVlZEVudGVyVmVjdG9yLkFkZCh0cnVlKTsNCisgICAgICAgICAgbmVlZEVudGVyVmVjdG9yW2luZGV4XSA9IGZhbHNlOw0KKyAgICAgICAgICBuZXh0Tm9kZSA9ICZjdXJOb2RlLlN1Yk5vZGVzW2luZGV4XTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgbmV4dE5vZGUgPSAmY3VyTm9kZTsNCisgICAgICAgICAgYWRkQXJjaGl2ZVByZWZpeE5ldy5BZGQobmFtZSk7IC8vIGRvbid0IGNoYW5nZSBpdCB0byBmaS5OYW1lLiBJdCdzIGZvciBzaG9ydG5hbWVzIHN1cHBvcnQNCisgICAgICAgIH0NCisNCisgICAgICAgIFJJTk9LKEVudW1lcmF0ZURpckl0ZW1zX1NwZWMoKm5leHROb2RlLCBwaHlQYXJlbnQsIGxvZ1BhcmVudCwgZmkuTmFtZSwgcGh5UHJlZml4LA0KKyAgICAgICAgICAgIGFkZEFyY2hpdmVQcmVmaXhOZXcsIGRpckl0ZW1zLCB0cnVlLCBjYWxsYmFjaykpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBmb3IgKGkgPSAwOyBpIDwgY3VyTm9kZS5TdWJOb2Rlcy5TaXplKCk7IGkrKykNCisgICAgICB7DQorICAgICAgICBpZiAoaSA8IG5lZWRFbnRlclZlY3Rvci5TaXplKCkpDQorICAgICAgICAgIGlmICghbmVlZEVudGVyVmVjdG9yW2ldKQ0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgY29uc3QgTldpbGRjYXJkOjpDQ2Vuc29yTm9kZSAmbmV4dE5vZGUgPSBjdXJOb2RlLlN1Yk5vZGVzW2ldOw0KKyAgICAgICAgY29uc3QgRlN0cmluZyBmdWxsUGF0aCA9IHBoeVByZWZpeCArIHVzMmZzKG5leHROb2RlLk5hbWUpOw0KKyAgICAgICAgTkZpbmQ6OkNGaWxlSW5mbyBmaTsNCisgICAgICAgICNpZmRlZiBfV0lOMzINCisgICAgICAgIGlmIChwaHlQcmVmaXguSXNFbXB0eSgpICYmIE5XaWxkY2FyZDo6SXNEcml2ZUNvbG9uTmFtZShuZXh0Tm9kZS5OYW1lKSkNCisgICAgICAgIHsNCisgICAgICAgICAgZmkuU2V0QXNEaXIoKTsNCisgICAgICAgICAgZmkuTmFtZSA9IGZ1bGxQYXRoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgI2VuZGlmDQorICAgICAgICBpZiAoIWZpLkZpbmQoZnVsbFBhdGgpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAoIW5leHROb2RlLkFyZVRoZXJlSW5jbHVkZUl0ZW1zKCkpDQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIGRpckl0ZW1zLkFkZEVycm9yKGZ1bGxQYXRoKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIWZpLklzRGlyKCkpDQorICAgICAgICB7DQorICAgICAgICAgIGRpckl0ZW1zLkFkZEVycm9yKGZ1bGxQYXRoLCAoRFdPUkQpRV9GQUlMKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorDQorICAgICAgICBSSU5PSyhFbnVtZXJhdGVEaXJJdGVtc19TcGVjKG5leHROb2RlLCBwaHlQYXJlbnQsIGxvZ1BhcmVudCwgZmkuTmFtZSwgcGh5UHJlZml4LA0KKyAgICAgICAgICAgIFVTdHJpbmdWZWN0b3IoKSwgZGlySXRlbXMsIGZhbHNlLCBjYWxsYmFjaykpOw0KKyAgICAgIH0NCisNCisgICAgICByZXR1cm4gU19PSzsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgI2lmZGVmIF9XSU4zMg0KKyAgI2lmbmRlZiBVTkRFUl9DRQ0KKw0KKyAgLy8gc2NhbiBkcml2ZXMsIGlmIHdpbGRjYXJkIGlzICIqOlwiDQorDQorICBpZiAocGh5UHJlZml4LklzRW1wdHkoKSAmJiBjdXJOb2RlLkluY2x1ZGVJdGVtcy5TaXplKCkgPiAwKQ0KKyAgew0KKyAgICB1bnNpZ25lZCBpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgY3VyTm9kZS5JbmNsdWRlSXRlbXMuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBjb25zdCBOV2lsZGNhcmQ6OkNJdGVtICZpdGVtID0gY3VyTm9kZS5JbmNsdWRlSXRlbXNbaV07DQorICAgICAgaWYgKGl0ZW0uUGF0aFBhcnRzLlNpemUoKSA8IDEpDQorICAgICAgICBicmVhazsNCisgICAgICBjb25zdCBVU3RyaW5nICZuYW1lID0gaXRlbS5QYXRoUGFydHMuRnJvbnQoKTsNCisgICAgICBpZiAobmFtZS5MZW4oKSAhPSAyIHx8IG5hbWVbMV0gIT0gJzonKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgaWYgKGl0ZW0uUGF0aFBhcnRzLlNpemUoKSA9PSAxKQ0KKyAgICAgICAgaWYgKGl0ZW0uRm9yRmlsZSB8fCAhaXRlbS5Gb3JEaXIpDQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIGlmIChOV2lsZGNhcmQ6OklzRHJpdmVDb2xvbk5hbWUobmFtZSkpDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBpZiAobmFtZVswXSAhPSAnKicgJiYgbmFtZVswXSAhPSAnPycpDQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoaSA9PSBjdXJOb2RlLkluY2x1ZGVJdGVtcy5TaXplKCkpDQorICAgIHsNCisgICAgICBGU3RyaW5nVmVjdG9yIGRyaXZlU3RyaW5nczsNCisgICAgICBORmluZDo6TXlHZXRMb2dpY2FsRHJpdmVTdHJpbmdzKGRyaXZlU3RyaW5ncyk7DQorICAgICAgZm9yIChpID0gMDsgaSA8IGRyaXZlU3RyaW5ncy5TaXplKCk7IGkrKykNCisgICAgICB7DQorICAgICAgICBGU3RyaW5nIGRyaXZlTmFtZSA9IGRyaXZlU3RyaW5nc1tpXTsNCisgICAgICAgIGlmIChkcml2ZU5hbWUuTGVuKCkgPCAzIHx8IGRyaXZlTmFtZS5CYWNrKCkgIT0gJ1xcJykNCisgICAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICAgIGRyaXZlTmFtZS5EZWxldGVCYWNrKCk7DQorICAgICAgICBORmluZDo6Q0ZpbGVJbmZvIGZpOw0KKyAgICAgICAgZmkuU2V0QXNEaXIoKTsNCisgICAgICAgIGZpLk5hbWUgPSBkcml2ZU5hbWU7DQorDQorICAgICAgICBSSU5PSyhFbnVtZXJhdGVGb3JJdGVtKGZpLCBjdXJOb2RlLCBwaHlQYXJlbnQsIGxvZ1BhcmVudCwgcGh5UHJlZml4LA0KKyAgICAgICAgICAgIGFkZEFyY2hpdmVQcmVmaXgsIGRpckl0ZW1zLCBlbnRlclRvU3ViRm9sZGVycywgY2FsbGJhY2spKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIFNfT0s7DQorICAgIH0NCisgIH0NCisgIA0KKyAgI2VuZGlmDQorICAjZW5kaWYNCisNCisgIE5GaW5kOjpDRW51bWVyYXRvciBlbnVtZXJhdG9yKHBoeVByZWZpeCArIEZDSEFSX0FOWV9NQVNLKTsNCisgIGZvciAodW5zaWduZWQgdHR0ID0gMDsgOyB0dHQrKykNCisgIHsNCisgICAgTkZpbmQ6OkNGaWxlSW5mbyBmaTsNCisgICAgYm9vbCBmb3VuZDsNCisgICAgaWYgKCFlbnVtZXJhdG9yLk5leHQoZmksIGZvdW5kKSkNCisgICAgew0KKyAgICAgIGRpckl0ZW1zLkFkZEVycm9yKHBoeVByZWZpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKCFmb3VuZCkNCisgICAgICBicmVhazsNCisNCisgICAgaWYgKGNhbGxiYWNrICYmICh0dHQgJiAweEZGKSA9PSAweEZGKQ0KKyAgICAgIFJJTk9LKGNhbGxiYWNrLT5TY2FuUHJvZ3Jlc3MoZGlySXRlbXMuR2V0TnVtRm9sZGVycygpLCBkaXJJdGVtcy5JdGVtcy5TaXplKCksIGRpckl0ZW1zLlRvdGFsU2l6ZSwgZnMydXMocGh5UHJlZml4KSwgdHJ1ZSkpOw0KKw0KKyAgICBSSU5PSyhFbnVtZXJhdGVGb3JJdGVtKGZpLCBjdXJOb2RlLCBwaHlQYXJlbnQsIGxvZ1BhcmVudCwgcGh5UHJlZml4LA0KKyAgICAgICAgICBhZGRBcmNoaXZlUHJlZml4LCBkaXJJdGVtcywgZW50ZXJUb1N1YkZvbGRlcnMsIGNhbGxiYWNrKSk7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBFbnVtZXJhdGVJdGVtcygNCisgICAgY29uc3QgTldpbGRjYXJkOjpDQ2Vuc29yICZjZW5zb3IsDQorICAgIGNvbnN0IE5XaWxkY2FyZDo6RUNlbnNvclBhdGhNb2RlIHBhdGhNb2RlLA0KKyAgICBjb25zdCBVU3RyaW5nICZhZGRQYXRoUHJlZml4LA0KKyAgICBDRGlySXRlbXMgJmRpckl0ZW1zLA0KKyAgICBJRW51bURpckl0ZW1DYWxsYmFjayAqY2FsbGJhY2spDQorew0KKyAgRk9SX1ZFQ1RPUiAoaSwgY2Vuc29yLlBhaXJzKQ0KKyAgew0KKyAgICBjb25zdCBOV2lsZGNhcmQ6OkNQYWlyICZwYWlyID0gY2Vuc29yLlBhaXJzW2ldOw0KKyAgICBpbnQgcGh5UGFyZW50ID0gcGFpci5QcmVmaXguSXNFbXB0eSgpID8gLTEgOiBkaXJJdGVtcy5BZGRQcmVmaXgoLTEsIC0xLCBwYWlyLlByZWZpeCk7DQorICAgIGludCBsb2dQYXJlbnQgPSAtMTsNCisgICAgDQorICAgIGlmIChwYXRoTW9kZSA9PSBOV2lsZGNhcmQ6OmtfQWJzUGF0aCkNCisgICAgICBsb2dQYXJlbnQgPSBwaHlQYXJlbnQ7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGlmICghYWRkUGF0aFByZWZpeC5Jc0VtcHR5KCkpDQorICAgICAgICBsb2dQYXJlbnQgPSBkaXJJdGVtcy5BZGRQcmVmaXgoLTEsIC0xLCBhZGRQYXRoUHJlZml4KTsNCisgICAgfQ0KKyAgICANCisgICAgUklOT0soRW51bWVyYXRlRGlySXRlbXMocGFpci5IZWFkLCBwaHlQYXJlbnQsIGxvZ1BhcmVudCwgdXMyZnMocGFpci5QcmVmaXgpLCBVU3RyaW5nVmVjdG9yKCksDQorICAgICAgICBkaXJJdGVtcywNCisgICAgICAgIGZhbHNlLCAvLyBlbnRlclRvU3ViRm9sZGVycw0KKyAgICAgICAgY2FsbGJhY2spKTsNCisgIH0NCisgIGRpckl0ZW1zLlJlc2VydmVEb3duKCk7DQorDQorICAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKyAgZGlySXRlbXMuRmlsbEZpeGVkUmVwYXJzZSgpOw0KKyAgI2VuZGlmDQorDQorICByZXR1cm4gU19PSzsNCit9DQorDQorI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkNCisNCit2b2lkIENEaXJJdGVtczo6RmlsbEZpeGVkUmVwYXJzZSgpDQorew0KKyAgLyogaW1hZ2V4L1dJTSByZWR1Y2VzIGFic29sdXRlIHBhdGhlcyBpbiBsaW5rcyAocmFwYXJzZSBkYXRhKSwNCisgICAgIGlmIHdlIGFyY2hpdmUgbm9uIHJvb3QgZm9sZGVyLiBXZSBkbyBzYW1lIHRoaW5nIGhlcmUgKi8NCisNCisgIGlmICghU3ltTGlua3MpDQorICAgIHJldHVybjsNCisgIA0KKyAgRk9SX1ZFQ1RPUihpLCBJdGVtcykNCisgIHsNCisgICAgQ0Rpckl0ZW0gJml0ZW0gPSBJdGVtc1tpXTsNCisgICAgaWYgKGl0ZW0uUmVwYXJzZURhdGEuU2l6ZSgpID09IDApDQorICAgICAgY29udGludWU7DQorICAgIA0KKyAgICBDUmVwYXJzZUF0dHIgYXR0cjsNCisgICAgaWYgKCFhdHRyLlBhcnNlKGl0ZW0uUmVwYXJzZURhdGEsIGl0ZW0uUmVwYXJzZURhdGEuU2l6ZSgpKSkNCisgICAgICBjb250aW51ZTsNCisgICAgaWYgKGF0dHIuSXNSZWxhdGl2ZSgpKQ0KKyAgICAgIGNvbnRpbnVlOw0KKw0KKyAgICBjb25zdCBVU3RyaW5nICZsaW5rID0gYXR0ci5HZXRQYXRoKCk7DQorICAgIGlmICghSXNEcml2ZVBhdGgobGluaykpDQorICAgICAgY29udGludWU7DQorICAgIC8vIG1heWJlIHdlIG5lZWQgdG8gc3VwcG9ydCBuZXR3b3JrcyBwYXRocyBhbHNvID8NCisNCisgICAgRlN0cmluZyBmdWxsUGF0aEY7DQorICAgIGlmICghTkRpcjo6TXlHZXRGdWxsUGF0aE5hbWUodXMyZnMoR2V0UGh5UGF0aChpKSksIGZ1bGxQYXRoRikpDQorICAgICAgY29udGludWU7DQorICAgIFVTdHJpbmcgZnVsbFBhdGggPSBmczJ1cyhmdWxsUGF0aEYpOw0KKyAgICBjb25zdCBVU3RyaW5nIGxvZ1BhdGggPSBHZXRMb2dQYXRoKGkpOw0KKyAgICBpZiAobG9nUGF0aC5MZW4oKSA+PSBmdWxsUGF0aC5MZW4oKSkNCisgICAgICBjb250aW51ZTsNCisgICAgaWYgKENvbXBhcmVGaWxlTmFtZXMobG9nUGF0aCwgZnVsbFBhdGguUmlnaHRQdHIobG9nUGF0aC5MZW4oKSkpICE9IDApDQorICAgICAgY29udGludWU7DQorICAgIA0KKyAgICBjb25zdCBVU3RyaW5nIHByZWZpeCA9IGZ1bGxQYXRoLkxlZnQoZnVsbFBhdGguTGVuKCkgLSBsb2dQYXRoLkxlbigpKTsNCisgICAgaWYgKHByZWZpeC5CYWNrKCkgIT0gV0NIQVJfUEFUSF9TRVBBUkFUT1IpDQorICAgICAgY29udGludWU7DQorDQorICAgIHVuc2lnbmVkIHJvb3RQcmVmaXhTaXplID0gR2V0Um9vdFByZWZpeFNpemUocHJlZml4KTsNCisgICAgaWYgKHJvb3RQcmVmaXhTaXplID09IDApDQorICAgICAgY29udGludWU7DQorICAgIGlmIChyb290UHJlZml4U2l6ZSA9PSBwcmVmaXguTGVuKCkpDQorICAgICAgY29udGludWU7IC8vIHNpbXBsZSBjYXNlOiBwYXRocyBhcmUgZnJvbSByb290DQorDQorICAgIGlmIChsaW5rLkxlbigpIDw9IHByZWZpeC5MZW4oKSkNCisgICAgICBjb250aW51ZTsNCisNCisgICAgaWYgKENvbXBhcmVGaWxlTmFtZXMobGluay5MZWZ0KHByZWZpeC5MZW4oKSksIHByZWZpeCkgIT0gMCkNCisgICAgICBjb250aW51ZTsNCisNCisgICAgVVN0cmluZyBuZXdMaW5rID0gcHJlZml4LkxlZnQocm9vdFByZWZpeFNpemUpOw0KKyAgICBuZXdMaW5rICs9IGxpbmsuUHRyKHByZWZpeC5MZW4oKSk7DQorDQorICAgIENCeXRlQnVmZmVyIGRhdGE7DQorICAgIGlmICghRmlsbExpbmtEYXRhKGRhdGEsIG5ld0xpbmssIGF0dHIuSXNTeW1MaW5rKCkpKQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICBpdGVtLlJlcGFyc2VEYXRhMiA9IGRhdGE7DQorICB9DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0VudW1EaXJJdGVtcy5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vRW51bURpckl0ZW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTczOTcxNgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0VudW1EaXJJdGVtcy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIEVudW1EaXJJdGVtcy5oDQorDQorI2lmbmRlZiBfX0VOVU1fRElSX0lURU1TX0gNCisjZGVmaW5lIF9fRU5VTV9ESVJfSVRFTVNfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vV2lsZGNhcmQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlRmluZC5oIg0KKw0KKyNpbmNsdWRlICJEaXJJdGVtLmgiDQorDQordm9pZCBBZGREaXJGaWxlSW5mbyhpbnQgcGh5UGFyZW50LCBpbnQgbG9nUGFyZW50LCBpbnQgc2VjdXJlSW5kZXgsDQorICAgIGNvbnN0IE5XaW5kb3dzOjpORmlsZTo6TkZpbmQ6OkNGaWxlSW5mbyAmZmksIENPYmplY3RWZWN0b3I8Q0Rpckl0ZW0+ICZkaXJJdGVtcyk7DQorDQorc3RydWN0IElFbnVtRGlySXRlbUNhbGxiYWNrDQorew0KKyAgdmlydHVhbCBIUkVTVUxUIFNjYW5Qcm9ncmVzcyhVSW50NjQgbnVtRm9sZGVycywgVUludDY0IG51bUZpbGVzLCBVSW50NjQgdG90YWxTaXplLCBjb25zdCB3Y2hhcl90ICpwYXRoLCBib29sIGlzRGlyKSA9IDA7DQorfTsNCisNCitIUkVTVUxUIEVudW1lcmF0ZUl0ZW1zKA0KKyAgICBjb25zdCBOV2lsZGNhcmQ6OkNDZW5zb3IgJmNlbnNvciwNCisgICAgTldpbGRjYXJkOjpFQ2Vuc29yUGF0aE1vZGUgcGF0aE1vZGUsDQorICAgIGNvbnN0IFVTdHJpbmcgJmFkZFBhdGhQcmVmaXgsDQorICAgIENEaXJJdGVtcyAmZGlySXRlbXMsDQorICAgIElFbnVtRGlySXRlbUNhbGxiYWNrICpjYWxsYmFjayk7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vRXhpdENvZGUuaCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0V4aXRDb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzZWM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0V4aXRDb2RlLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gRXhpdENvZGUuaA0KKw0KKyNpZm5kZWYgX19FWElUX0NPREVfSA0KKyNkZWZpbmUgX19FWElUX0NPREVfSA0KKw0KK25hbWVzcGFjZSBORXhpdENvZGUgew0KKw0KK2VudW0gRUVudW0gew0KKw0KKyAga1N1Y2Nlc3MgICAgICAgPSAwLCAgICAgLy8gU3VjY2Vzc2Z1bCBvcGVyYXRpb24NCisgIGtXYXJuaW5nICAgICAgID0gMSwgICAgIC8vIE5vbiBmYXRhbCBlcnJvcihzKSBvY2N1cnJlZA0KKyAga0ZhdGFsRXJyb3IgICAgPSAyLCAgICAgLy8gQSBmYXRhbCBlcnJvciBvY2N1cnJlZA0KKyAgLy8ga0NSQ0Vycm9yICAgICAgPSAzLCAgICAgLy8gQSBDUkMgZXJyb3Igb2NjdXJyZWQgd2hlbiB1bnBhY2tpbmcNCisgIC8vIGtMb2NrZWRBcmNoaXZlID0gNCwgICAgIC8vIEF0dGVtcHQgdG8gbW9kaWZ5IGFuIGFyY2hpdmUgcHJldmlvdXNseSBsb2NrZWQNCisgIC8vIGtXcml0ZUVycm9yICAgID0gNSwgICAgIC8vIFdyaXRlIHRvIGRpc2sgZXJyb3INCisgIC8vIGtPcGVuRXJyb3IgICAgID0gNiwgICAgIC8vIE9wZW4gZmlsZSBlcnJvcg0KKyAga1VzZXJFcnJvciAgICAgPSA3LCAgICAgLy8gQ29tbWFuZCBsaW5lIG9wdGlvbiBlcnJvcg0KKyAga01lbW9yeUVycm9yICAgPSA4LCAgICAgLy8gTm90IGVub3VnaCBtZW1vcnkgZm9yIG9wZXJhdGlvbg0KKyAgLy8ga0NyZWF0ZUZpbGVFcnJvciA9IDksICAgICAvLyBDcmVhdGUgZmlsZSBlcnJvcg0KKyAgDQorICBrVXNlckJyZWFrICAgICA9IDI1NSAgIC8vIFVzZXIgc3RvcHBlZCB0aGUgcHJvY2Vzcw0KKw0KK307DQorDQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0V4dHJhY3QuY3BwIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vRXh0cmFjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiZjJiMwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0V4dHJhY3QuY3BwCkBAIC0wLDAgKzEsNDc1IEBACisvLyBFeHRyYWN0LmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vQy9Tb3J0LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZURpci5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1Byb3BWYXJpYW50LmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvUHJvcFZhcmlhbnRDb252LmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9FeHRyYWN0aW5nRmlsZVBhdGguaCINCisNCisjaW5jbHVkZSAiRXh0cmFjdC5oIg0KKyNpbmNsdWRlICJTZXRQcm9wZXJ0aWVzLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KK3VzaW5nIG5hbWVzcGFjZSBORmlsZTsNCit1c2luZyBuYW1lc3BhY2UgTkRpcjsNCisNCitzdGF0aWMgSFJFU1VMVCBEZWNvbXByZXNzQXJjaGl2ZSgNCisgICAgQ0NvZGVjcyAqY29kZWNzLA0KKyAgICBjb25zdCBDQXJjaGl2ZUxpbmsgJmFyY0xpbmssDQorICAgIFVJbnQ2NCBwYWNrU2l6ZSwNCisgICAgY29uc3QgTldpbGRjYXJkOjpDQ2Vuc29yTm9kZSAmd2lsZGNhcmRDZW5zb3IsDQorICAgIGNvbnN0IENFeHRyYWN0T3B0aW9ucyAmb3B0aW9ucywNCisgICAgYm9vbCBjYWxjQ3JjLA0KKyAgICBJRXh0cmFjdENhbGxiYWNrVUkgKmNhbGxiYWNrLA0KKyAgICBDQXJjaGl2ZUV4dHJhY3RDYWxsYmFjayAqZWNzLA0KKyAgICBVU3RyaW5nICZlcnJvck1lc3NhZ2UsDQorICAgIFVJbnQ2NCAmc3RkSW5Qcm9jZXNzZWQpDQorew0KKyAgY29uc3QgQ0FyYyAmYXJjID0gYXJjTGluay5BcmNzLkJhY2soKTsNCisgIHN0ZEluUHJvY2Vzc2VkID0gMDsNCisgIElJbkFyY2hpdmUgKmFyY2hpdmUgPSBhcmMuQXJjaGl2ZTsNCisgIENSZWNvcmRWZWN0b3I8VUludDMyPiByZWFsSW5kaWNlczsNCisgIA0KKyAgVVN0cmluZ1ZlY3RvciByZW1vdmVQYXRoUGFydHM7DQorDQorICBGU3RyaW5nIG91dERpciA9IG9wdGlvbnMuT3V0cHV0RGlyOw0KKyAgVVN0cmluZyByZXBsYWNlTmFtZSA9IGFyYy5EZWZhdWx0TmFtZTsNCisgIA0KKyAgaWYgKGFyY0xpbmsuQXJjcy5TaXplKCkgPiAxKQ0KKyAgew0KKyAgICAvLyBNb3N0ICJwZSIgYXJjaGl2ZXMgaGF2ZSBzYW1lIG5hbWUgb2YgYXJjaGl2ZSBzdWJmaWxlICJbMF0iIG9yICIucnNyY18xIi4NCisgICAgLy8gU28gaXQgZXh0cmFjdHMgZGlmZmVyZW50IGFyY2hpdmVzIHRvIG9uZSBmb2xkZXIuDQorICAgIC8vIFdlIHdpbGwgdXNlIHRvcCBsZXZlbCBhcmNoaXZlIG5hbWUNCisgICAgY29uc3QgQ0FyYyAmYXJjMCA9IGFyY0xpbmsuQXJjc1swXTsNCisgICAgaWYgKFN0cmluZ3NBcmVFcXVhbE5vQ2FzZV9Bc2NpaShjb2RlY3MtPkZvcm1hdHNbYXJjMC5Gb3JtYXRJbmRleF0uTmFtZSwgInBlIikpDQorICAgICAgcmVwbGFjZU5hbWUgPSBhcmMwLkRlZmF1bHROYW1lOw0KKyAgfQ0KKw0KKyAgb3V0RGlyLlJlcGxhY2UoRlNUUklOR19BTllfTUFTSywgdXMyZnMoR2V0Q29ycmVjdEZzUGF0aChyZXBsYWNlTmFtZSkpKTsNCisNCisgIGJvb2wgZWxpbUlzUG9zc2libGUgPSBmYWxzZTsNCisgIFVTdHJpbmcgZWxpbVByZWZpeDsgLy8gb25seSBwdXJlIG5hbWUgd2l0aG91dCBkaXIgZGVsaW1pdGVyDQorICBGU3RyaW5nIG91dERpclJlZHVjZWQgPSBvdXREaXI7DQorICANCisgIGlmIChvcHRpb25zLkVsaW1EdXAuVmFsKQ0KKyAgew0KKyAgICBVU3RyaW5nIGRpclByZWZpeDsNCisgICAgU3BsaXRQYXRoVG9QYXJ0c19TbWFydChmczJ1cyhvdXREaXIpLCBkaXJQcmVmaXgsIGVsaW1QcmVmaXgpOw0KKyAgICBpZiAoIWVsaW1QcmVmaXguSXNFbXB0eSgpKQ0KKyAgICB7DQorICAgICAgaWYgKElzQ2hhckRpckxpbWl0ZXIoZWxpbVByZWZpeC5CYWNrKCkpKQ0KKyAgICAgICAgZWxpbVByZWZpeC5EZWxldGVCYWNrKCk7DQorICAgICAgaWYgKCFlbGltUHJlZml4LklzRW1wdHkoKSkNCisgICAgICB7DQorICAgICAgICBvdXREaXJSZWR1Y2VkID0gdXMyZnMoZGlyUHJlZml4KTsNCisgICAgICAgIGVsaW1Jc1Bvc3NpYmxlID0gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIGlmICghb3B0aW9ucy5TdGRJbk1vZGUpDQorICB7DQorICAgIFVJbnQzMiBudW1JdGVtczsNCisgICAgUklOT0soYXJjaGl2ZS0+R2V0TnVtYmVyT2ZJdGVtcygmbnVtSXRlbXMpKTsNCisgICAgDQorICAgIFVTdHJpbmcgZmlsZVBhdGg7DQorDQorICAgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykNCisgICAgew0KKyAgICAgIFJJTk9LKGFyYy5HZXRJdGVtUGF0aChpLCBmaWxlUGF0aCkpOw0KKw0KKyAgICAgIGlmIChlbGltSXNQb3NzaWJsZSAmJiBvcHRpb25zLkVsaW1EdXAuVmFsKQ0KKyAgICAgIHsNCisgICAgICAgIGlmICghSXNQYXRoMVByZWZpeGVkQnlQYXRoMihmaWxlUGF0aCwgZWxpbVByZWZpeCkpDQorICAgICAgICAgIGVsaW1Jc1Bvc3NpYmxlID0gZmFsc2U7DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIHdjaGFyX3QgYyA9IGZpbGVQYXRoW2VsaW1QcmVmaXguTGVuKCldOw0KKyAgICAgICAgICBpZiAoYyAhPSAwICYmICFJc0NoYXJEaXJMaW1pdGVyKGMpKQ0KKyAgICAgICAgICAgIGVsaW1Jc1Bvc3NpYmxlID0gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIGJvb2wgaXNGb2xkZXI7DQorICAgICAgUklOT0soQXJjaGl2ZV9Jc0l0ZW1fRm9sZGVyKGFyY2hpdmUsIGksIGlzRm9sZGVyKSk7DQorICAgICAgYm9vbCBpc0FsdFN0cmVhbTsNCisgICAgICBSSU5PSyhBcmNoaXZlX0lzSXRlbV9BbHRTdHJlYW0oYXJjaGl2ZSwgaSwgaXNBbHRTdHJlYW0pKTsNCisgICAgICBpZiAoIW9wdGlvbnMuTnRPcHRpb25zLkFsdFN0cmVhbXMuVmFsICYmIGlzQWx0U3RyZWFtKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgaWYgKCF3aWxkY2FyZENlbnNvci5DaGVja1BhdGgoaXNBbHRTdHJlYW0sIGZpbGVQYXRoLCAhaXNGb2xkZXIpKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgcmVhbEluZGljZXMuQWRkKGkpOw0KKyAgICB9DQorICAgIA0KKyAgICBpZiAocmVhbEluZGljZXMuU2l6ZSgpID09IDApDQorICAgIHsNCisgICAgICBjYWxsYmFjay0+VGhlcmVBcmVOb0ZpbGVzKCk7DQorICAgICAgcmV0dXJuIGNhbGxiYWNrLT5FeHRyYWN0UmVzdWx0KFNfT0spOw0KKyAgICB9DQorICB9DQorDQorICBpZiAoZWxpbUlzUG9zc2libGUpDQorICAgIG91dERpciA9IG91dERpclJlZHVjZWQ7DQorDQorICAjaWZkZWYgX1dJTjMyDQorICAvLyBHZXRDb3JyZWN0RnVsbEZzUGF0aCBkb2Vzbid0IGxpa2UgIi4uIi4NCisgIC8vIG91dERpci5UcmltUmlnaHQoKTsNCisgIC8vIG91dERpciA9IEdldENvcnJlY3RGdWxsRnNQYXRoKG91dERpcik7DQorICAjZW5kaWYNCisNCisgIGlmIChvdXREaXIuSXNFbXB0eSgpKQ0KKyAgICBvdXREaXIgPSBGU3RyaW5nKEZURVhUKCIuIikpICsgRlN0cmluZyhGU1RSSU5HX1BBVEhfU0VQQVJBVE9SKTsNCisgIGVsc2UNCisgICAgaWYgKCFDcmVhdGVDb21wbGV4RGlyKG91dERpcikpDQorICAgIHsNCisgICAgICBIUkVTVUxUIHJlcyA9IDo6R2V0TGFzdEVycm9yKCk7DQorICAgICAgaWYgKHJlcyA9PSBTX09LKQ0KKyAgICAgICAgcmVzID0gRV9GQUlMOw0KKyAgICAgIGVycm9yTWVzc2FnZSA9ICgoVVN0cmluZylMIkNhbiBub3QgY3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgIikgKyBmczJ1cyhvdXREaXIpOw0KKyAgICAgIHJldHVybiByZXM7DQorICAgIH0NCisNCisgIGVjcy0+SW5pdCgNCisgICAgICBvcHRpb25zLk50T3B0aW9ucywNCisgICAgICBvcHRpb25zLlN0ZEluTW9kZSA/ICZ3aWxkY2FyZENlbnNvciA6IE5VTEwsDQorICAgICAgJmFyYywNCisgICAgICBjYWxsYmFjaywNCisgICAgICBvcHRpb25zLlN0ZE91dE1vZGUsIG9wdGlvbnMuVGVzdE1vZGUsDQorICAgICAgb3V0RGlyLA0KKyAgICAgIHJlbW92ZVBhdGhQYXJ0cywNCisgICAgICBwYWNrU2l6ZSk7DQorDQorICANCisgICNpZmRlZiBTVVBQT1JUX0xJTktTDQorICANCisgIGlmICghb3B0aW9ucy5TdGRJbk1vZGUgJiYNCisgICAgICAhb3B0aW9ucy5UZXN0TW9kZSAmJg0KKyAgICAgIG9wdGlvbnMuTnRPcHRpb25zLkhhcmRMaW5rcy5WYWwpDQorICB7DQorICAgIFJJTk9LKGVjcy0+UHJlcGFyZUhhcmRMaW5rcygmcmVhbEluZGljZXMpKTsNCisgIH0NCisgICAgDQorICAjZW5kaWYNCisNCisgIA0KKyAgSFJFU1VMVCByZXN1bHQ7DQorICBJbnQzMiB0ZXN0TW9kZSA9IChvcHRpb25zLlRlc3RNb2RlICYmICFjYWxjQ3JjKSA/IDE6IDA7DQorICBpZiAob3B0aW9ucy5TdGRJbk1vZGUpDQorICB7DQorICAgIHJlc3VsdCA9IGFyY2hpdmUtPkV4dHJhY3QoTlVMTCwgKFVJbnQzMikoSW50MzIpLTEsIHRlc3RNb2RlLCBlY3MpOw0KKyAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgaWYgKGFyY2hpdmUtPkdldEFyY2hpdmVQcm9wZXJ0eShrcGlkUGh5U2l6ZSwgJnByb3ApID09IFNfT0spDQorICAgICAgQ29udmVydFByb3BWYXJpYW50VG9VSW50NjQocHJvcCwgc3RkSW5Qcm9jZXNzZWQpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgICByZXN1bHQgPSBhcmNoaXZlLT5FeHRyYWN0KCZyZWFsSW5kaWNlcy5Gcm9udCgpLCByZWFsSW5kaWNlcy5TaXplKCksIHRlc3RNb2RlLCBlY3MpOw0KKyAgaWYgKHJlc3VsdCA9PSBTX09LICYmICFvcHRpb25zLlN0ZEluTW9kZSkNCisgICAgcmVzdWx0ID0gZWNzLT5TZXREaXJzVGltZXMoKTsNCisgIHJldHVybiBjYWxsYmFjay0+RXh0cmFjdFJlc3VsdChyZXN1bHQpOw0KK30NCisNCisvKiB2OS4zMTogQlVHIHdhcyBmaXhlZDoNCisgICBTb3J0ZWQgbGlzdCBmb3IgZmlsZSBwYXRocyB3YXMgc29ydGVkIHdpdGggY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJlIGZ1bmN0aW9uLg0KKyAgIEJ1dCBGaW5kSW5Tb3J0ZWQgZnVuY3Rpb24gZGlkIGJpbmFyeSBzZWFyY2ggdmlhIGNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmUgZnVuY3Rpb24gKi8NCisNCitpbnQgRmluZF9GaWxlTmFtZV9JblNvcnRlZFZlY3Rvcihjb25zdCBVU3RyaW5nVmVjdG9yICZmaWxlTmFtZSwgY29uc3QgVVN0cmluZyAmbmFtZSkNCit7DQorICB1bnNpZ25lZCBsZWZ0ID0gMCwgcmlnaHQgPSBmaWxlTmFtZS5TaXplKCk7DQorICB3aGlsZSAobGVmdCAhPSByaWdodCkNCisgIHsNCisgICAgdW5zaWduZWQgbWlkID0gKGxlZnQgKyByaWdodCkgLyAyOw0KKyAgICBjb25zdCBVU3RyaW5nICZtaWRWYWx1ZSA9IGZpbGVOYW1lW21pZF07DQorICAgIGludCBjb21wYXJlID0gQ29tcGFyZUZpbGVOYW1lcyhuYW1lLCBtaWRWYWx1ZSk7DQorICAgIGlmIChjb21wYXJlID09IDApDQorICAgICAgcmV0dXJuIG1pZDsNCisgICAgaWYgKGNvbXBhcmUgPCAwKQ0KKyAgICAgIHJpZ2h0ID0gbWlkOw0KKyAgICBlbHNlDQorICAgICAgbGVmdCA9IG1pZCArIDE7DQorICB9DQorICByZXR1cm4gLTE7DQorfQ0KKw0KK0hSRVNVTFQgRXh0cmFjdCgNCisgICAgQ0NvZGVjcyAqY29kZWNzLA0KKyAgICBjb25zdCBDT2JqZWN0VmVjdG9yPENPcGVuVHlwZT4gJnR5cGVzLA0KKyAgICBjb25zdCBDSW50VmVjdG9yICZleGNsdWRlZEZvcm1hdHMsDQorICAgIFVTdHJpbmdWZWN0b3IgJmFyY1BhdGhzLCBVU3RyaW5nVmVjdG9yICZhcmNQYXRoc0Z1bGwsDQorICAgIGNvbnN0IE5XaWxkY2FyZDo6Q0NlbnNvck5vZGUgJndpbGRjYXJkQ2Vuc29yLA0KKyAgICBjb25zdCBDRXh0cmFjdE9wdGlvbnMgJm9wdGlvbnMsDQorICAgIElPcGVuQ2FsbGJhY2tVSSAqb3BlbkNhbGxiYWNrLA0KKyAgICBJRXh0cmFjdENhbGxiYWNrVUkgKmV4dHJhY3RDYWxsYmFjaywNCisgICAgI2lmbmRlZiBfU0ZYDQorICAgIElIYXNoQ2FsYyAqaGFzaCwNCisgICAgI2VuZGlmDQorICAgIFVTdHJpbmcgJmVycm9yTWVzc2FnZSwNCisgICAgQ0RlY29tcHJlc3NTdGF0ICZzdGF0KQ0KK3sNCisgIHN0YXQuQ2xlYXIoKTsNCisgIFVJbnQ2NCB0b3RhbFBhY2tTaXplID0gMDsNCisgIENSZWNvcmRWZWN0b3I8VUludDY0PiBhcmNTaXplczsNCisNCisgIHVuc2lnbmVkIG51bUFyY3MgPSBvcHRpb25zLlN0ZEluTW9kZSA/IDEgOiBhcmNQYXRocy5TaXplKCk7DQorDQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bUFyY3M7IGkrKykNCisgIHsNCisgICAgTkZpbmQ6OkNGaWxlSW5mbyBmaTsNCisgICAgZmkuU2l6ZSA9IDA7DQorICAgIGlmICghb3B0aW9ucy5TdGRJbk1vZGUpDQorICAgIHsNCisgICAgICBjb25zdCBGU3RyaW5nICZhcmNQYXRoID0gdXMyZnMoYXJjUGF0aHNbaV0pOw0KKyAgICAgIGlmICghZmkuRmluZChhcmNQYXRoKSkNCisgICAgICAgIHRocm93ICJ0aGVyZSBpcyBubyBzdWNoIGFyY2hpdmUiOw0KKyAgICAgIGlmIChmaS5Jc0RpcigpKQ0KKyAgICAgICAgdGhyb3cgImNhbid0IGRlY29tcHJlc3MgZm9sZGVyIjsNCisgICAgfQ0KKyAgICBhcmNTaXplcy5BZGQoZmkuU2l6ZSk7DQorICAgIHRvdGFsUGFja1NpemUgKz0gZmkuU2l6ZTsNCisgIH0NCisNCisgIENCb29sQXJyIHNraXBBcmNzKG51bUFyY3MpOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bUFyY3M7IGkrKykNCisgICAgc2tpcEFyY3NbaV0gPSBmYWxzZTsNCisNCisgIENBcmNoaXZlRXh0cmFjdENhbGxiYWNrICplY3MgPSBuZXcgQ0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2s7DQorICBDTXlDb21QdHI8SUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2s+IGVjKGVjcyk7DQorICBib29sIG11bHRpID0gKG51bUFyY3MgPiAxKTsNCisgIGVjcy0+SW5pdEZvck11bHRpKG11bHRpLCBvcHRpb25zLlBhdGhNb2RlLCBvcHRpb25zLk92ZXJ3cml0ZU1vZGUpOw0KKyAgI2lmbmRlZiBfU0ZYDQorICBlY3MtPlNldEhhc2hNZXRob2RzKGhhc2gpOw0KKyAgI2VuZGlmDQorDQorICBpZiAobXVsdGkpDQorICB7DQorICAgIFJJTk9LKGV4dHJhY3RDYWxsYmFjay0+U2V0VG90YWwodG90YWxQYWNrU2l6ZSkpOw0KKyAgfQ0KKw0KKyAgVUludDY0IHRvdGFsUGFja1Byb2Nlc3NlZCA9IDA7DQorICBib29sIHRoZXJlQXJlTm90T3BlbkFyY3MgPSBmYWxzZTsNCisgIA0KKyAgZm9yIChpID0gMDsgaSA8IG51bUFyY3M7IGkrKykNCisgIHsNCisgICAgaWYgKHNraXBBcmNzW2ldKQ0KKyAgICAgIGNvbnRpbnVlOw0KKw0KKyAgICBjb25zdCBVU3RyaW5nICZhcmNQYXRoID0gYXJjUGF0aHNbaV07DQorICAgIE5GaW5kOjpDRmlsZUluZm8gZmk7DQorICAgIGlmIChvcHRpb25zLlN0ZEluTW9kZSkNCisgICAgew0KKyAgICAgIGZpLlNpemUgPSAwOw0KKyAgICAgIGZpLkF0dHJpYiA9IDA7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgaWYgKCFmaS5GaW5kKHVzMmZzKGFyY1BhdGgpKSB8fCBmaS5Jc0RpcigpKQ0KKyAgICAgICAgdGhyb3cgInRoZXJlIGlzIG5vIHN1Y2ggYXJjaGl2ZSI7DQorICAgIH0NCisNCisgICAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICAgIG9wZW5DYWxsYmFjay0+T3Blbl9DbGVhclBhc3N3b3JkV2FzQXNrZWRGbGFnKCk7DQorICAgICNlbmRpZg0KKw0KKyAgICBSSU5PSyhleHRyYWN0Q2FsbGJhY2stPkJlZm9yZU9wZW4oYXJjUGF0aCkpOw0KKyAgICBDQXJjaGl2ZUxpbmsgYXJjTGluazsNCisNCisgICAgQ09iamVjdFZlY3RvcjxDT3BlblR5cGU+IHR5cGVzMiA9IHR5cGVzOw0KKyAgICAvKg0KKyAgICAjaWZuZGVmIF9TRlgNCisgICAgaWYgKHR5cGVzLklzRW1wdHkoKSkNCisgICAgew0KKyAgICAgIGludCBwb3MgPSBhcmNQYXRoLlJldmVyc2VGaW5kKEwnLicpOw0KKyAgICAgIGlmIChwb3MgPj0gMCkNCisgICAgICB7DQorICAgICAgICBVU3RyaW5nIHMgPSBhcmNQYXRoLlB0cihwb3MgKyAxKTsNCisgICAgICAgIGludCBpbmRleCA9IGNvZGVjcy0+RmluZEZvcm1hdEZvckV4dGVuc2lvbihzKTsNCisgICAgICAgIGlmIChpbmRleCA+PSAwICYmIHMgPT0gTCIwMDEiKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBzID0gYXJjUGF0aC5MZWZ0KHBvcyk7DQorICAgICAgICAgIHBvcyA9IHMuUmV2ZXJzZUZpbmQoTCcuJyk7DQorICAgICAgICAgIGlmIChwb3MgPj0gMCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGludCBpbmRleDIgPSBjb2RlY3MtPkZpbmRGb3JtYXRGb3JFeHRlbnNpb24ocy5QdHIocG9zICsgMSkpOw0KKyAgICAgICAgICAgIGlmIChpbmRleDIgPj0gMCkgLy8gJiYgcy5Db21wYXJlTm9DYXNlKEwicmFyIikgIT0gMA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIHR5cGVzMi5BZGQoaW5kZXgyKTsNCisgICAgICAgICAgICAgIHR5cGVzMi5BZGQoaW5kZXgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICAjZW5kaWYNCisgICAgKi8NCisNCisgICAgQ09wZW5PcHRpb25zIG9wOw0KKyAgICAjaWZuZGVmIF9TRlgNCisgICAgb3AucHJvcHMgPSAmb3B0aW9ucy5Qcm9wZXJ0aWVzOw0KKyAgICAjZW5kaWYNCisgICAgb3AuY29kZWNzID0gY29kZWNzOw0KKyAgICBvcC50eXBlcyA9ICZ0eXBlczI7DQorICAgIG9wLmV4Y2x1ZGVkRm9ybWF0cyA9ICZleGNsdWRlZEZvcm1hdHM7DQorICAgIG9wLnN0ZEluTW9kZSA9IG9wdGlvbnMuU3RkSW5Nb2RlOw0KKyAgICBvcC5zdHJlYW0gPSBOVUxMOw0KKyAgICBvcC5maWxlUGF0aCA9IGFyY1BhdGg7DQorICAgIEhSRVNVTFQgcmVzdWx0ID0gYXJjTGluay5PcGVuMihvcCwgb3BlbkNhbGxiYWNrKTsNCisNCisgICAgaWYgKHJlc3VsdCA9PSBFX0FCT1JUKQ0KKyAgICAgIHJldHVybiByZXN1bHQ7DQorDQorICAgIGJvb2wgY3J5cHRlZCA9IGZhbHNlOw0KKyAgICAjaWZuZGVmIF9OT19DUllQVE8NCisgICAgY3J5cHRlZCA9IG9wZW5DYWxsYmFjay0+T3Blbl9XYXNQYXNzd29yZEFza2VkKCk7DQorICAgICNlbmRpZg0KKw0KKyAgICBpZiAoYXJjTGluay5Ob25PcGVuX0Vycm9ySW5mby5FcnJvckZvcm1hdEluZGV4ID49IDApDQorICAgICAgcmVzdWx0ID0gU19GQUxTRTsNCisNCisgICAgLy8gYXJjTGluay5TZXRfRXJyb3JzVGV4dCgpOw0KKyAgICBSSU5PSyhleHRyYWN0Q2FsbGJhY2stPk9wZW5SZXN1bHQoYXJjUGF0aCwgcmVzdWx0LCBjcnlwdGVkKSk7DQorDQorDQorICAgIHsNCisgICAgICBGT1JfVkVDVE9SIChyLCBhcmNMaW5rLkFyY3MpDQorICAgICAgew0KKyAgICAgICAgY29uc3QgQ0FyYyAmYXJjID0gYXJjTGluay5BcmNzW3JdOw0KKyAgICAgICAgY29uc3QgQ0FyY0Vycm9ySW5mbyAmZXIgPSBhcmMuRXJyb3JJbmZvOw0KKyAgICAgICAgaWYgKGVyLklzVGhlcmVFcnJvck9yV2FybmluZygpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBSSU5PSyhleHRyYWN0Q2FsbGJhY2stPlNldEVycm9yKHIsIGFyYy5QYXRoLA0KKyAgICAgICAgICAgICAgZXIuR2V0RXJyb3JGbGFncygpLCBlci5FcnJvck1lc3NhZ2UsDQorICAgICAgICAgICAgICBlci5HZXRXYXJuaW5nRmxhZ3MoKSwgZXIuV2FybmluZ01lc3NhZ2UpKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisNCisgICAgaWYgKHJlc3VsdCAhPSBTX09LKQ0KKyAgICB7DQorICAgICAgdGhlcmVBcmVOb3RPcGVuQXJjcyA9IHRydWU7DQorICAgICAgaWYgKCFvcHRpb25zLlN0ZEluTW9kZSkNCisgICAgICB7DQorICAgICAgICBORmluZDo6Q0ZpbGVJbmZvIGZpOw0KKyAgICAgICAgaWYgKGZpLkZpbmQodXMyZnMoYXJjUGF0aCkpKQ0KKyAgICAgICAgICBpZiAoIWZpLklzRGlyKCkpDQorICAgICAgICAgICAgdG90YWxQYWNrUHJvY2Vzc2VkICs9IGZpLlNpemU7DQorICAgICAgfQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorDQorICAgIGlmICghb3B0aW9ucy5TdGRJbk1vZGUpDQorICAgIHsNCisgICAgICAvLyBudW1Wb2x1bWVzICs9IGFyY0xpbmsuVm9sdW1lUGF0aHMuU2l6ZSgpOw0KKyAgICAgIC8vIGFyY0xpbmsuVm9sdW1lc1NpemU7DQorDQorICAgICAgLy8gdG90YWxQYWNrU2l6ZSAtPSBEZWxldGVVc2VkRmlsZU5hbWVzRnJvbUxpc3QoYXJjTGluaywgaSArIDEsIGFyY1BhdGhzLCBhcmNQYXRoc0Z1bGwsICZhcmNTaXplcyk7DQorICAgICAgLy8gbnVtQXJjcyA9IGFyY1BhdGhzLlNpemUoKTsNCisgICAgICBpZiAoYXJjTGluay5Wb2x1bWVQYXRocy5TaXplKCkgIT0gMCkNCisgICAgICB7DQorICAgICAgICBJbnQ2NCBjb3JyZWN0aW9uU2l6ZSA9IGFyY0xpbmsuVm9sdW1lc1NpemU7DQorICAgICAgICBGT1JfVkVDVE9SICh2LCBhcmNMaW5rLlZvbHVtZVBhdGhzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpbnQgaW5kZXggPSBGaW5kX0ZpbGVOYW1lX0luU29ydGVkVmVjdG9yKGFyY1BhdGhzRnVsbCwgYXJjTGluay5Wb2x1bWVQYXRoc1t2XSk7DQorICAgICAgICAgIGlmIChpbmRleCA+PSAwKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClpbmRleCA+IGkpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgc2tpcEFyY3NbaW5kZXhdID0gdHJ1ZTsNCisgICAgICAgICAgICAgIGNvcnJlY3Rpb25TaXplIC09IGFyY1NpemVzW2luZGV4XTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChjb3JyZWN0aW9uU2l6ZSAhPSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBJbnQ2NCBuZXdQYWNrU2l6ZSA9IChJbnQ2NCl0b3RhbFBhY2tTaXplICsgY29ycmVjdGlvblNpemU7DQorICAgICAgICAgIGlmIChuZXdQYWNrU2l6ZSA8IDApDQorICAgICAgICAgICAgbmV3UGFja1NpemUgPSAwOw0KKyAgICAgICAgICB0b3RhbFBhY2tTaXplID0gbmV3UGFja1NpemU7DQorICAgICAgICAgIFJJTk9LKGV4dHJhY3RDYWxsYmFjay0+U2V0VG90YWwodG90YWxQYWNrU2l6ZSkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAjaWZuZGVmIF9OT19DUllQVE8NCisgICAgYm9vbCBwYXNzd29yZElzRGVmaW5lZDsNCisgICAgVVN0cmluZyBwYXNzd29yZDsNCisgICAgUklOT0sob3BlbkNhbGxiYWNrLT5PcGVuX0dldFBhc3N3b3JkSWZBbnkocGFzc3dvcmRJc0RlZmluZWQsIHBhc3N3b3JkKSk7DQorICAgIGlmIChwYXNzd29yZElzRGVmaW5lZCkNCisgICAgew0KKyAgICAgIFJJTk9LKGV4dHJhY3RDYWxsYmFjay0+U2V0UGFzc3dvcmQocGFzc3dvcmQpKTsNCisgICAgfQ0KKyAgICAjZW5kaWYNCisNCisgICAgRk9SX1ZFQ1RPUiAoaywgYXJjTGluay5BcmNzKQ0KKyAgICB7DQorICAgICAgY29uc3QgQ0FyYyAmYXJjID0gYXJjTGluay5BcmNzW2tdOw0KKyAgICAgIGNvbnN0IENBcmNFcnJvckluZm8gJmVyID0gYXJjLkVycm9ySW5mbzsNCisNCisgICAgICBpZiAoZXIuRXJyb3JGb3JtYXRJbmRleCA+PSAwKQ0KKyAgICAgIHsNCisgICAgICAgIFJJTk9LKGV4dHJhY3RDYWxsYmFjay0+T3BlblR5cGVXYXJuaW5nKGFyYy5QYXRoLA0KKyAgICAgICAgICAgIGNvZGVjcy0+R2V0Rm9ybWF0TmFtZVB0cihhcmMuRm9ybWF0SW5kZXgpLA0KKyAgICAgICAgICAgIGNvZGVjcy0+R2V0Rm9ybWF0TmFtZVB0cihlci5FcnJvckZvcm1hdEluZGV4KSkpDQorICAgICAgICAvKg0KKyAgICAgICAgVVN0cmluZyBzID0gTCJDYW4gbm90IG9wZW4gdGhlIGZpbGUgYXMgWyIgKyBjb2RlY3MtPkZvcm1hdHNbYXJjLkVycm9yRm9ybWF0SW5kZXhdLk5hbWUgKyBMIl0gYXJjaGl2ZVxuIjsNCisgICAgICAgIHMgKz0gTCJUaGUgZmlsZSBpcyBvcGVuIGFzIFsiICsgY29kZWNzLT5Gb3JtYXRzW2FyYy5Gb3JtYXRJbmRleF0uTmFtZSArIEwiXSBhcmNoaXZlIjsNCisgICAgICAgIFJJTk9LKGV4dHJhY3RDYWxsYmFjay0+TWVzc2FnZUVycm9yKHMpKTsNCisgICAgICAgICovDQorICAgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIGNvbnN0IFVTdHJpbmcgJnMgPSBlci5FcnJvck1lc3NhZ2U7DQorICAgICAgICBpZiAoIXMuSXNFbXB0eSgpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBSSU5PSyhleHRyYWN0Q2FsbGJhY2stPk1lc3NhZ2VFcnJvcihzKSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIENBcmMgJmFyYyA9IGFyY0xpbmsuQXJjcy5CYWNrKCk7DQorICAgIGFyYy5NVGltZURlZmluZWQgPSAoIW9wdGlvbnMuU3RkSW5Nb2RlICYmICFmaS5Jc0RldmljZSk7DQorICAgIGFyYy5NVGltZSA9IGZpLk1UaW1lOw0KKw0KKyAgICBVSW50NjQgcGFja1Byb2Nlc3NlZDsNCisgICAgYm9vbCBjYWxjQ3JjID0NCisgICAgICAgICNpZm5kZWYgX1NGWA0KKyAgICAgICAgICAoaGFzaCAhPSBOVUxMKTsNCisgICAgICAgICNlbHNlDQorICAgICAgICAgIGZhbHNlOw0KKyAgICAgICAgI2VuZGlmDQorDQorICAgIFJJTk9LKERlY29tcHJlc3NBcmNoaXZlKA0KKyAgICAgICAgY29kZWNzLA0KKyAgICAgICAgYXJjTGluaywNCisgICAgICAgIGZpLlNpemUgKyBhcmNMaW5rLlZvbHVtZXNTaXplLA0KKyAgICAgICAgd2lsZGNhcmRDZW5zb3IsDQorICAgICAgICBvcHRpb25zLA0KKyAgICAgICAgY2FsY0NyYywNCisgICAgICAgIGV4dHJhY3RDYWxsYmFjaywgZWNzLCBlcnJvck1lc3NhZ2UsIHBhY2tQcm9jZXNzZWQpKTsNCisgICAgaWYgKCFvcHRpb25zLlN0ZEluTW9kZSkNCisgICAgICBwYWNrUHJvY2Vzc2VkID0gZmkuU2l6ZSArIGFyY0xpbmsuVm9sdW1lc1NpemU7DQorICAgIHRvdGFsUGFja1Byb2Nlc3NlZCArPSBwYWNrUHJvY2Vzc2VkOw0KKyAgICBlY3MtPkxvY2FsUHJvZ3Jlc3NTcGVjLT5JblNpemUgKz0gcGFja1Byb2Nlc3NlZDsNCisgICAgZWNzLT5Mb2NhbFByb2dyZXNzU3BlYy0+T3V0U2l6ZSA9IGVjcy0+VW5wYWNrU2l6ZTsNCisgICAgaWYgKCFlcnJvck1lc3NhZ2UuSXNFbXB0eSgpKQ0KKyAgICAgIHJldHVybiBFX0ZBSUw7DQorICB9DQorDQorICBpZiAobXVsdGkgfHwgdGhlcmVBcmVOb3RPcGVuQXJjcykNCisgIHsNCisgICAgUklOT0soZXh0cmFjdENhbGxiYWNrLT5TZXRUb3RhbCh0b3RhbFBhY2tTaXplKSk7DQorICAgIFJJTk9LKGV4dHJhY3RDYWxsYmFjay0+U2V0Q29tcGxldGVkKCZ0b3RhbFBhY2tQcm9jZXNzZWQpKTsNCisgIH0NCisgIHN0YXQuTnVtRm9sZGVycyA9IGVjcy0+TnVtRm9sZGVyczsNCisgIHN0YXQuTnVtRmlsZXMgPSBlY3MtPk51bUZpbGVzOw0KKyAgc3RhdC5OdW1BbHRTdHJlYW1zID0gZWNzLT5OdW1BbHRTdHJlYW1zOw0KKyAgc3RhdC5VbnBhY2tTaXplID0gZWNzLT5VbnBhY2tTaXplOw0KKyAgc3RhdC5BbHRTdHJlYW1zX1VucGFja1NpemUgPSBlY3MtPkFsdFN0cmVhbXNfVW5wYWNrU2l6ZTsNCisgIHN0YXQuTnVtQXJjaGl2ZXMgPSBhcmNQYXRocy5TaXplKCk7DQorICBzdGF0LlBhY2tTaXplID0gZWNzLT5Mb2NhbFByb2dyZXNzU3BlYy0+SW5TaXplOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0V4dHJhY3QuaCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0V4dHJhY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDI1MTRkCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vRXh0cmFjdC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8vIEV4dHJhY3QuaA0KKw0KKyNpZm5kZWYgX19FWFRSQUNUX0gNCisjZGVmaW5lIF9fRVhUUkFDVF9IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZUZpbmQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQXJjaGl2ZS9JQXJjaGl2ZS5oIg0KKw0KKyNpbmNsdWRlICJBcmNoaXZlRXh0cmFjdENhbGxiYWNrLmgiDQorI2luY2x1ZGUgIkFyY2hpdmVPcGVuQ2FsbGJhY2suaCINCisjaW5jbHVkZSAiRXh0cmFjdE1vZGUuaCINCisjaW5jbHVkZSAiUHJvcGVydHkuaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0xvYWRDb2RlY3MuaCINCisNCitzdHJ1Y3QgQ0V4dHJhY3RPcHRpb25zQmFzZQ0KK3sNCisgIENCb29sUGFpciBFbGltRHVwOw0KKyAgDQorICBib29sIFBhdGhNb2RlX0ZvcmNlOw0KKyAgYm9vbCBPdmVyd3JpdGVNb2RlX0ZvcmNlOw0KKyAgTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6RUVudW0gUGF0aE1vZGU7DQorICBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OkVFbnVtIE92ZXJ3cml0ZU1vZGU7DQorICANCisgIEZTdHJpbmcgT3V0cHV0RGlyOw0KKyAgQ0V4dHJhY3ROdE9wdGlvbnMgTnRPcHRpb25zOw0KKw0KKyAgQ0V4dHJhY3RPcHRpb25zQmFzZSgpOg0KKyAgICAgIFBhdGhNb2RlX0ZvcmNlKGZhbHNlKSwNCisgICAgICBPdmVyd3JpdGVNb2RlX0ZvcmNlKGZhbHNlKSwNCisgICAgICBQYXRoTW9kZShORXh0cmFjdDo6TlBhdGhNb2RlOjprRnVsbFBhdGhzKSwNCisgICAgICBPdmVyd3JpdGVNb2RlKE5FeHRyYWN0OjpOT3ZlcndyaXRlTW9kZTo6a0FzaykNCisgICAgICB7fQ0KK307DQorDQorc3RydWN0IENFeHRyYWN0T3B0aW9uczogcHVibGljIENFeHRyYWN0T3B0aW9uc0Jhc2UNCit7DQorICBib29sIFN0ZEluTW9kZTsNCisgIGJvb2wgU3RkT3V0TW9kZTsNCisgIGJvb2wgWWVzVG9BbGw7DQorICBib29sIFRlc3RNb2RlOw0KKyAgDQorICAvLyBib29sIFNob3dEaWFsb2c7DQorICAvLyBib29sIFBhc3N3b3JkRW5hYmxlZDsNCisgIC8vIFVTdHJpbmcgUGFzc3dvcmQ7DQorICAjaWZuZGVmIF9TRlgNCisgIENPYmplY3RWZWN0b3I8Q1Byb3BlcnR5PiBQcm9wZXJ0aWVzOw0KKyAgI2VuZGlmDQorDQorICAjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorICBDQ29kZWNzICpDb2RlY3M7DQorICAjZW5kaWYNCisNCisgIENFeHRyYWN0T3B0aW9ucygpOg0KKyAgICAgIFRlc3RNb2RlKGZhbHNlKSwNCisgICAgICBTdGRJbk1vZGUoZmFsc2UpLA0KKyAgICAgIFN0ZE91dE1vZGUoZmFsc2UpLA0KKyAgICAgIFllc1RvQWxsKGZhbHNlKQ0KKyAgICAgIHt9DQorfTsNCisNCitzdHJ1Y3QgQ0RlY29tcHJlc3NTdGF0DQorew0KKyAgVUludDY0IE51bUFyY2hpdmVzOw0KKyAgVUludDY0IFVucGFja1NpemU7DQorICBVSW50NjQgQWx0U3RyZWFtc19VbnBhY2tTaXplOw0KKyAgVUludDY0IFBhY2tTaXplOw0KKyAgVUludDY0IE51bUZvbGRlcnM7DQorICBVSW50NjQgTnVtRmlsZXM7DQorICBVSW50NjQgTnVtQWx0U3RyZWFtczsNCisNCisgIHZvaWQgQ2xlYXIoKQ0KKyAgew0KKyAgICBOdW1BcmNoaXZlcyA9IFVucGFja1NpemUgPSBBbHRTdHJlYW1zX1VucGFja1NpemUgPSBQYWNrU2l6ZSA9IE51bUZvbGRlcnMgPSBOdW1GaWxlcyA9IE51bUFsdFN0cmVhbXMgPSAwOw0KKyAgfQ0KK307DQorDQorSFJFU1VMVCBFeHRyYWN0KA0KKyAgICBDQ29kZWNzICpjb2RlY3MsDQorICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q09wZW5UeXBlPiAmdHlwZXMsDQorICAgIGNvbnN0IENJbnRWZWN0b3IgJmV4Y2x1ZGVkRm9ybWF0cywNCisgICAgVVN0cmluZ1ZlY3RvciAmYXJjaGl2ZVBhdGhzLCBVU3RyaW5nVmVjdG9yICZhcmNoaXZlUGF0aHNGdWxsLA0KKyAgICBjb25zdCBOV2lsZGNhcmQ6OkNDZW5zb3JOb2RlICZ3aWxkY2FyZENlbnNvciwNCisgICAgY29uc3QgQ0V4dHJhY3RPcHRpb25zICZvcHRpb25zLA0KKyAgICBJT3BlbkNhbGxiYWNrVUkgKm9wZW5DYWxsYmFjaywNCisgICAgSUV4dHJhY3RDYWxsYmFja1VJICpleHRyYWN0Q2FsbGJhY2ssDQorICAgICNpZm5kZWYgX1NGWA0KKyAgICBJSGFzaENhbGMgKmhhc2gsDQorICAgICNlbmRpZg0KKyAgICBVU3RyaW5nICZlcnJvck1lc3NhZ2UsDQorICAgIENEZWNvbXByZXNzU3RhdCAmc3RhdCk7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vRXh0cmFjdE1vZGUuaCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0V4dHJhY3RNb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5YWFhZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0V4dHJhY3RNb2RlLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gRXh0cmFjdE1vZGUuaA0KKw0KKyNpZm5kZWYgX19FWFRSQUNUX01PREVfSA0KKyNkZWZpbmUgX19FWFRSQUNUX01PREVfSA0KKw0KK25hbWVzcGFjZSBORXh0cmFjdCB7DQorICANCituYW1lc3BhY2UgTlBhdGhNb2RlDQorew0KKyAgZW51bSBFRW51bQ0KKyAgew0KKyAgICBrRnVsbFBhdGhzLA0KKyAgICBrQ3VyUGF0aHMsDQorICAgIGtOb1BhdGhzLA0KKyAgICBrQWJzUGF0aHMNCisgIH07DQorfQ0KKw0KK25hbWVzcGFjZSBOT3ZlcndyaXRlTW9kZQ0KK3sNCisgIGVudW0gRUVudW0NCisgIHsNCisgICAga0FzaywNCisgICAga092ZXJ3cml0ZSwNCisgICAga1NraXAsDQorICAgIGtSZW5hbWUsDQorICAgIGtSZW5hbWVFeGlzdGluZw0KKyAgfTsNCit9DQorDQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0V4dHJhY3RpbmdGaWxlUGF0aC5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9FeHRyYWN0aW5nRmlsZVBhdGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OTQ3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9FeHRyYWN0aW5nRmlsZVBhdGguY3BwCkBAIC0wLDAgKzEsMTkwIEBACisvLyBFeHRyYWN0aW5nRmlsZVBhdGguY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vV2lsZGNhcmQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlTmFtZS5oIg0KKw0KKyNpbmNsdWRlICJFeHRyYWN0aW5nRmlsZVBhdGguaCINCisNCitzdGF0aWMgVVN0cmluZyBSZXBsYWNlSW5jb3JyZWN0Q2hhcnMoY29uc3QgVVN0cmluZyAmcywgYm9vbCByZXBhY2VDb2xvbikNCit7DQorICAjaWZkZWYgX1dJTjMyDQorICBVU3RyaW5nIHJlczsNCisgIGJvb2wgYmVmb3JlQ29sb24gPSB0cnVlOw0KKyAgew0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcy5MZW4oKTsgaSsrKQ0KKyAgICB7DQorICAgICAgd2NoYXJfdCBjID0gc1tpXTsNCisgICAgICBpZiAoYmVmb3JlQ29sb24pDQorICAgICAgICBpZiAoYyA9PSAnKicgfHwgYyA9PSAnPycgfHwgYyA8IDB4MjAgfHwgYyA9PSAnPCcgfHwgYyA9PSAnPicgfHwgYyA9PSAnfCcgfHwgYyA9PSAnIicpDQorICAgICAgICAgIGMgPSAnXyc7DQorICAgICAgaWYgKGMgPT0gJzonKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChyZXBhY2VDb2xvbikNCisgICAgICAgICAgYyA9ICdfJzsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgYmVmb3JlQ29sb24gPSBmYWxzZTsNCisgICAgICB9DQorICAgICAgcmVzICs9IGM7DQorICAgIH0NCisgIH0NCisgIGlmIChiZWZvcmVDb2xvbikNCisgIHsNCisgICAgZm9yIChpbnQgaSA9IHJlcy5MZW4oKSAtIDE7IGkgPj0gMDsgaS0tKQ0KKyAgICB7DQorICAgICAgd2NoYXJfdCBjID0gcmVzW2ldOw0KKyAgICAgIGlmIChjICE9ICcuJyAmJiBjICE9ICcgJykNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIHJlcy5SZXBsYWNlT25lQ2hhckF0UG9zKGksICdfJyk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiByZXM7DQorICAjZWxzZQ0KKyAgcmV0dXJuIHM7DQorICAjZW5kaWYNCit9DQorDQorI2lmZGVmIF9XSU4zMg0KKw0KK3N0YXRpYyBjb25zdCB3Y2hhcl90ICpnX1Jlc2VydmVkTmFtZXNbXSA9DQorew0KKyAgTCJDT04iLCBMIlBSTiIsIEwiQVVYIiwgTCJOVUwiDQorfTsNCisNCitzdGF0aWMgYm9vbCBDaGVja1RhaWwoY29uc3QgVVN0cmluZyAmbmFtZSwgdW5zaWduZWQgbGVuKQ0KK3sNCisgIGludCBkb3RQb3MgPSBuYW1lLkZpbmQoTCcuJyk7DQorICBpZiAoZG90UG9zIDwgMCkNCisgICAgZG90UG9zID0gbmFtZS5MZW4oKTsNCisgIFVTdHJpbmcgcyA9IG5hbWUuTGVmdChkb3RQb3MpOw0KKyAgcy5UcmltUmlnaHQoKTsNCisgIHJldHVybiBzLkxlbigpICE9IGxlbjsNCit9DQorDQorc3RhdGljIGJvb2wgQ2hlY2tOYW1lTnVtKGNvbnN0IFVTdHJpbmcgJm5hbWUsIGNvbnN0IHdjaGFyX3QgKnJlc2VydmVkTmFtZSkNCit7DQorICB1bnNpZ25lZCBsZW4gPSBNeVN0cmluZ0xlbihyZXNlcnZlZE5hbWUpOw0KKyAgaWYgKG5hbWUuTGVuKCkgPD0gbGVuKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIGlmIChNeVN0cmluZ0NvbXBhcmVOb0Nhc2VfTihuYW1lLCByZXNlcnZlZE5hbWUsIGxlbikgIT0gMCkNCisgICAgcmV0dXJuIHRydWU7DQorICB3Y2hhcl90IGMgPSBuYW1lW2xlbl07DQorICBpZiAoYyA8IEwnMCcgfHwgYyA+IEwnOScpDQorICAgIHJldHVybiB0cnVlOw0KKyAgcmV0dXJuIENoZWNrVGFpbChuYW1lLCBsZW4gKyAxKTsNCit9DQorDQorc3RhdGljIGJvb2wgSXNTdXBwb3J0ZWROYW1lKGNvbnN0IFVTdHJpbmcgJm5hbWUpDQorew0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ19SZXNlcnZlZE5hbWVzKTsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCB3Y2hhcl90ICpyZXNlcnZlZE5hbWUgPSBnX1Jlc2VydmVkTmFtZXNbaV07DQorICAgIHVuc2lnbmVkIGxlbiA9IE15U3RyaW5nTGVuKHJlc2VydmVkTmFtZSk7DQorICAgIGlmIChuYW1lLkxlbigpIDwgbGVuKQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICBpZiAoTXlTdHJpbmdDb21wYXJlTm9DYXNlX04obmFtZSwgcmVzZXJ2ZWROYW1lLCBsZW4pICE9IDApDQorICAgICAgY29udGludWU7DQorICAgIGlmICghQ2hlY2tUYWlsKG5hbWUsIGxlbikpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKyAgaWYgKCFDaGVja05hbWVOdW0obmFtZSwgTCJDT00iKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIENoZWNrTmFtZU51bShuYW1lLCBMIkxQVCIpOw0KK30NCisNCisjZW5kaWYNCisNCitzdGF0aWMgVVN0cmluZyBHZXRDb3JyZWN0RmlsZU5hbWUoY29uc3QgVVN0cmluZyAmcGF0aCwgYm9vbCByZXBhY2VDb2xvbikNCit7DQorICBpZiAocGF0aCA9PSBMIi4uIiB8fCBwYXRoID09IEwiLiIpDQorICAgIHJldHVybiBVU3RyaW5nKCk7DQorICByZXR1cm4gUmVwbGFjZUluY29ycmVjdENoYXJzKHBhdGgsIHJlcGFjZUNvbG9uKTsNCit9DQorDQordm9pZCBNYWtlQ29ycmVjdFBhdGgoYm9vbCBpc1BhdGhGcm9tUm9vdCwgVVN0cmluZ1ZlY3RvciAmcGF0aFBhcnRzLCBib29sIHJlcGxhY2VBbHRTdHJlYW1Db2xvbikNCit7DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcGF0aFBhcnRzLlNpemUoKTspDQorICB7DQorICAgIFVTdHJpbmcgJnMgPSBwYXRoUGFydHNbaV07DQorICAgICNpZmRlZiBfV0lOMzINCisgICAgYm9vbCBuZWVkUmVwbGFjZUNvbG9uID0gKHJlcGxhY2VBbHRTdHJlYW1Db2xvbiB8fCBpICE9IHBhdGhQYXJ0cy5TaXplKCkgLSAxKTsNCisgICAgaWYgKGkgPT0gMCAmJiBpc1BhdGhGcm9tUm9vdCAmJiBOV2luZG93czo6TkZpbGU6Ok5OYW1lOjpJc0RyaXZlUGF0aChzKSkNCisgICAgew0KKyAgICAgIFVTdHJpbmcgczIgPSBzWzBdOw0KKyAgICAgIHMyICs9IEwnXyc7DQorICAgICAgczIgKz0gR2V0Q29ycmVjdEZpbGVOYW1lKHMuUHRyKDIpLCBuZWVkUmVwbGFjZUNvbG9uKTsNCisgICAgICBzID0gczI7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAgIHMgPSBHZXRDb3JyZWN0RmlsZU5hbWUocywgbmVlZFJlcGxhY2VDb2xvbik7DQorICAgICNlbmRpZg0KKw0KKyAgICBpZiAocy5Jc0VtcHR5KCkpDQorICAgICAgcGF0aFBhcnRzLkRlbGV0ZShpKTsNCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgI2lmZGVmIF9XSU4zMg0KKyAgICAgIGlmICghSXNTdXBwb3J0ZWROYW1lKHMpKQ0KKyAgICAgICAgcyA9IChVU3RyaW5nKUwiXyIgKyBzOw0KKyAgICAgICNlbmRpZg0KKyAgICAgIGkrKzsNCisgICAgfQ0KKyAgfQ0KK30NCisNCitVU3RyaW5nIE1ha2VQYXRoTmFtZUZyb21QYXJ0cyhjb25zdCBVU3RyaW5nVmVjdG9yICZwYXJ0cykNCit7DQorICBVU3RyaW5nIHJlc3VsdDsNCisgIEZPUl9WRUNUT1IgKGksIHBhcnRzKQ0KKyAgew0KKyAgICBpZiAoaSAhPSAwKQ0KKyAgICAgIHJlc3VsdCArPSBXQ0hBUl9QQVRIX1NFUEFSQVRPUjsNCisgICAgcmVzdWx0ICs9IHBhcnRzW2ldOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQorDQorc3RhdGljIGNvbnN0IHdjaGFyX3QgKmtfRW1wdHlSZXBsYWNlTmFtZSA9IEwiW10iOw0KKw0KK3ZvaWQgQ29ycmVjdF9JZkVtcHR5TGFzdFBhcnQoVVN0cmluZ1ZlY3RvciAmcGFydHMpDQorew0KKyAgaWYgKHBhcnRzLklzRW1wdHkoKSkNCisgICAgcGFydHMuQWRkKGtfRW1wdHlSZXBsYWNlTmFtZSk7DQorICBlbHNlDQorICB7DQorICAgIFVTdHJpbmcgJnMgPSBwYXJ0cy5CYWNrKCk7DQorICAgIGlmIChzLklzRW1wdHkoKSkNCisgICAgICBzID0ga19FbXB0eVJlcGxhY2VOYW1lOw0KKyAgfQ0KK30NCisNCitVU3RyaW5nIEdldENvcnJlY3RGc1BhdGgoY29uc3QgVVN0cmluZyAmcGF0aCkNCit7DQorICBVU3RyaW5nIHJlcyA9IEdldENvcnJlY3RGaWxlTmFtZShwYXRoLCB0cnVlKTsNCisgICNpZmRlZiBfV0lOMzINCisgIGlmICghSXNTdXBwb3J0ZWROYW1lKHJlcykpDQorICAgIHJlcyA9IChVU3RyaW5nKUwiXyIgKyByZXM7DQorICAjZW5kaWYNCisgIGlmIChyZXMuSXNFbXB0eSgpKQ0KKyAgICByZXMgPSBrX0VtcHR5UmVwbGFjZU5hbWU7DQorICByZXR1cm4gcmVzOw0KK30NCisgIA0KK1VTdHJpbmcgR2V0Q29ycmVjdEZ1bGxGc1BhdGgoY29uc3QgVVN0cmluZyAmcGF0aCkNCit7DQorICBVU3RyaW5nVmVjdG9yIHBhcnRzOw0KKyAgU3BsaXRQYXRoVG9QYXJ0cyhwYXRoLCBwYXJ0cyk7DQorICBGT1JfVkVDVE9SIChpLCBwYXJ0cykNCisgIHsNCisgICAgVVN0cmluZyAmcyA9IHBhcnRzW2ldOw0KKyAgICAjaWZkZWYgX1dJTjMyDQorICAgIHdoaWxlICghcy5Jc0VtcHR5KCkgJiYgKHMuQmFjaygpID09ICcuJyB8fCBzLkJhY2soKSA9PSAnICcpKQ0KKyAgICAgIHMuRGVsZXRlQmFjaygpOw0KKyAgICBpZiAoIUlzU3VwcG9ydGVkTmFtZShzKSkNCisgICAgICBzLkluc2VydEF0RnJvbnQoTCdfJyk7DQorICAgICNlbmRpZg0KKyAgfQ0KKyAgcmV0dXJuIE1ha2VQYXRoTmFtZUZyb21QYXJ0cyhwYXJ0cyk7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0V4dHJhY3RpbmdGaWxlUGF0aC5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vRXh0cmFjdGluZ0ZpbGVQYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzNjMxMgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0V4dHJhY3RpbmdGaWxlUGF0aC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vIEV4dHJhY3RpbmdGaWxlUGF0aC5oDQorDQorI2lmbmRlZiBfX0VYVFJBQ1RJTkdfRklMRV9QQVRIX0gNCisjZGVmaW5lIF9fRVhUUkFDVElOR19GSUxFX1BBVEhfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlTdHJpbmcuaCINCisNCitVU3RyaW5nIE1ha2VQYXRoTmFtZUZyb21QYXJ0cyhjb25zdCBVU3RyaW5nVmVjdG9yICZwYXJ0cyk7DQorDQorLyogZm9yIFdJTjMyOg0KKyAgaWYgKGlzUm9vdCA9PSB0cnVlKSwgYW5kICBwYXRoUGFydHNbMF0gY29udGFpbnMgcGF0aCBsaWtlICJjOm5hbWUiLA0KKyAgaXQgdGhpbmtzIHRoYXQgImM6IiBpcyBkcml2ZSBwcmVmaXggKGl0J3Mgbm90ICI6bmFtZSBhbHQgc3RyZWFtKSBhbmQNCisgIHRoZSBmdW5jdGlvbiBjaGFuZ2VzIHBhcnQgdG8gY19uYW1lICovDQordm9pZCBNYWtlQ29ycmVjdFBhdGgoYm9vbCBpc1BhdGhGcm9tUm9vdCwgVVN0cmluZ1ZlY3RvciAmcGF0aFBhcnRzLCBib29sIHJlcGxhY2VBbHRTdHJlYW1Db2xvbik7DQorDQorVVN0cmluZyBHZXRDb3JyZWN0RnNQYXRoKGNvbnN0IFVTdHJpbmcgJnBhdGgpOw0KK1VTdHJpbmcgR2V0Q29ycmVjdEZ1bGxGc1BhdGgoY29uc3QgVVN0cmluZyAmcGF0aCk7DQorDQordm9pZCBDb3JyZWN0X0lmRW1wdHlMYXN0UGFydChVU3RyaW5nVmVjdG9yICZwYXJ0cyk7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vSGFzaENhbGMuY3BwIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vSGFzaENhbGMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlY2Y2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9IYXNoQ2FsYy5jcHAKQEAgLTAsMCArMSwzNjEgQEAKKy8vIEhhc2hDYWxjLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vQy9BbGxvYy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vU3RyaW5nVG9JbnQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0ZpbGVTdHJlYW1zLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9TdHJlYW1VdGlscy5oIg0KKw0KKyNpbmNsdWRlICJFbnVtRGlySXRlbXMuaCINCisjaW5jbHVkZSAiSGFzaENhbGMuaCINCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQorDQorY2xhc3MgQ0hhc2hNaWRCdWYNCit7DQorICB2b2lkICpfZGF0YTsNCitwdWJsaWM6DQorICBDSGFzaE1pZEJ1ZigpOiBfZGF0YSgwKSB7fQ0KKyAgb3BlcmF0b3Igdm9pZCAqKCkgeyByZXR1cm4gX2RhdGE7IH0NCisgIGJvb2wgQWxsb2Moc2l6ZV90IHNpemUpDQorICB7DQorICAgIGlmIChfZGF0YSAhPSAwKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgX2RhdGEgPSA6Ok1pZEFsbG9jKHNpemUpOw0KKyAgICByZXR1cm4gX2RhdGEgIT0gMDsNCisgIH0NCisgIH5DSGFzaE1pZEJ1ZigpIHsgOjpNaWRGcmVlKF9kYXRhKTsgfQ0KK307DQorDQorc3RydWN0IENFbnVtRGlySXRlbUNhbGxiYWNrX0hhc2g6IHB1YmxpYyBJRW51bURpckl0ZW1DYWxsYmFjaw0KK3sNCisgIElIYXNoQ2FsbGJhY2tVSSAqQ2FsbGJhY2s7DQorICANCisgIEhSRVNVTFQgU2NhblByb2dyZXNzKFVJbnQ2NCBudW1Gb2xkZXJzLCBVSW50NjQgbnVtRmlsZXMsIFVJbnQ2NCB0b3RhbFNpemUsIGNvbnN0IHdjaGFyX3QgKnBhdGgsIGJvb2wgaXNEaXIpDQorICB7DQorICAgIHJldHVybiBDYWxsYmFjay0+U2NhblByb2dyZXNzKG51bUZvbGRlcnMsIG51bUZpbGVzLCB0b3RhbFNpemUsIHBhdGgsIGlzRGlyKTsNCisgIH0NCit9Ow0KKw0KK3N0YXRpYyBjb25zdCB3Y2hhcl90ICprX0RlZmF1bHRIYXNoTWV0aG9kID0gTCJDUkMzMiI7DQorDQorSFJFU1VMVCBDSGFzaEJ1bmRsZTo6U2V0TWV0aG9kcyhERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUyBjb25zdCBVU3RyaW5nVmVjdG9yICZoYXNoTWV0aG9kcykNCit7DQorICBVU3RyaW5nVmVjdG9yIG5hbWVzID0gaGFzaE1ldGhvZHM7DQorICBpZiAobmFtZXMuSXNFbXB0eSgpKQ0KKyAgICBuYW1lcy5BZGQoa19EZWZhdWx0SGFzaE1ldGhvZCk7DQorDQorICBDUmVjb3JkVmVjdG9yPENNZXRob2RJZD4gaWRzOw0KKyAgQ09iamVjdFZlY3RvcjxDT25lTWV0aG9kSW5mbz4gbWV0aG9kczsNCisgIA0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBuYW1lcy5TaXplKCk7IGkrKykNCisgIHsNCisgICAgQ09uZU1ldGhvZEluZm8gbTsNCisgICAgUklOT0sobS5QYXJzZU1ldGhvZEZyb21TdHJpbmcobmFtZXNbaV0pKTsNCisNCisgICAgaWYgKG0uTWV0aG9kTmFtZS5Jc0VtcHR5KCkpDQorICAgICAgbS5NZXRob2ROYW1lID0ga19EZWZhdWx0SGFzaE1ldGhvZDsNCisgICAgDQorICAgIGlmIChtLk1ldGhvZE5hbWUgPT0gTCIqIikNCisgICAgew0KKyAgICAgIENSZWNvcmRWZWN0b3I8Q01ldGhvZElkPiB0ZW1wTWV0aG9kczsNCisgICAgICBHZXRIYXNoTWV0aG9kcyhFWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMgdGVtcE1ldGhvZHMpOw0KKyAgICAgIG1ldGhvZHMuQ2xlYXIoKTsNCisgICAgICBpZHMuQ2xlYXIoKTsNCisgICAgICBGT1JfVkVDVE9SICh0LCB0ZW1wTWV0aG9kcykNCisgICAgICB7DQorICAgICAgICBpbnQgaW5kZXggPSBpZHMuQWRkVG9VbmlxdWVTb3J0ZWQodGVtcE1ldGhvZHNbdF0pOw0KKyAgICAgICAgaWYgKGlkcy5TaXplKCkgIT0gbWV0aG9kcy5TaXplKCkpDQorICAgICAgICAgIG1ldGhvZHMuSW5zZXJ0KGluZGV4LCBtKTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgLy8gbS5NZXRob2ROYW1lLlJlbW92ZUNoYXIoTCctJyk7DQorICAgICAgQ01ldGhvZElkIGlkOw0KKyAgICAgIGlmICghRmluZEhhc2hNZXRob2QoRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTIG0uTWV0aG9kTmFtZSwgaWQpKQ0KKyAgICAgICAgcmV0dXJuIEVfTk9USU1QTDsNCisgICAgICBpbnQgaW5kZXggPSBpZHMuQWRkVG9VbmlxdWVTb3J0ZWQoaWQpOw0KKyAgICAgIGlmIChpZHMuU2l6ZSgpICE9IG1ldGhvZHMuU2l6ZSgpKQ0KKyAgICAgICAgbWV0aG9kcy5JbnNlcnQoaW5kZXgsIG0pOw0KKyAgICB9DQorICB9DQorDQorICBmb3IgKGkgPSAwOyBpIDwgaWRzLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICBDTXlDb21QdHI8SUhhc2hlcj4gaGFzaGVyOw0KKyAgICBVU3RyaW5nIG5hbWU7DQorICAgIFJJTk9LKENyZWF0ZUhhc2hlcihFWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMgaWRzW2ldLCBuYW1lLCBoYXNoZXIpKTsNCisgICAgaWYgKCFoYXNoZXIpDQorICAgICAgdGhyb3cgIkNhbid0IGNyZWF0ZSBoYXNoZXIiOw0KKyAgICBjb25zdCBDT25lTWV0aG9kSW5mbyAmbSA9IG1ldGhvZHNbaV07DQorICAgIHsNCisgICAgICBDTXlDb21QdHI8SUNvbXByZXNzU2V0Q29kZXJQcm9wZXJ0aWVzPiBzY3A7DQorICAgICAgaGFzaGVyLlF1ZXJ5SW50ZXJmYWNlKElJRF9JQ29tcHJlc3NTZXRDb2RlclByb3BlcnRpZXMsICZzY3ApOw0KKyAgICAgIGlmIChzY3ApDQorICAgICAgew0KKyAgICAgICAgUklOT0sobS5TZXRDb2RlclByb3BzKHNjcCwgTlVMTCkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBVSW50MzIgZGlnZXN0U2l6ZSA9IGhhc2hlci0+R2V0RGlnZXN0U2l6ZSgpOw0KKyAgICBpZiAoZGlnZXN0U2l6ZSA+IGtfSGFzaENhbGNfRGlnZXN0U2l6ZV9NYXgpDQorICAgICAgcmV0dXJuIEVfTk9USU1QTDsNCisgICAgQ0hhc2hlclN0YXRlICZoID0gSGFzaGVycy5BZGROZXcoKTsNCisgICAgaC5IYXNoZXIgPSBoYXNoZXI7DQorICAgIGguTmFtZSA9IG5hbWU7DQorICAgIGguRGlnZXN0U2l6ZSA9IGRpZ2VzdFNpemU7DQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwga19IYXNoQ2FsY19OdW1Hcm91cHM7IGkrKykNCisgICAgICBtZW1zZXQoaC5EaWdlc3RzW2ldLCAwLCBkaWdlc3RTaXplKTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCit2b2lkIENIYXNoQnVuZGxlOjpJbml0Rm9yTmV3RmlsZSgpDQorew0KKyAgQ3VyU2l6ZSA9IDA7DQorICBGT1JfVkVDVE9SIChpLCBIYXNoZXJzKQ0KKyAgew0KKyAgICBDSGFzaGVyU3RhdGUgJmggPSBIYXNoZXJzW2ldOw0KKyAgICBoLkhhc2hlci0+SW5pdCgpOw0KKyAgICBtZW1zZXQoaC5EaWdlc3RzW2tfSGFzaENhbGNfSW5kZXhfQ3VycmVudF0sIDAsIGguRGlnZXN0U2l6ZSk7DQorICB9DQorfQ0KKw0KK3ZvaWQgQ0hhc2hCdW5kbGU6OlVwZGF0ZShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSkNCit7DQorICBDdXJTaXplICs9IHNpemU7DQorICBGT1JfVkVDVE9SIChpLCBIYXNoZXJzKQ0KKyAgICBIYXNoZXJzW2ldLkhhc2hlci0+VXBkYXRlKGRhdGEsIHNpemUpOw0KK30NCisNCit2b2lkIENIYXNoQnVuZGxlOjpTZXRTaXplKFVJbnQ2NCBzaXplKQ0KK3sNCisgIEN1clNpemUgPSBzaXplOw0KK30NCisNCitzdGF0aWMgdm9pZCBBZGREaWdlc3RzKEJ5dGUgKmRlc3QsIGNvbnN0IEJ5dGUgKnNyYywgVUludDMyIHNpemUpDQorew0KKyAgdW5zaWduZWQgbmV4dCA9IDA7DQorICBmb3IgKFVJbnQzMiBpID0gMDsgaSA8IHNpemU7IGkrKykNCisgIHsNCisgICAgbmV4dCArPSAodW5zaWduZWQpZGVzdFtpXSArICh1bnNpZ25lZClzcmNbaV07DQorICAgIGRlc3RbaV0gPSAoQnl0ZSluZXh0Ow0KKyAgICBuZXh0ID4+PSA4Ow0KKyAgfQ0KK30NCisNCit2b2lkIENIYXNoQnVuZGxlOjpGaW5hbChib29sIGlzRGlyLCBib29sIGlzQWx0U3RyZWFtLCBjb25zdCBVU3RyaW5nICZwYXRoKQ0KK3sNCisgIGlmIChpc0RpcikNCisgICAgTnVtRGlycysrOw0KKyAgZWxzZSBpZiAoaXNBbHRTdHJlYW0pDQorICB7DQorICAgIE51bUFsdFN0cmVhbXMrKzsNCisgICAgQWx0U3RyZWFtc1NpemUgKz0gQ3VyU2l6ZTsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgTnVtRmlsZXMrKzsNCisgICAgRmlsZXNTaXplICs9IEN1clNpemU7DQorICB9DQorDQorICBCeXRlIHByZVsxNl07DQorICBtZW1zZXQocHJlLCAwLCBzaXplb2YocHJlKSk7DQorICBpZiAoaXNEaXIpDQorICAgIHByZVswXSA9IDE7DQorICANCisgIEZPUl9WRUNUT1IgKGksIEhhc2hlcnMpDQorICB7DQorICAgIENIYXNoZXJTdGF0ZSAmaCA9IEhhc2hlcnNbaV07DQorICAgIGlmICghaXNEaXIpDQorICAgIHsNCisgICAgICBoLkhhc2hlci0+RmluYWwoaC5EaWdlc3RzWzBdKTsNCisgICAgICBpZiAoIWlzQWx0U3RyZWFtKQ0KKyAgICAgICAgQWRkRGlnZXN0cyhoLkRpZ2VzdHNba19IYXNoQ2FsY19JbmRleF9EYXRhU3VtXSwgaC5EaWdlc3RzWzBdLCBoLkRpZ2VzdFNpemUpOw0KKyAgICB9DQorDQorICAgIGguSGFzaGVyLT5Jbml0KCk7DQorICAgIGguSGFzaGVyLT5VcGRhdGUocHJlLCBzaXplb2YocHJlKSk7DQorICAgIGguSGFzaGVyLT5VcGRhdGUoaC5EaWdlc3RzWzBdLCBoLkRpZ2VzdFNpemUpOw0KKyAgICANCisgICAgZm9yICh1bnNpZ25lZCBrID0gMDsgayA8IHBhdGguTGVuKCk7IGsrKykNCisgICAgew0KKyAgICAgIHdjaGFyX3QgYyA9IHBhdGhba107DQorICAgICAgQnl0ZSB0ZW1wWzJdID0geyAoQnl0ZSkoYyAmIDB4RkYpLCAoQnl0ZSkoKGMgPj4gOCkgJiAweEZGKSB9Ow0KKyAgICAgIGguSGFzaGVyLT5VcGRhdGUodGVtcCwgMik7DQorICAgIH0NCisgIA0KKyAgICBCeXRlIHRlbXBEaWdlc3Rba19IYXNoQ2FsY19EaWdlc3RTaXplX01heF07DQorICAgIGguSGFzaGVyLT5GaW5hbCh0ZW1wRGlnZXN0KTsNCisgICAgaWYgKCFpc0FsdFN0cmVhbSkNCisgICAgICBBZGREaWdlc3RzKGguRGlnZXN0c1trX0hhc2hDYWxjX0luZGV4X05hbWVzU3VtXSwgdGVtcERpZ2VzdCwgaC5EaWdlc3RTaXplKTsNCisgICAgQWRkRGlnZXN0cyhoLkRpZ2VzdHNba19IYXNoQ2FsY19JbmRleF9TdHJlYW1zU3VtXSwgdGVtcERpZ2VzdCwgaC5EaWdlc3RTaXplKTsNCisgIH0NCit9DQorDQorDQorSFJFU1VMVCBIYXNoQ2FsYygNCisgICAgREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgY29uc3QgTldpbGRjYXJkOjpDQ2Vuc29yICZjZW5zb3IsDQorICAgIGNvbnN0IENIYXNoT3B0aW9ucyAmb3B0aW9ucywNCisgICAgVVN0cmluZyAmZXJyb3JJbmZvLA0KKyAgICBJSGFzaENhbGxiYWNrVUkgKmNhbGxiYWNrKQ0KK3sNCisgIENEaXJJdGVtcyBkaXJJdGVtczsNCisNCisgIFVJbnQ2NCBudW1FcnJvcnMgPSAwOw0KKyAgVUludDY0IHRvdGFsQnl0ZXMgPSAwOw0KKyAgaWYgKG9wdGlvbnMuU3RkSW5Nb2RlKQ0KKyAgew0KKyAgICBDRGlySXRlbSBkaTsNCisgICAgZGkuU2l6ZSA9IChVSW50NjQpKEludDY0KS0xOw0KKyAgICBkaS5BdHRyaWIgPSAwOw0KKyAgICBkaS5NVGltZS5kd0xvd0RhdGVUaW1lID0gMDsNCisgICAgZGkuTVRpbWUuZHdIaWdoRGF0ZVRpbWUgPSAwOw0KKyAgICBkaS5DVGltZSA9IGRpLkFUaW1lID0gZGkuTVRpbWU7DQorICAgIGRpckl0ZW1zLkl0ZW1zLkFkZChkaSk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIENFbnVtRGlySXRlbUNhbGxiYWNrX0hhc2ggZW51bUNhbGxiYWNrOw0KKyAgICBlbnVtQ2FsbGJhY2suQ2FsbGJhY2sgPSBjYWxsYmFjazsNCisgICAgUklOT0soY2FsbGJhY2stPlN0YXJ0U2Nhbm5pbmcoKSk7DQorICAgIGRpckl0ZW1zLlNjYW5BbHRTdHJlYW1zID0gb3B0aW9ucy5BbHRTdHJlYW1zTW9kZTsNCisgICAgSFJFU1VMVCByZXMgPSBFbnVtZXJhdGVJdGVtcyhjZW5zb3IsDQorICAgICAgICBvcHRpb25zLlBhdGhNb2RlLA0KKyAgICAgICAgVVN0cmluZygpLA0KKyAgICAgICAgZGlySXRlbXMsICZlbnVtQ2FsbGJhY2spOw0KKyAgICB0b3RhbEJ5dGVzID0gZGlySXRlbXMuVG90YWxTaXplOw0KKyAgICBGT1JfVkVDVE9SIChpLCBkaXJJdGVtcy5FcnJvclBhdGhzKQ0KKyAgICB7DQorICAgICAgUklOT0soY2FsbGJhY2stPkNhbk5vdEZpbmRFcnJvcihmczJ1cyhkaXJJdGVtcy5FcnJvclBhdGhzW2ldKSwgZGlySXRlbXMuRXJyb3JDb2Rlc1tpXSkpOw0KKyAgICB9DQorICAgIG51bUVycm9ycyA9IGRpckl0ZW1zLkVycm9yUGF0aHMuU2l6ZSgpOw0KKyAgICBpZiAocmVzICE9IFNfT0spDQorICAgIHsNCisgICAgICBpZiAocmVzICE9IEVfQUJPUlQpDQorICAgICAgICBlcnJvckluZm8gPSBMIlNjYW5uaW5nIGVycm9yIjsNCisgICAgICByZXR1cm4gcmVzOw0KKyAgICB9DQorICAgIFJJTk9LKGNhbGxiYWNrLT5GaW5pc2hTY2FubmluZygpKTsNCisgIH0NCisNCisgIHVuc2lnbmVkIGk7DQorICBDSGFzaEJ1bmRsZSBoYjsNCisgIFJJTk9LKGhiLlNldE1ldGhvZHMoRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTIG9wdGlvbnMuTWV0aG9kcykpOw0KKyAgaGIuSW5pdCgpOw0KKyAgaGIuTnVtRXJyb3JzID0gbnVtRXJyb3JzOw0KKyAgDQorICBpZiAob3B0aW9ucy5TdGRJbk1vZGUpDQorICB7DQorICAgIFJJTk9LKGNhbGxiYWNrLT5TZXROdW1GaWxlcygxKSk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIFJJTk9LKGNhbGxiYWNrLT5TZXRUb3RhbCh0b3RhbEJ5dGVzKSk7DQorICB9DQorDQorICBjb25zdCBVSW50MzIga0J1ZlNpemUgPSAxIDw8IDE1Ow0KKyAgQ0hhc2hNaWRCdWYgYnVmOw0KKyAgaWYgKCFidWYuQWxsb2Moa0J1ZlNpemUpKQ0KKyAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisNCisgIFVJbnQ2NCBjb21wbGV0ZVZhbHVlID0gMDsNCisNCisgIFJJTk9LKGNhbGxiYWNrLT5CZWZvcmVGaXJzdEZpbGUoaGIpKTsNCisNCisgIGZvciAoaSA9IDA7IGkgPCBkaXJJdGVtcy5JdGVtcy5TaXplKCk7IGkrKykNCisgIHsNCisgICAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IGluU3RyZWFtOw0KKyAgICBVU3RyaW5nIHBhdGg7DQorICAgIGJvb2wgaXNEaXIgPSBmYWxzZTsNCisgICAgYm9vbCBpc0FsdFN0cmVhbSA9IGZhbHNlOw0KKyAgICBpZiAob3B0aW9ucy5TdGRJbk1vZGUpDQorICAgIHsNCisgICAgICBpblN0cmVhbSA9IG5ldyBDU3RkSW5GaWxlU3RyZWFtOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIENJbkZpbGVTdHJlYW0gKmluU3RyZWFtU3BlYyA9IG5ldyBDSW5GaWxlU3RyZWFtOw0KKyAgICAgIGluU3RyZWFtID0gaW5TdHJlYW1TcGVjOw0KKyAgICAgIGNvbnN0IENEaXJJdGVtICZkaXJJdGVtID0gZGlySXRlbXMuSXRlbXNbaV07DQorICAgICAgaXNEaXIgPSBkaXJJdGVtLklzRGlyKCk7DQorICAgICAgaXNBbHRTdHJlYW0gPSBkaXJJdGVtLklzQWx0U3RyZWFtOw0KKyAgICAgIHBhdGggPSBkaXJJdGVtcy5HZXRMb2dQYXRoKGkpOw0KKyAgICAgIGlmICghaXNEaXIpDQorICAgICAgew0KKyAgICAgICAgVVN0cmluZyBwaHlQYXRoID0gZGlySXRlbXMuR2V0UGh5UGF0aChpKTsNCisgICAgICAgIGlmICghaW5TdHJlYW1TcGVjLT5PcGVuU2hhcmVkKHVzMmZzKHBoeVBhdGgpLCBvcHRpb25zLk9wZW5TaGFyZUZvcldyaXRlKSkNCisgICAgICAgIHsNCisgICAgICAgICAgSFJFU1VMVCByZXMgPSBjYWxsYmFjay0+T3BlbkZpbGVFcnJvcihwaHlQYXRoLCA6OkdldExhc3RFcnJvcigpKTsNCisgICAgICAgICAgaGIuTnVtRXJyb3JzKys7DQorICAgICAgICAgIGlmIChyZXMgIT0gU19GQUxTRSkNCisgICAgICAgICAgICByZXR1cm4gcmVzOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgUklOT0soY2FsbGJhY2stPkdldFN0cmVhbShwYXRoLCBpc0RpcikpOw0KKyAgICBVSW50NjQgZmlsZVNpemUgPSAwOw0KKw0KKyAgICBoYi5Jbml0Rm9yTmV3RmlsZSgpOw0KKyAgICBpZiAoIWlzRGlyKQ0KKyAgICB7DQorICAgICAgZm9yIChVSW50MzIgc3RlcCA9IDA7OyBzdGVwKyspDQorICAgICAgew0KKyAgICAgICAgaWYgKChzdGVwICYgMHhGRikgPT0gMCkNCisgICAgICAgICAgUklOT0soY2FsbGJhY2stPlNldENvbXBsZXRlZCgmY29tcGxldGVWYWx1ZSkpOw0KKyAgICAgICAgVUludDMyIHNpemU7DQorICAgICAgICBSSU5PSyhpblN0cmVhbS0+UmVhZChidWYsIGtCdWZTaXplLCAmc2l6ZSkpOw0KKyAgICAgICAgaWYgKHNpemUgPT0gMCkNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBoYi5VcGRhdGUoYnVmLCBzaXplKTsNCisgICAgICAgIGZpbGVTaXplICs9IHNpemU7DQorICAgICAgICBjb21wbGV0ZVZhbHVlICs9IHNpemU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGhiLkZpbmFsKGlzRGlyLCBpc0FsdFN0cmVhbSwgcGF0aCk7DQorICAgIFJJTk9LKGNhbGxiYWNrLT5TZXRPcGVyYXRpb25SZXN1bHQoZmlsZVNpemUsIGhiLCAhaXNEaXIpKTsNCisgICAgUklOT0soY2FsbGJhY2stPlNldENvbXBsZXRlZCgmY29tcGxldGVWYWx1ZSkpOw0KKyAgfQ0KKyAgcmV0dXJuIGNhbGxiYWNrLT5BZnRlckxhc3RGaWxlKGhiKTsNCit9DQorDQorDQorc3RhdGljIGlubGluZSBjaGFyIEdldEhleChCeXRlIHZhbHVlKQ0KK3sNCisgIHJldHVybiAoY2hhcikoKHZhbHVlIDwgMTApID8gKCcwJyArIHZhbHVlKSA6ICgnQScgKyAodmFsdWUgLSAxMCkpKTsNCit9DQorDQordm9pZCBBZGRIYXNoSGV4VG9TdHJpbmcoY2hhciAqZGVzdCwgY29uc3QgQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpDQorew0KKyAgZGVzdFtzaXplICogMl0gPSAwOw0KKyAgaWYgKCFkYXRhKQ0KKyAgew0KKyAgICBmb3IgKFVJbnQzMiBpID0gMDsgaSA8IHNpemU7IGkrKykNCisgICAgew0KKyAgICAgIGRlc3RbMF0gPSAnICc7DQorICAgICAgZGVzdFsxXSA9ICcgJzsNCisgICAgICBkZXN0ICs9IDI7DQorICAgIH0NCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50IHN0ZXAgPSAyOw0KKyAgaWYgKHNpemUgPD0gOCkNCisgIHsNCisgICAgc3RlcCA9IC0yOw0KKyAgICBkZXN0ICs9IHNpemUgKiAyIC0gMjsNCisgIH0NCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KKyAgew0KKyAgICBCeXRlIGIgPSBkYXRhW2ldOw0KKyAgICBkZXN0WzBdID0gR2V0SGV4KChCeXRlKSgoYiA+PiA0KSAmIDB4RikpOw0KKyAgICBkZXN0WzFdID0gR2V0SGV4KChCeXRlKShiICYgMHhGKSk7DQorICAgIGRlc3QgKz0gc3RlcDsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vSGFzaENhbGMuaCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0hhc2hDYWxjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlZTJjZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0hhc2hDYWxjLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8vIEhhc2hDYWxjLmgNCisNCisjaWZuZGVmIF9fSEFTSF9DQUxDX0gNCisjZGVmaW5lIF9fSEFTSF9DQUxDX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1dpbGRjYXJkLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9DcmVhdGVDb2Rlci5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTWV0aG9kUHJvcHMuaCINCisNCisjaW5jbHVkZSAiUHJvcGVydHkuaCINCisNCitjb25zdCB1bnNpZ25lZCBrX0hhc2hDYWxjX0RpZ2VzdFNpemVfTWF4ID0gNjQ7DQorDQorY29uc3QgdW5zaWduZWQga19IYXNoQ2FsY19OdW1Hcm91cHMgPSA0Ow0KKw0KK2VudW0NCit7DQorICBrX0hhc2hDYWxjX0luZGV4X0N1cnJlbnQsDQorICBrX0hhc2hDYWxjX0luZGV4X0RhdGFTdW0sDQorICBrX0hhc2hDYWxjX0luZGV4X05hbWVzU3VtLA0KKyAga19IYXNoQ2FsY19JbmRleF9TdHJlYW1zU3VtDQorfTsNCisNCitzdHJ1Y3QgQ0hhc2hlclN0YXRlDQorew0KKyAgQ015Q29tUHRyPElIYXNoZXI+IEhhc2hlcjsNCisgIFVTdHJpbmcgTmFtZTsNCisgIFVJbnQzMiBEaWdlc3RTaXplOw0KKyAgQnl0ZSBEaWdlc3RzW2tfSGFzaENhbGNfTnVtR3JvdXBzXVtrX0hhc2hDYWxjX0RpZ2VzdFNpemVfTWF4XTsNCit9Ow0KKw0KK3N0cnVjdCBJSGFzaENhbGMNCit7DQorICB2aXJ0dWFsIHZvaWQgSW5pdEZvck5ld0ZpbGUoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgVXBkYXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0U2l6ZShVSW50NjQgc2l6ZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEZpbmFsKGJvb2wgaXNEaXIsIGJvb2wgaXNBbHRTdHJlYW0sIGNvbnN0IFVTdHJpbmcgJnBhdGgpID0gMDsNCit9Ow0KKw0KK3N0cnVjdCBDSGFzaEJ1bmRsZTogcHVibGljIElIYXNoQ2FsYw0KK3sNCisgIENPYmplY3RWZWN0b3I8Q0hhc2hlclN0YXRlPiBIYXNoZXJzOw0KKw0KKyAgVUludDY0IE51bUZpbGVzOw0KKyAgVUludDY0IE51bURpcnM7DQorICBVSW50NjQgTnVtQWx0U3RyZWFtczsNCisgIFVJbnQ2NCBGaWxlc1NpemU7DQorICBVSW50NjQgQWx0U3RyZWFtc1NpemU7DQorICBVSW50NjQgTnVtRXJyb3JzOw0KKw0KKyAgVUludDY0IEN1clNpemU7DQorDQorICBIUkVTVUxUIFNldE1ldGhvZHMoREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMgY29uc3QgVVN0cmluZ1ZlY3RvciAmbWV0aG9kcyk7DQorICANCisgIHZvaWQgSW5pdCgpDQorICB7DQorICAgIE51bUZpbGVzID0gTnVtRGlycyA9IE51bUFsdFN0cmVhbXMgPSBGaWxlc1NpemUgPSBBbHRTdHJlYW1zU2l6ZSA9IE51bUVycm9ycyA9IDA7DQorICB9DQorDQorICB2b2lkIEluaXRGb3JOZXdGaWxlKCk7DQorICB2b2lkIFVwZGF0ZShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSk7DQorICB2b2lkIFNldFNpemUoVUludDY0IHNpemUpOw0KKyAgdm9pZCBGaW5hbChib29sIGlzRGlyLCBib29sIGlzQWx0U3RyZWFtLCBjb25zdCBVU3RyaW5nICZwYXRoKTsNCit9Ow0KKw0KKyNkZWZpbmUgSU5URVJGQUNFX0lIYXNoQ2FsbGJhY2tVSSh4KSBcDQorICB2aXJ0dWFsIEhSRVNVTFQgU3RhcnRTY2FubmluZygpIHg7IFwNCisgIHZpcnR1YWwgSFJFU1VMVCBTY2FuUHJvZ3Jlc3MoVUludDY0IG51bUZvbGRlcnMsIFVJbnQ2NCBudW1GaWxlcywgVUludDY0IHRvdGFsU2l6ZSwgY29uc3Qgd2NoYXJfdCAqcGF0aCwgYm9vbCBpc0RpcikgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIENhbk5vdEZpbmRFcnJvcihjb25zdCB3Y2hhcl90ICpuYW1lLCBEV09SRCBzeXN0ZW1FcnJvcikgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIEZpbmlzaFNjYW5uaW5nKCkgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIFNldE51bUZpbGVzKFVJbnQ2NCBudW1GaWxlcykgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIFNldFRvdGFsKFVJbnQ2NCBzaXplKSB4OyBcDQorICB2aXJ0dWFsIEhSRVNVTFQgU2V0Q29tcGxldGVkKGNvbnN0IFVJbnQ2NCAqY29tcGxldGVWYWx1ZSkgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIENoZWNrQnJlYWsoKSB4OyBcDQorICB2aXJ0dWFsIEhSRVNVTFQgQmVmb3JlRmlyc3RGaWxlKGNvbnN0IENIYXNoQnVuZGxlICZoYikgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIEdldFN0cmVhbShjb25zdCB3Y2hhcl90ICpuYW1lLCBib29sIGlzRm9sZGVyKSB4OyBcDQorICB2aXJ0dWFsIEhSRVNVTFQgT3BlbkZpbGVFcnJvcihjb25zdCB3Y2hhcl90ICpuYW1lLCBEV09SRCBzeXN0ZW1FcnJvcikgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIFNldE9wZXJhdGlvblJlc3VsdChVSW50NjQgZmlsZVNpemUsIGNvbnN0IENIYXNoQnVuZGxlICZoYiwgYm9vbCBzaG93SGFzaCkgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIEFmdGVyTGFzdEZpbGUoY29uc3QgQ0hhc2hCdW5kbGUgJmhiKSB4OyBcDQorDQorc3RydWN0IElIYXNoQ2FsbGJhY2tVSQ0KK3sNCisgIElOVEVSRkFDRV9JSGFzaENhbGxiYWNrVUkoPTApDQorfTsNCisNCitzdHJ1Y3QgQ0hhc2hPcHRpb25zDQorew0KKyAgVVN0cmluZ1ZlY3RvciBNZXRob2RzOw0KKyAgYm9vbCBPcGVuU2hhcmVGb3JXcml0ZTsNCisgIGJvb2wgU3RkSW5Nb2RlOw0KKyAgYm9vbCBBbHRTdHJlYW1zTW9kZTsNCisgIE5XaWxkY2FyZDo6RUNlbnNvclBhdGhNb2RlIFBhdGhNb2RlOw0KKyANCisgIENIYXNoT3B0aW9ucygpOiBTdGRJbk1vZGUoZmFsc2UpLCBPcGVuU2hhcmVGb3JXcml0ZShmYWxzZSksIEFsdFN0cmVhbXNNb2RlKGZhbHNlKSwgUGF0aE1vZGUoTldpbGRjYXJkOjprX1JlbGF0UGF0aCkge307DQorfTsNCisNCitIUkVTVUxUIEhhc2hDYWxjKA0KKyAgICBERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICBjb25zdCBOV2lsZGNhcmQ6OkNDZW5zb3IgJmNlbnNvciwNCisgICAgY29uc3QgQ0hhc2hPcHRpb25zICZvcHRpb25zLA0KKyAgICBVU3RyaW5nICZlcnJvckluZm8sDQorICAgIElIYXNoQ2FsbGJhY2tVSSAqY2FsbGJhY2spOw0KKw0KK3ZvaWQgQWRkSGFzaEhleFRvU3RyaW5nKGNoYXIgKmRlc3QsIGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9JRmlsZUV4dHJhY3RDYWxsYmFjay5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vSUZpbGVFeHRyYWN0Q2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWJmYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vSUZpbGVFeHRyYWN0Q2FsbGJhY2suaApAQCAtMCwwICsxLDcyIEBACisvLyBJRmlsZUV4dHJhY3RDYWxsYmFjay5oDQorDQorI2lmbmRlZiBfX0lfRklMRV9FWFRSQUNUX0NBTExCQUNLX0gNCisjZGVmaW5lIF9fSV9GSUxFX0VYVFJBQ1RfQ0FMTEJBQ0tfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlTdHJpbmcuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vSURlY2wuaCINCisNCituYW1lc3BhY2UgTk92ZXJ3cml0ZUFuc3dlcg0KK3sNCisgIGVudW0gRUVudW0NCisgIHsNCisgICAga1llcywNCisgICAga1llc1RvQWxsLA0KKyAgICBrTm8sDQorICAgIGtOb1RvQWxsLA0KKyAgICBrQXV0b1JlbmFtZSwNCisgICAga0NhbmNlbA0KKyAgfTsNCit9DQorDQorREVDTF9JTlRFUkZBQ0VfU1VCKElGb2xkZXJBcmNoaXZlRXh0cmFjdENhbGxiYWNrLCBJUHJvZ3Jlc3MsIDB4MDEsIDB4MDcpDQorew0KK3B1YmxpYzoNCisgIFNURE1FVEhPRChBc2tPdmVyd3JpdGUpKA0KKyAgICAgIGNvbnN0IHdjaGFyX3QgKmV4aXN0TmFtZSwgY29uc3QgRklMRVRJTUUgKmV4aXN0VGltZSwgY29uc3QgVUludDY0ICpleGlzdFNpemUsDQorICAgICAgY29uc3Qgd2NoYXJfdCAqbmV3TmFtZSwgY29uc3QgRklMRVRJTUUgKm5ld1RpbWUsIGNvbnN0IFVJbnQ2NCAqbmV3U2l6ZSwNCisgICAgICBJbnQzMiAqYW5zd2VyKSBQVVJFOw0KKyAgU1RETUVUSE9EKFByZXBhcmVPcGVyYXRpb24pKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGJvb2wgaXNGb2xkZXIsIEludDMyIGFza0V4dHJhY3RNb2RlLCBjb25zdCBVSW50NjQgKnBvc2l0aW9uKSBQVVJFOw0KKyAgU1RETUVUSE9EKE1lc3NhZ2VFcnJvcikoY29uc3Qgd2NoYXJfdCAqbWVzc2FnZSkgUFVSRTsNCisgIFNURE1FVEhPRChTZXRPcGVyYXRpb25SZXN1bHQpKEludDMyIG9wZXJhdGlvblJlc3VsdCwgYm9vbCBlbmNyeXB0ZWQpIFBVUkU7DQorfTsNCisNCitzdHJ1Y3QgSUV4dHJhY3RDYWxsYmFja1VJOiBJRm9sZGVyQXJjaGl2ZUV4dHJhY3RDYWxsYmFjaw0KK3sNCisgIHZpcnR1YWwgSFJFU1VMVCBCZWZvcmVPcGVuKGNvbnN0IHdjaGFyX3QgKm5hbWUpID0gMDsNCisgIHZpcnR1YWwgSFJFU1VMVCBPcGVuUmVzdWx0KGNvbnN0IHdjaGFyX3QgKm5hbWUsIEhSRVNVTFQgcmVzdWx0LCBib29sIGVuY3J5cHRlZCkgPSAwOw0KKyAgdmlydHVhbCBIUkVTVUxUIFNldEVycm9yKGludCBsZXZlbCwgY29uc3Qgd2NoYXJfdCAqbmFtZSwNCisgICAgICBVSW50MzIgZXJyb3JGbGFncywgY29uc3Qgd2NoYXJfdCAqZXJyb3JzLA0KKyAgICAgIFVJbnQzMiB3YXJuaW5nRmxhZ3MsIGNvbnN0IHdjaGFyX3QgKndhcm5pbmdzKSA9IDA7DQorICB2aXJ0dWFsIEhSRVNVTFQgVGhlcmVBcmVOb0ZpbGVzKCkgPSAwOw0KKyAgdmlydHVhbCBIUkVTVUxUIEV4dHJhY3RSZXN1bHQoSFJFU1VMVCByZXN1bHQpID0gMDsNCisgIHZpcnR1YWwgSFJFU1VMVCBPcGVuVHlwZVdhcm5pbmcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqb2tUeXBlLCBjb25zdCB3Y2hhcl90ICplcnJvclR5cGUpID0gMDsNCisNCisgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgdmlydHVhbCBIUkVTVUxUIFNldFBhc3N3b3JkKGNvbnN0IFVTdHJpbmcgJnBhc3N3b3JkKSA9IDA7DQorICAjZW5kaWYNCit9Ow0KKw0KKw0KKyNkZWZpbmUgSU5URVJGQUNFX0lHZXRQcm9wKHgpIFwNCisgIFNURE1FVEhPRChHZXRQcm9wKShQUk9QSUQgcHJvcElELCBQUk9QVkFSSUFOVCAqdmFsdWUpIHg7IFwNCisNCitERUNMX0lOVEVSRkFDRV9TVUIoSUdldFByb3AsIElVbmtub3duLCAweDAxLCAweDIwKQ0KK3sNCisgIElOVEVSRkFDRV9JR2V0UHJvcChQVVJFKQ0KK307DQorDQorI2RlZmluZSBJTlRFUkZBQ0VfSUZvbGRlckV4dHJhY3RUb1N0cmVhbUNhbGxiYWNrKHgpIFwNCisgIFNURE1FVEhPRChVc2VFeHRyYWN0VG9TdHJlYW0pKEludDMyICpyZXMpIHg7IFwNCisgIFNURE1FVEhPRChHZXRTdHJlYW03KShjb25zdCB3Y2hhcl90ICpuYW1lLCBJbnQzMiBpc0RpciwgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKipvdXRTdHJlYW0sIEludDMyIGFza0V4dHJhY3RNb2RlLCBJR2V0UHJvcCAqZ2V0UHJvcCkgeDsgXA0KKyAgU1RETUVUSE9EKFByZXBhcmVPcGVyYXRpb243KShJbnQzMiBhc2tFeHRyYWN0TW9kZSkgeDsgXA0KKyAgU1RETUVUSE9EKFNldE9wZXJhdGlvblJlc3VsdDcpKEludDMyIHJlc3VsdEVPcGVyYXRpb25SZXN1bHQsIGJvb2wgZW5jcnlwdGVkKSB4OyBcDQorDQorREVDTF9JTlRFUkZBQ0VfU1VCKElGb2xkZXJFeHRyYWN0VG9TdHJlYW1DYWxsYmFjaywgSVVua25vd24sIDB4MDEsIDB4MzApDQorew0KKyAgSU5URVJGQUNFX0lGb2xkZXJFeHRyYWN0VG9TdHJlYW1DYWxsYmFjayhQVVJFKQ0KK307DQorDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vTG9hZENvZGVjcy5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Mb2FkQ29kZWNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2JkN2U4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vTG9hZENvZGVjcy5jcHAKQEAgLTAsMCArMSw5MDAgQEAKKy8vIExvYWRDb2RlY3MuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9DLzd6VmVyc2lvbi5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlDb20uaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ1RvSW50LmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvUHJvcFZhcmlhbnQuaCINCisNCisjaW5jbHVkZSAiTG9hZENvZGVjcy5oIg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCisNCisjaWZkZWYgTkVXX0ZPTERFUl9JTlRFUkZBQ0UNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ1RvSW50LmgiDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIi4uLy4uL0lDb2Rlci5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vUmVnaXN0ZXJBcmMuaCINCisNCisjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZUZpbmQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9ETEwuaCINCisjaWZkZWYgTkVXX0ZPTERFUl9JTlRFUkZBQ0UNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9SZXNvdXJjZVN0cmluZy5oIg0KK3N0YXRpYyBjb25zdCBVSU5UIGtJY29uVHlwZXNSZXNJZCA9IDEwMDsNCisjZW5kaWYNCisNCisjaWZkZWYgX1dJTjMyDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZU5hbWUuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9SZWdpc3RyeS5oIg0KKyNlbmRpZg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBORmlsZTsNCisNCisjaWZkZWYgX1dJTjMyDQorZXh0ZXJuIEhJTlNUQU5DRSBnX2hJbnN0YW5jZTsNCisjZW5kaWYNCisNCisjZGVmaW5lIGtDb2RlY3NGb2xkZXJOYW1lIEZURVhUKCJDb2RlY3MiKQ0KKyNkZWZpbmUga0Zvcm1hdHNGb2xkZXJOYW1lIEZURVhUKCJGb3JtYXRzIikNCitzdGF0aWMgQ0ZTVFIga01haW5EbGwgPSBGVEVYVCgiN3ouZGxsIik7DQorDQorI2lmZGVmIF9XSU4zMg0KKw0KK3N0YXRpYyBMUENUU1RSIGtSZWdpc3RyeVBhdGggPSBURVhUKCJTb2Z0d2FyZSIpIFRFWFQoU1RSSU5HX1BBVEhfU0VQQVJBVE9SKSBURVhUKCI3LXppcCIpOw0KK3N0YXRpYyBMUENXU1RSIGtQcm9ncmFtUGF0aFZhbHVlID0gTCJQYXRoIjsNCitzdGF0aWMgTFBDV1NUUiBrUHJvZ3JhbVBhdGgyVmFsdWUgPSBMIlBhdGgiDQorICAjaWZkZWYgX1dJTjY0DQorICBMIjY0IjsNCisgICNlbHNlDQorICBMIjMyIjsNCisgICNlbmRpZg0KKw0KK3N0YXRpYyBib29sIFJlYWRQYXRoRnJvbVJlZ2lzdHJ5KEhLRVkgYmFzZUtleSwgTFBDV1NUUiB2YWx1ZSwgRlN0cmluZyAmcGF0aCkNCit7DQorICBOUmVnaXN0cnk6OkNLZXkga2V5Ow0KKyAgaWYgKGtleS5PcGVuKGJhc2VLZXksIGtSZWdpc3RyeVBhdGgsIEtFWV9SRUFEKSA9PSBFUlJPUl9TVUNDRVNTKQ0KKyAgew0KKyAgICBVU3RyaW5nIHBhdGhVOw0KKyAgICBpZiAoa2V5LlF1ZXJ5VmFsdWUodmFsdWUsIHBhdGhVKSA9PSBFUlJPUl9TVUNDRVNTKQ0KKyAgICB7DQorICAgICAgcGF0aCA9IHVzMmZzKHBhdGhVKTsNCisgICAgICBOTmFtZTo6Tm9ybWFsaXplRGlyUGF0aFByZWZpeChwYXRoKTsNCisgICAgICByZXR1cm4gTkZpbmQ6OkRvZXNGaWxlRXhpc3QocGF0aCArIGtNYWluRGxsKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCisjZW5kaWYgLy8gX1dJTjMyDQorDQorI2VuZGlmIC8vIEVYVEVSTkFMX0NPREVDUw0KKw0KKw0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrTnVtQXJjc01heCA9IDQ4Ow0KK3N0YXRpYyB1bnNpZ25lZCBnX051bUFyY3MgPSAwOw0KK3N0YXRpYyBjb25zdCBDQXJjSW5mbyAqZ19BcmNzW2tOdW1BcmNzTWF4XTsNCisNCit2b2lkIFJlZ2lzdGVyQXJjKGNvbnN0IENBcmNJbmZvICphcmNJbmZvKSB0aHJvdygpDQorew0KKyAgaWYgKGdfTnVtQXJjcyA8IGtOdW1BcmNzTWF4KQ0KKyAgew0KKyAgICBnX0FyY3NbZ19OdW1BcmNzXSA9IGFyY0luZm87DQorICAgIGdfTnVtQXJjcysrOw0KKyAgfQ0KK30NCisNCitzdGF0aWMgdm9pZCBTcGxpdFN0cmluZyhjb25zdCBVU3RyaW5nICZzcmNTdHJpbmcsIFVTdHJpbmdWZWN0b3IgJmRlc3RTdHJpbmdzKQ0KK3sNCisgIGRlc3RTdHJpbmdzLkNsZWFyKCk7DQorICBVU3RyaW5nIHM7DQorICB1bnNpZ25lZCBsZW4gPSBzcmNTdHJpbmcuTGVuKCk7DQorICBpZiAobGVuID09IDApDQorICAgIHJldHVybjsNCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykNCisgIHsNCisgICAgd2NoYXJfdCBjID0gc3JjU3RyaW5nW2ldOw0KKyAgICBpZiAoYyA9PSBMJyAnKQ0KKyAgICB7DQorICAgICAgaWYgKCFzLklzRW1wdHkoKSkNCisgICAgICB7DQorICAgICAgICBkZXN0U3RyaW5ncy5BZGQocyk7DQorICAgICAgICBzLkVtcHR5KCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2UNCisgICAgICBzICs9IGM7DQorICB9DQorICBpZiAoIXMuSXNFbXB0eSgpKQ0KKyAgICBkZXN0U3RyaW5ncy5BZGQocyk7DQorfQ0KKw0KK2ludCBDQXJjSW5mb0V4OjpGaW5kRXh0ZW5zaW9uKGNvbnN0IFVTdHJpbmcgJmV4dCkgY29uc3QNCit7DQorICBGT1JfVkVDVE9SIChpLCBFeHRzKQ0KKyAgICBpZiAoZXh0LklzRXF1YWxUb05vQ2FzZShFeHRzW2ldLkV4dCkpDQorICAgICAgcmV0dXJuIGk7DQorICByZXR1cm4gLTE7DQorfQ0KKw0KK3ZvaWQgQ0FyY0luZm9FeDo6QWRkRXh0cyhjb25zdCBVU3RyaW5nICZleHQsIGNvbnN0IFVTdHJpbmcgJmFkZEV4dCkNCit7DQorICBVU3RyaW5nVmVjdG9yIGV4dHMsIGFkZEV4dHM7DQorICBTcGxpdFN0cmluZyhleHQsIGV4dHMpOw0KKyAgU3BsaXRTdHJpbmcoYWRkRXh0LCBhZGRFeHRzKTsNCisgIEZPUl9WRUNUT1IgKGksIGV4dHMpDQorICB7DQorICAgIENBcmNFeHRJbmZvIGV4dEluZm87DQorICAgIGV4dEluZm8uRXh0ID0gZXh0c1tpXTsNCisgICAgaWYgKGkgPCBhZGRFeHRzLlNpemUoKSkNCisgICAgew0KKyAgICAgIGV4dEluZm8uQWRkRXh0ID0gYWRkRXh0c1tpXTsNCisgICAgICBpZiAoZXh0SW5mby5BZGRFeHQgPT0gTCIqIikNCisgICAgICAgIGV4dEluZm8uQWRkRXh0LkVtcHR5KCk7DQorICAgIH0NCisgICAgRXh0cy5BZGQoZXh0SW5mbyk7DQorICB9DQorfQ0KKw0KKyNpZm5kZWYgX1NGWA0KKw0KK3N0YXRpYyBib29sIFBhcnNlU2lnbmF0dXJlcyhjb25zdCBCeXRlICpkYXRhLCB1bnNpZ25lZCBzaXplLCBDT2JqZWN0VmVjdG9yPENCeXRlQnVmZmVyPiAmc2lnbmF0dXJlcykNCit7DQorICBzaWduYXR1cmVzLkNsZWFyKCk7DQorICB3aGlsZSAoc2l6ZSA+IDApDQorICB7DQorICAgIHVuc2lnbmVkIGxlbiA9ICpkYXRhKys7DQorICAgIHNpemUtLTsNCisgICAgaWYgKGxlbiA+IHNpemUpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBzaWduYXR1cmVzLkFkZE5ldygpLkNvcHlGcm9tKGRhdGEsIGxlbik7DQorICAgIGRhdGEgKz0gbGVuOw0KKyAgICBzaXplIC09IGxlbjsNCisgIH0NCisgIHJldHVybiB0cnVlOw0KK30NCisNCisjZW5kaWYgLy8gX1NGWA0KKw0KKyNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisNCitzdGF0aWMgRlN0cmluZyBHZXRCYXNlRm9sZGVyUHJlZml4RnJvbVJlZ2lzdHJ5KCkNCit7DQorICBGU3RyaW5nIG1vZHVsZUZvbGRlclByZWZpeCA9IE5ETEw6OkdldE1vZHVsZURpclByZWZpeCgpOw0KKyAgI2lmZGVmIF9XSU4zMg0KKyAgaWYgKCFORmluZDo6RG9lc0ZpbGVFeGlzdChtb2R1bGVGb2xkZXJQcmVmaXggKyBrTWFpbkRsbCkgJiYNCisgICAgICAhTkZpbmQ6OkRvZXNEaXJFeGlzdChtb2R1bGVGb2xkZXJQcmVmaXggKyBrQ29kZWNzRm9sZGVyTmFtZSkgJiYNCisgICAgICAhTkZpbmQ6OkRvZXNEaXJFeGlzdChtb2R1bGVGb2xkZXJQcmVmaXggKyBrRm9ybWF0c0ZvbGRlck5hbWUpKQ0KKyAgew0KKyAgICBGU3RyaW5nIHBhdGg7DQorICAgIGlmIChSZWFkUGF0aEZyb21SZWdpc3RyeShIS0VZX0NVUlJFTlRfVVNFUiwgIGtQcm9ncmFtUGF0aDJWYWx1ZSwgcGF0aCkpIHJldHVybiBwYXRoOw0KKyAgICBpZiAoUmVhZFBhdGhGcm9tUmVnaXN0cnkoSEtFWV9MT0NBTF9NQUNISU5FLCBrUHJvZ3JhbVBhdGgyVmFsdWUsIHBhdGgpKSByZXR1cm4gcGF0aDsNCisgICAgaWYgKFJlYWRQYXRoRnJvbVJlZ2lzdHJ5KEhLRVlfQ1VSUkVOVF9VU0VSLCAga1Byb2dyYW1QYXRoVmFsdWUsICBwYXRoKSkgcmV0dXJuIHBhdGg7DQorICAgIGlmIChSZWFkUGF0aEZyb21SZWdpc3RyeShIS0VZX0xPQ0FMX01BQ0hJTkUsIGtQcm9ncmFtUGF0aFZhbHVlLCAgcGF0aCkpIHJldHVybiBwYXRoOw0KKyAgfQ0KKyAgI2VuZGlmDQorICByZXR1cm4gbW9kdWxlRm9sZGVyUHJlZml4Ow0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBHZXRDb2RlckNsYXNzKEZ1bmNfR2V0TWV0aG9kUHJvcGVydHkgZ2V0TWV0aG9kUHJvcGVydHksIFVJbnQzMiBpbmRleCwNCisgICAgUFJPUElEIHByb3BJZCwgQ0xTSUQgJmNsc0lkLCBib29sICZpc0Fzc2lnbmVkKQ0KK3sNCisgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgaXNBc3NpZ25lZCA9IGZhbHNlOw0KKyAgUklOT0soZ2V0TWV0aG9kUHJvcGVydHkoaW5kZXgsIHByb3BJZCwgJnByb3ApKTsNCisgIGlmIChwcm9wLnZ0ID09IFZUX0JTVFIpDQorICB7DQorICAgIGlmICg6OlN5c1N0cmluZ0J5dGVMZW4ocHJvcC5ic3RyVmFsKSAhPSBzaXplb2YoR1VJRCkpDQorICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgaXNBc3NpZ25lZCA9IHRydWU7DQorICAgIGNsc0lkID0gKihjb25zdCBHVUlEICopcHJvcC5ic3RyVmFsOw0KKyAgfQ0KKyAgZWxzZSBpZiAocHJvcC52dCAhPSBWVF9FTVBUWSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENDb2RlY3M6OkxvYWRDb2RlY3MoKQ0KK3sNCisgIENDb2RlY0xpYiAmbGliID0gTGlicy5CYWNrKCk7DQorICBsaWIuR2V0TWV0aG9kUHJvcGVydHkgPSAoRnVuY19HZXRNZXRob2RQcm9wZXJ0eSlsaWIuTGliLkdldFByb2MoIkdldE1ldGhvZFByb3BlcnR5Iik7DQorICBpZiAobGliLkdldE1ldGhvZFByb3BlcnR5KQ0KKyAgew0KKyAgICBVSW50MzIgbnVtTWV0aG9kcyA9IDE7DQorICAgIEZ1bmNfR2V0TnVtYmVyT2ZNZXRob2RzIGdldE51bWJlck9mTWV0aG9kc0Z1bmMgPSAoRnVuY19HZXROdW1iZXJPZk1ldGhvZHMpbGliLkxpYi5HZXRQcm9jKCJHZXROdW1iZXJPZk1ldGhvZHMiKTsNCisgICAgaWYgKGdldE51bWJlck9mTWV0aG9kc0Z1bmMpDQorICAgIHsNCisgICAgICBSSU5PSyhnZXROdW1iZXJPZk1ldGhvZHNGdW5jKCZudW1NZXRob2RzKSk7DQorICAgIH0NCisgICAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBudW1NZXRob2RzOyBpKyspDQorICAgIHsNCisgICAgICBDRGxsQ29kZWNJbmZvIGluZm87DQorICAgICAgaW5mby5MaWJJbmRleCA9IExpYnMuU2l6ZSgpIC0gMTsNCisgICAgICBpbmZvLkNvZGVjSW5kZXggPSBpOw0KKyAgICAgIFJJTk9LKEdldENvZGVyQ2xhc3MobGliLkdldE1ldGhvZFByb3BlcnR5LCBpLCBOTWV0aG9kUHJvcElEOjprRW5jb2RlciwgaW5mby5FbmNvZGVyLCBpbmZvLkVuY29kZXJJc0Fzc2lnbmVkKSk7DQorICAgICAgUklOT0soR2V0Q29kZXJDbGFzcyhsaWIuR2V0TWV0aG9kUHJvcGVydHksIGksIE5NZXRob2RQcm9wSUQ6OmtEZWNvZGVyLCBpbmZvLkRlY29kZXIsIGluZm8uRGVjb2RlcklzQXNzaWduZWQpKTsNCisgICAgICBDb2RlY3MuQWRkKGluZm8pOw0KKyAgICB9DQorICB9DQorDQorICBGdW5jX0dldEhhc2hlcnMgZ2V0SGFzaGVycyA9IChGdW5jX0dldEhhc2hlcnMpbGliLkxpYi5HZXRQcm9jKCJHZXRIYXNoZXJzIik7DQorICBpZiAoZ2V0SGFzaGVycykNCisgIHsNCisgICAgUklOT0soZ2V0SGFzaGVycygmbGliLkhhc2hlcnMpKTsNCisgICAgaWYgKGxpYi5IYXNoZXJzKQ0KKyAgICB7DQorICAgICAgVUludDMyIG51bU1ldGhvZHMgPSBsaWIuSGFzaGVycy0+R2V0TnVtSGFzaGVycygpOw0KKyAgICAgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtTWV0aG9kczsgaSsrKQ0KKyAgICAgIHsNCisgICAgICAgIENEbGxIYXNoZXJJbmZvIGluZm87DQorICAgICAgICBpbmZvLkxpYkluZGV4ID0gTGlicy5TaXplKCkgLSAxOw0KKyAgICAgICAgaW5mby5IYXNoZXJJbmRleCA9IGk7DQorICAgICAgICBIYXNoZXJzLkFkZChpbmZvKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBHZXRQcm9wKA0KKyAgICBGdW5jX0dldEhhbmRsZXJQcm9wZXJ0eSBnZXRQcm9wLA0KKyAgICBGdW5jX0dldEhhbmRsZXJQcm9wZXJ0eTIgZ2V0UHJvcDIsDQorICAgIFVJbnQzMiBpbmRleCwgUFJPUElEIHByb3BJRCwgTkNPTTo6Q1Byb3BWYXJpYW50ICZwcm9wKQ0KK3sNCisgIGlmIChnZXRQcm9wMikNCisgICAgcmV0dXJuIGdldFByb3AyKGluZGV4LCBwcm9wSUQsICZwcm9wKTs7DQorICByZXR1cm4gZ2V0UHJvcChwcm9wSUQsICZwcm9wKTsNCit9DQorDQorc3RhdGljIEhSRVNVTFQgR2V0UHJvcF9Cb29sKA0KKyAgICBGdW5jX0dldEhhbmRsZXJQcm9wZXJ0eSBnZXRQcm9wLA0KKyAgICBGdW5jX0dldEhhbmRsZXJQcm9wZXJ0eTIgZ2V0UHJvcDIsDQorICAgIFVJbnQzMiBpbmRleCwgUFJPUElEIHByb3BJRCwgYm9vbCAmcmVzKQ0KK3sNCisgIHJlcyA9IGZhbHNlOw0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBSSU5PSyhHZXRQcm9wKGdldFByb3AsIGdldFByb3AyLCBpbmRleCwgcHJvcElELCBwcm9wKSk7DQorICBpZiAocHJvcC52dCA9PSBWVF9CT09MKQ0KKyAgICByZXMgPSBWQVJJQU5UX0JPT0xUb0Jvb2wocHJvcC5ib29sVmFsKTsNCisgIGVsc2UgaWYgKHByb3AudnQgIT0gVlRfRU1QVFkpDQorICAgIHJldHVybiBFX0ZBSUw7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorc3RhdGljIEhSRVNVTFQgR2V0UHJvcF9VSW50MzIoDQorICAgIEZ1bmNfR2V0SGFuZGxlclByb3BlcnR5IGdldFByb3AsDQorICAgIEZ1bmNfR2V0SGFuZGxlclByb3BlcnR5MiBnZXRQcm9wMiwNCisgICAgVUludDMyIGluZGV4LCBQUk9QSUQgcHJvcElELCBVSW50MzIgJnJlcywgYm9vbCAmZGVmaW5lZCkNCit7DQorICByZXMgPSAwOw0KKyAgZGVmaW5lZCA9IGZhbHNlOw0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBSSU5PSyhHZXRQcm9wKGdldFByb3AsIGdldFByb3AyLCBpbmRleCwgcHJvcElELCBwcm9wKSk7DQorICBpZiAocHJvcC52dCA9PSBWVF9VSTQpDQorICB7DQorICAgIHJlcyA9IHByb3AudWxWYWw7DQorICAgIGRlZmluZWQgPSB0cnVlOw0KKyAgfQ0KKyAgZWxzZSBpZiAocHJvcC52dCAhPSBWVF9FTVBUWSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBHZXRQcm9wX1N0cmluZygNCisgICAgRnVuY19HZXRIYW5kbGVyUHJvcGVydHkgZ2V0UHJvcCwNCisgICAgRnVuY19HZXRIYW5kbGVyUHJvcGVydHkyIGdldFByb3AyLA0KKyAgICBVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIFVTdHJpbmcgJnJlcykNCit7DQorICByZXMuRW1wdHkoKTsNCisgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgUklOT0soR2V0UHJvcChnZXRQcm9wLCBnZXRQcm9wMiwgaW5kZXgsIHByb3BJRCwgcHJvcCkpOw0KKyAgaWYgKHByb3AudnQgPT0gVlRfQlNUUikNCisgICAgcmVzID0gcHJvcC5ic3RyVmFsOw0KKyAgZWxzZSBpZiAocHJvcC52dCAhPSBWVF9FTVBUWSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBHZXRQcm9wX1Jhd0RhdGEoDQorICAgIEZ1bmNfR2V0SGFuZGxlclByb3BlcnR5IGdldFByb3AsDQorICAgIEZ1bmNfR2V0SGFuZGxlclByb3BlcnR5MiBnZXRQcm9wMiwNCisgICAgVUludDMyIGluZGV4LCBQUk9QSUQgcHJvcElELCBDQnl0ZUJ1ZmZlciAmYmIpDQorew0KKyAgYmIuRnJlZSgpOw0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBSSU5PSyhHZXRQcm9wKGdldFByb3AsIGdldFByb3AyLCBpbmRleCwgcHJvcElELCBwcm9wKSk7DQorICBpZiAocHJvcC52dCA9PSBWVF9CU1RSKQ0KKyAgew0KKyAgICBVSU5UIGxlbiA9IDo6U3lzU3RyaW5nQnl0ZUxlbihwcm9wLmJzdHJWYWwpOw0KKyAgICBiYi5Db3B5RnJvbSgoY29uc3QgQnl0ZSAqKXByb3AuYnN0clZhbCwgbGVuKTsNCisgIH0NCisgIGVsc2UgaWYgKHByb3AudnQgIT0gVlRfRU1QVFkpDQorICAgIHJldHVybiBFX0ZBSUw7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrQXJjRmxhZ3NQYXJzW10gPQ0KK3sNCisgIE5BcmNoaXZlOjpOSGFuZGxlclByb3BJRDo6a0tlZXBOYW1lLCBOQXJjSW5mb0ZsYWdzOjprS2VlcE5hbWUsDQorICBOQXJjaGl2ZTo6TkhhbmRsZXJQcm9wSUQ6OmtBbHRTdHJlYW1zLCBOQXJjSW5mb0ZsYWdzOjprQWx0U3RyZWFtcywNCisgIE5BcmNoaXZlOjpOSGFuZGxlclByb3BJRDo6a050U2VjdXJlLCBOQXJjSW5mb0ZsYWdzOjprTnRTZWN1cmUNCit9Ow0KKw0KK0hSRVNVTFQgQ0NvZGVjczo6TG9hZEZvcm1hdHMoKQ0KK3sNCisgIGNvbnN0IE5ETEw6OkNMaWJyYXJ5ICZsaWIgPSBMaWJzLkJhY2soKS5MaWI7DQorICANCisgIEZ1bmNfR2V0SGFuZGxlclByb3BlcnR5IGdldFByb3AgPSBOVUxMOw0KKyAgRnVuY19HZXRIYW5kbGVyUHJvcGVydHkyIGdldFByb3AyID0gKEZ1bmNfR2V0SGFuZGxlclByb3BlcnR5MilsaWIuR2V0UHJvYygiR2V0SGFuZGxlclByb3BlcnR5MiIpOw0KKyAgRnVuY19HZXRJc0FyYyBnZXRJc0FyYyA9IChGdW5jX0dldElzQXJjKWxpYi5HZXRQcm9jKCJHZXRJc0FyYyIpOw0KKyAgDQorICBVSW50MzIgbnVtRm9ybWF0cyA9IDE7DQorDQorICBpZiAoZ2V0UHJvcDIpDQorICB7DQorICAgIEZ1bmNfR2V0TnVtYmVyT2ZGb3JtYXRzIGdldE51bWJlck9mRm9ybWF0cyA9IChGdW5jX0dldE51bWJlck9mRm9ybWF0cylsaWIuR2V0UHJvYygiR2V0TnVtYmVyT2ZGb3JtYXRzIik7DQorICAgIGlmIChnZXROdW1iZXJPZkZvcm1hdHMpDQorICAgIHsNCisgICAgICBSSU5PSyhnZXROdW1iZXJPZkZvcm1hdHMoJm51bUZvcm1hdHMpKTsNCisgICAgfQ0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBnZXRQcm9wID0gKEZ1bmNfR2V0SGFuZGxlclByb3BlcnR5KWxpYi5HZXRQcm9jKCJHZXRIYW5kbGVyUHJvcGVydHkiKTsNCisgICAgaWYgKCFnZXRQcm9wKQ0KKyAgICAgIHJldHVybiBTX09LOw0KKyAgfQ0KKyAgDQorICBmb3IgKFVJbnQzMiBpID0gMDsgaSA8IG51bUZvcm1hdHM7IGkrKykNCisgIHsNCisgICAgQ0FyY0luZm9FeCBpdGVtOw0KKyAgICBpdGVtLkxpYkluZGV4ID0gTGlicy5TaXplKCkgLSAxOw0KKyAgICBpdGVtLkZvcm1hdEluZGV4ID0gaTsNCisNCisgICAgUklOT0soR2V0UHJvcF9TdHJpbmcoZ2V0UHJvcCwgZ2V0UHJvcDIsIGksIE5BcmNoaXZlOjpOSGFuZGxlclByb3BJRDo6a05hbWUsIGl0ZW0uTmFtZSkpOw0KKw0KKyAgICB7DQorICAgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgICAgaWYgKEdldFByb3AoZ2V0UHJvcCwgZ2V0UHJvcDIsIGksIE5BcmNoaXZlOjpOSGFuZGxlclByb3BJRDo6a0NsYXNzSUQsIHByb3ApICE9IFNfT0spDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBpZiAocHJvcC52dCAhPSBWVF9CU1RSKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgaWYgKDo6U3lzU3RyaW5nQnl0ZUxlbihwcm9wLmJzdHJWYWwpICE9IHNpemVvZihHVUlEKSkNCisgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgaXRlbS5DbGFzc0lEID0gKihjb25zdCBHVUlEICopcHJvcC5ic3RyVmFsOw0KKyAgICAgIHByb3AuQ2xlYXIoKTsNCisgICAgfQ0KKw0KKyAgICBVU3RyaW5nIGV4dCwgYWRkRXh0Ow0KKyAgICBSSU5PSyhHZXRQcm9wX1N0cmluZyhnZXRQcm9wLCBnZXRQcm9wMiwgaSwgTkFyY2hpdmU6Ok5IYW5kbGVyUHJvcElEOjprRXh0ZW5zaW9uLCBleHQpKTsNCisgICAgUklOT0soR2V0UHJvcF9TdHJpbmcoZ2V0UHJvcCwgZ2V0UHJvcDIsIGksIE5BcmNoaXZlOjpOSGFuZGxlclByb3BJRDo6a0FkZEV4dGVuc2lvbiwgYWRkRXh0KSk7DQorICAgIGl0ZW0uQWRkRXh0cyhleHQsIGFkZEV4dCk7DQorDQorICAgIEdldFByb3BfQm9vbChnZXRQcm9wLCBnZXRQcm9wMiwgaSwgTkFyY2hpdmU6Ok5IYW5kbGVyUHJvcElEOjprVXBkYXRlLCBpdGVtLlVwZGF0ZUVuYWJsZWQpOw0KKyAgICBib29sIGZsYWdzX0RlZmluZWQgPSBmYWxzZTsNCisgICAgUklOT0soR2V0UHJvcF9VSW50MzIoZ2V0UHJvcCwgZ2V0UHJvcDIsIGksIE5BcmNoaXZlOjpOSGFuZGxlclByb3BJRDo6a0ZsYWdzLCBpdGVtLkZsYWdzLCBmbGFnc19EZWZpbmVkKSk7DQorICAgIGl0ZW0uTmV3SW50ZXJmYWNlID0gZmxhZ3NfRGVmaW5lZDsNCisgICAgaWYgKCFmbGFnc19EZWZpbmVkKSAvLyAmJiBpdGVtLlVwZGF0ZUVuYWJsZWQNCisgICAgew0KKyAgICAgIC8vIHN1cHBvcnQgZm9yIERMTCB2ZXJzaW9uIGJlZm9yZSA5LjMxOg0KKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBBUlJBWV9TSVpFKGtBcmNGbGFnc1BhcnMpOyBqICs9IDIpDQorICAgICAgew0KKyAgICAgICAgYm9vbCB2YWwgPSBmYWxzZTsNCisgICAgICAgIEdldFByb3BfQm9vbChnZXRQcm9wLCBnZXRQcm9wMiwgaSwga0FyY0ZsYWdzUGFyc1tqXSwgdmFsKTsNCisgICAgICAgIGlmICh2YWwpDQorICAgICAgICAgIGl0ZW0uRmxhZ3MgfD0ga0FyY0ZsYWdzUGFyc1tqICsgMV07DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBDQnl0ZUJ1ZmZlciBzaWc7DQorICAgIFJJTk9LKEdldFByb3BfUmF3RGF0YShnZXRQcm9wLCBnZXRQcm9wMiwgaSwgTkFyY2hpdmU6Ok5IYW5kbGVyUHJvcElEOjprU2lnbmF0dXJlLCBzaWcpKTsNCisgICAgaWYgKHNpZy5TaXplKCkgIT0gMCkNCisgICAgICBpdGVtLlNpZ25hdHVyZXMuQWRkKHNpZyk7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIFJJTk9LKEdldFByb3BfUmF3RGF0YShnZXRQcm9wLCBnZXRQcm9wMiwgaSwgTkFyY2hpdmU6Ok5IYW5kbGVyUHJvcElEOjprTXVsdGlTaWduYXR1cmUsIHNpZykpOw0KKyAgICAgIFBhcnNlU2lnbmF0dXJlcyhzaWcsICh1bnNpZ25lZClzaWcuU2l6ZSgpLCBpdGVtLlNpZ25hdHVyZXMpOw0KKyAgICB9DQorDQorICAgIGJvb2wgc2lnbmF0dXJlT2Zmc2V0X0RlZmluZWQ7DQorICAgIFJJTk9LKEdldFByb3BfVUludDMyKGdldFByb3AsIGdldFByb3AyLCBpLCBOQXJjaGl2ZTo6TkhhbmRsZXJQcm9wSUQ6OmtTaWduYXR1cmVPZmZzZXQsIGl0ZW0uU2lnbmF0dXJlT2Zmc2V0LCBzaWduYXR1cmVPZmZzZXRfRGVmaW5lZCkpOw0KKyAgICANCisgICAgLy8gYm9vbCB2ZXJzaW9uX0RlZmluZWQ7DQorICAgIC8vIFJJTk9LKEdldFByb3BfVUludDMyKGdldFByb3AsIGdldFByb3AyLCBpLCBOQXJjaGl2ZTo6TkhhbmRsZXJQcm9wSUQ6OmtWZXJzaW9uLCBpdGVtLlZlcnNpb24sIHZlcnNpb25fRGVmaW5lZCkpOw0KKw0KKyAgICBpZiAoZ2V0SXNBcmMpDQorICAgICAgZ2V0SXNBcmMoaSwgJml0ZW0uSXNBcmNGdW5jKTsNCisNCisgICAgRm9ybWF0cy5BZGQoaXRlbSk7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorI2lmZGVmIE5FV19GT0xERVJfSU5URVJGQUNFDQordm9pZCBDQ29kZWNJY29uczo6TG9hZEljb25zKEhNT0RVTEUgbSkNCit7DQorICBVU3RyaW5nIGljb25UeXBlczsNCisgIE15TG9hZFN0cmluZyhtLCBrSWNvblR5cGVzUmVzSWQsIGljb25UeXBlcyk7DQorICBVU3RyaW5nVmVjdG9yIHBhaXJzOw0KKyAgU3BsaXRTdHJpbmcoaWNvblR5cGVzLCBwYWlycyk7DQorICBGT1JfVkVDVE9SIChpLCBwYWlycykNCisgIHsNCisgICAgY29uc3QgVVN0cmluZyAmcyA9IHBhaXJzW2ldOw0KKyAgICBpbnQgcG9zID0gcy5GaW5kKEwnOicpOw0KKyAgICBDSWNvblBhaXIgaWNvblBhaXI7DQorICAgIGljb25QYWlyLkljb25JbmRleCA9IC0xOw0KKyAgICBpZiAocG9zIDwgMCkNCisgICAgICBwb3MgPSBzLkxlbigpOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBVU3RyaW5nIG51bSA9IHMuUHRyKHBvcyArIDEpOw0KKyAgICAgIGlmICghbnVtLklzRW1wdHkoKSkNCisgICAgICB7DQorICAgICAgICBjb25zdCB3Y2hhcl90ICplbmQ7DQorICAgICAgICBpY29uUGFpci5JY29uSW5kZXggPSBDb252ZXJ0U3RyaW5nVG9VSW50MzIobnVtLCAmZW5kKTsNCisgICAgICAgIGlmICgqZW5kICE9IDApDQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpY29uUGFpci5FeHQgPSBzLkxlZnQocG9zKTsNCisgICAgSWNvblBhaXJzLkFkZChpY29uUGFpcik7DQorICB9DQorfQ0KKw0KK2Jvb2wgQ0NvZGVjSWNvbnM6OkZpbmRJY29uSW5kZXgoY29uc3QgVVN0cmluZyAmZXh0LCBpbnQgJmljb25JbmRleCkgY29uc3QNCit7DQorICBpY29uSW5kZXggPSAtMTsNCisgIEZPUl9WRUNUT1IgKGksIEljb25QYWlycykNCisgIHsNCisgICAgY29uc3QgQ0ljb25QYWlyICZwYWlyID0gSWNvblBhaXJzW2ldOw0KKyAgICBpZiAoZXh0LklzRXF1YWxUb05vQ2FzZShwYWlyLkV4dCkpDQorICAgIHsNCisgICAgICBpY29uSW5kZXggPSBwYWlyLkljb25JbmRleDsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCisjZW5kaWYgLy8gRVhURVJOQUxfQ09ERUNTDQorDQorI2lmZGVmIF83WklQX0xBUkdFX1BBR0VTDQorZXh0ZXJuICJDIg0KK3sNCisgIGV4dGVybiBTSVpFX1QgZ19MYXJnZVBhZ2VTaXplOw0KK30NCisjZW5kaWYNCisNCitIUkVTVUxUIENDb2RlY3M6OkxvYWREbGwoY29uc3QgRlN0cmluZyAmZGxsUGF0aCwgYm9vbCBuZWVkQ2hlY2tEbGwpDQorew0KKyAgaWYgKG5lZWRDaGVja0RsbCkNCisgIHsNCisgICAgTkRMTDo6Q0xpYnJhcnkgbGlicmFyeTsNCisgICAgaWYgKCFsaWJyYXJ5LkxvYWRFeChkbGxQYXRoLCBMT0FEX0xJQlJBUllfQVNfREFUQUZJTEUpKQ0KKyAgICAgIHJldHVybiBTX09LOw0KKyAgfQ0KKyAgTGlicy5BZGQoQ0NvZGVjTGliKCkpOw0KKyAgQ0NvZGVjTGliICZsaWIgPSBMaWJzLkJhY2soKTsNCisgIGxpYi5QYXRoID0gZGxsUGF0aDsNCisgIGJvb2wgdXNlZCA9IGZhbHNlOw0KKyAgSFJFU1VMVCByZXMgPSBTX09LOw0KKyAgaWYgKGxpYi5MaWIuTG9hZChkbGxQYXRoKSkNCisgIHsNCisgICAgI2lmZGVmIE5FV19GT0xERVJfSU5URVJGQUNFDQorICAgIGxpYi5Mb2FkSWNvbnMoKTsNCisgICAgI2VuZGlmDQorDQorICAgICNpZmRlZiBfN1pJUF9MQVJHRV9QQUdFUw0KKyAgICBpZiAoZ19MYXJnZVBhZ2VTaXplICE9IDApDQorICAgIHsNCisgICAgICBGdW5jX1NldExhcmdlUGFnZU1vZGUgc2V0TGFyZ2VQYWdlTW9kZSA9IChGdW5jX1NldExhcmdlUGFnZU1vZGUpbGliLkxpYi5HZXRQcm9jKCJTZXRMYXJnZVBhZ2VNb2RlIik7DQorICAgICAgaWYgKHNldExhcmdlUGFnZU1vZGUpDQorICAgICAgICBzZXRMYXJnZVBhZ2VNb2RlKCk7DQorICAgIH0NCisgICAgI2VuZGlmDQorDQorICAgIGlmIChDYXNlU2Vuc2l0aXZlQ2hhbmdlKQ0KKyAgICB7DQorICAgICAgRnVuY19TZXRDYXNlU2Vuc2l0aXZlIHNldENhc2VTZW5zaXRpdmUgPSAoRnVuY19TZXRDYXNlU2Vuc2l0aXZlKWxpYi5MaWIuR2V0UHJvYygiU2V0Q2FzZVNlbnNpdGl2ZSIpOw0KKyAgICAgIGlmIChzZXRDYXNlU2Vuc2l0aXZlKQ0KKyAgICAgICAgc2V0Q2FzZVNlbnNpdGl2ZShDYXNlU2Vuc2l0aXZlID8gMSA6IDApOw0KKyAgICB9DQorDQorICAgIGxpYi5DcmVhdGVPYmplY3QgPSAoRnVuY19DcmVhdGVPYmplY3QpbGliLkxpYi5HZXRQcm9jKCJDcmVhdGVPYmplY3QiKTsNCisgICAgaWYgKGxpYi5DcmVhdGVPYmplY3QpDQorICAgIHsNCisgICAgICB1bnNpZ25lZCBzdGFydFNpemUgPSBDb2RlY3MuU2l6ZSgpICsgSGFzaGVycy5TaXplKCk7DQorICAgICAgcmVzID0gTG9hZENvZGVjcygpOw0KKyAgICAgIHVzZWQgPSAoc3RhcnRTaXplICE9IENvZGVjcy5TaXplKCkgKyBIYXNoZXJzLlNpemUoKSk7DQorICAgICAgaWYgKHJlcyA9PSBTX09LKQ0KKyAgICAgIHsNCisgICAgICAgIHN0YXJ0U2l6ZSA9IEZvcm1hdHMuU2l6ZSgpOw0KKyAgICAgICAgcmVzID0gTG9hZEZvcm1hdHMoKTsNCisgICAgICAgIGlmIChzdGFydFNpemUgIT0gRm9ybWF0cy5TaXplKCkpDQorICAgICAgICAgIHVzZWQgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCF1c2VkKQ0KKyAgICBMaWJzLkRlbGV0ZUJhY2soKTsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK0hSRVNVTFQgQ0NvZGVjczo6TG9hZERsbHNGcm9tRm9sZGVyKGNvbnN0IEZTdHJpbmcgJmZvbGRlclByZWZpeCkNCit7DQorICBORmlsZTo6TkZpbmQ6OkNFbnVtZXJhdG9yIGVudW1lcmF0b3IoZm9sZGVyUHJlZml4ICsgRkNIQVJfQU5ZX01BU0spOw0KKyAgTkZpbGU6Ok5GaW5kOjpDRmlsZUluZm8gZmk7DQorICB3aGlsZSAoZW51bWVyYXRvci5OZXh0KGZpKSkNCisgIHsNCisgICAgaWYgKGZpLklzRGlyKCkpDQorICAgICAgY29udGludWU7DQorICAgIFJJTk9LKExvYWREbGwoZm9sZGVyUHJlZml4ICsgZmkuTmFtZSwgdHJ1ZSkpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKyNlbmRpZg0KKw0KK0hSRVNVTFQgQ0NvZGVjczo6TG9hZCgpDQorew0KKyAgI2lmZGVmIE5FV19GT0xERVJfSU5URVJGQUNFDQorICAgIEludGVybmFsSWNvbnMuTG9hZEljb25zKGdfaEluc3RhbmNlKTsNCisgICNlbmRpZg0KKw0KKyAgRm9ybWF0cy5DbGVhcigpOw0KKyAgDQorICAjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorICAgIENvZGVjcy5DbGVhcigpOw0KKyAgICBIYXNoZXJzLkNsZWFyKCk7DQorICAjZW5kaWYNCisgIA0KKyAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBnX051bUFyY3M7IGkrKykNCisgIHsNCisgICAgY29uc3QgQ0FyY0luZm8gJmFyYyA9ICpnX0FyY3NbaV07DQorICAgIENBcmNJbmZvRXggaXRlbTsNCisgICAgDQorICAgIGl0ZW0uTmFtZS5TZXRGcm9tQXNjaWkoYXJjLk5hbWUpOw0KKyAgICBpdGVtLkNyZWF0ZUluQXJjaGl2ZSA9IGFyYy5DcmVhdGVJbkFyY2hpdmU7DQorICAgIGl0ZW0uSXNBcmNGdW5jID0gYXJjLklzQXJjOw0KKyAgICBpdGVtLkZsYWdzID0gYXJjLkZsYWdzOw0KKyAgDQorICAgIHsNCisgICAgICBVU3RyaW5nIGUsIGFlOw0KKyAgICAgIGlmIChhcmMuRXh0KQ0KKyAgICAgICAgZS5TZXRGcm9tQXNjaWkoYXJjLkV4dCk7DQorICAgICAgaWYgKGFyYy5BZGRFeHQpDQorICAgICAgICBhZS5TZXRGcm9tQXNjaWkoYXJjLkFkZEV4dCk7DQorICAgICAgaXRlbS5BZGRFeHRzKGUsIGFlKTsNCisgICAgfQ0KKw0KKyAgICAjaWZuZGVmIF9TRlgNCisNCisgICAgaXRlbS5DcmVhdGVPdXRBcmNoaXZlID0gYXJjLkNyZWF0ZU91dEFyY2hpdmU7DQorICAgIGl0ZW0uVXBkYXRlRW5hYmxlZCA9IChhcmMuQ3JlYXRlT3V0QXJjaGl2ZSAhPSBOVUxMKTsNCisgICAgaXRlbS5TaWduYXR1cmVPZmZzZXQgPSBhcmMuU2lnbmF0dXJlT2Zmc2V0Ow0KKyAgICAvLyBpdGVtLlZlcnNpb24gPSBNWV9WRVJfTUlYOw0KKyAgICBpdGVtLk5ld0ludGVyZmFjZSA9IHRydWU7DQorICAgIA0KKyAgICBpZiAoYXJjLklzTXVsdGlTaWduYXR1cmUoKSkNCisgICAgICBQYXJzZVNpZ25hdHVyZXMoYXJjLlNpZ25hdHVyZSwgYXJjLlNpZ25hdHVyZVNpemUsIGl0ZW0uU2lnbmF0dXJlcyk7DQorICAgIGVsc2UNCisgICAgICBpdGVtLlNpZ25hdHVyZXMuQWRkTmV3KCkuQ29weUZyb20oYXJjLlNpZ25hdHVyZSwgYXJjLlNpZ25hdHVyZVNpemUpOw0KKyAgICANCisgICAgI2VuZGlmDQorDQorICAgIEZvcm1hdHMuQWRkKGl0ZW0pOw0KKyAgfQ0KKyAgDQorICAjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorICAgIGNvbnN0IEZTdHJpbmcgYmFzZUZvbGRlciA9IEdldEJhc2VGb2xkZXJQcmVmaXhGcm9tUmVnaXN0cnkoKTsNCisgICAgUklOT0soTG9hZERsbChiYXNlRm9sZGVyICsga01haW5EbGwsIGZhbHNlKSk7DQorICAgIFJJTk9LKExvYWREbGxzRnJvbUZvbGRlcihiYXNlRm9sZGVyICsga0NvZGVjc0ZvbGRlck5hbWUgRlNUUklOR19QQVRIX1NFUEFSQVRPUikpOw0KKyAgICBSSU5PSyhMb2FkRGxsc0Zyb21Gb2xkZXIoYmFzZUZvbGRlciArIGtGb3JtYXRzRm9sZGVyTmFtZSBGU1RSSU5HX1BBVEhfU0VQQVJBVE9SKSk7DQorICAjZW5kaWYNCisgIA0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKyNpZm5kZWYgX1NGWA0KKw0KK2ludCBDQ29kZWNzOjpGaW5kRm9ybWF0Rm9yQXJjaGl2ZU5hbWUoY29uc3QgVVN0cmluZyAmYXJjUGF0aCkgY29uc3QNCit7DQorICBpbnQgc2xhc2hQb3MgPSBhcmNQYXRoLlJldmVyc2VGaW5kKFdDSEFSX1BBVEhfU0VQQVJBVE9SKTsNCisgIGludCBkb3RQb3MgPSBhcmNQYXRoLlJldmVyc2VGaW5kKEwnLicpOw0KKyAgaWYgKGRvdFBvcyA8IDAgfHwgZG90UG9zIDwgc2xhc2hQb3MpDQorICAgIHJldHVybiAtMTsNCisgIGNvbnN0IFVTdHJpbmcgZXh0ID0gYXJjUGF0aC5QdHIoZG90UG9zICsgMSk7DQorICBpZiAoZXh0LklzRW1wdHkoKSkNCisgICAgcmV0dXJuIC0xOw0KKyAgaWYgKGV4dC5Jc0VxdWFsVG9Ob0Nhc2UoTCJleGUiKSkNCisgICAgcmV0dXJuIC0xOw0KKyAgRk9SX1ZFQ1RPUiAoaSwgRm9ybWF0cykNCisgIHsNCisgICAgY29uc3QgQ0FyY0luZm9FeCAmYXJjID0gRm9ybWF0c1tpXTsNCisgICAgLyoNCisgICAgaWYgKCFhcmMuVXBkYXRlRW5hYmxlZCkNCisgICAgICBjb250aW51ZTsNCisgICAgKi8NCisgICAgaWYgKGFyYy5GaW5kRXh0ZW5zaW9uKGV4dCkgPj0gMCkNCisgICAgICByZXR1cm4gaTsNCisgIH0NCisgIHJldHVybiAtMTsNCit9DQorDQoraW50IENDb2RlY3M6OkZpbmRGb3JtYXRGb3JFeHRlbnNpb24oY29uc3QgVVN0cmluZyAmZXh0KSBjb25zdA0KK3sNCisgIGlmIChleHQuSXNFbXB0eSgpKQ0KKyAgICByZXR1cm4gLTE7DQorICBGT1JfVkVDVE9SIChpLCBGb3JtYXRzKQ0KKyAgICBpZiAoRm9ybWF0c1tpXS5GaW5kRXh0ZW5zaW9uKGV4dCkgPj0gMCkNCisgICAgICByZXR1cm4gaTsNCisgIHJldHVybiAtMTsNCit9DQorDQoraW50IENDb2RlY3M6OkZpbmRGb3JtYXRGb3JBcmNoaXZlVHlwZShjb25zdCBVU3RyaW5nICZhcmNUeXBlKSBjb25zdA0KK3sNCisgIEZPUl9WRUNUT1IgKGksIEZvcm1hdHMpDQorICAgIGlmIChGb3JtYXRzW2ldLk5hbWUuSXNFcXVhbFRvTm9DYXNlKGFyY1R5cGUpKQ0KKyAgICAgIHJldHVybiBpOw0KKyAgcmV0dXJuIC0xOw0KK30NCisNCitib29sIENDb2RlY3M6OkZpbmRGb3JtYXRGb3JBcmNoaXZlVHlwZShjb25zdCBVU3RyaW5nICZhcmNUeXBlLCBDSW50VmVjdG9yICZmb3JtYXRJbmRpY2VzKSBjb25zdA0KK3sNCisgIGZvcm1hdEluZGljZXMuQ2xlYXIoKTsNCisgIGZvciAodW5zaWduZWQgcG9zID0gMDsgcG9zIDwgYXJjVHlwZS5MZW4oKTspDQorICB7DQorICAgIGludCBwb3MyID0gYXJjVHlwZS5GaW5kKCcuJywgcG9zKTsNCisgICAgaWYgKHBvczIgPCAwKQ0KKyAgICAgIHBvczIgPSBhcmNUeXBlLkxlbigpOw0KKyAgICBjb25zdCBVU3RyaW5nIG5hbWUgPSBhcmNUeXBlLk1pZChwb3MsIHBvczIgLSBwb3MpOw0KKyAgICBpZiAobmFtZS5Jc0VtcHR5KCkpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBpbnQgaW5kZXggPSBGaW5kRm9ybWF0Rm9yQXJjaGl2ZVR5cGUobmFtZSk7DQorICAgIGlmIChpbmRleCA8IDAgJiYgbmFtZSAhPSBMIioiKQ0KKyAgICB7DQorICAgICAgZm9ybWF0SW5kaWNlcy5DbGVhcigpOw0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgICBmb3JtYXRJbmRpY2VzLkFkZChpbmRleCk7DQorICAgIHBvcyA9IHBvczIgKyAxOw0KKyAgfQ0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KKyNlbmRpZiAvLyBfU0ZYDQorDQorDQorI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKw0KKy8vICNkZWZpbmUgRVhQT1JUX0NPREVDUw0KKw0KKyNpZmRlZiBFWFBPUlRfQ09ERUNTDQorDQorZXh0ZXJuIHVuc2lnbmVkIGdfTnVtQ29kZWNzOw0KK1NUREFQSSBDcmVhdGVDb2RlcjIoYm9vbCBlbmNvZGUsIFVJbnQzMiBpbmRleCwgY29uc3QgR1VJRCAqaWlkLCB2b2lkICoqb3V0T2JqZWN0KTsNCitTVERBUEkgR2V0TWV0aG9kUHJvcGVydHkoVUludDMyIGNvZGVjSW5kZXgsIFBST1BJRCBwcm9wSUQsIFBST1BWQVJJQU5UICp2YWx1ZSk7DQorI2RlZmluZSBOVU1fRVhQT1JUX0NPREVDUyBnX051bUNvZGVjcw0KKw0KK2V4dGVybiB1bnNpZ25lZCBnX051bUhhc2hlcnM7DQorU1REQVBJIENyZWF0ZUhhc2hlcihVSW50MzIgaW5kZXgsIElIYXNoZXIgKipoYXNoZXIpOw0KK1NUREFQSSBHZXRIYXNoZXJQcm9wKFVJbnQzMiBjb2RlY0luZGV4LCBQUk9QSUQgcHJvcElELCBQUk9QVkFSSUFOVCAqdmFsdWUpOw0KKyNkZWZpbmUgTlVNX0VYUE9SVF9IQVNIRVJTIGdfTnVtSGFzaGVycw0KKw0KKyNlbHNlIC8vIEVYUE9SVF9DT0RFQ1MNCisNCisjZGVmaW5lIE5VTV9FWFBPUlRfQ09ERUNTIDANCisjZGVmaW5lIE5VTV9FWFBPUlRfSEFTSEVSUyAwDQorDQorI2VuZGlmIC8vIEVYUE9SVF9DT0RFQ1MNCisNCitTVERNRVRIT0RJTVAgQ0NvZGVjczo6R2V0TnVtYmVyT2ZNZXRob2RzKFVJbnQzMiAqbnVtTWV0aG9kcykNCit7DQorICAqbnVtTWV0aG9kcyA9IE5VTV9FWFBPUlRfQ09ERUNTDQorICAgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisgICAgKyBDb2RlY3MuU2l6ZSgpDQorICAgICNlbmRpZg0KKyAgICA7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENDb2RlY3M6OkdldFByb3BlcnR5KFVJbnQzMiBpbmRleCwgUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKQ0KK3sNCisgICNpZmRlZiBFWFBPUlRfQ09ERUNTDQorICBpZiAoaW5kZXggPCBnX051bUNvZGVjcykNCisgICAgcmV0dXJuIEdldE1ldGhvZFByb3BlcnR5KGluZGV4LCBwcm9wSUQsIHZhbHVlKTsNCisgICNlbmRpZg0KKw0KKyAgI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKyAgY29uc3QgQ0RsbENvZGVjSW5mbyAmY2kgPSBDb2RlY3NbaW5kZXggLSBOVU1fRVhQT1JUX0NPREVDU107DQorDQorICBpZiAocHJvcElEID09IE5NZXRob2RQcm9wSUQ6OmtEZWNvZGVySXNBc3NpZ25lZCB8fA0KKyAgICAgIHByb3BJRCA9PSBOTWV0aG9kUHJvcElEOjprRW5jb2RlcklzQXNzaWduZWQpDQorICB7DQorICAgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgICBwcm9wID0gKHByb3BJRCA9PSBOTWV0aG9kUHJvcElEOjprRGVjb2RlcklzQXNzaWduZWQpID8NCisgICAgICAgIGNpLkRlY29kZXJJc0Fzc2lnbmVkIDoNCisgICAgICAgIGNpLkVuY29kZXJJc0Fzc2lnbmVkOw0KKyAgICBwcm9wLkRldGFjaCh2YWx1ZSk7DQorICAgIHJldHVybiBTX09LOw0KKyAgfQ0KKyAgcmV0dXJuIExpYnNbY2kuTGliSW5kZXhdLkdldE1ldGhvZFByb3BlcnR5KGNpLkNvZGVjSW5kZXgsIHByb3BJRCwgdmFsdWUpOw0KKyAgI2Vsc2UNCisgIHJldHVybiBFX0ZBSUw7DQorICAjZW5kaWYNCit9DQorDQorU1RETUVUSE9ESU1QIENDb2RlY3M6OkNyZWF0ZURlY29kZXIoVUludDMyIGluZGV4LCBjb25zdCBHVUlEICppaWQsIHZvaWQgKipjb2RlcikNCit7DQorICAjaWZkZWYgRVhQT1JUX0NPREVDUw0KKyAgaWYgKGluZGV4IDwgZ19OdW1Db2RlY3MpDQorICAgIHJldHVybiBDcmVhdGVDb2RlcjIoZmFsc2UsIGluZGV4LCBpaWQsIGNvZGVyKTsNCisgICNlbmRpZg0KKyAgI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKyAgY29uc3QgQ0RsbENvZGVjSW5mbyAmY2kgPSBDb2RlY3NbaW5kZXggLSBOVU1fRVhQT1JUX0NPREVDU107DQorICBpZiAoY2kuRGVjb2RlcklzQXNzaWduZWQpDQorICAgIHJldHVybiBMaWJzW2NpLkxpYkluZGV4XS5DcmVhdGVPYmplY3QoJmNpLkRlY29kZXIsIGlpZCwgKHZvaWQgKiopY29kZXIpOw0KKyAgcmV0dXJuIFNfT0s7DQorICAjZWxzZQ0KKyAgcmV0dXJuIEVfRkFJTDsNCisgICNlbmRpZg0KK30NCisNCitTVERNRVRIT0RJTVAgQ0NvZGVjczo6Q3JlYXRlRW5jb2RlcihVSW50MzIgaW5kZXgsIGNvbnN0IEdVSUQgKmlpZCwgdm9pZCAqKmNvZGVyKQ0KK3sNCisgICNpZmRlZiBFWFBPUlRfQ09ERUNTDQorICBpZiAoaW5kZXggPCBnX051bUNvZGVjcykNCisgICAgcmV0dXJuIENyZWF0ZUNvZGVyMih0cnVlLCBpbmRleCwgaWlkLCBjb2Rlcik7DQorICAjZW5kaWYNCisgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisgIGNvbnN0IENEbGxDb2RlY0luZm8gJmNpID0gQ29kZWNzW2luZGV4IC0gTlVNX0VYUE9SVF9DT0RFQ1NdOw0KKyAgaWYgKGNpLkVuY29kZXJJc0Fzc2lnbmVkKQ0KKyAgICByZXR1cm4gTGlic1tjaS5MaWJJbmRleF0uQ3JlYXRlT2JqZWN0KCZjaS5FbmNvZGVyLCBpaWQsICh2b2lkICoqKWNvZGVyKTsNCisgIHJldHVybiBTX09LOw0KKyAgI2Vsc2UNCisgIHJldHVybiBFX0ZBSUw7DQorICAjZW5kaWYNCit9DQorDQorDQorU1RETUVUSE9ESU1QXyhVSW50MzIpIENDb2RlY3M6OkdldE51bUhhc2hlcnMoKQ0KK3sNCisgIHJldHVybiBOVU1fRVhQT1JUX0hBU0hFUlMNCisgICAgI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKyAgICArIEhhc2hlcnMuU2l6ZSgpDQorICAgICNlbmRpZg0KKyAgICA7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQ29kZWNzOjpHZXRIYXNoZXJQcm9wKFVJbnQzMiBpbmRleCwgUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKQ0KK3sNCisgICNpZmRlZiBFWFBPUlRfQ09ERUNTDQorICBpZiAoaW5kZXggPCBnX051bUhhc2hlcnMpDQorICAgIHJldHVybiA6OkdldEhhc2hlclByb3AoaW5kZXgsIHByb3BJRCwgdmFsdWUpOw0KKyAgI2VuZGlmDQorDQorICAjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorICBjb25zdCBDRGxsSGFzaGVySW5mbyAmY2kgPSBIYXNoZXJzW2luZGV4IC0gTlVNX0VYUE9SVF9IQVNIRVJTXTsNCisgIHJldHVybiBMaWJzW2NpLkxpYkluZGV4XS5IYXNoZXJzLT5HZXRIYXNoZXJQcm9wKGNpLkhhc2hlckluZGV4LCBwcm9wSUQsIHZhbHVlKTsNCisgICNlbHNlDQorICByZXR1cm4gRV9GQUlMOw0KKyAgI2VuZGlmDQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQ29kZWNzOjpDcmVhdGVIYXNoZXIoVUludDMyIGluZGV4LCBJSGFzaGVyICoqaGFzaGVyKQ0KK3sNCisgICNpZmRlZiBFWFBPUlRfQ09ERUNTDQorICBpZiAoaW5kZXggPCBnX051bUhhc2hlcnMpDQorICAgIHJldHVybiBDcmVhdGVIYXNoZXIoaW5kZXgsIGhhc2hlcik7DQorICAjZW5kaWYNCisgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisgIGNvbnN0IENEbGxIYXNoZXJJbmZvICZjaSA9IEhhc2hlcnNbaW5kZXggLSBOVU1fRVhQT1JUX0hBU0hFUlNdOw0KKyAgcmV0dXJuIExpYnNbY2kuTGliSW5kZXhdLkhhc2hlcnMtPkNyZWF0ZUhhc2hlcihjaS5IYXNoZXJJbmRleCwgaGFzaGVyKTsNCisgICNlbHNlDQorICByZXR1cm4gRV9GQUlMOw0KKyAgI2VuZGlmDQorfQ0KKw0KK2ludCBDQ29kZWNzOjpHZXRDb2RlY0xpYkluZGV4KFVJbnQzMiBpbmRleCkNCit7DQorICAjaWZkZWYgRVhQT1JUX0NPREVDUw0KKyAgaWYgKGluZGV4IDwgZ19OdW1Db2RlY3MpDQorICAgIHJldHVybiAtMTsNCisgICNlbmRpZg0KKyAgI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKyAgY29uc3QgQ0RsbENvZGVjSW5mbyAmY2kgPSBDb2RlY3NbaW5kZXggLSBOVU1fRVhQT1JUX0NPREVDU107DQorICByZXR1cm4gY2kuTGliSW5kZXg7DQorICAjZWxzZQ0KKyAgcmV0dXJuIC0xOw0KKyAgI2VuZGlmDQorfQ0KKw0KK2ludCBDQ29kZWNzOjpHZXRIYXNoZXJMaWJJbmRleChVSW50MzIgaW5kZXgpDQorew0KKyAgI2lmZGVmIEVYUE9SVF9DT0RFQ1MNCisgIGlmIChpbmRleCA8IGdfTnVtSGFzaGVycykNCisgICAgcmV0dXJuIC0xOw0KKyAgI2VuZGlmDQorICAjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorICBjb25zdCBDRGxsSGFzaGVySW5mbyAmY2kgPSBIYXNoZXJzW2luZGV4IC0gTlVNX0VYUE9SVF9IQVNIRVJTXTsNCisgIHJldHVybiBjaS5MaWJJbmRleDsNCisgICNlbHNlDQorICByZXR1cm4gLTE7DQorICAjZW5kaWYNCit9DQorDQorYm9vbCBDQ29kZWNzOjpHZXRDb2RlY0VuY29kZXJJc0Fzc2lnbmVkKFVJbnQzMiBpbmRleCkNCit7DQorICAjaWZkZWYgRVhQT1JUX0NPREVDUw0KKyAgaWYgKGluZGV4IDwgZ19OdW1Db2RlY3MpDQorICB7DQorICAgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgICBpZiAoR2V0UHJvcGVydHkoaW5kZXgsIE5NZXRob2RQcm9wSUQ6OmtFbmNvZGVyLCAmcHJvcCkgPT0gU19PSykNCisgICAgICBpZiAocHJvcC52dCAhPSBWVF9FTVBUWSkNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICAjZW5kaWYNCisgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisgIGNvbnN0IENEbGxDb2RlY0luZm8gJmNpID0gQ29kZWNzW2luZGV4IC0gTlVNX0VYUE9SVF9DT0RFQ1NdOw0KKyAgcmV0dXJuIGNpLkVuY29kZXJJc0Fzc2lnbmVkOw0KKyAgI2Vsc2UNCisgIHJldHVybiBmYWxzZTsNCisgICNlbmRpZg0KK30NCisNCitIUkVTVUxUIENDb2RlY3M6OkdldENvZGVjSWQoVUludDMyIGluZGV4LCBVSW50NjQgJmlkKQ0KK3sNCisgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgUklOT0soR2V0UHJvcGVydHkoaW5kZXgsIE5NZXRob2RQcm9wSUQ6OmtJRCwgJnByb3ApKTsNCisgIGlmIChwcm9wLnZ0ICE9IFZUX1VJOCkNCisgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsNCisgIGlkID0gcHJvcC51aFZhbC5RdWFkUGFydDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitVU3RyaW5nIENDb2RlY3M6OkdldENvZGVjTmFtZShVSW50MzIgaW5kZXgpDQorew0KKyAgVVN0cmluZyBzOw0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBpZiAoR2V0UHJvcGVydHkoaW5kZXgsIE5NZXRob2RQcm9wSUQ6OmtOYW1lLCAmcHJvcCkgPT0gU19PSykNCisgICAgaWYgKHByb3AudnQgPT0gVlRfQlNUUikNCisgICAgICBzID0gcHJvcC5ic3RyVmFsOw0KKyAgcmV0dXJuIHM7DQorfQ0KKw0KK1VJbnQ2NCBDQ29kZWNzOjpHZXRIYXNoZXJJZChVSW50MzIgaW5kZXgpDQorew0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBSSU5PSyhHZXRIYXNoZXJQcm9wKGluZGV4LCBOTWV0aG9kUHJvcElEOjprSUQsICZwcm9wKSk7DQorICBpZiAocHJvcC52dCAhPSBWVF9VSTgpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIHByb3AudWhWYWwuUXVhZFBhcnQ7DQorfQ0KKw0KK1VTdHJpbmcgQ0NvZGVjczo6R2V0SGFzaGVyTmFtZShVSW50MzIgaW5kZXgpDQorew0KKyAgVVN0cmluZyBzOw0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBpZiAoR2V0SGFzaGVyUHJvcChpbmRleCwgTk1ldGhvZFByb3BJRDo6a05hbWUsICZwcm9wKSA9PSBTX09LKQ0KKyAgICBpZiAocHJvcC52dCA9PSBWVF9CU1RSKQ0KKyAgICAgIHMgPSBwcm9wLmJzdHJWYWw7DQorICByZXR1cm4gczsNCit9DQorDQorVUludDMyIENDb2RlY3M6OkdldEhhc2hlckRpZ2VzdFNpemUoVUludDMyIGluZGV4KQ0KK3sNCisgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgUklOT0soR2V0SGFzaGVyUHJvcChpbmRleCwgTk1ldGhvZFByb3BJRDo6a0RpZ2VzdFNpemUsICZwcm9wKSk7DQorICBpZiAocHJvcC52dCAhPSBWVF9VSTQpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIHByb3AudWxWYWw7DQorfQ0KKw0KKyNlbmRpZiAvLyBFWFRFUk5BTF9DT0RFQ1MNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Mb2FkQ29kZWNzLmggYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Mb2FkQ29kZWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViYjE3NwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL0xvYWRDb2RlY3MuaApAQCAtMCwwICsxLDMwMyBAQAorLy8gTG9hZENvZGVjcy5oDQorDQorI2lmbmRlZiBfX0xPQURfQ09ERUNTX0gNCisjZGVmaW5lIF9fTE9BRF9DT0RFQ1NfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlCdWZmZXIuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015Q29tLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeVN0cmluZy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vQ29tVHJ5LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0lDb2Rlci5oIg0KKw0KKyNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9ETEwuaCINCisjZW5kaWYNCisNCitzdHJ1Y3QgQ0RsbENvZGVjSW5mbw0KK3sNCisgIENMU0lEIEVuY29kZXI7DQorICBDTFNJRCBEZWNvZGVyOw0KKyAgYm9vbCBFbmNvZGVySXNBc3NpZ25lZDsNCisgIGJvb2wgRGVjb2RlcklzQXNzaWduZWQ7DQorICBpbnQgTGliSW5kZXg7DQorICBVSW50MzIgQ29kZWNJbmRleDsNCit9Ow0KKw0KK3N0cnVjdCBDRGxsSGFzaGVySW5mbw0KK3sNCisgIGludCBMaWJJbmRleDsNCisgIFVJbnQzMiBIYXNoZXJJbmRleDsNCit9Ow0KKw0KKyNpbmNsdWRlICIuLi8uLi9BcmNoaXZlL0lBcmNoaXZlLmgiDQorDQorc3RydWN0IENBcmNFeHRJbmZvDQorew0KKyAgVVN0cmluZyBFeHQ7DQorICBVU3RyaW5nIEFkZEV4dDsNCisgIA0KKyAgQ0FyY0V4dEluZm8oKSB7fQ0KKyAgQ0FyY0V4dEluZm8oY29uc3QgVVN0cmluZyAmZXh0KTogRXh0KGV4dCkge30NCisgIENBcmNFeHRJbmZvKGNvbnN0IFVTdHJpbmcgJmV4dCwgY29uc3QgVVN0cmluZyAmYWRkRXh0KTogRXh0KGV4dCksIEFkZEV4dChhZGRFeHQpIHt9DQorfTsNCisNCisNCitzdHJ1Y3QgQ0FyY0luZm9FeA0KK3sNCisgIFVJbnQzMiBGbGFnczsNCisgIA0KKyAgRnVuY19DcmVhdGVJbkFyY2hpdmUgQ3JlYXRlSW5BcmNoaXZlOw0KKyAgRnVuY19Jc0FyYyBJc0FyY0Z1bmM7DQorDQorICBVU3RyaW5nIE5hbWU7DQorICBDT2JqZWN0VmVjdG9yPENBcmNFeHRJbmZvPiBFeHRzOw0KKyAgDQorICAjaWZuZGVmIF9TRlgNCisgICAgRnVuY19DcmVhdGVPdXRBcmNoaXZlIENyZWF0ZU91dEFyY2hpdmU7DQorICAgIGJvb2wgVXBkYXRlRW5hYmxlZDsNCisgICAgYm9vbCBOZXdJbnRlcmZhY2U7DQorICAgIC8vIFVJbnQzMiBWZXJzaW9uOw0KKyAgICBVSW50MzIgU2lnbmF0dXJlT2Zmc2V0Ow0KKyAgICBDT2JqZWN0VmVjdG9yPENCeXRlQnVmZmVyPiBTaWduYXR1cmVzOw0KKyAgICAjaWZkZWYgTkVXX0ZPTERFUl9JTlRFUkZBQ0UNCisgICAgICBVU3RyaW5nVmVjdG9yIEFzc29jaWF0ZUV4dHM7DQorICAgICNlbmRpZg0KKyAgI2VuZGlmDQorICANCisgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisgICAgaW50IExpYkluZGV4Ow0KKyAgICBVSW50MzIgRm9ybWF0SW5kZXg7DQorICAgIENMU0lEIENsYXNzSUQ7DQorICAjZW5kaWYNCisNCisgIGJvb2wgRmxhZ3NfS2VlcE5hbWUoKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgJiBOQXJjSW5mb0ZsYWdzOjprS2VlcE5hbWUpICE9IDA7IH0NCisgIGJvb2wgRmxhZ3NfRmluZFNpZ25hdHVyZSgpIGNvbnN0IHsgcmV0dXJuIChGbGFncyAmIE5BcmNJbmZvRmxhZ3M6OmtGaW5kU2lnbmF0dXJlKSAhPSAwOyB9DQorDQorICBib29sIEZsYWdzX0FsdFN0cmVhbXMoKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgJiBOQXJjSW5mb0ZsYWdzOjprQWx0U3RyZWFtcykgIT0gMDsgfQ0KKyAgYm9vbCBGbGFnc19OdFNlY3VyZSgpIGNvbnN0IHsgcmV0dXJuIChGbGFncyAmIE5BcmNJbmZvRmxhZ3M6OmtOdFNlY3VyZSkgIT0gMDsgfQ0KKyAgYm9vbCBGbGFnc19TeW1MaW5rcygpIGNvbnN0IHsgcmV0dXJuIChGbGFncyAmIE5BcmNJbmZvRmxhZ3M6OmtTeW1MaW5rcykgIT0gMDsgfQ0KKyAgYm9vbCBGbGFnc19IYXJkTGlua3MoKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgJiBOQXJjSW5mb0ZsYWdzOjprSGFyZExpbmtzKSAhPSAwOyB9DQorDQorICBib29sIEZsYWdzX1VzZUdsb2JhbE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIChGbGFncyAmIE5BcmNJbmZvRmxhZ3M6OmtVc2VHbG9iYWxPZmZzZXQpICE9IDA7IH0NCisgIGJvb2wgRmxhZ3NfU3RhcnRPcGVuKCkgY29uc3QgeyByZXR1cm4gKEZsYWdzICYgTkFyY0luZm9GbGFnczo6a1N0YXJ0T3BlbikgIT0gMDsgfQ0KKyAgYm9vbCBGbGFnc19CYWNrd2FyZE9wZW4oKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgJiBOQXJjSW5mb0ZsYWdzOjprQmFja3dhcmRPcGVuKSAhPSAwOyB9DQorICBib29sIEZsYWdzX1ByZUFyYygpIGNvbnN0IHsgcmV0dXJuIChGbGFncyAmIE5BcmNJbmZvRmxhZ3M6OmtQcmVBcmMpICE9IDA7IH0NCisgIGJvb2wgRmxhZ3NfUHVyZVN0YXJ0T3BlbigpIGNvbnN0IHsgcmV0dXJuIChGbGFncyAmIE5BcmNJbmZvRmxhZ3M6OmtQdXJlU3RhcnRPcGVuKSAhPSAwOyB9DQorICANCisgIFVTdHJpbmcgR2V0TWFpbkV4dCgpIGNvbnN0DQorICB7DQorICAgIGlmIChFeHRzLklzRW1wdHkoKSkNCisgICAgICByZXR1cm4gVVN0cmluZygpOw0KKyAgICByZXR1cm4gRXh0c1swXS5FeHQ7DQorICB9DQorICBpbnQgRmluZEV4dGVuc2lvbihjb25zdCBVU3RyaW5nICZleHQpIGNvbnN0Ow0KKyAgDQorICAvKg0KKyAgVVN0cmluZyBHZXRBbGxFeHRlbnNpb25zKCkgY29uc3QNCisgIHsNCisgICAgVVN0cmluZyBzOw0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEV4dHMuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBpZiAoaSA+IDApDQorICAgICAgICBzICs9ICcgJzsNCisgICAgICBzICs9IEV4dHNbaV0uRXh0Ow0KKyAgICB9DQorICAgIHJldHVybiBzOw0KKyAgfQ0KKyAgKi8NCisNCisgIHZvaWQgQWRkRXh0cyhjb25zdCBVU3RyaW5nICZleHQsIGNvbnN0IFVTdHJpbmcgJmFkZEV4dCk7DQorDQorICBib29sIElzU3BsaXQoKSBjb25zdCB7IHJldHVybiBTdHJpbmdzQXJlRXF1YWxOb0Nhc2VfQXNjaWkoTmFtZSwgIlNwbGl0Iik7IH0NCisgIC8vIGJvb2wgSXNSYXIoKSBjb25zdCB7IHJldHVybiBTdHJpbmdzQXJlRXF1YWxOb0Nhc2VfQXNjaWkoTmFtZSwgIlJhciIpOyB9DQorDQorICBDQXJjSW5mb0V4KCk6DQorICAgICAgRmxhZ3MoMCksDQorICAgICAgQ3JlYXRlSW5BcmNoaXZlKE5VTEwpLA0KKyAgICAgIElzQXJjRnVuYyhOVUxMKQ0KKyAgICAgICNpZm5kZWYgX1NGWA0KKyAgICAgICwgQ3JlYXRlT3V0QXJjaGl2ZShOVUxMKQ0KKyAgICAgICwgVXBkYXRlRW5hYmxlZChmYWxzZSkNCisgICAgICAsIE5ld0ludGVyZmFjZShmYWxzZSkNCisgICAgICAvLyAsIFZlcnNpb24oMCkNCisgICAgICAsIFNpZ25hdHVyZU9mZnNldCgwKQ0KKyAgICAgICNlbmRpZg0KKyAgICAgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisgICAgICAsIExpYkluZGV4KC0xKQ0KKyAgICAgICNlbmRpZg0KKyAge30NCit9Ow0KKw0KKyNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisNCisjaWZkZWYgTkVXX0ZPTERFUl9JTlRFUkZBQ0UNCitzdHJ1Y3QgQ0NvZGVjSWNvbnMNCit7DQorICBzdHJ1Y3QgQ0ljb25QYWlyDQorICB7DQorICAgIFVTdHJpbmcgRXh0Ow0KKyAgICBpbnQgSWNvbkluZGV4Ow0KKyAgfTsNCisgIENPYmplY3RWZWN0b3I8Q0ljb25QYWlyPiBJY29uUGFpcnM7DQorICB2b2lkIExvYWRJY29ucyhITU9EVUxFIG0pOw0KKyAgYm9vbCBGaW5kSWNvbkluZGV4KGNvbnN0IFVTdHJpbmcgJmV4dCwgaW50ICZpY29uSW5kZXgpIGNvbnN0Ow0KK307DQorI2VuZGlmDQorDQorc3RydWN0IENDb2RlY0xpYg0KKyAgI2lmZGVmIE5FV19GT0xERVJfSU5URVJGQUNFDQorICAgIDogcHVibGljIENDb2RlY0ljb25zDQorICAjZW5kaWYNCit7DQorICBOV2luZG93czo6TkRMTDo6Q0xpYnJhcnkgTGliOw0KKyAgRlN0cmluZyBQYXRoOw0KKyAgRnVuY19HZXRNZXRob2RQcm9wZXJ0eSBHZXRNZXRob2RQcm9wZXJ0eTsNCisgIEZ1bmNfQ3JlYXRlT2JqZWN0IENyZWF0ZU9iamVjdDsNCisgIENNeUNvbVB0cjxJSGFzaGVycz4gSGFzaGVyczsNCisgIA0KKyAgI2lmZGVmIE5FV19GT0xERVJfSU5URVJGQUNFDQorICB2b2lkIExvYWRJY29ucygpIHsgQ0NvZGVjSWNvbnM6OkxvYWRJY29ucygoSE1PRFVMRSlMaWIpOyB9DQorICAjZW5kaWYNCisgIA0KKyAgQ0NvZGVjTGliKCk6IEdldE1ldGhvZFByb3BlcnR5KE5VTEwpIHt9DQorfTsNCisjZW5kaWYNCisNCitjbGFzcyBDQ29kZWNzOg0KKyAgI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKyAgcHVibGljIElDb21wcmVzc0NvZGVjc0luZm8sDQorICBwdWJsaWMgSUhhc2hlcnMsDQorICAjZWxzZQ0KKyAgcHVibGljIElVbmtub3duLA0KKyAgI2VuZGlmDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCitwdWJsaWM6DQorICAjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorICBDT2JqZWN0VmVjdG9yPENDb2RlY0xpYj4gTGliczsNCisgIENSZWNvcmRWZWN0b3I8Q0RsbENvZGVjSW5mbz4gQ29kZWNzOw0KKyAgQ1JlY29yZFZlY3RvcjxDRGxsSGFzaGVySW5mbz4gSGFzaGVyczsNCisNCisgICNpZmRlZiBORVdfRk9MREVSX0lOVEVSRkFDRQ0KKyAgQ0NvZGVjSWNvbnMgSW50ZXJuYWxJY29uczsNCisgICNlbmRpZg0KKw0KKyAgSFJFU1VMVCBMb2FkQ29kZWNzKCk7DQorICBIUkVTVUxUIExvYWRGb3JtYXRzKCk7DQorICBIUkVTVUxUIExvYWREbGwoY29uc3QgRlN0cmluZyAmcGF0aCwgYm9vbCBuZWVkQ2hlY2tEbGwpOw0KKyAgSFJFU1VMVCBMb2FkRGxsc0Zyb21Gb2xkZXIoY29uc3QgRlN0cmluZyAmZm9sZGVyUHJlZml4KTsNCisNCisgIEhSRVNVTFQgQ3JlYXRlQXJjaGl2ZUhhbmRsZXIoY29uc3QgQ0FyY0luZm9FeCAmYWksIHZvaWQgKiphcmNoaXZlLCBib29sIG91dEhhbmRsZXIpIGNvbnN0DQorICB7DQorICAgIHJldHVybiBMaWJzW2FpLkxpYkluZGV4XS5DcmVhdGVPYmplY3QoJmFpLkNsYXNzSUQsIG91dEhhbmRsZXIgPyAmSUlEX0lPdXRBcmNoaXZlIDogJklJRF9JSW5BcmNoaXZlLCAodm9pZCAqKilhcmNoaXZlKTsNCisgIH0NCisgICNlbmRpZg0KKw0KK3B1YmxpYzoNCisgIENPYmplY3RWZWN0b3I8Q0FyY0luZm9FeD4gRm9ybWF0czsNCisgIGJvb2wgQ2FzZVNlbnNpdGl2ZUNoYW5nZTsNCisgIGJvb2wgQ2FzZVNlbnNpdGl2ZTsNCisNCisgIENDb2RlY3MoKTogQ2FzZVNlbnNpdGl2ZUNoYW5nZShmYWxzZSksIENhc2VTZW5zaXRpdmUoZmFsc2UpIHt9DQorIA0KKyAgY29uc3Qgd2NoYXJfdCAqR2V0Rm9ybWF0TmFtZVB0cihpbnQgZm9ybWF0SW5kZXgpDQorICB7DQorICAgIHJldHVybiBmb3JtYXRJbmRleCA8IDAgPyBMIiMiIDogKGNvbnN0IHdjaGFyX3QgKilGb3JtYXRzW2Zvcm1hdEluZGV4XS5OYW1lOw0KKyAgfQ0KKw0KKyAgSFJFU1VMVCBMb2FkKCk7DQorICANCisgICNpZm5kZWYgX1NGWA0KKyAgaW50IEZpbmRGb3JtYXRGb3JBcmNoaXZlTmFtZShjb25zdCBVU3RyaW5nICZhcmNQYXRoKSBjb25zdDsNCisgIGludCBGaW5kRm9ybWF0Rm9yRXh0ZW5zaW9uKGNvbnN0IFVTdHJpbmcgJmV4dCkgY29uc3Q7DQorICBpbnQgRmluZEZvcm1hdEZvckFyY2hpdmVUeXBlKGNvbnN0IFVTdHJpbmcgJmFyY1R5cGUpIGNvbnN0Ow0KKyAgYm9vbCBGaW5kRm9ybWF0Rm9yQXJjaGl2ZVR5cGUoY29uc3QgVVN0cmluZyAmYXJjVHlwZSwgQ0ludFZlY3RvciAmZm9ybWF0SW5kaWNlcykgY29uc3Q7DQorICAjZW5kaWYNCisNCisgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisNCisgIE1ZX1VOS05PV05fSU1QMihJQ29tcHJlc3NDb2RlY3NJbmZvLCBJSGFzaGVycykNCisgICAgDQorICBTVERNRVRIT0QoR2V0TnVtYmVyT2ZNZXRob2RzKShVSW50MzIgKm51bU1ldGhvZHMpOw0KKyAgU1RETUVUSE9EKEdldFByb3BlcnR5KShVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIFBST1BWQVJJQU5UICp2YWx1ZSk7DQorICBTVERNRVRIT0QoQ3JlYXRlRGVjb2RlcikoVUludDMyIGluZGV4LCBjb25zdCBHVUlEICppbnRlcmZhY2VJRCwgdm9pZCAqKmNvZGVyKTsNCisgIFNURE1FVEhPRChDcmVhdGVFbmNvZGVyKShVSW50MzIgaW5kZXgsIGNvbnN0IEdVSUQgKmludGVyZmFjZUlELCB2b2lkICoqY29kZXIpOw0KKw0KKyAgU1RETUVUSE9EXyhVSW50MzIsIEdldE51bUhhc2hlcnMpKCk7DQorICBTVERNRVRIT0QoR2V0SGFzaGVyUHJvcCkoVUludDMyIGluZGV4LCBQUk9QSUQgcHJvcElELCBQUk9QVkFSSUFOVCAqdmFsdWUpOw0KKyAgU1RETUVUSE9EKENyZWF0ZUhhc2hlcikoVUludDMyIGluZGV4LCBJSGFzaGVyICoqaGFzaGVyKTsNCisNCisgICNlbHNlDQorDQorICBNWV9VTktOT1dOX0lNUA0KKw0KKyAgI2VuZGlmIC8vIEVYVEVSTkFMX0NPREVDUw0KKw0KKyAgI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKw0KKyAgaW50IEdldENvZGVjTGliSW5kZXgoVUludDMyIGluZGV4KTsNCisgIGJvb2wgR2V0Q29kZWNFbmNvZGVySXNBc3NpZ25lZChVSW50MzIgaW5kZXgpOw0KKyAgSFJFU1VMVCBHZXRDb2RlY0lkKFVJbnQzMiBpbmRleCwgVUludDY0ICZpZCk7DQorICBVU3RyaW5nIEdldENvZGVjTmFtZShVSW50MzIgaW5kZXgpOw0KKw0KKyAgaW50IEdldEhhc2hlckxpYkluZGV4KFVJbnQzMiBpbmRleCk7DQorICBVSW50NjQgR2V0SGFzaGVySWQoVUludDMyIGluZGV4KTsNCisgIFVTdHJpbmcgR2V0SGFzaGVyTmFtZShVSW50MzIgaW5kZXgpOw0KKyAgVUludDMyIEdldEhhc2hlckRpZ2VzdFNpemUoVUludDMyIGluZGV4KTsNCisNCisgICNlbmRpZg0KKw0KKyAgSFJFU1VMVCBDcmVhdGVJbkFyY2hpdmUodW5zaWduZWQgZm9ybWF0SW5kZXgsIENNeUNvbVB0cjxJSW5BcmNoaXZlPiAmYXJjaGl2ZSkgY29uc3QNCisgIHsNCisgICAgY29uc3QgQ0FyY0luZm9FeCAmYWkgPSBGb3JtYXRzW2Zvcm1hdEluZGV4XTsNCisgICAgI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKyAgICBpZiAoYWkuTGliSW5kZXggPCAwKQ0KKyAgICAjZW5kaWYNCisgICAgew0KKyAgICAgIENPTV9UUllfQkVHSU4NCisgICAgICBhcmNoaXZlID0gYWkuQ3JlYXRlSW5BcmNoaXZlKCk7DQorICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgQ09NX1RSWV9FTkQNCisgICAgfQ0KKyAgICAjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorICAgIHJldHVybiBDcmVhdGVBcmNoaXZlSGFuZGxlcihhaSwgKHZvaWQgKiopJmFyY2hpdmUsIGZhbHNlKTsNCisgICAgI2VuZGlmDQorICB9DQorICANCisgICNpZm5kZWYgX1NGWA0KKw0KKyAgSFJFU1VMVCBDcmVhdGVPdXRBcmNoaXZlKHVuc2lnbmVkIGZvcm1hdEluZGV4LCBDTXlDb21QdHI8SU91dEFyY2hpdmU+ICZhcmNoaXZlKSBjb25zdA0KKyAgew0KKyAgICBjb25zdCBDQXJjSW5mb0V4ICZhaSA9IEZvcm1hdHNbZm9ybWF0SW5kZXhdOw0KKyAgICAjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorICAgIGlmIChhaS5MaWJJbmRleCA8IDApDQorICAgICNlbmRpZg0KKyAgICB7DQorICAgICAgQ09NX1RSWV9CRUdJTg0KKyAgICAgIGFyY2hpdmUgPSBhaS5DcmVhdGVPdXRBcmNoaXZlKCk7DQorICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgQ09NX1RSWV9FTkQNCisgICAgfQ0KKyAgICAjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorICAgIHJldHVybiBDcmVhdGVBcmNoaXZlSGFuZGxlcihhaSwgKHZvaWQgKiopJmFyY2hpdmUsIHRydWUpOw0KKyAgICAjZW5kaWYNCisgIH0NCisgIA0KKyAgaW50IEZpbmRPdXRGb3JtYXRGcm9tTmFtZShjb25zdCBVU3RyaW5nICZuYW1lKSBjb25zdA0KKyAgew0KKyAgICBGT1JfVkVDVE9SIChpLCBGb3JtYXRzKQ0KKyAgICB7DQorICAgICAgY29uc3QgQ0FyY0luZm9FeCAmYXJjID0gRm9ybWF0c1tpXTsNCisgICAgICBpZiAoIWFyYy5VcGRhdGVFbmFibGVkKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgaWYgKGFyYy5OYW1lLklzRXF1YWxUb05vQ2FzZShuYW1lKSkNCisgICAgICAgIHJldHVybiBpOw0KKyAgICB9DQorICAgIHJldHVybiAtMTsNCisgIH0NCisNCisgICNlbmRpZiAvLyBfU0ZYDQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9PcGVuQXJjaGl2ZS5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9PcGVuQXJjaGl2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzMmJlOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL09wZW5BcmNoaXZlLmNwcApAQCAtMCwwICsxLDMyMTEgQEAKKy8vIE9wZW5BcmNoaXZlLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisvLyAjZGVmaW5lIFNIT1dfREVCVUdfSU5GTw0KKw0KKyNpZmRlZiBTSE9XX0RFQlVHX0lORk8NCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjZW5kaWYNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vQy9DcHVBcmNoLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9Db21UcnkuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0ludFRvU3RyaW5nLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdHJpbmdUb0ludC5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vV2lsZGNhcmQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlRGlyLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9GaWxlU3RyZWFtcy5oIg0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vTGltaXRlZFN0cmVhbXMuaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL1Byb2dyZXNzVXRpbHMuaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL1N0cmVhbVV0aWxzLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbXByZXNzL0NvcHlDb2Rlci5oIg0KKw0KKyNpbmNsdWRlICJEZWZhdWx0TmFtZS5oIg0KKyNpbmNsdWRlICJPcGVuQXJjaGl2ZS5oIg0KKw0KKyNpZm5kZWYgX1NGWA0KKyNpbmNsdWRlICJTZXRQcm9wZXJ0aWVzLmgiDQorI2VuZGlmDQorDQorI2lmZGVmIFNIT1dfREVCVUdfSU5GTw0KKyNkZWZpbmUgUFJGKHgpIHgNCisjZWxzZQ0KKyNkZWZpbmUgUFJGKHgpDQorI2VuZGlmDQorDQorLy8gaW5jcmVhc2UgaXQsIGlmIHlvdSBuZWVkIHRvIHN1cHBvcnQgbGFyZ2VyIFNGWCBzdHVicw0KK3N0YXRpYyBjb25zdCBVSW50NjQga01heENoZWNrU3RhcnRQb3NpdGlvbiA9IDEgPDwgMjI7DQorDQorLyoNCitPcGVuOg0KKyAgLSBmb3JtYXRJbmRleCA+PSAwIChleGFjdCBGb3JtYXQpDQorICAgICAgIDEpIE9wZW4gd2l0aCBtYWluIHR5cGUuIEFyY2hpdmUgaGFuZGxlciBpcyBhbGxvd2VkIHRvIHVzZSBhcmNoaXZlIHN0YXJ0IGZpbmRlci4NCisgICAgICAgICAgV2FybmluZywgaWYgdGhlcmUgaXMgdGFpbC4NCisgIA0KKyAgLSBmb3JtYXRJbmRleCA9IC0xIChQYXJzZXI6MCkgKGRlZmF1bHQpDQorICAgIC0gc2FtZSBhcyAjMSBidXQgZG9lc24ndCByZXR1cm4gUGFyc2VyDQorDQorICAtIGZvcm1hdEluZGV4ID0gLTIgKCMxKQ0KKyAgICAtIGZpbGUgaGFzIHN1cHBvcnRlZCBleHRlbnNpb24gKGxpa2UgYS43eikNCisgICAgICBPcGVuIHdpdGggdGhhdCBtYWluIHR5cGUgKG9ubHkgc3RhcnRpbmcgZnJvbSBzdGFydCBvZiBmaWxlKS4NCisgICAgICAgIC0gb3BlbiBPSzoNCisgICAgICAgICAgICAtIGlmIHRoZXJlIGlzIG5vIHRhaWwgLSByZXR1cm4gT0sNCisgICAgICAgICAgICAtIGlmIHRoZXJlIGlzIHRhaWw6DQorICAgICAgICAgICAgICAtIGFyY2hpdmUgaXMgbm90ICJTZWxmIEV4ZSIgLSByZXR1cm4gT0sgd2l0aCBXYXJuaW5nLCB0aGF0IHRoZXJlIGlzIHRhaWwNCisgICAgICAgICAgICAgIC0gYXJjaGl2ZSBpcyAiU2VsZiBFeGUiDQorICAgICAgICAgICAgICAgIGlnbm9yZSAiU2VsZiBFeGUiIHN0dWIsIGFuZCB0cmllcyB0byBvcGVuIHRhaWwNCisgICAgICAgICAgICAgICAgICAtIHRhaWwgY2FuIGJlIG9wZW4gYXMgYXJjaGl2ZSAtIHNob3dzIHRoYXQgYXJjaGl2ZSBhbmQgc3R1YiBzaXplIHByb3BlcnR5Lg0KKyAgICAgICAgICAgICAgICAgIC0gdGFpbCBjYW4ndCBiZSBvcGVuIGFzIGFyY2hpdmUgLSBzaG93cyBQYXJzZXIgPz8/DQorICAgICAgICAtIG9wZW4gRkFJTDoNCisgICAgICAgICAgIFRyeSB0byBvcGVuIHdpdGggYWxsIG90aGVyIHR5cGVzIGZyb20gb2Zmc2V0IDAgb25seS4NCisgICAgICAgICAgIElmIHNvbWUgb3BlbiB0eXBlIGlzIE9LIGFuZCBwaHlzaWNhbCBhcmNoaXZlIHNpemUgaXMgdWVxdWFsIG9yIGxhcmdlcg0KKyAgICAgICAgICAgdGhhbiBmaWxlIHNpemUsIHRoZW4gcmV0dXJuIHRoYXQgYXJjaGl2ZSB3aXRoIHdhcm5pbmcgdGhhdCBjYW4gbm90IGJlIG9wZW4gYXMgW2V4dGVuc2lvbiB0eXBlXS4NCisgICAgICAgICAgIElmIGV4dGVuc2lvbiB3YXMgRVhFLCBpdCB3aWxsIHRyeSB0byBvcGVuIGFzIHVua25vd25fZXh0ZW5zaW9uIGNhc2UNCisgICAgLSBmaWxlIGhhcyB1bmtub3duIGV4dGVuc2lvbiAobGlrZSBhLmhoaCkNCisgICAgICAgSXQgdHJpZXMgdG8gb3BlbiB2aWEgcGFyc2VyIGNvZGUuDQorICAgICAgICAgLSBpZiB0aGVyZSBpcyBmdWxsIGFyY2hpdmUgb3IgdGFpbCBhcmNoaXZlIGFuZCB1bmtub3duIGJsb2NrIG9yICJTZWxmIEV4ZSINCisgICAgICAgICAgIGF0IGZyb250LCBpdCBzaG93cyB0YWlsIGFyY2hpdmUgYW5kIHN0dWIgc2l6ZSBwcm9wZXJ0eS4NCisgICAgICAgICAtIGluIGFub3RoZXIgY2FzZXMsIGlmIHRoZXJlIGlzIHNvbWUgYXJjaGl2ZSBpbnNpZGUgZmlsZSwgaXQgcmV0dXJucyBwYXJzZXIvDQorICAgICAgICAgLSBpbiBhbm90aGVyIGNhc2VzLCBpdCByZXR1ZW5zIFNfRkFMU0UNCisNCisgICAgICAgDQorICAtIGZvcm1hdEluZGV4ID0gLTMgKCMyKQ0KKyAgICAtIHNhbWUgYXMgIzEsIGJ1dA0KKyAgICAtIHN0dWIgKEVYRSkgKyBhcmNoaXZlIGlzIG9wZW4gaW4gUGFyc2VyDQorDQorICAtIGZvcm1hdEluZGV4ID0gLTQgKCMzKQ0KKyAgICAtIHJldHVybnMgb25seSBQYXJzZXIuIHNraXAgZnVsbCBmaWxlIGFyY2hpdmUuIEFuZCBzaG93IG90aGVyIHN1Yi1hcmNoaXZlcw0KKw0KKyAgLSBmb3JtYXRJbmRleCA9IC01ICgjNCkNCisgICAgLSByZXR1cm5zIG9ubHkgUGFyc2VyLiBza2lwIGZ1bGwgZmlsZSBhcmNoaXZlLiBBbmQgc2hvdyBvdGhlciBzdWItYXJjaGl2ZXMgZm9yIGVhY2ggYnl0ZSBwb3MNCisNCisqLw0KKw0KKw0KKw0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCisNCisvKg0KKyNpZmRlZiBfU0ZYDQorI2RlZmluZSBPUEVOX1BST1BTX1BBUkFNDQorI2Vsc2UNCisjZGVmaW5lIE9QRU5fUFJPUFNfUEFSQU0gICwgcHJvcHMNCisjZW5kaWYNCisqLw0KKw0KKy8qDQorQ0FyYzo6fkNBcmMoKQ0KK3sNCisgIEdldFJhd1Byb3BzLlJlbGVhc2UoKTsNCisgIEFyY2hpdmUuUmVsZWFzZSgpOw0KKyAgcHJpbnRmKCJcbkNBcmM6On5DQXJjKClcbiIpOw0KK30NCisqLw0KKw0KKyNpZm5kZWYgX1NGWA0KKw0KK25hbWVzcGFjZSBOQXJjaGl2ZSB7DQorbmFtZXNwYWNlIE5QYXJzZXIgew0KKw0KK3N0cnVjdCBDUGFyc2VJdGVtDQorew0KKyAgVUludDY0IE9mZnNldDsNCisgIFVJbnQ2NCBTaXplOw0KKyAgLy8gVUludDY0IE9rU2l6ZTsNCisgIFVTdHJpbmcgTmFtZTsNCisgIFVTdHJpbmcgRXh0ZW5zaW9uOw0KKyAgRklMRVRJTUUgRmlsZVRpbWU7DQorICBVU3RyaW5nIENvbW1lbnQ7DQorICBVU3RyaW5nIEFyY1R5cGU7DQorICANCisgIGJvb2wgRmlsZVRpbWVfRGVmaW5lZDsNCisgIGJvb2wgVW5wYWNrU2l6ZV9EZWZpbmVkOw0KKyAgYm9vbCBOdW1TdWJEaXJzX0RlZmluZWQ7DQorICBib29sIE51bVN1YkZpbGVzX0RlZmluZWQ7DQorDQorICBib29sIElzU2VsZkV4ZTsNCisgIGJvb2wgSXNOb3RBcmNUeXBlOw0KKyAgDQorICBVSW50NjQgVW5wYWNrU2l6ZTsNCisgIFVJbnQ2NCBOdW1TdWJEaXJzOw0KKyAgVUludDY0IE51bVN1YkZpbGVzOw0KKw0KKyAgaW50IEZvcm1hdEluZGV4Ow0KKw0KKyAgYm9vbCBMZW5Jc1Vua25vd247DQorDQorICBDUGFyc2VJdGVtKCk6DQorICAgICAgTGVuSXNVbmtub3duKGZhbHNlKSwNCisgICAgICBGaWxlVGltZV9EZWZpbmVkKGZhbHNlKSwNCisgICAgICBVbnBhY2tTaXplX0RlZmluZWQoZmFsc2UpLA0KKyAgICAgIE51bVN1YkZpbGVzX0RlZmluZWQoZmFsc2UpLA0KKyAgICAgIE51bVN1YkRpcnNfRGVmaW5lZChmYWxzZSksDQorICAgICAgSXNTZWxmRXhlKGZhbHNlKSwNCisgICAgICBJc05vdEFyY1R5cGUoZmFsc2UpDQorICAgICAgLy8gT2tTaXplKDApDQorICAgIHt9DQorDQorICAvKg0KKyAgYm9vbCBJc0VxdWFsVG8oY29uc3QgQ1BhcnNlSXRlbSAmaXRlbSkgY29uc3QNCisgIHsNCisgICAgcmV0dXJuIE9mZnNldCA9PSBpdGVtLk9mZnNldCAmJiBTaXplID09IGl0ZW0uU2l6ZTsNCisgIH0NCisgICovDQorDQorICB2b2lkIE5vcm1hbGl6ZU9mZnNldCgpDQorICB7DQorICAgIGlmICgoSW50NjQpT2Zmc2V0IDwgMCkNCisgICAgew0KKyAgICAgIFNpemUgKz0gT2Zmc2V0Ow0KKyAgICAgIC8vIE9rU2l6ZSArPSBPZmZzZXQ7DQorICAgICAgT2Zmc2V0ID0gMDsNCisgICAgfQ0KKyAgfQ0KK307DQorDQorY2xhc3MgQ0hhbmRsZXI6DQorICBwdWJsaWMgSUluQXJjaGl2ZSwNCisgIHB1YmxpYyBJSW5BcmNoaXZlR2V0U3RyZWFtLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorcHVibGljOg0KKyAgQ09iamVjdFZlY3RvcjxDUGFyc2VJdGVtPiBfaXRlbXM7DQorICBVSW50NjQgX21heEVuZE9mZnNldDsNCisgIENNeUNvbVB0cjxJSW5TdHJlYW0+IF9zdHJlYW07DQorDQorICBNWV9VTktOT1dOX0lNUDIoDQorICAgIElJbkFyY2hpdmUsDQorICAgIElJbkFyY2hpdmVHZXRTdHJlYW0pDQorDQorICBJTlRFUkZBQ0VfSUluQXJjaGl2ZSg7KQ0KKyAgU1RETUVUSE9EKEdldFN0cmVhbSkoVUludDMyIGluZGV4LCBJU2VxdWVudGlhbEluU3RyZWFtICoqc3RyZWFtKTsNCisNCisgIFVJbnQ2NCBHZXRMYXN0RW5kKCkgY29uc3QNCisgIHsNCisgICAgaWYgKF9pdGVtcy5Jc0VtcHR5KCkpDQorICAgICAgcmV0dXJuIDA7DQorICAgIGNvbnN0IENQYXJzZUl0ZW0gJmJhY2sgPSBfaXRlbXMuQmFjaygpOw0KKyAgICByZXR1cm4gYmFjay5PZmZzZXQgKyBiYWNrLlNpemU7DQorICB9DQorDQorICB2b2lkIEFkZFVua25vd25JdGVtKFVJbnQ2NCBuZXh0KTsNCisgIGludCBGaW5kSW5zZXJ0UG9zKGNvbnN0IENQYXJzZUl0ZW0gJml0ZW0pOw0KKyAgdm9pZCBBZGRJdGVtKGNvbnN0IENQYXJzZUl0ZW0gJml0ZW0pOw0KKyAgLy8gdm9pZCBJbml0KCk7DQorICANCisgIENIYW5kbGVyKCkNCisgIHsNCisgICAgX21heEVuZE9mZnNldCA9IDA7DQorICB9DQorfTsNCisNCitpbnQgQ0hhbmRsZXI6OkZpbmRJbnNlcnRQb3MoY29uc3QgQ1BhcnNlSXRlbSAmaXRlbSkNCit7DQorICB1bnNpZ25lZCBsZWZ0ID0gMCwgcmlnaHQgPSBfaXRlbXMuU2l6ZSgpOw0KKyAgd2hpbGUgKGxlZnQgIT0gcmlnaHQpDQorICB7DQorICAgIHVuc2lnbmVkIG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsNCisgICAgY29uc3QgQ1BhcnNlSXRlbSAmIG1pZEl0ZW0gPSBfaXRlbXNbbWlkXTsNCisgICAgaWYgKGl0ZW0uT2Zmc2V0IDwgbWlkSXRlbS5PZmZzZXQpDQorICAgICAgcmlnaHQgPSBtaWQ7DQorICAgIGVsc2UgaWYgKGl0ZW0uT2Zmc2V0ID4gbWlkSXRlbS5PZmZzZXQpDQorICAgICAgbGVmdCA9IG1pZCArIDE7DQorICAgIGVsc2UgaWYgKGl0ZW0uU2l6ZSA8IG1pZEl0ZW0uU2l6ZSkNCisgICAgICByaWdodCA9IG1pZDsNCisgICAgZWxzZSBpZiAoaXRlbS5TaXplID4gbWlkSXRlbS5TaXplKQ0KKyAgICAgIGxlZnQgPSBtaWQgKyAxOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBsZWZ0ID0gbWlkICsgMTsNCisgICAgICAvLyByZXR1cm4gLTE7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBsZWZ0Ow0KK30NCisNCit2b2lkIENIYW5kbGVyOjpBZGRVbmtub3duSXRlbShVSW50NjQgbmV4dCkNCit7DQorICAvKg0KKyAgVUludDY0IHByZXZFbmQgPSAwOw0KKyAgaWYgKCFfaXRlbXMuSXNFbXB0eSgpKQ0KKyAgew0KKyAgICBjb25zdCBDUGFyc2VJdGVtICZiYWNrID0gX2l0ZW1zLkJhY2soKTsNCisgICAgcHJldkVuZCA9IGJhY2suT2Zmc2V0ICsgYmFjay5TaXplOw0KKyAgfQ0KKyAgKi8NCisgIGlmIChfbWF4RW5kT2Zmc2V0IDwgbmV4dCkNCisgIHsNCisgICAgQ1BhcnNlSXRlbSBpdGVtMjsNCisgICAgaXRlbTIuT2Zmc2V0ID0gX21heEVuZE9mZnNldDsNCisgICAgaXRlbTIuU2l6ZSA9IG5leHQgLSBfbWF4RW5kT2Zmc2V0Ow0KKyAgICBfbWF4RW5kT2Zmc2V0ID0gbmV4dDsNCisgICAgX2l0ZW1zLkFkZChpdGVtMik7DQorICB9DQorICBlbHNlIGlmIChfbWF4RW5kT2Zmc2V0ID4gbmV4dCAmJiAhX2l0ZW1zLklzRW1wdHkoKSkNCisgIHsNCisgICAgQ1BhcnNlSXRlbSAmYmFjayA9IF9pdGVtcy5CYWNrKCk7DQorICAgIGlmIChiYWNrLkxlbklzVW5rbm93bikNCisgICAgew0KKyAgICAgIGJhY2suU2l6ZSA9IG5leHQgLSBiYWNrLk9mZnNldDsNCisgICAgICBfbWF4RW5kT2Zmc2V0ID0gbmV4dDsNCisgICAgfQ0KKyAgfQ0KK30NCisNCit2b2lkIENIYW5kbGVyOjpBZGRJdGVtKGNvbnN0IENQYXJzZUl0ZW0gJml0ZW0pDQorew0KKyAgQWRkVW5rbm93bkl0ZW0oaXRlbS5PZmZzZXQpOw0KKyAgaW50IHBvcyA9IEZpbmRJbnNlcnRQb3MoaXRlbSk7DQorICBpZiAocG9zID49IDApDQorICB7DQorICAgIF9pdGVtcy5JbnNlcnQocG9zLCBpdGVtKTsNCisgICAgVUludDY0IG5leHQgPSBpdGVtLk9mZnNldCArIGl0ZW0uU2l6ZTsNCisgICAgaWYgKF9tYXhFbmRPZmZzZXQgPCBuZXh0KQ0KKyAgICAgIF9tYXhFbmRPZmZzZXQgPSBuZXh0Ow0KKyAgfQ0KK30NCisNCisvKg0KK3N0YXRpYyBjb25zdCBTVEFUUFJPUFNURyBrUHJvcHNbXSA9DQorew0KKyAgeyBOVUxMLCBrcGlkUGF0aCwgVlRfQlNUUn0sDQorICB7IE5VTEwsIGtwaWRTaXplLCBWVF9VSTh9LA0KKyAgeyBOVUxMLCBrcGlkTVRpbWUsIFZUX0ZJTEVUSU1FfSwNCisgIHsgTlVMTCwga3BpZFR5cGUsIFZUX0JTVFJ9LA0KKyAgeyBOVUxMLCBrcGlkQ29tbWVudCwgVlRfQlNUUn0sDQorICB7IE5VTEwsIGtwaWRPZmZzZXQsIFZUX1VJOH0sDQorICB7IE5VTEwsIGtwaWRVbnBhY2tTaXplLCBWVF9VSTh9LA0KKy8vICAgeyBOVUxMLCBrcGlkTnVtU3ViRGlycywgVlRfVUk4fSwNCit9Ow0KKyovDQorDQorc3RhdGljIGNvbnN0IEJ5dGUga1Byb3BzW10gPQ0KK3sNCisgIGtwaWRQYXRoLA0KKyAga3BpZFNpemUsDQorICBrcGlkTVRpbWUsDQorICBrcGlkVHlwZSwNCisgIGtwaWRDb21tZW50LA0KKyAga3BpZE9mZnNldCwNCisgIGtwaWRVbnBhY2tTaXplDQorfTsNCisNCitJTVBfSUluQXJjaGl2ZV9Qcm9wcw0KK0lNUF9JSW5BcmNoaXZlX0FyY1Byb3BzX05PDQorDQorU1RETUVUSE9ESU1QIENIYW5kbGVyOjpPcGVuKElJblN0cmVhbSAqc3RyZWFtLCBjb25zdCBVSW50NjQgKiwgSUFyY2hpdmVPcGVuQ2FsbGJhY2sgKiAvKiBvcGVuQXJjaGl2ZUNhbGxiYWNrICovKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIHsNCisgICAgQ2xvc2UoKTsNCisgICAgX3N0cmVhbSA9IHN0cmVhbTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorU1RETUVUSE9ESU1QIENIYW5kbGVyOjpDbG9zZSgpDQorew0KKyAgX2l0ZW1zLkNsZWFyKCk7DQorICBfc3RyZWFtLlJlbGVhc2UoKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0hhbmRsZXI6OkdldE51bWJlck9mSXRlbXMoVUludDMyICpudW1JdGVtcykNCit7DQorICAqbnVtSXRlbXMgPSBfaXRlbXMuU2l6ZSgpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0UHJvcGVydHkoVUludDMyIGluZGV4LCBQUk9QSUQgcHJvcElELCBQUk9QVkFSSUFOVCAqdmFsdWUpDQorew0KKyAgQ09NX1RSWV9CRUdJTg0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorDQorICBjb25zdCBDUGFyc2VJdGVtICZpdGVtID0gX2l0ZW1zW2luZGV4XTsNCisNCisgIHN3aXRjaCAocHJvcElEKQ0KKyAgew0KKyAgICBjYXNlIGtwaWRQYXRoOg0KKyAgICB7DQorICAgICAgd2NoYXJfdCBzelszMl07DQorICAgICAgQ29udmVydFVJbnQzMlRvU3RyaW5nKGluZGV4ICsgMSwgc3opOw0KKyAgICAgIFVTdHJpbmcgcyA9IHN6Ow0KKyAgICAgIGlmICghaXRlbS5OYW1lLklzRW1wdHkoKSkNCisgICAgICB7DQorICAgICAgICBzICs9IEwnLic7DQorICAgICAgICBzICs9IGl0ZW0uTmFtZTsNCisgICAgICB9DQorICAgICAgaWYgKCFpdGVtLkV4dGVuc2lvbi5Jc0VtcHR5KCkpDQorICAgICAgew0KKyAgICAgICAgcyArPSBMJy4nOw0KKyAgICAgICAgcyArPSBpdGVtLkV4dGVuc2lvbjsNCisgICAgICB9DQorICAgICAgcHJvcCA9IHM7IGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2Uga3BpZFNpemU6DQorICAgIGNhc2Uga3BpZFBhY2tTaXplOiBwcm9wID0gaXRlbS5TaXplOyBicmVhazsNCisgICAgY2FzZSBrcGlkT2Zmc2V0OiBwcm9wID0gaXRlbS5PZmZzZXQ7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRVbnBhY2tTaXplOiBpZiAoaXRlbS5VbnBhY2tTaXplX0RlZmluZWQpIHByb3AgPSBpdGVtLlVucGFja1NpemU7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWROdW1TdWJGaWxlczogaWYgKGl0ZW0uTnVtU3ViRmlsZXNfRGVmaW5lZCkgcHJvcCA9IGl0ZW0uTnVtU3ViRmlsZXM7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWROdW1TdWJEaXJzOiBpZiAoaXRlbS5OdW1TdWJEaXJzX0RlZmluZWQpIHByb3AgPSBpdGVtLk51bVN1YkRpcnM7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRNVGltZTogaWYgKGl0ZW0uRmlsZVRpbWVfRGVmaW5lZCkgcHJvcCA9IGl0ZW0uRmlsZVRpbWU7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRDb21tZW50OiBpZiAoIWl0ZW0uQ29tbWVudC5Jc0VtcHR5KCkpIHByb3AgPSBpdGVtLkNvbW1lbnQ7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRUeXBlOiBpZiAoIWl0ZW0uQXJjVHlwZS5Jc0VtcHR5KCkpIHByb3AgPSBpdGVtLkFyY1R5cGU7IGJyZWFrOw0KKyAgfQ0KKyAgcHJvcC5EZXRhY2godmFsdWUpOw0KKyAgcmV0dXJuIFNfT0s7DQorICBDT01fVFJZX0VORA0KK30NCisNCitIUkVTVUxUIENIYW5kbGVyOjpFeHRyYWN0KGNvbnN0IFVJbnQzMiAqaW5kaWNlcywgVUludDMyIG51bUl0ZW1zLA0KKyAgICBJbnQzMiB0ZXN0TW9kZSwgSUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2sgKmV4dHJhY3RDYWxsYmFjaykNCit7DQorICBDT01fVFJZX0JFR0lODQorICBib29sIGFsbEZpbGVzTW9kZSA9IChudW1JdGVtcyA9PSAoVUludDMyKShJbnQzMiktMSk7DQorICBpZiAoYWxsRmlsZXNNb2RlKQ0KKyAgICBudW1JdGVtcyA9IF9pdGVtcy5TaXplKCk7DQorICBpZiAoX3N0cmVhbSAmJiBudW1JdGVtcyA9PSAwKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIFVJbnQ2NCB0b3RhbFNpemUgPSAwOw0KKyAgVUludDMyIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykNCisgICAgdG90YWxTaXplICs9IF9pdGVtc1thbGxGaWxlc01vZGUgPyBpIDogaW5kaWNlc1tpXV0uU2l6ZTsNCisgIGV4dHJhY3RDYWxsYmFjay0+U2V0VG90YWwodG90YWxTaXplKTsNCisNCisgIHRvdGFsU2l6ZSA9IDA7DQorICANCisgIENMb2NhbFByb2dyZXNzICpscHMgPSBuZXcgQ0xvY2FsUHJvZ3Jlc3M7DQorICBDTXlDb21QdHI8SUNvbXByZXNzUHJvZ3Jlc3NJbmZvPiBwcm9ncmVzcyA9IGxwczsNCisgIGxwcy0+SW5pdChleHRyYWN0Q2FsbGJhY2ssIGZhbHNlKTsNCisNCisgIENMaW1pdGVkU2VxdWVudGlhbEluU3RyZWFtICpzdHJlYW1TcGVjID0gbmV3IENMaW1pdGVkU2VxdWVudGlhbEluU3RyZWFtOw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IGluU3RyZWFtKHN0cmVhbVNwZWMpOw0KKyAgc3RyZWFtU3BlYy0+U2V0U3RyZWFtKF9zdHJlYW0pOw0KKw0KKyAgQ0xpbWl0ZWRTZXF1ZW50aWFsT3V0U3RyZWFtICpvdXRTdHJlYW1TcGVjID0gbmV3IENMaW1pdGVkU2VxdWVudGlhbE91dFN0cmVhbTsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gb3V0U3RyZWFtKG91dFN0cmVhbVNwZWMpOw0KKw0KKyAgTkNvbXByZXNzOjpDQ29weUNvZGVyICpjb3B5Q29kZXJTcGVjID0gbmV3IE5Db21wcmVzczo6Q0NvcHlDb2RlcigpOw0KKyAgQ015Q29tUHRyPElDb21wcmVzc0NvZGVyPiBjb3B5Q29kZXIgPSBjb3B5Q29kZXJTcGVjOw0KKw0KKyAgZm9yIChpID0gMDsgaSA8IG51bUl0ZW1zOyBpKyspDQorICB7DQorICAgIGxwcy0+SW5TaXplID0gdG90YWxTaXplOw0KKyAgICBscHMtPk91dFNpemUgPSB0b3RhbFNpemU7DQorICAgIFJJTk9LKGxwcy0+U2V0Q3VyKCkpOw0KKyAgICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IHJlYWxPdXRTdHJlYW07DQorICAgIEludDMyIGFza01vZGUgPSB0ZXN0TW9kZSA/DQorICAgICAgICBORXh0cmFjdDo6TkFza01vZGU6OmtUZXN0IDoNCisgICAgICAgIE5FeHRyYWN0OjpOQXNrTW9kZTo6a0V4dHJhY3Q7DQorICAgIEludDMyIGluZGV4ID0gYWxsRmlsZXNNb2RlID8gaSA6IGluZGljZXNbaV07DQorICAgIGNvbnN0IENQYXJzZUl0ZW0gJml0ZW0gPSBfaXRlbXNbaW5kZXhdOw0KKw0KKyAgICBSSU5PSyhleHRyYWN0Q2FsbGJhY2stPkdldFN0cmVhbShpbmRleCwgJnJlYWxPdXRTdHJlYW0sIGFza01vZGUpKTsNCisgICAgVUludDY0IHVucGFja1NpemUgPSBpdGVtLlNpemU7DQorICAgIHRvdGFsU2l6ZSArPSB1bnBhY2tTaXplOw0KKyAgICBib29sIHNraXBNb2RlID0gZmFsc2U7DQorICAgIGlmICghdGVzdE1vZGUgJiYgIXJlYWxPdXRTdHJlYW0pDQorICAgICAgY29udGludWU7DQorICAgIFJJTk9LKGV4dHJhY3RDYWxsYmFjay0+UHJlcGFyZU9wZXJhdGlvbihhc2tNb2RlKSk7DQorDQorICAgIG91dFN0cmVhbVNwZWMtPlNldFN0cmVhbShyZWFsT3V0U3RyZWFtKTsNCisgICAgcmVhbE91dFN0cmVhbS5SZWxlYXNlKCk7DQorICAgIG91dFN0cmVhbVNwZWMtPkluaXQoc2tpcE1vZGUgPyAwIDogdW5wYWNrU2l6ZSwgdHJ1ZSk7DQorDQorICAgIEludDMyIG9wUmVzID0gTkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtPSzsNCisgICAgUklOT0soX3N0cmVhbS0+U2VlayhpdGVtLk9mZnNldCwgU1RSRUFNX1NFRUtfU0VULCBOVUxMKSk7DQorICAgIHN0cmVhbVNwZWMtPkluaXQodW5wYWNrU2l6ZSk7DQorICAgIFJJTk9LKGNvcHlDb2Rlci0+Q29kZShpblN0cmVhbSwgb3V0U3RyZWFtLCBOVUxMLCBOVUxMLCBwcm9ncmVzcykpOw0KKw0KKyAgICBpZiAob3V0U3RyZWFtU3BlYy0+R2V0UmVtKCkgIT0gMCkNCisgICAgICBvcFJlcyA9IE5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprRGF0YUVycm9yOw0KKyAgICBvdXRTdHJlYW1TcGVjLT5SZWxlYXNlU3RyZWFtKCk7DQorICAgIFJJTk9LKGV4dHJhY3RDYWxsYmFjay0+U2V0T3BlcmF0aW9uUmVzdWx0KG9wUmVzKSk7DQorICB9DQorICByZXR1cm4gU19PSzsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KKw0KK1NURE1FVEhPRElNUCBDSGFuZGxlcjo6R2V0U3RyZWFtKFVJbnQzMiBpbmRleCwgSVNlcXVlbnRpYWxJblN0cmVhbSAqKnN0cmVhbSkNCit7DQorICBDT01fVFJZX0JFR0lODQorICBjb25zdCBDUGFyc2VJdGVtICZpdGVtID0gX2l0ZW1zW2luZGV4XTsNCisgIHJldHVybiBDcmVhdGVMaW1pdGVkSW5TdHJlYW0oX3N0cmVhbSwgaXRlbS5PZmZzZXQsIGl0ZW0uU2l6ZSwgc3RyZWFtKTsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KK319DQorDQorI2VuZGlmDQorDQorSFJFU1VMVCBBcmNoaXZlX0dldEl0ZW1Cb29sUHJvcChJSW5BcmNoaXZlICphcmMsIFVJbnQzMiBpbmRleCwgUFJPUElEIHByb3BJRCwgYm9vbCAmcmVzdWx0KSB0aHJvdygpDQorew0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICByZXN1bHQgPSBmYWxzZTsNCisgIFJJTk9LKGFyYy0+R2V0UHJvcGVydHkoaW5kZXgsIHByb3BJRCwgJnByb3ApKTsNCisgIGlmIChwcm9wLnZ0ID09IFZUX0JPT0wpDQorICAgIHJlc3VsdCA9IFZBUklBTlRfQk9PTFRvQm9vbChwcm9wLmJvb2xWYWwpOw0KKyAgZWxzZSBpZiAocHJvcC52dCAhPSBWVF9FTVBUWSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIEFyY2hpdmVfSXNJdGVtX0ZvbGRlcihJSW5BcmNoaXZlICphcmMsIFVJbnQzMiBpbmRleCwgYm9vbCAmcmVzdWx0KSB0aHJvdygpDQorew0KKyAgcmV0dXJuIEFyY2hpdmVfR2V0SXRlbUJvb2xQcm9wKGFyYywgaW5kZXgsIGtwaWRJc0RpciwgcmVzdWx0KTsNCit9DQorDQorSFJFU1VMVCBBcmNoaXZlX0lzSXRlbV9BdXgoSUluQXJjaGl2ZSAqYXJjLCBVSW50MzIgaW5kZXgsIGJvb2wgJnJlc3VsdCkgdGhyb3coKQ0KK3sNCisgIHJldHVybiBBcmNoaXZlX0dldEl0ZW1Cb29sUHJvcChhcmMsIGluZGV4LCBrcGlkSXNBdXgsIHJlc3VsdCk7DQorfQ0KKw0KK0hSRVNVTFQgQXJjaGl2ZV9Jc0l0ZW1fQWx0U3RyZWFtKElJbkFyY2hpdmUgKmFyYywgVUludDMyIGluZGV4LCBib29sICZyZXN1bHQpIHRocm93KCkNCit7DQorICByZXR1cm4gQXJjaGl2ZV9HZXRJdGVtQm9vbFByb3AoYXJjLCBpbmRleCwga3BpZElzQWx0U3RyZWFtLCByZXN1bHQpOw0KK30NCisNCitIUkVTVUxUIEFyY2hpdmVfSXNJdGVtX0RlbGV0ZWQoSUluQXJjaGl2ZSAqYXJjLCBVSW50MzIgaW5kZXgsIGJvb2wgJnJlc3VsdCkgdGhyb3coKQ0KK3sNCisgIHJldHVybiBBcmNoaXZlX0dldEl0ZW1Cb29sUHJvcChhcmMsIGluZGV4LCBrcGlkSXNEZWxldGVkLCByZXN1bHQpOw0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBBcmNoaXZlX0dldEFyY0Jvb2xQcm9wKElJbkFyY2hpdmUgKmFyYywgUFJPUElEIHByb3BpZCwgYm9vbCAmcmVzdWx0KQ0KK3sNCisgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgcmVzdWx0ID0gZmFsc2U7DQorICBSSU5PSyhhcmMtPkdldEFyY2hpdmVQcm9wZXJ0eShwcm9waWQsICZwcm9wKSk7DQorICBpZiAocHJvcC52dCA9PSBWVF9CT09MKQ0KKyAgICByZXN1bHQgPSBWQVJJQU5UX0JPT0xUb0Jvb2wocHJvcC5ib29sVmFsKTsNCisgIGVsc2UgaWYgKHByb3AudnQgIT0gVlRfRU1QVFkpDQorICAgIHJldHVybiBFX0ZBSUw7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorc3RhdGljIEhSRVNVTFQgQXJjaGl2ZV9HZXRBcmNQcm9wX1VJbnQoSUluQXJjaGl2ZSAqYXJjLCBQUk9QSUQgcHJvcGlkLCBVSW50NjQgJnJlc3VsdCwgYm9vbCAmZGVmaW5lZCkNCit7DQorICBkZWZpbmVkID0gZmFsc2U7DQorICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgIFJJTk9LKGFyYy0+R2V0QXJjaGl2ZVByb3BlcnR5KHByb3BpZCwgJnByb3ApKTsNCisgIHN3aXRjaCAocHJvcC52dCkNCisgIHsNCisgICAgY2FzZSBWVF9VSTQ6IHJlc3VsdCA9IHByb3AudWxWYWw7IGRlZmluZWQgPSB0cnVlOyBicmVhazsNCisgICAgY2FzZSBWVF9JNDogcmVzdWx0ID0gcHJvcC5sVmFsOyBkZWZpbmVkID0gdHJ1ZTsgYnJlYWs7DQorICAgIGNhc2UgVlRfVUk4OiByZXN1bHQgPSAoVUludDY0KXByb3AudWhWYWwuUXVhZFBhcnQ7IGRlZmluZWQgPSB0cnVlOyBicmVhazsNCisgICAgY2FzZSBWVF9JODogcmVzdWx0ID0gKFVJbnQ2NClwcm9wLmhWYWwuUXVhZFBhcnQ7IGRlZmluZWQgPSB0cnVlOyBicmVhazsNCisgICAgY2FzZSBWVF9FTVBUWTogYnJlYWs7DQorICAgIGRlZmF1bHQ6IHJldHVybiBFX0ZBSUw7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorc3RhdGljIEhSRVNVTFQgQXJjaGl2ZV9HZXRBcmNQcm9wX0ludChJSW5BcmNoaXZlICphcmMsIFBST1BJRCBwcm9waWQsIEludDY0ICZyZXN1bHQsIGJvb2wgJmRlZmluZWQpDQorew0KKyAgZGVmaW5lZCA9IGZhbHNlOw0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBSSU5PSyhhcmMtPkdldEFyY2hpdmVQcm9wZXJ0eShwcm9waWQsICZwcm9wKSk7DQorICBzd2l0Y2ggKHByb3AudnQpDQorICB7DQorICAgIGNhc2UgVlRfVUk0OiByZXN1bHQgPSBwcm9wLnVsVmFsOyBkZWZpbmVkID0gdHJ1ZTsgYnJlYWs7DQorICAgIGNhc2UgVlRfSTQ6IHJlc3VsdCA9IHByb3AubFZhbDsgZGVmaW5lZCA9IHRydWU7IGJyZWFrOw0KKyAgICBjYXNlIFZUX1VJODogcmVzdWx0ID0gKEludDY0KXByb3AudWhWYWwuUXVhZFBhcnQ7IGRlZmluZWQgPSB0cnVlOyBicmVhazsNCisgICAgY2FzZSBWVF9JODogcmVzdWx0ID0gKEludDY0KXByb3AuaFZhbC5RdWFkUGFydDsgZGVmaW5lZCA9IHRydWU7IGJyZWFrOw0KKyAgICBjYXNlIFZUX0VNUFRZOiBicmVhazsNCisgICAgZGVmYXVsdDogcmV0dXJuIEVfRkFJTDsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENBcmM6OkdldEl0ZW1QYXRoVG9QYXJlbnQoVUludDMyIGluZGV4LCBVSW50MzIgcGFyZW50LCBVU3RyaW5nVmVjdG9yICZwYXJ0cykgY29uc3QNCit7DQorICBpZiAoIUdldFJhd1Byb3BzKQ0KKyAgICByZXR1cm4gRV9GQUlMOw0KKyAgVUludDMyIGN1ckluZGV4ID0gaW5kZXg7DQorICBib29sIHByZXZXYXNBbHRTdHJlYW0gPSBmYWxzZTsNCisgIGZvciAoOzspDQorICB7DQorICAgIFVTdHJpbmcgczsNCisgICAgDQorICAgICNpZmRlZiBNWV9DUFVfTEUNCisgICAgY29uc3Qgdm9pZCAqcDsNCisgICAgVUludDMyIHNpemU7DQorICAgIFVJbnQzMiBwcm9wVHlwZTsNCisgICAgUklOT0soR2V0UmF3UHJvcHMtPkdldFJhd1Byb3AoY3VySW5kZXgsIGtwaWROYW1lLCAmcCwgJnNpemUsICZwcm9wVHlwZSkpOw0KKyAgICBpZiAocCAmJiBwcm9wVHlwZSA9PSBQUk9QX0RBVEFfVFlQRV93Y2hhcl90X1BUUl9aX0xFKQ0KKyAgICAgIHMgPSAoY29uc3Qgd2NoYXJfdCAqKXA7DQorICAgIGVsc2UNCisgICAgI2VuZGlmDQorICAgIHsNCisgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgICBSSU5PSyhBcmNoaXZlLT5HZXRQcm9wZXJ0eShjdXJJbmRleCwga3BpZE5hbWUsICZwcm9wKSk7DQorICAgICAgaWYgKHByb3AudnQgPT0gVlRfQlNUUikNCisgICAgICAgIHMgPSBwcm9wLmJzdHJWYWw7DQorICAgICAgZWxzZSBpZiAocHJvcC52dCA9PSBWVF9FTVBUWSkNCisgICAgICAgIHMgPSBMIltDb250ZW50XSI7DQorICAgICAgZWxzZQ0KKyAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgfQ0KKyAgICANCisgICAgaWYgKHByZXZXYXNBbHRTdHJlYW0pDQorICAgICAgcGFydHNbMF0gPSBzICsgTCI6IiArIHBhcnRzWzBdOw0KKyAgICBlbHNlDQorICAgICAgcGFydHMuSW5zZXJ0KDAsIHMpOw0KKw0KKyAgICBVSW50MzIgY3VyUGFyZW50ID0gKFVJbnQzMikoSW50MzIpLTE7DQorICAgIFVJbnQzMiBwYXJlbnRUeXBlID0gMDsNCisgICAgUklOT0soR2V0UmF3UHJvcHMtPkdldFBhcmVudChjdXJJbmRleCwgJmN1clBhcmVudCwgJnBhcmVudFR5cGUpKTsNCisgICAgaWYgKHBhcmVudCA9PSBjdXJQYXJlbnQpDQorICAgICAgcmV0dXJuIFNfT0s7DQorICAgIGlmIChjdXJQYXJlbnQgPT0gKFVJbnQzMikoSW50MzIpLTEpDQorICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgcHJldldhc0FsdFN0cmVhbSA9IChwYXJlbnRUeXBlID09IE5QYXJlbnRUeXBlOjprQWx0U3RyZWFtKTsNCisgICAgY3VySW5kZXggPSBjdXJQYXJlbnQ7DQorICB9DQorfQ0KKw0KK0hSRVNVTFQgQ0FyYzo6R2V0SXRlbVBhdGgoVUludDMyIGluZGV4LCBVU3RyaW5nICZyZXN1bHQpIGNvbnN0DQorew0KKyAgI2lmZGVmIE1ZX0NQVV9MRQ0KKyAgaWYgKEdldFJhd1Byb3BzKQ0KKyAgew0KKyAgICBjb25zdCB2b2lkICpwOw0KKyAgICBVSW50MzIgc2l6ZTsNCisgICAgVUludDMyIHByb3BUeXBlOw0KKyAgICBpZiAoIUlzVHJlZSkNCisgICAgew0KKyAgICAgIGlmIChHZXRSYXdQcm9wcy0+R2V0UmF3UHJvcChpbmRleCwga3BpZFBhdGgsICZwLCAmc2l6ZSwgJnByb3BUeXBlKSA9PSBTX09LICYmDQorICAgICAgICAgIHByb3BUeXBlID09IE5Qcm9wRGF0YVR5cGU6OmtVdGYxNnopDQorICAgICAgew0KKyAgICAgICAgdW5zaWduZWQgbGVuID0gc2l6ZSAvIDIgLSAxOw0KKyAgICAgICAgd2NoYXJfdCAqcyA9IHJlc3VsdC5HZXRCdWZmZXIobGVuKTsNCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykNCisgICAgICAgIHsNCisgICAgICAgICAgd2NoYXJfdCBjID0gR2V0VWkxNihwKTsNCisgICAgICAgICAgcCA9IChjb25zdCB2b2lkICopKChjb25zdCBCeXRlICopcCArIDIpOw0KKyAgICAgICAgICAjaWYgV0NIQVJfUEFUSF9TRVBBUkFUT1IgIT0gTCcvJw0KKyAgICAgICAgICBpZiAoYyA9PSBMJy8nKQ0KKyAgICAgICAgICAgIGMgPSBXQ0hBUl9QQVRIX1NFUEFSQVRPUjsNCisgICAgICAgICAgI2VuZGlmDQorICAgICAgICAgICpzKysgPSBjOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIobGVuKTsNCisgICAgICAgIGlmIChsZW4gIT0gMCkNCisgICAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgfQ0KKyAgICB9DQorICAgIC8qDQorICAgIGVsc2UgaWYgKEdldFJhd1Byb3BzLT5HZXRSYXdQcm9wKGluZGV4LCBrcGlkTmFtZSwgJnAsICZzaXplLCAmcHJvcFR5cGUpID09IFNfT0sgJiYNCisgICAgICAgIHAgJiYgcHJvcFR5cGUgPT0gTlByb3BEYXRhVHlwZTo6a1V0ZjE2eikNCisgICAgew0KKyAgICAgIFVJbnQzMiB0b3RhbFNpemUgPSBzaXplOw0KKyAgICAgIGJvb2wgaXNPSyA9IGZhbHNlOw0KKyAgICAgIHsNCisgICAgICAgIFVJbnQzMiBpbmRleDIgPSBpbmRleDsNCisgICAgICAgIGZvciAoOzspDQorICAgICAgICB7DQorICAgICAgICAgIFVJbnQzMiBwYXJlbnQgPSAoVUludDMyKShJbnQzMiktMTsNCisgICAgICAgICAgVUludDMyIHBhcmVudFR5cGUgPSAwOw0KKyAgICAgICAgICBpZiAoR2V0UmF3UHJvcHMtPkdldFBhcmVudChpbmRleDIsICZwYXJlbnQsICZwYXJlbnRUeXBlKSAhPSBTX09LKQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBpZiAocGFyZW50ID09IChVSW50MzIpKEludDMyKS0xKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgaXNPSyA9IHRydWU7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW5kZXgyID0gcGFyZW50Ow0KKyAgICAgICAgICBVSW50MzIgc2l6ZTI7DQorICAgICAgICAgIGNvbnN0IHZvaWQgKnAyOw0KKyAgICAgICAgICBpZiAoR2V0UmF3UHJvcHMtPkdldFJhd1Byb3AoaW5kZXgyLCBrcGlkTmFtZSwgJnAyLCAmc2l6ZTIsICZwcm9wVHlwZSkgIT0gU19PSykNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgdG90YWxTaXplICs9IHNpemUyOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBpZiAoaXNPSykNCisgICAgICB7DQorICAgICAgICB3Y2hhcl90ICpzeiA9IHJlc3VsdC5HZXRCdWZmZXIodG90YWxTaXplIC8gMik7DQorICAgICAgICBVSW50MzIgcG9zID0gdG90YWxTaXplIC0gc2l6ZTsNCisgICAgICAgIG1lbWNweSgoQnl0ZSAqKXN6ICsgcG9zLCBwLCBzaXplIC0gMik7DQorICAgICAgICBVSW50MzIgaW5kZXgyID0gaW5kZXg7DQorICAgICAgICBmb3IgKDs7KQ0KKyAgICAgICAgew0KKyAgICAgICAgICBVSW50MzIgcGFyZW50ID0gKFVJbnQzMikoSW50MzIpLTE7DQorICAgICAgICAgIFVJbnQzMiBwYXJlbnRUeXBlID0gMDsNCisgICAgICAgICAgaWYgKEdldFJhd1Byb3BzLT5HZXRQYXJlbnQoaW5kZXgyLCAmcGFyZW50LCAmcGFyZW50VHlwZSkgIT0gU19PSykNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgaWYgKHBhcmVudCA9PSAoVUludDMyKShJbnQzMiktMSkNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgaW5kZXgyID0gcGFyZW50Ow0KKyAgICAgICAgICBVSW50MzIgc2l6ZTI7DQorICAgICAgICAgIGNvbnN0IHZvaWQgKnAyOw0KKyAgICAgICAgICBpZiAoR2V0UmF3UHJvcHMtPkdldFJhd1Byb3AoaW5kZXgyLCBrcGlkTmFtZSwgJnAyLCAmc2l6ZTIsICZwcm9wVHlwZSkgIT0gU19PSykNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgcG9zIC09IHNpemUyOw0KKyAgICAgICAgICBtZW1jcHkoKEJ5dGUgKilzeiArIHBvcywgcDIsIHNpemUyKTsNCisgICAgICAgICAgc3pbKHBvcyArIHNpemUyIC0gMikgLyAyXSA9IChwYXJlbnRUeXBlID09IDApID8gV0NIQVJfUEFUSF9TRVBBUkFUT1IgOiBMJzonOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoKHRvdGFsU2l6ZSAtIDIpIC8gMik7DQorICAgICAgICAjaWZkZWYgX1dJTjMyDQorICAgICAgICAvLyByZXN1bHQuUmVwbGFjZShMJy8nLCBXQ0hBUl9QQVRIX1NFUEFSQVRPUik7DQorICAgICAgICAjZW5kaWYNCisgICAgICAgIHJldHVybiBTX09LOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICAqLw0KKyAgfQ0KKyAgI2VuZGlmDQorICANCisgIHsNCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgIFJJTk9LKEFyY2hpdmUtPkdldFByb3BlcnR5KGluZGV4LCBrcGlkUGF0aCwgJnByb3ApKTsNCisgICAgaWYgKHByb3AudnQgPT0gVlRfQlNUUikNCisgICAgICByZXN1bHQgPSBwcm9wLmJzdHJWYWw7DQorICAgIGVsc2UgaWYgKHByb3AudnQgPT0gVlRfRU1QVFkpDQorICAgICAgcmVzdWx0LkVtcHR5KCk7DQorICAgIGVsc2UNCisgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgfQ0KKyAgDQorICBpZiAocmVzdWx0LklzRW1wdHkoKSkNCisgIHsNCisgICAgcmVzdWx0ID0gRGVmYXVsdE5hbWU7DQorICAgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgICBSSU5PSyhBcmNoaXZlLT5HZXRQcm9wZXJ0eShpbmRleCwga3BpZEV4dGVuc2lvbiwgJnByb3ApKTsNCisgICAgaWYgKHByb3AudnQgPT0gVlRfQlNUUikNCisgICAgew0KKyAgICAgIHJlc3VsdCArPSBMJy4nOw0KKyAgICAgIHJlc3VsdCArPSBwcm9wLmJzdHJWYWw7DQorICAgIH0NCisgICAgZWxzZSBpZiAocHJvcC52dCAhPSBWVF9FTVBUWSkNCisgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ0FyYzo6R2V0SXRlbVBhdGgyKFVJbnQzMiBpbmRleCwgVVN0cmluZyAmcmVzdWx0KSBjb25zdA0KK3sNCisgIFJJTk9LKEdldEl0ZW1QYXRoKGluZGV4LCByZXN1bHQpKTsNCisgIGlmIChBc2tfRGVsZXRlZCkNCisgIHsNCisgICAgYm9vbCBpc0RlbGV0ZWQgPSBmYWxzZTsNCisgICAgUklOT0soQXJjaGl2ZV9Jc0l0ZW1fRGVsZXRlZChBcmNoaXZlLCBpbmRleCwgaXNEZWxldGVkKSk7DQorICAgIGlmIChpc0RlbGV0ZWQpDQorICAgICAgcmVzdWx0Lkluc2VydCgwLCBMIltERUxFVEVEXSIgV1NUUklOR19QQVRIX1NFUEFSQVRPUik7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorI2lmbmRlZiBfU0ZYDQorDQorc3RhdGljIEhSRVNVTFQgQXJjaGl2ZV9HZXRJdGVtX1NpemUoSUluQXJjaGl2ZSAqYXJjaGl2ZSwgVUludDMyIGluZGV4LCBVSW50NjQgJnNpemUsIGJvb2wgJmRlZmluZWQpDQorew0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBkZWZpbmVkID0gZmFsc2U7DQorICBzaXplID0gMDsNCisgIFJJTk9LKGFyY2hpdmUtPkdldFByb3BlcnR5KGluZGV4LCBrcGlkU2l6ZSwgJnByb3ApKTsNCisgIHN3aXRjaCAocHJvcC52dCkNCisgIHsNCisgICAgY2FzZSBWVF9VSTE6IHNpemUgPSBwcm9wLmJWYWw7IGJyZWFrOw0KKyAgICBjYXNlIFZUX1VJMjogc2l6ZSA9IHByb3AudWlWYWw7IGJyZWFrOw0KKyAgICBjYXNlIFZUX1VJNDogc2l6ZSA9IHByb3AudWxWYWw7IGJyZWFrOw0KKyAgICBjYXNlIFZUX1VJODogc2l6ZSA9IChVSW50NjQpcHJvcC51aFZhbC5RdWFkUGFydDsgYnJlYWs7DQorICAgIGNhc2UgVlRfRU1QVFk6IHJldHVybiBTX09LOw0KKyAgICBkZWZhdWx0OiByZXR1cm4gRV9GQUlMOw0KKyAgfQ0KKyAgZGVmaW5lZCA9IHRydWU7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorI2VuZGlmDQorDQorSFJFU1VMVCBDQXJjOjpHZXRJdGVtU2l6ZShVSW50MzIgaW5kZXgsIFVJbnQ2NCAmc2l6ZSwgYm9vbCAmZGVmaW5lZCkgY29uc3QNCit7DQorICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgIGRlZmluZWQgPSBmYWxzZTsNCisgIHNpemUgPSAwOw0KKyAgUklOT0soQXJjaGl2ZS0+R2V0UHJvcGVydHkoaW5kZXgsIGtwaWRTaXplLCAmcHJvcCkpOw0KKyAgc3dpdGNoIChwcm9wLnZ0KQ0KKyAgew0KKyAgICBjYXNlIFZUX1VJMTogc2l6ZSA9IHByb3AuYlZhbDsgYnJlYWs7DQorICAgIGNhc2UgVlRfVUkyOiBzaXplID0gcHJvcC51aVZhbDsgYnJlYWs7DQorICAgIGNhc2UgVlRfVUk0OiBzaXplID0gcHJvcC51bFZhbDsgYnJlYWs7DQorICAgIGNhc2UgVlRfVUk4OiBzaXplID0gKFVJbnQ2NClwcm9wLnVoVmFsLlF1YWRQYXJ0OyBicmVhazsNCisgICAgY2FzZSBWVF9FTVBUWTogcmV0dXJuIFNfT0s7DQorICAgIGRlZmF1bHQ6IHJldHVybiBFX0ZBSUw7DQorICB9DQorICBkZWZpbmVkID0gdHJ1ZTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENBcmM6OkdldEl0ZW1NVGltZShVSW50MzIgaW5kZXgsIEZJTEVUSU1FICZmdCwgYm9vbCAmZGVmaW5lZCkgY29uc3QNCit7DQorICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgIGRlZmluZWQgPSBmYWxzZTsNCisgIGZ0LmR3SGlnaERhdGVUaW1lID0gZnQuZHdMb3dEYXRlVGltZSA9IDA7DQorICBSSU5PSyhBcmNoaXZlLT5HZXRQcm9wZXJ0eShpbmRleCwga3BpZE1UaW1lLCAmcHJvcCkpOw0KKyAgaWYgKHByb3AudnQgPT0gVlRfRklMRVRJTUUpDQorICB7DQorICAgIGZ0ID0gcHJvcC5maWxldGltZTsNCisgICAgZGVmaW5lZCA9IHRydWU7DQorICB9DQorICBlbHNlIGlmIChwcm9wLnZ0ICE9IFZUX0VNUFRZKQ0KKyAgICByZXR1cm4gRV9GQUlMOw0KKyAgZWxzZSBpZiAoTVRpbWVEZWZpbmVkKQ0KKyAgew0KKyAgICBmdCA9IE1UaW1lOw0KKyAgICBkZWZpbmVkID0gdHJ1ZTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCisjaWZuZGVmIF9TRlgNCisNCitzdGF0aWMgaW5saW5lIGJvb2wgVGVzdFNpZ25hdHVyZShjb25zdCBCeXRlICpwMSwgY29uc3QgQnl0ZSAqcDIsIHNpemVfdCBzaXplKQ0KK3sNCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KKyAgICBpZiAocDFbaV0gIT0gcDJbaV0pDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIE1ha2VDaGVja09yZGVyKENDb2RlY3MgKmNvZGVjcywNCisgICAgQ0ludFZlY3RvciAmb3JkZXJJbmRpY2VzLCB1bnNpZ25lZCBudW1UeXBlcywgQ0ludFZlY3RvciAmb3JkZXJJbmRpY2VzMiwNCisgICAgY29uc3QgQnl0ZSAqZGF0YSwgc2l6ZV90IGRhdGFTaXplKQ0KK3sNCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1UeXBlczsgaSsrKQ0KKyAgew0KKyAgICBpbnQgaW5kZXggPSBvcmRlckluZGljZXNbaV07DQorICAgIGlmIChpbmRleCA8IDApDQorICAgICAgY29udGludWU7DQorICAgIGNvbnN0IENBcmNJbmZvRXggJmFpID0gY29kZWNzLT5Gb3JtYXRzW2luZGV4XTsNCisgICAgaWYgKGFpLlNpZ25hdHVyZU9mZnNldCAhPSAwKQ0KKyAgICB7DQorICAgICAgb3JkZXJJbmRpY2VzMi5BZGQoaW5kZXgpOw0KKyAgICAgIG9yZGVySW5kaWNlc1tpXSA9IC0xOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorDQorICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q0J5dGVCdWZmZXI+ICZzaWdzID0gYWkuU2lnbmF0dXJlczsNCisgICAgRk9SX1ZFQ1RPUiAoaywgc2lncykNCisgICAgew0KKyAgICAgIGNvbnN0IENCeXRlQnVmZmVyICZzaWcgPSBzaWdzW2tdOw0KKyAgICAgIGlmIChzaWcuU2l6ZSgpID09IDAgJiYgZGF0YVNpemUgPT0gMCB8fA0KKyAgICAgICAgICBzaWcuU2l6ZSgpICE9IDAgJiYgc2lnLlNpemUoKSA8PSBkYXRhU2l6ZSAmJg0KKyAgICAgICAgICBUZXN0U2lnbmF0dXJlKGRhdGEsIHNpZywgc2lnLlNpemUoKSkpDQorICAgICAgew0KKyAgICAgICAgb3JkZXJJbmRpY2VzMi5BZGQoaW5kZXgpOw0KKyAgICAgICAgb3JkZXJJbmRpY2VzW2ldID0gLTE7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQorDQorI2VuZGlmDQorDQorI2lmZGVmIFVOREVSX0NFDQorICBzdGF0aWMgY29uc3QgdW5zaWduZWQga051bUhhc2hCeXRlcyA9IDE7DQorICAjZGVmaW5lIEhBU0hfVkFMKGJ1ZiwgcG9zKSAoKGJ1ZilbcG9zXSkNCisjZWxzZQ0KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtOdW1IYXNoQnl0ZXMgPSAyOw0KKyAgI2RlZmluZSBIQVNIX1ZBTChidWYsIHBvcykgKChidWYpW3Bvc10gfCAoKFVJbnQzMikoYnVmKVtwb3MgKyAxXSA8PCA4KSkNCisjZW5kaWYNCisNCisNCisjaWZuZGVmIF9TRlgNCisNCitzdGF0aWMgYm9vbCBJc0V4ZUV4dChjb25zdCBVU3RyaW5nICZleHQpDQorew0KKyAgcmV0dXJuIGV4dC5Jc0VxdWFsVG9Ob0Nhc2UoTCJleGUiKTsNCit9DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtfUHJlQXJjRm9ybWF0c1tdID0NCit7DQorICAgICJwZSINCisgICwgImVsZiINCisgICwgIm1hY2hvIg0KKyAgLCAibXViIg0KKyAgLCAidGUiDQorfTsNCisNCitzdGF0aWMgYm9vbCBJc05hbWVGcm9tTGlzdChjb25zdCBVU3RyaW5nICZzLCBjb25zdCBjaGFyICpuYW1lc1tdLCBzaXplX3QgbnVtKQ0KK3sNCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW07IGkrKykNCisgICAgaWYgKFN0cmluZ3NBcmVFcXVhbE5vQ2FzZV9Bc2NpaShzLCBuYW1lc1tpXSkpDQorICAgICAgcmV0dXJuIHRydWU7DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KKw0KK3N0YXRpYyBib29sIElzUHJlQXJjRm9ybWF0KGNvbnN0IENBcmNJbmZvRXggJmFpKQ0KK3sNCisgIGlmIChhaS5GbGFnc19QcmVBcmMoKSkNCisgICAgcmV0dXJuIHRydWU7DQorICByZXR1cm4gSXNOYW1lRnJvbUxpc3QoYWkuTmFtZSwga19QcmVBcmNGb3JtYXRzLCBBUlJBWV9TSVpFKGtfUHJlQXJjRm9ybWF0cykpOw0KK30NCisNCitzdGF0aWMgY29uc3QgY2hhciAqa19Gb3JtYXRzX3dpdGhfc2ltcGxlX3NpZ251YXR1cmVbXSA9DQorew0KKyAgICAiN3oiDQorICAsICJ4eiINCisgICwgInJhciINCisgICwgImJ6aXAyIg0KKyAgLCAiZ3ppcCINCisgICwgImNhYiINCisgICwgIndpbSINCisgICwgInJwbSINCisgICwgInZoZCINCisgICwgInhhciINCit9Ow0KKw0KK3N0YXRpYyBib29sIElzTmV3U3R5bGVTaWduYXR1cmUoY29uc3QgQ0FyY0luZm9FeCAmYWkpDQorew0KKyAgLy8gaWYgKGFpLlZlcnNpb24gPj0gMHg5MUYpDQorICBpZiAoYWkuTmV3SW50ZXJmYWNlKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIHJldHVybiBJc05hbWVGcm9tTGlzdChhaS5OYW1lLCBrX0Zvcm1hdHNfd2l0aF9zaW1wbGVfc2lnbnVhdHVyZSwgQVJSQVlfU0laRShrX0Zvcm1hdHNfd2l0aF9zaW1wbGVfc2lnbnVhdHVyZSkpOw0KK30NCisNCitjbGFzcyBDQXJjaGl2ZU9wZW5DYWxsYmFja19PZmZzZXQ6DQorICBwdWJsaWMgSUFyY2hpdmVPcGVuQ2FsbGJhY2ssDQorICAjaWZuZGVmIF9OT19DUllQVE8NCisgIHB1YmxpYyBJQ3J5cHRvR2V0VGV4dFBhc3N3b3JkLA0KKyAgI2VuZGlmDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCitwdWJsaWM6DQorICBDTXlDb21QdHI8SUFyY2hpdmVPcGVuQ2FsbGJhY2s+IENhbGxiYWNrOw0KKyAgVUludDY0IEZpbGVzOw0KKyAgVUludDY0IE9mZnNldDsNCisgIA0KKyAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICBDTXlDb21QdHI8SUNyeXB0b0dldFRleHRQYXNzd29yZD4gR2V0VGV4dFBhc3N3b3JkOw0KKyAgTVlfVU5LTk9XTl9JTVAyKA0KKyAgICAgIElBcmNoaXZlT3BlbkNhbGxiYWNrLA0KKyAgICAgIElDcnlwdG9HZXRUZXh0UGFzc3dvcmQpDQorICAjZWxzZQ0KKyAgTVlfVU5LTk9XTl9JTVAxKElBcmNoaXZlT3BlbkNhbGxiYWNrKQ0KKyAgI2VuZGlmDQorICBTVERNRVRIT0QoU2V0VG90YWwpKGNvbnN0IFVJbnQ2NCAqZmlsZXMsIGNvbnN0IFVJbnQ2NCAqYnl0ZXMpOw0KKyAgU1RETUVUSE9EKFNldENvbXBsZXRlZCkoY29uc3QgVUludDY0ICpmaWxlcywgY29uc3QgVUludDY0ICpieXRlcyk7DQorICAjaWZuZGVmIF9OT19DUllQVE8NCisgIFNURE1FVEhPRChDcnlwdG9HZXRUZXh0UGFzc3dvcmQpKEJTVFIgKnBhc3N3b3JkKTsNCisgICNlbmRpZg0KK307DQorDQorI2lmbmRlZiBfTk9fQ1JZUFRPDQorU1RETUVUSE9ESU1QIENBcmNoaXZlT3BlbkNhbGxiYWNrX09mZnNldDo6Q3J5cHRvR2V0VGV4dFBhc3N3b3JkKEJTVFIgKnBhc3N3b3JkKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIGlmIChHZXRUZXh0UGFzc3dvcmQpDQorICAgIHJldHVybiBHZXRUZXh0UGFzc3dvcmQtPkNyeXB0b0dldFRleHRQYXNzd29yZChwYXNzd29yZCk7DQorICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorI2VuZGlmDQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlT3BlbkNhbGxiYWNrX09mZnNldDo6U2V0VG90YWwoY29uc3QgVUludDY0ICogLyogZmlsZXMgKi8sIGNvbnN0IFVJbnQ2NCAqIC8qIGJ5dGVzICovKQ0KK3sNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVPcGVuQ2FsbGJhY2tfT2Zmc2V0OjpTZXRDb21wbGV0ZWQoY29uc3QgVUludDY0ICogLyogZmlsZXMgKi8sIGNvbnN0IFVJbnQ2NCAqYnl0ZXMpDQorew0KKyAgaWYgKCFDYWxsYmFjaykNCisgICAgcmV0dXJuIFNfT0s7DQorICBVSW50NjQgdmFsdWUgPSBPZmZzZXQ7DQorICBpZiAoYnl0ZXMpDQorICAgIHZhbHVlICs9ICpieXRlczsNCisgIHJldHVybiBDYWxsYmFjay0+U2V0Q29tcGxldGVkKCZGaWxlcywgJnZhbHVlKTsNCit9DQorDQorI2VuZGlmDQorDQorVUludDMyIEdldE9wZW5BcmNFcnJvckZsYWdzKGNvbnN0IE5DT006OkNQcm9wVmFyaWFudCAmcHJvcCwgYm9vbCAqaXNEZWZpbmVkUHJvcCkNCit7DQorICBpZiAoaXNEZWZpbmVkUHJvcCAhPSBOVUxMKQ0KKyAgICAqaXNEZWZpbmVkUHJvcCA9IGZhbHNlOw0KKw0KKyAgc3dpdGNoIChwcm9wLnZ0KQ0KKyAgew0KKyAgICBjYXNlIFZUX1VJODogaWYgKGlzRGVmaW5lZFByb3ApICppc0RlZmluZWRQcm9wID0gdHJ1ZTsgcmV0dXJuIChVSW50MzIpcHJvcC51aFZhbC5RdWFkUGFydDsNCisgICAgY2FzZSBWVF9VSTQ6IGlmIChpc0RlZmluZWRQcm9wKSAqaXNEZWZpbmVkUHJvcCA9IHRydWU7IHJldHVybiBwcm9wLnVsVmFsOw0KKyAgICBjYXNlIFZUX0VNUFRZOiByZXR1cm4gMDsNCisgICAgZGVmYXVsdDogdGhyb3cgMTUxMTk5Ow0KKyAgfQ0KK30NCisNCit2b2lkIENBcmNFcnJvckluZm86OkNsZWFyRXJyb3JzKCkNCit7DQorICAvLyBFcnJvckZvcm1hdEluZGV4ID0gLTE7IC8vIHdlIGRvbid0IG5lZWQgdG8gY2xlYXIgRXJyb3JGb3JtYXRJbmRleCBoZXJlICEhIQ0KKw0KKyAgVGhlcmVJc1RhaWwgPSBmYWxzZTsNCisgIFVuZXhwZWNlZEVuZCA9IGZhbHNlOw0KKyAgSWdub3JlVGFpbCA9IGZhbHNlOw0KKyAgLy8gTm9uWmVyb3NUYWlsID0gZmFsc2U7DQorICBFcnJvckZsYWdzX0RlZmluZWQgPSBmYWxzZTsNCisgIEVycm9yRmxhZ3MgPSAwOw0KKyAgV2FybmluZ0ZsYWdzID0gMDsNCisgIFRhaWxTaXplID0gMDsNCisNCisgIEVycm9yTWVzc2FnZS5FbXB0eSgpOw0KKyAgV2FybmluZ01lc3NhZ2UuRW1wdHkoKTsNCit9DQorDQorSFJFU1VMVCBDQXJjOjpSZWFkQmFzaWNQcm9wcyhJSW5BcmNoaXZlICphcmNoaXZlLCBVSW50NjQgc3RhcnRQb3MsIEhSRVNVTFQgb3BlblJlcykNCit7DQorICAvLyBPa1BoeVNpemVfRGVmaW5lZCA9IGZhbHNlOw0KKyAgUGh5U2l6ZURlZmluZWQgPSBmYWxzZTsNCisgIFBoeVNpemUgPSAwOw0KKyAgT2Zmc2V0ID0gMDsNCisgIEF2YWlsUGh5U2l6ZSA9IEZpbGVTaXplIC0gc3RhcnRQb3M7DQorDQorICBFcnJvckluZm8uQ2xlYXJFcnJvcnMoKTsNCisgIHsNCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgIFJJTk9LKGFyY2hpdmUtPkdldEFyY2hpdmVQcm9wZXJ0eShrcGlkRXJyb3JGbGFncywgJnByb3ApKTsNCisgICAgRXJyb3JJbmZvLkVycm9yRmxhZ3MgPSBHZXRPcGVuQXJjRXJyb3JGbGFncyhwcm9wLCAmRXJyb3JJbmZvLkVycm9yRmxhZ3NfRGVmaW5lZCk7DQorICB9DQorICB7DQorICAgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgICBSSU5PSyhhcmNoaXZlLT5HZXRBcmNoaXZlUHJvcGVydHkoa3BpZFdhcm5pbmdGbGFncywgJnByb3ApKTsNCisgICAgRXJyb3JJbmZvLldhcm5pbmdGbGFncyA9IEdldE9wZW5BcmNFcnJvckZsYWdzKHByb3ApOw0KKyAgfQ0KKw0KKyAgew0KKyAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgUklOT0soYXJjaGl2ZS0+R2V0QXJjaGl2ZVByb3BlcnR5KGtwaWRFcnJvciwgJnByb3ApKTsNCisgICAgaWYgKHByb3AudnQgIT0gVlRfRU1QVFkpDQorICAgICAgRXJyb3JJbmZvLkVycm9yTWVzc2FnZSA9IChwcm9wLnZ0ID09IFZUX0JTVFIpID8gcHJvcC5ic3RyVmFsIDogTCJVbmtub3duIGVycm9yIjsNCisgIH0NCisgIA0KKyAgew0KKyAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgUklOT0soYXJjaGl2ZS0+R2V0QXJjaGl2ZVByb3BlcnR5KGtwaWRXYXJuaW5nLCAmcHJvcCkpOw0KKyAgICBpZiAocHJvcC52dCAhPSBWVF9FTVBUWSkNCisgICAgICBFcnJvckluZm8uV2FybmluZ01lc3NhZ2UgPSAocHJvcC52dCA9PSBWVF9CU1RSKSA/IHByb3AuYnN0clZhbCA6IEwiVW5rbm93biB3YXJuaW5nIjsNCisgIH0NCisgIA0KKyAgaWYgKG9wZW5SZXMgPT0gU19PSyB8fCBFcnJvckluZm8uSXNBcmNfQWZ0ZXJfTm9uT3BlbigpKQ0KKyAgew0KKyAgICBSSU5PSyhBcmNoaXZlX0dldEFyY1Byb3BfVUludChhcmNoaXZlLCBrcGlkUGh5U2l6ZSwgUGh5U2l6ZSwgUGh5U2l6ZURlZmluZWQpKTsNCisgICAgLyoNCisgICAgUklOT0soQXJjaGl2ZV9HZXRBcmNQcm9wX1VJbnQoYXJjaGl2ZSwga3BpZE9rUGh5U2l6ZSwgT2tQaHlTaXplLCBPa1BoeVNpemVfRGVmaW5lZCkpOw0KKyAgICBpZiAoIU9rUGh5U2l6ZV9EZWZpbmVkKQ0KKyAgICB7DQorICAgICAgT2tQaHlTaXplX0RlZmluZWQgPSBQaHlTaXplRGVmaW5lZDsNCisgICAgICBPa1BoeVNpemUgPSBQaHlTaXplOw0KKyAgICB9DQorICAgICovDQorDQorICAgIGJvb2wgb2Zmc2V0RGVmaW5lZDsNCisgICAgUklOT0soQXJjaGl2ZV9HZXRBcmNQcm9wX0ludChhcmNoaXZlLCBrcGlkT2Zmc2V0LCBPZmZzZXQsIG9mZnNldERlZmluZWQpKTsNCisNCisgICAgSW50NjQgZ2xvYmFsT2Zmc2V0ID0gc3RhcnRQb3MgKyBPZmZzZXQ7DQorICAgIEF2YWlsUGh5U2l6ZSA9IEZpbGVTaXplIC0gZ2xvYmFsT2Zmc2V0Ow0KKyAgICBpZiAoUGh5U2l6ZURlZmluZWQpDQorICAgIHsNCisgICAgICBVSW50NjQgZW5kUG9zID0gZ2xvYmFsT2Zmc2V0ICsgUGh5U2l6ZTsNCisgICAgICBpZiAoZW5kUG9zIDwgRmlsZVNpemUpDQorICAgICAgew0KKyAgICAgICAgQXZhaWxQaHlTaXplID0gUGh5U2l6ZTsNCisgICAgICAgIEVycm9ySW5mby5UaGVyZUlzVGFpbCA9IHRydWU7DQorICAgICAgICBFcnJvckluZm8uVGFpbFNpemUgPSBGaWxlU2l6ZSAtIGVuZFBvczsNCisgICAgICB9DQorICAgICAgZWxzZSBpZiAoZW5kUG9zID4gRmlsZVNpemUpDQorICAgICAgICBFcnJvckluZm8uVW5leHBlY2VkRW5kID0gdHJ1ZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKy8qDQorc3RhdGljIFByaW50TnVtYmVyKGNvbnN0IGNoYXIgKnMsIGludCBuKQ0KK3sNCisgIGNoYXIgdGVtcFsxMDBdOw0KKyAgc3ByaW50Zih0ZW1wLCAiJXMgJWQiLCBzLCBuKTsNCisgIE91dHB1dERlYnVnU3RyaW5nQSh0ZW1wKTsNCit9DQorKi8NCisNCitIUkVTVUxUIENBcmM6OlByZXBhcmVUb09wZW4oY29uc3QgQ09wZW5PcHRpb25zICZvcCwgdW5zaWduZWQgZm9ybWF0SW5kZXgsIENNeUNvbVB0cjxJSW5BcmNoaXZlPiAmYXJjaGl2ZSkNCit7DQorICAvLyBPdXRwdXREZWJ1Z1N0cmluZ1coTCJhMSIpOw0KKyAgLy8gUHJpbnROdW1iZXIoImZvcm1hdEluZGV4IiwgZm9ybWF0SW5kZXgpOw0KKyAgICANCisgIFJJTk9LKG9wLmNvZGVjcy0+Q3JlYXRlSW5BcmNoaXZlKGZvcm1hdEluZGV4LCBhcmNoaXZlKSk7DQorICAvLyBPdXRwdXREZWJ1Z1N0cmluZ1coTCJhMiIpOw0KKyAgaWYgKCFhcmNoaXZlKQ0KKyAgICByZXR1cm4gU19PSzsNCisNCisgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisgIHsNCisgICAgQ015Q29tUHRyPElTZXRDb21wcmVzc0NvZGVjc0luZm8+IHNldENvbXByZXNzQ29kZWNzSW5mbzsNCisgICAgYXJjaGl2ZS5RdWVyeUludGVyZmFjZShJSURfSVNldENvbXByZXNzQ29kZWNzSW5mbywgKHZvaWQgKiopJnNldENvbXByZXNzQ29kZWNzSW5mbyk7DQorICAgIGlmIChzZXRDb21wcmVzc0NvZGVjc0luZm8pDQorICAgIHsNCisgICAgICBSSU5PSyhzZXRDb21wcmVzc0NvZGVjc0luZm8tPlNldENvbXByZXNzQ29kZWNzSW5mbyhvcC5jb2RlY3MpKTsNCisgICAgfQ0KKyAgfQ0KKyAgI2VuZGlmDQorICANCisgIC8vIE91dHB1dERlYnVnU3RyaW5nVyhhaS5OYW1lKTsNCisgIC8vIE91dHB1dERlYnVnU3RyaW5nVyhMImEzIik7DQorICANCisgICNpZm5kZWYgX1NGWA0KKyAgY29uc3QgQ0FyY0luZm9FeCAmYWkgPSBvcC5jb2RlY3MtPkZvcm1hdHNbZm9ybWF0SW5kZXhdOw0KKyAgaWYgKGFpLkZsYWdzX1ByZUFyYygpKQ0KKyAgew0KKyAgICAvKiB3ZSBub3RpZnkgcGFyc2VycyB0aGF0IGV4dHJhY3QgZXhlY3V0YWJsZXMsIHRoYXQgdGhleSBkb24ndCBuZWVkDQorICAgICAgIHRvIG9wZW4gYXJjaGl2ZSwgaWYgdGhlcmUgaXMgdGFpbCBhZnRlciBleGVjdXRhYmxlIChmb3IgU0ZYIGNhc2VzKSAqLw0KKyAgICBDTXlDb21QdHI8SUFyY2hpdmVBbGxvd1RhaWw+IGFsbG93VGFpbDsNCisgICAgYXJjaGl2ZS5RdWVyeUludGVyZmFjZShJSURfSUFyY2hpdmVBbGxvd1RhaWwsICh2b2lkICoqKSZhbGxvd1RhaWwpOw0KKyAgICBpZiAoYWxsb3dUYWlsKQ0KKyAgICAgIGFsbG93VGFpbC0+QWxsb3dUYWlsKEJvb2xUb0ludCh0cnVlKSk7DQorICB9DQorICBpZiAob3AucHJvcHMpDQorICB7DQorICAgIC8qDQorICAgIEZPUl9WRUNUT1IgKHksIG9wLnByb3BzKQ0KKyAgICB7DQorICAgICAgY29uc3QgQ09wdGlvbmFsT3BlblByb3BlcnRpZXMgJm9wdFByb3BzID0gKCpvcC5wcm9wcylbeV07DQorICAgICAgaWYgKG9wdFByb3BzLkZvcm1hdE5hbWUuSXNFbXB0eSgpIHx8IG9wdFByb3BzLkZvcm1hdE5hbWUuQ29tcGFyZU5vQ2FzZShhaS5OYW1lKSA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgIFJJTk9LKFNldFByb3BlcnRpZXMoYXJjaGl2ZSwgb3B0UHJvcHMuUHJvcHMpKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICAqLw0KKyAgICBSSU5PSyhTZXRQcm9wZXJ0aWVzKGFyY2hpdmUsICpvcC5wcm9wcykpOw0KKyAgfQ0KKyAgI2VuZGlmDQorICByZXR1cm4gU19PSzsNCit9DQorDQorI2lmbmRlZiBfU0ZYDQorDQorc3RhdGljIEhSRVNVTFQgUmVhZFBhcnNlSXRlbVByb3BzKElJbkFyY2hpdmUgKmFyY2hpdmUsIGNvbnN0IENBcmNJbmZvRXggJmFpLCBOQXJjaGl2ZTo6TlBhcnNlcjo6Q1BhcnNlSXRlbSAmcGkpDQorew0KKyAgcGkuRXh0ZW5zaW9uID0gYWkuR2V0TWFpbkV4dCgpOw0KKyAgcGkuRmlsZVRpbWVfRGVmaW5lZCA9IGZhbHNlOw0KKyAgcGkuQXJjVHlwZSA9IGFpLk5hbWU7DQorICANCisgIFJJTk9LKEFyY2hpdmVfR2V0QXJjQm9vbFByb3AoYXJjaGl2ZSwga3BpZElzTm90QXJjVHlwZSwgcGkuSXNOb3RBcmNUeXBlKSk7DQorDQorICAvLyBSSU5PSyhBcmNoaXZlX0dldEFyY0Jvb2xQcm9wKGFyY2hpdmUsIGtwaWRJc1NlbGZFeGUsIHBpLklzU2VsZkV4ZSkpOw0KKyAgcGkuSXNTZWxmRXhlID0gYWkuRmxhZ3NfUHJlQXJjKCk7DQorICANCisgIHsNCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgIFJJTk9LKGFyY2hpdmUtPkdldEFyY2hpdmVQcm9wZXJ0eShrcGlkTVRpbWUsICZwcm9wKSk7DQorICAgIGlmIChwcm9wLnZ0ID09IFZUX0ZJTEVUSU1FKQ0KKyAgICB7DQorICAgICAgcGkuRmlsZVRpbWVfRGVmaW5lZCA9IHRydWU7DQorICAgICAgcGkuRmlsZVRpbWUgPSBwcm9wLmZpbGV0aW1lOw0KKyAgICB9DQorICB9DQorICANCisgIGlmICghcGkuRmlsZVRpbWVfRGVmaW5lZCkNCisgIHsNCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgIFJJTk9LKGFyY2hpdmUtPkdldEFyY2hpdmVQcm9wZXJ0eShrcGlkQ1RpbWUsICZwcm9wKSk7DQorICAgIGlmIChwcm9wLnZ0ID09IFZUX0ZJTEVUSU1FKQ0KKyAgICB7DQorICAgICAgcGkuRmlsZVRpbWVfRGVmaW5lZCA9IHRydWU7DQorICAgICAgcGkuRmlsZVRpbWUgPSBwcm9wLmZpbGV0aW1lOw0KKyAgICB9DQorICB9DQorICANCisgIHsNCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgIFJJTk9LKGFyY2hpdmUtPkdldEFyY2hpdmVQcm9wZXJ0eShrcGlkTmFtZSwgJnByb3ApKTsNCisgICAgaWYgKHByb3AudnQgPT0gVlRfQlNUUikNCisgICAgew0KKyAgICAgIHBpLk5hbWUgPSBwcm9wLmJzdHJWYWw7DQorICAgICAgcGkuRXh0ZW5zaW9uLkVtcHR5KCk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgUklOT0soYXJjaGl2ZS0+R2V0QXJjaGl2ZVByb3BlcnR5KGtwaWRFeHRlbnNpb24sICZwcm9wKSk7DQorICAgICAgaWYgKHByb3AudnQgPT0gVlRfQlNUUikNCisgICAgICAgIHBpLkV4dGVuc2lvbiA9IHByb3AuYnN0clZhbDsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICB7DQorICAgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgICBSSU5PSyhhcmNoaXZlLT5HZXRBcmNoaXZlUHJvcGVydHkoa3BpZFNob3J0Q29tbWVudCwgJnByb3ApKTsNCisgICAgaWYgKHByb3AudnQgPT0gVlRfQlNUUikNCisgICAgICBwaS5Db21tZW50ID0gcHJvcC5ic3RyVmFsOw0KKyAgfQ0KKw0KKw0KKyAgVUludDMyIG51bUl0ZW1zOw0KKyAgUklOT0soYXJjaGl2ZS0+R2V0TnVtYmVyT2ZJdGVtcygmbnVtSXRlbXMpKTsNCisgIA0KKyAgLy8gcGkuTnVtU3ViRmlsZXMgPSBudW1JdGVtczsNCisgIC8vIFJJTk9LKEFyY2hpdmVfR2V0QXJjUHJvcF9VSW50KGFyY2hpdmUsIGtwaWRVbnBhY2tTaXplLCBwaS5VbnBhY2tTaXplLCBwaS5VbnBhY2tTaXplX0RlZmluZWQpKTsNCisgIC8vIGlmICghcGkuVW5wYWNrU2l6ZV9EZWZpbmVkKQ0KKyAgew0KKyAgICBwaS5OdW1TdWJGaWxlcyA9IDA7DQorICAgIHBpLk51bVN1YkRpcnMgPSAwOw0KKyAgICBwaS5VbnBhY2tTaXplID0gMDsNCisgICAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKQ0KKyAgICB7DQorICAgICAgVUludDY0IHNpemUgPSAwOw0KKyAgICAgIGJvb2wgZGVmaW5lZCA9IGZhbHNlOw0KKyAgICAgIEFyY2hpdmVfR2V0SXRlbV9TaXplKGFyY2hpdmUsIGksIHNpemUsIGRlZmluZWQpOw0KKyAgICAgIGlmIChkZWZpbmVkKQ0KKyAgICAgIHsNCisgICAgICAgIHBpLlVucGFja1NpemVfRGVmaW5lZCA9IHRydWU7DQorICAgICAgICBwaS5VbnBhY2tTaXplICs9IHNpemU7DQorICAgICAgfQ0KKw0KKyAgICAgIGJvb2wgaXNEaXIgPSBmYWxzZTsNCisgICAgICBBcmNoaXZlX0lzSXRlbV9Gb2xkZXIoYXJjaGl2ZSwgaSwgaXNEaXIpOw0KKyAgICAgIGlmIChpc0RpcikNCisgICAgICAgIHBpLk51bVN1YkRpcnMrKzsNCisgICAgICBlbHNlDQorICAgICAgICBwaS5OdW1TdWJGaWxlcysrOw0KKyAgICB9DQorICAgIGlmIChwaS5OdW1TdWJEaXJzICE9IDApDQorICAgICAgcGkuTnVtU3ViRGlyc19EZWZpbmVkID0gdHJ1ZTsNCisgICAgcGkuTnVtU3ViRmlsZXNfRGVmaW5lZCA9IHRydWU7DQorICB9DQorDQorICByZXR1cm4gU19PSzsNCit9DQorDQorI2VuZGlmDQorDQorSFJFU1VMVCBDQXJjOjpDaGVja1plcm9zVGFpbChjb25zdCBDT3Blbk9wdGlvbnMgJm9wLCBVSW50NjQgb2Zmc2V0KQ0KK3sNCisgIGlmICghb3Auc3RyZWFtKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIFJJTk9LKG9wLnN0cmVhbS0+U2VlayhvZmZzZXQsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCkpOw0KKyAgY29uc3QgVUludDMyIGtCdWZTaXplID0gMSA8PCAxMTsNCisgIEJ5dGUgYnVmW2tCdWZTaXplXTsNCisgIA0KKyAgZm9yICg7OykNCisgIHsNCisgICAgVUludDMyIHByb2Nlc3NlZCA9IDA7DQorICAgIFJJTk9LKG9wLnN0cmVhbS0+UmVhZChidWYsIGtCdWZTaXplLCAmcHJvY2Vzc2VkKSk7DQorICAgIGlmIChwcm9jZXNzZWQgPT0gMCkNCisgICAgew0KKyAgICAgIC8vIEVycm9ySW5mby5Ob25aZXJvc1RhaWwgPSBmYWxzZTsNCisgICAgICBFcnJvckluZm8uSWdub3JlVGFpbCA9IHRydWU7DQorICAgICAgcmV0dXJuIFNfT0s7DQorICAgIH0NCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcm9jZXNzZWQ7IGkrKykNCisgICAgew0KKyAgICAgIGlmIChidWZbaV0gIT0gMCkNCisgICAgICB7DQorICAgICAgICAvLyBFcnJvckluZm8uSWdub3JlVGFpbCA9IGZhbHNlOw0KKyAgICAgICAgLy8gRXJyb3JJbmZvLk5vblplcm9zVGFpbCA9IHRydWU7DQorICAgICAgICByZXR1cm4gU19PSzsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQorDQorI2lmbmRlZiBfU0ZYDQorDQorY2xhc3MgQ0V4dHJhY3RDYWxsYmFja19Ub19PcGVuQ2FsbGJhY2s6DQorICBwdWJsaWMgSUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2ssDQorICBwdWJsaWMgSUNvbXByZXNzUHJvZ3Jlc3NJbmZvLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorcHVibGljOg0KKyAgQ015Q29tUHRyPElBcmNoaXZlT3BlbkNhbGxiYWNrPiBDYWxsYmFjazsNCisgIFVJbnQ2NCBGaWxlczsNCisgIFVJbnQ2NCBPZmZzZXQ7DQorDQorICBNWV9VTktOT1dOX0lNUDIoSUFyY2hpdmVFeHRyYWN0Q2FsbGJhY2ssIElDb21wcmVzc1Byb2dyZXNzSW5mbykNCisgIElOVEVSRkFDRV9JQXJjaGl2ZUV4dHJhY3RDYWxsYmFjayg7KQ0KKyAgU1RETUVUSE9EKFNldFJhdGlvSW5mbykoY29uc3QgVUludDY0ICppblNpemUsIGNvbnN0IFVJbnQ2NCAqb3V0U2l6ZSk7DQorICB2b2lkIEluaXQoSUFyY2hpdmVPcGVuQ2FsbGJhY2sgKmNhbGxiYWNrKQ0KKyAgew0KKyAgICBDYWxsYmFjayA9IGNhbGxiYWNrOw0KKyAgICBGaWxlcyA9IDA7DQorICAgIE9mZnNldCA9IDA7DQorICB9DQorfTsNCisNCitTVERNRVRIT0RJTVAgQ0V4dHJhY3RDYWxsYmFja19Ub19PcGVuQ2FsbGJhY2s6OlNldFRvdGFsKFVJbnQ2NCAvKiBzaXplICovKQ0KK3sNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0V4dHJhY3RDYWxsYmFja19Ub19PcGVuQ2FsbGJhY2s6OlNldENvbXBsZXRlZChjb25zdCBVSW50NjQgKiAvKiBjb21wbGV0ZVZhbHVlICovKQ0KK3sNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0V4dHJhY3RDYWxsYmFja19Ub19PcGVuQ2FsbGJhY2s6OlNldFJhdGlvSW5mbyhjb25zdCBVSW50NjQgKmluU2l6ZSwgY29uc3QgVUludDY0ICogLyogb3V0U2l6ZSAqLykNCit7DQorICBpZiAoQ2FsbGJhY2spDQorICB7DQorICAgIFVJbnQ2NCB2YWx1ZSA9IE9mZnNldDsNCisgICAgaWYgKGluU2l6ZSkNCisgICAgICB2YWx1ZSArPSAqaW5TaXplOw0KKyAgICByZXR1cm4gQ2FsbGJhY2stPlNldENvbXBsZXRlZCgmRmlsZXMsICZ2YWx1ZSk7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENFeHRyYWN0Q2FsbGJhY2tfVG9fT3BlbkNhbGxiYWNrOjpHZXRTdHJlYW0oVUludDMyIC8qIGluZGV4ICovLCBJU2VxdWVudGlhbE91dFN0cmVhbSAqKm91dFN0cmVhbSwgSW50MzIgLyogYXNrRXh0cmFjdE1vZGUgKi8pDQorew0KKyAgKm91dFN0cmVhbSA9IDA7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENFeHRyYWN0Q2FsbGJhY2tfVG9fT3BlbkNhbGxiYWNrOjpQcmVwYXJlT3BlcmF0aW9uKEludDMyIC8qIGFza0V4dHJhY3RNb2RlICovKQ0KK3sNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0V4dHJhY3RDYWxsYmFja19Ub19PcGVuQ2FsbGJhY2s6OlNldE9wZXJhdGlvblJlc3VsdChJbnQzMiAvKiBvcGVyYXRpb25SZXN1bHQgKi8pDQorew0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0YXRpYyBIUkVTVUxUIE9wZW5BcmNoaXZlU3BlYyhJSW5BcmNoaXZlICphcmNoaXZlLCBib29sIG5lZWRQaHlTaXplLA0KKyAgICBJSW5TdHJlYW0gKnN0cmVhbSwgY29uc3QgVUludDY0ICptYXhDaGVja1N0YXJ0UG9zaXRpb24sDQorICAgIElBcmNoaXZlT3BlbkNhbGxiYWNrICpvcGVuQ2FsbGJhY2ssDQorICAgIElBcmNoaXZlRXh0cmFjdENhbGxiYWNrICpleHRyYWN0Q2FsbGJhY2spDQorew0KKyAgLyoNCisgIGlmIChuZWVkUGh5U2l6ZSkNCisgIHsNCisgICAgQ015Q29tUHRyPElBcmNoaXZlT3BlbjI+IG9wZW4yOw0KKyAgICBhcmNoaXZlLT5RdWVyeUludGVyZmFjZShJSURfSUFyY2hpdmVPcGVuMiwgKHZvaWQgKiopJm9wZW4yKTsNCisgICAgaWYgKG9wZW4yKQ0KKyAgICAgIHJldHVybiBvcGVuMi0+QXJjT3BlbjIoc3RyZWFtLCBrT3BlbkZsYWdzX1JlYWxQaHlTaXplLCBvcGVuQ2FsbGJhY2spOw0KKyAgfQ0KKyAgKi8NCisgIFJJTk9LKGFyY2hpdmUtPk9wZW4oc3RyZWFtLCBtYXhDaGVja1N0YXJ0UG9zaXRpb24sIG9wZW5DYWxsYmFjaykpOw0KKyAgaWYgKG5lZWRQaHlTaXplKQ0KKyAgew0KKyAgICBib29sIHBoeVNpemVfRGVmaW5lZCA9IGZhbHNlOw0KKyAgICBVSW50NjQgcGh5U2l6ZSA9IDA7DQorICAgIFJJTk9LKEFyY2hpdmVfR2V0QXJjUHJvcF9VSW50KGFyY2hpdmUsIGtwaWRQaHlTaXplLCBwaHlTaXplLCBwaHlTaXplX0RlZmluZWQpKTsNCisgICAgaWYgKHBoeVNpemVfRGVmaW5lZCkNCisgICAgICByZXR1cm4gU19PSzsNCisNCisgICAgYm9vbCBwaHlTaXplQ2FudEJlRGV0ZWN0ZWQgPSBmYWxzZTs7DQorICAgIFJJTk9LKEFyY2hpdmVfR2V0QXJjQm9vbFByb3AoYXJjaGl2ZSwga3BpZFBoeVNpemVDYW50QmVEZXRlY3RlZCwgcGh5U2l6ZUNhbnRCZURldGVjdGVkKSk7DQorDQorICAgIGlmICghcGh5U2l6ZUNhbnRCZURldGVjdGVkKQ0KKyAgICB7DQorICAgICAgUklOT0soYXJjaGl2ZS0+RXh0cmFjdCgwLCAoVUludDMyKShJbnQzMiktMSwgQm9vbFRvSW50KHRydWUpLCBleHRyYWN0Q2FsbGJhY2spKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0YXRpYyBpbnQgRmluZEZvcm1hdEZvckFyY2hpdmVUeXBlKENDb2RlY3MgKmNvZGVjcywgQ0ludFZlY3RvciBvcmRlckluZGljZXMsIGNvbnN0IGNoYXIgKm5hbWUpDQorew0KKyAgRk9SX1ZFQ1RPUiAoaSwgb3JkZXJJbmRpY2VzKQ0KKyAgICBpZiAoU3RyaW5nc0FyZUVxdWFsTm9DYXNlX0FzY2lpKGNvZGVjcy0+Rm9ybWF0c1tvcmRlckluZGljZXNbaV1dLk5hbWUsIG5hbWUpKQ0KKyAgICAgIHJldHVybiBpOw0KKyAgcmV0dXJuIC0xOw0KK30NCisNCisjZW5kaWYNCisNCitIUkVTVUxUIENBcmM6Ok9wZW5TdHJlYW0yKGNvbnN0IENPcGVuT3B0aW9ucyAmb3ApDQorew0KKyAgLy8gZnByaW50ZihzdGRvdXQsICJcbk9wZW46ICVTIiwgUGF0aCk7IGZmbHVzaChzdGRvdXQpOw0KKw0KKyAgQXJjaGl2ZS5SZWxlYXNlKCk7DQorICBHZXRSYXdQcm9wcy5SZWxlYXNlKCk7DQorICBHZXRSb290UHJvcHMuUmVsZWFzZSgpOw0KKw0KKyAgRXJyb3JJbmZvLkNsZWFyRXJyb3JzKCk7DQorICBFcnJvckluZm8uRXJyb3JGb3JtYXRJbmRleCA9IC0xOw0KKw0KKyAgSXNQYXJzZUFyYyA9IGZhbHNlOw0KKyAgQXJjU3RyZWFtT2Zmc2V0ID0gMDsNCisgIA0KKyAgLy8gT3V0cHV0RGVidWdTdHJpbmdXKEwiMSIpOw0KKyAgLy8gT3V0cHV0RGVidWdTdHJpbmdXKFBhdGgpOw0KKw0KKyAgY29uc3QgVVN0cmluZyBmaWxlTmFtZSA9IEV4dHJhY3RGaWxlTmFtZUZyb21QYXRoKFBhdGgpOw0KKyAgVVN0cmluZyBleHRlbnNpb247DQorICB7DQorICAgIGludCBkb3RQb3MgPSBmaWxlTmFtZS5SZXZlcnNlRmluZChMJy4nKTsNCisgICAgaWYgKGRvdFBvcyA+PSAwKQ0KKyAgICAgIGV4dGVuc2lvbiA9IGZpbGVOYW1lLlB0cihkb3RQb3MgKyAxKTsNCisgIH0NCisgIA0KKyAgQ0ludFZlY3RvciBvcmRlckluZGljZXM7DQorICANCisgIGJvb2wgc2VhcmNoTWFya2VySW5IYW5kbGVyID0gZmFsc2U7DQorICAjaWZkZWYgX1NGWA0KKyAgICBzZWFyY2hNYXJrZXJJbkhhbmRsZXIgPSB0cnVlOw0KKyAgI2VuZGlmDQorDQorICBDQm9vbEFyciBpc01haW5Gb3JtYXRBcnIob3AuY29kZWNzLT5Gb3JtYXRzLlNpemUoKSk7DQorICB7DQorICAgIEZPUl9WRUNUT1IoaSwgb3AuY29kZWNzLT5Gb3JtYXRzKQ0KKyAgICAgIGlzTWFpbkZvcm1hdEFycltpXSA9IGZhbHNlOw0KKyAgfQ0KKw0KKyAgVUludDY0IG1heFN0YXJ0T2Zmc2V0ID0NCisgICAgICBvcC5vcGVuVHlwZS5NYXhTdGFydE9mZnNldF9EZWZpbmVkID8NCisgICAgICBvcC5vcGVuVHlwZS5NYXhTdGFydE9mZnNldCA6DQorICAgICAga01heENoZWNrU3RhcnRQb3NpdGlvbjsNCisNCisgICNpZm5kZWYgX1NGWA0KKyAgYm9vbCBpc1Vua25vd25FeHQgPSBmYWxzZTsNCisgICNlbmRpZg0KKw0KKyAgYm9vbCBpc0ZvcmNlZCA9IGZhbHNlOw0KKyAgdW5zaWduZWQgbnVtTWFpblR5cGVzID0gMDsNCisgIGludCBmb3JtYXRJbmRleCA9IG9wLm9wZW5UeXBlLkZvcm1hdEluZGV4Ow0KKw0KKyAgaWYgKGZvcm1hdEluZGV4ID49IDApDQorICB7DQorICAgIGlzRm9yY2VkID0gdHJ1ZTsNCisgICAgb3JkZXJJbmRpY2VzLkFkZChmb3JtYXRJbmRleCk7DQorICAgIG51bU1haW5UeXBlcyA9IDE7DQorICAgIGlzTWFpbkZvcm1hdEFycltmb3JtYXRJbmRleF0gPSB0cnVlOw0KKw0KKyAgICBzZWFyY2hNYXJrZXJJbkhhbmRsZXIgPSB0cnVlOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICB1bnNpZ25lZCBudW1GaW5kZWQgPSAwOw0KKyAgICAjaWZuZGVmIF9TRlgNCisgICAgYm9vbCBpc1ByZWFyY0V4dCA9IGZhbHNlOw0KKyAgICAjZW5kaWYNCisgICAgDQorICAgIHsNCisgICAgICBGT1JfVkVDVE9SIChpLCBvcC5jb2RlY3MtPkZvcm1hdHMpDQorICAgICAgew0KKyAgICAgICAgY29uc3QgQ0FyY0luZm9FeCAmYWkgPSBvcC5jb2RlY3MtPkZvcm1hdHNbaV07DQorDQorICAgICAgICBpZiAoSWdub3JlU3BsaXQgfHwgIW9wLm9wZW5UeXBlLkNhblJldHVybkFyYykNCisgICAgICAgICAgaWYgKGFpLklzU3BsaXQoKSkNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIGlmIChvcC5leGNsdWRlZEZvcm1hdHMtPkZpbmRJblNvcnRlZChpKSA+PSAwKQ0KKyAgICAgICAgICBjb250aW51ZTsNCisNCisgICAgICAgICNpZm5kZWYgX1NGWA0KKyAgICAgICAgaWYgKElzUHJlQXJjRm9ybWF0KGFpKSkNCisgICAgICAgICAgaXNQcmVhcmNFeHQgPSB0cnVlOw0KKyAgICAgICAgI2VuZGlmDQorDQorICAgICAgICBpZiAoYWkuRmluZEV4dGVuc2lvbihleHRlbnNpb24pID49IDApDQorICAgICAgICB7DQorICAgICAgICAgIC8vIFByaW50TnVtYmVyKCJvcmRlckluZGljZXMuSW5zZXJ0IiwgaSk7DQorICAgICAgICAgIG9yZGVySW5kaWNlcy5JbnNlcnQobnVtRmluZGVkKyssIGkpOw0KKyAgICAgICAgICBpc01haW5Gb3JtYXRBcnJbaV0gPSB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICBvcmRlckluZGljZXMuQWRkKGkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgDQorICAgIGlmICghb3Auc3RyZWFtKQ0KKyAgICB7DQorICAgICAgaWYgKG51bUZpbmRlZCAhPSAxKQ0KKyAgICAgICAgcmV0dXJuIEVfTk9USU1QTDsNCisgICAgICBvcmRlckluZGljZXMuRGVsZXRlRnJvbSgxKTsNCisgICAgfQ0KKyAgICAvLyBQcmludE51bWJlcigibnVtRmluZGVkIiwgbnVtRmluZGVkICk7DQorDQorICAgIC8qDQorICAgIGlmIChvcC5vcGVuT25seVNwZWNpZmllZEJ5RXh0ZW5zaW9uKQ0KKyAgICB7DQorICAgICAgaWYgKG51bUZpbmRlZCAhPSAwICYmICFJc0V4ZUV4dChleHRlbnNpb24pKQ0KKyAgICAgICAgb3JkZXJJbmRpY2VzLkRlbGV0ZUZyb20obnVtRmluZGVkKTsNCisgICAgfQ0KKyAgICAqLw0KKw0KKyAgICAjaWZuZGVmIF9TRlgNCisNCisgICAgICBpZiAob3Auc3RyZWFtICYmIG9yZGVySW5kaWNlcy5TaXplKCkgPj0gMikNCisgICAgICB7DQorICAgICAgICBSSU5PSyhvcC5zdHJlYW0tPlNlZWsoMCwgU1RSRUFNX1NFRUtfU0VULCBOVUxMKSk7DQorICAgICAgICBDQnl0ZUJ1ZmZlciBieXRlQnVmZmVyOw0KKyAgICAgICAgQ0ludFZlY3RvciBvcmRlckluZGljZXMyOw0KKyAgICAgICAgaWYgKG51bUZpbmRlZCA9PSAwIHx8IElzRXhlRXh0KGV4dGVuc2lvbikpDQorICAgICAgICB7DQorICAgICAgICAgIC8vIHNpZ25hdHVyZSBzZWFyY2ggd2FzIGhlcmUNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UgaWYgKGV4dGVuc2lvbiA9PSBMIjAwMCIgfHwgZXh0ZW5zaW9uID09IEwiMDAxIikNCisgICAgICAgIHsNCisgICAgICAgICAgaW50IGkgPSBGaW5kRm9ybWF0Rm9yQXJjaGl2ZVR5cGUob3AuY29kZWNzLCBvcmRlckluZGljZXMsICJyYXIiKTsNCisgICAgICAgICAgaWYgKGkgPj0gMCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrQnVmU2l6ZSA9ICgxIDw8IDEwKTsNCisgICAgICAgICAgICBieXRlQnVmZmVyLkFsbG9jKGtCdWZTaXplKTsNCisgICAgICAgICAgICBzaXplX3QgcHJvY2Vzc2VkU2l6ZSA9IGtCdWZTaXplOw0KKyAgICAgICAgICAgIFJJTk9LKFJlYWRTdHJlYW0ob3Auc3RyZWFtLCBieXRlQnVmZmVyLCAmcHJvY2Vzc2VkU2l6ZSkpOw0KKyAgICAgICAgICAgIGlmIChwcm9jZXNzZWRTaXplID49IDE2KQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIGNvbnN0IEJ5dGUgKmJ1ZiA9IGJ5dGVCdWZmZXI7DQorICAgICAgICAgICAgICBjb25zdCBCeXRlIGtSYXJIZWFkZXJbXSA9IHsgMHg1MiAsIDB4NjEsIDB4NzIsIDB4MjEsIDB4MWEsIDB4MDcsIDB4MDAgfTsNCisgICAgICAgICAgICAgIGlmIChUZXN0U2lnbmF0dXJlKGJ1Ziwga1JhckhlYWRlciwgNykgJiYgYnVmWzldID09IDB4NzMgJiYgKGJ1ZlsxMF0gJiAxKSAhPSAwKQ0KKyAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBvcmRlckluZGljZXMyLkFkZChvcmRlckluZGljZXNbaV0pOw0KKyAgICAgICAgICAgICAgICBvcmRlckluZGljZXNbaV0gPSAtMTsNCisgICAgICAgICAgICAgICAgaWYgKGkgPj0gKGludCludW1GaW5kZWQpDQorICAgICAgICAgICAgICAgICAgbnVtRmluZGVkKys7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIGNvbnN0IHNpemVfdCBrQnVmU2l6ZSA9ICgxIDw8IDEwKTsNCisgICAgICAgICAgYnl0ZUJ1ZmZlci5BbGxvYyhrQnVmU2l6ZSk7DQorICAgICAgICAgIHNpemVfdCBwcm9jZXNzZWRTaXplID0ga0J1ZlNpemU7DQorICAgICAgICAgIFJJTk9LKFJlYWRTdHJlYW0ob3Auc3RyZWFtLCBieXRlQnVmZmVyLCAmcHJvY2Vzc2VkU2l6ZSkpOw0KKyAgICAgICAgICBpZiAocHJvY2Vzc2VkU2l6ZSA9PSAwKQ0KKyAgICAgICAgICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgICAgICAgICANCisgICAgICAgICAgLyoNCisgICAgICAgICAgY2hlY2sgdHlwZSBvcmRlcjoNCisgICAgICAgICAgICAxKSBtYXRjaGVkIGV4dGVuc2lvbiwgbm8gc2lnbnVhdHVyZQ0KKyAgICAgICAgICAgIDIpIG1hdGNoZWQgZXh0ZW5zaW9uLCBtYXRjaGVkIHNpZ251YXR1cmUNCisgICAgICAgICAgICAvLyAzKSBubyBzaWdudWF0dXJlDQorICAgICAgICAgICAgLy8gNCkgbWF0Y2hlZCBzaWdudWF0dXJlDQorICAgICAgICAgICovDQorDQorICAgICAgICAgIE1ha2VDaGVja09yZGVyKG9wLmNvZGVjcywgb3JkZXJJbmRpY2VzLCBudW1GaW5kZWQsIG9yZGVySW5kaWNlczIsIE5VTEwsIDApOw0KKyAgICAgICAgICBNYWtlQ2hlY2tPcmRlcihvcC5jb2RlY3MsIG9yZGVySW5kaWNlcywgbnVtRmluZGVkLCBvcmRlckluZGljZXMyLCBieXRlQnVmZmVyLCBwcm9jZXNzZWRTaXplKTsNCisgICAgICAgICAgLy8gTWFrZUNoZWNrT3JkZXIob3AuY29kZWNzLCBvcmRlckluZGljZXMsIG9yZGVySW5kaWNlcy5TaXplKCksIG9yZGVySW5kaWNlczIsIE5VTEwsIDApOw0KKyAgICAgICAgICAvLyBNYWtlQ2hlY2tPcmRlcihvcC5jb2RlY3MsIG9yZGVySW5kaWNlcywgb3JkZXJJbmRpY2VzLlNpemUoKSwgb3JkZXJJbmRpY2VzMiwgYnl0ZUJ1ZmZlciwgcHJvY2Vzc2VkU2l6ZSk7DQorICAgICAgICB9DQorICAgICAgDQorICAgICAgICBGT1JfVkVDVE9SIChpLCBvcmRlckluZGljZXMpDQorICAgICAgICB7DQorICAgICAgICAgIGludCB2YWwgPSBvcmRlckluZGljZXNbaV07DQorICAgICAgICAgIGlmICh2YWwgIT0gLTEpDQorICAgICAgICAgICAgb3JkZXJJbmRpY2VzMi5BZGQodmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIG9yZGVySW5kaWNlcyA9IG9yZGVySW5kaWNlczI7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIGlmIChvcmRlckluZGljZXMuU2l6ZSgpID49IDIpDQorICAgICAgew0KKyAgICAgICAgaW50IGlJc28gPSBGaW5kRm9ybWF0Rm9yQXJjaGl2ZVR5cGUob3AuY29kZWNzLCBvcmRlckluZGljZXMsICJpc28iKTsNCisgICAgICAgIGludCBpVWRmID0gRmluZEZvcm1hdEZvckFyY2hpdmVUeXBlKG9wLmNvZGVjcywgb3JkZXJJbmRpY2VzLCAidWRmIik7DQorICAgICAgICBpZiAoaVVkZiA+IGlJc28gJiYgaUlzbyA+PSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpbnQgaXNvSW5kZXggPSBvcmRlckluZGljZXNbaUlzb107DQorICAgICAgICAgIGludCB1ZGZJbmRleCA9IG9yZGVySW5kaWNlc1tpVWRmXTsNCisgICAgICAgICAgb3JkZXJJbmRpY2VzW2lVZGZdID0gaXNvSW5kZXg7DQorICAgICAgICAgIG9yZGVySW5kaWNlc1tpSXNvXSA9IHVkZkluZGV4Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBudW1NYWluVHlwZXMgPSBudW1GaW5kZWQ7DQorICAgICAgaXNVbmtub3duRXh0ID0gKG51bU1haW5UeXBlcyA9PSAwKSB8fCBpc1ByZWFyY0V4dDsNCisNCisgICAgI2Vsc2UgLy8gX1NGWA0KKw0KKyAgICAgIG51bU1haW5UeXBlcyA9IG9yZGVySW5kaWNlcy5TaXplKCk7DQorICAgIA0KKyAgICAjZW5kaWYNCisgIH0NCisNCisgIFVJbnQ2NCBmaWxlU2l6ZSA9IDA7DQorICBpZiAob3Auc3RyZWFtKQ0KKyAgew0KKyAgICBSSU5PSyhvcC5zdHJlYW0tPlNlZWsoMCwgU1RSRUFNX1NFRUtfRU5ELCAmZmlsZVNpemUpKTsNCisgICAgUklOT0sob3Auc3RyZWFtLT5TZWVrKDAsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCkpOw0KKyAgfQ0KKyAgRmlsZVNpemUgPSBmaWxlU2l6ZTsNCisNCisNCisgICNpZm5kZWYgX1NGWA0KKw0KKyAgQ0Jvb2xBcnIgc2tpcEZyb250YWxGb3JtYXQob3AuY29kZWNzLT5Gb3JtYXRzLlNpemUoKSk7DQorICB7DQorICAgIEZPUl9WRUNUT1IoaSwgb3AuY29kZWNzLT5Gb3JtYXRzKQ0KKyAgICAgIHNraXBGcm9udGFsRm9ybWF0W2ldID0gZmFsc2U7DQorICB9DQorICANCisgICNlbmRpZg0KKw0KKyAgY29uc3QgQ09wZW5UeXBlICZtb2RlID0gb3Aub3BlblR5cGU7DQorDQorICANCisgIA0KKw0KKyAgDQorICBpZiAobW9kZS5DYW5SZXR1cm5BcmMpDQorICB7DQorICAgIC8vIC0tLS0tLS0tLS0gT1BFTiBtYWluIHR5cGUgYnkgZXh0ZW5zc2lvbiAtLS0tLS0tLS0tDQorICANCisgICAgdW5zaWduZWQgbnVtQ2hlY2tUeXBlcyA9IG9yZGVySW5kaWNlcy5TaXplKCk7DQorICAgIGlmIChmb3JtYXRJbmRleCA+PSAwKQ0KKyAgICAgIG51bUNoZWNrVHlwZXMgPSBudW1NYWluVHlwZXM7DQorICAgIA0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtQ2hlY2tUeXBlczsgaSsrKQ0KKyAgICB7DQorICAgICAgRm9ybWF0SW5kZXggPSBvcmRlckluZGljZXNbaV07DQorICAgICAgY29uc3QgQ0FyY0luZm9FeCAmYWkgPSBvcC5jb2RlY3MtPkZvcm1hdHNbRm9ybWF0SW5kZXhdOw0KKyAgICAgIC8vIE91dHB1dERlYnVnU3RyaW5nVyhhaS5OYW1lKTsNCisgICAgICANCisgICAgICBib29sIGV4YWN0T25seSA9IGZhbHNlOw0KKyAgICAgIGlmIChpID49IG51bU1haW5UeXBlcykNCisgICAgICB7DQorICAgICAgICBpZiAoIWFpLkZsYWdzX0JhY2t3YXJkT3BlbigpDQorICAgICAgICAgICAgLy8gJiYgIWFpLkZsYWdzX1B1cmVTdGFydE9wZW4oKQ0KKyAgICAgICAgICAgICkNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICBleGFjdE9ubHkgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICAvLyBTb21lIGhhbmRsZXJzIGRvIG5vdCBzZXQgdG90YWwgYnl0ZXMuIFNvIHdlIHNldCBpdCBoZXJlDQorICAgICAgUklOT0sob3AuY2FsbGJhY2stPlNldFRvdGFsKE5VTEwsICZmaWxlU2l6ZSkpOw0KKyAgICAgIGlmIChvcC5zdHJlYW0pDQorICAgICAgew0KKyAgICAgICAgUklOT0sob3Auc3RyZWFtLT5TZWVrKDAsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCkpOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBDTXlDb21QdHI8SUluQXJjaGl2ZT4gYXJjaGl2ZTsNCisgICAgICANCisgICAgICBSSU5PSyhQcmVwYXJlVG9PcGVuKG9wLCBGb3JtYXRJbmRleCwgYXJjaGl2ZSkpOw0KKyAgICAgIGlmICghYXJjaGl2ZSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIA0KKyAgICAgIEhSRVNVTFQgcmVzdWx0Ow0KKyAgICAgIGlmIChvcC5zdHJlYW0pDQorICAgICAgew0KKyAgICAgICAgVUludDY0IHNlYXJjaExpbWl0ID0gKCFleGFjdE9ubHkgJiYgc2VhcmNoTWFya2VySW5IYW5kbGVyKSA/IG1heFN0YXJ0T2Zmc2V0OiAwOw0KKyAgICAgICAgcmVzdWx0ID0gYXJjaGl2ZS0+T3BlbihvcC5zdHJlYW0sICZzZWFyY2hMaW1pdCwgb3AuY2FsbGJhY2spOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgQ015Q29tUHRyPElBcmNoaXZlT3BlblNlcT4gb3BlblNlcTsNCisgICAgICAgIGFyY2hpdmUuUXVlcnlJbnRlcmZhY2UoSUlEX0lBcmNoaXZlT3BlblNlcSwgKHZvaWQgKiopJm9wZW5TZXEpOw0KKyAgICAgICAgaWYgKCFvcGVuU2VxKQ0KKyAgICAgICAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgICAgICAgcmVzdWx0ID0gb3BlblNlcS0+T3BlblNlcShvcC5zZXFTdHJlYW0pOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBSSU5PSyhSZWFkQmFzaWNQcm9wcyhhcmNoaXZlLCAwLCByZXN1bHQpKTsNCisgICAgICANCisgICAgICBpZiAocmVzdWx0ID09IFNfRkFMU0UpDQorICAgICAgew0KKyAgICAgICAgYm9vbCBpc0FyYyA9IEVycm9ySW5mby5Jc0FyY19BZnRlcl9Ob25PcGVuKCk7DQorDQorICAgICAgICAjaWZuZGVmIF9TRlgNCisgICAgICAgIC8vIGlmIGl0J3MgYXJjaGl2ZSwgd2UgYWxsb3cgYW5vdGhlciBvcGVuIGF0dGVtcHQgZm9yIHBhcnNlcg0KKyAgICAgICAgaWYgKCFtb2RlLkNhblJldHVyblBhcnNlciB8fCAhaXNBcmMpDQorICAgICAgICAgIHNraXBGcm9udGFsRm9ybWF0W0Zvcm1hdEluZGV4XSA9IHRydWU7DQorICAgICAgICAjZW5kaWYNCisgICAgICAgIA0KKyAgICAgICAgaWYgKGV4YWN0T25seSkNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICANCisgICAgICAgIGlmIChpID09IDAgJiYgbnVtTWFpblR5cGVzID09IDEpDQorICAgICAgICB7DQorICAgICAgICAgIC8vIHdlIHNldCBOb25PcGVuRXJyb3JJbmZvLCBvbmx5IGlmIHRoZXJlIGlzIG9ubHkgb25lIG1haW4gZm9ybWF0IChkZWZpbmVkIGJ5IGV4dGVuc2lvbikuDQorICAgICAgICAgIEVycm9ySW5mby5FcnJvckZvcm1hdEluZGV4ID0gRm9ybWF0SW5kZXg7DQorICAgICAgICAgIE5vbk9wZW5fRXJyb3JJbmZvID0gRXJyb3JJbmZvOw0KKyAgICAgICANCisgICAgICAgICAgaWYgKCFtb2RlLkNhblJldHVyblBhcnNlciAmJiBpc0FyYykNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIC8vIGlmIChmb3JtYXRJbmRleCA8IDAgJiYgIXNlYXJjaE1hcmtlckluSGFuZGxlcikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAvLyBpZiBiYWQgYXJjaGl2ZSB3YXMgZGV0ZWN0ZWQsIHdlIGRvbid0IG5lZWQgYWRkaXRpb25hbCBvcGVuIGF0dGVtcHRzDQorICAgICAgICAgICAgICAjaWZuZGVmIF9TRlgNCisgICAgICAgICAgICAgIGlmICghSXNQcmVBcmNGb3JtYXQoYWkpIC8qIHx8ICFtb2RlLlNraXBTZnhTdHViICovKQ0KKyAgICAgICAgICAgICAgI2VuZGlmDQorICAgICAgICAgICAgICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICAvKg0KKyAgICAgICAgI2lmbmRlZiBfU0ZYDQorICAgICAgICBpZiAoSXNFeGVFeHQoZXh0ZW5zaW9uKSB8fCBhaS5GbGFnc19QcmVBcmMoKSkNCisgICAgICAgIHsNCisgICAgICAgIC8vIG9wZW5Pbmx5RnVsbEFyYyA9IGZhbHNlOw0KKyAgICAgICAgLy8gY2FuUmV0dXJuVGFpbEFyYyA9IHRydWU7DQorICAgICAgICAvLyBsaW1pdFNpZ25hdHVyZVNlYXJjaCA9IHRydWU7DQorICAgICAgICB9DQorICAgICAgICAjZW5kaWYNCisgICAgICAgICovDQorICAgICAgICANCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBSSU5PSyhyZXN1bHQpOw0KKyAgICAgIA0KKyAgICAgICNpZm5kZWYgX1NGWA0KKw0KKyAgICAgIGJvb2wgaXNNYWluRm9ybWF0ID0gaXNNYWluRm9ybWF0QXJyW0Zvcm1hdEluZGV4XTsNCisgICAgICBjb25zdCBDT3BlblNwZWNGbGFncyAmc3BlY0ZsYWdzID0gbW9kZS5HZXRTcGVjKGlzRm9yY2VkLCBpc01haW5Gb3JtYXQsIGlzVW5rbm93bkV4dCk7DQorDQorICAgICAgYm9vbCB0aGVyZUlzVGFpbCA9IEVycm9ySW5mby5UaGVyZUlzVGFpbDsNCisgICAgICBpZiAodGhlcmVJc1RhaWwgJiYgbW9kZS5aZXJvc1RhaWxJc0FsbG93ZWQpDQorICAgICAgew0KKyAgICAgICAgUklOT0soQ2hlY2taZXJvc1RhaWwob3AsIE9mZnNldCArIFBoeVNpemUpKTsNCisgICAgICAgIGlmIChFcnJvckluZm8uSWdub3JlVGFpbCkNCisgICAgICAgICAgdGhlcmVJc1RhaWwgPSBmYWxzZTsNCisgICAgICB9DQorDQorICAgICAgaWYgKE9mZnNldCA+IDApDQorICAgICAgew0KKyAgICAgICAgaWYgKGV4YWN0T25seQ0KKyAgICAgICAgICAgIHx8ICFzZWFyY2hNYXJrZXJJbkhhbmRsZXINCisgICAgICAgICAgICB8fCAhc3BlY0ZsYWdzLkNhblJldHVybl9Ob25TdGFydCgpDQorICAgICAgICAgICAgfHwgKG1vZGUuTWF4U3RhcnRPZmZzZXRfRGVmaW5lZCAmJiAoVUludDY0KU9mZnNldCA+IG1vZGUuTWF4U3RhcnRPZmZzZXQpKQ0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKHRoZXJlSXNUYWlsKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChPZmZzZXQgPiAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAoIXNwZWNGbGFncy5DYW5SZXR1cm5NaWQpDQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIGlmICghc3BlY0ZsYWdzLkNhblJldHVybkZyb250YWwpDQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisNCisgICAgICBpZiAoT2Zmc2V0ID4gMCB8fCB0aGVyZUlzVGFpbCkNCisgICAgICB7DQorICAgICAgICBpZiAoZm9ybWF0SW5kZXggPCAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAoSXNQcmVBcmNGb3JtYXQoYWkpKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgLy8gb3Blbk9ubHlGdWxsQXJjID0gZmFsc2U7DQorICAgICAgICAgICAgLy8gY2FuUmV0dXJuVGFpbEFyYyA9IHRydWU7DQorICAgICAgICAgICAgLyoNCisgICAgICAgICAgICBpZiAobW9kZS5Ta2lwU2Z4U3R1YikNCisgICAgICAgICAgICBsaW1pdFNpZ25hdHVyZVNlYXJjaCA9IHRydWU7DQorICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAvLyBpZiAobW9kZS5Ta2lwU2Z4U3R1YikNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAvLyBza2lwRnJvbnRhbEZvcm1hdFtGb3JtYXRJbmRleF0gPSB0cnVlOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgDQorICAgICAgI2VuZGlmDQorDQorICAgICAgQXJjaGl2ZSA9IGFyY2hpdmU7DQorICAgICAgcmV0dXJuIFNfT0s7DQorICAgIH0NCisgIH0NCisNCisgIA0KKw0KKyAgI2lmbmRlZiBfU0ZYDQorDQorICBpZiAoIW9wLnN0cmVhbSkNCisgICAgcmV0dXJuIFNfRkFMU0U7DQorDQorICBpZiAoZm9ybWF0SW5kZXggPj0gMCAmJiAhbW9kZS5DYW5SZXR1cm5QYXJzZXIpDQorICB7DQorICAgIGlmIChtb2RlLk1heFN0YXJ0T2Zmc2V0X0RlZmluZWQpDQorICAgIHsNCisgICAgICBpZiAobW9kZS5NYXhTdGFydE9mZnNldCA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIFNfRkFMU0U7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgY29uc3QgQ0FyY0luZm9FeCAmYWkgPSBvcC5jb2RlY3MtPkZvcm1hdHNbZm9ybWF0SW5kZXhdOw0KKyAgICAgIGlmIChhaS5GaW5kRXh0ZW5zaW9uKGV4dGVuc2lvbikgPj0gMCkNCisgICAgICB7DQorICAgICAgICBjb25zdCBDQXJjSW5mb0V4ICZhaSA9IG9wLmNvZGVjcy0+Rm9ybWF0c1tmb3JtYXRJbmRleF07DQorICAgICAgICBpZiAoYWkuRmxhZ3NfRmluZFNpZ25hdHVyZSgpICYmIHNlYXJjaE1hcmtlckluSGFuZGxlcikNCisgICAgICAgICAgcmV0dXJuIFNfRkFMU0U7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBOQXJjaGl2ZTo6TlBhcnNlcjo6Q0hhbmRsZXIgKmhhbmRsZXJTcGVjID0gbmV3IE5BcmNoaXZlOjpOUGFyc2VyOjpDSGFuZGxlcjsNCisgIENNeUNvbVB0cjxJSW5BcmNoaXZlPiBoYW5kbGVyID0gaGFuZGxlclNwZWM7DQorDQorICBDRXh0cmFjdENhbGxiYWNrX1RvX09wZW5DYWxsYmFjayAqZXh0cmFjdENhbGxiYWNrX1RvX09wZW5DYWxsYmFja19TcGVjID0gbmV3IENFeHRyYWN0Q2FsbGJhY2tfVG9fT3BlbkNhbGxiYWNrOw0KKyAgQ015Q29tUHRyPElBcmNoaXZlRXh0cmFjdENhbGxiYWNrPiBleHRyYWN0Q2FsbGJhY2tfVG9fT3BlbkNhbGxiYWNrID0gZXh0cmFjdENhbGxiYWNrX1RvX09wZW5DYWxsYmFja19TcGVjOw0KKyAgZXh0cmFjdENhbGxiYWNrX1RvX09wZW5DYWxsYmFja19TcGVjLT5Jbml0KG9wLmNhbGxiYWNrKTsNCisNCisgIHsNCisgICAgLy8gLS0tLS0tLS0tLSBDaGVjayBhbGwgcG9zc2libGUgU1RBUlQgYXJjaGl2ZXMgLS0tLS0tLS0tLQ0KKyAgICAvLyB0aGlzIGNvZGUgaXMgYmV0dGVyIGZvciBmdWxsIGZpbGUgYXJjaGl2ZXMgdGhhbiBQYXJzZXIncyBjb2RlLg0KKw0KKyAgICBDQnl0ZUJ1ZmZlciBieXRlQnVmZmVyOw0KKyAgICBib29sIGVuZE9mRmlsZSA9IGZhbHNlOw0KKyAgICBzaXplX3QgcHJvY2Vzc2VkU2l6ZTsNCisgICAgew0KKyAgICAgIHNpemVfdCBidWZTaXplID0gMSA8PCAyMDsgLy8gaXQgbXVzdCBiZSBsYXJnZXIgdGhhbiBtYXggc2lnbmF0dXJlIG9mZnNldCBvciBJc0FyY0Z1bmMgb2Zmc2V0ICgoMSA8PCAxOSkgKyB4IGZvciBVREYpDQorICAgICAgaWYgKGJ1ZlNpemUgPiBmaWxlU2l6ZSkNCisgICAgICB7DQorICAgICAgICBidWZTaXplID0gKHNpemVfdClmaWxlU2l6ZTsNCisgICAgICAgIGVuZE9mRmlsZSA9IHRydWU7DQorICAgICAgfQ0KKyAgICAgIGJ5dGVCdWZmZXIuQWxsb2MoYnVmU2l6ZSk7DQorICAgICAgUklOT0sob3Auc3RyZWFtLT5TZWVrKDAsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCkpOw0KKyAgICAgIHByb2Nlc3NlZFNpemUgPSBidWZTaXplOw0KKyAgICAgIFJJTk9LKFJlYWRTdHJlYW0ob3Auc3RyZWFtLCBieXRlQnVmZmVyLCAmcHJvY2Vzc2VkU2l6ZSkpOw0KKyAgICAgIGlmIChwcm9jZXNzZWRTaXplID09IDApDQorICAgICAgICByZXR1cm4gU19GQUxTRTsNCisgICAgICBpZiAocHJvY2Vzc2VkU2l6ZSA8IGJ1ZlNpemUpDQorICAgICAgICBlbmRPZkZpbGUgPSB0cnVlOw0KKyAgICB9DQorICAgIENVSW50VmVjdG9yIHNvcnRlZEZvcm1hdHM7DQorDQorICAgIHVuc2lnbmVkIGk7DQorDQorICAgIGludCBzcGxpdEluZGV4ID0gLTE7DQorDQorICAgIGZvciAoaSA9IDA7IGkgPCBvcmRlckluZGljZXMuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICB1bnNpZ25lZCBmb3JtID0gb3JkZXJJbmRpY2VzW2ldOw0KKyAgICAgIGlmIChza2lwRnJvbnRhbEZvcm1hdFtmb3JtXSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGNvbnN0IENBcmNJbmZvRXggJmFpID0gb3AuY29kZWNzLT5Gb3JtYXRzW2Zvcm1dOw0KKyAgICAgIGlmIChhaS5Jc1NwbGl0KCkpDQorICAgICAgew0KKyAgICAgICAgc3BsaXRJbmRleCA9IGZvcm07DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorDQorICAgICAgaWYgKGFpLklzQXJjRnVuYykNCisgICAgICB7DQorICAgICAgICBVSW50MzIgaXNBcmNSZXMgPSBhaS5Jc0FyY0Z1bmMoYnl0ZUJ1ZmZlciwgcHJvY2Vzc2VkU2l6ZSk7DQorICAgICAgICBpZiAoaXNBcmNSZXMgPT0ga19Jc0FyY19SZXNfTk8pDQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgaWYgKGlzQXJjUmVzID09IGtfSXNBcmNfUmVzX05FRURfTU9SRSAmJiBlbmRPZkZpbGUpDQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgLy8gaWYgKGlzQXJjUmVzID09IGtfSXNBcmNfUmVzX1lFU19MT1dfUFJPQikgY29udGludWU7DQorICAgICAgICBzb3J0ZWRGb3JtYXRzLkluc2VydCgwLCBmb3JtKTsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisNCisgICAgICBib29sIGlzTmV3U3R5bGVTaWduYXR1cmUgPSBJc05ld1N0eWxlU2lnbmF0dXJlKGFpKTsNCisgICAgICBib29sIG5lZWRDaGVjayA9ICFpc05ld1N0eWxlU2lnbmF0dXJlDQorICAgICAgICAgIHx8IGFpLlNpZ25hdHVyZXMuSXNFbXB0eSgpDQorICAgICAgICAgIHx8IGFpLkZsYWdzX1B1cmVTdGFydE9wZW4oKQ0KKyAgICAgICAgICB8fCBhaS5GbGFnc19TdGFydE9wZW4oKQ0KKyAgICAgICAgICB8fCBhaS5GbGFnc19CYWNrd2FyZE9wZW4oKTsNCisgICAgDQorICAgICAgaWYgKGlzTmV3U3R5bGVTaWduYXR1cmUgJiYgIWFpLlNpZ25hdHVyZXMuSXNFbXB0eSgpKQ0KKyAgICAgIHsNCisgICAgICAgIHVuc2lnbmVkIGs7DQorICAgICAgICBmb3IgKGsgPSAwOyBrIDwgYWkuU2lnbmF0dXJlcy5TaXplKCk7IGsrKykNCisgICAgICAgIHsNCisgICAgICAgICAgY29uc3QgQ0J5dGVCdWZmZXIgJnNpZyA9IGFpLlNpZ25hdHVyZXNba107DQorICAgICAgICAgIFVJbnQzMiBzaWduYXR1cmVFbmQgPSBhaS5TaWduYXR1cmVPZmZzZXQgKyAoVUludDMyKXNpZy5TaXplKCk7DQorICAgICAgICAgIGlmIChwcm9jZXNzZWRTaXplIDwgc2lnbmF0dXJlRW5kKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCFlbmRPZkZpbGUpDQorICAgICAgICAgICAgICBuZWVkQ2hlY2sgPSB0cnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGVsc2UgaWYgKG1lbWNtcChzaWcsIGJ5dGVCdWZmZXIgKyBhaS5TaWduYXR1cmVPZmZzZXQsIHNpZy5TaXplKCkpID09IDApDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAoayAhPSBhaS5TaWduYXR1cmVzLlNpemUoKSkNCisgICAgICAgIHsNCisgICAgICAgICAgc29ydGVkRm9ybWF0cy5JbnNlcnQoMCwgZm9ybSk7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAobmVlZENoZWNrKQ0KKyAgICAgICAgc29ydGVkRm9ybWF0cy5BZGQoZm9ybSk7DQorICAgIH0NCisNCisgICAgaWYgKHNwbGl0SW5kZXggPj0gMCkNCisgICAgICBzb3J0ZWRGb3JtYXRzLkluc2VydCgwLCBzcGxpdEluZGV4KTsNCisNCisgICAgZm9yIChpID0gMDsgaSA8IHNvcnRlZEZvcm1hdHMuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBGb3JtYXRJbmRleCA9IHNvcnRlZEZvcm1hdHNbaV07DQorICAgICAgY29uc3QgQ0FyY0luZm9FeCAmYWkgPSBvcC5jb2RlY3MtPkZvcm1hdHNbRm9ybWF0SW5kZXhdOw0KKw0KKyAgICAgIFJJTk9LKG9wLmNhbGxiYWNrLT5TZXRUb3RhbChOVUxMLCAmZmlsZVNpemUpKTsNCisgICAgICBSSU5PSyhvcC5zdHJlYW0tPlNlZWsoMCwgU1RSRUFNX1NFRUtfU0VULCBOVUxMKSk7DQorDQorICAgICAgQ015Q29tUHRyPElJbkFyY2hpdmU+IGFyY2hpdmU7DQorICAgICAgUklOT0soUHJlcGFyZVRvT3BlbihvcCwgRm9ybWF0SW5kZXgsIGFyY2hpdmUpKTsNCisgICAgICBpZiAoIWFyY2hpdmUpDQorICAgICAgICBjb250aW51ZTsNCisgICAgICANCisgICAgICBQUkYocHJpbnRmKCJcblNvcnRlZCBPcGVuICVTIiwgKGNvbnN0IHdjaGFyX3QgKilhaS5OYW1lKSk7DQorICAgICAgSFJFU1VMVCByZXN1bHQ7DQorICAgICAgew0KKyAgICAgICAgVUludDY0IHNlYXJjaExpbWl0ID0gMDsNCisgICAgICAgIC8qDQorICAgICAgICBpZiAobW9kZS5DYW5SZXR1cm5BcmMpDQorICAgICAgICAgIHJlc3VsdCA9IGFyY2hpdmUtPk9wZW4ob3Auc3RyZWFtLCAmc2VhcmNoTGltaXQsIG9wLmNhbGxiYWNrKTsNCisgICAgICAgIGVsc2UNCisgICAgICAgICovDQorICAgICAgICByZXN1bHQgPSBPcGVuQXJjaGl2ZVNwZWMoYXJjaGl2ZSwgIW1vZGUuQ2FuUmV0dXJuQXJjLCBvcC5zdHJlYW0sICZzZWFyY2hMaW1pdCwgb3AuY2FsbGJhY2ssIGV4dHJhY3RDYWxsYmFja19Ub19PcGVuQ2FsbGJhY2spOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBpZiAocmVzdWx0ID09IFNfRkFMU0UpDQorICAgICAgew0KKyAgICAgICAgc2tpcEZyb250YWxGb3JtYXRbRm9ybWF0SW5kZXhdID0gdHJ1ZTsNCisgICAgICAgIC8vIEZJWE1FOiBtYXliZSB3ZSBtdXN0IHVzZSBMZW5Jc1Vua25vd24uDQorICAgICAgICAvLyBwcmludGYoIiAgT3BlbkZvclNpemUgRXJyb3IiKTsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBSSU5PSyhyZXN1bHQpOw0KKw0KKyAgICAgIFJJTk9LKFJlYWRCYXNpY1Byb3BzKGFyY2hpdmUsIDAsIHJlc3VsdCkpOw0KKw0KKyAgICAgIGlmIChPZmZzZXQgPiAwKQ0KKyAgICAgIHsNCisgICAgICAgIGNvbnRpbnVlOyAvLyBnb29kIGhhbmRsZXIgZG9lc24ndCByZXR1cm4gc3VjaCBPZmZzZXQgPiAwDQorICAgICAgICAvLyBidXQgdGhlcmUgYXJlIHNvbWUgY2FzZXMgbGlrZSBmYWxzZSBwcmVmaXhlZCBQSzAwIGFyY2hpdmUsIHdoZW4NCisgICAgICAgIC8vIHdlIGNhbiBzdXBwb3J0IGl0Pw0KKyAgICAgIH0NCisNCisgICAgICBOQXJjaGl2ZTo6TlBhcnNlcjo6Q1BhcnNlSXRlbSBwaTsNCisgICAgICBwaS5PZmZzZXQgPSBPZmZzZXQ7DQorICAgICAgcGkuU2l6ZSA9IEF2YWlsUGh5U2l6ZTsNCisgICAgICANCisgICAgICAvLyBib29sIG5lZWRTY2FuID0gZmFsc2U7DQorDQorICAgICAgaWYgKCFQaHlTaXplRGVmaW5lZCkNCisgICAgICB7DQorICAgICAgICAvLyBpdCdzIGZvciBaIGZvcm1hdA0KKyAgICAgICAgcGkuTGVuSXNVbmtub3duID0gdHJ1ZTsNCisgICAgICAgIC8vIG5lZWRTY2FuID0gdHJ1ZTsNCisgICAgICAgIC8vIHBoeVNpemUgPSBhcmNSZW07DQorICAgICAgICAvLyBuZXh0TmVlZENoZWNrU3RhcnRPcGVuID0gZmFsc2U7DQorICAgICAgfQ0KKw0KKyAgICAgIC8qDQorICAgICAgaWYgKE9rUGh5U2l6ZV9EZWZpbmVkKQ0KKyAgICAgICAgcGkuT2tTaXplID0gcGkuT2tQaHlTaXplOw0KKyAgICAgIGVsc2UNCisgICAgICAgIHBpLk9rU2l6ZSA9IHBpLlNpemU7DQorICAgICAgKi8NCisNCisgICAgICBwaS5Ob3JtYWxpemVPZmZzZXQoKTsNCisgICAgICAvLyBwcmludGYoIiAgcGh5U2l6ZSA9ICU4ZCIsICh1bnNpZ25lZClwaHlTaXplKTsNCisNCisNCisgICAgICBpZiAobW9kZS5DYW5SZXR1cm5BcmMpDQorICAgICAgew0KKyAgICAgICAgYm9vbCBpc01haW5Gb3JtYXQgPSBpc01haW5Gb3JtYXRBcnJbRm9ybWF0SW5kZXhdOw0KKyAgICAgICAgY29uc3QgQ09wZW5TcGVjRmxhZ3MgJnNwZWNGbGFncyA9IG1vZGUuR2V0U3BlYyhpc0ZvcmNlZCwgaXNNYWluRm9ybWF0LCBpc1Vua25vd25FeHQpOw0KKyAgICAgICAgYm9vbCBvcGVuQ3VyID0gZmFsc2U7DQorDQorICAgICAgICBpZiAoIUVycm9ySW5mby5UaGVyZUlzVGFpbCkNCisgICAgICAgICAgb3BlbkN1ciA9IHRydWU7DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIGlmIChtb2RlLlplcm9zVGFpbElzQWxsb3dlZCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIFJJTk9LKENoZWNrWmVyb3NUYWlsKG9wLCBPZmZzZXQgKyBQaHlTaXplKSk7DQorICAgICAgICAgICAgaWYgKEVycm9ySW5mby5JZ25vcmVUYWlsKQ0KKyAgICAgICAgICAgICAgb3BlbkN1ciA9IHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCFvcGVuQ3VyKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgb3BlbkN1ciA9IHNwZWNGbGFncy5DYW5SZXR1cm5Gcm9udGFsOw0KKyAgICAgICAgICAgIGlmIChmb3JtYXRJbmRleCA8IDApIC8vIGZvcm1hdCBpcyBub3QgZm9yY2VkDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgaWYgKElzUHJlQXJjRm9ybWF0KGFpKSkNCisgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gaWYgKG1vZGUuU2tpcFNmeFN0dWIpDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICBvcGVuQ3VyID0gZmFsc2U7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKG9wZW5DdXIpDQorICAgICAgICB7DQorICAgICAgICAgIEluU3RyZWFtID0gb3Auc3RyZWFtOw0KKyAgICAgICAgICBBcmNoaXZlID0gYXJjaGl2ZTsNCisgICAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgc2tpcEZyb250YWxGb3JtYXRbRm9ybWF0SW5kZXhdID0gdHJ1ZTsNCisNCisNCisgICAgICAvLyBpZiAoIW1vZGUuQ2FuUmV0dXJuQXJjKQ0KKyAgICAgIC8qDQorICAgICAgaWYgKCFFcnJvckluZm8uVGhlcmVJc1RhaWwpDQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICovDQorICAgICAgaWYgKHBpLk9mZnNldCA9PSAwICYmICFwaS5MZW5Jc1Vua25vd24gJiYgcGkuU2l6ZSA+PSBGaWxlU2l6ZSkNCisgICAgICAgIGNvbnRpbnVlOw0KKw0KKyAgICAgIC8vIHByaW50ZigiXG5BZGQgb2Zmc2V0ID0gJWQiLCAoaW50KXBpLk9mZnNldCk7DQorICAgICAgUklOT0soUmVhZFBhcnNlSXRlbVByb3BzKGFyY2hpdmUsIGFpLCBwaSkpOw0KKyAgICAgIGhhbmRsZXJTcGVjLT5BZGRJdGVtKHBpKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgDQorDQorICANCisgIA0KKyAgLy8gLS0tLS0tLS0tLSBQQVJTRVIgLS0tLS0tLS0tLQ0KKw0KKyAgQ1VJbnRWZWN0b3IgYXJjMnNpZzsgLy8gZm9ybWF0SW5kZXggdG8gc2lnbmF0dXJlSW5kZXgNCisgIENVSW50VmVjdG9yIHNpZzJhcmM7IC8vIHNpZ25hdHVyZUluZGV4IHRvIGZvcm1hdEluZGV4Ow0KKyAgew0KKyAgICB1bnNpZ25lZCBzdW0gPSAwOw0KKyAgICBGT1JfVkVDVE9SIChpLCBvcC5jb2RlY3MtPkZvcm1hdHMpDQorICAgIHsNCisgICAgICBhcmMyc2lnLkFkZChzdW0pOw0KKyAgICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q0J5dGVCdWZmZXI+ICZzaWdzID0gb3AuY29kZWNzLT5Gb3JtYXRzW2ldLlNpZ25hdHVyZXM7DQorICAgICAgc3VtICs9IHNpZ3MuU2l6ZSgpOw0KKyAgICAgIEZPUl9WRUNUT1IgKGssIHNpZ3MpDQorICAgICAgICBzaWcyYXJjLkFkZChpKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICB7DQorICAgIENBcmNoaXZlT3BlbkNhbGxiYWNrX09mZnNldCAqb3BlbkNhbGxiYWNrX09mZnNldF9TcGVjID0gbmV3IENBcmNoaXZlT3BlbkNhbGxiYWNrX09mZnNldDsNCisgICAgQ015Q29tUHRyPElBcmNoaXZlT3BlbkNhbGxiYWNrPiBvcGVuQ2FsbGJhY2tfT2Zmc2V0ID0gb3BlbkNhbGxiYWNrX09mZnNldF9TcGVjOw0KKw0KKyAgICBjb25zdCBzaXplX3Qga0JlZm9yZVNpemUgPSAxIDw8IDE2Ow0KKyAgICBjb25zdCBzaXplX3Qga0FmdGVyU2l6ZSAgPSAxIDw8IDIwOw0KKyAgICBjb25zdCBzaXplX3Qga0J1ZlNpemUgPSAxIDw8IDIyOyAvLyBpdCBtdXN0IGJlIG1vcmUgdGhhbiBrQmVmb3JlU2l6ZSArIGtBZnRlclNpemUNCisNCisgICAgY29uc3QgVUludDMyIGtOdW1WYWxzID0gKFVJbnQzMikxIDw8IChrTnVtSGFzaEJ5dGVzICogOCk7DQorICAgIENCeXRlQXJyIGhhc2hCdWZmZXIoa051bVZhbHMpOw0KKyAgICBCeXRlICpoYXNoID0gaGFzaEJ1ZmZlcjsNCisgICAgbWVtc2V0KGhhc2gsIDB4RkYsIGtOdW1WYWxzKTsNCisgICAgQnl0ZSBwcmV2c1syNTZdOw0KKyAgICBtZW1zZXQocHJldnMsIDB4RkYsIHNpemVvZihwcmV2cykpOw0KKyAgICBpZiAoc2lnMmFyYy5TaXplKCkgPj0gMHhGRikNCisgICAgICByZXR1cm4gU19GQUxTRTsNCisNCisgICAgQ1VJbnRWZWN0b3IgZGlmZmljdWx0Rm9ybWF0czsNCisgICAgQ0Jvb2xBcnIgZGlmZmljdWx0Qm9vbHMoMjU2KTsNCisgICAgew0KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAyNTY7IGkrKykNCisgICAgICAgIGRpZmZpY3VsdEJvb2xzW2ldID0gZmFsc2U7DQorICAgIH0NCisNCisgICAgYm9vbCB0aGVyZUFyZUhhbmRsZXJzRm9yU2VhcmNoID0gZmFsc2U7DQorDQorICAgIC8vIFVJbnQzMiBtYXhTaWduYXR1cmVFbmQgPSAwOw0KKyAgICANCisgICAgRk9SX1ZFQ1RPUiAoaSwgb3JkZXJJbmRpY2VzKQ0KKyAgICB7DQorICAgICAgaW50IGluZGV4ID0gb3JkZXJJbmRpY2VzW2ldOw0KKyAgICAgIGlmIChpbmRleCA8IDApDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBjb25zdCBDQXJjSW5mb0V4ICZhaSA9IG9wLmNvZGVjcy0+Rm9ybWF0c1tpbmRleF07DQorICAgICAgYm9vbCBpc0RpZmZpY3VsdCA9IGZhbHNlOw0KKyAgICAgIC8vIGlmIChhaS5WZXJzaW9uIDwgMHg5MUYpIC8vIHdlIGRvbid0IHVzZSBwYXJzZXIgd2l0aCBvbGQgRExMIChiZWZvcmUgOS4zMSkNCisgICAgICBpZiAoIWFpLk5ld0ludGVyZmFjZSkNCisgICAgICAgIGlzRGlmZmljdWx0ID0gdHJ1ZTsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgaWYgKGFpLkZsYWdzX1N0YXJ0T3BlbigpKQ0KKyAgICAgICAgICBpc0RpZmZpY3VsdCA9IHRydWU7DQorICAgICAgICBGT1JfVkVDVE9SIChrLCBhaS5TaWduYXR1cmVzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBjb25zdCBDQnl0ZUJ1ZmZlciAmc2lnID0gYWkuU2lnbmF0dXJlc1trXTsNCisgICAgICAgICAgLyoNCisgICAgICAgICAgVUludDMyIHNpZ25hdHVyZUVuZCA9IGFpLlNpZ25hdHVyZU9mZnNldCArIChVSW50MzIpc2lnLlNpemUoKTsNCisgICAgICAgICAgaWYgKG1heFNpZ25hdHVyZUVuZCA8IHNpZ25hdHVyZUVuZCkNCisgICAgICAgICAgICBtYXhTaWduYXR1cmVFbmQgPSBzaWduYXR1cmVFbmQ7DQorICAgICAgICAgICovDQorICAgICAgICAgIGlmIChzaWcuU2l6ZSgpIDwga051bUhhc2hCeXRlcykNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGlzRGlmZmljdWx0ID0gdHJ1ZTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB0aGVyZUFyZUhhbmRsZXJzRm9yU2VhcmNoID0gdHJ1ZTsNCisgICAgICAgICAgVUludDMyIHYgPSBIQVNIX1ZBTChzaWcsIDApOw0KKyAgICAgICAgICB1bnNpZ25lZCBzaWdJbmRleCA9IGFyYzJzaWdbaW5kZXhdICsgazsNCisgICAgICAgICAgcHJldnNbc2lnSW5kZXhdID0gaGFzaFt2XTsNCisgICAgICAgICAgaGFzaFt2XSA9IChCeXRlKXNpZ0luZGV4Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoaXNEaWZmaWN1bHQpDQorICAgICAgew0KKyAgICAgICAgZGlmZmljdWx0Rm9ybWF0cy5BZGQoaW5kZXgpOw0KKyAgICAgICAgZGlmZmljdWx0Qm9vbHNbaW5kZXhdID0gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIGlmICghdGhlcmVBcmVIYW5kbGVyc0ZvclNlYXJjaCkNCisgICAgew0KKyAgICAgIC8vIG9wZW5Pbmx5RnVsbEFyYyA9IHRydWU7DQorICAgICAgLy8gY2FuUmV0dXJuVGFpbEFyYyA9IHRydWU7DQorICAgIH0NCisgICAgDQorICAgIFJJTk9LKG9wLnN0cmVhbS0+U2VlaygwLCBTVFJFQU1fU0VFS19TRVQsIE5VTEwpKTsNCisNCisgICAgQ0xpbWl0ZWRDYWNoZWRJblN0cmVhbSAqbGltaXRlZFN0cmVhbVNwZWMgPSBuZXcgQ0xpbWl0ZWRDYWNoZWRJblN0cmVhbTsNCisgICAgQ015Q29tUHRyPElJblN0cmVhbT4gbGltaXRlZFN0cmVhbSA9IGxpbWl0ZWRTdHJlYW1TcGVjOw0KKyAgICBsaW1pdGVkU3RyZWFtU3BlYy0+U2V0U3RyZWFtKG9wLnN0cmVhbSk7DQorDQorICAgIG9wZW5DYWxsYmFja19PZmZzZXRfU3BlYy0+Q2FsbGJhY2sgPSBvcC5jYWxsYmFjazsNCisNCisgICAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICAgIGlmIChvcC5jYWxsYmFjaykNCisgICAgew0KKyAgICAgIG9wZW5DYWxsYmFja19PZmZzZXRfU3BlYy0+Q2FsbGJhY2suUXVlcnlJbnRlcmZhY2UoSUlEX0lDcnlwdG9HZXRUZXh0UGFzc3dvcmQsICZvcGVuQ2FsbGJhY2tfT2Zmc2V0X1NwZWMtPkdldFRleHRQYXNzd29yZCk7DQorICAgIH0NCisgICAgI2VuZGlmDQorDQorICAgIFJJTk9LKG9wLmNhbGxiYWNrLT5TZXRUb3RhbChOVUxMLCAmZmlsZVNpemUpKTsNCisgICAgQ0J5dGVCdWZmZXIgJmJ5dGVCdWZmZXIgPSBsaW1pdGVkU3RyZWFtU3BlYy0+QnVmZmVyOw0KKyAgICBieXRlQnVmZmVyLkFsbG9jKGtCdWZTaXplKTsNCisNCisgICAgVUludDY0IGNhbGxiYWNrUHJldiA9IDA7DQorICAgIGJvb2wgbmVlZENoZWNrU3RhcnRPcGVuID0gdHJ1ZTsgLy8gPSB0cnVlLCBpZiB3ZSBuZWVkIHRvIHRlc3QgYWxsIGFyY2hpdmVzIHR5cGVzIGZvciBjdXJyZW50IHBvcy4NCisNCisgICAgYm9vbCBlbmRPZkZpbGUgPSBmYWxzZTsNCisgICAgVUludDY0IGJ1ZlBoeVBvcyA9IDA7DQorICAgIHNpemVfdCBieXRlc0luQnVmID0gMDsNCisgICAgLy8gVUludDY0IHByZXZQb3MgPSAwOw0KKyAgICANCisgICAgLy8gLS0tLS0tLS0tLSBNYWluIFNjYW4gTG9vcCAtLS0tLS0tLS0tDQorDQorICAgIFVJbnQ2NCBwb3MgPSAwOw0KKw0KKyAgICBpZiAoIW1vZGUuRWFjaFBvcyAmJiBoYW5kbGVyU3BlYy0+X2l0ZW1zLlNpemUoKSA9PSAxKQ0KKyAgICB7DQorICAgICAgTkFyY2hpdmU6Ok5QYXJzZXI6OkNQYXJzZUl0ZW0gJnBpID0gaGFuZGxlclNwZWMtPl9pdGVtc1swXTsNCisgICAgICBpZiAoIXBpLkxlbklzVW5rbm93biAmJiBwaS5PZmZzZXQgPT0gMCkNCisgICAgICAgIHBvcyA9IHBpLlNpemU7DQorICAgIH0NCisNCisgICAgZm9yICg7OykNCisgICAgew0KKyAgICAgIC8vIHByaW50ZigiXG5Qb3MgPSAlZCIsIChpbnQpcG9zKTsNCisgICAgICBVSW50NjQgcG9zSW5CdWYgPSBwb3MgLSBidWZQaHlQb3M7DQorICAgICAgDQorICAgICAgLy8gaWYgKHBvcyA+ICgoVUludDY0KTEgPDwgMzUpKSBicmVhazsNCisgICAgICANCisgICAgICBpZiAoIWVuZE9mRmlsZSkNCisgICAgICB7DQorICAgICAgICBpZiAoYnl0ZXNJbkJ1ZiA8IGtCdWZTaXplKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBzaXplX3QgcHJvY2Vzc2VkU2l6ZSA9IGtCdWZTaXplIC0gYnl0ZXNJbkJ1ZjsNCisgICAgICAgICAgLy8gcHJpbnRmKCJcblJlYWQgYXNrID0gJWQiLCAodW5zaWduZWQpcHJvY2Vzc2VkU2l6ZSk7DQorICAgICAgICAgIFVJbnQ2NCBzZWVrUG9zID0gYnVmUGh5UG9zICsgYnl0ZXNJbkJ1ZjsNCisgICAgICAgICAgUklOT0sob3Auc3RyZWFtLT5TZWVrKGJ1ZlBoeVBvcyArIGJ5dGVzSW5CdWYsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCkpOw0KKyAgICAgICAgICBSSU5PSyhSZWFkU3RyZWFtKG9wLnN0cmVhbSwgYnl0ZUJ1ZmZlciArIGJ5dGVzSW5CdWYsICZwcm9jZXNzZWRTaXplKSk7DQorICAgICAgICAgIC8vIHByaW50ZigiICAgcHJvY2Vzc2VkID0gJWQiLCAodW5zaWduZWQpcHJvY2Vzc2VkU2l6ZSk7DQorICAgICAgICAgIGlmIChwcm9jZXNzZWRTaXplID09IDApDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBmaWxlU2l6ZSA9IHNlZWtQb3M7DQorICAgICAgICAgICAgZW5kT2ZGaWxlID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBlbHNlDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBieXRlc0luQnVmICs9IHByb2Nlc3NlZFNpemU7DQorICAgICAgICAgICAgbGltaXRlZFN0cmVhbVNwZWMtPlNldENhY2hlKHByb2Nlc3NlZFNpemUsIChzaXplX3QpYnVmUGh5UG9zKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKGJ5dGVzSW5CdWYgPCBwb3NJbkJ1ZikNCisgICAgICAgIHsNCisgICAgICAgICAgVUludDY0IHNraXBTaXplID0gcG9zSW5CdWYgLSBieXRlc0luQnVmOw0KKyAgICAgICAgICBpZiAoc2tpcFNpemUgPD0ga0JlZm9yZVNpemUpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBzaXplX3Qga2VlcFNpemUgPSAoc2l6ZV90KShrQmVmb3JlU2l6ZSAtIHNraXBTaXplKTsNCisgICAgICAgICAgICAvLyBwcmludGYoIlxubWVtbW92ZSBza2lwID0gJWQiLCAoaW50KWtlZXBTaXplKTsNCisgICAgICAgICAgICBtZW1tb3ZlKGJ5dGVCdWZmZXIsIGJ5dGVCdWZmZXIgKyBieXRlc0luQnVmIC0ga2VlcFNpemUsIGtlZXBTaXplKTsNCisgICAgICAgICAgICBieXRlc0luQnVmID0ga2VlcFNpemU7DQorICAgICAgICAgICAgYnVmUGh5UG9zID0gcG9zIC0ga2VlcFNpemU7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgLy8gcHJpbnRmKCJcblNraXAgJWQiLCAoaW50KShza2lwU2l6ZSAtIGtCZWZvcmVTaXplKSk7DQorICAgICAgICAgIC8vIFJJTk9LKG9wLnN0cmVhbS0+U2Vlayhza2lwU2l6ZSAtIGtCZWZvcmVTaXplLCBTVFJFQU1fU0VFS19DVVIsIE5VTEwpKTsNCisgICAgICAgICAgYnl0ZXNJbkJ1ZiA9IDA7DQorICAgICAgICAgIGJ1ZlBoeVBvcyA9IHBvcyAtIGtCZWZvcmVTaXplOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYgKGJ5dGVzSW5CdWYgLSBwb3NJbkJ1ZiA8IGtBZnRlclNpemUpDQorICAgICAgICB7DQorICAgICAgICAgIHNpemVfdCBiZWcgPSAoc2l6ZV90KXBvc0luQnVmIC0ga0JlZm9yZVNpemU7DQorICAgICAgICAgIC8vIHByaW50ZigiXG5tZW1tb3ZlIGZvciBhZnRlciBiZWcgPSAlZCIsIChpbnQpYmVnKTsNCisgICAgICAgICAgbWVtbW92ZShieXRlQnVmZmVyLCBieXRlQnVmZmVyICsgYmVnLCBieXRlc0luQnVmIC0gYmVnKTsNCisgICAgICAgICAgYnVmUGh5UG9zICs9IGJlZzsNCisgICAgICAgICAgYnl0ZXNJbkJ1ZiAtPSBiZWc7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICBpZiAocG9zID49IGNhbGxiYWNrUHJldiArICgxIDw8IDIzKSkNCisgICAgICB7DQorICAgICAgICBvcGVuQ2FsbGJhY2tfT2Zmc2V0X1NwZWMtPkZpbGVzID0gaGFuZGxlclNwZWMtPl9pdGVtcy5TaXplKCk7DQorICAgICAgICBvcGVuQ2FsbGJhY2tfT2Zmc2V0X1NwZWMtPk9mZnNldCA9IHBvczsNCisgICAgICAgIFJJTk9LKG9wZW5DYWxsYmFja19PZmZzZXQtPlNldENvbXBsZXRlZChOVUxMLCBOVUxMKSk7DQorICAgICAgICBjYWxsYmFja1ByZXYgPSBwb3M7DQorICAgICAgfQ0KKw0KKyAgICAgIHsNCisgICAgICAgIFVJbnQ2NCBlbmRQb3MgPSBidWZQaHlQb3MgKyBieXRlc0luQnVmOw0KKyAgICAgICAgaWYgKGZpbGVTaXplIDwgZW5kUG9zKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBGaWxlU2l6ZSA9IGZpbGVTaXplOyAvLyB3aHkgPz8/Pw0KKyAgICAgICAgICBmaWxlU2l6ZSA9IGVuZFBvczsNCisgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgc2l6ZV90IGF2YWlsU2l6ZSA9IGJ5dGVzSW5CdWYgLSAoc2l6ZV90KXBvc0luQnVmOw0KKyAgICAgIGlmIChhdmFpbFNpemUgPCBrTnVtSGFzaEJ5dGVzKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgc2l6ZV90IHNjYW5TaXplID0gYXZhaWxTaXplIC0NCisgICAgICAgICAgKChhdmFpbFNpemUgPj0ga0FmdGVyU2l6ZSkgPyBrQWZ0ZXJTaXplIDoga051bUhhc2hCeXRlcyk7DQorICANCisgICAgICB7DQorICAgICAgICAvKg0KKyAgICAgICAgVUludDY0IHNjYW5MaW1pdCA9IG9wZW5Pbmx5RnVsbEFyYyA/DQorICAgICAgICAgICAgbWF4U2lnbmF0dXJlRW5kIDoNCisgICAgICAgICAgICBvcC5vcGVuVHlwZS5TY2FuU2l6ZSArIG1heFNpZ25hdHVyZUVuZDsNCisgICAgICAgICovDQorICAgICAgICBpZiAoIW1vZGUuQ2FuUmV0dXJuUGFyc2VyKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAocG9zID4gbWF4U3RhcnRPZmZzZXQpDQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIFVJbnQ2NCByZW1TY2FuID0gbWF4U3RhcnRPZmZzZXQgLSBwb3M7DQorICAgICAgICAgIGlmIChzY2FuU2l6ZSA+IHJlbVNjYW4pDQorICAgICAgICAgICAgc2NhblNpemUgPSAoc2l6ZV90KXJlbVNjYW47DQorICAgICAgICB9DQorICAgICAgfQ0KKw0KKyAgICAgIHNjYW5TaXplKys7DQorDQorICAgICAgY29uc3QgQnl0ZSAqYnVmID0gYnl0ZUJ1ZmZlciArIChzaXplX3QpcG9zSW5CdWY7DQorICAgICAgc2l6ZV90IHBwcCA9IDA7DQorICAgICAgDQorICAgICAgaWYgKCFuZWVkQ2hlY2tTdGFydE9wZW4pDQorICAgICAgew0KKyAgICAgICAgZm9yICg7IHBwcCA8IHNjYW5TaXplICYmIGhhc2hbSEFTSF9WQUwoYnVmLCBwcHApXSA9PSAweEZGOyBwcHArKyk7DQorICAgICAgICBwb3MgKz0gcHBwOw0KKyAgICAgICAgaWYgKHBwcCA9PSBzY2FuU2l6ZSkNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIFVJbnQzMiB2ID0gSEFTSF9WQUwoYnVmLCBwcHApOw0KKyAgICAgIGJvb2wgbmV4dE5lZWRDaGVja1N0YXJ0T3BlbiA9IHRydWU7DQorICAgICAgdW5zaWduZWQgaSA9IGhhc2hbdl07DQorICAgICAgdW5zaWduZWQgaW5kZXhPZkRpZmZpY3VsdCA9IDA7DQorDQorICAgICAgLy8gLS0tLS0tLS0tLSBPcGVuIExvb3AgZm9yIEN1cnJlbnQgUG9zIC0tLS0tLS0tLS0NCisgICAgICBib29sIHdhc09wZW4gPSBmYWxzZTsNCisgICAgICANCisgICAgICBmb3IgKDs7KQ0KKyAgICAgIHsNCisgICAgICAgIHVuc2lnbmVkIGluZGV4Ow0KKyAgICAgICAgYm9vbCBpc0RpZmZpY3VsdDsNCisgICAgICAgIGlmIChuZWVkQ2hlY2tTdGFydE9wZW4gJiYgaW5kZXhPZkRpZmZpY3VsdCA8IGRpZmZpY3VsdEZvcm1hdHMuU2l6ZSgpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpbmRleCA9IGRpZmZpY3VsdEZvcm1hdHNbaW5kZXhPZkRpZmZpY3VsdCsrXTsNCisgICAgICAgICAgaXNEaWZmaWN1bHQgPSB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAoaSA9PSAweEZGKQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBpbmRleCA9IHNpZzJhcmNbaV07DQorICAgICAgICAgIHVuc2lnbmVkIHNpZ0luZGV4ID0gaSAtIGFyYzJzaWdbaW5kZXhdOw0KKyAgICAgICAgICBpID0gcHJldnNbaV07DQorICAgICAgICAgIGlmIChuZWVkQ2hlY2tTdGFydE9wZW4gJiYgZGlmZmljdWx0Qm9vbHNbaW5kZXhdKQ0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICBjb25zdCBDQXJjSW5mb0V4ICZhaSA9IG9wLmNvZGVjcy0+Rm9ybWF0c1tpbmRleF07DQorDQorICAgICAgICAgIGlmIChwb3MgPCBhaS5TaWduYXR1cmVPZmZzZXQpDQorICAgICAgICAgICAgY29udGludWU7DQorDQorICAgICAgICAgIC8qDQorICAgICAgICAgIGlmIChvcGVuT25seUZ1bGxBcmMpDQorICAgICAgICAgICAgaWYgKHBvcyAhPSBhaS5TaWduYXR1cmVPZmZzZXQpDQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgKi8NCisgIA0KKyAgICAgICAgICBjb25zdCBDQnl0ZUJ1ZmZlciAmc2lnID0gYWkuU2lnbmF0dXJlc1tzaWdJbmRleF07DQorDQorICAgICAgICAgIGlmIChwcHAgKyBzaWcuU2l6ZSgpID4gYXZhaWxTaXplDQorICAgICAgICAgICAgICB8fCAhVGVzdFNpZ25hdHVyZShidWYgKyBwcHAsIHNpZywgc2lnLlNpemUoKSkpDQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIC8vIHByaW50ZigiXG5TaWduYXR1cmUgT0s6ICUxMFMgJTh4ICU1ZCIsIChjb25zdCB3Y2hhcl90ICopYWkuTmFtZSwgKGludClwb3MsIChpbnQpKHBvcyAtIHByZXZQb3MpKTsNCisgICAgICAgICAgLy8gcHJldlBvcyA9IHBvczsNCisgICAgICAgICAgaXNEaWZmaWN1bHQgPSBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGNvbnN0IENBcmNJbmZvRXggJmFpID0gb3AuY29kZWNzLT5Gb3JtYXRzW2luZGV4XTsNCisNCisNCisgICAgICAgIGlmICgoaXNEaWZmaWN1bHQgJiYgcG9zID09IDApIHx8IGFpLlNpZ25hdHVyZU9mZnNldCA9PSBwb3MpDQorICAgICAgICB7DQorICAgICAgICAgIC8vIHdlIGRvbid0IGNoZWNrIHNhbWUgYXJjaGl2ZSBzZWNvbmQgdGltZSAqLw0KKyAgICAgICAgICBpZiAoc2tpcEZyb250YWxGb3JtYXRbaW5kZXhdKQ0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgVUludDY0IHN0YXJ0QXJjUG9zID0gcG9zOw0KKyAgICAgICAgaWYgKCFpc0RpZmZpY3VsdCkNCisgICAgICAgIHsNCisgICAgICAgICAgaWYgKHBvcyA8IGFpLlNpZ25hdHVyZU9mZnNldCkNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgc3RhcnRBcmNQb3MgPSBwb3MgLSBhaS5TaWduYXR1cmVPZmZzZXQ7DQorICAgICAgICAgIC8qDQorICAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdGhlIGNoZWNrIGZvciBaIGZpbGVzDQorICAgICAgICAgIGlmIChzdGFydEFyY1BvcyA8IGhhbmRsZXJTcGVjLT5HZXRMYXN0RW5kKCkpDQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICovDQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmIChhaS5Jc0FyY0Z1bmMgJiYgc3RhcnRBcmNQb3MgPj0gYnVmUGh5UG9zKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBzaXplX3Qgb2Zmc2V0SW5CdWYgPSAoc2l6ZV90KShzdGFydEFyY1BvcyAtIGJ1ZlBoeVBvcyk7DQorICAgICAgICAgIGlmIChvZmZzZXRJbkJ1ZiA8IGJ5dGVzSW5CdWYpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBVSW50MzIgaXNBcmNSZXMgPSBhaS5Jc0FyY0Z1bmMoYnl0ZUJ1ZmZlciArIG9mZnNldEluQnVmLCBieXRlc0luQnVmIC0gb2Zmc2V0SW5CdWYpOw0KKyAgICAgICAgICAgIGlmIChpc0FyY1JlcyA9PSBrX0lzQXJjX1Jlc19OTykNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIGlmIChpc0FyY1JlcyA9PSBrX0lzQXJjX1Jlc19ORUVEX01PUkUgJiYgZW5kT2ZGaWxlKQ0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgLyoNCisgICAgICAgICAgICBpZiAoaXNBcmNSZXMgPT0ga19Jc0FyY19SZXNfWUVTX0xPV19QUk9CKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIC8vIGlmIChwb3MgIT0gYWkuU2lnbmF0dXJlT2Zmc2V0KQ0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICovDQorICAgICAgICAgIH0NCisgICAgICAgICAgLy8gcHJpbnRmKCJcbklzQXJjIE9LOiAlUyIsIChjb25zdCB3Y2hhcl90ICopYWkuTmFtZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIC8qDQorICAgICAgICBpZiAocG9zID09IDY3MTA5ODg4KQ0KKyAgICAgICAgICBwb3MgPSBwb3M7DQorICAgICAgICAqLw0KKyAgICAgICAgUFJGKHByaW50ZigiXG5wb3MgPSAlOUk2NGQgOiAlUyIsIHBvcywgKGNvbnN0IHdjaGFyX3QgKilhaS5OYW1lKSk7DQorDQorICAgICAgICBib29sIGlzTWFpbkZvcm1hdCA9IGlzTWFpbkZvcm1hdEFycltpbmRleF07DQorICAgICAgICBjb25zdCBDT3BlblNwZWNGbGFncyAmc3BlY0ZsYWdzID0gbW9kZS5HZXRTcGVjKGlzRm9yY2VkLCBpc01haW5Gb3JtYXQsIGlzVW5rbm93bkV4dCk7DQorICAgICAgICANCisgICAgICAgIENNeUNvbVB0cjxJSW5BcmNoaXZlPiBhcmNoaXZlOw0KKyAgICAgICAgUklOT0soUHJlcGFyZVRvT3BlbihvcCwgaW5kZXgsIGFyY2hpdmUpKTsNCisgICAgICAgIGlmICghYXJjaGl2ZSkNCisgICAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICAgIA0KKyAgICAgICAgLy8gT3V0cHV0RGVidWdTdHJpbmdXKGFpLk5hbWUpOw0KKyAgICAgICAgDQorICAgICAgICBVSW50NjQgcmVtID0gZmlsZVNpemUgLSBzdGFydEFyY1BvczsNCisgICAgICAgIA0KKyAgICAgICAgVUludDY0IGFyY1N0cmVhbU9mZnNldCA9IDA7DQorDQorICAgICAgICBpZiAoYWkuRmxhZ3NfVXNlR2xvYmFsT2Zmc2V0KCkpDQorICAgICAgICB7DQorICAgICAgICAgIGxpbWl0ZWRTdHJlYW1TcGVjLT5Jbml0QW5kU2VlaygwLCBmaWxlU2l6ZSk7DQorICAgICAgICAgIGxpbWl0ZWRTdHJlYW0tPlNlZWsoc3RhcnRBcmNQb3MsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIGxpbWl0ZWRTdHJlYW1TcGVjLT5Jbml0QW5kU2VlayhzdGFydEFyY1BvcywgcmVtKTsNCisgICAgICAgICAgYXJjU3RyZWFtT2Zmc2V0ID0gc3RhcnRBcmNQb3M7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIFVJbnQ2NCBtYXhDaGVja1N0YXJ0UG9zaXRpb24gPSAwOw0KKyAgICAgICAgb3BlbkNhbGxiYWNrX09mZnNldF9TcGVjLT5GaWxlcyA9IGhhbmRsZXJTcGVjLT5faXRlbXMuU2l6ZSgpOw0KKyAgICAgICAgb3BlbkNhbGxiYWNrX09mZnNldF9TcGVjLT5PZmZzZXQgPSBzdGFydEFyY1BvczsNCisgICAgICAgIC8vIEhSRVNVTFQgcmVzdWx0ID0gYXJjaGl2ZS0+T3BlbihsaW1pdGVkU3RyZWFtLCAmbWF4Q2hlY2tTdGFydFBvc2l0aW9uLCBvcGVuQ2FsbGJhY2tfT2Zmc2V0KTsNCisgICAgICAgIGV4dHJhY3RDYWxsYmFja19Ub19PcGVuQ2FsbGJhY2tfU3BlYy0+RmlsZXMgPSAwOw0KKyAgICAgICAgZXh0cmFjdENhbGxiYWNrX1RvX09wZW5DYWxsYmFja19TcGVjLT5PZmZzZXQgPSBzdGFydEFyY1BvczsNCisNCisgICAgICAgIEhSRVNVTFQgcmVzdWx0ID0gT3BlbkFyY2hpdmVTcGVjKGFyY2hpdmUsIHRydWUsIGxpbWl0ZWRTdHJlYW0sICZtYXhDaGVja1N0YXJ0UG9zaXRpb24sIG9wZW5DYWxsYmFja19PZmZzZXQsIGV4dHJhY3RDYWxsYmFja19Ub19PcGVuQ2FsbGJhY2spOw0KKyAgICAgDQorICAgICAgICBSSU5PSyhSZWFkQmFzaWNQcm9wcyhhcmNoaXZlLCBhaS5GbGFnc19Vc2VHbG9iYWxPZmZzZXQoKSA/IDAgOiBzdGFydEFyY1BvcywgcmVzdWx0KSk7DQorDQorICAgICAgICBib29sIGlzT3BlbiA9IGZhbHNlOw0KKyAgICAgICAgaWYgKHJlc3VsdCA9PSBTX0ZBTFNFKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAoIW1vZGUuQ2FuUmV0dXJuUGFyc2VyKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGZvcm1hdEluZGV4IDwgMCAmJiBFcnJvckluZm8uSXNBcmNfQWZ0ZXJfTm9uT3BlbigpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIEVycm9ySW5mby5FcnJvckZvcm1hdEluZGV4ID0gaW5kZXg7DQorICAgICAgICAgICAgICBOb25PcGVuX0Vycm9ySW5mbyA9IEVycm9ySW5mbzsNCisgICAgICAgICAgICAgIC8vIGlmIGFyY2hpdmUgd2FzIGRldGVjdGVkLCB3ZSBkb24ndCBuZWVkIGFkZGl0aW9uYWwgb3BlbiBhdHRlbXB0cw0KKyAgICAgICAgICAgICAgcmV0dXJuIFNfRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICghRXJyb3JJbmZvLklzQXJjX0FmdGVyX05vbk9wZW4oKSB8fCAhUGh5U2l6ZURlZmluZWQgfHwgUGh5U2l6ZSA9PSAwKQ0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpc09wZW4gPSB0cnVlOw0KKyAgICAgICAgICBSSU5PSyhyZXN1bHQpOw0KKyAgICAgICAgICBQUkYocHJpbnRmKCIgIE9LICIpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIGZwcmludGYoc3RkZXJyLCAiXG4gJThYICAlUyIsIHN0YXJ0QXJjUG9zLCBQYXRoKTsNCisgICAgICAgIC8vIHByaW50ZigiXG5PcGVuIE9LOiAlUyIsIGFpLk5hbWUpOw0KKyAgICAgICAgDQorICAgICAgICANCisgICAgICAgIE5BcmNoaXZlOjpOUGFyc2VyOjpDUGFyc2VJdGVtIHBpOw0KKyAgICAgICAgcGkuT2Zmc2V0ID0gc3RhcnRBcmNQb3M7DQorDQorICAgICAgICBpZiAoYWkuRmxhZ3NfVXNlR2xvYmFsT2Zmc2V0KCkpDQorICAgICAgICAgIHBpLk9mZnNldCA9IE9mZnNldDsNCisgICAgICAgIGVsc2UgaWYgKE9mZnNldCAhPSAwKQ0KKyAgICAgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICAgICAgVUludDY0IGFyY1JlbSA9IEZpbGVTaXplIC0gcGkuT2Zmc2V0Ow0KKyAgICAgICAgVUludDY0IHBoeVNpemUgPSBhcmNSZW07DQorICAgICAgICBib29sIHBoeVNpemVEZWZpbmVkID0gUGh5U2l6ZURlZmluZWQ7DQorICAgICAgICBpZiAocGh5U2l6ZURlZmluZWQpDQorICAgICAgICB7DQorICAgICAgICAgIGlmIChwaS5PZmZzZXQgKyBQaHlTaXplID4gRmlsZVNpemUpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICAvLyBFcnJvckluZm8uVGhlcmVJc1RhaWwgPSB0cnVlOw0KKyAgICAgICAgICAgIFBoeVNpemUgPSBGaWxlU2l6ZSAtIHBpLk9mZnNldDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwaHlTaXplID0gUGh5U2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwaHlTaXplID09IDAgfHwgKFVJbnQ2NClwaHlTaXplID4gKChVSW50NjQpMSA8PCA2MykpDQorICAgICAgICAgIHJldHVybiBFX0ZBSUw7DQorDQorICAgICAgICAvKg0KKyAgICAgICAgaWYgKCFhaS5Vc2VHbG9iYWxPZmZzZXQpDQorICAgICAgICB7DQorICAgICAgICAgIGlmIChwaHlTaXplID4gYXJjUmVtKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgVGhlcmVJc1RhaWwgPSB0cnVlOw0KKyAgICAgICAgICAgIHBoeVNpemUgPSBhcmNSZW07DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgICovDQorICAgICAgICANCisgICAgICAgIGJvb2wgbmVlZFNjYW4gPSBmYWxzZTsNCisNCisgDQorICAgICAgICBpZiAoaXNPcGVuICYmICFwaHlTaXplRGVmaW5lZCkNCisgICAgICAgIHsNCisgICAgICAgICAgLy8gaXQncyBmb3IgWiBmb3JtYXQNCisgICAgICAgICAgcGkuTGVuSXNVbmtub3duID0gdHJ1ZTsNCisgICAgICAgICAgbmVlZFNjYW4gPSB0cnVlOw0KKyAgICAgICAgICBwaHlTaXplID0gYXJjUmVtOw0KKyAgICAgICAgICBuZXh0TmVlZENoZWNrU3RhcnRPcGVuID0gZmFsc2U7DQorICAgICAgICB9DQorDQorICAgICAgICBwaS5TaXplID0gcGh5U2l6ZTsNCisgICAgICAgIC8qDQorICAgICAgICBpZiAoT2tQaHlTaXplX0RlZmluZWQpDQorICAgICAgICAgIHBpLk9rU2l6ZSA9IE9rUGh5U2l6ZTsNCisgICAgICAgICovDQorICAgICAgICBwaS5Ob3JtYWxpemVPZmZzZXQoKTsNCisgICAgICAgIC8vIHByaW50ZigiICBwaHlTaXplID0gJThkIiwgKHVuc2lnbmVkKXBoeVNpemUpOw0KKw0KKyAgICAgICAgLyoNCisgICAgICAgIGlmIChuZWVkU2tpcEZ1bGxBcmMpDQorICAgICAgICAgIGlmIChwaS5PZmZzZXQgPT0gMCAmJiBwaHlTaXplRGVmaW5lZCAmJiBwaS5TaXplID49IGZpbGVTaXplKQ0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgKi8NCisgICAgICAgIGlmIChwaS5PZmZzZXQgPT0gMCAmJiAhcGkuTGVuSXNVbmtub3duICYmIHBpLlNpemUgPj0gRmlsZVNpemUpDQorICAgICAgICB7DQorICAgICAgICAgIC8vIGl0J3MgcG9zc2libGUgZm9yIGRtZyBhcmNoaXZlcw0KKyAgICAgICAgICBpZiAoIW1vZGUuQ2FuUmV0dXJuQXJjKQ0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKG1vZGUuRWFjaFBvcykNCisgICAgICAgICAgcG9zKys7DQorICAgICAgICBlbHNlIGlmIChuZWVkU2NhbikNCisgICAgICAgIHsNCisgICAgICAgICAgcG9zKys7DQorICAgICAgICAgIC8qDQorICAgICAgICAgIGlmICghT2tQaHlTaXplX0RlZmluZWQpDQorICAgICAgICAgICAgcG9zKys7DQorICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICBwb3MgPSBwaS5PZmZzZXQgKyBwaS5Pa1NpemU7DQorICAgICAgICAgICovDQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICAgIHBvcyA9IHBpLk9mZnNldCArIHBpLlNpemU7DQorDQorICAgICAgIA0KKyAgICAgICAgUklOT0soUmVhZFBhcnNlSXRlbVByb3BzKGFyY2hpdmUsIGFpLCBwaSkpOw0KKw0KKyAgICAgICAgaWYgKHBpLk9mZnNldCA8IHN0YXJ0QXJjUG9zICYmICFtb2RlLkVhY2hQb3MgLyogJiYgcGh5U2l6ZURlZmluZWQgKi8pDQorICAgICAgICB7DQorICAgICAgICAgIC8qIEl0J3MgZm9yIERNRyBmb3JtYXQuDQorICAgICAgICAgIFRoaXMgY29kZSBkZWxldGVzIGFsbCBwcmV2aW91cyBpdGVtcyB0aGF0IGFyZSBpbmNsdWRlZCB0byBjdXJyZW50IGl0ZW0gKi8NCisgICAgICAgICAgICANCisgICAgICAgICAgd2hpbGUgKCFoYW5kbGVyU3BlYy0+X2l0ZW1zLklzRW1wdHkoKSkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIGNvbnN0IE5BcmNoaXZlOjpOUGFyc2VyOjpDUGFyc2VJdGVtICZiYWNrID0gaGFuZGxlclNwZWMtPl9pdGVtcy5CYWNrKCk7DQorICAgICAgICAgICAgICBpZiAoYmFjay5PZmZzZXQgPCBwaS5PZmZzZXQpDQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgaWYgKGJhY2suT2Zmc2V0ICsgYmFjay5TaXplID4gcGkuT2Zmc2V0ICsgcGkuU2l6ZSkNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGhhbmRsZXJTcGVjLT5faXRlbXMuRGVsZXRlQmFjaygpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisNCisgICAgICAgIGlmIChpc09wZW4gJiYgbW9kZS5DYW5SZXR1cm5BcmMgJiYgcGh5U2l6ZURlZmluZWQpDQorICAgICAgICB7DQorICAgICAgICAgIC8vIGlmIChwaS5PZmZzZXQgKyBwaS5TaXplID49IGZpbGVTaXplKQ0KKyAgICAgICAgICBib29sIG9wZW5DdXIgPSBmYWxzZTsNCisNCisgICAgICAgICAgYm9vbCB0aGVyZUlzVGFpbCA9IEVycm9ySW5mby5UaGVyZUlzVGFpbDsNCisgICAgICAgICAgaWYgKHRoZXJlSXNUYWlsICYmIG1vZGUuWmVyb3NUYWlsSXNBbGxvd2VkKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgUklOT0soQ2hlY2taZXJvc1RhaWwob3AsIGFyY1N0cmVhbU9mZnNldCArIE9mZnNldCArIFBoeVNpemUpKTsNCisgICAgICAgICAgICBpZiAoRXJyb3JJbmZvLklnbm9yZVRhaWwpDQorICAgICAgICAgICAgICB0aGVyZUlzVGFpbCA9IGZhbHNlOw0KKyAgICAgICAgICB9DQorDQorICAgICAgICAgIGlmIChwaS5PZmZzZXQgIT0gMCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGlmICghcGkuSXNOb3RBcmNUeXBlKQ0KKyAgICAgICAgICAgICAgaWYgKHRoZXJlSXNUYWlsKQ0KKyAgICAgICAgICAgICAgICBvcGVuQ3VyID0gc3BlY0ZsYWdzLkNhblJldHVybk1pZDsNCisgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgb3BlbkN1ciA9IHNwZWNGbGFncy5DYW5SZXR1cm5UYWlsOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGVsc2UNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIGlmICghdGhlcmVJc1RhaWwpDQorICAgICAgICAgICAgICBvcGVuQ3VyID0gdHJ1ZTsNCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICBvcGVuQ3VyID0gc3BlY0ZsYWdzLkNhblJldHVybkZyb250YWw7DQorICAgICAgICAgICAgICANCisNCisgICAgICAgICAgICBpZiAoZm9ybWF0SW5kZXggPj0gLTIpDQorICAgICAgICAgICAgICBvcGVuQ3VyID0gdHJ1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoZm9ybWF0SW5kZXggPCAwICYmIHBpLklzU2VsZkV4ZSAvKiAmJiBtb2RlLlNraXBTZnhTdHViICovKQ0KKyAgICAgICAgICAgIG9wZW5DdXIgPSBmYWxzZTsNCisNCisgICAgICAgICAgLy8gV2Ugb3BlbiBmaWxlIGFzIFNGWCwgaWYgdGhlcmUgaXMgZnJvbnQgYXJjaGl2ZSBvciBmaXJzdCBhcmNoaXZlIGlzICJTZWxmIEV4ZWN1dGFibGUiDQorICAgICAgICAgIGlmICghb3BlbkN1ciAmJiAhcGkuSXNTZWxmRXhlICYmICF0aGVyZUlzVGFpbCAmJg0KKyAgICAgICAgICAgICAgKCFwaS5Jc05vdEFyY1R5cGUgfHwgcGkuT2Zmc2V0ID09IDApKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGhhbmRsZXJTcGVjLT5faXRlbXMuSXNFbXB0eSgpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIGlmIChzcGVjRmxhZ3MuQ2FuUmV0dXJuVGFpbCkNCisgICAgICAgICAgICAgICAgb3BlbkN1ciA9IHRydWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYgKGhhbmRsZXJTcGVjLT5faXRlbXMuU2l6ZSgpID09IDEpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgaWYgKGhhbmRsZXJTcGVjLT5faXRlbXNbMF0uSXNTZWxmRXhlKQ0KKyAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAobW9kZS5TcGVjVW5rbm93bkV4dC5DYW5SZXR1cm5UYWlsKQ0KKyAgICAgICAgICAgICAgICAgIG9wZW5DdXIgPSB0cnVlOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICBpZiAob3BlbkN1cikNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIEluU3RyZWFtID0gb3Auc3RyZWFtOw0KKyAgICAgICAgICAgIEFyY2hpdmUgPSBhcmNoaXZlOw0KKyAgICAgICAgICAgIEZvcm1hdEluZGV4ID0gaW5kZXg7DQorICAgICAgICAgICAgQXJjU3RyZWFtT2Zmc2V0ID0gYXJjU3RyZWFtT2Zmc2V0Ow0KKyAgICAgICAgICAgIHJldHVybiBTX09LOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvKg0KKyAgICAgICAgaWYgKG9wZW5Pbmx5RnVsbEFyYykNCisgICAgICAgIHsNCisgICAgICAgICAgRXJyb3JJbmZvLkNsZWFyRXJyb3JzKCk7DQorICAgICAgICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKi8NCisNCisgICAgICAgIHBpLkZvcm1hdEluZGV4ID0gaW5kZXg7DQorDQorICAgICAgICAvLyBwcmludGYoIlxuQWRkIG9mZnNldCA9ICVkIiwgKGludClwaS5PZmZzZXQpOw0KKyAgICAgICAgaGFuZGxlclNwZWMtPkFkZEl0ZW0ocGkpOw0KKyAgICAgICAgd2FzT3BlbiA9IHRydWU7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgLy8gLS0tLS0tLS0tLSBFbmQgb2YgT3BlbiBMb29wIGZvciBDdXJyZW50IFBvcyAtLS0tLS0tLS0tDQorICAgICANCisgICAgICBpZiAoIXdhc09wZW4pDQorICAgICAgICBwb3MrKzsNCisgICAgICBuZWVkQ2hlY2tTdGFydE9wZW4gPSAobmV4dE5lZWRDaGVja1N0YXJ0T3BlbiAmJiB3YXNPcGVuKTsNCisgICAgfQ0KKyAgICAvLyAtLS0tLS0tLS0tIEVuZCBvZiBNYWluIFNjYW4gTG9vcCAtLS0tLS0tLS0tDQorDQorICAgIC8qDQorICAgIGlmIChoYW5kbGVyU3BlYy0+X2l0ZW1zLlNpemUoKSA9PSAxKQ0KKyAgICB7DQorICAgICAgY29uc3QgTkFyY2hpdmU6Ok5QYXJzZXI6OkNQYXJzZUl0ZW0gJnBpID0gaGFuZGxlclNwZWMtPl9pdGVtc1swXTsNCisgICAgICBpZiAocGkuU2l6ZSA9PSBmaWxlU2l6ZSAmJiBwaS5PZmZzZXQgPT0gMCkNCisgICAgICB7DQorICAgICAgICBBcmNoaXZlID0gYXJjaGl2ZTsNCisgICAgICAgIEZvcm1hdEluZGV4MiA9IHBpLkZvcm1hdEluZGV4Ow0KKyAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgfQ0KKyAgICB9DQorICAgICovDQorDQorICAgIGlmIChtb2RlLkNhblJldHVyblBhcnNlcikNCisgICAgew0KKyAgICAgIGJvb2wgcmV0dXJuUGFyc2VyID0gKGhhbmRsZXJTcGVjLT5faXRlbXMuU2l6ZSgpID09IDEpOyAvLyBpdCdzIHBvc3NpYmxlIGlmIGZpbGVTaXplIHdhcyBub3QgY29ycmVjdCBhdCBzdGFydCBvZiBwYXJzaW5nDQorICAgICAgaGFuZGxlclNwZWMtPkFkZFVua25vd25JdGVtKGZpbGVTaXplKTsNCisgICAgICBpZiAoaGFuZGxlclNwZWMtPl9pdGVtcy5TaXplKCkgPT0gMCkNCisgICAgICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgICAgIGlmIChyZXR1cm5QYXJzZXIgfHwgaGFuZGxlclNwZWMtPl9pdGVtcy5TaXplKCkgIT0gMSkNCisgICAgICB7DQorICAgICAgICAvLyByZXR1cm4gU19GQUxTRTsNCisgICAgICAgIGhhbmRsZXJTcGVjLT5fc3RyZWFtID0gb3Auc3RyZWFtOw0KKyAgICAgICAgQXJjaGl2ZSA9IGhhbmRsZXI7DQorICAgICAgICBFcnJvckluZm8uQ2xlYXJFcnJvcnMoKTsNCisgICAgICAgIElzUGFyc2VBcmMgPSB0cnVlOw0KKyAgICAgICAgRm9ybWF0SW5kZXggPSAtMTsgLy8gSXQncyBwYXJzZXINCisgICAgICAgIE9mZnNldCA9IDA7DQorICAgICAgICByZXR1cm4gU19PSzsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgICNlbmRpZg0KKw0KKyAgaWYgKCFBcmNoaXZlKQ0KKyAgICByZXR1cm4gU19GQUxTRTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENBcmM6Ok9wZW5TdHJlYW0oY29uc3QgQ09wZW5PcHRpb25zICZvcCkNCit7DQorICBSSU5PSyhPcGVuU3RyZWFtMihvcCkpOw0KKyAgLy8gUHJpbnROdW1iZXIoIm9wLmZvcm1hdEluZGV4IDMiLCBvcC5mb3JtYXRJbmRleCk7DQorDQorICBpZiAoQXJjaGl2ZSkNCisgIHsNCisgICAgR2V0UmF3UHJvcHMuUmVsZWFzZSgpOw0KKyAgICBHZXRSb290UHJvcHMuUmVsZWFzZSgpOw0KKyAgICBBcmNoaXZlLT5RdWVyeUludGVyZmFjZShJSURfSUFyY2hpdmVHZXRSYXdQcm9wcywgKHZvaWQgKiopJkdldFJhd1Byb3BzKTsNCisgICAgQXJjaGl2ZS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lBcmNoaXZlR2V0Um9vdFByb3BzLCAodm9pZCAqKikmR2V0Um9vdFByb3BzKTsNCisNCisgICAgUklOT0soQXJjaGl2ZV9HZXRBcmNCb29sUHJvcChBcmNoaXZlLCBrcGlkSXNUcmVlLCBJc1RyZWUpKTsNCisgICAgUklOT0soQXJjaGl2ZV9HZXRBcmNCb29sUHJvcChBcmNoaXZlLCBrcGlkSXNEZWxldGVkLCBBc2tfRGVsZXRlZCkpOw0KKyAgICBSSU5PSyhBcmNoaXZlX0dldEFyY0Jvb2xQcm9wKEFyY2hpdmUsIGtwaWRJc0FsdFN0cmVhbSwgQXNrX0FsdFN0cmVhbSkpOw0KKyAgICBSSU5PSyhBcmNoaXZlX0dldEFyY0Jvb2xQcm9wKEFyY2hpdmUsIGtwaWRJc0F1eCwgQXNrX0F1eCkpOw0KKyAgICBSSU5PSyhBcmNoaXZlX0dldEFyY0Jvb2xQcm9wKEFyY2hpdmUsIGtwaWRJTm9kZSwgQXNrX0lOb2RlKSk7DQorDQorICAgIGNvbnN0IFVTdHJpbmcgZmlsZU5hbWUgPSBFeHRyYWN0RmlsZU5hbWVGcm9tUGF0aChQYXRoKTsNCisgICAgVVN0cmluZyBleHRlbnNpb247DQorICAgIHsNCisgICAgICBpbnQgZG90UG9zID0gZmlsZU5hbWUuUmV2ZXJzZUZpbmQoTCcuJyk7DQorICAgICAgaWYgKGRvdFBvcyA+PSAwKQ0KKyAgICAgICAgZXh0ZW5zaW9uID0gZmlsZU5hbWUuUHRyKGRvdFBvcyArIDEpOw0KKyAgICB9DQorICAgIA0KKyAgICBEZWZhdWx0TmFtZS5FbXB0eSgpOw0KKyAgICBpZiAoRm9ybWF0SW5kZXggPj0gMCkNCisgICAgew0KKyAgICAgIGNvbnN0IENBcmNJbmZvRXggJmFpID0gb3AuY29kZWNzLT5Gb3JtYXRzW0Zvcm1hdEluZGV4XTsNCisgICAgICBpZiAoYWkuRXh0cy5TaXplKCkgPT0gMCkNCisgICAgICAgIERlZmF1bHROYW1lID0gR2V0RGVmYXVsdE5hbWUyKGZpbGVOYW1lLCBMIiIsIEwiIik7DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIGludCBzdWJFeHRJbmRleCA9IGFpLkZpbmRFeHRlbnNpb24oZXh0ZW5zaW9uKTsNCisgICAgICAgIGlmIChzdWJFeHRJbmRleCA8IDApDQorICAgICAgICAgIHN1YkV4dEluZGV4ID0gMDsNCisgICAgICAgIGNvbnN0IENBcmNFeHRJbmZvICZleHRJbmZvID0gYWkuRXh0c1tzdWJFeHRJbmRleF07DQorICAgICAgICBEZWZhdWx0TmFtZSA9IEdldERlZmF1bHROYW1lMihmaWxlTmFtZSwgZXh0SW5mby5FeHQsIGV4dEluZm8uQWRkRXh0KTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIHJldHVybiBTX09LOw0KK30NCisNCisjaWZkZWYgX1NGWA0KKw0KKyNpZmRlZiBfV0lOMzINCisgIHN0YXRpYyBjb25zdCB3Y2hhcl90ICprX0V4ZUV4dCA9IEwiLmV4ZSI7DQorICBzdGF0aWMgY29uc3QgdW5zaWduZWQga19FeGVFeHRfTGVuID0gNDsNCisjZWxzZQ0KKyAgc3RhdGljIGNvbnN0IHdjaGFyX3QgKmtfRXhlRXh0ID0gTCIiOw0KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtfRXhlRXh0X0xlbiA9IDA7DQorI2VuZGlmDQorDQorI2VuZGlmDQorDQorSFJFU1VMVCBDQXJjOjpPcGVuU3RyZWFtT3JGaWxlKENPcGVuT3B0aW9ucyAmb3ApDQorew0KKyAgQ015Q29tUHRyPElJblN0cmVhbT4gZmlsZVN0cmVhbTsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbEluU3RyZWFtPiBzZXFTdHJlYW07DQorICBDSW5GaWxlU3RyZWFtICpmaWxlU3RyZWFtU3BlYyA9IE5VTEw7DQorICBpZiAob3Auc3RkSW5Nb2RlKQ0KKyAgew0KKyAgICBzZXFTdHJlYW0gPSBuZXcgQ1N0ZEluRmlsZVN0cmVhbTsNCisgICAgb3Auc2VxU3RyZWFtID0gc2VxU3RyZWFtOw0KKyAgfQ0KKyAgZWxzZSBpZiAoIW9wLnN0cmVhbSkNCisgIHsNCisgICAgZmlsZVN0cmVhbVNwZWMgPSBuZXcgQ0luRmlsZVN0cmVhbTsNCisgICAgZmlsZVN0cmVhbSA9IGZpbGVTdHJlYW1TcGVjOw0KKyAgICBQYXRoID0gZmlsZVBhdGg7DQorICAgIGlmICghZmlsZVN0cmVhbVNwZWMtPk9wZW4odXMyZnMoUGF0aCkpKQ0KKyAgICB7DQorICAgICAgcmV0dXJuIEdldExhc3RFcnJvcigpOw0KKyAgICB9DQorICAgIG9wLnN0cmVhbSA9IGZpbGVTdHJlYW07DQorICAgICNpZmRlZiBfU0ZYDQorICAgIElnbm9yZVNwbGl0ID0gdHJ1ZTsNCisgICAgI2VuZGlmDQorICB9DQorDQorICAvKg0KKyAgaWYgKGNhbGxiYWNrKQ0KKyAgew0KKyAgICBVSW50NjQgZmlsZVNpemU7DQorICAgIFJJTk9LKG9wLnN0cmVhbS0+U2VlaygwLCBTVFJFQU1fU0VFS19FTkQsICZmaWxlU2l6ZSkpOw0KKyAgICBSSU5PSyhvcC5jYWxsYmFjay0+U2V0VG90YWwoTlVMTCwgJmZpbGVTaXplKSkNCisgIH0NCisgICovDQorDQorICBIUkVTVUxUIHJlcyA9IE9wZW5TdHJlYW0ob3ApOw0KKyAgSWdub3JlU3BsaXQgPSBmYWxzZTsNCisgIA0KKyAgI2lmZGVmIF9TRlgNCisgIA0KKyAgaWYgKHJlcyAhPSBTX0ZBTFNFDQorICAgICAgfHwgIWZpbGVTdHJlYW1TcGVjDQorICAgICAgfHwgIW9wLmNhbGxiYWNrU3BlYw0KKyAgICAgIHx8IE5vbk9wZW5fRXJyb3JJbmZvLklzQXJjX0FmdGVyX05vbk9wZW4oKSkNCisgICAgcmV0dXJuIHJlczsNCisgIHsNCisgICAgaWYgKGZpbGVQYXRoLkxlbigpID4ga19FeGVFeHRfTGVuDQorICAgICAgICAmJiBNeVN0cmluZ0NvbXBhcmVOb0Nhc2UoZmlsZVBhdGguUmlnaHRQdHIoa19FeGVFeHRfTGVuKSwga19FeGVFeHQpID09IDApDQorICAgIHsNCisgICAgICBjb25zdCBVU3RyaW5nIHBhdGgyID0gZmlsZVBhdGguTGVmdChmaWxlUGF0aC5MZW4oKSAtIGtfRXhlRXh0X0xlbik7DQorICAgICAgRk9SX1ZFQ1RPUiAoaSwgb3AuY29kZWNzLT5Gb3JtYXRzKQ0KKyAgICAgIHsNCisgICAgICAgIGNvbnN0IENBcmNJbmZvRXggJmFpID0gb3AuY29kZWNzLT5Gb3JtYXRzW2ldOw0KKyAgICAgICAgaWYgKGFpLklzU3BsaXQoKSkNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICBVU3RyaW5nIHBhdGgzID0gcGF0aDI7DQorICAgICAgICBwYXRoMyArPSBMIi4iOw0KKyAgICAgICAgcGF0aDMgKz0gYWkuR2V0TWFpbkV4dCgpOyAvLyAiN3oiICBmb3IgU0ZYLg0KKyAgICAgICAgUGF0aCA9IHBhdGgzICsgTCIuMDAxIjsNCisgICAgICAgIGJvb2wgaXNPayA9IG9wLmNhbGxiYWNrU3BlYy0+U2V0U2Vjb25kRmlsZUluZm8odXMyZnMoUGF0aCkpOw0KKyAgICAgICAgaWYgKCFpc09rKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBQYXRoID0gcGF0aDM7DQorICAgICAgICAgIGlzT2sgPSBvcC5jYWxsYmFja1NwZWMtPlNldFNlY29uZEZpbGVJbmZvKHVzMmZzKFBhdGgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpc09rKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAoZmlsZVN0cmVhbVNwZWMtPk9wZW4odXMyZnMoUGF0aCkpKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgb3Auc3RyZWFtID0gZmlsZVN0cmVhbTsNCisgICAgICAgICAgICBOb25PcGVuX0Vycm9ySW5mby5DbGVhckVycm9yc19GdWxsKCk7DQorICAgICAgICAgICAgaWYgKE9wZW5TdHJlYW0ob3ApID09IFNfT0spDQorICAgICAgICAgICAgICByZXR1cm4gU19PSzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgDQorICAjZW5kaWYNCisNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK3ZvaWQgQ0FyY2hpdmVMaW5rOjpLZWVwTW9kZUZvck5leHRPcGVuKCkNCit7DQorICBmb3IgKGludCBpID0gQXJjcy5TaXplKCkgLSAxOyBpID49IDA7IGktLSkNCisgIHsNCisgICAgQ015Q29tUHRyPElBcmNoaXZlS2VlcE1vZGVGb3JOZXh0T3Blbj4ga2VlcDsNCisgICAgQXJjc1tpXS5BcmNoaXZlLT5RdWVyeUludGVyZmFjZShJSURfSUFyY2hpdmVLZWVwTW9kZUZvck5leHRPcGVuLCAodm9pZCAqKikma2VlcCk7DQorICAgIGlmIChrZWVwKQ0KKyAgICAgIGtlZXAtPktlZXBNb2RlRm9yTmV4dE9wZW4oKTsNCisgIH0NCit9DQorDQorSFJFU1VMVCBDQXJjaGl2ZUxpbms6OkNsb3NlKCkNCit7DQorICBmb3IgKGludCBpID0gQXJjcy5TaXplKCkgLSAxOyBpID49IDA7IGktLSkNCisgIHsNCisgICAgUklOT0soQXJjc1tpXS5DbG9zZSgpKTsNCisgIH0NCisgIElzT3BlbiA9IGZhbHNlOw0KKyAgLy8gRXJyb3JzVGV4dC5FbXB0eSgpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3ZvaWQgQ0FyY2hpdmVMaW5rOjpSZWxlYXNlKCkNCit7DQorICAvLyBOb25PcGVuRXJyb3JGb3JtYXRJbmRleCA9IC0xOw0KKyAgTm9uT3Blbl9FcnJvckluZm8uQ2xlYXJFcnJvcnMoKTsNCisgIE5vbk9wZW5fQXJjUGF0aC5FbXB0eSgpOw0KKyAgd2hpbGUgKCFBcmNzLklzRW1wdHkoKSkNCisgICAgQXJjcy5EZWxldGVCYWNrKCk7DQorfQ0KKw0KKy8qDQordm9pZCBDQXJjaGl2ZUxpbms6OlNldF9FcnJvcnNUZXh0KCkNCit7DQorICBGT1JfVkVDVE9SKGksIEFyY3MpDQorICB7DQorICAgIGNvbnN0IENBcmMgJmFyYyA9IEFyY3NbaV07DQorICAgIGlmICghYXJjLkVycm9yRmxhZ3NUZXh0LklzRW1wdHkoKSkNCisgICAgew0KKyAgICAgIGlmICghRXJyb3JzVGV4dC5Jc0VtcHR5KCkpDQorICAgICAgICBFcnJvcnNUZXh0ICs9IEwnXG4nOw0KKyAgICAgIEVycm9yc1RleHQgKz0gR2V0VW5pY29kZVN0cmluZyhhcmMuRXJyb3JGbGFnc1RleHQpOw0KKyAgICB9DQorICAgIGlmICghYXJjLkVycm9yTWVzc2FnZS5Jc0VtcHR5KCkpDQorICAgIHsNCisgICAgICBpZiAoIUVycm9yc1RleHQuSXNFbXB0eSgpKQ0KKyAgICAgICAgRXJyb3JzVGV4dCArPSBMJ1xuJzsNCisgICAgICBFcnJvcnNUZXh0ICs9IGFyYy5FcnJvck1lc3NhZ2U7DQorICAgIH0NCisNCisgICAgaWYgKCFhcmMuV2FybmluZ01lc3NhZ2UuSXNFbXB0eSgpKQ0KKyAgICB7DQorICAgICAgaWYgKCFFcnJvcnNUZXh0LklzRW1wdHkoKSkNCisgICAgICAgIEVycm9yc1RleHQgKz0gTCdcbic7DQorICAgICAgRXJyb3JzVGV4dCArPSBhcmMuV2FybmluZ01lc3NhZ2U7DQorICAgIH0NCisgIH0NCit9DQorKi8NCisNCitIUkVTVUxUIENBcmNoaXZlTGluazo6T3BlbihDT3Blbk9wdGlvbnMgJm9wKQ0KK3sNCisgIFJlbGVhc2UoKTsNCisgIGlmIChvcC50eXBlcy0+U2l6ZSgpID49IDMyKQ0KKyAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgDQorICBIUkVTVUxUIHJlc1NwZWM7DQorDQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICByZXNTcGVjID0gU19PSzsNCisNCisgICAgb3Aub3BlblR5cGUgPSBDT3BlblR5cGUoKTsNCisgICAgaWYgKG9wLnR5cGVzLT5TaXplKCkgPj0gMSkNCisgICAgew0KKyAgICAgIENPcGVuVHlwZSBsYXRlc3Q7DQorICAgICAgaWYgKEFyY3MuU2l6ZSgpIDwgb3AudHlwZXMtPlNpemUoKSkNCisgICAgICAgIGxhdGVzdCA9ICgqb3AudHlwZXMpW29wLnR5cGVzLT5TaXplKCkgLSBBcmNzLlNpemUoKSAtIDFdOw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBsYXRlc3QgPSAoKm9wLnR5cGVzKVswXTsNCisgICAgICAgIGlmICghbGF0ZXN0LlJlY3Vyc2l2ZSkNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIG9wLm9wZW5UeXBlID0gbGF0ZXN0Ow0KKyAgICB9DQorICAgIGVsc2UgaWYgKEFyY3MuU2l6ZSgpID49IDMyKQ0KKyAgICAgIGJyZWFrOw0KKw0KKyAgICAvKg0KKyAgICBvcC5mb3JtYXRJbmRleCA9IC0xOw0KKyAgICBpZiAob3AudHlwZXMtPlNpemUoKSA+PSAxKQ0KKyAgICB7DQorICAgICAgaW50IGxhdGVzdDsNCisgICAgICBpZiAoQXJjcy5TaXplKCkgPCBvcC50eXBlcy0+U2l6ZSgpKQ0KKyAgICAgICAgbGF0ZXN0ID0gKCpvcC50eXBlcylbb3AudHlwZXMtPlNpemUoKSAtIEFyY3MuU2l6ZSgpIC0gMV07DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIGxhdGVzdCA9ICgqb3AudHlwZXMpWzBdOw0KKyAgICAgICAgaWYgKGxhdGVzdCAhPSAtMiAmJiBsYXRlc3QgIT0gLTMpDQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpZiAobGF0ZXN0ID49IDApDQorICAgICAgICBvcC5mb3JtYXRJbmRleCA9IGxhdGVzdDsNCisgICAgICBlbHNlIGlmIChsYXRlc3QgPT0gLTEgfHwgbGF0ZXN0ID09IC0yKQ0KKyAgICAgIHsNCisgICAgICAgIC8vIGRlZmF1bHQNCisgICAgICB9DQorICAgICAgZWxzZSBpZiAobGF0ZXN0ID09IC0zKQ0KKyAgICAgICAgb3AuZm9ybWF0SW5kZXggPSAtMjsNCisgICAgICBlbHNlDQorICAgICAgICBvcC5mb3JtYXRJbmRleCA9IGxhdGVzdCArIDI7DQorICAgIH0NCisgICAgZWxzZSBpZiAoQXJjcy5TaXplKCkgPj0gMzIpDQorICAgICAgYnJlYWs7DQorICAgICovDQorDQorICAgIGlmIChBcmNzLklzRW1wdHkoKSkNCisgICAgew0KKyAgICAgIENBcmMgYXJjOw0KKyAgICAgIGFyYy5maWxlUGF0aCA9IG9wLmZpbGVQYXRoOw0KKyAgICAgIGFyYy5QYXRoID0gb3AuZmlsZVBhdGg7DQorICAgICAgYXJjLlN1YmZpbGVJbmRleCA9IChVSW50MzIpKEludDMyKS0xOw0KKyAgICAgIEhSRVNVTFQgcmVzdWx0ID0gYXJjLk9wZW5TdHJlYW1PckZpbGUob3ApOw0KKyAgICAgIGlmIChyZXN1bHQgIT0gU19PSykNCisgICAgICB7DQorICAgICAgICBpZiAocmVzdWx0ID09IFNfRkFMU0UpDQorICAgICAgICB7DQorICAgICAgICAgIE5vbk9wZW5fRXJyb3JJbmZvID0gYXJjLk5vbk9wZW5fRXJyb3JJbmZvOw0KKyAgICAgICAgICAvLyBOb25PcGVuRXJyb3JGb3JtYXRJbmRleCA9IGFyYy5FcnJvckZvcm1hdEluZGV4Ow0KKyAgICAgICAgICBOb25PcGVuX0FyY1BhdGggPSBhcmMuUGF0aDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIEFyY3MuQWRkKGFyYyk7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgDQorICAgIC8vIFByaW50TnVtYmVyKCJvcC5mb3JtYXRJbmRleCAxMSIsIG9wLmZvcm1hdEluZGV4KTsNCisNCisgICAgY29uc3QgQ0FyYyAmYXJjID0gQXJjcy5CYWNrKCk7DQorICAgIA0KKyAgICBpZiAob3AudHlwZXMtPlNpemUoKSA+IEFyY3MuU2l6ZSgpKQ0KKyAgICAgIHJlc1NwZWMgPSBFX05PVElNUEw7DQorICAgIA0KKyAgICBVSW50MzIgbWFpblN1YmZpbGU7DQorICAgIHsNCisgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgICBSSU5PSyhhcmMuQXJjaGl2ZS0+R2V0QXJjaGl2ZVByb3BlcnR5KGtwaWRNYWluU3ViZmlsZSwgJnByb3ApKTsNCisgICAgICBpZiAocHJvcC52dCA9PSBWVF9VSTQpDQorICAgICAgICBtYWluU3ViZmlsZSA9IHByb3AudWxWYWw7DQorICAgICAgZWxzZQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgVUludDMyIG51bUl0ZW1zOw0KKyAgICAgIFJJTk9LKGFyYy5BcmNoaXZlLT5HZXROdW1iZXJPZkl0ZW1zKCZudW1JdGVtcykpOw0KKyAgICAgIGlmIChtYWluU3ViZmlsZSA+PSBudW1JdGVtcykNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorDQorICANCisgICAgQ015Q29tUHRyPElJbkFyY2hpdmVHZXRTdHJlYW0+IGdldFN0cmVhbTsNCisgICAgaWYgKGFyYy5BcmNoaXZlLT5RdWVyeUludGVyZmFjZShJSURfSUluQXJjaGl2ZUdldFN0cmVhbSwgKHZvaWQgKiopJmdldFN0cmVhbSkgIT0gU19PSyB8fCAhZ2V0U3RyZWFtKQ0KKyAgICAgIGJyZWFrOw0KKyAgICANCisgICAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IHN1YlNlcVN0cmVhbTsNCisgICAgaWYgKGdldFN0cmVhbS0+R2V0U3RyZWFtKG1haW5TdWJmaWxlLCAmc3ViU2VxU3RyZWFtKSAhPSBTX09LIHx8ICFzdWJTZXFTdHJlYW0pDQorICAgICAgYnJlYWs7DQorICAgIA0KKyAgICBDTXlDb21QdHI8SUluU3RyZWFtPiBzdWJTdHJlYW07DQorICAgIGlmIChzdWJTZXFTdHJlYW0uUXVlcnlJbnRlcmZhY2UoSUlEX0lJblN0cmVhbSwgJnN1YlN0cmVhbSkgIT0gU19PSyB8fCAhc3ViU3RyZWFtKQ0KKyAgICAgIGJyZWFrOw0KKyAgICANCisgICAgQ0FyYyBhcmMyOw0KKyAgICBSSU5PSyhhcmMuR2V0SXRlbVBhdGgobWFpblN1YmZpbGUsIGFyYzIuUGF0aCkpOw0KKw0KKyAgICBib29sIHplcm9zVGFpbElzQWxsb3dlZDsNCisgICAgUklOT0soQXJjaGl2ZV9HZXRJdGVtQm9vbFByb3AoYXJjLkFyY2hpdmUsIG1haW5TdWJmaWxlLCBrcGlkWmVyb3NUYWlsSXNBbGxvd2VkLCB6ZXJvc1RhaWxJc0FsbG93ZWQpKTsNCisNCisgICAgQ015Q29tUHRyPElBcmNoaXZlT3BlblNldFN1YkFyY2hpdmVOYW1lPiBzZXRTdWJBcmNoaXZlTmFtZTsNCisgICAgb3AuY2FsbGJhY2stPlF1ZXJ5SW50ZXJmYWNlKElJRF9JQXJjaGl2ZU9wZW5TZXRTdWJBcmNoaXZlTmFtZSwgKHZvaWQgKiopJnNldFN1YkFyY2hpdmVOYW1lKTsNCisgICAgaWYgKHNldFN1YkFyY2hpdmVOYW1lKQ0KKyAgICAgIHNldFN1YkFyY2hpdmVOYW1lLT5TZXRTdWJBcmNoaXZlTmFtZShhcmMyLlBhdGgpOw0KKyAgICANCisgICAgYXJjMi5TdWJmaWxlSW5kZXggPSBtYWluU3ViZmlsZTsNCisNCisgICAgLy8gQ0ludFZlY3RvciBpbmNsOw0KKyAgICBDSW50VmVjdG9yIGV4Y2w7DQorDQorICAgIENPcGVuT3B0aW9ucyBvcDI7DQorICAgICNpZm5kZWYgX1NGWA0KKyAgICBvcDIucHJvcHMgPSBvcC5wcm9wczsNCisgICAgI2VuZGlmDQorICAgIG9wMi5jb2RlY3MgPSBvcC5jb2RlY3M7DQorICAgIC8vIG9wMi50eXBlcyA9ICZpbmNsOw0KKyAgICBvcDIub3BlblR5cGUgPSBvcC5vcGVuVHlwZTsNCisgICAgb3AyLm9wZW5UeXBlLlplcm9zVGFpbElzQWxsb3dlZCA9IHplcm9zVGFpbElzQWxsb3dlZDsNCisgICAgb3AyLmV4Y2x1ZGVkRm9ybWF0cyA9ICZleGNsOw0KKyAgICBvcDIuc3RkSW5Nb2RlID0gZmFsc2U7DQorICAgIG9wMi5zdHJlYW0gPSBzdWJTdHJlYW07DQorICAgIG9wMi5maWxlUGF0aCA9IGFyYzIuUGF0aDsNCisgICAgb3AyLmNhbGxiYWNrID0gb3AuY2FsbGJhY2s7DQorICAgIG9wMi5jYWxsYmFja1NwZWMgPSBvcC5jYWxsYmFja1NwZWM7DQorDQorDQorICAgIEhSRVNVTFQgcmVzdWx0ID0gYXJjMi5PcGVuU3RyZWFtKG9wMik7DQorICAgIHJlc1NwZWMgPSAob3AudHlwZXMtPlNpemUoKSA9PSAwID8gU19PSyA6IFNfRkFMU0UpOw0KKyAgICBpZiAocmVzdWx0ID09IFNfRkFMU0UpDQorICAgIHsNCisgICAgICBOb25PcGVuX0Vycm9ySW5mbyA9IGFyYzIuRXJyb3JJbmZvOw0KKyAgICAgIE5vbk9wZW5fQXJjUGF0aCA9IGFyYzIuUGF0aDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBSSU5PSyhyZXN1bHQpOw0KKyAgICBSSU5PSyhhcmMuR2V0SXRlbU1UaW1lKG1haW5TdWJmaWxlLCBhcmMyLk1UaW1lLCBhcmMyLk1UaW1lRGVmaW5lZCkpOw0KKyAgICBBcmNzLkFkZChhcmMyKTsNCisgIH0NCisgIElzT3BlbiA9ICFBcmNzLklzRW1wdHkoKTsNCisgIHJldHVybiByZXNTcGVjOw0KK30NCisNCitzdGF0aWMgdm9pZCBTZXRDYWxsYmFjayhjb25zdCBGU3RyaW5nICZmaWxlUGF0aCwNCisgICAgSU9wZW5DYWxsYmFja1VJICpjYWxsYmFja1VJLA0KKyAgICBJQXJjaGl2ZU9wZW5DYWxsYmFjayAqcmVPcGVuQ2FsbGJhY2ssDQorICAgIENNeUNvbVB0cjxJQXJjaGl2ZU9wZW5DYWxsYmFjaz4gJmNhbGxiYWNrKQ0KK3sNCisgIENPcGVuQ2FsbGJhY2tJbXAgKm9wZW5DYWxsYmFja1NwZWMgPSBuZXcgQ09wZW5DYWxsYmFja0ltcDsNCisgIGNhbGxiYWNrID0gb3BlbkNhbGxiYWNrU3BlYzsNCisgIG9wZW5DYWxsYmFja1NwZWMtPkNhbGxiYWNrID0gY2FsbGJhY2tVSTsNCisgIG9wZW5DYWxsYmFja1NwZWMtPlJlT3BlbkNhbGxiYWNrID0gcmVPcGVuQ2FsbGJhY2s7DQorDQorICBGU3RyaW5nIGRpclByZWZpeCwgZmlsZU5hbWU7DQorICBORmlsZTo6TkRpcjo6R2V0RnVsbFBhdGhBbmRTcGxpdChmaWxlUGF0aCwgZGlyUHJlZml4LCBmaWxlTmFtZSk7DQorICBvcGVuQ2FsbGJhY2tTcGVjLT5Jbml0KGRpclByZWZpeCwgZmlsZU5hbWUpOw0KK30NCisNCitIUkVTVUxUIENBcmNoaXZlTGluazo6T3BlbjIoQ09wZW5PcHRpb25zICZvcCwNCisgICAgSU9wZW5DYWxsYmFja1VJICpjYWxsYmFja1VJKQ0KK3sNCisgIFZvbHVtZXNTaXplID0gMDsNCisgIENPcGVuQ2FsbGJhY2tJbXAgKm9wZW5DYWxsYmFja1NwZWMgPSBuZXcgQ09wZW5DYWxsYmFja0ltcDsNCisgIENNeUNvbVB0cjxJQXJjaGl2ZU9wZW5DYWxsYmFjaz4gY2FsbGJhY2sgPSBvcGVuQ2FsbGJhY2tTcGVjOw0KKyAgb3BlbkNhbGxiYWNrU3BlYy0+Q2FsbGJhY2sgPSBjYWxsYmFja1VJOw0KKw0KKyAgRlN0cmluZyBwcmVmaXgsIG5hbWU7DQorICBpZiAoIW9wLnN0cmVhbSAmJiAhb3Auc3RkSW5Nb2RlKQ0KKyAgew0KKyAgICBORmlsZTo6TkRpcjo6R2V0RnVsbFBhdGhBbmRTcGxpdCh1czJmcyhvcC5maWxlUGF0aCksIHByZWZpeCwgbmFtZSk7DQorICAgIG9wZW5DYWxsYmFja1NwZWMtPkluaXQocHJlZml4LCBuYW1lKTsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgb3BlbkNhbGxiYWNrU3BlYy0+U2V0U3ViQXJjaGl2ZU5hbWUob3AuZmlsZVBhdGgpOw0KKyAgfQ0KKw0KKyAgb3AuY2FsbGJhY2sgPSBjYWxsYmFjazsNCisgIG9wLmNhbGxiYWNrU3BlYyA9IG9wZW5DYWxsYmFja1NwZWM7DQorICBSSU5PSyhPcGVuKG9wKSk7DQorICAvLyBWb2x1bWVQYXRocy5BZGQoZnMydXMocHJlZml4ICsgbmFtZSkpOw0KKw0KKyAgRk9SX1ZFQ1RPUiAoaSwgb3BlbkNhbGxiYWNrU3BlYy0+RmlsZU5hbWVzX1dhc1VzZWQpDQorICB7DQorICAgIGlmIChvcGVuQ2FsbGJhY2tTcGVjLT5GaWxlTmFtZXNfV2FzVXNlZFtpXSkNCisgICAgew0KKyAgICAgIFZvbHVtZVBhdGhzLkFkZChmczJ1cyhwcmVmaXgpICsgb3BlbkNhbGxiYWNrU3BlYy0+RmlsZU5hbWVzW2ldKTsNCisgICAgICBWb2x1bWVzU2l6ZSArPSBvcGVuQ2FsbGJhY2tTcGVjLT5GaWxlU2l6ZXNbaV07DQorICAgIH0NCisgIH0NCisgIC8vIFZvbHVtZXNTaXplID0gb3BlbkNhbGxiYWNrU3BlYy0+VG90YWxTaXplOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ0FyYzo6UmVPcGVuKGNvbnN0IENPcGVuT3B0aW9ucyAmb3ApDQorew0KKyAgRXJyb3JJbmZvLkNsZWFyRXJyb3JzKCk7DQorICBFcnJvckluZm8uRXJyb3JGb3JtYXRJbmRleCA9IC0xOw0KKw0KKyAgVUludDY0IGZpbGVTaXplID0gMDsNCisgIGlmIChvcC5zdHJlYW0pDQorICB7DQorICAgIFJJTk9LKG9wLnN0cmVhbS0+U2VlaygwLCBTVFJFQU1fU0VFS19FTkQsICZmaWxlU2l6ZSkpOw0KKyAgICBSSU5PSyhvcC5zdHJlYW0tPlNlZWsoMCwgU1RSRUFNX1NFRUtfU0VULCBOVUxMKSk7DQorICB9DQorICBGaWxlU2l6ZSA9IGZpbGVTaXplOw0KKw0KKyAgQ015Q29tUHRyPElJblN0cmVhbT4gc3RyZWFtMjsNCisgIEludDY0IGdsb2JhbE9mZnNldCA9IEdldEdsb2JhbE9mZnNldCgpOw0KKyAgaWYgKGdsb2JhbE9mZnNldCA8PSAwKQ0KKyAgICBzdHJlYW0yID0gb3Auc3RyZWFtOw0KKyAgZWxzZQ0KKyAgew0KKyAgICBDVGFpbEluU3RyZWFtICp0YWlsU3RyZWFtU3BlYyA9IG5ldyBDVGFpbEluU3RyZWFtOw0KKyAgICBzdHJlYW0yID0gdGFpbFN0cmVhbVNwZWM7DQorICAgIHRhaWxTdHJlYW1TcGVjLT5TdHJlYW0gPSBvcC5zdHJlYW07DQorICAgIHRhaWxTdHJlYW1TcGVjLT5PZmZzZXQgPSBnbG9iYWxPZmZzZXQ7DQorICAgIHRhaWxTdHJlYW1TcGVjLT5Jbml0KCk7DQorICAgIFJJTk9LKHRhaWxTdHJlYW1TcGVjLT5TZWVrVG9TdGFydCgpKTsNCisgIH0NCisNCisgIC8vIFRoZXJlIGFyZSBhcmNoaXZlcyB3aXRoIGVtYmVkZGVkIFNUVUJzIChsaWtlIFpJUCksIHNvIHdlIG11c3Qgc3VwcG9ydCBzaWduYXR1cmUgc2Nhbm5pbmcNCisgIC8vIEJ1dCBmb3IgYW5vdGhlciBhcmNoaXZlcyB3ZSBjYW4gdXNlIDAgaGVyZS4gU28gdGhlIGNvZGUgY2FuIGJlIGZpeGVkICEhIQ0KKyAgVUludDY0IG1heFN0YXJ0UG9zaXRpb24gPSBrTWF4Q2hlY2tTdGFydFBvc2l0aW9uOw0KKyAgSFJFU1VMVCByZXMgPSBBcmNoaXZlLT5PcGVuKHN0cmVhbTIsICZtYXhTdGFydFBvc2l0aW9uLCBvcC5jYWxsYmFjayk7DQorICANCisgIGlmIChyZXMgPT0gU19PSykNCisgIHsNCisgICAgUklOT0soUmVhZEJhc2ljUHJvcHMoQXJjaGl2ZSwgZ2xvYmFsT2Zmc2V0LCByZXMpKTsNCisgICAgQXJjU3RyZWFtT2Zmc2V0ID0gZ2xvYmFsT2Zmc2V0Ow0KKyAgICBpZiAoQXJjU3RyZWFtT2Zmc2V0ICE9IDApDQorICAgICAgSW5TdHJlYW0gPSBvcC5zdHJlYW07DQorICB9DQorICByZXR1cm4gcmVzOw0KK30NCisNCisNCitIUkVTVUxUIENBcmNoaXZlTGluazo6UmVPcGVuKENPcGVuT3B0aW9ucyAmb3ApDQorew0KKyAgaWYgKEFyY3MuU2l6ZSgpID4gMSkNCisgICAgcmV0dXJuIEVfTk9USU1QTDsNCisNCisgIENPYmplY3RWZWN0b3I8Q09wZW5UeXBlPiBpbmM7DQorICBDSW50VmVjdG9yIGV4Y2w7DQorDQorICBvcC50eXBlcyA9ICZpbmM7DQorICBvcC5leGNsdWRlZEZvcm1hdHMgPSAmZXhjbDsNCisgIG9wLnN0ZEluTW9kZSA9IGZhbHNlOw0KKyAgb3Auc3RyZWFtID0gTlVMTDsNCisgIGlmIChBcmNzLlNpemUoKSA9PSAwKSAvLyA/Pz8NCisgICAgcmV0dXJuIE9wZW4yKG9wLCBOVUxMKTsNCisNCisgIENNeUNvbVB0cjxJQXJjaGl2ZU9wZW5DYWxsYmFjaz4gb3BlbkNhbGxiYWNrTmV3Ow0KKyAgU2V0Q2FsbGJhY2sodXMyZnMob3AuZmlsZVBhdGgpLCBOVUxMLCBvcC5jYWxsYmFjaywgb3BlbkNhbGxiYWNrTmV3KTsNCisNCisgIENJbkZpbGVTdHJlYW0gKmZpbGVTdHJlYW1TcGVjID0gbmV3IENJbkZpbGVTdHJlYW07DQorICBDTXlDb21QdHI8SUluU3RyZWFtPiBzdHJlYW0oZmlsZVN0cmVhbVNwZWMpOw0KKyAgaWYgKCFmaWxlU3RyZWFtU3BlYy0+T3Blbih1czJmcyhvcC5maWxlUGF0aCkpKQ0KKyAgICByZXR1cm4gR2V0TGFzdEVycm9yKCk7DQorICBvcC5zdHJlYW0gPSBzdHJlYW07DQorDQorICBDQXJjICZhcmMgPSBBcmNzWzBdOw0KKyAgSFJFU1VMVCByZXMgPSBhcmMuUmVPcGVuKG9wKTsNCisgIElzT3BlbiA9IChyZXMgPT0gU19PSyk7DQorICByZXR1cm4gcmVzOw0KK30NCisNCisjaWZuZGVmIF9TRlgNCisNCitib29sIFBhcnNlQ29tcGxleFNpemUoY29uc3Qgd2NoYXJfdCAqcywgVUludDY0ICZyZXN1bHQpDQorew0KKyAgcmVzdWx0ID0gMDsNCisgIGNvbnN0IHdjaGFyX3QgKmVuZDsNCisgIFVJbnQ2NCBudW1iZXIgPSBDb252ZXJ0U3RyaW5nVG9VSW50NjQocywgJmVuZCk7DQorICBpZiAoZW5kID09IHMpDQorICAgIHJldHVybiBmYWxzZTsNCisgIGlmICgqZW5kID09IDApDQorICB7DQorICAgIHJlc3VsdCA9IG51bWJlcjsNCisgICAgcmV0dXJuIHRydWU7DQorICB9DQorICBpZiAoZW5kWzFdICE9IDApDQorICAgIHJldHVybiBmYWxzZTsNCisgIHVuc2lnbmVkIG51bUJpdHM7DQorICBzd2l0Y2ggKE15Q2hhckxvd2VyX0FzY2lpKCplbmQpKQ0KKyAgew0KKyAgICBjYXNlICdiJzogcmVzdWx0ID0gbnVtYmVyOyByZXR1cm4gdHJ1ZTsNCisgICAgY2FzZSAnayc6IG51bUJpdHMgPSAxMDsgYnJlYWs7DQorICAgIGNhc2UgJ20nOiBudW1CaXRzID0gMjA7IGJyZWFrOw0KKyAgICBjYXNlICdnJzogbnVtQml0cyA9IDMwOyBicmVhazsNCisgICAgY2FzZSAndCc6IG51bUJpdHMgPSA0MDsgYnJlYWs7DQorICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsNCisgIH0NCisgIGlmIChudW1iZXIgPj0gKChVSW50NjQpMSA8PCAoNjQgLSBudW1CaXRzKSkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIHJlc3VsdCA9IG51bWJlciA8PCBudW1CaXRzOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK3N0YXRpYyBib29sIFBhcnNlVHlwZVBhcmFtcyhjb25zdCBVU3RyaW5nICZzLCBDT3BlblR5cGUgJnR5cGUpDQorew0KKyAgaWYgKHNbMF0gPT0gMCkNCisgICAgcmV0dXJuIHRydWU7DQorICBpZiAoc1sxXSA9PSAwKQ0KKyAgew0KKyAgICBzd2l0Y2ggKCh1bnNpZ25lZCkoQnl0ZSlzWzBdKQ0KKyAgICB7DQorICAgICAgY2FzZSAnZSc6IHR5cGUuRWFjaFBvcyA9IHRydWU7IHJldHVybiB0cnVlOw0KKyAgICAgIGNhc2UgJ2EnOiB0eXBlLkNhblJldHVybkFyYyA9IHRydWU7IHJldHVybiB0cnVlOw0KKyAgICAgIGNhc2UgJ3InOiB0eXBlLlJlY3Vyc2l2ZSA9IHRydWU7IHJldHVybiB0cnVlOw0KKyAgICB9DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIGlmIChzWzBdID09ICdzJykNCisgIHsNCisgICAgVUludDY0IHJlc3VsdDsNCisgICAgaWYgKCFQYXJzZUNvbXBsZXhTaXplKHMuUHRyKDEpLCByZXN1bHQpKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgdHlwZS5NYXhTdGFydE9mZnNldCA9IHJlc3VsdDsNCisgICAgdHlwZS5NYXhTdGFydE9mZnNldF9EZWZpbmVkID0gdHJ1ZTsNCisgICAgcmV0dXJuIHRydWU7DQorICB9DQorDQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wgUGFyc2VUeXBlKENDb2RlY3MgJmNvZGVjcywgY29uc3QgVVN0cmluZyAmcywgQ09wZW5UeXBlICZ0eXBlKQ0KK3sNCisgIGludCBwb3MyID0gcy5GaW5kKCc6Jyk7DQorICBVU3RyaW5nIG5hbWU7DQorICBpZiAocG9zMiA8IDApDQorICB7DQorICAgIG5hbWUgPSBzOw0KKyAgICBwb3MyID0gcy5MZW4oKTsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgbmFtZSA9IHMuTGVmdChwb3MyKTsNCisgICAgcG9zMisrOw0KKyAgfQ0KKw0KKyAgaW50IGluZGV4ID0gY29kZWNzLkZpbmRGb3JtYXRGb3JBcmNoaXZlVHlwZShuYW1lKTsNCisgIHR5cGUuUmVjdXJzaXZlID0gZmFsc2U7DQorDQorICBpZiAoaW5kZXggPCAwKQ0KKyAgew0KKyAgICBpZiAobmFtZVswXSA9PSAnKicpDQorICAgIHsNCisgICAgICBpZiAobmFtZVsxXSAhPSAwKQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICAgIGVsc2UgaWYgKG5hbWVbMF0gPT0gJyMnKQ0KKyAgICB7DQorICAgICAgaWYgKG5hbWVbMV0gIT0gMCkNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICB0eXBlLkNhblJldHVybkFyYyA9IGZhbHNlOw0KKyAgICAgIHR5cGUuQ2FuUmV0dXJuUGFyc2VyID0gdHJ1ZTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKyAgDQorICB0eXBlLkZvcm1hdEluZGV4ID0gaW5kZXg7DQorIA0KKyAgZm9yICh1bnNpZ25lZCBpID0gcG9zMjsgaSA8IHMuTGVuKCk7KQ0KKyAgew0KKyAgICBpbnQgbmV4dCA9IHMuRmluZCgnOicsIGkpOw0KKyAgICBpZiAobmV4dCA8IDApDQorICAgICAgbmV4dCA9IHMuTGVuKCk7DQorICAgIFVTdHJpbmcgbmFtZSA9IHMuTWlkKGksIG5leHQgLSBpKTsNCisgICAgaWYgKG5hbWUuSXNFbXB0eSgpKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgaWYgKCFQYXJzZVR5cGVQYXJhbXMobmFtZSwgdHlwZSkpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBpID0gbmV4dCArIDE7DQorICB9DQorICANCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sIFBhcnNlT3BlblR5cGVzKENDb2RlY3MgJmNvZGVjcywgY29uc3QgVVN0cmluZyAmcywgQ09iamVjdFZlY3RvcjxDT3BlblR5cGU+ICZ0eXBlcykNCit7DQorICB0eXBlcy5DbGVhcigpOw0KKyAgZm9yICh1bnNpZ25lZCBwb3MgPSAwOyBwb3MgPCBzLkxlbigpOykNCisgIHsNCisgICAgaW50IHBvczIgPSBzLkZpbmQoJy4nLCBwb3MpOw0KKyAgICBpZiAocG9zMiA8IDApDQorICAgICAgcG9zMiA9IHMuTGVuKCk7DQorICAgIFVTdHJpbmcgbmFtZSA9IHMuTWlkKHBvcywgcG9zMiAtIHBvcyk7DQorICAgIGlmIChuYW1lLklzRW1wdHkoKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIENPcGVuVHlwZSB0eXBlOw0KKyAgICBpZiAoIVBhcnNlVHlwZShjb2RlY3MsIG5hbWUsIHR5cGUpKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgdHlwZXMuQWRkKHR5cGUpOw0KKyAgICBwb3MgPSBwb3MyICsgMTsNCisgIH0NCisgIHJldHVybiB0cnVlOw0KK30NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9PcGVuQXJjaGl2ZS5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vT3BlbkFyY2hpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjA3MzIzCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vT3BlbkFyY2hpdmUuaApAQCAtMCwwICsxLDM0NiBAQAorLy8gT3BlbkFyY2hpdmUuaA0KKw0KKyNpZm5kZWYgX19PUEVOX0FSQ0hJVkVfSA0KKyNkZWZpbmUgX19PUEVOX0FSQ0hJVkVfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1Byb3BWYXJpYW50LmgiDQorDQorI2luY2x1ZGUgIkFyY2hpdmVPcGVuQ2FsbGJhY2suaCINCisjaW5jbHVkZSAiTG9hZENvZGVjcy5oIg0KKyNpbmNsdWRlICJQcm9wZXJ0eS5oIg0KKw0KK0hSRVNVTFQgQXJjaGl2ZV9HZXRJdGVtQm9vbFByb3AoSUluQXJjaGl2ZSAqYXJjLCBVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIGJvb2wgJnJlc3VsdCkgdGhyb3coKTsNCitIUkVTVUxUIEFyY2hpdmVfSXNJdGVtX0ZvbGRlcihJSW5BcmNoaXZlICphcmMsIFVJbnQzMiBpbmRleCwgYm9vbCAmcmVzdWx0KSB0aHJvdygpOw0KK0hSRVNVTFQgQXJjaGl2ZV9Jc0l0ZW1fQXV4KElJbkFyY2hpdmUgKmFyYywgVUludDMyIGluZGV4LCBib29sICZyZXN1bHQpIHRocm93KCk7DQorSFJFU1VMVCBBcmNoaXZlX0lzSXRlbV9BbHRTdHJlYW0oSUluQXJjaGl2ZSAqYXJjLCBVSW50MzIgaW5kZXgsIGJvb2wgJnJlc3VsdCkgdGhyb3coKTsNCitIUkVTVUxUIEFyY2hpdmVfSXNJdGVtX0RlbGV0ZWQoSUluQXJjaGl2ZSAqYXJjLCBVSW50MzIgaW5kZXgsIGJvb2wgJmRlbGV0ZWQpIHRocm93KCk7DQorDQorLyoNCitzdHJ1Y3QgQ09wdGlvbmFsT3BlblByb3BlcnRpZXMNCit7DQorICBVU3RyaW5nIEZvcm1hdE5hbWU7DQorICBDT2JqZWN0VmVjdG9yPENQcm9wZXJ0eT4gUHJvcHM7DQorfTsNCisqLw0KKw0KKyNpZmRlZiBfU0ZYDQorI2RlZmluZSBPUEVOX1BST1BTX0RFQ0wNCisjZWxzZQ0KKyNkZWZpbmUgT1BFTl9QUk9QU19ERUNMIGNvbnN0IENPYmplY3RWZWN0b3I8Q1Byb3BlcnR5PiAqcHJvcHM7DQorLy8gI2RlZmluZSBPUEVOX1BST1BTX0RFQ0wgLCBjb25zdCBDT2JqZWN0VmVjdG9yPENPcHRpb25hbE9wZW5Qcm9wZXJ0aWVzPiAqcHJvcHMNCisjZW5kaWYNCisNCitzdHJ1Y3QgQ09wZW5TcGVjRmxhZ3MNCit7DQorICAvLyBib29sIENhblJldHVybkZ1bGw7DQorICBib29sIENhblJldHVybkZyb250YWw7DQorICBib29sIENhblJldHVyblRhaWw7DQorICBib29sIENhblJldHVybk1pZDsNCisNCisgIGJvb2wgQ2FuUmV0dXJuX05vblN0YXJ0KCkgY29uc3QgeyByZXR1cm4gQ2FuUmV0dXJuVGFpbCB8fCBDYW5SZXR1cm5NaWQ7IH0NCisNCisgIENPcGVuU3BlY0ZsYWdzKCk6DQorICAgIC8vIENhblJldHVybkZ1bGwodHJ1ZSksDQorICAgIENhblJldHVybkZyb250YWwoZmFsc2UpLA0KKyAgICBDYW5SZXR1cm5UYWlsKGZhbHNlKSwNCisgICAgQ2FuUmV0dXJuTWlkKGZhbHNlKQ0KKyAgICB7fQ0KK307DQorDQorc3RydWN0IENPcGVuVHlwZQ0KK3sNCisgIGludCBGb3JtYXRJbmRleDsNCisNCisgIENPcGVuU3BlY0ZsYWdzIFNwZWNGb3JjZWRUeXBlOw0KKyAgQ09wZW5TcGVjRmxhZ3MgU3BlY01haW5UeXBlOw0KKyAgQ09wZW5TcGVjRmxhZ3MgU3BlY1dyb25nRXh0Ow0KKyAgQ09wZW5TcGVjRmxhZ3MgU3BlY1Vua25vd25FeHQ7DQorDQorICBib29sIFJlY3Vyc2l2ZTsNCisNCisgIGJvb2wgQ2FuUmV0dXJuQXJjOw0KKyAgYm9vbCBDYW5SZXR1cm5QYXJzZXI7DQorICBib29sIEVhY2hQb3M7DQorDQorICAvLyBib29sIFNraXBTZnhTdHViOw0KKyAgLy8gYm9vbCBFeGVBc1Vua25vd247DQorDQorICBib29sIFplcm9zVGFpbElzQWxsb3dlZDsNCisNCisgIGJvb2wgTWF4U3RhcnRPZmZzZXRfRGVmaW5lZDsNCisgIFVJbnQ2NCBNYXhTdGFydE9mZnNldDsNCisNCisgIGNvbnN0IENPcGVuU3BlY0ZsYWdzICZHZXRTcGVjKGJvb2wgaXNGb3JjZWQsIGJvb2wgaXNNYWluLCBib29sIGlzVW5rbm93bikgY29uc3QNCisgIHsNCisgICAgcmV0dXJuIGlzRm9yY2VkID8gU3BlY0ZvcmNlZFR5cGUgOiAoaXNNYWluID8gU3BlY01haW5UeXBlIDogKGlzVW5rbm93biA/IFNwZWNVbmtub3duRXh0IDogU3BlY1dyb25nRXh0KSk7DQorICB9DQorDQorICBDT3BlblR5cGUoKToNCisgICAgICBGb3JtYXRJbmRleCgtMSksDQorICAgICAgUmVjdXJzaXZlKHRydWUpLA0KKyAgICAgIEVhY2hQb3MoZmFsc2UpLA0KKyAgICAgIENhblJldHVybkFyYyh0cnVlKSwNCisgICAgICBDYW5SZXR1cm5QYXJzZXIoZmFsc2UpLA0KKyAgICAgIC8vIFNraXBTZnhTdHViKHRydWUpLA0KKyAgICAgIC8vIEV4ZUFzVW5rbm93bih0cnVlKSwNCisgICAgICBaZXJvc1RhaWxJc0FsbG93ZWQoZmFsc2UpLA0KKyAgICAgIE1heFN0YXJ0T2Zmc2V0X0RlZmluZWQoZmFsc2UpLA0KKyAgICAgIE1heFN0YXJ0T2Zmc2V0KDApDQorICB7DQorICAgIFNwZWNGb3JjZWRUeXBlLkNhblJldHVybkZyb250YWwgPSB0cnVlOw0KKyAgICBTcGVjRm9yY2VkVHlwZS5DYW5SZXR1cm5UYWlsID0gdHJ1ZTsNCisgICAgU3BlY0ZvcmNlZFR5cGUuQ2FuUmV0dXJuTWlkID0gdHJ1ZTsNCisNCisgICAgU3BlY01haW5UeXBlLkNhblJldHVybkZyb250YWwgPSB0cnVlOw0KKw0KKyAgICBTcGVjVW5rbm93bkV4dC5DYW5SZXR1cm5UYWlsID0gdHJ1ZTsgLy8gZm9yIHNmeA0KKyAgICBTcGVjVW5rbm93bkV4dC5DYW5SZXR1cm5NaWQgPSB0cnVlOw0KKyAgICBTcGVjVW5rbm93bkV4dC5DYW5SZXR1cm5Gcm9udGFsID0gdHJ1ZTsgLy8gZm9yIGFsdCBzdHJlYW1zIG9mIHNmeCB3aXRoIHBhZA0KKw0KKyAgICAvLyBaZXJvc1RhaWxJc0FsbG93ZWQgPSB0cnVlOw0KKyAgfQ0KK307DQorDQorc3RydWN0IENPcGVuT3B0aW9ucw0KK3sNCisgIENDb2RlY3MgKmNvZGVjczsNCisgIENPcGVuVHlwZSBvcGVuVHlwZTsNCisgIGNvbnN0IENPYmplY3RWZWN0b3I8Q09wZW5UeXBlPiAqdHlwZXM7DQorICBjb25zdCBDSW50VmVjdG9yICpleGNsdWRlZEZvcm1hdHM7DQorDQorICBJSW5TdHJlYW0gKnN0cmVhbTsNCisgIElTZXF1ZW50aWFsSW5TdHJlYW0gKnNlcVN0cmVhbTsNCisgIElBcmNoaXZlT3BlbkNhbGxiYWNrICpjYWxsYmFjazsNCisgIENPcGVuQ2FsbGJhY2tJbXAgKmNhbGxiYWNrU3BlYzsNCisgIE9QRU5fUFJPUFNfREVDTA0KKyAgLy8gYm9vbCBvcGVuT25seVNwZWNpZmllZEJ5RXh0ZW5zaW9uLA0KKw0KKyAgYm9vbCBzdGRJbk1vZGU7DQorICBVU3RyaW5nIGZpbGVQYXRoOw0KKw0KKyAgQ09wZW5PcHRpb25zKCk6DQorICAgICAgY29kZWNzKE5VTEwpLA0KKyAgICAgIHR5cGVzKE5VTEwpLA0KKyAgICAgIGV4Y2x1ZGVkRm9ybWF0cyhOVUxMKSwNCisgICAgICBzdHJlYW0oTlVMTCksDQorICAgICAgc2VxU3RyZWFtKE5VTEwpLA0KKyAgICAgIGNhbGxiYWNrKE5VTEwpLA0KKyAgICAgIGNhbGxiYWNrU3BlYyhOVUxMKSwNCisgICAgICBzdGRJbk1vZGUoZmFsc2UpDQorICAgIHt9DQorDQorfTsNCisNCitVSW50MzIgR2V0T3BlbkFyY0Vycm9yRmxhZ3MoY29uc3QgTldpbmRvd3M6Ok5DT006OkNQcm9wVmFyaWFudCAmcHJvcCwgYm9vbCAqaXNEZWZpbmVkUHJvcCA9IE5VTEwpOw0KKw0KK3N0cnVjdCBDQXJjRXJyb3JJbmZvDQorew0KKyAgYm9vbCBUaGVyZUlzVGFpbDsNCisgIGJvb2wgVW5leHBlY2VkRW5kOw0KKyAgYm9vbCBJZ25vcmVUYWlsOyAvLyBhbGwgYXJlIHplcm9zDQorICAvLyBib29sIE5vblplcm9zVGFpbDsNCisgIGJvb2wgRXJyb3JGbGFnc19EZWZpbmVkOw0KKyAgVUludDMyIEVycm9yRmxhZ3M7DQorICBVSW50MzIgV2FybmluZ0ZsYWdzOw0KKyAgaW50IEVycm9yRm9ybWF0SW5kZXg7IC8vIC0gMSBtZWFucyBubyBFcnJvci4NCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBGb3JtYXRJbmRleCA9PSBFcnJvckZvcm1hdEluZGV4LCB0aGUgYXJjaGl2ZSBpcyBvcGVuIHdpdGggb2Zmc2V0DQorICBVSW50NjQgVGFpbFNpemU7DQorDQorICAvKiBpZiBDQXJjIGlzIE9wZW4gT0sgd2l0aCBzb21lIGZvcm1hdDoNCisgICAgICAgIC0gRXJyb3JGb3JtYXRJbmRleCBzaG93cyBlcnJvciBmb3JtYXQgaW5kZXgsIGlmIGV4dGVuc2lvbiBpcyBpbmNvcnJlY3QNCisgICAgICAgIC0gb3RoZXIgdmFyaWFibGVzIHNob3cgbWVzc2FnZSBhbmQgd2FybmluZ3Mgb2YgYXJjaGl2ZSB0aGF0IGlzIG9wZW4gKi8NCisgIA0KKyAgVVN0cmluZyBFcnJvck1lc3NhZ2U7DQorICBVU3RyaW5nIFdhcm5pbmdNZXNzYWdlOw0KKw0KKyAgLy8gY2FsbCBJc0FyY19BZnRlcl9Ob25PcGVuIG9ubHkgaWYgT3BlbiByZXR1cm5zIFNfRkFMU0UNCisgIGJvb2wgSXNBcmNfQWZ0ZXJfTm9uT3BlbigpIGNvbnN0DQorICB7DQorICAgIHJldHVybiAoRXJyb3JGbGFnc19EZWZpbmVkICYmIChFcnJvckZsYWdzICYga3B2X0Vycm9yRmxhZ3NfSXNOb3RBcmMpID09IDApOw0KKyAgfQ0KKw0KKw0KKyAgQ0FyY0Vycm9ySW5mbygpOg0KKyAgICAgIFRoZXJlSXNUYWlsKGZhbHNlKSwNCisgICAgICBVbmV4cGVjZWRFbmQoZmFsc2UpLA0KKyAgICAgIElnbm9yZVRhaWwoZmFsc2UpLA0KKyAgICAgIC8vIE5vblplcm9zVGFpbChmYWxzZSksDQorICAgICAgRXJyb3JGbGFnc19EZWZpbmVkKGZhbHNlKSwNCisgICAgICBFcnJvckZsYWdzKDApLA0KKyAgICAgIFdhcm5pbmdGbGFncygwKSwNCisgICAgICBFcnJvckZvcm1hdEluZGV4KC0xKSwNCisgICAgICBUYWlsU2l6ZSgwKQ0KKyAgICB7fQ0KKw0KKyAgdm9pZCBDbGVhckVycm9ycygpOw0KKw0KKyAgdm9pZCBDbGVhckVycm9yc19GdWxsKCkNCisgIHsNCisgICAgRXJyb3JGb3JtYXRJbmRleCA9IC0xOw0KKyAgICBDbGVhckVycm9ycygpOw0KKyAgfQ0KKw0KKyAgYm9vbCBJc1RoZXJlRXJyb3JPcldhcm5pbmcoKSBjb25zdA0KKyAgew0KKyAgICByZXR1cm4gRXJyb3JGbGFncyAhPSAwDQorICAgICAgICB8fCBXYXJuaW5nRmxhZ3MgIT0gMA0KKyAgICAgICAgfHwgTmVlZFRhaWxXYXJuaW5nKCkNCisgICAgICAgIHx8IFVuZXhwZWNlZEVuZA0KKyAgICAgICAgfHwgIUVycm9yTWVzc2FnZS5Jc0VtcHR5KCkNCisgICAgICAgIHx8ICFXYXJuaW5nTWVzc2FnZS5Jc0VtcHR5KCk7DQorICB9DQorDQorICBib29sIEFyZVRoZXJlRXJyb3JzKCkgY29uc3QgeyByZXR1cm4gRXJyb3JGbGFncyAhPSAwIHx8IFVuZXhwZWNlZEVuZDsgfQ0KKyAgYm9vbCBBcmVUaGVyZVdhcm5pbmdzKCkgY29uc3QgeyByZXR1cm4gV2FybmluZ0ZsYWdzICE9IDAgfHwgTmVlZFRhaWxXYXJuaW5nKCk7IH0NCisNCisgIGJvb2wgTmVlZFRhaWxXYXJuaW5nKCkgY29uc3QgeyByZXR1cm4gIUlnbm9yZVRhaWwgJiYgVGhlcmVJc1RhaWw7IH0NCisNCisgIFVJbnQzMiBHZXRXYXJuaW5nRmxhZ3MoKSBjb25zdA0KKyAgew0KKyAgICBVSW50MzIgYSA9IFdhcm5pbmdGbGFnczsNCisgICAgaWYgKE5lZWRUYWlsV2FybmluZygpICYmIChFcnJvckZsYWdzICYga3B2X0Vycm9yRmxhZ3NfRGF0YUFmdGVyRW5kKSA9PSAwKQ0KKyAgICAgIGEgfD0ga3B2X0Vycm9yRmxhZ3NfRGF0YUFmdGVyRW5kOw0KKyAgICByZXR1cm4gYTsNCisgIH0NCisNCisgIFVJbnQzMiBHZXRFcnJvckZsYWdzKCkgY29uc3QNCisgIHsNCisgICAgVUludDMyIGEgPSBFcnJvckZsYWdzOw0KKyAgICBpZiAoVW5leHBlY2VkRW5kKQ0KKyAgICAgIGEgfD0ga3B2X0Vycm9yRmxhZ3NfVW5leHBlY3RlZEVuZDsNCisgICAgcmV0dXJuIGE7DQorICB9DQorfTsNCisNCitjbGFzcyBDQXJjDQorew0KKyAgSFJFU1VMVCBQcmVwYXJlVG9PcGVuKGNvbnN0IENPcGVuT3B0aW9ucyAmb3AsIHVuc2lnbmVkIGZvcm1hdEluZGV4LCBDTXlDb21QdHI8SUluQXJjaGl2ZT4gJmFyY2hpdmUpOw0KKyAgSFJFU1VMVCBDaGVja1plcm9zVGFpbChjb25zdCBDT3Blbk9wdGlvbnMgJm9wLCBVSW50NjQgb2Zmc2V0KTsNCisgIEhSRVNVTFQgT3BlblN0cmVhbTIoY29uc3QgQ09wZW5PcHRpb25zICZvcHRpb25zKTsNCisNCitwdWJsaWM6DQorICBDTXlDb21QdHI8SUluQXJjaGl2ZT4gQXJjaGl2ZTsNCisgIENNeUNvbVB0cjxJSW5TdHJlYW0+IEluU3RyZWFtOw0KKyAgICAgICAgICAvLyB3ZSB1c2UgSW5TdHJlYW0gaW4gMiBjYXNlcyAoQXJjU3RyZWFtT2Zmc2V0ICE9IDApOg0KKyAgICAgICAgICAvLyAxKSBpZiB3ZSB1c2UgYWRkaXRpb25hbCBjYWNoZSBzdHJlYW0NCisgICAgICAgICAgLy8gMikgd2UgcmVvcGVuIHNmeCBhcmNoaXZlIHdpdGggQ1RhaWxJblN0cmVhbQ0KKyAgDQorICBDTXlDb21QdHI8SUFyY2hpdmVHZXRSYXdQcm9wcz4gR2V0UmF3UHJvcHM7DQorICBDTXlDb21QdHI8SUFyY2hpdmVHZXRSb290UHJvcHM+IEdldFJvb3RQcm9wczsNCisNCisgIENBcmNFcnJvckluZm8gRXJyb3JJbmZvOyAvLyBmb3IgT0sgYXJjaGl2ZXMNCisgIENBcmNFcnJvckluZm8gTm9uT3Blbl9FcnJvckluZm87IC8vIEVycm9ySW5mbyBmb3IgbWFpbkFyY2hpdmUgKGZhbHNlIE9QRU4pDQorDQorICBVU3RyaW5nIFBhdGg7DQorICBVU3RyaW5nIGZpbGVQYXRoOw0KKyAgVVN0cmluZyBEZWZhdWx0TmFtZTsNCisgIGludCBGb3JtYXRJbmRleDsgLy8gLSAxIG1lYW5zIFBhcnNlci4NCisgIGludCBTdWJmaWxlSW5kZXg7DQorICBGSUxFVElNRSBNVGltZTsNCisgIGJvb2wgTVRpbWVEZWZpbmVkOw0KKyAgDQorICBJbnQ2NCBPZmZzZXQ7IC8vIGl0J3Mgb2Zmc2V0IG9mIHN0YXJ0IG9mIGFyY2hpdmUgaW5zaWRlIHN0cmVhbSB0aGF0IGlzIG9wZW4gYnkgQXJjaGl2ZSBIYW5kbGVyDQorICBVSW50NjQgUGh5U2l6ZTsNCisgIC8vIFVJbnQ2NCBPa1BoeVNpemU7DQorICBib29sIFBoeVNpemVEZWZpbmVkOw0KKyAgLy8gYm9vbCBPa1BoeVNpemVfRGVmaW5lZDsNCisgIFVJbnQ2NCBGaWxlU2l6ZTsNCisgIFVJbnQ2NCBBdmFpbFBoeVNpemU7IC8vIFBoeVNpemUsIGJ1dCBpdCdzIHJlZHVjZWQgaWYgZXhjZWVkIGVuZCBvZiBmaWxlDQorICAvLyBib29sIG9mZnNldERlZmluZWQ7DQorDQorICBVSW50NjQgQXJjU3RyZWFtT2Zmc2V0OyAvLyBvZmZzZXQgb2Ygc3RyZWFtIHRoYXQgaXMgb3BlbiBieSBBcmNoaXZlIEhhbmRsZXINCisgIEludDY0IEdldEdsb2JhbE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIEFyY1N0cmVhbU9mZnNldCArIE9mZnNldDsgfSAvLyBpdCdzIGdsb2JhbCBvZmZzZXQgb2YgYXJjaGl2ZQ0KKw0KKyAgLy8gQVN0cmluZyBFcnJvckZsYWdzVGV4dDsNCisNCisgIGJvb2wgSXNQYXJzZUFyYzsNCisNCisgIGJvb2wgSXNUcmVlOw0KKyAgDQorICBib29sIEFza19EZWxldGVkOw0KKyAgYm9vbCBBc2tfQWx0U3RyZWFtOw0KKyAgYm9vbCBBc2tfQXV4Ow0KKyAgYm9vbCBBc2tfSU5vZGU7DQorDQorICBib29sIElnbm9yZVNwbGl0OyAvLyBkb24ndCB0cnkgc3BsaXQgaGFuZGxlcg0KKw0KKyAgLy8gdm9pZCBTZXRfRXJyb3JGbGFnc1RleHQoKTsNCisNCisgIENBcmMoKToNCisgICAgTVRpbWVEZWZpbmVkKGZhbHNlKSwNCisgICAgSXNUcmVlKGZhbHNlKSwNCisgICAgQXNrX0RlbGV0ZWQoZmFsc2UpLA0KKyAgICBBc2tfQWx0U3RyZWFtKGZhbHNlKSwNCisgICAgQXNrX0F1eChmYWxzZSksDQorICAgIEFza19JTm9kZShmYWxzZSksDQorICAgIElnbm9yZVNwbGl0KGZhbHNlKQ0KKyAgICB7fQ0KKw0KKyAgSFJFU1VMVCBSZWFkQmFzaWNQcm9wcyhJSW5BcmNoaXZlICphcmNoaXZlLCBVSW50NjQgc3RhcnRQb3MsIEhSRVNVTFQgb3BlblJlcyk7DQorDQorICAvLyB+Q0FyYygpOw0KKw0KKyAgSFJFU1VMVCBDbG9zZSgpDQorICB7DQorICAgIEluU3RyZWFtLlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIEFyY2hpdmUtPkNsb3NlKCk7DQorICB9DQorDQorICAvLyBBbHRTdHJlYW0ncyBuYW1lIGlzIGNvbmNhdGVuYXRlZCB3aXRoIGJhc2UgZmlsZSBuYW1lIGluIG9uZSBzdHJpbmcgaW4gcGFydHMuQmFjaygpDQorICBIUkVTVUxUIEdldEl0ZW1QYXRoVG9QYXJlbnQoVUludDMyIGluZGV4LCBVSW50MzIgcGFyZW50LCBVU3RyaW5nVmVjdG9yICZwYXJ0cykgY29uc3Q7DQorDQorICBIUkVTVUxUIEdldEl0ZW1QYXRoKFVJbnQzMiBpbmRleCwgVVN0cmluZyAmcmVzdWx0KSBjb25zdDsNCisgIA0KKyAgLy8gR2V0SXRlbVBhdGgyIGFkZHMgW0RFTEVURURdIGRpciBwcmVmaXggZm9yIGRlbGV0ZWQgaXRlbXMuDQorICBIUkVTVUxUIEdldEl0ZW1QYXRoMihVSW50MzIgaW5kZXgsIFVTdHJpbmcgJnJlc3VsdCkgY29uc3Q7DQorICANCisgIEhSRVNVTFQgR2V0SXRlbVNpemUoVUludDMyIGluZGV4LCBVSW50NjQgJnNpemUsIGJvb2wgJmRlZmluZWQpIGNvbnN0Ow0KKyAgSFJFU1VMVCBHZXRJdGVtTVRpbWUoVUludDMyIGluZGV4LCBGSUxFVElNRSAmZnQsIGJvb2wgJmRlZmluZWQpIGNvbnN0Ow0KKyAgSFJFU1VMVCBJc0l0ZW1BbnRpKFVJbnQzMiBpbmRleCwgYm9vbCAmcmVzdWx0KSBjb25zdA0KKyAgICB7IHJldHVybiBBcmNoaXZlX0dldEl0ZW1Cb29sUHJvcChBcmNoaXZlLCBpbmRleCwga3BpZElzQW50aSwgcmVzdWx0KTsgfQ0KKw0KKw0KKyAgSFJFU1VMVCBPcGVuU3RyZWFtKGNvbnN0IENPcGVuT3B0aW9ucyAmb3B0aW9ucyk7DQorICBIUkVTVUxUIE9wZW5TdHJlYW1PckZpbGUoQ09wZW5PcHRpb25zICZvcHRpb25zKTsNCisNCisgIEhSRVNVTFQgUmVPcGVuKGNvbnN0IENPcGVuT3B0aW9ucyAmb3B0aW9ucyk7DQorICANCisgIEhSRVNVTFQgQ3JlYXRlTmV3VGFpbFN0cmVhbShDTXlDb21QdHI8SUluU3RyZWFtPiAmc3RyZWFtKTsNCit9Ow0KKw0KK3N0cnVjdCBDQXJjaGl2ZUxpbmsNCit7DQorICBDT2JqZWN0VmVjdG9yPENBcmM+IEFyY3M7DQorICBVU3RyaW5nVmVjdG9yIFZvbHVtZVBhdGhzOw0KKyAgVUludDY0IFZvbHVtZXNTaXplOw0KKyAgYm9vbCBJc09wZW47DQorDQorICAvLyBpbnQgTm9uT3BlbkVycm9yRm9ybWF0SW5kZXg7IC8vIC0gMSBtZWFucyBubyBFcnJvci4NCisgIFVTdHJpbmcgTm9uT3Blbl9BcmNQYXRoOw0KKw0KKyAgQ0FyY0Vycm9ySW5mbyBOb25PcGVuX0Vycm9ySW5mbzsNCisNCisgIC8vIFVTdHJpbmcgRXJyb3JzVGV4dDsNCisgIC8vIHZvaWQgU2V0X0Vycm9yc1RleHQoKTsNCisNCisgIENBcmNoaXZlTGluaygpOiBWb2x1bWVzU2l6ZSgwKSwgSXNPcGVuKGZhbHNlKSB7fQ0KKyAgdm9pZCBLZWVwTW9kZUZvck5leHRPcGVuKCk7DQorICBIUkVTVUxUIENsb3NlKCk7DQorICB2b2lkIFJlbGVhc2UoKTsNCisgIH5DQXJjaGl2ZUxpbmsoKSB7IFJlbGVhc2UoKTsgfQ0KKw0KKyAgY29uc3QgQ0FyYyAqR2V0QXJjKCkgY29uc3QgeyByZXR1cm4gJkFyY3MuQmFjaygpOyB9DQorICBJSW5BcmNoaXZlICpHZXRBcmNoaXZlKCkgY29uc3QgeyByZXR1cm4gQXJjcy5CYWNrKCkuQXJjaGl2ZTsgfQ0KKyAgSUFyY2hpdmVHZXRSYXdQcm9wcyAqR2V0QXJjaGl2ZUdldFJhd1Byb3BzKCkgY29uc3QgeyByZXR1cm4gQXJjcy5CYWNrKCkuR2V0UmF3UHJvcHM7IH0NCisgIElBcmNoaXZlR2V0Um9vdFByb3BzICpHZXRBcmNoaXZlR2V0Um9vdFByb3BzKCkgY29uc3QgeyByZXR1cm4gQXJjcy5CYWNrKCkuR2V0Um9vdFByb3BzOyB9DQorDQorICBIUkVTVUxUIE9wZW4oQ09wZW5PcHRpb25zICZvcHRpb25zKTsNCisNCisgIEhSRVNVTFQgT3BlbjIoQ09wZW5PcHRpb25zICZvcHRpb25zLCBJT3BlbkNhbGxiYWNrVUkgKmNhbGxiYWNrVUkpOw0KKw0KKyAgSFJFU1VMVCBSZU9wZW4oQ09wZW5PcHRpb25zICZvcHRpb25zKTsNCit9Ow0KKw0KK2Jvb2wgUGFyc2VPcGVuVHlwZXMoQ0NvZGVjcyAmY29kZWNzLCBjb25zdCBVU3RyaW5nICZzLCBDT2JqZWN0VmVjdG9yPENPcGVuVHlwZT4gJnR5cGVzKTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Qcm9wSURVdGlscy5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Qcm9wSURVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyNzhjZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1Byb3BJRFV0aWxzLmNwcApAQCAtMCwwICsxLDU1MyBAQAorLy8gUHJvcElEVXRpbHMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9DL0NwdUFyY2guaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0ludFRvU3RyaW5nLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZUZpbmQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlSU8uaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9Qcm9wVmFyaWFudENvbnYuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vUHJvcElELmgiDQorDQorI2luY2x1ZGUgIlByb3BJRFV0aWxzLmgiDQorDQorI2RlZmluZSBHZXQxNih4KSBHZXRVaTE2KHgpDQorI2RlZmluZSBHZXQzMih4KSBHZXRVaTMyKHgpDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyIGdfV2luQXR0cmliQ2hhcnNbMTYgKyAxXSA9ICJSSFM4REFkTlRzTENPbkVfIjsNCisvKg0KKzAgUkVBRE9OTFkNCisxIEhJRERFTg0KKzIgU1lTVEVNDQorDQorNCBESVJFQ1RPUlkNCis1IEFSQ0hJVkUNCis2IERFVklDRQ0KKzcgTk9STUFMDQorOCBURU1QT1JBUlkNCis5IFNQQVJTRV9GSUxFDQorMTAgUkVQQVJTRV9QT0lOVA0KKzExIENPTVBSRVNTRUQNCisxMiBPRkZMSU5FDQorMTMgTk9UX0NPTlRFTlRfSU5ERVhFRA0KKzE0IEVOQ1JZUFRFRA0KKw0KKzE2IFZJUlRVQUwNCisqLw0KKw0KK3ZvaWQgQ29udmVydFdpbkF0dHJpYlRvU3RyaW5nKGNoYXIgKnMsIFVJbnQzMiB3YSkNCit7DQorICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspDQorICAgIGlmICgod2EgJiAoMSA8PCBpKSkgJiYgaSAhPSA3KQ0KKyAgICAgICpzKysgPSBnX1dpbkF0dHJpYkNoYXJzW2ldOw0KKyAgKnMgPSAwOw0KK30NCisNCitzdGF0aWMgY29uc3QgY2hhciBrUG9zaXhUeXBlc1sxNl0gPSB7ICcwJywgJ3AnLCAnYycsICczJywgJ2QnLCAnNScsICdiJywgJzcnLCAnLScsICc5JywgJ2wnLCAnQicsICdzJywgJ0QnLCAnRScsICdGJyB9Ow0KKyNkZWZpbmUgTVlfQVRUUl9DSEFSKGEsIG4sIGMpICgoYSkgJiAoMSA8PCAobikpKSA/IGMgOiAnLSc7DQorDQordm9pZCBDb252ZXJ0UHJvcGVydHlUb1Nob3J0U3RyaW5nKGNoYXIgKmRlc3QsIGNvbnN0IFBST1BWQVJJQU5UICZwcm9wLCBQUk9QSUQgcHJvcElELCBib29sIGZ1bGwpIHRocm93KCkNCit7DQorICAqZGVzdCA9IDA7DQorICBpZiAocHJvcC52dCA9PSBWVF9GSUxFVElNRSkNCisgIHsNCisgICAgRklMRVRJTUUgbG9jYWxGaWxlVGltZTsNCisgICAgaWYgKChwcm9wLmZpbGV0aW1lLmR3SGlnaERhdGVUaW1lID09IDAgJiYNCisgICAgICAgIHByb3AuZmlsZXRpbWUuZHdMb3dEYXRlVGltZSA9PSAwKSB8fA0KKyAgICAgICAgITo6RmlsZVRpbWVUb0xvY2FsRmlsZVRpbWUoJnByb3AuZmlsZXRpbWUsICZsb2NhbEZpbGVUaW1lKSkNCisgICAgICByZXR1cm47DQorICAgIENvbnZlcnRGaWxlVGltZVRvU3RyaW5nKGxvY2FsRmlsZVRpbWUsIGRlc3QsIHRydWUsIGZ1bGwpOw0KKyAgICByZXR1cm47DQorICB9DQorICBzd2l0Y2ggKHByb3BJRCkNCisgIHsNCisgICAgY2FzZSBrcGlkQ1JDOg0KKyAgICB7DQorICAgICAgaWYgKHByb3AudnQgIT0gVlRfVUk0KQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgQ29udmVydFVJbnQzMlRvSGV4OERpZ2l0cyhwcm9wLnVsVmFsLCBkZXN0KTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgY2FzZSBrcGlkQXR0cmliOg0KKyAgICB7DQorICAgICAgaWYgKHByb3AudnQgIT0gVlRfVUk0KQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgQ29udmVydFdpbkF0dHJpYlRvU3RyaW5nKGRlc3QsIHByb3AudWxWYWwpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBjYXNlIGtwaWRQb3NpeEF0dHJpYjoNCisgICAgew0KKyAgICAgIGlmIChwcm9wLnZ0ICE9IFZUX1VJNCkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIFVTdHJpbmcgcmVzOw0KKyAgICAgIFVJbnQzMiBhID0gcHJvcC51bFZhbDsNCisNCisgICAgICBkZXN0WzBdID0ga1Bvc2l4VHlwZXNbKGEgPj4gMTIpICYgMHhGXTsNCisgICAgICBmb3IgKGludCBpID0gNjsgaSA+PSAwOyBpIC09IDMpDQorICAgICAgew0KKyAgICAgICAgZGVzdFs3IC0gaV0gPSBNWV9BVFRSX0NIQVIoYSwgaSArIDIsICdyJyk7DQorICAgICAgICBkZXN0WzggLSBpXSA9IE1ZX0FUVFJfQ0hBUihhLCBpICsgMSwgJ3cnKTsNCisgICAgICAgIGRlc3RbOSAtIGldID0gTVlfQVRUUl9DSEFSKGEsIGkgKyAwLCAneCcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoKGEgJiAweDgwMCkgIT0gMCkgZGVzdFszXSA9ICgoYSAmICgxIDw8IDYpKSA/ICdzJyA6ICdTJyk7DQorICAgICAgaWYgKChhICYgMHg0MDApICE9IDApIGRlc3RbNl0gPSAoKGEgJiAoMSA8PCAzKSkgPyAncycgOiAnUycpOw0KKyAgICAgIGlmICgoYSAmIDB4MjAwKSAhPSAwKSBkZXN0WzldID0gKChhICYgKDEgPDwgMCkpID8gJ3QnIDogJ1QnKTsNCisgICAgICBkZXN0WzEwXSA9IDA7DQorDQorICAgICAgYSAmPSB+KFVJbnQzMikweEZGRkY7DQorICAgICAgaWYgKGEgIT0gMCkNCisgICAgICB7DQorICAgICAgICBkZXN0WzEwXSA9ICcgJzsNCisgICAgICAgIENvbnZlcnRVSW50MzJUb0hleDhEaWdpdHMoYSwgZGVzdCArIDExKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGNhc2Uga3BpZElOb2RlOg0KKyAgICB7DQorICAgICAgaWYgKHByb3AudnQgIT0gVlRfVUk4KQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgQ29udmVydFVJbnQzMlRvU3RyaW5nKChVSW50MzIpKHByb3AudWhWYWwuUXVhZFBhcnQgPj4gNDgpLCBkZXN0KTsNCisgICAgICBkZXN0ICs9IHN0cmxlbihkZXN0KTsNCisgICAgICAqZGVzdCsrID0gJy0nOw0KKyAgICAgIFVJbnQ2NCBsb3cgPSBwcm9wLnVoVmFsLlF1YWRQYXJ0ICYgKCgoVUludDY0KTEgPDwgNDgpIC0gMSk7DQorICAgICAgQ29udmVydFVJbnQ2NFRvU3RyaW5nKGxvdywgZGVzdCk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGNhc2Uga3BpZFZhOg0KKyAgICB7DQorICAgICAgVUludDY0IHYgPSAwOw0KKyAgICAgIGlmIChDb252ZXJ0UHJvcFZhcmlhbnRUb1VJbnQ2NChwcm9wLCB2KSkNCisgICAgICB7DQorICAgICAgICBkZXN0WzBdID0gJzAnOw0KKyAgICAgICAgZGVzdFsxXSA9ICd4JzsNCisgICAgICAgIENvbnZlcnRVSW50NjRUb0hleChwcm9wLnVsVmFsLCBkZXN0ICsgMik7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBDb252ZXJ0UHJvcFZhcmlhbnRUb1Nob3J0U3RyaW5nKHByb3AsIGRlc3QpOw0KK30NCisNCit2b2lkIENvbnZlcnRQcm9wZXJ0eVRvU3RyaW5nKFVTdHJpbmcgJmRlc3QsIGNvbnN0IFBST1BWQVJJQU5UICZwcm9wLCBQUk9QSUQgcHJvcElELCBib29sIGZ1bGwpDQorew0KKyAgaWYgKHByb3AudnQgPT0gVlRfQlNUUikNCisgIHsNCisgICAgZGVzdCA9IHByb3AuYnN0clZhbDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgY2hhciB0ZW1wWzY0XTsNCisgIENvbnZlcnRQcm9wZXJ0eVRvU2hvcnRTdHJpbmcodGVtcCwgcHJvcCwgcHJvcElELCBmdWxsKTsNCisgIGludCBsZW4gPSBNeVN0cmluZ0xlbih0ZW1wKTsNCisgIHdjaGFyX3QgKnN0ciA9IGRlc3QuR2V0QnVmZmVyKGxlbik7DQorICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQ0KKyAgICBzdHJbaV0gPSB0ZW1wW2ldOw0KKyAgZGVzdC5SZWxlYXNlQnVmZmVyKGxlbik7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgY2hhciBHZXRIZXgoQnl0ZSB2YWx1ZSkNCit7DQorICByZXR1cm4gKGNoYXIpKCh2YWx1ZSA8IDEwKSA/ICgnMCcgKyB2YWx1ZSkgOiAoJ0EnICsgKHZhbHVlIC0gMTApKSk7DQorfQ0KKw0KKyNpZm5kZWYgX1NGWA0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBBZGRIZXhUb1N0cmluZyhBU3RyaW5nICZyZXMsIEJ5dGUgdmFsdWUpDQorew0KKyAgcmVzICs9IEdldEhleCgoQnl0ZSkodmFsdWUgPj4gNCkpOw0KKyAgcmVzICs9IEdldEhleCgoQnl0ZSkodmFsdWUgJiAweEYpKTsNCisgIHJlcyArPSAnICc7DQorfQ0KKw0KKy8qDQorc3RhdGljIEFTdHJpbmcgRGF0YV9Ub19IZXgoY29uc3QgQnl0ZSAqZGF0YSwgc2l6ZV90IHNpemUpDQorew0KKyAgQVN0cmluZyBzOw0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspDQorICAgIEFkZEhleFRvU3RyaW5nKHMsIGRhdGFbaV0pOw0KKyAgcmV0dXJuIHM7DQorfQ0KKyovDQorDQorc3RhdGljIGNvbnN0IGNoYXIgKnNpZE5hbWVzW10gPQ0KK3sNCisgICIwIiwNCisgICJEaWFsdXAiLA0KKyAgIk5ldHdvcmsiLA0KKyAgIkJhdGNoIiwNCisgICJJbnRlcmFjdGl2ZSIsDQorICAiTG9nb24iLCAgLy8gUy0xLTUtNS1YLVkNCisgICJTZXJ2aWNlIiwNCisgICJBbm9ueW1vdXMiLA0KKyAgIlByb3h5IiwNCisgICJFbnRlcnByaXNlREMiLA0KKyAgIlNlbGYiLA0KKyAgIkF1dGhlbnRpY2F0ZWRVc2VycyIsDQorICAiUmVzdHJpY3RlZENvZGUiLA0KKyAgIlRlcm1pbmFsU2VydmVyIiwNCisgICJSZW1vdGVJbnRlcmFjdGl2ZUxvZ29uIiwNCisgICJUaGlzT3JnYW5pemF0aW9uIiwNCisgICIxNiIsDQorICAiSVVzZXJJSVMiLA0KKyAgIkxvY2FsU3lzdGVtIiwNCisgICJMb2NhbFNlcnZpY2UiLA0KKyAgIk5ldHdvcmtTZXJ2aWNlIiwNCisgICJEb21haW5zIg0KK307DQorDQorc3RydWN0IENTZWNJRDJOYW1lDQorew0KKyAgVUludDMyIG47DQorICBjb25zdCBjaGFyICpzejsNCit9Ow0KKw0KK2NvbnN0IENTZWNJRDJOYW1lIHNpZF8zMl9OYW1lc1tdID0NCit7DQorICB7IDU0NCwgIkFkbWluaXN0cmF0b3JzIiB9LA0KKyAgeyA1NDUsICJVc2VycyIgfSwNCisgIHsgNTQ2LCAiR3Vlc3RzIiB9LA0KKyAgeyA1NDcsICJQb3dlclVzZXJzIiB9LA0KKyAgeyA1NDgsICJBY2NvdW50T3BlcmF0b3JzIiB9LA0KKyAgeyA1NDksICJTZXJ2ZXJPcGVyYXRvcnMiIH0sDQorICB7IDU1MCwgIlByaW50T3BlcmF0b3JzIiB9LA0KKyAgeyA1NTEsICJCYWNrdXBPcGVyYXRvcnMiIH0sDQorICB7IDU1MiwgIlJlcGxpY2F0b3JzIiB9LA0KKyAgeyA1NTMsICJCYWNrdXAgT3BlcmF0b3JzIiB9LA0KKyAgeyA1NTQsICJQcmVXaW5kb3dzMjAwMENvbXBhdGlibGVBY2Nlc3MiIH0sDQorICB7IDU1NSwgIlJlbW90ZURlc2t0b3BVc2VycyIgfSwNCisgIHsgNTU2LCAiTmV0d29ya0NvbmZpZ3VyYXRpb25PcGVyYXRvcnMiIH0sDQorICB7IDU1NywgIkluY29taW5nRm9yZXN0VHJ1c3RCdWlsZGVycyIgfSwNCisgIHsgNTU4LCAiUGVyZm9ybWFuY2VNb25pdG9yVXNlcnMiIH0sDQorICB7IDU1OSwgIlBlcmZvcm1hbmNlTG9nVXNlcnMiIH0sDQorICB7IDU2MCwgIldpbmRvd3NBdXRob3JpemF0aW9uQWNjZXNzR3JvdXAiIH0sDQorICB7IDU2MSwgIlRlcm1pbmFsU2VydmVyTGljZW5zZVNlcnZlcnMiIH0sDQorICB7IDU2MiwgIkRpc3RyaWJ1dGVkQ09NVXNlcnMiIH0sDQorICB7IDU2OSwgIkNyeXB0b2dyYXBoaWNPcGVyYXRvcnMiIH0sDQorICB7IDU3MywgIkV2ZW50TG9nUmVhZGVycyIgfSwNCisgIHsgNTc0LCAiQ2VydGlmaWNhdGVTZXJ2aWNlRENPTUFjY2VzcyIgfQ0KK307DQorDQorc3RhdGljIGNvbnN0IENTZWNJRDJOYW1lIHNpZF8yMV9OYW1lc1tdID0NCit7DQorICB7IDUwMCwgIkFkbWluaXN0cmF0b3IiIH0sDQorICB7IDUwMSwgIkd1ZXN0IiB9LA0KKyAgeyA1MDIsICJLUkJUR1QiIH0sDQorICB7IDUxMiwgIkRvbWFpbkFkbWlucyIgfSwNCisgIHsgNTEzLCAiRG9tYWluVXNlcnMiIH0sDQorICB7IDUxNSwgIkRvbWFpbkNvbXB1dGVycyIgfSwNCisgIHsgNTE2LCAiRG9tYWluQ29udHJvbGxlcnMiIH0sDQorICB7IDUxNywgIkNlcnRQdWJsaXNoZXJzIiB9LA0KKyAgeyA1MTgsICJTY2hlbWFBZG1pbnMiIH0sDQorICB7IDUxOSwgIkVudGVycHJpc2VBZG1pbnMiIH0sDQorICB7IDUyMCwgIkdyb3VwUG9saWN5Q3JlYXRvck93bmVycyIgfSwNCisgIHsgNTUzLCAiUkFTYW5kSUFTU2VydmVycyIgfSwNCisgIHsgNTUzLCAiUkFTYW5kSUFTU2VydmVycyIgfSwNCisgIHsgNTcxLCAiQWxsb3dlZFJPRENQYXNzd29yZFJlcGxpY2F0aW9uR3JvdXAiIH0sDQorICB7IDU3MiwgIkRlbmllZFJPRENQYXNzd29yZFJlcGxpY2F0aW9uR3JvdXAiIH0NCit9Ow0KKw0KK3N0cnVjdCBDU2VydmljZXNUb05hbWUNCit7DQorICBVSW50MzIgbls1XTsNCisgIGNvbnN0IGNoYXIgKnN6Ow0KK307DQorDQorc3RhdGljIGNvbnN0IENTZXJ2aWNlc1RvTmFtZSBzZXJ2aWNlc190b19uYW1lW10gPQ0KK3sNCisgIHsgeyAweDM4RkI4OUI1LCAweENCQzI4NDE5LCAweDZEMjM2QzVDLCAweDZFNzcwMDU3LCAweDg3NjQwMkMwIH0gLCAiVHJ1c3RlZEluc3RhbGxlciIgfQ0KK307DQorDQorc3RhdGljIHZvaWQgUGFyc2VTaWQoQVN0cmluZyAmcywgY29uc3QgQnl0ZSAqcCwgVUludDMyIGxpbSwgVUludDMyICZzaWRTaXplKQ0KK3sNCisgIHNpZFNpemUgPSAwOw0KKyAgaWYgKGxpbSA8IDgpDQorICB7DQorICAgIHMgKz0gIkVSUk9SIjsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgVUludDMyIHJldiA9IHBbMF07DQorICBpZiAocmV2ICE9IDEpDQorICB7DQorICAgIHMgKz0gIlVOU1VQUE9SVEVEIjsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgVUludDMyIG51bSA9IHBbMV07DQorICBpZiAoOCArIG51bSAqIDQgPiBsaW0pDQorICB7DQorICAgIHMgKz0gIkVSUk9SIjsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgc2lkU2l6ZSA9IDggKyBudW0gKiA0Ow0KKyAgVUludDMyIGF1dGhvcml0eSA9IEdldEJlMzIocCArIDQpOw0KKw0KKyAgaWYgKHBbMl0gPT0gMCAmJiBwWzNdID09IDAgJiYgYXV0aG9yaXR5ID09IDUgJiYgbnVtID49IDEpDQorICB7DQorICAgIFVJbnQzMiB2MCA9IEdldDMyKHAgKyA4KTsNCisgICAgaWYgKHYwIDwgQVJSQVlfU0laRShzaWROYW1lcykpDQorICAgIHsNCisgICAgICBzICs9IHNpZE5hbWVzW3YwXTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKHYwID09IDMyICYmIG51bSA9PSAyKQ0KKyAgICB7DQorICAgICAgVUludDMyIHYxID0gR2V0MzIocCArIDEyKTsNCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2lkXzMyX05hbWVzKTsgaSsrKQ0KKyAgICAgICAgaWYgKHNpZF8zMl9OYW1lc1tpXS5uID09IHYxKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBzICs9IHNpZF8zMl9OYW1lc1tpXS5zejsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmICh2MCA9PSAyMSAmJiBudW0gPT0gNSkNCisgICAgew0KKyAgICAgIFVJbnQzMiB2NCA9IEdldDMyKHAgKyA4ICsgNCAqIDQpOw0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVJSQVlfU0laRShzaWRfMjFfTmFtZXMpOyBpKyspDQorICAgICAgICBpZiAoc2lkXzIxX05hbWVzW2ldLm4gPT0gdjQpDQorICAgICAgICB7DQorICAgICAgICAgIHMgKz0gc2lkXzIxX05hbWVzW2ldLnN6Ow0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWYgKHYwID09IDgwICYmIG51bSA9PSA2KQ0KKyAgICB7DQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlcnZpY2VzX3RvX25hbWUpOyBpKyspDQorICAgICAgew0KKyAgICAgICAgY29uc3QgQ1NlcnZpY2VzVG9OYW1lICZzbiA9IHNlcnZpY2VzX3RvX25hbWVbaV07DQorICAgICAgICBpbnQgajsNCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA1ICYmIHNuLm5bal0gPT0gR2V0MzIocCArIDggKyA0ICsgaiAqIDQpOyBqKyspOw0KKyAgICAgICAgaWYgKGogPT0gNSkNCisgICAgICAgIHsNCisgICAgICAgICAgcyArPSBzbi5zejsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgDQorICBjaGFyIHN6WzE2XTsNCisgIHMgKz0gIlMtMS0iOw0KKyAgaWYgKHBbMl0gPT0gMCAmJiBwWzNdID09IDApDQorICB7DQorICAgIENvbnZlcnRVSW50MzJUb1N0cmluZyhhdXRob3JpdHksIHN6KTsNCisgICAgcyArPSBzejsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgcyArPSAiMHgiOw0KKyAgICBmb3IgKGludCBpID0gMjsgaSA8IDg7IGkrKykNCisgICAgICBBZGRIZXhUb1N0cmluZyhzLCBwW2ldKTsNCisgIH0NCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtOyBpKyspDQorICB7DQorICAgIHMgKz0gJy0nOw0KKyAgICBDb252ZXJ0VUludDMyVG9TdHJpbmcoR2V0MzIocCArIDggKyBpICogNCksIHN6KTsNCisgICAgcyArPSBzejsNCisgIH0NCit9DQorDQorc3RhdGljIHZvaWQgUGFyc2VPd25lcihBU3RyaW5nICZzLCBjb25zdCBCeXRlICpwLCBVSW50MzIgc2l6ZSwgVUludDMyIHBvcykNCit7DQorICBpZiAocG9zID4gc2l6ZSkNCisgIHsNCisgICAgcyArPSAiRVJST1IiOw0KKyAgICByZXR1cm47DQorICB9DQorICBVSW50MzIgc2lkU2l6ZSA9IDA7DQorICBQYXJzZVNpZChzLCBwICsgcG9zLCBzaXplIC0gcG9zLCBzaWRTaXplKTsNCit9DQorDQorc3RhdGljIHZvaWQgQWRkVUludDMyVG9TdHJpbmcoQVN0cmluZyAmcywgVUludDMyIHZhbCkNCit7DQorICBjaGFyIHN6WzE2XTsNCisgIENvbnZlcnRVSW50MzJUb1N0cmluZyh2YWwsIHN6KTsNCisgIHMgKz0gc3o7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFBhcnNlQWNsKEFTdHJpbmcgJnMsIGNvbnN0IEJ5dGUgKnAsIFVJbnQzMiBzaXplLCBjb25zdCBjaGFyICpzdHJOYW1lLCBVSW50MzIgZmxhZ3MsIFVJbnQzMiBvZmZzZXQpDQorew0KKyAgVUludDMyIGNvbnRyb2wgPSBHZXQxNihwICsgMik7DQorICBpZiAoKGZsYWdzICYgY29udHJvbCkgPT0gMCkNCisgICAgcmV0dXJuOw0KKyAgVUludDMyIHBvcyA9IEdldDMyKHAgKyBvZmZzZXQpOw0KKyAgcyArPSAnICc7DQorICBzICs9IHN0ck5hbWU7DQorICBpZiAocG9zID49IHNpemUpDQorICAgIHJldHVybjsNCisgIHAgKz0gcG9zOw0KKyAgc2l6ZSAtPSBwb3M7DQorICBpZiAoc2l6ZSA8IDgpDQorICAgIHJldHVybjsNCisgIGlmIChHZXQxNihwKSAhPSAyKSAvLyByZXZpc2lvbg0KKyAgICByZXR1cm47DQorICAvLyBVSW50MzIgYWNsU2l6ZSA9IEdldDE2KHAgKyAyKTsNCisgIFVJbnQzMiBudW0gPSBHZXQzMihwICsgNCk7DQorICBBZGRVSW50MzJUb1N0cmluZyhzLCBudW0pOw0KKyAgLyoNCisgIGlmIChudW0gPj0gKDEgPDwgMTYpKQ0KKyAgICByZXR1cm47DQorICBpZiAoYWNsU2l6ZSA+IHNpemUpDQorICAgIHJldHVybjsNCisgIHNpemUgPSBhY2xTaXplOw0KKyAgc2l6ZSAtPSA4Ow0KKyAgcCArPSA4Ow0KKyAgZm9yIChVSW50MzIgaSA9IDAgOyBpIDwgbnVtOyBpKyspDQorICB7DQorICAgIGlmIChzaXplIDw9IDgpDQorICAgICAgcmV0dXJuOw0KKyAgICAvLyBCeXRlIHR5cGUgPSBwWzBdOw0KKyAgICAvLyBCeXRlIGZsYWdzID0gcFsxXTsNCisgICAgLy8gVUludDMyIGFjZVNpemUgPSBHZXQxNihwICsgMik7DQorICAgIC8vIFVJbnQzMiBtYXNrID0gR2V0MzIocCArIDQpOw0KKyAgICBwICs9IDg7DQorICAgIHNpemUgLT0gODsNCisNCisgICAgVUludDMyIHNpZFNpemUgPSAwOw0KKyAgICBzICs9ICcgJzsNCisgICAgcyArPSBQYXJzZVNpZChwLCBzaXplLCBzaWRTaXplKTsNCisgICAgaWYgKHNpZFNpemUgPT0gMCkNCisgICAgICByZXR1cm47DQorICAgIHAgKz0gc2lkU2l6ZTsNCisgICAgc2l6ZSAtPSBzaWRTaXplOw0KKyAgfQ0KKyAgaWYgKHNpemUgIT0gMCkNCisgICAgcyArPSAiIEVSUk9SIjsNCisgICovDQorfQ0KKw0KKyNkZWZpbmUgTVlfU0VfT1dORVJfREVGQVVMVEVEICAgICAgICgweDAwMDEpDQorI2RlZmluZSBNWV9TRV9HUk9VUF9ERUZBVUxURUQgICAgICAgKDB4MDAwMikNCisjZGVmaW5lIE1ZX1NFX0RBQ0xfUFJFU0VOVCAgICAgICAgICAoMHgwMDA0KQ0KKyNkZWZpbmUgTVlfU0VfREFDTF9ERUZBVUxURUQgICAgICAgICgweDAwMDgpDQorI2RlZmluZSBNWV9TRV9TQUNMX1BSRVNFTlQgICAgICAgICAgKDB4MDAxMCkNCisjZGVmaW5lIE1ZX1NFX1NBQ0xfREVGQVVMVEVEICAgICAgICAoMHgwMDIwKQ0KKyNkZWZpbmUgTVlfU0VfREFDTF9BVVRPX0lOSEVSSVRfUkVRICgweDAxMDApDQorI2RlZmluZSBNWV9TRV9TQUNMX0FVVE9fSU5IRVJJVF9SRVEgKDB4MDIwMCkNCisjZGVmaW5lIE1ZX1NFX0RBQ0xfQVVUT19JTkhFUklURUQgICAoMHgwNDAwKQ0KKyNkZWZpbmUgTVlfU0VfU0FDTF9BVVRPX0lOSEVSSVRFRCAgICgweDA4MDApDQorI2RlZmluZSBNWV9TRV9EQUNMX1BST1RFQ1RFRCAgICAgICAgKDB4MTAwMCkNCisjZGVmaW5lIE1ZX1NFX1NBQ0xfUFJPVEVDVEVEICAgICAgICAoMHgyMDAwKQ0KKyNkZWZpbmUgTVlfU0VfUk1fQ09OVFJPTF9WQUxJRCAgICAgICgweDQwMDApDQorI2RlZmluZSBNWV9TRV9TRUxGX1JFTEFUSVZFICAgICAgICAgKDB4ODAwMCkNCisNCit2b2lkIENvbnZlcnROdFNlY3VyZVRvU3RyaW5nKGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplLCBBU3RyaW5nICZzKQ0KK3sNCisgIHMuRW1wdHkoKTsNCisgIGlmIChzaXplIDwgMjAgfHwgc2l6ZSA+ICgxIDw8IDE4KSkNCisgIHsNCisgICAgcyArPSAiRVJST1IiOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoR2V0MTYoZGF0YSkgIT0gMSkgLy8gcmV2aXNpb24NCisgIHsNCisgICAgcyArPSAiVU5TVVBQT1JURUQiOw0KKyAgICByZXR1cm47DQorICB9DQorICBQYXJzZU93bmVyKHMsIGRhdGEsIHNpemUsIEdldDMyKGRhdGEgKyA0KSk7DQorICBzICs9ICcgJzsNCisgIFBhcnNlT3duZXIocywgZGF0YSwgc2l6ZSwgR2V0MzIoZGF0YSArIDgpKTsNCisgIFBhcnNlQWNsKHMsIGRhdGEsIHNpemUsICJzOiIsIE1ZX1NFX1NBQ0xfUFJFU0VOVCwgMTIpOw0KKyAgUGFyc2VBY2wocywgZGF0YSwgc2l6ZSwgImQ6IiwgTVlfU0VfREFDTF9QUkVTRU5ULCAxNik7DQorICBzICs9ICcgJzsNCisgIEFkZFVJbnQzMlRvU3RyaW5nKHMsIHNpemUpOw0KKyAgLy8gcyArPSAnXG4nOw0KKyAgLy8gcyArPSBEYXRhX1RvX0hleChkYXRhLCBzaXplKTsNCit9DQorDQorI2lmZGVmIF9XSU4zMg0KKw0KK3N0YXRpYyBib29sIENoZWNrU2lkKGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgcG9zKQ0KK3sNCisgIGlmIChwb3MgPj0gc2l6ZSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgc2l6ZSAtPSBwb3M7DQorICBpZiAoc2l6ZSA8IDgpDQorICAgIHJldHVybiBmYWxzZTsNCisgIFVJbnQzMiByZXYgPSBkYXRhW3Bvc107DQorICBpZiAocmV2ICE9IDEpDQorICAgIHJldHVybiBmYWxzZTsNCisgIFVJbnQzMiBudW0gPSBkYXRhW3BvcyArIDFdOw0KKyAgcmV0dXJuICg4ICsgbnVtICogNCA8PSBzaXplKTsNCit9DQorDQorc3RhdGljIGJvb2wgQ2hlY2tBY2woY29uc3QgQnl0ZSAqcCwgVUludDMyIHNpemUsIFVJbnQzMiBmbGFncywgVUludDMyIG9mZnNldCkNCit7DQorICBVSW50MzIgY29udHJvbCA9IEdldDE2KHAgKyAyKTsNCisgIGlmICgoZmxhZ3MgJiBjb250cm9sKSA9PSAwKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIFVJbnQzMiBwb3MgPSBHZXQzMihwICsgb2Zmc2V0KTsNCisgIGlmIChwb3MgPj0gc2l6ZSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcCArPSBwb3M7DQorICBzaXplIC09IHBvczsNCisgIGlmIChzaXplIDwgOCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgVUludDMyIGFjbFNpemUgPSBHZXQxNihwICsgMik7DQorICByZXR1cm4gKGFjbFNpemUgPD0gc2l6ZSk7DQorfQ0KKw0KK2Jvb2wgQ2hlY2tOdFNlY3VyZShjb25zdCBCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSkNCit7DQorICBpZiAoc2l6ZSA8IDIwKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBpZiAoR2V0MTYoZGF0YSkgIT0gMSkgLy8gcmV2aXNpb24NCisgICAgcmV0dXJuIHRydWU7IC8vIHdpbmRvd3MgZnVuY3Rpb24gY2FuIGhhbmRsZSBzdWNoIGVycm9yLCBzbyB3ZSBhbGxvdyBpdA0KKyAgaWYgKHNpemUgPiAoMSA8PCAxOCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIGlmICghQ2hlY2tTaWQoZGF0YSwgc2l6ZSwgR2V0MzIoZGF0YSArIDQpKSkgcmV0dXJuIGZhbHNlOw0KKyAgaWYgKCFDaGVja1NpZChkYXRhLCBzaXplLCBHZXQzMihkYXRhICsgOCkpKSByZXR1cm4gZmFsc2U7DQorICBpZiAoIUNoZWNrQWNsKGRhdGEsIHNpemUsIE1ZX1NFX1NBQ0xfUFJFU0VOVCwgMTIpKSByZXR1cm4gZmFsc2U7DQorICBpZiAoIUNoZWNrQWNsKGRhdGEsIHNpemUsIE1ZX1NFX0RBQ0xfUFJFU0VOVCwgMTYpKSByZXR1cm4gZmFsc2U7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorI2VuZGlmDQorDQorYm9vbCBDb252ZXJ0TnRSZXBhcnNlVG9TdHJpbmcoY29uc3QgQnl0ZSAqZGF0YSwgVUludDMyIHNpemUsIFVTdHJpbmcgJnMpDQorew0KKyAgcy5FbXB0eSgpOw0KKyAgTkZpbGU6OkNSZXBhcnNlQXR0ciBhdHRyOw0KKyAgaWYgKGF0dHIuUGFyc2UoZGF0YSwgc2l6ZSkpDQorICB7DQorICAgIGlmICghYXR0ci5Jc1N5bUxpbmsoKSkNCisgICAgICBzICs9IEwiSnVuY3Rpb246ICI7DQorICAgIHMgKz0gYXR0ci5HZXRQYXRoKCk7DQorICAgIGlmICghYXR0ci5Jc09rTmFtZVBhaXIoKSkNCisgICAgew0KKyAgICAgIHMgKz0gTCIgOiAiOw0KKyAgICAgIHMgKz0gYXR0ci5QcmludE5hbWU7DQorICAgIH0NCisgICAgcmV0dXJuIHRydWU7DQorICB9DQorDQorICBpZiAoc2l6ZSA8IDgpDQorICAgIHJldHVybiBmYWxzZTsNCisgIFVJbnQzMiB0YWcgPSBHZXQzMihkYXRhKTsNCisgIFVJbnQzMiBsZW4gPSBHZXQxNihkYXRhICsgNCk7DQorICBpZiAobGVuICsgOCA+IHNpemUpDQorICAgIHJldHVybiBmYWxzZTsNCisgIGlmIChHZXQxNihkYXRhICsgNikgIT0gMCkgLy8gcGFkZGluZw0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICBjaGFyIGhleFsxNl07DQorICBDb252ZXJ0VUludDMyVG9IZXg4RGlnaXRzKHRhZywgaGV4KTsNCisgIHMuQWRkQXNjaWlTdHIoaGV4KTsNCisgIHMgKz0gTCcgJzsNCisNCisgIGRhdGEgKz0gODsNCisNCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbGVuOyBpKyspDQorICB7DQorICAgIEJ5dGUgYiA9ICgoY29uc3QgQnl0ZSAqKWRhdGEpW2ldOw0KKyAgICBzICs9ICh3Y2hhcl90KUdldEhleCgoQnl0ZSkoKGIgPj4gNCkgJiAweEYpKTsNCisgICAgcyArPSAod2NoYXJfdClHZXRIZXgoKEJ5dGUpKGIgJiAweEYpKTsNCisgIH0NCisgIHJldHVybiB0cnVlOw0KK30NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Qcm9wSURVdGlscy5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vUHJvcElEVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2ZiYzhjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vUHJvcElEVXRpbHMuaApAQCAtMCwwICsxLDE3IEBACisvLyBQcm9wSURVdGlscy5oDQorDQorI2lmbmRlZiBfX1BST1BJRF9VVElMU19IDQorI2RlZmluZSBfX1BST1BJRF9VVElMU19IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeVN0cmluZy5oIg0KKw0KKy8vIHByb3ZpZGUgYXQgbGVhc3QgNjQgYnl0ZXMgZm9yIGJ1ZmZlciBpbmNsdWRpbmcgemVyby1lbmQNCit2b2lkIENvbnZlcnRQcm9wZXJ0eVRvU2hvcnRTdHJpbmcoY2hhciAqZGVzdCwgY29uc3QgUFJPUFZBUklBTlQgJnByb3BWYXJpYW50LCBQUk9QSUQgcHJvcElELCBib29sIGZ1bGwgPSB0cnVlKSB0aHJvdygpOw0KK3ZvaWQgQ29udmVydFByb3BlcnR5VG9TdHJpbmcoVVN0cmluZyAmZGVzdCwgY29uc3QgUFJPUFZBUklBTlQgJnByb3BWYXJpYW50LCBQUk9QSUQgcHJvcElELCBib29sIGZ1bGwgPSB0cnVlKTsNCisNCitib29sIENvbnZlcnROdFJlcGFyc2VUb1N0cmluZyhjb25zdCBCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSwgVVN0cmluZyAmcyk7DQordm9pZCBDb252ZXJ0TnRTZWN1cmVUb1N0cmluZyhjb25zdCBCeXRlICpkYXRhLCBVSW50MzIgc2l6ZSwgQVN0cmluZyAmcyk7DQorYm9vbCBDaGVja050U2VjdXJlKGNvbnN0IEJ5dGUgKmRhdGEsIFVJbnQzMiBzaXplKTsNCit2b2lkIENvbnZlcnRXaW5BdHRyaWJUb1N0cmluZyhjaGFyICpzLCBVSW50MzIgd2EpOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1Byb3BlcnR5LmggYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Qcm9wZXJ0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMjM0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Qcm9wZXJ0eS5oCkBAIC0wLDAgKzEsMTQgQEAKKy8vIFByb3BlcnR5LmgNCisNCisjaWZuZGVmIF9fN1pfUFJPUEVSVFlfSA0KKyNkZWZpbmUgX183Wl9QUk9QRVJUWV9IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeVN0cmluZy5oIg0KKw0KK3N0cnVjdCBDUHJvcGVydHkNCit7DQorICBVU3RyaW5nIE5hbWU7DQorICBVU3RyaW5nIFZhbHVlOw0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vU2V0UHJvcGVydGllcy5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9TZXRQcm9wZXJ0aWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2Q0ZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vU2V0UHJvcGVydGllcy5jcHAKQEAgLTAsMCArMSw4MCBAQAorLy8gU2V0UHJvcGVydGllcy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlTdHJpbmcuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ1RvSW50LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvUHJvcFZhcmlhbnQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQXJjaGl2ZS9JQXJjaGl2ZS5oIg0KKw0KKyNpbmNsdWRlICJTZXRQcm9wZXJ0aWVzLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KK3VzaW5nIG5hbWVzcGFjZSBOQ09NOw0KKw0KK3N0YXRpYyB2b2lkIFBhcnNlTnVtYmVyU3RyaW5nKGNvbnN0IFVTdHJpbmcgJnMsIE5DT006OkNQcm9wVmFyaWFudCAmcHJvcCkNCit7DQorICBjb25zdCB3Y2hhcl90ICplbmQ7DQorICBVSW50NjQgcmVzdWx0ID0gQ29udmVydFN0cmluZ1RvVUludDY0KHMsICZlbmQpOw0KKyAgaWYgKCplbmQgIT0gMCB8fCBzLklzRW1wdHkoKSkNCisgICAgcHJvcCA9IHM7DQorICBlbHNlIGlmIChyZXN1bHQgPD0gKFVJbnQzMikweEZGRkZGRkZGKQ0KKyAgICBwcm9wID0gKFVJbnQzMilyZXN1bHQ7DQorICBlbHNlDQorICAgIHByb3AgPSByZXN1bHQ7DQorfQ0KKw0KK0hSRVNVTFQgU2V0UHJvcGVydGllcyhJVW5rbm93biAqdW5rbm93biwgY29uc3QgQ09iamVjdFZlY3RvcjxDUHJvcGVydHk+ICZwcm9wZXJ0aWVzKQ0KK3sNCisgIGlmIChwcm9wZXJ0aWVzLklzRW1wdHkoKSkNCisgICAgcmV0dXJuIFNfT0s7DQorICBDTXlDb21QdHI8SVNldFByb3BlcnRpZXM+IHNldFByb3BlcnRpZXM7DQorICB1bmtub3duLT5RdWVyeUludGVyZmFjZShJSURfSVNldFByb3BlcnRpZXMsICh2b2lkICoqKSZzZXRQcm9wZXJ0aWVzKTsNCisgIGlmICghc2V0UHJvcGVydGllcykNCisgICAgcmV0dXJuIFNfT0s7DQorDQorICBVU3RyaW5nVmVjdG9yIHJlYWxOYW1lczsNCisgIENQcm9wVmFyaWFudCAqdmFsdWVzID0gbmV3IENQcm9wVmFyaWFudFtwcm9wZXJ0aWVzLlNpemUoKV07DQorICB0cnkNCisgIHsNCisgICAgdW5zaWduZWQgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IHByb3BlcnRpZXMuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBjb25zdCBDUHJvcGVydHkgJnByb3BlcnR5ID0gcHJvcGVydGllc1tpXTsNCisgICAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcFZhcmlhbnQ7DQorICAgICAgVVN0cmluZyBuYW1lID0gcHJvcGVydHkuTmFtZTsNCisgICAgICBpZiAocHJvcGVydHkuVmFsdWUuSXNFbXB0eSgpKQ0KKyAgICAgIHsNCisgICAgICAgIGlmICghbmFtZS5Jc0VtcHR5KCkpDQorICAgICAgICB7DQorICAgICAgICAgIHdjaGFyX3QgYyA9IG5hbWUuQmFjaygpOw0KKyAgICAgICAgICBpZiAoYyA9PSBMJy0nKQ0KKyAgICAgICAgICAgIHByb3BWYXJpYW50ID0gZmFsc2U7DQorICAgICAgICAgIGVsc2UgaWYgKGMgPT0gTCcrJykNCisgICAgICAgICAgICBwcm9wVmFyaWFudCA9IHRydWU7DQorICAgICAgICAgIGlmIChwcm9wVmFyaWFudC52dCAhPSBWVF9FTVBUWSkNCisgICAgICAgICAgICBuYW1lLkRlbGV0ZUJhY2soKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgICAgUGFyc2VOdW1iZXJTdHJpbmcocHJvcGVydHkuVmFsdWUsIHByb3BWYXJpYW50KTsNCisgICAgICByZWFsTmFtZXMuQWRkKG5hbWUpOw0KKyAgICAgIHZhbHVlc1tpXSA9IHByb3BWYXJpYW50Ow0KKyAgICB9DQorICAgIENSZWNvcmRWZWN0b3I8Y29uc3Qgd2NoYXJfdCAqPiBuYW1lczsNCisgICAgZm9yIChpID0gMDsgaSA8IHJlYWxOYW1lcy5TaXplKCk7IGkrKykNCisgICAgICBuYW1lcy5BZGQoKGNvbnN0IHdjaGFyX3QgKilyZWFsTmFtZXNbaV0pOw0KKyAgICANCisgICAgUklOT0soc2V0UHJvcGVydGllcy0+U2V0UHJvcGVydGllcygmbmFtZXMuRnJvbnQoKSwgdmFsdWVzLCBuYW1lcy5TaXplKCkpKTsNCisgIH0NCisgIGNhdGNoKC4uLikNCisgIHsNCisgICAgZGVsZXRlIFtddmFsdWVzOw0KKyAgICB0aHJvdzsNCisgIH0NCisgIGRlbGV0ZSBbXXZhbHVlczsNCisgIHJldHVybiBTX09LOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9TZXRQcm9wZXJ0aWVzLmggYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9TZXRQcm9wZXJ0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjOTQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1NldFByb3BlcnRpZXMuaApAQCAtMCwwICsxLDEwIEBACisvLyBTZXRQcm9wZXJ0aWVzLmgNCisNCisjaWZuZGVmIF9fU0VUUFJPUEVSVElFU19IDQorI2RlZmluZSBfX1NFVFBST1BFUlRJRVNfSA0KKw0KKyNpbmNsdWRlICJQcm9wZXJ0eS5oIg0KKw0KK0hSRVNVTFQgU2V0UHJvcGVydGllcyhJVW5rbm93biAqdW5rbm93biwgY29uc3QgQ09iamVjdFZlY3RvcjxDUHJvcGVydHk+ICZwcm9wZXJ0aWVzKTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Tb3J0VXRpbHMuY3BwIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vU29ydFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTEwZmZkCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vU29ydFV0aWxzLmNwcApAQCAtMCwwICsxLDIzIEBACisvLyBTb3J0VXRpbHMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vV2lsZGNhcmQuaCINCisNCisjaW5jbHVkZSAiU29ydFV0aWxzLmgiDQorDQorc3RhdGljIGludCBDb21wYXJlU3RyaW5ncyhjb25zdCB1bnNpZ25lZCAqcDEsIGNvbnN0IHVuc2lnbmVkICpwMiwgdm9pZCAqcGFyYW0pDQorew0KKyAgY29uc3QgVVN0cmluZ1ZlY3RvciAmc3RyaW5ncyA9ICooY29uc3QgVVN0cmluZ1ZlY3RvciAqKXBhcmFtOw0KKyAgcmV0dXJuIENvbXBhcmVGaWxlTmFtZXMoc3RyaW5nc1sqcDFdLCBzdHJpbmdzWypwMl0pOw0KK30NCisNCit2b2lkIFNvcnRGaWxlTmFtZXMoY29uc3QgVVN0cmluZ1ZlY3RvciAmc3RyaW5ncywgQ1VJbnRWZWN0b3IgJmluZGljZXMpDQorew0KKyAgdW5zaWduZWQgbnVtSXRlbXMgPSBzdHJpbmdzLlNpemUoKTsNCisgIGluZGljZXMuQ2xlYXJBbmRTZXRTaXplKG51bUl0ZW1zKTsNCisgIHVuc2lnbmVkICp2YWxzID0gJmluZGljZXNbMF07DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykNCisgICAgdmFsc1tpXSA9IGk7DQorICBpbmRpY2VzLlNvcnQoQ29tcGFyZVN0cmluZ3MsICh2b2lkICopJnN0cmluZ3MpOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Tb3J0VXRpbHMuaCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1NvcnRVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDVlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Tb3J0VXRpbHMuaApAQCAtMCwwICsxLDEwIEBACisvLyBTb3J0VXRpbHMuaA0KKw0KKyNpZm5kZWYgX19TT1JUX1VUTFNfSA0KKyNkZWZpbmUgX19TT1JUX1VUTFNfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlTdHJpbmcuaCINCisNCit2b2lkIFNvcnRGaWxlTmFtZXMoY29uc3QgVVN0cmluZ1ZlY3RvciAmc3RyaW5ncywgQ1VJbnRWZWN0b3IgJmluZGljZXMpOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1N0ZEFmeC5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vU3RkQWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkOWFjMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1N0ZEFmeC5oCkBAIC0wLDAgKzEsOCBAQAorLy8gU3RkQWZ4LmgNCisNCisjaWZuZGVmIF9fU1REQUZYX0gNCisjZGVmaW5lIF9fU1REQUZYX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0NvbW1vbi5oIg0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1RlbXBGaWxlcy5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9UZW1wRmlsZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYmVlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9UZW1wRmlsZXMuY3BwCkBAIC0wLDAgKzEsMjEgQEAKKy8vIFRlbXBGaWxlcy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZURpci5oIg0KKw0KKyNpbmNsdWRlICJUZW1wRmlsZXMuaCINCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQordXNpbmcgbmFtZXNwYWNlIE5GaWxlOw0KKw0KK3ZvaWQgQ1RlbXBGaWxlczo6Q2xlYXIoKQ0KK3sNCisgIHdoaWxlICghUGF0aHMuSXNFbXB0eSgpKQ0KKyAgew0KKyAgICBORGlyOjpEZWxldGVGaWxlQWx3YXlzKFBhdGhzLkJhY2soKSk7DQorICAgIFBhdGhzLkRlbGV0ZUJhY2soKTsNCisgIH0NCit9DQorDQorDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vVGVtcEZpbGVzLmggYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9UZW1wRmlsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjIxOTJkCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vVGVtcEZpbGVzLmgKQEAgLTAsMCArMSwxNiBAQAorLy8gVGVtcEZpbGVzLmgNCisNCisjaWZuZGVmIF9fVEVNUF9GSUxFU19IDQorI2RlZmluZSBfX1RFTVBfRklMRVNfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlTdHJpbmcuaCINCisNCitjbGFzcyBDVGVtcEZpbGVzDQorew0KKyAgdm9pZCBDbGVhcigpOw0KK3B1YmxpYzoNCisgIEZTdHJpbmdWZWN0b3IgUGF0aHM7DQorICB+Q1RlbXBGaWxlcygpIHsgQ2xlYXIoKTsgfQ0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vVXBkYXRlLmNwcCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1VwZGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUxMzMxMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1VwZGF0ZS5jcHAKQEAgLTAsMCArMSwxNDc3IEBACisvLyBVcGRhdGUuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJVcGRhdGUuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0ludFRvU3RyaW5nLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRExMLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZURpci5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVGaW5kLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZU5hbWUuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9Qcm9wVmFyaWFudC5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1Byb3BWYXJpYW50Q29udi5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1RpbWVVdGlscy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vRmlsZVN0cmVhbXMuaCINCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0xpbWl0ZWRTdHJlYW1zLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbXByZXNzL0NvcHlDb2Rlci5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vRGlySXRlbS5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vRW51bURpckl0ZW1zLmgiDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9PcGVuQXJjaGl2ZS5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vVXBkYXRlUHJvZHVjZS5oIg0KKw0KKyNpbmNsdWRlICJFbnVtRGlySXRlbXMuaCINCisjaW5jbHVkZSAiU2V0UHJvcGVydGllcy5oIg0KKyNpbmNsdWRlICJUZW1wRmlsZXMuaCINCisjaW5jbHVkZSAiVXBkYXRlQ2FsbGJhY2suaCINCisNCitzdGF0aWMgY29uc3QgY2hhciAqa1VwZGF0ZUlzTm90U3Vwb29ydGVkID0NCisgICJ1cGRhdGUgb3BlcmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhcmNoaXZlIjsNCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQordXNpbmcgbmFtZXNwYWNlIE5DT007DQordXNpbmcgbmFtZXNwYWNlIE5GaWxlOw0KK3VzaW5nIG5hbWVzcGFjZSBORGlyOw0KK3VzaW5nIG5hbWVzcGFjZSBOTmFtZTsNCisNCitzdGF0aWMgQ0ZTVFIga1RlbXBGb2xkZXJQcmVmaXggPSBGVEVYVCgiN3pFIik7DQorDQorDQorc3RhdGljIGJvb2wgRGVsZXRlRW1wdHlGb2xkZXJBbmRFbXB0eVN1YkZvbGRlcnMoY29uc3QgRlN0cmluZyAmcGF0aCkNCit7DQorICBORmluZDo6Q0ZpbGVJbmZvIGZpbGVJbmZvOw0KKyAgRlN0cmluZyBwYXRoUHJlZml4ID0gcGF0aCArIEZDSEFSX1BBVEhfU0VQQVJBVE9SOw0KKyAgew0KKyAgICBORmluZDo6Q0VudW1lcmF0b3IgZW51bWVyYXRvcihwYXRoUHJlZml4ICsgRkNIQVJfQU5ZX01BU0spOw0KKyAgICB3aGlsZSAoZW51bWVyYXRvci5OZXh0KGZpbGVJbmZvKSkNCisgICAgew0KKyAgICAgIGlmIChmaWxlSW5mby5Jc0RpcigpKQ0KKyAgICAgICAgaWYgKCFEZWxldGVFbXB0eUZvbGRlckFuZEVtcHR5U3ViRm9sZGVycyhwYXRoUHJlZml4ICsgZmlsZUluZm8uTmFtZSkpDQorICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgfQ0KKyAgLyoNCisgIC8vIHdlIGRvbid0IG5lZWQgY2xlYXIgcmVhZC1vbmx5IGZvciBmb2xkZXJzDQorICBpZiAoIU15U2V0RmlsZUF0dHJpYnV0ZXMocGF0aCwgMCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgICovDQorICByZXR1cm4gUmVtb3ZlRGlyKHBhdGgpOw0KK30NCisNCisNCit1c2luZyBuYW1lc3BhY2UgTlVwZGF0ZUFyY2hpdmU7DQorDQorY2xhc3MgQ091dE11bHRpVm9sU3RyZWFtOg0KKyAgcHVibGljIElPdXRTdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIHVuc2lnbmVkIF9zdHJlYW1JbmRleDsgLy8gcmVxdWlyZWQgc3RyZWFtDQorICBVSW50NjQgX29mZnNldFBvczsgLy8gb2Zmc2V0IGZyb20gc3RhcnQgb2YgX3N0cmVhbUluZGV4IGluZGV4DQorICBVSW50NjQgX2Fic1BvczsNCisgIFVJbnQ2NCBfbGVuZ3RoOw0KKw0KKyAgc3RydWN0IENBbHRTdHJlYW1JbmZvDQorICB7DQorICAgIENPdXRGaWxlU3RyZWFtICpTdHJlYW1TcGVjOw0KKyAgICBDTXlDb21QdHI8SU91dFN0cmVhbT4gU3RyZWFtOw0KKyAgICBGU3RyaW5nIE5hbWU7DQorICAgIFVJbnQ2NCBQb3M7DQorICAgIFVJbnQ2NCBSZWFsU2l6ZTsNCisgIH07DQorICBDT2JqZWN0VmVjdG9yPENBbHRTdHJlYW1JbmZvPiBTdHJlYW1zOw0KK3B1YmxpYzoNCisgIC8vIENNeUNvbVB0cjxJQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrMj4gVm9sdW1lQ2FsbGJhY2s7DQorICBDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gU2l6ZXM7DQorICBGU3RyaW5nIFByZWZpeDsNCisgIENUZW1wRmlsZXMgKlRlbXBGaWxlczsNCisNCisgIHZvaWQgSW5pdCgpDQorICB7DQorICAgIF9zdHJlYW1JbmRleCA9IDA7DQorICAgIF9vZmZzZXRQb3MgPSAwOw0KKyAgICBfYWJzUG9zID0gMDsNCisgICAgX2xlbmd0aCA9IDA7DQorICB9DQorDQorICBib29sIFNldE1UaW1lKGNvbnN0IEZJTEVUSU1FICptVGltZSk7DQorICBIUkVTVUxUIENsb3NlKCk7DQorDQorICBNWV9VTktOT1dOX0lNUDEoSU91dFN0cmVhbSkNCisNCisgIFNURE1FVEhPRChXcml0ZSkoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAqcHJvY2Vzc2VkU2l6ZSk7DQorICBTVERNRVRIT0QoU2VlaykoSW50NjQgb2Zmc2V0LCBVSW50MzIgc2Vla09yaWdpbiwgVUludDY0ICpuZXdQb3NpdGlvbik7DQorICBTVERNRVRIT0QoU2V0U2l6ZSkoVUludDY0IG5ld1NpemUpOw0KK307DQorDQorLy8gc3RhdGljIE5TeW5jaHJvbml6YXRpb246OkNDcml0aWNhbFNlY3Rpb24gZ19UZW1wUGF0aHNDUzsNCisNCitIUkVTVUxUIENPdXRNdWx0aVZvbFN0cmVhbTo6Q2xvc2UoKQ0KK3sNCisgIEhSRVNVTFQgcmVzID0gU19PSzsNCisgIEZPUl9WRUNUT1IgKGksIFN0cmVhbXMpDQorICB7DQorICAgIENPdXRGaWxlU3RyZWFtICpzID0gU3RyZWFtc1tpXS5TdHJlYW1TcGVjOw0KKyAgICBpZiAocykNCisgICAgew0KKyAgICAgIEhSRVNVTFQgcmVzMiA9IHMtPkNsb3NlKCk7DQorICAgICAgaWYgKHJlczIgIT0gU19PSykNCisgICAgICAgIHJlcyA9IHJlczI7DQorICAgIH0NCisgIH0NCisgIHJldHVybiByZXM7DQorfQ0KKw0KK2Jvb2wgQ091dE11bHRpVm9sU3RyZWFtOjpTZXRNVGltZShjb25zdCBGSUxFVElNRSAqbVRpbWUpDQorew0KKyAgYm9vbCByZXMgPSB0cnVlOw0KKyAgRk9SX1ZFQ1RPUiAoaSwgU3RyZWFtcykNCisgIHsNCisgICAgQ091dEZpbGVTdHJlYW0gKnMgPSBTdHJlYW1zW2ldLlN0cmVhbVNwZWM7DQorICAgIGlmIChzKQ0KKyAgICAgIGlmICghcy0+U2V0TVRpbWUobVRpbWUpKQ0KKyAgICAgICAgcmVzID0gZmFsc2U7DQorICB9DQorICByZXR1cm4gcmVzOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ091dE11bHRpVm9sU3RyZWFtOjpXcml0ZShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIGlmIChwcm9jZXNzZWRTaXplICE9IE5VTEwpDQorICAgICpwcm9jZXNzZWRTaXplID0gMDsNCisgIHdoaWxlIChzaXplID4gMCkNCisgIHsNCisgICAgaWYgKF9zdHJlYW1JbmRleCA+PSBTdHJlYW1zLlNpemUoKSkNCisgICAgew0KKyAgICAgIENBbHRTdHJlYW1JbmZvIGFsdFN0cmVhbTsNCisNCisgICAgICBGQ2hhciB0ZW1wWzE2XTsNCisgICAgICBDb252ZXJ0VUludDMyVG9TdHJpbmcoX3N0cmVhbUluZGV4ICsgMSwgdGVtcCk7DQorICAgICAgRlN0cmluZyByZXMgPSB0ZW1wOw0KKyAgICAgIHdoaWxlIChyZXMuTGVuKCkgPCAzKQ0KKyAgICAgICAgcmVzID0gRlN0cmluZyhGVEVYVCgnMCcpKSArIHJlczsNCisgICAgICBGU3RyaW5nIG5hbWUgPSBQcmVmaXggKyByZXM7DQorICAgICAgYWx0U3RyZWFtLlN0cmVhbVNwZWMgPSBuZXcgQ091dEZpbGVTdHJlYW07DQorICAgICAgYWx0U3RyZWFtLlN0cmVhbSA9IGFsdFN0cmVhbS5TdHJlYW1TcGVjOw0KKyAgICAgIGlmICghYWx0U3RyZWFtLlN0cmVhbVNwZWMtPkNyZWF0ZShuYW1lLCBmYWxzZSkpDQorICAgICAgICByZXR1cm4gOjpHZXRMYXN0RXJyb3IoKTsNCisgICAgICB7DQorICAgICAgICAvLyBOU3luY2hyb25pemF0aW9uOjpDQ3JpdGljYWxTZWN0aW9uTG9jayBsb2NrKGdfVGVtcFBhdGhzQ1MpOw0KKyAgICAgICAgVGVtcEZpbGVzLT5QYXRocy5BZGQobmFtZSk7DQorICAgICAgfQ0KKw0KKyAgICAgIGFsdFN0cmVhbS5Qb3MgPSAwOw0KKyAgICAgIGFsdFN0cmVhbS5SZWFsU2l6ZSA9IDA7DQorICAgICAgYWx0U3RyZWFtLk5hbWUgPSBuYW1lOw0KKyAgICAgIFN0cmVhbXMuQWRkKGFsdFN0cmVhbSk7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0FsdFN0cmVhbUluZm8gJmFsdFN0cmVhbSA9IFN0cmVhbXNbX3N0cmVhbUluZGV4XTsNCisNCisgICAgdW5zaWduZWQgaW5kZXggPSBfc3RyZWFtSW5kZXg7DQorICAgIGlmIChpbmRleCA+PSBTaXplcy5TaXplKCkpDQorICAgICAgaW5kZXggPSBTaXplcy5TaXplKCkgLSAxOw0KKyAgICBVSW50NjQgdm9sU2l6ZSA9IFNpemVzW2luZGV4XTsNCisNCisgICAgaWYgKF9vZmZzZXRQb3MgPj0gdm9sU2l6ZSkNCisgICAgew0KKyAgICAgIF9vZmZzZXRQb3MgLT0gdm9sU2l6ZTsNCisgICAgICBfc3RyZWFtSW5kZXgrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoX29mZnNldFBvcyAhPSBhbHRTdHJlYW0uUG9zKQ0KKyAgICB7DQorICAgICAgLy8gQ015Q29tUHRyPElPdXRTdHJlYW0+IG91dFN0cmVhbTsNCisgICAgICAvLyBSSU5PSyhhbHRTdHJlYW0uU3RyZWFtLlF1ZXJ5SW50ZXJmYWNlKElJRF9JT3V0U3RyZWFtLCAmb3V0U3RyZWFtKSk7DQorICAgICAgUklOT0soYWx0U3RyZWFtLlN0cmVhbS0+U2Vlayhfb2Zmc2V0UG9zLCBTVFJFQU1fU0VFS19TRVQsIE5VTEwpKTsNCisgICAgICBhbHRTdHJlYW0uUG9zID0gX29mZnNldFBvczsNCisgICAgfQ0KKw0KKyAgICBVSW50MzIgY3VyU2l6ZSA9IChVSW50MzIpTXlNaW4oKFVJbnQ2NClzaXplLCB2b2xTaXplIC0gYWx0U3RyZWFtLlBvcyk7DQorICAgIFVJbnQzMiByZWFsUHJvY2Vzc2VkOw0KKyAgICBSSU5PSyhhbHRTdHJlYW0uU3RyZWFtLT5Xcml0ZShkYXRhLCBjdXJTaXplLCAmcmVhbFByb2Nlc3NlZCkpOw0KKyAgICBkYXRhID0gKHZvaWQgKikoKEJ5dGUgKilkYXRhICsgcmVhbFByb2Nlc3NlZCk7DQorICAgIHNpemUgLT0gcmVhbFByb2Nlc3NlZDsNCisgICAgYWx0U3RyZWFtLlBvcyArPSByZWFsUHJvY2Vzc2VkOw0KKyAgICBfb2Zmc2V0UG9zICs9IHJlYWxQcm9jZXNzZWQ7DQorICAgIF9hYnNQb3MgKz0gcmVhbFByb2Nlc3NlZDsNCisgICAgaWYgKF9hYnNQb3MgPiBfbGVuZ3RoKQ0KKyAgICAgIF9sZW5ndGggPSBfYWJzUG9zOw0KKyAgICBpZiAoX29mZnNldFBvcyA+IGFsdFN0cmVhbS5SZWFsU2l6ZSkNCisgICAgICBhbHRTdHJlYW0uUmVhbFNpemUgPSBfb2Zmc2V0UG9zOw0KKyAgICBpZiAocHJvY2Vzc2VkU2l6ZSAhPSBOVUxMKQ0KKyAgICAgICpwcm9jZXNzZWRTaXplICs9IHJlYWxQcm9jZXNzZWQ7DQorICAgIGlmIChhbHRTdHJlYW0uUG9zID09IHZvbFNpemUpDQorICAgIHsNCisgICAgICBfc3RyZWFtSW5kZXgrKzsNCisgICAgICBfb2Zmc2V0UG9zID0gMDsNCisgICAgfQ0KKyAgICBpZiAocmVhbFByb2Nlc3NlZCA9PSAwICYmIGN1clNpemUgIT0gMCkNCisgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ091dE11bHRpVm9sU3RyZWFtOjpTZWVrKEludDY0IG9mZnNldCwgVUludDMyIHNlZWtPcmlnaW4sIFVJbnQ2NCAqbmV3UG9zaXRpb24pDQorew0KKyAgaWYgKHNlZWtPcmlnaW4gPj0gMykNCisgICAgcmV0dXJuIFNUR19FX0lOVkFMSURGVU5DVElPTjsNCisgIHN3aXRjaCAoc2Vla09yaWdpbikNCisgIHsNCisgICAgY2FzZSBTVFJFQU1fU0VFS19TRVQ6IF9hYnNQb3MgPSBvZmZzZXQ7IGJyZWFrOw0KKyAgICBjYXNlIFNUUkVBTV9TRUVLX0NVUjogX2Fic1BvcyArPSBvZmZzZXQ7IGJyZWFrOw0KKyAgICBjYXNlIFNUUkVBTV9TRUVLX0VORDogX2Fic1BvcyA9IF9sZW5ndGggKyBvZmZzZXQ7IGJyZWFrOw0KKyAgfQ0KKyAgX29mZnNldFBvcyA9IF9hYnNQb3M7DQorICBpZiAobmV3UG9zaXRpb24gIT0gTlVMTCkNCisgICAgKm5ld1Bvc2l0aW9uID0gX2Fic1BvczsNCisgIF9zdHJlYW1JbmRleCA9IDA7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENPdXRNdWx0aVZvbFN0cmVhbTo6U2V0U2l6ZShVSW50NjQgbmV3U2l6ZSkNCit7DQorICBpZiAobmV3U2l6ZSA8IDApDQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICB1bnNpZ25lZCBpID0gMDsNCisgIHdoaWxlIChpIDwgU3RyZWFtcy5TaXplKCkpDQorICB7DQorICAgIENBbHRTdHJlYW1JbmZvICZhbHRTdHJlYW0gPSBTdHJlYW1zW2krK107DQorICAgIGlmICgoVUludDY0KW5ld1NpemUgPCBhbHRTdHJlYW0uUmVhbFNpemUpDQorICAgIHsNCisgICAgICBSSU5PSyhhbHRTdHJlYW0uU3RyZWFtLT5TZXRTaXplKG5ld1NpemUpKTsNCisgICAgICBhbHRTdHJlYW0uUmVhbFNpemUgPSBuZXdTaXplOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIG5ld1NpemUgLT0gYWx0U3RyZWFtLlJlYWxTaXplOw0KKyAgfQ0KKyAgd2hpbGUgKGkgPCBTdHJlYW1zLlNpemUoKSkNCisgIHsNCisgICAgew0KKyAgICAgIENBbHRTdHJlYW1JbmZvICZhbHRTdHJlYW0gPSBTdHJlYW1zLkJhY2soKTsNCisgICAgICBhbHRTdHJlYW0uU3RyZWFtLlJlbGVhc2UoKTsNCisgICAgICBEZWxldGVGaWxlQWx3YXlzKGFsdFN0cmVhbS5OYW1lKTsNCisgICAgfQ0KKyAgICBTdHJlYW1zLkRlbGV0ZUJhY2soKTsNCisgIH0NCisgIF9vZmZzZXRQb3MgPSBfYWJzUG9zOw0KKyAgX3N0cmVhbUluZGV4ID0gMDsNCisgIF9sZW5ndGggPSBuZXdTaXplOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3ZvaWQgQ0FyY2hpdmVQYXRoOjpQYXJzZUZyb21QYXRoKGNvbnN0IFVTdHJpbmcgJnBhdGgsIEVBcmNOYW1lTW9kZSBtb2RlKQ0KK3sNCisgIE9yaWdpbmFsUGF0aCA9IHBhdGg7DQorICANCisgIFNwbGl0UGF0aFRvUGFydHNfMihwYXRoLCBQcmVmaXgsIE5hbWUpOw0KKyAgDQorICBpZiAobW9kZSA9PSBrX0FyY05hbWVNb2RlX0FkZCkNCisgICAgcmV0dXJuOw0KKyAgaWYgKG1vZGUgPT0ga19BcmNOYW1lTW9kZV9FeGFjdCkNCisgIHsNCisgICAgQmFzZUV4dGVuc2lvbi5FbXB0eSgpOw0KKyAgICByZXR1cm47DQorICB9DQorICANCisgIGludCBkb3RQb3MgPSBOYW1lLlJldmVyc2VGaW5kKEwnLicpOw0KKyAgaWYgKGRvdFBvcyA8IDApDQorICAgIHJldHVybjsNCisgIGlmICgodW5zaWduZWQpZG90UG9zID09IE5hbWUuTGVuKCkgLSAxKQ0KKyAgew0KKyAgICBOYW1lLkRlbGV0ZUJhY2soKTsNCisgICAgQmFzZUV4dGVuc2lvbi5FbXB0eSgpOw0KKyAgICByZXR1cm47DQorICB9DQorICBjb25zdCBVU3RyaW5nIGV4dCA9IE5hbWUuUHRyKGRvdFBvcyArIDEpOw0KKyAgaWYgKEJhc2VFeHRlbnNpb24uSXNFcXVhbFRvTm9DYXNlKGV4dCkpDQorICB7DQorICAgIEJhc2VFeHRlbnNpb24gPSBleHQ7DQorICAgIE5hbWUuRGVsZXRlRnJvbShkb3RQb3MpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgICBCYXNlRXh0ZW5zaW9uLkVtcHR5KCk7DQorfQ0KKw0KK1VTdHJpbmcgQ0FyY2hpdmVQYXRoOjpHZXRGaW5hbFBhdGgoKSBjb25zdA0KK3sNCisgIFVTdHJpbmcgcGF0aCA9IEdldFBhdGhXaXRob3V0RXh0KCk7DQorICBpZiAoIUJhc2VFeHRlbnNpb24uSXNFbXB0eSgpKQ0KKyAgICBwYXRoICs9IFVTdHJpbmcoTCcuJykgKyBCYXNlRXh0ZW5zaW9uOw0KKyAgcmV0dXJuIHBhdGg7DQorfQ0KKw0KK1VTdHJpbmcgQ0FyY2hpdmVQYXRoOjpHZXRGaW5hbFZvbFBhdGgoKSBjb25zdA0KK3sNCisgIFVTdHJpbmcgcGF0aCA9IEdldFBhdGhXaXRob3V0RXh0KCk7DQorICBpZiAoIUJhc2VFeHRlbnNpb24uSXNFbXB0eSgpKQ0KKyAgICBwYXRoICs9IFVTdHJpbmcoTCcuJykgKyBWb2xFeHRlbnNpb247DQorICByZXR1cm4gcGF0aDsNCit9DQorDQorRlN0cmluZyBDQXJjaGl2ZVBhdGg6OkdldFRlbXBQYXRoKCkgY29uc3QNCit7DQorICBGU3RyaW5nIHBhdGggPSBUZW1wUHJlZml4ICsgdXMyZnMoTmFtZSk7DQorICBpZiAoIUJhc2VFeHRlbnNpb24uSXNFbXB0eSgpKQ0KKyAgICBwYXRoICs9IEZTdHJpbmcoRlRFWFQoJy4nKSkgKyB1czJmcyhCYXNlRXh0ZW5zaW9uKTsNCisgIHBhdGggKz0gRlRFWFQoIi50bXAiKTsNCisgIHBhdGggKz0gVGVtcFBvc3RmaXg7DQorICByZXR1cm4gcGF0aDsNCit9DQorDQorc3RhdGljIGNvbnN0IHdjaGFyX3QgKmtEZWZhdWx0QXJjVHlwZSA9IEwiN3oiOw0KK3N0YXRpYyBjb25zdCB3Y2hhcl90ICprRGVmYXVsdEFyY0V4dCA9IEwiN3oiOw0KK3N0YXRpYyBjb25zdCB3Y2hhcl90ICprU0ZYRXh0ZW5zaW9uID0NCisgICNpZmRlZiBfV0lOMzINCisgICAgTCJleGUiOw0KKyAgI2Vsc2UNCisgICAgTCIiOw0KKyAgI2VuZGlmDQorDQorYm9vbCBDVXBkYXRlT3B0aW9uczo6SW5pdEZvcm1hdEluZGV4KGNvbnN0IENDb2RlY3MgKmNvZGVjcywNCisgICAgY29uc3QgQ09iamVjdFZlY3RvcjxDT3BlblR5cGU+ICZ0eXBlcywgY29uc3QgVVN0cmluZyAmYXJjUGF0aCkNCit7DQorICBpZiAodHlwZXMuU2l6ZSgpID4gMSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgLy8gaW50IGFyY1R5cGVJbmRleCA9IC0xOw0KKyAgaWYgKHR5cGVzLlNpemUoKSAhPSAwKQ0KKyAgew0KKyAgICBNZXRob2RNb2RlLlR5cGUgPSB0eXBlc1swXTsNCisgICAgTWV0aG9kTW9kZS5UeXBlX0RlZmluZWQgPSB0cnVlOw0KKyAgfQ0KKyAgaWYgKE1ldGhvZE1vZGUuVHlwZS5Gb3JtYXRJbmRleCA8IDApDQorICB7DQorICAgIC8vIE1ldGhvZE1vZGUuVHlwZSA9IC0xOw0KKyAgICBNZXRob2RNb2RlLlR5cGUgPSBDT3BlblR5cGUoKTsNCisgICAgaWYgKEFyY05hbWVNb2RlICE9IGtfQXJjTmFtZU1vZGVfQWRkKQ0KKyAgICB7DQorICAgICAgTWV0aG9kTW9kZS5UeXBlLkZvcm1hdEluZGV4ID0gY29kZWNzLT5GaW5kRm9ybWF0Rm9yQXJjaGl2ZU5hbWUoYXJjUGF0aCk7DQorICAgICAgaWYgKE1ldGhvZE1vZGUuVHlwZS5Gb3JtYXRJbmRleCA+PSAwKQ0KKyAgICAgICAgTWV0aG9kTW9kZS5UeXBlX0RlZmluZWQgPSB0cnVlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBDVXBkYXRlT3B0aW9uczo6U2V0QXJjUGF0aChjb25zdCBDQ29kZWNzICpjb2RlY3MsIGNvbnN0IFVTdHJpbmcgJmFyY1BhdGgpDQorew0KKyAgVVN0cmluZyB0eXBlRXh0Ow0KKyAgaW50IGZvcm1hdEluZGV4ID0gTWV0aG9kTW9kZS5UeXBlLkZvcm1hdEluZGV4Ow0KKyAgaWYgKGZvcm1hdEluZGV4IDwgMCkNCisgIHsNCisgICAgdHlwZUV4dCA9IGtEZWZhdWx0QXJjRXh0Ow0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBjb25zdCBDQXJjSW5mb0V4ICZhcmNJbmZvID0gY29kZWNzLT5Gb3JtYXRzW2Zvcm1hdEluZGV4XTsNCisgICAgaWYgKCFhcmNJbmZvLlVwZGF0ZUVuYWJsZWQpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB0eXBlRXh0ID0gYXJjSW5mby5HZXRNYWluRXh0KCk7DQorICB9DQorICBVU3RyaW5nIGV4dCA9IHR5cGVFeHQ7DQorICBpZiAoU2Z4TW9kZSkNCisgICAgZXh0ID0ga1NGWEV4dGVuc2lvbjsNCisgIEFyY2hpdmVQYXRoLkJhc2VFeHRlbnNpb24gPSBleHQ7DQorICBBcmNoaXZlUGF0aC5Wb2xFeHRlbnNpb24gPSB0eXBlRXh0Ow0KKyAgQXJjaGl2ZVBhdGguUGFyc2VGcm9tUGF0aChhcmNQYXRoLCBBcmNOYW1lTW9kZSk7DQorICBGT1JfVkVDVE9SIChpLCBDb21tYW5kcykNCisgIHsNCisgICAgQ1VwZGF0ZUFyY2hpdmVDb21tYW5kICZ1YyA9IENvbW1hbmRzW2ldOw0KKyAgICB1Yy5BcmNoaXZlUGF0aC5CYXNlRXh0ZW5zaW9uID0gZXh0Ow0KKyAgICB1Yy5BcmNoaXZlUGF0aC5Wb2xFeHRlbnNpb24gPSB0eXBlRXh0Ow0KKyAgICB1Yy5BcmNoaXZlUGF0aC5QYXJzZUZyb21QYXRoKHVjLlVzZXJBcmNoaXZlUGF0aCwgQXJjTmFtZU1vZGUpOw0KKyAgfQ0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qDQorc3RydWN0IENVcGRhdGVQcm9kdWNlQ2FsbGJhY2tJbXA6IHB1YmxpYyBJVXBkYXRlUHJvZHVjZUNhbGxiYWNrDQorew0KKyAgY29uc3QgQ09iamVjdFZlY3RvcjxDQXJjSXRlbT4gKl9hcmNJdGVtczsNCisgIElVcGRhdGVDYWxsYmFja1VJICpfY2FsbGJhY2s7DQorICANCisgIENVcGRhdGVQcm9kdWNlQ2FsbGJhY2tJbXAoY29uc3QgQ09iamVjdFZlY3RvcjxDQXJjSXRlbT4gKmEsDQorICAgICAgSVVwZGF0ZUNhbGxiYWNrVUkgKmNhbGxiYWNrKTogX2FyY0l0ZW1zKGEpLCBfY2FsbGJhY2soY2FsbGJhY2spIHt9DQorICB2aXJ0dWFsIEhSRVNVTFQgU2hvd0RlbGV0ZUZpbGUoaW50IGFyY0luZGV4KTsNCit9Ow0KKw0KK0hSRVNVTFQgQ1VwZGF0ZVByb2R1Y2VDYWxsYmFja0ltcDo6U2hvd0RlbGV0ZUZpbGUoaW50IGFyY0luZGV4KQ0KK3sNCisgIHJldHVybiBfY2FsbGJhY2stPlNob3dEZWxldGVGaWxlKCgqX2FyY0l0ZW1zKVthcmNJbmRleF0uTmFtZSk7DQorfQ0KKyovDQorDQorYm9vbCBDUmVuYW1lUGFpcjo6UHJlcGFyZSgpDQorew0KKyAgaWYgKFJlY3Vyc2VkVHlwZSAhPSBOUmVjdXJzZWRUeXBlOjprTm9uUmVjdXJzZWQpDQorICAgIHJldHVybiBmYWxzZTsNCisgIGlmICghV2lsZGNhcmRQYXJzaW5nKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIHJldHVybiAhRG9lc05hbWVDb250YWluV2lsZGNhcmQoT2xkTmFtZSk7DQorfQ0KKw0KK2V4dGVybiBib29sIGdfQ2FzZVNlbnNpdGl2ZTsNCisNCitzdGF0aWMgaW50IENvbXBhcmVUd29OYW1lcyhjb25zdCB3Y2hhcl90ICpzMSwgY29uc3Qgd2NoYXJfdCAqczIpDQorew0KKyAgZm9yIChpbnQgaSA9IDA7OyBpKyspDQorICB7DQorICAgIHdjaGFyX3QgYzEgPSBzMVtpXTsNCisgICAgd2NoYXJfdCBjMiA9IHMyW2ldOw0KKyAgICBpZiAoYzEgPT0gMCB8fCBjMiA9PSAwKQ0KKyAgICAgIHJldHVybiBpOw0KKyAgICBpZiAoYzEgPT0gYzIpDQorICAgICAgY29udGludWU7DQorICAgIGlmICghZ19DYXNlU2Vuc2l0aXZlICYmIChNeUNoYXJVcHBlcihjMSkgPT0gTXlDaGFyVXBwZXIoYzIpKSkNCisgICAgICBjb250aW51ZTsNCisgICAgaWYgKElzQ2hhckRpckxpbWl0ZXIoYzEpICYmIElzQ2hhckRpckxpbWl0ZXIoYzIpKQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICByZXR1cm4gaTsNCisgIH0NCit9DQorDQorYm9vbCBDUmVuYW1lUGFpcjo6R2V0TmV3UGF0aChib29sIGlzRm9sZGVyLCBjb25zdCBVU3RyaW5nICZzcmMsIFVTdHJpbmcgJmRlc3QpIGNvbnN0DQorew0KKyAgaW50IG51bSA9IENvbXBhcmVUd29OYW1lcyhPbGROYW1lLCBzcmMpOw0KKyAgaWYgKE9sZE5hbWVbbnVtXSA9PSAwKQ0KKyAgew0KKyAgICBpZiAoc3JjW251bV0gIT0gMCAmJiAhSXNDaGFyRGlyTGltaXRlcihzcmNbbnVtXSkgJiYgbnVtICE9IDAgJiYgIUlzQ2hhckRpckxpbWl0ZXIoc3JjW251bSAtIDFdKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIC8vIE9sZE5hbWVbbnVtXSAhPSAwDQorICAgIC8vIE9sZE5hbWUgPSAiMVwxYS50eHQiDQorICAgIC8vIHNyYyA9ICIxIg0KKw0KKyAgICBpZiAoIWlzRm9sZGVyIHx8DQorICAgICAgICBzcmNbbnVtXSAhPSAwIHx8DQorICAgICAgICAhSXNDaGFyRGlyTGltaXRlcihPbGROYW1lW251bV0pIHx8DQorICAgICAgICBPbGROYW1lW251bSArIDFdICE9IDApDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKyAgZGVzdCA9IE5ld05hbWUgKyBzcmMuUHRyKG51bSk7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorc3RhdGljIGludCBHZXRSZXZlcnNlU2xhc2hQb3MoY29uc3QgVVN0cmluZyAmbmFtZSkNCit7DQorICBpbnQgc2xhc2hQb3MgPSBuYW1lLlJldmVyc2VGaW5kKEwnLycpOw0KKyAgI2lmZGVmIF9XSU4zMg0KKyAgaW50IHNsYXNoMVBvcyA9IG5hbWUuUmV2ZXJzZUZpbmQoTCdcXCcpOw0KKyAgc2xhc2hQb3MgPSBNeU1heChzbGFzaFBvcywgc2xhc2gxUG9zKTsNCisgICNlbmRpZg0KKyAgcmV0dXJuIHNsYXNoUG9zOw0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBDb21wcmVzcygNCisgICAgY29uc3QgQ1VwZGF0ZU9wdGlvbnMgJm9wdGlvbnMsDQorICAgIENDb2RlY3MgKmNvZGVjcywNCisgICAgY29uc3QgQ0FjdGlvblNldCAmYWN0aW9uU2V0LA0KKyAgICBjb25zdCBDQXJjICphcmMsDQorICAgIENBcmNoaXZlUGF0aCAmYXJjaGl2ZVBhdGgsDQorICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q0FyY0l0ZW0+ICZhcmNJdGVtcywNCisgICAgQnl0ZSAqcHJvY2Vzc2VkSXRlbXNTdGF0dXNlcywNCisgICAgY29uc3QgQ0Rpckl0ZW1zICZkaXJJdGVtcywNCisgICAgY29uc3QgQ0Rpckl0ZW0gKnBhcmVudERpckl0ZW0sDQorICAgIENUZW1wRmlsZXMgJnRlbXBGaWxlcywNCisgICAgQ1VwZGF0ZUVycm9ySW5mbyAmZXJyb3JJbmZvLA0KKyAgICBJVXBkYXRlQ2FsbGJhY2tVSSAqY2FsbGJhY2spDQorew0KKyAgQ015Q29tUHRyPElPdXRBcmNoaXZlPiBvdXRBcmNoaXZlOw0KKyAgaW50IGZvcm1hdEluZGV4ID0gb3B0aW9ucy5NZXRob2RNb2RlLlR5cGUuRm9ybWF0SW5kZXg7DQorICBpZiAoYXJjKQ0KKyAgew0KKyAgICBmb3JtYXRJbmRleCA9IGFyYy0+Rm9ybWF0SW5kZXg7DQorICAgIGlmIChmb3JtYXRJbmRleCA8IDApDQorICAgICAgcmV0dXJuIEVfTk9USU1QTDsNCisgICAgQ015Q29tUHRyPElJbkFyY2hpdmU+IGFyY2hpdmUyID0gYXJjLT5BcmNoaXZlOw0KKyAgICBIUkVTVUxUIHJlc3VsdCA9IGFyY2hpdmUyLlF1ZXJ5SW50ZXJmYWNlKElJRF9JT3V0QXJjaGl2ZSwgJm91dEFyY2hpdmUpOw0KKyAgICBpZiAocmVzdWx0ICE9IFNfT0spDQorICAgICAgdGhyb3cga1VwZGF0ZUlzTm90U3Vwb29ydGVkOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBSSU5PSyhjb2RlY3MtPkNyZWF0ZU91dEFyY2hpdmUoZm9ybWF0SW5kZXgsIG91dEFyY2hpdmUpKTsNCisNCisgICAgI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKyAgICB7DQorICAgICAgQ015Q29tUHRyPElTZXRDb21wcmVzc0NvZGVjc0luZm8+IHNldENvbXByZXNzQ29kZWNzSW5mbzsNCisgICAgICBvdXRBcmNoaXZlLlF1ZXJ5SW50ZXJmYWNlKElJRF9JU2V0Q29tcHJlc3NDb2RlY3NJbmZvLCAodm9pZCAqKikmc2V0Q29tcHJlc3NDb2RlY3NJbmZvKTsNCisgICAgICBpZiAoc2V0Q29tcHJlc3NDb2RlY3NJbmZvKQ0KKyAgICAgIHsNCisgICAgICAgIFJJTk9LKHNldENvbXByZXNzQ29kZWNzSW5mby0+U2V0Q29tcHJlc3NDb2RlY3NJbmZvKGNvZGVjcykpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICAjZW5kaWYNCisgIH0NCisgIGlmIChvdXRBcmNoaXZlID09IDApDQorICAgIHRocm93IGtVcGRhdGVJc05vdFN1cG9vcnRlZDsNCisgIA0KKyAgTkZpbGVUaW1lVHlwZTo6RUVudW0gZmlsZVRpbWVUeXBlOw0KKyAgVUludDMyIHZhbHVlOw0KKyAgUklOT0sob3V0QXJjaGl2ZS0+R2V0RmlsZVRpbWVUeXBlKCZ2YWx1ZSkpOw0KKw0KKyAgc3dpdGNoICh2YWx1ZSkNCisgIHsNCisgICAgY2FzZSBORmlsZVRpbWVUeXBlOjprV2luZG93czoNCisgICAgY2FzZSBORmlsZVRpbWVUeXBlOjprVW5peDoNCisgICAgY2FzZSBORmlsZVRpbWVUeXBlOjprRE9TOg0KKyAgICAgIGZpbGVUaW1lVHlwZSA9IChORmlsZVRpbWVUeXBlOjpFRW51bSl2YWx1ZTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgfQ0KKw0KKyAgew0KKyAgICBjb25zdCBDQXJjSW5mb0V4ICZhcmNJbmZvID0gY29kZWNzLT5Gb3JtYXRzW2Zvcm1hdEluZGV4XTsNCisgICAgaWYgKG9wdGlvbnMuQWx0U3RyZWFtcy5WYWwgJiYgIWFyY0luZm8uRmxhZ3NfQWx0U3RyZWFtcygpKQ0KKyAgICAgIHJldHVybiBFX05PVElNUEw7DQorICAgIGlmIChvcHRpb25zLk50U2VjdXJpdHkuVmFsICYmICFhcmNJbmZvLkZsYWdzX050U2VjdXJlKCkpDQorICAgICAgcmV0dXJuIEVfTk9USU1QTDsNCisgIH0NCisNCisgIENSZWNvcmRWZWN0b3I8Q1VwZGF0ZVBhaXIyPiB1cGRhdGVQYWlyczI7DQorDQorICBVU3RyaW5nVmVjdG9yIG5ld05hbWVzOw0KKw0KKyAgaWYgKG9wdGlvbnMuUmVuYW1lUGFpcnMuU2l6ZSgpICE9IDApDQorICB7DQorICAgIEZPUl9WRUNUT1IgKGksIGFyY0l0ZW1zKQ0KKyAgICB7DQorICAgICAgY29uc3QgQ0FyY0l0ZW0gJmFpID0gYXJjSXRlbXNbaV07DQorICAgICAgYm9vbCBuZWVkUmVuYW1lID0gZmFsc2U7DQorICAgICAgVVN0cmluZyBkZXN0Ow0KKyAgICAgIGlmIChhaS5DZW5zb3JlZCkNCisgICAgICB7DQorICAgICAgICBGT1JfVkVDVE9SIChqLCBvcHRpb25zLlJlbmFtZVBhaXJzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBjb25zdCBDUmVuYW1lUGFpciAmcnAgPSBvcHRpb25zLlJlbmFtZVBhaXJzW2pdOw0KKyAgICAgICAgICBpZiAocnAuR2V0TmV3UGF0aChhaS5Jc0RpciwgYWkuTmFtZSwgZGVzdCkpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBuZWVkUmVuYW1lID0gdHJ1ZTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoYWkuSXNBbHRTdHJlYW0pDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgY29sb25Qb3MgPSBhaS5OYW1lLlJldmVyc2VGaW5kKCc6Jyk7DQorICAgICAgICAgICAgaW50IHNsYXNoUG9zUG9zID0gR2V0UmV2ZXJzZVNsYXNoUG9zKGFpLk5hbWUpOw0KKyAgICAgICAgICAgIGlmIChjb2xvblBvcyA+IHNsYXNoUG9zUG9zKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIFVTdHJpbmcgbWFpbk5hbWUgPSBhaS5OYW1lLkxlZnQoY29sb25Qb3MpOw0KKyAgICAgICAgICAgICAgLyoNCisgICAgICAgICAgICAgIGFjdHVhbGx5IHdlIG11c3QgaW1wcm92ZSB0aGF0IGNvZGUgdG8gc3VwcG9ydCBjYXNlcw0KKyAgICAgICAgICAgICAgd2l0aCBmb2xkZXIgcmVuYW1pbmcgbGlrZTogcm4gYXJjIGRpcjFcIGRpcjJcDQorICAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgICAgaWYgKHJwLkdldE5ld1BhdGgoZmFsc2UsIG1haW5OYW1lLCBkZXN0KSkNCisgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgbmVlZFJlbmFtZSA9IHRydWU7DQorICAgICAgICAgICAgICAgIGRlc3QgKz0gJzonOw0KKyAgICAgICAgICAgICAgICBkZXN0ICs9IGFpLk5hbWUuUHRyKGNvbG9uUG9zICsgMSk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBDVXBkYXRlUGFpcjIgdXAyOw0KKyAgICAgIHVwMi5TZXRBc19Ob0NoYW5nZUFyY0l0ZW0oYWkuSW5kZXhJblNlcnZlcik7DQorICAgICAgaWYgKG5lZWRSZW5hbWUpDQorICAgICAgew0KKyAgICAgICAgdXAyLk5ld1Byb3BzID0gdHJ1ZTsNCisgICAgICAgIFJJTk9LKGFyYy0+SXNJdGVtQW50aShpLCB1cDIuSXNBbnRpKSk7DQorICAgICAgICB1cDIuTmV3TmFtZUluZGV4ID0gbmV3TmFtZXMuQWRkKGRlc3QpOw0KKyAgICAgIH0NCisgICAgICB1cGRhdGVQYWlyczIuQWRkKHVwMik7DQorICAgIH0NCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgQ1JlY29yZFZlY3RvcjxDVXBkYXRlUGFpcj4gdXBkYXRlUGFpcnM7DQorICAgIEdldFVwZGF0ZVBhaXJJbmZvTGlzdChkaXJJdGVtcywgYXJjSXRlbXMsIGZpbGVUaW1lVHlwZSwgdXBkYXRlUGFpcnMpOyAvLyBtdXN0IGJlIGRvbmUgb25seSBvbmNlISEhDQorICAgIC8vIENVcGRhdGVQcm9kdWNlQ2FsbGJhY2tJbXAgdXBDYWxsYmFjaygmYXJjSXRlbXMsIGNhbGxiYWNrKTsNCisgICAgVXBkYXRlUHJvZHVjZSh1cGRhdGVQYWlycywgYWN0aW9uU2V0LCB1cGRhdGVQYWlyczIsIE5VTEwgLyogJnVwQ2FsbGJhY2sgKi8pOw0KKyAgfQ0KKw0KKyAgVUludDMyIG51bUZpbGVzID0gMDsNCisgIEZPUl9WRUNUT1IgKGksIHVwZGF0ZVBhaXJzMikNCisgICAgaWYgKHVwZGF0ZVBhaXJzMltpXS5OZXdEYXRhKQ0KKyAgICAgIG51bUZpbGVzKys7DQorICANCisgIFJJTk9LKGNhbGxiYWNrLT5TZXROdW1GaWxlcyhudW1GaWxlcykpOw0KKyAgDQorICBDQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrICp1cGRhdGVDYWxsYmFja1NwZWMgPSBuZXcgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazsNCisgIENNeUNvbVB0cjxJQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrPiB1cGRhdGVDYWxsYmFjayh1cGRhdGVDYWxsYmFja1NwZWMpOw0KKyAgDQorICB1cGRhdGVDYWxsYmFja1NwZWMtPlNoYXJlRm9yV3JpdGUgPSBvcHRpb25zLk9wZW5TaGFyZUZvcldyaXRlOw0KKyAgdXBkYXRlQ2FsbGJhY2tTcGVjLT5TdGRJbk1vZGUgPSBvcHRpb25zLlN0ZEluTW9kZTsNCisgIHVwZGF0ZUNhbGxiYWNrU3BlYy0+Q2FsbGJhY2sgPSBjYWxsYmFjazsNCisNCisgIGlmIChhcmMpDQorICB7DQorICAgIC8vIHdlIHNldCBBcmNoaXZlIHRvIGFsbG93IHRvIHRyYW5zZmVyIEdldFByb3BlcnR5IHJlcXVlc3RzIGJhY2sgdG8gRExMLg0KKyAgICB1cGRhdGVDYWxsYmFja1NwZWMtPkFyY2hpdmUgPSBhcmMtPkFyY2hpdmU7DQorICAgIHVwZGF0ZUNhbGxiYWNrU3BlYy0+R2V0UmF3UHJvcHMgPSBhcmMtPkdldFJhd1Byb3BzOw0KKyAgICB1cGRhdGVDYWxsYmFja1NwZWMtPkdldFJvb3RQcm9wcyA9IGFyYy0+R2V0Um9vdFByb3BzOw0KKyAgfQ0KKyAgDQorICB1cGRhdGVDYWxsYmFja1NwZWMtPkRpckl0ZW1zID0gJmRpckl0ZW1zOw0KKyAgdXBkYXRlQ2FsbGJhY2tTcGVjLT5QYXJlbnREaXJJdGVtID0gcGFyZW50RGlySXRlbTsNCisNCisgIHVwZGF0ZUNhbGxiYWNrU3BlYy0+U3RvcmVOdFNlY3VyaXR5ID0gb3B0aW9ucy5OdFNlY3VyaXR5LlZhbDsNCisgIHVwZGF0ZUNhbGxiYWNrU3BlYy0+U3RvcmVIYXJkTGlua3MgPSBvcHRpb25zLkhhcmRMaW5rcy5WYWw7DQorICB1cGRhdGVDYWxsYmFja1NwZWMtPlN0b3JlU3ltTGlua3MgPSBvcHRpb25zLlN5bUxpbmtzLlZhbDsNCisNCisgIHVwZGF0ZUNhbGxiYWNrU3BlYy0+QXJjSXRlbXMgPSAmYXJjSXRlbXM7DQorICB1cGRhdGVDYWxsYmFja1NwZWMtPlVwZGF0ZVBhaXJzID0gJnVwZGF0ZVBhaXJzMjsNCisNCisgIHVwZGF0ZUNhbGxiYWNrU3BlYy0+UHJvY2Vzc2VkSXRlbXNTdGF0dXNlcyA9IHByb2Nlc3NlZEl0ZW1zU3RhdHVzZXM7DQorDQorICBpZiAob3B0aW9ucy5SZW5hbWVQYWlycy5TaXplKCkgIT0gMCkNCisgICAgdXBkYXRlQ2FsbGJhY2tTcGVjLT5OZXdOYW1lcyA9ICZuZXdOYW1lczsNCisNCisgIENNeUNvbVB0cjxJT3V0U3RyZWFtPiBvdXRTZWVrU3RyZWFtOw0KKyAgQ015Q29tUHRyPElTZXF1ZW50aWFsT3V0U3RyZWFtPiBvdXRTdHJlYW07DQorDQorICBpZiAoIW9wdGlvbnMuU3RkT3V0TW9kZSkNCisgIHsNCisgICAgRlN0cmluZyBkaXJQcmVmaXg7DQorICAgIGlmICghR2V0T25seURpclByZWZpeCh1czJmcyhhcmNoaXZlUGF0aC5HZXRGaW5hbFBhdGgoKSksIGRpclByZWZpeCkpDQorICAgICAgdGhyb3cgMTQxNzE2MTsNCisgICAgQ3JlYXRlQ29tcGxleERpcihkaXJQcmVmaXgpOw0KKyAgfQ0KKw0KKyAgQ091dEZpbGVTdHJlYW0gKm91dFN0cmVhbVNwZWMgPSBOVUxMOw0KKyAgQ091dE11bHRpVm9sU3RyZWFtICp2b2xTdHJlYW1TcGVjID0gTlVMTDsNCisNCisgIGlmIChvcHRpb25zLlZvbHVtZXNTaXplcy5TaXplKCkgPT0gMCkNCisgIHsNCisgICAgaWYgKG9wdGlvbnMuU3RkT3V0TW9kZSkNCisgICAgICBvdXRTdHJlYW0gPSBuZXcgQ1N0ZE91dEZpbGVTdHJlYW07DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIG91dFN0cmVhbVNwZWMgPSBuZXcgQ091dEZpbGVTdHJlYW07DQorICAgICAgb3V0U2Vla1N0cmVhbSA9IG91dFN0cmVhbVNwZWM7DQorICAgICAgb3V0U3RyZWFtID0gb3V0U2Vla1N0cmVhbTsNCisgICAgICBib29sIGlzT0sgPSBmYWxzZTsNCisgICAgICBGU3RyaW5nIHJlYWxQYXRoOw0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKDEgPDwgMTYpOyBpKyspDQorICAgICAgew0KKyAgICAgICAgaWYgKGFyY2hpdmVQYXRoLlRlbXApDQorICAgICAgICB7DQorICAgICAgICAgIGlmIChpID4gMCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIEZDaGFyIHNbMTZdOw0KKyAgICAgICAgICAgIENvbnZlcnRVSW50MzJUb1N0cmluZyhpLCBzKTsNCisgICAgICAgICAgICBhcmNoaXZlUGF0aC5UZW1wUG9zdGZpeCA9IHM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcmVhbFBhdGggPSBhcmNoaXZlUGF0aC5HZXRUZW1wUGF0aCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICByZWFsUGF0aCA9IHVzMmZzKGFyY2hpdmVQYXRoLkdldEZpbmFsUGF0aCgpKTsNCisgICAgICAgIGlmIChvdXRTdHJlYW1TcGVjLT5DcmVhdGUocmVhbFBhdGgsIGZhbHNlKSkNCisgICAgICAgIHsNCisgICAgICAgICAgdGVtcEZpbGVzLlBhdGhzLkFkZChyZWFsUGF0aCk7DQorICAgICAgICAgIGlzT0sgPSB0cnVlOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmICg6OkdldExhc3RFcnJvcigpICE9IEVSUk9SX0ZJTEVfRVhJU1RTKQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGlmICghYXJjaGl2ZVBhdGguVGVtcCkNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmICghaXNPSykNCisgICAgICB7DQorICAgICAgICBlcnJvckluZm8uU3lzdGVtRXJyb3IgPSA6OkdldExhc3RFcnJvcigpOw0KKyAgICAgICAgZXJyb3JJbmZvLkZpbGVOYW1lID0gcmVhbFBhdGg7DQorICAgICAgICBlcnJvckluZm8uTWVzc2FnZSA9IEwiNy1aaXAgY2Fubm90IG9wZW4gZmlsZSI7DQorICAgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBpZiAob3B0aW9ucy5TdGRPdXRNb2RlKQ0KKyAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgIGlmIChhcmMgJiYgYXJjLT5HZXRHbG9iYWxPZmZzZXQoKSA+IDApDQorICAgICAgcmV0dXJuIEVfTk9USU1QTDsNCisgICAgICANCisgICAgdm9sU3RyZWFtU3BlYyA9IG5ldyBDT3V0TXVsdGlWb2xTdHJlYW07DQorICAgIG91dFNlZWtTdHJlYW0gPSB2b2xTdHJlYW1TcGVjOw0KKyAgICBvdXRTdHJlYW0gPSBvdXRTZWVrU3RyZWFtOw0KKyAgICB2b2xTdHJlYW1TcGVjLT5TaXplcyA9IG9wdGlvbnMuVm9sdW1lc1NpemVzOw0KKyAgICB2b2xTdHJlYW1TcGVjLT5QcmVmaXggPSB1czJmcyhhcmNoaXZlUGF0aC5HZXRGaW5hbFZvbFBhdGgoKSArIEwiLiIpOw0KKyAgICB2b2xTdHJlYW1TcGVjLT5UZW1wRmlsZXMgPSAmdGVtcEZpbGVzOw0KKyAgICB2b2xTdHJlYW1TcGVjLT5Jbml0KCk7DQorDQorICAgIC8qDQorICAgIHVwZGF0ZUNhbGxiYWNrU3BlYy0+Vm9sdW1lc1NpemVzID0gdm9sdW1lc1NpemVzOw0KKyAgICB1cGRhdGVDYWxsYmFja1NwZWMtPlZvbE5hbWUgPSBhcmNoaXZlUGF0aC5QcmVmaXggKyBhcmNoaXZlUGF0aC5OYW1lOw0KKyAgICBpZiAoIWFyY2hpdmVQYXRoLlZvbEV4dGVuc2lvbi5Jc0VtcHR5KCkpDQorICAgICAgdXBkYXRlQ2FsbGJhY2tTcGVjLT5Wb2xFeHQgPSBVU3RyaW5nKEwnLicpICsgYXJjaGl2ZVBhdGguVm9sRXh0ZW5zaW9uOw0KKyAgICAqLw0KKyAgfQ0KKw0KKyAgUklOT0soU2V0UHJvcGVydGllcyhvdXRBcmNoaXZlLCBvcHRpb25zLk1ldGhvZE1vZGUuUHJvcGVydGllcykpOw0KKw0KKyAgaWYgKG9wdGlvbnMuU2Z4TW9kZSkNCisgIHsNCisgICAgQ0luRmlsZVN0cmVhbSAqc2Z4U3RyZWFtU3BlYyA9IG5ldyBDSW5GaWxlU3RyZWFtOw0KKyAgICBDTXlDb21QdHI8SUluU3RyZWFtPiBzZnhTdHJlYW0oc2Z4U3RyZWFtU3BlYyk7DQorICAgIGlmICghc2Z4U3RyZWFtU3BlYy0+T3BlbihvcHRpb25zLlNmeE1vZHVsZSkpDQorICAgIHsNCisgICAgICBlcnJvckluZm8uU3lzdGVtRXJyb3IgPSA6OkdldExhc3RFcnJvcigpOw0KKyAgICAgIGVycm9ySW5mby5NZXNzYWdlID0gTCI3LVppcCBjYW5ub3Qgb3BlbiBTRlggbW9kdWxlIjsNCisgICAgICBlcnJvckluZm8uRmlsZU5hbWUgPSBvcHRpb25zLlNmeE1vZHVsZTsNCisgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICB9DQorDQorICAgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gc2Z4T3V0U3RyZWFtOw0KKyAgICBDT3V0RmlsZVN0cmVhbSAqb3V0U3RyZWFtU3BlYyA9IE5VTEw7DQorICAgIGlmIChvcHRpb25zLlZvbHVtZXNTaXplcy5TaXplKCkgPT0gMCkNCisgICAgICBzZnhPdXRTdHJlYW0gPSBvdXRTdHJlYW07DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIG91dFN0cmVhbVNwZWMgPSBuZXcgQ091dEZpbGVTdHJlYW07DQorICAgICAgc2Z4T3V0U3RyZWFtID0gb3V0U3RyZWFtU3BlYzsNCisgICAgICBGU3RyaW5nIHJlYWxQYXRoID0gdXMyZnMoYXJjaGl2ZVBhdGguR2V0RmluYWxQYXRoKCkpOw0KKyAgICAgIGlmICghb3V0U3RyZWFtU3BlYy0+Q3JlYXRlKHJlYWxQYXRoLCBmYWxzZSkpDQorICAgICAgew0KKyAgICAgICAgZXJyb3JJbmZvLlN5c3RlbUVycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsNCisgICAgICAgIGVycm9ySW5mby5GaWxlTmFtZSA9IHJlYWxQYXRoOw0KKyAgICAgICAgZXJyb3JJbmZvLk1lc3NhZ2UgPSBMIjctWmlwIGNhbm5vdCBvcGVuIGZpbGUiOw0KKyAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICB9DQorICAgIH0NCisgICAgUklOT0soTkNvbXByZXNzOjpDb3B5U3RyZWFtKHNmeFN0cmVhbSwgc2Z4T3V0U3RyZWFtLCBOVUxMKSk7DQorICAgIGlmIChvdXRTdHJlYW1TcGVjKQ0KKyAgICB7DQorICAgICAgUklOT0sob3V0U3RyZWFtU3BlYy0+Q2xvc2UoKSk7DQorICAgIH0NCisgIH0NCisNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gdGFpbFN0cmVhbTsNCisNCisgIGlmIChvcHRpb25zLlNmeE1vZGUgfHwgIWFyYyB8fCBhcmMtPkFyY1N0cmVhbU9mZnNldCA9PSAwKQ0KKyAgICB0YWlsU3RyZWFtID0gb3V0U3RyZWFtOw0KKyAgZWxzZQ0KKyAgew0KKyAgICAvLyBJbnQ2NCBnbG9iYWxPZmZzZXQgPSBhcmMtPkdldEdsb2JhbE9mZnNldCgpOw0KKyAgICBSSU5PSyhhcmMtPkluU3RyZWFtLT5TZWVrKDAsIFNUUkVBTV9TRUVLX1NFVCwgTlVMTCkpOw0KKyAgICBSSU5PSyhOQ29tcHJlc3M6OkNvcHlTdHJlYW1fRXhhY3RTaXplKGFyYy0+SW5TdHJlYW0sIG91dFN0cmVhbSwgYXJjLT5BcmNTdHJlYW1PZmZzZXQsIE5VTEwpKTsNCisgICAgaWYgKG9wdGlvbnMuU3RkT3V0TW9kZSkNCisgICAgICB0YWlsU3RyZWFtID0gb3V0U3RyZWFtOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBDVGFpbE91dFN0cmVhbSAqdGFpbFN0cmVhbVNwZWMgPSBuZXcgQ1RhaWxPdXRTdHJlYW07DQorICAgICAgdGFpbFN0cmVhbSA9IHRhaWxTdHJlYW1TcGVjOw0KKyAgICAgIHRhaWxTdHJlYW1TcGVjLT5TdHJlYW0gPSBvdXRTZWVrU3RyZWFtOw0KKyAgICAgIHRhaWxTdHJlYW1TcGVjLT5PZmZzZXQgPSBhcmMtPkFyY1N0cmVhbU9mZnNldDsNCisgICAgICB0YWlsU3RyZWFtU3BlYy0+SW5pdCgpOw0KKyAgICB9DQorICB9DQorDQorDQorICBIUkVTVUxUIHJlc3VsdCA9IG91dEFyY2hpdmUtPlVwZGF0ZUl0ZW1zKHRhaWxTdHJlYW0sIHVwZGF0ZVBhaXJzMi5TaXplKCksIHVwZGF0ZUNhbGxiYWNrKTsNCisgIGNhbGxiYWNrLT5GaW5pbGl6ZSgpOw0KKyAgUklOT0socmVzdWx0KTsNCisNCisNCisgIGlmIChvcHRpb25zLlNldEFyY01UaW1lKQ0KKyAgew0KKyAgICBGSUxFVElNRSBmdDsNCisgICAgZnQuZHdMb3dEYXRlVGltZSA9IDA7DQorICAgIGZ0LmR3SGlnaERhdGVUaW1lID0gMDsNCisgICAgRk9SX1ZFQ1RPUiAoaSwgdXBkYXRlUGFpcnMyKQ0KKyAgICB7DQorICAgICAgQ1VwZGF0ZVBhaXIyICZwYWlyMiA9IHVwZGF0ZVBhaXJzMltpXTsNCisgICAgICBjb25zdCBGSUxFVElNRSAqZnQyID0gTlVMTDsNCisgICAgICBpZiAocGFpcjIuTmV3UHJvcHMgJiYgcGFpcjIuRGlySW5kZXggPj0gMCkNCisgICAgICAgIGZ0MiA9ICZkaXJJdGVtcy5JdGVtc1twYWlyMi5EaXJJbmRleF0uTVRpbWU7DQorICAgICAgZWxzZSBpZiAocGFpcjIuVXNlQXJjUHJvcHMgJiYgcGFpcjIuQXJjSW5kZXggPj0gMCkNCisgICAgICAgIGZ0MiA9ICZhcmNJdGVtc1twYWlyMi5BcmNJbmRleF0uTVRpbWU7DQorICAgICAgaWYgKGZ0MikNCisgICAgICB7DQorICAgICAgICBpZiAoOjpDb21wYXJlRmlsZVRpbWUoJmZ0LCBmdDIpIDwgMCkNCisgICAgICAgICAgZnQgPSAqZnQyOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoZnQuZHdMb3dEYXRlVGltZSAhPSAwIHx8IGZ0LmR3SGlnaERhdGVUaW1lICE9IDApDQorICAgIHsNCisgICAgICBpZiAob3V0U3RyZWFtU3BlYykNCisgICAgICAgIG91dFN0cmVhbVNwZWMtPlNldE1UaW1lKCZmdCk7DQorICAgICAgZWxzZSBpZiAodm9sU3RyZWFtU3BlYykNCisgICAgICAgIHZvbFN0cmVhbVNwZWMtPlNldE1UaW1lKCZmdCk7Ow0KKyAgICB9DQorICB9DQorDQorICBpZiAob3V0U3RyZWFtU3BlYykNCisgICAgcmVzdWx0ID0gb3V0U3RyZWFtU3BlYy0+Q2xvc2UoKTsNCisgIGVsc2UgaWYgKHZvbFN0cmVhbVNwZWMpDQorICAgIHJlc3VsdCA9IHZvbFN0cmVhbVNwZWMtPkNsb3NlKCk7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisNCitzdGF0aWMgSFJFU1VMVCBFbnVtZXJhdGVJbkFyY2hpdmVJdGVtcygNCisgICAgLy8gYm9vbCBzdG9yZVN0cmVhbXNNb2RlLA0KKyAgICBjb25zdCBOV2lsZGNhcmQ6OkNDZW5zb3IgJmNlbnNvciwNCisgICAgY29uc3QgQ0FyYyAmYXJjLA0KKyAgICBDT2JqZWN0VmVjdG9yPENBcmNJdGVtPiAmYXJjSXRlbXMpDQorew0KKyAgYXJjSXRlbXMuQ2xlYXIoKTsNCisgIFVJbnQzMiBudW1JdGVtczsNCisgIElJbkFyY2hpdmUgKmFyY2hpdmUgPSBhcmMuQXJjaGl2ZTsNCisgIFJJTk9LKGFyY2hpdmUtPkdldE51bWJlck9mSXRlbXMoJm51bUl0ZW1zKSk7DQorICBhcmNJdGVtcy5DbGVhckFuZFJlc2VydmUobnVtSXRlbXMpOw0KKyAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKQ0KKyAgew0KKyAgICBDQXJjSXRlbSBhaTsNCisNCisgICAgUklOT0soYXJjLkdldEl0ZW1QYXRoKGksIGFpLk5hbWUpKTsNCisgICAgUklOT0soQXJjaGl2ZV9Jc0l0ZW1fRm9sZGVyKGFyY2hpdmUsIGksIGFpLklzRGlyKSk7DQorICAgIFJJTk9LKEFyY2hpdmVfSXNJdGVtX0FsdFN0cmVhbShhcmNoaXZlLCBpLCBhaS5Jc0FsdFN0cmVhbSkpOw0KKyAgICAvKg0KKyAgICBpZiAoIXN0b3JlU3RyZWFtc01vZGUgJiYgYWkuSXNBbHRTdHJlYW0pDQorICAgICAgY29udGludWU7DQorICAgICovDQorICAgIGFpLkNlbnNvcmVkID0gY2Vuc29yLkNoZWNrUGF0aChhaS5Jc0FsdFN0cmVhbSwgYWkuTmFtZSwgIWFpLklzRGlyKTsNCisgICAgUklOT0soYXJjLkdldEl0ZW1NVGltZShpLCBhaS5NVGltZSwgYWkuTVRpbWVEZWZpbmVkKSk7DQorICAgIFJJTk9LKGFyYy5HZXRJdGVtU2l6ZShpLCBhaS5TaXplLCBhaS5TaXplRGVmaW5lZCkpOw0KKw0KKyAgICB7DQorICAgICAgQ1Byb3BWYXJpYW50IHByb3A7DQorICAgICAgUklOT0soYXJjaGl2ZS0+R2V0UHJvcGVydHkoaSwga3BpZFRpbWVUeXBlLCAmcHJvcCkpOw0KKyAgICAgIGlmIChwcm9wLnZ0ID09IFZUX1VJNCkNCisgICAgICB7DQorICAgICAgICBhaS5UaW1lVHlwZSA9IChpbnQpKE5GaWxlVGltZVR5cGU6OkVFbnVtKXByb3AudWxWYWw7DQorICAgICAgICBzd2l0Y2ggKGFpLlRpbWVUeXBlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBjYXNlIE5GaWxlVGltZVR5cGU6OmtXaW5kb3dzOg0KKyAgICAgICAgICBjYXNlIE5GaWxlVGltZVR5cGU6OmtVbml4Og0KKyAgICAgICAgICBjYXNlIE5GaWxlVGltZVR5cGU6OmtET1M6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisNCisgICAgYWkuSW5kZXhJblNlcnZlciA9IGk7DQorICAgIGFyY0l0ZW1zLkFkZEluUmVzZXJ2ZWQoYWkpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0cnVjdCBDRW51bURpckl0ZW1VcGRhdGVDYWxsYmFjazogcHVibGljIElFbnVtRGlySXRlbUNhbGxiYWNrDQorew0KKyAgSVVwZGF0ZUNhbGxiYWNrVUkyICpDYWxsYmFjazsNCisgIEhSRVNVTFQgU2NhblByb2dyZXNzKFVJbnQ2NCBudW1Gb2xkZXJzLCBVSW50NjQgbnVtRmlsZXMsIFVJbnQ2NCB0b3RhbFNpemUsIGNvbnN0IHdjaGFyX3QgKnBhdGgsIGJvb2wgaXNEaXIpDQorICB7DQorICAgIHJldHVybiBDYWxsYmFjay0+U2NhblByb2dyZXNzKG51bUZvbGRlcnMsIG51bUZpbGVzLCB0b3RhbFNpemUsIHBhdGgsIGlzRGlyKTsNCisgIH0NCit9Ow0KKw0KKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoVU5ERVJfQ0UpDQorDQorI2luY2x1ZGUgPG1hcGkuaD4NCisNCisjZW5kaWYNCisNCitzdHJ1Y3QgQ1JlZlNvcnRQYWlyDQorew0KKyAgaW50IExlbjsNCisgIGludCBJbmRleDsNCit9Ow0KKw0KKyNkZWZpbmUgUklOT1ooeCkgeyBpbnQgX190dCA9ICh4KTsgaWYgKF9fdHQgIT0gMCkgcmV0dXJuIF9fdHQ7IH0NCisNCitzdGF0aWMgaW50IENvbXBhcmVSZWZTb3J0UGFpcihjb25zdCBDUmVmU29ydFBhaXIgKmExLCBjb25zdCBDUmVmU29ydFBhaXIgKmEyLCB2b2lkICopDQorew0KKyAgUklOT1ooLU15Q29tcGFyZShhMS0+TGVuLCBhMi0+TGVuKSk7DQorICByZXR1cm4gTXlDb21wYXJlKGExLT5JbmRleCwgYTItPkluZGV4KTsNCit9DQorDQorc3RhdGljIGludCBHZXROdW1TbGFzaGVzKGNvbnN0IEZDaGFyICpzKQ0KK3sNCisgIGZvciAoaW50IG51bVNsYXNoZXMgPSAwOzspDQorICB7DQorICAgIEZDaGFyIGMgPSAqcysrOw0KKyAgICBpZiAoYyA9PSAwKQ0KKyAgICAgIHJldHVybiBudW1TbGFzaGVzOw0KKyAgICBpZiAoDQorICAgICAgICAjaWZkZWYgX1dJTjMyDQorICAgICAgICBjID09IEZURVhUKCdcXCcpIHx8DQorICAgICAgICAjZW5kaWYNCisgICAgICAgIGMgPT0gRlRFWFQoJy8nKSkNCisgICAgICBudW1TbGFzaGVzKys7DQorICB9DQorfQ0KKw0KKyNpZmRlZiBfV0lOMzINCit2b2lkIENvbnZlcnRUb0xvbmdOYW1lcyhOV2lsZGNhcmQ6OkNDZW5zb3IgJmNlbnNvcik7DQorI2VuZGlmDQorDQorSFJFU1VMVCBVcGRhdGVBcmNoaXZlKA0KKyAgICBDQ29kZWNzICpjb2RlY3MsDQorICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q09wZW5UeXBlPiAmdHlwZXMsDQorICAgIGNvbnN0IFVTdHJpbmcgJmNtZEFyY1BhdGgyLA0KKyAgICBOV2lsZGNhcmQ6OkNDZW5zb3IgJmNlbnNvciwNCisgICAgQ1VwZGF0ZU9wdGlvbnMgJm9wdGlvbnMsDQorICAgIENVcGRhdGVFcnJvckluZm8gJmVycm9ySW5mbywNCisgICAgSU9wZW5DYWxsYmFja1VJICpvcGVuQ2FsbGJhY2ssDQorICAgIElVcGRhdGVDYWxsYmFja1VJMiAqY2FsbGJhY2ssDQorICAgIGJvb2wgbmVlZFNldFBhdGgpDQorew0KKyAgaWYgKG9wdGlvbnMuU3RkT3V0TW9kZSAmJiBvcHRpb25zLkVNYWlsTW9kZSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisNCisgIGlmICh0eXBlcy5TaXplKCkgPiAxKQ0KKyAgICByZXR1cm4gRV9OT1RJTVBMOw0KKw0KKyAgYm9vbCByZW5hbWVNb2RlID0gIW9wdGlvbnMuUmVuYW1lUGFpcnMuSXNFbXB0eSgpOw0KKyAgaWYgKHJlbmFtZU1vZGUpDQorICB7DQorICAgIGlmIChvcHRpb25zLkNvbW1hbmRzLlNpemUoKSAhPSAxKQ0KKyAgICAgIHJldHVybiBFX0ZBSUw7DQorICB9DQorDQorICBpZiAob3B0aW9ucy5EZWxldGVBZnRlckNvbXByZXNzaW5nKQ0KKyAgew0KKyAgICBpZiAob3B0aW9ucy5Db21tYW5kcy5TaXplKCkgIT0gMSkNCisgICAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgICBjb25zdCBDQWN0aW9uU2V0ICZhcyA9IG9wdGlvbnMuQ29tbWFuZHNbMF0uQWN0aW9uU2V0Ow0KKyAgICBmb3IgKGludCBpID0gMjsgaSA8IE5QYWlyU3RhdGU6OmtOdW1WYWx1ZXM7IGkrKykNCisgICAgICBpZiAoYXMuU3RhdGVBY3Rpb25zW2ldICE9IE5QYWlyQWN0aW9uOjprQ29tcHJlc3MpDQorICAgICAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgfQ0KKw0KKyAgY2Vuc29yLkFkZFBhdGhzVG9DZW5zb3Iob3B0aW9ucy5QYXRoTW9kZSk7DQorICAjaWZkZWYgX1dJTjMyDQorICBDb252ZXJ0VG9Mb25nTmFtZXMoY2Vuc29yKTsNCisgICNlbmRpZg0KKyAgY2Vuc29yLkV4dGVuZEV4Y2x1ZGUoKTsNCisNCisgIA0KKyAgaWYgKG9wdGlvbnMuVm9sdW1lc1NpemVzLlNpemUoKSA+IDAgJiYgKG9wdGlvbnMuRU1haWxNb2RlIC8qIHx8IG9wdGlvbnMuU2Z4TW9kZSAqLykpDQorICAgIHJldHVybiBFX05PVElNUEw7DQorDQorICBpZiAob3B0aW9ucy5TZnhNb2RlKQ0KKyAgew0KKyAgICBDUHJvcGVydHkgcHJvcGVydHk7DQorICAgIHByb3BlcnR5Lk5hbWUgPSBMInJzZngiOw0KKyAgICBwcm9wZXJ0eS5WYWx1ZSA9IEwib24iOw0KKyAgICBvcHRpb25zLk1ldGhvZE1vZGUuUHJvcGVydGllcy5BZGQocHJvcGVydHkpOw0KKyAgICBpZiAob3B0aW9ucy5TZnhNb2R1bGUuSXNFbXB0eSgpKQ0KKyAgICB7DQorICAgICAgZXJyb3JJbmZvLk1lc3NhZ2UgPSBMIlNGWCBmaWxlIGlzIG5vdCBzcGVjaWZpZWQiOw0KKyAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgIH0NCisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOw0KKyAgICBpZiAob3B0aW9ucy5TZnhNb2R1bGUuRmluZChGQ0hBUl9QQVRIX1NFUEFSQVRPUikgPCAwKQ0KKyAgICB7DQorICAgICAgY29uc3QgRlN0cmluZyBmdWxsTmFtZSA9IE5ETEw6OkdldE1vZHVsZURpclByZWZpeCgpICsgb3B0aW9ucy5TZnhNb2R1bGU7DQorICAgICAgaWYgKE5GaW5kOjpEb2VzRmlsZUV4aXN0KGZ1bGxOYW1lKSkNCisgICAgICB7DQorICAgICAgICBvcHRpb25zLlNmeE1vZHVsZSA9IGZ1bGxOYW1lOw0KKyAgICAgICAgZm91bmQgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIWZvdW5kKQ0KKyAgICB7DQorICAgICAgaWYgKCFORmluZDo6RG9lc0ZpbGVFeGlzdChvcHRpb25zLlNmeE1vZHVsZSkpDQorICAgICAgew0KKyAgICAgICAgZXJyb3JJbmZvLlN5c3RlbUVycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsNCisgICAgICAgIGVycm9ySW5mby5NZXNzYWdlID0gTCI3LVppcCBjYW5ub3QgZmluZCBzcGVjaWZpZWQgU0ZYIG1vZHVsZSI7DQorICAgICAgICBlcnJvckluZm8uRmlsZU5hbWUgPSBvcHRpb25zLlNmeE1vZHVsZTsNCisgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBDQXJjaGl2ZUxpbmsgYXJjTGluazsNCisNCisgIA0KKyAgaWYgKG5lZWRTZXRQYXRoKQ0KKyAgew0KKyAgICBpZiAoIW9wdGlvbnMuSW5pdEZvcm1hdEluZGV4KGNvZGVjcywgdHlwZXMsIGNtZEFyY1BhdGgyKSB8fA0KKyAgICAgICAgIW9wdGlvbnMuU2V0QXJjUGF0aChjb2RlY3MsIGNtZEFyY1BhdGgyKSkNCisgICAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgfQ0KKyAgVVN0cmluZyBhcmNQYXRoID0gb3B0aW9ucy5BcmNoaXZlUGF0aC5HZXRGaW5hbFBhdGgoKTsNCisNCisgIGlmIChjbWRBcmNQYXRoMi5Jc0VtcHR5KCkpDQorICB7DQorICAgIGlmIChvcHRpb25zLk1ldGhvZE1vZGUuVHlwZS5Gb3JtYXRJbmRleCA8IDApDQorICAgICAgdGhyb3cgInR5cGUgb2YgYXJjaGl2ZSBpcyBub3Qgc3BlY2lmaWVkIjsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgTkZpbmQ6OkNGaWxlSW5mbyBmaTsNCisgICAgaWYgKCFmaS5GaW5kKHVzMmZzKGFyY1BhdGgpKSkNCisgICAgew0KKyAgICAgIGlmIChyZW5hbWVNb2RlKQ0KKyAgICAgICAgdGhyb3cgImNhbid0IGZpbmQgYXJjaGl2ZSI7Ow0KKyAgICAgIGlmIChvcHRpb25zLk1ldGhvZE1vZGUuVHlwZS5Gb3JtYXRJbmRleCA8IDApDQorICAgICAgew0KKyAgICAgICAgaWYgKCFvcHRpb25zLlNldEFyY1BhdGgoY29kZWNzLCBjbWRBcmNQYXRoMikpDQorICAgICAgICAgIHJldHVybiBFX05PVElNUEw7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGlmIChmaS5Jc0RpcigpKQ0KKyAgICAgICAgdGhyb3cgInRoZXJlIGlzIG5vIHN1Y2ggYXJjaGl2ZSI7DQorICAgICAgaWYgKGZpLklzRGV2aWNlKQ0KKyAgICAgICAgcmV0dXJuIEVfTk9USU1QTDsNCisgICAgICBpZiAob3B0aW9ucy5Wb2x1bWVzU2l6ZXMuU2l6ZSgpID4gMCkNCisgICAgICAgIHJldHVybiBFX05PVElNUEw7DQorICAgICAgQ09iamVjdFZlY3RvcjxDT3BlblR5cGU+IHR5cGVzOw0KKyAgICAgIC8vIGNoYW5nZSBpdC4NCisgICAgICBpZiAob3B0aW9ucy5NZXRob2RNb2RlLlR5cGVfRGVmaW5lZCkNCisgICAgICAgIHR5cGVzLkFkZChvcHRpb25zLk1ldGhvZE1vZGUuVHlwZSk7DQorICAgICAgLy8gV2UgbmVlZCB0byBzZXQgUHJvcGVydGllcyB0byBvcGVuIGFyY2hpdmUgb25seSBpbiBzb21lIGNhc2VzIChXSU0gYXJjaGl2ZXMpLg0KKw0KKyAgICAgIENJbnRWZWN0b3IgZXhjbDsNCisgICAgICBDT3Blbk9wdGlvbnMgb3A7DQorICAgICAgI2lmbmRlZiBfU0ZYDQorICAgICAgb3AucHJvcHMgPSAmb3B0aW9ucy5NZXRob2RNb2RlLlByb3BlcnRpZXM7DQorICAgICAgI2VuZGlmDQorICAgICAgb3AuY29kZWNzID0gY29kZWNzOw0KKyAgICAgIG9wLnR5cGVzID0gJnR5cGVzOw0KKyAgICAgIG9wLmV4Y2x1ZGVkRm9ybWF0cyA9ICZleGNsOw0KKyAgICAgIG9wLnN0ZEluTW9kZSA9IGZhbHNlOw0KKyAgICAgIG9wLnN0cmVhbSA9IE5VTEw7DQorICAgICAgb3AuZmlsZVBhdGggPSBhcmNQYXRoOw0KKw0KKyAgICAgIEhSRVNVTFQgcmVzdWx0ID0gYXJjTGluay5PcGVuMihvcCwgb3BlbkNhbGxiYWNrKTsNCisNCisgICAgICBpZiAocmVzdWx0ID09IEVfQUJPUlQpDQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIA0KKyAgICAgIGNvbnN0IHdjaGFyX3QgKmVycm9yQXJjVHlwZSA9IE5VTEw7DQorICAgICAgaWYgKGFyY0xpbmsuTm9uT3Blbl9FcnJvckluZm8uRXJyb3JGb3JtYXRJbmRleCA+IDApDQorICAgICAgICBlcnJvckFyY1R5cGUgPSBjb2RlY3MtPkZvcm1hdHNbYXJjTGluay5Ob25PcGVuX0Vycm9ySW5mby5FcnJvckZvcm1hdEluZGV4XS5OYW1lOw0KKyAgICAgIFJJTk9LKGNhbGxiYWNrLT5PcGVuUmVzdWx0KGFyY1BhdGgsIHJlc3VsdCwgZXJyb3JBcmNUeXBlKSk7DQorICAgICAgLyoNCisgICAgICBpZiAocmVzdWx0ID09IFNfRkFMU0UpDQorICAgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICAgICovDQorICAgICAgUklOT0socmVzdWx0KTsNCisgICAgICBpZiAoYXJjTGluay5Wb2x1bWVQYXRocy5TaXplKCkgPiAxKQ0KKyAgICAgIHsNCisgICAgICAgIGVycm9ySW5mby5TeXN0ZW1FcnJvciA9IChEV09SRClFX05PVElNUEw7DQorICAgICAgICBlcnJvckluZm8uTWVzc2FnZSA9IEwiVXBkYXRpbmcgZm9yIG11bHRpdm9sdW1lIGFyY2hpdmVzIGlzIG5vdCBpbXBsZW1lbnRlZCI7DQorICAgICAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBDQXJjICZhcmMgPSBhcmNMaW5rLkFyY3MuQmFjaygpOw0KKyAgICAgIGFyYy5NVGltZURlZmluZWQgPSAhZmkuSXNEZXZpY2U7DQorICAgICAgYXJjLk1UaW1lID0gZmkuTVRpbWU7DQorDQorICAgICAgaWYgKGFyYy5FcnJvckluZm8uVGhlcmVJc1RhaWwpDQorICAgICAgew0KKyAgICAgICAgZXJyb3JJbmZvLlN5c3RlbUVycm9yID0gKERXT1JEKUVfTk9USU1QTDsNCisgICAgICAgIGVycm9ySW5mby5NZXNzYWdlID0gTCJUaGVyZSBpcyBzb21lIGRhdGEgYmxvY2sgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZSI7DQorICAgICAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgICAgIH0NCisgICAgICBpZiAob3B0aW9ucy5NZXRob2RNb2RlLlR5cGUuRm9ybWF0SW5kZXggPCAwKQ0KKyAgICAgIHsNCisgICAgICAgIG9wdGlvbnMuTWV0aG9kTW9kZS5UeXBlLkZvcm1hdEluZGV4ID0gYXJjTGluay5HZXRBcmMoKS0+Rm9ybWF0SW5kZXg7DQorICAgICAgICBpZiAoIW9wdGlvbnMuU2V0QXJjUGF0aChjb2RlY3MsIGNtZEFyY1BhdGgyKSkNCisgICAgICAgICAgcmV0dXJuIEVfTk9USU1QTDsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIGlmIChvcHRpb25zLk1ldGhvZE1vZGUuVHlwZS5Gb3JtYXRJbmRleCA8IDApDQorICB7DQorICAgIG9wdGlvbnMuTWV0aG9kTW9kZS5UeXBlLkZvcm1hdEluZGV4ID0gY29kZWNzLT5GaW5kRm9ybWF0Rm9yQXJjaGl2ZVR5cGUoa0RlZmF1bHRBcmNUeXBlKTsNCisgICAgaWYgKG9wdGlvbnMuTWV0aG9kTW9kZS5UeXBlLkZvcm1hdEluZGV4IDwgMCkNCisgICAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgfQ0KKw0KKyAgYm9vbCB0aGVyZUlzSW5BcmNoaXZlID0gYXJjTGluay5Jc09wZW47DQorICBpZiAoIXRoZXJlSXNJbkFyY2hpdmUgJiYgcmVuYW1lTW9kZSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisNCisgIENEaXJJdGVtcyBkaXJJdGVtczsNCisgIENEaXJJdGVtIHBhcmVudERpckl0ZW07DQorICBDRGlySXRlbSAqcGFyZW50RGlySXRlbV9QdHIgPSBOVUxMOw0KKyAgDQorICAvKg0KKyAgRlN0cmluZ1ZlY3RvciByZXF1ZXN0ZWRQYXRoczsNCisgIEZTdHJpbmdWZWN0b3IgKnJlcXVlc3RlZFBhdGhzX1B0ciA9IE5VTEw7DQorICBpZiAob3B0aW9ucy5EZWxldGVBZnRlckNvbXByZXNzaW5nKQ0KKyAgICByZXF1ZXN0ZWRQYXRoc19QdHIgPSAmcmVxdWVzdGVkUGF0aHM7DQorICAqLw0KKw0KKyAgaWYgKG9wdGlvbnMuU3RkSW5Nb2RlKQ0KKyAgew0KKyAgICBDRGlySXRlbSBkaTsNCisgICAgZGkuTmFtZSA9IG9wdGlvbnMuU3RkSW5GaWxlTmFtZTsNCisgICAgZGkuU2l6ZSA9IChVSW50NjQpKEludDY0KS0xOw0KKyAgICBkaS5BdHRyaWIgPSAwOw0KKyAgICBOVGltZTo6R2V0Q3VyVXRjRmlsZVRpbWUoZGkuTVRpbWUpOw0KKyAgICBkaS5DVGltZSA9IGRpLkFUaW1lID0gZGkuTVRpbWU7DQorICAgIGRpckl0ZW1zLkl0ZW1zLkFkZChkaSk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIGJvb2wgbmVlZFNjYW5uaW5nID0gZmFsc2U7DQorICAgIGlmICghcmVuYW1lTW9kZSkNCisgICAgRk9SX1ZFQ1RPUiAoaSwgb3B0aW9ucy5Db21tYW5kcykNCisgICAgICBpZiAob3B0aW9ucy5Db21tYW5kc1tpXS5BY3Rpb25TZXQuTmVlZFNjYW5uaW5nKCkpDQorICAgICAgICBuZWVkU2Nhbm5pbmcgPSB0cnVlOw0KKyAgICBpZiAobmVlZFNjYW5uaW5nKQ0KKyAgICB7DQorICAgICAgQ0VudW1EaXJJdGVtVXBkYXRlQ2FsbGJhY2sgZW51bUNhbGxiYWNrOw0KKyAgICAgIGVudW1DYWxsYmFjay5DYWxsYmFjayA9IGNhbGxiYWNrOw0KKyAgICAgIFJJTk9LKGNhbGxiYWNrLT5TdGFydFNjYW5uaW5nKCkpOw0KKw0KKyAgICAgIGRpckl0ZW1zLlN5bUxpbmtzID0gb3B0aW9ucy5TeW1MaW5rcy5WYWw7DQorDQorICAgICAgI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkNCisgICAgICBkaXJJdGVtcy5SZWFkU2VjdXJlID0gb3B0aW9ucy5OdFNlY3VyaXR5LlZhbDsNCisgICAgICAjZW5kaWYNCisNCisgICAgICBkaXJJdGVtcy5TY2FuQWx0U3RyZWFtcyA9IG9wdGlvbnMuQWx0U3RyZWFtcy5WYWw7DQorICAgICAgSFJFU1VMVCByZXMgPSBFbnVtZXJhdGVJdGVtcyhjZW5zb3IsDQorICAgICAgICAgIG9wdGlvbnMuUGF0aE1vZGUsDQorICAgICAgICAgIG9wdGlvbnMuQWRkUGF0aFByZWZpeCwNCisgICAgICAgICAgZGlySXRlbXMsICZlbnVtQ2FsbGJhY2spOw0KKyAgICAgIEZPUl9WRUNUT1IgKGksIGRpckl0ZW1zLkVycm9yUGF0aHMpDQorICAgICAgew0KKyAgICAgICAgUklOT0soY2FsbGJhY2stPkNhbk5vdEZpbmRFcnJvcihmczJ1cyhkaXJJdGVtcy5FcnJvclBhdGhzW2ldKSwgZGlySXRlbXMuRXJyb3JDb2Rlc1tpXSkpOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVzICE9IFNfT0spDQorICAgICAgew0KKyAgICAgICAgaWYgKHJlcyAhPSBFX0FCT1JUKQ0KKyAgICAgICAgICBlcnJvckluZm8uTWVzc2FnZSA9IEwiU2Nhbm5pbmcgZXJyb3IiOw0KKyAgICAgICAgcmV0dXJuIHJlczsNCisgICAgICB9DQorICAgICAgUklOT0soY2FsbGJhY2stPkZpbmlzaFNjYW5uaW5nKCkpOw0KKw0KKyAgICAgIGlmIChjZW5zb3IuUGFpcnMuU2l6ZSgpID09IDEpDQorICAgICAgew0KKyAgICAgICAgTkZpbmQ6OkNGaWxlSW5mbyBmaTsNCisgICAgICAgIEZTdHJpbmcgcHJlZml4ID0gdXMyZnMoY2Vuc29yLlBhaXJzWzBdLlByZWZpeCkgKyBGVEVYVCgiLiIpOw0KKyAgICAgICAgLy8gVVN0cmluZyBwcmVmaXggPSBjZW5zb3IuUGFpcnNbMF0uUHJlZml4Ow0KKyAgICAgICAgLyoNCisgICAgICAgIGlmIChwcmVmaXguQmFjaygpID09IFdDSEFSX1BBVEhfU0VQQVJBVE9SKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBwcmVmaXguRGVsZXRlQmFjaygpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKi8NCisgICAgICAgIGlmIChmaS5GaW5kKHByZWZpeCkpDQorICAgICAgICAgIGlmIChmaS5Jc0RpcigpKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgcGFyZW50RGlySXRlbS5TaXplID0gZmkuU2l6ZTsNCisgICAgICAgICAgICBwYXJlbnREaXJJdGVtLkNUaW1lID0gZmkuQ1RpbWU7DQorICAgICAgICAgICAgcGFyZW50RGlySXRlbS5BVGltZSA9IGZpLkFUaW1lOw0KKyAgICAgICAgICAgIHBhcmVudERpckl0ZW0uTVRpbWUgPSBmaS5NVGltZTsNCisgICAgICAgICAgICBwYXJlbnREaXJJdGVtLkF0dHJpYiA9IGZpLkF0dHJpYjsNCisgICAgICAgICAgICBwYXJlbnREaXJJdGVtX1B0ciA9ICZwYXJlbnREaXJJdGVtOw0KKw0KKyAgICAgICAgICAgIGludCBzZWN1cmVJbmRleCA9IC0xOw0KKyAgICAgICAgICAgICNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoVU5ERVJfQ0UpDQorICAgICAgICAgICAgaWYgKG9wdGlvbnMuTnRTZWN1cml0eS5WYWwpDQorICAgICAgICAgICAgICBkaXJJdGVtcy5BZGRTZWN1cml0eUl0ZW0ocHJlZml4LCBzZWN1cmVJbmRleCk7DQorICAgICAgICAgICAgI2VuZGlmDQorICAgICAgICAgICAgcGFyZW50RGlySXRlbS5TZWN1cmVJbmRleCA9IHNlY3VyZUluZGV4Ow0KKw0KKyAgICAgICAgICAgIHBhcmVudERpckl0ZW1fUHRyID0gJnBhcmVudERpckl0ZW07DQorICAgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIEZTdHJpbmcgdGVtcERpclByZWZpeDsNCisgIGJvb2wgdXNlc1RlbXBEaXIgPSBmYWxzZTsNCisgIA0KKyAgI2lmZGVmIF9XSU4zMg0KKyAgQ1RlbXBEaXIgdGVtcERpcmVjdG9yeTsNCisgIGlmIChvcHRpb25zLkVNYWlsTW9kZSAmJiBvcHRpb25zLkVNYWlsUmVtb3ZlQWZ0ZXIpDQorICB7DQorICAgIHRlbXBEaXJlY3RvcnkuQ3JlYXRlKGtUZW1wRm9sZGVyUHJlZml4KTsNCisgICAgdGVtcERpclByZWZpeCA9IHRlbXBEaXJlY3RvcnkuR2V0UGF0aCgpOw0KKyAgICBOb3JtYWxpemVEaXJQYXRoUHJlZml4KHRlbXBEaXJQcmVmaXgpOw0KKyAgICB1c2VzVGVtcERpciA9IHRydWU7DQorICB9DQorICAjZW5kaWYNCisNCisgIENUZW1wRmlsZXMgdGVtcEZpbGVzOw0KKw0KKyAgYm9vbCBjcmVhdGVUZW1wRmlsZSA9IGZhbHNlOw0KKw0KKyAgaWYgKCFvcHRpb25zLlN0ZE91dE1vZGUgJiYgb3B0aW9ucy5VcGRhdGVBcmNoaXZlSXRzZWxmKQ0KKyAgew0KKyAgICBDQXJjaGl2ZVBhdGggJmFwID0gb3B0aW9ucy5Db21tYW5kc1swXS5BcmNoaXZlUGF0aDsNCisgICAgYXAgPSBvcHRpb25zLkFyY2hpdmVQYXRoOw0KKyAgICAvLyBpZiAoKGFyY2hpdmUgIT0gMCAmJiAhdXNlc1RlbXBEaXIpIHx8ICFvcHRpb25zLldvcmtpbmdEaXIuSXNFbXB0eSgpKQ0KKyAgICBpZiAoKHRoZXJlSXNJbkFyY2hpdmUgfHwgIW9wdGlvbnMuV29ya2luZ0Rpci5Jc0VtcHR5KCkpICYmICF1c2VzVGVtcERpciAmJiBvcHRpb25zLlZvbHVtZXNTaXplcy5TaXplKCkgPT0gMCkNCisgICAgew0KKyAgICAgIGNyZWF0ZVRlbXBGaWxlID0gdHJ1ZTsNCisgICAgICBhcC5UZW1wID0gdHJ1ZTsNCisgICAgICBpZiAoIW9wdGlvbnMuV29ya2luZ0Rpci5Jc0VtcHR5KCkpDQorICAgICAgICBhcC5UZW1wUHJlZml4ID0gb3B0aW9ucy5Xb3JraW5nRGlyOw0KKyAgICAgIGVsc2UNCisgICAgICAgIGFwLlRlbXBQcmVmaXggPSB1czJmcyhhcC5QcmVmaXgpOw0KKyAgICAgIE5vcm1hbGl6ZURpclBhdGhQcmVmaXgoYXAuVGVtcFByZWZpeCk7DQorICAgIH0NCisgIH0NCisNCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5Db21tYW5kcy5TaXplKCk7IGkrKykNCisgIHsNCisgICAgQ0FyY2hpdmVQYXRoICZhcCA9IG9wdGlvbnMuQ29tbWFuZHNbaV0uQXJjaGl2ZVBhdGg7DQorICAgIGlmICh1c2VzVGVtcERpcikNCisgICAgew0KKyAgICAgIC8vIENoZWNrIGl0DQorICAgICAgYXAuUHJlZml4ID0gZnMydXModGVtcERpclByZWZpeCk7DQorICAgICAgLy8gYXAuVGVtcCA9IHRydWU7DQorICAgICAgLy8gYXAuVGVtcFByZWZpeCA9IHRlbXBEaXJQcmVmaXg7DQorICAgIH0NCisgICAgaWYgKCFvcHRpb25zLlN0ZE91dE1vZGUgJiYNCisgICAgICAgIChpID4gMCB8fCAhY3JlYXRlVGVtcEZpbGUpKQ0KKyAgICB7DQorICAgICAgY29uc3QgRlN0cmluZyBwYXRoID0gdXMyZnMoYXAuR2V0RmluYWxQYXRoKCkpOw0KKyAgICAgIGlmIChORmluZDo6RG9lc0ZpbGVPckRpckV4aXN0KHBhdGgpKQ0KKyAgICAgIHsNCisgICAgICAgIGVycm9ySW5mby5TeXN0ZW1FcnJvciA9IDA7DQorICAgICAgICBlcnJvckluZm8uTWVzc2FnZSA9IEwiVGhlIGZpbGUgYWxyZWFkeSBleGlzdHMiOw0KKyAgICAgICAgZXJyb3JJbmZvLkZpbGVOYW1lID0gcGF0aDsNCisgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBDT2JqZWN0VmVjdG9yPENBcmNJdGVtPiBhcmNJdGVtczsNCisgIGlmICh0aGVyZUlzSW5BcmNoaXZlKQ0KKyAgew0KKyAgICBSSU5PSyhFbnVtZXJhdGVJbkFyY2hpdmVJdGVtcygNCisgICAgICAvLyBvcHRpb25zLlN0b3JlQWx0U3RyZWFtcywNCisgICAgICBjZW5zb3IsIGFyY0xpbmsuQXJjcy5CYWNrKCksIGFyY0l0ZW1zKSk7DQorICB9DQorDQorICAvKg0KKyAgRlN0cmluZ1ZlY3RvciBwcm9jZXNzZWRGaWxlUGF0aHM7DQorICBGU3RyaW5nVmVjdG9yICpwcm9jZXNzZWRGaWxlUGF0aHNfUHRyID0gTlVMTDsNCisgIGlmIChvcHRpb25zLkRlbGV0ZUFmdGVyQ29tcHJlc3NpbmcpDQorICAgIHByb2Nlc3NlZEZpbGVQYXRoc19QdHIgPSAmcHJvY2Vzc2VkRmlsZVBhdGhzOw0KKyAgKi8NCisNCisgIENCeXRlQnVmZmVyIHByb2Nlc3NlZEl0ZW1zOw0KKyAgaWYgKG9wdGlvbnMuRGVsZXRlQWZ0ZXJDb21wcmVzc2luZykNCisgIHsNCisgICAgdW5zaWduZWQgbnVtID0gZGlySXRlbXMuSXRlbXMuU2l6ZSgpOw0KKyAgICBwcm9jZXNzZWRJdGVtcy5BbGxvYyhudW0pOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspDQorICAgICAgcHJvY2Vzc2VkSXRlbXNbaV0gPSAwOw0KKyAgfQ0KKw0KKyAgZm9yIChpID0gMDsgaSA8IG9wdGlvbnMuQ29tbWFuZHMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIGNvbnN0IENBcmMgKmFyYyA9IHRoZXJlSXNJbkFyY2hpdmUgPyBhcmNMaW5rLkdldEFyYygpIDogMDsNCisgICAgLy8gSUluQXJjaGl2ZUV4dHJhICphcmNoaXZlRXh0cmEgPSB0aGVyZUlzSW5BcmNoaXZlID8gYXJjTGluay5HZXRBcmNoaXZlRXh0cmEoKSA6IDA7DQorICAgIC8vIElBcmNoaXZlR2V0Um9vdFByb3BzICphcmNoaXZlR2V0Um9vdFByb3BzID0gdGhlcmVJc0luQXJjaGl2ZSA/IGFyY0xpbmsuR2V0QXJjaGl2ZUdldFJvb3RQcm9wcygpIDogMDsNCisgICAgQ1VwZGF0ZUFyY2hpdmVDb21tYW5kICZjb21tYW5kID0gb3B0aW9ucy5Db21tYW5kc1tpXTsNCisgICAgVVN0cmluZyBuYW1lOw0KKyAgICBib29sIGlzVXBkYXRpbmc7DQorICAgIGlmIChvcHRpb25zLlN0ZE91dE1vZGUpDQorICAgIHsNCisgICAgICBuYW1lID0gTCJzdGRvdXQiOw0KKyAgICAgIGlzVXBkYXRpbmcgPSBhcmMgIT0gMDsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBuYW1lID0gY29tbWFuZC5BcmNoaXZlUGF0aC5HZXRGaW5hbFBhdGgoKTsNCisgICAgICBpc1VwZGF0aW5nID0gKGkgPT0gMCAmJiBvcHRpb25zLlVwZGF0ZUFyY2hpdmVJdHNlbGYgJiYgYXJjICE9IDApOw0KKyAgICB9DQorICAgIFJJTk9LKGNhbGxiYWNrLT5TdGFydEFyY2hpdmUobmFtZSwgaXNVcGRhdGluZykpDQorDQorICAgIFJJTk9LKENvbXByZXNzKG9wdGlvbnMsDQorICAgICAgICBjb2RlY3MsDQorICAgICAgICBjb21tYW5kLkFjdGlvblNldCwNCisgICAgICAgIGFyYywNCisgICAgICAgIGNvbW1hbmQuQXJjaGl2ZVBhdGgsDQorICAgICAgICBhcmNJdGVtcywNCisgICAgICAgIG9wdGlvbnMuRGVsZXRlQWZ0ZXJDb21wcmVzc2luZyA/IChCeXRlICopcHJvY2Vzc2VkSXRlbXMgOiBOVUxMLA0KKw0KKyAgICAgICAgZGlySXRlbXMsDQorICAgICAgICBwYXJlbnREaXJJdGVtX1B0ciwNCisNCisgICAgICAgIHRlbXBGaWxlcywNCisgICAgICAgIGVycm9ySW5mbywgY2FsbGJhY2spKTsNCisNCisgICAgUklOT0soY2FsbGJhY2stPkZpbmlzaEFyY2hpdmUoKSk7DQorICB9DQorDQorDQorICBpZiAodGhlcmVJc0luQXJjaGl2ZSkNCisgIHsNCisgICAgUklOT0soYXJjTGluay5DbG9zZSgpKTsNCisgICAgYXJjTGluay5SZWxlYXNlKCk7DQorICB9DQorDQorICB0ZW1wRmlsZXMuUGF0aHMuQ2xlYXIoKTsNCisgIGlmIChjcmVhdGVUZW1wRmlsZSkNCisgIHsNCisgICAgdHJ5DQorICAgIHsNCisgICAgICBDQXJjaGl2ZVBhdGggJmFwID0gb3B0aW9ucy5Db21tYW5kc1swXS5BcmNoaXZlUGF0aDsNCisgICAgICBjb25zdCBGU3RyaW5nICZ0ZW1wUGF0aCA9IGFwLkdldFRlbXBQYXRoKCk7DQorICAgICAgaWYgKHRoZXJlSXNJbkFyY2hpdmUpDQorICAgICAgICBpZiAoIURlbGV0ZUZpbGVBbHdheXModXMyZnMoYXJjUGF0aCkpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBlcnJvckluZm8uU3lzdGVtRXJyb3IgPSA6OkdldExhc3RFcnJvcigpOw0KKyAgICAgICAgICBlcnJvckluZm8uTWVzc2FnZSA9IEwiNy1aaXAgY2Fubm90IGRlbGV0ZSB0aGUgZmlsZSI7DQorICAgICAgICAgIGVycm9ySW5mby5GaWxlTmFtZSA9IHVzMmZzKGFyY1BhdGgpOw0KKyAgICAgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICAgICAgfQ0KKyAgICAgIGlmICghTXlNb3ZlRmlsZSh0ZW1wUGF0aCwgdXMyZnMoYXJjUGF0aCkpKQ0KKyAgICAgIHsNCisgICAgICAgIGVycm9ySW5mby5TeXN0ZW1FcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7DQorICAgICAgICBlcnJvckluZm8uTWVzc2FnZSA9IEwiNy1aaXAgY2Fubm90IG1vdmUgdGhlIGZpbGUiOw0KKyAgICAgICAgZXJyb3JJbmZvLkZpbGVOYW1lID0gdGVtcFBhdGg7DQorICAgICAgICBlcnJvckluZm8uRmlsZU5hbWUyID0gdXMyZnMoYXJjUGF0aCk7DQorICAgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBjYXRjaCguLi4pDQorICAgIHsNCisgICAgICB0aHJvdzsNCisgICAgfQ0KKyAgfQ0KKw0KKw0KKyAgI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkNCisgIGlmIChvcHRpb25zLkVNYWlsTW9kZSkNCisgIHsNCisgICAgTkRMTDo6Q0xpYnJhcnkgbWFwaUxpYjsNCisgICAgaWYgKCFtYXBpTGliLkxvYWQoRlRFWFQoIk1hcGkzMi5kbGwiKSkpDQorICAgIHsNCisgICAgICBlcnJvckluZm8uU3lzdGVtRXJyb3IgPSA6OkdldExhc3RFcnJvcigpOw0KKyAgICAgIGVycm9ySW5mby5NZXNzYWdlID0gTCI3LVppcCBjYW5ub3QgbG9hZCBNYXBpMzIuZGxsIjsNCisgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgIExQTUFQSVNFTkRET0NVTUVOVFMgZm5TZW5kID0gKExQTUFQSVNFTkRET0NVTUVOVFMpbWFwaUxpYi5HZXRQcm9jKCJNQVBJU2VuZERvY3VtZW50cyIpOw0KKyAgICBpZiAoZm5TZW5kID09IDApDQorICAgIHsNCisgICAgICBlcnJvckluZm8uU3lzdGVtRXJyb3IgPSA6OkdldExhc3RFcnJvcigpOw0KKyAgICAgIGVycm9ySW5mby5NZXNzYWdlID0gTCI3LVppcCBjYW5ub3QgZmluZCBNQVBJU2VuZERvY3VtZW50cyBmdW5jdGlvbiI7DQorICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgfQ0KKyAgICAqLw0KKyAgICBMUE1BUElTRU5ETUFJTCBzZW5kTWFpbCA9IChMUE1BUElTRU5ETUFJTCltYXBpTGliLkdldFByb2MoIk1BUElTZW5kTWFpbCIpOw0KKyAgICBpZiAoc2VuZE1haWwgPT0gMCkNCisgICAgew0KKyAgICAgIGVycm9ySW5mby5TeXN0ZW1FcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7DQorICAgICAgZXJyb3JJbmZvLk1lc3NhZ2UgPSBMIjctWmlwIGNhbm5vdCBmaW5kIE1BUElTZW5kTWFpbCBmdW5jdGlvbiI7DQorICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgfQ0KKw0KKyAgICBGU3RyaW5nVmVjdG9yIGZ1bGxQYXRoczsNCisgICAgdW5zaWduZWQgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IG9wdGlvbnMuQ29tbWFuZHMuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBDQXJjaGl2ZVBhdGggJmFwID0gb3B0aW9ucy5Db21tYW5kc1tpXS5BcmNoaXZlUGF0aDsNCisgICAgICBGU3RyaW5nIGFyY1BhdGg7DQorICAgICAgaWYgKCFNeUdldEZ1bGxQYXRoTmFtZSh1czJmcyhhcC5HZXRGaW5hbFBhdGgoKSksIGFyY1BhdGgpKQ0KKyAgICAgIHsNCisgICAgICAgIGVycm9ySW5mby5TeXN0ZW1FcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7DQorICAgICAgICBlcnJvckluZm8uTWVzc2FnZSA9IEwiR2V0RnVsbFBhdGhOYW1lIGVycm9yIjsNCisgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgfQ0KKyAgICAgIGZ1bGxQYXRocy5BZGQoYXJjUGF0aCk7DQorICAgIH0NCisgICAgQ0N1cnJlbnREaXJSZXN0b3JlciBjdXJEaXJSZXN0b3JlcjsNCisgICAgZm9yIChpID0gMDsgaSA8IGZ1bGxQYXRocy5TaXplKCk7IGkrKykNCisgICAgew0KKyAgICAgIFVTdHJpbmcgYXJjUGF0aCA9IGZzMnVzKGZ1bGxQYXRoc1tpXSk7DQorICAgICAgVVN0cmluZyBmaWxlTmFtZSA9IEV4dHJhY3RGaWxlTmFtZUZyb21QYXRoKGFyY1BhdGgpOw0KKyAgICAgIEFTdHJpbmcgcGF0aCA9IEdldEFuc2lTdHJpbmcoYXJjUGF0aCk7DQorICAgICAgQVN0cmluZyBuYW1lID0gR2V0QW5zaVN0cmluZyhmaWxlTmFtZSk7DQorICAgICAgLy8gV2FybmluZyEhISBNQVBJU2VuZERvY3VtZW50cyBmdW5jdGlvbiBjaGFuZ2VzIEN1cnJlbnQgZGlyZWN0b3J5DQorICAgICAgLy8gZm5TZW5kKDAsICI7IiwgKExQU1RSKShMUENTVFIpcGF0aCwgKExQU1RSKShMUENTVFIpbmFtZSwgMCk7DQorDQorICAgICAgTWFwaUZpbGVEZXNjIGY7DQorICAgICAgbWVtc2V0KCZmLCAwLCBzaXplb2YoZikpOw0KKyAgICAgIGYublBvc2l0aW9uID0gMHhGRkZGRkZGRjsNCisgICAgICBmLmxwc3pQYXRoTmFtZSA9IChjaGFyICopKGNvbnN0IGNoYXIgKilwYXRoOw0KKyAgICAgIGYubHBzekZpbGVOYW1lID0gKGNoYXIgKikoY29uc3QgY2hhciAqKW5hbWU7DQorICAgICAgDQorICAgICAgTWFwaU1lc3NhZ2UgbTsNCisgICAgICBtZW1zZXQoJm0sIDAsIHNpemVvZihtKSk7DQorICAgICAgbS5uRmlsZUNvdW50ID0gMTsNCisgICAgICBtLmxwRmlsZXMgPSAmZjsNCisgICAgICANCisgICAgICBjb25zdCBBU3RyaW5nIGFkZHIgPSBHZXRBbnNpU3RyaW5nKG9wdGlvbnMuRU1haWxBZGRyZXNzKTsNCisgICAgICBNYXBpUmVjaXBEZXNjIHJlYzsNCisgICAgICBpZiAoIWFkZHIuSXNFbXB0eSgpKQ0KKyAgICAgIHsNCisgICAgICAgIG1lbXNldCgmcmVjLCAwLCBzaXplb2YocmVjKSk7DQorICAgICAgICByZWMudWxSZWNpcENsYXNzID0gTUFQSV9UTzsNCisgICAgICAgIHJlYy5scHN6QWRkcmVzcyA9IChjaGFyICopKGNvbnN0IGNoYXIgKilhZGRyOw0KKyAgICAgICAgbS5uUmVjaXBDb3VudCA9IDE7DQorICAgICAgICBtLmxwUmVjaXBzID0gJnJlYzsNCisgICAgICB9DQorICAgICAgDQorICAgICAgc2VuZE1haWwoKExIQU5ETEUpMCwgMCwgJm0sIE1BUElfRElBTE9HLCAwKTsNCisgICAgfQ0KKyAgfQ0KKyAgI2VuZGlmDQorDQorICBpZiAob3B0aW9ucy5EZWxldGVBZnRlckNvbXByZXNzaW5nKQ0KKyAgew0KKyAgICBDUmVjb3JkVmVjdG9yPENSZWZTb3J0UGFpcj4gcGFpcnM7DQorICAgIEZTdHJpbmdWZWN0b3IgZm9sZGVyc05hbWVzOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZGlySXRlbXMuSXRlbXMuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBjb25zdCBDRGlySXRlbSAmZGlySXRlbSA9IGRpckl0ZW1zLkl0ZW1zW2ldOw0KKyAgICAgIEZTdHJpbmcgcGh5UGF0aCA9IHVzMmZzKGRpckl0ZW1zLkdldFBoeVBhdGgoaSkpOw0KKyAgICAgIGlmIChkaXJJdGVtLklzRGlyKCkpDQorICAgICAgew0KKyAgICAgICAgQ1JlZlNvcnRQYWlyIHBhaXI7DQorICAgICAgICBwYWlyLkluZGV4ID0gaTsNCisgICAgICAgIHBhaXIuTGVuID0gR2V0TnVtU2xhc2hlcyhwaHlQYXRoKTsNCisgICAgICAgIHBhaXJzLkFkZChwYWlyKTsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChwcm9jZXNzZWRJdGVtc1tpXSAhPSAwIHx8IGRpckl0ZW0uU2l6ZSA9PSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBEZWxldGVGaWxlQWx3YXlzKHBoeVBhdGgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAvLyBmaWxlIHdhcyBza2lwcGVkDQorICAgICAgICAgIC8qDQorICAgICAgICAgIGVycm9ySW5mby5TeXN0ZW1FcnJvciA9IDA7DQorICAgICAgICAgIGVycm9ySW5mby5NZXNzYWdlID0gTCJmaWxlIHdhcyBub3QgcHJvY2Vzc2VkIjsNCisgICAgICAgICAgZXJyb3JJbmZvLkZpbGVOYW1lID0gcGh5UGF0aDsNCisgICAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICAgICAgKi8NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisNCisgICAgcGFpcnMuU29ydChDb21wYXJlUmVmU29ydFBhaXIsIE5VTEwpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFpcnMuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBGU3RyaW5nIHBoeVBhdGggPSB1czJmcyhkaXJJdGVtcy5HZXRQaHlQYXRoKHBhaXJzW2ldLkluZGV4KSk7DQorICAgICAgaWYgKE5GaW5kOjpEb2VzRGlyRXhpc3QocGh5UGF0aCkpDQorICAgICAgew0KKyAgICAgICAgLy8gcHJpbnRmKCJkZWxldGUgJVNcbiIsIHBoeVBhdGgpOw0KKyAgICAgICAgUmVtb3ZlRGlyKHBoeVBhdGgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1VwZGF0ZS5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vVXBkYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxZDEzMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1VwZGF0ZS5oCkBAIC0wLDAgKzEsMTg4IEBACisvLyBVcGRhdGUuaA0KKw0KKyNpZm5kZWYgX19DT01NT05fVVBEQVRFX0gNCisjZGVmaW5lIF9fQ09NTU9OX1VQREFURV9IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9XaWxkY2FyZC5oIg0KKw0KKyNpbmNsdWRlICJBcmNoaXZlT3BlbkNhbGxiYWNrLmgiDQorI2luY2x1ZGUgIkxvYWRDb2RlY3MuaCINCisjaW5jbHVkZSAiT3BlbkFyY2hpdmUuaCINCisjaW5jbHVkZSAiUHJvcGVydHkuaCINCisjaW5jbHVkZSAiVXBkYXRlQWN0aW9uLmgiDQorI2luY2x1ZGUgIlVwZGF0ZUNhbGxiYWNrLmgiDQorDQorZW51bSBFQXJjTmFtZU1vZGUNCit7DQorICBrX0FyY05hbWVNb2RlX1NtYXJ0LA0KKyAga19BcmNOYW1lTW9kZV9FeGFjdCwNCisgIGtfQXJjTmFtZU1vZGVfQWRkLA0KK307DQorDQorc3RydWN0IENBcmNoaXZlUGF0aA0KK3sNCisgIFVTdHJpbmcgT3JpZ2luYWxQYXRoOw0KKw0KKyAgVVN0cmluZyBQcmVmaXg7ICAgLy8gcGF0aChmb2xkZXIpIHByZWZpeCBpbmNsdWRpbmcgc2xhc2gNCisgIFVTdHJpbmcgTmFtZTsgLy8gYmFzZSBuYW1lDQorICBVU3RyaW5nIEJhc2VFeHRlbnNpb247IC8vIGFyY2hpdmUgdHlwZSBleHRlbnNpb24gb3IgImV4ZSIgZXh0ZW5zaW9uDQorICBVU3RyaW5nIFZvbEV4dGVuc2lvbjsgIC8vIGFyY2hpdmUgdHlwZSBleHRlbnNpb24gZm9yIHZvbHVtZXMNCisNCisgIGJvb2wgVGVtcDsNCisgIEZTdHJpbmcgVGVtcFByZWZpeDsgIC8vIHBhdGgoZm9sZGVyKSBmb3IgdGVtcCBsb2NhdGlvbg0KKyAgRlN0cmluZyBUZW1wUG9zdGZpeDsNCisNCisgIENBcmNoaXZlUGF0aCgpOiBUZW1wKGZhbHNlKSB7fTsNCisgIA0KKyAgdm9pZCBQYXJzZUZyb21QYXRoKGNvbnN0IFVTdHJpbmcgJnBhdGgsIEVBcmNOYW1lTW9kZSBtb2RlKTsNCisgIFVTdHJpbmcgR2V0UGF0aFdpdGhvdXRFeHQoKSBjb25zdCB7IHJldHVybiBQcmVmaXggKyBOYW1lOyB9DQorICBVU3RyaW5nIEdldEZpbmFsUGF0aCgpIGNvbnN0Ow0KKyAgVVN0cmluZyBHZXRGaW5hbFZvbFBhdGgoKSBjb25zdDsNCisgIEZTdHJpbmcgR2V0VGVtcFBhdGgoKSBjb25zdDsNCit9Ow0KKw0KK3N0cnVjdCBDVXBkYXRlQXJjaGl2ZUNvbW1hbmQNCit7DQorICBVU3RyaW5nIFVzZXJBcmNoaXZlUGF0aDsNCisgIENBcmNoaXZlUGF0aCBBcmNoaXZlUGF0aDsNCisgIE5VcGRhdGVBcmNoaXZlOjpDQWN0aW9uU2V0IEFjdGlvblNldDsNCit9Ow0KKw0KK3N0cnVjdCBDQ29tcHJlc3Npb25NZXRob2RNb2RlDQorew0KKyAgYm9vbCBUeXBlX0RlZmluZWQ7DQorICBDT3BlblR5cGUgVHlwZTsNCisgIENPYmplY3RWZWN0b3I8Q1Byb3BlcnR5PiBQcm9wZXJ0aWVzOw0KKyAgDQorICBDQ29tcHJlc3Npb25NZXRob2RNb2RlKCk6IFR5cGVfRGVmaW5lZChmYWxzZSkge30NCit9Ow0KKw0KK25hbWVzcGFjZSBOUmVjdXJzZWRUeXBlIHsgZW51bSBFRW51bQ0KK3sNCisgIGtSZWN1cnNlZCwNCisgIGtXaWxkY2FyZE9ubHlSZWN1cnNlZCwNCisgIGtOb25SZWN1cnNlZA0KK307fQ0KKw0KK3N0cnVjdCBDUmVuYW1lUGFpcg0KK3sNCisgIFVTdHJpbmcgT2xkTmFtZTsNCisgIFVTdHJpbmcgTmV3TmFtZTsNCisgIGJvb2wgV2lsZGNhcmRQYXJzaW5nOw0KKyAgTlJlY3Vyc2VkVHlwZTo6RUVudW0gUmVjdXJzZWRUeXBlOw0KKyAgDQorICBDUmVuYW1lUGFpcigpOiBXaWxkY2FyZFBhcnNpbmcodHJ1ZSksIFJlY3Vyc2VkVHlwZShOUmVjdXJzZWRUeXBlOjprTm9uUmVjdXJzZWQpIHt9DQorDQorICBib29sIFByZXBhcmUoKTsNCisgIGJvb2wgR2V0TmV3UGF0aChib29sIGlzRm9sZGVyLCBjb25zdCBVU3RyaW5nICZzcmMsIFVTdHJpbmcgJmRlc3QpIGNvbnN0Ow0KK307DQorDQorc3RydWN0IENVcGRhdGVPcHRpb25zDQorew0KKyAgQ0NvbXByZXNzaW9uTWV0aG9kTW9kZSBNZXRob2RNb2RlOw0KKw0KKyAgQ09iamVjdFZlY3RvcjxDVXBkYXRlQXJjaGl2ZUNvbW1hbmQ+IENvbW1hbmRzOw0KKyAgYm9vbCBVcGRhdGVBcmNoaXZlSXRzZWxmOw0KKyAgQ0FyY2hpdmVQYXRoIEFyY2hpdmVQYXRoOw0KKyAgRUFyY05hbWVNb2RlIEFyY05hbWVNb2RlOw0KKw0KKyAgYm9vbCBTZnhNb2RlOw0KKyAgRlN0cmluZyBTZnhNb2R1bGU7DQorICANCisgIGJvb2wgT3BlblNoYXJlRm9yV3JpdGU7DQorDQorICBib29sIFN0ZEluTW9kZTsNCisgIFVTdHJpbmcgU3RkSW5GaWxlTmFtZTsNCisgIGJvb2wgU3RkT3V0TW9kZTsNCisgIA0KKyAgYm9vbCBFTWFpbE1vZGU7DQorICBib29sIEVNYWlsUmVtb3ZlQWZ0ZXI7DQorICBVU3RyaW5nIEVNYWlsQWRkcmVzczsNCisNCisgIEZTdHJpbmcgV29ya2luZ0RpcjsNCisgIE5XaWxkY2FyZDo6RUNlbnNvclBhdGhNb2RlIFBhdGhNb2RlOw0KKyAgVVN0cmluZyBBZGRQYXRoUHJlZml4Ow0KKw0KKyAgQ0Jvb2xQYWlyIE50U2VjdXJpdHk7DQorICBDQm9vbFBhaXIgQWx0U3RyZWFtczsNCisgIENCb29sUGFpciBIYXJkTGlua3M7DQorICBDQm9vbFBhaXIgU3ltTGlua3M7DQorDQorICBib29sIERlbGV0ZUFmdGVyQ29tcHJlc3Npbmc7DQorDQorICBib29sIFNldEFyY01UaW1lOw0KKw0KKyAgQ09iamVjdFZlY3RvcjxDUmVuYW1lUGFpcj4gUmVuYW1lUGFpcnM7DQorDQorICBib29sIEluaXRGb3JtYXRJbmRleChjb25zdCBDQ29kZWNzICpjb2RlY3MsIGNvbnN0IENPYmplY3RWZWN0b3I8Q09wZW5UeXBlPiAmdHlwZXMsIGNvbnN0IFVTdHJpbmcgJmFyY1BhdGgpOw0KKyAgYm9vbCBTZXRBcmNQYXRoKGNvbnN0IENDb2RlY3MgKmNvZGVjcywgY29uc3QgVVN0cmluZyAmYXJjUGF0aCk7DQorDQorICBDVXBkYXRlT3B0aW9ucygpOg0KKyAgICBVcGRhdGVBcmNoaXZlSXRzZWxmKHRydWUpLA0KKyAgICBTZnhNb2RlKGZhbHNlKSwNCisgICAgU3RkSW5Nb2RlKGZhbHNlKSwNCisgICAgU3RkT3V0TW9kZShmYWxzZSksDQorICAgIEVNYWlsTW9kZShmYWxzZSksDQorICAgIEVNYWlsUmVtb3ZlQWZ0ZXIoZmFsc2UpLA0KKyAgICBPcGVuU2hhcmVGb3JXcml0ZShmYWxzZSksDQorICAgIEFyY05hbWVNb2RlKGtfQXJjTmFtZU1vZGVfU21hcnQpLA0KKyAgICBQYXRoTW9kZShOV2lsZGNhcmQ6OmtfUmVsYXRQYXRoKSwNCisgICAgDQorICAgIERlbGV0ZUFmdGVyQ29tcHJlc3NpbmcoZmFsc2UpLA0KKyAgICBTZXRBcmNNVGltZShmYWxzZSkNCisNCisgICAgICB7fTsNCisNCisgIHZvaWQgU2V0QWN0aW9uQ29tbWFuZF9BZGQoKQ0KKyAgew0KKyAgICBDb21tYW5kcy5DbGVhcigpOw0KKyAgICBDVXBkYXRlQXJjaGl2ZUNvbW1hbmQgYzsNCisgICAgYy5BY3Rpb25TZXQgPSBOVXBkYXRlQXJjaGl2ZTo6a19BY3Rpb25TZXRfQWRkOw0KKyAgICBDb21tYW5kcy5BZGQoYyk7DQorICB9DQorDQorICBDUmVjb3JkVmVjdG9yPFVJbnQ2ND4gVm9sdW1lc1NpemVzOw0KK307DQorDQorc3RydWN0IENFcnJvckluZm8NCit7DQorICBEV09SRCBTeXN0ZW1FcnJvcjsNCisgIEZTdHJpbmcgRmlsZU5hbWU7DQorICBGU3RyaW5nIEZpbGVOYW1lMjsNCisgIFVTdHJpbmcgTWVzc2FnZTsNCisgIC8vIFVTdHJpbmdWZWN0b3IgRXJyb3JQYXRoczsNCisgIC8vIENSZWNvcmRWZWN0b3I8RFdPUkQ+IEVycm9yQ29kZXM7DQorICBDRXJyb3JJbmZvKCk6IFN5c3RlbUVycm9yKDApIHt9Ow0KK307DQorDQorc3RydWN0IENVcGRhdGVFcnJvckluZm86IHB1YmxpYyBDRXJyb3JJbmZvDQorew0KK307DQorDQorI2RlZmluZSBJTlRFUkZBQ0VfSVVwZGF0ZUNhbGxiYWNrVUkyKHgpIFwNCisgIElOVEVSRkFDRV9JVXBkYXRlQ2FsbGJhY2tVSSh4KSBcDQorICB2aXJ0dWFsIEhSRVNVTFQgT3BlblJlc3VsdChjb25zdCB3Y2hhcl90ICpuYW1lLCBIUkVTVUxUIHJlc3VsdCwgY29uc3Qgd2NoYXJfdCAqZXJyb3JBcmNUeXBlKSB4OyBcDQorICB2aXJ0dWFsIEhSRVNVTFQgU3RhcnRTY2FubmluZygpIHg7IFwNCisgIHZpcnR1YWwgSFJFU1VMVCBTY2FuUHJvZ3Jlc3MoVUludDY0IG51bUZvbGRlcnMsIFVJbnQ2NCBudW1GaWxlcywgVUludDY0IHRvdGFsU2l6ZSwgY29uc3Qgd2NoYXJfdCAqcGF0aCwgYm9vbCBpc0RpcikgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIENhbk5vdEZpbmRFcnJvcihjb25zdCB3Y2hhcl90ICpuYW1lLCBEV09SRCBzeXN0ZW1FcnJvcikgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIEZpbmlzaFNjYW5uaW5nKCkgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIFN0YXJ0QXJjaGl2ZShjb25zdCB3Y2hhcl90ICpuYW1lLCBib29sIHVwZGF0aW5nKSB4OyBcDQorICB2aXJ0dWFsIEhSRVNVTFQgRmluaXNoQXJjaGl2ZSgpIHg7IFwNCisNCitzdHJ1Y3QgSVVwZGF0ZUNhbGxiYWNrVUkyOiBwdWJsaWMgSVVwZGF0ZUNhbGxiYWNrVUkNCit7DQorICBJTlRFUkZBQ0VfSVVwZGF0ZUNhbGxiYWNrVUkyKD0wKQ0KK307DQorDQorSFJFU1VMVCBVcGRhdGVBcmNoaXZlKA0KKyAgICBDQ29kZWNzICpjb2RlY3MsDQorICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q09wZW5UeXBlPiAmdHlwZXMsDQorICAgIGNvbnN0IFVTdHJpbmcgJmNtZEFyY1BhdGgyLA0KKyAgICBOV2lsZGNhcmQ6OkNDZW5zb3IgJmNlbnNvciwNCisgICAgQ1VwZGF0ZU9wdGlvbnMgJm9wdGlvbnMsDQorICAgIENVcGRhdGVFcnJvckluZm8gJmVycm9ySW5mbywNCisgICAgSU9wZW5DYWxsYmFja1VJICpvcGVuQ2FsbGJhY2ssDQorICAgIElVcGRhdGVDYWxsYmFja1VJMiAqY2FsbGJhY2ssDQorICAgIGJvb2wgbmVlZFNldFBhdGgpOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1VwZGF0ZUFjdGlvbi5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9VcGRhdGVBY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMTM4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9VcGRhdGVBY3Rpb24uY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8vIFVwZGF0ZUFjdGlvbi5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIlVwZGF0ZUFjdGlvbi5oIg0KKw0KK25hbWVzcGFjZSBOVXBkYXRlQXJjaGl2ZSB7DQorDQorY29uc3QgQ0FjdGlvblNldCBrX0FjdGlvblNldF9BZGQgPQ0KK3t7DQorICBOUGFpckFjdGlvbjo6a0NvcHksDQorICBOUGFpckFjdGlvbjo6a0NvcHksDQorICBOUGFpckFjdGlvbjo6a0NvbXByZXNzLA0KKyAgTlBhaXJBY3Rpb246OmtDb21wcmVzcywNCisgIE5QYWlyQWN0aW9uOjprQ29tcHJlc3MsDQorICBOUGFpckFjdGlvbjo6a0NvbXByZXNzLA0KKyAgTlBhaXJBY3Rpb246OmtDb21wcmVzcw0KK319Ow0KKw0KK2NvbnN0IENBY3Rpb25TZXQga19BY3Rpb25TZXRfVXBkYXRlID0NCit7ew0KKyAgTlBhaXJBY3Rpb246OmtDb3B5LA0KKyAgTlBhaXJBY3Rpb246OmtDb3B5LA0KKyAgTlBhaXJBY3Rpb246OmtDb21wcmVzcywNCisgIE5QYWlyQWN0aW9uOjprQ29weSwNCisgIE5QYWlyQWN0aW9uOjprQ29tcHJlc3MsDQorICBOUGFpckFjdGlvbjo6a0NvcHksDQorICBOUGFpckFjdGlvbjo6a0NvbXByZXNzDQorfX07DQorDQorY29uc3QgQ0FjdGlvblNldCBrX0FjdGlvblNldF9GcmVzaCA9DQore3sNCisgIE5QYWlyQWN0aW9uOjprQ29weSwNCisgIE5QYWlyQWN0aW9uOjprQ29weSwNCisgIE5QYWlyQWN0aW9uOjprSWdub3JlLA0KKyAgTlBhaXJBY3Rpb246OmtDb3B5LA0KKyAgTlBhaXJBY3Rpb246OmtDb21wcmVzcywNCisgIE5QYWlyQWN0aW9uOjprQ29weSwNCisgIE5QYWlyQWN0aW9uOjprQ29tcHJlc3MNCit9fTsNCisNCitjb25zdCBDQWN0aW9uU2V0IGtfQWN0aW9uU2V0X1N5bmMgPQ0KK3t7DQorICBOUGFpckFjdGlvbjo6a0NvcHksDQorICBOUGFpckFjdGlvbjo6a0lnbm9yZSwNCisgIE5QYWlyQWN0aW9uOjprQ29tcHJlc3MsDQorICBOUGFpckFjdGlvbjo6a0NvcHksDQorICBOUGFpckFjdGlvbjo6a0NvbXByZXNzLA0KKyAgTlBhaXJBY3Rpb246OmtDb3B5LA0KKyAgTlBhaXJBY3Rpb246OmtDb21wcmVzcywNCit9fTsNCisNCitjb25zdCBDQWN0aW9uU2V0IGtfQWN0aW9uU2V0X0RlbGV0ZSA9DQore3sNCisgIE5QYWlyQWN0aW9uOjprQ29weSwNCisgIE5QYWlyQWN0aW9uOjprSWdub3JlLA0KKyAgTlBhaXJBY3Rpb246OmtJZ25vcmUsDQorICBOUGFpckFjdGlvbjo6a0lnbm9yZSwNCisgIE5QYWlyQWN0aW9uOjprSWdub3JlLA0KKyAgTlBhaXJBY3Rpb246OmtJZ25vcmUsDQorICBOUGFpckFjdGlvbjo6a0lnbm9yZQ0KK319Ow0KKw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9VcGRhdGVBY3Rpb24uaCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1VwZGF0ZUFjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMTBiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9VcGRhdGVBY3Rpb24uaApAQCAtMCwwICsxLDY2IEBACisvLyBVcGRhdGVBY3Rpb24uaA0KKw0KKyNpZm5kZWYgX19VUERBVEVfQUNUSU9OX0gNCisjZGVmaW5lIF9fVVBEQVRFX0FDVElPTl9IDQorDQorbmFtZXNwYWNlIE5VcGRhdGVBcmNoaXZlIHsNCisNCisgIG5hbWVzcGFjZSBOUGFpclN0YXRlDQorICB7DQorICAgIGNvbnN0IHVuc2lnbmVkIGtOdW1WYWx1ZXMgPSA3Ow0KKyAgICBlbnVtIEVFbnVtDQorICAgIHsNCisgICAgICBrTm90TWFza2VkID0gMCwNCisgICAgICBrT25seUluQXJjaGl2ZSwNCisgICAgICBrT25seU9uRGlzaywNCisgICAgICBrTmV3SW5BcmNoaXZlLA0KKyAgICAgIGtPbGRJbkFyY2hpdmUsDQorICAgICAga1NhbWVGaWxlcywNCisgICAgICBrVW5rbm93TmV3ZXJGaWxlcw0KKyAgICB9Ow0KKyAgfQ0KKyANCisgIG5hbWVzcGFjZSBOUGFpckFjdGlvbg0KKyAgew0KKyAgICBlbnVtIEVFbnVtDQorICAgIHsNCisgICAgICBrSWdub3JlID0gMCwNCisgICAgICBrQ29weSwNCisgICAgICBrQ29tcHJlc3MsDQorICAgICAga0NvbXByZXNzQXNBbnRpDQorICAgIH07DQorICB9DQorICANCisgIHN0cnVjdCBDQWN0aW9uU2V0DQorICB7DQorICAgIE5QYWlyQWN0aW9uOjpFRW51bSBTdGF0ZUFjdGlvbnNbTlBhaXJTdGF0ZTo6a051bVZhbHVlc107DQorICAgIA0KKyAgICBjb25zdCBib29sIElzRXF1YWxUbyhjb25zdCBDQWN0aW9uU2V0ICZhKSBjb25zdA0KKyAgICB7DQorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE5QYWlyU3RhdGU6OmtOdW1WYWx1ZXM7IGkrKykNCisgICAgICAgIGlmIChTdGF0ZUFjdGlvbnNbaV0gIT0gYS5TdGF0ZUFjdGlvbnNbaV0pDQorICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKw0KKyAgICBib29sIE5lZWRTY2FubmluZygpIGNvbnN0DQorICAgIHsNCisgICAgICB1bnNpZ25lZCBpOw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOUGFpclN0YXRlOjprTnVtVmFsdWVzOyBpKyspDQorICAgICAgICBpZiAoU3RhdGVBY3Rpb25zW2ldID09IE5QYWlyQWN0aW9uOjprQ29tcHJlc3MpDQorICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIGZvciAoaSA9IDE7IGkgPCBOUGFpclN0YXRlOjprTnVtVmFsdWVzOyBpKyspDQorICAgICAgICBpZiAoU3RhdGVBY3Rpb25zW2ldICE9IE5QYWlyQWN0aW9uOjprSWdub3JlKQ0KKyAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH07DQorICANCisgIGV4dGVybiBjb25zdCBDQWN0aW9uU2V0IGtfQWN0aW9uU2V0X0FkZDsNCisgIGV4dGVybiBjb25zdCBDQWN0aW9uU2V0IGtfQWN0aW9uU2V0X1VwZGF0ZTsNCisgIGV4dGVybiBjb25zdCBDQWN0aW9uU2V0IGtfQWN0aW9uU2V0X0ZyZXNoOw0KKyAgZXh0ZXJuIGNvbnN0IENBY3Rpb25TZXQga19BY3Rpb25TZXRfU3luYzsNCisgIGV4dGVybiBjb25zdCBDQWN0aW9uU2V0IGtfQWN0aW9uU2V0X0RlbGV0ZTsNCit9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vVXBkYXRlQ2FsbGJhY2suY3BwIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vVXBkYXRlQ2FsbGJhY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYWRkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9VcGRhdGVDYWxsYmFjay5jcHAKQEAgLTAsMCArMSw1NzQgQEAKKy8vIFVwZGF0ZUNhbGxiYWNrLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0NvbVRyeS5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vSW50VG9TdHJpbmcuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1dpbGRjYXJkLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZURpci5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVOYW1lLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvUHJvcFZhcmlhbnQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9TeW5jaHJvbml6YXRpb24uaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL0ZpbGVTdHJlYW1zLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9TdHJlYW1PYmplY3RzLmgiDQorDQorI2luY2x1ZGUgIlVwZGF0ZUNhbGxiYWNrLmgiDQorDQorI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkNCisjZGVmaW5lIF9VU0VfU0VDVVJJVFlfQ09ERQ0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1NlY3VyaXR5VXRpbHMuaCINCisjZW5kaWYNCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQordXNpbmcgbmFtZXNwYWNlIE5GaWxlOw0KKw0KKyNpZmRlZiBfVVNFX1NFQ1VSSVRZX0NPREUNCitib29sIEluaXRMb2NhbFByaXZpbGVnZXMoKTsNCisjZW5kaWYNCisNCitDQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrOjpDQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrKCk6DQorICBDYWxsYmFjaygwKSwNCisgIFNoYXJlRm9yV3JpdGUoZmFsc2UpLA0KKyAgU3RkSW5Nb2RlKGZhbHNlKSwNCisgIERpckl0ZW1zKDApLA0KKyAgQXJjSXRlbXMoMCksDQorICBVcGRhdGVQYWlycygwKSwNCisgIE5ld05hbWVzKDApLA0KKyAgS2VlcE9yaWdpbmFsSXRlbU5hbWVzKGZhbHNlKSwNCisgIFByb2Nlc3NlZEl0ZW1zU3RhdHVzZXMoTlVMTCksDQorICBQYXJlbnREaXJJdGVtKE5VTEwpLA0KKyAgU3RvcmVOdFNlY3VyaXR5KGZhbHNlKSwNCisgIFN0b3JlSGFyZExpbmtzKGZhbHNlKSwNCisgIFN0b3JlU3ltTGlua3MoZmFsc2UpLA0KKyAgX2hhcmRJbmRleF9Gcm9tKChVSW50MzIpKEludDMyKS0xKQ0KK3sNCisgICNpZmRlZiBfVVNFX1NFQ1VSSVRZX0NPREUNCisgIF9zYWNsRW5hYmxlZCA9IEluaXRMb2NhbFByaXZpbGVnZXMoKTsNCisgICNlbmRpZg0KK30NCisNCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazo6U2V0VG90YWwoVUludDY0IHNpemUpDQorew0KKyAgQ09NX1RSWV9CRUdJTg0KKyAgcmV0dXJuIENhbGxiYWNrLT5TZXRUb3RhbChzaXplKTsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrOjpTZXRDb21wbGV0ZWQoY29uc3QgVUludDY0ICpjb21wbGV0ZVZhbHVlKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIHJldHVybiBDYWxsYmFjay0+U2V0Q29tcGxldGVkKGNvbXBsZXRlVmFsdWUpOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlVXBkYXRlQ2FsbGJhY2s6OlNldFJhdGlvSW5mbyhjb25zdCBVSW50NjQgKmluU2l6ZSwgY29uc3QgVUludDY0ICpvdXRTaXplKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIHJldHVybiBDYWxsYmFjay0+U2V0UmF0aW9JbmZvKGluU2l6ZSwgb3V0U2l6ZSk7DQorICBDT01fVFJZX0VORA0KK30NCisNCisNCisvKg0KK3N0YXRpYyBjb25zdCBTVEFUUFJPUFNURyBrUHJvcHNbXSA9DQorew0KKyAgeyBOVUxMLCBrcGlkUGF0aCwgVlRfQlNUUn0sDQorICB7IE5VTEwsIGtwaWRJc0RpciwgVlRfQk9PTH0sDQorICB7IE5VTEwsIGtwaWRTaXplLCBWVF9VSTh9LA0KKyAgeyBOVUxMLCBrcGlkQ1RpbWUsIFZUX0ZJTEVUSU1FfSwNCisgIHsgTlVMTCwga3BpZEFUaW1lLCBWVF9GSUxFVElNRX0sDQorICB7IE5VTEwsIGtwaWRNVGltZSwgVlRfRklMRVRJTUV9LA0KKyAgeyBOVUxMLCBrcGlkQXR0cmliLCBWVF9VSTR9LA0KKyAgeyBOVUxMLCBrcGlkSXNBbnRpLCBWVF9CT09MfQ0KK307DQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlVXBkYXRlQ2FsbGJhY2s6OkVudW1Qcm9wZXJ0aWVzKElFbnVtU1RBVFBST1BTVEcgKiopDQorew0KKyAgcmV0dXJuIENTdGF0UHJvcEVudW1lcmF0b3I6OkNyZWF0ZUVudW1lcmF0b3Ioa1Byb3BzLCBBUlJBWV9TSVpFKGtQcm9wcyksIGVudW1lcmF0b3IpOw0KK30NCisqLw0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrOjpHZXRVcGRhdGVJdGVtSW5mbyhVSW50MzIgaW5kZXgsDQorICAgICAgSW50MzIgKm5ld0RhdGEsIEludDMyICpuZXdQcm9wcywgVUludDMyICppbmRleEluQXJjaGl2ZSkNCit7DQorICBDT01fVFJZX0JFR0lODQorICBSSU5PSyhDYWxsYmFjay0+Q2hlY2tCcmVhaygpKTsNCisgIGNvbnN0IENVcGRhdGVQYWlyMiAmdXAgPSAoKlVwZGF0ZVBhaXJzKVtpbmRleF07DQorICBpZiAobmV3RGF0YSkgKm5ld0RhdGEgPSBCb29sVG9JbnQodXAuTmV3RGF0YSk7DQorICBpZiAobmV3UHJvcHMpICpuZXdQcm9wcyA9IEJvb2xUb0ludCh1cC5OZXdQcm9wcyk7DQorICBpZiAoaW5kZXhJbkFyY2hpdmUpDQorICB7DQorICAgICppbmRleEluQXJjaGl2ZSA9IChVSW50MzIpKEludDMyKS0xOw0KKyAgICBpZiAodXAuRXhpc3RJbkFyY2hpdmUoKSkNCisgICAgICAqaW5kZXhJbkFyY2hpdmUgPSAoQXJjSXRlbXMgPT0gMCkgPyB1cC5BcmNJbmRleCA6ICgqQXJjSXRlbXMpW3VwLkFyY0luZGV4XS5JbmRleEluU2VydmVyOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorICBDT01fVFJZX0VORA0KK30NCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazo6R2V0Um9vdFByb3AoUFJPUElEIHByb3BJRCwgUFJPUFZBUklBTlQgKnZhbHVlKQ0KK3sNCisgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgc3dpdGNoIChwcm9wSUQpDQorICB7DQorICAgIGNhc2Uga3BpZElzRGlyOiAgcHJvcCA9IHRydWU7IGJyZWFrOw0KKyAgICBjYXNlIGtwaWRBdHRyaWI6IGlmIChQYXJlbnREaXJJdGVtKSBwcm9wID0gUGFyZW50RGlySXRlbS0+QXR0cmliOyBicmVhazsNCisgICAgY2FzZSBrcGlkQ1RpbWU6ICBpZiAoUGFyZW50RGlySXRlbSkgcHJvcCA9IFBhcmVudERpckl0ZW0tPkNUaW1lOyBicmVhazsNCisgICAgY2FzZSBrcGlkQVRpbWU6ICBpZiAoUGFyZW50RGlySXRlbSkgcHJvcCA9IFBhcmVudERpckl0ZW0tPkFUaW1lOyBicmVhazsNCisgICAgY2FzZSBrcGlkTVRpbWU6ICBpZiAoUGFyZW50RGlySXRlbSkgcHJvcCA9IFBhcmVudERpckl0ZW0tPk1UaW1lOyBicmVhazsNCisgIH0NCisgIHByb3AuRGV0YWNoKHZhbHVlKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazo6R2V0UGFyZW50KFVJbnQzMiAvKiBpbmRleCAqLywgVUludDMyICpwYXJlbnQsIFVJbnQzMiAqcGFyZW50VHlwZSkNCit7DQorICAqcGFyZW50VHlwZSA9IE5QYXJlbnRUeXBlOjprRGlyOw0KKyAgKnBhcmVudCA9IChVSW50MzIpKEludDMyKS0xOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrOjpHZXROdW1SYXdQcm9wcyhVSW50MzIgKm51bVByb3BzKQ0KK3sNCisgICpudW1Qcm9wcyA9IDA7DQorICBpZiAoU3RvcmVOdFNlY3VyaXR5KQ0KKyAgICAqbnVtUHJvcHMgPSAxOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrOjpHZXRSYXdQcm9wSW5mbyhVSW50MzIgLyogaW5kZXggKi8sIEJTVFIgKm5hbWUsIFBST1BJRCAqcHJvcElEKQ0KK3sNCisgICpuYW1lID0gTlVMTDsNCisgICpwcm9wSUQgPSBrcGlkTnRTZWN1cmU7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlVXBkYXRlQ2FsbGJhY2s6OkdldFJvb3RSYXdQcm9wKFBST1BJRA0KKyAgICAjaWZkZWYgX1VTRV9TRUNVUklUWV9DT0RFDQorICAgIHByb3BJRA0KKyAgICAjZW5kaWYNCisgICAgLCBjb25zdCB2b2lkICoqZGF0YSwgVUludDMyICpkYXRhU2l6ZSwgVUludDMyICpwcm9wVHlwZSkNCit7DQorICAqZGF0YSA9IDA7DQorICAqZGF0YVNpemUgPSAwOw0KKyAgKnByb3BUeXBlID0gMDsNCisgIGlmICghU3RvcmVOdFNlY3VyaXR5KQ0KKyAgICByZXR1cm4gU19PSzsNCisgICNpZmRlZiBfVVNFX1NFQ1VSSVRZX0NPREUNCisgIGlmIChwcm9wSUQgPT0ga3BpZE50U2VjdXJlKQ0KKyAgew0KKyAgICBpZiAoU3RkSW5Nb2RlKQ0KKyAgICAgIHJldHVybiBTX09LOw0KKw0KKyAgICBpZiAoUGFyZW50RGlySXRlbSkNCisgICAgew0KKyAgICAgIGlmIChQYXJlbnREaXJJdGVtLT5TZWN1cmVJbmRleCA8IDApDQorICAgICAgICByZXR1cm4gU19PSzsNCisgICAgICBjb25zdCBDQnl0ZUJ1ZmZlciAmYnVmID0gRGlySXRlbXMtPlNlY3VyZUJsb2Nrcy5CdWZzW1BhcmVudERpckl0ZW0tPlNlY3VyZUluZGV4XTsNCisgICAgICAqZGF0YSA9IGJ1ZjsNCisgICAgICAqZGF0YVNpemUgPSAoVUludDMyKWJ1Zi5TaXplKCk7DQorICAgICAgKnByb3BUeXBlID0gTlByb3BEYXRhVHlwZTo6a1JhdzsNCisgICAgICByZXR1cm4gU19PSzsNCisgICAgfQ0KKw0KKyAgICBpZiAoR2V0Um9vdFByb3BzKQ0KKyAgICAgIHJldHVybiBHZXRSb290UHJvcHMtPkdldFJvb3RSYXdQcm9wKHByb3BJRCwgZGF0YSwgZGF0YVNpemUsIHByb3BUeXBlKTsNCisgIH0NCisgICNlbmRpZg0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKy8vICAgICNpZmRlZiBfVVNFX1NFQ1VSSVRZX0NPREUNCisvLyAgICAjZW5kaWYNCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazo6R2V0UmF3UHJvcChVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIGNvbnN0IHZvaWQgKipkYXRhLCBVSW50MzIgKmRhdGFTaXplLCBVSW50MzIgKnByb3BUeXBlKQ0KK3sNCisgICpkYXRhID0gMDsNCisgICpkYXRhU2l6ZSA9IDA7DQorICAqcHJvcFR5cGUgPSAwOw0KKw0KKyAgaWYgKHByb3BJRCA9PSBrcGlkTnRTZWN1cmUgfHwNCisgICAgICBwcm9wSUQgPT0ga3BpZE50UmVwYXJzZSkNCisgIHsNCisgICAgaWYgKFN0ZEluTW9kZSkNCisgICAgICByZXR1cm4gU19PSzsNCisNCisgICAgY29uc3QgQ1VwZGF0ZVBhaXIyICZ1cCA9ICgqVXBkYXRlUGFpcnMpW2luZGV4XTsNCisgICAgaWYgKHVwLlVzZUFyY1Byb3BzICYmIHVwLkV4aXN0SW5BcmNoaXZlKCkgJiYgR2V0UmF3UHJvcHMpDQorICAgICAgcmV0dXJuIEdldFJhd1Byb3BzLT5HZXRSYXdQcm9wKA0KKyAgICAgICAgICBBcmNJdGVtcyA/ICgqQXJjSXRlbXMpW3VwLkFyY0luZGV4XS5JbmRleEluU2VydmVyIDogdXAuQXJjSW5kZXgsDQorICAgICAgICAgIHByb3BJRCwgZGF0YSwgZGF0YVNpemUsIHByb3BUeXBlKTsNCisNCisgICAgew0KKyAgICAgIGNvbnN0IENVcGRhdGVQYWlyMiAmdXAgPSAoKlVwZGF0ZVBhaXJzKVtpbmRleF07DQorICAgICAgLyoNCisgICAgICBpZiAoIXVwLk5ld0RhdGEpDQorICAgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICAgICovDQorICAgICAgaWYgKHVwLklzQW50aSkNCisgICAgICAgIHJldHVybiBTX09LOw0KKyAgICAgIA0KKyAgICAgICNpZm5kZWYgVU5ERVJfQ0UNCisgICAgICBjb25zdCBDRGlySXRlbSAmZGkgPSBEaXJJdGVtcy0+SXRlbXNbdXAuRGlySW5kZXhdOw0KKyAgICAgICNlbmRpZg0KKw0KKyAgICAgICNpZmRlZiBfVVNFX1NFQ1VSSVRZX0NPREUNCisgICAgICBpZiAocHJvcElEID09IGtwaWROdFNlY3VyZSkNCisgICAgICB7DQorICAgICAgICBpZiAoIVN0b3JlTnRTZWN1cml0eSkNCisgICAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgICBpZiAoZGkuU2VjdXJlSW5kZXggPCAwKQ0KKyAgICAgICAgICByZXR1cm4gU19PSzsNCisgICAgICAgIGNvbnN0IENCeXRlQnVmZmVyICZidWYgPSBEaXJJdGVtcy0+U2VjdXJlQmxvY2tzLkJ1ZnNbZGkuU2VjdXJlSW5kZXhdOw0KKyAgICAgICAgKmRhdGEgPSBidWY7DQorICAgICAgICAqZGF0YVNpemUgPSAoVUludDMyKWJ1Zi5TaXplKCk7DQorICAgICAgICAqcHJvcFR5cGUgPSBOUHJvcERhdGFUeXBlOjprUmF3Ow0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgI2VuZGlmDQorICAgICAgew0KKyAgICAgICAgLy8gcHJvcElEID09IGtwaWROdFJlcGFyc2UNCisgICAgICAgIGlmICghU3RvcmVTeW1MaW5rcykNCisgICAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgICAjaWZuZGVmIFVOREVSX0NFDQorICAgICAgICBjb25zdCBDQnl0ZUJ1ZmZlciAqYnVmID0gJmRpLlJlcGFyc2VEYXRhMjsNCisgICAgICAgIGlmIChidWYtPlNpemUoKSA9PSAwKQ0KKyAgICAgICAgICBidWYgPSAmZGkuUmVwYXJzZURhdGE7DQorICAgICAgICBpZiAoYnVmLT5TaXplKCkgIT0gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgKmRhdGEgPSAqYnVmOw0KKyAgICAgICAgICAqZGF0YVNpemUgPSAoVUludDMyKWJ1Zi0+U2l6ZSgpOw0KKyAgICAgICAgICAqcHJvcFR5cGUgPSBOUHJvcERhdGFUeXBlOjprUmF3Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZGlmDQorICAgICAgfQ0KKyANCisgICAgICByZXR1cm4gU19PSzsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKyNpZm5kZWYgVU5ERVJfQ0UNCisNCitzdGF0aWMgVVN0cmluZyBHZXRSZWxhdGl2ZVBhdGgoY29uc3QgVVN0cmluZyAmdG8sIGNvbnN0IFVTdHJpbmcgJmZyb20pDQorew0KKyAgVVN0cmluZ1ZlY3RvciBwYXJ0c1RvLCBwYXJ0c0Zyb207DQorICBTcGxpdFBhdGhUb1BhcnRzKHRvLCBwYXJ0c1RvKTsNCisgIFNwbGl0UGF0aFRvUGFydHMoZnJvbSwgcGFydHNGcm9tKTsNCisNCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSAwOzsgaSsrKQ0KKyAgew0KKyAgICBpZiAoaSArIDEgPj0gcGFydHNGcm9tLlNpemUoKSB8fA0KKyAgICAgICAgaSArIDEgPj0gcGFydHNUby5TaXplKCkpDQorICAgICAgYnJlYWs7DQorICAgIGlmIChDb21wYXJlRmlsZU5hbWVzKHBhcnRzRnJvbVtpXSwgcGFydHNUb1tpXSkgIT0gMCkNCisgICAgICBicmVhazsNCisgIH0NCisNCisgIGlmIChpID09IDApDQorICB7DQorICAgICNpZmRlZiBfV0lOMzINCisgICAgaWYgKE5OYW1lOjpJc0RyaXZlUGF0aCh0bykgfHwNCisgICAgICAgIE5OYW1lOjpJc0RyaXZlUGF0aChmcm9tKSkNCisgICAgICByZXR1cm4gdG87DQorICAgICNlbmRpZg0KKyAgfQ0KKw0KKyAgVVN0cmluZyBzOw0KKyAgdW5zaWduZWQgazsNCisgIA0KKyAgZm9yIChrID0gaSArIDE7IGsgPCBwYXJ0c0Zyb20uU2l6ZSgpOyBrKyspDQorICAgIHMgKz0gTCIuLiIgV1NUUklOR19QQVRIX1NFUEFSQVRPUjsNCisgIA0KKyAgZm9yIChrID0gaTsgayA8IHBhcnRzVG8uU2l6ZSgpOyBrKyspDQorICB7DQorICAgIGlmIChrICE9IGkpDQorICAgICAgcyArPSBXQ0hBUl9QQVRIX1NFUEFSQVRPUjsNCisgICAgcyArPSBwYXJ0c1RvW2tdOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIHM7DQorfQ0KKw0KKyNlbmRpZg0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrOjpHZXRQcm9wZXJ0eShVSW50MzIgaW5kZXgsIFBST1BJRCBwcm9wSUQsIFBST1BWQVJJQU5UICp2YWx1ZSkNCit7DQorICBDT01fVFJZX0JFR0lODQorICBjb25zdCBDVXBkYXRlUGFpcjIgJnVwID0gKCpVcGRhdGVQYWlycylbaW5kZXhdOw0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorDQorICBpZiAodXAuTmV3RGF0YSkNCisgIHsNCisgICAgLyoNCisgICAgaWYgKHByb3BJRCA9PSBrcGlkSXNIYXJkTGluaykNCisgICAgew0KKyAgICAgIHByb3AgPSBfaXNIYXJkTGluazsNCisgICAgICBwcm9wLkRldGFjaCh2YWx1ZSk7DQorICAgICAgcmV0dXJuIFNfT0s7DQorICAgIH0NCisgICAgKi8NCisgICAgaWYgKHByb3BJRCA9PSBrcGlkU3ltTGluaykNCisgICAgew0KKyAgICAgIGlmIChpbmRleCA9PSBfaGFyZEluZGV4X0Zyb20pDQorICAgICAgew0KKyAgICAgICAgcHJvcC5EZXRhY2godmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgfQ0KKyAgICAgIGlmICh1cC5EaXJJbmRleCA+PSAwKQ0KKyAgICAgIHsNCisgICAgICAgICNpZm5kZWYgVU5ERVJfQ0UNCisgICAgICAgIGNvbnN0IENEaXJJdGVtICZkaSA9IERpckl0ZW1zLT5JdGVtc1t1cC5EaXJJbmRleF07DQorICAgICAgICAvLyBpZiAoZGkuSXNEaXIoKSkNCisgICAgICAgIHsNCisgICAgICAgICAgQ1JlcGFyc2VBdHRyIGF0dHI7DQorICAgICAgICAgIGlmIChhdHRyLlBhcnNlKGRpLlJlcGFyc2VEYXRhLCBkaS5SZXBhcnNlRGF0YS5TaXplKCkpKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgVVN0cmluZyBzaW1wbGVOYW1lID0gYXR0ci5HZXRQYXRoKCk7DQorICAgICAgICAgICAgaWYgKGF0dHIuSXNSZWxhdGl2ZSgpKQ0KKyAgICAgICAgICAgICAgcHJvcCA9IHNpbXBsZU5hbWU7DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIGNvbnN0IFVTdHJpbmcgcGh5UGF0aCA9IERpckl0ZW1zLT5HZXRQaHlQYXRoKHVwLkRpckluZGV4KTsNCisgICAgICAgICAgICAgIEZTdHJpbmcgZnVsbFBhdGg7DQorICAgICAgICAgICAgICBpZiAoTkRpcjo6TXlHZXRGdWxsUGF0aE5hbWUodXMyZnMocGh5UGF0aCksIGZ1bGxQYXRoKSkNCisgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcHJvcCA9IEdldFJlbGF0aXZlUGF0aChzaW1wbGVOYW1lLCBmczJ1cyhmdWxsUGF0aCkpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwcm9wLkRldGFjaCh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgICNlbmRpZg0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBlbHNlIGlmIChwcm9wSUQgPT0ga3BpZEhhcmRMaW5rKQ0KKyAgICB7DQorICAgICAgaWYgKGluZGV4ID09IF9oYXJkSW5kZXhfRnJvbSkNCisgICAgICB7DQorICAgICAgICBjb25zdCBDS2V5S2V5VmFsUGFpciAmcGFpciA9IF9tYXBbX2hhcmRJbmRleF9Ub107DQorICAgICAgICBjb25zdCBDVXBkYXRlUGFpcjIgJnVwMiA9ICgqVXBkYXRlUGFpcnMpW3BhaXIuVmFsdWVdOw0KKyAgICAgICAgcHJvcCA9IERpckl0ZW1zLT5HZXRMb2dQYXRoKHVwMi5EaXJJbmRleCk7DQorICAgICAgICBwcm9wLkRldGFjaCh2YWx1ZSk7DQorICAgICAgICByZXR1cm4gU19PSzsNCisgICAgICB9DQorICAgICAgaWYgKHVwLkRpckluZGV4ID49IDApDQorICAgICAgew0KKyAgICAgICAgcHJvcC5EZXRhY2godmFsdWUpOw0KKyAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICANCisgIGlmICh1cC5Jc0FudGkNCisgICAgICAmJiBwcm9wSUQgIT0ga3BpZElzRGlyDQorICAgICAgJiYgcHJvcElEICE9IGtwaWRQYXRoDQorICAgICAgJiYgcHJvcElEICE9IGtwaWRJc0FsdFN0cmVhbSkNCisgIHsNCisgICAgc3dpdGNoIChwcm9wSUQpDQorICAgIHsNCisgICAgICBjYXNlIGtwaWRTaXplOiAgcHJvcCA9IChVSW50NjQpMDsgYnJlYWs7DQorICAgICAgY2FzZSBrcGlkSXNBbnRpOiAgcHJvcCA9IHRydWU7IGJyZWFrOw0KKyAgICB9DQorICB9DQorICBlbHNlIGlmIChwcm9wSUQgPT0ga3BpZFBhdGggJiYgdXAuTmV3TmFtZUluZGV4ID49IDApDQorICAgIHByb3AgPSAoKk5ld05hbWVzKVt1cC5OZXdOYW1lSW5kZXhdOw0KKyAgZWxzZSBpZiAocHJvcElEID09IGtwaWRTaG9ydE5hbWUgJiYgdXAuTmV3TmFtZUluZGV4ID49IDAgJiYgdXAuSXNNYWluUmVuYW1lSXRlbSkNCisgIHsNCisgICAgLy8gd2UgY2FuIGdlbmVyYXRlIG5ldyBTaG9ydE5hbWUgaGVyZTsNCisgIH0NCisgIGVsc2UgaWYgKCh1cC5Vc2VBcmNQcm9wcw0KKyAgICAgIHx8IChLZWVwT3JpZ2luYWxJdGVtTmFtZXMgJiYgKHByb3BJRCA9PSBrcGlkUGF0aCB8fCBwcm9wSUQgPT0ga3BpZElzQWx0U3RyZWFtKSkpDQorICAgICAgJiYgdXAuRXhpc3RJbkFyY2hpdmUoKSAmJiBBcmNoaXZlKQ0KKyAgICByZXR1cm4gQXJjaGl2ZS0+R2V0UHJvcGVydHkoQXJjSXRlbXMgPyAoKkFyY0l0ZW1zKVt1cC5BcmNJbmRleF0uSW5kZXhJblNlcnZlciA6IHVwLkFyY0luZGV4LCBwcm9wSUQsIHZhbHVlKTsNCisgIGVsc2UgaWYgKHVwLkV4aXN0T25EaXNrKCkpDQorICB7DQorICAgIGNvbnN0IENEaXJJdGVtICZkaSA9IERpckl0ZW1zLT5JdGVtc1t1cC5EaXJJbmRleF07DQorICAgIHN3aXRjaCAocHJvcElEKQ0KKyAgICB7DQorICAgICAgY2FzZSBrcGlkUGF0aDogIHByb3AgPSBEaXJJdGVtcy0+R2V0TG9nUGF0aCh1cC5EaXJJbmRleCk7IGJyZWFrOw0KKyAgICAgIGNhc2Uga3BpZElzRGlyOiAgcHJvcCA9IGRpLklzRGlyKCk7IGJyZWFrOw0KKyAgICAgIGNhc2Uga3BpZFNpemU6ICBwcm9wID0gZGkuU2l6ZTsgYnJlYWs7DQorICAgICAgY2FzZSBrcGlkQXR0cmliOiAgcHJvcCA9IGRpLkF0dHJpYjsgYnJlYWs7DQorICAgICAgY2FzZSBrcGlkQ1RpbWU6ICBwcm9wID0gZGkuQ1RpbWU7IGJyZWFrOw0KKyAgICAgIGNhc2Uga3BpZEFUaW1lOiAgcHJvcCA9IGRpLkFUaW1lOyBicmVhazsNCisgICAgICBjYXNlIGtwaWRNVGltZTogIHByb3AgPSBkaS5NVGltZTsgYnJlYWs7DQorICAgICAgY2FzZSBrcGlkSXNBbHRTdHJlYW06ICBwcm9wID0gZGkuSXNBbHRTdHJlYW07IGJyZWFrOw0KKyAgICAgICNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoVU5ERVJfQ0UpDQorICAgICAgLy8gY2FzZSBrcGlkU2hvcnROYW1lOiAgcHJvcCA9IGRpLlNob3J0TmFtZTsgYnJlYWs7DQorICAgICAgI2VuZGlmDQorICAgIH0NCisgIH0NCisgIHByb3AuRGV0YWNoKHZhbHVlKTsNCisgIHJldHVybiBTX09LOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorc3RhdGljIE5TeW5jaHJvbml6YXRpb246OkNDcml0aWNhbFNlY3Rpb24gQ1M7DQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlVXBkYXRlQ2FsbGJhY2s6OkdldFN0cmVhbShVSW50MzIgaW5kZXgsIElTZXF1ZW50aWFsSW5TdHJlYW0gKippblN0cmVhbSkNCit7DQorICBDT01fVFJZX0JFR0lODQorICAqaW5TdHJlYW0gPSBOVUxMOw0KKyAgY29uc3QgQ1VwZGF0ZVBhaXIyICZ1cCA9ICgqVXBkYXRlUGFpcnMpW2luZGV4XTsNCisgIGlmICghdXAuTmV3RGF0YSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIA0KKyAgUklOT0soQ2FsbGJhY2stPkNoZWNrQnJlYWsoKSk7DQorICBSSU5PSyhDYWxsYmFjay0+RmluaWxpemUoKSk7DQorDQorICBib29sIGlzRGlyID0gSXNEaXIodXApOw0KKw0KKyAgaWYgKHVwLklzQW50aSkNCisgIHsNCisgICAgVVN0cmluZyBuYW1lOw0KKyAgICBpZiAodXAuQXJjSW5kZXggPj0gMCkNCisgICAgICBuYW1lID0gKCpBcmNJdGVtcylbdXAuQXJjSW5kZXhdLk5hbWU7DQorICAgIGVsc2UgaWYgKHVwLkRpckluZGV4ID49IDApDQorICAgICAgbmFtZSA9IERpckl0ZW1zLT5HZXRMb2dQYXRoKHVwLkRpckluZGV4KTsNCisgICAgUklOT0soQ2FsbGJhY2stPkdldFN0cmVhbShuYW1lLCB0cnVlKSk7DQorICAgIA0KKyAgICAvKiA5LjMzOiBmaXhlZC4gSGFuZGxlcnMgZXhwZWN0IHJlYWwgc3RyZWFtIG9iamVjdCBmb3IgZmlsZXMsIGV2ZW4gZm9yIGFudGktZmlsZS4NCisgICAgICAgc28gd2UgcmV0dXJuIGVtcHR5IHN0cmVhbSAqLw0KKw0KKyAgICBpZiAoIWlzRGlyKQ0KKyAgICB7DQorICAgICAgQ0J1ZkluU3RyZWFtICppblN0cmVhbVNwZWMgPSBuZXcgQ0J1ZkluU3RyZWFtKCk7DQorICAgICAgQ015Q29tUHRyPElTZXF1ZW50aWFsSW5TdHJlYW0+IGluU3RyZWFtTG9jID0gaW5TdHJlYW1TcGVjOw0KKyAgICAgIGluU3RyZWFtU3BlYy0+SW5pdChOVUxMLCAwKTsNCisgICAgICAqaW5TdHJlYW0gPSBpblN0cmVhbUxvYy5EZXRhY2goKTsNCisgICAgfQ0KKyAgICByZXR1cm4gU19PSzsNCisgIH0NCisgIA0KKyAgUklOT0soQ2FsbGJhY2stPkdldFN0cmVhbShEaXJJdGVtcy0+R2V0TG9nUGF0aCh1cC5EaXJJbmRleCksIGZhbHNlKSk7DQorIA0KKyAgaWYgKGlzRGlyKQ0KKyAgICByZXR1cm4gU19PSzsNCisNCisgIGlmIChTdGRJbk1vZGUpDQorICB7DQorICAgIENTdGRJbkZpbGVTdHJlYW0gKmluU3RyZWFtU3BlYyA9IG5ldyBDU3RkSW5GaWxlU3RyZWFtOw0KKyAgICBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gaW5TdHJlYW1Mb2MoaW5TdHJlYW1TcGVjKTsNCisgICAgKmluU3RyZWFtID0gaW5TdHJlYW1Mb2MuRGV0YWNoKCk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIENJbkZpbGVTdHJlYW0gKmluU3RyZWFtU3BlYyA9IG5ldyBDSW5GaWxlU3RyZWFtOw0KKyAgICBDTXlDb21QdHI8SVNlcXVlbnRpYWxJblN0cmVhbT4gaW5TdHJlYW1Mb2MoaW5TdHJlYW1TcGVjKTsNCisNCisgICAgaW5TdHJlYW1TcGVjLT5TdXBwb3J0SGFyZExpbmtzID0gU3RvcmVIYXJkTGlua3M7DQorDQorICAgIGNvbnN0IFVTdHJpbmcgcGF0aCA9IERpckl0ZW1zLT5HZXRQaHlQYXRoKHVwLkRpckluZGV4KTsNCisNCisgICAgI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkNCisgICAgaWYgKERpckl0ZW1zLT5JdGVtc1t1cC5EaXJJbmRleF0uQXJlUmVwYXJzZURhdGEoKSkNCisgICAgew0KKyAgICAgIGlmICghaW5TdHJlYW1TcGVjLT5GaWxlLk9wZW5SZXBhcnNlKHVzMmZzKHBhdGgpKSkNCisgICAgICB7DQorICAgICAgICByZXR1cm4gQ2FsbGJhY2stPk9wZW5GaWxlRXJyb3IocGF0aCwgOjpHZXRMYXN0RXJyb3IoKSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2UNCisgICAgI2VuZGlmDQorICAgIGlmICghaW5TdHJlYW1TcGVjLT5PcGVuU2hhcmVkKHVzMmZzKHBhdGgpLCBTaGFyZUZvcldyaXRlKSkNCisgICAgew0KKyAgICAgIHJldHVybiBDYWxsYmFjay0+T3BlbkZpbGVFcnJvcihwYXRoLCA6OkdldExhc3RFcnJvcigpKTsNCisgICAgfQ0KKw0KKyAgICBpZiAoU3RvcmVIYXJkTGlua3MpDQorICAgIHsNCisgICAgICBDU3RyZWFtRmlsZVByb3BzIHByb3BzOw0KKyAgICAgIGlmIChpblN0cmVhbVNwZWMtPkdldFByb3BzMigmcHJvcHMpID09IFNfT0spDQorICAgICAgew0KKyAgICAgICAgaWYgKHByb3BzLk51bUxpbmtzID4gMSkNCisgICAgICAgIHsNCisgICAgICAgICAgQ0tleUtleVZhbFBhaXIgcGFpcjsNCisgICAgICAgICAgcGFpci5LZXkxID0gcHJvcHMuVm9sSUQ7DQorICAgICAgICAgIHBhaXIuS2V5MiA9IHByb3BzLkZpbGVJRF9Mb3c7DQorICAgICAgICAgIHBhaXIuVmFsdWUgPSBpbmRleDsNCisgICAgICAgICAgdW5zaWduZWQgbnVtSXRlbXMgPSBfbWFwLlNpemUoKTsNCisgICAgICAgICAgdW5zaWduZWQgcGFpckluZGV4ID0gX21hcC5BZGRUb1VuaXF1ZVNvcnRlZDIocGFpcik7DQorICAgICAgICAgIGlmIChudW1JdGVtcyA9PSBfbWFwLlNpemUoKSkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIC8vIGNvbnN0IENLZXlLZXlWYWxQYWlyICZwYWlyMiA9IF9tYXAuUGFpcnNbcGFpckluZGV4XTsNCisgICAgICAgICAgICBfaGFyZEluZGV4X0Zyb20gPSBpbmRleDsNCisgICAgICAgICAgICBfaGFyZEluZGV4X1RvID0gcGFpckluZGV4Ow0KKyAgICAgICAgICAgIC8vIHdlIGNvdWxkIHJldHVybiBOVUxMIGFzIHN0cmVhbSwgYnV0IGl0J3MgYmV0dGVyIHRvIHJldHVybiByZWFsIHN0cmVhbQ0KKyAgICAgICAgICAgIC8vIHJldHVybiBTX09LOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIGlmIChQcm9jZXNzZWRJdGVtc1N0YXR1c2VzKQ0KKyAgICB7DQorICAgICAgTlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbkxvY2sgbG9jayhDUyk7DQorICAgICAgUHJvY2Vzc2VkSXRlbXNTdGF0dXNlc1t1cC5EaXJJbmRleF0gPSAxOw0KKyAgICB9DQorICAgICppblN0cmVhbSA9IGluU3RyZWFtTG9jLkRldGFjaCgpOw0KKyAgfQ0KKyAgDQorICByZXR1cm4gU19PSzsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrOjpTZXRPcGVyYXRpb25SZXN1bHQoSW50MzIgb3BlcmF0aW9uUmVzdWx0KQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIHJldHVybiBDYWxsYmFjay0+U2V0T3BlcmF0aW9uUmVzdWx0KG9wZXJhdGlvblJlc3VsdCk7DQorICBDT01fVFJZX0VORA0KK30NCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazo6R2V0Vm9sdW1lU2l6ZShVSW50MzIgaW5kZXgsIFVJbnQ2NCAqc2l6ZSkNCit7DQorICBpZiAoVm9sdW1lc1NpemVzLlNpemUoKSA9PSAwKQ0KKyAgICByZXR1cm4gU19GQUxTRTsNCisgIGlmIChpbmRleCA+PSAoVUludDMyKVZvbHVtZXNTaXplcy5TaXplKCkpDQorICAgIGluZGV4ID0gVm9sdW1lc1NpemVzLlNpemUoKSAtIDE7DQorICAqc2l6ZSA9IFZvbHVtZXNTaXplc1tpbmRleF07DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlVXBkYXRlQ2FsbGJhY2s6OkdldFZvbHVtZVN0cmVhbShVSW50MzIgaW5kZXgsIElTZXF1ZW50aWFsT3V0U3RyZWFtICoqdm9sdW1lU3RyZWFtKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIEZDaGFyIHRlbXBbMTZdOw0KKyAgQ29udmVydFVJbnQzMlRvU3RyaW5nKGluZGV4ICsgMSwgdGVtcCk7DQorICBGU3RyaW5nIHJlcyA9IHRlbXA7DQorICB3aGlsZSAocmVzLkxlbigpIDwgMikNCisgICAgcmVzLkluc2VydEF0RnJvbnQoRlRFWFQoJzAnKSk7DQorICBGU3RyaW5nIGZpbGVOYW1lID0gVm9sTmFtZTsNCisgIGZpbGVOYW1lICs9IEwnLic7DQorICBmaWxlTmFtZSArPSByZXM7DQorICBmaWxlTmFtZSArPSBWb2xFeHQ7DQorICBDT3V0RmlsZVN0cmVhbSAqc3RyZWFtU3BlYyA9IG5ldyBDT3V0RmlsZVN0cmVhbTsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gc3RyZWFtTG9jKHN0cmVhbVNwZWMpOw0KKyAgaWYgKCFzdHJlYW1TcGVjLT5DcmVhdGUoZmlsZU5hbWUsIGZhbHNlKSkNCisgICAgcmV0dXJuIDo6R2V0TGFzdEVycm9yKCk7DQorICAqdm9sdW1lU3RyZWFtID0gc3RyZWFtTG9jLkRldGFjaCgpOw0KKyAgcmV0dXJuIFNfT0s7DQorICBDT01fVFJZX0VORA0KK30NCisNCitTVERNRVRIT0RJTVAgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazo6Q3J5cHRvR2V0VGV4dFBhc3N3b3JkMihJbnQzMiAqcGFzc3dvcmRJc0RlZmluZWQsIEJTVFIgKnBhc3N3b3JkKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIHJldHVybiBDYWxsYmFjay0+Q3J5cHRvR2V0VGV4dFBhc3N3b3JkMihwYXNzd29yZElzRGVmaW5lZCwgcGFzc3dvcmQpOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorU1RETUVUSE9ESU1QIENBcmNoaXZlVXBkYXRlQ2FsbGJhY2s6OkNyeXB0b0dldFRleHRQYXNzd29yZChCU1RSICpwYXNzd29yZCkNCit7DQorICBDT01fVFJZX0JFR0lODQorICByZXR1cm4gQ2FsbGJhY2stPkNyeXB0b0dldFRleHRQYXNzd29yZChwYXNzd29yZCk7DQorICBDT01fVFJZX0VORA0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9VcGRhdGVDYWxsYmFjay5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vVXBkYXRlQ2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTU0NGRiCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vVXBkYXRlQ2FsbGJhY2suaApAQCAtMCwwICsxLDEyMiBAQAorLy8gVXBkYXRlQ2FsbGJhY2suaA0KKw0KKyNpZm5kZWYgX19VUERBVEVfQ0FMTEJBQ0tfSA0KKyNkZWZpbmUgX19VUERBVEVfQ0FMTEJBQ0tfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlDb20uaCINCisNCisjaW5jbHVkZSAiLi4vLi4vSVBhc3N3b3JkLmgiDQorI2luY2x1ZGUgIi4uLy4uL0lDb2Rlci5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vVXBkYXRlUGFpci5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vVXBkYXRlUHJvZHVjZS5oIg0KKw0KKyNkZWZpbmUgSU5URVJGQUNFX0lVcGRhdGVDYWxsYmFja1VJKHgpIFwNCisgIHZpcnR1YWwgSFJFU1VMVCBTZXRUb3RhbChVSW50NjQgc2l6ZSkgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIFNldENvbXBsZXRlZChjb25zdCBVSW50NjQgKmNvbXBsZXRlVmFsdWUpIHg7IFwNCisgIHZpcnR1YWwgSFJFU1VMVCBTZXRSYXRpb0luZm8oY29uc3QgVUludDY0ICppblNpemUsIGNvbnN0IFVJbnQ2NCAqb3V0U2l6ZSkgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIENoZWNrQnJlYWsoKSB4OyBcDQorICB2aXJ0dWFsIEhSRVNVTFQgRmluaWxpemUoKSB4OyBcDQorICB2aXJ0dWFsIEhSRVNVTFQgU2V0TnVtRmlsZXMoVUludDY0IG51bUZpbGVzKSB4OyBcDQorICB2aXJ0dWFsIEhSRVNVTFQgR2V0U3RyZWFtKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGJvb2wgaXNBbnRpKSB4OyBcDQorICB2aXJ0dWFsIEhSRVNVTFQgT3BlbkZpbGVFcnJvcihjb25zdCB3Y2hhcl90ICpuYW1lLCBEV09SRCBzeXN0ZW1FcnJvcikgeDsgXA0KKyAgdmlydHVhbCBIUkVTVUxUIFNldE9wZXJhdGlvblJlc3VsdChJbnQzMiBvcGVyYXRpb25SZXN1bHQpIHg7IFwNCisgIHZpcnR1YWwgSFJFU1VMVCBDcnlwdG9HZXRUZXh0UGFzc3dvcmQyKEludDMyICpwYXNzd29yZElzRGVmaW5lZCwgQlNUUiAqcGFzc3dvcmQpIHg7IFwNCisgIHZpcnR1YWwgSFJFU1VMVCBDcnlwdG9HZXRUZXh0UGFzc3dvcmQoQlNUUiAqcGFzc3dvcmQpIHg7IFwNCisgIC8qIHZpcnR1YWwgSFJFU1VMVCBTaG93RGVsZXRlRmlsZShjb25zdCB3Y2hhcl90ICpuYW1lKSB4OyAqLyBcDQorICAvKiB2aXJ0dWFsIEhSRVNVTFQgQ2xvc2VQcm9ncmVzcygpIHsgcmV0dXJuIFNfT0s7IH07ICovDQorDQorc3RydWN0IElVcGRhdGVDYWxsYmFja1VJDQorew0KKyAgSU5URVJGQUNFX0lVcGRhdGVDYWxsYmFja1VJKD0wKQ0KK307DQorDQorc3RydWN0IENLZXlLZXlWYWxQYWlyDQorew0KKyAgVUludDY0IEtleTE7DQorICBVSW50NjQgS2V5MjsNCisgIHVuc2lnbmVkIFZhbHVlOw0KKw0KKyAgaW50IENvbXBhcmUoY29uc3QgQ0tleUtleVZhbFBhaXIgJmEpIGNvbnN0DQorICB7DQorICAgIGlmIChLZXkxIDwgYS5LZXkxKSByZXR1cm4gLTE7DQorICAgIGlmIChLZXkxID4gYS5LZXkxKSByZXR1cm4gMTsNCisgICAgcmV0dXJuIE15Q29tcGFyZShLZXkyLCBhLktleTIpOw0KKyAgfQ0KK307DQorDQorDQorY2xhc3MgQ0FyY2hpdmVVcGRhdGVDYWxsYmFjazoNCisgIHB1YmxpYyBJQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrMiwNCisgIHB1YmxpYyBJQXJjaGl2ZUdldFJhd1Byb3BzLA0KKyAgcHVibGljIElBcmNoaXZlR2V0Um9vdFByb3BzLA0KKyAgcHVibGljIElDcnlwdG9HZXRUZXh0UGFzc3dvcmQyLA0KKyAgcHVibGljIElDcnlwdG9HZXRUZXh0UGFzc3dvcmQsDQorICBwdWJsaWMgSUNvbXByZXNzUHJvZ3Jlc3NJbmZvLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKyAgYm9vbCBfc2FjbEVuYWJsZWQ7DQorICAjZW5kaWYNCisgIENSZWNvcmRWZWN0b3I8Q0tleUtleVZhbFBhaXI+IF9tYXA7DQorDQorICBVSW50MzIgX2hhcmRJbmRleF9Gcm9tOw0KKyAgVUludDMyIF9oYXJkSW5kZXhfVG87DQorDQorcHVibGljOg0KKyAgTVlfVU5LTk9XTl9JTVA2KA0KKyAgICAgIElBcmNoaXZlVXBkYXRlQ2FsbGJhY2syLA0KKyAgICAgIElBcmNoaXZlR2V0UmF3UHJvcHMsDQorICAgICAgSUFyY2hpdmVHZXRSb290UHJvcHMsDQorICAgICAgSUNyeXB0b0dldFRleHRQYXNzd29yZDIsDQorICAgICAgSUNyeXB0b0dldFRleHRQYXNzd29yZCwNCisgICAgICBJQ29tcHJlc3NQcm9ncmVzc0luZm8pDQorDQorICBTVERNRVRIT0QoU2V0UmF0aW9JbmZvKShjb25zdCBVSW50NjQgKmluU2l6ZSwgY29uc3QgVUludDY0ICpvdXRTaXplKTsNCisNCisgIElOVEVSRkFDRV9JQXJjaGl2ZVVwZGF0ZUNhbGxiYWNrMig7KQ0KKyAgSU5URVJGQUNFX0lBcmNoaXZlR2V0UmF3UHJvcHMoOykNCisgIElOVEVSRkFDRV9JQXJjaGl2ZUdldFJvb3RQcm9wcyg7KQ0KKw0KKyAgU1RETUVUSE9EKENyeXB0b0dldFRleHRQYXNzd29yZDIpKEludDMyICpwYXNzd29yZElzRGVmaW5lZCwgQlNUUiAqcGFzc3dvcmQpOw0KKyAgU1RETUVUSE9EKENyeXB0b0dldFRleHRQYXNzd29yZCkoQlNUUiAqcGFzc3dvcmQpOw0KKw0KKyAgQ1JlY29yZFZlY3RvcjxVSW50NjQ+IFZvbHVtZXNTaXplczsNCisgIEZTdHJpbmcgVm9sTmFtZTsNCisgIEZTdHJpbmcgVm9sRXh0Ow0KKw0KKyAgSVVwZGF0ZUNhbGxiYWNrVUkgKkNhbGxiYWNrOw0KKw0KKyAgYm9vbCBTaGFyZUZvcldyaXRlOw0KKyAgYm9vbCBTdGRJbk1vZGU7DQorICANCisgIGNvbnN0IENEaXJJdGVtcyAqRGlySXRlbXM7DQorICBjb25zdCBDRGlySXRlbSAqUGFyZW50RGlySXRlbTsNCisgIA0KKyAgY29uc3QgQ09iamVjdFZlY3RvcjxDQXJjSXRlbT4gKkFyY0l0ZW1zOw0KKyAgY29uc3QgQ1JlY29yZFZlY3RvcjxDVXBkYXRlUGFpcjI+ICpVcGRhdGVQYWlyczsNCisgIGNvbnN0IFVTdHJpbmdWZWN0b3IgKk5ld05hbWVzOw0KKyAgQ015Q29tUHRyPElJbkFyY2hpdmU+IEFyY2hpdmU7DQorICBDTXlDb21QdHI8SUFyY2hpdmVHZXRSYXdQcm9wcz4gR2V0UmF3UHJvcHM7DQorICBDTXlDb21QdHI8SUFyY2hpdmVHZXRSb290UHJvcHM+IEdldFJvb3RQcm9wczsNCisNCisgIGJvb2wgS2VlcE9yaWdpbmFsSXRlbU5hbWVzOw0KKyAgYm9vbCBTdG9yZU50U2VjdXJpdHk7DQorICBib29sIFN0b3JlSGFyZExpbmtzOw0KKyAgYm9vbCBTdG9yZVN5bUxpbmtzOw0KKw0KKyAgQnl0ZSAqUHJvY2Vzc2VkSXRlbXNTdGF0dXNlczsNCisNCisgIENBcmNoaXZlVXBkYXRlQ2FsbGJhY2soKTsNCisNCisgIGJvb2wgSXNEaXIoY29uc3QgQ1VwZGF0ZVBhaXIyICZ1cCkgY29uc3QNCisgIHsNCisgICAgaWYgKHVwLkRpckluZGV4ID49IDApDQorICAgICAgcmV0dXJuIERpckl0ZW1zLT5JdGVtc1t1cC5EaXJJbmRleF0uSXNEaXIoKTsNCisgICAgZWxzZSBpZiAodXAuQXJjSW5kZXggPj0gMCkNCisgICAgICByZXR1cm4gKCpBcmNJdGVtcylbdXAuQXJjSW5kZXhdLklzRGlyOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9VcGRhdGVQYWlyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1VwZGF0ZVBhaXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YzljNTEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9VcGRhdGVQYWlyLmNwcApAQCAtMCwwICsxLDIzMyBAQAorLy8gVXBkYXRlUGFpci5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgPHRpbWUuaD4NCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1dpbGRjYXJkLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvVGltZVV0aWxzLmgiDQorDQorI2luY2x1ZGUgIlNvcnRVdGlscy5oIg0KKyNpbmNsdWRlICJVcGRhdGVQYWlyLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KK3VzaW5nIG5hbWVzcGFjZSBOVGltZTsNCisNCitzdGF0aWMgaW50IE15Q29tcGFyZVRpbWUoTkZpbGVUaW1lVHlwZTo6RUVudW0gZmlsZVRpbWVUeXBlLCBjb25zdCBGSUxFVElNRSAmdGltZTEsIGNvbnN0IEZJTEVUSU1FICZ0aW1lMikNCit7DQorICBzd2l0Y2ggKGZpbGVUaW1lVHlwZSkNCisgIHsNCisgICAgY2FzZSBORmlsZVRpbWVUeXBlOjprV2luZG93czoNCisgICAgICByZXR1cm4gOjpDb21wYXJlRmlsZVRpbWUoJnRpbWUxLCAmdGltZTIpOw0KKyAgICBjYXNlIE5GaWxlVGltZVR5cGU6OmtVbml4Og0KKyAgICAgIHsNCisgICAgICAgIFVJbnQzMiB1bml4VGltZTEsIHVuaXhUaW1lMjsNCisgICAgICAgIEZpbGVUaW1lVG9Vbml4VGltZSh0aW1lMSwgdW5peFRpbWUxKTsNCisgICAgICAgIEZpbGVUaW1lVG9Vbml4VGltZSh0aW1lMiwgdW5peFRpbWUyKTsNCisgICAgICAgIHJldHVybiBNeUNvbXBhcmUodW5peFRpbWUxLCB1bml4VGltZTIpOw0KKyAgICAgIH0NCisgICAgY2FzZSBORmlsZVRpbWVUeXBlOjprRE9TOg0KKyAgICAgIHsNCisgICAgICAgIFVJbnQzMiBkb3NUaW1lMSwgZG9zVGltZTI7DQorICAgICAgICBGaWxlVGltZVRvRG9zVGltZSh0aW1lMSwgZG9zVGltZTEpOw0KKyAgICAgICAgRmlsZVRpbWVUb0Rvc1RpbWUodGltZTIsIGRvc1RpbWUyKTsNCisgICAgICAgIHJldHVybiBNeUNvbXBhcmUoZG9zVGltZTEsIGRvc1RpbWUyKTsNCisgICAgICB9DQorICB9DQorICB0aHJvdyA0MTkxNjE4Ow0KK30NCisNCitzdGF0aWMgY29uc3QgY2hhciAqa19EdXBsaWNhdGVfaW5BcmNfTWVzc2FnZSA9ICJEdXBsaWNhdGUgZmlsZW5hbWUgaW4gYXJjaGl2ZToiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprX0R1cGxpY2F0ZV9pbkRpcl9NZXNzYWdlID0gIkR1cGxpY2F0ZSBmaWxlbmFtZSBvbiBkaXNrOiI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtfTm90Q2Vuc29yZWRDb2xsaXNpb25fTWVzc2FnZSA9ICJJbnRlcm5hbCBmaWxlIG5hbWUgY29sbGlzaW9uIChmaWxlIG9uIGRpc2ssIGZpbGUgaW4gYXJjaGl2ZSk6IjsNCisNCitzdGF0aWMgdm9pZCBUaHJvd0Vycm9yKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGNvbnN0IFVTdHJpbmcgJnMxLCBjb25zdCBVU3RyaW5nICZzMikNCit7DQorICBVU3RyaW5nIG07DQorICBtLlNldEZyb21Bc2NpaShtZXNzYWdlKTsNCisgIG0gKz0gTCdcbic7IG0gKz0gczE7DQorICBtICs9IEwnXG4nOyBtICs9IHMyOw0KKyAgdGhyb3cgbTsNCit9DQorDQorc3RhdGljIGludCBDb21wYXJlQXJjSXRlbXNCYXNlKGNvbnN0IENBcmNJdGVtICZhaTEsIGNvbnN0IENBcmNJdGVtICZhaTIpDQorew0KKyAgaW50IHJlcyA9IENvbXBhcmVGaWxlTmFtZXMoYWkxLk5hbWUsIGFpMi5OYW1lKTsNCisgIGlmIChyZXMgIT0gMCkNCisgICAgcmV0dXJuIHJlczsNCisgIGlmIChhaTEuSXNEaXIgIT0gYWkyLklzRGlyKQ0KKyAgICByZXR1cm4gYWkxLklzRGlyID8gLTEgOiAxOw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbnQgQ29tcGFyZUFyY0l0ZW1zKGNvbnN0IHVuc2lnbmVkICpwMSwgY29uc3QgdW5zaWduZWQgKnAyLCB2b2lkICpwYXJhbSkNCit7DQorICB1bnNpZ25lZCBpMSA9ICpwMTsNCisgIHVuc2lnbmVkIGkyID0gKnAyOw0KKyAgY29uc3QgQ09iamVjdFZlY3RvcjxDQXJjSXRlbT4gJmFyY0l0ZW1zID0gKihjb25zdCBDT2JqZWN0VmVjdG9yPENBcmNJdGVtPiAqKXBhcmFtOw0KKyAgaW50IHJlcyA9IENvbXBhcmVBcmNJdGVtc0Jhc2UoYXJjSXRlbXNbaTFdLCBhcmNJdGVtc1tpMl0pOw0KKyAgaWYgKHJlcyAhPSAwKQ0KKyAgICByZXR1cm4gcmVzOw0KKyAgcmV0dXJuIE15Q29tcGFyZShpMSwgaTIpOw0KK30NCisNCit2b2lkIEdldFVwZGF0ZVBhaXJJbmZvTGlzdCgNCisgICAgY29uc3QgQ0Rpckl0ZW1zICZkaXJJdGVtcywNCisgICAgY29uc3QgQ09iamVjdFZlY3RvcjxDQXJjSXRlbT4gJmFyY0l0ZW1zLA0KKyAgICBORmlsZVRpbWVUeXBlOjpFRW51bSBmaWxlVGltZVR5cGUsDQorICAgIENSZWNvcmRWZWN0b3I8Q1VwZGF0ZVBhaXI+ICZ1cGRhdGVQYWlycykNCit7DQorICBDVUludFZlY3RvciBkaXJJbmRpY2VzLCBhcmNJbmRpY2VzOw0KKyAgDQorICB1bnNpZ25lZCBudW1EaXJJdGVtcyA9IGRpckl0ZW1zLkl0ZW1zLlNpemUoKTsNCisgIHVuc2lnbmVkIG51bUFyY0l0ZW1zID0gYXJjSXRlbXMuU2l6ZSgpOw0KKyAgDQorICBDSW50QXJyIGR1cGxpY2F0ZWRBcmNJdGVtKG51bUFyY0l0ZW1zKTsNCisgIHsNCisgICAgaW50ICp2YWxzID0gJmR1cGxpY2F0ZWRBcmNJdGVtWzBdOw0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtQXJjSXRlbXM7IGkrKykNCisgICAgICB2YWxzW2ldID0gMDsNCisgIH0NCisNCisgIHsNCisgICAgYXJjSW5kaWNlcy5DbGVhckFuZFNldFNpemUobnVtQXJjSXRlbXMpOw0KKyAgICB7DQorICAgICAgdW5zaWduZWQgKnZhbHMgPSAmYXJjSW5kaWNlc1swXTsNCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtQXJjSXRlbXM7IGkrKykNCisgICAgICAgIHZhbHNbaV0gPSBpOw0KKyAgICB9DQorICAgIGFyY0luZGljZXMuU29ydChDb21wYXJlQXJjSXRlbXMsICh2b2lkICopJmFyY0l0ZW1zKTsNCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSArIDEgPCBudW1BcmNJdGVtczsgaSsrKQ0KKyAgICAgIGlmIChDb21wYXJlQXJjSXRlbXNCYXNlKA0KKyAgICAgICAgICBhcmNJdGVtc1thcmNJbmRpY2VzW2ldXSwNCisgICAgICAgICAgYXJjSXRlbXNbYXJjSW5kaWNlc1tpICsgMV1dKSA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgIGR1cGxpY2F0ZWRBcmNJdGVtW2ldID0gMTsNCisgICAgICAgIGR1cGxpY2F0ZWRBcmNJdGVtW2kgKyAxXSA9IC0xOw0KKyAgICAgIH0NCisgIH0NCisNCisgIFVTdHJpbmdWZWN0b3IgZGlyTmFtZXM7DQorICB7DQorICAgIGRpck5hbWVzLkNsZWFyQW5kUmVzZXJ2ZShudW1EaXJJdGVtcyk7DQorICAgIHVuc2lnbmVkIGk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1EaXJJdGVtczsgaSsrKQ0KKyAgICAgIGRpck5hbWVzLkFkZEluUmVzZXJ2ZWQoZGlySXRlbXMuR2V0TG9nUGF0aChpKSk7DQorICAgIFNvcnRGaWxlTmFtZXMoZGlyTmFtZXMsIGRpckluZGljZXMpOw0KKyAgICBmb3IgKGkgPSAwOyBpICsgMSA8IG51bURpckl0ZW1zOyBpKyspDQorICAgIHsNCisgICAgICBjb25zdCBVU3RyaW5nICZzMSA9IGRpck5hbWVzW2RpckluZGljZXNbaV1dOw0KKyAgICAgIGNvbnN0IFVTdHJpbmcgJnMyID0gZGlyTmFtZXNbZGlySW5kaWNlc1tpICsgMV1dOw0KKyAgICAgIGlmIChDb21wYXJlRmlsZU5hbWVzKHMxLCBzMikgPT0gMCkNCisgICAgICAgIFRocm93RXJyb3Ioa19EdXBsaWNhdGVfaW5EaXJfTWVzc2FnZSwgczEsIHMyKTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICB1bnNpZ25lZCBkaXJJbmRleCA9IDA7DQorICB1bnNpZ25lZCBhcmNJbmRleCA9IDA7DQorDQorICBpbnQgcHJldkhvc3RGaWxlID0gLTE7DQorICBjb25zdCBVU3RyaW5nICpwcmV2SG9zdE5hbWUgPSBOVUxMOw0KKyAgDQorICB3aGlsZSAoZGlySW5kZXggPCBudW1EaXJJdGVtcyB8fCBhcmNJbmRleCA8IG51bUFyY0l0ZW1zKQ0KKyAgew0KKyAgICBDVXBkYXRlUGFpciBwYWlyOw0KKyAgICANCisgICAgaW50IGRpckluZGV4MiA9IC0xOw0KKyAgICBpbnQgYXJjSW5kZXgyID0gLTE7DQorICAgIGNvbnN0IENEaXJJdGVtICpkaSA9IE5VTEw7DQorICAgIGNvbnN0IENBcmNJdGVtICphaSA9IE5VTEw7DQorICAgIA0KKyAgICBpbnQgY29tcGFyZVJlc3VsdCA9IC0xOw0KKyAgICBjb25zdCBVU3RyaW5nICpuYW1lID0gTlVMTDsNCisgICAgDQorICAgIGlmIChkaXJJbmRleCA8IG51bURpckl0ZW1zKQ0KKyAgICB7DQorICAgICAgZGlySW5kZXgyID0gZGlySW5kaWNlc1tkaXJJbmRleF07DQorICAgICAgZGkgPSAmZGlySXRlbXMuSXRlbXNbZGlySW5kZXgyXTsNCisgICAgfQ0KKw0KKyAgICBpZiAoYXJjSW5kZXggPCBudW1BcmNJdGVtcykNCisgICAgew0KKyAgICAgIGFyY0luZGV4MiA9IGFyY0luZGljZXNbYXJjSW5kZXhdOw0KKyAgICAgIGFpID0gJmFyY0l0ZW1zW2FyY0luZGV4Ml07DQorICAgICAgY29tcGFyZVJlc3VsdCA9IDE7DQorICAgICAgaWYgKGRpckluZGV4IDwgbnVtRGlySXRlbXMpDQorICAgICAgew0KKyAgICAgICAgY29tcGFyZVJlc3VsdCA9IENvbXBhcmVGaWxlTmFtZXMoZGlyTmFtZXNbZGlySW5kZXgyXSwgYWktPk5hbWUpOw0KKyAgICAgICAgaWYgKGNvbXBhcmVSZXN1bHQgPT0gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgaWYgKGRpLT5Jc0RpcigpICE9IGFpLT5Jc0RpcikNCisgICAgICAgICAgICBjb21wYXJlUmVzdWx0ID0gKGFpLT5Jc0RpciA/IDEgOiAtMSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBpZiAoY29tcGFyZVJlc3VsdCA8IDApDQorICAgIHsNCisgICAgICBuYW1lID0gJmRpck5hbWVzW2RpckluZGV4Ml07DQorICAgICAgcGFpci5TdGF0ZSA9IE5VcGRhdGVBcmNoaXZlOjpOUGFpclN0YXRlOjprT25seU9uRGlzazsNCisgICAgICBwYWlyLkRpckluZGV4ID0gZGlySW5kZXgyOw0KKyAgICAgIGRpckluZGV4Kys7DQorICAgIH0NCisgICAgZWxzZSBpZiAoY29tcGFyZVJlc3VsdCA+IDApDQorICAgIHsNCisgICAgICBuYW1lID0gJmFpLT5OYW1lOw0KKyAgICAgIHBhaXIuU3RhdGUgPSBhaS0+Q2Vuc29yZWQgPw0KKyAgICAgICAgICBOVXBkYXRlQXJjaGl2ZTo6TlBhaXJTdGF0ZTo6a09ubHlJbkFyY2hpdmU6DQorICAgICAgICAgIE5VcGRhdGVBcmNoaXZlOjpOUGFpclN0YXRlOjprTm90TWFza2VkOw0KKyAgICAgIHBhaXIuQXJjSW5kZXggPSBhcmNJbmRleDI7DQorICAgICAgYXJjSW5kZXgrKzsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBpbnQgZHVwbCA9IGR1cGxpY2F0ZWRBcmNJdGVtW2FyY0luZGV4XTsNCisgICAgICBpZiAoZHVwbCAhPSAwKQ0KKyAgICAgICAgVGhyb3dFcnJvcihrX0R1cGxpY2F0ZV9pbkFyY19NZXNzYWdlLCBhaS0+TmFtZSwgYXJjSXRlbXNbYXJjSW5kaWNlc1thcmNJbmRleCArIGR1cGxdXS5OYW1lKTsNCisNCisgICAgICBuYW1lID0gJmRpck5hbWVzW2RpckluZGV4Ml07DQorICAgICAgaWYgKCFhaS0+Q2Vuc29yZWQpDQorICAgICAgICBUaHJvd0Vycm9yKGtfTm90Q2Vuc29yZWRDb2xsaXNpb25fTWVzc2FnZSwgKm5hbWUsIGFpLT5OYW1lKTsNCisgICAgICANCisgICAgICBwYWlyLkRpckluZGV4ID0gZGlySW5kZXgyOw0KKyAgICAgIHBhaXIuQXJjSW5kZXggPSBhcmNJbmRleDI7DQorDQorICAgICAgc3dpdGNoIChhaS0+TVRpbWVEZWZpbmVkID8gTXlDb21wYXJlVGltZSgNCisgICAgICAgICAgYWktPlRpbWVUeXBlICE9IC0gMSA/IChORmlsZVRpbWVUeXBlOjpFRW51bSlhaS0+VGltZVR5cGUgOiBmaWxlVGltZVR5cGUsDQorICAgICAgICAgIGRpLT5NVGltZSwgYWktPk1UaW1lKTogMCkNCisgICAgICB7DQorICAgICAgICBjYXNlIC0xOiBwYWlyLlN0YXRlID0gTlVwZGF0ZUFyY2hpdmU6Ok5QYWlyU3RhdGU6OmtOZXdJbkFyY2hpdmU7IGJyZWFrOw0KKyAgICAgICAgY2FzZSAgMTogcGFpci5TdGF0ZSA9IE5VcGRhdGVBcmNoaXZlOjpOUGFpclN0YXRlOjprT2xkSW5BcmNoaXZlOyBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIHBhaXIuU3RhdGUgPSAoYWktPlNpemVEZWZpbmVkICYmIGRpLT5TaXplID09IGFpLT5TaXplKSA/DQorICAgICAgICAgICAgICBOVXBkYXRlQXJjaGl2ZTo6TlBhaXJTdGF0ZTo6a1NhbWVGaWxlcyA6DQorICAgICAgICAgICAgICBOVXBkYXRlQXJjaGl2ZTo6TlBhaXJTdGF0ZTo6a1Vua25vd05ld2VyRmlsZXM7DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIGRpckluZGV4Kys7DQorICAgICAgYXJjSW5kZXgrKzsNCisgICAgfQ0KKyAgICANCisgICAgaWYgKChkaSAmJiBkaS0+SXNBbHRTdHJlYW0pIHx8DQorICAgICAgICAoYWkgJiYgYWktPklzQWx0U3RyZWFtKSkNCisgICAgew0KKyAgICAgIGlmIChwcmV2SG9zdE5hbWUpDQorICAgICAgew0KKyAgICAgICAgdW5zaWduZWQgaG9zdExlbiA9IHByZXZIb3N0TmFtZS0+TGVuKCk7DQorICAgICAgICBpZiAobmFtZS0+TGVuKCkgPiBob3N0TGVuKQ0KKyAgICAgICAgICBpZiAoKCpuYW1lKVtob3N0TGVuXSA9PSAnOicgJiYgQ29tcGFyZUZpbGVOYW1lcygqcHJldkhvc3ROYW1lLCBuYW1lLT5MZWZ0KGhvc3RMZW4pKSA9PSAwKQ0KKyAgICAgICAgICAgIHBhaXIuSG9zdEluZGV4ID0gcHJldkhvc3RGaWxlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBwcmV2SG9zdEZpbGUgPSB1cGRhdGVQYWlycy5TaXplKCk7DQorICAgICAgcHJldkhvc3ROYW1lID0gbmFtZTsNCisgICAgfQ0KKyAgICANCisgICAgdXBkYXRlUGFpcnMuQWRkKHBhaXIpOw0KKyAgfQ0KKw0KKyAgdXBkYXRlUGFpcnMuUmVzZXJ2ZURvd24oKTsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vVXBkYXRlUGFpci5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vVXBkYXRlUGFpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZGEyNDMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9VcGRhdGVQYWlyLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gVXBkYXRlUGFpci5oDQorDQorI2lmbmRlZiBfX1VQREFURV9QQUlSX0gNCisjZGVmaW5lIF9fVVBEQVRFX1BBSVJfSA0KKw0KKyNpbmNsdWRlICJEaXJJdGVtLmgiDQorI2luY2x1ZGUgIlVwZGF0ZUFjdGlvbi5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9BcmNoaXZlL0lBcmNoaXZlLmgiDQorDQorc3RydWN0IENVcGRhdGVQYWlyDQorew0KKyAgTlVwZGF0ZUFyY2hpdmU6Ok5QYWlyU3RhdGU6OkVFbnVtIFN0YXRlOw0KKyAgaW50IEFyY0luZGV4Ow0KKyAgaW50IERpckluZGV4Ow0KKyAgaW50IEhvc3RJbmRleDsgLy8gPj0gMCBmb3IgYWx0IHN0cmVhbXMgb25seSwgY29udGFpbnMgaW5kZXggb2YgaG9zdCBwYWlyDQorDQorICBDVXBkYXRlUGFpcigpOiBBcmNJbmRleCgtMSksIERpckluZGV4KC0xKSwgSG9zdEluZGV4KC0xKSB7fQ0KK307DQorDQordm9pZCBHZXRVcGRhdGVQYWlySW5mb0xpc3QoDQorICAgIGNvbnN0IENEaXJJdGVtcyAmZGlySXRlbXMsDQorICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q0FyY0l0ZW0+ICZhcmNJdGVtcywNCisgICAgTkZpbGVUaW1lVHlwZTo6RUVudW0gZmlsZVRpbWVUeXBlLA0KKyAgICBDUmVjb3JkVmVjdG9yPENVcGRhdGVQYWlyPiAmdXBkYXRlUGFpcnMpOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1VwZGF0ZVByb2R1Y2UuY3BwIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vVXBkYXRlUHJvZHVjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcyNmFmMwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1VwZGF0ZVByb2R1Y2UuY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8vIFVwZGF0ZVByb2R1Y2UuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJVcGRhdGVQcm9kdWNlLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5VcGRhdGVBcmNoaXZlOw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICprVXBkYXRlQWN0aW9uU2V0Q29sbGlzaW9uID0gIkludGVybmFsIGNvbGxpc2lvbiBpbiB1cGRhdGUgYWN0aW9uIHNldCI7DQorDQordm9pZCBVcGRhdGVQcm9kdWNlKA0KKyAgICBjb25zdCBDUmVjb3JkVmVjdG9yPENVcGRhdGVQYWlyPiAmdXBkYXRlUGFpcnMsDQorICAgIGNvbnN0IENBY3Rpb25TZXQgJmFjdGlvblNldCwNCisgICAgQ1JlY29yZFZlY3RvcjxDVXBkYXRlUGFpcjI+ICZvcGVyYXRpb25DaGFpbiwNCisgICAgSVVwZGF0ZVByb2R1Y2VDYWxsYmFjayAqY2FsbGJhY2spDQorew0KKyAgRk9SX1ZFQ1RPUiAoaSwgdXBkYXRlUGFpcnMpDQorICB7DQorICAgIGNvbnN0IENVcGRhdGVQYWlyICZwYWlyID0gdXBkYXRlUGFpcnNbaV07DQorDQorICAgIENVcGRhdGVQYWlyMiB1cDI7DQorICAgIHVwMi5EaXJJbmRleCA9IHBhaXIuRGlySW5kZXg7DQorICAgIHVwMi5BcmNJbmRleCA9IHBhaXIuQXJjSW5kZXg7DQorICAgIHVwMi5OZXdEYXRhID0gdXAyLk5ld1Byb3BzID0gdHJ1ZTsNCisgICAgdXAyLlVzZUFyY1Byb3BzID0gZmFsc2U7DQorICAgIA0KKyAgICBzd2l0Y2ggKGFjdGlvblNldC5TdGF0ZUFjdGlvbnNbcGFpci5TdGF0ZV0pDQorICAgIHsNCisgICAgICBjYXNlIE5QYWlyQWN0aW9uOjprSWdub3JlOg0KKyAgICAgICAgLyoNCisgICAgICAgIGlmIChwYWlyLlN0YXRlICE9IE5QYWlyU3RhdGU6OmtPbmx5T25EaXNrKQ0KKyAgICAgICAgICBJZ25vcmVBcmNoaXZlSXRlbShtX0FyY2hpdmVJdGVtc1twYWlyLkFyY0luZGV4XSk7DQorICAgICAgICAvLyBjb3V0IDw8ICJkZWxldGluZyI7DQorICAgICAgICAqLw0KKyAgICAgICAgaWYgKGNhbGxiYWNrKQ0KKyAgICAgICAgICBjYWxsYmFjay0+U2hvd0RlbGV0ZUZpbGUocGFpci5BcmNJbmRleCk7DQorICAgICAgICBjb250aW51ZTsNCisNCisgICAgICBjYXNlIE5QYWlyQWN0aW9uOjprQ29weToNCisgICAgICAgIGlmIChwYWlyLlN0YXRlID09IE5QYWlyU3RhdGU6OmtPbmx5T25EaXNrKQ0KKyAgICAgICAgICB0aHJvdyBrVXBkYXRlQWN0aW9uU2V0Q29sbGlzaW9uOw0KKyAgICAgICAgaWYgKHBhaXIuU3RhdGUgPT0gTlBhaXJTdGF0ZTo6a09ubHlJbkFyY2hpdmUpDQorICAgICAgICB7DQorICAgICAgICAgIGlmIChwYWlyLkhvc3RJbmRleCA+PSAwKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgLyoNCisgICAgICAgICAgICAgIGlnbm9yZSBhbHQgc3RyZWFtIGlmDQorICAgICAgICAgICAgICAgIDEpIG5vIHN1Y2ggYWx0IHN0cmVhbSBpbiBEaXNrDQorICAgICAgICAgICAgICAgIDIpIHRoZXJlIGlzIEhvc3QgZmlsZSBpbiBkaXNrDQorICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBpZiAodXBkYXRlUGFpcnNbcGFpci5Ib3N0SW5kZXhdLkRpckluZGV4ID49IDApDQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgdXAyLk5ld0RhdGEgPSB1cDIuTmV3UHJvcHMgPSBmYWxzZTsNCisgICAgICAgIHVwMi5Vc2VBcmNQcm9wcyA9IHRydWU7DQorICAgICAgICBicmVhazsNCisgICAgICANCisgICAgICBjYXNlIE5QYWlyQWN0aW9uOjprQ29tcHJlc3M6DQorICAgICAgICBpZiAocGFpci5TdGF0ZSA9PSBOUGFpclN0YXRlOjprT25seUluQXJjaGl2ZSB8fA0KKyAgICAgICAgICAgIHBhaXIuU3RhdGUgPT0gTlBhaXJTdGF0ZTo6a05vdE1hc2tlZCkNCisgICAgICAgICAgdGhyb3cga1VwZGF0ZUFjdGlvblNldENvbGxpc2lvbjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIA0KKyAgICAgIGNhc2UgTlBhaXJBY3Rpb246OmtDb21wcmVzc0FzQW50aToNCisgICAgICAgIHVwMi5Jc0FudGkgPSB0cnVlOw0KKyAgICAgICAgdXAyLlVzZUFyY1Byb3BzID0gKHBhaXIuQXJjSW5kZXggPj0gMCk7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBvcGVyYXRpb25DaGFpbi5BZGQodXAyKTsNCisgIH0NCisgIG9wZXJhdGlvbkNoYWluLlJlc2VydmVEb3duKCk7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1VwZGF0ZVByb2R1Y2UuaCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1VwZGF0ZVByb2R1Y2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTMwNTVlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vVXBkYXRlUHJvZHVjZS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vIFVwZGF0ZVByb2R1Y2UuaA0KKw0KKyNpZm5kZWYgX19VUERBVEVfUFJPRFVDRV9IDQorI2RlZmluZSBfX1VQREFURV9QUk9EVUNFX0gNCisNCisjaW5jbHVkZSAiVXBkYXRlUGFpci5oIg0KKw0KK3N0cnVjdCBDVXBkYXRlUGFpcjINCit7DQorICBib29sIE5ld0RhdGE7DQorICBib29sIE5ld1Byb3BzOw0KKyAgYm9vbCBVc2VBcmNQcm9wczsgLy8gaWYgKFVzZUFyY1Byb3BzICYmIE5ld1Byb3BzKSwgd2Ugd2FudCB0byBjaGFuZ2Ugb25seSBzb21lIHByb3BlcnRpZXMuDQorICBib29sIElzQW50aTsgLy8gaWYgKCFJc0FudGkpIHdlIHVzZSBvdGhlciB3YXlzIHRvIGRldGVjdCBBbnRpIHN0YXR1cw0KKyAgDQorICBpbnQgRGlySW5kZXg7DQorICBpbnQgQXJjSW5kZXg7DQorICBpbnQgTmV3TmFtZUluZGV4Ow0KKw0KKyAgYm9vbCBJc01haW5SZW5hbWVJdGVtOw0KKw0KKyAgdm9pZCBTZXRBc19Ob0NoYW5nZUFyY0l0ZW0oaW50IGFyY0luZGV4KQ0KKyAgew0KKyAgICBOZXdEYXRhID0gTmV3UHJvcHMgPSBmYWxzZTsNCisgICAgVXNlQXJjUHJvcHMgPSB0cnVlOw0KKyAgICBJc0FudGkgPSBmYWxzZTsNCisgICAgQXJjSW5kZXggPSBhcmNJbmRleDsNCisgIH0NCisNCisgIGJvb2wgRXhpc3RPbkRpc2soKSBjb25zdCB7IHJldHVybiBEaXJJbmRleCAhPSAtMTsgfQ0KKyAgYm9vbCBFeGlzdEluQXJjaGl2ZSgpIGNvbnN0IHsgcmV0dXJuIEFyY0luZGV4ICE9IC0xOyB9DQorDQorICBDVXBkYXRlUGFpcjIoKToNCisgICAgICBOZXdEYXRhKGZhbHNlKSwNCisgICAgICBOZXdQcm9wcyhmYWxzZSksDQorICAgICAgVXNlQXJjUHJvcHMoZmFsc2UpLA0KKyAgICAgIElzQW50aShmYWxzZSksDQorICAgICAgRGlySW5kZXgoLTEpLA0KKyAgICAgIEFyY0luZGV4KC0xKSwNCisgICAgICBOZXdOYW1lSW5kZXgoLTEpLA0KKyAgICAgIElzTWFpblJlbmFtZUl0ZW0oZmFsc2UpDQorICAgICAge30NCit9Ow0KKw0KK3N0cnVjdCBJVXBkYXRlUHJvZHVjZUNhbGxiYWNrDQorew0KKyAgdmlydHVhbCBIUkVTVUxUIFNob3dEZWxldGVGaWxlKGludCBhcmNJbmRleCkgPSAwOw0KK307DQorDQordm9pZCBVcGRhdGVQcm9kdWNlKA0KKyAgICBjb25zdCBDUmVjb3JkVmVjdG9yPENVcGRhdGVQYWlyPiAmdXBkYXRlUGFpcnMsDQorICAgIGNvbnN0IE5VcGRhdGVBcmNoaXZlOjpDQWN0aW9uU2V0ICZhY3Rpb25TZXQsDQorICAgIENSZWNvcmRWZWN0b3I8Q1VwZGF0ZVBhaXIyPiAmb3BlcmF0aW9uQ2hhaW4sDQorICAgIElVcGRhdGVQcm9kdWNlQ2FsbGJhY2sgKmNhbGxiYWNrKTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Xb3JrRGlyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1dvcmtEaXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZjIyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Xb3JrRGlyLmNwcApAQCAtMCwwICsxLDkxIEBACisvLyBXb3JrRGlyLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1dpbGRjYXJkLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZU5hbWUuaCINCisNCisjaW5jbHVkZSAiV29ya0Rpci5oIg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCit1c2luZyBuYW1lc3BhY2UgTkZpbGU7DQordXNpbmcgbmFtZXNwYWNlIE5EaXI7DQorDQorRlN0cmluZyBHZXRXb3JrRGlyKGNvbnN0IE5Xb3JrRGlyOjpDSW5mbyAmd29ya0RpckluZm8sIGNvbnN0IEZTdHJpbmcgJnBhdGgsIEZTdHJpbmcgJmZpbGVOYW1lKQ0KK3sNCisgIE5Xb3JrRGlyOjpOTW9kZTo6RUVudW0gbW9kZSA9IHdvcmtEaXJJbmZvLk1vZGU7DQorICAjaWZuZGVmIFVOREVSX0NFDQorICBpZiAod29ya0RpckluZm8uRm9yUmVtb3ZhYmxlT25seSkNCisgIHsNCisgICAgbW9kZSA9IE5Xb3JrRGlyOjpOTW9kZTo6a0N1cnJlbnQ7DQorICAgIEZTdHJpbmcgcHJlZml4ID0gcGF0aC5MZWZ0KDMpOw0KKyAgICBpZiAocHJlZml4WzFdID09IEZURVhUKCc6JykgJiYgcHJlZml4WzJdID09IEZURVhUKCdcXCcpKQ0KKyAgICB7DQorICAgICAgVUlOVCBkcml2ZVR5cGUgPSBHZXREcml2ZVR5cGUoR2V0U3lzdGVtU3RyaW5nKHByZWZpeCwgOjpBcmVGaWxlQXBpc0FOU0koKSA/IENQX0FDUCA6IENQX09FTUNQKSk7DQorICAgICAgaWYgKGRyaXZlVHlwZSA9PSBEUklWRV9DRFJPTSB8fCBkcml2ZVR5cGUgPT0gRFJJVkVfUkVNT1ZBQkxFKQ0KKyAgICAgICAgbW9kZSA9IHdvcmtEaXJJbmZvLk1vZGU7DQorICAgIH0NCisgICAgLyoNCisgICAgQ1BhcnNlZFBhdGggcGFyc2VkUGF0aDsNCisgICAgcGFyc2VkUGF0aC5QYXJzZVBhdGgoYXJjaGl2ZU5hbWUpOw0KKyAgICBVSU5UIGRyaXZlVHlwZSA9IEdldERyaXZlVHlwZShwYXJzZWRQYXRoLlByZWZpeCk7DQorICAgIGlmICgoZHJpdmVUeXBlICE9IERSSVZFX0NEUk9NKSAmJiAoZHJpdmVUeXBlICE9IERSSVZFX1JFTU9WQUJMRSkpDQorICAgICAgbW9kZSA9IE5aaXBTZXR0aW5nczo6TldvcmtEaXI6Ok5Nb2RlOjprQ3VycmVudDsNCisgICAgKi8NCisgIH0NCisgICNlbmRpZg0KKyAgaW50IHBvcyA9IHBhdGguUmV2ZXJzZUZpbmQoRkNIQVJfUEFUSF9TRVBBUkFUT1IpICsgMTsNCisgIGZpbGVOYW1lID0gcGF0aC5QdHIocG9zKTsNCisgIHN3aXRjaCAobW9kZSkNCisgIHsNCisgICAgY2FzZSBOV29ya0Rpcjo6Tk1vZGU6OmtDdXJyZW50Og0KKyAgICB7DQorICAgICAgcmV0dXJuIHBhdGguTGVmdChwb3MpOzsNCisgICAgfQ0KKyAgICBjYXNlIE5Xb3JrRGlyOjpOTW9kZTo6a1NwZWNpZmllZDoNCisgICAgew0KKyAgICAgIEZTdHJpbmcgdGVtcERpciA9IHdvcmtEaXJJbmZvLlBhdGg7DQorICAgICAgTk5hbWU6Ok5vcm1hbGl6ZURpclBhdGhQcmVmaXgodGVtcERpcik7DQorICAgICAgcmV0dXJuIHRlbXBEaXI7DQorICAgIH0NCisgICAgZGVmYXVsdDoNCisgICAgew0KKyAgICAgIEZTdHJpbmcgdGVtcERpcjsNCisgICAgICBpZiAoIU15R2V0VGVtcFBhdGgodGVtcERpcikpDQorICAgICAgICB0aHJvdyAxNDE3MTc7DQorICAgICAgcmV0dXJuIHRlbXBEaXI7DQorICAgIH0NCisgIH0NCit9DQorDQorSFJFU1VMVCBDV29ya0RpclRlbXBGaWxlOjpDcmVhdGVUZW1wRmlsZShjb25zdCBGU3RyaW5nICZvcmlnaW5hbFBhdGgpDQorew0KKyAgTldvcmtEaXI6OkNJbmZvIHdvcmtEaXJJbmZvOw0KKyAgd29ya0RpckluZm8uTG9hZCgpOw0KKyAgRlN0cmluZyBuYW1lUGFydDsNCisgIEZTdHJpbmcgd29ya0RpciA9IEdldFdvcmtEaXIod29ya0RpckluZm8sIG9yaWdpbmFsUGF0aCwgbmFtZVBhcnQpOw0KKyAgQ3JlYXRlQ29tcGxleERpcih3b3JrRGlyKTsNCisgIENUZW1wRmlsZSB0ZW1wRmlsZTsNCisgIF9vdXRTdHJlYW1TcGVjID0gbmV3IENPdXRGaWxlU3RyZWFtOw0KKyAgT3V0U3RyZWFtID0gX291dFN0cmVhbVNwZWM7DQorICBpZiAoIV90ZW1wRmlsZS5DcmVhdGUod29ya0RpciArIG5hbWVQYXJ0LCAmX291dFN0cmVhbVNwZWMtPkZpbGUpKQ0KKyAgew0KKyAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOw0KKyAgICByZXR1cm4gZXJyb3IgPyBlcnJvciA6IEVfRkFJTDsNCisgIH0NCisgIF9vcmlnaW5hbFBhdGggPSBvcmlnaW5hbFBhdGg7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDV29ya0RpclRlbXBGaWxlOjpNb3ZlVG9PcmlnaW5hbChib29sIGRlbGV0ZU9yaWdpbmFsKQ0KK3sNCisgIE91dFN0cmVhbS5SZWxlYXNlKCk7DQorICBpZiAoIV90ZW1wRmlsZS5Nb3ZlVG8oX29yaWdpbmFsUGF0aCwgZGVsZXRlT3JpZ2luYWwpKQ0KKyAgew0KKyAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOw0KKyAgICByZXR1cm4gZXJyb3IgPyBlcnJvciA6IEVfRkFJTDsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Xb3JrRGlyLmggYi9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9Xb3JrRGlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkNGVkOQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29tbW9uL1dvcmtEaXIuaApAQCAtMCwwICsxLDI2IEBACisvLyBXb3JrRGlyLmgNCisNCisjaWZuZGVmIF9fV09SS19ESVJfSA0KKyNkZWZpbmUgX19XT1JLX0RJUl9IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZURpci5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vRmlsZVN0cmVhbXMuaCINCisNCisjaW5jbHVkZSAiWmlwUmVnaXN0cnkuaCINCisNCitGU3RyaW5nIEdldFdvcmtEaXIoY29uc3QgTldvcmtEaXI6OkNJbmZvICZ3b3JrRGlySW5mbywgY29uc3QgRlN0cmluZyAmcGF0aCwgRlN0cmluZyAmZmlsZU5hbWUpOw0KKw0KK2NsYXNzIENXb3JrRGlyVGVtcEZpbGUNCit7DQorICBGU3RyaW5nIF9vcmlnaW5hbFBhdGg7DQorICBOV2luZG93czo6TkZpbGU6Ok5EaXI6OkNUZW1wRmlsZSBfdGVtcEZpbGU7DQorICBDT3V0RmlsZVN0cmVhbSAqX291dFN0cmVhbVNwZWM7DQorcHVibGljOg0KKyAgQ015Q29tUHRyPElPdXRTdHJlYW0+IE91dFN0cmVhbTsNCisNCisgIEhSRVNVTFQgQ3JlYXRlVGVtcEZpbGUoY29uc3QgRlN0cmluZyAmb3JpZ2luYWxQYXRoKTsNCisgIEhSRVNVTFQgTW92ZVRvT3JpZ2luYWwoYm9vbCBkZWxldGVPcmlnaW5hbCk7DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbW1vbi9aaXBSZWdpc3RyeS5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vWmlwUmVnaXN0cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjAwYWFjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db21tb24vWmlwUmVnaXN0cnkuaApAQCAtMCwwICsxLDEyMiBAQAorLy8gWmlwUmVnaXN0cnkuaA0KKw0KKyNpZm5kZWYgX19aSVBfUkVHSVNUUllfSA0KKyNkZWZpbmUgX19aSVBfUkVHSVNUUllfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlUeXBlcy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlTdHJpbmcuaCINCisNCisjaW5jbHVkZSAiRXh0cmFjdE1vZGUuaCINCisNCituYW1lc3BhY2UgTkV4dHJhY3QNCit7DQorICBzdHJ1Y3QgQ0luZm8NCisgIHsNCisgICAgTlBhdGhNb2RlOjpFRW51bSBQYXRoTW9kZTsNCisgICAgTk92ZXJ3cml0ZU1vZGU6OkVFbnVtIE92ZXJ3cml0ZU1vZGU7DQorICAgIGJvb2wgUGF0aE1vZGVfRm9yY2U7DQorICAgIGJvb2wgT3ZlcndyaXRlTW9kZV9Gb3JjZTsNCisgICAgDQorICAgIENCb29sUGFpciBTcGxpdERlc3Q7DQorICAgIENCb29sUGFpciBFbGltRHVwOw0KKyAgICAvLyBDQm9vbFBhaXIgQWx0U3RyZWFtczsNCisgICAgQ0Jvb2xQYWlyIE50U2VjdXJpdHk7DQorICAgIENCb29sUGFpciBTaG93UGFzc3dvcmQ7DQorDQorICAgIFVTdHJpbmdWZWN0b3IgUGF0aHM7DQorDQorICAgIHZvaWQgU2F2ZSgpIGNvbnN0Ow0KKyAgICB2b2lkIExvYWQoKTsNCisgIH07DQorICANCisgIHZvaWQgU2F2ZV9TaG93UGFzc3dvcmQoYm9vbCBzaG93UGFzc3dvcmQpOw0KKyAgYm9vbCBSZWFkX1Nob3dQYXNzd29yZCgpOw0KK30NCisNCituYW1lc3BhY2UgTkNvbXByZXNzaW9uDQorew0KKyAgc3RydWN0IENGb3JtYXRPcHRpb25zDQorICB7DQorICAgIFVJbnQzMiBMZXZlbDsNCisgICAgVUludDMyIERpY3Rpb25hcnk7DQorICAgIFVJbnQzMiBPcmRlcjsNCisgICAgVUludDMyIEJsb2NrTG9nU2l6ZTsNCisgICAgVUludDMyIE51bVRocmVhZHM7DQorICAgIA0KKyAgICBDU3lzU3RyaW5nIEZvcm1hdElEOw0KKyAgICBVU3RyaW5nIE1ldGhvZDsNCisgICAgVVN0cmluZyBPcHRpb25zOw0KKyAgICBVU3RyaW5nIEVuY3J5cHRpb25NZXRob2Q7DQorDQorICAgIHZvaWQgUmVzZXRGb3JMZXZlbENoYW5nZSgpDQorICAgIHsNCisgICAgICBCbG9ja0xvZ1NpemUgPSBOdW1UaHJlYWRzID0gTGV2ZWwgPSBEaWN0aW9uYXJ5ID0gT3JkZXIgPSBVSW50MzIoLTEpOw0KKyAgICAgIE1ldGhvZC5FbXB0eSgpOw0KKyAgICAgIC8vIE9wdGlvbnMuRW1wdHkoKTsNCisgICAgICAvLyBFbmNyeXB0aW9uTWV0aG9kLkVtcHR5KCk7DQorICAgIH0NCisgICAgQ0Zvcm1hdE9wdGlvbnMoKSB7IFJlc2V0Rm9yTGV2ZWxDaGFuZ2UoKTsgfQ0KKyAgfTsNCisNCisgIHN0cnVjdCBDSW5mbw0KKyAgew0KKyAgICBVSW50MzIgTGV2ZWw7DQorICAgIGJvb2wgU2hvd1Bhc3N3b3JkOw0KKyAgICBib29sIEVuY3J5cHRIZWFkZXJzOw0KKyAgICBVU3RyaW5nIEFyY1R5cGU7DQorICAgIFVTdHJpbmdWZWN0b3IgQXJjUGF0aHM7DQorDQorICAgIENPYmplY3RWZWN0b3I8Q0Zvcm1hdE9wdGlvbnM+IEZvcm1hdHM7DQorDQorICAgIENCb29sUGFpciBOdFNlY3VyaXR5Ow0KKyAgICBDQm9vbFBhaXIgQWx0U3RyZWFtczsNCisgICAgQ0Jvb2xQYWlyIEhhcmRMaW5rczsNCisgICAgQ0Jvb2xQYWlyIFN5bUxpbmtzOw0KKw0KKyAgICB2b2lkIFNhdmUoKSBjb25zdDsNCisgICAgdm9pZCBMb2FkKCk7DQorICB9Ow0KK30NCisNCituYW1lc3BhY2UgTldvcmtEaXINCit7DQorICBuYW1lc3BhY2UgTk1vZGUNCisgIHsNCisgICAgZW51bSBFRW51bQ0KKyAgICB7DQorICAgICAga1N5c3RlbSwNCisgICAgICBrQ3VycmVudCwNCisgICAgICBrU3BlY2lmaWVkDQorICAgIH07DQorICB9DQorICBzdHJ1Y3QgQ0luZm8NCisgIHsNCisgICAgTk1vZGU6OkVFbnVtIE1vZGU7DQorICAgIEZTdHJpbmcgUGF0aDsNCisgICAgYm9vbCBGb3JSZW1vdmFibGVPbmx5Ow0KKw0KKyAgICB2b2lkIFNldEZvclJlbW92YWJsZU9ubHlEZWZhdWx0KCkgeyBGb3JSZW1vdmFibGVPbmx5ID0gdHJ1ZTsgfQ0KKyAgICB2b2lkIFNldERlZmF1bHQoKQ0KKyAgICB7DQorICAgICAgTW9kZSA9IE5Nb2RlOjprU3lzdGVtOw0KKyAgICAgIFBhdGguRW1wdHkoKTsNCisgICAgICBTZXRGb3JSZW1vdmFibGVPbmx5RGVmYXVsdCgpOw0KKyAgICB9DQorDQorICAgIHZvaWQgU2F2ZSgpIGNvbnN0Ow0KKyAgICB2b2lkIExvYWQoKTsNCisgIH07DQorfQ0KKw0KKw0KK3N0cnVjdCBDQ29udGV4dE1lbnVJbmZvDQorew0KKyAgYm9vbCBDYXNjYWRlZDsNCisgIGJvb2wgTWVudUljb25zOw0KKyAgVUludDMyIEZsYWdzOw0KKw0KKyAgdm9pZCBTYXZlKCkgY29uc3Q7DQorICB2b2lkIExvYWQoKTsNCit9Ow0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9CZW5jaENvbi5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvQmVuY2hDb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Y2QyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvQmVuY2hDb24uY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8vIEJlbmNoQ29uLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0JlbmNoLmgiDQorDQorI2luY2x1ZGUgIkJlbmNoQ29uLmgiDQorI2luY2x1ZGUgIkNvbnNvbGVDbG9zZS5oIg0KKw0KK3N0cnVjdCBDUHJpbnRCZW5jaENhbGxiYWNrOiBwdWJsaWMgSUJlbmNoUHJpbnRDYWxsYmFjaw0KK3sNCisgIEZJTEUgKl9maWxlOw0KKw0KKyAgdm9pZCBQcmludChjb25zdCBjaGFyICpzKTsNCisgIHZvaWQgTmV3TGluZSgpOw0KKyAgSFJFU1VMVCBDaGVja0JyZWFrKCk7DQorfTsNCisNCit2b2lkIENQcmludEJlbmNoQ2FsbGJhY2s6OlByaW50KGNvbnN0IGNoYXIgKnMpDQorew0KKyAgZnB1dHMocywgX2ZpbGUpOw0KK30NCisNCit2b2lkIENQcmludEJlbmNoQ2FsbGJhY2s6Ok5ld0xpbmUoKQ0KK3sNCisgIFByaW50KCJcbiIpOw0KK30NCisNCitIUkVTVUxUIENQcmludEJlbmNoQ2FsbGJhY2s6OkNoZWNrQnJlYWsoKQ0KK3sNCisgIHJldHVybiBOQ29uc29sZUNsb3NlOjpUZXN0QnJlYWtTaWduYWwoKSA/IEVfQUJPUlQ6IFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQmVuY2hDb24oREVDTF9FWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgY29uc3QgQ09iamVjdFZlY3RvcjxDUHJvcGVydHk+ICZwcm9wcywgVUludDMyIG51bUl0ZXJhdGlvbnMsIEZJTEUgKmYpDQorew0KKyAgQ1ByaW50QmVuY2hDYWxsYmFjayBjYWxsYmFjazsNCisgIGNhbGxiYWNrLl9maWxlID0gZjsNCisgIGNhbGxiYWNrLk5ld0xpbmUoKTsNCisgIHJldHVybiBCZW5jaChFWFRFUk5BTF9DT0RFQ1NfTE9DX1ZBUlMNCisgICAgICAmY2FsbGJhY2ssIE5VTEwsIHByb3BzLCBudW1JdGVyYXRpb25zLCB0cnVlKTsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0JlbmNoQ29uLmggYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvQmVuY2hDb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjIzNWVlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0JlbmNoQ29uLmgKQEAgLTAsMCArMSwxNCBAQAorLy8gQmVuY2hDb24uaA0KKw0KKyNpZm5kZWYgX19CRU5DSF9DT05fSA0KKyNkZWZpbmUgX19CRU5DSF9DT05fSA0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vQ3JlYXRlQ29kZXIuaCINCisjaW5jbHVkZSAiLi4vLi4vVUkvQ29tbW9uL1Byb3BlcnR5LmgiDQorDQorSFJFU1VMVCBCZW5jaENvbihERUNMX0VYVEVSTkFMX0NPREVDU19MT0NfVkFSUw0KKyAgICBjb25zdCBDT2JqZWN0VmVjdG9yPENQcm9wZXJ0eT4gJnByb3BzLCBVSW50MzIgbnVtSXRlcmF0aW9ucywgRklMRSAqZik7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0NvbnNvbGUubWFrIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0NvbnNvbGUubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZjgzMDEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvQ29uc29sZS5tYWsKQEAgLTAsMCArMSwzNSBAQAorQ09OU09MRV9PQkpTID0gXA0KKyAgJE9cQmVuY2hDb24ub2JqIFwNCisgICRPXENvbnNvbGVDbG9zZS5vYmogXA0KKyAgJE9cRXh0cmFjdENhbGxiYWNrQ29uc29sZS5vYmogXA0KKyAgJE9cSGFzaENvbi5vYmogXA0KKyAgJE9cTGlzdC5vYmogXA0KKyAgJE9cTWFpbi5vYmogXA0KKyAgJE9cTWFpbkFyLm9iaiBcDQorICAkT1xPcGVuQ2FsbGJhY2tDb25zb2xlLm9iaiBcDQorICAkT1xQZXJjZW50UHJpbnRlci5vYmogXA0KKyAgJE9cVXBkYXRlQ2FsbGJhY2tDb25zb2xlLm9iaiBcDQorICAkT1xVc2VySW5wdXRVdGlscy5vYmogXA0KKw0KK1VJX0NPTU1PTl9PQkpTID0gXA0KKyAgJE9cQXJjaGl2ZUNvbW1hbmRMaW5lLm9iaiBcDQorICAkT1xBcmNoaXZlRXh0cmFjdENhbGxiYWNrLm9iaiBcDQorICAkT1xBcmNoaXZlT3BlbkNhbGxiYWNrLm9iaiBcDQorICAkT1xCZW5jaC5vYmogXA0KKyAgJE9cRGVmYXVsdE5hbWUub2JqIFwNCisgICRPXEVudW1EaXJJdGVtcy5vYmogXA0KKyAgJE9cRXh0cmFjdC5vYmogXA0KKyAgJE9cRXh0cmFjdGluZ0ZpbGVQYXRoLm9iaiBcDQorICAkT1xIYXNoQ2FsYy5vYmogXA0KKyAgJE9cTG9hZENvZGVjcy5vYmogXA0KKyAgJE9cT3BlbkFyY2hpdmUub2JqIFwNCisgICRPXFByb3BJRFV0aWxzLm9iaiBcDQorICAkT1xTZXRQcm9wZXJ0aWVzLm9iaiBcDQorICAkT1xTb3J0VXRpbHMub2JqIFwNCisgICRPXFRlbXBGaWxlcy5vYmogXA0KKyAgJE9cVXBkYXRlLm9iaiBcDQorICAkT1xVcGRhdGVBY3Rpb24ub2JqIFwNCisgICRPXFVwZGF0ZUNhbGxiYWNrLm9iaiBcDQorICAkT1xVcGRhdGVQYWlyLm9iaiBcDQorICAkT1xVcGRhdGVQcm9kdWNlLm9iaiBcDQorDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0NvbnNvbGVDbG9zZS5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvQ29uc29sZUNsb3NlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmJhZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0NvbnNvbGVDbG9zZS5jcHAKQEAgLTAsMCArMSw3MyBAQAorLy8gQ29uc29sZUNsb3NlLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiQ29uc29sZUNsb3NlLmgiDQorDQorc3RhdGljIGludCBnX0JyZWFrQ291bnRlciA9IDA7DQorc3RhdGljIGNvbnN0IGludCBrQnJlYWtBYm9ydFRocmVzaG9sZCA9IDI7DQorDQorbmFtZXNwYWNlIE5Db25zb2xlQ2xvc2Ugew0KKw0KKyNpZiAhZGVmaW5lZChVTkRFUl9DRSkgJiYgZGVmaW5lZChfV0lOMzIpDQorc3RhdGljIEJPT0wgV0lOQVBJIEhhbmRsZXJSb3V0aW5lKERXT1JEIGN0cmxUeXBlKQ0KK3sNCisgIGlmIChjdHJsVHlwZSA9PSBDVFJMX0xPR09GRl9FVkVOVCkNCisgIHsNCisgICAgLy8gcHJpbnRmKCJcbkNUUkxfTE9HT0ZGX0VWRU5UXG4iKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorDQorICBnX0JyZWFrQ291bnRlcisrOw0KKyAgaWYgKGdfQnJlYWtDb3VudGVyIDwga0JyZWFrQWJvcnRUaHJlc2hvbGQpDQorICAgIHJldHVybiBUUlVFOw0KKyAgcmV0dXJuIEZBTFNFOw0KKyAgLyoNCisgIHN3aXRjaChjdHJsVHlwZSkNCisgIHsNCisgICAgY2FzZSBDVFJMX0NfRVZFTlQ6DQorICAgIGNhc2UgQ1RSTF9CUkVBS19FVkVOVDoNCisgICAgICBpZiAoZ19CcmVha0NvdW50ZXIgPCBrQnJlYWtBYm9ydFRocmVzaG9sZCkNCisgICAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCisgICovDQorfQ0KKyNlbmRpZg0KKw0KK2Jvb2wgVGVzdEJyZWFrU2lnbmFsKCkNCit7DQorICAjaWZkZWYgVU5ERVJfQ0UNCisgIHJldHVybiBmYWxzZTsNCisgICNlbHNlDQorICAvKg0KKyAgaWYgKGdfQnJlYWtDb3VudGVyID4gMCkNCisgICAgcmV0dXJuIHRydWU7DQorICAqLw0KKyAgcmV0dXJuIChnX0JyZWFrQ291bnRlciA+IDApOw0KKyAgI2VuZGlmDQorfQ0KKw0KK3ZvaWQgQ2hlY2tDdHJsQnJlYWsoKQ0KK3sNCisgIGlmIChUZXN0QnJlYWtTaWduYWwoKSkNCisgICAgdGhyb3cgQ0N0cmxCcmVha0V4Y2VwdGlvbigpOw0KK30NCisNCitDQ3RybEhhbmRsZXJTZXR0ZXI6OkNDdHJsSGFuZGxlclNldHRlcigpDQorew0KKyAgI2lmICFkZWZpbmVkKFVOREVSX0NFKSAmJiBkZWZpbmVkKF9XSU4zMikNCisgIGlmKCFTZXRDb25zb2xlQ3RybEhhbmRsZXIoSGFuZGxlclJvdXRpbmUsIFRSVUUpKQ0KKyAgICB0aHJvdyAiU2V0Q29uc29sZUN0cmxIYW5kbGVyIGZhaWxzIjsNCisgICNlbmRpZg0KK30NCisNCitDQ3RybEhhbmRsZXJTZXR0ZXI6On5DQ3RybEhhbmRsZXJTZXR0ZXIoKQ0KK3sNCisgICNpZiAhZGVmaW5lZChVTkRFUl9DRSkgJiYgZGVmaW5lZChfV0lOMzIpDQorICBpZighU2V0Q29uc29sZUN0cmxIYW5kbGVyKEhhbmRsZXJSb3V0aW5lLCBGQUxTRSkpDQorICAgIHRocm93ICJTZXRDb25zb2xlQ3RybEhhbmRsZXIgZmFpbHMiOw0KKyAgI2VuZGlmDQorfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvQ29uc29sZUNsb3NlLmggYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvQ29uc29sZUNsb3NlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwMTAxOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9Db25zb2xlQ2xvc2UuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb25zb2xlQ2xvc2VVdGlscy5oDQorDQorI2lmbmRlZiBfX0NPTlNPTEVDTE9TRVVUSUxTX0gNCisjZGVmaW5lIF9fQ09OU09MRUNMT1NFVVRJTFNfSA0KKw0KK25hbWVzcGFjZSBOQ29uc29sZUNsb3NlIHsNCisNCitib29sIFRlc3RCcmVha1NpZ25hbCgpOw0KKw0KK2NsYXNzIENDdHJsSGFuZGxlclNldHRlcg0KK3sNCitwdWJsaWM6DQorICBDQ3RybEhhbmRsZXJTZXR0ZXIoKTsNCisgIHZpcnR1YWwgfkNDdHJsSGFuZGxlclNldHRlcigpOw0KK307DQorDQorY2xhc3MgQ0N0cmxCcmVha0V4Y2VwdGlvbg0KK3t9Ow0KKw0KK3ZvaWQgQ2hlY2tDdHJsQnJlYWsoKTsNCisNCit9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0V4dHJhY3RDYWxsYmFja0NvbnNvbGUuY3BwIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0V4dHJhY3RDYWxsYmFja0NvbnNvbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNmY4MDYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvRXh0cmFjdENhbGxiYWNrQ29uc29sZS5jcHAKQEAgLTAsMCArMSwzODMgQEAKKy8vIEV4dHJhY3RDYWxsYmFja0NvbnNvbGUuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKy8vICN1bmRlZiBzcHJpbnRmDQorDQorI2luY2x1ZGUgIkNvbnNvbGVDbG9zZS5oIg0KKyNpbmNsdWRlICJFeHRyYWN0Q2FsbGJhY2tDb25zb2xlLmgiDQorI2luY2x1ZGUgIlVzZXJJbnB1dFV0aWxzLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9JbnRUb1N0cmluZy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vV2lsZGNhcmQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlRGlyLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZUZpbmQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9UaW1lVXRpbHMuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9FcnJvck1zZy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1Byb3BWYXJpYW50Q29udi5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vRmlsZVBhdGhBdXRvUmVuYW1lLmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9FeHRyYWN0aW5nRmlsZVBhdGguaCINCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQordXNpbmcgbmFtZXNwYWNlIE5GaWxlOw0KK3VzaW5nIG5hbWVzcGFjZSBORGlyOw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICprVGVzdFN0cmluZyAgICA9ICAiVGVzdGluZyAgICAgIjsNCitzdGF0aWMgY29uc3QgY2hhciAqa0V4dHJhY3RTdHJpbmcgPSAgIkV4dHJhY3RpbmcgICI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtTa2lwU3RyaW5nICAgID0gICJTa2lwcGluZyAgICAiOw0KKw0KKy8vIHN0YXRpYyBjb25zdCBjaGFyICprQ2FudEF1dG9SZW5hbWUgPSAiY2FuIG5vdCBjcmVhdGUgZmlsZSB3aXRoIGF1dG8gbmFtZVxuIjsNCisvLyBzdGF0aWMgY29uc3QgY2hhciAqa0NhbnRSZW5hbWVGaWxlID0gImNhbiBub3QgcmVuYW1lIGV4aXN0aW5nIGZpbGVcbiI7DQorLy8gc3RhdGljIGNvbnN0IGNoYXIgKmtDYW50RGVsZXRlT3V0cHV0RmlsZSA9ICJjYW4gbm90IGRlbGV0ZSBvdXRwdXQgZmlsZSAiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprRXJyb3IgPSAiRVJST1I6ICI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtNZW1vcnlFeGNlcHRpb25NZXNzYWdlID0gIkNhbid0IGFsbG9jYXRlIHJlcXVpcmVkIG1lbW9yeSEiOw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICprUHJvY2Vzc2luZyA9ICJQcm9jZXNzaW5nIGFyY2hpdmU6ICI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtFdmVyeXRoaW5nSXNPayA9ICJFdmVyeXRoaW5nIGlzIE9rIjsNCitzdGF0aWMgY29uc3QgY2hhciAqa05vRmlsZXMgPSAiTm8gZmlsZXMgdG8gcHJvY2VzcyI7DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtVbnN1cHBvcnRlZE1ldGhvZCA9ICJVbnN1cHBvcnRlZCBNZXRob2QiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprQ3JjRmFpbGVkID0gIkNSQyBGYWlsZWQiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprQ3JjRmFpbGVkRW5jcnlwdGVkID0gIkNSQyBGYWlsZWQgaW4gZW5jcnlwdGVkIGZpbGUuIFdyb25nIHBhc3N3b3JkPyI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtEYXRhRXJyb3IgPSAiRGF0YSBFcnJvciI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtEYXRhRXJyb3JFbmNyeXB0ZWQgPSAiRGF0YSBFcnJvciBpbiBlbmNyeXB0ZWQgZmlsZS4gV3JvbmcgcGFzc3dvcmQ/IjsNCitzdGF0aWMgY29uc3QgY2hhciAqa1VuYXZhaWxhYmxlRGF0YSA9ICJVbmF2YWlsYWJsZSBkYXRhIjsNCitzdGF0aWMgY29uc3QgY2hhciAqa1VuZXhwZWN0ZWRFbmQgPSAiVW5leHBlY3RlZCBlbmQgb2YgZGF0YSI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtEYXRhQWZ0ZXJFbmQgPSAiVGhlcmUgYXJlIHNvbWUgZGF0YSBhZnRlciB0aGUgZW5kIG9mIHRoZSBwYXlsb2FkIGRhdGEiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprSXNOb3RBcmMgPSAiSXMgbm90IGFyY2hpdmUiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprSGVhZGVyc0Vycm9yID0gIkhlYWRlcnMgRXJyb3IiOw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICprX0Vycm9yRmxhZ3NNZXNzYWdlc1tdID0NCit7DQorICAgICJJcyBub3QgYXJjaGl2ZSINCisgICwgIkhlYWRlcnMgRXJyb3IiDQorICAsICJIZWFkZXJzIEVycm9yIGluIGVuY3J5cHRlZCBhcmNoaXZlLiBXcm9uZyBwYXNzd29yZD8iDQorICAsICJVbmF2YWlsYWJsZSBzdGFydCBvZiBhcmNoaXZlIg0KKyAgLCAiVW5jb25maXJtZWQgc3RhcnQgb2YgYXJjaGl2ZSINCisgICwgIlVuZXhwZWN0ZWQgZW5kIG9mIGFyY2hpdmUiDQorICAsICJUaGVyZSBhcmUgZGF0YSBhZnRlciB0aGUgZW5kIG9mIGFyY2hpdmUiDQorICAsICJVbnN1cHBvcnRlZCBtZXRob2QiDQorICAsICJVbnN1cHBvcnRlZCBmZWF0dXJlIg0KKyAgLCAiRGF0YSBFcnJvciINCisgICwgIkNSQyBFcnJvciINCit9Ow0KKw0KKw0KK1NURE1FVEhPRElNUCBDRXh0cmFjdENhbGxiYWNrQ29uc29sZTo6U2V0VG90YWwoVUludDY0KQ0KK3sNCisgIGlmIChOQ29uc29sZUNsb3NlOjpUZXN0QnJlYWtTaWduYWwoKSkNCisgICAgcmV0dXJuIEVfQUJPUlQ7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENFeHRyYWN0Q2FsbGJhY2tDb25zb2xlOjpTZXRDb21wbGV0ZWQoY29uc3QgVUludDY0ICopDQorew0KKyAgaWYgKE5Db25zb2xlQ2xvc2U6OlRlc3RCcmVha1NpZ25hbCgpKQ0KKyAgICByZXR1cm4gRV9BQk9SVDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0V4dHJhY3RDYWxsYmFja0NvbnNvbGU6OkFza092ZXJ3cml0ZSgNCisgICAgY29uc3Qgd2NoYXJfdCAqZXhpc3ROYW1lLCBjb25zdCBGSUxFVElNRSAqLCBjb25zdCBVSW50NjQgKiwNCisgICAgY29uc3Qgd2NoYXJfdCAqbmV3TmFtZSwgY29uc3QgRklMRVRJTUUgKiwgY29uc3QgVUludDY0ICosDQorICAgIEludDMyICphbnN3ZXIpDQorew0KKyAgKCpPdXRTdHJlYW0pIDw8ICJmaWxlICIgPDwgZXhpc3ROYW1lIDw8IGVuZGwgPDwNCisgICAgICAgICJhbHJlYWR5IGV4aXN0cy4gT3ZlcndyaXRlIHdpdGgiIDw8IGVuZGwgPDwNCisgICAgICAgIG5ld05hbWU7DQorICANCisgIE5Vc2VyQW5zd2VyTW9kZTo6RUVudW0gb3ZlcndyaXRlQW5zd2VyID0gU2NhblVzZXJZZXNOb0FsbFF1aXQoT3V0U3RyZWFtKTsNCisgIA0KKyAgc3dpdGNoIChvdmVyd3JpdGVBbnN3ZXIpDQorICB7DQorICAgIGNhc2UgTlVzZXJBbnN3ZXJNb2RlOjprUXVpdDogIHJldHVybiBFX0FCT1JUOw0KKyAgICBjYXNlIE5Vc2VyQW5zd2VyTW9kZTo6a05vOiAgICAgKmFuc3dlciA9IE5PdmVyd3JpdGVBbnN3ZXI6OmtObzsgYnJlYWs7DQorICAgIGNhc2UgTlVzZXJBbnN3ZXJNb2RlOjprTm9BbGw6ICAqYW5zd2VyID0gTk92ZXJ3cml0ZUFuc3dlcjo6a05vVG9BbGw7IGJyZWFrOw0KKyAgICBjYXNlIE5Vc2VyQW5zd2VyTW9kZTo6a1llc0FsbDogKmFuc3dlciA9IE5PdmVyd3JpdGVBbnN3ZXI6OmtZZXNUb0FsbDsgYnJlYWs7DQorICAgIGNhc2UgTlVzZXJBbnN3ZXJNb2RlOjprWWVzOiAgICAqYW5zd2VyID0gTk92ZXJ3cml0ZUFuc3dlcjo6a1llczsgYnJlYWs7DQorICAgIGNhc2UgTlVzZXJBbnN3ZXJNb2RlOjprQXV0b1JlbmFtZUFsbDogKmFuc3dlciA9IE5PdmVyd3JpdGVBbnN3ZXI6OmtBdXRvUmVuYW1lOyBicmVhazsNCisgICAgZGVmYXVsdDogcmV0dXJuIEVfRkFJTDsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0V4dHJhY3RDYWxsYmFja0NvbnNvbGU6OlByZXBhcmVPcGVyYXRpb24oY29uc3Qgd2NoYXJfdCAqbmFtZSwgYm9vbCAvKiBpc0ZvbGRlciAqLywgSW50MzIgYXNrRXh0cmFjdE1vZGUsIGNvbnN0IFVJbnQ2NCAqcG9zaXRpb24pDQorew0KKyAgY29uc3QgY2hhciAqczsNCisgIHN3aXRjaCAoYXNrRXh0cmFjdE1vZGUpDQorICB7DQorICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOQXNrTW9kZTo6a0V4dHJhY3Q6IHMgPSBrRXh0cmFjdFN0cmluZzsgYnJlYWs7DQorICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOQXNrTW9kZTo6a1Rlc3Q6ICAgIHMgPSBrVGVzdFN0cmluZzsgYnJlYWs7DQorICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOQXNrTW9kZTo6a1NraXA6ICAgIHMgPSBrU2tpcFN0cmluZzsgYnJlYWs7DQorICAgIGRlZmF1bHQ6IHMgPSAiIjsgLy8gcmV0dXJuIEVfRkFJTDsNCisgIH07DQorICAoKk91dFN0cmVhbSkgPDwgcyA8PCBuYW1lOw0KKyAgaWYgKHBvc2l0aW9uICE9IDApDQorICAgICgqT3V0U3RyZWFtKSA8PCAiIDwiIDw8ICpwb3NpdGlvbiA8PCAiPiI7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENFeHRyYWN0Q2FsbGJhY2tDb25zb2xlOjpNZXNzYWdlRXJyb3IoY29uc3Qgd2NoYXJfdCAqbWVzc2FnZSkNCit7DQorICAoKk91dFN0cmVhbSkgPDwgbWVzc2FnZSA8PCBlbmRsOw0KKyAgTnVtRmlsZUVycm9yc0luQ3VycmVudCsrOw0KKyAgTnVtRmlsZUVycm9ycysrOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRXh0cmFjdENhbGxiYWNrQ29uc29sZTo6U2V0T3BlcmF0aW9uUmVzdWx0KEludDMyIG9wZXJhdGlvblJlc3VsdCwgYm9vbCBlbmNyeXB0ZWQpDQorew0KKyAgc3dpdGNoIChvcGVyYXRpb25SZXN1bHQpDQorICB7DQorICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprT0s6DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgIHsNCisgICAgICBOdW1GaWxlRXJyb3JzSW5DdXJyZW50Kys7DQorICAgICAgTnVtRmlsZUVycm9ycysrOw0KKyAgICAgICgqT3V0U3RyZWFtKSA8PCAiICA6ICAiOw0KKyAgICAgIGNvbnN0IGNoYXIgKnMgPSBOVUxMOw0KKyAgICAgIHN3aXRjaCAob3BlcmF0aW9uUmVzdWx0KQ0KKyAgICAgIHsNCisgICAgICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprVW5zdXBwb3J0ZWRNZXRob2Q6DQorICAgICAgICAgIHMgPSBrVW5zdXBwb3J0ZWRNZXRob2Q7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtDUkNFcnJvcjoNCisgICAgICAgICAgcyA9IChlbmNyeXB0ZWQgPyBrQ3JjRmFpbGVkRW5jcnlwdGVkIDoga0NyY0ZhaWxlZCk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtEYXRhRXJyb3I6DQorICAgICAgICAgIHMgPSAoZW5jcnlwdGVkID8ga0RhdGFFcnJvckVuY3J5cHRlZCA6IGtEYXRhRXJyb3IpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprVW5hdmFpbGFibGU6DQorICAgICAgICAgIHMgPSBrVW5hdmFpbGFibGVEYXRhOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprVW5leHBlY3RlZEVuZDoNCisgICAgICAgICAgcyA9IGtVbmV4cGVjdGVkRW5kOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprRGF0YUFmdGVyRW5kOg0KKyAgICAgICAgICBzID0ga0RhdGFBZnRlckVuZDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIE5BcmNoaXZlOjpORXh0cmFjdDo6Tk9wZXJhdGlvblJlc3VsdDo6a0lzTm90QXJjOg0KKyAgICAgICAgICBzID0ga0lzTm90QXJjOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprSGVhZGVyc0Vycm9yOg0KKyAgICAgICAgICBzID0ga0hlYWRlcnNFcnJvcjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChzKQ0KKyAgICAgICAgKCpPdXRTdHJlYW0pIDw8ICJFcnJvciA6ICIgPDwgczsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgY2hhciB0ZW1wWzE2XTsNCisgICAgICAgIENvbnZlcnRVSW50MzJUb1N0cmluZyhvcGVyYXRpb25SZXN1bHQsIHRlbXApOw0KKyAgICAgICAgKCpPdXRTdHJlYW0pIDw8ICJFcnJvciAjIiA8PCB0ZW1wOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgKCpPdXRTdHJlYW0pIDw8IGVuZGw7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorI2lmbmRlZiBfTk9fQ1JZUFRPDQorDQorSFJFU1VMVCBDRXh0cmFjdENhbGxiYWNrQ29uc29sZTo6U2V0UGFzc3dvcmQoY29uc3QgVVN0cmluZyAmcGFzc3dvcmQpDQorew0KKyAgUGFzc3dvcmRJc0RlZmluZWQgPSB0cnVlOw0KKyAgUGFzc3dvcmQgPSBwYXNzd29yZDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0V4dHJhY3RDYWxsYmFja0NvbnNvbGU6OkNyeXB0b0dldFRleHRQYXNzd29yZChCU1RSICpwYXNzd29yZCkNCit7DQorICBpZiAoIVBhc3N3b3JkSXNEZWZpbmVkKQ0KKyAgew0KKyAgICBQYXNzd29yZCA9IEdldFBhc3N3b3JkKE91dFN0cmVhbSk7DQorICAgIFBhc3N3b3JkSXNEZWZpbmVkID0gdHJ1ZTsNCisgIH0NCisgIHJldHVybiBTdHJpbmdUb0JzdHIoUGFzc3dvcmQsIHBhc3N3b3JkKTsNCit9DQorDQorI2VuZGlmDQorDQorSFJFU1VMVCBDRXh0cmFjdENhbGxiYWNrQ29uc29sZTo6QmVmb3JlT3Blbihjb25zdCB3Y2hhcl90ICpuYW1lKQ0KK3sNCisgIE51bVRyeUFyY3MrKzsNCisgIFRoZXJlSXNFcnJvckluQ3VycmVudCA9IGZhbHNlOw0KKyAgVGhlcmVJc1dhcm5pbmdJbkN1cnJlbnQgPSBmYWxzZTsNCisgIE51bUZpbGVFcnJvcnNJbkN1cnJlbnQgPSAwOw0KKyAgKCpPdXRTdHJlYW0pIDw8IGVuZGwgPDwga1Byb2Nlc3NpbmcgPDwgbmFtZSA8PCBlbmRsOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ0V4dHJhY3RDYWxsYmFja0NvbnNvbGU6Ok9wZW5SZXN1bHQoY29uc3Qgd2NoYXJfdCAqIC8qIG5hbWUgKi8sIEhSRVNVTFQgcmVzdWx0LCBib29sIGVuY3J5cHRlZCkNCit7DQorICAoKk91dFN0cmVhbSkgPDwgZW5kbDsNCisgIGlmIChyZXN1bHQgIT0gU19PSykNCisgIHsNCisgICAgKCpPdXRTdHJlYW0pIDw8ICJFcnJvcjogIjsNCisgICAgaWYgKHJlc3VsdCA9PSBTX0ZBTFNFKQ0KKyAgICB7DQorICAgICAgKCpPdXRTdHJlYW0pIDw8IChlbmNyeXB0ZWQgPw0KKyAgICAgICAgIkNhbiBub3Qgb3BlbiBlbmNyeXB0ZWQgYXJjaGl2ZS4gV3JvbmcgcGFzc3dvcmQ/IiA6DQorICAgICAgICAiQ2FuIG5vdCBvcGVuIGZpbGUgYXMgYXJjaGl2ZSIpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGlmIChyZXN1bHQgPT0gRV9PVVRPRk1FTU9SWSkNCisgICAgICAgICgqT3V0U3RyZWFtKSA8PCAiQ2FuJ3QgYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5IjsNCisgICAgICBlbHNlDQorICAgICAgICAoKk91dFN0cmVhbSkgPDwgTkVycm9yOjpNeUZvcm1hdE1lc3NhZ2UocmVzdWx0KTsNCisgICAgfQ0KKyAgICAoKk91dFN0cmVhbSkgPDwgZW5kbDsNCisgICAgTnVtQ2FudE9wZW5BcmNzKys7DQorICAgIFRoZXJlSXNFcnJvckluQ3VycmVudCA9IHRydWU7DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorQVN0cmluZyBHZXRPcGVuQXJjRXJyb3JNZXNzYWdlKFVJbnQzMiBlcnJvckZsYWdzKQ0KK3sNCisgIEFTdHJpbmcgczsNCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtfRXJyb3JGbGFnc01lc3NhZ2VzKTsgaSsrKQ0KKyAgew0KKyAgICBVSW50MzIgZiA9ICgxIDw8IGkpOw0KKyAgICBpZiAoKGVycm9yRmxhZ3MgJiBmKSA9PSAwKQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICBjb25zdCBjaGFyICptID0ga19FcnJvckZsYWdzTWVzc2FnZXNbaV07DQorICAgIGlmICghcy5Jc0VtcHR5KCkpDQorICAgICAgcyArPSAnXG4nOw0KKyAgICBzICs9IG07DQorICAgIGVycm9yRmxhZ3MgJj0gfmY7DQorICB9DQorICBpZiAoZXJyb3JGbGFncyAhPSAwKQ0KKyAgew0KKyAgICBjaGFyIHN6WzE2XTsNCisgICAgc3pbMF0gPSAnMCc7DQorICAgIHN6WzFdID0gJ3gnOw0KKyAgICBDb252ZXJ0VUludDMyVG9IZXgoZXJyb3JGbGFncywgc3ogKyAyKTsNCisgICAgaWYgKCFzLklzRW1wdHkoKSkNCisgICAgICBzICs9ICdcbic7DQorICAgIHMgKz0gc3o7DQorICB9DQorICByZXR1cm4gczsNCit9DQorDQorDQorSFJFU1VMVCBDRXh0cmFjdENhbGxiYWNrQ29uc29sZTo6U2V0RXJyb3IoaW50IGxldmVsLCBjb25zdCB3Y2hhcl90ICpuYW1lLA0KKyAgICBVSW50MzIgZXJyb3JGbGFncywgY29uc3Qgd2NoYXJfdCAqZXJyb3JzLA0KKyAgICBVSW50MzIgd2FybmluZ0ZsYWdzLCBjb25zdCB3Y2hhcl90ICp3YXJuaW5ncykNCit7DQorICBpZiAobGV2ZWwgIT0gMCkNCisgIHsNCisgICAgKCpPdXRTdHJlYW0pIDw8IG5hbWUgPDwgZW5kbDsNCisgIH0NCisNCisgIGlmIChlcnJvckZsYWdzICE9IDApDQorICB7DQorICAgICgqT3V0U3RyZWFtKSA8PCAiRXJyb3JzOiAiOw0KKyAgICAoKk91dFN0cmVhbSkgPDwgZW5kbDsNCisgICAgKCpPdXRTdHJlYW0pIDw8IEdldE9wZW5BcmNFcnJvck1lc3NhZ2UoZXJyb3JGbGFncyk7DQorICAgICgqT3V0U3RyZWFtKSA8PCBlbmRsOw0KKyAgICBOdW1PcGVuQXJjRXJyb3JzKys7DQorICAgIFRoZXJlSXNFcnJvckluQ3VycmVudCA9IHRydWU7DQorICB9DQorDQorICBpZiAoZXJyb3JzICYmIHdjc2xlbihlcnJvcnMpICE9IDApDQorICB7DQorICAgICgqT3V0U3RyZWFtKSA8PCAiRXJyb3JzOiAiOw0KKyAgICAoKk91dFN0cmVhbSkgPDwgZW5kbDsNCisgICAgKCpPdXRTdHJlYW0pIDw8IGVycm9yczsNCisgICAgKCpPdXRTdHJlYW0pIDw8IGVuZGw7DQorICAgIE51bU9wZW5BcmNFcnJvcnMrKzsNCisgICAgVGhlcmVJc0Vycm9ySW5DdXJyZW50ID0gdHJ1ZTsNCisgIH0NCisNCisgIGlmICh3YXJuaW5nRmxhZ3MgIT0gMCkNCisgIHsNCisgICAgKCpPdXRTdHJlYW0pIDw8ICJXYXJuaW5nczogIjsNCisgICAgKCpPdXRTdHJlYW0pIDw8IGVuZGw7DQorICAgICgqT3V0U3RyZWFtKSA8PCBHZXRPcGVuQXJjRXJyb3JNZXNzYWdlKHdhcm5pbmdGbGFncyk7DQorICAgICgqT3V0U3RyZWFtKSA8PCBlbmRsOw0KKyAgICBOdW1PcGVuQXJjV2FybmluZ3MrKzsNCisgICAgVGhlcmVJc1dhcm5pbmdJbkN1cnJlbnQgPSB0cnVlOw0KKyAgfQ0KKw0KKyAgaWYgKHdhcm5pbmdzICYmIHdjc2xlbih3YXJuaW5ncykgIT0gMCkNCisgIHsNCisgICAgKCpPdXRTdHJlYW0pIDw8ICJXYXJuaW5nczogIjsNCisgICAgKCpPdXRTdHJlYW0pIDw8IGVuZGw7DQorICAgICgqT3V0U3RyZWFtKSA8PCB3YXJuaW5nczsNCisgICAgKCpPdXRTdHJlYW0pIDw8IGVuZGw7DQorICAgIE51bU9wZW5BcmNXYXJuaW5ncysrOw0KKyAgICBUaGVyZUlzV2FybmluZ0luQ3VycmVudCA9IHRydWU7DQorICB9DQorDQorICAoKk91dFN0cmVhbSkgPDwgZW5kbDsNCisgIHJldHVybiBTX09LOw0KK30NCisgIA0KK0hSRVNVTFQgQ0V4dHJhY3RDYWxsYmFja0NvbnNvbGU6OlRoZXJlQXJlTm9GaWxlcygpDQorew0KKyAgKCpPdXRTdHJlYW0pIDw8IGVuZGwgPDwga05vRmlsZXMgPDwgZW5kbDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENFeHRyYWN0Q2FsbGJhY2tDb25zb2xlOjpFeHRyYWN0UmVzdWx0KEhSRVNVTFQgcmVzdWx0KQ0KK3sNCisgIGlmIChyZXN1bHQgPT0gU19PSykNCisgIHsNCisgICAgKCpPdXRTdHJlYW0pIDw8IGVuZGw7DQorDQorICAgIGlmIChOdW1GaWxlRXJyb3JzSW5DdXJyZW50ID09IDAgJiYgIVRoZXJlSXNFcnJvckluQ3VycmVudCkNCisgICAgew0KKyAgICAgIGlmIChUaGVyZUlzV2FybmluZ0luQ3VycmVudCkNCisgICAgICAgIE51bUFyY3NXaXRoV2FybmluZ3MrKzsNCisgICAgICBlbHNlDQorICAgICAgICBOdW1Pa0FyY3MrKzsNCisgICAgICAoKk91dFN0cmVhbSkgPDwga0V2ZXJ5dGhpbmdJc09rIDw8IGVuZGw7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgTnVtQXJjc1dpdGhFcnJvcisrOw0KKyAgICAgIGlmIChOdW1GaWxlRXJyb3JzSW5DdXJyZW50ICE9IDApDQorICAgICAgICAoKk91dFN0cmVhbSkgPDwgIlN1YiBpdGVtcyBFcnJvcnM6ICIgPDwgTnVtRmlsZUVycm9yc0luQ3VycmVudCA8PCBlbmRsOw0KKyAgICB9DQorICAgIHJldHVybiBTX09LOw0KKyAgfQ0KKyAgDQorICBOdW1BcmNzV2l0aEVycm9yKys7DQorICBpZiAocmVzdWx0ID09IEVfQUJPUlQgfHwgcmVzdWx0ID09IEVSUk9SX0RJU0tfRlVMTCkNCisgICAgcmV0dXJuIHJlc3VsdDsNCisgICgqT3V0U3RyZWFtKSA8PCBlbmRsIDw8IGtFcnJvcjsNCisgIGlmIChyZXN1bHQgPT0gRV9PVVRPRk1FTU9SWSkNCisgICAgKCpPdXRTdHJlYW0pIDw8IGtNZW1vcnlFeGNlcHRpb25NZXNzYWdlOw0KKyAgZWxzZQ0KKyAgICAoKk91dFN0cmVhbSkgPDwgTkVycm9yOjpNeUZvcm1hdE1lc3NhZ2UocmVzdWx0KTsNCisgICgqT3V0U3RyZWFtKSA8PCBlbmRsOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ0V4dHJhY3RDYWxsYmFja0NvbnNvbGU6Ok9wZW5UeXBlV2FybmluZyhjb25zdCB3Y2hhcl90ICpuYW1lLCBjb25zdCB3Y2hhcl90ICpva1R5cGUsIGNvbnN0IHdjaGFyX3QgKmVycm9yVHlwZSkNCit7DQorICBVU3RyaW5nIHMgPSBMIldhcm5pbmc6XG4iOw0KKyAgaWYgKHdjc2NtcChva1R5cGUsIGVycm9yVHlwZSkgPT0gMCkNCisgIHsNCisgICAgcyArPSBMIlRoZSBhcmNoaXZlIGlzIG9wZW4gd2l0aCBvZmZzZXQiOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBzICs9IG5hbWU7DQorICAgIHMgKz0gTCJcbkNhbiBub3Qgb3BlbiB0aGUgZmlsZSBhcyBbIjsNCisgICAgcyArPSBlcnJvclR5cGU7DQorICAgIHMgKz0gTCJdIGFyY2hpdmVcbiI7DQorICAgIHMgKz0gTCJUaGUgZmlsZSBpcyBvcGVuIGFzIFsiOw0KKyAgICBzICs9IG9rVHlwZTsNCisgICAgcyArPSBMIl0gYXJjaGl2ZSI7DQorICB9DQorICgqT3V0U3RyZWFtKSA8PCBzIDw8IGVuZGwgPDwgZW5kbDsNCisgVGhlcmVJc1dhcm5pbmdJbkN1cnJlbnQgPSB0cnVlOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9FeHRyYWN0Q2FsbGJhY2tDb25zb2xlLmggYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvRXh0cmFjdENhbGxiYWNrQ29uc29sZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZmEyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvRXh0cmFjdENhbGxiYWNrQ29uc29sZS5oCkBAIC0wLDAgKzEsOTkgQEAKKy8vIEV4dHJhY3RDYWxsYmFja0NvbnNvbGUuaA0KKw0KKyNpZm5kZWYgX19FWFRSQUNUQ0FMTEJBQ0tDT05TT0xFX0gNCisjZGVmaW5lIF9fRVhUUkFDVENBTExCQUNLQ09OU09MRV9IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeVN0cmluZy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vU3RkT3V0U3RyZWFtLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9GaWxlU3RyZWFtcy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9JUGFzc3dvcmQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQXJjaGl2ZS9JQXJjaGl2ZS5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vQXJjaGl2ZUV4dHJhY3RDYWxsYmFjay5oIg0KKw0KK2NsYXNzIENFeHRyYWN0Q2FsbGJhY2tDb25zb2xlOg0KKyAgcHVibGljIElFeHRyYWN0Q2FsbGJhY2tVSSwNCisgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgcHVibGljIElDcnlwdG9HZXRUZXh0UGFzc3dvcmQsDQorICAjZW5kaWYNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KK3B1YmxpYzoNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0JFR0lOMihJRm9sZGVyQXJjaGl2ZUV4dHJhY3RDYWxsYmFjaykNCisgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoSUNyeXB0b0dldFRleHRQYXNzd29yZCkNCisgICNlbmRpZg0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5EDQorICBNWV9BRERSRUZfUkVMRUFTRQ0KKw0KKyAgU1RETUVUSE9EKFNldFRvdGFsKShVSW50NjQgdG90YWwpOw0KKyAgU1RETUVUSE9EKFNldENvbXBsZXRlZCkoY29uc3QgVUludDY0ICpjb21wbGV0ZVZhbHVlKTsNCisNCisgIC8vIElGb2xkZXJBcmNoaXZlRXh0cmFjdENhbGxiYWNrDQorICBTVERNRVRIT0QoQXNrT3ZlcndyaXRlKSgNCisgICAgICBjb25zdCB3Y2hhcl90ICpleGlzdE5hbWUsIGNvbnN0IEZJTEVUSU1FICpleGlzdFRpbWUsIGNvbnN0IFVJbnQ2NCAqZXhpc3RTaXplLA0KKyAgICAgIGNvbnN0IHdjaGFyX3QgKm5ld05hbWUsIGNvbnN0IEZJTEVUSU1FICpuZXdUaW1lLCBjb25zdCBVSW50NjQgKm5ld1NpemUsDQorICAgICAgSW50MzIgKmFuc3dlcik7DQorICBTVERNRVRIT0QgKFByZXBhcmVPcGVyYXRpb24pKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGJvb2wgaXNGb2xkZXIsIEludDMyIGFza0V4dHJhY3RNb2RlLCBjb25zdCBVSW50NjQgKnBvc2l0aW9uKTsNCisNCisgIFNURE1FVEhPRChNZXNzYWdlRXJyb3IpKGNvbnN0IHdjaGFyX3QgKm1lc3NhZ2UpOw0KKyAgU1RETUVUSE9EKFNldE9wZXJhdGlvblJlc3VsdCkoSW50MzIgb3BlcmF0aW9uUmVzdWx0LCBib29sIGVuY3J5cHRlZCk7DQorDQorICBIUkVTVUxUIEJlZm9yZU9wZW4oY29uc3Qgd2NoYXJfdCAqbmFtZSk7DQorICBIUkVTVUxUIE9wZW5SZXN1bHQoY29uc3Qgd2NoYXJfdCAqbmFtZSwgSFJFU1VMVCByZXN1bHQsIGJvb2wgZW5jcnlwdGVkKTsNCisgIEhSRVNVTFQgU2V0RXJyb3IoaW50IGxldmVsLCBjb25zdCB3Y2hhcl90ICpuYW1lLA0KKyAgICAgICAgVUludDMyIGVycm9yRmxhZ3MsIGNvbnN0IHdjaGFyX3QgKmVycm9ycywNCisgICAgICAgIFVJbnQzMiB3YXJuaW5nRmxhZ3MsIGNvbnN0IHdjaGFyX3QgKndhcm5pbmdzKTsNCisNCisgIEhSRVNVTFQgVGhlcmVBcmVOb0ZpbGVzKCk7DQorICBIUkVTVUxUIEV4dHJhY3RSZXN1bHQoSFJFU1VMVCByZXN1bHQpOw0KKyAgSFJFU1VMVCBPcGVuVHlwZVdhcm5pbmcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqb2tUeXBlLCBjb25zdCB3Y2hhcl90ICplcnJvclR5cGUpOw0KKw0KKyANCisgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgSFJFU1VMVCBTZXRQYXNzd29yZChjb25zdCBVU3RyaW5nICZwYXNzd29yZCk7DQorICBTVERNRVRIT0QoQ3J5cHRvR2V0VGV4dFBhc3N3b3JkKShCU1RSICpwYXNzd29yZCk7DQorDQorICBib29sIFBhc3N3b3JkSXNEZWZpbmVkOw0KKyAgVVN0cmluZyBQYXNzd29yZDsNCisNCisgICNlbmRpZg0KKyAgDQorICBVSW50NjQgTnVtVHJ5QXJjczsNCisgIGJvb2wgVGhlcmVJc0Vycm9ySW5DdXJyZW50Ow0KKyAgYm9vbCBUaGVyZUlzV2FybmluZ0luQ3VycmVudDsNCisNCisgIFVJbnQ2NCBOdW1DYW50T3BlbkFyY3M7DQorICBVSW50NjQgTnVtT2tBcmNzOw0KKyAgVUludDY0IE51bUFyY3NXaXRoRXJyb3I7DQorICBVSW50NjQgTnVtQXJjc1dpdGhXYXJuaW5nczsNCisNCisgIFVJbnQ2NCBOdW1Qcm9ibGVtQXJjc0xldnM7DQorICBVSW50NjQgTnVtT3BlbkFyY0Vycm9yczsNCisgIFVJbnQ2NCBOdW1PcGVuQXJjV2FybmluZ3M7DQorICANCisgIFVJbnQ2NCBOdW1GaWxlRXJyb3JzOw0KKyAgVUludDY0IE51bUZpbGVFcnJvcnNJbkN1cnJlbnQ7DQorDQorICBDU3RkT3V0U3RyZWFtICpPdXRTdHJlYW07DQorDQorICB2b2lkIEluaXQoKQ0KKyAgew0KKyAgICBOdW1UcnlBcmNzID0gMDsNCisgICAgTnVtT2tBcmNzID0gMDsNCisgICAgTnVtQ2FudE9wZW5BcmNzID0gMDsNCisgICAgTnVtQXJjc1dpdGhFcnJvciA9IDA7DQorICAgIE51bUFyY3NXaXRoV2FybmluZ3MgPSAwOw0KKw0KKyAgICBOdW1PcGVuQXJjRXJyb3JzID0gMDsNCisgICAgTnVtT3BlbkFyY1dhcm5pbmdzID0gMDsNCisgICAgTnVtRmlsZUVycm9ycyA9IDA7DQorICAgIE51bUZpbGVFcnJvcnNJbkN1cnJlbnQgPSAwOw0KKyAgfQ0KKw0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0hhc2hDb24uY3BwIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0hhc2hDb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTYyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvSGFzaENvbi5jcHAKQEAgLTAsMCArMSwyNzQgQEAKKy8vIEhhc2hDb24uY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vSW50VG9TdHJpbmcuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9FcnJvck1zZy5oIg0KKw0KKyNpbmNsdWRlICJDb25zb2xlQ2xvc2UuaCINCisjaW5jbHVkZSAiSGFzaENvbi5oIg0KKw0KK3N0YXRpYyBjb25zdCB3Y2hhcl90ICprRW1wdHlGaWxlQWxpYXMgPSBMIltDb250ZW50XSI7DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtTY2FubmluZ01lc3NhZ2UgPSAiU2Nhbm5pbmciOw0KKw0KK0hSRVNVTFQgQ0hhc2hDYWxsYmFja0NvbnNvbGU6OkNoZWNrQnJlYWsoKQ0KK3sNCisgIHJldHVybiBOQ29uc29sZUNsb3NlOjpUZXN0QnJlYWtTaWduYWwoKSA/IEVfQUJPUlQgOiBTX09LOw0KK30NCisNCitIUkVTVUxUIENIYXNoQ2FsbGJhY2tDb25zb2xlOjpTdGFydFNjYW5uaW5nKCkNCit7DQorICAoKk91dFN0cmVhbSkgPDwga1NjYW5uaW5nTWVzc2FnZTsNCisgIHJldHVybiBDaGVja0JyZWFrKCk7DQorfQ0KKw0KK0hSRVNVTFQgQ0hhc2hDYWxsYmFja0NvbnNvbGU6OlNjYW5Qcm9ncmVzcyhVSW50NjQgLyogbnVtRm9sZGVycyAqLywgVUludDY0IC8qIG51bUZpbGVzICovLCBVSW50NjQgLyogdG90YWxTaXplICovLCBjb25zdCB3Y2hhcl90ICogLyogcGF0aCAqLywgYm9vbCAvKiBpc0RpciAqLykNCit7DQorICByZXR1cm4gQ2hlY2tCcmVhaygpOw0KK30NCisNCitIUkVTVUxUIENIYXNoQ2FsbGJhY2tDb25zb2xlOjpDYW5Ob3RGaW5kRXJyb3IoY29uc3Qgd2NoYXJfdCAqbmFtZSwgRFdPUkQgc3lzdGVtRXJyb3IpDQorew0KKyAgcmV0dXJuIENhbk5vdEZpbmRFcnJvcl9CYXNlKG5hbWUsIHN5c3RlbUVycm9yKTsNCit9DQorDQorSFJFU1VMVCBDSGFzaENhbGxiYWNrQ29uc29sZTo6RmluaXNoU2Nhbm5pbmcoKQ0KK3sNCisgICgqT3V0U3RyZWFtKSA8PCBlbmRsIDw8IGVuZGw7DQorICByZXR1cm4gQ2hlY2tCcmVhaygpOw0KK30NCisNCitIUkVTVUxUIENIYXNoQ2FsbGJhY2tDb25zb2xlOjpTZXROdW1GaWxlcyhVSW50NjQgLyogbnVtRmlsZXMgKi8pDQorew0KKyAgcmV0dXJuIENoZWNrQnJlYWsoKTsNCit9DQorDQorSFJFU1VMVCBDSGFzaENhbGxiYWNrQ29uc29sZTo6U2V0VG90YWwoVUludDY0IHNpemUpDQorew0KKyAgaWYgKEVuYWJsZVBlcmNlbnRzKQ0KKyAgICBtX1BlcmNlbnRQcmludGVyLlNldFRvdGFsKHNpemUpOw0KKyAgcmV0dXJuIENoZWNrQnJlYWsoKTsNCit9DQorDQorSFJFU1VMVCBDSGFzaENhbGxiYWNrQ29uc29sZTo6U2V0Q29tcGxldGVkKGNvbnN0IFVJbnQ2NCAqY29tcGxldGVWYWx1ZSkNCit7DQorICBpZiAoY29tcGxldGVWYWx1ZSAmJiBFbmFibGVQZXJjZW50cykNCisgIHsNCisgICAgbV9QZXJjZW50UHJpbnRlci5TZXRSYXRpbygqY29tcGxldGVWYWx1ZSk7DQorICAgIG1fUGVyY2VudFByaW50ZXIuUHJpbnRSYXRpbygpOw0KKyAgfQ0KKyAgcmV0dXJuIENoZWNrQnJlYWsoKTsNCit9DQorDQorc3RhdGljIHZvaWQgQWRkTWludXNlcyhBU3RyaW5nICZzLCB1bnNpZ25lZCBudW0pDQorew0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bTsgaSsrKQ0KKyAgICBzICs9ICctJzsNCit9DQorDQorc3RhdGljIHZvaWQgU2V0U3BhY2VzKGNoYXIgKnMsIGludCBudW0pDQorew0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykNCisgICAgc1tpXSA9ICcgJzsNCit9DQorDQorc3RhdGljIHZvaWQgU2V0U3BhY2VzQW5kTnVsKGNoYXIgKnMsIGludCBudW0pDQorew0KKyAgU2V0U3BhY2VzKHMsIG51bSk7DQorICBzW251bV0gPSAwOw0KK30NCisNCitzdGF0aWMgdm9pZCBBZGRTcGFjZXMoVVN0cmluZyAmcywgaW50IG51bSkNCit7DQorICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKQ0KKyAgICBzICs9ICcgJzsNCit9DQorDQorc3RhdGljIGNvbnN0IGludCBrU2l6ZUZpZWxkX0xlbiA9IDEzOw0KK3N0YXRpYyBjb25zdCBpbnQga05hbWVGaWVsZF9MZW4gPSAxMjsNCisNCitzdGF0aWMgdW5zaWduZWQgR2V0Q29sdW1uV2lkdGgodW5zaWduZWQgZGlnZXN0U2l6ZSkNCit7DQorICB1bnNpZ25lZCB3aWR0aCA9IGRpZ2VzdFNpemUgKiAyOw0KKyAgY29uc3QgdW5zaWduZWQga01pbkNvbHVtbldpZHRoID0gODsNCisgIHJldHVybiB3aWR0aCA8IGtNaW5Db2x1bW5XaWR0aCA/IGtNaW5Db2x1bW5XaWR0aDogd2lkdGg7DQorfQ0KKw0KK3ZvaWQgQ0hhc2hDYWxsYmFja0NvbnNvbGU6OlByaW50U2VwYXJhdG9yTGluZShjb25zdCBDT2JqZWN0VmVjdG9yPENIYXNoZXJTdGF0ZT4gJmhhc2hlcnMpDQorew0KKyAgQVN0cmluZyBzOw0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGhhc2hlcnMuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIGNvbnN0IENIYXNoZXJTdGF0ZSAmaCA9IGhhc2hlcnNbaV07DQorICAgIEFkZE1pbnVzZXMocywgR2V0Q29sdW1uV2lkdGgoaC5EaWdlc3RTaXplKSk7DQorICAgIHMgKz0gJyAnOw0KKyAgfQ0KKyAgQWRkTWludXNlcyhzLCBrU2l6ZUZpZWxkX0xlbik7DQorICBzICs9ICIgICI7DQorICBBZGRNaW51c2VzKHMsIGtOYW1lRmllbGRfTGVuKTsNCisgIG1fUGVyY2VudFByaW50ZXIuUHJpbnRTdHJpbmcocyk7DQorICBtX1BlcmNlbnRQcmludGVyLlByaW50TmV3TGluZSgpOw0KK30NCisNCitIUkVTVUxUIENIYXNoQ2FsbGJhY2tDb25zb2xlOjpCZWZvcmVGaXJzdEZpbGUoY29uc3QgQ0hhc2hCdW5kbGUgJmhiKQ0KK3sNCisgIFVTdHJpbmcgczsNCisgIEZPUl9WRUNUT1IgKGksIGhiLkhhc2hlcnMpDQorICB7DQorICAgIGNvbnN0IENIYXNoZXJTdGF0ZSAmaCA9IGhiLkhhc2hlcnNbaV07DQorICAgIHMgKz0gaC5OYW1lOw0KKyAgICBBZGRTcGFjZXMocywgKGludClHZXRDb2x1bW5XaWR0aChoLkRpZ2VzdFNpemUpIC0gaC5OYW1lLkxlbigpICsgMSk7DQorICB9DQorICBVU3RyaW5nIHMyID0gTCJTaXplIjsNCisgIEFkZFNwYWNlcyhzLCBrU2l6ZUZpZWxkX0xlbiAtIHMyLkxlbigpKTsNCisgIHMgKz0gczI7DQorICBzICs9IEwiICAiOw0KKyAgcyArPSBMIk5hbWUiOw0KKyAgbV9QZXJjZW50UHJpbnRlci5QcmludFN0cmluZyhzKTsNCisgIG1fUGVyY2VudFByaW50ZXIuUHJpbnROZXdMaW5lKCk7DQorICBQcmludFNlcGFyYXRvckxpbmUoaGIuSGFzaGVycyk7DQorICByZXR1cm4gQ2hlY2tCcmVhaygpOw0KK30NCisNCitIUkVTVUxUIENIYXNoQ2FsbGJhY2tDb25zb2xlOjpPcGVuRmlsZUVycm9yKGNvbnN0IHdjaGFyX3QgKm5hbWUsIERXT1JEIHN5c3RlbUVycm9yKQ0KK3sNCisgIEZhaWxlZENvZGVzLkFkZChzeXN0ZW1FcnJvcik7DQorICBGYWlsZWRGaWxlcy5BZGQobmFtZSk7DQorICAvLyBpZiAoc3lzdGVtRXJyb3IgPT0gRVJST1JfU0hBUklOR19WSU9MQVRJT04pDQorICB7DQorICAgIG1fUGVyY2VudFByaW50ZXIuUHJpbnRTdHJpbmcobmFtZSk7DQorICAgIG1fUGVyY2VudFByaW50ZXIuUHJpbnRTdHJpbmcoIjogV0FSTklORzogIik7DQorICAgIG1fUGVyY2VudFByaW50ZXIuUHJpbnRTdHJpbmcoTldpbmRvd3M6Ok5FcnJvcjo6TXlGb3JtYXRNZXNzYWdlKHN5c3RlbUVycm9yKSk7DQorICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgfQ0KKyAgLy8gcmV0dXJuIHN5c3RlbUVycm9yOw0KK30NCisNCitIUkVTVUxUIENIYXNoQ2FsbGJhY2tDb25zb2xlOjpHZXRTdHJlYW0oY29uc3Qgd2NoYXJfdCAqbmFtZSwgYm9vbCAvKiBpc0ZvbGRlciAqLykNCit7DQorICBtX0ZpbGVOYW1lID0gbmFtZTsNCisgIHJldHVybiBDaGVja0JyZWFrKCk7DQorfQ0KKw0KK3ZvaWQgQ0hhc2hDYWxsYmFja0NvbnNvbGU6OlByaW50UmVzdWx0TGluZShVSW50NjQgZmlsZVNpemUsDQorICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q0hhc2hlclN0YXRlPiAmaGFzaGVycywgdW5zaWduZWQgZGlnZXN0SW5kZXgsIGJvb2wgc2hvd0hhc2gpDQorew0KKyAgRk9SX1ZFQ1RPUiAoaSwgaGFzaGVycykNCisgIHsNCisgICAgY29uc3QgQ0hhc2hlclN0YXRlICZoID0gaGFzaGVyc1tpXTsNCisNCisgICAgY2hhciBzW2tfSGFzaENhbGNfRGlnZXN0U2l6ZV9NYXggKiAyICsgNjRdOw0KKyAgICBzWzBdID0gMDsNCisgICAgaWYgKHNob3dIYXNoKQ0KKyAgICAgIEFkZEhhc2hIZXhUb1N0cmluZyhzLCBoLkRpZ2VzdHNbZGlnZXN0SW5kZXhdLCBoLkRpZ2VzdFNpemUpOw0KKyAgICBTZXRTcGFjZXNBbmROdWwocyArIHN0cmxlbihzKSwgKGludClHZXRDb2x1bW5XaWR0aChoLkRpZ2VzdFNpemUpIC0gKGludClzdHJsZW4ocykgKyAxKTsNCisgICAgbV9QZXJjZW50UHJpbnRlci5QcmludFN0cmluZyhzKTsNCisgIH0NCisgIGNoYXIgc1s2NF07DQorICBzWzBdID0gMDsNCisgIGNoYXIgKnAgPSBzOw0KKyAgaWYgKHNob3dIYXNoICYmIGZpbGVTaXplICE9IDApDQorICB7DQorICAgIHAgPSBzICsgMzI7DQorICAgIENvbnZlcnRVSW50NjRUb1N0cmluZyhmaWxlU2l6ZSwgcCk7DQorICAgIGludCBudW1TcGFjZXMgPSBrU2l6ZUZpZWxkX0xlbiAtIChpbnQpc3RybGVuKHApOw0KKyAgICBpZiAobnVtU3BhY2VzID4gMCkNCisgICAgew0KKyAgICAgIHAgLT0gbnVtU3BhY2VzOw0KKyAgICAgIFNldFNwYWNlcyhwLCBudW1TcGFjZXMpOw0KKyAgICB9DQorICB9DQorICBlbHNlDQorICAgIFNldFNwYWNlc0FuZE51bChzLCBrU2l6ZUZpZWxkX0xlbiAtIChpbnQpc3RybGVuKHMpKTsNCisgIHVuc2lnbmVkIGxlbiA9ICh1bnNpZ25lZClzdHJsZW4ocCk7DQorICBwW2xlbl0gPSAnICc7DQorICBwW2xlbiArIDFdID0gJyAnOw0KKyAgcFtsZW4gKyAyXSA9IDA7DQorICBtX1BlcmNlbnRQcmludGVyLlByaW50U3RyaW5nKHApOw0KK30NCisNCitIUkVTVUxUIENIYXNoQ2FsbGJhY2tDb25zb2xlOjpTZXRPcGVyYXRpb25SZXN1bHQoVUludDY0IGZpbGVTaXplLCBjb25zdCBDSGFzaEJ1bmRsZSAmaGIsIGJvb2wgc2hvd0hhc2gpDQorew0KKyAgUHJpbnRSZXN1bHRMaW5lKGZpbGVTaXplLCBoYi5IYXNoZXJzLCBrX0hhc2hDYWxjX0luZGV4X0N1cnJlbnQsIHNob3dIYXNoKTsNCisgIGlmIChtX0ZpbGVOYW1lLklzRW1wdHkoKSkNCisgICAgbV9QZXJjZW50UHJpbnRlci5QcmludFN0cmluZyhrRW1wdHlGaWxlQWxpYXMpOw0KKyAgZWxzZQ0KKyAgICBtX1BlcmNlbnRQcmludGVyLlByaW50U3RyaW5nKG1fRmlsZU5hbWUpOw0KKyAgbV9QZXJjZW50UHJpbnRlci5QcmludE5ld0xpbmUoKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitzdGF0aWMgY29uc3QgY2hhciAqa19EaWdlc3RUaXRsZXNbXSA9DQorew0KKyAgICAiIDoiDQorICAsICIgZm9yIGRhdGE6ICAgICAgICAgICAgICAiDQorICAsICIgZm9yIGRhdGEgYW5kIG5hbWVzOiAgICAiDQorICAsICIgZm9yIHN0cmVhbXMgYW5kIG5hbWVzOiAiDQorfTsNCisNCitzdGF0aWMgdm9pZCBQcmludFN1bShDU3RkT3V0U3RyZWFtICZwLCBjb25zdCBDSGFzaGVyU3RhdGUgJmgsIHVuc2lnbmVkIGRpZ2VzdEluZGV4KQ0KK3sNCisgIGNoYXIgc1trX0hhc2hDYWxjX0RpZ2VzdFNpemVfTWF4ICogMiArIDY0XTsNCisgIFVTdHJpbmcgbmFtZSA9IGguTmFtZTsNCisgIEFkZFNwYWNlcyhuYW1lLCA2IC0gKGludCluYW1lLkxlbigpKTsNCisgIHAgPDwgbmFtZTsNCisgIHAgPDwga19EaWdlc3RUaXRsZXNbZGlnZXN0SW5kZXhdOw0KKyAgc1swXSA9IDA7DQorICBBZGRIYXNoSGV4VG9TdHJpbmcocywgaC5EaWdlc3RzW2RpZ2VzdEluZGV4XSwgaC5EaWdlc3RTaXplKTsNCisgIHAgPDwgczsNCisgIHAgPDwgIlxuIjsNCit9DQorDQorDQordm9pZCBQcmludEhhc2hTdGF0KENTdGRPdXRTdHJlYW0gJnAsIGNvbnN0IENIYXNoQnVuZGxlICZoYikNCit7DQorICBGT1JfVkVDVE9SIChpLCBoYi5IYXNoZXJzKQ0KKyAgew0KKyAgICBjb25zdCBDSGFzaGVyU3RhdGUgJmggPSBoYi5IYXNoZXJzW2ldOw0KKyAgICBwIDw8ICJcbiI7DQorICAgIFByaW50U3VtKHAsIGgsIGtfSGFzaENhbGNfSW5kZXhfRGF0YVN1bSk7DQorICAgIGlmIChoYi5OdW1GaWxlcyAhPSAxIHx8IGhiLk51bURpcnMgIT0gMCkNCisgICAgICBQcmludFN1bShwLCBoLCBrX0hhc2hDYWxjX0luZGV4X05hbWVzU3VtKTsNCisgICAgaWYgKGhiLk51bUFsdFN0cmVhbXMgIT0gMCkNCisgICAgICBQcmludFN1bShwLCBoLCBrX0hhc2hDYWxjX0luZGV4X1N0cmVhbXNTdW0pOw0KKyAgfQ0KK30NCisNCit2b2lkIENIYXNoQ2FsbGJhY2tDb25zb2xlOjpQcmludFByb3BlcnR5KGNvbnN0IGNoYXIgKm5hbWUsIFVJbnQ2NCB2YWx1ZSkNCit7DQorICBjaGFyIHNbMzJdOw0KKyAgc1swXSA9ICc6JzsNCisgIHNbMV0gPSAnICc7DQorICBDb252ZXJ0VUludDY0VG9TdHJpbmcodmFsdWUsIHMgKyAyKTsNCisgIG1fUGVyY2VudFByaW50ZXIuUHJpbnRTdHJpbmcobmFtZSk7DQorICBtX1BlcmNlbnRQcmludGVyLlByaW50U3RyaW5nKHMpOw0KKyAgbV9QZXJjZW50UHJpbnRlci5QcmludE5ld0xpbmUoKTsNCit9DQorDQorSFJFU1VMVCBDSGFzaENhbGxiYWNrQ29uc29sZTo6QWZ0ZXJMYXN0RmlsZShjb25zdCBDSGFzaEJ1bmRsZSAmaGIpDQorew0KKyAgUHJpbnRTZXBhcmF0b3JMaW5lKGhiLkhhc2hlcnMpOw0KKw0KKyAgUHJpbnRSZXN1bHRMaW5lKGhiLkZpbGVzU2l6ZSwgaGIuSGFzaGVycywga19IYXNoQ2FsY19JbmRleF9EYXRhU3VtLCB0cnVlKTsNCisgIG1fUGVyY2VudFByaW50ZXIuUHJpbnROZXdMaW5lKCk7DQorICBtX1BlcmNlbnRQcmludGVyLlByaW50TmV3TGluZSgpOw0KKyAgDQorICBpZiAoaGIuTnVtRmlsZXMgIT0gMSB8fCBoYi5OdW1EaXJzICE9IDApDQorICB7DQorICAgIGlmIChoYi5OdW1EaXJzICE9IDApDQorICAgICAgUHJpbnRQcm9wZXJ0eSgiRm9sZGVycyIsIGhiLk51bURpcnMpOw0KKyAgICBQcmludFByb3BlcnR5KCJGaWxlcyIsIGhiLk51bUZpbGVzKTsNCisgIH0NCisgIFByaW50UHJvcGVydHkoIlNpemUiLCBoYi5GaWxlc1NpemUpOw0KKyAgaWYgKGhiLk51bUFsdFN0cmVhbXMgIT0gMCkNCisgIHsNCisgICAgUHJpbnRQcm9wZXJ0eSgiQWx0U3RyZWFtcyIsIGhiLk51bUFsdFN0cmVhbXMpOw0KKyAgICBQcmludFByb3BlcnR5KCJBbHRTdHJlYW1zIHNpemUiLCBoYi5BbHRTdHJlYW1zU2l6ZSk7DQorICB9DQorICBQcmludEhhc2hTdGF0KCptX1BlcmNlbnRQcmludGVyLk91dFN0cmVhbSwgaGIpOw0KKyAgbV9QZXJjZW50UHJpbnRlci5QcmludE5ld0xpbmUoKTsNCisgIHJldHVybiBTX09LOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvSGFzaENvbi5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0hhc2hDb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTc0NjlkCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0hhc2hDb24uaApAQCAtMCwwICsxLDI2IEBACisvLyBIYXNoQ29uLmgNCisNCisjaWZuZGVmIF9fSEFTSF9DT05fSA0KKyNkZWZpbmUgX19IQVNIX0NPTl9IDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9IYXNoQ2FsYy5oIg0KKw0KKyNpbmNsdWRlICJVcGRhdGVDYWxsYmFja0NvbnNvbGUuaCINCisNCitjbGFzcyBDSGFzaENhbGxiYWNrQ29uc29sZTogcHVibGljIElIYXNoQ2FsbGJhY2tVSSwgcHVibGljIENDYWxsYmFja0NvbnNvbGVCYXNlDQorew0KKyAgVVN0cmluZyBtX0ZpbGVOYW1lOw0KKw0KKyAgdm9pZCBQcmludFNlcGFyYXRvckxpbmUoY29uc3QgQ09iamVjdFZlY3RvcjxDSGFzaGVyU3RhdGU+ICZoYXNoZXJzKTsNCisgIHZvaWQgUHJpbnRSZXN1bHRMaW5lKFVJbnQ2NCBmaWxlU2l6ZSwNCisgICAgICBjb25zdCBDT2JqZWN0VmVjdG9yPENIYXNoZXJTdGF0ZT4gJmhhc2hlcnMsIHVuc2lnbmVkIGRpZ2VzdEluZGV4LCBib29sIHNob3dIYXNoKTsNCisgIHZvaWQgUHJpbnRQcm9wZXJ0eShjb25zdCBjaGFyICpuYW1lLCBVSW50NjQgdmFsdWUpOw0KK3B1YmxpYzoNCisgIH5DSGFzaENhbGxiYWNrQ29uc29sZSgpIHsgfQ0KKw0KKyAgSU5URVJGQUNFX0lIYXNoQ2FsbGJhY2tVSSg7KQ0KK307DQorDQordm9pZCBQcmludEhhc2hTdGF0KENTdGRPdXRTdHJlYW0gJnN0ZFN0cmVhbSwgY29uc3QgQ0hhc2hCdW5kbGUgJmhiKTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvTGlzdC5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvTGlzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiZGVhZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9MaXN0LmNwcApAQCAtMCwwICsxLDExOTIgQEAKKy8vIExpc3QuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vSW50VG9TdHJpbmcuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015Q29tLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdGRPdXRTdHJlYW0uaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1VURkNvbnZlcnQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9FcnJvck1zZy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVEaXIuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9Qcm9wVmFyaWFudC5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1Byb3BWYXJpYW50Q29udi5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vT3BlbkFyY2hpdmUuaCINCisjaW5jbHVkZSAiLi4vQ29tbW9uL1Byb3BJRFV0aWxzLmgiDQorDQorI2luY2x1ZGUgIkNvbnNvbGVDbG9zZS5oIg0KKyNpbmNsdWRlICJMaXN0LmgiDQorI2luY2x1ZGUgIk9wZW5DYWxsYmFja0NvbnNvbGUuaCINCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQordXNpbmcgbmFtZXNwYWNlIE5DT007DQorDQorDQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtQcm9wSWRUb05hbWVbXSA9DQorew0KKyAgICAiMCINCisgICwgIjEiDQorICAsICIyIg0KKyAgLCAiUGF0aCINCisgICwgIk5hbWUiDQorICAsICJFeHRlbnNpb24iDQorICAsICJGb2xkZXIiDQorICAsICJTaXplIg0KKyAgLCAiUGFja2VkIFNpemUiDQorICAsICJBdHRyaWJ1dGVzIg0KKyAgLCAiQ3JlYXRlZCINCisgICwgIkFjY2Vzc2VkIg0KKyAgLCAiTW9kaWZpZWQiDQorICAsICJTb2xpZCINCisgICwgIkNvbW1lbnRlZCINCisgICwgIkVuY3J5cHRlZCINCisgICwgIlNwbGl0IEJlZm9yZSINCisgICwgIlNwbGl0IEFmdGVyIg0KKyAgLCAiRGljdGlvbmFyeSBTaXplIg0KKyAgLCAiQ1JDIg0KKyAgLCAiVHlwZSINCisgICwgIkFudGkiDQorICAsICJNZXRob2QiDQorICAsICJIb3N0IE9TIg0KKyAgLCAiRmlsZSBTeXN0ZW0iDQorICAsICJVc2VyIg0KKyAgLCAiR3JvdXAiDQorICAsICJCbG9jayINCisgICwgIkNvbW1lbnQiDQorICAsICJQb3NpdGlvbiINCisgICwgIlBhdGggUHJlZml4Ig0KKyAgLCAiRm9sZGVycyINCisgICwgIkZpbGVzIg0KKyAgLCAiVmVyc2lvbiINCisgICwgIlZvbHVtZSINCisgICwgIk11bHRpdm9sdW1lIg0KKyAgLCAiT2Zmc2V0Ig0KKyAgLCAiTGlua3MiDQorICAsICJCbG9ja3MiDQorICAsICJWb2x1bWVzIg0KKyAgLCAiVGltZSBUeXBlIg0KKyAgLCAiNjQtYml0Ig0KKyAgLCAiQmlnLWVuZGlhbiINCisgICwgIkNQVSINCisgICwgIlBoeXNpY2FsIFNpemUiDQorICAsICJIZWFkZXJzIFNpemUiDQorICAsICJDaGVja3N1bSINCisgICwgIkNoYXJhY3RlcmlzdGljcyINCisgICwgIlZpcnR1YWwgQWRkcmVzcyINCisgICwgIklEIg0KKyAgLCAiU2hvcnQgTmFtZSINCisgICwgIkNyZWF0b3IgQXBwbGljYXRpb24iDQorICAsICJTZWN0b3IgU2l6ZSINCisgICwgIk1vZGUiDQorICAsICJTeW1ib2xpYyBMaW5rIg0KKyAgLCAiRXJyb3IiDQorICAsICJUb3RhbCBTaXplIg0KKyAgLCAiRnJlZSBTcGFjZSINCisgICwgIkNsdXN0ZXIgU2l6ZSINCisgICwgIkxhYmVsIg0KKyAgLCAiTG9jYWwgTmFtZSINCisgICwgIlByb3ZpZGVyIg0KKyAgLCAiTlQgU2VjdXJpdHkiDQorICAsICJBbHRlcm5hdGUgU3RyZWFtIg0KKyAgLCAiQXV4Ig0KKyAgLCAiRGVsZXRlZCINCisgICwgIlRyZWUiDQorICAsICJTSEEtMSINCisgICwgIlNIQS0yNTYiDQorICAsICJFcnJvciBUeXBlIg0KKyAgLCAiRXJyb3JzIg0KKyAgLCAiRXJyb3JzIg0KKyAgLCAiV2FybmluZ3MiDQorICAsICJXYXJuaW5nIg0KKyAgLCAiU3RyZWFtcyINCisgICwgIkFsdGVybmF0ZSBTdHJlYW1zIg0KKyAgLCAiQWx0ZXJuYXRlIFN0cmVhbXMgU2l6ZSINCisgICwgIlZpcnR1YWwgU2l6ZSINCisgICwgIlVucGFjayBTaXplIg0KKyAgLCAiVG90YWwgUGh5c2ljYWwgU2l6ZSINCisgICwgIlZvbHVtZSBJbmRleCINCisgICwgIlN1YlR5cGUiDQorICAsICJTaG9ydCBDb21tZW50Ig0KKyAgLCAiQ29kZSBQYWdlIg0KKyAgLCAiSXMgbm90IGFyY2hpdmUgdHlwZSINCisgICwgIlBoeXNpY2FsIFNpemUgY2FuJ3QgYmUgZGV0ZWN0ZWQiDQorICAsICJaZXJvcyBUYWlsIElzIEFsbG93ZWQiDQorICAsICJUYWlsIFNpemUiDQorICAsICJFbWJlZGRlZCBTdHViIFNpemUiDQorICAsICJMaW5rIg0KKyAgLCAiSGFyZCBMaW5rIg0KKyAgLCAiaU5vZGUiDQorICAsICJTdHJlYW0gSUQiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hhciBrRW1wdHlBdHRyaWJDaGFyID0gJy4nOw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICprTGlzdGluZyA9ICJMaXN0aW5nIGFyY2hpdmU6ICI7DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtTdHJpbmdfRmlsZXMgPSAiZmlsZXMiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprU3RyaW5nX0RpcnMgPSAiZm9sZGVycyI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtTdHJpbmdfQWx0U3RyZWFtcyA9ICJhbHRlcm5hdGUgc3RyZWFtcyI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtTdHJpbmdfU3RyZWFtcyA9ICJzdHJlYW1zIjsNCisNCitzdGF0aWMgdm9pZCBHZXRBdHRyaWJTdHJpbmcoVUludDMyIHdhLCBib29sIGlzRGlyLCBib29sIGFsbEF0dHJpYnMsIGNoYXIgKnMpDQorew0KKyAgaWYgKGlzRGlyKQ0KKyAgICB3YSB8PSBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7DQorICBpZiAoYWxsQXR0cmlicykNCisgIHsNCisgICAgQ29udmVydFdpbkF0dHJpYlRvU3RyaW5nKHMsIHdhKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgc1swXSA9ICgod2EgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpICE9IDApID8gJ0QnOiBrRW1wdHlBdHRyaWJDaGFyOw0KKyAgc1sxXSA9ICgod2EgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkgICE9IDApID8gJ1InOiBrRW1wdHlBdHRyaWJDaGFyOw0KKyAgc1syXSA9ICgod2EgJiBGSUxFX0FUVFJJQlVURV9ISURERU4pICAgICE9IDApID8gJ0gnOiBrRW1wdHlBdHRyaWJDaGFyOw0KKyAgc1szXSA9ICgod2EgJiBGSUxFX0FUVFJJQlVURV9TWVNURU0pICAgICE9IDApID8gJ1MnOiBrRW1wdHlBdHRyaWJDaGFyOw0KKyAgc1s0XSA9ICgod2EgJiBGSUxFX0FUVFJJQlVURV9BUkNISVZFKSAgICE9IDApID8gJ0EnOiBrRW1wdHlBdHRyaWJDaGFyOw0KKyAgc1s1XSA9IDA7DQorfQ0KKw0KK2VudW0gRUFkanVzdG1lbnQNCit7DQorICBrTGVmdCwNCisgIGtDZW50ZXIsDQorICBrUmlnaHQNCit9Ow0KKw0KK3N0cnVjdCBDRmllbGRJbmZvDQorew0KKyAgUFJPUElEIFByb3BJRDsNCisgIGJvb2wgSXNSYXdQcm9wOw0KKyAgVVN0cmluZyBOYW1lVTsNCisgIEFTdHJpbmcgTmFtZUE7DQorICBFQWRqdXN0bWVudCBUaXRsZUFkanVzdG1lbnQ7DQorICBFQWRqdXN0bWVudCBUZXh0QWRqdXN0bWVudDsNCisgIGludCBQcmVmaXhTcGFjZXNXaWR0aDsNCisgIGludCBXaWR0aDsNCit9Ow0KKw0KK3N0cnVjdCBDRmllbGRJbmZvSW5pdA0KK3sNCisgIFBST1BJRCBQcm9wSUQ7DQorICBjb25zdCBjaGFyICpOYW1lOw0KKyAgRUFkanVzdG1lbnQgVGl0bGVBZGp1c3RtZW50Ow0KKyAgRUFkanVzdG1lbnQgVGV4dEFkanVzdG1lbnQ7DQorICBpbnQgUHJlZml4U3BhY2VzV2lkdGg7DQorICBpbnQgV2lkdGg7DQorfTsNCisNCitzdGF0aWMgY29uc3QgQ0ZpZWxkSW5mb0luaXQga1N0YW5kYXJkRmllbGRUYWJsZVtdID0NCit7DQorICB7IGtwaWRNVGltZSwgIiAgIERhdGUgICAgICBUaW1lIiwga0xlZnQsIGtMZWZ0LCAwLCAxOSB9LA0KKyAgeyBrcGlkQXR0cmliLCAiQXR0ciIsIGtSaWdodCwga0NlbnRlciwgMSwgNSB9LA0KKyAgeyBrcGlkU2l6ZSwgIlNpemUiLCBrUmlnaHQsIGtSaWdodCwgMSwgMTIgfSwNCisgIHsga3BpZFBhY2tTaXplLCAiQ29tcHJlc3NlZCIsIGtSaWdodCwga1JpZ2h0LCAxLCAxMiB9LA0KKyAgeyBrcGlkUGF0aCwgIk5hbWUiLCBrTGVmdCwga0xlZnQsIDIsIDI0IH0NCit9Ow0KKw0KK2NvbnN0IGludCBrTnVtU3BhY2VzTWF4ID0gMzI7IC8vIGl0IG11c3QgYmUgbGFyZ2VyIHRoYW4gbWF4IENGaWVsZEluZm9Jbml0LldpZHRoDQorc3RhdGljIGNvbnN0IGNoYXIgKmdfU3BhY2VzID0NCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIDsNCisNCitzdGF0aWMgdm9pZCBQcmludFNwYWNlcyhpbnQgbnVtU3BhY2VzKQ0KK3sNCisgIGlmIChudW1TcGFjZXMgPiAwICYmIG51bVNwYWNlcyA8PSBrTnVtU3BhY2VzTWF4KQ0KKyAgICBnX1N0ZE91dCA8PCBnX1NwYWNlcyArIChrTnVtU3BhY2VzTWF4IC0gbnVtU3BhY2VzKTsNCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnRTcGFjZXNUb1N0cmluZyhjaGFyICpkZXN0LCBpbnQgbnVtU3BhY2VzKQ0KK3sNCisgIGludCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bVNwYWNlczsgaSsrKQ0KKyAgICBkZXN0W2ldID0gJyAnOw0KKyAgZGVzdFtpXSA9IDA7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFByaW50U3RyaW5nKEVBZGp1c3RtZW50IGFkaiwgaW50IHdpZHRoLCBjb25zdCBVU3RyaW5nICZ0ZXh0U3RyaW5nKQ0KK3sNCisgIGNvbnN0IGludCBudW1TcGFjZXMgPSB3aWR0aCAtIHRleHRTdHJpbmcuTGVuKCk7DQorICBpbnQgbnVtTGVmdFNwYWNlcyA9IDA7DQorICBzd2l0Y2ggKGFkaikNCisgIHsNCisgICAgY2FzZSBrTGVmdDogICBudW1MZWZ0U3BhY2VzID0gMDsgYnJlYWs7DQorICAgIGNhc2Uga0NlbnRlcjogbnVtTGVmdFNwYWNlcyA9IG51bVNwYWNlcyAvIDI7IGJyZWFrOw0KKyAgICBjYXNlIGtSaWdodDogIG51bUxlZnRTcGFjZXMgPSBudW1TcGFjZXM7IGJyZWFrOw0KKyAgfQ0KKyAgUHJpbnRTcGFjZXMobnVtTGVmdFNwYWNlcyk7DQorICBnX1N0ZE91dCA8PCB0ZXh0U3RyaW5nOw0KKyAgUHJpbnRTcGFjZXMobnVtU3BhY2VzIC0gbnVtTGVmdFNwYWNlcyk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFByaW50U3RyaW5nKEVBZGp1c3RtZW50IGFkaiwgaW50IHdpZHRoLCBjb25zdCBjaGFyICp0ZXh0U3RyaW5nKQ0KK3sNCisgIGNvbnN0IGludCBudW1TcGFjZXMgPSB3aWR0aCAtIChpbnQpc3RybGVuKHRleHRTdHJpbmcpOw0KKyAgaW50IG51bUxlZnRTcGFjZXMgPSAwOw0KKyAgc3dpdGNoIChhZGopDQorICB7DQorICAgIGNhc2Uga0xlZnQ6ICAgbnVtTGVmdFNwYWNlcyA9IDA7IGJyZWFrOw0KKyAgICBjYXNlIGtDZW50ZXI6IG51bUxlZnRTcGFjZXMgPSBudW1TcGFjZXMgLyAyOyBicmVhazsNCisgICAgY2FzZSBrUmlnaHQ6ICBudW1MZWZ0U3BhY2VzID0gbnVtU3BhY2VzOyBicmVhazsNCisgIH0NCisgIFByaW50U3BhY2VzKG51bUxlZnRTcGFjZXMpOw0KKyAgZ19TdGRPdXQgPDwgdGV4dFN0cmluZzsNCisgIFByaW50U3BhY2VzKG51bVNwYWNlcyAtIG51bUxlZnRTcGFjZXMpOw0KK30NCisNCitzdGF0aWMgdm9pZCBQcmludFN0cmluZ1RvU3RyaW5nKGNoYXIgKmRlc3QsIEVBZGp1c3RtZW50IGFkaiwgaW50IHdpZHRoLCBjb25zdCBjaGFyICp0ZXh0U3RyaW5nKQ0KK3sNCisgIGludCBsZW4gPSAoaW50KXN0cmxlbih0ZXh0U3RyaW5nKTsNCisgIGNvbnN0IGludCBudW1TcGFjZXMgPSB3aWR0aCAtIGxlbjsNCisgIGludCBudW1MZWZ0U3BhY2VzID0gMDsNCisgIHN3aXRjaCAoYWRqKQ0KKyAgew0KKyAgICBjYXNlIGtMZWZ0OiAgIG51bUxlZnRTcGFjZXMgPSAwOyBicmVhazsNCisgICAgY2FzZSBrQ2VudGVyOiBudW1MZWZ0U3BhY2VzID0gbnVtU3BhY2VzIC8gMjsgYnJlYWs7DQorICAgIGNhc2Uga1JpZ2h0OiAgbnVtTGVmdFNwYWNlcyA9IG51bVNwYWNlczsgYnJlYWs7DQorICB9DQorICBQcmludFNwYWNlc1RvU3RyaW5nKGRlc3QsIG51bUxlZnRTcGFjZXMpOw0KKyAgaWYgKG51bUxlZnRTcGFjZXMgPiAwKQ0KKyAgICBkZXN0ICs9IG51bUxlZnRTcGFjZXM7DQorICBtZW1jcHkoZGVzdCwgdGV4dFN0cmluZywgbGVuKTsNCisgIGRlc3QgKz0gbGVuOw0KKyAgUHJpbnRTcGFjZXNUb1N0cmluZyhkZXN0LCBudW1TcGFjZXMgLSBudW1MZWZ0U3BhY2VzKTsNCit9DQorDQorc3RydWN0IENMaXN0VUludDY0RGVmDQorew0KKyAgVUludDY0IFZhbDsNCisgIGJvb2wgRGVmOw0KKw0KKyAgQ0xpc3RVSW50NjREZWYoKTogVmFsKDApLCBEZWYoZmFsc2UpIHt9DQorICB2b2lkIEFkZChVSW50NjQgdikgeyBWYWwgKz0gdjsgRGVmID0gdHJ1ZTsgfQ0KKyAgdm9pZCBBZGQoY29uc3QgQ0xpc3RVSW50NjREZWYgJnYpIHsgaWYgKHYuRGVmKSBBZGQodi5WYWwpOyB9DQorfTsNCisNCitzdHJ1Y3QgQ0xpc3RGaWxlVGltZURlZg0KK3sNCisgIEZJTEVUSU1FIFZhbDsNCisgIGJvb2wgRGVmOw0KKw0KKyAgQ0xpc3RGaWxlVGltZURlZigpOiBEZWYoZmFsc2UpIHsgVmFsLmR3TG93RGF0ZVRpbWUgPSAwOyBWYWwuZHdIaWdoRGF0ZVRpbWUgPSAwOyB9DQorICB2b2lkIFVwZGF0ZShjb25zdCBDTGlzdEZpbGVUaW1lRGVmICZ0KQ0KKyAgew0KKyAgICBpZiAodC5EZWYgJiYgKCFEZWYgfHwgQ29tcGFyZUZpbGVUaW1lKCZWYWwsICZ0LlZhbCkgPCAwKSkNCisgICAgew0KKyAgICAgIFZhbCA9IHQuVmFsOw0KKyAgICAgIERlZiA9IHRydWU7DQorICAgIH0NCisgIH0NCit9Ow0KKw0KK3N0cnVjdCBDTGlzdFN0YXQNCit7DQorICBDTGlzdFVJbnQ2NERlZiBTaXplOw0KKyAgQ0xpc3RVSW50NjREZWYgUGFja1NpemU7DQorICBDTGlzdEZpbGVUaW1lRGVmIE1UaW1lOw0KKyAgVUludDY0IE51bUZpbGVzOw0KKw0KKyAgQ0xpc3RTdGF0KCk6IE51bUZpbGVzKDApIHt9DQorICB2b2lkIFVwZGF0ZShjb25zdCBDTGlzdFN0YXQgJnN0YXQpDQorICB7DQorICAgIFNpemUuQWRkKHN0YXQuU2l6ZSk7DQorICAgIFBhY2tTaXplLkFkZChzdGF0LlBhY2tTaXplKTsNCisgICAgTVRpbWUuVXBkYXRlKHN0YXQuTVRpbWUpOw0KKyAgICBOdW1GaWxlcyArPSBzdGF0Lk51bUZpbGVzOw0KKyAgfQ0KKyAgdm9pZCBTZXRTaXplRGVmSWZOb0ZpbGVzKCkgeyBpZiAoTnVtRmlsZXMgPT0gMCkgU2l6ZS5EZWYgPSB0cnVlOyB9DQorfTsNCisNCitzdHJ1Y3QgQ0xpc3RTdGF0Mg0KK3sNCisgIENMaXN0U3RhdCBNYWluRmlsZXM7DQorICBDTGlzdFN0YXQgQWx0U3RyZWFtczsNCisgIFVJbnQ2NCBOdW1EaXJzOw0KKw0KKyAgQ0xpc3RTdGF0MigpOiBOdW1EaXJzKDApIHt9DQorDQorICB2b2lkIFVwZGF0ZShjb25zdCBDTGlzdFN0YXQyICZzdGF0KQ0KKyAgew0KKyAgICBNYWluRmlsZXMuVXBkYXRlKHN0YXQuTWFpbkZpbGVzKTsNCisgICAgQWx0U3RyZWFtcy5VcGRhdGUoc3RhdC5BbHRTdHJlYW1zKTsNCisgICAgTnVtRGlycyArPSBzdGF0Lk51bURpcnM7DQorICB9DQorICBjb25zdCBVSW50NjQgR2V0TnVtU3RyZWFtcygpIGNvbnN0IHsgcmV0dXJuIE1haW5GaWxlcy5OdW1GaWxlcyArIEFsdFN0cmVhbXMuTnVtRmlsZXM7IH0NCisgIENMaXN0U3RhdCAmR2V0U3RhdChib29sIGFsdFN0cmVhbXNNb2RlKSB7IHJldHVybiBhbHRTdHJlYW1zTW9kZSA/IEFsdFN0cmVhbXMgOiBNYWluRmlsZXM7IH0NCit9Ow0KKw0KK2NsYXNzIENGaWVsZFByaW50ZXINCit7DQorICBDT2JqZWN0VmVjdG9yPENGaWVsZEluZm8+IF9maWVsZHM7DQorDQorICB2b2lkIEFkZFByb3AoQlNUUiBuYW1lLCBQUk9QSUQgcHJvcElELCBib29sIGlzUmF3UHJvcCk7DQorcHVibGljOg0KKyAgY29uc3QgQ0FyYyAqQXJjOw0KKyAgYm9vbCBUZWNoTW9kZTsNCisgIFVTdHJpbmcgRmlsZVBhdGg7DQorICBBU3RyaW5nIFRlbXBBU3RyaW5nOw0KKyAgVVN0cmluZyBUZW1wV1N0cmluZzsNCisgIGJvb2wgSXNGb2xkZXI7DQorDQorICBBU3RyaW5nIExpbmVzU3RyaW5nOw0KKw0KKyAgdm9pZCBDbGVhcigpIHsgX2ZpZWxkcy5DbGVhcigpOyBMaW5lc1N0cmluZy5FbXB0eSgpOyB9DQorICB2b2lkIEluaXQoY29uc3QgQ0ZpZWxkSW5mb0luaXQgKnN0YW5kYXJkRmllbGRUYWJsZSwgaW50IG51bUl0ZW1zKTsNCisNCisgIEhSRVNVTFQgQWRkTWFpblByb3BzKElJbkFyY2hpdmUgKmFyY2hpdmUpOw0KKyAgSFJFU1VMVCBBZGRSYXdQcm9wcyhJQXJjaGl2ZUdldFJhd1Byb3BzICpnZXRSYXdQcm9wcyk7DQorICANCisgIHZvaWQgUHJpbnRUaXRsZSgpOw0KKyAgdm9pZCBQcmludFRpdGxlTGluZXMoKTsNCisgIEhSRVNVTFQgUHJpbnRJdGVtSW5mbyhVSW50MzIgaW5kZXgsIGNvbnN0IENMaXN0U3RhdCAmc3RhdCk7DQorICB2b2lkIFByaW50U3VtKGNvbnN0IENMaXN0U3RhdCAmc3RhdCwgVUludDY0IG51bURpcnMsIGNvbnN0IGNoYXIgKnN0cik7DQorICB2b2lkIFByaW50U3VtKGNvbnN0IENMaXN0U3RhdDIgJnN0YXQpOw0KK307DQorDQordm9pZCBDRmllbGRQcmludGVyOjpJbml0KGNvbnN0IENGaWVsZEluZm9Jbml0ICpzdGFuZGFyZEZpZWxkVGFibGUsIGludCBudW1JdGVtcykNCit7DQorICBDbGVhcigpOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKQ0KKyAgew0KKyAgICBDRmllbGRJbmZvICZmID0gX2ZpZWxkcy5BZGROZXcoKTsNCisgICAgY29uc3QgQ0ZpZWxkSW5mb0luaXQgJmZpaSA9IHN0YW5kYXJkRmllbGRUYWJsZVtpXTsNCisgICAgZi5Qcm9wSUQgPSBmaWkuUHJvcElEOw0KKyAgICBmLklzUmF3UHJvcCA9IGZhbHNlOw0KKyAgICBmLk5hbWVBID0gZmlpLk5hbWU7DQorICAgIGYuVGl0bGVBZGp1c3RtZW50ID0gZmlpLlRpdGxlQWRqdXN0bWVudDsNCisgICAgZi5UZXh0QWRqdXN0bWVudCA9IGZpaS5UZXh0QWRqdXN0bWVudDsNCisgICAgZi5QcmVmaXhTcGFjZXNXaWR0aCA9IGZpaS5QcmVmaXhTcGFjZXNXaWR0aDsNCisgICAgZi5XaWR0aCA9IGZpaS5XaWR0aDsNCisNCisgICAgaW50IGs7DQorICAgIGZvciAoayA9IDA7IGsgPCBmaWkuUHJlZml4U3BhY2VzV2lkdGg7IGsrKykNCisgICAgICBMaW5lc1N0cmluZyArPSAnICc7DQorICAgIGZvciAoayA9IDA7IGsgPCBmaWkuV2lkdGg7IGsrKykNCisgICAgICBMaW5lc1N0cmluZyArPSAnLSc7DQorICB9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIEdldFByb3BOYW1lKFBST1BJRCBwcm9wSUQsIGNvbnN0IHdjaGFyX3QgKm5hbWUsIEFTdHJpbmcgJm5hbWVBLCBVU3RyaW5nICZuYW1lVSkNCit7DQorICBpZiAocHJvcElEIDwgQVJSQVlfU0laRShrUHJvcElkVG9OYW1lKSkNCisgIHsNCisgICAgbmFtZUEgPSBrUHJvcElkVG9OYW1lW3Byb3BJRF07DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChuYW1lKQ0KKyAgICBuYW1lVSA9IG5hbWU7DQorICBlbHNlDQorICB7DQorICAgIGNoYXIgc1sxNl07DQorICAgIENvbnZlcnRVSW50MzJUb1N0cmluZyhwcm9wSUQsIHMpOw0KKyAgICBuYW1lQSA9IHM7DQorICB9DQorfQ0KKw0KK3ZvaWQgQ0ZpZWxkUHJpbnRlcjo6QWRkUHJvcChCU1RSIG5hbWUsIFBST1BJRCBwcm9wSUQsIGJvb2wgaXNSYXdQcm9wKQ0KK3sNCisgIENGaWVsZEluZm8gZjsNCisgIGYuUHJvcElEID0gcHJvcElEOw0KKyAgZi5Jc1Jhd1Byb3AgPSBpc1Jhd1Byb3A7DQorICBHZXRQcm9wTmFtZShwcm9wSUQsIG5hbWUsIGYuTmFtZUEsIGYuTmFtZVUpOw0KKyAgZi5OYW1lVSArPSBMIiA9ICI7DQorICBpZiAoIWYuTmFtZUEuSXNFbXB0eSgpKQ0KKyAgICBmLk5hbWVBICs9ICIgPSAiOw0KKyAgZWxzZQ0KKyAgew0KKyAgICBjb25zdCBVU3RyaW5nICZzID0gZi5OYW1lVTsNCisgICAgQVN0cmluZyBzQTsNCisgICAgdW5zaWduZWQgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IHMuTGVuKCk7IGkrKykNCisgICAgew0KKyAgICAgIHdjaGFyX3QgYyA9IHNbaV07DQorICAgICAgaWYgKGMgPj0gMHg4MCkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIHNBICs9IChjaGFyKWM7DQorICAgIH0NCisgICAgaWYgKGkgPT0gcy5MZW4oKSkNCisgICAgICBmLk5hbWVBID0gc0E7DQorICB9DQorICBfZmllbGRzLkFkZChmKTsNCit9DQorDQorSFJFU1VMVCBDRmllbGRQcmludGVyOjpBZGRNYWluUHJvcHMoSUluQXJjaGl2ZSAqYXJjaGl2ZSkNCit7DQorICBVSW50MzIgbnVtUHJvcHM7DQorICBSSU5PSyhhcmNoaXZlLT5HZXROdW1iZXJPZlByb3BlcnRpZXMoJm51bVByb3BzKSk7DQorICBmb3IgKFVJbnQzMiBpID0gMDsgaSA8IG51bVByb3BzOyBpKyspDQorICB7DQorICAgIENNeUNvbUJTVFIgbmFtZTsNCisgICAgUFJPUElEIHByb3BJRDsNCisgICAgVkFSVFlQRSB2dDsNCisgICAgUklOT0soYXJjaGl2ZS0+R2V0UHJvcGVydHlJbmZvKGksICZuYW1lLCAmcHJvcElELCAmdnQpKTsNCisgICAgQWRkUHJvcChuYW1lLCBwcm9wSUQsIGZhbHNlKTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENGaWVsZFByaW50ZXI6OkFkZFJhd1Byb3BzKElBcmNoaXZlR2V0UmF3UHJvcHMgKmdldFJhd1Byb3BzKQ0KK3sNCisgIFVJbnQzMiBudW1Qcm9wczsNCisgIFJJTk9LKGdldFJhd1Byb3BzLT5HZXROdW1SYXdQcm9wcygmbnVtUHJvcHMpKTsNCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtUHJvcHM7IGkrKykNCisgIHsNCisgICAgQ015Q29tQlNUUiBuYW1lOw0KKyAgICBQUk9QSUQgcHJvcElEOw0KKyAgICBSSU5PSyhnZXRSYXdQcm9wcy0+R2V0UmF3UHJvcEluZm8oaSwgJm5hbWUsICZwcm9wSUQpKTsNCisgICAgQWRkUHJvcChuYW1lLCBwcm9wSUQsIHRydWUpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3ZvaWQgQ0ZpZWxkUHJpbnRlcjo6UHJpbnRUaXRsZSgpDQorew0KKyAgRk9SX1ZFQ1RPUiAoaSwgX2ZpZWxkcykNCisgIHsNCisgICAgY29uc3QgQ0ZpZWxkSW5mbyAmZiA9IF9maWVsZHNbaV07DQorICAgIFByaW50U3BhY2VzKGYuUHJlZml4U3BhY2VzV2lkdGgpOw0KKyAgICBQcmludFN0cmluZyhmLlRpdGxlQWRqdXN0bWVudCwgKChmLlByb3BJRCA9PSBrcGlkUGF0aCkgPyAwOiBmLldpZHRoKSwgZi5OYW1lQSk7DQorICB9DQorfQ0KKw0KK3ZvaWQgQ0ZpZWxkUHJpbnRlcjo6UHJpbnRUaXRsZUxpbmVzKCkNCit7DQorICBnX1N0ZE91dCA8PCBMaW5lc1N0cmluZzsNCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnRUaW1lKGNoYXIgKmRlc3QsIGNvbnN0IEZJTEVUSU1FICpmdCkNCit7DQorICAqZGVzdCA9IDA7DQorICBpZiAoZnQtPmR3TG93RGF0ZVRpbWUgPT0gMCAmJiBmdC0+ZHdIaWdoRGF0ZVRpbWUgPT0gMCkNCisgICAgcmV0dXJuOw0KKyAgRklMRVRJTUUgbG9jVGltZTsNCisgIGlmICghRmlsZVRpbWVUb0xvY2FsRmlsZVRpbWUoZnQsICZsb2NUaW1lKSkNCisgICAgdGhyb3cgMjAxMjEyMTE7DQorICBDb252ZXJ0RmlsZVRpbWVUb1N0cmluZyhsb2NUaW1lLCBkZXN0LCB0cnVlLCB0cnVlKTsNCit9DQorDQorI2lmbmRlZiBfU0ZYDQorDQorc3RhdGljIGlubGluZSBjaGFyIEdldEhleChCeXRlIHZhbHVlKQ0KK3sNCisgIHJldHVybiAoY2hhcikoKHZhbHVlIDwgMTApID8gKCcwJyArIHZhbHVlKSA6ICgnQScgKyAodmFsdWUgLSAxMCkpKTsNCit9DQorDQorc3RhdGljIHZvaWQgSGV4VG9TdHJpbmcoY2hhciAqZGVzdCwgY29uc3QgQnl0ZSAqZGF0YSwgVUludDMyIHNpemUpDQorew0KKyAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBzaXplOyBpKyspDQorICB7DQorICAgIEJ5dGUgYiA9IGRhdGFbaV07DQorICAgIGRlc3RbMF0gPSBHZXRIZXgoKEJ5dGUpKChiID4+IDQpICYgMHhGKSk7DQorICAgIGRlc3RbMV0gPSBHZXRIZXgoKEJ5dGUpKGIgJiAweEYpKTsNCisgICAgZGVzdCArPSAyOw0KKyAgfQ0KKyAgKmRlc3QgPSAwOw0KK30NCisNCisjZW5kaWYNCisNCisjZGVmaW5lIE1ZX0VOREwgJ1xuJw0KKw0KK0hSRVNVTFQgQ0ZpZWxkUHJpbnRlcjo6UHJpbnRJdGVtSW5mbyhVSW50MzIgaW5kZXgsIGNvbnN0IENMaXN0U3RhdCAmc3RhdCkNCit7DQorICBjaGFyIHRlbXBbMTI4XTsNCisgIHNpemVfdCB0ZW1wUG9zID0gMDsNCisNCisgIGJvb2wgdGVjaE1vZGUgPSB0aGlzLT5UZWNoTW9kZTsNCisgIC8qDQorICBpZiAodGVjaE1vZGUpDQorICB7DQorICAgIGdfU3RkT3V0IDw8ICJJbmRleCA9ICI7DQorICAgIGdfU3RkT3V0IDw8IChVSW50NjQpaW5kZXg7DQorICAgIGdfU3RkT3V0IDw8IGVuZGw7DQorICB9DQorICAqLw0KKyAgRk9SX1ZFQ1RPUiAoaSwgX2ZpZWxkcykNCisgIHsNCisgICAgY29uc3QgQ0ZpZWxkSW5mbyAmZiA9IF9maWVsZHNbaV07DQorDQorICAgIGlmICghdGVjaE1vZGUpDQorICAgIHsNCisgICAgICBQcmludFNwYWNlc1RvU3RyaW5nKHRlbXAgKyB0ZW1wUG9zLCBmLlByZWZpeFNwYWNlc1dpZHRoKTsNCisgICAgICB0ZW1wUG9zICs9IGYuUHJlZml4U3BhY2VzV2lkdGg7DQorICAgIH0NCisNCisgICAgaWYgKHRlY2hNb2RlKQ0KKyAgICB7DQorICAgICAgaWYgKCFmLk5hbWVBLklzRW1wdHkoKSkNCisgICAgICAgIGdfU3RkT3V0IDw8IGYuTmFtZUE7DQorICAgICAgZWxzZQ0KKyAgICAgICAgZ19TdGRPdXQgPDwgZi5OYW1lVTsNCisgICAgfQ0KKyAgICANCisgICAgaWYgKGYuUHJvcElEID09IGtwaWRQYXRoKQ0KKyAgICB7DQorICAgICAgaWYgKCF0ZWNoTW9kZSkNCisgICAgICAgIGdfU3RkT3V0IDw8IHRlbXA7DQorICAgICAgZ19TdGRPdXQuUHJpbnRVU3RyaW5nKEZpbGVQYXRoLCBUZW1wQVN0cmluZyk7DQorICAgICAgaWYgKHRlY2hNb2RlKQ0KKyAgICAgICAgZ19TdGRPdXQgPDwgTVlfRU5ETDsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKw0KKyAgICBpbnQgd2lkdGggPSBmLldpZHRoOw0KKyAgICANCisgICAgaWYgKGYuSXNSYXdQcm9wKQ0KKyAgICB7DQorICAgICAgI2lmbmRlZiBfU0ZYDQorICAgICAgDQorICAgICAgY29uc3Qgdm9pZCAqZGF0YTsNCisgICAgICBVSW50MzIgZGF0YVNpemU7DQorICAgICAgVUludDMyIHByb3BUeXBlOw0KKyAgICAgIFJJTk9LKEFyYy0+R2V0UmF3UHJvcHMtPkdldFJhd1Byb3AoaW5kZXgsIGYuUHJvcElELCAmZGF0YSwgJmRhdGFTaXplLCAmcHJvcFR5cGUpKTsNCisgICAgICANCisgICAgICBpZiAoZGF0YVNpemUgIT0gMCkNCisgICAgICB7DQorICAgICAgICBib29sIG5lZWRQcmludCA9IHRydWU7DQorICAgICAgICANCisgICAgICAgIGlmIChmLlByb3BJRCA9PSBrcGlkTnRTZWN1cmUpDQorICAgICAgICB7DQorICAgICAgICAgIGlmIChwcm9wVHlwZSAhPSBOUHJvcERhdGFUeXBlOjprUmF3KQ0KKyAgICAgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgICAgICNpZm5kZWYgX1NGWA0KKyAgICAgICAgICBDb252ZXJ0TnRTZWN1cmVUb1N0cmluZygoY29uc3QgQnl0ZSAqKWRhdGEsIGRhdGFTaXplLCBUZW1wQVN0cmluZyk7DQorICAgICAgICAgIGdfU3RkT3V0IDw8IFRlbXBBU3RyaW5nOw0KKyAgICAgICAgICBuZWVkUHJpbnQgPSBmYWxzZTsNCisgICAgICAgICAgI2VuZGlmDQorICAgICAgICB9DQorICAgICAgICBlbHNlIGlmIChmLlByb3BJRCA9PSBrcGlkTnRSZXBhcnNlKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBVU3RyaW5nIHM7DQorICAgICAgICAgIGlmIChDb252ZXJ0TnRSZXBhcnNlVG9TdHJpbmcoKGNvbnN0IEJ5dGUgKilkYXRhLCBkYXRhU2l6ZSwgcykpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBuZWVkUHJpbnQgPSBmYWxzZTsNCisgICAgICAgICAgICBnX1N0ZE91dCA8PCBzOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgDQorICAgICAgICBpZiAobmVlZFByaW50KQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAocHJvcFR5cGUgIT0gTlByb3BEYXRhVHlwZTo6a1JhdykNCisgICAgICAgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICAgICAgICANCisgICAgICAgICAgY29uc3QgVUludDMyIGtNYXhEYXRhU2l6ZSA9IDY0Ow0KKyAgICAgICAgICANCisgICAgICAgICAgaWYgKGRhdGFTaXplID4ga01heERhdGFTaXplKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgZ19TdGRPdXQgPDwgImRhdGE6IjsNCisgICAgICAgICAgICBnX1N0ZE91dCA8PCBkYXRhU2l6ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBlbHNlDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBjaGFyIGhleFN0cltrTWF4RGF0YVNpemUgKiAyICsgNF07DQorICAgICAgICAgICAgSGV4VG9TdHJpbmcoaGV4U3RyLCAoY29uc3QgQnl0ZSAqKWRhdGEsIGRhdGFTaXplKTsNCisgICAgICAgICAgICBnX1N0ZE91dCA8PCBoZXhTdHI7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgDQorICAgICAgI2VuZGlmDQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgQ1Byb3BWYXJpYW50IHByb3A7DQorICAgICAgc3dpdGNoIChmLlByb3BJRCkNCisgICAgICB7DQorICAgICAgICBjYXNlIGtwaWRTaXplOiBpZiAoc3RhdC5TaXplLkRlZikgcHJvcCA9IHN0YXQuU2l6ZS5WYWw7IGJyZWFrOw0KKyAgICAgICAgY2FzZSBrcGlkUGFja1NpemU6IGlmIChzdGF0LlBhY2tTaXplLkRlZikgcHJvcCA9IHN0YXQuUGFja1NpemUuVmFsOyBicmVhazsNCisgICAgICAgIGNhc2Uga3BpZE1UaW1lOiBpZiAoc3RhdC5NVGltZS5EZWYpIHByb3AgPSBzdGF0Lk1UaW1lLlZhbDsgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBSSU5PSyhBcmMtPkFyY2hpdmUtPkdldFByb3BlcnR5KGluZGV4LCBmLlByb3BJRCwgJnByb3ApKTsNCisgICAgICB9DQorICAgICAgaWYgKGYuUHJvcElEID09IGtwaWRBdHRyaWIgJiYgKHByb3AudnQgPT0gVlRfRU1QVFkgfHwgcHJvcC52dCA9PSBWVF9VSTQpKQ0KKyAgICAgIHsNCisgICAgICAgIEdldEF0dHJpYlN0cmluZygocHJvcC52dCA9PSBWVF9FTVBUWSkgPyAwIDogcHJvcC51bFZhbCwgSXNGb2xkZXIsIHRlY2hNb2RlLCB0ZW1wICsgdGVtcFBvcyk7DQorICAgICAgICBpZiAodGVjaE1vZGUpDQorICAgICAgICAgIGdfU3RkT3V0IDw8IHRlbXAgKyB0ZW1wUG9zOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICB0ZW1wUG9zICs9IHN0cmxlbih0ZW1wICsgdGVtcFBvcyk7DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKHByb3AudnQgPT0gVlRfRU1QVFkpDQorICAgICAgew0KKyAgICAgICAgaWYgKCF0ZWNoTW9kZSkNCisgICAgICAgIHsNCisgICAgICAgICAgUHJpbnRTcGFjZXNUb1N0cmluZyh0ZW1wICsgdGVtcFBvcywgd2lkdGgpOw0KKyAgICAgICAgICB0ZW1wUG9zICs9IHdpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBlbHNlIGlmIChwcm9wLnZ0ID09IFZUX0ZJTEVUSU1FKQ0KKyAgICAgIHsNCisgICAgICAgIFByaW50VGltZSh0ZW1wICsgdGVtcFBvcywgJnByb3AuZmlsZXRpbWUpOw0KKyAgICAgICAgaWYgKHRlY2hNb2RlKQ0KKyAgICAgICAgICBnX1N0ZE91dCA8PCB0ZW1wICsgdGVtcFBvczsNCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbih0ZW1wICsgdGVtcFBvcyk7DQorICAgICAgICAgIHRlbXBQb3MgKz0gbGVuOw0KKyAgICAgICAgICBpZiAobGVuIDwgKHVuc2lnbmVkKWYuV2lkdGgpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBsZW4gPSAoc2l6ZV90KWYuV2lkdGggLSBsZW47DQorICAgICAgICAgICAgUHJpbnRTcGFjZXNUb1N0cmluZyh0ZW1wICsgdGVtcFBvcywgKGludClsZW4pOw0KKyAgICAgICAgICAgIHRlbXBQb3MgKz0gbGVuOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKHByb3AudnQgPT0gVlRfQlNUUikNCisgICAgICB7DQorICAgICAgICBpZiAodGVjaE1vZGUpDQorICAgICAgICB7DQorICAgICAgICAgIGludCBsZW4gPSAoaW50KXdjc2xlbihwcm9wLmJzdHJWYWwpOw0KKyAgICAgICAgICBNeVN0cmluZ0NvcHkoVGVtcFdTdHJpbmcuR2V0QnVmZmVyKGxlbiksIHByb3AuYnN0clZhbCk7DQorICAgICAgICAgIC8vIHJlcGxhY2UgQ1IvTEYgaGVyZS4NCisgICAgICAgICAgVGVtcFdTdHJpbmcuUmVsZWFzZUJ1ZmZlcihsZW4pOw0KKyAgICAgICAgICBnX1N0ZE91dC5QcmludFVTdHJpbmcoVGVtcFdTdHJpbmcsIFRlbXBBU3RyaW5nKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgICAgUHJpbnRTdHJpbmcoZi5UZXh0QWRqdXN0bWVudCwgd2lkdGgsIHByb3AuYnN0clZhbCk7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBjaGFyIHNbNjRdOw0KKyAgICAgICAgQ29udmVydFByb3BlcnR5VG9TaG9ydFN0cmluZyhzLCBwcm9wLCBmLlByb3BJRCk7DQorICAgICAgICBpZiAodGVjaE1vZGUpDQorICAgICAgICAgIGdfU3RkT3V0IDw8IHM7DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgIFByaW50U3RyaW5nVG9TdHJpbmcodGVtcCArIHRlbXBQb3MsIGYuVGV4dEFkanVzdG1lbnQsIHdpZHRoLCBzKTsNCisgICAgICAgICAgdGVtcFBvcyArPSBzdHJsZW4odGVtcCArIHRlbXBQb3MpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAodGVjaE1vZGUpDQorICAgICAgZ19TdGRPdXQgPDwgTVlfRU5ETDsNCisgIH0NCisgIGdfU3RkT3V0IDw8IE1ZX0VOREw7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnROdW1iZXIoRUFkanVzdG1lbnQgYWRqLCBpbnQgd2lkdGgsIGNvbnN0IENMaXN0VUludDY0RGVmICZ2YWx1ZSkNCit7DQorICB3Y2hhcl90IHNbMzJdOw0KKyAgc1swXSA9IDA7DQorICBpZiAodmFsdWUuRGVmKQ0KKyAgICBDb252ZXJ0VUludDY0VG9TdHJpbmcodmFsdWUuVmFsLCBzKTsNCisgIFByaW50U3RyaW5nKGFkaiwgd2lkdGgsIHMpOw0KK30NCisNCitzdGF0aWMgdm9pZCBQcmludE51bWJlckFuZFN0cmluZyhBU3RyaW5nICZzLCBVSW50NjQgdmFsdWUsIGNvbnN0IGNoYXIgKnRleHQpDQorew0KKyAgY2hhciB0WzMyXTsNCisgIENvbnZlcnRVSW50NjRUb1N0cmluZyh2YWx1ZSwgdCk7DQorICBzICs9IHQ7DQorICBzICs9ICcgJzsNCisgIHMgKz0gdGV4dDsNCit9DQorDQordm9pZCBDRmllbGRQcmludGVyOjpQcmludFN1bShjb25zdCBDTGlzdFN0YXQgJnN0YXQsIFVJbnQ2NCBudW1EaXJzLCBjb25zdCBjaGFyICpzdHIpDQorew0KKyAgRk9SX1ZFQ1RPUiAoaSwgX2ZpZWxkcykNCisgIHsNCisgICAgY29uc3QgQ0ZpZWxkSW5mbyAmZiA9IF9maWVsZHNbaV07DQorICAgIFByaW50U3BhY2VzKGYuUHJlZml4U3BhY2VzV2lkdGgpOw0KKyAgICBpZiAoZi5Qcm9wSUQgPT0ga3BpZFNpemUpDQorICAgICAgUHJpbnROdW1iZXIoZi5UZXh0QWRqdXN0bWVudCwgZi5XaWR0aCwgc3RhdC5TaXplKTsNCisgICAgZWxzZSBpZiAoZi5Qcm9wSUQgPT0ga3BpZFBhY2tTaXplKQ0KKyAgICAgIFByaW50TnVtYmVyKGYuVGV4dEFkanVzdG1lbnQsIGYuV2lkdGgsIHN0YXQuUGFja1NpemUpOw0KKyAgICBlbHNlIGlmIChmLlByb3BJRCA9PSBrcGlkTVRpbWUpDQorICAgIHsNCisgICAgICBjaGFyIHNbNjRdOw0KKyAgICAgIHNbMF0gPSAwOw0KKyAgICAgIGlmIChzdGF0Lk1UaW1lLkRlZikNCisgICAgICAgIFByaW50VGltZShzLCAmc3RhdC5NVGltZS5WYWwpOw0KKyAgICAgIFByaW50U3RyaW5nKGYuVGV4dEFkanVzdG1lbnQsIGYuV2lkdGgsIHMpOw0KKyAgICB9DQorICAgIGVsc2UgaWYgKGYuUHJvcElEID09IGtwaWRQYXRoKQ0KKyAgICB7DQorICAgICAgQVN0cmluZyBzOw0KKyAgICAgIFByaW50TnVtYmVyQW5kU3RyaW5nKHMsIHN0YXQuTnVtRmlsZXMsIHN0cik7DQorICAgICAgaWYgKG51bURpcnMgIT0gMCkNCisgICAgICB7DQorICAgICAgICBzICs9ICIsICI7DQorICAgICAgICBQcmludE51bWJlckFuZFN0cmluZyhzLCBudW1EaXJzLCBrU3RyaW5nX0RpcnMpOw0KKyAgICAgIH0NCisgICAgICBQcmludFN0cmluZyhmLlRleHRBZGp1c3RtZW50LCAwLCBzKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgUHJpbnRTdHJpbmcoZi5UZXh0QWRqdXN0bWVudCwgZi5XaWR0aCwgTCIiKTsNCisgIH0NCisgIGdfU3RkT3V0IDw8IGVuZGw7DQorfQ0KKw0KK3ZvaWQgQ0ZpZWxkUHJpbnRlcjo6UHJpbnRTdW0oY29uc3QgQ0xpc3RTdGF0MiAmc3RhdDIpDQorew0KKyAgUHJpbnRTdW0oc3RhdDIuTWFpbkZpbGVzLCBzdGF0Mi5OdW1EaXJzLCBrU3RyaW5nX0ZpbGVzKTsNCisgIGlmIChzdGF0Mi5BbHRTdHJlYW1zLk51bUZpbGVzICE9IDApDQorICB7DQorICAgIFByaW50U3VtKHN0YXQyLkFsdFN0cmVhbXMsIDAsIGtTdHJpbmdfQWx0U3RyZWFtcyk7Ow0KKyAgICBDTGlzdFN0YXQgc3RhdCA9IHN0YXQyLk1haW5GaWxlczsNCisgICAgc3RhdC5VcGRhdGUoc3RhdDIuQWx0U3RyZWFtcyk7DQorICAgIFByaW50U3VtKHN0YXQsIDAsIGtTdHJpbmdfU3RyZWFtcyk7DQorICB9DQorfQ0KKw0KK3N0YXRpYyBIUkVTVUxUIEdldFVJbnQ2NFZhbHVlKElJbkFyY2hpdmUgKmFyY2hpdmUsIFVJbnQzMiBpbmRleCwgUFJPUElEIHByb3BJRCwgQ0xpc3RVSW50NjREZWYgJnZhbHVlKQ0KK3sNCisgIHZhbHVlLlZhbCA9IDA7DQorICB2YWx1ZS5EZWYgPSBmYWxzZTsNCisgIENQcm9wVmFyaWFudCBwcm9wOw0KKyAgUklOT0soYXJjaGl2ZS0+R2V0UHJvcGVydHkoaW5kZXgsIHByb3BJRCwgJnByb3ApKTsNCisgIHZhbHVlLkRlZiA9IENvbnZlcnRQcm9wVmFyaWFudFRvVUludDY0KHByb3AsIHZhbHVlLlZhbCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorc3RhdGljIEhSRVNVTFQgR2V0SXRlbU1UaW1lKElJbkFyY2hpdmUgKmFyY2hpdmUsIFVJbnQzMiBpbmRleCwgQ0xpc3RGaWxlVGltZURlZiAmdCkNCit7DQorICB0LlZhbC5kd0xvd0RhdGVUaW1lID0gMDsNCisgIHQuVmFsLmR3SGlnaERhdGVUaW1lID0gMDsNCisgIHQuRGVmID0gZmFsc2U7DQorICBDUHJvcFZhcmlhbnQgcHJvcDsNCisgIFJJTk9LKGFyY2hpdmUtPkdldFByb3BlcnR5KGluZGV4LCBrcGlkTVRpbWUsICZwcm9wKSk7DQorICBpZiAocHJvcC52dCA9PSBWVF9GSUxFVElNRSkNCisgIHsNCisgICAgdC5WYWwgPSBwcm9wLmZpbGV0aW1lOw0KKyAgICB0LkRlZiA9IHRydWU7DQorICB9DQorICBlbHNlIGlmIChwcm9wLnZ0ICE9IFZUX0VNUFRZKQ0KKyAgICByZXR1cm4gRV9GQUlMOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFByaW50UHJvcE5hbWVBbmROdW1iZXIoY29uc3QgY2hhciAqbmFtZSwgVUludDY0IHZhbCkNCit7DQorICBnX1N0ZE91dCA8PCBuYW1lIDw8ICI6ICIgPDwgdmFsIDw8IGVuZGw7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIFByaW50UHJvcE5hbWVfYW5kX0VxKFBST1BJRCBwcm9wSUQpDQorew0KKyAgY29uc3QgY2hhciAqczsNCisgIGNoYXIgdGVtcFsxNl07DQorICBpZiAocHJvcElEIDwgQVJSQVlfU0laRShrUHJvcElkVG9OYW1lKSkNCisgICAgcyA9IGtQcm9wSWRUb05hbWVbcHJvcElEXTsNCisgIGVsc2UNCisgIHsNCisgICAgQ29udmVydFVJbnQzMlRvU3RyaW5nKHByb3BJRCwgdGVtcCk7DQorICAgIHMgPSB0ZW1wOw0KKyAgfQ0KKyAgZ19TdGRPdXQgPDwgcyA8PCAiID0gIjsNCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnRQcm9wTmFtZUFuZE51bWJlcihQUk9QSUQgcHJvcElELCBVSW50NjQgdmFsKQ0KK3sNCisgIFByaW50UHJvcE5hbWVfYW5kX0VxKHByb3BJRCk7DQorICBnX1N0ZE91dCA8PCB2YWwgPDwgZW5kbDsNCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnRQcm9wTmFtZUFuZE51bWJlcl9TaWduZWQoUFJPUElEIHByb3BJRCwgSW50NjQgdmFsKQ0KK3sNCisgIFByaW50UHJvcE5hbWVfYW5kX0VxKHByb3BJRCk7DQorICBnX1N0ZE91dCA8PCB2YWwgPDwgZW5kbDsNCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnRQcm9wUGFpcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCB3Y2hhcl90ICp2YWwpDQorew0KKyAgZ19TdGRPdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2YWwgPDwgZW5kbDsNCit9DQorDQorDQorc3RhdGljIHZvaWQgUHJpbnRQcm9wZXJ0eVBhaXIyKFBST1BJRCBwcm9wSUQsIGNvbnN0IHdjaGFyX3QgKm5hbWUsIGNvbnN0IENQcm9wVmFyaWFudCAmcHJvcCkNCit7DQorICBVU3RyaW5nIHM7DQorICBDb252ZXJ0UHJvcGVydHlUb1N0cmluZyhzLCBwcm9wLCBwcm9wSUQpOw0KKyAgaWYgKCFzLklzRW1wdHkoKSkNCisgIHsNCisgICAgQVN0cmluZyBuYW1lQTsNCisgICAgVVN0cmluZyBuYW1lVTsNCisgICAgR2V0UHJvcE5hbWUocHJvcElELCBuYW1lLCBuYW1lQSwgbmFtZVUpOw0KKyAgICBpZiAoIW5hbWVBLklzRW1wdHkoKSkNCisgICAgICBQcmludFByb3BQYWlyKG5hbWVBLCBzKTsNCisgICAgZWxzZQ0KKyAgICAgIGdfU3RkT3V0IDw8IG5hbWVVIDw8ICIgPSAiIDw8IHMgPDwgZW5kbDsNCisgIH0NCit9DQorDQorc3RhdGljIEhSRVNVTFQgUHJpbnRBcmNQcm9wKElJbkFyY2hpdmUgKmFyY2hpdmUsIFBST1BJRCBwcm9wSUQsIGNvbnN0IHdjaGFyX3QgKm5hbWUpDQorew0KKyAgQ1Byb3BWYXJpYW50IHByb3A7DQorICBSSU5PSyhhcmNoaXZlLT5HZXRBcmNoaXZlUHJvcGVydHkocHJvcElELCAmcHJvcCkpOw0KKyAgUHJpbnRQcm9wZXJ0eVBhaXIyKHByb3BJRCwgbmFtZSwgcHJvcCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnRBcmNUeXBlRXJyb3IoY29uc3QgVVN0cmluZyAmdHlwZSwgYm9vbCBpc1dhcm5pbmcpDQorew0KKyAgZ19TdGRPdXQgPDwgIk9wZW4gIiA8PCAoaXNXYXJuaW5nID8gIldhcm5pbmciIDogIkVycm9yIikNCisgICAgPDwgIjogQ2FuIG5vdCBvcGVuIHRoZSBmaWxlIGFzIFsiDQorICAgIDw8IHR5cGUNCisgICAgPDwgIl0gYXJjaGl2ZSINCisgICAgPDwgZW5kbDsNCit9DQorDQoraW50IEZpbmRfRmlsZU5hbWVfSW5Tb3J0ZWRWZWN0b3IoY29uc3QgVVN0cmluZ1ZlY3RvciAmZmlsZU5hbWUsIGNvbnN0IFVTdHJpbmcmIG5hbWUpOw0KKw0KK0FTdHJpbmcgR2V0T3BlbkFyY0Vycm9yTWVzc2FnZShVSW50MzIgZXJyb3JGbGFncyk7DQorDQorc3RhdGljIHZvaWQgUHJpbnRFcnJvckZsYWdzKGNvbnN0IGNoYXIgKnMsIFVJbnQzMiBlcnJvckZsYWdzKQ0KK3sNCisgIGdfU3RkT3V0IDw8IHMgPDwgZW5kbCA8PCBHZXRPcGVuQXJjRXJyb3JNZXNzYWdlKGVycm9yRmxhZ3MpIDw8IGVuZGw7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIEVycm9ySW5mb19QcmludChjb25zdCBDQXJjRXJyb3JJbmZvICZlcikNCit7DQorICBpZiAoZXIuQXJlVGhlcmVFcnJvcnMoKSkNCisgICAgUHJpbnRFcnJvckZsYWdzKCJFcnJvcnM6IiwgZXIuR2V0RXJyb3JGbGFncygpKTsNCisgIGlmICghZXIuRXJyb3JNZXNzYWdlLklzRW1wdHkoKSkNCisgICAgUHJpbnRQcm9wUGFpcigiRXJyb3IiLCBlci5FcnJvck1lc3NhZ2UpOw0KKyAgaWYgKGVyLkFyZVRoZXJlV2FybmluZ3MoKSkNCisgICAgUHJpbnRFcnJvckZsYWdzKCJXYXJuaW5nczoiLCBlci5HZXRXYXJuaW5nRmxhZ3MoKSk7DQorICBpZiAoIWVyLldhcm5pbmdNZXNzYWdlLklzRW1wdHkoKSkNCisgICAgUHJpbnRQcm9wUGFpcigiV2FybmluZyIsIGVyLldhcm5pbmdNZXNzYWdlKTsNCit9DQorDQorSFJFU1VMVCBMaXN0QXJjaGl2ZXMoQ0NvZGVjcyAqY29kZWNzLA0KKyAgICBjb25zdCBDT2JqZWN0VmVjdG9yPENPcGVuVHlwZT4gJnR5cGVzLA0KKyAgICBjb25zdCBDSW50VmVjdG9yICZleGNsdWRlZEZvcm1hdHMsDQorICAgIGJvb2wgc3RkSW5Nb2RlLA0KKyAgICBVU3RyaW5nVmVjdG9yICZhcmNQYXRocywgVVN0cmluZ1ZlY3RvciAmYXJjUGF0aHNGdWxsLA0KKyAgICBib29sIHByb2Nlc3NBbHRTdHJlYW1zLCBib29sIHNob3dBbHRTdHJlYW1zLA0KKyAgICBjb25zdCBOV2lsZGNhcmQ6OkNDZW5zb3JOb2RlICZ3aWxkY2FyZENlbnNvciwNCisgICAgYm9vbCBlbmFibGVIZWFkZXJzLCBib29sIHRlY2hNb2RlLA0KKyAgICAjaWZuZGVmIF9OT19DUllQVE8NCisgICAgYm9vbCAmcGFzc3dvcmRFbmFibGVkLCBVU3RyaW5nICZwYXNzd29yZCwNCisgICAgI2VuZGlmDQorICAgICNpZm5kZWYgX1NGWA0KKyAgICBjb25zdCBDT2JqZWN0VmVjdG9yPENQcm9wZXJ0eT4gKnByb3BzLA0KKyAgICAjZW5kaWYNCisgICAgVUludDY0ICZudW1FcnJvcnMsDQorICAgIFVJbnQ2NCAmbnVtV2FybmluZ3MpDQorew0KKyAgYm9vbCBBbGxGaWxlc0FyZUFsbG93ZWQgPSB3aWxkY2FyZENlbnNvci5BcmVBbGxBbGxvd2VkKCk7DQorDQorICBudW1FcnJvcnMgPSAwOw0KKyAgbnVtV2FybmluZ3MgPSAwOw0KKw0KKyAgQ0ZpZWxkUHJpbnRlciBmcDsNCisgIGlmICghdGVjaE1vZGUpDQorICAgIGZwLkluaXQoa1N0YW5kYXJkRmllbGRUYWJsZSwgQVJSQVlfU0laRShrU3RhbmRhcmRGaWVsZFRhYmxlKSk7DQorDQorICBDTGlzdFN0YXQyIHN0YXQyOw0KKyAgDQorICBDQm9vbEFyciBza2lwQXJjcyhhcmNQYXRocy5TaXplKCkpOw0KKyAgdW5zaWduZWQgYXJjSW5kZXg7DQorICBmb3IgKGFyY0luZGV4ID0gMDsgYXJjSW5kZXggPCBhcmNQYXRocy5TaXplKCk7IGFyY0luZGV4KyspDQorICAgIHNraXBBcmNzW2FyY0luZGV4XSA9IGZhbHNlOw0KKyAgVUludDY0IG51bVZvbHVtZXMgPSAwOw0KKyAgVUludDY0IG51bUFyY3MgPSAwOw0KKyAgVUludDY0IHRvdGFsQXJjU2l6ZXMgPSAwOw0KKw0KKyAgZm9yIChhcmNJbmRleCA9IDA7IGFyY0luZGV4IDwgYXJjUGF0aHMuU2l6ZSgpOyBhcmNJbmRleCsrKQ0KKyAgew0KKyAgICBpZiAoc2tpcEFyY3NbYXJjSW5kZXhdKQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICBjb25zdCBVU3RyaW5nICZhcmNoaXZlTmFtZSA9IGFyY1BhdGhzW2FyY0luZGV4XTsNCisgICAgVUludDY0IGFyY1BhY2tTaXplID0gMDsNCisgICAgaWYgKCFzdGRJbk1vZGUpDQorICAgIHsNCisgICAgICBORmlsZTo6TkZpbmQ6OkNGaWxlSW5mbyBmaTsNCisgICAgICBpZiAoIWZpLkZpbmQodXMyZnMoYXJjaGl2ZU5hbWUpKSB8fCBmaS5Jc0RpcigpKQ0KKyAgICAgIHsNCisgICAgICAgIGdfU3RkT3V0IDw8IGVuZGwgPDwgIkVycm9yOiAiIDw8IGFyY2hpdmVOYW1lIDw8ICIgaXMgbm90IGZpbGUiIDw8IGVuZGw7DQorICAgICAgICBudW1FcnJvcnMrKzsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBhcmNQYWNrU2l6ZSA9IGZpLlNpemU7DQorICAgICAgdG90YWxBcmNTaXplcyArPSBhcmNQYWNrU2l6ZTsNCisgICAgfQ0KKw0KKyAgICBDQXJjaGl2ZUxpbmsgYXJjTGluazsNCisNCisgICAgQ09wZW5DYWxsYmFja0NvbnNvbGUgb3BlbkNhbGxiYWNrOw0KKyAgICBvcGVuQ2FsbGJhY2suT3V0U3RyZWFtID0gJmdfU3RkT3V0Ow0KKw0KKyAgICAjaWZuZGVmIF9OT19DUllQVE8NCisNCisgICAgb3BlbkNhbGxiYWNrLlBhc3N3b3JkSXNEZWZpbmVkID0gcGFzc3dvcmRFbmFibGVkOw0KKyAgICBvcGVuQ2FsbGJhY2suUGFzc3dvcmQgPSBwYXNzd29yZDsNCisNCisgICAgI2VuZGlmDQorDQorICAgIC8qDQorICAgIENPYmplY3RWZWN0b3I8Q09wdGlvbmFsT3BlblByb3BlcnRpZXM+IG9wdFByb3BzVmVjdG9yOw0KKyAgICBDT3B0aW9uYWxPcGVuUHJvcGVydGllcyAmb3B0UHJvcHMgPSBvcHRQcm9wc1ZlY3Rvci5BZGROZXcoKTsNCisgICAgb3B0UHJvcHMuUHJvcHMgPSAqcHJvcHM7DQorICAgICovDQorICAgIA0KKyAgICBDT3Blbk9wdGlvbnMgb3B0aW9uczsNCisgICAgI2lmbmRlZiBfU0ZYDQorICAgIG9wdGlvbnMucHJvcHMgPSBwcm9wczsNCisgICAgI2VuZGlmDQorICAgIG9wdGlvbnMuY29kZWNzID0gY29kZWNzOw0KKyAgICBvcHRpb25zLnR5cGVzID0gJnR5cGVzOw0KKyAgICBvcHRpb25zLmV4Y2x1ZGVkRm9ybWF0cyA9ICZleGNsdWRlZEZvcm1hdHM7DQorICAgIG9wdGlvbnMuc3RkSW5Nb2RlID0gc3RkSW5Nb2RlOw0KKyAgICBvcHRpb25zLnN0cmVhbSA9IE5VTEw7DQorICAgIG9wdGlvbnMuZmlsZVBhdGggPSBhcmNoaXZlTmFtZTsNCisgICAgSFJFU1VMVCByZXN1bHQgPSBhcmNMaW5rLk9wZW4yKG9wdGlvbnMsICZvcGVuQ2FsbGJhY2spOw0KKw0KKyAgICBpZiAocmVzdWx0ICE9IFNfT0spDQorICAgIHsNCisgICAgICBpZiAocmVzdWx0ID09IEVfQUJPUlQpDQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgIGdfU3RkT3V0IDw8IGVuZGwgPDwgIkVycm9yOiAiIDw8IGFyY2hpdmVOYW1lIDw8ICI6ICI7DQorICAgICAgaWYgKHJlc3VsdCA9PSBTX0ZBTFNFKQ0KKyAgICAgIHsNCisgICAgICAgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgICAgICAgaWYgKG9wZW5DYWxsYmFjay5PcGVuX1dhc1Bhc3N3b3JkQXNrZWQoKSkNCisgICAgICAgICAgZ19TdGRPdXQgPDwgIkNhbiBub3Qgb3BlbiBlbmNyeXB0ZWQgYXJjaGl2ZS4gV3JvbmcgcGFzc3dvcmQ/IjsNCisgICAgICAgIGVsc2UNCisgICAgICAgICNlbmRpZg0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAoYXJjTGluay5Ob25PcGVuX0Vycm9ySW5mby5FcnJvckZvcm1hdEluZGV4ID49IDApDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBQcmludEFyY1R5cGVFcnJvcihjb2RlY3MtPkZvcm1hdHNbYXJjTGluay5Ob25PcGVuX0Vycm9ySW5mby5FcnJvckZvcm1hdEluZGV4XS5OYW1lLCBmYWxzZSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIGdfU3RkT3V0IDw8ICJDYW4gbm90IG9wZW4gdGhlIGZpbGUgYXMgYXJjaGl2ZSI7DQorICAgICAgICB9DQorICAgICAgICBnX1N0ZE91dCA8PCBlbmRsOw0KKyAgICAgICAgRXJyb3JJbmZvX1ByaW50KGFyY0xpbmsuTm9uT3Blbl9FcnJvckluZm8pOw0KKyAgICAgIH0NCisgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gRV9PVVRPRk1FTU9SWSkNCisgICAgICAgIGdfU3RkT3V0IDw8ICJDYW4ndCBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkiOw0KKyAgICAgIGVsc2UNCisgICAgICAgIGdfU3RkT3V0IDw8IE5FcnJvcjo6TXlGb3JtYXRNZXNzYWdlKHJlc3VsdCk7DQorICAgICAgZ19TdGRPdXQgPDwgZW5kbDsNCisgICAgICBudW1FcnJvcnMrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICB7DQorICAgICAgaWYgKGFyY0xpbmsuTm9uT3Blbl9FcnJvckluZm8uRXJyb3JGb3JtYXRJbmRleCA+PSAwKQ0KKyAgICAgICAgbnVtRXJyb3JzKys7DQorICAgICAgDQorICAgICAgRk9SX1ZFQ1RPUiAociwgYXJjTGluay5BcmNzKQ0KKyAgICAgIHsNCisgICAgICAgIGNvbnN0IENBcmNFcnJvckluZm8gJmFyYyA9IGFyY0xpbmsuQXJjc1tyXS5FcnJvckluZm87DQorICAgICAgICBpZiAoIWFyYy5XYXJuaW5nTWVzc2FnZS5Jc0VtcHR5KCkpDQorICAgICAgICAgIG51bVdhcm5pbmdzKys7DQorICAgICAgICBpZiAoYXJjLkFyZVRoZXJlV2FybmluZ3MoKSkNCisgICAgICAgICAgbnVtV2FybmluZ3MrKzsNCisgICAgICAgIGlmIChhcmMuRXJyb3JGb3JtYXRJbmRleCA+PSAwKQ0KKyAgICAgICAgICBudW1XYXJuaW5ncysrOw0KKyAgICAgICAgaWYgKGFyYy5BcmVUaGVyZUVycm9ycygpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBudW1FcnJvcnMrKzsNCisgICAgICAgICAgLy8gYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIWFyYy5FcnJvck1lc3NhZ2UuSXNFbXB0eSgpKQ0KKyAgICAgICAgICBudW1FcnJvcnMrKzsNCisgICAgICB9DQorICAgIH0NCisNCisgICAgbnVtQXJjcysrOw0KKyAgICBudW1Wb2x1bWVzKys7DQorDQorICAgIGlmICghc3RkSW5Nb2RlKQ0KKyAgICB7DQorICAgICAgbnVtVm9sdW1lcyArPSBhcmNMaW5rLlZvbHVtZVBhdGhzLlNpemUoKTsNCisgICAgICB0b3RhbEFyY1NpemVzICs9IGFyY0xpbmsuVm9sdW1lc1NpemU7DQorICAgICAgRk9SX1ZFQ1RPUiAodiwgYXJjTGluay5Wb2x1bWVQYXRocykNCisgICAgICB7DQorICAgICAgICBpbnQgaW5kZXggPSBGaW5kX0ZpbGVOYW1lX0luU29ydGVkVmVjdG9yKGFyY1BhdGhzRnVsbCwgYXJjTGluay5Wb2x1bWVQYXRoc1t2XSk7DQorICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiAodW5zaWduZWQpaW5kZXggPiBhcmNJbmRleCkNCisgICAgICAgICAgc2tpcEFyY3NbaW5kZXhdID0gdHJ1ZTsNCisgICAgICB9DQorICAgIH0NCisNCisNCisgICAgaWYgKGVuYWJsZUhlYWRlcnMpDQorICAgIHsNCisgICAgICBnX1N0ZE91dCA8PCBlbmRsIDw8IGtMaXN0aW5nIDw8IGFyY2hpdmVOYW1lIDw8IGVuZGwgPDwgZW5kbDsNCisNCisgICAgICBGT1JfVkVDVE9SIChyLCBhcmNMaW5rLkFyY3MpDQorICAgICAgew0KKyAgICAgICAgY29uc3QgQ0FyYyAmYXJjID0gYXJjTGluay5BcmNzW3JdOw0KKyAgICAgICAgY29uc3QgQ0FyY0Vycm9ySW5mbyAmZXIgPSBhcmMuRXJyb3JJbmZvOw0KKyAgICAgICAgDQorICAgICAgICBnX1N0ZE91dCA8PCAiLS1cbiI7DQorICAgICAgICBQcmludFByb3BQYWlyKCJQYXRoIiwgYXJjLlBhdGgpOw0KKyAgICAgICAgaWYgKGVyLkVycm9yRm9ybWF0SW5kZXggPj0gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgaWYgKGVyLkVycm9yRm9ybWF0SW5kZXggPT0gYXJjLkZvcm1hdEluZGV4KQ0KKyAgICAgICAgICAgIGdfU3RkT3V0IDw8ICJXYXJuaW5nOiBUaGUgYXJjaGl2ZSBpcyBvcGVuIHdpdGggb2Zmc2V0IiA8PCBlbmRsOw0KKyAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgUHJpbnRBcmNUeXBlRXJyb3IoY29kZWNzLT5HZXRGb3JtYXROYW1lUHRyKGVyLkVycm9yRm9ybWF0SW5kZXgpLCB0cnVlKTsNCisgICAgICAgIH0NCisgICAgICAgIFByaW50UHJvcFBhaXIoIlR5cGUiLCBjb2RlY3MtPkdldEZvcm1hdE5hbWVQdHIoYXJjLkZvcm1hdEluZGV4KSk7DQorDQorICAgICAgICBFcnJvckluZm9fUHJpbnQoZXIpOw0KKw0KKyAgICAgICAgSW50NjQgb2Zmc2V0ID0gYXJjLkdldEdsb2JhbE9mZnNldCgpOw0KKyAgICAgICAgaWYgKG9mZnNldCAhPSAwKQ0KKyAgICAgICAgICBQcmludFByb3BOYW1lQW5kTnVtYmVyX1NpZ25lZChrcGlkT2Zmc2V0LCBvZmZzZXQpOw0KKyAgICAgICAgSUluQXJjaGl2ZSAqYXJjaGl2ZSA9IGFyYy5BcmNoaXZlOw0KKyAgICAgICAgUklOT0soUHJpbnRBcmNQcm9wKGFyY2hpdmUsIGtwaWRQaHlTaXplLCBOVUxMKSk7DQorICAgICAgICBpZiAoZXIuVGFpbFNpemUgIT0gMCkNCisgICAgICAgICAgUHJpbnRQcm9wTmFtZUFuZE51bWJlcihrcGlkVGFpbFNpemUsIGVyLlRhaWxTaXplKTsNCisgICAgICAgIFVJbnQzMiBudW1Qcm9wczsNCisgICAgICAgIFJJTk9LKGFyY2hpdmUtPkdldE51bWJlck9mQXJjaGl2ZVByb3BlcnRpZXMoJm51bVByb3BzKSk7DQorICAgICAgICB7DQorICAgICAgICAgIGZvciAoVUludDMyIGogPSAwOyBqIDwgbnVtUHJvcHM7IGorKykNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIENNeUNvbUJTVFIgbmFtZTsNCisgICAgICAgICAgICBQUk9QSUQgcHJvcElEOw0KKyAgICAgICAgICAgIFZBUlRZUEUgdnQ7DQorICAgICAgICAgICAgUklOT0soYXJjaGl2ZS0+R2V0QXJjaGl2ZVByb3BlcnR5SW5mbyhqLCAmbmFtZSwgJnByb3BJRCwgJnZ0KSk7DQorICAgICAgICAgICAgUklOT0soUHJpbnRBcmNQcm9wKGFyY2hpdmUsIHByb3BJRCwgbmFtZSkpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAociAhPSBhcmNMaW5rLkFyY3MuU2l6ZSgpIC0gMSkNCisgICAgICAgIHsNCisgICAgICAgICAgVUludDMyIG51bVByb3BzOw0KKyAgICAgICAgICBnX1N0ZE91dCA8PCAiLS0tLVxuIjsNCisgICAgICAgICAgaWYgKGFyY2hpdmUtPkdldE51bWJlck9mUHJvcGVydGllcygmbnVtUHJvcHMpID09IFNfT0spDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBVSW50MzIgbWFpbkluZGV4ID0gYXJjTGluay5BcmNzW3IgKyAxXS5TdWJmaWxlSW5kZXg7DQorICAgICAgICAgICAgZm9yIChVSW50MzIgaiA9IDA7IGogPCBudW1Qcm9wczsgaisrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgIENNeUNvbUJTVFIgbmFtZTsNCisgICAgICAgICAgICAgIFBST1BJRCBwcm9wSUQ7DQorICAgICAgICAgICAgICBWQVJUWVBFIHZ0Ow0KKyAgICAgICAgICAgICAgUklOT0soYXJjaGl2ZS0+R2V0UHJvcGVydHlJbmZvKGosICZuYW1lLCAmcHJvcElELCAmdnQpKTsNCisgICAgICAgICAgICAgIENQcm9wVmFyaWFudCBwcm9wOw0KKyAgICAgICAgICAgICAgUklOT0soYXJjaGl2ZS0+R2V0UHJvcGVydHkobWFpbkluZGV4LCBwcm9wSUQsICZwcm9wKSk7DQorICAgICAgICAgICAgICBQcmludFByb3BlcnR5UGFpcjIocHJvcElELCBuYW1lLCBwcm9wKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZ19TdGRPdXQgPDwgZW5kbDsNCisgICAgICBpZiAodGVjaE1vZGUpDQorICAgICAgICBnX1N0ZE91dCA8PCAiLS0tLS0tLS0tLVxuIjsNCisgICAgfQ0KKw0KKyAgICBpZiAoZW5hYmxlSGVhZGVycyAmJiAhdGVjaE1vZGUpDQorICAgIHsNCisgICAgICBmcC5QcmludFRpdGxlKCk7DQorICAgICAgZ19TdGRPdXQgPDwgZW5kbDsNCisgICAgICBmcC5QcmludFRpdGxlTGluZXMoKTsNCisgICAgICBnX1N0ZE91dCA8PCBlbmRsOw0KKyAgICB9DQorDQorICAgIGNvbnN0IENBcmMgJmFyYyA9IGFyY0xpbmsuQXJjcy5CYWNrKCk7DQorICAgIGZwLkFyYyA9ICZhcmM7DQorICAgIGZwLlRlY2hNb2RlID0gdGVjaE1vZGU7DQorICAgIElJbkFyY2hpdmUgKmFyY2hpdmUgPSBhcmMuQXJjaGl2ZTsNCisgICAgaWYgKHRlY2hNb2RlKQ0KKyAgICB7DQorICAgICAgZnAuQ2xlYXIoKTsNCisgICAgICBSSU5PSyhmcC5BZGRNYWluUHJvcHMoYXJjaGl2ZSkpOw0KKyAgICAgIGlmIChhcmMuR2V0UmF3UHJvcHMpDQorICAgICAgew0KKyAgICAgICAgUklOT0soZnAuQWRkUmF3UHJvcHMoYXJjLkdldFJhd1Byb3BzKSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBDTGlzdFN0YXQyIHN0YXQ7DQorICAgIA0KKyAgICBVSW50MzIgbnVtSXRlbXM7DQorICAgIFJJTk9LKGFyY2hpdmUtPkdldE51bWJlck9mSXRlbXMoJm51bUl0ZW1zKSk7DQorICAgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykNCisgICAgew0KKyAgICAgIGlmIChOQ29uc29sZUNsb3NlOjpUZXN0QnJlYWtTaWduYWwoKSkNCisgICAgICAgIHJldHVybiBFX0FCT1JUOw0KKw0KKyAgICAgIEhSRVNVTFQgcmVzID0gYXJjLkdldEl0ZW1QYXRoMihpLCBmcC5GaWxlUGF0aCk7DQorDQorICAgICAgaWYgKHN0ZEluTW9kZSAmJiByZXMgPT0gRV9JTlZBTElEQVJHKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgUklOT0socmVzKTsNCisNCisgICAgICBpZiAoYXJjLkFza19BdXgpDQorICAgICAgew0KKyAgICAgICAgYm9vbCBpc0F1eDsNCisgICAgICAgIFJJTk9LKEFyY2hpdmVfSXNJdGVtX0F1eChhcmNoaXZlLCBpLCBpc0F1eCkpOw0KKyAgICAgICAgaWYgKGlzQXV4KQ0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorDQorICAgICAgYm9vbCBpc0FsdFN0cmVhbSA9IGZhbHNlOw0KKyAgICAgIGlmIChhcmMuQXNrX0FsdFN0cmVhbSkNCisgICAgICB7DQorICAgICAgICBSSU5PSyhBcmNoaXZlX0lzSXRlbV9BbHRTdHJlYW0oYXJjaGl2ZSwgaSwgaXNBbHRTdHJlYW0pKTsNCisgICAgICAgIGlmIChpc0FsdFN0cmVhbSAmJiAhcHJvY2Vzc0FsdFN0cmVhbXMpDQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisNCisgICAgICBSSU5PSyhBcmNoaXZlX0lzSXRlbV9Gb2xkZXIoYXJjaGl2ZSwgaSwgZnAuSXNGb2xkZXIpKTsNCisNCisgICAgICBpZiAoIUFsbEZpbGVzQXJlQWxsb3dlZCkNCisgICAgICB7DQorICAgICAgICBpZiAoIXdpbGRjYXJkQ2Vuc29yLkNoZWNrUGF0aChpc0FsdFN0cmVhbSwgZnAuRmlsZVBhdGgsICFmcC5Jc0ZvbGRlcikpDQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICANCisgICAgICBDTGlzdFN0YXQgc3Q7DQorICAgICAgDQorICAgICAgUklOT0soR2V0VUludDY0VmFsdWUoYXJjaGl2ZSwgaSwga3BpZFNpemUsIHN0LlNpemUpKTsNCisgICAgICBSSU5PSyhHZXRVSW50NjRWYWx1ZShhcmNoaXZlLCBpLCBrcGlkUGFja1NpemUsIHN0LlBhY2tTaXplKSk7DQorICAgICAgUklOT0soR2V0SXRlbU1UaW1lKGFyY2hpdmUsIGksIHN0Lk1UaW1lKSk7DQorDQorICAgICAgaWYgKGZwLklzRm9sZGVyKQ0KKyAgICAgICAgc3RhdC5OdW1EaXJzKys7DQorICAgICAgZWxzZQ0KKyAgICAgICAgc3QuTnVtRmlsZXMgPSAxOw0KKyAgICAgIHN0YXQuR2V0U3RhdChpc0FsdFN0cmVhbSkuVXBkYXRlKHN0KTsNCisNCisgICAgICBpZiAoaXNBbHRTdHJlYW0gJiYgIXNob3dBbHRTdHJlYW1zKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgUklOT0soZnAuUHJpbnRJdGVtSW5mbyhpLCBzdCkpOw0KKyAgICB9DQorDQorICAgIFVJbnQ2NCBudW1TdHJlYW1zID0gc3RhdC5HZXROdW1TdHJlYW1zKCk7DQorICAgIGlmICghc3RkSW5Nb2RlDQorICAgICAgICAmJiAhc3RhdC5NYWluRmlsZXMuUGFja1NpemUuRGVmDQorICAgICAgICAmJiAhc3RhdC5BbHRTdHJlYW1zLlBhY2tTaXplLkRlZikNCisgICAgew0KKyAgICAgIGlmIChhcmNMaW5rLlZvbHVtZVBhdGhzLlNpemUoKSAhPSAwKQ0KKyAgICAgICAgYXJjUGFja1NpemUgKz0gYXJjTGluay5Wb2x1bWVzU2l6ZTsNCisgICAgICBzdGF0Lk1haW5GaWxlcy5QYWNrU2l6ZS5BZGQoKG51bVN0cmVhbXMgPT0gMCkgPyAwIDogYXJjUGFja1NpemUpOw0KKyAgICB9DQorICAgIHN0YXQuTWFpbkZpbGVzLlNldFNpemVEZWZJZk5vRmlsZXMoKTsNCisgICAgc3RhdC5BbHRTdHJlYW1zLlNldFNpemVEZWZJZk5vRmlsZXMoKTsNCisgICAgaWYgKGVuYWJsZUhlYWRlcnMgJiYgIXRlY2hNb2RlKQ0KKyAgICB7DQorICAgICAgZnAuUHJpbnRUaXRsZUxpbmVzKCk7DQorICAgICAgZ19TdGRPdXQgPDwgZW5kbDsNCisgICAgICBmcC5QcmludFN1bShzdGF0KTsNCisgICAgfQ0KKw0KKyAgICBpZiAoZW5hYmxlSGVhZGVycykNCisgICAgew0KKyAgICAgIGlmIChhcmNMaW5rLk5vbk9wZW5fRXJyb3JJbmZvLkVycm9yRm9ybWF0SW5kZXggPj0gMCkNCisgICAgICB7DQorICAgICAgICBnX1N0ZE91dCA8PCAiLS0tLS0tLS0tLVxuIjsNCisgICAgICAgIFByaW50UHJvcFBhaXIoIlBhdGgiLCBhcmNMaW5rLk5vbk9wZW5fQXJjUGF0aCk7DQorICAgICAgICBQcmludEFyY1R5cGVFcnJvcihjb2RlY3MtPkZvcm1hdHNbYXJjTGluay5Ob25PcGVuX0Vycm9ySW5mby5FcnJvckZvcm1hdEluZGV4XS5OYW1lLCBmYWxzZSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHN0YXQyLlVwZGF0ZShzdGF0KTsNCisgICAgZmZsdXNoKHN0ZG91dCk7DQorICB9DQorICBpZiAoZW5hYmxlSGVhZGVycyAmJiAhdGVjaE1vZGUgJiYgKGFyY1BhdGhzLlNpemUoKSA+IDEgfHwgbnVtVm9sdW1lcyA+IDEpKQ0KKyAgew0KKyAgICBnX1N0ZE91dCA8PCBlbmRsOw0KKyAgICBmcC5QcmludFRpdGxlTGluZXMoKTsNCisgICAgZ19TdGRPdXQgPDwgZW5kbDsNCisgICAgZnAuUHJpbnRTdW0oc3RhdDIpOw0KKyAgICBnX1N0ZE91dCA8PCBlbmRsOw0KKyAgICBQcmludFByb3BOYW1lQW5kTnVtYmVyKCJBcmNoaXZlcyIsIG51bUFyY3MpOw0KKyAgICBQcmludFByb3BOYW1lQW5kTnVtYmVyKCJWb2x1bWVzIiwgbnVtVm9sdW1lcyk7DQorICAgIFByaW50UHJvcE5hbWVBbmROdW1iZXIoIlRvdGFsIGFyY2hpdmVzIHNpemUiLCB0b3RhbEFyY1NpemVzKTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvTGlzdC5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWJiYzJhCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL0xpc3QuaApAQCAtMCwwICsxLDI3IEBACisvLyBMaXN0LmgNCisNCisjaWZuZGVmIF9fTElTVF9IDQorI2RlZmluZSBfX0xJU1RfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vV2lsZGNhcmQuaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0xvYWRDb2RlY3MuaCINCisNCitIUkVTVUxUIExpc3RBcmNoaXZlcyhDQ29kZWNzICpjb2RlY3MsDQorICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q09wZW5UeXBlPiAmdHlwZXMsDQorICAgIGNvbnN0IENJbnRWZWN0b3IgJmV4Y2x1ZGVkRm9ybWF0cywNCisgICAgYm9vbCBzdGRJbk1vZGUsDQorICAgIFVTdHJpbmdWZWN0b3IgJmFyY2hpdmVQYXRocywgVVN0cmluZ1ZlY3RvciAmYXJjaGl2ZVBhdGhzRnVsbCwNCisgICAgYm9vbCBwcm9jZXNzQWx0U3RyZWFtcywgYm9vbCBzaG93QWx0U3RyZWFtcywNCisgICAgY29uc3QgTldpbGRjYXJkOjpDQ2Vuc29yTm9kZSAmd2lsZGNhcmRDZW5zb3IsDQorICAgIGJvb2wgZW5hYmxlSGVhZGVycywgYm9vbCB0ZWNoTW9kZSwNCisgICAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICAgIGJvb2wgJnBhc3N3b3JkRW5hYmxlZCwgVVN0cmluZyAmcGFzc3dvcmQsDQorICAgICNlbmRpZg0KKyAgICAjaWZuZGVmIF9TRlgNCisgICAgY29uc3QgQ09iamVjdFZlY3RvcjxDUHJvcGVydHk+ICpwcm9wcywNCisgICAgI2VuZGlmDQorICAgIFVJbnQ2NCAmZXJyb3JzLA0KKyAgICBVSW50NjQgJm51bVdhcm5pbmdzKTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvTWFpbi5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvTWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5MmYzNgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9NYWluLmNwcApAQCAtMCwwICsxLDg4NyBAQAorLy8gTWFpbi5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgPFBzYXBpLmg+DQorDQorI2lmIGRlZmluZWQoIF9XSU4zMikgJiYgZGVmaW5lZCggXzdaSVBfTEFSR0VfUEFHRVMpDQorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL0MvQWxsb2MuaCINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015SW5pdEd1aWQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0NvbW1hbmRMaW5lUGFyc2VyLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9JbnRUb1N0cmluZy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vTXlFeGNlcHRpb24uaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ1RvSW50LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRXJyb3JNc2cuaCINCisjaWZkZWYgX1dJTjMyDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvTWVtb3J5TG9jay5oIg0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgXzdaSVBfU1QNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9TeW5jaHJvbml6YXRpb24uaCINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9UaW1lVXRpbHMuaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0FyY2hpdmVDb21tYW5kTGluZS5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vRXhpdENvZGUuaCINCisjaW5jbHVkZSAiLi4vQ29tbW9uL0V4dHJhY3QuaCINCisjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9Mb2FkQ29kZWNzLmgiDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIkJlbmNoQ29uLmgiDQorI2luY2x1ZGUgIkNvbnNvbGVDbG9zZS5oIg0KKyNpbmNsdWRlICJFeHRyYWN0Q2FsbGJhY2tDb25zb2xlLmgiDQorI2luY2x1ZGUgIkxpc3QuaCINCisjaW5jbHVkZSAiT3BlbkNhbGxiYWNrQ29uc29sZS5oIg0KKyNpbmNsdWRlICJVcGRhdGVDYWxsYmFja0NvbnNvbGUuaCINCisNCisjaW5jbHVkZSAiSGFzaENvbi5oIg0KKw0KKyNpZmRlZiBQUk9HX1ZBUklBTlRfUg0KKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9DLzd6VmVyc2lvbi5oIg0KKyNlbHNlDQorI2luY2x1ZGUgIi4uLy4uL015VmVyc2lvbi5oIg0KKyNlbmRpZg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCit1c2luZyBuYW1lc3BhY2UgTkZpbGU7DQordXNpbmcgbmFtZXNwYWNlIE5Db21tYW5kTGluZVBhcnNlcjsNCisNCisjaWZkZWYgX1dJTjMyDQorSElOU1RBTkNFIGdfaEluc3RhbmNlID0gMDsNCisjZW5kaWYNCitleHRlcm4gQ1N0ZE91dFN0cmVhbSAqZ19TdGRTdHJlYW07DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtDb3B5cmlnaHRTdHJpbmcgPSAiXG43LVppcCINCisjaWZuZGVmIEVYVEVSTkFMX0NPREVDUw0KKyNpZmRlZiBQUk9HX1ZBUklBTlRfUg0KKyIgKHIpIg0KKyNlbHNlDQorIiAoYSkiDQorI2VuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIF9XSU42NA0KKyIgWzY0XSINCisjZW5kaWYNCisNCisiICIgTVlfVkVSU0lPTl9DT1BZUklHSFRfREFURSAiXG4iOw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICprSGVscFN0cmluZyA9DQorICAgICJcblVzYWdlOiA3eiINCisjaWZuZGVmIEVYVEVSTkFMX0NPREVDUw0KKyNpZmRlZiBQUk9HX1ZBUklBTlRfUg0KKyAgICAiciINCisjZWxzZQ0KKyAgICAiYSINCisjZW5kaWYNCisjZW5kaWYNCisgICAgIiA8Y29tbWFuZD4gWzxzd2l0Y2hlcz4uLi5dIDxhcmNoaXZlX25hbWU+IFs8ZmlsZV9uYW1lcz4uLi5dXG4iDQorICAgICIgICAgICAgWzxAbGlzdGZpbGVzLi4uPl1cbiINCisgICAgIlxuIg0KKyAgICAiPENvbW1hbmRzPlxuIg0KKyAgICAiICBhIDogQWRkIGZpbGVzIHRvIGFyY2hpdmVcbiINCisgICAgIiAgYiA6IEJlbmNobWFya1xuIg0KKyAgICAiICBkIDogRGVsZXRlIGZpbGVzIGZyb20gYXJjaGl2ZVxuIg0KKyAgICAiICBlIDogRXh0cmFjdCBmaWxlcyBmcm9tIGFyY2hpdmUgKHdpdGhvdXQgdXNpbmcgZGlyZWN0b3J5IG5hbWVzKVxuIg0KKyAgICAiICBoIDogQ2FsY3VsYXRlIGhhc2ggdmFsdWVzIGZvciBmaWxlc1xuIg0KKyAgICAiICBsIDogTGlzdCBjb250ZW50cyBvZiBhcmNoaXZlXG4iDQorLy8gICAgIiAgbFthfHRdW2ZdIDogTGlzdCBjb250ZW50cyBvZiBhcmNoaXZlXG4iDQorLy8gICAgIiAgICBhIC0gd2l0aCBBZGRpdGlvbmFsIGZpZWxkc1xuIg0KKy8vICAgICIgICAgdCAtIHdpdGggYWxsIGZpZWxkc1xuIg0KKy8vICAgICIgICAgZiAtIHdpdGggRnVsbCBwYXRobmFtZXNcbiINCisgICAgIiAgcm4gOiBSZW5hbWUgZmlsZXMgaW4gYXJjaGl2ZVxuIg0KKyAgICAiICB0IDogVGVzdCBpbnRlZ3JpdHkgb2YgYXJjaGl2ZVxuIg0KKyAgICAiICB1IDogVXBkYXRlIGZpbGVzIHRvIGFyY2hpdmVcbiINCisgICAgIiAgeCA6IGVYdHJhY3QgZmlsZXMgd2l0aCBmdWxsIHBhdGhzXG4iDQorICAgICI8U3dpdGNoZXM+XG4iDQorICAgICIgIC0tIDogU3RvcCBzd2l0Y2hlcyBwYXJzaW5nXG4iDQorICAgICIgIC1haVtyWy18MF1de0BsaXN0ZmlsZXwhd2lsZGNhcmR9IDogSW5jbHVkZSBhcmNoaXZlc1xuIg0KKyAgICAiICAtYXhbclstfDBdXXtAbGlzdGZpbGV8IXdpbGRjYXJkfSA6IGVYY2x1ZGUgYXJjaGl2ZXNcbiINCisgICAgIiAgLWJkIDogRGlzYWJsZSBwZXJjZW50YWdlIGluZGljYXRvclxuIg0KKyAgICAiICAtaVtyWy18MF1de0BsaXN0ZmlsZXwhd2lsZGNhcmR9IDogSW5jbHVkZSBmaWxlbmFtZXNcbiINCisgICAgIiAgLW17UGFyYW1ldGVyc30gOiBzZXQgY29tcHJlc3Npb24gTWV0aG9kXG4iDQorICAgICIgIC1ve0RpcmVjdG9yeX0gOiBzZXQgT3V0cHV0IGRpcmVjdG9yeVxuIg0KKyAgICAjaWZuZGVmIF9OT19DUllQVE8NCisgICAgIiAgLXB7UGFzc3dvcmR9IDogc2V0IFBhc3N3b3JkXG4iDQorICAgICNlbmRpZg0KKyAgICAiICAtclstfDBdIDogUmVjdXJzZSBzdWJkaXJlY3Rvcmllc1xuIg0KKyAgICAiICAtc2Nze1VURi04fFVURi0xNkxFfFVURi0xNkJFfFdJTnxET1N8e2lkfX0gOiBzZXQgY2hhcnNldCBmb3IgbGlzdCBmaWxlc1xuIg0KKyAgICAiICAtc2Z4W3tuYW1lfV0gOiBDcmVhdGUgU0ZYIGFyY2hpdmVcbiINCisgICAgIiAgLXNpW3tuYW1lfV0gOiByZWFkIGRhdGEgZnJvbSBzdGRpblxuIg0KKyAgICAiICAtc2x0IDogc2hvdyB0ZWNobmljYWwgaW5mb3JtYXRpb24gZm9yIGwgKExpc3QpIGNvbW1hbmRcbiINCisgICAgIiAgLXNvIDogd3JpdGUgZGF0YSB0byBzdGRvdXRcbiINCisgICAgIiAgLXNzY1stXSA6IHNldCBzZW5zaXRpdmUgY2FzZSBtb2RlXG4iDQorICAgICIgIC1zc3cgOiBjb21wcmVzcyBzaGFyZWQgZmlsZXNcbiINCisgICAgIiAgLXR7VHlwZX0gOiBTZXQgdHlwZSBvZiBhcmNoaXZlXG4iDQorICAgICIgIC11Wy1dW3AjXVtxI11bciNdW3gjXVt5I11beiNdWyFuZXdBcmNoaXZlTmFtZV0gOiBVcGRhdGUgb3B0aW9uc1xuIg0KKyAgICAiICAtdntTaXplfVtifGt8bXxnXSA6IENyZWF0ZSB2b2x1bWVzXG4iDQorICAgICIgIC13W3twYXRofV0gOiBhc3NpZ24gV29yayBkaXJlY3RvcnkuIEVtcHR5IHBhdGggbWVhbnMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5XG4iDQorICAgICIgIC14W3JbLXwwXV1de0BsaXN0ZmlsZXwhd2lsZGNhcmR9IDogZVhjbHVkZSBmaWxlbmFtZXNcbiINCisgICAgIiAgLXkgOiBhc3N1bWUgWWVzIG9uIGFsbCBxdWVyaWVzXG4iOw0KKw0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIGV4Y2VwdGlvbiBtZXNzYWdlcw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICprRXZlcnl0aGluZ0lzT2sgPSAiRXZlcnl0aGluZyBpcyBPayI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtVc2VyRXJyb3JNZXNzYWdlID0gIkluY29ycmVjdCBjb21tYW5kIGxpbmUiOw0KK3N0YXRpYyBjb25zdCBjaGFyICprTm9Gb3JtYXRzID0gIjctWmlwIGNhbm5vdCBmaW5kIHRoZSBjb2RlIHRoYXQgd29ya3Mgd2l0aCBhcmNoaXZlcy4iOw0KK3N0YXRpYyBjb25zdCBjaGFyICprVW5zdXBwb3J0ZWRBcmNUeXBlTWVzc2FnZSA9ICJVbnN1cHBvcnRlZCBhcmNoaXZlIHR5cGUiOw0KKy8vIHN0YXRpYyBjb25zdCBjaGFyICprVW5zdXBwb3J0ZWRVcGRhdGVBcmNUeXBlID0gIkNhbid0IGNyZWF0ZSBhcmNoaXZlIGZvciB0aGF0IHR5cGUiOw0KKw0KK3N0YXRpYyBDRlNUUiBrRGVmYXVsdFNmeE1vZHVsZSA9IEZURVhUKCI3ekNvbi5zZngiKTsNCisNCitzdGF0aWMgdm9pZCBTaG93TWVzc2FnZUFuZFRocm93RXhjZXB0aW9uKENTdGRPdXRTdHJlYW0gJnMsIExQQ1NUUiBtZXNzYWdlLCBORXhpdENvZGU6OkVFbnVtIGNvZGUpDQorew0KKyAgcyA8PCBlbmRsIDw8ICJFcnJvcjogIiA8PCBtZXNzYWdlIDw8IGVuZGw7DQorICB0aHJvdyBjb2RlOw0KK30NCisNCisjaWZuZGVmIF9XSU4zMg0KK3N0YXRpYyB2b2lkIEdldEFyZ3VtZW50cyhpbnQgbnVtQXJncywgY29uc3QgY2hhciAqYXJnc1tdLCBVU3RyaW5nVmVjdG9yICZwYXJ0cykNCit7DQorICBwYXJ0cy5DbGVhcigpOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspDQorICB7DQorICAgIFVTdHJpbmcgcyA9IE11bHRpQnl0ZVRvVW5pY29kZVN0cmluZyhhcmdzW2ldKTsNCisgICAgcGFydHMuQWRkKHMpOw0KKyAgfQ0KK30NCisjZW5kaWYNCisNCitzdGF0aWMgdm9pZCBTaG93Q29weXJpZ2h0QW5kSGVscChDU3RkT3V0U3RyZWFtICZzLCBib29sIG5lZWRIZWxwKQ0KK3sNCisgIHMgPDwga0NvcHlyaWdodFN0cmluZzsNCisgIC8vIHMgPDwgIiMgQ1BVczogIiA8PCAoVUludDY0KU5XaW5kb3dzOjpOU3lzdGVtOjpHZXROdW1iZXJPZlByb2Nlc3NvcnMoKSA8PCAiXG4iOw0KKyAgaWYgKG5lZWRIZWxwKQ0KKyAgICBzIDw8IGtIZWxwU3RyaW5nOw0KK30NCisNCisjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorDQorc3RhdGljIHZvaWQgUHJpbnRTdHJpbmcoQ1N0ZE91dFN0cmVhbSAmc3RkU3RyZWFtLCBjb25zdCBBU3RyaW5nICZzLCBpbnQgc2l6ZSkNCit7DQorICBpbnQgbGVuID0gcy5MZW4oKTsNCisgIGZvciAoaW50IGkgPSBsZW47IGkgPCBzaXplOyBpKyspDQorICAgIHN0ZFN0cmVhbSA8PCAnICc7DQorICBzdGRTdHJlYW0gPDwgczsNCit9DQorDQorc3RhdGljIHZvaWQgUHJpbnRVSW50MzIoQ1N0ZE91dFN0cmVhbSAmc3RkU3RyZWFtLCBVSW50MzIgdmFsLCBpbnQgc2l6ZSkNCit7DQorICBjaGFyIHNbMTZdOw0KKyAgQ29udmVydFVJbnQzMlRvU3RyaW5nKHZhbCwgcyk7DQorICBQcmludFN0cmluZyhzdGRTdHJlYW0sIHMsIHNpemUpOw0KK30NCisNCitzdGF0aWMgdm9pZCBQcmludExpYkluZGV4KENTdGRPdXRTdHJlYW0gJnN0ZFN0cmVhbSwgaW50IGxpYkluZGV4KQ0KK3sNCisgIGlmIChsaWJJbmRleCA+PSAwKQ0KKyAgICBQcmludFVJbnQzMihzdGRTdHJlYW0sIGxpYkluZGV4LCAyKTsNCisgIGVsc2UNCisgICAgc3RkU3RyZWFtIDw8ICIgICI7DQorICBzdGRTdHJlYW0gPDwgJyAnOw0KK30NCisNCisjZW5kaWYNCisNCitzdGF0aWMgdm9pZCBQcmludFN0cmluZyhDU3RkT3V0U3RyZWFtICZzdGRTdHJlYW0sIGNvbnN0IFVTdHJpbmcgJnMsIGludCBzaXplKQ0KK3sNCisgIGludCBsZW4gPSBzLkxlbigpOw0KKyAgc3RkU3RyZWFtIDw8IHM7DQorICBmb3IgKGludCBpID0gbGVuOyBpIDwgc2l6ZTsgaSsrKQ0KKyAgICBzdGRTdHJlYW0gPDwgJyAnOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGNoYXIgR2V0SGV4KHVuc2lnbmVkIHZhbCkNCit7DQorICByZXR1cm4gKGNoYXIpKCh2YWwgPCAxMCkgPyAoJzAnICsgdmFsKSA6ICgnQScgKyAodmFsIC0gMTApKSk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgV2FybmluZ3NDaGVjayhIUkVTVUxUIHJlc3VsdCwgY29uc3QgQ0NhbGxiYWNrQ29uc29sZUJhc2UgJmNhbGxiYWNrLA0KKyAgICBjb25zdCBDRXJyb3JJbmZvICZlcnJvckluZm8sIENTdGRPdXRTdHJlYW0gJnN0ZFN0cmVhbSkNCit7DQorICBpbnQgZXhpdENvZGUgPSBORXhpdENvZGU6OmtTdWNjZXNzOw0KKyAgDQorICBpZiAoY2FsbGJhY2suQ2FudEZpbmRGaWxlcy5TaXplKCkgPiAwKQ0KKyAgew0KKyAgICBzdGRTdHJlYW0gPDwgZW5kbDsNCisgICAgc3RkU3RyZWFtIDw8ICJXQVJOSU5HUyBmb3IgZmlsZXM6IiA8PCBlbmRsIDw8IGVuZGw7DQorICAgIHVuc2lnbmVkIG51bUVycm9ycyA9IGNhbGxiYWNrLkNhbnRGaW5kRmlsZXMuU2l6ZSgpOw0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtRXJyb3JzOyBpKyspDQorICAgIHsNCisgICAgICBzdGRTdHJlYW0gPDwgY2FsbGJhY2suQ2FudEZpbmRGaWxlc1tpXSA8PCAiIDogIjsNCisgICAgICBzdGRTdHJlYW0gPDwgTkVycm9yOjpNeUZvcm1hdE1lc3NhZ2UoY2FsbGJhY2suQ2FudEZpbmRDb2Rlc1tpXSkgPDwgZW5kbDsNCisgICAgfQ0KKyAgICBzdGRTdHJlYW0gPDwgIi0tLS0tLS0tLS0tLS0tLS0iIDw8IGVuZGw7DQorICAgIHN0ZFN0cmVhbSA8PCAiV0FSTklORzogQ2Fubm90IGZpbmQgIiA8PCBudW1FcnJvcnMgPDwgIiBmaWxlIjsNCisgICAgaWYgKG51bUVycm9ycyA+IDEpDQorICAgICAgc3RkU3RyZWFtIDw8ICJzIjsNCisgICAgc3RkU3RyZWFtIDw8IGVuZGw7DQorICAgIGV4aXRDb2RlID0gTkV4aXRDb2RlOjprV2FybmluZzsNCisgIH0NCisgIA0KKyAgaWYgKHJlc3VsdCAhPSBTX09LKQ0KKyAgew0KKyAgICBVU3RyaW5nIG1lc3NhZ2U7DQorICAgIGlmICghZXJyb3JJbmZvLk1lc3NhZ2UuSXNFbXB0eSgpKQ0KKyAgICB7DQorICAgICAgbWVzc2FnZSArPSBlcnJvckluZm8uTWVzc2FnZTsNCisgICAgICBtZXNzYWdlICs9IEwiXG4iOw0KKyAgICB9DQorICAgIGlmICghZXJyb3JJbmZvLkZpbGVOYW1lLklzRW1wdHkoKSkNCisgICAgew0KKyAgICAgIG1lc3NhZ2UgKz0gZnMydXMoZXJyb3JJbmZvLkZpbGVOYW1lKTsNCisgICAgICBtZXNzYWdlICs9IEwiXG4iOw0KKyAgICB9DQorICAgIGlmICghZXJyb3JJbmZvLkZpbGVOYW1lMi5Jc0VtcHR5KCkpDQorICAgIHsNCisgICAgICBtZXNzYWdlICs9IGZzMnVzKGVycm9ySW5mby5GaWxlTmFtZTIpOw0KKyAgICAgIG1lc3NhZ2UgKz0gTCJcbiI7DQorICAgIH0NCisgICAgaWYgKGVycm9ySW5mby5TeXN0ZW1FcnJvciAhPSAwKQ0KKyAgICB7DQorICAgICAgbWVzc2FnZSArPSBORXJyb3I6Ok15Rm9ybWF0TWVzc2FnZShlcnJvckluZm8uU3lzdGVtRXJyb3IpOw0KKyAgICAgIG1lc3NhZ2UgKz0gTCJcbiI7DQorICAgIH0NCisgICAgaWYgKCFtZXNzYWdlLklzRW1wdHkoKSkNCisgICAgICBzdGRTdHJlYW0gPDwgTCJcbkVycm9yOlxuIiA8PCBtZXNzYWdlOw0KKw0KKyAgICAvLyB3ZSB3aWxsIHdvcmsgd2l0aCAocmVzdWx0KSBsYXRlcg0KKyAgICAvLyB0aHJvdyBDU3lzdGVtRXhjZXB0aW9uKHJlc3VsdCk7DQorICAgIHJldHVybiBORXhpdENvZGU6OmtGYXRhbEVycm9yOw0KKyAgfQ0KKw0KKyAgdW5zaWduZWQgbnVtRXJyb3JzID0gY2FsbGJhY2suRmFpbGVkRmlsZXMuU2l6ZSgpOw0KKyAgaWYgKG51bUVycm9ycyA9PSAwKQ0KKyAgew0KKyAgICBpZiAoY2FsbGJhY2suQ2FudEZpbmRGaWxlcy5TaXplKCkgPT0gMCkNCisgICAgICBzdGRTdHJlYW0gPDwga0V2ZXJ5dGhpbmdJc09rIDw8IGVuZGw7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIHN0ZFN0cmVhbSA8PCBlbmRsOw0KKyAgICBzdGRTdHJlYW0gPDwgIldBUk5JTkdTIGZvciBmaWxlczoiIDw8IGVuZGwgPDwgZW5kbDsNCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUVycm9yczsgaSsrKQ0KKyAgICB7DQorICAgICAgc3RkU3RyZWFtIDw8IGNhbGxiYWNrLkZhaWxlZEZpbGVzW2ldIDw8ICIgOiAiOw0KKyAgICAgIHN0ZFN0cmVhbSA8PCBORXJyb3I6Ok15Rm9ybWF0TWVzc2FnZShjYWxsYmFjay5GYWlsZWRDb2Rlc1tpXSkgPDwgZW5kbDsNCisgICAgfQ0KKyAgICBzdGRTdHJlYW0gPDwgIi0tLS0tLS0tLS0tLS0tLS0iIDw8IGVuZGw7DQorICAgIHN0ZFN0cmVhbSA8PCAiV0FSTklORzogQ2Fubm90IG9wZW4gIiA8PCBudW1FcnJvcnMgPDwgIiBmaWxlIjsNCisgICAgaWYgKG51bUVycm9ycyA+IDEpDQorICAgICAgc3RkU3RyZWFtIDw8ICJzIjsNCisgICAgc3RkU3RyZWFtIDw8IGVuZGw7DQorICAgIGV4aXRDb2RlID0gTkV4aXRDb2RlOjprV2FybmluZzsNCisgIH0NCisgIHJldHVybiBleGl0Q29kZTsNCit9DQorDQorc3RhdGljIHZvaWQgVGhyb3dFeGNlcHRpb25faWZfRXJyb3IoSFJFU1VMVCByZXMpDQorew0KKyAgaWYgKHJlcyAhPSBTX09LKQ0KKyAgICB0aHJvdyBDU3lzdGVtRXhjZXB0aW9uKHJlcyk7DQorfQ0KKw0KKw0KK3N0YXRpYyB2b2lkIFByaW50TnVtKFVJbnQ2NCB2YWwsIHVuc2lnbmVkIG51bURpZ2l0cywgY2hhciBjID0gJyAnKQ0KK3sNCisgIGNoYXIgdGVtcFs2NF07DQorICBjaGFyICpwID0gdGVtcCArIDMyOw0KKyAgQ29udmVydFVJbnQ2NFRvU3RyaW5nKHZhbCwgcCk7DQorICB1bnNpZ25lZCBsZW4gPSBNeVN0cmluZ0xlbihwKTsNCisgIGZvciAoOyBsZW4gPCBudW1EaWdpdHM7IGxlbisrKQ0KKyAgICAqLS1wID0gYzsNCisgICpnX1N0ZFN0cmVhbSA8PCBwOw0KK30NCisNCitzdGF0aWMgdm9pZCBQcmludFRpbWUoY29uc3QgY2hhciAqcywgVUludDY0IHZhbCwgVUludDY0IHRvdGFsKQ0KK3sNCisgICpnX1N0ZFN0cmVhbSA8PCBlbmRsIDw8IHMgPDwgIiBUaW1lID0iOw0KKyAgY29uc3QgVUludDMyIGtGcmVxID0gMTAwMDAwMDA7DQorICBVSW50NjQgc2VjID0gdmFsIC8ga0ZyZXE7DQorICBQcmludE51bShzZWMsIDYpOw0KKyAgKmdfU3RkU3RyZWFtIDw8ICcuJzsNCisgIFVJbnQzMiBtcyA9IChVSW50MzIpKHZhbCAtIChzZWMgKiBrRnJlcSkpIC8gKGtGcmVxIC8gMTAwMCk7DQorICBQcmludE51bShtcywgMywgJzAnKTsNCisgIA0KKyAgd2hpbGUgKHZhbCA+ICgoVUludDY0KTEgPDwgNTYpKQ0KKyAgew0KKyAgICB2YWwgPj49IDE7DQorICAgIHRvdGFsID4+PSAxOw0KKyAgfQ0KKw0KKyAgVUludDY0IHBlcmNlbnQgPSAwOw0KKyAgaWYgKHRvdGFsICE9IDApDQorICAgIHBlcmNlbnQgPSB2YWwgKiAxMDAgLyB0b3RhbDsNCisgICpnX1N0ZFN0cmVhbSA8PCAiID0iOw0KKyAgUHJpbnROdW0ocGVyY2VudCwgNSk7DQorICAqZ19TdGRTdHJlYW0gPDwgJyUnOw0KK30NCisNCisjaWZuZGVmIFVOREVSX0NFDQorDQorI2RlZmluZSBTSElGVF9TSVpFX1ZBTFVFKHgsIG51bSkgKCgoeCkgKyAoMSA8PCAobnVtKSkgLSAxKSA+PiAobnVtKSkNCisNCitzdGF0aWMgdm9pZCBQcmludE1lbVVzYWdlKGNvbnN0IGNoYXIgKnMsIFVJbnQ2NCB2YWwpDQorew0KKyAgKmdfU3RkU3RyZWFtIDw8ICIgICAgIiA8PCBzIDw8ICIgTWVtb3J5ID0iOw0KKyAgUHJpbnROdW0oU0hJRlRfU0laRV9WQUxVRSh2YWwsIDIwKSwgNyk7DQorICAqZ19TdGRTdHJlYW0gPDwgIiBNQiI7DQorfQ0KKw0KK0VYVEVSTl9DX0JFR0lODQordHlwZWRlZiBCT09MIChXSU5BUEkgKkZ1bmNfR2V0UHJvY2Vzc01lbW9yeUluZm8pKEhBTkRMRSBQcm9jZXNzLA0KKyAgICBQUFJPQ0VTU19NRU1PUllfQ09VTlRFUlMgcHBzbWVtQ291bnRlcnMsIERXT1JEIGNiKTsNCitFWFRFUk5fQ19FTkQNCisNCisjZW5kaWYNCisNCitzdGF0aWMgaW5saW5lIFVJbnQ2NCBHZXRUaW1lNjQoY29uc3QgRklMRVRJTUUgJnQpIHsgcmV0dXJuICgoVUludDY0KXQuZHdIaWdoRGF0ZVRpbWUgPDwgMzIpIHwgdC5kd0xvd0RhdGVUaW1lOyB9DQorDQorc3RhdGljIHZvaWQgUHJpbnRTdGF0KCkNCit7DQorICBGSUxFVElNRSBjcmVhdGlvblRpbWVGVCwgZXhpdFRpbWVGVCwga2VybmVsVGltZUZULCB1c2VyVGltZUZUOw0KKyAgaWYgKCENCisgICAgICAjaWZkZWYgVU5ERVJfQ0UNCisgICAgICAgIDo6R2V0VGhyZWFkVGltZXMoOjpHZXRDdXJyZW50VGhyZWFkKCkNCisgICAgICAjZWxzZQ0KKyAgICAgICAgLy8gTlQgMy41DQorICAgICAgICA6OkdldFByb2Nlc3NUaW1lcyg6OkdldEN1cnJlbnRQcm9jZXNzKCkNCisgICAgICAjZW5kaWYNCisgICAgICAsICZjcmVhdGlvblRpbWVGVCwgJmV4aXRUaW1lRlQsICZrZXJuZWxUaW1lRlQsICZ1c2VyVGltZUZUKSkNCisgICAgcmV0dXJuOw0KKyAgRklMRVRJTUUgY3VyVGltZUZUOw0KKyAgTlRpbWU6OkdldEN1clV0Y0ZpbGVUaW1lKGN1clRpbWVGVCk7DQorDQorICAjaWZuZGVmIFVOREVSX0NFDQorICANCisgIFBST0NFU1NfTUVNT1JZX0NPVU5URVJTIG07DQorICBtZW1zZXQoJm0sIDAsIHNpemVvZihtKSk7DQorICBCT09MIG1lbURlZmluZWQgPSBGQUxTRTsNCisgIHsNCisgICAgLyogTlQgNC4wOiBHZXRQcm9jZXNzTWVtb3J5SW5mbygpIGluIFBzYXBpLmRsbA0KKyAgICAgICBXaW43OiBuZXcgZnVuY3Rpb24gSzMyR2V0UHJvY2Vzc01lbW9yeUluZm8oKSBpbiBrZXJuZWwzMi5kbGwNCisgICAgICAgSXQncyBmYXN0ZXIgdG8gY2FsbCBrZXJuZWwzMi5kbGwgY29kZSB0aGFuIFBzYXBpLmRsbCBjb2RlDQorICAgICAgIEdldFByb2Nlc3NNZW1vcnlJbmZvKCkgcmVxdWlyZXMgUHNhcGkubGliDQorICAgICAgIFBzYXBpLmxpYiBpbiBTREs3KyBjYW4gbGluayB0byBLMzJHZXRQcm9jZXNzTWVtb3J5SW5mbyBpbiBrZXJuZWwzMi5kbGwNCisgICAgICAgVGhlIHByb2dyYW0gd2l0aCBLMzJHZXRQcm9jZXNzTWVtb3J5SW5mbyB3aWxsIG5vdCB3b3JrIG9uIHN5c3RlbXMgYmVmb3JlIFdpbjcNCisgICAgICAgLy8gbWVtRGVmaW5lZCA9IEdldFByb2Nlc3NNZW1vcnlJbmZvKEdldEN1cnJlbnRQcm9jZXNzKCksICZtLCBzaXplb2YobSkpOw0KKyAgICAqLw0KKw0KKyAgICBGdW5jX0dldFByb2Nlc3NNZW1vcnlJbmZvIG15X0dldFByb2Nlc3NNZW1vcnlJbmZvID0gKEZ1bmNfR2V0UHJvY2Vzc01lbW9yeUluZm8pDQorICAgICAgICA6OkdldFByb2NBZGRyZXNzKDo6R2V0TW9kdWxlSGFuZGxlVyhMImtlcm5lbDMyLmRsbCIpLCAiSzMyR2V0UHJvY2Vzc01lbW9yeUluZm8iKTsNCisgICAgaWYgKCFteV9HZXRQcm9jZXNzTWVtb3J5SW5mbykNCisgICAgew0KKyAgICAgIEhNT0RVTEUgbGliID0gTG9hZExpYnJhcnlXKEwiUHNhcGkuZGxsIik7DQorICAgICAgaWYgKGxpYikNCisgICAgICAgIG15X0dldFByb2Nlc3NNZW1vcnlJbmZvID0gKEZ1bmNfR2V0UHJvY2Vzc01lbW9yeUluZm8pOjpHZXRQcm9jQWRkcmVzcyhsaWIsICJHZXRQcm9jZXNzTWVtb3J5SW5mbyIpOw0KKyAgICB9DQorICAgIGlmIChteV9HZXRQcm9jZXNzTWVtb3J5SW5mbykNCisgICAgICBtZW1EZWZpbmVkID0gbXlfR2V0UHJvY2Vzc01lbW9yeUluZm8oR2V0Q3VycmVudFByb2Nlc3MoKSwgJm0sIHNpemVvZihtKSk7DQorICAgIC8vIEZyZWVMaWJyYXJ5KGxpYik7DQorICB9DQorDQorICAjZW5kaWYNCisNCisgIFVJbnQ2NCBjdXJUaW1lID0gR2V0VGltZTY0KGN1clRpbWVGVCk7DQorICBVSW50NjQgY3JlYXRpb25UaW1lID0gR2V0VGltZTY0KGNyZWF0aW9uVGltZUZUKTsNCisgIFVJbnQ2NCBrZXJuZWxUaW1lID0gR2V0VGltZTY0KGtlcm5lbFRpbWVGVCk7DQorICBVSW50NjQgdXNlclRpbWUgPSBHZXRUaW1lNjQodXNlclRpbWVGVCk7DQorDQorICBVSW50NjQgdG90YWxUaW1lID0gY3VyVGltZSAtIGNyZWF0aW9uVGltZTsNCisgIA0KKyAgUHJpbnRUaW1lKCJLZXJuZWwgIiwga2VybmVsVGltZSwgdG90YWxUaW1lKTsNCisgIFByaW50VGltZSgiVXNlciAgICIsIHVzZXJUaW1lLCB0b3RhbFRpbWUpOw0KKyAgDQorICBQcmludFRpbWUoIlByb2Nlc3MiLCBrZXJuZWxUaW1lICsgdXNlclRpbWUsIHRvdGFsVGltZSk7DQorICAjaWZuZGVmIFVOREVSX0NFDQorICBpZiAobWVtRGVmaW5lZCkgUHJpbnRNZW1Vc2FnZSgiVmlydHVhbCAiLCBtLlBlYWtQYWdlZmlsZVVzYWdlKTsNCisgICNlbmRpZg0KKyAgDQorICBQcmludFRpbWUoIkdsb2JhbCAiLCB0b3RhbFRpbWUsIHRvdGFsVGltZSk7DQorICAjaWZuZGVmIFVOREVSX0NFDQorICBpZiAobWVtRGVmaW5lZCkgUHJpbnRNZW1Vc2FnZSgiUGh5c2ljYWwiLCBtLlBlYWtXb3JraW5nU2V0U2l6ZSk7DQorICAjZW5kaWYNCisgIA0KKyAgKmdfU3RkU3RyZWFtIDw8IGVuZGw7DQorfQ0KKw0KK2ludCBNYWluMigNCisgICNpZm5kZWYgX1dJTjMyDQorICBpbnQgbnVtQXJncywgY29uc3QgY2hhciAqYXJnc1tdDQorICAjZW5kaWYNCispDQorew0KKyAgI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkNCisgIFNldEZpbGVBcGlzVG9PRU0oKTsNCisgICNlbmRpZg0KKw0KKyAgVVN0cmluZ1ZlY3RvciBjb21tYW5kU3RyaW5nczsNCisgICNpZmRlZiBfV0lOMzINCisgIE5Db21tYW5kTGluZVBhcnNlcjo6U3BsaXRDb21tYW5kTGluZShHZXRDb21tYW5kTGluZVcoKSwgY29tbWFuZFN0cmluZ3MpOw0KKyAgI2Vsc2UNCisgIEdldEFyZ3VtZW50cyhudW1BcmdzLCBhcmdzLCBjb21tYW5kU3RyaW5ncyk7DQorICAjZW5kaWYNCisNCisgIGlmIChjb21tYW5kU3RyaW5ncy5TaXplKCkgPT0gMSkNCisgIHsNCisgICAgU2hvd0NvcHlyaWdodEFuZEhlbHAoZ19TdGRPdXQsIHRydWUpOw0KKyAgICByZXR1cm4gMDsNCisgIH0NCisNCisgIGNvbW1hbmRTdHJpbmdzLkRlbGV0ZSgwKTsNCisNCisgIENBcmNDbWRMaW5lT3B0aW9ucyBvcHRpb25zOw0KKw0KKyAgQ0FyY0NtZExpbmVQYXJzZXIgcGFyc2VyOw0KKw0KKyAgcGFyc2VyLlBhcnNlMShjb21tYW5kU3RyaW5ncywgb3B0aW9ucyk7DQorDQorICBpZiAob3B0aW9ucy5IZWxwTW9kZSkNCisgIHsNCisgICAgU2hvd0NvcHlyaWdodEFuZEhlbHAoZ19TdGRPdXQsIHRydWUpOw0KKyAgICByZXR1cm4gMDsNCisgIH0NCisNCisgICNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoVU5ERVJfQ0UpDQorICBOU2VjdXJpdHk6OkVuYWJsZVByaXZpbGVnZV9TeW1MaW5rKCk7DQorICAjZW5kaWYNCisgICNpZmRlZiBfN1pJUF9MQVJHRV9QQUdFUw0KKyAgaWYgKG9wdGlvbnMuTGFyZ2VQYWdlcykNCisgIHsNCisgICAgU2V0TGFyZ2VQYWdlU2l6ZSgpOw0KKyAgICAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKyAgICBOU2VjdXJpdHk6OkVuYWJsZVByaXZpbGVnZV9Mb2NrTWVtb3J5KCk7DQorICAgICNlbmRpZg0KKyAgfQ0KKyAgI2VuZGlmDQorDQorICBDU3RkT3V0U3RyZWFtICZzdGRTdHJlYW0gPSBvcHRpb25zLlN0ZE91dE1vZGUgPyBnX1N0ZEVyciA6IGdfU3RkT3V0Ow0KKyAgZ19TdGRTdHJlYW0gPSAmc3RkU3RyZWFtOw0KKw0KKyAgaWYgKG9wdGlvbnMuRW5hYmxlSGVhZGVycykNCisgICAgU2hvd0NvcHlyaWdodEFuZEhlbHAoc3RkU3RyZWFtLCBmYWxzZSk7DQorDQorICBwYXJzZXIuUGFyc2UyKG9wdGlvbnMpOw0KKw0KKyAgQ0NvZGVjcyAqY29kZWNzID0gbmV3IENDb2RlY3M7DQorICAjaWZkZWYgRVhURVJOQUxfQ09ERUNTDQorICBDRXh0ZXJuYWxDb2RlY3MgX19leHRlcm5hbENvZGVjczsNCisgIF9fZXh0ZXJuYWxDb2RlY3MuR2V0Q29kZWNzID0gY29kZWNzOw0KKyAgX19leHRlcm5hbENvZGVjcy5HZXRIYXNoZXJzID0gY29kZWNzOw0KKyAgI2Vsc2UNCisgIENNeUNvbVB0cjxJVW5rbm93bj4gY29tcHJlc3NDb2RlY3NJbmZvID0gY29kZWNzOw0KKyAgI2VuZGlmDQorICBjb2RlY3MtPkNhc2VTZW5zaXRpdmVDaGFuZ2UgPSBvcHRpb25zLkNhc2VTZW5zaXRpdmVDaGFuZ2U7DQorICBjb2RlY3MtPkNhc2VTZW5zaXRpdmUgPSBvcHRpb25zLkNhc2VTZW5zaXRpdmU7DQorICBUaHJvd0V4Y2VwdGlvbl9pZl9FcnJvcihjb2RlY3MtPkxvYWQoKSk7DQorDQorICBib29sIGlzRXh0cmFjdEdyb3VwQ29tbWFuZCA9IG9wdGlvbnMuQ29tbWFuZC5Jc0Zyb21FeHRyYWN0R3JvdXAoKTsNCisNCisgIGlmIChjb2RlY3MtPkZvcm1hdHMuU2l6ZSgpID09IDAgJiYNCisgICAgICAgIChpc0V4dHJhY3RHcm91cENvbW1hbmQNCisgICAgICAgIHx8IG9wdGlvbnMuQ29tbWFuZC5Db21tYW5kVHlwZSA9PSBOQ29tbWFuZFR5cGU6OmtMaXN0DQorICAgICAgICB8fCBvcHRpb25zLkNvbW1hbmQuSXNGcm9tVXBkYXRlR3JvdXAoKSkpDQorICAgIHRocm93IGtOb0Zvcm1hdHM7DQorDQorICBDT2JqZWN0VmVjdG9yPENPcGVuVHlwZT4gdHlwZXM7DQorICBpZiAoIVBhcnNlT3BlblR5cGVzKCpjb2RlY3MsIG9wdGlvbnMuQXJjVHlwZSwgdHlwZXMpKQ0KKyAgICB0aHJvdyBrVW5zdXBwb3J0ZWRBcmNUeXBlTWVzc2FnZTsNCisNCisgIENJbnRWZWN0b3IgZXhjbHVkZWRGb3JtYXRzOw0KKyAgRk9SX1ZFQ1RPUiAoaywgb3B0aW9ucy5FeGNsdWRlZEFyY1R5cGVzKQ0KKyAgew0KKyAgICBDSW50VmVjdG9yIHRlbXBJbmRpY2VzOw0KKyAgICBpZiAoIWNvZGVjcy0+RmluZEZvcm1hdEZvckFyY2hpdmVUeXBlKG9wdGlvbnMuRXhjbHVkZWRBcmNUeXBlc1trXSwgdGVtcEluZGljZXMpDQorICAgICAgICB8fCB0ZW1wSW5kaWNlcy5TaXplKCkgIT0gMSkNCisgICAgICB0aHJvdyBrVW5zdXBwb3J0ZWRBcmNUeXBlTWVzc2FnZTsNCisgICAgZXhjbHVkZWRGb3JtYXRzLkFkZFRvVW5pcXVlU29ydGVkKHRlbXBJbmRpY2VzWzBdKTsNCisgICAgLy8gZXhjbHVkZWRGb3JtYXRzLlNvcnQoKTsNCisgIH0NCisNCisgIA0KKyAgI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKyAgaWYgKGlzRXh0cmFjdEdyb3VwQ29tbWFuZA0KKyAgICAgIHx8IG9wdGlvbnMuQ29tbWFuZC5Db21tYW5kVHlwZSA9PSBOQ29tbWFuZFR5cGU6OmtIYXNoDQorICAgICAgfHwgb3B0aW9ucy5Db21tYW5kLkNvbW1hbmRUeXBlID09IE5Db21tYW5kVHlwZTo6a0JlbmNobWFyaykNCisgICAgVGhyb3dFeGNlcHRpb25faWZfRXJyb3IoX19leHRlcm5hbENvZGVjcy5Mb2FkQ29kZWNzKCkpOw0KKyAgI2VuZGlmDQorDQorICBpbnQgcmV0Q29kZSA9IE5FeGl0Q29kZTo6a1N1Y2Nlc3M7DQorICBIUkVTVUxUIGhyZXN1bHRNYWluID0gU19PSzsNCisNCisgIGJvb2wgc2hvd1N0YXQgPSB0cnVlOw0KKyAgaWYgKCFvcHRpb25zLkVuYWJsZUhlYWRlcnMgfHwNCisgICAgICBvcHRpb25zLlRlY2hNb2RlKQ0KKyAgICBzaG93U3RhdCA9IGZhbHNlOw0KKyAgDQorDQorICBpZiAob3B0aW9ucy5Db21tYW5kLkNvbW1hbmRUeXBlID09IE5Db21tYW5kVHlwZTo6a0luZm8pDQorICB7DQorICAgIHVuc2lnbmVkIGk7DQorDQorICAgICNpZmRlZiBFWFRFUk5BTF9DT0RFQ1MNCisgICAgc3RkU3RyZWFtIDw8IGVuZGwgPDwgIkxpYnM6IiA8PCBlbmRsOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgY29kZWNzLT5MaWJzLlNpemUoKTsgaSsrKQ0KKyAgICB7DQorICAgICAgUHJpbnRMaWJJbmRleChzdGRTdHJlYW0sIGkpOw0KKyAgICAgIHN0ZFN0cmVhbSA8PCAnICcgPDwgY29kZWNzLT5MaWJzW2ldLlBhdGggPDwgZW5kbDsNCisgICAgfQ0KKyAgICAjZW5kaWYNCisNCisgICAgc3RkU3RyZWFtIDw8IGVuZGwgPDwgIkZvcm1hdHM6IiA8PCBlbmRsOw0KKyAgICANCisgICAgY29uc3QgY2hhciAqa0FyY0ZsYWdzID0gIktTTkZNR09QQkVMSCI7DQorICAgIGNvbnN0IHVuc2lnbmVkIGtOdW1BcmNGbGFncyA9ICh1bnNpZ25lZClzdHJsZW4oa0FyY0ZsYWdzKTsNCisgICAgDQorICAgIGZvciAoaSA9IDA7IGkgPCBjb2RlY3MtPkZvcm1hdHMuU2l6ZSgpOyBpKyspDQorICAgIHsNCisgICAgICBjb25zdCBDQXJjSW5mb0V4ICZhcmMgPSBjb2RlY3MtPkZvcm1hdHNbaV07DQorICAgICAgI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKyAgICAgIFByaW50TGliSW5kZXgoc3RkU3RyZWFtLCBhcmMuTGliSW5kZXgpOw0KKyAgICAgICNlbHNlDQorICAgICAgc3RkU3RyZWFtIDw8ICIgICI7DQorICAgICAgI2VuZGlmDQorICAgICAgc3RkU3RyZWFtIDw8IChjaGFyKShhcmMuVXBkYXRlRW5hYmxlZCA/ICdDJyA6ICcgJyk7DQorICAgICAgZm9yICh1bnNpZ25lZCBiID0gMDsgYiA8IGtOdW1BcmNGbGFnczsgYisrKQ0KKyAgICAgIHsNCisgICAgICAgIHN0ZFN0cmVhbSA8PCAoY2hhcikNCisgICAgICAgICAgKChhcmMuRmxhZ3MgJiAoKFVJbnQzMikxIDw8IGIpKSAhPSAwID8ga0FyY0ZsYWdzW2JdIDogJyAnKTsNCisgICAgICB9DQorICAgICAgICANCisgICAgICBzdGRTdHJlYW0gPDwgJyAnOw0KKyAgICAgIFByaW50U3RyaW5nKHN0ZFN0cmVhbSwgYXJjLk5hbWUsIDgpOw0KKyAgICAgIHN0ZFN0cmVhbSA8PCAnICc7DQorICAgICAgVVN0cmluZyBzOw0KKyAgICAgIEZPUl9WRUNUT1IgKHQsIGFyYy5FeHRzKQ0KKyAgICAgIHsNCisgICAgICAgIGlmICh0ICE9IDApDQorICAgICAgICAgIHMgKz0gTCcgJzsNCisgICAgICAgIGNvbnN0IENBcmNFeHRJbmZvICZleHQgPSBhcmMuRXh0c1t0XTsNCisgICAgICAgIHMgKz0gZXh0LkV4dDsNCisgICAgICAgIGlmICghZXh0LkFkZEV4dC5Jc0VtcHR5KCkpDQorICAgICAgICB7DQorICAgICAgICAgIHMgKz0gTCIgKCI7DQorICAgICAgICAgIHMgKz0gZXh0LkFkZEV4dDsNCisgICAgICAgICAgcyArPSBMJyknOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBQcmludFN0cmluZyhzdGRTdHJlYW0sIHMsIDEzKTsNCisgICAgICBzdGRTdHJlYW0gPDwgJyAnOw0KKyAgICAgIGlmIChhcmMuU2lnbmF0dXJlT2Zmc2V0ICE9IDApDQorICAgICAgICBzdGRTdHJlYW0gPDwgIm9mZnNldD0iIDw8IGFyYy5TaWduYXR1cmVPZmZzZXQgPDwgJyAnOw0KKw0KKyAgICAgIEZPUl9WRUNUT1Ioc2ksIGFyYy5TaWduYXR1cmVzKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChzaSAhPSAwKQ0KKyAgICAgICAgICBzdGRTdHJlYW0gPDwgIiAgfHwgICI7DQorDQorICAgICAgICBjb25zdCBDQnl0ZUJ1ZmZlciAmc2lnID0gYXJjLlNpZ25hdHVyZXNbc2ldOw0KKyAgICAgICAgDQorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpZy5TaXplKCk7IGorKykNCisgICAgICAgIHsNCisgICAgICAgICAgaWYgKGogIT0gMCkNCisgICAgICAgICAgICBzdGRTdHJlYW0gPDwgJyAnOw0KKyAgICAgICAgICBCeXRlIGIgPSBzaWdbal07DQorICAgICAgICAgIGlmIChiID4gMHgyMCAmJiBiIDwgMHg4MCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIHN0ZFN0cmVhbSA8PCAoY2hhciliOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGVsc2UNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIHN0ZFN0cmVhbSA8PCBHZXRIZXgoKGIgPj4gNCkgJiAweEYpOw0KKyAgICAgICAgICAgIHN0ZFN0cmVhbSA8PCBHZXRIZXgoYiAmIDB4Rik7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgc3RkU3RyZWFtIDw8IGVuZGw7DQorICAgIH0NCisNCisgICAgI2lmZGVmIEVYVEVSTkFMX0NPREVDUw0KKw0KKyAgICBzdGRTdHJlYW0gPDwgZW5kbCA8PCAiQ29kZWNzOiIgPDwgZW5kbCA8PCAiTGliICAgICAgICAgSUQgIE5hbWUiIDw8IGVuZGw7DQorICAgIFVJbnQzMiBudW1NZXRob2RzOw0KKyAgICBpZiAoY29kZWNzLT5HZXROdW1iZXJPZk1ldGhvZHMoJm51bU1ldGhvZHMpID09IFNfT0spDQorICAgIGZvciAoVUludDMyIGogPSAwOyBqIDwgbnVtTWV0aG9kczsgaisrKQ0KKyAgICB7DQorICAgICAgUHJpbnRMaWJJbmRleChzdGRTdHJlYW0sIGNvZGVjcy0+R2V0Q29kZWNMaWJJbmRleChqKSk7DQorICAgICAgc3RkU3RyZWFtIDw8IChjaGFyKShjb2RlY3MtPkdldENvZGVjRW5jb2RlcklzQXNzaWduZWQoaikgPyAnQycgOiAnICcpOw0KKyAgICAgIFVJbnQ2NCBpZDsNCisgICAgICBzdGRTdHJlYW0gPDwgIiAgIjsNCisgICAgICBIUkVTVUxUIHJlcyA9IGNvZGVjcy0+R2V0Q29kZWNJZChqLCBpZCk7DQorICAgICAgaWYgKHJlcyAhPSBTX09LKQ0KKyAgICAgICAgaWQgPSAoVUludDY0KShJbnQ2NCktMTsNCisgICAgICBjaGFyIHNbMzJdOw0KKyAgICAgIENvbnZlcnRVSW50NjRUb0hleChpZCwgcyk7DQorICAgICAgUHJpbnRTdHJpbmcoc3RkU3RyZWFtLCBzLCA4KTsNCisgICAgICBzdGRTdHJlYW0gPDwgIiAgIiA8PCBjb2RlY3MtPkdldENvZGVjTmFtZShqKSA8PCBlbmRsOw0KKyAgICB9DQorICAgIA0KKyAgICBzdGRTdHJlYW0gPDwgZW5kbCA8PCAiSGFzaGVyczoiIDw8IGVuZGwgPDwgIiBMIFNpemUgICAgIElEICBOYW1lIiA8PCBlbmRsOw0KKyAgICBudW1NZXRob2RzID0gY29kZWNzLT5HZXROdW1IYXNoZXJzKCk7DQorICAgIGZvciAoVUludDMyIGogPSAwOyBqIDwgbnVtTWV0aG9kczsgaisrKQ0KKyAgICB7DQorICAgICAgUHJpbnRMaWJJbmRleChzdGRTdHJlYW0sIGNvZGVjcy0+R2V0SGFzaGVyTGliSW5kZXgoaikpOw0KKyAgICAgIFByaW50VUludDMyKHN0ZFN0cmVhbSwgY29kZWNzLT5HZXRIYXNoZXJEaWdlc3RTaXplKGopLCA0KTsNCisgICAgICBzdGRTdHJlYW0gPDwgJyAnOw0KKyAgICAgIGNoYXIgc1szMl07DQorICAgICAgQ29udmVydFVJbnQ2NFRvSGV4KGNvZGVjcy0+R2V0SGFzaGVySWQoaiksIHMpOw0KKyAgICAgIFByaW50U3RyaW5nKHN0ZFN0cmVhbSwgcywgNik7DQorICAgICAgc3RkU3RyZWFtIDw8ICIgICIgPDwgY29kZWNzLT5HZXRIYXNoZXJOYW1lKGopIDw8IGVuZGw7DQorICAgIH0NCisNCisgICAgI2VuZGlmDQorICAgIA0KKyAgfQ0KKyAgZWxzZSBpZiAob3B0aW9ucy5Db21tYW5kLkNvbW1hbmRUeXBlID09IE5Db21tYW5kVHlwZTo6a0JlbmNobWFyaykNCisgIHsNCisgICAgaHJlc3VsdE1haW4gPSBCZW5jaENvbihFWFRFUk5BTF9DT0RFQ1NfVkFSUw0KKyAgICAgICAgb3B0aW9ucy5Qcm9wZXJ0aWVzLCBvcHRpb25zLk51bUl0ZXJhdGlvbnMsIChGSUxFICopc3RkU3RyZWFtKTsNCisgICAgaWYgKGhyZXN1bHRNYWluID09IFNfRkFMU0UpDQorICAgIHsNCisgICAgICBzdGRTdHJlYW0gPDwgIlxuRGVjb2RpbmcgRXJyb3JcbiI7DQorICAgICAgcmV0Q29kZSA9IE5FeGl0Q29kZTo6a0ZhdGFsRXJyb3I7DQorICAgICAgaHJlc3VsdE1haW4gPSBTX09LOw0KKyAgICB9DQorICB9DQorICBlbHNlIGlmIChpc0V4dHJhY3RHcm91cENvbW1hbmQgfHwgb3B0aW9ucy5Db21tYW5kLkNvbW1hbmRUeXBlID09IE5Db21tYW5kVHlwZTo6a0xpc3QpDQorICB7DQorICAgIGlmIChpc0V4dHJhY3RHcm91cENvbW1hbmQpDQorICAgIHsNCisgICAgICBDRXh0cmFjdENhbGxiYWNrQ29uc29sZSAqZWNzID0gbmV3IENFeHRyYWN0Q2FsbGJhY2tDb25zb2xlOw0KKyAgICAgIENNeUNvbVB0cjxJRm9sZGVyQXJjaGl2ZUV4dHJhY3RDYWxsYmFjaz4gZXh0cmFjdENhbGxiYWNrID0gZWNzOw0KKw0KKyAgICAgIGVjcy0+T3V0U3RyZWFtID0gJnN0ZFN0cmVhbTsNCisNCisgICAgICAjaWZuZGVmIF9OT19DUllQVE8NCisgICAgICBlY3MtPlBhc3N3b3JkSXNEZWZpbmVkID0gb3B0aW9ucy5QYXNzd29yZEVuYWJsZWQ7DQorICAgICAgZWNzLT5QYXNzd29yZCA9IG9wdGlvbnMuUGFzc3dvcmQ7DQorICAgICAgI2VuZGlmDQorDQorICAgICAgZWNzLT5Jbml0KCk7DQorDQorICAgICAgQ09wZW5DYWxsYmFja0NvbnNvbGUgb3BlbkNhbGxiYWNrOw0KKyAgICAgIG9wZW5DYWxsYmFjay5PdXRTdHJlYW0gPSAmc3RkU3RyZWFtOw0KKw0KKyAgICAgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgICAgIG9wZW5DYWxsYmFjay5QYXNzd29yZElzRGVmaW5lZCA9IG9wdGlvbnMuUGFzc3dvcmRFbmFibGVkOw0KKyAgICAgIG9wZW5DYWxsYmFjay5QYXNzd29yZCA9IG9wdGlvbnMuUGFzc3dvcmQ7DQorICAgICAgI2VuZGlmDQorDQorICAgICAgQ0V4dHJhY3RPcHRpb25zIGVvOw0KKyAgICAgIChDRXh0cmFjdE9wdGlvbnNCYXNlICYpZW8gPSBvcHRpb25zLkV4dHJhY3RPcHRpb25zOw0KKyAgICAgIGVvLlN0ZEluTW9kZSA9IG9wdGlvbnMuU3RkSW5Nb2RlOw0KKyAgICAgIGVvLlN0ZE91dE1vZGUgPSBvcHRpb25zLlN0ZE91dE1vZGU7DQorICAgICAgZW8uWWVzVG9BbGwgPSBvcHRpb25zLlllc1RvQWxsOw0KKyAgICAgIGVvLlRlc3RNb2RlID0gb3B0aW9ucy5Db21tYW5kLklzVGVzdENvbW1hbmQoKTsNCisgICAgICANCisgICAgICAjaWZuZGVmIF9TRlgNCisgICAgICBlby5Qcm9wZXJ0aWVzID0gb3B0aW9ucy5Qcm9wZXJ0aWVzOw0KKyAgICAgICNlbmRpZg0KKw0KKyAgICAgIFVTdHJpbmcgZXJyb3JNZXNzYWdlOw0KKyAgICAgIENEZWNvbXByZXNzU3RhdCBzdGF0Ow0KKyAgICAgIENIYXNoQnVuZGxlIGhiOw0KKyAgICAgIElIYXNoQ2FsYyAqaGFzaENhbGMgPSBOVUxMOw0KKw0KKyAgICAgIGlmICghb3B0aW9ucy5IYXNoTWV0aG9kcy5Jc0VtcHR5KCkpDQorICAgICAgew0KKyAgICAgICAgaGFzaENhbGMgPSAmaGI7DQorICAgICAgICBUaHJvd0V4Y2VwdGlvbl9pZl9FcnJvcihoYi5TZXRNZXRob2RzKEVYVEVSTkFMX0NPREVDU19WQVJTIG9wdGlvbnMuSGFzaE1ldGhvZHMpKTsNCisgICAgICAgIGhiLkluaXQoKTsNCisgICAgICB9DQorICAgICAgaHJlc3VsdE1haW4gPSBFeHRyYWN0KA0KKyAgICAgICAgICBjb2RlY3MsDQorICAgICAgICAgIHR5cGVzLA0KKyAgICAgICAgICBleGNsdWRlZEZvcm1hdHMsDQorICAgICAgICAgIG9wdGlvbnMuQXJjaGl2ZVBhdGhzU29ydGVkLA0KKyAgICAgICAgICBvcHRpb25zLkFyY2hpdmVQYXRoc0Z1bGxTb3J0ZWQsDQorICAgICAgICAgIG9wdGlvbnMuQ2Vuc29yLlBhaXJzLkZyb250KCkuSGVhZCwNCisgICAgICAgICAgZW8sICZvcGVuQ2FsbGJhY2ssIGVjcywgaGFzaENhbGMsIGVycm9yTWVzc2FnZSwgc3RhdCk7DQorICAgICAgaWYgKCFlcnJvck1lc3NhZ2UuSXNFbXB0eSgpKQ0KKyAgICAgIHsNCisgICAgICAgIHN0ZFN0cmVhbSA8PCBlbmRsIDw8ICJFcnJvcjogIiA8PCBlcnJvck1lc3NhZ2U7DQorICAgICAgICBpZiAoaHJlc3VsdE1haW4gPT0gU19PSykNCisgICAgICAgICAgaHJlc3VsdE1haW4gPSBFX0ZBSUw7DQorICAgICAgfQ0KKw0KKyAgICAgIHN0ZFN0cmVhbSA8PCBlbmRsOw0KKw0KKyAgICAgIGlmIChlY3MtPk51bVRyeUFyY3MgPiAxKQ0KKyAgICAgIHsNCisgICAgICAgIHN0ZFN0cmVhbSA8PCAiQXJjaGl2ZXM6ICIgPDwgZWNzLT5OdW1UcnlBcmNzIDw8IGVuZGw7DQorICAgICAgICBzdGRTdHJlYW0gPDwgIk9LIGFyY2hpdmVzOiAiIDw8IGVjcy0+TnVtT2tBcmNzIDw8IGVuZGw7DQorICAgICAgfQ0KKyAgICAgIGJvb2wgaXNFcnJvciA9IGZhbHNlOw0KKyAgICAgIGlmIChlY3MtPk51bUNhbnRPcGVuQXJjcyAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgIGlzRXJyb3IgPSB0cnVlOw0KKyAgICAgICAgc3RkU3RyZWFtIDw8ICJDYW4ndCBvcGVuIGFzIGFyY2hpdmU6ICIgPDwgZWNzLT5OdW1DYW50T3BlbkFyY3MgPDwgZW5kbDsNCisgICAgICB9DQorICAgICAgaWYgKGVjcy0+TnVtQXJjc1dpdGhFcnJvciAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgIGlzRXJyb3IgPSB0cnVlOw0KKyAgICAgICAgc3RkU3RyZWFtIDw8ICJBcmNoaXZlcyB3aXRoIEVycm9yczogIiA8PCBlY3MtPk51bUFyY3NXaXRoRXJyb3IgPDwgZW5kbDsNCisgICAgICB9DQorICAgICAgaWYgKGVjcy0+TnVtQXJjc1dpdGhXYXJuaW5ncyAhPSAwKQ0KKyAgICAgICAgc3RkU3RyZWFtIDw8ICJBcmNoaXZlcyB3aXRoIFdhcm5pbmdzOiAiIDw8IGVjcy0+TnVtQXJjc1dpdGhXYXJuaW5ncyA8PCBlbmRsOw0KKyAgICAgIA0KKyAgICAgIGlmIChlY3MtPk51bU9wZW5BcmNXYXJuaW5ncyAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgIHN0ZFN0cmVhbSA8PCBlbmRsOw0KKyAgICAgICAgaWYgKGVjcy0+TnVtT3BlbkFyY1dhcm5pbmdzICE9IDApDQorICAgICAgICAgIHN0ZFN0cmVhbSA8PCAiV2FybmluZ3M6ICIgPDwgZWNzLT5OdW1PcGVuQXJjV2FybmluZ3MgPDwgZW5kbDsNCisgICAgICB9DQorICAgICAgDQorICAgICAgaWYgKGVjcy0+TnVtT3BlbkFyY0Vycm9ycyAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgIGlzRXJyb3IgPSB0cnVlOw0KKyAgICAgICAgc3RkU3RyZWFtIDw8IGVuZGw7DQorICAgICAgICBpZiAoZWNzLT5OdW1PcGVuQXJjRXJyb3JzICE9IDApDQorICAgICAgICAgIHN0ZFN0cmVhbSA8PCAiT3BlbiBFcnJvcnM6ICIgPDwgZWNzLT5OdW1PcGVuQXJjRXJyb3JzIDw8IGVuZGw7DQorICAgICAgfQ0KKw0KKyAgICAgIGlmIChpc0Vycm9yKQ0KKyAgICAgICAgcmV0Q29kZSA9IE5FeGl0Q29kZTo6a0ZhdGFsRXJyb3I7DQorICAgICAgDQorICAgICAgaWYgKGVjcy0+TnVtQXJjc1dpdGhFcnJvciAhPSAwIHx8IGVjcy0+TnVtRmlsZUVycm9ycyAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgIC8vIGlmIChlY3MtPk51bUFyY2hpdmVzID4gMSkNCisgICAgICAgIHsNCisgICAgICAgICAgc3RkU3RyZWFtIDw8IGVuZGw7DQorICAgICAgICAgIGlmIChlY3MtPk51bUZpbGVFcnJvcnMgIT0gMCkNCisgICAgICAgICAgICBzdGRTdHJlYW0gPDwgIlN1YiBpdGVtcyBFcnJvcnM6ICIgPDwgZWNzLT5OdW1GaWxlRXJyb3JzIDw8IGVuZGw7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKGhyZXN1bHRNYWluID09IFNfT0spDQorICAgICAgew0KKyAgICAgDQorICAgICAgaWYgKHN0YXQuTnVtRm9sZGVycyAhPSAwKQ0KKyAgICAgICAgc3RkU3RyZWFtIDw8ICJGb2xkZXJzOiAiIDw8IHN0YXQuTnVtRm9sZGVycyA8PCBlbmRsOw0KKyAgICAgIGlmIChzdGF0Lk51bUZpbGVzICE9IDEgfHwgc3RhdC5OdW1Gb2xkZXJzICE9IDAgfHwgc3RhdC5OdW1BbHRTdHJlYW1zICE9IDApDQorICAgICAgICBzdGRTdHJlYW0gPDwgIkZpbGVzOiAiIDw8IHN0YXQuTnVtRmlsZXMgPDwgZW5kbDsNCisgICAgICBpZiAoc3RhdC5OdW1BbHRTdHJlYW1zICE9IDApDQorICAgICAgew0KKyAgICAgICAgc3RkU3RyZWFtIDw8ICJBbHRlcm5hdGUgU3RyZWFtczogIiA8PCBzdGF0Lk51bUFsdFN0cmVhbXMgPDwgZW5kbDsNCisgICAgICAgIHN0ZFN0cmVhbSA8PCAiQWx0ZXJuYXRlIFN0cmVhbXMgU2l6ZTogIiA8PCBzdGF0LkFsdFN0cmVhbXNfVW5wYWNrU2l6ZSA8PCBlbmRsOw0KKyAgICAgIH0NCisNCisgICAgICBzdGRTdHJlYW0NCisgICAgICAgICAgIDw8ICJTaXplOiAgICAgICAiIDw8IHN0YXQuVW5wYWNrU2l6ZSA8PCBlbmRsDQorICAgICAgICAgICA8PCAiQ29tcHJlc3NlZDogIiA8PCBzdGF0LlBhY2tTaXplIDw8IGVuZGw7DQorICAgICAgaWYgKGhhc2hDYWxjKQ0KKyAgICAgICAgUHJpbnRIYXNoU3RhdChzdGRTdHJlYW0sIGhiKTsNCisgICAgICB9DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgVUludDY0IG51bUVycm9ycyA9IDA7DQorICAgICAgVUludDY0IG51bVdhcm5pbmdzID0gMDsNCisgICAgICANCisgICAgICAvLyBvcHRpb25zLkV4dHJhY3ROdE9wdGlvbnMuU3RvcmVBbHRTdHJlYW1zID0gdHJ1ZSwgaWYgLXNuc1stXSBpcyBub3QgZGVmaW5tZWQNCisNCisgICAgICBocmVzdWx0TWFpbiA9IExpc3RBcmNoaXZlcygNCisgICAgICAgICAgY29kZWNzLA0KKyAgICAgICAgICB0eXBlcywNCisgICAgICAgICAgZXhjbHVkZWRGb3JtYXRzLA0KKyAgICAgICAgICBvcHRpb25zLlN0ZEluTW9kZSwNCisgICAgICAgICAgb3B0aW9ucy5BcmNoaXZlUGF0aHNTb3J0ZWQsDQorICAgICAgICAgIG9wdGlvbnMuQXJjaGl2ZVBhdGhzRnVsbFNvcnRlZCwNCisgICAgICAgICAgb3B0aW9ucy5FeHRyYWN0T3B0aW9ucy5OdE9wdGlvbnMuQWx0U3RyZWFtcy5WYWwsDQorICAgICAgICAgIG9wdGlvbnMuQWx0U3RyZWFtcy5WYWwsIC8vIHdlIGRvbid0IHdhbnQgdG8gc2hvdyBBbHRTdHJlYW1zIGJ5IGRlZmF1bHQNCisgICAgICAgICAgb3B0aW9ucy5DZW5zb3IuUGFpcnMuRnJvbnQoKS5IZWFkLA0KKyAgICAgICAgICBvcHRpb25zLkVuYWJsZUhlYWRlcnMsDQorICAgICAgICAgIG9wdGlvbnMuVGVjaE1vZGUsDQorICAgICAgICAgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgICAgICAgICBvcHRpb25zLlBhc3N3b3JkRW5hYmxlZCwNCisgICAgICAgICAgb3B0aW9ucy5QYXNzd29yZCwNCisgICAgICAgICAgI2VuZGlmDQorICAgICAgICAgICZvcHRpb25zLlByb3BlcnRpZXMsDQorICAgICAgICAgIG51bUVycm9ycywgbnVtV2FybmluZ3MpOw0KKw0KKyAgICAgICAgaWYgKG9wdGlvbnMuRW5hYmxlSGVhZGVycykNCisgICAgICAgICAgaWYgKG51bVdhcm5pbmdzID4gMCkNCisgICAgICAgICAgICBnX1N0ZE91dCA8PCBlbmRsIDw8ICJXYXJuaW5nczogIiA8PCBudW1XYXJuaW5ncyA8PCBlbmRsOw0KKyAgICAgIGlmIChudW1FcnJvcnMgPiAwKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChvcHRpb25zLkVuYWJsZUhlYWRlcnMpDQorICAgICAgICAgIGdfU3RkT3V0IDw8IGVuZGwgPDwgIkVycm9yczogIiA8PCBudW1FcnJvcnMgPDwgZW5kbDsNCisgICAgICAgIHJldENvZGUgPSBORXhpdENvZGU6OmtGYXRhbEVycm9yOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgZWxzZSBpZiAob3B0aW9ucy5Db21tYW5kLklzRnJvbVVwZGF0ZUdyb3VwKCkpDQorICB7DQorICAgIENVcGRhdGVPcHRpb25zICZ1byA9IG9wdGlvbnMuVXBkYXRlT3B0aW9uczsNCisgICAgaWYgKHVvLlNmeE1vZGUgJiYgdW8uU2Z4TW9kdWxlLklzRW1wdHkoKSkNCisgICAgICB1by5TZnhNb2R1bGUgPSBrRGVmYXVsdFNmeE1vZHVsZTsNCisNCisgICAgQ09wZW5DYWxsYmFja0NvbnNvbGUgb3BlbkNhbGxiYWNrOw0KKyAgICBvcGVuQ2FsbGJhY2suT3V0U3RyZWFtID0gJnN0ZFN0cmVhbTsNCisNCisgICAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICAgIGJvb2wgcGFzc3dvcmRJc0RlZmluZWQgPQ0KKyAgICAgICAgb3B0aW9ucy5QYXNzd29yZEVuYWJsZWQgJiYgIW9wdGlvbnMuUGFzc3dvcmQuSXNFbXB0eSgpOw0KKyAgICBvcGVuQ2FsbGJhY2suUGFzc3dvcmRJc0RlZmluZWQgPSBwYXNzd29yZElzRGVmaW5lZDsNCisgICAgb3BlbkNhbGxiYWNrLlBhc3N3b3JkID0gb3B0aW9ucy5QYXNzd29yZDsNCisgICAgI2VuZGlmDQorDQorICAgIENVcGRhdGVDYWxsYmFja0NvbnNvbGUgY2FsbGJhY2s7DQorICAgIGNhbGxiYWNrLkVuYWJsZVBlcmNlbnRzID0gb3B0aW9ucy5FbmFibGVQZXJjZW50czsNCisNCisgICAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICAgIGNhbGxiYWNrLlBhc3N3b3JkSXNEZWZpbmVkID0gcGFzc3dvcmRJc0RlZmluZWQ7DQorICAgIGNhbGxiYWNrLkFza1Bhc3N3b3JkID0gb3B0aW9ucy5QYXNzd29yZEVuYWJsZWQgJiYgb3B0aW9ucy5QYXNzd29yZC5Jc0VtcHR5KCk7DQorICAgIGNhbGxiYWNrLlBhc3N3b3JkID0gb3B0aW9ucy5QYXNzd29yZDsNCisgICAgI2VuZGlmDQorICAgIGNhbGxiYWNrLlN0ZE91dE1vZGUgPSB1by5TdGRPdXRNb2RlOw0KKyAgICBjYWxsYmFjay5Jbml0KCZzdGRTdHJlYW0pOw0KKw0KKyAgICBDVXBkYXRlRXJyb3JJbmZvIGVycm9ySW5mbzsNCisNCisgICAgLyoNCisgICAgaWYgKCF1by5Jbml0KGNvZGVjcywgdHlwZXMsIG9wdGlvbnMuQXJjaGl2ZU5hbWUpKQ0KKyAgICAgIHRocm93IGtVbnN1cHBvcnRlZFVwZGF0ZUFyY1R5cGU7DQorICAgICovDQorICAgIGhyZXN1bHRNYWluID0gVXBkYXRlQXJjaGl2ZShjb2RlY3MsDQorICAgICAgICB0eXBlcywNCisgICAgICAgIG9wdGlvbnMuQXJjaGl2ZU5hbWUsDQorICAgICAgICBvcHRpb25zLkNlbnNvciwNCisgICAgICAgIHVvLA0KKyAgICAgICAgZXJyb3JJbmZvLCAmb3BlbkNhbGxiYWNrLCAmY2FsbGJhY2ssIHRydWUpOw0KKyAgICByZXRDb2RlID0gV2FybmluZ3NDaGVjayhocmVzdWx0TWFpbiwgY2FsbGJhY2ssIGVycm9ySW5mbywgc3RkU3RyZWFtKTsNCisgIH0NCisgIGVsc2UgaWYgKG9wdGlvbnMuQ29tbWFuZC5Db21tYW5kVHlwZSA9PSBOQ29tbWFuZFR5cGU6OmtIYXNoKQ0KKyAgew0KKyAgICBjb25zdCBDSGFzaE9wdGlvbnMgJnVvID0gb3B0aW9ucy5IYXNoT3B0aW9uczsNCisNCisgICAgQ0hhc2hDYWxsYmFja0NvbnNvbGUgY2FsbGJhY2s7DQorICAgIGNhbGxiYWNrLkVuYWJsZVBlcmNlbnRzID0gb3B0aW9ucy5FbmFibGVQZXJjZW50czsNCisNCisgICAgY2FsbGJhY2suSW5pdCgmc3RkU3RyZWFtKTsNCisNCisgICAgVVN0cmluZyBlcnJvckluZm9TdHJpbmc7DQorICAgIGhyZXN1bHRNYWluID0gSGFzaENhbGMoRVhURVJOQUxfQ09ERUNTX1ZBUlMNCisgICAgICAgIG9wdGlvbnMuQ2Vuc29yLCB1bywNCisgICAgICAgIGVycm9ySW5mb1N0cmluZywgJmNhbGxiYWNrKTsNCisgICAgQ0Vycm9ySW5mbyBlcnJvckluZm87DQorICAgIGVycm9ySW5mby5NZXNzYWdlID0gZXJyb3JJbmZvU3RyaW5nOw0KKyAgICByZXRDb2RlID0gV2FybmluZ3NDaGVjayhocmVzdWx0TWFpbiwgY2FsbGJhY2ssIGVycm9ySW5mbywgc3RkU3RyZWFtKTsNCisgIH0NCisgIGVsc2UNCisgICAgU2hvd01lc3NhZ2VBbmRUaHJvd0V4Y2VwdGlvbihzdGRTdHJlYW0sIGtVc2VyRXJyb3JNZXNzYWdlLCBORXhpdENvZGU6OmtVc2VyRXJyb3IpOw0KKw0KKyAgaWYgKHNob3dTdGF0KQ0KKyAgICBQcmludFN0YXQoKTsNCisNCisgIFRocm93RXhjZXB0aW9uX2lmX0Vycm9yKGhyZXN1bHRNYWluKTsNCisNCisgIHJldHVybiByZXRDb2RlOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvTWFpbkFyLmNwcCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9NYWluQXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNWNlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvTWFpbkFyLmNwcApAQCAtMCwwICsxLDEyNSBAQAorLy8gTWFpbkFyLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015RXhjZXB0aW9uLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdGRPdXRTdHJlYW0uaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9FcnJvck1zZy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL050Q2hlY2suaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0FyY2hpdmVDb21tYW5kTGluZS5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vRXhpdENvZGUuaCINCisNCisjaW5jbHVkZSAiQ29uc29sZUNsb3NlLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KKw0KK0NTdGRPdXRTdHJlYW0gKmdfU3RkU3RyZWFtID0gMDsNCisNCitleHRlcm4gaW50IE1haW4yKA0KKyAgI2lmbmRlZiBfV0lOMzINCisgIGludCBudW1BcmdzLCBjb25zdCBjaGFyICphcmdzW10NCisgICNlbmRpZg0KKyk7DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtFeGNlcHRpb25fQ21kTGluZV9FcnJvcl9NZXNzYWdlID0gIlxuXG5Db21tYW5kIExpbmUgRXJyb3I6XG4iOw0KK3N0YXRpYyBjb25zdCBjaGFyICprRXhjZXB0aW9uRXJyb3JNZXNzYWdlID0gIlxuXG5FcnJvcjpcbiI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtVc2VyQnJlYWsgID0gIlxuQnJlYWsgc2lnbmFsZWRcbiI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtNZW1vcnlFeGNlcHRpb25NZXNzYWdlID0gIlxuXG5FUlJPUjogQ2FuJ3QgYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5IVxuIjsNCitzdGF0aWMgY29uc3QgY2hhciAqa1Vua25vd25FeGNlcHRpb25NZXNzYWdlID0gIlxuXG5Vbmtub3duIEVycm9yXG4iOw0KK3N0YXRpYyBjb25zdCBjaGFyICprSW50ZXJuYWxFeGNlcHRpb25NZXNzYWdlID0gIlxuXG5JbnRlcm5hbCBFcnJvciAjIjsNCisNCisjZGVmaW5lIE5UX0NIRUNLX0ZBSUxfQUNUSU9OICgqZ19TdGRTdHJlYW0pIDw8ICJVbnN1cHBvcnRlZCBXaW5kb3dzIHZlcnNpb24iOyByZXR1cm4gTkV4aXRDb2RlOjprRmF0YWxFcnJvcjsNCisNCitpbnQgTVlfQ0RFQ0wgbWFpbg0KKygNCisgICNpZm5kZWYgX1dJTjMyDQorICBpbnQgbnVtQXJncywgY29uc3QgY2hhciAqYXJnc1tdDQorICAjZW5kaWYNCispDQorew0KKyAgZ19TdGRTdHJlYW0gPSAmZ19TdGRPdXQ7DQorDQorICBOVF9DSEVDSw0KKw0KKyAgTkNvbnNvbGVDbG9zZTo6Q0N0cmxIYW5kbGVyU2V0dGVyIGN0cmxIYW5kbGVyU2V0dGVyOw0KKyAgaW50IHJlcyA9IDA7DQorICB0cnkNCisgIHsNCisgICAgcmVzID0gTWFpbjIoDQorICAgICNpZm5kZWYgX1dJTjMyDQorICAgIG51bUFyZ3MsIGFyZ3MNCisgICAgI2VuZGlmDQorICAgICk7DQorICB9DQorICBjYXRjaChjb25zdCBDTmV3RXhjZXB0aW9uICYpDQorICB7DQorICAgICgqZ19TdGRTdHJlYW0pIDw8IGtNZW1vcnlFeGNlcHRpb25NZXNzYWdlOw0KKyAgICByZXR1cm4gKE5FeGl0Q29kZTo6a01lbW9yeUVycm9yKTsNCisgIH0NCisgIGNhdGNoKGNvbnN0IE5Db25zb2xlQ2xvc2U6OkNDdHJsQnJlYWtFeGNlcHRpb24gJikNCisgIHsNCisgICAgKCpnX1N0ZFN0cmVhbSkgPDwgZW5kbCA8PCBrVXNlckJyZWFrOw0KKyAgICByZXR1cm4gKE5FeGl0Q29kZTo6a1VzZXJCcmVhayk7DQorICB9DQorICBjYXRjaChjb25zdCBDQXJjQ21kTGluZUV4Y2VwdGlvbiAmZSkNCisgIHsNCisgICAgKCpnX1N0ZFN0cmVhbSkgPDwga0V4Y2VwdGlvbl9DbWRMaW5lX0Vycm9yX01lc3NhZ2UgPDwgZSA8PCBlbmRsOw0KKyAgICByZXR1cm4gKE5FeGl0Q29kZTo6a1VzZXJFcnJvcik7DQorICB9DQorICBjYXRjaChjb25zdCBDU3lzdGVtRXhjZXB0aW9uICZzeXN0ZW1FcnJvcikNCisgIHsNCisgICAgaWYgKHN5c3RlbUVycm9yLkVycm9yQ29kZSA9PSBFX09VVE9GTUVNT1JZKQ0KKyAgICB7DQorICAgICAgKCpnX1N0ZFN0cmVhbSkgPDwga01lbW9yeUV4Y2VwdGlvbk1lc3NhZ2U7DQorICAgICAgcmV0dXJuIChORXhpdENvZGU6OmtNZW1vcnlFcnJvcik7DQorICAgIH0NCisgICAgaWYgKHN5c3RlbUVycm9yLkVycm9yQ29kZSA9PSBFX0FCT1JUKQ0KKyAgICB7DQorICAgICAgKCpnX1N0ZFN0cmVhbSkgPDwgZW5kbCA8PCBrVXNlckJyZWFrOw0KKyAgICAgIHJldHVybiAoTkV4aXRDb2RlOjprVXNlckJyZWFrKTsNCisgICAgfQ0KKyAgICAoKmdfU3RkU3RyZWFtKSA8PCBlbmRsIDw8IGVuZGwgPDwgIlN5c3RlbSBlcnJvcjoiIDw8IGVuZGwgPDwNCisgICAgICAgIE5FcnJvcjo6TXlGb3JtYXRNZXNzYWdlKHN5c3RlbUVycm9yLkVycm9yQ29kZSkgPDwgZW5kbDsNCisgICAgcmV0dXJuIChORXhpdENvZGU6OmtGYXRhbEVycm9yKTsNCisgIH0NCisgIGNhdGNoKE5FeGl0Q29kZTo6RUVudW0gJmV4aXRDb2RlKQ0KKyAgew0KKyAgICAoKmdfU3RkU3RyZWFtKSA8PCBrSW50ZXJuYWxFeGNlcHRpb25NZXNzYWdlIDw8IGV4aXRDb2RlIDw8IGVuZGw7DQorICAgIHJldHVybiAoZXhpdENvZGUpOw0KKyAgfQ0KKyAgLyoNCisgIGNhdGNoKGNvbnN0IE5FeGl0Q29kZTo6Q011bHRpcGxlRXJyb3JzICZtdWx0aXBsZUVycm9ycykNCisgIHsNCisgICAgKCpnX1N0ZFN0cmVhbSkgPDwgZW5kbCA8PCBtdWx0aXBsZUVycm9ycy5OdW1FcnJvcnMgPDwgIiBlcnJvcnMiIDw8IGVuZGw7DQorICAgIHJldHVybiAoTkV4aXRDb2RlOjprRmF0YWxFcnJvcik7DQorICB9DQorICAqLw0KKyAgY2F0Y2goY29uc3QgVVN0cmluZyAmcykNCisgIHsNCisgICAgKCpnX1N0ZFN0cmVhbSkgPDwga0V4Y2VwdGlvbkVycm9yTWVzc2FnZSA8PCBzIDw8IGVuZGw7DQorICAgIHJldHVybiAoTkV4aXRDb2RlOjprRmF0YWxFcnJvcik7DQorICB9DQorICBjYXRjaChjb25zdCBBU3RyaW5nICZzKQ0KKyAgew0KKyAgICAoKmdfU3RkU3RyZWFtKSA8PCBrRXhjZXB0aW9uRXJyb3JNZXNzYWdlIDw8IHMgPDwgZW5kbDsNCisgICAgcmV0dXJuIChORXhpdENvZGU6OmtGYXRhbEVycm9yKTsNCisgIH0NCisgIGNhdGNoKGNvbnN0IGNoYXIgKnMpDQorICB7DQorICAgICgqZ19TdGRTdHJlYW0pIDw8IGtFeGNlcHRpb25FcnJvck1lc3NhZ2UgPDwgcyA8PCBlbmRsOw0KKyAgICByZXR1cm4gKE5FeGl0Q29kZTo6a0ZhdGFsRXJyb3IpOw0KKyAgfQ0KKyAgY2F0Y2goaW50IHQpDQorICB7DQorICAgICgqZ19TdGRTdHJlYW0pIDw8IGtJbnRlcm5hbEV4Y2VwdGlvbk1lc3NhZ2UgPDwgdCA8PCBlbmRsOw0KKyAgICByZXR1cm4gKE5FeGl0Q29kZTo6a0ZhdGFsRXJyb3IpOw0KKyAgfQ0KKyAgY2F0Y2goLi4uKQ0KKyAgew0KKyAgICAoKmdfU3RkU3RyZWFtKSA8PCBrVW5rbm93bkV4Y2VwdGlvbk1lc3NhZ2U7DQorICAgIHJldHVybiAoTkV4aXRDb2RlOjprRmF0YWxFcnJvcik7DQorICB9DQorICByZXR1cm4gcmVzOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvT3BlbkNhbGxiYWNrQ29uc29sZS5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvT3BlbkNhbGxiYWNrQ29uc29sZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1MmQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9PcGVuQ2FsbGJhY2tDb25zb2xlLmNwcApAQCAtMCwwICsxLDU4IEBACisvLyBPcGVuQ2FsbGJhY2tDb25zb2xlLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiT3BlbkNhbGxiYWNrQ29uc29sZS5oIg0KKw0KKyNpbmNsdWRlICJDb25zb2xlQ2xvc2UuaCINCisjaW5jbHVkZSAiVXNlcklucHV0VXRpbHMuaCINCisNCitIUkVTVUxUIENPcGVuQ2FsbGJhY2tDb25zb2xlOjpPcGVuX0NoZWNrQnJlYWsoKQ0KK3sNCisgIGlmIChOQ29uc29sZUNsb3NlOjpUZXN0QnJlYWtTaWduYWwoKSkNCisgICAgcmV0dXJuIEVfQUJPUlQ7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDT3BlbkNhbGxiYWNrQ29uc29sZTo6T3Blbl9TZXRUb3RhbChjb25zdCBVSW50NjQgKiwgY29uc3QgVUludDY0ICopDQorew0KKyAgcmV0dXJuIE9wZW5fQ2hlY2tCcmVhaygpOw0KK30NCisNCitIUkVTVUxUIENPcGVuQ2FsbGJhY2tDb25zb2xlOjpPcGVuX1NldENvbXBsZXRlZChjb25zdCBVSW50NjQgKiwgY29uc3QgVUludDY0ICopDQorew0KKyAgcmV0dXJuIE9wZW5fQ2hlY2tCcmVhaygpOw0KK30NCisgDQorI2lmbmRlZiBfTk9fQ1JZUFRPDQorDQorSFJFU1VMVCBDT3BlbkNhbGxiYWNrQ29uc29sZTo6T3Blbl9DcnlwdG9HZXRUZXh0UGFzc3dvcmQoQlNUUiAqcGFzc3dvcmQpDQorew0KKyAgUGFzc3dvcmRXYXNBc2tlZCA9IHRydWU7DQorICBSSU5PSyhPcGVuX0NoZWNrQnJlYWsoKSk7DQorICBpZiAoIVBhc3N3b3JkSXNEZWZpbmVkKQ0KKyAgew0KKyAgICBQYXNzd29yZCA9IEdldFBhc3N3b3JkKE91dFN0cmVhbSk7DQorICAgIFBhc3N3b3JkSXNEZWZpbmVkID0gdHJ1ZTsNCisgIH0NCisgIHJldHVybiBTdHJpbmdUb0JzdHIoUGFzc3dvcmQsIHBhc3N3b3JkKTsNCit9DQorDQorSFJFU1VMVCBDT3BlbkNhbGxiYWNrQ29uc29sZTo6T3Blbl9HZXRQYXNzd29yZElmQW55KGJvb2wgJnBhc3N3b3JkSXNEZWZpbmVkLCBVU3RyaW5nICZwYXNzd29yZCkNCit7DQorICBwYXNzd29yZElzRGVmaW5lZCA9IFBhc3N3b3JkSXNEZWZpbmVkOw0KKyAgcGFzc3dvcmQgPSBQYXNzd29yZDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitib29sIENPcGVuQ2FsbGJhY2tDb25zb2xlOjpPcGVuX1dhc1Bhc3N3b3JkQXNrZWQoKQ0KK3sNCisgIHJldHVybiBQYXNzd29yZFdhc0Fza2VkOw0KK30NCisNCit2b2lkIENPcGVuQ2FsbGJhY2tDb25zb2xlOjpPcGVuX0NsZWFyUGFzc3dvcmRXYXNBc2tlZEZsYWcoKQ0KK3sNCisgIFBhc3N3b3JkV2FzQXNrZWQgPSBmYWxzZTsNCit9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL09wZW5DYWxsYmFja0NvbnNvbGUuaCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9PcGVuQ2FsbGJhY2tDb25zb2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkM2Y3MgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9PcGVuQ2FsbGJhY2tDb25zb2xlLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gT3BlbkNhbGxiYWNrQ29uc29sZS5oDQorDQorI2lmbmRlZiBfX09QRU5fQ0FMTEJBQ0tfQ09OU09MRV9IDQorI2RlZmluZSBfX09QRU5fQ0FMTEJBQ0tfQ09OU09MRV9IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdGRPdXRTdHJlYW0uaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0FyY2hpdmVPcGVuQ2FsbGJhY2suaCINCisNCitjbGFzcyBDT3BlbkNhbGxiYWNrQ29uc29sZTogcHVibGljIElPcGVuQ2FsbGJhY2tVSQ0KK3sNCitwdWJsaWM6DQorICBJTlRFUkZBQ0VfSU9wZW5DYWxsYmFja1VJKDspDQorICANCisgIENTdGRPdXRTdHJlYW0gKk91dFN0cmVhbTsNCisNCisgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgYm9vbCBQYXNzd29yZElzRGVmaW5lZDsNCisgIGJvb2wgUGFzc3dvcmRXYXNBc2tlZDsNCisgIFVTdHJpbmcgUGFzc3dvcmQ7DQorICBDT3BlbkNhbGxiYWNrQ29uc29sZSgpOiBQYXNzd29yZElzRGVmaW5lZChmYWxzZSksIFBhc3N3b3JkV2FzQXNrZWQoZmFsc2UpIHt9DQorICAjZW5kaWYNCit9Ow0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9QZXJjZW50UHJpbnRlci5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvUGVyY2VudFByaW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZjg4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvUGVyY2VudFByaW50ZXIuY3BwCkBAIC0wLDAgKzEsMTAyIEBACisvLyBQZXJjZW50UHJpbnRlci5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9EZWZzLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9JbnRUb1N0cmluZy5oIg0KKw0KKyNpbmNsdWRlICJQZXJjZW50UHJpbnRlci5oIg0KKw0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrUGFkZGluZ1NpemUgPSAyOw0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrUGVyY2VudHNTaXplID0gNDsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQga01heEV4dHJhU2l6ZSA9IGtQYWRkaW5nU2l6ZSArIDMyICsga1BlcmNlbnRzU2l6ZTsNCisNCitzdGF0aWMgdm9pZCBDbGVhclByZXYoY2hhciAqcCwgdW5zaWduZWQgbnVtKQ0KK3sNCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspICpwKysgPSAnXGInOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSAqcCsrID0gJyAnOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSAqcCsrID0gJ1xiJzsNCisgICpwID0gJ1wwJzsNCit9DQorDQordm9pZCBDUGVyY2VudFByaW50ZXI6OkNsb3NlUHJpbnQoKQ0KK3sNCisgIGlmIChtX051bUV4dHJhQ2hhcnMgPT0gMCkNCisgICAgcmV0dXJuOw0KKyAgY2hhciBzW2tNYXhFeHRyYVNpemUgKiAzICsgMV07DQorICBDbGVhclByZXYocywgbV9OdW1FeHRyYUNoYXJzKTsNCisgICgqT3V0U3RyZWFtKSA8PCBzOw0KKyAgbV9OdW1FeHRyYUNoYXJzID0gMDsNCit9DQorDQordm9pZCBDUGVyY2VudFByaW50ZXI6OlByaW50U3RyaW5nKGNvbnN0IGNoYXIgKnMpDQorew0KKyAgQ2xvc2VQcmludCgpOw0KKyAgKCpPdXRTdHJlYW0pIDw8IHM7DQorfQ0KKw0KK3ZvaWQgQ1BlcmNlbnRQcmludGVyOjpQcmludFN0cmluZyhjb25zdCB3Y2hhcl90ICpzKQ0KK3sNCisgIENsb3NlUHJpbnQoKTsNCisgICgqT3V0U3RyZWFtKSA8PCBzOw0KK30NCisNCit2b2lkIENQZXJjZW50UHJpbnRlcjo6UHJpbnROZXdMaW5lKCkNCit7DQorICBDbG9zZVByaW50KCk7DQorICAoKk91dFN0cmVhbSkgPDwgIlxuIjsNCit9DQorDQordm9pZCBDUGVyY2VudFByaW50ZXI6OlJlUHJpbnRSYXRpbygpDQorew0KKyAgY2hhciBzWzMyXTsNCisgIHVuc2lnbmVkIHNpemU7DQorICB7DQorICAgIGNoYXIgYyA9ICclJzsNCisgICAgVUludDY0IHZhbHVlID0gMDsNCisgICAgaWYgKG1fVG90YWwgPT0gKFVJbnQ2NCkoSW50NjQpLTEpDQorICAgIHsNCisgICAgICB2YWx1ZSA9IG1fQ3VyVmFsdWUgPj4gMjA7DQorICAgICAgYyA9ICdNJzsNCisgICAgfQ0KKyAgICBlbHNlIGlmIChtX1RvdGFsICE9IDApDQorICAgICAgdmFsdWUgPSBtX0N1clZhbHVlICogMTAwIC8gbV9Ub3RhbDsNCisgICAgQ29udmVydFVJbnQ2NFRvU3RyaW5nKHZhbHVlLCBzKTsNCisgICAgc2l6ZSA9ICh1bnNpZ25lZClzdHJsZW4ocyk7DQorICAgIHNbc2l6ZSsrXSA9IGM7DQorICAgIHNbc2l6ZV0gPSAnXDAnOw0KKyAgfQ0KKw0KKyAgdW5zaWduZWQgZXh0cmFTaXplID0ga1BhZGRpbmdTaXplICsgTXlNYXgoc2l6ZSwga1BlcmNlbnRzU2l6ZSk7DQorICBpZiAoZXh0cmFTaXplIDwgbV9OdW1FeHRyYUNoYXJzKQ0KKyAgICBleHRyYVNpemUgPSBtX051bUV4dHJhQ2hhcnM7DQorDQorICBjaGFyIGZ1bGxTdHJpbmdba01heEV4dHJhU2l6ZSAqIDNdOw0KKyAgY2hhciAqcCA9IGZ1bGxTdHJpbmc7DQorICB1bnNpZ25lZCBpOw0KKyAgaWYgKG1fTnVtRXh0cmFDaGFycyA9PSAwKQ0KKyAgew0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZXh0cmFTaXplOyBpKyspDQorICAgICAgKnArKyA9ICcgJzsNCisgICAgbV9OdW1FeHRyYUNoYXJzID0gZXh0cmFTaXplOw0KKyAgfQ0KKw0KKyAgZm9yIChpID0gMDsgaSA8IG1fTnVtRXh0cmFDaGFyczsgaSsrKQ0KKyAgICAqcCsrID0gJ1xiJzsNCisgIG1fTnVtRXh0cmFDaGFycyA9IGV4dHJhU2l6ZTsNCisgIGZvciAoOyBzaXplIDwgZXh0cmFTaXplOyBzaXplKyspDQorICAgICpwKysgPSAnICc7DQorICBNeVN0cmluZ0NvcHkocCwgcyk7DQorICAoKk91dFN0cmVhbSkgPDwgZnVsbFN0cmluZzsNCisgIE91dFN0cmVhbS0+Rmx1c2goKTsNCisgIG1fUHJldlZhbHVlID0gbV9DdXJWYWx1ZTsNCit9DQorDQordm9pZCBDUGVyY2VudFByaW50ZXI6OlByaW50UmF0aW8oKQ0KK3sNCisgIGlmIChtX0N1clZhbHVlIDwgbV9QcmV2VmFsdWUgKyBtX01pblN0ZXBTaXplICYmDQorICAgICAgbV9DdXJWYWx1ZSArIG1fTWluU3RlcFNpemUgPiBtX1ByZXZWYWx1ZSAmJiBtX051bUV4dHJhQ2hhcnMgIT0gMCkNCisgICAgcmV0dXJuOw0KKyAgUmVQcmludFJhdGlvKCk7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9QZXJjZW50UHJpbnRlci5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL1BlcmNlbnRQcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiMzU3YQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9QZXJjZW50UHJpbnRlci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vIFBlcmNlbnRQcmludGVyLmgNCisNCisjaWZuZGVmIF9fUEVSQ0VOVF9QUklOVEVSX0gNCisjZGVmaW5lIF9fUEVSQ0VOVF9QUklOVEVSX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0ZE91dFN0cmVhbS5oIg0KKw0KK2NsYXNzIENQZXJjZW50UHJpbnRlcg0KK3sNCisgIFVJbnQ2NCBtX01pblN0ZXBTaXplOw0KKyAgVUludDY0IG1fUHJldlZhbHVlOw0KKyAgVUludDY0IG1fQ3VyVmFsdWU7DQorICBVSW50NjQgbV9Ub3RhbDsNCisgIHVuc2lnbmVkIG1fTnVtRXh0cmFDaGFyczsNCitwdWJsaWM6DQorICBDU3RkT3V0U3RyZWFtICpPdXRTdHJlYW07DQorDQorICBDUGVyY2VudFByaW50ZXIoVUludDY0IG1pblN0ZXBTaXplID0gMSk6IG1fTWluU3RlcFNpemUobWluU3RlcFNpemUpLA0KKyAgICAgIG1fUHJldlZhbHVlKDApLCBtX0N1clZhbHVlKDApLCBtX1RvdGFsKChVSW50NjQpKEludDY0KS0xKSwgbV9OdW1FeHRyYUNoYXJzKDApIHt9DQorICB2b2lkIFNldFRvdGFsKFVJbnQ2NCB0b3RhbCkgeyBtX1RvdGFsID0gdG90YWw7IG1fUHJldlZhbHVlID0gMDsgfQ0KKyAgdm9pZCBTZXRSYXRpbyhVSW50NjQgZG9uZVZhbHVlKSB7IG1fQ3VyVmFsdWUgPSBkb25lVmFsdWU7IH0NCisgIHZvaWQgUHJpbnRTdHJpbmcoY29uc3QgY2hhciAqcyk7DQorICB2b2lkIFByaW50U3RyaW5nKGNvbnN0IHdjaGFyX3QgKnMpOw0KKyAgdm9pZCBQcmludE5ld0xpbmUoKTsNCisgIHZvaWQgQ2xvc2VQcmludCgpOw0KKyAgdm9pZCBSZVByaW50UmF0aW8oKTsNCisgIHZvaWQgUHJpbnRSYXRpbygpOw0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL1N0ZEFmeC5jcHAgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvU3RkQWZ4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmQzYjFmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL1N0ZEFmeC5jcHAKQEAgLTAsMCArMSwzIEBACisvLyBTdGRBZnguY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9TdGRBZnguaCBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9TdGRBZnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQ5YWMxCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL1N0ZEFmeC5oCkBAIC0wLDAgKzEsOCBAQAorLy8gU3RkQWZ4LmgNCisNCisjaWZuZGVmIF9fU1REQUZYX0gNCisjZGVmaW5lIF9fU1REQUZYX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0NvbW1vbi5oIg0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9VcGRhdGVDYWxsYmFja0NvbnNvbGUuY3BwIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL1VwZGF0ZUNhbGxiYWNrQ29uc29sZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzZDcwYgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9VcGRhdGVDYWxsYmFja0NvbnNvbGUuY3BwCkBAIC0wLDAgKzEsMjc2IEBACisvLyBVcGRhdGVDYWxsYmFja0NvbnNvbGUuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0Vycm9yTXNnLmgiDQorI2lmbmRlZiBfN1pJUF9TVA0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1N5bmNocm9uaXphdGlvbi5oIg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICJDb25zb2xlQ2xvc2UuaCINCisjaW5jbHVkZSAiVXNlcklucHV0VXRpbHMuaCINCisjaW5jbHVkZSAiVXBkYXRlQ2FsbGJhY2tDb25zb2xlLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KKw0KKyNpZm5kZWYgXzdaSVBfU1QNCitzdGF0aWMgTlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbiBnX0NyaXRpY2FsU2VjdGlvbjsNCisjZGVmaW5lIE1UX0xPQ0sgTlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbkxvY2sgbG9jayhnX0NyaXRpY2FsU2VjdGlvbik7DQorI2Vsc2UNCisjZGVmaW5lIE1UX0xPQ0sNCisjZW5kaWYNCisNCitzdGF0aWMgY29uc3Qgd2NoYXJfdCAqa0VtcHR5RmlsZUFsaWFzID0gTCJbQ29udGVudF0iOw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICprQ3JlYXRpbmdBcmNoaXZlTWVzc2FnZSA9ICJDcmVhdGluZyBhcmNoaXZlICI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtVcGRhdGluZ0FyY2hpdmVNZXNzYWdlID0gIlVwZGF0aW5nIGFyY2hpdmUgIjsNCitzdGF0aWMgY29uc3QgY2hhciAqa1NjYW5uaW5nTWVzc2FnZSA9ICJTY2FubmluZyI7DQorDQorDQorSFJFU1VMVCBDVXBkYXRlQ2FsbGJhY2tDb25zb2xlOjpPcGVuUmVzdWx0KGNvbnN0IHdjaGFyX3QgKm5hbWUsIEhSRVNVTFQgcmVzdWx0LCBjb25zdCB3Y2hhcl90ICplcnJvckFyY1R5cGUpDQorew0KKyAgKCpPdXRTdHJlYW0pIDw8IGVuZGw7DQorICBpZiAocmVzdWx0ICE9IFNfT0spDQorICB7DQorICAgICgqT3V0U3RyZWFtKSA8PCAiRXJyb3I6ICIgPDwgbmFtZTsNCisgICAgaWYgKGVycm9yQXJjVHlwZSkNCisgICAgICAoKk91dFN0cmVhbSkgPDwgIiA6IGNhbiBub3Qgb3BlbiB0aGUgZmlsZSBhcyBbIiA8PCBlcnJvckFyY1R5cGUgPDwgIl0gYXJjaGl2ZSI7DQorICAgIGVsc2UNCisgICAgICAoKk91dFN0cmVhbSkgPDwgIiBpcyBub3Qgc3VwcG9ydGVkIGFyY2hpdmUiOw0KKyAgICAoKk91dFN0cmVhbSkgPDwgZW5kbDsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENVcGRhdGVDYWxsYmFja0NvbnNvbGU6OlN0YXJ0U2Nhbm5pbmcoKQ0KK3sNCisgICgqT3V0U3RyZWFtKSA8PCBrU2Nhbm5pbmdNZXNzYWdlOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ1VwZGF0ZUNhbGxiYWNrQ29uc29sZTo6U2NhblByb2dyZXNzKFVJbnQ2NCAvKiBudW1Gb2xkZXJzICovLCBVSW50NjQgLyogbnVtRmlsZXMgKi8sIFVJbnQ2NCAvKiB0b3RhbFNpemUgKi8sIGNvbnN0IHdjaGFyX3QgKiAvKiBwYXRoICovLCBib29sIC8qIGlzRGlyICovKQ0KK3sNCisgIHJldHVybiBDaGVja0JyZWFrKCk7DQorfQ0KKw0KK0hSRVNVTFQgQ0NhbGxiYWNrQ29uc29sZUJhc2U6OkNhbk5vdEZpbmRFcnJvcl9CYXNlKGNvbnN0IHdjaGFyX3QgKm5hbWUsIERXT1JEIHN5c3RlbUVycm9yKQ0KK3sNCisgIENhbnRGaW5kRmlsZXMuQWRkKG5hbWUpOw0KKyAgQ2FudEZpbmRDb2Rlcy5BZGQoc3lzdGVtRXJyb3IpOw0KKyAgLy8gbV9QZXJjZW50UHJpbnRlci5DbG9zZVByaW50KCk7DQorICBpZiAoIW1fV2FybmluZ3NNb2RlKQ0KKyAgew0KKyAgICAoKk91dFN0cmVhbSkgPDwgZW5kbCA8PCBlbmRsOw0KKyAgICBtX1BlcmNlbnRQcmludGVyLlByaW50TmV3TGluZSgpOw0KKyAgICBtX1dhcm5pbmdzTW9kZSA9IHRydWU7DQorICB9DQorICBtX1BlcmNlbnRQcmludGVyLlByaW50U3RyaW5nKG5hbWUpOw0KKyAgbV9QZXJjZW50UHJpbnRlci5QcmludFN0cmluZygiOiAgV0FSTklORzogIik7DQorICBtX1BlcmNlbnRQcmludGVyLlByaW50U3RyaW5nKE5FcnJvcjo6TXlGb3JtYXRNZXNzYWdlKHN5c3RlbUVycm9yKSk7DQorICBtX1BlcmNlbnRQcmludGVyLlByaW50TmV3TGluZSgpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ1VwZGF0ZUNhbGxiYWNrQ29uc29sZTo6Q2FuTm90RmluZEVycm9yKGNvbnN0IHdjaGFyX3QgKm5hbWUsIERXT1JEIHN5c3RlbUVycm9yKQ0KK3sNCisgIHJldHVybiBDYW5Ob3RGaW5kRXJyb3JfQmFzZShuYW1lLCBzeXN0ZW1FcnJvcik7DQorfQ0KKw0KK0hSRVNVTFQgQ1VwZGF0ZUNhbGxiYWNrQ29uc29sZTo6RmluaXNoU2Nhbm5pbmcoKQ0KK3sNCisgICgqT3V0U3RyZWFtKSA8PCBlbmRsIDw8IGVuZGw7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDVXBkYXRlQ2FsbGJhY2tDb25zb2xlOjpTdGFydEFyY2hpdmUoY29uc3Qgd2NoYXJfdCAqbmFtZSwgYm9vbCB1cGRhdGluZykNCit7DQorICBpZih1cGRhdGluZykNCisgICAgKCpPdXRTdHJlYW0pIDw8IGtVcGRhdGluZ0FyY2hpdmVNZXNzYWdlOw0KKyAgZWxzZQ0KKyAgICAoKk91dFN0cmVhbSkgPDwga0NyZWF0aW5nQXJjaGl2ZU1lc3NhZ2U7DQorICBpZiAobmFtZSAhPSAwKQ0KKyAgICAoKk91dFN0cmVhbSkgPDwgbmFtZTsNCisgIGVsc2UNCisgICAgKCpPdXRTdHJlYW0pIDw8ICJTdGRPdXQiOw0KKyAgKCpPdXRTdHJlYW0pIDw8IGVuZGwgPDwgZW5kbDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENVcGRhdGVDYWxsYmFja0NvbnNvbGU6OkZpbmlzaEFyY2hpdmUoKQ0KK3sNCisgICgqT3V0U3RyZWFtKSA8PCBlbmRsOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ1VwZGF0ZUNhbGxiYWNrQ29uc29sZTo6Q2hlY2tCcmVhaygpDQorew0KKyAgaWYgKE5Db25zb2xlQ2xvc2U6OlRlc3RCcmVha1NpZ25hbCgpKQ0KKyAgICByZXR1cm4gRV9BQk9SVDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENVcGRhdGVDYWxsYmFja0NvbnNvbGU6OkZpbmlsaXplKCkNCit7DQorICBNVF9MT0NLDQorICBpZiAobV9OZWVkQmVDbG9zZWQpDQorICB7DQorICAgIGlmIChFbmFibGVQZXJjZW50cykNCisgICAgew0KKyAgICAgIG1fUGVyY2VudFByaW50ZXIuQ2xvc2VQcmludCgpOw0KKyAgICB9DQorICAgIGlmICghU3RkT3V0TW9kZSAmJiBtX05lZWROZXdMaW5lKQ0KKyAgICB7DQorICAgICAgbV9QZXJjZW50UHJpbnRlci5QcmludE5ld0xpbmUoKTsNCisgICAgICBtX05lZWROZXdMaW5lID0gZmFsc2U7DQorICAgIH0NCisgICAgbV9OZWVkQmVDbG9zZWQgPSBmYWxzZTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENVcGRhdGVDYWxsYmFja0NvbnNvbGU6OlNldE51bUZpbGVzKFVJbnQ2NCAvKiBudW1GaWxlcyAqLykNCit7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDVXBkYXRlQ2FsbGJhY2tDb25zb2xlOjpTZXRUb3RhbChVSW50NjQgc2l6ZSkNCit7DQorICBNVF9MT0NLDQorICBpZiAoRW5hYmxlUGVyY2VudHMpDQorICAgIG1fUGVyY2VudFByaW50ZXIuU2V0VG90YWwoc2l6ZSk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDVXBkYXRlQ2FsbGJhY2tDb25zb2xlOjpTZXRDb21wbGV0ZWQoY29uc3QgVUludDY0ICpjb21wbGV0ZVZhbHVlKQ0KK3sNCisgIE1UX0xPQ0sNCisgIGlmIChjb21wbGV0ZVZhbHVlICE9IE5VTEwpDQorICB7DQorICAgIGlmIChFbmFibGVQZXJjZW50cykNCisgICAgew0KKyAgICAgIG1fUGVyY2VudFByaW50ZXIuU2V0UmF0aW8oKmNvbXBsZXRlVmFsdWUpOw0KKyAgICAgIG1fUGVyY2VudFByaW50ZXIuUHJpbnRSYXRpbygpOw0KKyAgICAgIG1fTmVlZEJlQ2xvc2VkID0gdHJ1ZTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKE5Db25zb2xlQ2xvc2U6OlRlc3RCcmVha1NpZ25hbCgpKQ0KKyAgICByZXR1cm4gRV9BQk9SVDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENVcGRhdGVDYWxsYmFja0NvbnNvbGU6OlNldFJhdGlvSW5mbyhjb25zdCBVSW50NjQgKiAvKiBpblNpemUgKi8sIGNvbnN0IFVJbnQ2NCAqIC8qIG91dFNpemUgKi8pDQorew0KKyAgaWYgKE5Db25zb2xlQ2xvc2U6OlRlc3RCcmVha1NpZ25hbCgpKQ0KKyAgICByZXR1cm4gRV9BQk9SVDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENVcGRhdGVDYWxsYmFja0NvbnNvbGU6OkdldFN0cmVhbShjb25zdCB3Y2hhcl90ICpuYW1lLCBib29sIGlzQW50aSkNCit7DQorICBNVF9MT0NLDQorICBpZiAoU3RkT3V0TW9kZSkNCisgICAgcmV0dXJuIFNfT0s7DQorICBpZihpc0FudGkpDQorICAgIG1fUGVyY2VudFByaW50ZXIuUHJpbnRTdHJpbmcoIkFudGkgaXRlbSAgICAiKTsNCisgIGVsc2UNCisgICAgbV9QZXJjZW50UHJpbnRlci5QcmludFN0cmluZygiQ29tcHJlc3NpbmcgICIpOw0KKyAgaWYgKG5hbWVbMF0gPT0gMCkNCisgICAgbmFtZSA9IGtFbXB0eUZpbGVBbGlhczsNCisgIG1fUGVyY2VudFByaW50ZXIuUHJpbnRTdHJpbmcobmFtZSk7DQorICBpZiAoRW5hYmxlUGVyY2VudHMpDQorICAgIG1fUGVyY2VudFByaW50ZXIuUmVQcmludFJhdGlvKCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDVXBkYXRlQ2FsbGJhY2tDb25zb2xlOjpPcGVuRmlsZUVycm9yKGNvbnN0IHdjaGFyX3QgKm5hbWUsIERXT1JEIHN5c3RlbUVycm9yKQ0KK3sNCisgIE1UX0xPQ0sNCisgIEZhaWxlZENvZGVzLkFkZChzeXN0ZW1FcnJvcik7DQorICBGYWlsZWRGaWxlcy5BZGQobmFtZSk7DQorICAvKg0KKyAgaWYgKHN5c3RlbUVycm9yID09IEVSUk9SX1NIQVJJTkdfVklPTEFUSU9OKQ0KKyAgew0KKyAgKi8NCisgICAgbV9QZXJjZW50UHJpbnRlci5DbG9zZVByaW50KCk7DQorICAgIG1fUGVyY2VudFByaW50ZXIuUHJpbnROZXdMaW5lKCk7DQorICAgIG1fUGVyY2VudFByaW50ZXIuUHJpbnRTdHJpbmcoIldBUk5JTkc6ICIpOw0KKyAgICBtX1BlcmNlbnRQcmludGVyLlByaW50U3RyaW5nKE5FcnJvcjo6TXlGb3JtYXRNZXNzYWdlKHN5c3RlbUVycm9yKSk7DQorICAgIHJldHVybiBTX0ZBTFNFOw0KKyAgLyoNCisgIH0NCisgIHJldHVybiBzeXN0ZW1FcnJvcjsNCisgICovDQorfQ0KKw0KK0hSRVNVTFQgQ1VwZGF0ZUNhbGxiYWNrQ29uc29sZTo6U2V0T3BlcmF0aW9uUmVzdWx0KEludDMyICkNCit7DQorICBtX05lZWRCZUNsb3NlZCA9IHRydWU7DQorICBtX05lZWROZXdMaW5lID0gdHJ1ZTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENVcGRhdGVDYWxsYmFja0NvbnNvbGU6OkNyeXB0b0dldFRleHRQYXNzd29yZDIoSW50MzIgKnBhc3N3b3JkSXNEZWZpbmVkLCBCU1RSICpwYXNzd29yZCkNCit7DQorICAqcGFzc3dvcmQgPSBOVUxMOw0KKw0KKyAgI2lmZGVmIF9OT19DUllQVE8NCisNCisgICpwYXNzd29yZElzRGVmaW5lZCA9IGZhbHNlOw0KKyAgcmV0dXJuIFNfT0s7DQorICANCisgICNlbHNlDQorICANCisgIGlmICghUGFzc3dvcmRJc0RlZmluZWQpDQorICB7DQorICAgIGlmIChBc2tQYXNzd29yZCkNCisgICAgew0KKyAgICAgIFBhc3N3b3JkID0gR2V0UGFzc3dvcmQoT3V0U3RyZWFtKTsNCisgICAgICBQYXNzd29yZElzRGVmaW5lZCA9IHRydWU7DQorICAgIH0NCisgIH0NCisgICpwYXNzd29yZElzRGVmaW5lZCA9IEJvb2xUb0ludChQYXNzd29yZElzRGVmaW5lZCk7DQorICByZXR1cm4gU3RyaW5nVG9Cc3RyKFBhc3N3b3JkLCBwYXNzd29yZCk7DQorICANCisgICNlbmRpZg0KK30NCisNCitIUkVTVUxUIENVcGRhdGVDYWxsYmFja0NvbnNvbGU6OkNyeXB0b0dldFRleHRQYXNzd29yZChCU1RSICpwYXNzd29yZCkNCit7DQorICAqcGFzc3dvcmQgPSBOVUxMOw0KKw0KKyAgI2lmZGVmIF9OT19DUllQVE8NCisNCisgIHJldHVybiBFX05PVElNUEw7DQorICANCisgICNlbHNlDQorICANCisgIGlmICghUGFzc3dvcmRJc0RlZmluZWQpDQorICB7DQorICAgIHsNCisgICAgICBQYXNzd29yZCA9IEdldFBhc3N3b3JkKE91dFN0cmVhbSk7DQorICAgICAgUGFzc3dvcmRJc0RlZmluZWQgPSB0cnVlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gU3RyaW5nVG9Cc3RyKFBhc3N3b3JkLCBwYXNzd29yZCk7DQorICANCisgICNlbmRpZg0KK30NCisNCisvKg0KK0hSRVNVTFQgQ1VwZGF0ZUNhbGxiYWNrQ29uc29sZTo6U2hvd0RlbGV0ZUZpbGUoY29uc3Qgd2NoYXJfdCAqbmFtZSkNCit7DQorICAvLyBNVF9MT0NLDQorICBpZiAoU3RkT3V0TW9kZSkNCisgICAgcmV0dXJuIFNfT0s7DQorICBSSU5PSyhGaW5pbGl6ZSgpKTsNCisgIG1fUGVyY2VudFByaW50ZXIuUHJpbnRTdHJpbmcoIkRlbGV0aW5nICAiKTsNCisgIGlmIChuYW1lWzBdID09IDApDQorICAgIG5hbWUgPSBrRW1wdHlGaWxlQWxpYXM7DQorICBtX1BlcmNlbnRQcmludGVyLlByaW50U3RyaW5nKG5hbWUpOw0KKyAgaWYgKEVuYWJsZVBlcmNlbnRzKQ0KKyAgICBtX1BlcmNlbnRQcmludGVyLlJlUHJpbnRSYXRpbygpOw0KKyAgbV9OZWVkQmVDbG9zZWQgPSB0cnVlOw0KKyAgbV9OZWVkTmV3TGluZSA9IHRydWU7DQorICByZXR1cm4gU19PSzsNCit9DQorKi8NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvVXBkYXRlQ2FsbGJhY2tDb25zb2xlLmggYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvVXBkYXRlQ2FsbGJhY2tDb25zb2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczZGU2NwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9VcGRhdGVDYWxsYmFja0NvbnNvbGUuaApAQCAtMCwwICsxLDc1IEBACisvLyBVcGRhdGVDYWxsYmFja0NvbnNvbGUuaA0KKw0KKyNpZm5kZWYgX19VUERBVEVfQ0FMTEJBQ0tfQ09OU09MRV9IDQorI2RlZmluZSBfX1VQREFURV9DQUxMQkFDS19DT05TT0xFX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0ZE91dFN0cmVhbS5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vVXBkYXRlLmgiDQorDQorI2luY2x1ZGUgIlBlcmNlbnRQcmludGVyLmgiDQorDQorY2xhc3MgQ0NhbGxiYWNrQ29uc29sZUJhc2UNCit7DQorICBib29sIG1fV2FybmluZ3NNb2RlOw0KK3Byb3RlY3RlZDoNCisgIENQZXJjZW50UHJpbnRlciBtX1BlcmNlbnRQcmludGVyOw0KKw0KKyAgQ1N0ZE91dFN0cmVhbSAqT3V0U3RyZWFtOw0KKyAgSFJFU1VMVCBDYW5Ob3RGaW5kRXJyb3JfQmFzZShjb25zdCB3Y2hhcl90ICpuYW1lLCBEV09SRCBzeXN0ZW1FcnJvcik7DQorcHVibGljOg0KKyAgYm9vbCBFbmFibGVQZXJjZW50czsNCisgIGJvb2wgU3RkT3V0TW9kZTsNCisNCisgIENDYWxsYmFja0NvbnNvbGVCYXNlKCk6DQorICAgICAgbV9QZXJjZW50UHJpbnRlcigxIDw8IDE2KSwNCisgICAgICBTdGRPdXRNb2RlKGZhbHNlKSwNCisgICAgICBFbmFibGVQZXJjZW50cyh0cnVlKSwNCisgICAgICBtX1dhcm5pbmdzTW9kZShmYWxzZSkNCisgICAgICB7fQ0KKyAgDQorICB2b2lkIEluaXQoQ1N0ZE91dFN0cmVhbSAqb3V0U3RyZWFtKQ0KKyAgew0KKyAgICBGYWlsZWRGaWxlcy5DbGVhcigpOw0KKyAgICBGYWlsZWRDb2Rlcy5DbGVhcigpOw0KKyAgICBPdXRTdHJlYW0gPSBvdXRTdHJlYW07DQorICAgIG1fUGVyY2VudFByaW50ZXIuT3V0U3RyZWFtID0gb3V0U3RyZWFtOw0KKyAgfQ0KKw0KKyAgVVN0cmluZ1ZlY3RvciBGYWlsZWRGaWxlczsNCisgIENSZWNvcmRWZWN0b3I8SFJFU1VMVD4gRmFpbGVkQ29kZXM7DQorDQorICBVU3RyaW5nVmVjdG9yIENhbnRGaW5kRmlsZXM7DQorICBDUmVjb3JkVmVjdG9yPEhSRVNVTFQ+IENhbnRGaW5kQ29kZXM7DQorfTsNCisNCitjbGFzcyBDVXBkYXRlQ2FsbGJhY2tDb25zb2xlOiBwdWJsaWMgSVVwZGF0ZUNhbGxiYWNrVUkyLCBwdWJsaWMgQ0NhbGxiYWNrQ29uc29sZUJhc2UNCit7DQorICBib29sIG1fTmVlZEJlQ2xvc2VkOw0KKyAgYm9vbCBtX05lZWROZXdMaW5lOw0KK3B1YmxpYzoNCisgICNpZm5kZWYgX05PX0NSWVBUTw0KKyAgYm9vbCBQYXNzd29yZElzRGVmaW5lZDsNCisgIFVTdHJpbmcgUGFzc3dvcmQ7DQorICBib29sIEFza1Bhc3N3b3JkOw0KKyAgI2VuZGlmDQorDQorICBDVXBkYXRlQ2FsbGJhY2tDb25zb2xlKCkNCisgICAgICAjaWZuZGVmIF9OT19DUllQVE8NCisgICAgICA6DQorICAgICAgUGFzc3dvcmRJc0RlZmluZWQoZmFsc2UpLA0KKyAgICAgIEFza1Bhc3N3b3JkKGZhbHNlKQ0KKyAgICAgICNlbmRpZg0KKyAgICAgIHt9DQorICANCisgIHZvaWQgSW5pdChDU3RkT3V0U3RyZWFtICpvdXRTdHJlYW0pDQorICB7DQorICAgIG1fTmVlZEJlQ2xvc2VkID0gZmFsc2U7DQorICAgIG1fTmVlZE5ld0xpbmUgPSBmYWxzZTsNCisgICAgQ0NhbGxiYWNrQ29uc29sZUJhc2U6OkluaXQob3V0U3RyZWFtKTsNCisgIH0NCisgIH5DVXBkYXRlQ2FsbGJhY2tDb25zb2xlKCkgeyBGaW5pbGl6ZSgpOyB9DQorICBJTlRFUkZBQ0VfSVVwZGF0ZUNhbGxiYWNrVUkyKDspDQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvVXNlcklucHV0VXRpbHMuY3BwIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL1VzZXJJbnB1dFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDYwZmIwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL1VzZXJJbnB1dFV0aWxzLmNwcApAQCAtMCwwICsxLDc2IEBACisvLyBVc2VySW5wdXRVdGlscy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdGRJblN0cmVhbS5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vU3RyaW5nQ29udmVydC5oIg0KKw0KKyNpbmNsdWRlICJVc2VySW5wdXRVdGlscy5oIg0KKw0KK3N0YXRpYyBjb25zdCBjaGFyIGtZZXMgPSAneSc7DQorc3RhdGljIGNvbnN0IGNoYXIga05vID0gJ24nOw0KK3N0YXRpYyBjb25zdCBjaGFyIGtZZXNBbGwgPSAnYSc7DQorc3RhdGljIGNvbnN0IGNoYXIga05vQWxsID0gJ3MnOw0KK3N0YXRpYyBjb25zdCBjaGFyIGtBdXRvUmVuYW1lQWxsID0gJ3UnOw0KK3N0YXRpYyBjb25zdCBjaGFyIGtRdWl0ID0gJ3EnOw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICprRmlyc3RRdWVzdGlvbk1lc3NhZ2UgPSAiP1xuIjsNCitzdGF0aWMgY29uc3QgY2hhciAqa0hlbHBRdWVzdGlvbk1lc3NhZ2UgPQ0KKyAgIihZKWVzIC8gKE4pbyAvIChBKWx3YXlzIC8gKFMpa2lwIGFsbCAvIEEodSl0byByZW5hbWUgYWxsIC8gKFEpdWl0PyAiOw0KKw0KKy8vIHJldHVybiB0cnVlIGlmIHByZXNzZWQgUXVpdGU7DQorDQorTlVzZXJBbnN3ZXJNb2RlOjpFRW51bSBTY2FuVXNlclllc05vQWxsUXVpdChDU3RkT3V0U3RyZWFtICpvdXRTdHJlYW0pDQorew0KKyAgKCpvdXRTdHJlYW0pIDw8IGtGaXJzdFF1ZXN0aW9uTWVzc2FnZTsNCisgIGZvciAoOzspDQorICB7DQorICAgICgqb3V0U3RyZWFtKSA8PCBrSGVscFF1ZXN0aW9uTWVzc2FnZTsNCisgICAgb3V0U3RyZWFtLT5GbHVzaCgpOw0KKyAgICBBU3RyaW5nIHNjYW5uZWRTdHJpbmcgPSBnX1N0ZEluLlNjYW5TdHJpbmdVbnRpbE5ld0xpbmUoKTsNCisgICAgc2Nhbm5lZFN0cmluZy5UcmltKCk7DQorICAgIGlmICghc2Nhbm5lZFN0cmluZy5Jc0VtcHR5KCkpDQorICAgICAgc3dpdGNoKDo6TXlDaGFyTG93ZXJfQXNjaWkoc2Nhbm5lZFN0cmluZ1swXSkpDQorICAgICAgew0KKyAgICAgICAgY2FzZSBrWWVzOiAgICByZXR1cm4gTlVzZXJBbnN3ZXJNb2RlOjprWWVzOw0KKyAgICAgICAgY2FzZSBrTm86ICAgICByZXR1cm4gTlVzZXJBbnN3ZXJNb2RlOjprTm87DQorICAgICAgICBjYXNlIGtZZXNBbGw6IHJldHVybiBOVXNlckFuc3dlck1vZGU6OmtZZXNBbGw7DQorICAgICAgICBjYXNlIGtOb0FsbDogIHJldHVybiBOVXNlckFuc3dlck1vZGU6OmtOb0FsbDsNCisgICAgICAgIGNhc2Uga0F1dG9SZW5hbWVBbGw6IHJldHVybiBOVXNlckFuc3dlck1vZGU6OmtBdXRvUmVuYW1lQWxsOw0KKyAgICAgICAgY2FzZSBrUXVpdDogICByZXR1cm4gTlVzZXJBbnN3ZXJNb2RlOjprUXVpdDsNCisgICAgICB9DQorICB9DQorfQ0KKw0KKyNpZmRlZiBfV0lOMzINCisjaWZuZGVmIFVOREVSX0NFDQorI2RlZmluZSBNWV9ESVNBQkxFX0VDSE8NCisjZW5kaWYNCisjZW5kaWYNCisNCitVU3RyaW5nIEdldFBhc3N3b3JkKENTdGRPdXRTdHJlYW0gKm91dFN0cmVhbSkNCit7DQorICAoKm91dFN0cmVhbSkgPDwgIlxuRW50ZXIgcGFzc3dvcmQiDQorICAgICAgI2lmZGVmIE1ZX0RJU0FCTEVfRUNITw0KKyAgICAgICIgKHdpbGwgbm90IGJlIGVjaG9lZCkiDQorICAgICAgI2VuZGlmDQorICAgICAgIjoiOw0KKyAgb3V0U3RyZWFtLT5GbHVzaCgpOw0KKw0KKyAgI2lmZGVmIE1ZX0RJU0FCTEVfRUNITw0KKyAgSEFORExFIGNvbnNvbGUgPSBHZXRTdGRIYW5kbGUoU1REX0lOUFVUX0hBTkRMRSk7DQorICBib29sIHdhc0NoYW5nZWQgPSBmYWxzZTsNCisgIERXT1JEIG1vZGUgPSAwOw0KKyAgaWYgKGNvbnNvbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgJiYgY29uc29sZSAhPSAwKQ0KKyAgICBpZiAoR2V0Q29uc29sZU1vZGUoY29uc29sZSwgJm1vZGUpKQ0KKyAgICAgIHdhc0NoYW5nZWQgPSAoU2V0Q29uc29sZU1vZGUoY29uc29sZSwgbW9kZSAmIH5FTkFCTEVfRUNIT19JTlBVVCkgIT0gMCk7DQorICBVU3RyaW5nIHJlcyA9IGdfU3RkSW4uU2NhblVTdHJpbmdVbnRpbE5ld0xpbmUoKTsNCisgIGlmICh3YXNDaGFuZ2VkKQ0KKyAgICBTZXRDb25zb2xlTW9kZShjb25zb2xlLCBtb2RlKTsNCisgICgqb3V0U3RyZWFtKSA8PCAiXG4iOw0KKyAgb3V0U3RyZWFtLT5GbHVzaCgpOw0KKyAgcmV0dXJuIHJlczsNCisgICNlbHNlDQorICByZXR1cm4gZ19TdGRJbi5TY2FuVVN0cmluZ1VudGlsTmV3TGluZSgpOw0KKyAgI2VuZGlmDQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9Vc2VySW5wdXRVdGlscy5oIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL1VzZXJJbnB1dFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyNzczZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9Vc2VySW5wdXRVdGlscy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIFVzZXJJbnB1dFV0aWxzLmgNCisNCisjaWZuZGVmIF9fVVNFUl9JTlBVVF9VVElMU19IDQorI2RlZmluZSBfX1VTRVJfSU5QVVRfVVRJTFNfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vU3RkT3V0U3RyZWFtLmgiDQorDQorbmFtZXNwYWNlIE5Vc2VyQW5zd2VyTW9kZSB7DQorDQorZW51bSBFRW51bQ0KK3sNCisgIGtZZXMsDQorICBrTm8sDQorICBrWWVzQWxsLA0KKyAga05vQWxsLA0KKyAga0F1dG9SZW5hbWVBbGwsDQorICBrUXVpdA0KK307DQorfQ0KKw0KK05Vc2VyQW5zd2VyTW9kZTo6RUVudW0gU2NhblVzZXJZZXNOb0FsbFF1aXQoQ1N0ZE91dFN0cmVhbSAqb3V0U3RyZWFtKTsNCitVU3RyaW5nIEdldFBhc3N3b3JkKENTdGRPdXRTdHJlYW0gKm91dFN0cmVhbSk7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL21ha2VmaWxlIGIvbHptYS9DUFAvN3ppcC9VSS9Db25zb2xlL21ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxODFjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvbWFrZWZpbGUKQEAgLTAsMCArMSw3MSBAQAorUFJPRyA9IDd6LmV4ZQ0KK01ZX0NPTlNPTEUgPSAxDQorQ0ZMQUdTID0gJChDRkxBR1MpICBcDQorICAtREVYVEVSTkFMX0NPREVDUyBcDQorDQorIUlGTkRFRiBVTkRFUl9DRQ0KK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtRFdJTl9MT05HX1BBVEggLURfN1pJUF9MQVJHRV9QQUdFUyAtRFNVUFBPUlRfREVWSUNFX0ZJTEUNCishRU5ESUYNCisNCitDVVJSRU5UX09CSlMgPSBcDQorDQorQ09NTU9OX09CSlMgPSBcDQorICAkT1xDb21tYW5kTGluZVBhcnNlci5vYmogXA0KKyAgJE9cQ1JDLm9iaiBcDQorICAkT1xJbnRUb1N0cmluZy5vYmogXA0KKyAgJE9cTGlzdEZpbGVVdGlscy5vYmogXA0KKyAgJE9cTmV3SGFuZGxlci5vYmogXA0KKyAgJE9cU3RkSW5TdHJlYW0ub2JqIFwNCisgICRPXFN0ZE91dFN0cmVhbS5vYmogXA0KKyAgJE9cTXlTdHJpbmcub2JqIFwNCisgICRPXFN0cmluZ0NvbnZlcnQub2JqIFwNCisgICRPXFN0cmluZ1RvSW50Lm9iaiBcDQorICAkT1xVVEZDb252ZXJ0Lm9iaiBcDQorICAkT1xNeVZlY3Rvci5vYmogXA0KKyAgJE9cV2lsZGNhcmQub2JqIFwNCisNCitXSU5fT0JKUyA9IFwNCisgICRPXERMTC5vYmogXA0KKyAgJE9cRXJyb3JNc2cub2JqIFwNCisgICRPXEZpbGVEaXIub2JqIFwNCisgICRPXEZpbGVGaW5kLm9iaiBcDQorICAkT1xGaWxlSU8ub2JqIFwNCisgICRPXEZpbGVMaW5rLm9iaiBcDQorICAkT1xGaWxlTmFtZS5vYmogXA0KKyAgJE9cRmlsZVN5c3RlbS5vYmogXA0KKyAgJE9cTWVtb3J5TG9jay5vYmogXA0KKyAgJE9cUHJvcFZhcmlhbnQub2JqIFwNCisgICRPXFByb3BWYXJpYW50Q29udi5vYmogXA0KKyAgJE9cUmVnaXN0cnkub2JqIFwNCisgICRPXFN5c3RlbS5vYmogXA0KKyAgJE9cVGltZVV0aWxzLm9iaiBcDQorDQorN1pJUF9DT01NT05fT0JKUyA9IFwNCisgICRPXENyZWF0ZUNvZGVyLm9iaiBcDQorICAkT1xGaWxlUGF0aEF1dG9SZW5hbWUub2JqIFwNCisgICRPXEZpbGVTdHJlYW1zLm9iaiBcDQorICAkT1xGaWx0ZXJDb2Rlci5vYmogXA0KKyAgJE9cTGltaXRlZFN0cmVhbXMub2JqIFwNCisgICRPXE1ldGhvZFByb3BzLm9iaiBcDQorICAkT1xQcm9ncmVzc1V0aWxzLm9iaiBcDQorICAkT1xQcm9wSWQub2JqIFwNCisgICRPXFN0cmVhbU9iamVjdHMub2JqIFwNCisgICRPXFN0cmVhbVV0aWxzLm9iaiBcDQorICAkT1xVbmlxQmxvY2tzLm9iaiBcDQorDQorQVJfQ09NTU9OX09CSlMgPSBcDQorICAkT1xPdXRTdHJlYW1XaXRoQ1JDLm9iaiBcDQorDQorQ09NUFJFU1NfT0JKUyA9IFwNCisgICRPXENvcHlDb2Rlci5vYmogXA0KKw0KK0NfT0JKUyA9IFwNCisgICRPXEFsbG9jLm9iaiBcDQorICAkT1xDcHVBcmNoLm9iaiBcDQorICAkT1xTb3J0Lm9iaiBcDQorICAkT1xUaHJlYWRzLm9iaiBcDQorDQorIWluY2x1ZGUgIi4uLy4uL0NyYy5tYWsiDQorIWluY2x1ZGUgIkNvbnNvbGUubWFrIg0KKw0KKyFpbmNsdWRlICIuLi8uLi83emlwLm1hayINCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvcmVzb3VyY2UucmMgYi9sem1hL0NQUC83emlwL1VJL0NvbnNvbGUvcmVzb3VyY2UucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkZmVlMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvQ29uc29sZS9yZXNvdXJjZS5yYwpAQCAtMCwwICsxLDMgQEAKKyNpbmNsdWRlICIuLi8uLi9NeVZlcnNpb25JbmZvLnJjIg0KKw0KK01ZX1ZFUlNJT05fSU5GT19BUFAoIjctWmlwIENvbnNvbGUiLCAiN3oiKQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvRXhwbG9yZXIvTXlNZXNzYWdlcy5jcHAgYi9sem1hL0NQUC83emlwL1VJL0V4cGxvcmVyL015TWVzc2FnZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZjBkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0V4cGxvcmVyL015TWVzc2FnZXMuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIE15TWVzc2FnZXMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJNeU1lc3NhZ2VzLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRXJyb3JNc2cuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9SZXNvdXJjZVN0cmluZy5oIg0KKw0KKyNpbmNsdWRlICIuLi9GaWxlTWFuYWdlci9MYW5nVXRpbHMuaCINCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQorDQordm9pZCBTaG93RXJyb3JNZXNzYWdlKEhXTkQgd2luZG93LCBMUENXU1RSIG1lc3NhZ2UpDQorew0KKyAgOjpNZXNzYWdlQm94Vyh3aW5kb3csIG1lc3NhZ2UsIEwiNy1aaXAiLCBNQl9PSyB8IE1CX0lDT05TVE9QKTsNCit9DQorDQordm9pZCBTaG93RXJyb3JNZXNzYWdlSHduZFJlcyhIV05EIHdpbmRvdywgVUlOVCByZXNJRCkNCit7DQorICBTaG93RXJyb3JNZXNzYWdlKHdpbmRvdywgTGFuZ1N0cmluZyhyZXNJRCkpOw0KK30NCisNCit2b2lkIFNob3dFcnJvck1lc3NhZ2VSZXMoVUlOVCByZXNJRCkNCit7DQorICBTaG93RXJyb3JNZXNzYWdlSHduZFJlcygwLCByZXNJRCk7DQorfQ0KKw0KK3ZvaWQgU2hvd0Vycm9yTWVzc2FnZURXT1JEKEhXTkQgd2luZG93LCBEV09SRCBlcnJvckNvZGUpDQorew0KKyAgU2hvd0Vycm9yTWVzc2FnZSh3aW5kb3csIE5FcnJvcjo6TXlGb3JtYXRNZXNzYWdlKGVycm9yQ29kZSkpOw0KK30NCisNCit2b2lkIFNob3dMYXN0RXJyb3JNZXNzYWdlKEhXTkQgd2luZG93KQ0KK3sNCisgIFNob3dFcnJvck1lc3NhZ2VEV09SRCh3aW5kb3csIDo6R2V0TGFzdEVycm9yKCkpOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0V4cGxvcmVyL015TWVzc2FnZXMuaCBiL2x6bWEvQ1BQLzd6aXAvVUkvRXhwbG9yZXIvTXlNZXNzYWdlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNzVlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0V4cGxvcmVyL015TWVzc2FnZXMuaApAQCAtMCwwICsxLDE2IEBACisvLyBNeU1lc3NhZ2VzLmgNCisNCisjaWZuZGVmIF9fTVlfTUVTU0FHRVNfSA0KKyNkZWZpbmUgX19NWV9NRVNTQUdFU19IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeVN0cmluZy5oIg0KKw0KK3ZvaWQgU2hvd0Vycm9yTWVzc2FnZShIV05EIHdpbmRvdywgTFBDV1NUUiBtZXNzYWdlKTsNCitpbmxpbmUgdm9pZCBTaG93RXJyb3JNZXNzYWdlKExQQ1dTVFIgbWVzc2FnZSkgeyBTaG93RXJyb3JNZXNzYWdlKDAsIG1lc3NhZ2UpOyB9DQorDQordm9pZCBTaG93RXJyb3JNZXNzYWdlSHduZFJlcyhIV05EIHdpbmRvdywgVUludDMyIGxhbmdJRCk7DQordm9pZCBTaG93RXJyb3JNZXNzYWdlUmVzKFVJbnQzMiBsYW5nSUQpOw0KKw0KK3ZvaWQgU2hvd0xhc3RFcnJvck1lc3NhZ2UoSFdORCB3aW5kb3cgPSAwKTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0Jyb3dzZURpYWxvZy5jcHAgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0Jyb3dzZURpYWxvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI2MzgzNQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvQnJvd3NlRGlhbG9nLmNwcApAQCAtMCwwICsxLDEwMDggQEAKKy8vIEJyb3dzZURpYWxvZy5jcHANCisgDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpZm5kZWYgVU5ERVJfQ0UNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9Db21tb25EaWFsb2cuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9TaGVsbC5oIg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVOYW1lLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZUZpbmQuaCINCisNCisjaWZkZWYgVU5ERVJfQ0UNCisjaW5jbHVkZSA8Y29tbWRsZy5oPg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICJCcm93c2VEaWFsb2cuaCINCisNCisjZGVmaW5lIFVTRV9NWV9CUk9XU0VfRElBTE9HDQorDQorI2lmZGVmIFVTRV9NWV9CUk9XU0VfRElBTE9HDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9EZWZzLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9JbnRUb1N0cmluZy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vV2lsZGNhcmQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlRGlyLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvUHJvcFZhcmlhbnRDb252LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvQ29udHJvbC9Db21ib0JveC5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0NvbnRyb2wvRGlhbG9nLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvQ29udHJvbC9FZGl0LmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvQ29udHJvbC9MaXN0Vmlldy5oIg0KKw0KKyNpbmNsdWRlICJCcm93c2VEaWFsb2dSZXMuaCINCisjaW5jbHVkZSAiUHJvcGVydHlOYW1lUmVzLmgiDQorI2luY2x1ZGUgIlN5c0ljb25VdGlscy5oIg0KKw0KKyNpZm5kZWYgX1NGWA0KKyNpbmNsdWRlICJSZWdpc3RyeVV0aWxzLmgiDQorI2VuZGlmDQorDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIkNvbWJvRGlhbG9nLmgiDQorI2luY2x1ZGUgIkxhbmdVdGlscy5oIg0KKw0KKyNpbmNsdWRlICJyZXNvdXJjZS5oIg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCit1c2luZyBuYW1lc3BhY2UgTkZpbGU7DQordXNpbmcgbmFtZXNwYWNlIE5OYW1lOw0KK3VzaW5nIG5hbWVzcGFjZSBORmluZDsNCisNCisjaWZkZWYgVVNFX01ZX0JST1dTRV9ESUFMT0cNCisNCitleHRlcm4gYm9vbCBnX0xWTl9JVEVNQUNUSVZBVEVfU3VwcG9ydDsNCisNCitzdGF0aWMgY29uc3QgaW50IGtQYXJlbnRJbmRleCA9IC0xOw0KK3N0YXRpYyBjb25zdCBVSU5UIGtfTWVzc2FnZV9SZWZyZXNoUGF0aEVkaXQgPSBXTV9BUFAgKyAxOw0KKw0KK3N0YXRpYyBIUkVTVUxUIEdldE5vcm1hbGl6ZWRFcnJvcigpDQorew0KKyAgRFdPUkQgZXJyb3JDb2RlID0gR2V0TGFzdEVycm9yKCk7DQorICByZXR1cm4gZXJyb3JDb2RlID09IDAgPyBFX0ZBSUwgOiBlcnJvckNvZGU7DQorfQ0KKw0KK2V4dGVybiBVU3RyaW5nIEhSZXN1bHRUb01lc3NhZ2UoSFJFU1VMVCBlcnJvckNvZGUpOw0KKw0KK3N0YXRpYyB2b2lkIE1lc3NhZ2VCb3hfRXJyb3JfR2xvYmFsKEhXTkQgd25kLCBjb25zdCB3Y2hhcl90ICptZXNzYWdlKQ0KK3sNCisgIDo6TWVzc2FnZUJveFcod25kLCBtZXNzYWdlLCBMIjctWmlwIiwgTUJfSUNPTkVSUk9SKTsNCit9DQorDQorc3RhdGljIHZvaWQgTWVzc2FnZUJveF9IUmVzRXJyb3IoSFdORCB3bmQsIEhSRVNVTFQgZXJyb3JDb2RlLCBjb25zdCB3Y2hhcl90ICpuYW1lKQ0KK3sNCisgIFVTdHJpbmcgcyA9IEhSZXN1bHRUb01lc3NhZ2UoZXJyb3JDb2RlKTsNCisgIGlmIChuYW1lKQ0KKyAgew0KKyAgICBzICs9IEwnXG4nOw0KKyAgICBzICs9IG5hbWU7DQorICB9DQorICBNZXNzYWdlQm94X0Vycm9yX0dsb2JhbCh3bmQsIHMpOw0KK30NCisNCitjbGFzcyBDQnJvd3NlRGlhbG9nOiBwdWJsaWMgTkNvbnRyb2w6OkNNb2RhbERpYWxvZw0KK3sNCisgIE5Db250cm9sOjpDTGlzdFZpZXcgX2xpc3Q7DQorICBOQ29udHJvbDo6Q0VkaXQgX3BhdGhFZGl0Ow0KKyAgTkNvbnRyb2w6OkNDb21ib0JveCBfZmlsdGVyQ29tYm87DQorDQorICBDT2JqZWN0VmVjdG9yPENGaWxlSW5mbz4gX2ZpbGVzOw0KKw0KKyAgQ0V4dFRvSWNvbk1hcCBfZXh0VG9JY29uTWFwOw0KKyAgaW50IF9zb3J0SW5kZXg7DQorICBib29sIF9hc2NlbmRpbmc7DQorICBib29sIF9zaG93RG90czsNCisgIFVTdHJpbmcgX3RvcERpclByZWZpeDsgLy8gd2UgZG9uJ3Qgb3BlbiBwYXJlbnQgb2YgdGhhdCBmb2xkZXINCisgIFVTdHJpbmcgRGlyUHJlZml4Ow0KKw0KKyAgdmlydHVhbCBib29sIE9uSW5pdCgpOw0KKyAgdmlydHVhbCBib29sIE9uU2l6ZShXUEFSQU0gd1BhcmFtLCBpbnQgeFNpemUsIGludCB5U2l6ZSk7DQorICB2aXJ0dWFsIGJvb2wgT25NZXNzYWdlKFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7DQorICB2aXJ0dWFsIGJvb2wgT25Ob3RpZnkoVUlOVCBjb250cm9sSUQsIExQTk1IRFIgaGVhZGVyKTsNCisgIHZpcnR1YWwgYm9vbCBPbktleURvd24oTFBOTUxWS0VZRE9XTiBrZXlEb3duSW5mbyk7DQorICB2aXJ0dWFsIGJvb2wgT25CdXR0b25DbGlja2VkKGludCBidXR0b25JRCwgSFdORCBidXR0b25IV05EKTsNCisgIHZpcnR1YWwgdm9pZCBPbk9LKCk7DQorDQorICB2b2lkIFBvc3RfUmVmcmVzaFBhdGhFZGl0KCkgeyBQb3N0TWVzc2FnZShrX01lc3NhZ2VfUmVmcmVzaFBhdGhFZGl0KTsgfQ0KKw0KKyAgYm9vbCBHZXRQYXJlbnRQYXRoKGNvbnN0IFVTdHJpbmcgJnBhdGgsIFVTdHJpbmcgJnBhcmVudFByZWZpeCwgVVN0cmluZyAmbmFtZSk7DQorICAvLyBSZWxvYWQgY2hhbmdlcyBEaXJQcmVmaXguIERvbid0IHNlbmQgRGlyUHJlZml4IGluIHBhdGhQcmVmaXggcGFyYW1ldGVyDQorICBIUkVTVUxUIFJlbG9hZChjb25zdCBVU3RyaW5nICZwYXRoUHJlZml4LCBjb25zdCBVU3RyaW5nICZzZWxlY3RlZE5hbWUpOw0KKyAgSFJFU1VMVCBSZWxvYWQoKTsNCisgIA0KKyAgdm9pZCBPcGVuUGFyZW50Rm9sZGVyKCk7DQorICB2b2lkIFNldFBhdGhFZGl0VGV4dCgpOw0KKyAgdm9pZCBPbkNyZWF0ZURpcigpOw0KKyAgdm9pZCBPbkl0ZW1FbnRlcigpOw0KKyAgdm9pZCBGaW5pc2hPbk9LKCk7DQorDQorICBpbnQgR2V0UmVhbEl0ZW1JbmRleChpbnQgaW5kZXhJbkxpc3RWaWV3KSBjb25zdA0KKyAgew0KKyAgICBMUEFSQU0gcGFyYW07DQorICAgIGlmICghX2xpc3QuR2V0SXRlbVBhcmFtKGluZGV4SW5MaXN0VmlldywgcGFyYW0pKQ0KKyAgICAgIHJldHVybiAoaW50KS0xOw0KKyAgICByZXR1cm4gKGludClwYXJhbTsNCisgIH0NCisNCitwdWJsaWM6DQorICBib29sIEZvbGRlck1vZGU7DQorICBVU3RyaW5nIFRpdGxlOw0KKyAgVVN0cmluZyBGaWxlUGF0aDsgIC8vIGlucHV0LyByZXN1bHQgcGF0aA0KKyAgYm9vbCBTaG93QWxsRmlsZXM7DQorICBVU3RyaW5nVmVjdG9yIEZpbHRlcnM7DQorICBVU3RyaW5nIEZpbHRlckRlc2NyaXB0aW9uOw0KKw0KKyAgQ0Jyb3dzZURpYWxvZygpOiBGb2xkZXJNb2RlKGZhbHNlKSwgX3Nob3dEb3RzKGZhbHNlKSwgU2hvd0FsbEZpbGVzKHRydWUpIHt9DQorICB2b2lkIFNldEZpbHRlcihjb25zdCBVU3RyaW5nICZzKTsNCisgIElOVF9QVFIgQ3JlYXRlKEhXTkQgcGFyZW50ID0gMCkgeyByZXR1cm4gQ01vZGFsRGlhbG9nOjpDcmVhdGUoSUREX0JST1dTRSwgcGFyZW50KTsgfQ0KKyAgaW50IENvbXBhcmVJdGVtcyhMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpOw0KK307DQorDQordm9pZCBDQnJvd3NlRGlhbG9nOjpTZXRGaWx0ZXIoY29uc3QgVVN0cmluZyAmcykNCit7DQorICBGaWx0ZXJzLkNsZWFyKCk7DQorICBVU3RyaW5nIG1hc2s7DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IHMuTGVuKCk7IGkrKykNCisgIHsNCisgICAgd2NoYXJfdCBjID0gc1tpXTsNCisgICAgaWYgKGMgPT0gJzsnKQ0KKyAgICB7DQorICAgICAgaWYgKCFtYXNrLklzRW1wdHkoKSkNCisgICAgICAgIEZpbHRlcnMuQWRkKG1hc2spOw0KKyAgICAgIG1hc2suRW1wdHkoKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgbWFzayArPSBjOw0KKyAgfQ0KKyAgaWYgKCFtYXNrLklzRW1wdHkoKSkNCisgICAgRmlsdGVycy5BZGQobWFzayk7DQorICBTaG93QWxsRmlsZXMgPSBGaWx0ZXJzLklzRW1wdHkoKTsNCisgIGZvciAoaSA9IDA7IGkgPCBGaWx0ZXJzLlNpemUoKTsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCBVU3RyaW5nICZmID0gRmlsdGVyc1tpXTsNCisgICAgaWYgKGYgPT0gTCIqLioiIHx8IGYgPT0gTCIqIikNCisgICAgew0KKyAgICAgIFNob3dBbGxGaWxlcyA9IHRydWU7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCit9DQorDQorYm9vbCBDQnJvd3NlRGlhbG9nOjpPbkluaXQoKQ0KK3sNCisgICNpZmRlZiBMQU5HDQorICBMYW5nU2V0RGxnSXRlbXMoKnRoaXMsIE5VTEwsIDApOw0KKyAgI2VuZGlmDQorICBpZiAoIVRpdGxlLklzRW1wdHkoKSkNCisgICAgU2V0VGV4dChUaXRsZSk7DQorICBfbGlzdC5BdHRhY2goR2V0SXRlbShJRExfQlJPV1NFKSk7DQorICBfZmlsdGVyQ29tYm8uQXR0YWNoKEdldEl0ZW0oSURDX0JST1dTRV9GSUxURVIpKTsNCisgIF9wYXRoRWRpdC5BdHRhY2goR2V0SXRlbShJREVfQlJPV1NFX1BBVEgpKTsNCisNCisgIGlmIChGb2xkZXJNb2RlKQ0KKyAgICBIaWRlSXRlbShJRENfQlJPV1NFX0ZJTFRFUik7DQorICBlbHNlDQorICAgIEVuYWJsZUl0ZW0oSURDX0JST1dTRV9GSUxURVIsIGZhbHNlKTsNCisNCisgICNpZm5kZWYgVU5ERVJfQ0UNCisgIF9saXN0LlNldFVuaWNvZGVGb3JtYXQoKTsNCisgICNlbmRpZg0KKw0KKyAgI2lmbmRlZiBfU0ZYDQorICBpZiAoUmVhZFNpbmdsZUNsaWNrKCkpDQorICAgIF9saXN0LlNldEV4dGVuZGVkTGlzdFZpZXdTdHlsZShMVlNfRVhfT05FQ0xJQ0tBQ1RJVkFURSB8IExWU19FWF9UUkFDS1NFTEVDVCk7DQorICBfc2hvd0RvdHMgPSBSZWFkU2hvd0RvdHMoKTsNCisgICNlbmRpZg0KKw0KKyAgew0KKyAgICBVU3RyaW5nIHM7DQorICAgIGlmICghRmlsdGVyRGVzY3JpcHRpb24uSXNFbXB0eSgpKQ0KKyAgICAgIHMgPSBGaWx0ZXJEZXNjcmlwdGlvbjsNCisgICAgZWxzZSBpZiAoU2hvd0FsbEZpbGVzKQ0KKyAgICAgIHMgPSBMIiouKiI7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIEZPUl9WRUNUT1IgKGksIEZpbHRlcnMpDQorICAgICAgew0KKyAgICAgICAgaWYgKGkgIT0gMCkNCisgICAgICAgICAgcyArPSBMJyAnOw0KKyAgICAgICAgcyArPSBGaWx0ZXJzW2ldOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBfZmlsdGVyQ29tYm8uQWRkU3RyaW5nKHMpOw0KKyAgICBfZmlsdGVyQ29tYm8uU2V0Q3VyU2VsKDApOw0KKyAgfQ0KKw0KKyAgX2xpc3QuU2V0SW1hZ2VMaXN0KEdldFN5c0ltYWdlTGlzdCh0cnVlKSwgTFZTSUxfU01BTEwpOw0KKyAgX2xpc3QuU2V0SW1hZ2VMaXN0KEdldFN5c0ltYWdlTGlzdChmYWxzZSksIExWU0lMX05PUk1BTCk7DQorDQorICBfbGlzdC5JbnNlcnRDb2x1bW4oMCwgTGFuZ1N0cmluZyhJRFNfUFJPUF9OQU1FKSwgMTAwKTsNCisgIF9saXN0Lkluc2VydENvbHVtbigxLCBMYW5nU3RyaW5nKElEU19QUk9QX01USU1FKSwgMTAwKTsNCisgIHsNCisgICAgTFZfQ09MVU1OVyBjb2x1bW47DQorICAgIGNvbHVtbi5pU3ViSXRlbSA9IDI7DQorICAgIGNvbHVtbi5tYXNrID0gTFZDRl9GTVQgfCBMVkNGX1dJRFRIIHwgTFZDRl9URVhUIHwgTFZDRl9TVUJJVEVNOw0KKyAgICBjb2x1bW4uZm10ID0gTFZDRk1UX1JJR0hUOw0KKyAgICBjb2x1bW4uY3ggPSAxMDA7DQorICAgIGNvbnN0IFVTdHJpbmcgcyA9IExhbmdTdHJpbmcoSURTX1BST1BfU0laRSk7DQorICAgIGNvbHVtbi5wc3pUZXh0ID0gKHdjaGFyX3QgKikoY29uc3Qgd2NoYXJfdCAqKXM7DQorICAgIF9saXN0Lkluc2VydENvbHVtbigyLCAmY29sdW1uKTsNCisgIH0NCisNCisgIF9saXN0Lkluc2VydEl0ZW0oMCwgTCIxMjM0NTY3ODkwMTIzNDU2NyINCisgICAgICAjaWZuZGVmIFVOREVSX0NFDQorICAgICAgTCIxMjM0NTY3ODkwIg0KKyAgICAgICNlbmRpZg0KKyAgICAgICk7DQorICBfbGlzdC5TZXRTdWJJdGVtKDAsIDEsIEwiMjAwOS0wOS0wOSINCisgICAgICAjaWZuZGVmIFVOREVSX0NFDQorICAgICAgTCIgMDk6MDkiDQorICAgICAgI2VuZGlmDQorICAgICAgKTsNCisgIF9saXN0LlNldFN1Ykl0ZW0oMCwgMiwgTCI5OTk5IE1CIik7DQorICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykNCisgICAgX2xpc3QuU2V0Q29sdW1uV2lkdGhBdXRvKGkpOw0KKyAgX2xpc3QuRGVsZXRlQWxsSXRlbXMoKTsNCisNCisgIF9hc2NlbmRpbmcgPSB0cnVlOw0KKyAgX3NvcnRJbmRleCA9IDA7DQorDQorICBOb3JtYWxpemVTaXplKCk7DQorDQorICBfdG9wRGlyUHJlZml4LkVtcHR5KCk7DQorICB7DQorICAgIGludCByb290U2l6ZSA9IEdldFJvb3RQcmVmaXhTaXplKEZpbGVQYXRoKTsNCisgICAgLy8gV2UgY2FuIGdvIHVwIGZyb20gcm9vdCBmb2xkZXIgdG8gZHJpdmVzIGxpc3QNCisgICAgaWYgKE5OYW1lOjpJc0RyaXZlUGF0aChGaWxlUGF0aCkpDQorICAgICAgcm9vdFNpemUgPSAwOw0KKyAgICBlbHNlIGlmIChJc1N1cGVyUGF0aChGaWxlUGF0aCkpDQorICAgIHsNCisgICAgICBpZiAoTk5hbWU6OklzRHJpdmVQYXRoKCZGaWxlUGF0aFtrU3VwZXJQYXRoUHJlZml4U2l6ZV0pKQ0KKyAgICAgICAgcm9vdFNpemUgPSBrU3VwZXJQYXRoUHJlZml4U2l6ZTsNCisgICAgfQ0KKyAgICBfdG9wRGlyUHJlZml4LlNldEZyb20oRmlsZVBhdGgsIHJvb3RTaXplKTsNCisgIH0NCisNCisgIFVTdHJpbmcgbmFtZTsNCisgIGlmICghR2V0UGFyZW50UGF0aChGaWxlUGF0aCwgRGlyUHJlZml4LCBuYW1lKSkNCisgICAgRGlyUHJlZml4ID0gX3RvcERpclByZWZpeDsNCisNCisgIGZvcig7OykNCisgIHsNCisgICAgVVN0cmluZyBiYXNlRm9sZGVyID0gRGlyUHJlZml4Ow0KKyAgICBpZiAoUmVsb2FkKGJhc2VGb2xkZXIsIG5hbWUpID09IFNfT0spDQorICAgICAgYnJlYWs7DQorICAgIG5hbWUuRW1wdHkoKTsNCisgICAgaWYgKERpclByZWZpeC5Jc0VtcHR5KCkpDQorICAgICAgYnJlYWs7DQorICAgIFVTdHJpbmcgcGFyZW50LCBuYW1lMjsNCisgICAgR2V0UGFyZW50UGF0aChEaXJQcmVmaXgsIHBhcmVudCwgbmFtZTIpOw0KKyAgICBEaXJQcmVmaXggPSBwYXJlbnQ7DQorICB9DQorDQorICBpZiAobmFtZS5Jc0VtcHR5KCkpDQorICAgIG5hbWUgPSBGaWxlUGF0aDsNCisgIGlmIChGb2xkZXJNb2RlKQ0KKyAgICBOb3JtYWxpemVEaXJQYXRoUHJlZml4KG5hbWUpOw0KKyAgX3BhdGhFZGl0LlNldFRleHQobmFtZSk7DQorDQorICAjaWZuZGVmIFVOREVSX0NFDQorICAvKiBJZiB3ZSBjbGVhciBVSVNGX0hJREVGT0NVUywgdGhlIGZvY3VzIHJlY3RhbmdsZSBpbiBMaXN0VmlldyB3aWxsIGJlIHZpc2libGUsDQorICAgICBldmVuIGlmIHdlIHVzZSBtb3VzZSBmb3IgcHJlc3NpbmcgdGhlIGJ1dHRvbiB0byBvcGVuIHRoaXMgZGlhbG9nLiAqLw0KKyAgUG9zdE1lc3NhZ2UoTVlfX1dNX1VQREFURVVJU1RBVEUsIE1BS0VXUEFSQU0oTVlfX1VJU19DTEVBUiwgTVlfX1VJU0ZfSElERUZPQ1VTKSk7DQorICAjZW5kaWYNCisNCisgIHJldHVybiBDTW9kYWxEaWFsb2c6Ok9uSW5pdCgpOw0KK30NCisNCitib29sIENCcm93c2VEaWFsb2c6Ok9uU2l6ZShXUEFSQU0gLyogd1BhcmFtICovLCBpbnQgeFNpemUsIGludCB5U2l6ZSkNCit7DQorICBpbnQgbXgsIG15Ow0KKyAgew0KKyAgICBSRUNUIHI7DQorICAgIEdldENsaWVudFJlY3RPZkl0ZW0oSURCX0JST1dTRV9QQVJFTlQsIHIpOw0KKyAgICBteCA9IHIubGVmdDsNCisgICAgbXkgPSByLnRvcDsNCisgIH0NCisgIEludmFsaWRhdGVSZWN0KE5VTEwpOw0KKw0KKyAgaW50IHhMaW0gPSB4U2l6ZSAtIG14Ow0KKyAgew0KKyAgICBSRUNUIHI7DQorICAgIEdldENsaWVudFJlY3RPZkl0ZW0oSURUX0JST1dTRV9GT0xERVIsIHIpOw0KKyAgICBNb3ZlSXRlbShJRFRfQlJPV1NFX0ZPTERFUiwgci5sZWZ0LCByLnRvcCwgeExpbSAtIHIubGVmdCwgUkVDVF9TSVpFX1kocikpOw0KKyAgfQ0KKw0KKyAgaW50IGJ4MSwgYngyLCBieTsNCisgIEdldEl0ZW1TaXplcyhJRENBTkNFTCwgYngxLCBieSk7DQorICBHZXRJdGVtU2l6ZXMoSURPSywgYngyLCBieSk7DQorICBpbnQgeSA9IHlTaXplIC0gbXkgLSBieTsNCisgIGludCB4ID0geExpbSAtIGJ4MTsNCisgIE1vdmVJdGVtKElEQ0FOQ0VMLCB4LCB5LCBieDEsIGJ5KTsNCisgIE1vdmVJdGVtKElET0ssIHggLSBteCAtIGJ4MiwgeSwgYngyLCBieSk7DQorDQorICAvLyBZX1NpemUgb2YgQ29tYm9Cb3ggaXMgdHJpY2t5LiBTbyB3ZSB1c2UgWV9TaXplIG9mIF9wYXRoRWRpdCBpbnN0ZWFkDQorDQorICBpbnQgeVBhdGhTaXplOw0KKyAgew0KKyAgICBSRUNUIHI7DQorICAgIEdldENsaWVudFJlY3RPZkl0ZW0oSURFX0JST1dTRV9QQVRILCByKTsNCisgICAgeVBhdGhTaXplID0gUkVDVF9TSVpFX1kocik7DQorICAgIF9wYXRoRWRpdC5Nb3ZlKHIubGVmdCwgeSAtIG15IC0geVBhdGhTaXplIC0gbXkgLSB5UGF0aFNpemUsIHhMaW0gLSByLmxlZnQsIHlQYXRoU2l6ZSk7DQorICB9DQorDQorICB7DQorICAgIFJFQ1QgcjsNCisgICAgR2V0Q2xpZW50UmVjdE9mSXRlbShJRENfQlJPV1NFX0ZJTFRFUiwgcik7DQorICAgIF9maWx0ZXJDb21iby5Nb3ZlKHIubGVmdCwgeSAtIG15IC0geVBhdGhTaXplLCB4TGltIC0gci5sZWZ0LCBSRUNUX1NJWkVfWShyKSk7DQorICB9DQorDQorICB7DQorICAgIFJFQ1QgcjsNCisgICAgR2V0Q2xpZW50UmVjdE9mSXRlbShJRExfQlJPV1NFLCByKTsNCisgICAgX2xpc3QuTW92ZShyLmxlZnQsIHIudG9wLCB4TGltIC0gci5sZWZ0LCB5IC0gbXkgLSB5UGF0aFNpemUgLSBteSAtIHlQYXRoU2l6ZSAtIG15IC0gci50b3ApOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIENCcm93c2VEaWFsb2c6Ok9uTWVzc2FnZShVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pDQorew0KKyAgaWYgKG1lc3NhZ2UgPT0ga19NZXNzYWdlX1JlZnJlc2hQYXRoRWRpdCkNCisgIHsNCisgICAgU2V0UGF0aEVkaXRUZXh0KCk7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgcmV0dXJuIENNb2RhbERpYWxvZzo6T25NZXNzYWdlKG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsNCit9DQorDQorYm9vbCBDQnJvd3NlRGlhbG9nOjpPbk5vdGlmeShVSU5UIC8qIGNvbnRyb2xJRCAqLywgTFBOTUhEUiBoZWFkZXIpDQorew0KKyAgaWYgKGhlYWRlci0+aHduZEZyb20gIT0gX2xpc3QpDQorICAgIHJldHVybiBmYWxzZTsNCisgIHN3aXRjaCAoaGVhZGVyLT5jb2RlKQ0KKyAgew0KKyAgICBjYXNlIExWTl9JVEVNQUNUSVZBVEU6DQorICAgICAgaWYgKGdfTFZOX0lURU1BQ1RJVkFURV9TdXBwb3J0KQ0KKyAgICAgICAgT25JdGVtRW50ZXIoKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBOTV9EQkxDTEs6DQorICAgIGNhc2UgTk1fUkVUVVJOOiAvLyBwcm9iYWJhYmx5IGl0J3MgdW51c2VkDQorICAgICAgaWYgKCFnX0xWTl9JVEVNQUNUSVZBVEVfU3VwcG9ydCkNCisgICAgICAgIE9uSXRlbUVudGVyKCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgTFZOX0NPTFVNTkNMSUNLOg0KKyAgICB7DQorICAgICAgaW50IGluZGV4ID0gTFBOTUxJU1RWSUVXKGhlYWRlciktPmlTdWJJdGVtOw0KKyAgICAgIGlmIChpbmRleCA9PSBfc29ydEluZGV4KQ0KKyAgICAgICAgX2FzY2VuZGluZyA9ICFfYXNjZW5kaW5nOw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBfYXNjZW5kaW5nID0gKGluZGV4ID09IDApOw0KKyAgICAgICAgX3NvcnRJbmRleCA9IGluZGV4Ow0KKyAgICAgIH0NCisgICAgICBSZWxvYWQoKTsNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgICAgY2FzZSBMVk5fS0VZRE9XTjoNCisgICAgew0KKyAgICAgIGJvb2wgYm9vbFJlc3VsdCA9IE9uS2V5RG93bihMUE5NTFZLRVlET1dOKGhlYWRlcikpOw0KKyAgICAgIFBvc3RfUmVmcmVzaFBhdGhFZGl0KCk7DQorICAgICAgcmV0dXJuIGJvb2xSZXN1bHQ7DQorICAgIH0NCisgICAgY2FzZSBOTV9SQ0xJQ0s6DQorICAgIGNhc2UgTk1fQ0xJQ0s6DQorICAgIGNhc2UgTFZOX0JFR0lORFJBRzoNCisgICAgICBQb3N0X1JlZnJlc2hQYXRoRWRpdCgpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIENCcm93c2VEaWFsb2c6Ok9uS2V5RG93bihMUE5NTFZLRVlET1dOIGtleURvd25JbmZvKQ0KK3sNCisgIGJvb2wgY3RybCA9IElzS2V5RG93bihWS19DT05UUk9MKTsNCisNCisgIHN3aXRjaCAoa2V5RG93bkluZm8tPndWS2V5KQ0KKyAgew0KKyAgICBjYXNlIFZLX0JBQ0s6DQorICAgICAgT3BlblBhcmVudEZvbGRlcigpOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICBjYXNlICdSJzoNCisgICAgICBpZiAoY3RybCkNCisgICAgICB7DQorICAgICAgICBSZWxvYWQoKTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIGNhc2UgVktfRjc6DQorICAgICAgT25DcmVhdGVEaXIoKTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbCBDQnJvd3NlRGlhbG9nOjpPbkJ1dHRvbkNsaWNrZWQoaW50IGJ1dHRvbklELCBIV05EIGJ1dHRvbkhXTkQpDQorew0KKyAgc3dpdGNoIChidXR0b25JRCkNCisgIHsNCisgICAgY2FzZSBJREJfQlJPV1NFX1BBUkVOVDogT3BlblBhcmVudEZvbGRlcigpOyBicmVhazsNCisgICAgY2FzZSBJREJfQlJPV1NFX0NSRUFURV9ESVI6IE9uQ3JlYXRlRGlyKCk7IGJyZWFrOw0KKyAgICBkZWZhdWx0OiByZXR1cm4gQ01vZGFsRGlhbG9nOjpPbkJ1dHRvbkNsaWNrZWQoYnV0dG9uSUQsIGJ1dHRvbkhXTkQpOw0KKyAgfQ0KKyAgX2xpc3QuU2V0Rm9jdXMoKTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCit2b2lkIENCcm93c2VEaWFsb2c6Ok9uT0soKQ0KK3sNCisgIC8qIFdoZW4gd2UgcHJlc3MgIkVudGVyIiBpbiBsaXN0dmlldywgV2luZG93cyBzZW5kcyBtZXNzYWdlIHRvIGZpcnN0IEJ1dHRvbi4NCisgICAgIFdlIGNoZWNrIHRoYXQgbWVzc2FnZSB3YXMgZnJvbSBMaXN0VmlldzsgKi8NCisgIGlmIChHZXRGb2N1cygpID09IF9saXN0KQ0KKyAgew0KKyAgICBPbkl0ZW1FbnRlcigpOw0KKyAgICByZXR1cm47DQorICB9DQorICBGaW5pc2hPbk9LKCk7DQorfQ0KKw0KKw0KK2Jvb2wgQ0Jyb3dzZURpYWxvZzo6R2V0UGFyZW50UGF0aChjb25zdCBVU3RyaW5nICZwYXRoLCBVU3RyaW5nICZwYXJlbnRQcmVmaXgsIFVTdHJpbmcgJm5hbWUpDQorew0KKyAgcGFyZW50UHJlZml4LkVtcHR5KCk7DQorICBuYW1lLkVtcHR5KCk7DQorICBpZiAocGF0aC5Jc0VtcHR5KCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIGlmIChfdG9wRGlyUHJlZml4ID09IHBhdGgpDQorICAgIHJldHVybiBmYWxzZTsNCisgIFVTdHJpbmcgcyA9IHBhdGg7DQorICBpZiAocy5CYWNrKCkgPT0gV0NIQVJfUEFUSF9TRVBBUkFUT1IpDQorICAgIHMuRGVsZXRlQmFjaygpOw0KKyAgaWYgKHMuSXNFbXB0eSgpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBpZiAocy5CYWNrKCkgPT0gV0NIQVJfUEFUSF9TRVBBUkFUT1IpDQorICAgIHJldHVybiBmYWxzZTsNCisgIGludCBwb3MgPSBzLlJldmVyc2VGaW5kKFdDSEFSX1BBVEhfU0VQQVJBVE9SKTsNCisgIHBhcmVudFByZWZpeC5TZXRGcm9tKHMsIHBvcyArIDEpOw0KKyAgbmFtZSA9IHMuUHRyKHBvcyArIDEpOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2ludCBDQnJvd3NlRGlhbG9nOjpDb21wYXJlSXRlbXMoTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKQ0KK3sNCisgIGlmIChsUGFyYW0xID09IGtQYXJlbnRJbmRleCkgcmV0dXJuIC0xOw0KKyAgaWYgKGxQYXJhbTIgPT0ga1BhcmVudEluZGV4KSByZXR1cm4gMTsNCisgIGNvbnN0IENGaWxlSW5mbyAmZjEgPSBfZmlsZXNbKGludClsUGFyYW0xXTsNCisgIGNvbnN0IENGaWxlSW5mbyAmZjIgPSBfZmlsZXNbKGludClsUGFyYW0yXTsNCisNCisgIGJvb2wgaXNEaXIxID0gZjEuSXNEaXIoKTsNCisgIGJvb2wgaXNEaXIyID0gZjIuSXNEaXIoKTsNCisgIGlmIChpc0RpcjEgJiYgIWlzRGlyMikgcmV0dXJuIC0xOw0KKyAgaWYgKGlzRGlyMiAmJiAhaXNEaXIxKSByZXR1cm4gMTsNCisgIA0KKyAgaW50IHJlcyA9IDA7DQorICBzd2l0Y2ggKF9zb3J0SW5kZXgpDQorICB7DQorICAgIGNhc2UgMDogcmVzID0gQ29tcGFyZUZpbGVOYW1lcyhmczJ1cyhmMS5OYW1lKSwgZnMydXMoZjIuTmFtZSkpOyBicmVhazsNCisgICAgY2FzZSAxOiByZXMgPSBDb21wYXJlRmlsZVRpbWUoJmYxLk1UaW1lLCAmZjIuTVRpbWUpOyBicmVhazsNCisgICAgY2FzZSAyOiByZXMgPSBNeUNvbXBhcmUoZjEuU2l6ZSwgZjIuU2l6ZSk7IGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIF9hc2NlbmRpbmcgPyByZXM6IC1yZXM7DQorfQ0KKw0KK3N0YXRpYyBpbnQgQ0FMTEJBQ0sgQ29tcGFyZUl0ZW1zMihMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIsIExQQVJBTSBscERhdGEpDQorew0KKyAgcmV0dXJuICgoQ0Jyb3dzZURpYWxvZyAqKWxwRGF0YSktPkNvbXBhcmVJdGVtcyhsUGFyYW0xLCBsUGFyYW0yKTsNCit9DQorDQorc3RhdGljIHZvaWQgQ29udmVydFNpemVUb1N0cmluZyhVSW50NjQgdiwgd2NoYXJfdCAqcykNCit7DQorICBCeXRlIGMgPSAwOw0KKyAgICAgICBpZiAodiA+PSAoKFVJbnQ2NCkxMDAwMCA8PCAyMCkpIHsgdiA+Pj0gMzA7IGMgPSAnRyc7IH0NCisgIGVsc2UgaWYgKHYgPj0gKChVSW50NjQpMTAwMDAgPDwgMTApKSB7IHYgPj49IDIwOyBjID0gJ00nOyB9DQorICBlbHNlIGlmICh2ID49ICgoVUludDY0KTEwMDAwIDw8ICAwKSkgeyB2ID4+PSAxMDsgYyA9ICdLJzsgfQ0KKyAgQ29udmVydFVJbnQ2NFRvU3RyaW5nKHYsIHMpOw0KKyAgaWYgKGMgIT0gMCkNCisgIHsNCisgICAgcyArPSBNeVN0cmluZ0xlbihzKTsNCisgICAgKnMrKyA9ICcgJzsNCisgICAgKnMrKyA9IGM7DQorICAgICpzKysgPSAwOw0KKyAgfQ0KK30NCisNCisvLyBSZWxvYWQgY2hhbmdlcyBEaXJQcmVmaXguIERvbid0IHNlbmQgRGlyUHJlZml4IGluIHBhdGhQcmVmaXggcGFyYW1ldGVyDQorDQorSFJFU1VMVCBDQnJvd3NlRGlhbG9nOjpSZWxvYWQoY29uc3QgVVN0cmluZyAmcGF0aFByZWZpeCwgY29uc3QgVVN0cmluZyAmc2VsZWN0ZWROYW1lKQ0KK3sNCisgIENPYmplY3RWZWN0b3I8Q0ZpbGVJbmZvPiBmaWxlczsNCisgIA0KKyAgI2lmbmRlZiBVTkRFUl9DRQ0KKyAgYm9vbCBpc0RyaXZlID0gZmFsc2U7DQorICBpZiAocGF0aFByZWZpeC5Jc0VtcHR5KCkgfHwgcGF0aFByZWZpeCA9PSBrU3VwZXJQYXRoUHJlZml4KQ0KKyAgew0KKyAgICBpc0RyaXZlID0gdHJ1ZTsNCisgICAgRlN0cmluZ1ZlY3RvciBkcml2ZXM7DQorICAgIGlmICghTXlHZXRMb2dpY2FsRHJpdmVTdHJpbmdzKGRyaXZlcykpDQorICAgICAgcmV0dXJuIEdldE5vcm1hbGl6ZWRFcnJvcigpOw0KKyAgICBGT1JfVkVDVE9SIChpLCBkcml2ZXMpDQorICAgIHsNCisgICAgICBGU3RyaW5nIGQgPSBkcml2ZXNbaV07DQorICAgICAgaWYgKGQuTGVuKCkgPCAzIHx8IGQuQmFjaygpICE9ICdcXCcpDQorICAgICAgICByZXR1cm4gRV9GQUlMOw0KKyAgICAgIGQuRGVsZXRlQmFjaygpOw0KKyAgICAgIENGaWxlSW5mbyAmZmkgPSBmaWxlcy5BZGROZXcoKTsNCisgICAgICBmaS5TZXRBc0RpcigpOw0KKyAgICAgIGZpLk5hbWUgPSBkOw0KKyAgICB9DQorICB9DQorICBlbHNlDQorICAjZW5kaWYNCisgIHsNCisgICAgQ0VudW1lcmF0b3IgZW51bWVyYXRvcih1czJmcyhwYXRoUHJlZml4ICsgTCcqJykpOw0KKyAgICBmb3IgKDs7KQ0KKyAgICB7DQorICAgICAgYm9vbCBmb3VuZDsNCisgICAgICBDRmlsZUluZm8gZmk7DQorICAgICAgaWYgKCFlbnVtZXJhdG9yLk5leHQoZmksIGZvdW5kKSkNCisgICAgICAgIHJldHVybiBHZXROb3JtYWxpemVkRXJyb3IoKTsNCisgICAgICBpZiAoIWZvdW5kKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgaWYgKCFmaS5Jc0RpcigpKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChGb2xkZXJNb2RlKQ0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIGlmICghU2hvd0FsbEZpbGVzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICB1bnNpZ25lZCBpOw0KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRmlsdGVycy5TaXplKCk7IGkrKykNCisgICAgICAgICAgICBpZiAoRG9lc1dpbGRjYXJkTWF0Y2hOYW1lKEZpbHRlcnNbaV0sIGZzMnVzKGZpLk5hbWUpKSkNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBpZiAoaSA9PSBGaWx0ZXJzLlNpemUoKSkNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZmlsZXMuQWRkKGZpKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgRGlyUHJlZml4ID0gcGF0aFByZWZpeDsNCisNCisgIF9maWxlcyA9IGZpbGVzOw0KKw0KKyAgU2V0SXRlbVRleHQoSURUX0JST1dTRV9GT0xERVIsIERpclByZWZpeCk7DQorDQorICBfbGlzdC5TZXRSZWRyYXcoZmFsc2UpOw0KKyAgX2xpc3QuRGVsZXRlQWxsSXRlbXMoKTsNCisNCisgIExWSVRFTVcgaXRlbTsNCisNCisgIGludCBpbmRleCA9IDA7DQorICBpbnQgY3Vyc29ySW5kZXggPSAtMTsNCisNCisgICNpZm5kZWYgX1NGWA0KKyAgaWYgKF9zaG93RG90cyAmJiBfdG9wRGlyUHJlZml4ICE9IERpclByZWZpeCkNCisgIHsNCisgICAgaXRlbS5pSXRlbSA9IGluZGV4Ow0KKyAgICBjb25zdCBVU3RyaW5nIGl0ZW1OYW1lID0gTCIuLiI7DQorICAgIGlmIChzZWxlY3RlZE5hbWUuSXNFbXB0eSgpKQ0KKyAgICAgIGN1cnNvckluZGV4ID0gaW5kZXg7DQorICAgIGl0ZW0ubWFzayA9IExWSUZfVEVYVCB8IExWSUZfUEFSQU0gfCBMVklGX0lNQUdFOw0KKyAgICBpbnQgc3ViSXRlbSA9IDA7DQorICAgIGl0ZW0uaVN1Ykl0ZW0gPSBzdWJJdGVtKys7DQorICAgIGl0ZW0ubFBhcmFtID0ga1BhcmVudEluZGV4Ow0KKyAgICBpdGVtLnBzelRleHQgPSAod2NoYXJfdCAqKShjb25zdCB3Y2hhcl90ICopaXRlbU5hbWU7DQorICAgIGl0ZW0uaUltYWdlID0gX2V4dFRvSWNvbk1hcC5HZXRJY29uSW5kZXgoRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZLCBEaXJQcmVmaXgpOw0KKyAgICBpZiAoaXRlbS5pSW1hZ2UgPCAwKQ0KKyAgICAgIGl0ZW0uaUltYWdlID0gMDsNCisgICAgX2xpc3QuSW5zZXJ0SXRlbSgmaXRlbSk7DQorICAgIF9saXN0LlNldFN1Ykl0ZW0oaW5kZXgsIHN1Ykl0ZW0rKywgTCIiKTsNCisgICAgX2xpc3QuU2V0U3ViSXRlbShpbmRleCwgc3ViSXRlbSsrLCBMIiIpOw0KKyAgICBpbmRleCsrOw0KKyAgfQ0KKyAgI2VuZGlmDQorDQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgX2ZpbGVzLlNpemUoKTsgaSsrLCBpbmRleCsrKQ0KKyAgew0KKyAgICBpdGVtLmlJdGVtID0gaW5kZXg7DQorICAgIGNvbnN0IENGaWxlSW5mbyAmZmkgPSBfZmlsZXNbaV07DQorICAgIGNvbnN0IFVTdHJpbmcgbmFtZSA9IGZzMnVzKGZpLk5hbWUpOw0KKyAgICBpZiAoIXNlbGVjdGVkTmFtZS5Jc0VtcHR5KCkgJiYgQ29tcGFyZUZpbGVOYW1lcyhuYW1lLCBzZWxlY3RlZE5hbWUpID09IDApDQorICAgICAgY3Vyc29ySW5kZXggPSBpbmRleDsNCisgICAgaXRlbS5tYXNrID0gTFZJRl9URVhUIHwgTFZJRl9QQVJBTSB8IExWSUZfSU1BR0U7DQorICAgIGludCBzdWJJdGVtID0gMDsNCisgICAgaXRlbS5pU3ViSXRlbSA9IHN1Ykl0ZW0rKzsNCisgICAgaXRlbS5sUGFyYW0gPSBpOw0KKyAgICBpdGVtLnBzelRleHQgPSAod2NoYXJfdCAqKShjb25zdCB3Y2hhcl90ICopbmFtZTsNCisNCisgICAgY29uc3QgVVN0cmluZyBmdWxsUGF0aCA9IERpclByZWZpeCArIG5hbWU7DQorICAgICNpZm5kZWYgVU5ERVJfQ0UNCisgICAgaWYgKGlzRHJpdmUpDQorICAgIHsNCisgICAgICBpZiAoR2V0UmVhbEljb25JbmRleChmaS5OYW1lICsgRkNIQVJfUEFUSF9TRVBBUkFUT1IsIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSwgaXRlbS5pSW1hZ2UpID09IDApDQorICAgICAgICBpdGVtLmlJbWFnZSA9IDA7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAjZW5kaWYNCisgICAgICBpdGVtLmlJbWFnZSA9IF9leHRUb0ljb25NYXAuR2V0SWNvbkluZGV4KGZpLkF0dHJpYiwgZnVsbFBhdGgpOw0KKyAgICBpZiAoaXRlbS5pSW1hZ2UgPCAwKQ0KKyAgICAgIGl0ZW0uaUltYWdlID0gMDsNCisgICAgX2xpc3QuSW5zZXJ0SXRlbSgmaXRlbSk7DQorICAgIHdjaGFyX3Qgc1szMl07DQorICAgIHsNCisgICAgICBGSUxFVElNRSBmdDsNCisgICAgICBzWzBdID0gMDsNCisgICAgICBpZiAoRmlsZVRpbWVUb0xvY2FsRmlsZVRpbWUoJmZpLk1UaW1lLCAmZnQpKQ0KKyAgICAgICAgQ29udmVydEZpbGVUaW1lVG9TdHJpbmcoZnQsIHMsDQorICAgICAgICAgICAgI2lmbmRlZiBVTkRFUl9DRQ0KKyAgICAgICAgICAgICAgdHJ1ZQ0KKyAgICAgICAgICAgICNlbHNlDQorICAgICAgICAgICAgICBmYWxzZQ0KKyAgICAgICAgICAgICNlbmRpZg0KKyAgICAgICAgICAgICwgZmFsc2UpOw0KKyAgICAgIF9saXN0LlNldFN1Ykl0ZW0oaW5kZXgsIHN1Ykl0ZW0rKywgcyk7DQorICAgIH0NCisgICAgew0KKyAgICAgIHNbMF0gPSAwOw0KKyAgICAgIGlmICghZmkuSXNEaXIoKSkNCisgICAgICAgIENvbnZlcnRTaXplVG9TdHJpbmcoZmkuU2l6ZSwgcyk7DQorICAgICAgX2xpc3QuU2V0U3ViSXRlbShpbmRleCwgc3ViSXRlbSsrLCBzKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKF9saXN0LkdldEl0ZW1Db3VudCgpID4gMCAmJiBjdXJzb3JJbmRleCA+PSAwKQ0KKyAgICBfbGlzdC5TZXRJdGVtU3RhdGVfRm9jdXNlZFNlbGVjdGVkKGN1cnNvckluZGV4KTsNCisgIF9saXN0LlNvcnRJdGVtcyhDb21wYXJlSXRlbXMyLCAoTFBBUkFNKXRoaXMpOw0KKyAgaWYgKF9saXN0LkdldEl0ZW1Db3VudCgpID4gMCAmJiBjdXJzb3JJbmRleCA8IDApDQorICAgIF9saXN0LlNldEl0ZW1TdGF0ZSgwLCBMVklTX0ZPQ1VTRUQsIExWSVNfRk9DVVNFRCk7DQorICBfbGlzdC5FbnN1cmVWaXNpYmxlKF9saXN0LkdldEZvY3VzZWRJdGVtKCksIGZhbHNlKTsNCisgIF9saXN0LlNldFJlZHJhdyh0cnVlKTsNCisgIF9saXN0LkludmFsaWRhdGVSZWN0KE5VTEwsIHRydWUpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ0Jyb3dzZURpYWxvZzo6UmVsb2FkKCkNCit7DQorICBVU3RyaW5nIHNlbGVjdGVkOw0KKyAgaW50IGluZGV4ID0gX2xpc3QuR2V0TmV4dFNlbGVjdGVkSXRlbSgtMSk7DQorICBpZiAoaW5kZXggPj0gMCkNCisgIHsNCisgICAgaW50IGZpbGVJbmRleCA9IEdldFJlYWxJdGVtSW5kZXgoaW5kZXgpOw0KKyAgICBpZiAoZmlsZUluZGV4ICE9IGtQYXJlbnRJbmRleCkNCisgICAgICBzZWxlY3RlZCA9IGZzMnVzKF9maWxlc1tmaWxlSW5kZXhdLk5hbWUpOw0KKyAgfQ0KKyAgVVN0cmluZyBkaXJQYXRoVGVtcCA9IERpclByZWZpeDsNCisgIHJldHVybiBSZWxvYWQoZGlyUGF0aFRlbXAsIHNlbGVjdGVkKTsNCit9DQorDQordm9pZCBDQnJvd3NlRGlhbG9nOjpPcGVuUGFyZW50Rm9sZGVyKCkNCit7DQorICBVU3RyaW5nIHBhcmVudCwgc2VsZWN0ZWQ7DQorICBpZiAoR2V0UGFyZW50UGF0aChEaXJQcmVmaXgsIHBhcmVudCwgc2VsZWN0ZWQpKQ0KKyAgew0KKyAgICBSZWxvYWQocGFyZW50LCBzZWxlY3RlZCk7DQorICAgIFNldFBhdGhFZGl0VGV4dCgpOw0KKyAgfQ0KK30NCisNCit2b2lkIENCcm93c2VEaWFsb2c6OlNldFBhdGhFZGl0VGV4dCgpDQorew0KKyAgaW50IGluZGV4ID0gX2xpc3QuR2V0TmV4dFNlbGVjdGVkSXRlbSgtMSk7DQorICBpZiAoaW5kZXggPCAwKQ0KKyAgew0KKyAgICBpZiAoRm9sZGVyTW9kZSkNCisgICAgICBfcGF0aEVkaXQuU2V0VGV4dChEaXJQcmVmaXgpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQgZmlsZUluZGV4ID0gR2V0UmVhbEl0ZW1JbmRleChpbmRleCk7DQorICBpZiAoZmlsZUluZGV4ID09IGtQYXJlbnRJbmRleCkNCisgIHsNCisgICAgaWYgKEZvbGRlck1vZGUpDQorICAgICAgX3BhdGhFZGl0LlNldFRleHQoTCIuLiIgV1NUUklOR19QQVRIX1NFUEFSQVRPUik7DQorICAgIHJldHVybjsNCisgIH0NCisgIGNvbnN0IENGaWxlSW5mbyAmZmlsZSA9IF9maWxlc1tmaWxlSW5kZXhdOw0KKyAgaWYgKGZpbGUuSXNEaXIoKSkNCisgIHsNCisgICAgaWYgKCFGb2xkZXJNb2RlKQ0KKyAgICAgIHJldHVybjsNCisgICAgX3BhdGhFZGl0LlNldFRleHQoZnMydXMoZmlsZS5OYW1lKSArIFdDSEFSX1BBVEhfU0VQQVJBVE9SKTsNCisgIH0NCisgIGVsc2UNCisgICAgX3BhdGhFZGl0LlNldFRleHQoZnMydXMoZmlsZS5OYW1lKSk7DQorfQ0KKw0KK3ZvaWQgQ0Jyb3dzZURpYWxvZzo6T25DcmVhdGVEaXIoKQ0KK3sNCisgIFVTdHJpbmcgbmFtZTsNCisgIHsNCisgICAgVVN0cmluZyBlbnRlcmVkTmFtZTsNCisgICAgRGxnX0NyZWF0ZUZvbGRlcigoSFdORCkqdGhpcywgZW50ZXJlZE5hbWUpOw0KKyAgICBpZiAoZW50ZXJlZE5hbWUuSXNFbXB0eSgpKQ0KKyAgICAgIHJldHVybjsNCisgICAgaWYgKCFDb3JyZWN0RnNQYXRoKERpclByZWZpeCwgZW50ZXJlZE5hbWUsIG5hbWUpKQ0KKyAgICB7DQorICAgICAgTWVzc2FnZUJveF9IUmVzRXJyb3IoKEhXTkQpKnRoaXMsIEVSUk9SX0lOVkFMSURfTkFNRSwgbmFtZSk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorICBpZiAobmFtZS5Jc0VtcHR5KCkpDQorICAgIHJldHVybjsNCisNCisgIEZTdHJpbmcgZGVzdFBhdGg7DQorICBpZiAoR2V0RnVsbFBhdGgodXMyZnMoRGlyUHJlZml4KSwgdXMyZnMobmFtZSksIGRlc3RQYXRoKSkNCisgIHsNCisgICAgaWYgKCFORGlyOjpDcmVhdGVDb21wbGV4RGlyKGRlc3RQYXRoKSkNCisgICAgew0KKyAgICAgIE1lc3NhZ2VCb3hfSFJlc0Vycm9yKChIV05EKSp0aGlzLCBHZXROb3JtYWxpemVkRXJyb3IoKSwgZnMydXMoZGVzdFBhdGgpKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBVU3RyaW5nIHRlbXBQYXRoID0gRGlyUHJlZml4Ow0KKyAgICAgIFJlbG9hZCh0ZW1wUGF0aCwgbmFtZSk7DQorICAgICAgU2V0UGF0aEVkaXRUZXh0KCk7DQorICAgIH0NCisgICAgX2xpc3QuU2V0Rm9jdXMoKTsNCisgIH0NCit9DQorDQordm9pZCBDQnJvd3NlRGlhbG9nOjpPbkl0ZW1FbnRlcigpDQorew0KKyAgaW50IGluZGV4ID0gX2xpc3QuR2V0TmV4dFNlbGVjdGVkSXRlbSgtMSk7DQorICBpZiAoaW5kZXggPCAwKQ0KKyAgICByZXR1cm47DQorICBpbnQgZmlsZUluZGV4ID0gR2V0UmVhbEl0ZW1JbmRleChpbmRleCk7DQorICBpZiAoZmlsZUluZGV4ID09IGtQYXJlbnRJbmRleCkNCisgICAgT3BlblBhcmVudEZvbGRlcigpOw0KKyAgZWxzZQ0KKyAgew0KKyAgICBjb25zdCBDRmlsZUluZm8gJmZpbGUgPSBfZmlsZXNbZmlsZUluZGV4XTsNCisgICAgaWYgKCFmaWxlLklzRGlyKCkpDQorICAgIHsNCisgICAgICBpZiAoIUZvbGRlck1vZGUpDQorICAgICAgICBGaW5pc2hPbk9LKCk7DQorICAgICAgLyoNCisgICAgICBNZXNzYWdlQm94X0Vycm9yX0dsb2JhbCgqdGhpcywgRm9sZGVyTW9kZSA/DQorICAgICAgICAgICAgTCJZb3UgbXVzdCBzZWxlY3Qgc29tZSBmb2xkZXIiOg0KKyAgICAgICAgICAgIEwiWW91IG11c3Qgc2VsZWN0IHNvbWUgZmlsZSIpOw0KKyAgICAgICovDQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFVTdHJpbmcgcyA9IERpclByZWZpeCArIGZzMnVzKGZpbGUuTmFtZSkgKyBXQ0hBUl9QQVRIX1NFUEFSQVRPUjsNCisgICAgSFJFU1VMVCByZXMgPSBSZWxvYWQocywgTCIiKTsNCisgICAgaWYgKHJlcyAhPSBTX09LKQ0KKyAgICAgIE1lc3NhZ2VCb3hfSFJlc0Vycm9yKCp0aGlzLCByZXMsIHMpOw0KKyAgICBTZXRQYXRoRWRpdFRleHQoKTsNCisgIH0NCit9DQorDQordm9pZCBDQnJvd3NlRGlhbG9nOjpGaW5pc2hPbk9LKCkNCit7DQorICBVU3RyaW5nIHM7DQorICBfcGF0aEVkaXQuR2V0VGV4dChzKTsNCisgIEZTdHJpbmcgZGVzdFBhdGg7DQorICBpZiAoIUdldEZ1bGxQYXRoKHVzMmZzKERpclByZWZpeCksIHVzMmZzKHMpLCBkZXN0UGF0aCkpDQorICB7DQorICAgIE1lc3NhZ2VCb3hfSFJlc0Vycm9yKChIV05EKSp0aGlzLCBFUlJPUl9JTlZBTElEX05BTUUsIHMpOw0KKyAgICByZXR1cm47DQorICB9DQorICBGaWxlUGF0aCA9IGZzMnVzKGRlc3RQYXRoKTsNCisgIGlmIChGb2xkZXJNb2RlKQ0KKyAgICBOb3JtYWxpemVEaXJQYXRoUHJlZml4KEZpbGVQYXRoKTsNCisgIEVuZChJRE9LKTsNCit9DQorDQorI2VuZGlmDQorDQorYm9vbCBNeUJyb3dzZUZvckZvbGRlcihIV05EIG93bmVyLCBMUENXU1RSIHRpdGxlLCBMUENXU1RSIHBhdGgsIFVTdHJpbmcgJnJlc3VsdFBhdGgpDQorew0KKyAgcmVzdWx0UGF0aC5FbXB0eSgpOw0KKw0KKyAgI2lmbmRlZiBVTkRFUl9DRQ0KKw0KKyAgI2lmZGVmIFVTRV9NWV9CUk9XU0VfRElBTE9HDQorICBpZiAoIUlzU3VwZXJPckRldmljZVBhdGgocGF0aCkpDQorICAjZW5kaWYNCisgICAgcmV0dXJuIE5TaGVsbDo6QnJvd3NlRm9yRm9sZGVyKG93bmVyLCB0aXRsZSwgcGF0aCwgcmVzdWx0UGF0aCk7DQorDQorICAjZW5kaWYNCisNCisgICNpZmRlZiBVU0VfTVlfQlJPV1NFX0RJQUxPRw0KKw0KKyAgQ0Jyb3dzZURpYWxvZyBkaWFsb2c7DQorICBkaWFsb2cuRm9sZGVyTW9kZSA9IHRydWU7DQorICBpZiAodGl0bGUpDQorICAgIGRpYWxvZy5UaXRsZSA9IHRpdGxlOw0KKyAgaWYgKHBhdGgpDQorICAgIGRpYWxvZy5GaWxlUGF0aCA9IHBhdGg7DQorICBpZiAoZGlhbG9nLkNyZWF0ZShvd25lcikgIT0gSURPSykNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmVzdWx0UGF0aCA9IGRpYWxvZy5GaWxlUGF0aDsNCisgICNlbmRpZg0KKw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wgTXlCcm93c2VGb3JGaWxlKEhXTkQgb3duZXIsIExQQ1dTVFIgdGl0bGUsIExQQ1dTVFIgcGF0aCwNCisgICAgTFBDV1NUUiBmaWx0ZXJEZXNjcmlwdGlvbiwgTFBDV1NUUiBmaWx0ZXIsIFVTdHJpbmcgJnJlc3VsdFBhdGgpDQorew0KKyAgcmVzdWx0UGF0aC5FbXB0eSgpOw0KKw0KKyAgI2lmbmRlZiBVTkRFUl9DRQ0KKw0KKyAgI2lmZGVmIFVTRV9NWV9CUk9XU0VfRElBTE9HDQorICBpZiAoIUlzU3VwZXJPckRldmljZVBhdGgocGF0aCkpDQorICAjZW5kaWYNCisgIHsNCisgICAgaWYgKE15R2V0T3BlbkZpbGVOYW1lKG93bmVyLCB0aXRsZSwgTlVMTCwgcGF0aCwgZmlsdGVyRGVzY3JpcHRpb24sIGZpbHRlciwgcmVzdWx0UGF0aCkpDQorICAgICAgcmV0dXJuIHRydWU7DQorICAgICNpZmRlZiBVTkRFUl9DRQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICAgICNlbHNlDQorICAgIC8vIG1heWJlIHdlIG11c3QgdXNlIEdldExhc3RFcnJvciBpbiBXaW5DRS4NCisgICAgRFdPUkQgZXJyb3JDb2RlID0gQ29tbURsZ0V4dGVuZGVkRXJyb3IoKTsNCisgICAgY29uc3Qgd2NoYXJfdCAqZXJyb3JNZXNzYWdlID0gTlVMTDsNCisgICAgc3dpdGNoIChlcnJvckNvZGUpDQorICAgIHsNCisgICAgICBjYXNlIDA6IHJldHVybiBmYWxzZTsgLy8gY2FuY2VsIG9yIGNsb3NlIG9ibiBkaWFsb2cNCisgICAgICBjYXNlIEZORVJSX0lOVkFMSURGSUxFTkFNRTogZXJyb3JNZXNzYWdlID0gTCJJbnZhbGlkIEZpbGUgTmFtZSI7IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6IGVycm9yTWVzc2FnZSA9IEwiT3BlbiBEaWFsb2cgRXJyb3IiOw0KKyAgICB9DQorICAgIGlmICghZXJyb3JNZXNzYWdlKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgew0KKyAgICAgIFVTdHJpbmcgcyA9IGVycm9yTWVzc2FnZTsNCisgICAgICBzICs9IEwiXG4iOw0KKyAgICAgIHMgKz0gcGF0aDsNCisgICAgICBNZXNzYWdlQm94X0Vycm9yX0dsb2JhbChvd25lciwgcyk7DQorICAgIH0NCisgICAgI2VuZGlmDQorICB9DQorDQorICAjZW5kaWYNCisgIA0KKyAgI2lmZGVmIFVTRV9NWV9CUk9XU0VfRElBTE9HDQorICBDQnJvd3NlRGlhbG9nIGRpYWxvZzsNCisgIGlmICh0aXRsZSkNCisgICAgZGlhbG9nLlRpdGxlID0gdGl0bGU7DQorICBpZiAocGF0aCkNCisgICAgZGlhbG9nLkZpbGVQYXRoID0gcGF0aDsNCisgIGRpYWxvZy5Gb2xkZXJNb2RlID0gZmFsc2U7DQorICBpZiAoZmlsdGVyKQ0KKyAgICBkaWFsb2cuU2V0RmlsdGVyKGZpbHRlcik7DQorICBpZiAoZmlsdGVyRGVzY3JpcHRpb24pDQorICAgIGRpYWxvZy5GaWx0ZXJEZXNjcmlwdGlvbiA9IGZpbHRlckRlc2NyaXB0aW9uOw0KKyAgaWYgKGRpYWxvZy5DcmVhdGUob3duZXIpICE9IElET0spDQorICAgIHJldHVybiBmYWxzZTsNCisgIHJlc3VsdFBhdGggPSBkaWFsb2cuRmlsZVBhdGg7DQorICAjZW5kaWYNCisNCisgIHJldHVybiB0cnVlOw0KK30NCisNCisNCisjaWZkZWYgX1dJTjMyDQorDQorc3RhdGljIHZvaWQgUmVtb3ZlRG90c0FuZFNwYWNlcyhVU3RyaW5nICZwYXRoKQ0KK3sNCisgIHdoaWxlICghcGF0aC5Jc0VtcHR5KCkpDQorICB7DQorICAgIHdjaGFyX3QgYyA9IHBhdGguQmFjaygpOw0KKyAgICBpZiAoYyAhPSAnICcgJiYgYyAhPSAnLicpDQorICAgICAgcmV0dXJuOw0KKyAgICBwYXRoLkRlbGV0ZUJhY2soKTsNCisgIH0NCit9DQorDQorDQorYm9vbCBDb3JyZWN0RnNQYXRoKGNvbnN0IFVTdHJpbmcgJnJlbEJhc2UsIGNvbnN0IFVTdHJpbmcgJnBhdGgyLCBVU3RyaW5nICZyZXN1bHQpDQorew0KKyAgcmVzdWx0LkVtcHR5KCk7DQorDQorICBVU3RyaW5nIHBhdGggPSBwYXRoMjsNCisgIHBhdGguUmVwbGFjZSgnLycsIFdDSEFSX1BBVEhfU0VQQVJBVE9SKTsNCisgIHVuc2lnbmVkIHN0YXJ0ID0gMDsNCisgIFVTdHJpbmcgYmFzZTsNCisgIGlmIChOTmFtZTo6SXNBYnNvbHV0ZVBhdGgocGF0aCkpDQorICB7DQorICAgIGlmIChJc1N1cGVyT3JEZXZpY2VQYXRoKHBhdGgpKQ0KKyAgICB7DQorICAgICAgcmVzdWx0ID0gcGF0aDsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgICBpbnQgcG9zID0gR2V0Um9vdFByZWZpeFNpemUocGF0aCk7DQorICAgIGlmIChwb3MgPiAwKQ0KKyAgICAgIHN0YXJ0ID0gcG9zOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBpZiAoSXNTdXBlck9yRGV2aWNlUGF0aChyZWxCYXNlKSkNCisgICAgew0KKyAgICAgIHJlc3VsdCA9IHBhdGg7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgICAgYmFzZSA9IHJlbEJhc2U7DQorICB9DQorDQorICAvKiBXZSBjYW4ndCB1c2UgYmFja3dhcmQsIHNpbmNlIHdlIG11c3QgY2hhbmdlIG9ubHkgZGlzayBwYXRocyAqLw0KKyAgLyoNCisgIGZvciAoOzspDQorICB7DQorICAgIGlmIChwYXRoLkxlbigpIDw9IHN0YXJ0KQ0KKyAgICAgIGJyZWFrOw0KKyAgICBpZiAoRG9lc0ZpbGVPckRpckV4aXN0KHVzMmZzKHBhdGgpKSkNCisgICAgICBicmVhazsNCisgICAgaWYgKHBhdGguQmFjaygpID09IFdDSEFSX1BBVEhfU0VQQVJBVE9SKQ0KKyAgICB7DQorICAgICAgcGF0aC5EZWxldGVCYWNrKCk7DQorICAgICAgcmVzdWx0Lkluc2VydCgwLCBXQ0hBUl9QQVRIX1NFUEFSQVRPUik7Ow0KKyAgICB9DQorICAgIGludCBwb3MgPSBwYXRoLlJldmVyc2VGaW5kKFdDSEFSX1BBVEhfU0VQQVJBVE9SKSArIDE7DQorICAgIFVTdHJpbmcgY3VyID0gcGF0aC5QdHIocG9zKTsNCisgICAgUmVtb3ZlRG90c0FuZFNwYWNlcyhjdXIpOw0KKyAgICByZXN1bHQuSW5zZXJ0KDAsIGN1cik7DQorICAgIHBhdGguRGVsZXRlRnJvbShwb3MpOw0KKyAgfQ0KKyAgcmVzdWx0Lkluc2VydCgwLCBwYXRoKTsNCisgIHJldHVybiB0cnVlOw0KKyAgKi8NCisNCisgIHJlc3VsdCArPSBwYXRoLkxlZnQoc3RhcnQpOw0KKyAgYm9vbCBjaGVja0V4aXN0ID0gdHJ1ZTsNCisgIFVTdHJpbmcgY3VyOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgaWYgKHN0YXJ0ID09IHBhdGguTGVuKCkpDQorICAgICAgYnJlYWs7DQorICAgIGludCBzbGFzaFBvcyA9IHBhdGguRmluZChXQ0hBUl9QQVRIX1NFUEFSQVRPUiwgc3RhcnQpOw0KKyAgICBjdXIuU2V0RnJvbShwYXRoLlB0cihzdGFydCksIChzbGFzaFBvcyA8IDAgPyBwYXRoLkxlbigpIDogc2xhc2hQb3MpIC0gc3RhcnQpOw0KKyAgICBpZiAoY2hlY2tFeGlzdCkNCisgICAgew0KKyAgICAgIENGaWxlSW5mbyBmaTsNCisgICAgICBpZiAoZmkuRmluZCh1czJmcyhiYXNlICsgcmVzdWx0ICsgY3VyKSkpDQorICAgICAgew0KKyAgICAgICAgaWYgKCFmaS5Jc0RpcigpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICByZXN1bHQgPSBwYXRoOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgICAgY2hlY2tFeGlzdCA9IGZhbHNlOw0KKyAgICB9DQorICAgIGlmICghY2hlY2tFeGlzdCkNCisgICAgICBSZW1vdmVEb3RzQW5kU3BhY2VzKGN1cik7DQorICAgIHJlc3VsdCArPSBjdXI7DQorICAgIGlmIChzbGFzaFBvcyA8IDApDQorICAgICAgYnJlYWs7DQorICAgIHJlc3VsdCArPSBXQ0hBUl9QQVRIX1NFUEFSQVRPUjsNCisgICAgc3RhcnQgPSBzbGFzaFBvcyArIDE7DQorICB9DQorICANCisgIHJldHVybiB0cnVlOw0KK30NCisNCisjZWxzZQ0KK2Jvb2wgQ29ycmVjdEZzUGF0aChjb25zdCBVU3RyaW5nICYgLyogcmVsQmFzZSAqLywgY29uc3QgVVN0cmluZyAmcGF0aCwgVVN0cmluZyAmcmVzdWx0KQ0KK3sNCisgIHJlc3VsdCA9IHBhdGg7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorI2VuZGlmDQorDQorYm9vbCBEbGdfQ3JlYXRlRm9sZGVyKEhXTkQgd25kLCBVU3RyaW5nICZkZXN0TmFtZSkNCit7DQorICBkZXN0TmFtZS5FbXB0eSgpOw0KKyAgQ0NvbWJvRGlhbG9nIGRsZzsNCisgIExhbmdTdHJpbmcoSURTX0NSRUFURV9GT0xERVIsIGRsZy5UaXRsZSk7DQorICBMYW5nU3RyaW5nKElEU19DUkVBVEVfRk9MREVSX05BTUUsIGRsZy5TdGF0aWMpOw0KKyAgTGFuZ1N0cmluZyhJRFNfQ1JFQVRFX0ZPTERFUl9ERUZBVUxUX05BTUUsIGRsZy5WYWx1ZSk7DQorICBpZiAoZGxnLkNyZWF0ZSh3bmQpICE9IElET0spDQorICAgIHJldHVybiBmYWxzZTsNCisgIGRlc3ROYW1lID0gZGxnLlZhbHVlOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvQnJvd3NlRGlhbG9nLmggYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0Jyb3dzZURpYWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNmQxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0Jyb3dzZURpYWxvZy5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vIEJyb3dzZURpYWxvZy5oDQorDQorI2lmbmRlZiBfX0JST1dTRV9ESUFMT0dfSA0KKyNkZWZpbmUgX19CUk9XU0VfRElBTE9HX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015U3RyaW5nLmgiDQorDQorYm9vbCBNeUJyb3dzZUZvckZvbGRlcihIV05EIG93bmVyLCBMUENXU1RSIHRpdGxlLCBMUENXU1RSIHBhdGgsIFVTdHJpbmcgJnJlc3VsdFBhdGgpOw0KK2Jvb2wgTXlCcm93c2VGb3JGaWxlKEhXTkQgb3duZXIsIExQQ1dTVFIgdGl0bGUsIExQQ1dTVFIgcGF0aCwgTFBDV1NUUiBmaWx0ZXJEZXNjcmlwdGlvbiwgTFBDV1NUUiBmaWx0ZXIsIFVTdHJpbmcgJnJlc3VsdFBhdGgpOw0KKw0KKy8qIENvcnJlY3RGc1BhdGggcmVtb3ZlcyB1bmRlc2lyYWJsZSBjaGFyYWN0ZXJzIGluIG5hbWVzIChkb3RzIGFuZCBzcGFjZXMgYXQgdGhlIGVuZCBvZiBmaWxlKQ0KKyAgIEJ1dCBpdCBkb2Vzbid0IGNoYW5nZSAiYmFkIiBuYW1lIGluIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhZXM6DQorICAgICAtIHBhdGggaXMgU3VwZXIgUGF0aCAod2l0aCBcXD9cIHByZWZpeCkNCisgICAgIC0gcGF0aCBpcyByZWxhdGl2ZSBhbmQgcmVsQmFzZSBpcyBTdXBlciBQYXRoDQorICAgICAtIHRoZXJlIGlzIGZpbGUgb3IgZGlyIGluIGZpbGVzeXN0ZW0gd2l0aCBzcGVjaWZpZWQgImJhZCIgbmFtZSAqLw0KKw0KK2Jvb2wgQ29ycmVjdEZzUGF0aChjb25zdCBVU3RyaW5nICZyZWxCYXNlLCBjb25zdCBVU3RyaW5nICZwYXRoLCBVU3RyaW5nICZyZXN1bHQpOw0KKw0KK2Jvb2wgRGxnX0NyZWF0ZUZvbGRlcihIV05EIHduZCwgVVN0cmluZyAmZGVzdE5hbWUpOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvQnJvd3NlRGlhbG9nUmVzLmggYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0Jyb3dzZURpYWxvZ1Jlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTFiNzMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0Jyb3dzZURpYWxvZ1Jlcy5oCkBAIC0wLDAgKzEsOSBAQAorI2RlZmluZSBJRERfQlJPV1NFICA5NQ0KKw0KKyNkZWZpbmUgSURMX0JST1dTRSAgICAgICAgIDEwMA0KKyNkZWZpbmUgSURUX0JST1dTRV9GT0xERVIgIDEwMQ0KKyNkZWZpbmUgSURFX0JST1dTRV9QQVRIICAgIDEwMg0KKyNkZWZpbmUgSURDX0JST1dTRV9GSUxURVIgIDEwMw0KKw0KKyNkZWZpbmUgSURCX0JST1dTRV9QQVJFTlQgICAgIDExMA0KKyNkZWZpbmUgSURCX0JST1dTRV9DUkVBVEVfRElSIDExMg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvQ29tYm9EaWFsb2cuY3BwIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Db21ib0RpYWxvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0NmM1NgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvQ29tYm9EaWFsb2cuY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvbWJvRGlhbG9nLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisjaW5jbHVkZSAiQ29tYm9EaWFsb2cuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9Db250cm9sL1N0YXRpYy5oIg0KKw0KKyNpZmRlZiBMQU5HDQorI2luY2x1ZGUgIkxhbmdVdGlscy5oIg0KKyNlbmRpZg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCisNCitib29sIENDb21ib0RpYWxvZzo6T25Jbml0KCkNCit7DQorICAjaWZkZWYgTEFORw0KKyAgTGFuZ1NldERsZ0l0ZW1zKCp0aGlzLCBOVUxMLCAwKTsNCisgICNlbmRpZg0KKyAgX2NvbWJvQm94LkF0dGFjaChHZXRJdGVtKElEQ19DT01CTykpOw0KKw0KKyAgLyoNCisgIC8vIHdoeSBpdCBkb2Vzbid0IHdvcmsgPw0KKyAgRFdPUkQgc3R5bGUgPSBfY29tYm9Cb3guR2V0U3R5bGUoKTsNCisgIGlmIChTb3J0ZWQpDQorICAgIHN0eWxlIHw9IENCU19TT1JUOw0KKyAgZWxzZQ0KKyAgICBzdHlsZSAmPSB+Q0JTX1NPUlQ7DQorICBfY29tYm9Cb3guU2V0U3R5bGUoc3R5bGUpOw0KKyAgKi8NCisgIFNldFRleHQoVGl0bGUpOw0KKyAgDQorICBOQ29udHJvbDo6Q1N0YXRpYyBzdGF0aWNDb250b2w7DQorICBzdGF0aWNDb250b2wuQXR0YWNoKEdldEl0ZW0oSURUX0NPTUJPKSk7DQorICBzdGF0aWNDb250b2wuU2V0VGV4dChTdGF0aWMpOw0KKyAgX2NvbWJvQm94LlNldFRleHQoVmFsdWUpOw0KKyAgRk9SX1ZFQ1RPUiAoaSwgU3RyaW5ncykNCisgICAgX2NvbWJvQm94LkFkZFN0cmluZyhTdHJpbmdzW2ldKTsNCisgIE5vcm1hbGl6ZVNpemUoKTsNCisgIHJldHVybiBDTW9kYWxEaWFsb2c6Ok9uSW5pdCgpOw0KK30NCisNCitib29sIENDb21ib0RpYWxvZzo6T25TaXplKFdQQVJBTSAvKiB3UGFyYW0gKi8sIGludCB4U2l6ZSwgaW50IHlTaXplKQ0KK3sNCisgIGludCBteCwgbXk7DQorICBHZXRNYXJnaW5zKDgsIG14LCBteSk7DQorICBpbnQgYngxLCBieDIsIGJ5Ow0KKyAgR2V0SXRlbVNpemVzKElEQ0FOQ0VMLCBieDEsIGJ5KTsNCisgIEdldEl0ZW1TaXplcyhJRE9LLCBieDIsIGJ5KTsNCisgIGludCB5ID0geVNpemUgLSBteSAtIGJ5Ow0KKyAgaW50IHggPSB4U2l6ZSAtIG14IC0gYngxOw0KKw0KKyAgSW52YWxpZGF0ZVJlY3QoTlVMTCk7DQorDQorICBNb3ZlSXRlbShJRENBTkNFTCwgeCwgeSwgYngxLCBieSk7DQorICBNb3ZlSXRlbShJRE9LLCB4IC0gbXggLSBieDIsIHksIGJ4MiwgYnkpOw0KKyAgQ2hhbmdlU3ViV2luZG93U2l6ZVgoX2NvbWJvQm94LCB4U2l6ZSAtIG14ICogMik7DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK3ZvaWQgQ0NvbWJvRGlhbG9nOjpPbk9LKCkNCit7DQorICBfY29tYm9Cb3guR2V0VGV4dChWYWx1ZSk7DQorICBDTW9kYWxEaWFsb2c6Ok9uT0soKTsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Db21ib0RpYWxvZy5oIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Db21ib0RpYWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NjljZmYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0NvbWJvRGlhbG9nLmgKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29tYm9EaWFsb2cuaA0KKw0KKyNpZm5kZWYgX19DT01CT19ESUFMT0dfSA0KKyNkZWZpbmUgX19DT01CT19ESUFMT0dfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0NvbnRyb2wvQ29tYm9Cb3guaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9Db250cm9sL0RpYWxvZy5oIg0KKw0KKyNpbmNsdWRlICJDb21ib0RpYWxvZ1Jlcy5oIg0KKw0KK2NsYXNzIENDb21ib0RpYWxvZzogcHVibGljIE5XaW5kb3dzOjpOQ29udHJvbDo6Q01vZGFsRGlhbG9nDQorew0KKyAgTldpbmRvd3M6Ok5Db250cm9sOjpDQ29tYm9Cb3ggX2NvbWJvQm94Ow0KKyAgdmlydHVhbCB2b2lkIE9uT0soKTsNCisgIHZpcnR1YWwgYm9vbCBPbkluaXQoKTsNCisgIHZpcnR1YWwgYm9vbCBPblNpemUoV1BBUkFNIHdQYXJhbSwgaW50IHhTaXplLCBpbnQgeVNpemUpOw0KK3B1YmxpYzoNCisgIC8vIGJvb2wgU29ydGVkOw0KKyAgVVN0cmluZyBUaXRsZTsNCisgIFVTdHJpbmcgU3RhdGljOw0KKyAgVVN0cmluZyBWYWx1ZTsNCisgIFVTdHJpbmdWZWN0b3IgU3RyaW5nczsNCisgIA0KKyAgLy8gQ0NvbWJvRGlhbG9nKCk6IFNvcnRlZChmYWxzZSkge307DQorICBJTlRfUFRSIENyZWF0ZShIV05EIHBhcmVudFdpbmRvdyA9IDApIHsgcmV0dXJuIENNb2RhbERpYWxvZzo6Q3JlYXRlKElERF9DT01CTywgcGFyZW50V2luZG93KTsgfQ0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Db21ib0RpYWxvZ1Jlcy5oIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Db21ib0RpYWxvZ1Jlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OTM4YjYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0NvbWJvRGlhbG9nUmVzLmgKQEAgLTAsMCArMSw0IEBACisjZGVmaW5lIElERF9DT01CTyAgIDk4DQorDQorI2RlZmluZSBJRFRfQ09NQk8gIDEwMA0KKyNkZWZpbmUgSURDX0NPTUJPICAxMDENCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0RpYWxvZ1NpemUuaCBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvRGlhbG9nU2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiY2UxNTkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0RpYWxvZ1NpemUuaApAQCAtMCwwICsxLDE2IEBACisvLyBEaWFsb2dTaXplLmgNCisNCisjaWZuZGVmIF9fRElBTE9HX1NJWkVfSA0KKyNkZWZpbmUgX19ESUFMT0dfU0laRV9IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvQ29udHJvbC9EaWFsb2cuaCINCisNCisjaWZkZWYgVU5ERVJfQ0UNCisjZGVmaW5lIEJJR19ESUFMT0dfU0laRSh4LCB5KSBib29sIGlzQmlnID0gTldpbmRvd3M6Ok5Db250cm9sOjpJc0RpYWxvZ1NpemVPSyh4LCB5KTsNCisjZGVmaW5lIFNJWkVEX0RJQUxPRyhiaWcpIChpc0JpZyA/IGJpZyA6IGJpZyAjIyBfMikNCisjZWxzZQ0KKyNkZWZpbmUgQklHX0RJQUxPR19TSVpFKHgsIHkpDQorI2RlZmluZSBTSVpFRF9ESUFMT0coYmlnKSBiaWcNCisjZW5kaWYNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0V4dHJhY3RDYWxsYmFjay5jcHAgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0V4dHJhY3RDYWxsYmFjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxNGU1MgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvRXh0cmFjdENhbGxiYWNrLmNwcApAQCAtMCwwICsxLDg5OCBAQAorLy8gRXh0cmFjdENhbGxiYWNrLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0NvbVRyeS5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vSW50VG9TdHJpbmcuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0xhbmcuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9FcnJvck1zZy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVEaXIuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9GaWxlRmluZC5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1Byb3BWYXJpYW50Q29udi5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9Db21tb24vRmlsZVBhdGhBdXRvUmVuYW1lLmgiDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9TdHJlYW1VdGlscy5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vRXh0cmFjdGluZ0ZpbGVQYXRoLmgiDQorDQorI2lmbmRlZiBfU0ZYDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9aaXBSZWdpc3RyeS5oIg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICIuLi9HVUkvRXh0cmFjdFJlcy5oIg0KKw0KKyNpbmNsdWRlICJFeHRyYWN0Q2FsbGJhY2suaCINCisjaW5jbHVkZSAiRm9ybWF0VXRpbHMuaCINCisjaW5jbHVkZSAiTGFuZ1V0aWxzLmgiDQorI2luY2x1ZGUgIk92ZXJ3cml0ZURpYWxvZy5oIg0KKyNpZm5kZWYgX05PX0NSWVBUTw0KKyNpbmNsdWRlICJQYXNzd29yZERpYWxvZy5oIg0KKyNlbmRpZg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCit1c2luZyBuYW1lc3BhY2UgTkZpbGU7DQordXNpbmcgbmFtZXNwYWNlIE5GaW5kOw0KKw0KK0NFeHRyYWN0Q2FsbGJhY2tJbXA6On5DRXh0cmFjdENhbGxiYWNrSW1wKCkge30NCisNCit2b2lkIENFeHRyYWN0Q2FsbGJhY2tJbXA6OkluaXQoKQ0KK3sNCisgIE51bUFyY2hpdmVFcnJvcnMgPSAwOw0KKyAgVGhlcmVBcmVNZXNzYWdlRXJyb3JzID0gZmFsc2U7DQorICAjaWZuZGVmIF9TRlgNCisgIE51bUZvbGRlcnMgPSBOdW1GaWxlcyA9IDA7DQorICBOZWVkQWRkRmlsZSA9IGZhbHNlOw0KKyAgI2VuZGlmDQorfQ0KKw0KK3ZvaWQgQ0V4dHJhY3RDYWxsYmFja0ltcDo6QWRkRXJyb3JfTWVzc2FnZShMUENXU1RSIHMpDQorew0KKyAgVGhlcmVBcmVNZXNzYWdlRXJyb3JzID0gdHJ1ZTsNCisgIFByb2dyZXNzRGlhbG9nLT5TeW5jLkFkZEVycm9yX01lc3NhZ2Uocyk7DQorfQ0KKw0KKyNpZm5kZWYgX1NGWA0KKw0KK1NURE1FVEhPRElNUCBDRXh0cmFjdENhbGxiYWNrSW1wOjpTZXROdW1GaWxlcyhVSW50NjQNCisgICNpZm5kZWYgX1NGWA0KKyAgbnVtRmlsZXMNCisgICNlbmRpZg0KKyAgKQ0KK3sNCisgICNpZm5kZWYgX1NGWA0KKyAgUHJvZ3Jlc3NEaWFsb2ctPlN5bmMuU2V0X051bUZpbGVzVG90YWwobnVtRmlsZXMpOw0KKyAgI2VuZGlmDQorICByZXR1cm4gU19PSzsNCit9DQorDQorI2VuZGlmDQorDQorU1RETUVUSE9ESU1QIENFeHRyYWN0Q2FsbGJhY2tJbXA6OlNldFRvdGFsKFVJbnQ2NCB0b3RhbCkNCit7DQorICBQcm9ncmVzc0RpYWxvZy0+U3luYy5TZXRfTnVtQnl0ZXNUb3RhbCh0b3RhbCk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorU1RETUVUSE9ESU1QIENFeHRyYWN0Q2FsbGJhY2tJbXA6OlNldENvbXBsZXRlZChjb25zdCBVSW50NjQgKnZhbHVlKQ0KK3sNCisgIHJldHVybiBQcm9ncmVzc0RpYWxvZy0+U3luYy5TZXRfTnVtQnl0ZXNDdXIodmFsdWUpOw0KK30NCisNCitIUkVTVUxUIENFeHRyYWN0Q2FsbGJhY2tJbXA6Ok9wZW5fQ2hlY2tCcmVhaygpDQorew0KKyAgcmV0dXJuIFByb2dyZXNzRGlhbG9nLT5TeW5jLkNoZWNrU3RvcCgpOw0KK30NCisNCitIUkVTVUxUIENFeHRyYWN0Q2FsbGJhY2tJbXA6Ok9wZW5fU2V0VG90YWwoY29uc3QgVUludDY0ICogLyogbnVtRmlsZXMgKi8sIGNvbnN0IFVJbnQ2NCAqIC8qIG51bUJ5dGVzICovKQ0KK3sNCisgIC8vIGlmIChudW1GaWxlcyAhPSBOVUxMKSBQcm9ncmVzc0RpYWxvZy0+U3luYy5TZXROdW1GaWxlc1RvdGFsKCpudW1GaWxlcyk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDRXh0cmFjdENhbGxiYWNrSW1wOjpPcGVuX1NldENvbXBsZXRlZChjb25zdCBVSW50NjQgKiAvKiBudW1GaWxlcyAqLywgY29uc3QgVUludDY0ICogLyogbnVtQnl0ZXMgKi8pDQorew0KKyAgLy8gaWYgKG51bUZpbGVzICE9IE5VTEwpIFByb2dyZXNzRGlhbG9nLT5TeW5jLlNldE51bUZpbGVzQ3VyKCpudW1GaWxlcyk7DQorICByZXR1cm4gUHJvZ3Jlc3NEaWFsb2ctPlN5bmMuQ2hlY2tTdG9wKCk7DQorfQ0KKw0KKyNpZm5kZWYgX05PX0NSWVBUTw0KKw0KK0hSRVNVTFQgQ0V4dHJhY3RDYWxsYmFja0ltcDo6T3Blbl9DcnlwdG9HZXRUZXh0UGFzc3dvcmQoQlNUUiAqcGFzc3dvcmQpDQorew0KKyAgcmV0dXJuIENyeXB0b0dldFRleHRQYXNzd29yZChwYXNzd29yZCk7DQorfQ0KKw0KK0hSRVNVTFQgQ0V4dHJhY3RDYWxsYmFja0ltcDo6T3Blbl9HZXRQYXNzd29yZElmQW55KGJvb2wgJnBhc3N3b3JkSXNEZWZpbmVkLCBVU3RyaW5nICZwYXNzd29yZCkNCit7DQorICBwYXNzd29yZElzRGVmaW5lZCA9IFBhc3N3b3JkSXNEZWZpbmVkOw0KKyAgcGFzc3dvcmQgPSBQYXNzd29yZDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitib29sIENFeHRyYWN0Q2FsbGJhY2tJbXA6Ok9wZW5fV2FzUGFzc3dvcmRBc2tlZCgpDQorew0KKyAgcmV0dXJuIFBhc3N3b3JkV2FzQXNrZWQ7DQorfQ0KKw0KK3ZvaWQgQ0V4dHJhY3RDYWxsYmFja0ltcDo6T3Blbl9DbGVhclBhc3N3b3JkV2FzQXNrZWRGbGFnKCkNCit7DQorICBQYXNzd29yZFdhc0Fza2VkID0gZmFsc2U7DQorfQ0KKw0KKyNlbmRpZg0KKw0KKw0KKyNpZm5kZWYgX1NGWA0KK1NURE1FVEhPRElNUCBDRXh0cmFjdENhbGxiYWNrSW1wOjpTZXRSYXRpb0luZm8oY29uc3QgVUludDY0ICppblNpemUsIGNvbnN0IFVJbnQ2NCAqb3V0U2l6ZSkNCit7DQorICBQcm9ncmVzc0RpYWxvZy0+U3luYy5TZXRfUmF0aW8oaW5TaXplLCBvdXRTaXplKTsNCisgIHJldHVybiBTX09LOw0KK30NCisjZW5kaWYNCisNCisvKg0KK1NURE1FVEhPRElNUCBDRXh0cmFjdENhbGxiYWNrSW1wOjpTZXRUb3RhbEZpbGVzKFVJbnQ2NCB0b3RhbCkNCit7DQorICBQcm9ncmVzc0RpYWxvZy0+U3luYy5TZXROdW1GaWxlc1RvdGFsKHRvdGFsKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCitTVERNRVRIT0RJTVAgQ0V4dHJhY3RDYWxsYmFja0ltcDo6U2V0Q29tcGxldGVkRmlsZXMoY29uc3QgVUludDY0ICp2YWx1ZSkNCit7DQorICBpZiAodmFsdWUgIT0gTlVMTCkNCisgICAgUHJvZ3Jlc3NEaWFsb2ctPlN5bmMuU2V0TnVtRmlsZXNDdXIoKnZhbHVlKTsNCisgIHJldHVybiBTX09LOw0KK30NCisqLw0KKw0KK1NURE1FVEhPRElNUCBDRXh0cmFjdENhbGxiYWNrSW1wOjpBc2tPdmVyd3JpdGUoDQorICAgIGNvbnN0IHdjaGFyX3QgKmV4aXN0TmFtZSwgY29uc3QgRklMRVRJTUUgKmV4aXN0VGltZSwgY29uc3QgVUludDY0ICpleGlzdFNpemUsDQorICAgIGNvbnN0IHdjaGFyX3QgKm5ld05hbWUsIGNvbnN0IEZJTEVUSU1FICpuZXdUaW1lLCBjb25zdCBVSW50NjQgKm5ld1NpemUsDQorICAgIEludDMyICphbnN3ZXIpDQorew0KKyAgQ092ZXJ3cml0ZURpYWxvZyBkaWFsb2c7DQorDQorICBkaWFsb2cuT2xkRmlsZUluZm8uU2V0VGltZShleGlzdFRpbWUpOw0KKyAgZGlhbG9nLk9sZEZpbGVJbmZvLlNldFNpemUoZXhpc3RTaXplKTsNCisgIGRpYWxvZy5PbGRGaWxlSW5mby5OYW1lID0gZXhpc3ROYW1lOw0KKw0KKyAgZGlhbG9nLk5ld0ZpbGVJbmZvLlNldFRpbWUobmV3VGltZSk7DQorICBkaWFsb2cuTmV3RmlsZUluZm8uU2V0U2l6ZShuZXdTaXplKTsNCisgIGRpYWxvZy5OZXdGaWxlSW5mby5OYW1lID0gbmV3TmFtZTsNCisgIA0KKyAgUHJvZ3Jlc3NEaWFsb2ctPldhaXRDcmVhdGluZygpOw0KKyAgSU5UX1BUUiB3cml0ZUFuc3dlciA9IGRpYWxvZy5DcmVhdGUoKlByb2dyZXNzRGlhbG9nKTsNCisgIA0KKyAgc3dpdGNoICh3cml0ZUFuc3dlcikNCisgIHsNCisgICAgY2FzZSBJRENBTkNFTDogICAgICAgICphbnN3ZXIgPSBOT3ZlcndyaXRlQW5zd2VyOjprQ2FuY2VsOyByZXR1cm4gRV9BQk9SVDsNCisgICAgY2FzZSBJRFlFUzogICAgICAgICAgICphbnN3ZXIgPSBOT3ZlcndyaXRlQW5zd2VyOjprWWVzOyBicmVhazsNCisgICAgY2FzZSBJRE5POiAgICAgICAgICAgICphbnN3ZXIgPSBOT3ZlcndyaXRlQW5zd2VyOjprTm87IGJyZWFrOw0KKyAgICBjYXNlIElEQl9ZRVNfVE9fQUxMOiAgKmFuc3dlciA9IE5PdmVyd3JpdGVBbnN3ZXI6OmtZZXNUb0FsbDsgYnJlYWs7DQorICAgIGNhc2UgSURCX05PX1RPX0FMTDogICAqYW5zd2VyID0gTk92ZXJ3cml0ZUFuc3dlcjo6a05vVG9BbGw7IGJyZWFrOw0KKyAgICBjYXNlIElEQl9BVVRPX1JFTkFNRTogKmFuc3dlciA9IE5PdmVyd3JpdGVBbnN3ZXI6OmtBdXRvUmVuYW1lOyBicmVhazsNCisgICAgZGVmYXVsdDogcmV0dXJuIEVfRkFJTDsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCisNCitTVERNRVRIT0RJTVAgQ0V4dHJhY3RDYWxsYmFja0ltcDo6UHJlcGFyZU9wZXJhdGlvbihjb25zdCB3Y2hhcl90ICpuYW1lLCBib29sIGlzRm9sZGVyLCBJbnQzMiAvKiBhc2tFeHRyYWN0TW9kZSAqLywgY29uc3QgVUludDY0ICogLyogcG9zaXRpb24gKi8pDQorew0KKyAgX2lzRm9sZGVyID0gaXNGb2xkZXI7DQorICByZXR1cm4gU2V0Q3VycmVudEZpbGVQYXRoMihuYW1lKTsNCit9DQorDQorU1RETUVUSE9ESU1QIENFeHRyYWN0Q2FsbGJhY2tJbXA6Ok1lc3NhZ2VFcnJvcihjb25zdCB3Y2hhcl90ICpzKQ0KK3sNCisgIEFkZEVycm9yX01lc3NhZ2Uocyk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDRXh0cmFjdENhbGxiYWNrSW1wOjpNZXNzYWdlRXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSwgY29uc3QgRlN0cmluZyAmcGF0aCkNCit7DQorICBUaGVyZUFyZU1lc3NhZ2VFcnJvcnMgPSB0cnVlOw0KKyAgUHJvZ3Jlc3NEaWFsb2ctPlN5bmMuQWRkRXJyb3JfTWVzc2FnZV9OYW1lKEdldFVuaWNvZGVTdHJpbmcobWVzc2FnZSksIGZzMnVzKHBhdGgpKTsNCisgIHJldHVybiBTX09LOw0KK30NCisNCisjaWZuZGVmIF9TRlgNCisNCitTVERNRVRIT0RJTVAgQ0V4dHJhY3RDYWxsYmFja0ltcDo6U2hvd01lc3NhZ2UoY29uc3Qgd2NoYXJfdCAqcykNCit7DQorICBBZGRFcnJvcl9NZXNzYWdlKHMpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKyNlbmRpZg0KKw0KK1NURE1FVEhPRElNUCBDRXh0cmFjdENhbGxiYWNrSW1wOjpTZXRPcGVyYXRpb25SZXN1bHQoSW50MzIgb3BSZXMsIGJvb2wgZW5jcnlwdGVkKQ0KK3sNCisgIHN3aXRjaCAob3BSZXMpDQorICB7DQorICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprT0s6DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgIHsNCisgICAgICBVSU5UIG1lc3NhZ2VJRCA9IDA7DQorICAgICAgVUlOVCBpZCA9IDA7DQorDQorICAgICAgc3dpdGNoIChvcFJlcykNCisgICAgICB7DQorICAgICAgICBjYXNlIE5BcmNoaXZlOjpORXh0cmFjdDo6Tk9wZXJhdGlvblJlc3VsdDo6a1Vuc3VwcG9ydGVkTWV0aG9kOg0KKyAgICAgICAgICBtZXNzYWdlSUQgPSBJRFNfRVhUUkFDVF9NRVNTQUdFX1VOU1VQUE9SVEVEX01FVEhPRDsNCisgICAgICAgICAgaWQgPSBJRFNfRVhUUkFDVF9NU0dfVU5TVVBQT1JURURfTUVUSE9EOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprRGF0YUVycm9yOg0KKyAgICAgICAgICBtZXNzYWdlSUQgPSBlbmNyeXB0ZWQgPw0KKyAgICAgICAgICAgICAgSURTX0VYVFJBQ1RfTUVTU0FHRV9EQVRBX0VSUk9SX0VOQ1JZUFRFRDoNCisgICAgICAgICAgICAgIElEU19FWFRSQUNUX01FU1NBR0VfREFUQV9FUlJPUjsNCisgICAgICAgICAgaWQgPSBJRFNfRVhUUkFDVF9NU0dfREFUQV9FUlJPUjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIE5BcmNoaXZlOjpORXh0cmFjdDo6Tk9wZXJhdGlvblJlc3VsdDo6a0NSQ0Vycm9yOg0KKyAgICAgICAgICBtZXNzYWdlSUQgPSBlbmNyeXB0ZWQgPw0KKyAgICAgICAgICAgICAgSURTX0VYVFJBQ1RfTUVTU0FHRV9DUkNfRVJST1JfRU5DUllQVEVEOg0KKyAgICAgICAgICAgICAgSURTX0VYVFJBQ1RfTUVTU0FHRV9DUkNfRVJST1I7DQorICAgICAgICAgIGlkID0gSURTX0VYVFJBQ1RfTVNHX0NSQ19FUlJPUjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIE5BcmNoaXZlOjpORXh0cmFjdDo6Tk9wZXJhdGlvblJlc3VsdDo6a1VuYXZhaWxhYmxlOg0KKyAgICAgICAgICBpZCA9IElEU19FWFRSQUNUX01TR19VTkFWQUlMQUJMRV9EQVRBOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTkFyY2hpdmU6Ok5FeHRyYWN0OjpOT3BlcmF0aW9uUmVzdWx0OjprVW5leHBlY3RlZEVuZDoNCisgICAgICAgICAgaWQgPSBJRFNfRVhUUkFDVF9NU0dfVUVYUEVDVEVEX0VORDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIE5BcmNoaXZlOjpORXh0cmFjdDo6Tk9wZXJhdGlvblJlc3VsdDo6a0RhdGFBZnRlckVuZDoNCisgICAgICAgICAgaWQgPSBJRFNfRVhUUkFDVF9NU0dfREFUQV9BRlRFUl9FTkQ7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5PcGVyYXRpb25SZXN1bHQ6OmtJc05vdEFyYzoNCisgICAgICAgICAgaWQgPSBJRFNfRVhUUkFDVF9NU0dfSVNfTk9UX0FSQzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIE5BcmNoaXZlOjpORXh0cmFjdDo6Tk9wZXJhdGlvblJlc3VsdDo6a0hlYWRlcnNFcnJvcjoNCisgICAgICAgICAgaWQgPSBJRFNfRVhUUkFDVF9NU0dfSEVBREVSU19FUlJPUjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICAvKg0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgbWVzc2FnZUlEID0gSURTX0VYVFJBQ1RfTUVTU0FHRV9VTktOT1dOX0VSUk9SOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgICovDQorICAgICAgfQ0KKyAgICAgIGlmIChfbmVlZFdyaXRlQXJjaGl2ZVBhdGgpDQorICAgICAgew0KKyAgICAgICAgaWYgKCFfY3VycmVudEFyY2hpdmVQYXRoLklzRW1wdHkoKSkNCisgICAgICAgICAgQWRkRXJyb3JfTWVzc2FnZShfY3VycmVudEFyY2hpdmVQYXRoKTsNCisgICAgICAgIF9uZWVkV3JpdGVBcmNoaXZlUGF0aCA9IGZhbHNlOw0KKyAgICAgIH0NCisNCisgICAgICBVU3RyaW5nIG1zZzsNCisgICAgICBVU3RyaW5nIG1zZ09sZDsNCisNCisgICAgICAjaWZuZGVmIF9TRlgNCisgICAgICBpZiAoaWQgIT0gMCkNCisgICAgICAgIExhbmdTdHJpbmdfT25seUZyb21MYW5nRmlsZShpZCwgbXNnKTsNCisgICAgICBpZiAobWVzc2FnZUlEICE9IDAgJiYgbXNnLklzRW1wdHkoKSkNCisgICAgICAgIExhbmdTdHJpbmdfT25seUZyb21MYW5nRmlsZShtZXNzYWdlSUQsIG1zZ09sZCk7DQorICAgICAgI2VuZGlmDQorDQorICAgICAgVVN0cmluZyBzOw0KKyAgICAgIGlmIChtc2cuSXNFbXB0eSgpICYmICFtc2dPbGQuSXNFbXB0eSgpKQ0KKyAgICAgICAgcyA9IE15Rm9ybWF0TmV3KG1zZ09sZCwgX2N1cnJlbnRGaWxlUGF0aCk7DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChtc2cuSXNFbXB0eSgpKQ0KKyAgICAgICAgICBMYW5nU3RyaW5nKGlkLCBtc2cpOw0KKyAgICAgICAgaWYgKCFtc2cuSXNFbXB0eSgpKQ0KKyAgICAgICAgICBzICs9IG1zZzsNCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgd2NoYXJfdCB0ZW1wWzE2XTsNCisgICAgICAgICAgQ29udmVydFVJbnQzMlRvU3RyaW5nKG9wUmVzLCB0ZW1wKTsNCisgICAgICAgICAgcyArPSBMIkVycm9yICMiOw0KKyAgICAgICAgICBzICs9IHRlbXA7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoZW5jcnlwdGVkKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAvLyBzICs9IEwiIDogIjsNCisgICAgICAgICAgLy8gcyArPSBMYW5nU3RyaW5nKElEU19FWFRSQUNUX01TR19FTkNSWVBURUQpOw0KKyAgICAgICAgICBzICs9IEwiIDogIjsNCisgICAgICAgICAgcyArPSBMYW5nU3RyaW5nKElEU19FWFRSQUNUX01TR19XUk9OR19QU1cpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcyArPSBMIiA6ICI7DQorICAgICAgICBzICs9IF9jdXJyZW50RmlsZVBhdGg7DQorICAgICAgfQ0KKw0KKyAgICAgIEFkZEVycm9yX01lc3NhZ2Uocyk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgI2lmbmRlZiBfU0ZYDQorICBpZiAoX2lzRm9sZGVyKQ0KKyAgICBOdW1Gb2xkZXJzKys7DQorICBlbHNlDQorICAgIE51bUZpbGVzKys7DQorICBQcm9ncmVzc0RpYWxvZy0+U3luYy5TZXRfTnVtRmlsZXNDdXIoTnVtRmlsZXMpOw0KKyAgI2VuZGlmDQorICANCisgIHJldHVybiBTX09LOw0KK30NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gSUV4dHJhY3RDYWxsYmFja1VJDQorDQorSFJFU1VMVCBDRXh0cmFjdENhbGxiYWNrSW1wOjpCZWZvcmVPcGVuKGNvbnN0IHdjaGFyX3QgKm5hbWUpDQorew0KKyAgI2lmbmRlZiBfU0ZYDQorICBSSU5PSyhQcm9ncmVzc0RpYWxvZy0+U3luYy5DaGVja1N0b3AoKSk7DQorICBQcm9ncmVzc0RpYWxvZy0+U3luYy5TZXRfVGl0bGVGaWxlTmFtZShuYW1lKTsNCisgICNlbmRpZg0KKyAgX2N1cnJlbnRBcmNoaXZlUGF0aCA9IG5hbWU7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDRXh0cmFjdENhbGxiYWNrSW1wOjpTZXRDdXJyZW50RmlsZVBhdGgyKGNvbnN0IHdjaGFyX3QgKnBhdGgpDQorew0KKyAgX2N1cnJlbnRGaWxlUGF0aCA9IHBhdGg7DQorICAjaWZuZGVmIF9TRlgNCisgIFByb2dyZXNzRGlhbG9nLT5TeW5jLlNldF9GaWxlUGF0aChwYXRoKTsNCisgICNlbmRpZg0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKyNpZm5kZWYgX1NGWA0KKw0KK0hSRVNVTFQgQ0V4dHJhY3RDYWxsYmFja0ltcDo6U2V0Q3VycmVudEZpbGVQYXRoKGNvbnN0IHdjaGFyX3QgKnBhdGgpDQorew0KKyAgI2lmbmRlZiBfU0ZYDQorICBpZiAoTmVlZEFkZEZpbGUpDQorICAgIE51bUZpbGVzKys7DQorICBOZWVkQWRkRmlsZSA9IHRydWU7DQorICBQcm9ncmVzc0RpYWxvZy0+U3luYy5TZXRfTnVtRmlsZXNDdXIoTnVtRmlsZXMpOw0KKyAgI2VuZGlmDQorICByZXR1cm4gU2V0Q3VycmVudEZpbGVQYXRoMihwYXRoKTsNCit9DQorDQorI2VuZGlmDQorDQorVVN0cmluZyBIUmVzdWx0VG9NZXNzYWdlKEhSRVNVTFQgZXJyb3JDb2RlKTsNCisNCitIUkVTVUxUIENFeHRyYWN0Q2FsbGJhY2tJbXA6Ok9wZW5SZXN1bHQoY29uc3Qgd2NoYXJfdCAqbmFtZSwgSFJFU1VMVCByZXN1bHQsIGJvb2wgZW5jcnlwdGVkKQ0KK3sNCisgIGlmIChyZXN1bHQgIT0gU19PSykNCisgIHsNCisgICAgVVN0cmluZyBzOw0KKyAgICBpZiAocmVzdWx0ID09IFNfRkFMU0UpDQorICAgICAgcyA9IE15Rm9ybWF0TmV3KGVuY3J5cHRlZCA/IElEU19DQU5UX09QRU5fRU5DUllQVEVEX0FSQ0hJVkUgOiBJRFNfQ0FOVF9PUEVOX0FSQ0hJVkUsIG5hbWUpOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBzID0gbmFtZTsNCisgICAgICBzICs9IEwiOiAiOw0KKyAgICAgIHMgKz0gSFJlc3VsdFRvTWVzc2FnZShyZXN1bHQpOw0KKyAgICB9DQorICAgIE1lc3NhZ2VFcnJvcihzKTsNCisgICAgTnVtQXJjaGl2ZUVycm9ycysrOw0KKyAgfQ0KKyAgX2N1cnJlbnRBcmNoaXZlUGF0aCA9IG5hbWU7DQorICBfbmVlZFdyaXRlQXJjaGl2ZVBhdGggPSB0cnVlOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBVSW50MzIga19FcnJvckZsYWdzSWRzW10gPQ0KK3sNCisgIElEU19FWFRSQUNUX01TR19JU19OT1RfQVJDLA0KKyAgSURTX0VYVFJBQ1RfTVNHX0hFQURFUlNfRVJST1IsDQorICBJRFNfRVhUUkFDVF9NU0dfSEVBREVSU19FUlJPUiwNCisgIElEU19PUEVOX01TR19VTkFWQUlMQUJMRV9TVEFSVCwNCisgIElEU19PUEVOX01TR19VTkNPTkZJUk1FRF9TVEFSVCwNCisgIElEU19FWFRSQUNUX01TR19VRVhQRUNURURfRU5ELA0KKyAgSURTX0VYVFJBQ1RfTVNHX0RBVEFfQUZURVJfRU5ELA0KKyAgSURTX0VYVFJBQ1RfTVNHX1VOU1VQUE9SVEVEX01FVEhPRCwNCisgIElEU19PUEVOX01TR19VTlNVUFBPUlRFRF9GRUFUVVJFLA0KKyAgSURTX0VYVFJBQ1RfTVNHX0RBVEFfRVJST1IsDQorICBJRFNfRVhUUkFDVF9NU0dfQ1JDX0VSUk9SDQorfTsNCisNCitVU3RyaW5nIEdldE9wZW5BcmNFcnJvck1lc3NhZ2UoVUludDMyIGVycm9yRmxhZ3MpDQorew0KKyAgVVN0cmluZyBzOw0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa19FcnJvckZsYWdzSWRzKTsgaSsrKQ0KKyAgew0KKyAgICBVSW50MzIgZiA9ICgoVUludDMyKTEgPDwgaSk7DQorICAgIGlmICgoZXJyb3JGbGFncyAmIGYpID09IDApDQorICAgICAgY29udGludWU7DQorICAgIFVJbnQzMiBpZCA9IGtfRXJyb3JGbGFnc0lkc1tpXTsNCisgICAgVVN0cmluZyBtID0gTGFuZ1N0cmluZyhpZCk7DQorICAgIGlmIChtLklzRW1wdHkoKSkNCisgICAgICBjb250aW51ZTsNCisgICAgaWYgKGYgPT0ga3B2X0Vycm9yRmxhZ3NfRW5jcnlwdGVkSGVhZGVyc0Vycm9yKQ0KKyAgICB7DQorICAgICAgbSArPSBMIiA6ICI7DQorICAgICAgbSArPSBMYW5nU3RyaW5nKElEU19FWFRSQUNUX01TR19XUk9OR19QU1cpOw0KKyAgICB9DQorICAgIGlmICghcy5Jc0VtcHR5KCkpDQorICAgICAgcyArPSBMJ1xuJzsNCisgICAgcyArPSBtOw0KKyAgICBlcnJvckZsYWdzICY9IH5mOw0KKyAgfQ0KKyAgaWYgKGVycm9yRmxhZ3MgIT0gMCkNCisgIHsNCisgICAgY2hhciBzelsxNl07DQorICAgIHN6WzBdID0gJzAnOw0KKyAgICBzelsxXSA9ICd4JzsNCisgICAgQ29udmVydFVJbnQzMlRvSGV4KGVycm9yRmxhZ3MsIHN6ICsgMik7DQorICAgIGlmICghcy5Jc0VtcHR5KCkpDQorICAgICAgcyArPSBMJ1xuJzsNCisgICAgcyArPSBHZXRVbmljb2RlU3RyaW5nKEFTdHJpbmcoc3opKTsNCisgIH0NCisgIHJldHVybiBzOw0KK30NCisNCitIUkVTVUxUIENFeHRyYWN0Q2FsbGJhY2tJbXA6OlNldEVycm9yKGludCBsZXZlbCwgY29uc3Qgd2NoYXJfdCAqbmFtZSwNCisgICAgVUludDMyIGVycm9yRmxhZ3MsIGNvbnN0IHdjaGFyX3QgKmVycm9ycywNCisgICAgVUludDMyIHdhcm5pbmdGbGFncywgY29uc3Qgd2NoYXJfdCAqd2FybmluZ3MpDQorew0KKyAgTnVtQXJjaGl2ZUVycm9ycysrOw0KKw0KKyAgaWYgKF9uZWVkV3JpdGVBcmNoaXZlUGF0aCkNCisgIHsNCisgICAgaWYgKCFfY3VycmVudEFyY2hpdmVQYXRoLklzRW1wdHkoKSkNCisgICAgICBBZGRFcnJvcl9NZXNzYWdlKF9jdXJyZW50QXJjaGl2ZVBhdGgpOw0KKyAgICBfbmVlZFdyaXRlQXJjaGl2ZVBhdGggPSBmYWxzZTsNCisgIH0NCisNCisgIGlmIChsZXZlbCAhPSAwKQ0KKyAgew0KKyAgICBVU3RyaW5nIHM7DQorICAgIHMgKz0gbmFtZTsNCisgICAgcyArPSBMIjogIjsNCisgICAgTWVzc2FnZUVycm9yKHMpOw0KKyAgfQ0KKw0KKyAgaWYgKGVycm9yRmxhZ3MgIT0gMCkNCisgICAgTWVzc2FnZUVycm9yKEdldE9wZW5BcmNFcnJvck1lc3NhZ2UoZXJyb3JGbGFncykpOw0KKw0KKyAgaWYgKGVycm9ycyAmJiB3Y3NsZW4oZXJyb3JzKSAhPSAwKQ0KKyAgICBNZXNzYWdlRXJyb3IoZXJyb3JzKTsNCisNCisgIGlmICh3YXJuaW5nRmxhZ3MgIT0gMCkNCisgICAgTWVzc2FnZUVycm9yKChVU3RyaW5nKUwiV2FybmluZ3M6ICIgKyBHZXRPcGVuQXJjRXJyb3JNZXNzYWdlKHdhcm5pbmdGbGFncykpOw0KKw0KKyAgaWYgKHdhcm5pbmdzICYmIHdjc2xlbih3YXJuaW5ncykgIT0gMCkNCisgICAgTWVzc2FnZUVycm9yKChVU3RyaW5nKUwiV2FybmluZ3M6ICIgKyB3YXJuaW5ncyk7DQorDQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDRXh0cmFjdENhbGxiYWNrSW1wOjpPcGVuVHlwZVdhcm5pbmcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqb2tUeXBlLCBjb25zdCB3Y2hhcl90ICplcnJvclR5cGUpDQorew0KKyAgVVN0cmluZyBzID0gTCJXYXJuaW5nOlxuIjsNCisgIHMgKz0gbmFtZTsNCisgIHMgKz0gTCJcbiI7DQorICBpZiAod2NzY21wKG9rVHlwZSwgZXJyb3JUeXBlKSA9PSAwKQ0KKyAgew0KKyAgICBzICs9IEwiVGhlIGFyY2hpdmUgaXMgb3BlbiB3aXRoIG9mZnNldCI7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIHMgKz0gTCJDYW4gbm90IG9wZW4gdGhlIGZpbGUgYXMgWyI7DQorICAgIHMgKz0gZXJyb3JUeXBlOw0KKyAgICBzICs9IEwiXSBhcmNoaXZlXG4iOw0KKyAgICBzICs9IEwiVGhlIGZpbGUgaXMgb3BlbiBhcyBbIjsNCisgICAgcyArPSBva1R5cGU7DQorICAgIHMgKz0gTCJdIGFyY2hpdmUiOw0KKyAgfQ0KKyAgTWVzc2FnZUVycm9yKHMpOw0KKyAgTnVtQXJjaGl2ZUVycm9ycysrOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKyAgDQorSFJFU1VMVCBDRXh0cmFjdENhbGxiYWNrSW1wOjpUaGVyZUFyZU5vRmlsZXMoKQ0KK3sNCisgIHJldHVybiBTX09LOw0KK30NCisNCitIUkVTVUxUIENFeHRyYWN0Q2FsbGJhY2tJbXA6OkV4dHJhY3RSZXN1bHQoSFJFU1VMVCByZXN1bHQpDQorew0KKyAgaWYgKHJlc3VsdCA9PSBTX09LKQ0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgTnVtQXJjaGl2ZUVycm9ycysrOw0KKyAgaWYgKHJlc3VsdCA9PSBFX0FCT1JUIHx8IHJlc3VsdCA9PSBFUlJPUl9ESVNLX0ZVTEwpDQorICAgIHJldHVybiByZXN1bHQ7DQorICBNZXNzYWdlRXJyb3IoX2N1cnJlbnRGaWxlUGF0aCk7DQorICBNZXNzYWdlRXJyb3IoTkVycm9yOjpNeUZvcm1hdE1lc3NhZ2UocmVzdWx0KSk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorI2lmbmRlZiBfTk9fQ1JZUFRPDQorDQorSFJFU1VMVCBDRXh0cmFjdENhbGxiYWNrSW1wOjpTZXRQYXNzd29yZChjb25zdCBVU3RyaW5nICZwYXNzd29yZCkNCit7DQorICBQYXNzd29yZElzRGVmaW5lZCA9IHRydWU7DQorICBQYXNzd29yZCA9IHBhc3N3b3JkOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDRXh0cmFjdENhbGxiYWNrSW1wOjpDcnlwdG9HZXRUZXh0UGFzc3dvcmQoQlNUUiAqcGFzc3dvcmQpDQorew0KKyAgUGFzc3dvcmRXYXNBc2tlZCA9IHRydWU7DQorICBpZiAoIVBhc3N3b3JkSXNEZWZpbmVkKQ0KKyAgew0KKyAgICBDUGFzc3dvcmREaWFsb2cgZGlhbG9nOw0KKyAgICAjaWZuZGVmIF9TRlgNCisgICAgYm9vbCBzaG93UGFzc3dvcmQgPSBORXh0cmFjdDo6UmVhZF9TaG93UGFzc3dvcmQoKTsNCisgICAgZGlhbG9nLlNob3dQYXNzd29yZCA9IHNob3dQYXNzd29yZDsNCisgICAgI2VuZGlmDQorICAgIFByb2dyZXNzRGlhbG9nLT5XYWl0Q3JlYXRpbmcoKTsNCisgICAgaWYgKGRpYWxvZy5DcmVhdGUoKlByb2dyZXNzRGlhbG9nKSAhPSBJRE9LKQ0KKyAgICAgIHJldHVybiBFX0FCT1JUOw0KKyAgICBQYXNzd29yZCA9IGRpYWxvZy5QYXNzd29yZDsNCisgICAgUGFzc3dvcmRJc0RlZmluZWQgPSB0cnVlOw0KKyAgICAjaWZuZGVmIF9TRlgNCisgICAgaWYgKGRpYWxvZy5TaG93UGFzc3dvcmQgIT0gc2hvd1Bhc3N3b3JkKQ0KKyAgICAgIE5FeHRyYWN0OjpTYXZlX1Nob3dQYXNzd29yZChkaWFsb2cuU2hvd1Bhc3N3b3JkKTsNCisgICAgI2VuZGlmDQorICB9DQorICByZXR1cm4gU3RyaW5nVG9Cc3RyKFBhc3N3b3JkLCBwYXNzd29yZCk7DQorfQ0KKw0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgX1NGWA0KKw0KK1NURE1FVEhPRElNUCBDRXh0cmFjdENhbGxiYWNrSW1wOjpBc2tXcml0ZSgNCisgICAgY29uc3Qgd2NoYXJfdCAqc3JjUGF0aCwgSW50MzIgc3JjSXNGb2xkZXIsDQorICAgIGNvbnN0IEZJTEVUSU1FICpzcmNUaW1lLCBjb25zdCBVSW50NjQgKnNyY1NpemUsDQorICAgIGNvbnN0IHdjaGFyX3QgKmRlc3RQYXRoLA0KKyAgICBCU1RSICpkZXN0UGF0aFJlc3VsdCwNCisgICAgSW50MzIgKndyaXRlQW5zd2VyKQ0KK3sNCisgIFVTdHJpbmcgZGVzdFBhdGhSZXN1bHRUZW1wID0gZGVzdFBhdGg7DQorDQorICAvLyBSSU5PSyhTdHJpbmdUb0JzdHIoZGVzdFBhdGgsIGRlc3RQYXRoUmVzdWx0KSk7DQorDQorICAqZGVzdFBhdGhSZXN1bHQgPSAwOw0KKyAgKndyaXRlQW5zd2VyID0gQm9vbFRvSW50KGZhbHNlKTsNCisNCisgIEZTdHJpbmcgZGVzdFBhdGhTeXMgPSB1czJmcyhkZXN0UGF0aCk7DQorICBib29sIHNyY0lzRm9sZGVyU3BlYyA9IEludFRvQm9vbChzcmNJc0ZvbGRlcik7DQorICBDRmlsZUluZm8gZGVzdEZpbGVJbmZvOw0KKyAgDQorICBpZiAoZGVzdEZpbGVJbmZvLkZpbmQoZGVzdFBhdGhTeXMpKQ0KKyAgew0KKyAgICBpZiAoc3JjSXNGb2xkZXJTcGVjKQ0KKyAgICB7DQorICAgICAgaWYgKCFkZXN0RmlsZUluZm8uSXNEaXIoKSkNCisgICAgICB7DQorICAgICAgICBSSU5PSyhNZXNzYWdlRXJyb3IoImNhbiBub3QgcmVwbGFjZSBmaWxlIHdpdGggZm9sZGVyIHdpdGggc2FtZSBuYW1lOiAiLCBkZXN0UGF0aFN5cykpOw0KKyAgICAgICAgcmV0dXJuIEVfQUJPUlQ7DQorICAgICAgfQ0KKyAgICAgICp3cml0ZUFuc3dlciA9IEJvb2xUb0ludChmYWxzZSk7DQorICAgICAgcmV0dXJuIFNfT0s7DQorICAgIH0NCisgIA0KKyAgICBpZiAoZGVzdEZpbGVJbmZvLklzRGlyKCkpDQorICAgIHsNCisgICAgICBSSU5PSyhNZXNzYWdlRXJyb3IoImNhbiBub3QgcmVwbGFjZSBmb2xkZXIgd2l0aCBmaWxlIHdpdGggc2FtZSBuYW1lOiAiLCBkZXN0UGF0aFN5cykpOw0KKyAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgIH0NCisNCisgICAgc3dpdGNoIChPdmVyd3JpdGVNb2RlKQ0KKyAgICB7DQorICAgICAgY2FzZSBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OmtTa2lwOg0KKyAgICAgICAgcmV0dXJuIFNfT0s7DQorICAgICAgY2FzZSBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OmtBc2s6DQorICAgICAgew0KKyAgICAgICAgSW50MzIgb3ZlcndpdGVSZXN1bHQ7DQorICAgICAgICBVU3RyaW5nIGRlc3RQYXRoU3BlYyA9IGRlc3RQYXRoOw0KKyAgICAgICAgaW50IHNsYXNoUG9zID0gZGVzdFBhdGhTcGVjLlJldmVyc2VGaW5kKEwnLycpOw0KKyAgICAgICAgI2lmZGVmIF9XSU4zMg0KKyAgICAgICAgaW50IHNsYXNoMVBvcyA9IGRlc3RQYXRoU3BlYy5SZXZlcnNlRmluZChMJ1xcJyk7DQorICAgICAgICBzbGFzaFBvcyA9IE15TWF4KHNsYXNoUG9zLCBzbGFzaDFQb3MpOw0KKyAgICAgICAgI2VuZGlmDQorICAgICAgICBkZXN0UGF0aFNwZWMuRGVsZXRlRnJvbShzbGFzaFBvcyArIDEpOw0KKyAgICAgICAgZGVzdFBhdGhTcGVjICs9IGZzMnVzKGRlc3RGaWxlSW5mby5OYW1lKTsNCisNCisgICAgICAgIFJJTk9LKEFza092ZXJ3cml0ZSgNCisgICAgICAgICAgICBkZXN0UGF0aFNwZWMsDQorICAgICAgICAgICAgJmRlc3RGaWxlSW5mby5NVGltZSwgJmRlc3RGaWxlSW5mby5TaXplLA0KKyAgICAgICAgICAgIHNyY1BhdGgsDQorICAgICAgICAgICAgc3JjVGltZSwgc3JjU2l6ZSwNCisgICAgICAgICAgICAmb3ZlcndpdGVSZXN1bHQpKTsNCisgICAgICAgIA0KKyAgICAgICAgc3dpdGNoIChvdmVyd2l0ZVJlc3VsdCkNCisgICAgICAgIHsNCisgICAgICAgICAgY2FzZSBOT3ZlcndyaXRlQW5zd2VyOjprQ2FuY2VsOiByZXR1cm4gRV9BQk9SVDsNCisgICAgICAgICAgY2FzZSBOT3ZlcndyaXRlQW5zd2VyOjprTm86IHJldHVybiBTX09LOw0KKyAgICAgICAgICBjYXNlIE5PdmVyd3JpdGVBbnN3ZXI6OmtOb1RvQWxsOiBPdmVyd3JpdGVNb2RlID0gTkV4dHJhY3Q6Ok5PdmVyd3JpdGVNb2RlOjprU2tpcDsgcmV0dXJuIFNfT0s7DQorICAgICAgICAgIGNhc2UgTk92ZXJ3cml0ZUFuc3dlcjo6a1llczogYnJlYWs7DQorICAgICAgICAgIGNhc2UgTk92ZXJ3cml0ZUFuc3dlcjo6a1llc1RvQWxsOiBPdmVyd3JpdGVNb2RlID0gTkV4dHJhY3Q6Ok5PdmVyd3JpdGVNb2RlOjprT3ZlcndyaXRlOyBicmVhazsNCisgICAgICAgICAgY2FzZSBOT3ZlcndyaXRlQW5zd2VyOjprQXV0b1JlbmFtZTogT3ZlcndyaXRlTW9kZSA9IE5FeHRyYWN0OjpOT3ZlcndyaXRlTW9kZTo6a1JlbmFtZTsgYnJlYWs7DQorICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIGlmIChPdmVyd3JpdGVNb2RlID09IE5FeHRyYWN0OjpOT3ZlcndyaXRlTW9kZTo6a1JlbmFtZSkNCisgICAgew0KKyAgICAgIGlmICghQXV0b1JlbmFtZVBhdGgoZGVzdFBhdGhTeXMpKQ0KKyAgICAgIHsNCisgICAgICAgIFJJTk9LKE1lc3NhZ2VFcnJvcigiY2FuIG5vdCBjcmVhdGUgbmFtZSBmb3IgZmlsZTogIiwgZGVzdFBhdGhTeXMpKTsNCisgICAgICAgIHJldHVybiBFX0FCT1JUOw0KKyAgICAgIH0NCisgICAgICBkZXN0UGF0aFJlc3VsdFRlbXAgPSBmczJ1cyhkZXN0UGF0aFN5cyk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAgIGlmICghTkRpcjo6RGVsZXRlRmlsZUFsd2F5cyhkZXN0UGF0aFN5cykpDQorICAgICAgew0KKyAgICAgICAgUklOT0soTWVzc2FnZUVycm9yKCJjYW4gbm90IGRlbGV0ZSBvdXRwdXQgZmlsZTogIiwgZGVzdFBhdGhTeXMpKTsNCisgICAgICAgIHJldHVybiBFX0FCT1JUOw0KKyAgICAgIH0NCisgIH0NCisgICp3cml0ZUFuc3dlciA9IEJvb2xUb0ludCh0cnVlKTsNCisgIHJldHVybiBTdHJpbmdUb0JzdHIoZGVzdFBhdGhSZXN1bHRUZW1wLCBkZXN0UGF0aFJlc3VsdCk7DQorfQ0KKw0KKw0KK1NURE1FVEhPRElNUCBDRXh0cmFjdENhbGxiYWNrSW1wOjpVc2VFeHRyYWN0VG9TdHJlYW0oSW50MzIgKnJlcykNCit7DQorICAqcmVzID0gQm9vbFRvSW50KFN0cmVhbU1vZGUpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0YXRpYyBIUkVTVUxUIEdldFRpbWUoSUdldFByb3AgKmdldFByb3AsIFBST1BJRCBwcm9wSUQsIEZJTEVUSU1FICZmdCwgYm9vbCAmZnREZWZpbmVkKQ0KK3sNCisgIGZ0RGVmaW5lZCA9IGZhbHNlOw0KKyAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICBSSU5PSyhnZXRQcm9wLT5HZXRQcm9wKHByb3BJRCwgJnByb3ApKTsNCisgIGlmIChwcm9wLnZ0ID09IFZUX0ZJTEVUSU1FKQ0KKyAgew0KKyAgICBmdCA9IHByb3AuZmlsZXRpbWU7DQorICAgIGZ0RGVmaW5lZCA9IChmdC5kd0hpZ2hEYXRlVGltZSAhPSAwIHx8IGZ0LmR3TG93RGF0ZVRpbWUgIT0gMCk7DQorICB9DQorICBlbHNlIGlmIChwcm9wLnZ0ICE9IFZUX0VNUFRZKQ0KKyAgICByZXR1cm4gRV9GQUlMOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKw0KK3N0YXRpYyBIUkVTVUxUIEdldEl0ZW1Cb29sUHJvcChJR2V0UHJvcCAqZ2V0UHJvcCwgUFJPUElEIHByb3BJRCwgYm9vbCAmcmVzdWx0KQ0KK3sNCisgIE5DT006OkNQcm9wVmFyaWFudCBwcm9wOw0KKyAgcmVzdWx0ID0gZmFsc2U7DQorICBSSU5PSyhnZXRQcm9wLT5HZXRQcm9wKHByb3BJRCwgJnByb3ApKTsNCisgIGlmIChwcm9wLnZ0ID09IFZUX0JPT0wpDQorICAgIHJlc3VsdCA9IFZBUklBTlRfQk9PTFRvQm9vbChwcm9wLmJvb2xWYWwpOw0KKyAgZWxzZSBpZiAocHJvcC52dCAhPSBWVF9FTVBUWSkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIHJldHVybiBTX09LOw0KK30NCisNCisNCitTVERNRVRIT0RJTVAgQ0V4dHJhY3RDYWxsYmFja0ltcDo6R2V0U3RyZWFtNyhjb25zdCB3Y2hhcl90ICpuYW1lLA0KKyAgICBJbnQzMiBpc0RpciwNCisgICAgSVNlcXVlbnRpYWxPdXRTdHJlYW0gKipvdXRTdHJlYW0sIEludDMyIGFza0V4dHJhY3RNb2RlLA0KKyAgICBJR2V0UHJvcCAqZ2V0UHJvcCkNCit7DQorICBDT01fVFJZX0JFR0lODQorICAqb3V0U3RyZWFtID0gMDsNCisgIF9uZXdWaXJ0RmlsZVdhc0FkZGVkID0gZmFsc2U7DQorICBfaGFzaFN0cmVhbVdhc1VzZWQgPSBmYWxzZTsNCisgIF9uZWVkVXBkYXRlU3RhdCA9IGZhbHNlOw0KKw0KKyAgaWYgKF9oYXNoU3RyZWFtKQ0KKyAgICBfaGFzaFN0cmVhbVNwZWMtPlJlbGVhc2VTdHJlYW0oKTsNCisNCisgIEdldEl0ZW1Cb29sUHJvcChnZXRQcm9wLCBrcGlkSXNBbHRTdHJlYW0sIF9pc0FsdFN0cmVhbSk7DQorDQorICBpZiAoIVByb2Nlc3NBbHRTdHJlYW1zICYmIF9pc0FsdFN0cmVhbSkNCisgICAgcmV0dXJuIFNfT0s7DQorDQorICBfZmlsZVBhdGggPSBuYW1lOw0KKyAgX2lzRm9sZGVyID0gSW50VG9Cb29sKGlzRGlyKTsNCisgIF9jdXJTaXplID0gMDsNCisgIF9jdXJTaXplRGVmaW5lZCA9IGZhbHNlOw0KKw0KKyAgVUludDY0IHNpemUgPSAwOw0KKyAgYm9vbCBzaXplRGVmaW5lZDsNCisgIHsNCisgICAgTkNPTTo6Q1Byb3BWYXJpYW50IHByb3A7DQorICAgIFJJTk9LKGdldFByb3AtPkdldFByb3Aoa3BpZFNpemUsICZwcm9wKSk7DQorICAgIHNpemVEZWZpbmVkID0gQ29udmVydFByb3BWYXJpYW50VG9VSW50NjQocHJvcCwgc2l6ZSk7DQorICB9DQorDQorICBpZiAoc2l6ZURlZmluZWQpDQorICB7DQorICAgIF9jdXJTaXplID0gc2l6ZTsNCisgICAgX2N1clNpemVEZWZpbmVkID0gdHJ1ZTsNCisgIH0NCisNCisgIGlmIChhc2tFeHRyYWN0TW9kZSAhPSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5Bc2tNb2RlOjprRXh0cmFjdCAmJg0KKyAgICAgIGFza0V4dHJhY3RNb2RlICE9IE5BcmNoaXZlOjpORXh0cmFjdDo6TkFza01vZGU6OmtUZXN0KQ0KKyAgICByZXR1cm4gU19PSzsNCisNCisgIF9uZWVkVXBkYXRlU3RhdCA9IHRydWU7DQorICANCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gb3V0U3RyZWFtTG9jOw0KKyAgDQorICBpZiAoVmlydEZpbGVTeXN0ZW0gJiYgYXNrRXh0cmFjdE1vZGUgPT0gTkFyY2hpdmU6Ok5FeHRyYWN0OjpOQXNrTW9kZTo6a0V4dHJhY3QpDQorICB7DQorICAgIENWaXJ0RmlsZSAmZmlsZSA9IFZpcnRGaWxlU3lzdGVtU3BlYy0+QWRkTmV3RmlsZSgpOw0KKyAgICBfbmV3VmlydEZpbGVXYXNBZGRlZCA9IHRydWU7DQorICAgIGZpbGUuTmFtZSA9IG5hbWU7DQorICAgIGZpbGUuSXNEaXIgPSBJbnRUb0Jvb2woaXNEaXIpOw0KKyAgICBmaWxlLklzQWx0U3RyZWFtID0gX2lzQWx0U3RyZWFtOw0KKyAgICBmaWxlLlNpemUgPSAwOw0KKw0KKyAgICBSSU5PSyhHZXRUaW1lKGdldFByb3AsIGtwaWRDVGltZSwgZmlsZS5DVGltZSwgZmlsZS5DVGltZURlZmluZWQpKTsNCisgICAgUklOT0soR2V0VGltZShnZXRQcm9wLCBrcGlkQVRpbWUsIGZpbGUuQVRpbWUsIGZpbGUuQVRpbWVEZWZpbmVkKSk7DQorICAgIFJJTk9LKEdldFRpbWUoZ2V0UHJvcCwga3BpZE1UaW1lLCBmaWxlLk1UaW1lLCBmaWxlLk1UaW1lRGVmaW5lZCkpOw0KKw0KKyAgICBOQ09NOjpDUHJvcFZhcmlhbnQgcHJvcDsNCisgICAgUklOT0soZ2V0UHJvcC0+R2V0UHJvcChrcGlkQXR0cmliLCAmcHJvcCkpOw0KKyAgICBpZiAocHJvcC52dCA9PSBWVF9VSTQpDQorICAgIHsNCisgICAgICBmaWxlLkF0dHJpYiA9IHByb3AudWxWYWw7DQorICAgICAgZmlsZS5BdHRyaWJEZWZpbmVkID0gdHJ1ZTsNCisgICAgfQ0KKyAgICAvLyBlbHNlIGlmIChpc0RpcikgZmlsZS5BdHRyaWIgPSBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7DQorDQorICAgIGZpbGUuRXhwZWN0ZWRTaXplID0gMDsNCisgICAgaWYgKHNpemVEZWZpbmVkKQ0KKyAgICAgIGZpbGUuRXhwZWN0ZWRTaXplID0gc2l6ZTsNCisgICAgb3V0U3RyZWFtTG9jID0gVmlydEZpbGVTeXN0ZW07DQorICB9DQorDQorICBpZiAoX2hhc2hTdHJlYW0pDQorICB7DQorICAgIHsNCisgICAgICBfaGFzaFN0cmVhbVNwZWMtPlNldFN0cmVhbShvdXRTdHJlYW1Mb2MpOw0KKyAgICAgIG91dFN0cmVhbUxvYyA9IF9oYXNoU3RyZWFtOw0KKyAgICAgIF9oYXNoU3RyZWFtU3BlYy0+SW5pdCh0cnVlKTsNCisgICAgICBfaGFzaFN0cmVhbVdhc1VzZWQgPSB0cnVlOw0KKyAgICB9DQorICB9DQorDQorICBpZiAob3V0U3RyZWFtTG9jKQ0KKyAgICAqb3V0U3RyZWFtID0gb3V0U3RyZWFtTG9jLkRldGFjaCgpOw0KKyAgcmV0dXJuIFNfT0s7DQorICBDT01fVFJZX0VORA0KK30NCisNCitTVERNRVRIT0RJTVAgQ0V4dHJhY3RDYWxsYmFja0ltcDo6UHJlcGFyZU9wZXJhdGlvbjcoSW50MzIgYXNrRXh0cmFjdE1vZGUpDQorew0KKyAgQ09NX1RSWV9CRUdJTg0KKyAgX25lZWRVcGRhdGVTdGF0ID0gKA0KKyAgICAgIGFza0V4dHJhY3RNb2RlID09IE5BcmNoaXZlOjpORXh0cmFjdDo6TkFza01vZGU6OmtFeHRyYWN0IHx8DQorICAgICAgYXNrRXh0cmFjdE1vZGUgPT0gTkFyY2hpdmU6Ok5FeHRyYWN0OjpOQXNrTW9kZTo6a1Rlc3QpOw0KKw0KKyAgLyoNCisgIF9leHRyYWN0TW9kZSA9IGZhbHNlOw0KKyAgc3dpdGNoIChhc2tFeHRyYWN0TW9kZSkNCisgIHsNCisgICAgY2FzZSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5Bc2tNb2RlOjprRXh0cmFjdDoNCisgICAgICBpZiAoX3Rlc3RNb2RlKQ0KKyAgICAgICAgYXNrRXh0cmFjdE1vZGUgPSBOQXJjaGl2ZTo6TkV4dHJhY3Q6Ok5Bc2tNb2RlOjprVGVzdDsNCisgICAgICBlbHNlDQorICAgICAgICBfZXh0cmFjdE1vZGUgPSB0cnVlOw0KKyAgICAgIGJyZWFrOw0KKyAgfTsNCisgICovDQorICByZXR1cm4gU2V0Q3VycmVudEZpbGVQYXRoMihfZmlsZVBhdGgpOw0KKyAgQ09NX1RSWV9FTkQNCit9DQorDQorU1RETUVUSE9ESU1QIENFeHRyYWN0Q2FsbGJhY2tJbXA6OlNldE9wZXJhdGlvblJlc3VsdDcoSW50MzIgb3BSZXMsIGJvb2wgZW5jcnlwdGVkKQ0KK3sNCisgIENPTV9UUllfQkVHSU4NCisgIGlmIChWaXJ0RmlsZVN5c3RlbSAmJiBfbmV3VmlydEZpbGVXYXNBZGRlZCkNCisgIHsNCisgICAgLy8gRklYTUU6IHByb2JhYmx5IHdlIG11c3QgcmVxdWVzdCBmaWxlIHNpemUgZnJvbSBWaXJ0RmlsZVN5c3RlbQ0KKyAgICAvLyBfY3VyU2l6ZSA9IFZpcnRGaWxlU3lzdGVtLT5HZXRMYXN0RmlsZVNpemUoKQ0KKyAgICAvLyBfY3VyU2l6ZURlZmluZWQgPSB0cnVlOw0KKyAgICBSSU5PSyhWaXJ0RmlsZVN5c3RlbVNwZWMtPkNsb3NlTWVtRmlsZSgpKTsNCisgIH0NCisgIGlmIChfaGFzaFN0cmVhbSAmJiBfaGFzaFN0cmVhbVdhc1VzZWQpDQorICB7DQorICAgIF9oYXNoU3RyZWFtU3BlYy0+X2hhc2gtPkZpbmFsKF9pc0ZvbGRlciwgX2lzQWx0U3RyZWFtLCBfZmlsZVBhdGgpOw0KKyAgICBfY3VyU2l6ZSA9IF9oYXNoU3RyZWFtU3BlYy0+R2V0U2l6ZSgpOw0KKyAgICBfY3VyU2l6ZURlZmluZWQgPSB0cnVlOw0KKyAgICBfaGFzaFN0cmVhbVNwZWMtPlJlbGVhc2VTdHJlYW0oKTsNCisgICAgX2hhc2hTdHJlYW1XYXNVc2VkID0gZmFsc2U7DQorICB9DQorICBlbHNlIGlmIChfaGFzaENhbGMgJiYgX25lZWRVcGRhdGVTdGF0KQ0KKyAgew0KKyAgICBfaGFzaENhbGMtPlNldFNpemUoX2N1clNpemUpOw0KKyAgICBfaGFzaENhbGMtPkZpbmFsKF9pc0ZvbGRlciwgX2lzQWx0U3RyZWFtLCBfZmlsZVBhdGgpOw0KKyAgfQ0KKyAgcmV0dXJuIFNldE9wZXJhdGlvblJlc3VsdChvcFJlcywgZW5jcnlwdGVkKTsNCisgIENPTV9UUllfRU5EDQorfQ0KKw0KKw0KK3N0YXRpYyBjb25zdCBzaXplX3Qga19TaXplVF9NQVggPSAoc2l6ZV90KSgoc2l6ZV90KTAgLSAxKTsNCisNCitzdGF0aWMgY29uc3QgVUludDMyIGtCbG9ja1NpemUgPSAoKFVJbnQzMikxIDw8IDMxKTsNCisNCitTVERNRVRIT0RJTVAgQ1ZpcnRGaWxlU3lzdGVtOjpXcml0ZShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKQ0KK3sNCisgIGlmIChwcm9jZXNzZWRTaXplKQ0KKyAgICAqcHJvY2Vzc2VkU2l6ZSA9IDA7DQorICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIGlmICghX2ZpbGVNb2RlKQ0KKyAgew0KKyAgICBDVmlydEZpbGUgJmZpbGUgPSBGaWxlcy5CYWNrKCk7DQorICAgIHNpemVfdCByZW0gPSBmaWxlLkRhdGEuU2l6ZSgpIC0gKHNpemVfdClmaWxlLlNpemU7DQorICAgIGJvb2wgdXNlTWVtID0gdHJ1ZTsNCisgICAgaWYgKHJlbSA8IHNpemUpDQorICAgIHsNCisgICAgICBVSW50NjQgYiA9IDA7DQorICAgICAgaWYgKGZpbGUuRGF0YS5TaXplKCkgPT0gMCkNCisgICAgICAgIGIgPSBmaWxlLkV4cGVjdGVkU2l6ZTsNCisgICAgICBVSW50NjQgYSA9IGZpbGUuU2l6ZSArIHNpemU7DQorICAgICAgaWYgKGIgPCBhKQ0KKyAgICAgICAgYiA9IGE7DQorICAgICAgYSA9IChVSW50NjQpZmlsZS5EYXRhLlNpemUoKSAqIDI7DQorICAgICAgaWYgKGIgPCBhKQ0KKyAgICAgICAgYiA9IGE7DQorICAgICAgdXNlTWVtID0gZmFsc2U7DQorICAgICAgaWYgKGIgPD0ga19TaXplVF9NQVggJiYgYiA8PSBNYXhUb3RhbEFsbG9jU2l6ZSkNCisgICAgICAgIHVzZU1lbSA9IGZpbGUuRGF0YS5SZUFsbG9jX0tlZXBEYXRhKChzaXplX3QpYiwgKHNpemVfdClmaWxlLlNpemUpOw0KKyAgICB9DQorICAgIGlmICh1c2VNZW0pDQorICAgIHsNCisgICAgICBtZW1jcHkoZmlsZS5EYXRhICsgZmlsZS5TaXplLCBkYXRhLCBzaXplKTsNCisgICAgICBmaWxlLlNpemUgKz0gc2l6ZTsNCisgICAgICBpZiAocHJvY2Vzc2VkU2l6ZSkNCisgICAgICAgICpwcm9jZXNzZWRTaXplID0gKFVJbnQzMilzaXplOw0KKyAgICAgIHJldHVybiBTX09LOw0KKyAgICB9DQorICAgIF9maWxlTW9kZSA9IHRydWU7DQorICB9DQorICBSSU5PSyhGbHVzaFRvRGlzayhmYWxzZSkpOw0KKyAgcmV0dXJuIF9vdXRGaWxlU3RyZWFtLT5Xcml0ZShkYXRhLCBzaXplLCBwcm9jZXNzZWRTaXplKTsNCit9DQorDQorSFJFU1VMVCBDVmlydEZpbGVTeXN0ZW06OkZsdXNoVG9EaXNrKGJvb2wgY2xvc2VMYXN0KQ0KK3sNCisgIGlmICghX291dEZpbGVTdHJlYW0pDQorICB7DQorICAgIF9vdXRGaWxlU3RyZWFtU3BlYyA9IG5ldyBDT3V0RmlsZVN0cmVhbTsNCisgICAgX291dEZpbGVTdHJlYW0gPSBfb3V0RmlsZVN0cmVhbVNwZWM7DQorICB9DQorICB3aGlsZSAoX251bUZsdXNoZWQgPCBGaWxlcy5TaXplKCkpDQorICB7DQorICAgIGNvbnN0IENWaXJ0RmlsZSAmZmlsZSA9IEZpbGVzW19udW1GbHVzaGVkXTsNCisgICAgY29uc3QgRlN0cmluZyBwYXRoID0gRGlyUHJlZml4ICsgdXMyZnMoR2V0Q29ycmVjdEZzUGF0aChmaWxlLk5hbWUpKTsNCisgICAgaWYgKCFfZmlsZUlzT3BlbikNCisgICAgew0KKyAgICAgIGlmICghX291dEZpbGVTdHJlYW1TcGVjLT5DcmVhdGUocGF0aCwgZmFsc2UpKQ0KKyAgICAgIHsNCisgICAgICAgIF9vdXRGaWxlU3RyZWFtLlJlbGVhc2UoKTsNCisgICAgICAgIHJldHVybiBFX0ZBSUw7DQorICAgICAgICAvLyBNZXNzYWdlQm94TXlFcnJvcihVU3RyaW5nKEwiQ2FuJ3QgY3JlYXRlIGZpbGUgIikgKyBmczJ1cyh0ZW1wRmlsZVBhdGgpKTsNCisgICAgICB9DQorICAgICAgX2ZpbGVJc09wZW4gPSB0cnVlOw0KKyAgICAgIFJJTk9LKFdyaXRlU3RyZWFtKF9vdXRGaWxlU3RyZWFtLCBmaWxlLkRhdGEsIChzaXplX3QpZmlsZS5TaXplKSk7DQorICAgIH0NCisgICAgaWYgKF9udW1GbHVzaGVkID09IEZpbGVzLlNpemUoKSAtIDEgJiYgIWNsb3NlTGFzdCkNCisgICAgICBicmVhazsNCisgICAgaWYgKGZpbGUuQ1RpbWVEZWZpbmVkIHx8DQorICAgICAgICBmaWxlLkFUaW1lRGVmaW5lZCB8fA0KKyAgICAgICAgZmlsZS5NVGltZURlZmluZWQpDQorICAgICAgX291dEZpbGVTdHJlYW1TcGVjLT5TZXRUaW1lKA0KKyAgICAgICAgICBmaWxlLkNUaW1lRGVmaW5lZCA/ICZmaWxlLkNUaW1lIDogTlVMTCwNCisgICAgICAgICAgZmlsZS5BVGltZURlZmluZWQgPyAmZmlsZS5BVGltZSA6IE5VTEwsDQorICAgICAgICAgIGZpbGUuTVRpbWVEZWZpbmVkID8gJmZpbGUuTVRpbWUgOiBOVUxMKTsNCisgICAgX291dEZpbGVTdHJlYW1TcGVjLT5DbG9zZSgpOw0KKyAgICBfbnVtRmx1c2hlZCsrOw0KKyAgICBfZmlsZUlzT3BlbiA9IGZhbHNlOw0KKyAgICBpZiAoZmlsZS5BdHRyaWJEZWZpbmVkKQ0KKyAgICAgIE5EaXI6OlNldEZpbGVBdHRyaWIocGF0aCwgZmlsZS5BdHRyaWIpOw0KKyAgfQ0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvRXh0cmFjdENhbGxiYWNrLmggYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0V4dHJhY3RDYWxsYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYTgzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0V4dHJhY3RDYWxsYmFjay5oCkBAIC0wLDAgKzEsMzMwIEBACisvLyBFeHRyYWN0Q2FsbGJhY2suaA0KKw0KKyNpZm5kZWYgX19FWFRSQUNUX0NBTExCQUNLX0gNCisjZGVmaW5lIF9fRVhUUkFDVF9DQUxMQkFDS19IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL0MvQWxsb2MuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015Q29tLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorDQorI2lmbmRlZiBfU0ZYDQorI2luY2x1ZGUgIi4uL0FnZW50L0lGb2xkZXJBcmNoaXZlLmgiDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9BcmNoaXZlRXh0cmFjdENhbGxiYWNrLmgiDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9BcmNoaXZlT3BlbkNhbGxiYWNrLmgiDQorDQorI2lmbmRlZiBfTk9fQ1JZUFRPDQorI2luY2x1ZGUgIi4uLy4uL0lQYXNzd29yZC5oIg0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgX1NGWA0KKyNpbmNsdWRlICJJRm9sZGVyLmgiDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIlByb2dyZXNzRGlhbG9nMi5oIg0KKw0KKyNpZmRlZiBMQU5HDQorI2luY2x1ZGUgIkxhbmdVdGlscy5oIg0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgX1NGWA0KKw0KK2NsYXNzIENHcm93QnVmDQorew0KKyAgQnl0ZSAqX2l0ZW1zOw0KKyAgc2l6ZV90IF9zaXplOw0KKw0KKyAgQ0dyb3dCdWYoY29uc3QgQ0dyb3dCdWYgJmJ1ZmZlcik7DQorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDR3Jvd0J1ZiAmYnVmZmVyKTsNCisNCitwdWJsaWM6DQorICBib29sIFJlQWxsb2NfS2VlcERhdGEoc2l6ZV90IG5ld1NpemUsIHNpemVfdCBrZWVwU2l6ZSkNCisgIHsNCisgICAgdm9pZCAqYnVmID0gTXlBbGxvYyhuZXdTaXplKTsNCisgICAgaWYgKCFidWYpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBtZW1jcHkoYnVmLCBfaXRlbXMsIGtlZXBTaXplKTsNCisgICAgTXlGcmVlKF9pdGVtcyk7DQorICAgIF9pdGVtcyA9IChCeXRlICopYnVmOw0KKyAgICBfc2l6ZSA9IG5ld1NpemU7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKw0KKyAgQ0dyb3dCdWYoKTogX2l0ZW1zKDApLCBfc2l6ZSgwKSB7fQ0KKyAgfkNHcm93QnVmKCkgeyBNeUZyZWUoX2l0ZW1zKTsgfQ0KKw0KKyAgb3BlcmF0b3IgQnl0ZSAqKCkgeyByZXR1cm4gX2l0ZW1zOyB9Ow0KKyAgb3BlcmF0b3IgY29uc3QgQnl0ZSAqKCkgY29uc3QgeyByZXR1cm4gX2l0ZW1zOyB9Ow0KKyAgc2l6ZV90IFNpemUoKSBjb25zdCB7IHJldHVybiBfc2l6ZTsgfQ0KK307DQorDQorc3RydWN0IENWaXJ0RmlsZQ0KK3sNCisgIENHcm93QnVmIERhdGE7DQorICANCisgIFVJbnQ2NCBTaXplOyAvLyByZWFsIHNpemUNCisgIFVJbnQ2NCBFeHBlY3RlZFNpemU7IC8vIHRoZSBzaXplIGZyb20gcHJvcHMgcmVxdWVzdC4gMCBpZiB1bmtub3duDQorDQorICBVU3RyaW5nIE5hbWU7DQorDQorICBib29sIENUaW1lRGVmaW5lZDsNCisgIGJvb2wgQVRpbWVEZWZpbmVkOw0KKyAgYm9vbCBNVGltZURlZmluZWQ7DQorICBib29sIEF0dHJpYkRlZmluZWQ7DQorICANCisgIGJvb2wgSXNEaXI7DQorICBib29sIElzQWx0U3RyZWFtOw0KKyAgDQorICBEV09SRCBBdHRyaWI7DQorDQorICBGSUxFVElNRSBDVGltZTsNCisgIEZJTEVUSU1FIEFUaW1lOw0KKyAgRklMRVRJTUUgTVRpbWU7DQorDQorICBDVmlydEZpbGUoKToNCisgICAgQ1RpbWVEZWZpbmVkKGZhbHNlKSwNCisgICAgQVRpbWVEZWZpbmVkKGZhbHNlKSwNCisgICAgTVRpbWVEZWZpbmVkKGZhbHNlKSwNCisgICAgQXR0cmliRGVmaW5lZChmYWxzZSksDQorICAgIElzRGlyKGZhbHNlKSwNCisgICAgSXNBbHRTdHJlYW0oZmFsc2UpIHt9DQorfTsNCisNCitjbGFzcyBDVmlydEZpbGVTeXN0ZW06DQorICBwdWJsaWMgSVNlcXVlbnRpYWxPdXRTdHJlYW0sDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIFVJbnQ2NCBfdG90YWxBbGxvY1NpemU7DQorDQorICBzaXplX3QgX3BvczsNCisgIHVuc2lnbmVkIF9udW1GbHVzaGVkOw0KKyAgYm9vbCBfZmlsZUlzT3BlbjsNCisgIGJvb2wgX2ZpbGVNb2RlOw0KKyAgQ091dEZpbGVTdHJlYW0gKl9vdXRGaWxlU3RyZWFtU3BlYzsNCisgIENNeUNvbVB0cjxJU2VxdWVudGlhbE91dFN0cmVhbT4gX291dEZpbGVTdHJlYW07DQorcHVibGljOg0KKyAgQ09iamVjdFZlY3RvcjxDVmlydEZpbGU+IEZpbGVzOw0KKyAgVUludDY0IE1heFRvdGFsQWxsb2NTaXplOw0KKyAgRlN0cmluZyBEaXJQcmVmaXg7DQorIA0KKyAgQ1ZpcnRGaWxlICZBZGROZXdGaWxlKCkNCisgIHsNCisgICAgaWYgKCFGaWxlcy5Jc0VtcHR5KCkpDQorICAgIHsNCisgICAgICBNYXhUb3RhbEFsbG9jU2l6ZSAtPSBGaWxlcy5CYWNrKCkuRGF0YS5TaXplKCk7DQorICAgIH0NCisgICAgcmV0dXJuIEZpbGVzLkFkZE5ldygpOw0KKyAgfQ0KKyAgSFJFU1VMVCBDbG9zZU1lbUZpbGUoKQ0KKyAgew0KKyAgICBpZiAoX2ZpbGVNb2RlKQ0KKyAgICB7DQorICAgICAgcmV0dXJuIEZsdXNoVG9EaXNrKHRydWUpOw0KKyAgICB9DQorICAgIENWaXJ0RmlsZSAmZmlsZSA9IEZpbGVzLkJhY2soKTsNCisgICAgaWYgKGZpbGUuRGF0YS5TaXplKCkgIT0gZmlsZS5TaXplKQ0KKyAgICB7DQorICAgICAgZmlsZS5EYXRhLlJlQWxsb2NfS2VlcERhdGEoKHNpemVfdClmaWxlLlNpemUsIChzaXplX3QpZmlsZS5TaXplKTsNCisgICAgfQ0KKyAgICByZXR1cm4gU19PSzsNCisgIH0NCisNCisgIGJvb2wgSXNTdHJlYW1Jbk1lbSgpIGNvbnN0DQorICB7DQorICAgIGlmIChfZmlsZU1vZGUpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBpZiAoRmlsZXMuU2l6ZSgpIDwgMSB8fCBGaWxlc1swXS5Jc0FsdFN0cmVhbSB8fCBGaWxlc1swXS5Jc0RpcikNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgc2l6ZV90IEdldE1lbVN0cmVhbVdyaXR0ZW5TaXplKCkgY29uc3QgeyByZXR1cm4gX3BvczsgfQ0KKw0KKyAgQ1ZpcnRGaWxlU3lzdGVtKCk6IF9vdXRGaWxlU3RyZWFtU3BlYyhOVUxMKSwgTWF4VG90YWxBbGxvY1NpemUoKFVJbnQ2NCkwIC0gMSkge30NCisNCisgIHZvaWQgSW5pdCgpDQorICB7DQorICAgIF90b3RhbEFsbG9jU2l6ZSA9IDA7DQorICAgIF9maWxlTW9kZSA9IGZhbHNlOw0KKyAgICBfcG9zID0gMDsNCisgICAgX251bUZsdXNoZWQgPSAwOw0KKyAgICBfZmlsZUlzT3BlbiA9IGZhbHNlOw0KKyAgfQ0KKw0KKyAgSFJFU1VMVCBDbG9zZUZpbGUoY29uc3QgRlN0cmluZyAmcGF0aCk7DQorICBIUkVTVUxUIEZsdXNoVG9EaXNrKGJvb2wgY2xvc2VMYXN0KTsNCisgIHNpemVfdCBHZXRQb3MoKSBjb25zdCB7IHJldHVybiBfcG9zOyB9DQorDQorICBNWV9VTktOT1dOX0lNUA0KKyAgU1RETUVUSE9EKFdyaXRlKShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICpwcm9jZXNzZWRTaXplKTsNCit9Ow0KKw0KKyNlbmRpZg0KKyAgDQorY2xhc3MgQ0V4dHJhY3RDYWxsYmFja0ltcDoNCisgIHB1YmxpYyBJRXh0cmFjdENhbGxiYWNrVUksIC8vIGl0IGluY2x1ZGVzIElGb2xkZXJBcmNoaXZlRXh0cmFjdENhbGxiYWNrDQorICBwdWJsaWMgSU9wZW5DYWxsYmFja1VJLA0KKyAgI2lmbmRlZiBfU0ZYDQorICBwdWJsaWMgSUZvbGRlck9wZXJhdGlvbnNFeHRyYWN0Q2FsbGJhY2ssDQorICBwdWJsaWMgSUZvbGRlckV4dHJhY3RUb1N0cmVhbUNhbGxiYWNrLA0KKyAgcHVibGljIElDb21wcmVzc1Byb2dyZXNzSW5mbywNCisgICNlbmRpZg0KKyAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICBwdWJsaWMgSUNyeXB0b0dldFRleHRQYXNzd29yZCwNCisgICNlbmRpZg0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBIUkVTVUxUIE1lc3NhZ2VFcnJvcihjb25zdCBjaGFyICptZXNzYWdlLCBjb25zdCBGU3RyaW5nICZwYXRoKTsNCitwdWJsaWM6DQorICBNWV9RVUVSWUlOVEVSRkFDRV9CRUdJTjIoSUZvbGRlckFyY2hpdmVFeHRyYWN0Q2FsbGJhY2spDQorICAjaWZuZGVmIF9TRlgNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKElGb2xkZXJPcGVyYXRpb25zRXh0cmFjdENhbGxiYWNrKQ0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoSUZvbGRlckV4dHJhY3RUb1N0cmVhbUNhbGxiYWNrKQ0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoSUNvbXByZXNzUHJvZ3Jlc3NJbmZvKQ0KKyAgI2VuZGlmDQorICAjaWZuZGVmIF9OT19DUllQVE8NCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKElDcnlwdG9HZXRUZXh0UGFzc3dvcmQpDQorICAjZW5kaWYNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VORA0KKyAgTVlfQUREUkVGX1JFTEVBU0UNCisNCisgIElOVEVSRkFDRV9JUHJvZ3Jlc3MoOykNCisgIElOVEVSRkFDRV9JT3BlbkNhbGxiYWNrVUkoOykNCisNCisgIC8vIElGb2xkZXJBcmNoaXZlRXh0cmFjdENhbGxiYWNrDQorICAvLyBTVERNRVRIT0QoU2V0VG90YWxGaWxlcykoVUludDY0IHRvdGFsKTsNCisgIC8vIFNURE1FVEhPRChTZXRDb21wbGV0ZWRGaWxlcykoY29uc3QgVUludDY0ICp2YWx1ZSk7DQorICBTVERNRVRIT0QoQXNrT3ZlcndyaXRlKSgNCisgICAgICBjb25zdCB3Y2hhcl90ICpleGlzdE5hbWUsIGNvbnN0IEZJTEVUSU1FICpleGlzdFRpbWUsIGNvbnN0IFVJbnQ2NCAqZXhpc3RTaXplLA0KKyAgICAgIGNvbnN0IHdjaGFyX3QgKm5ld05hbWUsIGNvbnN0IEZJTEVUSU1FICpuZXdUaW1lLCBjb25zdCBVSW50NjQgKm5ld1NpemUsDQorICAgICAgSW50MzIgKmFuc3dlcik7DQorICBTVERNRVRIT0QgKFByZXBhcmVPcGVyYXRpb24pKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGJvb2wgaXNGb2xkZXIsIEludDMyIGFza0V4dHJhY3RNb2RlLCBjb25zdCBVSW50NjQgKnBvc2l0aW9uKTsNCisNCisgIFNURE1FVEhPRChNZXNzYWdlRXJyb3IpKGNvbnN0IHdjaGFyX3QgKm1lc3NhZ2UpOw0KKyAgU1RETUVUSE9EKFNldE9wZXJhdGlvblJlc3VsdCkoSW50MzIgb3BlcmF0aW9uUmVzdWx0LCBib29sIGVuY3J5cHRlZCk7DQorDQorICAvLyBJRXh0cmFjdENhbGxiYWNrVUkNCisgIA0KKyAgSFJFU1VMVCBCZWZvcmVPcGVuKGNvbnN0IHdjaGFyX3QgKm5hbWUpOw0KKyAgSFJFU1VMVCBPcGVuUmVzdWx0KGNvbnN0IHdjaGFyX3QgKm5hbWUsIEhSRVNVTFQgcmVzdWx0LCBib29sIGVuY3J5cHRlZCk7DQorICBIUkVTVUxUIFNldEVycm9yKGludCBsZXZlbCwgY29uc3Qgd2NoYXJfdCAqbmFtZSwNCisgICAgICBVSW50MzIgZXJyb3JGbGFncywgY29uc3Qgd2NoYXJfdCAqZXJyb3JzLA0KKyAgICAgIFVJbnQzMiB3YXJuaW5nRmxhZ3MsIGNvbnN0IHdjaGFyX3QgKndhcm5pbmdzKTsNCisgIEhSRVNVTFQgVGhlcmVBcmVOb0ZpbGVzKCk7DQorICBIUkVTVUxUIEV4dHJhY3RSZXN1bHQoSFJFU1VMVCByZXN1bHQpOw0KKyAgSFJFU1VMVCBPcGVuVHlwZVdhcm5pbmcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqb2tUeXBlLCBjb25zdCB3Y2hhcl90ICplcnJvclR5cGUpOw0KKw0KKyAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICBIUkVTVUxUIFNldFBhc3N3b3JkKGNvbnN0IFVTdHJpbmcgJnBhc3N3b3JkKTsNCisgICNlbmRpZg0KKw0KKyAgI2lmbmRlZiBfU0ZYDQorICAvLyBJRm9sZGVyT3BlcmF0aW9uc0V4dHJhY3RDYWxsYmFjaw0KKyAgU1RETUVUSE9EKEFza1dyaXRlKSgNCisgICAgICBjb25zdCB3Y2hhcl90ICpzcmNQYXRoLA0KKyAgICAgIEludDMyIHNyY0lzRm9sZGVyLA0KKyAgICAgIGNvbnN0IEZJTEVUSU1FICpzcmNUaW1lLA0KKyAgICAgIGNvbnN0IFVJbnQ2NCAqc3JjU2l6ZSwNCisgICAgICBjb25zdCB3Y2hhcl90ICpkZXN0UGF0aFJlcXVlc3QsDQorICAgICAgQlNUUiAqZGVzdFBhdGhSZXN1bHQsDQorICAgICAgSW50MzIgKndyaXRlQW5zd2VyKTsNCisgIFNURE1FVEhPRChTaG93TWVzc2FnZSkoY29uc3Qgd2NoYXJfdCAqbWVzc2FnZSk7DQorICBTVERNRVRIT0QoU2V0Q3VycmVudEZpbGVQYXRoKShjb25zdCB3Y2hhcl90ICpmaWxlUGF0aCk7DQorICBTVERNRVRIT0QoU2V0TnVtRmlsZXMpKFVJbnQ2NCBudW1GaWxlcyk7DQorICBJTlRFUkZBQ0VfSUZvbGRlckV4dHJhY3RUb1N0cmVhbUNhbGxiYWNrKDspDQorICBTVERNRVRIT0QoU2V0UmF0aW9JbmZvKShjb25zdCBVSW50NjQgKmluU2l6ZSwgY29uc3QgVUludDY0ICpvdXRTaXplKTsNCisgICNlbmRpZg0KKw0KKyAgLy8gSUNyeXB0b0dldFRleHRQYXNzd29yZA0KKyAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICBTVERNRVRIT0QoQ3J5cHRvR2V0VGV4dFBhc3N3b3JkKShCU1RSICpwYXNzd29yZCk7DQorICAjZW5kaWYNCisNCitwcml2YXRlOg0KKyAgVVN0cmluZyBfY3VycmVudEFyY2hpdmVQYXRoOw0KKyAgYm9vbCBfbmVlZFdyaXRlQXJjaGl2ZVBhdGg7DQorDQorICBVU3RyaW5nIF9jdXJyZW50RmlsZVBhdGg7DQorICBib29sIF9pc0ZvbGRlcjsNCisNCisgIGJvb2wgX2lzQWx0U3RyZWFtOw0KKyAgVUludDY0IF9jdXJTaXplOw0KKyAgYm9vbCBfY3VyU2l6ZURlZmluZWQ7DQorICBVU3RyaW5nIF9maWxlUGF0aDsNCisgIC8vIGJvb2wgX2V4dHJhY3RNb2RlOw0KKyAgLy8gYm9vbCBfdGVzdE1vZGU7DQorICBib29sIF9uZXdWaXJ0RmlsZVdhc0FkZGVkOw0KKyAgYm9vbCBfbmVlZFVwZGF0ZVN0YXQ7DQorDQorDQorICBIUkVTVUxUIFNldEN1cnJlbnRGaWxlUGF0aDIoY29uc3Qgd2NoYXJfdCAqZmlsZVBhdGgpOw0KKyAgdm9pZCBBZGRFcnJvcl9NZXNzYWdlKExQQ1dTVFIgbWVzc2FnZSk7DQorDQorICAjaWZuZGVmIF9TRlgNCisgIGJvb2wgX2hhc2hTdHJlYW1XYXNVc2VkOw0KKyAgQ091dFN0cmVhbVdpdGhIYXNoICpfaGFzaFN0cmVhbVNwZWM7DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IF9oYXNoU3RyZWFtOw0KKyAgSUhhc2hDYWxjICpfaGFzaENhbGM7IC8vIGl0J3MgZm9yIHN0YXQgaW4gVGVzdCBvcGVyYXRpb24NCisgICNlbmRpZg0KKw0KK3B1YmxpYzoNCisNCisgICNpZm5kZWYgX1NGWA0KKyAgQ1ZpcnRGaWxlU3lzdGVtICpWaXJ0RmlsZVN5c3RlbVNwZWM7DQorICBDTXlDb21QdHI8SVNlcXVlbnRpYWxPdXRTdHJlYW0+IFZpcnRGaWxlU3lzdGVtOw0KKyAgI2VuZGlmDQorDQorICBib29sIFByb2Nlc3NBbHRTdHJlYW1zOw0KKw0KKyAgYm9vbCBTdHJlYW1Nb2RlOw0KKw0KKyAgQ1Byb2dyZXNzRGlhbG9nICpQcm9ncmVzc0RpYWxvZzsNCisgICNpZm5kZWYgX1NGWA0KKyAgVUludDY0IE51bUZvbGRlcnM7DQorICBVSW50NjQgTnVtRmlsZXM7DQorICBib29sIE5lZWRBZGRGaWxlOw0KKyAgI2VuZGlmDQorICBVSW50MzIgTnVtQXJjaGl2ZUVycm9yczsNCisgIGJvb2wgVGhlcmVBcmVNZXNzYWdlRXJyb3JzOw0KKyAgTkV4dHJhY3Q6Ok5PdmVyd3JpdGVNb2RlOjpFRW51bSBPdmVyd3JpdGVNb2RlOw0KKw0KKyAgI2lmbmRlZiBfTk9fQ1JZUFRPDQorICBib29sIFBhc3N3b3JkSXNEZWZpbmVkOw0KKyAgYm9vbCBQYXNzd29yZFdhc0Fza2VkOw0KKyAgVVN0cmluZyBQYXNzd29yZDsNCisgICNlbmRpZg0KKw0KKyAgQ0V4dHJhY3RDYWxsYmFja0ltcCgpOg0KKyAgICAjaWZuZGVmIF9OT19DUllQVE8NCisgICAgUGFzc3dvcmRJc0RlZmluZWQoZmFsc2UpLA0KKyAgICBQYXNzd29yZFdhc0Fza2VkKGZhbHNlKSwNCisgICAgI2VuZGlmDQorICAgIE92ZXJ3cml0ZU1vZGUoTkV4dHJhY3Q6Ok5PdmVyd3JpdGVNb2RlOjprQXNrKSwNCisgICAgU3RyZWFtTW9kZShmYWxzZSksDQorICAgIFByb2Nlc3NBbHRTdHJlYW1zKHRydWUpDQorICAgICNpZm5kZWYgX1NGWA0KKyAgICAsIF9oYXNoQ2FsYyhOVUxMKQ0KKyAgICAjZW5kaWYNCisgICAge30NCisgICANCisgIH5DRXh0cmFjdENhbGxiYWNrSW1wKCk7DQorICB2b2lkIEluaXQoKTsNCisNCisgICNpZm5kZWYgX1NGWA0KKyAgdm9pZCBTZXRIYXNoQ2FsYyhJSGFzaENhbGMgKmhhc2hDYWxjKSB7IF9oYXNoQ2FsYyA9IGhhc2hDYWxjOyB9DQorDQorICB2b2lkIFNldEhhc2hNZXRob2RzKElIYXNoQ2FsYyAqaGFzaCkNCisgIHsNCisgICAgaWYgKCFoYXNoKQ0KKyAgICAgIHJldHVybjsNCisgICAgX2hhc2hTdHJlYW1TcGVjID0gbmV3IENPdXRTdHJlYW1XaXRoSGFzaDsNCisgICAgX2hhc2hTdHJlYW0gPSBfaGFzaFN0cmVhbVNwZWM7DQorICAgIF9oYXNoU3RyZWFtU3BlYy0+X2hhc2ggPSBoYXNoOw0KKyAgfQ0KKyAgI2VuZGlmDQorDQorICBib29sIElzT0soKSBjb25zdCB7IHJldHVybiBOdW1BcmNoaXZlRXJyb3JzID09IDAgJiYgIVRoZXJlQXJlTWVzc2FnZUVycm9yczsgfQ0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Gb3JtYXRVdGlscy5jcHAgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0Zvcm1hdFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjdlZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Gb3JtYXRVdGlscy5jcHAKQEAgLTAsMCArMSwyOCBAQAorLy8gRm9ybWF0VXRpbHMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vSW50VG9TdHJpbmcuaCINCisNCisjaW5jbHVkZSAiRm9ybWF0VXRpbHMuaCINCisNCisjaW5jbHVkZSAiTGFuZ1V0aWxzLmgiDQorDQorVVN0cmluZyBOdW1iZXJUb1N0cmluZyhVSW50NjQgbnVtYmVyKQ0KK3sNCisgIHdjaGFyX3QgbnVtYmVyU3RyaW5nWzMyXTsNCisgIENvbnZlcnRVSW50NjRUb1N0cmluZyhudW1iZXIsIG51bWJlclN0cmluZyk7DQorICByZXR1cm4gbnVtYmVyU3RyaW5nOw0KK30NCisNCitVU3RyaW5nIE15Rm9ybWF0TmV3KGNvbnN0IFVTdHJpbmcgJmZvcm1hdCwgY29uc3QgVVN0cmluZyAmYXJndW1lbnQpDQorew0KKyAgVVN0cmluZyByZXN1bHQgPSBmb3JtYXQ7DQorICByZXN1bHQuUmVwbGFjZShMInswfSIsIGFyZ3VtZW50KTsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKw0KK1VTdHJpbmcgTXlGb3JtYXROZXcoVUlOVCByZXNvdXJjZUlELCBjb25zdCBVU3RyaW5nICZhcmd1bWVudCkNCit7DQorICByZXR1cm4gTXlGb3JtYXROZXcoTGFuZ1N0cmluZyhyZXNvdXJjZUlEKSwgYXJndW1lbnQpOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0Zvcm1hdFV0aWxzLmggYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0Zvcm1hdFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyMWNkMgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvRm9ybWF0VXRpbHMuaApAQCAtMCwwICsxLDE0IEBACisvLyBGb3JtYXRVdGlscy5oDQorDQorI2lmbmRlZiBfX0ZPUk1BVF9VVElMU19IDQorI2RlZmluZSBfX0ZPUk1BVF9VVElMU19IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeVR5cGVzLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeVN0cmluZy5oIg0KKw0KK1VTdHJpbmcgTnVtYmVyVG9TdHJpbmcoVUludDY0IG51bWJlcik7DQorDQorVVN0cmluZyBNeUZvcm1hdE5ldyhjb25zdCBVU3RyaW5nICZmb3JtYXQsIGNvbnN0IFVTdHJpbmcgJmFyZ3VtZW50KTsNCitVU3RyaW5nIE15Rm9ybWF0TmV3KFVJTlQgcmVzb3VyY2VJRCwgY29uc3QgVVN0cmluZyAmYXJndW1lbnQpOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvTGFuZ1V0aWxzLmggYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0xhbmdVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZDE0NzcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL0xhbmdVdGlscy5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIExhbmdVdGlscy5oDQorDQorI2lmbmRlZiBfX0xBTkdfVVRJTFNfSA0KKyNkZWZpbmUgX19MQU5HX1VUSUxTX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9SZXNvdXJjZVN0cmluZy5oIg0KKw0KKyNpZmRlZiBMQU5HDQorDQorZXh0ZXJuIFVTdHJpbmcgZ19MYW5nSUQ7DQorDQorc3RydWN0IENJRExhbmdQYWlyDQorew0KKyAgVUludDMyIENvbnRyb2xJRDsNCisgIFVJbnQzMiBMYW5nSUQ7DQorfTsNCisNCit2b2lkIFJlbG9hZExhbmcoKTsNCit2b2lkIExvYWRMYW5nT25lVGltZSgpOw0KK0ZTdHJpbmcgR2V0TGFuZ0RpclByZWZpeCgpOw0KKw0KK3ZvaWQgTGFuZ1NldERsZ0l0ZW1UZXh0KEhXTkQgZGlhbG9nLCBVSW50MzIgY29udHJvbElELCBVSW50MzIgbGFuZ0lEKTsNCit2b2lkIExhbmdTZXREbGdJdGVtcyhIV05EIGRpYWxvZywgY29uc3QgVUludDMyICppZHMsIHVuc2lnbmVkIG51bUl0ZW1zKTsNCit2b2lkIExhbmdTZXREbGdJdGVtc19Db2xvbihIV05EIGRpYWxvZywgY29uc3QgVUludDMyICppZHMsIHVuc2lnbmVkIG51bUl0ZW1zKTsNCit2b2lkIExhbmdTZXRXaW5kb3dUZXh0KEhXTkQgd2luZG93LCBVSW50MzIgbGFuZ0lEKTsNCisNCitVU3RyaW5nIExhbmdTdHJpbmcoVUludDMyIGxhbmdJRCk7DQordm9pZCBMYW5nU3RyaW5nKFVJbnQzMiBsYW5nSUQsIFVTdHJpbmcgJmRlc3QpOw0KK3ZvaWQgTGFuZ1N0cmluZ19Pbmx5RnJvbUxhbmdGaWxlKFVJbnQzMiBsYW5nSUQsIFVTdHJpbmcgJmRlc3QpOw0KKw0KKyNlbHNlDQorDQoraW5saW5lIFVTdHJpbmcgTGFuZ1N0cmluZyhVSW50MzIgbGFuZ0lEKSB7IHJldHVybiBOV2luZG93czo6TXlMb2FkU3RyaW5nKGxhbmdJRCk7IH0NCitpbmxpbmUgdm9pZCBMYW5nU3RyaW5nKFVJbnQzMiBsYW5nSUQsIFVTdHJpbmcgJmRlc3QpIHsgTldpbmRvd3M6Ok15TG9hZFN0cmluZyhsYW5nSUQsIGRlc3QpOyB9DQorDQorI2VuZGlmDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9NeVdpbmRvd3NOZXcuaCBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvTXlXaW5kb3dzTmV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmZTg0MwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvTXlXaW5kb3dzTmV3LmgKQEAgLTAsMCArMSw3NiBAQAorLy8gTXlXaW5kb3dzTmV3LmgNCisNCisjaWZuZGVmIF9fTVlfV0lORE9XU19ORVdfSA0KKyNkZWZpbmUgX19NWV9XSU5ET1dTX05FV19IDQorDQorI2lmZGVmIF9NU0NfVkVSDQorDQorI2luY2x1ZGUgPFNoT2JqSWRsLmg+DQorDQorI2lmbmRlZiBfX0lUYXNrYmFyTGlzdDNfSU5URVJGQUNFX0RFRklORURfXw0KKyNkZWZpbmUgX19JVGFza2Jhckxpc3QzX0lOVEVSRkFDRV9ERUZJTkVEX18NCisNCit0eXBlZGVmIGVudW0gVEhVTUJCVVRUT05GTEFHUw0KK3sNCisgIFRIQkZfRU5BQkxFRCA9IDAsDQorICBUSEJGX0RJU0FCTEVEID0gMHgxLA0KKyAgVEhCRl9ESVNNSVNTT05DTElDSyA9IDB4MiwNCisgIFRIQkZfTk9CQUNLR1JPVU5EID0gMHg0LA0KKyAgVEhCRl9ISURERU4gPSAweDgsDQorICBUSEJGX05PTklOVEVSQUNUSVZFID0gMHgxMA0KK30gVEhVTUJCVVRUT05GTEFHUzsNCisNCit0eXBlZGVmIGVudW0gVEhVTUJCVVRUT05NQVNLDQorew0KKyAgVEhCX0JJVE1BUCA9IDB4MSwNCisgIFRIQl9JQ09OID0gMHgyLA0KKyAgVEhCX1RPT0xUSVAgPSAweDQsDQorICBUSEJfRkxBR1MgPSAweDgNCit9IFRIVU1CQlVUVE9OTUFTSzsNCisNCisvLyAjaW5jbHVkZSA8cHNocGFjazguaD4NCisNCit0eXBlZGVmIHN0cnVjdCBUSFVNQkJVVFRPTg0KK3sNCisgIFRIVU1CQlVUVE9OTUFTSyBkd01hc2s7DQorICBVSU5UIGlJZDsNCisgIFVJTlQgaUJpdG1hcDsNCisgIEhJQ09OIGhJY29uOw0KKyAgV0NIQVIgc3pUaXBbMjYwXTsNCisgIFRIVU1CQlVUVE9ORkxBR1MgZHdGbGFnczsNCit9IFRIVU1CQlVUVE9OOw0KKw0KK3R5cGVkZWYgc3RydWN0IFRIVU1CQlVUVE9OICpMUFRIVU1CQlVUVE9OOw0KKw0KK3R5cGVkZWYgZW51bSBUQlBGTEFHDQorew0KKyAgVEJQRl9OT1BST0dSRVNTID0gMCwNCisgIFRCUEZfSU5ERVRFUk1JTkFURSA9IDB4MSwNCisgIFRCUEZfTk9STUFMID0gMHgyLA0KKyAgVEJQRl9FUlJPUiA9IDB4NCwNCisgIFRCUEZfUEFVU0VEID0gMHg4DQorfSBUQlBGTEFHOw0KKw0KK0RFRklORV9HVUlEKElJRF9JVGFza2Jhckxpc3QzLCAweEVBMUFGQjkxLCAweDlFMjgsIDB4NEI4NiwgMHg5MCwgMHhFOSwgMHg5RSwgMHg5RiwgMHg4QSwgMHg1RSwgMHhFRiwgMHhBRik7DQorDQorc3RydWN0IElUYXNrYmFyTGlzdDM6IHB1YmxpYyBJVGFza2Jhckxpc3QyDQorew0KKyAgU1RETUVUSE9EKFNldFByb2dyZXNzVmFsdWUpKEhXTkQgaHduZCwgVUxPTkdMT05HIHVsbENvbXBsZXRlZCwgVUxPTkdMT05HIHVsbFRvdGFsKSA9IDA7DQorICBTVERNRVRIT0QoU2V0UHJvZ3Jlc3NTdGF0ZSkoSFdORCBod25kLCBUQlBGTEFHIHRicEZsYWdzKSA9IDA7DQorICBTVERNRVRIT0QoUmVnaXN0ZXJUYWIpKEhXTkQgaHduZFRhYiwgSFdORCBod25kTURJKSA9IDA7DQorICBTVERNRVRIT0QoVW5yZWdpc3RlclRhYikoSFdORCBod25kVGFiKSA9IDA7DQorICBTVERNRVRIT0QoU2V0VGFiT3JkZXIpKEhXTkQgaHduZFRhYiwgSFdORCBod25kSW5zZXJ0QmVmb3JlKSA9IDA7DQorICBTVERNRVRIT0QoU2V0VGFiQWN0aXZlKShIV05EIGh3bmRUYWIsIEhXTkQgaHduZE1ESSwgRFdPUkQgZHdSZXNlcnZlZCkgPSAwOw0KKyAgU1RETUVUSE9EKFRodW1iQmFyQWRkQnV0dG9ucykoSFdORCBod25kLCBVSU5UIGNCdXR0b25zLCBMUFRIVU1CQlVUVE9OIHBCdXR0b24pID0gMDsNCisgIFNURE1FVEhPRChUaHVtYkJhclVwZGF0ZUJ1dHRvbnMpKEhXTkQgaHduZCwgVUlOVCBjQnV0dG9ucywgTFBUSFVNQkJVVFRPTiBwQnV0dG9uKSA9IDA7DQorICBTVERNRVRIT0QoVGh1bWJCYXJTZXRJbWFnZUxpc3QpKEhXTkQgaHduZCwgSElNQUdFTElTVCBoaW1sKSA9IDA7DQorICBTVERNRVRIT0QoU2V0T3ZlcmxheUljb24pKEhXTkQgaHduZCwgSElDT04gaEljb24sIExQQ1dTVFIgcHN6RGVzY3JpcHRpb24pID0gMDsNCisgIFNURE1FVEhPRChTZXRUaHVtYm5haWxUb29sdGlwKShIV05EIGh3bmQsIExQQ1dTVFIgcHN6VGlwKSA9IDA7DQorICBTVERNRVRIT0QoU2V0VGh1bWJuYWlsQ2xpcCkoSFdORCBod25kLCBSRUNUICpwcmNDbGlwKSA9IDA7DQorfTsNCisNCisjZW5kaWYNCisNCisjZW5kaWYNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL092ZXJ3cml0ZURpYWxvZy5jcHAgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL092ZXJ3cml0ZURpYWxvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0NTk0NQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvT3ZlcndyaXRlRGlhbG9nLmNwcApAQCAtMCwwICsxLDExOSBAQAorLy8gT3ZlcndyaXRlRGlhbG9nLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9Qcm9wVmFyaWFudENvbnYuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9SZXNvdXJjZVN0cmluZy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0NvbnRyb2wvU3RhdGljLmgiDQorDQorI2luY2x1ZGUgIkZvcm1hdFV0aWxzLmgiDQorI2luY2x1ZGUgIkxhbmdVdGlscy5oIg0KKyNpbmNsdWRlICJPdmVyd3JpdGVEaWFsb2cuaCINCisNCisjaW5jbHVkZSAiUHJvcGVydHlOYW1lUmVzLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KKw0KKyNpZmRlZiBMQU5HDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrTGFuZ0lEc1tdID0NCit7DQorICBJRFRfT1ZFUldSSVRFX0hFQURFUiwNCisgIElEVF9PVkVSV1JJVEVfUVVFU1RJT05fQkVHSU4sDQorICBJRFRfT1ZFUldSSVRFX1FVRVNUSU9OX0VORCwNCisgIElEQl9ZRVNfVE9fQUxMLA0KKyAgSURCX05PX1RPX0FMTCwNCisgIElEQl9BVVRPX1JFTkFNRQ0KK307DQorI2VuZGlmDQorDQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtDdXJyZW50RmlsZU5hbWVTaXplTGltaXQgPSA4MjsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQga0N1cnJlbnRGaWxlTmFtZVNpemVMaW1pdDIgPSAzMDsNCisNCit2b2lkIENPdmVyd3JpdGVEaWFsb2c6OlJlZHVjZVN0cmluZyhVU3RyaW5nICZzKQ0KK3sNCisgIHVuc2lnbmVkIHNpemUgPSBfaXNCaWcgPyBrQ3VycmVudEZpbGVOYW1lU2l6ZUxpbWl0IDoga0N1cnJlbnRGaWxlTmFtZVNpemVMaW1pdDI7DQorICBpZiAocy5MZW4oKSA+IHNpemUpDQorICB7DQorICAgIHMuRGVsZXRlKHNpemUgLyAyLCBzLkxlbigpIC0gc2l6ZSk7DQorICAgIHMuSW5zZXJ0KHNpemUgLyAyLCBMIiAuLi4gIik7DQorICB9DQorfQ0KKw0KK3ZvaWQgQ092ZXJ3cml0ZURpYWxvZzo6U2V0RmlsZUluZm9Db250cm9sKGludCB0ZXh0SUQsIGludCBpY29uSUQsDQorICAgIGNvbnN0IE5PdmVyd3JpdGVEaWFsb2c6OkNGaWxlSW5mbyAmZmlsZUluZm8pDQorew0KKyAgVVN0cmluZyBzaXplU3RyaW5nOw0KKyAgaWYgKGZpbGVJbmZvLlNpemVJc0RlZmluZWQpDQorICAgIHNpemVTdHJpbmcgPSBNeUZvcm1hdE5ldyhJRFNfRklMRV9TSVpFLCBOdW1iZXJUb1N0cmluZyhmaWxlSW5mby5TaXplKSk7DQorDQorICBjb25zdCBVU3RyaW5nICZmaWxlTmFtZSA9IGZpbGVJbmZvLk5hbWU7DQorICBpbnQgc2xhc2hQb3MgPSBmaWxlTmFtZS5SZXZlcnNlRmluZChXQ0hBUl9QQVRIX1NFUEFSQVRPUik7DQorICBVU3RyaW5nIHMxID0gZmlsZU5hbWUuTGVmdChzbGFzaFBvcyArIDEpOw0KKyAgVVN0cmluZyBzMiA9IGZpbGVOYW1lLlB0cihzbGFzaFBvcyArIDEpOw0KKw0KKyAgUmVkdWNlU3RyaW5nKHMxKTsNCisgIFJlZHVjZVN0cmluZyhzMik7DQorICANCisgIFVTdHJpbmcgcyA9IHMxOw0KKyAgcyArPSBMJ1xuJzsNCisgIHMgKz0gczI7DQorICBzICs9IEwnXG4nOw0KKyAgcyArPSBzaXplU3RyaW5nOw0KKyAgcyArPSBMJ1xuJzsNCisNCisgIGlmIChmaWxlSW5mby5UaW1lSXNEZWZpbmVkKQ0KKyAgew0KKyAgICBGSUxFVElNRSBsb2NhbEZpbGVUaW1lOw0KKyAgICBpZiAoIUZpbGVUaW1lVG9Mb2NhbEZpbGVUaW1lKCZmaWxlSW5mby5UaW1lLCAmbG9jYWxGaWxlVGltZSkpDQorICAgICAgdGhyb3cgNDE5MDQwMjsNCisgICAgcyArPSBMYW5nU3RyaW5nKElEU19QUk9QX01USU1FKTsNCisgICAgcyArPSBMIjogIjsNCisgICAgd2NoYXJfdCB0WzMyXTsNCisgICAgQ29udmVydEZpbGVUaW1lVG9TdHJpbmcobG9jYWxGaWxlVGltZSwgdCk7DQorICAgIHMgKz0gdDsNCisgIH0NCisNCisgIE5Db250cm9sOjpDRGlhbG9nQ2hpbGRDb250cm9sIGNvbnRyb2w7DQorICBjb250cm9sLkluaXQoKnRoaXMsIHRleHRJRCk7DQorICBjb250cm9sLlNldFRleHQocyk7DQorDQorICBTSEZJTEVJTkZPIHNoZWxsRmlsZUluZm87DQorICBpZiAoOjpTSEdldEZpbGVJbmZvKA0KKyAgICAgIEdldFN5c3RlbVN0cmluZyhmaWxlSW5mby5OYW1lKSwgRklMRV9BVFRSSUJVVEVfTk9STUFMLCAmc2hlbGxGaWxlSW5mbywNCisgICAgICBzaXplb2Yoc2hlbGxGaWxlSW5mbyksIFNIR0ZJX0lDT04gfCBTSEdGSV9VU0VGSUxFQVRUUklCVVRFUyB8IFNIR0ZJX0xBUkdFSUNPTikpDQorICB7DQorICAgIE5Db250cm9sOjpDU3RhdGljIHN0YXRpY0NvbnRvbDsNCisgICAgc3RhdGljQ29udG9sLkF0dGFjaChHZXRJdGVtKGljb25JRCkpOw0KKyAgICBzdGF0aWNDb250b2wuU2V0SWNvbihzaGVsbEZpbGVJbmZvLmhJY29uKTsNCisgIH0NCit9DQorDQorYm9vbCBDT3ZlcndyaXRlRGlhbG9nOjpPbkluaXQoKQ0KK3sNCisgICNpZmRlZiBMQU5HDQorICBMYW5nU2V0V2luZG93VGV4dCgqdGhpcywgSUREX09WRVJXUklURSk7DQorICBMYW5nU2V0RGxnSXRlbXMoKnRoaXMsIGtMYW5nSURzLCBBUlJBWV9TSVpFKGtMYW5nSURzKSk7DQorICAjZW5kaWYNCisgIFNldEZpbGVJbmZvQ29udHJvbChJRFRfT1ZFUldSSVRFX09MRF9GSUxFX1NJWkVfVElNRSwgSURJX09WRVJXUklURV9PTERfRklMRSwgT2xkRmlsZUluZm8pOw0KKyAgU2V0RmlsZUluZm9Db250cm9sKElEVF9PVkVSV1JJVEVfTkVXX0ZJTEVfU0laRV9USU1FLCBJRElfT1ZFUldSSVRFX05FV19GSUxFLCBOZXdGaWxlSW5mbyk7DQorICBOb3JtYWxpemVQb3NpdGlvbigpOw0KKyAgcmV0dXJuIENNb2RhbERpYWxvZzo6T25Jbml0KCk7DQorfQ0KKw0KK2Jvb2wgQ092ZXJ3cml0ZURpYWxvZzo6T25CdXR0b25DbGlja2VkKGludCBidXR0b25JRCwgSFdORCBidXR0b25IV05EKQ0KK3sNCisgIHN3aXRjaCAoYnV0dG9uSUQpDQorICB7DQorICAgIGNhc2UgSURZRVM6DQorICAgIGNhc2UgSUROTzoNCisgICAgY2FzZSBJREJfWUVTX1RPX0FMTDoNCisgICAgY2FzZSBJREJfTk9fVE9fQUxMOg0KKyAgICBjYXNlIElEQl9BVVRPX1JFTkFNRToNCisgICAgICBFbmQoYnV0dG9uSUQpOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgcmV0dXJuIENNb2RhbERpYWxvZzo6T25CdXR0b25DbGlja2VkKGJ1dHRvbklELCBidXR0b25IV05EKTsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9PdmVyd3JpdGVEaWFsb2cuaCBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvT3ZlcndyaXRlRGlhbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2NGE0NwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvT3ZlcndyaXRlRGlhbG9nLmgKQEAgLTAsMCArMSw2OSBAQAorLy8gT3ZlcndyaXRlRGlhbG9nLmgNCisNCisjaWZuZGVmIF9fT1ZFUldSSVRFX0RJQUxPR19IDQorI2RlZmluZSBfX09WRVJXUklURV9ESUFMT0dfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0NvbnRyb2wvRGlhbG9nLmgiDQorDQorI2luY2x1ZGUgIkRpYWxvZ1NpemUuaCINCisjaW5jbHVkZSAiT3ZlcndyaXRlRGlhbG9nUmVzLmgiDQorDQorbmFtZXNwYWNlIE5PdmVyd3JpdGVEaWFsb2cNCit7DQorICBzdHJ1Y3QgQ0ZpbGVJbmZvDQorICB7DQorICAgIGJvb2wgU2l6ZUlzRGVmaW5lZDsNCisgICAgYm9vbCBUaW1lSXNEZWZpbmVkOw0KKyAgICBVSW50NjQgU2l6ZTsNCisgICAgRklMRVRJTUUgVGltZTsNCisgICAgVVN0cmluZyBOYW1lOw0KKyAgICANCisgICAgdm9pZCBTZXRUaW1lKGNvbnN0IEZJTEVUSU1FICp0KQ0KKyAgICB7DQorICAgICAgaWYgKHQgPT0gMCkNCisgICAgICAgIFRpbWVJc0RlZmluZWQgPSBmYWxzZTsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgVGltZUlzRGVmaW5lZCA9IHRydWU7DQorICAgICAgICBUaW1lID0gKnQ7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHZvaWQgU2V0U2l6ZShjb25zdCBVSW50NjQgKnNpemUpDQorICAgIHsNCisgICAgICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICAgICAgU2l6ZUlzRGVmaW5lZCA9IGZhbHNlOw0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBTaXplSXNEZWZpbmVkID0gdHJ1ZTsNCisgICAgICAgIFNpemUgPSAqc2l6ZTsNCisgICAgICB9DQorICAgIH0NCisgIH07DQorfQ0KKw0KK2NsYXNzIENPdmVyd3JpdGVEaWFsb2c6IHB1YmxpYyBOV2luZG93czo6TkNvbnRyb2w6OkNNb2RhbERpYWxvZw0KK3sNCisgIGJvb2wgX2lzQmlnOw0KKw0KKyAgdm9pZCBTZXRGaWxlSW5mb0NvbnRyb2woaW50IHRleHRJRCwgaW50IGljb25JRCwgY29uc3QgTk92ZXJ3cml0ZURpYWxvZzo6Q0ZpbGVJbmZvICZmaWxlSW5mbyk7DQorICB2aXJ0dWFsIGJvb2wgT25Jbml0KCk7DQorICBib29sIE9uQnV0dG9uQ2xpY2tlZChpbnQgYnV0dG9uSUQsIEhXTkQgYnV0dG9uSFdORCk7DQorICB2b2lkIFJlZHVjZVN0cmluZyhVU3RyaW5nICZzKTsNCisNCitwdWJsaWM6DQorICBJTlRfUFRSIENyZWF0ZShIV05EIHBhcmVudCA9IDApDQorICB7DQorICAgIEJJR19ESUFMT0dfU0laRSgyODAsIDIwMCk7DQorICAgICNpZmRlZiBVTkRFUl9DRQ0KKyAgICBfaXNCaWcgPSBpc0JpZzsNCisgICAgI2Vsc2UNCisgICAgX2lzQmlnID0gdHJ1ZTsNCisgICAgI2VuZGlmDQorICAgIHJldHVybiBDTW9kYWxEaWFsb2c6OkNyZWF0ZShTSVpFRF9ESUFMT0coSUREX09WRVJXUklURSksIHBhcmVudCk7DQorICB9DQorDQorICBOT3ZlcndyaXRlRGlhbG9nOjpDRmlsZUluZm8gT2xkRmlsZUluZm87DQorICBOT3ZlcndyaXRlRGlhbG9nOjpDRmlsZUluZm8gTmV3RmlsZUluZm87DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL092ZXJ3cml0ZURpYWxvZy5yYyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvT3ZlcndyaXRlRGlhbG9nLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjQ4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL092ZXJ3cml0ZURpYWxvZy5yYwpAQCAtMCwwICsxLDkxIEBACisjaW5jbHVkZSAiT3ZlcndyaXRlRGlhbG9nUmVzLmgiDQorI2luY2x1ZGUgIi4uLy4uL0d1aUNvbW1vbi5yYyINCisNCisjZGVmaW5lIHhjIDI4MA0KKyNkZWZpbmUgeWMgMjAwDQorDQorI3VuZGVmIGljb25TaXplDQorI2RlZmluZSBpY29uU2l6ZSAyNA0KKw0KKyN1bmRlZiB4DQorI3VuZGVmIGZ4DQorI3VuZGVmIGZ5DQorI2RlZmluZSB4IChtICsgaWNvblNpemUgKyBtKQ0KKyNkZWZpbmUgZnggKHhjIC0gaWNvblNpemUgLSBtKQ0KKyNkZWZpbmUgZnkgNTANCisNCisjZGVmaW5lIGJTaXplQmlnIDEwNA0KKyN1bmRlZiBieDENCisjZGVmaW5lIGJ4MSAoeHMgLSBtIC0gYlNpemVCaWcpDQorDQorSUREX09WRVJXUklURSAgRElBTE9HICAwLCAwLCB4cywgeXMgIE1ZX01PREFMX0RJQUxPR19TVFlMRSAgTVlfRk9OVA0KK0NBUFRJT04gIkNvbmZpcm0gRmlsZSBSZXBsYWNlIg0KK0JFR0lODQorICBMVEVYVCAgIkRlc3RpbmF0aW9uIGZvbGRlciBhbHJlYWR5IGNvbnRhaW5zIHByb2Nlc3NlZCBmaWxlLiIsIElEVF9PVkVSV1JJVEVfSEVBREVSLCBtLCA3LCB4YywgOA0KKyAgTFRFWFQgICJXb3VsZCB5b3UgbGlrZSB0byByZXBsYWNlIHRoZSBleGlzdGluZyBmaWxlIiwgSURUX09WRVJXUklURV9RVUVTVElPTl9CRUdJTiwgbSwgMjgsIHhjLCA4DQorICANCisgIElDT04gICAiIiwgSURJX09WRVJXUklURV9PTERfRklMRSwgICAgICAgICAgICAgbSwgIDQ0LCBpY29uU2l6ZSwgaWNvblNpemUNCisgIExURVhUICAiIiwgSURUX09WRVJXUklURV9PTERfRklMRV9TSVpFX1RJTUUsICAgeCwgIDQ0LCBmeCwgZnksIFNTX05PUFJFRklYDQorICANCisgIExURVhUICAid2l0aCB0aGlzIG9uZT8iLCBJRFRfT1ZFUldSSVRFX1FVRVNUSU9OX0VORCwgbSwgIDk4LCB4YywgOA0KKw0KKyAgSUNPTiAgICIiLCBJRElfT1ZFUldSSVRFX05FV19GSUxFLCAgICAgICAgICAgICBtLCAxMTQsIGljb25TaXplLCBpY29uU2l6ZQ0KKyAgTFRFWFQgICIiLCBJRFRfT1ZFUldSSVRFX05FV19GSUxFX1NJWkVfVElNRSwgICB4LCAxMTQsIGZ4LCBmeSwgU1NfTk9QUkVGSVgNCisgIA0KKyAgUFVTSEJVVFRPTiAgIiZZZXMiLCAgICAgICAgIElEWUVTLCAgICAgICAgICAgICBieDMsIGJ5MiwgYnhzLCBieXMNCisgIFBVU0hCVVRUT04gICJZZXMgdG8gJkFsbCIsICBJREJfWUVTX1RPX0FMTCwgICAgYngyLCBieTIsIGJ4cywgYnlzDQorICBQVVNIQlVUVE9OICAiQSZ1dG8gUmVuYW1lIiwgSURCX0FVVE9fUkVOQU1FLCAgIGJ4MSwgYnkyLCBiU2l6ZUJpZywgYnlzDQorICBQVVNIQlVUVE9OICAiJk5vIiwgICAgICAgICAgSUROTywgICAgICAgICAgICAgIGJ4MywgYnkxLCBieHMsIGJ5cw0KKyAgUFVTSEJVVFRPTiAgIk5vIHRvIEEmbGwiLCAgIElEQl9OT19UT19BTEwsICAgICBieDIsIGJ5MSwgYnhzLCBieXMNCisgIFBVU0hCVVRUT04gICImQ2FuY2VsIiwgICAgICBJRENBTkNFTCwgeHMgLSBtIC0gYnhzLCBieTEsIGJ4cywgYnlzDQorRU5EDQorDQorDQorI2lmZGVmIFVOREVSX0NFDQorDQorI3VuZGVmIG0NCisjdW5kZWYgeGMNCisjdW5kZWYgeWMNCisNCisjZGVmaW5lIG0gNA0KKyNkZWZpbmUgeGMgMTUyDQorI2RlZmluZSB5YyAxNDQNCisNCisjdW5kZWYgZnkNCisjZGVmaW5lIGZ5IDQwDQorDQorI3VuZGVmICBieHMNCisjZGVmaW5lIGJ4cyA0OA0KKw0KKyN1bmRlZiBieDENCisNCisjZGVmaW5lIGJ4MSAoeHMgLSBtIC0gYnhzKQ0KKw0KK0lERF9PVkVSV1JJVEVfMiAgRElBTE9HICAwLCAwLCB4cywgeXMgIE1ZX01PREFMX0RJQUxPR19TVFlMRSAgTVlfRk9OVA0KK0NBUFRJT04gIkNvbmZpcm0gRmlsZSBSZXBsYWNlIg0KK0JFR0lODQorICBMVEVYVCAgIldvdWxkIHlvdSBsaWtlIHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIGZpbGUiLCBJRFRfT1ZFUldSSVRFX1FVRVNUSU9OX0JFR0lOLCBtLCBtLCB4YywgOA0KKyAgDQorICBJQ09OICAgIiIsIElESV9PVkVSV1JJVEVfT0xEX0ZJTEUsICAgICAgICAgICAgIG0sICAyMCwgaWNvblNpemUsIGljb25TaXplDQorICBMVEVYVCAgIiIsIElEVF9PVkVSV1JJVEVfT0xEX0ZJTEVfU0laRV9USU1FLCAgIHgsICAyMCwgZngsIGZ5LCBTU19OT1BSRUZJWA0KKyAgDQorICBMVEVYVCAgIndpdGggdGhpcyBvbmU/IiwgSURUX09WRVJXUklURV9RVUVTVElPTl9FTkQsIG0sICA2MCwgeGMsIDgNCisNCisgIElDT04gICAiIiwgSURJX09WRVJXUklURV9ORVdfRklMRSwgICAgICAgICAgICAgbSwgIDcyLCBpY29uU2l6ZSwgaWNvblNpemUNCisgIExURVhUICAiIiwgSURUX09WRVJXUklURV9ORVdfRklMRV9TSVpFX1RJTUUsICAgeCwgIDcyLCBmeCwgZnksIFNTX05PUFJFRklYDQorICANCisgIFBVU0hCVVRUT04gICImWWVzIiwgICAgICAgICBJRFlFUywgICAgICAgICAgICAgYngzLCBieTIsIGJ4cywgYnlzDQorICBQVVNIQlVUVE9OICAiWWVzIHRvICZBbGwiLCAgSURCX1lFU19UT19BTEwsICAgIGJ4MiwgYnkyLCBieHMsIGJ5cw0KKyAgUFVTSEJVVFRPTiAgIkEmdXRvIFJlbmFtZSIsIElEQl9BVVRPX1JFTkFNRSwgICBieDEsIGJ5MiwgYnhzLCBieXMNCisgIFBVU0hCVVRUT04gICImTm8iLCAgICAgICAgICBJRE5PLCAgICAgICAgICAgICAgYngzLCBieTEsIGJ4cywgYnlzDQorICBQVVNIQlVUVE9OICAiTm8gdG8gQSZsbCIsICAgSURCX05PX1RPX0FMTCwgICAgIGJ4MiwgYnkxLCBieHMsIGJ5cw0KKyAgUFVTSEJVVFRPTiAgIiZDYW5jZWwiLCAgICAgIElEQ0FOQ0VMLCAgICAgICAgICBieDEsIGJ5MSwgYnhzLCBieXMNCitFTkQNCisNCisjZW5kaWYNCisNCisNCitTVFJJTkdUQUJMRQ0KK0JFR0lODQorICBJRFNfRklMRV9TSVpFICAiezB9IGJ5dGVzIg0KK0VORA0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvT3ZlcndyaXRlRGlhbG9nUmVzLmggYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL092ZXJ3cml0ZURpYWxvZ1Jlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmMwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL092ZXJ3cml0ZURpYWxvZ1Jlcy5oCkBAIC0wLDAgKzEsMTcgQEAKKyNkZWZpbmUgSUREX09WRVJXUklURSAgICAgMzUwMA0KKyNkZWZpbmUgSUREX09WRVJXUklURV8yICAxMzUwMA0KKw0KKyNkZWZpbmUgSURUX09WRVJXUklURV9IRUFERVIgICAgICAgICAgMzUwMQ0KKyNkZWZpbmUgSURUX09WRVJXUklURV9RVUVTVElPTl9CRUdJTiAgMzUwMg0KKyNkZWZpbmUgSURUX09WRVJXUklURV9RVUVTVElPTl9FTkQgICAgMzUwMw0KKyNkZWZpbmUgSURTX0ZJTEVfU0laRSAgICAgICAgICAgICAgICAgMzUwNA0KKw0KKyNkZWZpbmUgSURCX0FVVE9fUkVOQU1FICAgICAgICAgICAgICAgMzUwNQ0KKyNkZWZpbmUgSURCX1lFU19UT19BTEwgICAgICAgICAgICAgICAgIDQ0MA0KKyNkZWZpbmUgSURCX05PX1RPX0FMTCAgICAgICAgICAgICAgICAgIDQ0MQ0KKw0KKyNkZWZpbmUgSURJX09WRVJXUklURV9PTERfRklMRSAgICAgICAgICAgICAxMDANCisjZGVmaW5lIElESV9PVkVSV1JJVEVfTkVXX0ZJTEUgICAgICAgICAgICAgMTAxDQorDQorI2RlZmluZSBJRFRfT1ZFUldSSVRFX09MRF9GSUxFX1NJWkVfVElNRSAgIDEwMg0KKyNkZWZpbmUgSURUX09WRVJXUklURV9ORVdfRklMRV9TSVpFX1RJTUUgICAxMDMNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Bhc3N3b3JkRGlhbG9nLmNwcCBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvUGFzc3dvcmREaWFsb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTgzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Bhc3N3b3JkRGlhbG9nLmNwcApAQCAtMCwwICsxLDU4IEBACisvLyBQYXNzd29yZERpYWxvZy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIlBhc3N3b3JkRGlhbG9nLmgiDQorDQorI2lmZGVmIExBTkcNCisjaW5jbHVkZSAiTGFuZ1V0aWxzLmgiDQorI2VuZGlmDQorDQorI2lmZGVmIExBTkcNCitzdGF0aWMgY29uc3QgVUludDMyIGtMYW5nSURzW10gPQ0KK3sNCisgIElEVF9QQVNTV09SRF9FTlRFUiwNCisgIElEWF9QQVNTV09SRF9TSE9XDQorfTsNCisjZW5kaWYNCisNCit2b2lkIENQYXNzd29yZERpYWxvZzo6UmVhZENvbnRyb2xzKCkNCit7DQorICBfcGFzc3dvcmRFZGl0LkdldFRleHQoUGFzc3dvcmQpOw0KKyAgU2hvd1Bhc3N3b3JkID0gSXNCdXR0b25DaGVja2VkQm9vbChJRFhfUEFTU1dPUkRfU0hPVyk7DQorfQ0KKw0KK3ZvaWQgQ1Bhc3N3b3JkRGlhbG9nOjpTZXRUZXh0U3BlYygpDQorew0KKyAgX3Bhc3N3b3JkRWRpdC5TZXRQYXNzd29yZENoYXIoU2hvd1Bhc3N3b3JkID8gMDogVEVYVCgnKicpKTsNCisgIF9wYXNzd29yZEVkaXQuU2V0VGV4dChQYXNzd29yZCk7DQorfQ0KKw0KK2Jvb2wgQ1Bhc3N3b3JkRGlhbG9nOjpPbkluaXQoKQ0KK3sNCisgICNpZmRlZiBMQU5HDQorICBMYW5nU2V0V2luZG93VGV4dCgqdGhpcywgSUREX1BBU1NXT1JEKTsNCisgIExhbmdTZXREbGdJdGVtcygqdGhpcywga0xhbmdJRHMsIEFSUkFZX1NJWkUoa0xhbmdJRHMpKTsNCisgICNlbmRpZg0KKyAgX3Bhc3N3b3JkRWRpdC5BdHRhY2goR2V0SXRlbShJREVfUEFTU1dPUkRfUEFTU1dPUkQpKTsNCisgIENoZWNrQnV0dG9uKElEWF9QQVNTV09SRF9TSE9XLCBTaG93UGFzc3dvcmQpOw0KKyAgU2V0VGV4dFNwZWMoKTsNCisgIHJldHVybiBDTW9kYWxEaWFsb2c6Ok9uSW5pdCgpOw0KK30NCisNCitib29sIENQYXNzd29yZERpYWxvZzo6T25CdXR0b25DbGlja2VkKGludCBidXR0b25JRCwgSFdORCBidXR0b25IV05EKQ0KK3sNCisgIGlmIChidXR0b25JRCA9PSBJRFhfUEFTU1dPUkRfU0hPVykNCisgIHsNCisgICAgUmVhZENvbnRyb2xzKCk7DQorICAgIFNldFRleHRTcGVjKCk7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgcmV0dXJuIENEaWFsb2c6Ok9uQnV0dG9uQ2xpY2tlZChidXR0b25JRCwgYnV0dG9uSFdORCk7DQorfQ0KKw0KK3ZvaWQgQ1Bhc3N3b3JkRGlhbG9nOjpPbk9LKCkNCit7DQorICBSZWFkQ29udHJvbHMoKTsNCisgIENNb2RhbERpYWxvZzo6T25PSygpOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Bhc3N3b3JkRGlhbG9nLmggYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Bhc3N3b3JkRGlhbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1NmExYwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvUGFzc3dvcmREaWFsb2cuaApAQCAtMCwwICsxLDI4IEBACisvLyBQYXNzd29yZERpYWxvZy5oDQorDQorI2lmbmRlZiBfX1BBU1NXT1JEX0RJQUxPR19IDQorI2RlZmluZSBfX1BBU1NXT1JEX0RJQUxPR19IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvQ29udHJvbC9EaWFsb2cuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9Db250cm9sL0VkaXQuaCINCisNCisjaW5jbHVkZSAiUGFzc3dvcmREaWFsb2dSZXMuaCINCisNCitjbGFzcyBDUGFzc3dvcmREaWFsb2c6IHB1YmxpYyBOV2luZG93czo6TkNvbnRyb2w6OkNNb2RhbERpYWxvZw0KK3sNCisgIE5XaW5kb3dzOjpOQ29udHJvbDo6Q0VkaXQgX3Bhc3N3b3JkRWRpdDsNCisNCisgIHZpcnR1YWwgdm9pZCBPbk9LKCk7DQorICB2aXJ0dWFsIGJvb2wgT25Jbml0KCk7DQorICB2aXJ0dWFsIGJvb2wgT25CdXR0b25DbGlja2VkKGludCBidXR0b25JRCwgSFdORCBidXR0b25IV05EKTsNCisgIHZvaWQgU2V0VGV4dFNwZWMoKTsNCisgIHZvaWQgUmVhZENvbnRyb2xzKCk7DQorcHVibGljOg0KKyAgVVN0cmluZyBQYXNzd29yZDsNCisgIGJvb2wgU2hvd1Bhc3N3b3JkOw0KKyAgDQorICBDUGFzc3dvcmREaWFsb2coKTogU2hvd1Bhc3N3b3JkKGZhbHNlKSB7fQ0KKyAgSU5UX1BUUiBDcmVhdGUoSFdORCBwYXJlbnRXaW5kb3cgPSAwKSB7IHJldHVybiBDTW9kYWxEaWFsb2c6OkNyZWF0ZShJRERfUEFTU1dPUkQsIHBhcmVudFdpbmRvdyk7IH0NCit9Ow0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvUGFzc3dvcmREaWFsb2cucmMgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Bhc3N3b3JkRGlhbG9nLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZGQ1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Bhc3N3b3JkRGlhbG9nLnJjCkBAIC0wLDAgKzEsMTQgQEAKKyNpbmNsdWRlICJQYXNzd29yZERpYWxvZ1Jlcy5oIg0KKyNpbmNsdWRlICIuLi8uLi9HdWlDb21tb24ucmMiDQorDQorI2RlZmluZSB4YyAxNDANCisjZGVmaW5lIHljIDcyDQorDQorSUREX1BBU1NXT1JEICBESUFMT0cgIDAsIDAsIHhzLCB5cyAgTVlfTU9EQUxfRElBTE9HX1NUWUxFICBNWV9GT05UDQorQ0FQVElPTiAiRW50ZXIgcGFzc3dvcmQiDQorQkVHSU4NCisgIExURVhUICAgICImRW50ZXIgcGFzc3dvcmQ6IiwgSURUX1BBU1NXT1JEX0VOVEVSLCBtLCBtLCB4YywgOA0KKyAgRURJVFRFWFQgIElERV9QQVNTV09SRF9QQVNTV09SRCwgbSwgMjAsIHhjLCAxNCwgRVNfUEFTU1dPUkQgfCBFU19BVVRPSFNDUk9MTA0KKyAgQ09OVFJPTCAgIiZTaG93IHBhc3N3b3JkIiwgSURYX1BBU1NXT1JEX1NIT1csIE1ZX0NIRUNLQk9YLCBtLCA0MiwgeGMsIDEwDQorICBPS19DQU5DRUwNCitFTkQNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Bhc3N3b3JkRGlhbG9nUmVzLmggYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Bhc3N3b3JkRGlhbG9nUmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzMDBkNgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvUGFzc3dvcmREaWFsb2dSZXMuaApAQCAtMCwwICsxLDUgQEAKKyNkZWZpbmUgSUREX1BBU1NXT1JEICAgICAgICAzODAwDQorI2RlZmluZSBJRFRfUEFTU1dPUkRfRU5URVIgIDM4MDENCisjZGVmaW5lIElEWF9QQVNTV09SRF9TSE9XICAgMzgwMw0KKw0KKyNkZWZpbmUgSURFX1BBU1NXT1JEX1BBU1NXT1JEICAxMjANCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Byb2dyZXNzRGlhbG9nLmNwcCBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvUHJvZ3Jlc3NEaWFsb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OGIxYTQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Byb2dyZXNzRGlhbG9nLmNwcApAQCAtMCwwICsxLDE5NiBAQAorLy8gUHJvZ3Jlc3NEaWFsb2cuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vSW50VG9TdHJpbmcuaCINCisNCisjaW5jbHVkZSAicmVzb3VyY2UuaCINCisNCisjaW5jbHVkZSAiUHJvZ3Jlc3NEaWFsb2cuaCINCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQorDQorZXh0ZXJuIEhJTlNUQU5DRSBnX2hJbnN0YW5jZTsNCisNCitzdGF0aWMgY29uc3QgVUlOVF9QVFIga1RpbWVySUQgPSAzOw0KK3N0YXRpYyBjb25zdCBVSU5UIGtUaW1lckVsYXBzZSA9IDEwMDsNCisNCisjaWZkZWYgTEFORw0KKyNpbmNsdWRlICJMYW5nVXRpbHMuaCINCisjZW5kaWYNCisNCitIUkVTVUxUIENQcm9ncmVzc1N5bmM6OlByb2Nlc3NTdG9wQW5kUGF1c2UoKQ0KK3sNCisgIGZvciAoOzspDQorICB7DQorICAgIGlmIChHZXRTdG9wcGVkKCkpDQorICAgICAgcmV0dXJuIEVfQUJPUlQ7DQorICAgIGlmICghR2V0UGF1c2VkKCkpDQorICAgICAgYnJlYWs7DQorICAgIDo6U2xlZXAoMTAwKTsNCisgIH0NCisgIHJldHVybiBTX09LOw0KK30NCisNCisjaWZuZGVmIF9TRlgNCitDUHJvZ3Jlc3NEaWFsb2c6On5DUHJvZ3Jlc3NEaWFsb2coKQ0KK3sNCisgIEFkZFRvVGl0bGUoTCIiKTsNCit9DQordm9pZCBDUHJvZ3Jlc3NEaWFsb2c6OkFkZFRvVGl0bGUoTFBDV1NUUiBzKQ0KK3sNCisgIGlmIChNYWluV2luZG93ICE9IDApDQorICAgIE15U2V0V2luZG93VGV4dChNYWluV2luZG93LCBVU3RyaW5nKHMpICsgTWFpblRpdGxlKTsNCit9DQorI2VuZGlmDQorDQorDQorYm9vbCBDUHJvZ3Jlc3NEaWFsb2c6Ok9uSW5pdCgpDQorew0KKyAgX3JhbmdlID0gKFVJbnQ2NCkoSW50NjQpLTE7DQorICBfcHJldlBlcmNlbnRWYWx1ZSA9IC0xOw0KKw0KKyAgX3dhc0NyZWF0ZWQgPSB0cnVlOw0KKyAgX2RpYWxvZ0NyZWF0ZWRFdmVudC5TZXQoKTsNCisNCisgICNpZmRlZiBMQU5HDQorICBMYW5nU2V0RGxnSXRlbXMoKnRoaXMsIE5VTEwsIDApOw0KKyAgI2VuZGlmDQorDQorICBtX1Byb2dyZXNzQmFyLkF0dGFjaChHZXRJdGVtKElEQ19QUk9HUkVTUzEpKTsNCisNCisgIGlmIChJY29uSUQgPj0gMCkNCisgIHsNCisgICAgSElDT04gaWNvbiA9IExvYWRJY29uKGdfaEluc3RhbmNlLCBNQUtFSU5UUkVTT1VSQ0UoSWNvbklEKSk7DQorICAgIFNldEljb24oSUNPTl9CSUcsIGljb24pOw0KKyAgfQ0KKw0KKyAgX3RpbWVyID0gU2V0VGltZXIoa1RpbWVySUQsIGtUaW1lckVsYXBzZSk7DQorICBTZXRUZXh0KF90aXRsZSk7DQorICBDaGVja05lZWRDbG9zZSgpOw0KKyAgcmV0dXJuIENNb2RhbERpYWxvZzo6T25Jbml0KCk7DQorfQ0KKw0KK3ZvaWQgQ1Byb2dyZXNzRGlhbG9nOjpPbkNhbmNlbCgpIHsgU3luYy5TZXRTdG9wcGVkKHRydWUpOyB9DQordm9pZCBDUHJvZ3Jlc3NEaWFsb2c6Ok9uT0soKSB7IH0NCisNCit2b2lkIENQcm9ncmVzc0RpYWxvZzo6U2V0UmFuZ2UoVUludDY0IHJhbmdlKQ0KK3sNCisgIF9yYW5nZSA9IHJhbmdlOw0KKyAgX3BldmlvdXNQb3MgPSAoVUludDY0KShJbnQ2NCktMTsNCisgIF9jb252ZXJ0ZXIuSW5pdChyYW5nZSk7DQorICBtX1Byb2dyZXNzQmFyLlNldFJhbmdlMzIoMCAsIF9jb252ZXJ0ZXIuQ291bnQocmFuZ2UpKTsgLy8gVGVzdCBpdCBmb3IgMTAwJQ0KK30NCisNCit2b2lkIENQcm9ncmVzc0RpYWxvZzo6U2V0UG9zKFVJbnQ2NCBwb3MpDQorew0KKyAgYm9vbCByZWRyYXcgPSB0cnVlOw0KKyAgaWYgKHBvcyA8IF9yYW5nZSAmJiBwb3MgPiBfcGV2aW91c1BvcykNCisgIHsNCisgICAgVUludDY0IHBvc0RlbHRhID0gcG9zIC0gX3BldmlvdXNQb3M7DQorICAgIGlmIChwb3NEZWx0YSA8IChfcmFuZ2UgPj4gMTApKQ0KKyAgICAgIHJlZHJhdyA9IGZhbHNlOw0KKyAgfQ0KKyAgaWYgKHJlZHJhdykNCisgIHsNCisgICAgbV9Qcm9ncmVzc0Jhci5TZXRQb3MoX2NvbnZlcnRlci5Db3VudChwb3MpKTsgIC8vIFRlc3QgaXQgZm9yIDEwMCUNCisgICAgX3BldmlvdXNQb3MgPSBwb3M7DQorICB9DQorfQ0KKw0KK2Jvb2wgQ1Byb2dyZXNzRGlhbG9nOjpPblRpbWVyKFdQQVJBTSAvKiB0aW1lcklEICovLCBMUEFSQU0gLyogY2FsbGJhY2sgKi8pDQorew0KKyAgaWYgKFN5bmMuR2V0UGF1c2VkKCkpDQorICAgIHJldHVybiB0cnVlOw0KKw0KKyAgQ2hlY2tOZWVkQ2xvc2UoKTsNCisNCisgIFVJbnQ2NCB0b3RhbCwgY29tcGxldGVkOw0KKyAgU3luYy5HZXRQcm9ncmVzcyh0b3RhbCwgY29tcGxldGVkKTsNCisgIGlmICh0b3RhbCAhPSBfcmFuZ2UpDQorICAgIFNldFJhbmdlKHRvdGFsKTsNCisgIFNldFBvcyhjb21wbGV0ZWQpOw0KKw0KKyAgaWYgKHRvdGFsID09IDApDQorICAgIHRvdGFsID0gMTsNCisNCisgIGludCBwZXJjZW50VmFsdWUgPSAoaW50KShjb21wbGV0ZWQgKiAxMDAgLyB0b3RhbCk7DQorICBpZiAocGVyY2VudFZhbHVlICE9IF9wcmV2UGVyY2VudFZhbHVlKQ0KKyAgew0KKyAgICB3Y2hhcl90IHNbNjRdOw0KKyAgICBDb252ZXJ0VUludDY0VG9TdHJpbmcocGVyY2VudFZhbHVlLCBzKTsNCisgICAgVVN0cmluZyB0aXRsZSA9IHM7DQorICAgIHRpdGxlICs9IEwiJSAiOw0KKyAgICBTZXRUZXh0KHRpdGxlICsgX3RpdGxlKTsNCisgICAgI2lmbmRlZiBfU0ZYDQorICAgIEFkZFRvVGl0bGUodGl0bGUgKyBNYWluQWRkVGl0bGUpOw0KKyAgICAjZW5kaWYNCisgICAgX3ByZXZQZXJjZW50VmFsdWUgPSBwZXJjZW50VmFsdWU7DQorICB9DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBDUHJvZ3Jlc3NEaWFsb2c6Ok9uTWVzc2FnZShVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pDQorew0KKyAgc3dpdGNoKG1lc3NhZ2UpDQorICB7DQorICAgIGNhc2Uga0Nsb3NlTWVzc2FnZToNCisgICAgew0KKyAgICAgIEtpbGxUaW1lcihfdGltZXIpOw0KKyAgICAgIF90aW1lciA9IDA7DQorICAgICAgaWYgKF9pbkNhbmNlbE1lc3NhZ2VCb3gpDQorICAgICAgew0KKyAgICAgICAgX2V4dGVybmFsQ2xvc2VNZXNzYWdlV2FzUmVjZWl2ZWQgPSB0cnVlOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBPbkV4dGVybmFsQ2xvc2VNZXNzYWdlKCk7DQorICAgIH0NCisgICAgLyoNCisgICAgY2FzZSBXTV9TRVRURVhUOg0KKyAgICB7DQorICAgICAgaWYgKF90aW1lciA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgICAgKi8NCisgIH0NCisgIHJldHVybiBDTW9kYWxEaWFsb2c6Ok9uTWVzc2FnZShtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7DQorfQ0KKw0KK2Jvb2wgQ1Byb2dyZXNzRGlhbG9nOjpPbkJ1dHRvbkNsaWNrZWQoaW50IGJ1dHRvbklELCBIV05EIGJ1dHRvbkhXTkQpDQorew0KKyAgc3dpdGNoKGJ1dHRvbklEKQ0KKyAgew0KKyAgICBjYXNlIElEQ0FOQ0VMOg0KKyAgICB7DQorICAgICAgYm9vbCBwYXVzZWQgPSBTeW5jLkdldFBhdXNlZCgpOw0KKyAgICAgIFN5bmMuU2V0UGF1c2VkKHRydWUpOw0KKyAgICAgIF9pbkNhbmNlbE1lc3NhZ2VCb3ggPSB0cnVlOw0KKyAgICAgIGludCByZXMgPSA6Ok1lc3NhZ2VCb3hXKCp0aGlzLCBMIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjYW5jZWw/IiwgX3RpdGxlLCBNQl9ZRVNOT0NBTkNFTCk7DQorICAgICAgX2luQ2FuY2VsTWVzc2FnZUJveCA9IGZhbHNlOw0KKyAgICAgIFN5bmMuU2V0UGF1c2VkKHBhdXNlZCk7DQorICAgICAgaWYgKHJlcyA9PSBJRENBTkNFTCB8fCByZXMgPT0gSUROTykNCisgICAgICB7DQorICAgICAgICBpZiAoX2V4dGVybmFsQ2xvc2VNZXNzYWdlV2FzUmVjZWl2ZWQpDQorICAgICAgICAgIE9uRXh0ZXJuYWxDbG9zZU1lc3NhZ2UoKTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIENNb2RhbERpYWxvZzo6T25CdXR0b25DbGlja2VkKGJ1dHRvbklELCBidXR0b25IV05EKTsNCit9DQorDQordm9pZCBDUHJvZ3Jlc3NEaWFsb2c6OkNoZWNrTmVlZENsb3NlKCkNCit7DQorICBpZiAoX25lZWRDbG9zZSkNCisgIHsNCisgICAgUG9zdE1lc3NhZ2Uoa0Nsb3NlTWVzc2FnZSk7DQorICAgIF9uZWVkQ2xvc2UgPSBmYWxzZTsNCisgIH0NCit9DQorDQorYm9vbCBDUHJvZ3Jlc3NEaWFsb2c6Ok9uRXh0ZXJuYWxDbG9zZU1lc3NhZ2UoKQ0KK3sNCisgIEVuZCgwKTsNCisgIHJldHVybiB0cnVlOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Byb2dyZXNzRGlhbG9nLmggYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Byb2dyZXNzRGlhbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2NzAyZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvUHJvZ3Jlc3NEaWFsb2cuaApAQCAtMCwwICsxLDE3MCBAQAorLy8gUHJvZ3Jlc3NEaWFsb2cuaA0KKw0KKyNpZm5kZWYgX19QUk9HUkVTU19ESUFMT0dfSA0KKyNkZWZpbmUgX19QUk9HUkVTU19ESUFMT0dfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1N5bmNocm9uaXphdGlvbi5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1RocmVhZC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0NvbnRyb2wvRGlhbG9nLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvQ29udHJvbC9Qcm9ncmVzc0Jhci5oIg0KKw0KKyNpbmNsdWRlICJQcm9ncmVzc0RpYWxvZ1Jlcy5oIg0KKw0KK2NsYXNzIENQcm9ncmVzc1N5bmMNCit7DQorICBOV2luZG93czo6TlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbiBfY3M7DQorICBib29sIF9zdG9wcGVkOw0KKyAgYm9vbCBfcGF1c2VkOw0KKyAgVUludDY0IF90b3RhbDsNCisgIFVJbnQ2NCBfY29tcGxldGVkOw0KK3B1YmxpYzoNCisgIENQcm9ncmVzc1N5bmMoKTogX3N0b3BwZWQoZmFsc2UpLCBfcGF1c2VkKGZhbHNlKSwgX3RvdGFsKDEpLCBfY29tcGxldGVkKDApIHt9DQorDQorICBIUkVTVUxUIFByb2Nlc3NTdG9wQW5kUGF1c2UoKTsNCisgIGJvb2wgR2V0U3RvcHBlZCgpDQorICB7DQorICAgIE5XaW5kb3dzOjpOU3luY2hyb25pemF0aW9uOjpDQ3JpdGljYWxTZWN0aW9uTG9jayBsb2NrKF9jcyk7DQorICAgIHJldHVybiBfc3RvcHBlZDsNCisgIH0NCisgIHZvaWQgU2V0U3RvcHBlZChib29sIHZhbHVlKQ0KKyAgew0KKyAgICBOV2luZG93czo6TlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbkxvY2sgbG9jayhfY3MpOw0KKyAgICBfc3RvcHBlZCA9IHZhbHVlOw0KKyAgfQ0KKyAgYm9vbCBHZXRQYXVzZWQoKQ0KKyAgew0KKyAgICBOV2luZG93czo6TlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbkxvY2sgbG9jayhfY3MpOw0KKyAgICByZXR1cm4gX3BhdXNlZDsNCisgIH0NCisgIHZvaWQgU2V0UGF1c2VkKGJvb2wgdmFsdWUpDQorICB7DQorICAgIE5XaW5kb3dzOjpOU3luY2hyb25pemF0aW9uOjpDQ3JpdGljYWxTZWN0aW9uTG9jayBsb2NrKF9jcyk7DQorICAgIF9wYXVzZWQgPSB2YWx1ZTsNCisgIH0NCisgIHZvaWQgU2V0UHJvZ3Jlc3MoVUludDY0IHRvdGFsLCBVSW50NjQgY29tcGxldGVkKQ0KKyAgew0KKyAgICBOV2luZG93czo6TlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbkxvY2sgbG9jayhfY3MpOw0KKyAgICBfdG90YWwgPSB0b3RhbDsNCisgICAgX2NvbXBsZXRlZCA9IGNvbXBsZXRlZDsNCisgIH0NCisgIHZvaWQgU2V0UG9zKFVJbnQ2NCBjb21wbGV0ZWQpDQorICB7DQorICAgIE5XaW5kb3dzOjpOU3luY2hyb25pemF0aW9uOjpDQ3JpdGljYWxTZWN0aW9uTG9jayBsb2NrKF9jcyk7DQorICAgIF9jb21wbGV0ZWQgPSBjb21wbGV0ZWQ7DQorICB9DQorICB2b2lkIEdldFByb2dyZXNzKFVJbnQ2NCAmdG90YWwsIFVJbnQ2NCAmY29tcGxldGVkKQ0KKyAgew0KKyAgICBOV2luZG93czo6TlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbkxvY2sgbG9jayhfY3MpOw0KKyAgICB0b3RhbCA9IF90b3RhbDsNCisgICAgY29tcGxldGVkID0gX2NvbXBsZXRlZDsNCisgIH0NCit9Ow0KKw0KK2NsYXNzIENVNjRUb0kzMkNvbnZlcnRlcg0KK3sNCisgIFVJbnQ2NCBfbnVtU2hpZnRCaXRzOw0KK3B1YmxpYzoNCisgIHZvaWQgSW5pdChVSW50NjQgcmFuZ2UpDQorICB7DQorICAgIC8vIFdpbmRvd3MgQ0UgZG9lc24ndCBsaWtlIGJpZyBudW1iZXIgaGVyZS4NCisgICAgZm9yIChfbnVtU2hpZnRCaXRzID0gMDsgcmFuZ2UgPiAoMSA8PCAxNSk7IF9udW1TaGlmdEJpdHMrKykNCisgICAgICByYW5nZSA+Pj0gMTsNCisgIH0NCisgIGludCBDb3VudChVSW50NjQgdmFsdWUpIHsgcmV0dXJuIGludCh2YWx1ZSA+PiBfbnVtU2hpZnRCaXRzKTsgfQ0KK307DQorDQorY2xhc3MgQ1Byb2dyZXNzRGlhbG9nOiBwdWJsaWMgTldpbmRvd3M6Ok5Db250cm9sOjpDTW9kYWxEaWFsb2cNCit7DQorcHJpdmF0ZToNCisgIFVJTlRfUFRSIF90aW1lcjsNCisNCisgIFVTdHJpbmcgX3RpdGxlOw0KKyAgQ1U2NFRvSTMyQ29udmVydGVyIF9jb252ZXJ0ZXI7DQorICBVSW50NjQgX3BldmlvdXNQb3M7DQorICBVSW50NjQgX3JhbmdlOw0KKyAgTldpbmRvd3M6Ok5Db250cm9sOjpDUHJvZ3Jlc3NCYXIgbV9Qcm9ncmVzc0JhcjsNCisNCisgIGludCBfcHJldlBlcmNlbnRWYWx1ZTsNCisNCisgIGJvb2wgX3dhc0NyZWF0ZWQ7DQorICBib29sIF9uZWVkQ2xvc2U7DQorICBib29sIF9pbkNhbmNlbE1lc3NhZ2VCb3g7DQorICBib29sIF9leHRlcm5hbENsb3NlTWVzc2FnZVdhc1JlY2VpdmVkOw0KKw0KKyAgYm9vbCBPblRpbWVyKFdQQVJBTSB0aW1lcklELCBMUEFSQU0gY2FsbGJhY2spOw0KKyAgdm9pZCBTZXRSYW5nZShVSW50NjQgcmFuZ2UpOw0KKyAgdm9pZCBTZXRQb3MoVUludDY0IHBvcyk7DQorICB2aXJ0dWFsIGJvb2wgT25Jbml0KCk7DQorICB2aXJ0dWFsIHZvaWQgT25DYW5jZWwoKTsNCisgIHZpcnR1YWwgdm9pZCBPbk9LKCk7DQorICBOV2luZG93czo6TlN5bmNocm9uaXphdGlvbjo6Q01hbnVhbFJlc2V0RXZlbnQgX2RpYWxvZ0NyZWF0ZWRFdmVudDsNCisgICNpZm5kZWYgX1NGWA0KKyAgdm9pZCBBZGRUb1RpdGxlKExQQ1dTVFIgc3RyaW5nKTsNCisgICNlbmRpZg0KKyAgYm9vbCBPbkJ1dHRvbkNsaWNrZWQoaW50IGJ1dHRvbklELCBIV05EIGJ1dHRvbkhXTkQpOw0KKw0KKyAgdm9pZCBXYWl0Q3JlYXRpbmcoKSB7IF9kaWFsb2dDcmVhdGVkRXZlbnQuTG9jaygpOyB9DQorICB2b2lkIENoZWNrTmVlZENsb3NlKCk7DQorICBib29sIE9uRXh0ZXJuYWxDbG9zZU1lc3NhZ2UoKTsNCitwdWJsaWM6DQorICBDUHJvZ3Jlc3NTeW5jIFN5bmM7DQorICBpbnQgSWNvbklEOw0KKw0KKyAgI2lmbmRlZiBfU0ZYDQorICBIV05EIE1haW5XaW5kb3c7DQorICBVU3RyaW5nIE1haW5UaXRsZTsNCisgIFVTdHJpbmcgTWFpbkFkZFRpdGxlOw0KKyAgfkNQcm9ncmVzc0RpYWxvZygpOw0KKyAgI2VuZGlmDQorDQorICBDUHJvZ3Jlc3NEaWFsb2coKTogX3RpbWVyKDApDQorICAgICNpZm5kZWYgX1NGWA0KKyAgICAsTWFpbldpbmRvdygwKQ0KKyAgICAjZW5kaWYNCisgIHsNCisgICAgSWNvbklEID0gLTE7DQorICAgIF93YXNDcmVhdGVkID0gZmFsc2U7DQorICAgIF9uZWVkQ2xvc2UgPSBmYWxzZTsNCisgICAgX2luQ2FuY2VsTWVzc2FnZUJveCA9IGZhbHNlOw0KKyAgICBfZXh0ZXJuYWxDbG9zZU1lc3NhZ2VXYXNSZWNlaXZlZCA9IGZhbHNlOw0KKw0KKyAgICBpZiAoX2RpYWxvZ0NyZWF0ZWRFdmVudC5DcmVhdGUoKSAhPSBTX09LKQ0KKyAgICAgIHRocm93IDEzMzQ5ODc7DQorICB9DQorDQorICBJTlRfUFRSIENyZWF0ZShjb25zdCBVU3RyaW5nICZ0aXRsZSwgTldpbmRvd3M6OkNUaHJlYWQgJnRocmVhZCwgSFdORCB3bmRQYXJlbnQgPSAwKQ0KKyAgew0KKyAgICBfdGl0bGUgPSB0aXRsZTsNCisgICAgSU5UX1BUUiByZXMgPSBDTW9kYWxEaWFsb2c6OkNyZWF0ZShJRERfUFJPR1JFU1MsIHduZFBhcmVudCk7DQorICAgIHRocmVhZC5XYWl0KCk7DQorICAgIHJldHVybiByZXM7DQorICB9DQorDQorICBlbnVtDQorICB7DQorICAgIGtDbG9zZU1lc3NhZ2UgPSBXTV9BUFAgKyAxDQorICB9Ow0KKw0KKyAgdmlydHVhbCBib29sIE9uTWVzc2FnZShVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOw0KKw0KKyAgdm9pZCBQcm9jZXNzV2FzRmluaXNoZWQoKQ0KKyAgew0KKyAgICBXYWl0Q3JlYXRpbmcoKTsNCisgICAgaWYgKF93YXNDcmVhdGVkKQ0KKyAgICAgIFBvc3RNZXNzYWdlKGtDbG9zZU1lc3NhZ2UpOw0KKyAgICBlbHNlDQorICAgICAgX25lZWRDbG9zZSA9IHRydWU7DQorICB9Ow0KK307DQorDQorDQorY2xhc3MgQ1Byb2dyZXNzQ2xvc2VyDQorew0KKyAgQ1Byb2dyZXNzRGlhbG9nICpfcDsNCitwdWJsaWM6DQorICBDUHJvZ3Jlc3NDbG9zZXIoQ1Byb2dyZXNzRGlhbG9nICZwKSA6IF9wKCZwKSB7fQ0KKyAgfkNQcm9ncmVzc0Nsb3NlcigpIHsgX3AtPlByb2Nlc3NXYXNGaW5pc2hlZCgpOyB9DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Byb2dyZXNzRGlhbG9nLnJjIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Qcm9ncmVzc0RpYWxvZy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWYzNzBmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Qcm9ncmVzc0RpYWxvZy5yYwpAQCAtMCwwICsxLDEyIEBACisjaW5jbHVkZSAiUHJvZ3Jlc3NEaWFsb2dSZXMuaCINCisjaW5jbHVkZSAiLi4vLi4vR3VpQ29tbW9uLnJjIg0KKw0KKyNkZWZpbmUgeGMgMTcyDQorI2RlZmluZSB5YyA0NA0KKw0KK0lERF9QUk9HUkVTUyAgRElBTE9HICAwLCAwLCB4cywgeXMgIE1ZX01PREFMX0RJQUxPR19TVFlMRSAgTVlfRk9OVA0KK0NBUFRJT04gIlByb2dyZXNzIg0KK0JFR0lODQorICBQVVNIQlVUVE9OICAiQ2FuY2VsIiwgSURDQU5DRUwsIGJ4LCBieSwgYnhzLCBieXMNCisgIENPTlRST0wgICAgICJQcm9ncmVzczEiLCBJRENfUFJPR1JFU1MxLCAibXNjdGxzX3Byb2dyZXNzMzIiLCBQQlNfU01PT1RIIHwgV1NfQk9SREVSLCBtLCBtLCB4YywgMTQNCitFTkQNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Byb2dyZXNzRGlhbG9nMi5jcHAgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Byb2dyZXNzRGlhbG9nMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhMzdhNAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvUHJvZ3Jlc3NEaWFsb2cyLmNwcApAQCAtMCwwICsxLDEyOTMgQEAKKy8vIFByb2dyZXNzRGlhbG9nMi5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9JbnRUb1N0cmluZy5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9Db21tb24vU3RyaW5nQ29udmVydC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0NvbnRyb2wvU3RhdGljLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRXJyb3JNc2cuaCINCisNCisjaW5jbHVkZSAiUHJvZ3Jlc3NEaWFsb2cyLmgiDQorI2luY2x1ZGUgIkRpYWxvZ1NpemUuaCINCisNCisjaW5jbHVkZSAiUHJvZ3Jlc3NEaWFsb2cyUmVzLmgiDQorDQorI2luY2x1ZGUgIi4uL0dVSS9FeHRyYWN0UmVzLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KKw0KK2V4dGVybiBISU5TVEFOQ0UgZ19oSW5zdGFuY2U7DQorDQorc3RhdGljIGNvbnN0IFVJTlRfUFRSIGtUaW1lcklEID0gMzsNCisNCitzdGF0aWMgY29uc3QgVUlOVCBrQ2xvc2VNZXNzYWdlID0gV01fQVBQICsgMTsNCisvLyB3ZSBjYW4ndCB1c2UgV01fVVNFUiwgc2luY2UgV01fVVNFUiBjYW4gYmUgdXNlZCBieSBzdGFuZGFyZCBXaW5kb3dzIHByb2NlZHVyZSBmb3IgRGlhbG9nDQorDQorc3RhdGljIGNvbnN0IFVJTlQga1RpbWVyRWxhcHNlID0NCisgICNpZmRlZiBVTkRFUl9DRQ0KKyAgNTAwDQorICAjZWxzZQ0KKyAgMTAwDQorICAjZW5kaWYNCisgIDsNCisNCitzdGF0aWMgY29uc3QgVUlOVCBrQ3JlYXRlRGVsYXkgPQ0KKyAgI2lmZGVmIFVOREVSX0NFDQorICAyNTAwDQorICAjZWxzZQ0KKyAgNTAwDQorICAjZW5kaWYNCisgIDsNCisNCitzdGF0aWMgY29uc3QgRFdPUkQga1BhdXNlU2xlZXBUaW1lID0gMTAwOw0KKw0KKyNpbmNsdWRlICJMYW5nVXRpbHMuaCINCisNCisjaWZkZWYgTEFORw0KKw0KK3N0YXRpYyBjb25zdCBVSW50MzIga0xhbmdJRHNbXSA9DQorew0KKyAgSURUX1BST0dSRVNTX0VMQVBTRUQsDQorICBJRFRfUFJPR1JFU1NfUkVNQUlOSU5HLA0KKyAgSURUX1BST0dSRVNTX1RPVEFMLA0KKyAgSURUX1BST0dSRVNTX1NQRUVELA0KKyAgSURUX1BST0dSRVNTX1BST0NFU1NFRCwNCisgIElEVF9QUk9HUkVTU19SQVRJTywNCisgIElEVF9QUk9HUkVTU19FUlJPUlMsDQorICBJREJfUFJPR1JFU1NfQkFDS0dST1VORCwNCisgIElEQl9QQVVTRQ0KK307DQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrTGFuZ0lEc19Db2xvbltdID0NCit7DQorICBJRFRfUFJPR1JFU1NfUEFDS0VELA0KKyAgSURUX1BST0dSRVNTX0ZJTEVTDQorfTsNCisNCisjZW5kaWYNCisNCisNCisjZGVmaW5lIFVOREVGSU5FRF9WQUwgKChVSW50NjQpKEludDY0KS0xKQ0KKyNkZWZpbmUgSU5JVF9BU19VTkRFRklORUQodikgdiA9IFVOREVGSU5FRF9WQUw7DQorI2RlZmluZSBJU19VTkRFRklORURfVkFMKHYpICgodikgPT0gVU5ERUZJTkVEX1ZBTCkNCisjZGVmaW5lIElTX0RFRklORURfVkFMKHYpICgodikgIT0gVU5ERUZJTkVEX1ZBTCkNCisNCitDUHJvZ3Jlc3NTeW5jOjpDUHJvZ3Jlc3NTeW5jKCk6DQorICAgIF9zdG9wcGVkKGZhbHNlKSwgX3BhdXNlZChmYWxzZSksDQorICAgIF9ieXRlc1Byb2dyZXNzTW9kZSh0cnVlKSwNCisgICAgX3RvdGFsQnl0ZXMoVU5ERUZJTkVEX1ZBTCksIF9jb21wbGV0ZWRCeXRlcygwKSwNCisgICAgX3RvdGFsRmlsZXMoVU5ERUZJTkVEX1ZBTCksIF9jdXJGaWxlcygwKSwNCisgICAgX2luU2l6ZShVTkRFRklORURfVkFMKSwNCisgICAgX291dFNpemUoVU5ERUZJTkVEX1ZBTCksDQorICAgIF9pc0RpcihmYWxzZSkNCisgICAge30NCisNCisjZGVmaW5lIENIRUNLX1NUT1AgIGlmIChfc3RvcHBlZCkgcmV0dXJuIEVfQUJPUlQ7IGlmICghX3BhdXNlZCkgcmV0dXJuIFNfT0s7DQorI2RlZmluZSBDUklUSUNBTF9MT0NLIE5TeW5jaHJvbml6YXRpb246OkNDcml0aWNhbFNlY3Rpb25Mb2NrIGxvY2soX2NzKTsNCisNCitib29sIENQcm9ncmVzc1N5bmM6OkdldF9QYXVzZWQoKQ0KK3sNCisgIENSSVRJQ0FMX0xPQ0sNCisgIHJldHVybiBfcGF1c2VkOw0KK30NCisNCitIUkVTVUxUIENQcm9ncmVzc1N5bmM6OkNoZWNrU3RvcCgpDQorew0KKyAgZm9yICg7OykNCisgIHsNCisgICAgew0KKyAgICAgIENSSVRJQ0FMX0xPQ0sNCisgICAgICBDSEVDS19TVE9QDQorICAgIH0NCisgICAgOjpTbGVlcChrUGF1c2VTbGVlcFRpbWUpOw0KKyAgfQ0KK30NCisNCitIUkVTVUxUIENQcm9ncmVzc1N5bmM6OlNjYW5Qcm9ncmVzcyhVSW50NjQgbnVtRmlsZXMsIFVJbnQ2NCB0b3RhbFNpemUsIGNvbnN0IFVTdHJpbmcgJmZpbGVOYW1lLCBib29sIGlzRGlyKQ0KK3sNCisgIHsNCisgICAgQ1JJVElDQUxfTE9DSw0KKyAgICBfdG90YWxGaWxlcyA9IG51bUZpbGVzOw0KKyAgICBfdG90YWxCeXRlcyA9IHRvdGFsU2l6ZTsNCisgICAgX2ZpbGVQYXRoID0gZmlsZU5hbWU7DQorICAgIF9pc0RpciA9IGlzRGlyOw0KKyAgICAvLyBfY29tcGxldGVkQnl0ZXMgPSAwOw0KKyAgICBDSEVDS19TVE9QDQorICB9DQorICByZXR1cm4gQ2hlY2tTdG9wKCk7DQorfQ0KKw0KK3ZvaWQgQ1Byb2dyZXNzU3luYzo6U2V0X051bUZpbGVzVG90YWwoVUludDY0IHZhbCkNCit7DQorICBDUklUSUNBTF9MT0NLDQorICBfdG90YWxGaWxlcyA9IHZhbDsNCit9DQorDQordm9pZCBDUHJvZ3Jlc3NTeW5jOjpTZXRfTnVtQnl0ZXNUb3RhbChVSW50NjQgdmFsKQ0KK3sNCisgIENSSVRJQ0FMX0xPQ0sNCisgIF90b3RhbEJ5dGVzID0gdmFsOw0KK30NCisNCit2b2lkIENQcm9ncmVzc1N5bmM6OlNldF9OdW1GaWxlc0N1cihVSW50NjQgdmFsKQ0KK3sNCisgIENSSVRJQ0FMX0xPQ0sNCisgIF9jdXJGaWxlcyA9IHZhbDsNCit9DQorDQorSFJFU1VMVCBDUHJvZ3Jlc3NTeW5jOjpTZXRfTnVtQnl0ZXNDdXIoY29uc3QgVUludDY0ICp2YWwpDQorew0KKyAgew0KKyAgICBDUklUSUNBTF9MT0NLDQorICAgIGlmICh2YWwpDQorICAgICAgX2NvbXBsZXRlZEJ5dGVzID0gKnZhbDsNCisgICAgQ0hFQ0tfU1RPUA0KKyAgfQ0KKyAgcmV0dXJuIENoZWNrU3RvcCgpOw0KK30NCisNCitIUkVTVUxUIENQcm9ncmVzc1N5bmM6OlNldF9OdW1CeXRlc0N1cihVSW50NjQgdmFsKQ0KK3sNCisgIHsNCisgICAgQ1JJVElDQUxfTE9DSw0KKyAgICBfY29tcGxldGVkQnl0ZXMgPSB2YWw7DQorICAgIENIRUNLX1NUT1ANCisgIH0NCisgIHJldHVybiBDaGVja1N0b3AoKTsNCit9DQorDQordm9pZCBDUHJvZ3Jlc3NTeW5jOjpTZXRfUmF0aW8oY29uc3QgVUludDY0ICppblNpemUsIGNvbnN0IFVJbnQ2NCAqb3V0U2l6ZSkNCit7DQorICBDUklUSUNBTF9MT0NLDQorICBpZiAoaW5TaXplKQ0KKyAgICBfaW5TaXplID0gKmluU2l6ZTsNCisgIGlmIChvdXRTaXplKQ0KKyAgICBfb3V0U2l6ZSA9ICpvdXRTaXplOw0KK30NCisNCit2b2lkIENQcm9ncmVzc1N5bmM6OlNldF9UaXRsZUZpbGVOYW1lKGNvbnN0IFVTdHJpbmcgJmZpbGVOYW1lKQ0KK3sNCisgIENSSVRJQ0FMX0xPQ0sNCisgIF90aXRsZUZpbGVOYW1lID0gZmlsZU5hbWU7DQorfQ0KK3ZvaWQgQ1Byb2dyZXNzU3luYzo6U2V0X1N0YXR1cyhjb25zdCBVU3RyaW5nICZzKQ0KK3sNCisgIENSSVRJQ0FMX0xPQ0sNCisgIF9zdGF0dXMgPSBzOw0KK30NCisNCit2b2lkIENQcm9ncmVzc1N5bmM6OlNldF9GaWxlUGF0aChjb25zdCBVU3RyaW5nICZwYXRoLCBib29sIGlzRGlyKQ0KK3sNCisgIENSSVRJQ0FMX0xPQ0sNCisgIF9maWxlUGF0aCA9IHBhdGg7DQorICBfaXNEaXIgPSBpc0RpcjsNCit9DQorDQorDQordm9pZCBDUHJvZ3Jlc3NTeW5jOjpBZGRFcnJvcl9NZXNzYWdlKGNvbnN0IHdjaGFyX3QgKm1lc3NhZ2UpDQorew0KKyAgQ1JJVElDQUxfTE9DSw0KKyAgTWVzc2FnZXMuQWRkKG1lc3NhZ2UpOw0KK30NCisNCit2b2lkIENQcm9ncmVzc1N5bmM6OkFkZEVycm9yX01lc3NhZ2VfTmFtZShjb25zdCB3Y2hhcl90ICptZXNzYWdlLCBjb25zdCB3Y2hhcl90ICpuYW1lKQ0KK3sNCisgIFVTdHJpbmcgczsNCisgIGlmIChuYW1lICYmICpuYW1lICE9IDApDQorICAgIHMgKz0gbmFtZTsNCisgIGlmIChtZXNzYWdlICYmICptZXNzYWdlICE9IDAgKQ0KKyAgew0KKyAgICBpZiAoIXMuSXNFbXB0eSgpKQ0KKyAgICAgIHMgKz0gTCdcbic7DQorICAgIHMgKz0gbWVzc2FnZTsNCisgICAgaWYgKCFzLklzRW1wdHkoKSAmJiBzLkJhY2soKSA9PSBMJ1xuJykNCisgICAgICBzLkRlbGV0ZUJhY2soKTsNCisgIH0NCisgIEFkZEVycm9yX01lc3NhZ2Uocyk7DQorfQ0KKw0KK3ZvaWQgQ1Byb2dyZXNzU3luYzo6QWRkRXJyb3JfQ29kZV9OYW1lKERXT1JEIHN5c3RlbUVycm9yLCBjb25zdCB3Y2hhcl90ICpuYW1lKQ0KK3sNCisgIFVTdHJpbmcgcyA9IE5FcnJvcjo6TXlGb3JtYXRNZXNzYWdlKHN5c3RlbUVycm9yKTsNCisgIGlmIChzeXN0ZW1FcnJvciA9PSAwKQ0KKyAgICBzID0gTCJFcnJvciI7DQorICBBZGRFcnJvcl9NZXNzYWdlX05hbWUocywgbmFtZSk7DQorfQ0KKw0KK0NQcm9ncmVzc0RpYWxvZzo6Q1Byb2dyZXNzRGlhbG9nKCk6IF90aW1lcigwKSwgQ29tcHJlc3NpbmdNb2RlKHRydWUpLCBNYWluV2luZG93KDApDQorew0KKyAgX2lzRGlyID0gZmFsc2U7DQorDQorICBfbnVtTWVzc2FnZXMgPSAwOw0KKyAgSWNvbklEID0gLTE7DQorICBNZXNzYWdlc0Rpc3BsYXllZCA9IGZhbHNlOw0KKyAgX3dhc0NyZWF0ZWQgPSBmYWxzZTsNCisgIF9uZWVkQ2xvc2UgPSBmYWxzZTsNCisgIF9pbkNhbmNlbE1lc3NhZ2VCb3ggPSBmYWxzZTsNCisgIF9leHRlcm5hbENsb3NlTWVzc2FnZVdhc1JlY2VpdmVkID0gZmFsc2U7DQorICANCisgIF9udW1Qb3N0ZWRNZXNzYWdlcyA9IDA7DQorICBfbnVtQXV0b1NpemVNZXNzYWdlcyA9IDA7DQorICBfZXJyb3JzV2VyZURpc3BsYXllZCA9IGZhbHNlOw0KKyAgX3dhaXRDbG9zZUJ5Q2FuY2VsQnV0dG9uID0gZmFsc2U7DQorICBfY2FuY2VsV2FzUHJlc3NlZCA9IGZhbHNlOw0KKyAgU2hvd0NvbXByZXNzaW9uSW5mbyA9IHRydWU7DQorICBXYWl0TW9kZSA9IGZhbHNlOw0KKyAgaWYgKF9kaWFsb2dDcmVhdGVkRXZlbnQuQ3JlYXRlKCkgIT0gU19PSykNCisgICAgdGhyb3cgMTMzNDk4NzsNCisgIGlmIChfY3JlYXRlRGlhbG9nRXZlbnQuQ3JlYXRlKCkgIT0gU19PSykNCisgICAgdGhyb3cgMTMzNDk4NzsNCisgICNpZmRlZiBfX0lUYXNrYmFyTGlzdDNfSU5URVJGQUNFX0RFRklORURfXw0KKyAgQ29DcmVhdGVJbnN0YW5jZShDTFNJRF9UYXNrYmFyTGlzdCwgTlVMTCwgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsIElJRF9JVGFza2Jhckxpc3QzLCAodm9pZCoqKSZfdGFza2Jhckxpc3QpOw0KKyAgaWYgKF90YXNrYmFyTGlzdCkNCisgICAgX3Rhc2tiYXJMaXN0LT5IckluaXQoKTsNCisgICNlbmRpZg0KK30NCisNCisjaWZuZGVmIF9TRlgNCisNCitDUHJvZ3Jlc3NEaWFsb2c6On5DUHJvZ3Jlc3NEaWFsb2coKQ0KK3sNCisgICNpZmRlZiBfX0lUYXNrYmFyTGlzdDNfSU5URVJGQUNFX0RFRklORURfXw0KKyAgU2V0VGFza2JhclByb2dyZXNzU3RhdGUoVEJQRl9OT1BST0dSRVNTKTsNCisgICNlbmRpZg0KKyAgQWRkVG9UaXRsZShMIiIpOw0KK30NCit2b2lkIENQcm9ncmVzc0RpYWxvZzo6QWRkVG9UaXRsZShMUENXU1RSIHMpDQorew0KKyAgaWYgKE1haW5XaW5kb3cgIT0gMCkNCisgIHsNCisgICAgQ1dpbmRvdyB3aW5kb3coTWFpbldpbmRvdyk7DQorICAgIHdpbmRvdy5TZXRUZXh0KChVU3RyaW5nKXMgKyBNYWluVGl0bGUpOw0KKyAgfQ0KK30NCisNCisjZW5kaWYNCisNCisNCit2b2lkIENQcm9ncmVzc0RpYWxvZzo6U2V0VGFza2JhclByb2dyZXNzU3RhdGUoKQ0KK3sNCisgICNpZmRlZiBfX0lUYXNrYmFyTGlzdDNfSU5URVJGQUNFX0RFRklORURfXw0KKyAgaWYgKF90YXNrYmFyTGlzdCAmJiBfaHduZEZvclRhc2tiYXIpDQorICB7DQorICAgIFRCUEZMQUcgdGJwRmxhZ3M7DQorICAgIGlmIChTeW5jLkdldF9QYXVzZWQoKSkNCisgICAgICB0YnBGbGFncyA9IFRCUEZfUEFVU0VEOw0KKyAgICBlbHNlDQorICAgICAgdGJwRmxhZ3MgPSBfZXJyb3JzV2VyZURpc3BsYXllZCA/IFRCUEZfRVJST1I6IFRCUEZfTk9STUFMOw0KKyAgICBTZXRUYXNrYmFyUHJvZ3Jlc3NTdGF0ZSh0YnBGbGFncyk7DQorICB9DQorICAjZW5kaWYNCit9DQorDQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtUaXRsZUZpbGVOYW1lU2l6ZUxpbWl0ID0gMzY7DQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtDdXJyZW50RmlsZU5hbWVTaXplTGltaXQgPSA4MjsNCisNCitzdGF0aWMgdm9pZCBSZWR1Y2VTdHJpbmcoVVN0cmluZyAmcywgdW5zaWduZWQgc2l6ZSkNCit7DQorICBpZiAocy5MZW4oKSA8PSBzaXplKQ0KKyAgICByZXR1cm47DQorICBzLkRlbGV0ZShzaXplIC8gMiwgcy5MZW4oKSAtIHNpemUpOw0KKyAgcy5JbnNlcnQoc2l6ZSAvIDIsIEwiIC4uLiAiKTsNCit9DQorDQordm9pZCBDUHJvZ3Jlc3NEaWFsb2c6OkVuYWJsZUVycm9yc0NvbnRyb2xzKGJvb2wgZW5hYmxlKQ0KK3sNCisgIFNob3dJdGVtX0Jvb2woSURUX1BST0dSRVNTX0VSUk9SUywgZW5hYmxlKTsNCisgIFNob3dJdGVtX0Jvb2woSURUX1BST0dSRVNTX0VSUk9SU19WQUwsIGVuYWJsZSk7DQorICBTaG93SXRlbV9Cb29sKElETF9QUk9HUkVTU19NRVNTQUdFUywgZW5hYmxlKTsNCit9DQorDQorYm9vbCBDUHJvZ3Jlc3NEaWFsb2c6Ok9uSW5pdCgpDQorew0KKyAgX2h3bmRGb3JUYXNrYmFyID0gTWFpbldpbmRvdzsNCisgIGlmICghX2h3bmRGb3JUYXNrYmFyKQ0KKyAgICBfaHduZEZvclRhc2tiYXIgPSBHZXRQYXJlbnQoKTsNCisgIGlmICghX2h3bmRGb3JUYXNrYmFyKQ0KKyAgICBfaHduZEZvclRhc2tiYXIgPSAqdGhpczsNCisNCisgIElOSVRfQVNfVU5ERUZJTkVEKF9wcm9ncmVzc0Jhcl9SYW5nZSk7DQorICBJTklUX0FTX1VOREVGSU5FRChfcHJvZ3Jlc3NCYXJfUG9zKTsNCisNCisgIElOSVRfQVNfVU5ERUZJTkVEKF9wcmV2UGVyY2VudFZhbHVlKTsNCisgIElOSVRfQVNfVU5ERUZJTkVEKF9wcmV2RWxhcHNlZFNlYyk7DQorICBJTklUX0FTX1VOREVGSU5FRChfcHJldlJlbWFpbmluZ1NlYyk7DQorDQorICBJTklUX0FTX1VOREVGSU5FRChfcHJldlNwZWVkKTsNCisgIF9wcmV2U3BlZWRfTW92ZUJpdHMgPSAwOw0KKyAgDQorICBfcHJldlRpbWUgPSA6OkdldFRpY2tDb3VudCgpOw0KKyAgX2VsYXBzZWRUaW1lID0gMDsNCisNCisgIElOSVRfQVNfVU5ERUZJTkVEKF90b3RhbEJ5dGVzX1ByZXYpOw0KKyAgSU5JVF9BU19VTkRFRklORUQoX3Byb2Nlc3NlZF9QcmV2KTsNCisgIElOSVRfQVNfVU5ERUZJTkVEKF9wYWNrZWRfUHJldik7DQorICBJTklUX0FTX1VOREVGSU5FRChfcmF0aW9fUHJldik7DQorICBfZmlsZXNTdHJfUHJldi5FbXB0eSgpOw0KKw0KKyAgX2ZvcmVncm91bmQgPSB0cnVlOw0KKw0KKyAgbV9Qcm9ncmVzc0Jhci5BdHRhY2goR2V0SXRlbShJRENfUFJPR1JFU1MxKSk7DQorICBfbWVzc2FnZUxpc3QuQXR0YWNoKEdldEl0ZW0oSURMX1BST0dSRVNTX01FU1NBR0VTKSk7DQorICBfbWVzc2FnZUxpc3QuU2V0VW5pY29kZUZvcm1hdCgpOw0KKw0KKyAgX3dhc0NyZWF0ZWQgPSB0cnVlOw0KKyAgX2RpYWxvZ0NyZWF0ZWRFdmVudC5TZXQoKTsNCisNCisgICNpZmRlZiBMQU5HDQorICBMYW5nU2V0RGxnSXRlbXMoKnRoaXMsIGtMYW5nSURzLCBBUlJBWV9TSVpFKGtMYW5nSURzKSk7DQorICBMYW5nU2V0RGxnSXRlbXNfQ29sb24oKnRoaXMsIGtMYW5nSURzX0NvbG9uLCBBUlJBWV9TSVpFKGtMYW5nSURzX0NvbG9uKSk7DQorICAjZW5kaWYNCisNCisgIENXaW5kb3cgd2luZG93KEdldEl0ZW0oSURCX1BST0dSRVNTX0JBQ0tHUk9VTkQpKTsNCisgIHdpbmRvdy5HZXRUZXh0KF9iYWNrZ3JvdW5kX1N0cmluZyk7DQorICBfYmFja2dyb3VuZGVkX1N0cmluZyA9IF9iYWNrZ3JvdW5kX1N0cmluZzsNCisgIF9iYWNrZ3JvdW5kZWRfU3RyaW5nLlJlbW92ZUNoYXIoTCcmJyk7DQorDQorICB3aW5kb3cgPSBHZXRJdGVtKElEQl9QQVVTRSk7DQorICB3aW5kb3cuR2V0VGV4dChfcGF1c2VfU3RyaW5nKTsNCisNCisgIExhbmdTdHJpbmcoSURTX1BST0dSRVNTX0ZPUkVHUk9VTkQsIF9mb3JlZ3JvdW5kX1N0cmluZyk7DQorICBMYW5nU3RyaW5nKElEU19DT05USU5VRSwgX2NvbnRpbnVlX1N0cmluZyk7DQorICBMYW5nU3RyaW5nKElEU19QUk9HUkVTU19QQVVTRUQsIF9wYXVzZWRfU3RyaW5nKTsNCisNCisgIFNldFRleHQoX3RpdGxlKTsNCisgIFNldFBhdXNlVGV4dCgpOw0KKyAgU2V0UHJpb3JpdHlUZXh0KCk7DQorDQorICBfbWVzc2FnZUxpc3QuSW5zZXJ0Q29sdW1uKDAsIEwiIiwgMzApOw0KKyAgX21lc3NhZ2VMaXN0Lkluc2VydENvbHVtbigxLCBMIiIsIDYwMCk7DQorDQorICBfbWVzc2FnZUxpc3QuU2V0Q29sdW1uV2lkdGhBdXRvKDApOw0KKyAgX21lc3NhZ2VMaXN0LlNldENvbHVtbldpZHRoQXV0bygxKTsNCisNCisgIEVuYWJsZUVycm9yc0NvbnRyb2xzKGZhbHNlKTsNCisNCisgIEdldEl0ZW1TaXplcyhJRENBTkNFTCwgX2J1dHRvblNpemVYLCBfYnV0dG9uU2l6ZVkpOw0KKyAgX251bVJlZHVjZVN5bWJvbHMgPSBrQ3VycmVudEZpbGVOYW1lU2l6ZUxpbWl0Ow0KKyAgTm9ybWFsaXplU2l6ZSh0cnVlKTsNCisNCisgIGlmICghU2hvd0NvbXByZXNzaW9uSW5mbykNCisgIHsNCisgICAgSGlkZUl0ZW0oSURUX1BST0dSRVNTX1BBQ0tFRCk7DQorICAgIEhpZGVJdGVtKElEVF9QUk9HUkVTU19QQUNLRURfVkFMKTsNCisgICAgSGlkZUl0ZW0oSURUX1BST0dSRVNTX1JBVElPKTsNCisgICAgSGlkZUl0ZW0oSURUX1BST0dSRVNTX1JBVElPX1ZBTCk7DQorICB9DQorDQorICBpZiAoSWNvbklEID49IDApDQorICB7DQorICAgIEhJQ09OIGljb24gPSBMb2FkSWNvbihnX2hJbnN0YW5jZSwgTUFLRUlOVFJFU09VUkNFKEljb25JRCkpOw0KKyAgICAvLyBTZXRJY29uKElDT05fU01BTEwsIGljb24pOw0KKyAgICBTZXRJY29uKElDT05fQklHLCBpY29uKTsNCisgIH0NCisgIF90aW1lciA9IFNldFRpbWVyKGtUaW1lcklELCBrVGltZXJFbGFwc2UpOw0KKyAgI2lmZGVmIFVOREVSX0NFDQorICBGb3JlZ3JvdW5kKCk7DQorICAjZW5kaWYNCisNCisgIENoZWNrTmVlZENsb3NlKCk7DQorDQorICBTZXRUYXNrYmFyUHJvZ3Jlc3NTdGF0ZSgpOw0KKw0KKyAgcmV0dXJuIENNb2RhbERpYWxvZzo6T25Jbml0KCk7DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBVSU5UIGtJRHNbXSA9DQorew0KKyAgSURUX1BST0dSRVNTX0VMQVBTRUQsICAgSURUX1BST0dSRVNTX0VMQVBTRURfVkFMLA0KKyAgSURUX1BST0dSRVNTX1JFTUFJTklORywgSURUX1BST0dSRVNTX1JFTUFJTklOR19WQUwsDQorICBJRFRfUFJPR1JFU1NfRklMRVMsICAgICBJRFRfUFJPR1JFU1NfRklMRVNfVkFMLA0KKyAgSURUX1BST0dSRVNTX1JBVElPLCAgICAgSURUX1BST0dSRVNTX1JBVElPX1ZBTCwNCisgIElEVF9QUk9HUkVTU19FUlJPUlMsICAgIElEVF9QUk9HUkVTU19FUlJPUlNfVkFMLA0KKyAgDQorICBJRFRfUFJPR1JFU1NfVE9UQUwsICAgICBJRFRfUFJPR1JFU1NfVE9UQUxfVkFMLA0KKyAgSURUX1BST0dSRVNTX1NQRUVELCAgICAgSURUX1BST0dSRVNTX1NQRUVEX1ZBTCwNCisgIElEVF9QUk9HUkVTU19QUk9DRVNTRUQsIElEVF9QUk9HUkVTU19QUk9DRVNTRURfVkFMLA0KKyAgSURUX1BST0dSRVNTX1BBQ0tFRCwgICAgSURUX1BST0dSRVNTX1BBQ0tFRF9WQUwNCit9Ow0KKw0KK2Jvb2wgQ1Byb2dyZXNzRGlhbG9nOjpPblNpemUoV1BBUkFNIC8qIHdQYXJhbSAqLywgaW50IHhTaXplLCBpbnQgeVNpemUpDQorew0KKyAgaW50IHNZOw0KKyAgaW50IHNTdGVwOw0KKyAgaW50IG14LCBteTsNCisgIHsNCisgICAgUkVDVCByOw0KKyAgICBHZXRDbGllbnRSZWN0T2ZJdGVtKElEVF9QUk9HUkVTU19FTEFQU0VELCByKTsNCisgICAgbXggPSByLmxlZnQ7DQorICAgIG15ID0gci50b3A7DQorICAgIHNZID0gUkVDVF9TSVpFX1kocik7DQorICAgIEdldENsaWVudFJlY3RPZkl0ZW0oSURUX1BST0dSRVNTX1JFTUFJTklORywgcik7DQorICAgIHNTdGVwID0gci50b3AgLSBteTsNCisgIH0NCisNCisgIEludmFsaWRhdGVSZWN0KE5VTEwpOw0KKw0KKyAgaW50IHhTaXplQ2xpZW50ID0geFNpemUgLSBteCAqIDI7DQorDQorICB7DQorICAgIGludCBpOw0KKyAgICBmb3IgKGkgPSA4MDA7IGkgPiA0MDsgaSA9IGkgKiA5IC8gMTApDQorICAgICAgaWYgKFVuaXRzX1RvX1BpeGVsc19YKGkpIDw9IHhTaXplQ2xpZW50KQ0KKyAgICAgICAgYnJlYWs7DQorICAgIF9udW1SZWR1Y2VTeW1ib2xzID0gaSAvIDQ7DQorICB9DQorDQorICBpbnQgeVBvcyA9IHlTaXplIC0gbXkgLSBfYnV0dG9uU2l6ZVk7DQorDQorICBDaGFuZ2VTdWJXaW5kb3dTaXplWChHZXRJdGVtKElEVF9QUk9HUkVTU19TVEFUVVMpLCB4U2l6ZSAtIG14ICogMik7DQorICBDaGFuZ2VTdWJXaW5kb3dTaXplWChHZXRJdGVtKElEVF9QUk9HUkVTU19GSUxFX05BTUUpLCB4U2l6ZSAtIG14ICogMik7DQorICBDaGFuZ2VTdWJXaW5kb3dTaXplWChHZXRJdGVtKElEQ19QUk9HUkVTUzEpLCB4U2l6ZSAtIG14ICogMik7DQorDQorICBpbnQgYlNpemVYID0gX2J1dHRvblNpemVYOw0KKyAgaW50IG14MiA9IG14Ow0KKyAgZm9yICg7OyBteDItLSkNCisgIHsNCisgICAgaW50IGJTaXplMiA9IGJTaXplWCAqIDMgKyBteDIgKiAyOw0KKyAgICBpZiAoYlNpemUyIDw9IHhTaXplQ2xpZW50KQ0KKyAgICAgIGJyZWFrOw0KKyAgICBpZiAobXgyIDwgNSkNCisgICAgew0KKyAgICAgIGJTaXplWCA9ICh4U2l6ZUNsaWVudCAtIG14MiAqIDIpIC8gMzsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJTaXplWCA8IDIpDQorICAgIGJTaXplWCA9IDI7DQorDQorICB7DQorICAgIFJFQ1QgcjsNCisgICAgR2V0Q2xpZW50UmVjdE9mSXRlbShJRExfUFJPR1JFU1NfTUVTU0FHRVMsIHIpOw0KKyAgICBpbnQgeSA9IHIudG9wOw0KKyAgICBpbnQgeVNpemUyID0geVBvcyAtIG15IC0geTsNCisgICAgY29uc3QgaW50IGtNaW5ZU2l6ZSA9IF9idXR0b25TaXplWSArIF9idXR0b25TaXplWSAqIDMgLyA0Ow0KKyAgICBpbnQgeHggPSB4U2l6ZSAtIG14ICogMjsNCisgICAgaWYgKHlTaXplMiA8IGtNaW5ZU2l6ZSkNCisgICAgew0KKyAgICAgIHlTaXplMiA9IGtNaW5ZU2l6ZTsNCisgICAgICBpZiAoeHggPiBiU2l6ZVggKiAyKQ0KKyAgICAgICAgeHggLT0gYlNpemVYOw0KKyAgICB9DQorDQorICAgIF9tZXNzYWdlTGlzdC5Nb3ZlKG14LCB5LCB4eCwgeVNpemUyKTsNCisgIH0NCisNCisgIHsNCisgICAgaW50IHhQb3MgPSB4U2l6ZSAtIG14Ow0KKyAgICB4UG9zIC09IGJTaXplWDsNCisgICAgTW92ZUl0ZW0oSURDQU5DRUwsIHhQb3MsIHlQb3MsIGJTaXplWCwgX2J1dHRvblNpemVZKTsNCisgICAgeFBvcyAtPSAobXgyICsgYlNpemVYKTsNCisgICAgTW92ZUl0ZW0oSURCX1BBVVNFLCB4UG9zLCB5UG9zLCBiU2l6ZVgsIF9idXR0b25TaXplWSk7DQorICAgIHhQb3MgLT0gKG14MiArIGJTaXplWCk7DQorICAgIE1vdmVJdGVtKElEQl9QUk9HUkVTU19CQUNLR1JPVU5ELCB4UG9zLCB5UG9zLCBiU2l6ZVgsIF9idXR0b25TaXplWSk7DQorICB9DQorDQorICBpbnQgdmFsdWVTaXplOw0KKyAgaW50IGxhYmVsU2l6ZTsNCisgIGludCBwYWRTaXplOw0KKw0KKyAgbGFiZWxTaXplID0gVW5pdHNfVG9fUGl4ZWxzX1goTVlfUFJPR1JFU1NfTEFCRUxfVU5JVFNfTUlOKTsNCisgIHZhbHVlU2l6ZSA9IFVuaXRzX1RvX1BpeGVsc19YKE1ZX1BST0dSRVNTX1ZBTF9VTklUUyk7DQorICBwYWRTaXplID0gVW5pdHNfVG9fUGl4ZWxzX1goTVlfUFJPR1JFU1NfUEFEX1VOSVRTKTsNCisgIGludCByZXF1aXJlZFNpemUgPSAobGFiZWxTaXplICsgdmFsdWVTaXplKSAqIDIgKyBwYWRTaXplOw0KKw0KKyAgaW50IGdTaXplOw0KKyAgew0KKyAgICBpZiAocmVxdWlyZWRTaXplIDwgeFNpemVDbGllbnQpDQorICAgIHsNCisgICAgICBpbnQgaW5jciA9ICh4U2l6ZUNsaWVudCAtIHJlcXVpcmVkU2l6ZSkgLyAzOw0KKyAgICAgIGxhYmVsU2l6ZSArPSBpbmNyOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgICBsYWJlbFNpemUgPSAoeFNpemVDbGllbnQgLSB2YWx1ZVNpemUgKiAyIC0gcGFkU2l6ZSkgLyAyOw0KKyAgICBpZiAobGFiZWxTaXplIDwgMCkNCisgICAgICBsYWJlbFNpemUgPSAwOw0KKw0KKyAgICBnU2l6ZSA9IGxhYmVsU2l6ZSArIHZhbHVlU2l6ZTsNCisgICAgcGFkU2l6ZSA9IHhTaXplQ2xpZW50IC0gZ1NpemUgKiAyOw0KKyAgfQ0KKw0KKyAgbGFiZWxTaXplID0gZ1NpemUgLSB2YWx1ZVNpemU7DQorDQorICB5UG9zID0gbXk7DQorICBmb3IgKGludCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa0lEcyk7IGkgKz0gMikNCisgIHsNCisgICAgaW50IHggPSBteDsNCisgICAgY29uc3QgaW50IGtOdW1Db2x1bW4xSXRlbXMgPSA1ICogMjsNCisgICAgaWYgKGkgPj0ga051bUNvbHVtbjFJdGVtcykNCisgICAgew0KKyAgICAgIGlmIChpID09IGtOdW1Db2x1bW4xSXRlbXMpDQorICAgICAgICB5UG9zID0gbXk7DQorICAgICAgeCA9IG14ICsgZ1NpemUgKyBwYWRTaXplOw0KKyAgICB9DQorICAgIE1vdmVJdGVtKGtJRHNbaV0sIHgsIHlQb3MsIGxhYmVsU2l6ZSwgc1kpOw0KKyAgICBNb3ZlSXRlbShrSURzW2kgKyAxXSwgeCArIGxhYmVsU2l6ZSwgeVBvcywgdmFsdWVTaXplLCBzWSk7DQorICAgIHlQb3MgKz0gc1N0ZXA7DQorICB9DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK3ZvaWQgQ1Byb2dyZXNzRGlhbG9nOjpPbkNhbmNlbCgpIHsgU3luYy5TZXRfU3RvcHBlZCh0cnVlKTsgfQ0KK3ZvaWQgQ1Byb2dyZXNzRGlhbG9nOjpPbk9LKCkgeyB9DQorDQordm9pZCBDUHJvZ3Jlc3NEaWFsb2c6OlNldFByb2dyZXNzUmFuZ2UoVUludDY0IHJhbmdlKQ0KK3sNCisgIGlmIChyYW5nZSA9PSBfcHJvZ3Jlc3NCYXJfUmFuZ2UpDQorICAgIHJldHVybjsNCisgIF9wcm9ncmVzc0Jhcl9SYW5nZSA9IHJhbmdlOw0KKyAgSU5JVF9BU19VTkRFRklORUQoX3Byb2dyZXNzQmFyX1Bvcyk7DQorICBfcHJvZ3Jlc3NDb252LkluaXQocmFuZ2UpOw0KKyAgbV9Qcm9ncmVzc0Jhci5TZXRSYW5nZTMyKDAsIF9wcm9ncmVzc0NvbnYuQ291bnQocmFuZ2UpKTsNCit9DQorDQordm9pZCBDUHJvZ3Jlc3NEaWFsb2c6OlNldFByb2dyZXNzUG9zKFVJbnQ2NCBwb3MpDQorew0KKyAgaWYgKHBvcyA+PSBfcHJvZ3Jlc3NCYXJfUmFuZ2UgfHwNCisgICAgICBwb3MgPD0gX3Byb2dyZXNzQmFyX1BvcyB8fA0KKyAgICAgIHBvcyAtIF9wcm9ncmVzc0Jhcl9Qb3MgPj0gKF9wcm9ncmVzc0Jhcl9SYW5nZSA+PiAxMCkpDQorICB7DQorICAgIG1fUHJvZ3Jlc3NCYXIuU2V0UG9zKF9wcm9ncmVzc0NvbnYuQ291bnQocG9zKSk7DQorICAgICNpZmRlZiBfX0lUYXNrYmFyTGlzdDNfSU5URVJGQUNFX0RFRklORURfXw0KKyAgICBpZiAoX3Rhc2tiYXJMaXN0ICYmIF9od25kRm9yVGFza2JhcikNCisgICAgICBfdGFza2Jhckxpc3QtPlNldFByb2dyZXNzVmFsdWUoX2h3bmRGb3JUYXNrYmFyLCBwb3MsIF9wcm9ncmVzc0Jhcl9SYW5nZSk7DQorICAgICNlbmRpZg0KKyAgICBfcHJvZ3Jlc3NCYXJfUG9zID0gcG9zOw0KKyAgfQ0KK30NCisNCisjZGVmaW5lIFVJTlRfVE9fU1RSXzIodmFsKSB7IHNbMF0gPSAod2NoYXJfdCkoJzAnICsgKHZhbCkgLyAxMCk7IHNbMV0gPSAod2NoYXJfdCkoJzAnICsgKHZhbCkgJSAxMCk7IHMgKz0gMjsgfQ0KKw0KK3ZvaWQgR2V0VGltZVN0cmluZyhVSW50NjQgdGltZVZhbHVlLCB3Y2hhcl90ICpzKQ0KK3sNCisgIFVJbnQ2NCBob3VycyA9IHRpbWVWYWx1ZSAvIDM2MDA7DQorICBVSW50MzIgc2Vjb25kcyA9IChVSW50MzIpKHRpbWVWYWx1ZSAtIGhvdXJzICogMzYwMCk7DQorICBVSW50MzIgbWludXRlcyA9IHNlY29uZHMgLyA2MDsNCisgIHNlY29uZHMgJT0gNjA7DQorICBpZiAoaG91cnMgPiA5OSkNCisgIHsNCisgICAgQ29udmVydFVJbnQ2NFRvU3RyaW5nKGhvdXJzLCBzKTsNCisgICAgZm9yICg7ICpzICE9IDA7IHMrKyk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIFVJbnQzMiBob3VyczMyID0gKFVJbnQzMilob3VyczsNCisgICAgVUlOVF9UT19TVFJfMihob3VyczMyKTsNCisgIH0NCisgICpzKysgPSAnOic7IFVJTlRfVE9fU1RSXzIobWludXRlcyk7DQorICAqcysrID0gJzonOyBVSU5UX1RPX1NUUl8yKHNlY29uZHMpOw0KKyAgKnMgPSAwOw0KK30NCisNCitzdGF0aWMgdm9pZCBDb252ZXJ0U2l6ZVRvU3RyaW5nKFVJbnQ2NCB2LCB3Y2hhcl90ICpzKQ0KK3sNCisgIEJ5dGUgYyA9IDA7DQorICAgICAgIGlmICh2ID49ICgoVUludDY0KTEwMDAwMCA8PCAyMCkpIHsgdiA+Pj0gMzA7IGMgPSAnRyc7IH0NCisgIGVsc2UgaWYgKHYgPj0gKChVSW50NjQpMTAwMDAwIDw8IDEwKSkgeyB2ID4+PSAyMDsgYyA9ICdNJzsgfQ0KKyAgZWxzZSBpZiAodiA+PSAoKFVJbnQ2NCkxMDAwMDAgPDwgIDApKSB7IHYgPj49IDEwOyBjID0gJ0snOyB9DQorICBDb252ZXJ0VUludDY0VG9TdHJpbmcodiwgcyk7DQorICBpZiAoYyAhPSAwKQ0KKyAgew0KKyAgICBzICs9IE15U3RyaW5nTGVuKHMpOw0KKyAgICAqcysrID0gJyAnOw0KKyAgICAqcysrID0gYzsNCisgICAgKnMrKyA9IDA7DQorICB9DQorfQ0KKw0KK3ZvaWQgQ1Byb2dyZXNzRGlhbG9nOjpTaG93U2l6ZShpbnQgaWQsIFVJbnQ2NCB2YWwsIFVJbnQ2NCAmcHJldikNCit7DQorICBpZiAodmFsID09IHByZXYpDQorICAgIHJldHVybjsNCisgIHByZXYgPSB2YWw7DQorICB3Y2hhcl90IHNbNDBdOw0KKyAgc1swXSA9IDA7DQorICBpZiAoSVNfREVGSU5FRF9WQUwodmFsKSkNCisgICAgQ29udmVydFNpemVUb1N0cmluZyh2YWwsIHMpOw0KKyAgU2V0SXRlbVRleHQoaWQsIHMpOw0KK30NCisNCitzdGF0aWMgdm9pZCBHZXRDaGFuZ2VkU3RyaW5nKGNvbnN0IFVTdHJpbmcgJm5ld1N0ciwgVVN0cmluZyAmcHJldlN0ciwgYm9vbCAmaGFzQ2hhbmdlZCkNCit7DQorICBoYXNDaGFuZ2VkID0gIShwcmV2U3RyID09IG5ld1N0cik7DQorICBpZiAoaGFzQ2hhbmdlZCkNCisgICAgcHJldlN0ciA9IG5ld1N0cjsNCit9DQorDQorc3RhdGljIHVuc2lnbmVkIEdldFBvd2VyMzIoVUludDMyIHZhbCkNCit7DQorICBjb25zdCB1bnNpZ25lZCBrU3RhcnQgPSAzMjsNCisgIFVJbnQzMiBtYXNrID0gKChVSW50MzIpMSA8PCAoa1N0YXJ0IC0gMSkpOw0KKyAgZm9yICh1bnNpZ25lZCBpID0ga1N0YXJ0OzsgaS0tKQ0KKyAgew0KKyAgICBpZiAoaSA9PSAwIHx8ICh2YWwgJiBtYXNrKSAhPSAwKQ0KKyAgICAgIHJldHVybiBpOw0KKyAgICBtYXNrID4+PSAxOw0KKyAgfQ0KK30NCisNCitzdGF0aWMgdW5zaWduZWQgR2V0UG93ZXI2NChVSW50NjQgdmFsKQ0KK3sNCisgIFVJbnQzMiBoaWdoID0gKFVJbnQzMikodmFsID4+IDMyKTsNCisgIGlmIChoaWdoID09IDApDQorICAgIHJldHVybiBHZXRQb3dlcjMyKChVSW50MzIpdmFsKTsNCisgIHJldHVybiBHZXRQb3dlcjMyKGhpZ2gpICsgMzI7DQorDQorfQ0KKw0KK3N0YXRpYyBVSW50NjQgTXlNdWx0QW5kRGl2KFVJbnQ2NCBtdWx0MSwgVUludDY0IG11bHQyLCBVSW50NjQgZGl2aWRlcikNCit7DQorICB1bnNpZ25lZCBwb3cxID0gR2V0UG93ZXI2NChtdWx0MSk7DQorICB1bnNpZ25lZCBwb3cyID0gR2V0UG93ZXI2NChtdWx0Mik7DQorICB3aGlsZSAocG93MSArIHBvdzIgPiA2NCkNCisgIHsNCisgICAgaWYgKHBvdzEgPiBwb3cyKSB7IHBvdzEtLTsgbXVsdDEgPj49IDE7IH0NCisgICAgZWxzZSAgICAgICAgICAgICB7IHBvdzItLTsgbXVsdDIgPj49IDE7IH0NCisgICAgZGl2aWRlciA+Pj0gMTsNCisgIH0NCisgIFVJbnQ2NCByZXMgPSBtdWx0MSAqIG11bHQyOw0KKyAgaWYgKGRpdmlkZXIgIT0gMCkNCisgICAgcmVzIC89IGRpdmlkZXI7DQorICByZXR1cm4gcmVzOw0KK30NCisNCit2b2lkIENQcm9ncmVzc0RpYWxvZzo6VXBkYXRlU3RhdEluZm8oYm9vbCBzaG93QWxsKQ0KK3sNCisgIFVJbnQ2NCB0b3RhbCwgY29tcGxldGVkLCB0b3RhbEZpbGVzLCBjb21wbGV0ZWRGaWxlcywgaW5TaXplLCBvdXRTaXplOw0KKyAgYm9vbCBieXRlc1Byb2dyZXNzTW9kZTsNCisNCisgIGJvb2wgdGl0bGVGaWxlTmFtZV9DaGFuZ2VkOw0KKyAgYm9vbCBjdXJGaWxlUGF0aF9DaGFuZ2VkOw0KKyAgYm9vbCBzdGF0dXNfQ2hhbmdlZDsNCisgIHVuc2lnbmVkIG51bUVycm9yczsNCisgIHsNCisgICAgTlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbkxvY2sgbG9jayhTeW5jLl9jcyk7DQorICAgIHRvdGFsID0gU3luYy5fdG90YWxCeXRlczsNCisgICAgY29tcGxldGVkID0gU3luYy5fY29tcGxldGVkQnl0ZXM7DQorICAgIHRvdGFsRmlsZXMgPSBTeW5jLl90b3RhbEZpbGVzOw0KKyAgICBjb21wbGV0ZWRGaWxlcyA9IFN5bmMuX2N1ckZpbGVzOw0KKyAgICBpblNpemUgPSBTeW5jLl9pblNpemU7DQorICAgIG91dFNpemUgPSBTeW5jLl9vdXRTaXplOw0KKyAgICBieXRlc1Byb2dyZXNzTW9kZSA9IFN5bmMuX2J5dGVzUHJvZ3Jlc3NNb2RlOw0KKw0KKyAgICBHZXRDaGFuZ2VkU3RyaW5nKFN5bmMuX3RpdGxlRmlsZU5hbWUsIF90aXRsZUZpbGVOYW1lLCB0aXRsZUZpbGVOYW1lX0NoYW5nZWQpOw0KKyAgICBHZXRDaGFuZ2VkU3RyaW5nKFN5bmMuX2ZpbGVQYXRoLCBfZmlsZVBhdGgsIGN1ckZpbGVQYXRoX0NoYW5nZWQpOw0KKyAgICBHZXRDaGFuZ2VkU3RyaW5nKFN5bmMuX3N0YXR1cywgX3N0YXR1cywgc3RhdHVzX0NoYW5nZWQpOw0KKyAgICBpZiAoX2lzRGlyICE9IFN5bmMuX2lzRGlyKQ0KKyAgICB7DQorICAgICAgY3VyRmlsZVBhdGhfQ2hhbmdlZCA9IHRydWU7DQorICAgICAgX2lzRGlyID0gU3luYy5faXNEaXI7DQorICAgIH0NCisgICAgbnVtRXJyb3JzID0gU3luYy5NZXNzYWdlcy5TaXplKCk7DQorICB9DQorDQorICBVSW50MzIgY3VyVGltZSA9IDo6R2V0VGlja0NvdW50KCk7DQorDQorICB7DQorICAgIFVJbnQ2NCBwcm9ncmVzc1RvdGFsID0gYnl0ZXNQcm9ncmVzc01vZGUgPyB0b3RhbCA6IHRvdGFsRmlsZXM7DQorICAgIFVJbnQ2NCBwcm9ncmVzc0NvbXBsZXRlZCA9IGJ5dGVzUHJvZ3Jlc3NNb2RlID8gY29tcGxldGVkIDogY29tcGxldGVkRmlsZXM7DQorICAgIA0KKyAgICBpZiAoSVNfVU5ERUZJTkVEX1ZBTChwcm9ncmVzc1RvdGFsKSkNCisgICAgew0KKyAgICAgIC8vIFNldFBvcygwKTsNCisgICAgICAvLyBTZXRSYW5nZShwcm9ncmVzc0NvbXBsZXRlZCk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgaWYgKF9wcm9ncmVzc0Jhcl9Qb3MgIT0gMCB8fCBwcm9ncmVzc0NvbXBsZXRlZCAhPSAwIHx8DQorICAgICAgICAgIChfcHJvZ3Jlc3NCYXJfUmFuZ2UgPT0gMCAmJiBwcm9ncmVzc1RvdGFsICE9IDApKQ0KKyAgICAgIHsNCisgICAgICAgIFNldFByb2dyZXNzUmFuZ2UocHJvZ3Jlc3NUb3RhbCk7DQorICAgICAgICBTZXRQcm9ncmVzc1Bvcyhwcm9ncmVzc0NvbXBsZXRlZCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorDQorICBTaG93U2l6ZShJRFRfUFJPR1JFU1NfVE9UQUxfVkFMLCB0b3RhbCwgX3RvdGFsQnl0ZXNfUHJldik7DQorDQorICBfZWxhcHNlZFRpbWUgKz0gKGN1clRpbWUgLSBfcHJldlRpbWUpOw0KKyAgX3ByZXZUaW1lID0gY3VyVGltZTsNCisgIFVJbnQ2NCBlbGFwc2VkU2VjID0gX2VsYXBzZWRUaW1lIC8gMTAwMDsNCisgIGJvb2wgZWxhcHNlZENoYW5nZWQgPSBmYWxzZTsNCisgIGlmIChlbGFwc2VkU2VjICE9IF9wcmV2RWxhcHNlZFNlYykNCisgIHsNCisgICAgX3ByZXZFbGFwc2VkU2VjID0gZWxhcHNlZFNlYzsNCisgICAgZWxhcHNlZENoYW5nZWQgPSB0cnVlOw0KKyAgICB3Y2hhcl90IHNbNDBdOw0KKyAgICBHZXRUaW1lU3RyaW5nKGVsYXBzZWRTZWMsIHMpOw0KKyAgICBTZXRJdGVtVGV4dChJRFRfUFJPR1JFU1NfRUxBUFNFRF9WQUwsIHMpOw0KKyAgfQ0KKw0KKyAgYm9vbCBuZWVkU2V0VGl0bGUgPSBmYWxzZTsNCisgIGlmIChlbGFwc2VkQ2hhbmdlZCB8fCBzaG93QWxsKQ0KKyAgew0KKyAgICBpZiAobnVtRXJyb3JzID4gX251bVBvc3RlZE1lc3NhZ2VzKQ0KKyAgICB7DQorICAgICAgVXBkYXRlTWVzc2FnZXNEaWFsb2coKTsNCisgICAgICB3Y2hhcl90IHNbMzJdOw0KKyAgICAgIENvbnZlcnRVSW50NjRUb1N0cmluZyhudW1FcnJvcnMsIHMpOw0KKyAgICAgIFNldEl0ZW1UZXh0KElEVF9QUk9HUkVTU19FUlJPUlNfVkFMLCBzKTsNCisgICAgICBpZiAoIV9lcnJvcnNXZXJlRGlzcGxheWVkKQ0KKyAgICAgIHsNCisgICAgICAgIF9lcnJvcnNXZXJlRGlzcGxheWVkID0gdHJ1ZTsNCisgICAgICAgIEVuYWJsZUVycm9yc0NvbnRyb2xzKHRydWUpOw0KKyAgICAgICAgU2V0VGFza2JhclByb2dyZXNzU3RhdGUoKTsNCisgICAgICB9DQorICAgIH0NCisNCisgICAgaWYgKGNvbXBsZXRlZCAhPSAwKQ0KKyAgICB7DQorICAgICAgaWYgKElTX1VOREVGSU5FRF9WQUwodG90YWwpKQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChJU19ERUZJTkVEX1ZBTChfcHJldlJlbWFpbmluZ1NlYykpDQorICAgICAgICB7DQorICAgICAgICAgIElOSVRfQVNfVU5ERUZJTkVEKF9wcmV2UmVtYWluaW5nU2VjKTsNCisgICAgICAgICAgU2V0SXRlbVRleHQoSURUX1BST0dSRVNTX1JFTUFJTklOR19WQUwsIEwiIik7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBVSW50NjQgcmVtYWluaW5nVGltZSA9IDA7DQorICAgICAgICBpZiAoY29tcGxldGVkIDwgdG90YWwpDQorICAgICAgICAgIHJlbWFpbmluZ1RpbWUgPSBNeU11bHRBbmREaXYoX2VsYXBzZWRUaW1lLCB0b3RhbCAtIGNvbXBsZXRlZCwgY29tcGxldGVkKTsNCisgICAgICAgIFVJbnQ2NCByZW1haW5pbmdTZWMgPSByZW1haW5pbmdUaW1lIC8gMTAwMDsNCisgICAgICAgIGlmIChyZW1haW5pbmdTZWMgIT0gX3ByZXZSZW1haW5pbmdTZWMpDQorICAgICAgICB7DQorICAgICAgICAgIF9wcmV2UmVtYWluaW5nU2VjID0gcmVtYWluaW5nU2VjOw0KKyAgICAgICAgICB3Y2hhcl90IHNbNDBdOw0KKyAgICAgICAgICBHZXRUaW1lU3RyaW5nKHJlbWFpbmluZ1NlYywgcyk7DQorICAgICAgICAgIFNldEl0ZW1UZXh0KElEVF9QUk9HUkVTU19SRU1BSU5JTkdfVkFMLCBzKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgew0KKyAgICAgICAgVUludDY0IGVsYXBzZWRUaW1lID0gKF9lbGFwc2VkVGltZSA9PSAwKSA/IDEgOiBfZWxhcHNlZFRpbWU7DQorICAgICAgICBVSW50NjQgdiA9IChjb21wbGV0ZWQgKiAxMDAwKSAvIGVsYXBzZWRUaW1lOw0KKyAgICAgICAgQnl0ZSBjID0gMDsNCisgICAgICAgIHVuc2lnbmVkIG1vdmVCaXRzID0gMDsNCisgICAgICAgICAgICAgaWYgKHYgPj0gKChVSW50NjQpMTAwMDAgPDwgMTApKSB7IG1vdmVCaXRzID0gMjA7IGMgPSAnTSc7IH0NCisgICAgICAgIGVsc2UgaWYgKHYgPj0gKChVSW50NjQpMTAwMDAgPDwgIDApKSB7IG1vdmVCaXRzID0gMTA7IGMgPSAnSyc7IH0NCisgICAgICAgIHYgPj49IG1vdmVCaXRzOw0KKyAgICAgICAgaWYgKG1vdmVCaXRzICE9IF9wcmV2U3BlZWRfTW92ZUJpdHMgfHwgdiAhPSBfcHJldlNwZWVkKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBfcHJldlNwZWVkX01vdmVCaXRzID0gbW92ZUJpdHM7DQorICAgICAgICAgIF9wcmV2U3BlZWQgPSB2Ow0KKyAgICAgICAgICB3Y2hhcl90IHNbNDBdOw0KKyAgICAgICAgICBDb252ZXJ0VUludDY0VG9TdHJpbmcodiwgcyk7DQorICAgICAgICAgIHVuc2lnbmVkIHBvcyA9IE15U3RyaW5nTGVuKHMpOw0KKyAgICAgICAgICBzW3BvcysrXSA9ICcgJzsNCisgICAgICAgICAgaWYgKG1vdmVCaXRzICE9IDApDQorICAgICAgICAgICAgc1twb3MrK10gPSBjOw0KKyAgICAgICAgICBzW3BvcysrXSA9ICdCJzsNCisgICAgICAgICAgc1twb3MrK10gPSAnLyc7DQorICAgICAgICAgIHNbcG9zKytdID0gJ3MnOw0KKyAgICAgICAgICBzW3BvcysrXSA9IDA7DQorICAgICAgICAgIFNldEl0ZW1UZXh0KElEVF9QUk9HUkVTU19TUEVFRF9WQUwsIHMpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICB7DQorICAgICAgVUludDY0IHBlcmNlbnQgPSAwOw0KKyAgICAgIHsNCisgICAgICAgIGlmIChJU19ERUZJTkVEX1ZBTCh0b3RhbCkpDQorICAgICAgICB7DQorICAgICAgICAgIHBlcmNlbnQgPSBjb21wbGV0ZWQgKiAxMDA7DQorICAgICAgICAgIGlmICh0b3RhbCAhPSAwKQ0KKyAgICAgICAgICAgIHBlcmNlbnQgLz0gdG90YWw7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChwZXJjZW50ICE9IF9wcmV2UGVyY2VudFZhbHVlKQ0KKyAgICAgIHsNCisgICAgICAgIF9wcmV2UGVyY2VudFZhbHVlID0gcGVyY2VudDsNCisgICAgICAgIG5lZWRTZXRUaXRsZSA9IHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICB7DQorICAgICAgd2NoYXJfdCBzWzY0XTsNCisgICAgICBDb252ZXJ0VUludDY0VG9TdHJpbmcoY29tcGxldGVkRmlsZXMsIHMpOw0KKyAgICAgIGlmIChJU19ERUZJTkVEX1ZBTCh0b3RhbEZpbGVzKSkNCisgICAgICB7DQorICAgICAgICB3Y3NjYXQocywgTCIgLyAiKTsNCisgICAgICAgIENvbnZlcnRVSW50NjRUb1N0cmluZyh0b3RhbEZpbGVzLCBzICsgd2NzbGVuKHMpKTsNCisgICAgICB9DQorICAgICAgaWYgKF9maWxlc1N0cl9QcmV2ICE9IHMpDQorICAgICAgew0KKyAgICAgICAgX2ZpbGVzU3RyX1ByZXYgPSBzOw0KKyAgICAgICAgU2V0SXRlbVRleHQoSURUX1BST0dSRVNTX0ZJTEVTX1ZBTCwgcyk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBjb25zdCBVSW50NjQgcGFja1NpemUgICA9IENvbXByZXNzaW5nTW9kZSA/IG91dFNpemUgOiBpblNpemU7DQorICAgIGNvbnN0IFVJbnQ2NCB1bnBhY2tTaXplID0gQ29tcHJlc3NpbmdNb2RlID8gaW5TaXplIDogb3V0U2l6ZTsNCisNCisgICAgaWYgKElTX1VOREVGSU5FRF9WQUwodW5wYWNrU2l6ZSkgJiYNCisgICAgICAgIElTX1VOREVGSU5FRF9WQUwocGFja1NpemUpKQ0KKyAgICB7DQorICAgICAgU2hvd1NpemUoSURUX1BST0dSRVNTX1BST0NFU1NFRF9WQUwsIGNvbXBsZXRlZCwgX3Byb2Nlc3NlZF9QcmV2KTsNCisgICAgICBTaG93U2l6ZShJRFRfUFJPR1JFU1NfUEFDS0VEX1ZBTCwgVU5ERUZJTkVEX1ZBTCwgX3BhY2tlZF9QcmV2KTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBTaG93U2l6ZShJRFRfUFJPR1JFU1NfUFJPQ0VTU0VEX1ZBTCwgdW5wYWNrU2l6ZSwgX3Byb2Nlc3NlZF9QcmV2KTsNCisgICAgICBTaG93U2l6ZShJRFRfUFJPR1JFU1NfUEFDS0VEX1ZBTCwgcGFja1NpemUsIF9wYWNrZWRfUHJldik7DQorICAgICAgDQorICAgICAgaWYgKElTX0RFRklORURfVkFMKHBhY2tTaXplKSAmJg0KKyAgICAgICAgICBJU19ERUZJTkVEX1ZBTCh1bnBhY2tTaXplKSAmJg0KKyAgICAgICAgICB1bnBhY2tTaXplICE9IDApDQorICAgICAgew0KKyAgICAgICAgd2NoYXJfdCBzWzMyXTsNCisgICAgICAgIFVJbnQ2NCByYXRpbyA9IHBhY2tTaXplICogMTAwIC8gdW5wYWNrU2l6ZTsNCisgICAgICAgIGlmIChfcmF0aW9fUHJldiAhPSByYXRpbykNCisgICAgICAgIHsNCisgICAgICAgICAgX3JhdGlvX1ByZXYgPSByYXRpbzsNCisgICAgICAgICAgQ29udmVydFVJbnQ2NFRvU3RyaW5nKHJhdGlvLCBzKTsNCisgICAgICAgICAgd2NzY2F0KHMsIEwiJSIpOw0KKyAgICAgICAgICBTZXRJdGVtVGV4dChJRFRfUFJPR1JFU1NfUkFUSU9fVkFMLCBzKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIGlmIChuZWVkU2V0VGl0bGUgfHwgdGl0bGVGaWxlTmFtZV9DaGFuZ2VkKQ0KKyAgICBTZXRUaXRsZVRleHQoKTsNCisNCisgIGlmIChzdGF0dXNfQ2hhbmdlZCkNCisgIHsNCisgICAgVVN0cmluZyBzID0gX3N0YXR1czsNCisgICAgUmVkdWNlU3RyaW5nKHMsIF9udW1SZWR1Y2VTeW1ib2xzKTsNCisgICAgU2V0SXRlbVRleHQoSURUX1BST0dSRVNTX1NUQVRVUywgX3N0YXR1cyk7DQorICB9DQorDQorICBpZiAoY3VyRmlsZVBhdGhfQ2hhbmdlZCkNCisgIHsNCisgICAgVVN0cmluZyBzMSwgczI7DQorICAgIGlmIChfaXNEaXIpDQorICAgICAgczEgPSBfZmlsZVBhdGg7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGludCBzbGFzaFBvcyA9IF9maWxlUGF0aC5SZXZlcnNlRmluZChXQ0hBUl9QQVRIX1NFUEFSQVRPUik7DQorICAgICAgaWYgKHNsYXNoUG9zID49IDApDQorICAgICAgew0KKyAgICAgICAgczEuU2V0RnJvbShfZmlsZVBhdGgsIHNsYXNoUG9zICsgMSk7DQorICAgICAgICBzMiA9IF9maWxlUGF0aC5QdHIoc2xhc2hQb3MgKyAxKTsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgICAgczIgPSBfZmlsZVBhdGg7DQorICAgIH0NCisgICAgUmVkdWNlU3RyaW5nKHMxLCBfbnVtUmVkdWNlU3ltYm9scyk7DQorICAgIFJlZHVjZVN0cmluZyhzMiwgX251bVJlZHVjZVN5bWJvbHMpOw0KKyAgICBzMSArPSBMJ1xuJzsNCisgICAgczEgKz0gczI7DQorICAgIFNldEl0ZW1UZXh0KElEVF9QUk9HUkVTU19GSUxFX05BTUUsIHMxKTsNCisgIH0NCit9DQorDQorYm9vbCBDUHJvZ3Jlc3NEaWFsb2c6Ok9uVGltZXIoV1BBUkFNIC8qIHRpbWVySUQgKi8sIExQQVJBTSAvKiBjYWxsYmFjayAqLykNCit7DQorICBpZiAoU3luYy5HZXRfUGF1c2VkKCkpDQorICAgIHJldHVybiB0cnVlOw0KKyAgQ2hlY2tOZWVkQ2xvc2UoKTsNCisgIFVwZGF0ZVN0YXRJbmZvKGZhbHNlKTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitzdHJ1Y3QgQ1dhaXRDdXJzb3INCit7DQorICBIQ1VSU09SIF93YWl0Q3Vyc29yOw0KKyAgSENVUlNPUiBfb2xkQ3Vyc29yOw0KKyAgQ1dhaXRDdXJzb3IoKQ0KKyAgew0KKyAgICBfd2FpdEN1cnNvciA9IExvYWRDdXJzb3IoTlVMTCwgSURDX1dBSVQpOw0KKyAgICBpZiAoX3dhaXRDdXJzb3IgIT0gTlVMTCkNCisgICAgICBfb2xkQ3Vyc29yID0gU2V0Q3Vyc29yKF93YWl0Q3Vyc29yKTsNCisgIH0NCisgIH5DV2FpdEN1cnNvcigpDQorICB7DQorICAgIGlmIChfd2FpdEN1cnNvciAhPSBOVUxMKQ0KKyAgICAgIFNldEN1cnNvcihfb2xkQ3Vyc29yKTsNCisgIH0NCit9Ow0KKw0KK0lOVF9QVFIgQ1Byb2dyZXNzRGlhbG9nOjpDcmVhdGUoY29uc3QgVVN0cmluZyAmdGl0bGUsIE5XaW5kb3dzOjpDVGhyZWFkICZ0aHJlYWQsIEhXTkQgd25kUGFyZW50KQ0KK3sNCisgIElOVF9QVFIgcmVzID0gMDsNCisgIHRyeQ0KKyAgew0KKyAgICBpZiAoV2FpdE1vZGUpDQorICAgIHsNCisgICAgICBDV2FpdEN1cnNvciB3YWl0Q3Vyc29yOw0KKyAgICAgIEhBTkRMRSBoW10gPSB7IHRocmVhZCwgX2NyZWF0ZURpYWxvZ0V2ZW50IH07DQorICAgICAgDQorICAgICAgV1JlcyByZXMgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKEFSUkFZX1NJWkUoaCksIGgsIEZBTFNFLCBrQ3JlYXRlRGVsYXkpOw0KKyAgICAgIGlmIChyZXMgPT0gV0FJVF9PQkpFQ1RfMCAmJiAhU3luYy5UaGVyZUlzTWVzc2FnZSgpKQ0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgX3RpdGxlID0gdGl0bGU7DQorICAgIEJJR19ESUFMT0dfU0laRSgzNjAsIDE5Mik7DQorICAgIHJlcyA9IENNb2RhbERpYWxvZzo6Q3JlYXRlKFNJWkVEX0RJQUxPRyhJRERfUFJPR1JFU1MpLCB3bmRQYXJlbnQpOw0KKyAgfQ0KKyAgY2F0Y2goLi4uKQ0KKyAgew0KKyAgICBfd2FzQ3JlYXRlZCA9IHRydWU7DQorICAgIF9kaWFsb2dDcmVhdGVkRXZlbnQuU2V0KCk7DQorICAgIHJlcyA9IHJlczsNCisgIH0NCisgIHRocmVhZC5XYWl0KCk7DQorICBpZiAoIU1lc3NhZ2VzRGlzcGxheWVkKQ0KKyAgICBNZXNzYWdlQm94Vyh3bmRQYXJlbnQsIEwiUHJvZ3Jlc3MgRXJyb3IiLCBMIjctWmlwIiwgTUJfSUNPTkVSUk9SKTsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK2Jvb2wgQ1Byb2dyZXNzRGlhbG9nOjpPbkV4dGVybmFsQ2xvc2VNZXNzYWdlKCkNCit7DQorICAvLyBpdCBkb2Vzbid0IHdvcmsgaWYgdGhlcmUgaXMgTWVzc2FnZUJveC4NCisgICNpZmRlZiBfX0lUYXNrYmFyTGlzdDNfSU5URVJGQUNFX0RFRklORURfXw0KKyAgU2V0VGFza2JhclByb2dyZXNzU3RhdGUoVEJQRl9OT1BST0dSRVNTKTsNCisgICNlbmRpZg0KKyAgLy8gQWRkVG9UaXRsZShMIkZpbmlzaGVkICIpOw0KKyAgLy8gU2V0VGV4dChMIkZpbmlzaGVkMiAiKTsNCisNCisgIFVwZGF0ZVN0YXRJbmZvKHRydWUpOw0KKyAgDQorICBTZXRJdGVtVGV4dChJRENBTkNFTCwgTGFuZ1N0cmluZyhJRFNfQ0xPU0UpKTsNCisgIDo6U2VuZE1lc3NhZ2UoR2V0SXRlbShJRENBTkNFTCksIEJNX1NFVFNUWUxFLCBCU19ERUZQVVNIQlVUVE9OLCBNQUtFTFBBUkFNKFRSVUUsIDApKTsNCisgIEhpZGVJdGVtKElEQl9QUk9HUkVTU19CQUNLR1JPVU5EKTsNCisgIEhpZGVJdGVtKElEQl9QQVVTRSk7DQorICANCisgIGJvb2wgdGhlcmVBcmVNZXNzYWdlczsNCisgIENQcm9ncmVzc0ZpbmFsTWVzc2FnZSBmbTsNCisgIHsNCisgICAgTlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbkxvY2sgbG9jayhTeW5jLl9jcyk7DQorICAgIHRoZXJlQXJlTWVzc2FnZXMgPSAhU3luYy5NZXNzYWdlcy5Jc0VtcHR5KCk7DQorICAgIGZtID0gU3luYy5GaW5hbE1lc3NhZ2U7DQorICB9DQorICBpZiAoIWZtLkVycm9yTWVzc2FnZS5NZXNzYWdlLklzRW1wdHkoKSkNCisgIHsNCisgICAgTWVzc2FnZXNEaXNwbGF5ZWQgPSB0cnVlOw0KKyAgICBpZiAoZm0uRXJyb3JNZXNzYWdlLlRpdGxlLklzRW1wdHkoKSkNCisgICAgICBmbS5FcnJvck1lc3NhZ2UuVGl0bGUgPSBMIjctWmlwIjsNCisgICAgTWVzc2FnZUJveFcoKnRoaXMsIGZtLkVycm9yTWVzc2FnZS5NZXNzYWdlLCBmbS5FcnJvck1lc3NhZ2UuVGl0bGUsIE1CX0lDT05FUlJPUik7DQorICB9DQorICBlbHNlIGlmICghdGhlcmVBcmVNZXNzYWdlcykNCisgIHsNCisgICAgTWVzc2FnZXNEaXNwbGF5ZWQgPSB0cnVlOw0KKyAgICBpZiAoIWZtLk9rTWVzc2FnZS5NZXNzYWdlLklzRW1wdHkoKSkNCisgICAgew0KKyAgICAgIGlmIChmbS5Pa01lc3NhZ2UuVGl0bGUuSXNFbXB0eSgpKQ0KKyAgICAgICAgZm0uT2tNZXNzYWdlLlRpdGxlID0gTCI3LVppcCI7DQorICAgICAgTWVzc2FnZUJveFcoKnRoaXMsIGZtLk9rTWVzc2FnZS5NZXNzYWdlLCBmbS5Pa01lc3NhZ2UuVGl0bGUsIE1CX09LKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKHRoZXJlQXJlTWVzc2FnZXMgJiYgIV9jYW5jZWxXYXNQcmVzc2VkKQ0KKyAgew0KKyAgICBfd2FpdENsb3NlQnlDYW5jZWxCdXR0b24gPSB0cnVlOw0KKyAgICBVcGRhdGVNZXNzYWdlc0RpYWxvZygpOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisNCisgIEVuZCgwKTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sIENQcm9ncmVzc0RpYWxvZzo6T25NZXNzYWdlKFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkNCit7DQorICBzd2l0Y2ggKG1lc3NhZ2UpDQorICB7DQorICAgIGNhc2Uga0Nsb3NlTWVzc2FnZToNCisgICAgew0KKyAgICAgIEtpbGxUaW1lcihfdGltZXIpOw0KKyAgICAgIF90aW1lciA9IDA7DQorICAgICAgaWYgKF9pbkNhbmNlbE1lc3NhZ2VCb3gpDQorICAgICAgew0KKyAgICAgICAgX2V4dGVybmFsQ2xvc2VNZXNzYWdlV2FzUmVjZWl2ZWQgPSB0cnVlOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBPbkV4dGVybmFsQ2xvc2VNZXNzYWdlKCk7DQorICAgIH0NCisgICAgLyoNCisgICAgY2FzZSBXTV9TRVRURVhUOg0KKyAgICB7DQorICAgICAgaWYgKF90aW1lciA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgKi8NCisgIH0NCisgIHJldHVybiBDTW9kYWxEaWFsb2c6Ok9uTWVzc2FnZShtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7DQorfQ0KKw0KK3ZvaWQgQ1Byb2dyZXNzRGlhbG9nOjpTZXRUaXRsZVRleHQoKQ0KK3sNCisgIFVTdHJpbmcgczsNCisgIGlmIChTeW5jLkdldF9QYXVzZWQoKSkNCisgIHsNCisgICAgcyArPSBfcGF1c2VkX1N0cmluZzsNCisgICAgcyArPSBMJyAnOw0KKyAgfQ0KKyAgaWYgKElTX0RFRklORURfVkFMKF9wcmV2UGVyY2VudFZhbHVlKSkNCisgIHsNCisgICAgd2NoYXJfdCB0ZW1wWzMyXTsNCisgICAgQ29udmVydFVJbnQ2NFRvU3RyaW5nKF9wcmV2UGVyY2VudFZhbHVlLCB0ZW1wKTsNCisgICAgcyArPSB0ZW1wOw0KKyAgICBzICs9IEwnJSc7DQorICB9DQorICBpZiAoIV9mb3JlZ3JvdW5kKQ0KKyAgew0KKyAgICBzICs9IEwnICc7DQorICAgIHMgKz0gX2JhY2tncm91bmRlZF9TdHJpbmc7DQorICB9DQorDQorICBzICs9IEwnICc7DQorICAjaWZuZGVmIF9TRlgNCisgIHsNCisgICAgdW5zaWduZWQgbGVuID0gcy5MZW4oKTsNCisgICAgcyArPSBNYWluQWRkVGl0bGU7DQorICAgIEFkZFRvVGl0bGUocyk7DQorICAgIHMuRGVsZXRlRnJvbShsZW4pOw0KKyAgfQ0KKyAgI2VuZGlmDQorDQorICBzICs9IF90aXRsZTsNCisgIGlmICghX3RpdGxlRmlsZU5hbWUuSXNFbXB0eSgpKQ0KKyAgew0KKyAgICBVU3RyaW5nIGZpbGVOYW1lID0gX3RpdGxlRmlsZU5hbWU7DQorICAgIFJlZHVjZVN0cmluZyhmaWxlTmFtZSwga1RpdGxlRmlsZU5hbWVTaXplTGltaXQpOw0KKyAgICBzICs9IEwnICc7DQorICAgIHMgKz0gZmlsZU5hbWU7DQorICB9DQorICBTZXRUZXh0KHMpOw0KK30NCisNCit2b2lkIENQcm9ncmVzc0RpYWxvZzo6U2V0UGF1c2VUZXh0KCkNCit7DQorICBTZXRJdGVtVGV4dChJREJfUEFVU0UsIFN5bmMuR2V0X1BhdXNlZCgpID8gX2NvbnRpbnVlX1N0cmluZyA6IF9wYXVzZV9TdHJpbmcpOw0KKyAgU2V0VGl0bGVUZXh0KCk7DQorfQ0KKw0KK3ZvaWQgQ1Byb2dyZXNzRGlhbG9nOjpPblBhdXNlQnV0dG9uKCkNCit7DQorICBib29sIHBhdXNlZCA9ICFTeW5jLkdldF9QYXVzZWQoKTsNCisgIFN5bmMuU2V0X1BhdXNlZChwYXVzZWQpOw0KKyAgVUludDMyIGN1clRpbWUgPSA6OkdldFRpY2tDb3VudCgpOw0KKyAgaWYgKHBhdXNlZCkNCisgICAgX2VsYXBzZWRUaW1lICs9IChjdXJUaW1lIC0gX3ByZXZUaW1lKTsNCisgIFNldFRhc2tiYXJQcm9ncmVzc1N0YXRlKCk7DQorICBfcHJldlRpbWUgPSBjdXJUaW1lOw0KKyAgU2V0UGF1c2VUZXh0KCk7DQorfQ0KKw0KK3ZvaWQgQ1Byb2dyZXNzRGlhbG9nOjpTZXRQcmlvcml0eVRleHQoKQ0KK3sNCisgIFNldEl0ZW1UZXh0KElEQl9QUk9HUkVTU19CQUNLR1JPVU5ELCBfZm9yZWdyb3VuZCA/DQorICAgICAgX2JhY2tncm91bmRfU3RyaW5nIDoNCisgICAgICBfZm9yZWdyb3VuZF9TdHJpbmcpOw0KKyAgU2V0VGl0bGVUZXh0KCk7DQorfQ0KKw0KK3ZvaWQgQ1Byb2dyZXNzRGlhbG9nOjpPblByaW9yaXR5QnV0dG9uKCkNCit7DQorICBfZm9yZWdyb3VuZCA9ICFfZm9yZWdyb3VuZDsNCisgICNpZm5kZWYgVU5ERVJfQ0UNCisgIFNldFByaW9yaXR5Q2xhc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgX2ZvcmVncm91bmQgPyBOT1JNQUxfUFJJT1JJVFlfQ0xBU1M6IElETEVfUFJJT1JJVFlfQ0xBU1MpOw0KKyAgI2VuZGlmDQorICBTZXRQcmlvcml0eVRleHQoKTsNCit9DQorDQordm9pZCBDUHJvZ3Jlc3NEaWFsb2c6OkFkZE1lc3NhZ2VEaXJlY3QoTFBDV1NUUiBtZXNzYWdlLCBib29sIG5lZWROdW1iZXIpDQorew0KKyAgaW50IGl0ZW1JbmRleCA9IF9tZXNzYWdlTGlzdC5HZXRJdGVtQ291bnQoKTsNCisgIHdjaGFyX3Qgc3pbMTZdOw0KKyAgc3pbMF0gPSAwOw0KKyAgaWYgKG5lZWROdW1iZXIpDQorICAgIENvbnZlcnRVSW50MzJUb1N0cmluZyhfbnVtTWVzc2FnZXMgKyAxLCBzeik7DQorICBfbWVzc2FnZUxpc3QuSW5zZXJ0SXRlbShpdGVtSW5kZXgsIHN6KTsNCisgIF9tZXNzYWdlTGlzdC5TZXRTdWJJdGVtKGl0ZW1JbmRleCwgMSwgbWVzc2FnZSk7DQorfQ0KKw0KK3ZvaWQgQ1Byb2dyZXNzRGlhbG9nOjpBZGRNZXNzYWdlKExQQ1dTVFIgbWVzc2FnZSkNCit7DQorICBVU3RyaW5nIHMgPSBtZXNzYWdlOw0KKyAgYm9vbCBuZWVkTnVtYmVyID0gdHJ1ZTsNCisgIHdoaWxlICghcy5Jc0VtcHR5KCkpDQorICB7DQorICAgIGludCBwb3MgPSBzLkZpbmQoTCdcbicpOw0KKyAgICBpZiAocG9zIDwgMCkNCisgICAgICBicmVhazsNCisgICAgQWRkTWVzc2FnZURpcmVjdChzLkxlZnQocG9zKSwgbmVlZE51bWJlcik7DQorICAgIG5lZWROdW1iZXIgPSBmYWxzZTsNCisgICAgcy5EZWxldGVGcm9udGFsKHBvcyArIDEpOw0KKyAgfQ0KKyAgQWRkTWVzc2FnZURpcmVjdChzLCBuZWVkTnVtYmVyKTsNCisgIF9udW1NZXNzYWdlcysrOw0KK30NCisNCitzdGF0aWMgdW5zaWduZWQgR2V0TnVtRGlnaXRzKFVJbnQzMiB2YWwpDQorew0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IHZhbCA+PSAxMDsgaSsrKQ0KKyAgICB2YWwgLz0gMTA7DQorICByZXR1cm4gaTsNCit9DQorDQordm9pZCBDUHJvZ3Jlc3NEaWFsb2c6OlVwZGF0ZU1lc3NhZ2VzRGlhbG9nKCkNCit7DQorICBVU3RyaW5nVmVjdG9yIG1lc3NhZ2VzOw0KKyAgew0KKyAgICBOU3luY2hyb25pemF0aW9uOjpDQ3JpdGljYWxTZWN0aW9uTG9jayBsb2NrKFN5bmMuX2NzKTsNCisgICAgdW5zaWduZWQgbnVtID0gU3luYy5NZXNzYWdlcy5TaXplKCk7DQorICAgIGlmIChudW0gPiBfbnVtUG9zdGVkTWVzc2FnZXMpDQorICAgIHsNCisgICAgICBtZXNzYWdlcy5DbGVhckFuZFJlc2VydmUobnVtIC0gX251bVBvc3RlZE1lc3NhZ2VzKTsNCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBfbnVtUG9zdGVkTWVzc2FnZXM7IGkgPCBudW07IGkrKykNCisgICAgICAgIG1lc3NhZ2VzLkFkZEluUmVzZXJ2ZWQoU3luYy5NZXNzYWdlc1tpXSk7DQorICAgICAgX251bVBvc3RlZE1lc3NhZ2VzID0gbnVtOw0KKyAgICB9DQorICB9DQorICBpZiAoIW1lc3NhZ2VzLklzRW1wdHkoKSkNCisgIHsNCisgICAgRk9SX1ZFQ1RPUiAoaSwgbWVzc2FnZXMpDQorICAgICAgQWRkTWVzc2FnZShtZXNzYWdlc1tpXSk7DQorICAgIGlmIChfbnVtQXV0b1NpemVNZXNzYWdlcyA8IDI1NiB8fCBHZXROdW1EaWdpdHMoX251bVBvc3RlZE1lc3NhZ2VzKSA+IEdldE51bURpZ2l0cyhfbnVtQXV0b1NpemVNZXNzYWdlcykpDQorICAgIHsNCisgICAgICBfbWVzc2FnZUxpc3QuU2V0Q29sdW1uV2lkdGhBdXRvKDApOw0KKyAgICAgIF9tZXNzYWdlTGlzdC5TZXRDb2x1bW5XaWR0aEF1dG8oMSk7DQorICAgICAgX251bUF1dG9TaXplTWVzc2FnZXMgPSBfbnVtUG9zdGVkTWVzc2FnZXM7DQorICAgIH0NCisgIH0NCit9DQorDQorDQorYm9vbCBDUHJvZ3Jlc3NEaWFsb2c6Ok9uQnV0dG9uQ2xpY2tlZChpbnQgYnV0dG9uSUQsIEhXTkQgYnV0dG9uSFdORCkNCit7DQorICBzd2l0Y2ggKGJ1dHRvbklEKQ0KKyAgew0KKyAgICAvLyBjYXNlIElET0s6IC8vIGlmIElEQ0FOQ0VMIGlzIG5vdCBERUZQVVNIQlVUVE9ODQorICAgIGNhc2UgSURDQU5DRUw6DQorICAgIHsNCisgICAgICBpZiAoX3dhaXRDbG9zZUJ5Q2FuY2VsQnV0dG9uKQ0KKyAgICAgIHsNCisgICAgICAgIE1lc3NhZ2VzRGlzcGxheWVkID0gdHJ1ZTsNCisgICAgICAgIEVuZChJRENMT1NFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICAgIA0KKyAgICAgIGJvb2wgcGF1c2VkID0gU3luYy5HZXRfUGF1c2VkKCk7DQorICAgICAgaWYgKCFwYXVzZWQpDQorICAgICAgICBPblBhdXNlQnV0dG9uKCk7DQorICAgICAgX2luQ2FuY2VsTWVzc2FnZUJveCA9IHRydWU7DQorICAgICAgaW50IHJlcyA9IDo6TWVzc2FnZUJveFcoKnRoaXMsIExhbmdTdHJpbmcoSURTX1BST0dSRVNTX0FTS19DQU5DRUwpLCBfdGl0bGUsIE1CX1lFU05PQ0FOQ0VMKTsNCisgICAgICBfaW5DYW5jZWxNZXNzYWdlQm94ID0gZmFsc2U7DQorICAgICAgaWYgKCFwYXVzZWQpDQorICAgICAgICBPblBhdXNlQnV0dG9uKCk7DQorICAgICAgaWYgKHJlcyA9PSBJRENBTkNFTCB8fCByZXMgPT0gSUROTykNCisgICAgICB7DQorICAgICAgICBpZiAoX2V4dGVybmFsQ2xvc2VNZXNzYWdlV2FzUmVjZWl2ZWQpDQorICAgICAgICAgIE9uRXh0ZXJuYWxDbG9zZU1lc3NhZ2UoKTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIH0NCisNCisgICAgICBfY2FuY2VsV2FzUHJlc3NlZCA9IHRydWU7DQorICAgICAgTWVzc2FnZXNEaXNwbGF5ZWQgPSB0cnVlOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorDQorICAgIGNhc2UgSURCX1BBVVNFOg0KKyAgICAgIE9uUGF1c2VCdXR0b24oKTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgY2FzZSBJREJfUFJPR1JFU1NfQkFDS0dST1VORDoNCisgICAgICBPblByaW9yaXR5QnV0dG9uKCk7DQorICAgICAgcmV0dXJuIHRydWU7DQorICB9DQorICByZXR1cm4gQ01vZGFsRGlhbG9nOjpPbkJ1dHRvbkNsaWNrZWQoYnV0dG9uSUQsIGJ1dHRvbkhXTkQpOw0KK30NCisNCit2b2lkIENQcm9ncmVzc0RpYWxvZzo6Q2hlY2tOZWVkQ2xvc2UoKQ0KK3sNCisgIGlmIChfbmVlZENsb3NlKQ0KKyAgew0KKyAgICBQb3N0TWVzc2FnZShrQ2xvc2VNZXNzYWdlKTsNCisgICAgX25lZWRDbG9zZSA9IGZhbHNlOw0KKyAgfQ0KK30NCisNCit2b2lkIENQcm9ncmVzc0RpYWxvZzo6UHJvY2Vzc1dhc0ZpbmlzaGVkKCkNCit7DQorICAvLyBTZXQgV2luZG93IHRpdGxlIGhlcmUuDQorICBpZiAoIVdhaXRNb2RlKQ0KKyAgICBXYWl0Q3JlYXRpbmcoKTsNCisgIA0KKyAgaWYgKF93YXNDcmVhdGVkKQ0KKyAgICBQb3N0TWVzc2FnZShrQ2xvc2VNZXNzYWdlKTsNCisgIGVsc2UNCisgICAgX25lZWRDbG9zZSA9IHRydWU7DQorfQ0KKw0KKw0KK0hSRVNVTFQgQ1Byb2dyZXNzVGhyZWFkVmlydDo6Q3JlYXRlKGNvbnN0IFVTdHJpbmcgJnRpdGxlLCBIV05EIHBhcmVudFdpbmRvdykNCit7DQorICBOV2luZG93czo6Q1RocmVhZCB0aHJlYWQ7DQorICBSSU5PSyh0aHJlYWQuQ3JlYXRlKE15VGhyZWFkRnVuY3Rpb24sIHRoaXMpKTsNCisgIFByb2dyZXNzRGlhbG9nLkNyZWF0ZSh0aXRsZSwgdGhyZWFkLCBwYXJlbnRXaW5kb3cpOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIEFkZE1lc3NhZ2VUb1N0cmluZyhVU3RyaW5nICZkZXN0LCBjb25zdCBVU3RyaW5nICZzcmMpDQorew0KKyAgaWYgKCFzcmMuSXNFbXB0eSgpKQ0KKyAgew0KKyAgICBpZiAoIWRlc3QuSXNFbXB0eSgpKQ0KKyAgICAgIGRlc3QgKz0gTCdcbic7DQorICAgIGRlc3QgKz0gc3JjOw0KKyAgfQ0KK30NCisNCit2b2lkIENQcm9ncmVzc1RocmVhZFZpcnQ6OlByb2Nlc3MoKQ0KK3sNCisgIENQcm9ncmVzc0Nsb3NlciBjbG9zZXIoUHJvZ3Jlc3NEaWFsb2cpOw0KKyAgVVN0cmluZyBtOw0KKyAgdHJ5IHsgUmVzdWx0ID0gUHJvY2Vzc1ZpcnQoKTsgfQ0KKyAgY2F0Y2goY29uc3Qgd2NoYXJfdCAqcykgeyBtID0gczsgfQ0KKyAgY2F0Y2goY29uc3QgVVN0cmluZyAmcykgeyBtID0gczsgfQ0KKyAgY2F0Y2goY29uc3QgY2hhciAqcykgeyBtID0gR2V0VW5pY29kZVN0cmluZyhzKTsgfQ0KKyAgY2F0Y2goaW50IHYpDQorICB7DQorICAgIHdjaGFyX3Qgc1sxNl07DQorICAgIENvbnZlcnRVSW50MzJUb1N0cmluZyh2LCBzKTsNCisgICAgbSA9IEwiRXJyb3IgIyI7DQorICAgIG0gKz0gczsNCisgIH0NCisgIGNhdGNoKC4uLikgeyBtID0gTCJFcnJvciI7IH0NCisgIGlmIChSZXN1bHQgIT0gRV9BQk9SVCkNCisgIHsNCisgICAgaWYgKG0uSXNFbXB0eSgpICYmIFJlc3VsdCAhPSBTX09LKQ0KKyAgICAgIG0gPSBIUmVzdWx0VG9NZXNzYWdlKFJlc3VsdCk7DQorICB9DQorICBBZGRNZXNzYWdlVG9TdHJpbmcobSwgRmluYWxNZXNzYWdlLkVycm9yTWVzc2FnZS5NZXNzYWdlKTsNCisgIEFkZE1lc3NhZ2VUb1N0cmluZyhtLCBmczJ1cyhFcnJvclBhdGgxKSk7DQorICBBZGRNZXNzYWdlVG9TdHJpbmcobSwgZnMydXMoRXJyb3JQYXRoMikpOw0KKw0KKyAgQ1Byb2dyZXNzU3luYyAmc3luYyA9IFByb2dyZXNzRGlhbG9nLlN5bmM7DQorICBOU3luY2hyb25pemF0aW9uOjpDQ3JpdGljYWxTZWN0aW9uTG9jayBsb2NrKHN5bmMuX2NzKTsNCisgIGlmIChtLklzRW1wdHkoKSkNCisgIHsNCisgICAgaWYgKCFGaW5hbE1lc3NhZ2UuT2tNZXNzYWdlLk1lc3NhZ2UuSXNFbXB0eSgpKQ0KKyAgICAgIHN5bmMuRmluYWxNZXNzYWdlLk9rTWVzc2FnZSA9IEZpbmFsTWVzc2FnZS5Pa01lc3NhZ2U7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIHN5bmMuRmluYWxNZXNzYWdlLkVycm9yTWVzc2FnZS5NZXNzYWdlID0gbTsNCisgICAgaWYgKFJlc3VsdCA9PSBTX09LKQ0KKyAgICAgIFJlc3VsdCA9IEVfRkFJTDsNCisgIH0NCit9DQorDQorVVN0cmluZyBIUmVzdWx0VG9NZXNzYWdlKEhSRVNVTFQgZXJyb3JDb2RlKQ0KK3sNCisgIGlmIChlcnJvckNvZGUgPT0gRV9PVVRPRk1FTU9SWSkNCisgICAgcmV0dXJuIExhbmdTdHJpbmcoSURTX01FTV9FUlJPUik7DQorICBlbHNlDQorICAgIHJldHVybiBORXJyb3I6Ok15Rm9ybWF0TWVzc2FnZShlcnJvckNvZGUpOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Byb2dyZXNzRGlhbG9nMi5oIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Qcm9ncmVzc0RpYWxvZzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWUwZjE3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Qcm9ncmVzc0RpYWxvZzIuaApAQCAtMCwwICsxLDMxNCBAQAorLy8gUHJvZ3Jlc3NEaWFsb2cyLmgNCisNCisjaWZuZGVmIF9fUFJPR1JFU1NfRElBTE9HXzJfSA0KKyNkZWZpbmUgX19QUk9HUkVTU19ESUFMT0dfMl9IDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9NeUNvbS5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0Vycm9yTXNnLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvU3luY2hyb25pemF0aW9uLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvVGhyZWFkLmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvQ29udHJvbC9EaWFsb2cuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9Db250cm9sL0xpc3RWaWV3LmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvQ29udHJvbC9Qcm9ncmVzc0Jhci5oIg0KKw0KKyNpbmNsdWRlICJNeVdpbmRvd3NOZXcuaCINCisNCitzdHJ1Y3QgQ1Byb2dyZXNzTWVzc2FnZUJveFBhaXINCit7DQorICBVU3RyaW5nIFRpdGxlOw0KKyAgVVN0cmluZyBNZXNzYWdlOw0KK307DQorDQorc3RydWN0IENQcm9ncmVzc0ZpbmFsTWVzc2FnZQ0KK3sNCisgIENQcm9ncmVzc01lc3NhZ2VCb3hQYWlyIEVycm9yTWVzc2FnZTsNCisgIENQcm9ncmVzc01lc3NhZ2VCb3hQYWlyIE9rTWVzc2FnZTsNCisNCisgIGJvb2wgVGhlcmVJc01lc3NhZ2UoKSBjb25zdCB7IHJldHVybiAhRXJyb3JNZXNzYWdlLk1lc3NhZ2UuSXNFbXB0eSgpIHx8ICFPa01lc3NhZ2UuTWVzc2FnZS5Jc0VtcHR5KCk7IH0NCit9Ow0KKw0KK2NsYXNzIENQcm9ncmVzc1N5bmMNCit7DQorICBib29sIF9zdG9wcGVkOw0KKyAgYm9vbCBfcGF1c2VkOw0KKw0KK3B1YmxpYzoNCisgIGJvb2wgX2J5dGVzUHJvZ3Jlc3NNb2RlOw0KKyAgVUludDY0IF90b3RhbEJ5dGVzOw0KKyAgVUludDY0IF9jb21wbGV0ZWRCeXRlczsNCisgIFVJbnQ2NCBfdG90YWxGaWxlczsNCisgIFVJbnQ2NCBfY3VyRmlsZXM7DQorICBVSW50NjQgX2luU2l6ZTsNCisgIFVJbnQ2NCBfb3V0U2l6ZTsNCisgIA0KKyAgVVN0cmluZyBfdGl0bGVGaWxlTmFtZTsNCisgIFVTdHJpbmcgX3N0YXR1czsNCisgIFVTdHJpbmcgX2ZpbGVQYXRoOw0KKyAgYm9vbCBfaXNEaXI7DQorDQorICBVU3RyaW5nVmVjdG9yIE1lc3NhZ2VzOw0KKyAgQ1Byb2dyZXNzRmluYWxNZXNzYWdlIEZpbmFsTWVzc2FnZTsNCisNCisgIE5XaW5kb3dzOjpOU3luY2hyb25pemF0aW9uOjpDQ3JpdGljYWxTZWN0aW9uIF9jczsNCisNCisgIENQcm9ncmVzc1N5bmMoKTsNCisNCisgIGJvb2wgR2V0X1N0b3BwZWQoKQ0KKyAgew0KKyAgICBOV2luZG93czo6TlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbkxvY2sgbG9jayhfY3MpOw0KKyAgICByZXR1cm4gX3N0b3BwZWQ7DQorICB9DQorICB2b2lkIFNldF9TdG9wcGVkKGJvb2wgdmFsKQ0KKyAgew0KKyAgICBOV2luZG93czo6TlN5bmNocm9uaXphdGlvbjo6Q0NyaXRpY2FsU2VjdGlvbkxvY2sgbG9jayhfY3MpOw0KKyAgICBfc3RvcHBlZCA9IHZhbDsNCisgIH0NCisgIA0KKyAgYm9vbCBHZXRfUGF1c2VkKCk7DQorICB2b2lkIFNldF9QYXVzZWQoYm9vbCB2YWwpDQorICB7DQorICAgIE5XaW5kb3dzOjpOU3luY2hyb25pemF0aW9uOjpDQ3JpdGljYWxTZWN0aW9uTG9jayBsb2NrKF9jcyk7DQorICAgIF9wYXVzZWQgPSB2YWw7DQorICB9DQorICANCisgIHZvaWQgU2V0X0J5dGVzUHJvZ3Jlc3NNb2RlKGJvb2wgYnl0ZXNQcm9ncmVzc01vZGUpDQorICB7DQorICAgIE5XaW5kb3dzOjpOU3luY2hyb25pemF0aW9uOjpDQ3JpdGljYWxTZWN0aW9uTG9jayBsb2NrKF9jcyk7DQorICAgIF9ieXRlc1Byb2dyZXNzTW9kZSA9IGJ5dGVzUHJvZ3Jlc3NNb2RlOw0KKyAgfQ0KKyAgDQorICBIUkVTVUxUIENoZWNrU3RvcCgpOw0KKyAgSFJFU1VMVCBTY2FuUHJvZ3Jlc3MoVUludDY0IG51bUZpbGVzLCBVSW50NjQgdG90YWxTaXplLCBjb25zdCBVU3RyaW5nICZmaWxlTmFtZSwgYm9vbCBpc0RpciA9IGZhbHNlKTsNCisNCisgIHZvaWQgU2V0X051bUZpbGVzVG90YWwoVUludDY0IHZhbCk7DQorICB2b2lkIFNldF9OdW1CeXRlc1RvdGFsKFVJbnQ2NCB2YWwpOw0KKyAgdm9pZCBTZXRfTnVtRmlsZXNDdXIoVUludDY0IHZhbCk7DQorICBIUkVTVUxUIFNldF9OdW1CeXRlc0N1cihjb25zdCBVSW50NjQgKnZhbCk7DQorICBIUkVTVUxUIFNldF9OdW1CeXRlc0N1cihVSW50NjQgdmFsKTsNCisgIHZvaWQgU2V0X1JhdGlvKGNvbnN0IFVJbnQ2NCAqaW5TaXplLCBjb25zdCBVSW50NjQgKm91dFNpemUpOw0KKw0KKyAgdm9pZCBTZXRfVGl0bGVGaWxlTmFtZShjb25zdCBVU3RyaW5nICZmaWxlTmFtZSk7DQorICB2b2lkIFNldF9TdGF0dXMoY29uc3QgVVN0cmluZyAmcyk7DQorICB2b2lkIFNldF9GaWxlUGF0aChjb25zdCBVU3RyaW5nICZwYXRoLCBib29sIGlzRGlyID0gZmFsc2UpOw0KKw0KKyAgdm9pZCBBZGRFcnJvcl9NZXNzYWdlKGNvbnN0IHdjaGFyX3QgKm1lc3NhZ2UpOw0KKyAgdm9pZCBBZGRFcnJvcl9NZXNzYWdlX05hbWUoY29uc3Qgd2NoYXJfdCAqbWVzc2FnZSwgY29uc3Qgd2NoYXJfdCAqbmFtZSk7DQorICB2b2lkIEFkZEVycm9yX0NvZGVfTmFtZShEV09SRCBzeXN0ZW1FcnJvciwgY29uc3Qgd2NoYXJfdCAqbmFtZSk7DQorDQorICBib29sIFRoZXJlSXNNZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gIU1lc3NhZ2VzLklzRW1wdHkoKSB8fCBGaW5hbE1lc3NhZ2UuVGhlcmVJc01lc3NhZ2UoKTsgfQ0KK307DQorDQorY2xhc3MgQ1Byb2dyZXNzRGlhbG9nOiBwdWJsaWMgTldpbmRvd3M6Ok5Db250cm9sOjpDTW9kYWxEaWFsb2cNCit7DQorICBVU3RyaW5nIF90aXRsZUZpbGVOYW1lOw0KKyAgVVN0cmluZyBfZmlsZVBhdGg7DQorICBVU3RyaW5nIF9zdGF0dXM7DQorICBib29sIF9pc0RpcjsNCisNCisgIFVTdHJpbmcgX2JhY2tncm91bmRfU3RyaW5nOw0KKyAgVVN0cmluZyBfYmFja2dyb3VuZGVkX1N0cmluZzsNCisgIFVTdHJpbmcgX2ZvcmVncm91bmRfU3RyaW5nOw0KKyAgVVN0cmluZyBfcGF1c2VfU3RyaW5nOw0KKyAgVVN0cmluZyBfY29udGludWVfU3RyaW5nOw0KKyAgVVN0cmluZyBfcGF1c2VkX1N0cmluZzsNCisNCisgIGludCBfYnV0dG9uU2l6ZVg7DQorICBpbnQgX2J1dHRvblNpemVZOw0KKw0KKyAgVUlOVF9QVFIgX3RpbWVyOw0KKw0KKyAgVVN0cmluZyBfdGl0bGU7DQorDQorICBjbGFzcyBDVTY0VG9JMzJDb252ZXJ0ZXINCisgIHsNCisgICAgdW5zaWduZWQgX251bVNoaWZ0Qml0czsNCisgICAgVUludDY0IF9yYW5nZTsNCisgIHB1YmxpYzoNCisgICAgQ1U2NFRvSTMyQ29udmVydGVyKCk6IF9udW1TaGlmdEJpdHMoMCksIF9yYW5nZSgxKSB7fQ0KKyAgICB2b2lkIEluaXQoVUludDY0IHJhbmdlKQ0KKyAgICB7DQorICAgICAgX3JhbmdlID0gcmFuZ2U7DQorICAgICAgLy8gV2luZG93cyBDRSBkb2Vzbid0IGxpa2UgYmlnIG51bWJlciBmb3IgUHJvZ3Jlc3NCYXIuDQorICAgICAgZm9yIChfbnVtU2hpZnRCaXRzID0gMDsgcmFuZ2UgPj0gKChVSW50MzIpMSA8PCAxNSk7IF9udW1TaGlmdEJpdHMrKykNCisgICAgICAgIHJhbmdlID4+PSAxOw0KKyAgICB9DQorICAgIGludCBDb3VudChVSW50NjQgdmFsKQ0KKyAgICB7DQorICAgICAgaW50IHJlcyA9IChpbnQpKHZhbCA+PiBfbnVtU2hpZnRCaXRzKTsNCisgICAgICBpZiAodmFsID09IF9yYW5nZSkNCisgICAgICAgIHJlcysrOw0KKyAgICAgIHJldHVybiByZXM7DQorICAgIH0NCisgIH07DQorICANCisgIENVNjRUb0kzMkNvbnZlcnRlciBfcHJvZ3Jlc3NDb252Ow0KKyAgVUludDY0IF9wcm9ncmVzc0Jhcl9Qb3M7DQorICBVSW50NjQgX3Byb2dyZXNzQmFyX1JhbmdlOw0KKyAgDQorICBOV2luZG93czo6TkNvbnRyb2w6OkNQcm9ncmVzc0JhciBtX1Byb2dyZXNzQmFyOw0KKyAgTldpbmRvd3M6Ok5Db250cm9sOjpDTGlzdFZpZXcgX21lc3NhZ2VMaXN0Ow0KKyAgDQorICBpbnQgX251bU1lc3NhZ2VzOw0KKw0KKyAgI2lmZGVmIF9fSVRhc2tiYXJMaXN0M19JTlRFUkZBQ0VfREVGSU5FRF9fDQorICBDTXlDb21QdHI8SVRhc2tiYXJMaXN0Mz4gX3Rhc2tiYXJMaXN0Ow0KKyAgI2VuZGlmDQorICBIV05EIF9od25kRm9yVGFza2JhcjsNCisNCisgIFVJbnQzMiBfcHJldlRpbWU7DQorICBVSW50NjQgX2VsYXBzZWRUaW1lOw0KKw0KKyAgVUludDY0IF9wcmV2UGVyY2VudFZhbHVlOw0KKyAgVUludDY0IF9wcmV2RWxhcHNlZFNlYzsNCisgIFVJbnQ2NCBfcHJldlJlbWFpbmluZ1NlYzsNCisNCisgIFVJbnQ2NCBfdG90YWxCeXRlc19QcmV2Ow0KKyAgVUludDY0IF9wcm9jZXNzZWRfUHJldjsNCisgIFVJbnQ2NCBfcGFja2VkX1ByZXY7DQorICBVSW50NjQgX3JhdGlvX1ByZXY7DQorICBVU3RyaW5nIF9maWxlc1N0cl9QcmV2Ow0KKw0KKyAgdW5zaWduZWQgX3ByZXZTcGVlZF9Nb3ZlQml0czsNCisgIFVJbnQ2NCBfcHJldlNwZWVkOw0KKw0KKyAgYm9vbCBfZm9yZWdyb3VuZDsNCisNCisgIHVuc2lnbmVkIF9udW1SZWR1Y2VTeW1ib2xzOw0KKw0KKyAgYm9vbCBfd2FzQ3JlYXRlZDsNCisgIGJvb2wgX25lZWRDbG9zZTsNCisNCisgIHVuc2lnbmVkIF9udW1Qb3N0ZWRNZXNzYWdlczsNCisgIFVJbnQzMiBfbnVtQXV0b1NpemVNZXNzYWdlczsNCisNCisgIGJvb2wgX2Vycm9yc1dlcmVEaXNwbGF5ZWQ7DQorDQorICBib29sIF93YWl0Q2xvc2VCeUNhbmNlbEJ1dHRvbjsNCisgIGJvb2wgX2NhbmNlbFdhc1ByZXNzZWQ7DQorICANCisgIGJvb2wgX2luQ2FuY2VsTWVzc2FnZUJveDsNCisgIGJvb2wgX2V4dGVybmFsQ2xvc2VNZXNzYWdlV2FzUmVjZWl2ZWQ7DQorDQorDQorICAjaWZkZWYgX19JVGFza2Jhckxpc3QzX0lOVEVSRkFDRV9ERUZJTkVEX18NCisgIHZvaWQgU2V0VGFza2JhclByb2dyZXNzU3RhdGUoVEJQRkxBRyB0YnBGbGFncykNCisgIHsNCisgICAgaWYgKF90YXNrYmFyTGlzdCAmJiBfaHduZEZvclRhc2tiYXIpDQorICAgICAgX3Rhc2tiYXJMaXN0LT5TZXRQcm9ncmVzc1N0YXRlKF9od25kRm9yVGFza2JhciwgdGJwRmxhZ3MpOw0KKyAgfQ0KKyAgI2VuZGlmDQorICB2b2lkIFNldFRhc2tiYXJQcm9ncmVzc1N0YXRlKCk7DQorDQorICB2b2lkIFVwZGF0ZVN0YXRJbmZvKGJvb2wgc2hvd0FsbCk7DQorICBib29sIE9uVGltZXIoV1BBUkFNIHRpbWVySUQsIExQQVJBTSBjYWxsYmFjayk7DQorICB2b2lkIFNldFByb2dyZXNzUmFuZ2UoVUludDY0IHJhbmdlKTsNCisgIHZvaWQgU2V0UHJvZ3Jlc3NQb3MoVUludDY0IHBvcyk7DQorICB2aXJ0dWFsIGJvb2wgT25Jbml0KCk7DQorICB2aXJ0dWFsIGJvb2wgT25TaXplKFdQQVJBTSB3UGFyYW0sIGludCB4U2l6ZSwgaW50IHlTaXplKTsNCisgIHZpcnR1YWwgdm9pZCBPbkNhbmNlbCgpOw0KKyAgdmlydHVhbCB2b2lkIE9uT0soKTsNCisgIE5XaW5kb3dzOjpOU3luY2hyb25pemF0aW9uOjpDTWFudWFsUmVzZXRFdmVudCBfY3JlYXRlRGlhbG9nRXZlbnQ7DQorICBOV2luZG93czo6TlN5bmNocm9uaXphdGlvbjo6Q01hbnVhbFJlc2V0RXZlbnQgX2RpYWxvZ0NyZWF0ZWRFdmVudDsNCisgICNpZm5kZWYgX1NGWA0KKyAgdm9pZCBBZGRUb1RpdGxlKExQQ1dTVFIgc3RyaW5nKTsNCisgICNlbmRpZg0KKw0KKyAgdm9pZCBTZXRQYXVzZVRleHQoKTsNCisgIHZvaWQgU2V0UHJpb3JpdHlUZXh0KCk7DQorICB2b2lkIE9uUGF1c2VCdXR0b24oKTsNCisgIHZvaWQgT25Qcmlvcml0eUJ1dHRvbigpOw0KKyAgYm9vbCBPbkJ1dHRvbkNsaWNrZWQoaW50IGJ1dHRvbklELCBIV05EIGJ1dHRvbkhXTkQpOw0KKyAgYm9vbCBPbk1lc3NhZ2UoVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsNCisNCisgIHZvaWQgU2V0VGl0bGVUZXh0KCk7DQorICB2b2lkIFNob3dTaXplKGludCBpZCwgVUludDY0IHZhbCwgVUludDY0ICZwcmV2KTsNCisNCisgIHZvaWQgVXBkYXRlTWVzc2FnZXNEaWFsb2coKTsNCisNCisgIHZvaWQgQWRkTWVzc2FnZURpcmVjdChMUENXU1RSIG1lc3NhZ2UsIGJvb2wgbmVlZE51bWJlcik7DQorICB2b2lkIEFkZE1lc3NhZ2UoTFBDV1NUUiBtZXNzYWdlKTsNCisNCisgIGJvb2wgT25FeHRlcm5hbENsb3NlTWVzc2FnZSgpOw0KKyAgdm9pZCBFbmFibGVFcnJvcnNDb250cm9scyhib29sIGVuYWJsZSk7DQorDQorICB2b2lkIFNob3dBZnRlck1lc3NhZ2VzKEhXTkQgd25kUGFyZW50KTsNCisNCisgIHZvaWQgQ2hlY2tOZWVkQ2xvc2UoKTsNCitwdWJsaWM6DQorICBDUHJvZ3Jlc3NTeW5jIFN5bmM7DQorICBib29sIENvbXByZXNzaW5nTW9kZTsNCisgIGJvb2wgV2FpdE1vZGU7DQorICBib29sIFNob3dDb21wcmVzc2lvbkluZm87DQorICBib29sIE1lc3NhZ2VzRGlzcGxheWVkOyAvLyA9IHRydWUgaWYgdXNlciBwcmVzc2VkIE9LIG9uIGFsbCBtZXNzYWdlcyBvciB0aGVyZSBhcmUgbm8gbWVzc2FnZXMuDQorICBpbnQgSWNvbklEOw0KKw0KKyAgSFdORCBNYWluV2luZG93Ow0KKyAgI2lmbmRlZiBfU0ZYDQorICBVU3RyaW5nIE1haW5UaXRsZTsNCisgIFVTdHJpbmcgTWFpbkFkZFRpdGxlOw0KKyAgfkNQcm9ncmVzc0RpYWxvZygpOw0KKyAgI2VuZGlmDQorDQorICBDUHJvZ3Jlc3NEaWFsb2coKTsNCisgIHZvaWQgV2FpdENyZWF0aW5nKCkNCisgIHsNCisgICAgX2NyZWF0ZURpYWxvZ0V2ZW50LlNldCgpOw0KKyAgICBfZGlhbG9nQ3JlYXRlZEV2ZW50LkxvY2soKTsNCisgIH0NCisNCisgIElOVF9QVFIgQ3JlYXRlKGNvbnN0IFVTdHJpbmcgJnRpdGxlLCBOV2luZG93czo6Q1RocmVhZCAmdGhyZWFkLCBIV05EIHduZFBhcmVudCA9IDApOw0KKw0KKyAgdm9pZCBQcm9jZXNzV2FzRmluaXNoZWQoKTsNCit9Ow0KKw0KKw0KK2NsYXNzIENQcm9ncmVzc0Nsb3Nlcg0KK3sNCisgIENQcm9ncmVzc0RpYWxvZyAqX3A7DQorcHVibGljOg0KKyAgQ1Byb2dyZXNzQ2xvc2VyKENQcm9ncmVzc0RpYWxvZyAmcCkgOiBfcCgmcCkge30NCisgIH5DUHJvZ3Jlc3NDbG9zZXIoKSB7IF9wLT5Qcm9jZXNzV2FzRmluaXNoZWQoKTsgfQ0KK307DQorDQorY2xhc3MgQ1Byb2dyZXNzVGhyZWFkVmlydA0KK3sNCisgIEZTdHJpbmcgRXJyb3JQYXRoMTsNCisgIEZTdHJpbmcgRXJyb3JQYXRoMjsNCitwcm90ZWN0ZWQ6DQorICBDUHJvZ3Jlc3NGaW5hbE1lc3NhZ2UgRmluYWxNZXNzYWdlOw0KKw0KKyAgLy8gZXJyb3IgaWYgYW55IG9mIEhSRVNVTFQsIEVycm9yTWVzc2FnZSwgRXJyb3JQYXRoDQorICB2aXJ0dWFsIEhSRVNVTFQgUHJvY2Vzc1ZpcnQoKSA9IDA7DQorICB2b2lkIFByb2Nlc3MoKTsNCitwdWJsaWM6DQorICBIUkVTVUxUIFJlc3VsdDsNCisgIGJvb2wgVGhyZWFkRmluaXNoZWRPSzsgLy8gaWYgdGhlcmUgaXMgbm8gZmF0YWwgZXhjZXB0aW9uDQorICBDUHJvZ3Jlc3NEaWFsb2cgUHJvZ3Jlc3NEaWFsb2c7DQorDQorICBzdGF0aWMgVEhSRUFEX0ZVTkNfREVDTCBNeVRocmVhZEZ1bmN0aW9uKHZvaWQgKnBhcmFtKQ0KKyAgew0KKyAgICBDUHJvZ3Jlc3NUaHJlYWRWaXJ0ICpwID0gKENQcm9ncmVzc1RocmVhZFZpcnQgKilwYXJhbTsNCisgICAgdHJ5DQorICAgIHsNCisgICAgICBwLT5Qcm9jZXNzKCk7DQorICAgICAgcC0+VGhyZWFkRmluaXNoZWRPSyA9IHRydWU7DQorICAgIH0NCisgICAgY2F0Y2ggKC4uLikgeyBwLT5SZXN1bHQgPSBFX0ZBSUw7IH0NCisgICAgcmV0dXJuIDA7DQorICB9DQorDQorICB2b2lkIFNldEVycm9yUGF0aDEoY29uc3QgRlN0cmluZyAmcGF0aCkgeyBFcnJvclBhdGgxID0gcGF0aDsgfQ0KKyAgdm9pZCBTZXRFcnJvclBhdGgyKGNvbnN0IEZTdHJpbmcgJnBhdGgpIHsgRXJyb3JQYXRoMiA9IHBhdGg7IH0NCisNCisgIEhSRVNVTFQgQ3JlYXRlKGNvbnN0IFVTdHJpbmcgJnRpdGxlLCBIV05EIHBhcmVudFdpbmRvdyA9IDApOw0KKyAgQ1Byb2dyZXNzVGhyZWFkVmlydCgpOiBSZXN1bHQoRV9GQUlMKSwgVGhyZWFkRmluaXNoZWRPSyhmYWxzZSkge30NCisNCisgIENQcm9ncmVzc01lc3NhZ2VCb3hQYWlyICZHZXRNZXNzYWdlUGFpcihib29sIGlzRXJyb3IpIHsgcmV0dXJuIGlzRXJyb3IgPyBGaW5hbE1lc3NhZ2UuRXJyb3JNZXNzYWdlIDogRmluYWxNZXNzYWdlLk9rTWVzc2FnZTsgfQ0KKw0KK307DQorDQorVVN0cmluZyBIUmVzdWx0VG9NZXNzYWdlKEhSRVNVTFQgZXJyb3JDb2RlKTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Byb2dyZXNzRGlhbG9nMi5yYyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvUHJvZ3Jlc3NEaWFsb2cyLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNWEwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Byb2dyZXNzRGlhbG9nMi5yYwpAQCAtMCwwICsxLDQwIEBACisjaW5jbHVkZSAiUHJvZ3Jlc3NEaWFsb2cyUmVzLmgiDQorI2luY2x1ZGUgIi4uLy4uL0d1aUNvbW1vbi5yYyINCisNCisjdW5kZWYgRElBTE9HX0lEDQorI2RlZmluZSBESUFMT0dfSUQgIElERF9QUk9HUkVTUw0KKyNkZWZpbmUgeGMgMzYwDQorI2RlZmluZSBrIDExDQorI2RlZmluZSB6MXMgMTYNCisNCisjaW5jbHVkZSAiUHJvZ3Jlc3NEaWFsb2cyYS5yYyINCisNCisjaWZkZWYgVU5ERVJfQ0UNCisNCisjaW5jbHVkZSAiLi4vLi4vR3VpQ29tbW9uLnJjIg0KKw0KKw0KKyN1bmRlZiBESUFMT0dfSUQNCisjdW5kZWYgbQ0KKyN1bmRlZiBrDQorI3VuZGVmIHoxcw0KKw0KKyNkZWZpbmUgRElBTE9HX0lEICBJRERfUFJPR1JFU1NfMg0KKyNkZWZpbmUgbSA0DQorI2RlZmluZSBrIDgNCisjZGVmaW5lIHoxcyAxMg0KKw0KKyNkZWZpbmUgeGMgMjgwDQorDQorI2luY2x1ZGUgIlByb2dyZXNzRGlhbG9nMmEucmMiDQorDQorI2VuZGlmDQorDQorU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUNCit7DQorICBJRFNfUFJPR1JFU1NfUEFVU0VEICAgICAiUGF1c2VkIg0KKyAgSURTX1BST0dSRVNTX0ZPUkVHUk9VTkQgIiZGb3JlZ3JvdW5kIg0KKyAgSURTX0NPTlRJTlVFICAgICAgICAgICAgIiZDb250aW51ZSINCisgIElEU19QUk9HUkVTU19BU0tfQ0FOQ0VMICJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2FuY2VsPyINCisgIElEU19DTE9TRSAiJkNsb3NlIg0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Byb2dyZXNzRGlhbG9nMlJlcy5oIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Qcm9ncmVzc0RpYWxvZzJSZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGYwMmYwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Qcm9ncmVzc0RpYWxvZzJSZXMuaApAQCAtMCwwICsxLDQ4IEBACisjZGVmaW5lIElERF9QUk9HUkVTUyAgICAgICA5Nw0KKyNkZWZpbmUgSUREX1BST0dSRVNTXzIgIDEwMDk3DQorDQorI2RlZmluZSBJRFNfQ0xPU0UgICAgICAgICAgICAgICAgICA0MDgNCisjZGVmaW5lIElEU19DT05USU5VRSAgICAgICAgICAgICAgIDQxMQ0KKw0KKyNkZWZpbmUgSURCX1BST0dSRVNTX0JBQ0tHUk9VTkQgICAgNDQ0DQorI2RlZmluZSBJRFNfUFJPR1JFU1NfRk9SRUdST1VORCAgICA0NDUNCisjZGVmaW5lIElEQl9QQVVTRSAgICAgICAgICAgICAgICAgIDQ0Ng0KKyNkZWZpbmUgSURTX1BST0dSRVNTX1BBVVNFRCAgICAgICAgNDQ3DQorI2RlZmluZSBJRFNfUFJPR1JFU1NfQVNLX0NBTkNFTCAgICA0NDgNCisNCisjZGVmaW5lIElEVF9QUk9HUkVTU19QQUNLRUQgICAgICAgMTAwOA0KKyNkZWZpbmUgSURUX1BST0dSRVNTX0ZJTEVTICAgICAgICAxMDMyDQorDQorI2RlZmluZSBJRFRfUFJPR1JFU1NfRUxBUFNFRCAgICAgIDM5MDANCisjZGVmaW5lIElEVF9QUk9HUkVTU19SRU1BSU5JTkcgICAgMzkwMQ0KKyNkZWZpbmUgSURUX1BST0dSRVNTX1RPVEFMICAgICAgICAzOTAyDQorI2RlZmluZSBJRFRfUFJPR1JFU1NfU1BFRUQgICAgICAgIDM5MDMNCisjZGVmaW5lIElEVF9QUk9HUkVTU19QUk9DRVNTRUQgICAgMzkwNA0KKyNkZWZpbmUgSURUX1BST0dSRVNTX1JBVElPICAgICAgICAzOTA1DQorI2RlZmluZSBJRFRfUFJPR1JFU1NfRVJST1JTICAgICAgIDM5MDYNCisNCisjZGVmaW5lIElEQ19QUk9HUkVTUzEgICAgICAgICAgICAgIDEwMA0KKyNkZWZpbmUgSURMX1BST0dSRVNTX01FU1NBR0VTICAgICAgMTAxDQorI2RlZmluZSBJRFRfUFJPR1JFU1NfRklMRV9OQU1FICAgICAxMDINCisjZGVmaW5lIElEVF9QUk9HUkVTU19TVEFUVVMgICAgICAgIDEwMw0KKw0KKyNkZWZpbmUgSURUX1BST0dSRVNTX1BBQ0tFRF9WQUwgICAgMTEwDQorI2RlZmluZSBJRFRfUFJPR1JFU1NfRklMRVNfVkFMICAgICAxMTENCisNCisjZGVmaW5lIElEVF9QUk9HUkVTU19FTEFQU0VEX1ZBTCAgIDEyMA0KKyNkZWZpbmUgSURUX1BST0dSRVNTX1JFTUFJTklOR19WQUwgMTIxDQorI2RlZmluZSBJRFRfUFJPR1JFU1NfVE9UQUxfVkFMICAgICAxMjINCisjZGVmaW5lIElEVF9QUk9HUkVTU19TUEVFRF9WQUwgICAgIDEyMw0KKyNkZWZpbmUgSURUX1BST0dSRVNTX1BST0NFU1NFRF9WQUwgMTI0DQorI2RlZmluZSBJRFRfUFJPR1JFU1NfUkFUSU9fVkFMICAgICAxMjUNCisjZGVmaW5lIElEVF9QUk9HUkVTU19FUlJPUlNfVkFMICAgIDEyNg0KKw0KKw0KKyNpZmRlZiBVTkRFUl9DRQ0KKyNkZWZpbmUgTVlfUFJPR1JFU1NfVkFMX1VOSVRTICA0NA0KKyNlbHNlDQorI2RlZmluZSBNWV9QUk9HUkVTU19WQUxfVU5JVFMgIDc2DQorI2VuZGlmDQorI2RlZmluZSBNWV9QUk9HUkVTU19MQUJFTF9VTklUU19NSU4gICA2MA0KKyNkZWZpbmUgTVlfUFJPR1JFU1NfTEFCRUxfVU5JVFNfU1RBUlQgOTANCisjZGVmaW5lIE1ZX1BST0dSRVNTX1BBRF9VTklUUyAgNA0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvUHJvZ3Jlc3NEaWFsb2cyYS5yYyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvUHJvZ3Jlc3NEaWFsb2cyYS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWRhZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Qcm9ncmVzc0RpYWxvZzJhLnJjCkBAIC0wLDAgKzEsODAgQEAKKyN1bmRlZiBieHMNCisjZGVmaW5lIGJ4cyA4MA0KKw0KKyNkZWZpbmUgeDBzIE1ZX1BST0dSRVNTX0xBQkVMX1VOSVRTX1NUQVJUDQorI2RlZmluZSB4MXMgTVlfUFJPR1JFU1NfVkFMX1VOSVRTDQorI2RlZmluZSB4MnMgTVlfUFJPR1JFU1NfTEFCRUxfVU5JVFNfU1RBUlQNCisjZGVmaW5lIHgzcyBNWV9QUk9HUkVTU19WQUxfVU5JVFMNCisNCisjZGVmaW5lIHgxIChtICsgeDBzKQ0KKyNkZWZpbmUgeDMgKHhzIC0gbSAtIHgzcykNCisjZGVmaW5lIHgyICh4MyAtIHgycykNCisNCisjdW5kZWYgeTANCisjdW5kZWYgeTENCisjdW5kZWYgeTINCisjdW5kZWYgeTMNCisjdW5kZWYgeTQNCisNCisjdW5kZWYgejANCisjdW5kZWYgejENCisjdW5kZWYgejINCisjdW5kZWYgejMNCisNCisjZGVmaW5lIHkwIG0NCisjZGVmaW5lIHkxICh5MCArIGspDQorI2RlZmluZSB5MiAoeTEgKyBrKQ0KKyNkZWZpbmUgeTMgKHkyICsgaykNCisjZGVmaW5lIHk0ICh5MyArIGspDQorDQorI2RlZmluZSB6MyAoeTQgKyBrICsgMSkNCisNCisjZGVmaW5lIHoyICh6MyArIGsgKyAxKQ0KKyNkZWZpbmUgejJzIDI0DQorDQorI2RlZmluZSB6MSAoejIgKyB6MnMpDQorDQorI2RlZmluZSB6MCAoejEgKyB6MXMgKyBtKQ0KKyNkZWZpbmUgejBzIDQ4DQorDQorI2RlZmluZSB5YyAoejAgKyB6MHMgKyBieXMpDQorDQorDQorRElBTE9HX0lEICBESUFMT0cgIDAsIDAsIHhzLCB5cyAgTVlfTU9EQUxfUkVTSVpFX0RJQUxPR19TVFlMRSAgTVlfRk9OVA0KK0NBUFRJT04gIlByb2dyZXNzIg0KK3sNCisgIERFRlBVU0hCVVRUT04gICImQmFja2dyb3VuZCIsIElEQl9QUk9HUkVTU19CQUNLR1JPVU5ELCBieDMsIGJ5LCBieHMsIGJ5cw0KKyAgUFVTSEJVVFRPTiAgICAgIiZQYXVzZSIsICAgICAgSURCX1BBVVNFICAgICAgICAgICAgICAgIGJ4MiwgYnksIGJ4cywgYnlzDQorICBQVVNIQlVUVE9OICAgICAiQ2FuY2VsIiwgICAgICBJRENBTkNFTCwgICAgICAgICAgICAgICAgYngxLCBieSwgYnhzLCBieXMNCisNCisgIExURVhUICAiRWxhcHNlZCB0aW1lOiIsICAgICAgSURUX1BST0dSRVNTX0VMQVBTRUQsICAgbSwgeTAsIHgwcywgOA0KKyAgTFRFWFQgICJSZW1haW5pbmcgdGltZToiLCAgICBJRFRfUFJPR1JFU1NfUkVNQUlOSU5HLCBtLCB5MSwgeDBzLCA4DQorICBMVEVYVCAgIkZpbGVzOiIsICAgICAgICAgICAgIElEVF9QUk9HUkVTU19GSUxFUywgICAgIG0sIHkyLCB4MHMsIDgNCisgIExURVhUICAiQ29tcHJlc3Npb24gcmF0aW86IiwgSURUX1BST0dSRVNTX1JBVElPLCAgICAgbSwgeTMsIHgwcywgOA0KKyAgTFRFWFQgICJFcnJvcnM6IiwgICAgICAgICAgICBJRFRfUFJPR1JFU1NfRVJST1JTLCAgICBtLCB5NCwgeDBzLCA4DQorDQorICBMVEVYVCAgIlRvdGFsIHNpemU6IiwgICAgICAgIElEVF9QUk9HUkVTU19UT1RBTCwgICAgeDIsIHkwLCB4MnMsIDgNCisgIExURVhUICAiU3BlZWQ6IiwgICAgICAgICAgICAgSURUX1BST0dSRVNTX1NQRUVELCAgICB4MiwgeTEsIHgycywgOA0KKyAgTFRFWFQgICJQcm9jZXNzZWQ6IiwgICAgICAgICBJRFRfUFJPR1JFU1NfUFJPQ0VTU0VELHgyLCB5MiwgeDJzLCA4DQorICBMVEVYVCAgIkNvbXByZXNzZWQgc2l6ZToiICAsIElEVF9QUk9HUkVTU19QQUNLRUQsICAgeDIsIHkzLCB4MnMsIDgNCisNCisgIFJURVhUICAiIiwgIElEVF9QUk9HUkVTU19FTEFQU0VEX1ZBTCwgICB4MSwgeTAsIHgxcywgTVlfVEVYVF9OT1BSRUZJWA0KKyAgUlRFWFQgICIiLCAgSURUX1BST0dSRVNTX1JFTUFJTklOR19WQUwsIHgxLCB5MSwgeDFzLCBNWV9URVhUX05PUFJFRklYDQorICBSVEVYVCAgIiIsICBJRFRfUFJPR1JFU1NfRklMRVNfVkFMLCAgICAgeDEsIHkyLCB4MXMsIE1ZX1RFWFRfTk9QUkVGSVgNCisgIFJURVhUICAiIiwgIElEVF9QUk9HUkVTU19SQVRJT19WQUwsICAgICB4MSwgeTMsIHgxcywgTVlfVEVYVF9OT1BSRUZJWA0KKyAgUlRFWFQgICIiLCAgSURUX1BST0dSRVNTX0VSUk9SU19WQUwsICAgIHgxLCB5NCwgeDFzLCBNWV9URVhUX05PUFJFRklYDQorDQorICBSVEVYVCAgIiIsICBJRFRfUFJPR1JFU1NfVE9UQUxfVkFMLCAgICAgeDMsIHkwLCB4M3MsIE1ZX1RFWFRfTk9QUkVGSVgNCisgIFJURVhUICAiIiwgIElEVF9QUk9HUkVTU19TUEVFRF9WQUwsICAgICB4MywgeTEsIHgzcywgTVlfVEVYVF9OT1BSRUZJWA0KKyAgUlRFWFQgICIiLCAgSURUX1BST0dSRVNTX1BST0NFU1NFRF9WQUwsIHgzLCB5MiwgeDNzLCBNWV9URVhUX05PUFJFRklYDQorICBSVEVYVCAgIiIsICBJRFRfUFJPR1JFU1NfUEFDS0VEX1ZBTCwgICAgeDMsIHkzLCB4M3MsIE1ZX1RFWFRfTk9QUkVGSVgNCisNCisgIExURVhUICAiIiwgSURUX1BST0dSRVNTX1NUQVRVUywgbSwgejMsIHhjLCBNWV9URVhUX05PUFJFRklYDQorICBDT05UUk9MICAiIiwgSURUX1BST0dSRVNTX0ZJTEVfTkFNRSwgIlN0YXRpYyIsIFNTX05PUFJFRklYIHwgU1NfTEVGVE5PV09SRFdSQVAsIG0sIHoyLCB4YywgejJzDQorICANCisgIENPTlRST0wgICJQcm9ncmVzczEiLCBJRENfUFJPR1JFU1MxLCAibXNjdGxzX3Byb2dyZXNzMzIiLCBQQlNfU01PT1RIIHwgV1NfQk9SREVSLCBtLCB6MSwgeGMsIHoxcw0KKw0KKyAgQ09OVFJPTCAgIkxpc3QxIiwgSURMX1BST0dSRVNTX01FU1NBR0VTLCAiU3lzTGlzdFZpZXczMiIsDQorICAgICAgICAgICBMVlNfUkVQT1JUIHwgTFZTX1NIT1dTRUxBTFdBWVMgfCBMVlNfTk9DT0xVTU5IRUFERVIgfCBMVlNfTk9TT1JUSEVBREVSIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUCwNCisgICAgICAgICAgIG0sIHowLCB4YywgejBzDQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvUHJvZ3Jlc3NEaWFsb2dSZXMuaCBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvUHJvZ3Jlc3NEaWFsb2dSZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjgxNDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Qcm9ncmVzc0RpYWxvZ1Jlcy5oCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBJRERfUFJPR1JFU1MgIDk3DQorDQorI2RlZmluZSBJRENfUFJPR1JFU1MxICAxMDANCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1Byb3BlcnR5TmFtZVJlcy5oIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Qcm9wZXJ0eU5hbWVSZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2M5YjZlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9Qcm9wZXJ0eU5hbWVSZXMuaApAQCAtMCwwICsxLDkyIEBACisNCisNCisjZGVmaW5lIElEU19QUk9QX1BBVEggICAgICAgICAgICAgMTAwMw0KKyNkZWZpbmUgSURTX1BST1BfTkFNRSAgICAgICAgICAgICAxMDA0DQorI2RlZmluZSBJRFNfUFJPUF9FWFRFTlNJT04gICAgICAgIDEwMDUNCisjZGVmaW5lIElEU19QUk9QX0lTX0ZPTERFUiAgICAgICAgMTAwNg0KKyNkZWZpbmUgSURTX1BST1BfU0laRSAgICAgICAgICAgICAxMDA3DQorI2RlZmluZSBJRFNfUFJPUF9QQUNLRURfU0laRSAgICAgIDEwMDgNCisjZGVmaW5lIElEU19QUk9QX0FUVFJJQlVURVMgICAgICAgMTAwOQ0KKyNkZWZpbmUgSURTX1BST1BfQ1RJTUUgICAgICAgICAgICAxMDEwDQorI2RlZmluZSBJRFNfUFJPUF9BVElNRSAgICAgICAgICAgIDEwMTENCisjZGVmaW5lIElEU19QUk9QX01USU1FICAgICAgICAgICAgMTAxMg0KKyNkZWZpbmUgSURTX1BST1BfU09MSUQgICAgICAgICAgICAxMDEzDQorI2RlZmluZSBJRFNfUFJPUF9DME1NRU5URUQgICAgICAgIDEwMTQNCisjZGVmaW5lIElEU19QUk9QX0VOQ1JZUFRFRCAgICAgICAgMTAxNQ0KKyNkZWZpbmUgSURTX1BST1BfU1BMSVRfQkVGT1JFICAgICAxMDE2DQorI2RlZmluZSBJRFNfUFJPUF9TUExJVF9BRlRFUiAgICAgIDEwMTcNCisjZGVmaW5lIElEU19QUk9QX0RJQ1RJT05BUllfU0laRSAgMTAxOA0KKyNkZWZpbmUgSURTX1BST1BfQ1JDICAgICAgICAgICAgICAxMDE5DQorI2RlZmluZSBJRFNfUFJPUF9GSUxFX1RZUEUgICAgICAgIDEwMjANCisjZGVmaW5lIElEU19QUk9QX0FOVEkgICAgICAgICAgICAgMTAyMQ0KKyNkZWZpbmUgSURTX1BST1BfTUVUSE9EICAgICAgICAgICAxMDIyDQorI2RlZmluZSBJRFNfUFJPUF9IT1NUX09TICAgICAgICAgIDEwMjMNCisjZGVmaW5lIElEU19QUk9QX0ZJTEVfU1lTVEVNICAgICAgMTAyNA0KKyNkZWZpbmUgSURTX1BST1BfVVNFUiAgICAgICAgICAgICAxMDI1DQorI2RlZmluZSBJRFNfUFJPUF9HUk9VUCAgICAgICAgICAgIDEwMjYNCisjZGVmaW5lIElEU19QUk9QX0JMT0NLICAgICAgICAgICAgMTAyNw0KKyNkZWZpbmUgSURTX1BST1BfQ09NTUVOVCAgICAgICAgICAxMDI4DQorI2RlZmluZSBJRFNfUFJPUF9QT1NJVElPTiAgICAgICAgIDEwMjkNCisjZGVmaW5lIElEU19QUk9QX1BSRUZJWCAgICAgICAgICAgMTAzMA0KKyNkZWZpbmUgSURTX1BST1BfRk9MREVSUyAgICAgICAgICAxMDMxDQorI2RlZmluZSBJRFNfUFJPUF9GSUxFUyAgICAgICAgICAgIDEwMzINCisjZGVmaW5lIElEU19QUk9QX1ZFUlNJT04gICAgICAgICAgMTAzMw0KKyNkZWZpbmUgSURTX1BST1BfVk9MVU1FICAgICAgICAgICAxMDM0DQorI2RlZmluZSBJRFNfUFJPUF9JU19WT0xVTUUgICAgICAgIDEwMzUNCisjZGVmaW5lIElEU19QUk9QX09GRlNFVCAgICAgICAgICAgMTAzNg0KKyNkZWZpbmUgSURTX1BST1BfTElOS1MgICAgICAgICAgICAxMDM3DQorI2RlZmluZSBJRFNfUFJPUF9OVU1fQkxPQ0tTICAgICAgIDEwMzgNCisjZGVmaW5lIElEU19QUk9QX05VTV9WT0xVTUVTICAgICAgMTAzOQ0KKw0KKyNkZWZpbmUgSURTX1BST1BfQklUNjQgICAgICAgICAgICAxMDQxDQorI2RlZmluZSBJRFNfUFJPUF9CSUdfRU5ESUFOICAgICAgIDEwNDINCisjZGVmaW5lIElEU19QUk9QX0NQVSAgICAgICAgICAgICAgMTA0Mw0KKyNkZWZpbmUgSURTX1BST1BfUEhZX1NJWkUgICAgICAgICAxMDQ0DQorI2RlZmluZSBJRFNfUFJPUF9IRUFERVJTX1NJWkUgICAgIDEwNDUNCisjZGVmaW5lIElEU19QUk9QX0NIRUNLU1VNICAgICAgICAgMTA0Ng0KKyNkZWZpbmUgSURTX1BST1BfQ0hBUkFDVFMgICAgICAgICAxMDQ3DQorI2RlZmluZSBJRFNfUFJPUF9WQSAgICAgICAgICAgICAgIDEwNDgNCisjZGVmaW5lIElEU19QUk9QX0lEICAgICAgICAgICAgICAgMTA0OQ0KKyNkZWZpbmUgSURTX1BST1BfU0hPUlRfTkFNRSAgICAgICAxMDUwDQorI2RlZmluZSBJRFNfUFJPUF9DUkVBVE9SX0FQUCAgICAgIDEwNTENCisjZGVmaW5lIElEU19QUk9QX1NFQ1RPUl9TSVpFICAgICAgMTA1Mg0KKyNkZWZpbmUgSURTX1BST1BfUE9TSVhfQVRUUklCICAgICAxMDUzDQorI2RlZmluZSBJRFNfUFJPUF9TWU1fTElOSyAgICAgICAgIDEwNTQNCisjZGVmaW5lIElEU19QUk9QX0VSUk9SICAgICAgICAgICAgMTA1NQ0KKyNkZWZpbmUgSURTX1BST1BfVE9UQUxfU0laRSAgICAgICAxMDU2DQorI2RlZmluZSBJRFNfUFJPUF9GUkVFX1NQQUNFICAgICAgIDEwNTcNCisjZGVmaW5lIElEU19QUk9QX0NMVVNURVJfU0laRSAgICAgMTA1OA0KKyNkZWZpbmUgSURTX1BST1BfVk9MVU1FX05BTUUgICAgICAxMDU5DQorI2RlZmluZSBJRFNfUFJPUF9MT0NBTF9OQU1FICAgICAgIDEwNjANCisjZGVmaW5lIElEU19QUk9QX1BST1ZJREVSICAgICAgICAgMTA2MQ0KKyNkZWZpbmUgSURTX1BST1BfTlRfU0VDVVJJVFkgICAgICAxMDYyDQorI2RlZmluZSBJRFNfUFJPUF9BTFRfU1RSRUFNICAgICAgIDEwNjMNCisjZGVmaW5lIElEU19QUk9QX0FVWCAgICAgICAgICAgICAgMTA2NA0KKyNkZWZpbmUgSURTX1BST1BfREVMRVRFRCAgICAgICAgICAxMDY1DQorI2RlZmluZSBJRFNfUFJPUF9JU19UUkVFICAgICAgICAgIDEwNjYNCisjZGVmaW5lIElEU19QUk9QX1NIQTEgICAgICAgICAgICAgMTA2Nw0KKyNkZWZpbmUgSURTX1BST1BfU0hBMjU2ICAgICAgICAgICAxMDY4DQorI2RlZmluZSBJRFNfUFJPUF9FUlJPUl9UWVBFICAgICAgIDEwNjkNCisjZGVmaW5lIElEU19QUk9QX05VTV9FUlJPUlMgICAgICAgMTA3MA0KKyNkZWZpbmUgSURTX1BST1BfRVJST1JfRkxBR1MgICAgICAxMDcxDQorI2RlZmluZSBJRFNfUFJPUF9XQVJOSU5HX0ZMQUdTICAgIDEwNzINCisjZGVmaW5lIElEU19QUk9QX1dBUk5JTkcgICAgICAgICAgMTA3Mw0KKyNkZWZpbmUgSURTX1BST1BfTlVNX1NUUkVBTVMgICAgICAxMDc0DQorI2RlZmluZSBJRFNfUFJPUF9OVU1fQUxUX1NUUkVBTVMgIDEwNzUNCisjZGVmaW5lIElEU19QUk9QX0FMVF9TVFJFQU1TX1NJWkUgMTA3Ng0KKyNkZWZpbmUgSURTX1BST1BfVklSVFVBTF9TSVpFICAgICAxMDc3DQorI2RlZmluZSBJRFNfUFJPUF9VTlBBQ0tfU0laRSAgICAgIDEwNzgNCisjZGVmaW5lIElEU19QUk9QX1RPVEFMX1BIWV9TSVpFICAgMTA3OQ0KKyNkZWZpbmUgSURTX1BST1BfVk9MVU1FX0lOREVYICAgICAxMDgwDQorI2RlZmluZSBJRFNfUFJPUF9TVUJUWVBFICAgICAgICAgIDEwODENCisjZGVmaW5lIElEU19QUk9QX1NIT1JUX0NPTU1FTlQgICAgMTA4Mg0KKyNkZWZpbmUgSURTX1BST1BfQ09ERV9QQUdFICAgICAgICAxMDgzDQorI2RlZmluZSBJRFNfUFJPUF9JU19OT1RfQVJDX1RZUEUgIDEwODQNCisjZGVmaW5lIElEU19QUk9QX1BIWV9TSVpFX0NBTlRfQkVfREVURUNURUQgMTA4NQ0KKyNkZWZpbmUgSURTX1BST1BfWkVST1NfVEFJTF9JU19BTExPV0VEIDEwODYNCisjZGVmaW5lIElEU19QUk9QX1RBSUxfU0laRSAgICAgICAgMTA4Nw0KKyNkZWZpbmUgSURTX1BST1BfRU1CX1NUVUJfU0laRSAgICAxMDg4DQorI2RlZmluZSBJRFNfUFJPUF9OVF9SRVBBUlNFICAgICAgIDEwODkNCisjZGVmaW5lIElEU19QUk9QX0hBUkRfTElOSyAgICAgICAgMTA5MA0KKyNkZWZpbmUgSURTX1BST1BfSU5PREUgICAgICAgICAgICAxMDkxDQorI2RlZmluZSBJRFNfUFJPUF9TVFJFQU1fSUQgICAgICAgIDEwOTINCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1N5c0ljb25VdGlscy5jcHAgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1N5c0ljb25VdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjOTllYwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvU3lzSWNvblV0aWxzLmNwcApAQCAtMCwwICsxLDI1MyBAQAorLy8gU3lzSWNvblV0aWxzLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaWZuZGVmIF9VTklDT0RFDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZURpci5oIg0KKw0KKyNpbmNsdWRlICJTeXNJY29uVXRpbHMuaCINCisNCisjaWZuZGVmIF9VTklDT0RFDQorZXh0ZXJuIGJvb2wgZ19Jc05UOw0KKyNlbmRpZg0KKw0KK2ludCBHZXRJY29uSW5kZXhGb3JDU0lETChpbnQgY3NpZGwpDQorew0KKyAgTFBJVEVNSURMSVNUIHBpZGwgPSAwOw0KKyAgU0hHZXRTcGVjaWFsRm9sZGVyTG9jYXRpb24oTlVMTCwgY3NpZGwsICZwaWRsKTsNCisgIGlmIChwaWRsKQ0KKyAgew0KKyAgICBTSEZJTEVJTkZPIHNoZWxsSW5mbzsNCisgICAgU0hHZXRGaWxlSW5mbyhMUENUU1RSKHBpZGwpLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsDQorICAgICAgJnNoZWxsSW5mbywgc2l6ZW9mKHNoZWxsSW5mbyksDQorICAgICAgU0hHRklfUElETCB8IFNIR0ZJX1NZU0lDT05JTkRFWCk7DQorICAgIElNYWxsb2MgICpwTWFsbG9jOw0KKyAgICBTSEdldE1hbGxvYygmcE1hbGxvYyk7DQorICAgIGlmIChwTWFsbG9jKQ0KKyAgICB7DQorICAgICAgcE1hbGxvYy0+RnJlZShwaWRsKTsNCisgICAgICBwTWFsbG9jLT5SZWxlYXNlKCk7DQorICAgIH0NCisgICAgcmV0dXJuIHNoZWxsSW5mby5pSWNvbjsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCisjaWZuZGVmIF9VTklDT0RFDQordHlwZWRlZiBpbnQgKFdJTkFQSSAqIFNIR2V0RmlsZUluZm9XUCkoTFBDV1NUUiBwc3pQYXRoLCBEV09SRCBhdHRyaWIsIFNIRklMRUlORk9XICpwc2ZpLCBVSU5UIGNiRmlsZUluZm8sIFVJTlQgdUZsYWdzKTsNCisNCitzdHJ1Y3QgQ1NIR2V0RmlsZUluZm9Jbml0DQorew0KKyAgU0hHZXRGaWxlSW5mb1dQIHNoR2V0RmlsZUluZm9XOw0KKyAgQ1NIR2V0RmlsZUluZm9Jbml0KCkNCisgIHsNCisgICAgc2hHZXRGaWxlSW5mb1cgPSAoU0hHZXRGaWxlSW5mb1dQKQ0KKyAgICA6OkdldFByb2NBZGRyZXNzKDo6R2V0TW9kdWxlSGFuZGxlVyhMInNoZWxsMzIuZGxsIiksICJTSEdldEZpbGVJbmZvVyIpOw0KKyAgfQ0KK30gZ19TSEdldEZpbGVJbmZvSW5pdDsNCisjZW5kaWYNCisNCitzdGF0aWMgRFdPUkRfUFRSIE15U0hHZXRGaWxlSW5mb1coTFBDV1NUUiBwc3pQYXRoLCBEV09SRCBhdHRyaWIsIFNIRklMRUlORk9XICpwc2ZpLCBVSU5UIGNiRmlsZUluZm8sIFVJTlQgdUZsYWdzKQ0KK3sNCisgICNpZmRlZiBfVU5JQ09ERQ0KKyAgcmV0dXJuIFNIR2V0RmlsZUluZm8NCisgICNlbHNlDQorICBpZiAoZ19TSEdldEZpbGVJbmZvSW5pdC5zaEdldEZpbGVJbmZvVyA9PSAwKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBnX1NIR2V0RmlsZUluZm9Jbml0LnNoR2V0RmlsZUluZm9XDQorICAjZW5kaWYNCisgIChwc3pQYXRoLCBhdHRyaWIsIHBzZmksIGNiRmlsZUluZm8sIHVGbGFncyk7DQorfQ0KKw0KK0RXT1JEX1BUUiBHZXRSZWFsSWNvbkluZGV4KENGU1RSIHBhdGgsIERXT1JEIGF0dHJpYiwgaW50ICZpY29uSW5kZXgpDQorew0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIFNIRklMRUlORk8gc2hlbGxJbmZvOw0KKyAgICBEV09SRF9QVFIgcmVzID0gOjpTSEdldEZpbGVJbmZvKGZzMmZhcyhwYXRoKSwgRklMRV9BVFRSSUJVVEVfTk9STUFMIHwgYXR0cmliLCAmc2hlbGxJbmZvLA0KKyAgICAgIHNpemVvZihzaGVsbEluZm8pLCBTSEdGSV9VU0VGSUxFQVRUUklCVVRFUyB8IFNIR0ZJX1NZU0lDT05JTkRFWCk7DQorICAgIGljb25JbmRleCA9IHNoZWxsSW5mby5pSWNvbjsNCisgICAgcmV0dXJuIHJlczsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBTSEZJTEVJTkZPVyBzaGVsbEluZm87DQorICAgIERXT1JEX1BUUiByZXMgPSA6Ok15U0hHZXRGaWxlSW5mb1coZnMydXMocGF0aCksIEZJTEVfQVRUUklCVVRFX05PUk1BTCB8IGF0dHJpYiwgJnNoZWxsSW5mbywNCisgICAgICBzaXplb2Yoc2hlbGxJbmZvKSwgU0hHRklfVVNFRklMRUFUVFJJQlVURVMgfCBTSEdGSV9TWVNJQ09OSU5ERVgpOw0KKyAgICBpY29uSW5kZXggPSBzaGVsbEluZm8uaUljb247DQorICAgIHJldHVybiByZXM7DQorICB9DQorfQ0KKw0KKy8qDQorRFdPUkRfUFRSIEdldFJlYWxJY29uSW5kZXgoY29uc3QgVVN0cmluZyAmZmlsZU5hbWUsIERXT1JEIGF0dHJpYiwgaW50ICZpY29uSW5kZXgsIFVTdHJpbmcgKnR5cGVOYW1lKQ0KK3sNCisgICNpZm5kZWYgX1VOSUNPREUNCisgIGlmICghZ19Jc05UKQ0KKyAgew0KKyAgICBTSEZJTEVJTkZPIHNoZWxsSW5mbzsNCisgICAgc2hlbGxJbmZvLnN6VHlwZU5hbWVbMF0gPSAwOw0KKyAgICBEV09SRF9QVFIgcmVzID0gOjpTSEdldEZpbGVJbmZvQShHZXRTeXN0ZW1TdHJpbmcoZmlsZU5hbWUpLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwgfCBhdHRyaWIsICZzaGVsbEluZm8sDQorICAgICAgICBzaXplb2Yoc2hlbGxJbmZvKSwgU0hHRklfVVNFRklMRUFUVFJJQlVURVMgfCBTSEdGSV9TWVNJQ09OSU5ERVggfCBTSEdGSV9UWVBFTkFNRSk7DQorICAgIGlmICh0eXBlTmFtZSkNCisgICAgICAqdHlwZU5hbWUgPSBHZXRVbmljb2RlU3RyaW5nKHNoZWxsSW5mby5zelR5cGVOYW1lKTsNCisgICAgaWNvbkluZGV4ID0gc2hlbGxJbmZvLmlJY29uOw0KKyAgICByZXR1cm4gcmVzOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgI2VuZGlmDQorICB7DQorICAgIFNIRklMRUlORk9XIHNoZWxsSW5mbzsNCisgICAgc2hlbGxJbmZvLnN6VHlwZU5hbWVbMF0gPSAwOw0KKyAgICBEV09SRF9QVFIgcmVzID0gOjpNeVNIR2V0RmlsZUluZm9XKGZpbGVOYW1lLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwgfCBhdHRyaWIsICZzaGVsbEluZm8sDQorICAgICAgICBzaXplb2Yoc2hlbGxJbmZvKSwgU0hHRklfVVNFRklMRUFUVFJJQlVURVMgfCBTSEdGSV9TWVNJQ09OSU5ERVggfCBTSEdGSV9UWVBFTkFNRSk7DQorICAgIGlmICh0eXBlTmFtZSkNCisgICAgICAqdHlwZU5hbWUgPSBzaGVsbEluZm8uc3pUeXBlTmFtZTsNCisgICAgaWNvbkluZGV4ID0gc2hlbGxJbmZvLmlJY29uOw0KKyAgICByZXR1cm4gcmVzOw0KKyAgfQ0KK30NCisqLw0KKw0KK3N0YXRpYyBpbnQgRmluZEluU29ydGVkX0F0dHJpYihjb25zdCBDUmVjb3JkVmVjdG9yPENBdHRyaWJJY29uUGFpcj4gJnZlY3QsIERXT1JEIGF0dHJpYiwgaW50ICZpbnNlcnRQb3MpDQorew0KKyAgdW5zaWduZWQgbGVmdCA9IDAsIHJpZ2h0ID0gdmVjdC5TaXplKCk7DQorICB3aGlsZSAobGVmdCAhPSByaWdodCkNCisgIHsNCisgICAgdW5zaWduZWQgbWlkID0gKGxlZnQgKyByaWdodCkgLyAyOw0KKyAgICBEV09SRCBtaWRBdHRyaWIgPSB2ZWN0W21pZF0uQXR0cmliOw0KKyAgICBpZiAoYXR0cmliID09IG1pZEF0dHJpYikNCisgICAgICByZXR1cm4gbWlkOw0KKyAgICBpZiAoYXR0cmliIDwgbWlkQXR0cmliKQ0KKyAgICAgIHJpZ2h0ID0gbWlkOw0KKyAgICBlbHNlDQorICAgICAgbGVmdCA9IG1pZCArIDE7DQorICB9DQorICBpbnNlcnRQb3MgPSBsZWZ0Ow0KKyAgcmV0dXJuIC0xOw0KK30NCisNCitzdGF0aWMgaW50IEZpbmRJblNvcnRlZF9FeHQoY29uc3QgQ09iamVjdFZlY3RvcjxDRXh0SWNvblBhaXI+ICZ2ZWN0LCBjb25zdCB3Y2hhcl90ICpleHQsIGludCAmaW5zZXJ0UG9zKQ0KK3sNCisgIHVuc2lnbmVkIGxlZnQgPSAwLCByaWdodCA9IHZlY3QuU2l6ZSgpOw0KKyAgd2hpbGUgKGxlZnQgIT0gcmlnaHQpDQorICB7DQorICAgIHVuc2lnbmVkIG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsNCisgICAgaW50IGNvbXBhcmUgPSBNeVN0cmluZ0NvbXBhcmVOb0Nhc2UoZXh0LCB2ZWN0W21pZF0uRXh0KTsNCisgICAgaWYgKGNvbXBhcmUgPT0gMCkNCisgICAgICByZXR1cm4gbWlkOw0KKyAgICBpZiAoY29tcGFyZSA8IDApDQorICAgICAgcmlnaHQgPSBtaWQ7DQorICAgIGVsc2UNCisgICAgICBsZWZ0ID0gbWlkICsgMTsNCisgIH0NCisgIGluc2VydFBvcyA9IGxlZnQ7DQorICByZXR1cm4gLTE7DQorfQ0KKw0KK2ludCBDRXh0VG9JY29uTWFwOjpHZXRJY29uSW5kZXgoRFdPUkQgYXR0cmliLCBjb25zdCB3Y2hhcl90ICpmaWxlTmFtZSAvKiwgVVN0cmluZyAqdHlwZU5hbWUgKi8pDQorew0KKyAgaW50IGRvdFBvcyA9IC0xOw0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7OyBpKyspDQorICB7DQorICAgIHdjaGFyX3QgYyA9IGZpbGVOYW1lW2ldOw0KKyAgICBpZiAoYyA9PSAwKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBpZiAoYyA9PSAnLicpDQorICAgICAgZG90UG9zID0gaTsNCisgIH0NCisNCisgIC8qDQorICBpZiAoTXlTdHJpbmdDb21wYXJlTm9DYXNlKGZpbGVOYW1lLCBMIiRSZWN5Y2xlLkJpbiIpID09IDApDQorICB7DQorICAgIGNoYXIgc1syNTZdOw0KKyAgICBzcHJpbnRmKHMsICJTUEVDIGkgPSAlM2QsIGF0dHIgPSAlN3giLCBfYXR0cmliTWFwLlNpemUoKSwgYXR0cmliKTsNCisgICAgT3V0cHV0RGVidWdTdHJpbmdBKHMpOw0KKyAgICBPdXRwdXREZWJ1Z1N0cmluZ1coZmlsZU5hbWUpOw0KKyAgfQ0KKyAgKi8NCisNCisgIGlmICgoYXR0cmliICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSAhPSAwIHx8IGRvdFBvcyA8IDApDQorICB7DQorICAgIGludCBpbnNlcnRQb3MgPSAwOw0KKyAgICBpbnQgaW5kZXggPSBGaW5kSW5Tb3J0ZWRfQXR0cmliKF9hdHRyaWJNYXAsIGF0dHJpYiwgaW5zZXJ0UG9zKTsNCisgICAgaWYgKGluZGV4ID49IDApDQorICAgIHsNCisgICAgICAvLyBpZiAodHlwZU5hbWUpICp0eXBlTmFtZSA9IF9hdHRyaWJNYXBbaW5kZXhdLlR5cGVOYW1lOw0KKyAgICAgIHJldHVybiBfYXR0cmliTWFwW2luZGV4XS5JY29uSW5kZXg7DQorICAgIH0NCisgICAgQ0F0dHJpYkljb25QYWlyIHBhaXI7DQorICAgIEdldFJlYWxJY29uSW5kZXgoDQorICAgICAgICAjaWZkZWYgVU5ERVJfQ0UNCisgICAgICAgIEZURVhUKCJcXCIpDQorICAgICAgICAjZW5kaWYNCisgICAgICAgIEZURVhUKCJfX0RJUl9fIikNCisgICAgICAgICwgYXR0cmliLCBwYWlyLkljb25JbmRleA0KKyAgICAgICAgLy8gLCBwYWlyLlR5cGVOYW1lDQorICAgICAgICApOw0KKw0KKyAgICAvKg0KKyAgICBjaGFyIHNbMjU2XTsNCisgICAgc3ByaW50ZihzLCAiaSA9ICUzZCwgYXR0ciA9ICU3eCIsIF9hdHRyaWJNYXAuU2l6ZSgpLCBhdHRyaWIpOw0KKyAgICBPdXRwdXREZWJ1Z1N0cmluZ0Eocyk7DQorICAgICovDQorDQorICAgIHBhaXIuQXR0cmliID0gYXR0cmliOw0KKyAgICBfYXR0cmliTWFwLkluc2VydChpbnNlcnRQb3MsIHBhaXIpOw0KKyAgICAvLyBpZiAodHlwZU5hbWUpICp0eXBlTmFtZSA9IHBhaXIuVHlwZU5hbWU7DQorICAgIHJldHVybiBwYWlyLkljb25JbmRleDsNCisgIH0NCisNCisgIGNvbnN0IHdjaGFyX3QgKmV4dCA9IGZpbGVOYW1lICsgZG90UG9zICsgMTsNCisgIGludCBpbnNlcnRQb3MgPSAwOw0KKyAgaW50IGluZGV4ID0gRmluZEluU29ydGVkX0V4dChfZXh0TWFwLCBleHQsIGluc2VydFBvcyk7DQorICBpZiAoaW5kZXggPj0gMCkNCisgIHsNCisgICAgY29uc3QgQ0V4dEljb25QYWlyICZwYSA9IF9leHRNYXBbaW5kZXhdOw0KKyAgICAvLyBpZiAodHlwZU5hbWUpICp0eXBlTmFtZSA9IHBhLlR5cGVOYW1lOw0KKyAgICByZXR1cm4gcGEuSWNvbkluZGV4Ow0KKyAgfQ0KKw0KKyAgZm9yIChpID0gMDs7IGkrKykNCisgIHsNCisgICAgd2NoYXJfdCBjID0gZXh0W2ldOw0KKyAgICBpZiAoYyA9PSAwKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBpZiAoYyA8IEwnMCcgfHwgYyA+IEwnOScpDQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAoaSAhPSAwICYmIGV4dFtpXSA9PSAwKQ0KKyAgew0KKyAgICAvLyBHZXRSZWFsSWNvbkluZGV4IGlzIHRvbyBzbG93IGZvciBiaWcgbnVtYmVyIG9mIHNwbGl0IGV4dGVuc2lvbnM6IC4wMDEsIC4wMDIsIC4wMDMNCisgICAgaWYgKCFTcGxpdEljb25JbmRleF9EZWZpbmVkKQ0KKyAgICB7DQorICAgICAgR2V0UmVhbEljb25JbmRleCgNCisgICAgICAgICAgI2lmZGVmIFVOREVSX0NFDQorICAgICAgICAgIEZURVhUKCJcXCIpDQorICAgICAgICAgICNlbmRpZg0KKyAgICAgICAgICBGVEVYVCgiX19GSUxFX18uMDAxIiksIDAsIFNwbGl0SWNvbkluZGV4KTsNCisgICAgICBTcGxpdEljb25JbmRleF9EZWZpbmVkID0gdHJ1ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gU3BsaXRJY29uSW5kZXg7DQorICB9DQorDQorICBDRXh0SWNvblBhaXIgcGFpcjsNCisgIHBhaXIuRXh0ID0gZXh0Ow0KKyAgR2V0UmVhbEljb25JbmRleCh1czJmcyhmaWxlTmFtZSArIGRvdFBvcyksIGF0dHJpYiwgcGFpci5JY29uSW5kZXgpOw0KKyAgX2V4dE1hcC5JbnNlcnQoaW5zZXJ0UG9zLCBwYWlyKTsNCisgIC8vIGlmICh0eXBlTmFtZSkgKnR5cGVOYW1lID0gcGFpci5UeXBlTmFtZTsNCisgIHJldHVybiBwYWlyLkljb25JbmRleDsNCit9DQorDQorLyoNCitpbnQgQ0V4dFRvSWNvbk1hcDo6R2V0SWNvbkluZGV4KERXT1JEIGF0dHJpYiwgY29uc3QgVVN0cmluZyAmZmlsZU5hbWUpDQorew0KKyAgcmV0dXJuIEdldEljb25JbmRleChhdHRyaWIsIGZpbGVOYW1lLCBOVUxMKTsNCit9DQorKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL1N5c0ljb25VdGlscy5oIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9TeXNJY29uVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU1Yzc2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9TeXNJY29uVXRpbHMuaApAQCAtMCwwICsxLDU4IEBACisvLyBTeXNJY29uVXRpbHMuaA0KKw0KKyNpZm5kZWYgX19TWVNfSUNPTl9VVElMU19IDQorI2RlZmluZSBfX1NZU19JQ09OX1VUSUxTX0gNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL015U3RyaW5nLmgiDQorDQorc3RydWN0IENFeHRJY29uUGFpcg0KK3sNCisgIFVTdHJpbmcgRXh0Ow0KKyAgaW50IEljb25JbmRleDsNCisgIC8vIFVTdHJpbmcgVHlwZU5hbWU7DQorDQorICAvLyBpbnQgQ29tcGFyZShjb25zdCBDRXh0SWNvblBhaXIgJmEpIGNvbnN0IHsgcmV0dXJuIE15U3RyaW5nQ29tcGFyZU5vQ2FzZShFeHQsIGEuRXh0KTsgfQ0KK307DQorDQorc3RydWN0IENBdHRyaWJJY29uUGFpcg0KK3sNCisgIERXT1JEIEF0dHJpYjsNCisgIGludCBJY29uSW5kZXg7DQorICAvLyBVU3RyaW5nIFR5cGVOYW1lOw0KKw0KKyAgLy8gaW50IENvbXBhcmUoY29uc3QgQ0F0dHJpYkljb25QYWlyICZhKSBjb25zdCB7IHJldHVybiBFeHQuQ29tcGFyZShhLkV4dCk7IH0NCit9Ow0KKw0KK2NsYXNzIENFeHRUb0ljb25NYXANCit7DQorcHVibGljOg0KKyAgQ1JlY29yZFZlY3RvcjxDQXR0cmliSWNvblBhaXI+IF9hdHRyaWJNYXA7DQorICBDT2JqZWN0VmVjdG9yPENFeHRJY29uUGFpcj4gX2V4dE1hcDsNCisgIGludCBTcGxpdEljb25JbmRleDsNCisgIGludCBTcGxpdEljb25JbmRleF9EZWZpbmVkOw0KKyAgDQorICBDRXh0VG9JY29uTWFwKCk6IFNwbGl0SWNvbkluZGV4X0RlZmluZWQoZmFsc2UpIHt9DQorDQorICB2b2lkIENsZWFyKCkNCisgIHsNCisgICAgU3BsaXRJY29uSW5kZXhfRGVmaW5lZCA9IGZhbHNlOw0KKyAgICBfZXh0TWFwLkNsZWFyKCk7DQorICAgIF9hdHRyaWJNYXAuQ2xlYXIoKTsNCisgIH0NCisgIGludCBHZXRJY29uSW5kZXgoRFdPUkQgYXR0cmliLCBjb25zdCB3Y2hhcl90ICpmaWxlTmFtZSAvKiAsIFVTdHJpbmcgKnR5cGVOYW1lICovKTsNCisgIC8vIGludCBHZXRJY29uSW5kZXgoRFdPUkQgYXR0cmliLCBjb25zdCBVU3RyaW5nICZmaWxlTmFtZSk7DQorfTsNCisNCitEV09SRF9QVFIgR2V0UmVhbEljb25JbmRleChDRlNUUiBwYXRoLCBEV09SRCBhdHRyaWIsIGludCAmaWNvbkluZGV4KTsNCitpbnQgR2V0SWNvbkluZGV4Rm9yQ1NJREwoaW50IGNzaWRsKTsNCisNCitpbmxpbmUgSElNQUdFTElTVCBHZXRTeXNJbWFnZUxpc3QoYm9vbCBzbWFsbEljb25zKQ0KK3sNCisgIFNIRklMRUlORk8gc2hlbGxJbmZvOw0KKyAgcmV0dXJuIChISU1BR0VMSVNUKVNIR2V0RmlsZUluZm8oVEVYVCgiIiksDQorICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMIHwgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZLA0KKyAgICAgICZzaGVsbEluZm8sIHNpemVvZihzaGVsbEluZm8pLA0KKyAgICAgIFNIR0ZJX1VTRUZJTEVBVFRSSUJVVEVTIHwgU0hHRklfU1lTSUNPTklOREVYIHwgKHNtYWxsSWNvbnMgPyBTSEdGSV9TTUFMTElDT04gOiBTSEdGSV9JQ09OKSk7DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvcmVzb3VyY2UuaCBiL2x6bWEvQ1BQLzd6aXAvVUkvRmlsZU1hbmFnZXIvcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmZkYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9yZXNvdXJjZS5oCkBAIC0wLDAgKzEsMTcxIEBACisjaW5jbHVkZSAicmVzb3VyY2VHdWkuaCINCisNCisjZGVmaW5lIElEUl9NRU5VQkFSMSAgICAgIDcwDQorI2RlZmluZSBJRE1fTUVOVSAgICAgICAgICA3MQ0KKyNkZWZpbmUgSURSX0FDQ0VMRVJBVE9SMSAgNzINCisNCisjZGVmaW5lIElEQl9BREQgICAgICAxMDANCisjZGVmaW5lIElEQl9FWFRSQUNUICAxMDENCisjZGVmaW5lIElEQl9URVNUICAgICAxMDINCisjZGVmaW5lIElEQl9DT1BZICAgICAxMDMNCisjZGVmaW5lIElEQl9NT1ZFICAgICAxMDQNCisjZGVmaW5lIElEQl9ERUxFVEUgICAxMDUNCisjZGVmaW5lIElEQl9JTkZPICAgICAxMDYNCisNCisjZGVmaW5lIElEQl9BREQyICAgICAxNTANCisjZGVmaW5lIElEQl9FWFRSQUNUMiAxNTENCisjZGVmaW5lIElEQl9URVNUMiAgICAxNTINCisjZGVmaW5lIElEQl9DT1BZMiAgICAxNTMNCisjZGVmaW5lIElEQl9NT1ZFMiAgICAxNTQNCisjZGVmaW5lIElEQl9ERUxFVEUyICAxNTUNCisjZGVmaW5lIElEQl9JTkZPMiAgICAxNTYNCisNCisjZGVmaW5lIElETV9IQVNIX0FMTCAgICAgICAgICAgICAxMDENCisjZGVmaW5lIElETV9DUkMzMiAgICAgICAgICAgICAgICAxMDINCisjZGVmaW5lIElETV9DUkM2NCAgICAgICAgICAgICAgICAxMDMNCisjZGVmaW5lIElETV9TSEExICAgICAgICAgICAgICAgICAxMDQNCisjZGVmaW5lIElETV9TSEEyNTYgICAgICAgICAgICAgICAxMDUNCisNCisjZGVmaW5lIElETV9PUEVOICAgICAgICAgICAgICAgICA1NDANCisjZGVmaW5lIElETV9PUEVOX0lOU0lERSAgICAgICAgICA1NDENCisjZGVmaW5lIElETV9PUEVOX09VVFNJREUgICAgICAgICA1NDINCisjZGVmaW5lIElETV9GSUxFX1ZJRVcgICAgICAgICAgICA1NDMNCisjZGVmaW5lIElETV9GSUxFX0VESVQgICAgICAgICAgICA1NDQNCisjZGVmaW5lIElETV9SRU5BTUUgICAgICAgICAgICAgICA1NDUNCisjZGVmaW5lIElETV9DT1BZX1RPICAgICAgICAgICAgICA1NDYNCisjZGVmaW5lIElETV9NT1ZFX1RPICAgICAgICAgICAgICA1NDcNCisjZGVmaW5lIElETV9ERUxFVEUgICAgICAgICAgICAgICA1NDgNCisjZGVmaW5lIElETV9TUExJVCAgICAgICAgICAgICAgICA1NDkNCisjZGVmaW5lIElETV9DT01CSU5FICAgICAgICAgICAgICA1NTANCisjZGVmaW5lIElETV9QUk9QRVJUSUVTICAgICAgICAgICA1NTENCisjZGVmaW5lIElETV9DT01NRU5UICAgICAgICAgICAgICA1NTINCisjZGVmaW5lIElETV9DUkMgICAgICAgICAgICAgICAgICA1NTMNCisjZGVmaW5lIElETV9ESUZGICAgICAgICAgICAgICAgICA1NTQNCisjZGVmaW5lIElETV9DUkVBVEVfRk9MREVSICAgICAgICA1NTUNCisjZGVmaW5lIElETV9DUkVBVEVfRklMRSAgICAgICAgICA1NTYNCisvLyAjZGVmaW5lIElETV9FWElUICAgICAgICAgICAgICAgICA1NTcNCisjZGVmaW5lIElETV9MSU5LICAgICAgICAgICAgICAgICA1NTgNCisNCisjZGVmaW5lIElETV9TRUxFQ1RfQUxMICAgICAgICAgICA2MDANCisjZGVmaW5lIElETV9ERVNFTEVDVF9BTEwgICAgICAgICA2MDENCisjZGVmaW5lIElETV9JTlZFUlRfU0VMRUNUSU9OICAgICA2MDINCisjZGVmaW5lIElETV9TRUxFQ1QgICAgICAgICAgICAgICA2MDMNCisjZGVmaW5lIElETV9ERVNFTEVDVCAgICAgICAgICAgICA2MDQNCisjZGVmaW5lIElETV9TRUxFQ1RfQllfVFlQRSAgICAgICA2MDUNCisjZGVmaW5lIElETV9ERVNFTEVDVF9CWV9UWVBFICAgICA2MDYNCisNCisjZGVmaW5lIElETV9WSUVXX0xBUkdFX0lDT05TICAgICA3MDANCisjZGVmaW5lIElETV9WSUVXX1NNQUxMX0lDT05TICAgICA3MDENCisjZGVmaW5lIElETV9WSUVXX0xJU1QgICAgICAgICAgICA3MDINCisjZGVmaW5lIElETV9WSUVXX0RFVEFJTFMgICAgICAgICA3MDMNCisNCisjZGVmaW5lIElETV9WSUVXX0FSQU5HRV9CWV9OQU1FICA3MTANCisjZGVmaW5lIElETV9WSUVXX0FSQU5HRV9CWV9UWVBFICA3MTENCisjZGVmaW5lIElETV9WSUVXX0FSQU5HRV9CWV9EQVRFICA3MTINCisjZGVmaW5lIElETV9WSUVXX0FSQU5HRV9CWV9TSVpFICA3MTMNCisNCisjZGVmaW5lIElETV9WSUVXX0FSQU5HRV9OT19TT1JUICA3MzANCisjZGVmaW5lIElETV9WSUVXX0ZMQVRfVklFVyAgICAgICA3MzENCisjZGVmaW5lIElETV9WSUVXX1RXT19QQU5FTFMgICAgICA3MzINCisjZGVmaW5lIElETV9WSUVXX1RPT0xCQVJTICAgICAgICA3MzMNCisjZGVmaW5lIElETV9PUEVOX1JPT1RfRk9MREVSICAgICA3MzQNCisjZGVmaW5lIElETV9PUEVOX1BBUkVOVF9GT0xERVIgICA3MzUNCisjZGVmaW5lIElETV9GT0xERVJTX0hJU1RPUlkgICAgICA3MzYNCisjZGVmaW5lIElETV9WSUVXX1JFRlJFU0ggICAgICAgICA3MzcNCisjZGVmaW5lIElETV9WSUVXX0FVVE9fUkVGUkVTSCAgICA3MzgNCisvLyAjZGVmaW5lIElETV9WSUVXX1NIT1dfREVMRVRFRCAgICA3MzkNCisvLyAjZGVmaW5lIElETV9WSUVXX1NIT1dfU1RSRUFNUyAgICA3NDANCisNCisjZGVmaW5lIElETV9WSUVXX0FSQ0hJVkVfVE9PTEJBUiAgICAgICAgICAgIDc1MA0KKyNkZWZpbmUgSURNX1ZJRVdfU1RBTkRBUkRfVE9PTEJBUiAgICAgICAgICAgNzUxDQorI2RlZmluZSBJRE1fVklFV19UT09MQkFSU19MQVJHRV9CVVRUT05TICAgICA3NTINCisjZGVmaW5lIElETV9WSUVXX1RPT0xCQVJTX1NIT1dfQlVUVE9OU19URVhUIDc1Mw0KKw0KKyNkZWZpbmUgSURTX0JPT0tNQVJLICAgICAgICAgICAgIDgwMQ0KKw0KKyNkZWZpbmUgSURNX09QVElPTlMgICAgICAgICAgICAgIDkwMA0KKyNkZWZpbmUgSURNX0JFTkNITUFSSyAgICAgICAgICAgIDkwMQ0KKyNkZWZpbmUgSURNX0JFTkNITUFSSzIgICAgICAgICAgIDkwMg0KKw0KKyNkZWZpbmUgSURNX0hFTFBfQ09OVEVOVFMgICAgICAgIDk2MA0KKyNkZWZpbmUgSURNX0FCT1VUICAgICAgICAgICAgICAgIDk2MQ0KKw0KKyNkZWZpbmUgSURTX09QVElPTlMgICAgICAgICAgICAgICAgICAgICAyMTAwDQorDQorI2RlZmluZSBJRFNfTl9TRUxFQ1RFRF9JVEVNUyAgICAgICAgICAgIDMwMDINCisNCisjZGVmaW5lIElEU19GSUxFX0VYSVNUICAgICAgICAgICAgICAgICAgMzAwOA0KKyNkZWZpbmUgSURTX1dBTlRfVVBEQVRFX01PRElGSUVEX0ZJTEUgICAzMDA5DQorI2RlZmluZSBJRFNfQ0FOTk9UX1VQREFURV9GSUxFICAgICAgICAgIDMwMTANCisjZGVmaW5lIElEU19DQU5OT1RfU1RBUlRfRURJVE9SICAgICAgICAgMzAxMQ0KKyNkZWZpbmUgSURTX1ZJUlVTICAgICAgICAgICAgICAgICAgICAgICAzMDEyDQorI2RlZmluZSBJRFNfTUVTU0FHRV9VTlNVUFBPUlRFRF9PUEVSQVRJT05fRk9SX0xPTkdfUEFUSF9GT0xERVIgIDMwMTMNCisjZGVmaW5lIElEU19TRUxFQ1RfT05FX0ZJTEUgICAgICAgICAgICAgMzAxNA0KKyNkZWZpbmUgSURTX1NFTEVDVF9GSUxFUyAgICAgICAgICAgICAgICAzMDE1DQorI2RlZmluZSBJRFNfVE9PX01BTllfSVRFTVMgICAgICAgICAgICAgIDMwMTYNCisNCisjZGVmaW5lIElEU19DT1BZICAgICAgICAgICAgICAgICAgICAgICAgNjAwMA0KKyNkZWZpbmUgSURTX01PVkUgICAgICAgICAgICAgICAgICAgICAgICA2MDAxDQorI2RlZmluZSBJRFNfQ09QWV9UTyAgICAgICAgICAgICAgICAgICAgIDYwMDINCisjZGVmaW5lIElEU19NT1ZFX1RPICAgICAgICAgICAgICAgICAgICAgNjAwMw0KKyNkZWZpbmUgSURTX0NPUFlJTkcgICAgICAgICAgICAgICAgICAgICA2MDA0DQorI2RlZmluZSBJRFNfTU9WSU5HICAgICAgICAgICAgICAgICAgICAgIDYwMDUNCisjZGVmaW5lIElEU19SRU5BTUlORyAgICAgICAgICAgICAgICAgICAgNjAwNg0KKw0KKyNkZWZpbmUgSURTX09QRVJBVElPTl9JU19OT1RfU1VQUE9SVEVEICA2MDA4DQorI2RlZmluZSBJRFNfRVJST1JfUkVOQU1JTkcgICAgICAgICAgICAgIDYwMDkNCisjZGVmaW5lIElEU19DT05GSVJNX0ZJTEVfQ09QWSAgICAgICAgICAgNjAxMA0KKyNkZWZpbmUgSURTX1dBTlRfVE9fQ09QWV9GSUxFUyAgICAgICAgICA2MDExDQorDQorI2RlZmluZSBJRFNfQ09ORklSTV9GSUxFX0RFTEVURSAgICAgICAgIDYxMDANCisjZGVmaW5lIElEU19DT05GSVJNX0ZPTERFUl9ERUxFVEUgICAgICAgNjEwMQ0KKyNkZWZpbmUgSURTX0NPTkZJUk1fSVRFTVNfREVMRVRFICAgICAgICA2MTAyDQorI2RlZmluZSBJRFNfV0FOVF9UT19ERUxFVEVfRklMRSAgICAgICAgIDYxMDMNCisjZGVmaW5lIElEU19XQU5UX1RPX0RFTEVURV9GT0xERVIgICAgICAgNjEwNA0KKyNkZWZpbmUgSURTX1dBTlRfVE9fREVMRVRFX0lURU1TICAgICAgICA2MTA1DQorI2RlZmluZSBJRFNfREVMRVRJTkcgICAgICAgICAgICAgICAgICAgIDYxMDYNCisjZGVmaW5lIElEU19FUlJPUl9ERUxFVElORyAgICAgICAgICAgICAgNjEwNw0KKyNkZWZpbmUgSURTX0VSUk9SX0xPTkdfUEFUSF9UT19SRUNZQ0xFICA2MTA4DQorDQorI2RlZmluZSBJRFNfQ1JFQVRFX0ZPTERFUiAgICAgICAgICAgICAgIDYzMDANCisjZGVmaW5lIElEU19DUkVBVEVfRklMRSAgICAgICAgICAgICAgICAgNjMwMQ0KKyNkZWZpbmUgSURTX0NSRUFURV9GT0xERVJfTkFNRSAgICAgICAgICA2MzAyDQorI2RlZmluZSBJRFNfQ1JFQVRFX0ZJTEVfTkFNRSAgICAgICAgICAgIDYzMDMNCisjZGVmaW5lIElEU19DUkVBVEVfRk9MREVSX0RFRkFVTFRfTkFNRSAgNjMwNA0KKyNkZWZpbmUgSURTX0NSRUFURV9GSUxFX0RFRkFVTFRfTkFNRSAgICA2MzA1DQorI2RlZmluZSBJRFNfQ1JFQVRFX0ZPTERFUl9FUlJPUiAgICAgICAgIDYzMDYNCisjZGVmaW5lIElEU19DUkVBVEVfRklMRV9FUlJPUiAgICAgICAgICAgNjMwNw0KKw0KKyNkZWZpbmUgSURTX0NPTU1FTlQgICAgICAgICAgICAgICAgICAgICA2NDAwDQorI2RlZmluZSBJRFNfQ09NTUVOVDIgICAgICAgICAgICAgICAgICAgIDY0MDENCisjZGVmaW5lIElEU19TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgNjQwMg0KKyNkZWZpbmUgSURTX0RFU0VMRUNUICAgICAgICAgICAgICAgICAgICA2NDAzDQorI2RlZmluZSBJRFNfU0VMRUNUX01BU0sgICAgICAgICAgICAgICAgIDY0MDQNCisNCisjZGVmaW5lIElEU19QUk9QRVJUSUVTICAgICAgICAgICAgICAgICAgNjYwMA0KKyNkZWZpbmUgSURTX0ZPTERFUlNfSElTVE9SWSAgICAgICAgICAgICA2NjAxDQorDQorI2RlZmluZSBJRFNfQ09NUFVURVIgICAgICAgICAgICAgICAgICAgIDcxMDANCisjZGVmaW5lIElEU19ORVRXT1JLICAgICAgICAgICAgICAgICAgICAgNzEwMQ0KKyNkZWZpbmUgSURTX0RPQ1VNRU5UUyAgICAgICAgICAgICAgICAgICA3MTAyDQorI2RlZmluZSBJRFNfU1lTVEVNICAgICAgICAgICAgICAgICAgICAgIDcxMDMNCisNCisjZGVmaW5lIElEU19BREQgICAgICAgICAgICAgICAgICAgICAgICAgNzIwMA0KKyNkZWZpbmUgSURTX0VYVFJBQ1QgICAgICAgICAgICAgICAgICAgICA3MjAxDQorI2RlZmluZSBJRFNfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgIDcyMDINCisjZGVmaW5lIElEU19CVVRUT05fQ09QWSAgICAgICAgICAgICAgICAgNzIwMw0KKyNkZWZpbmUgSURTX0JVVFRPTl9NT1ZFICAgICAgICAgICAgICAgICA3MjA0DQorI2RlZmluZSBJRFNfQlVUVE9OX0RFTEVURSAgICAgICAgICAgICAgIDcyMDUNCisjZGVmaW5lIElEU19CVVRUT05fSU5GTyAgICAgICAgICAgICAgICAgNzIwNg0KKw0KKyNkZWZpbmUgSURTX1NQTElUVElORyAgICAgICAgICAgICAgICAgICA3MzAzDQorI2RlZmluZSBJRFNfU1BMSVRfQ09ORklSTV9USVRMRSAgICAgICAgIDczMDQNCisjZGVmaW5lIElEU19TUExJVF9DT05GSVJNX01FU1NBR0UgICAgICAgNzMwNQ0KKyNkZWZpbmUgSURTX1NQTElUX1ZPTF9NVVNUX0JFX1NNQUxMRVIgICA3MzA2DQorDQorI2RlZmluZSBJRFNfQ09NQklORSAgICAgICAgICAgICAgICAgICAgIDc0MDANCisjZGVmaW5lIElEU19DT01CSU5FX1RPICAgICAgICAgICAgICAgICAgNzQwMQ0KKyNkZWZpbmUgSURTX0NPTUJJTklORyAgICAgICAgICAgICAgICAgICA3NDAyDQorI2RlZmluZSBJRFNfQ09NQklORV9TRUxFQ1RfT05FX0ZJTEUgICAgIDc0MDMNCisjZGVmaW5lIElEU19DT01CSU5FX0NBTlRfREVURUNUX1NQTElUX0ZJTEUgNzQwNA0KKyNkZWZpbmUgSURTX0NPTUJJTkVfQ0FOVF9GSU5EX01PUkVfVEhBTl9PTkVfUEFSVCA3NDA1DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9yZXNvdXJjZUd1aS5oIGIvbHptYS9DUFAvN3ppcC9VSS9GaWxlTWFuYWdlci9yZXNvdXJjZUd1aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNWYzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0ZpbGVNYW5hZ2VyL3Jlc291cmNlR3VpLmgKQEAgLTAsMCArMSwxNSBAQAorI2RlZmluZSBJRElfSUNPTiAgMQ0KKw0KKyNkZWZpbmUgSURTX01FU1NBR0VfTk9fRVJST1JTICAgICAgICAgICAzMDAxDQorDQorI2RlZmluZSBJRFNfUFJPR1JFU1NfVEVTVElORyAgICAgICAgICAgIDMzMDINCisjZGVmaW5lIElEU19PUEVOTklORyAgICAgICAgICAgICAgICAgICAgMzMwMw0KKyNkZWZpbmUgSURTX1NDQU5OSU5HICAgICAgICAgICAgICAgICAgICAzMzA0DQorDQorI2RlZmluZSBJRFNfQ0hFQ0tTVU1fQ0FMQ1VMQVRJTkcgICAgICAgIDc1MDANCisjZGVmaW5lIElEU19DSEVDS1NVTV9JTkZPUk1BVElPTiAgICAgICAgNzUwMQ0KKyNkZWZpbmUgSURTX0NIRUNLU1VNX0NSQ19EQVRBICAgICAgICAgICA3NTAyDQorI2RlZmluZSBJRFNfQ0hFQ0tTVU1fQ1JDX0RBVEFfTkFNRVMgICAgIDc1MDMNCisjZGVmaW5lIElEU19DSEVDS1NVTV9DUkNfU1RSRUFNU19OQU1FUyAgNzUwNA0KKw0KKyNkZWZpbmUgSURTX0lOQ09SUkVDVF9WT0xVTUVfU0laRSAgICAgICA3MzA3DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9HVUkvRXh0cmFjdC5yYyBiL2x6bWEvQ1BQLzd6aXAvVUkvR1VJL0V4dHJhY3QucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiMmIzYQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvR1VJL0V4dHJhY3QucmMKQEAgLTAsMCArMSw1MiBAQAorI2luY2x1ZGUgIkV4dHJhY3RSZXMuaCINCisNCitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUw0KKw0KK1NUUklOR1RBQkxFIERJU0NBUkRBQkxFDQorQkVHSU4NCisgIElEU19NRU1fRVJST1IgICJUaGUgc3lzdGVtIGNhbm5vdCBhbGxvY2F0ZSB0aGUgcmVxdWlyZWQgYW1vdW50IG9mIG1lbW9yeSINCisgIElEU19DQU5OT1RfQ1JFQVRFX0ZPTERFUiAgIkNhbm5vdCBjcmVhdGUgZm9sZGVyICd7MH0nIg0KKyAgSURTX1VQREFURV9OT1RfU1VQUE9SVEVEICAiVXBkYXRlIG9wZXJhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgYXJjaGl2ZS4iDQorICBJRFNfQ0FOVF9PUEVOX0FSQ0hJVkUgICJDYW4gbm90IG9wZW4gZmlsZSAnezB9JyBhcyBhcmNoaXZlIg0KKyAgSURTX0NBTlRfT1BFTl9FTkNSWVBURURfQVJDSElWRSAgIkNhbiBub3Qgb3BlbiBlbmNyeXB0ZWQgYXJjaGl2ZSAnezB9Jy4gV3JvbmcgcGFzc3dvcmQ/Ig0KKyAgSURTX1VOU1VQUE9SVEVEX0FSQ0hJVkVfVFlQRSAgIlVuc3VwcG9ydGVkIGFyY2hpdmUgdHlwZSINCisNCisgIElEU19QUk9HUkVTU19FWFRSQUNUSU5HICJFeHRyYWN0aW5nIg0KKw0KKyAgSURTX0VYVFJBQ1RfU0VUX0ZPTERFUiAgIlNwZWNpZnkgYSBsb2NhdGlvbiBmb3IgZXh0cmFjdGVkIGZpbGVzLiINCisNCisgIElEU19FWFRSQUNUX1BBVEhTX0ZVTEwgICAgIkZ1bGwgcGF0aG5hbWVzIg0KKyAgSURTX0VYVFJBQ1RfUEFUSFNfTk8gICAgICAiTm8gcGF0aG5hbWVzIg0KKyAgSURTX0VYVFJBQ1RfUEFUSFNfQUJTICAgICAiQWJzb2x1dGUgcGF0aG5hbWVzIg0KKyAgSURTX1BBVEhfTU9ERV9SRUxBVCAgICAgICAiUmVsYXRpdmUgcGF0aG5hbWVzIg0KKw0KKyAgSURTX0VYVFJBQ1RfT1ZFUldSSVRFX0FTSyAgICAgICAgICAgICAiQXNrIGJlZm9yZSBvdmVyd3JpdGUiDQorICBJRFNfRVhUUkFDVF9PVkVSV1JJVEVfV0lUSE9VVF9QUk9NUFQgICJPdmVyd3JpdGUgd2l0aG91dCBwcm9tcHQiDQorICBJRFNfRVhUUkFDVF9PVkVSV1JJVEVfU0tJUF9FWElTVElORyAgICJTa2lwIGV4aXN0aW5nIGZpbGVzIg0KKyAgSURTX0VYVFJBQ1RfT1ZFUldSSVRFX1JFTkFNRSAgICAgICAgICAiQXV0byByZW5hbWUiDQorICBJRFNfRVhUUkFDVF9PVkVSV1JJVEVfUkVOQU1FX0VYSVNUSU5HICJBdXRvIHJlbmFtZSBleGlzdGluZyBmaWxlcyINCisNCisgIElEU19FWFRSQUNUX01FU1NBR0VfVU5TVVBQT1JURURfTUVUSE9EICAgIlVuc3VwcG9ydGVkIGNvbXByZXNzaW9uIG1ldGhvZCBmb3IgJ3swfScuIg0KKyAgSURTX0VYVFJBQ1RfTUVTU0FHRV9EQVRBX0VSUk9SICAgICAgICAgICAiRGF0YSBlcnJvciBpbiAnezB9Jy4gRmlsZSBpcyBicm9rZW4iDQorICBJRFNfRVhUUkFDVF9NRVNTQUdFX0NSQ19FUlJPUiAgICAgICAgICAgICJDUkMgZmFpbGVkIGluICd7MH0nLiBGaWxlIGlzIGJyb2tlbi4iDQorICBJRFNfRVhUUkFDVF9NRVNTQUdFX0RBVEFfRVJST1JfRU5DUllQVEVEICJEYXRhIGVycm9yIGluIGVuY3J5cHRlZCBmaWxlICd7MH0nLiBXcm9uZyBwYXNzd29yZD8iDQorICBJRFNfRVhUUkFDVF9NRVNTQUdFX0NSQ19FUlJPUl9FTkNSWVBURUQgICJDUkMgZmFpbGVkIGluIGVuY3J5cHRlZCBmaWxlICd7MH0nLiBXcm9uZyBwYXNzd29yZD8iDQorDQorICBJRFNfRVhUUkFDVF9NU0dfV1JPTkdfUFNXICAgICAgICAgICAgIldyb25nIHBhc3N3b3JkPyINCisgIC8vIElEU19FWFRSQUNUX01TR19FTkNSWVBURUQgICAgICAgICAgICAiRW5jcnlwdGVkIGZpbGUiDQorDQorICBJRFNfRVhUUkFDVF9NU0dfVU5TVVBQT1JURURfTUVUSE9EICAgIlVuc3VwcG9ydGVkIGNvbXByZXNzaW9uIG1ldGhvZCINCisgIElEU19FWFRSQUNUX01TR19EQVRBX0VSUk9SICAgICAgICAgICAiRGF0YSBlcnJvciINCisgIElEU19FWFRSQUNUX01TR19DUkNfRVJST1IgICAgICAgICAgICAiQ1JDIGZhaWxlZCINCisgIElEU19FWFRSQUNUX01TR19VTkFWQUlMQUJMRV9EQVRBICAgICAiVW5hdmFpbGFibGUgZGF0YSINCisgIElEU19FWFRSQUNUX01TR19VRVhQRUNURURfRU5EICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZGF0YSI7DQorICBJRFNfRVhUUkFDVF9NU0dfREFUQV9BRlRFUl9FTkQgICAgICAgIlRoZXJlIGFyZSBzb21lIGRhdGEgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgcGF5bG9hZCBkYXRhIiAgDQorICBJRFNfRVhUUkFDVF9NU0dfSVNfTk9UX0FSQyAgICAgICAgICAgIklzIG5vdCBhcmNoaXZlIiAgDQorICBJRFNfRVhUUkFDVF9NU0dfSEVBREVSU19FUlJPUiAgICAgICAgIkhlYWRlcnMgRXJyb3IiDQorDQorICBJRFNfT1BFTl9NU0dfVU5BVkFJTEFCTEVfU1RBUlQgICJVbmF2YWlsYWJsZSBzdGFydCBvZiBhcmNoaXZlIg0KKyAgSURTX09QRU5fTVNHX1VOQ09ORklSTUVEX1NUQVJUICAiVW5jb25maXJtZWQgc3RhcnQgb2YgYXJjaGl2ZSINCisgIC8vIElEU19PUEVOX01TR19FUlJPUl9GTEFHUyArIDUgICJVbmV4cGVjdGVkIGVuZCBvZiBhcmNoaXZlIg0KKyAgLy8gSURTX09QRU5fTVNHX0VSUk9SX0ZMQUdTICsgNiAgIlRoZXJlIGFyZSBkYXRhIGFmdGVyIHRoZSBlbmQgb2YgYXJjaGl2ZSINCisgIElEU19PUEVOX01TR19VTlNVUFBPUlRFRF9GRUFUVVJFICAiVW5zdXBwb3J0ZWQgZmVhdHVyZSINCitFTkQNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0dVSS9FeHRyYWN0RGlhbG9nLmNwcCBiL2x6bWEvQ1BQLzd6aXAvVUkvR1VJL0V4dHJhY3REaWFsb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMGE2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0dVSS9FeHRyYWN0RGlhbG9nLmNwcApAQCAtMCwwICsxLDQxOCBAQAorLy8gRXh0cmFjdERpYWxvZy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9XaWxkY2FyZC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVOYW1lLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZURpci5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL1Jlc291cmNlU3RyaW5nLmgiDQorDQorI2lmbmRlZiBOT19SRUdJU1RSWQ0KKyNpbmNsdWRlICIuLi9GaWxlTWFuYWdlci9IZWxwVXRpbHMuaCINCisjZW5kaWYNCisNCisNCisjaW5jbHVkZSAiLi4vRmlsZU1hbmFnZXIvQnJvd3NlRGlhbG9nLmgiDQorI2luY2x1ZGUgIi4uL0ZpbGVNYW5hZ2VyL0xhbmdVdGlscy5oIg0KKyNpbmNsdWRlICIuLi9GaWxlTWFuYWdlci9yZXNvdXJjZUd1aS5oIg0KKw0KKyNpbmNsdWRlICJFeHRyYWN0RGlhbG9nLmgiDQorI2luY2x1ZGUgIkV4dHJhY3REaWFsb2dSZXMuaCINCisjaW5jbHVkZSAiRXh0cmFjdFJlcy5oIg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCit1c2luZyBuYW1lc3BhY2UgTkZpbGU7DQordXNpbmcgbmFtZXNwYWNlIE5OYW1lOw0KKw0KK2V4dGVybiBISU5TVEFOQ0UgZ19oSW5zdGFuY2U7DQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrUGF0aE1vZGVfSURzW10gPQ0KK3sNCisgIElEU19FWFRSQUNUX1BBVEhTX0ZVTEwsDQorICBJRFNfRVhUUkFDVF9QQVRIU19OTywNCisgIElEU19FWFRSQUNUX1BBVEhTX0FCUw0KK307DQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrT3ZlcndyaXRlTW9kZV9JRHNbXSA9DQorew0KKyAgSURTX0VYVFJBQ1RfT1ZFUldSSVRFX0FTSywNCisgIElEU19FWFRSQUNUX09WRVJXUklURV9XSVRIT1VUX1BST01QVCwNCisgIElEU19FWFRSQUNUX09WRVJXUklURV9TS0lQX0VYSVNUSU5HLA0KKyAgSURTX0VYVFJBQ1RfT1ZFUldSSVRFX1JFTkFNRSwNCisgIElEU19FWFRSQUNUX09WRVJXUklURV9SRU5BTUVfRVhJU1RJTkcNCit9Ow0KKw0KKyNpZm5kZWYgX1NGWA0KKw0KK3N0YXRpYyBjb25zdA0KKyAgLy8gTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6RUVudW0NCisgIGludA0KKyAga1BhdGhNb2RlQnV0dG9uc1ZhbHNbXSA9DQorew0KKyAgTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6a0Z1bGxQYXRocywNCisgIE5FeHRyYWN0OjpOUGF0aE1vZGU6OmtOb1BhdGhzLA0KKyAgTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6a0Fic1BhdGhzDQorfTsNCisNCitzdGF0aWMgY29uc3QNCisgIGludA0KKyAgLy8gTkV4dHJhY3Q6Ok5PdmVyd3JpdGVNb2RlOjpFRW51bQ0KKyAga092ZXJ3cml0ZUJ1dHRvbnNWYWxzW10gPQ0KK3sNCisgIE5FeHRyYWN0OjpOT3ZlcndyaXRlTW9kZTo6a0FzaywNCisgIE5FeHRyYWN0OjpOT3ZlcndyaXRlTW9kZTo6a092ZXJ3cml0ZSwNCisgIE5FeHRyYWN0OjpOT3ZlcndyaXRlTW9kZTo6a1NraXAsDQorICBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OmtSZW5hbWUsDQorICBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OmtSZW5hbWVFeGlzdGluZw0KK307DQorDQorI2VuZGlmDQorDQorI2lmZGVmIExBTkcNCisNCitzdGF0aWMgY29uc3QgVUludDMyIGtMYW5nSURzW10gPQ0KK3sNCisgIElEVF9FWFRSQUNUX0VYVFJBQ1RfVE8sDQorICBJRFRfRVhUUkFDVF9QQVRIX01PREUsDQorICBJRFRfRVhUUkFDVF9PVkVSV1JJVEVfTU9ERSwNCisgIC8vIElEWF9FWFRSQUNUX0FMVF9TVFJFQU1TLA0KKyAgSURYX0VYVFJBQ1RfTlRfU0VDVVIsDQorICBJRFhfRVhUUkFDVF9FTElNX0RVUCwNCisgIElER19QQVNTV09SRCwNCisgIElEWF9QQVNTV09SRF9TSE9XDQorfTsNCisjZW5kaWYNCisNCisvLyBzdGF0aWMgY29uc3QgaW50IGtXaWxkY2FyZHNCdXR0b25JbmRleCA9IDI7DQorDQorI2lmbmRlZiBOT19SRUdJU1RSWQ0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrSGlzdG9yeVNpemUgPSAxNjsNCisjZW5kaWYNCisNCisjaWZuZGVmIF9TRlgNCisNCisvLyBpdCdzIHVzZWQgaW4gQ29tcHJlc3NEaWFsb2cgYWxzbw0KK3ZvaWQgQWRkQ29tYm9JdGVtcyhOQ29udHJvbDo6Q0NvbWJvQm94ICZjb21ibywgY29uc3QgVUludDMyICpsYW5nSURzLCB1bnNpZ25lZCBudW1JdGVtcywgY29uc3QgaW50ICp2YWx1ZXMsIGludCBjdXJWYWwpDQorew0KKyAgaW50IGN1clNlbCA9IDA7DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykNCisgIHsNCisgICAgVVN0cmluZyBzID0gTGFuZ1N0cmluZyhsYW5nSURzW2ldKTsNCisgICAgcy5SZW1vdmVDaGFyKEwnJicpOw0KKyAgICBpbnQgaW5kZXggPSAoaW50KWNvbWJvLkFkZFN0cmluZyhzKTsNCisgICAgY29tYm8uU2V0SXRlbURhdGEoaW5kZXgsIGkpOw0KKyAgICBpZiAodmFsdWVzW2ldID09IGN1clZhbCkNCisgICAgICBjdXJTZWwgPSBpOw0KKyAgfQ0KKyAgY29tYm8uU2V0Q3VyU2VsKGN1clNlbCk7DQorfQ0KKw0KKy8vIGl0J3MgdXNlZCBpbiBDb21wcmVzc0RpYWxvZyBhbHNvDQorYm9vbCBHZXRCb29sc1ZhbChjb25zdCBDQm9vbFBhaXIgJmIxLCBjb25zdCBDQm9vbFBhaXIgJmIyKQ0KK3sNCisgIGlmIChiMS5EZWYpIHJldHVybiBiMS5WYWw7DQorICBpZiAoYjIuRGVmKSByZXR1cm4gYjIuVmFsOw0KKyAgcmV0dXJuIGIxLlZhbDsNCit9DQorDQordm9pZCBDRXh0cmFjdERpYWxvZzo6Q2hlY2tCdXR0b25fVHdvQm9vbHMoVUlOVCBpZCwgY29uc3QgQ0Jvb2xQYWlyICZiMSwgY29uc3QgQ0Jvb2xQYWlyICZiMikNCit7DQorICBDaGVja0J1dHRvbihpZCwgR2V0Qm9vbHNWYWwoYjEsIGIyKSk7DQorfQ0KKw0KK3ZvaWQgQ0V4dHJhY3REaWFsb2c6OkdldEJ1dHRvbl9Cb29scyhVSU5UIGlkLCBDQm9vbFBhaXIgJmIxLCBDQm9vbFBhaXIgJmIyKQ0KK3sNCisgIGJvb2wgdmFsID0gSXNCdXR0b25DaGVja2VkQm9vbChpZCk7DQorICBib29sIG9sZFZhbCA9IEdldEJvb2xzVmFsKGIxLCBiMik7DQorICBpZiAodmFsICE9IG9sZFZhbCkNCisgICAgYjEuRGVmID0gYjIuRGVmID0gdHJ1ZTsNCisgIGIxLlZhbCA9IGIyLlZhbCA9IHZhbDsNCit9DQorDQorI2VuZGlmDQorDQorYm9vbCBDRXh0cmFjdERpYWxvZzo6T25Jbml0KCkNCit7DQorICAjaWZkZWYgTEFORw0KKyAgew0KKyAgICBVU3RyaW5nIHM7DQorICAgIExhbmdTdHJpbmdfT25seUZyb21MYW5nRmlsZShJRERfRVhUUkFDVCwgcyk7DQorICAgIGlmIChzLklzRW1wdHkoKSkNCisgICAgICBHZXRUZXh0KHMpOw0KKyAgICBpZiAoIUFyY1BhdGguSXNFbXB0eSgpKQ0KKyAgICB7DQorICAgICAgcyArPSBMIiA6ICI7DQorICAgICAgcyArPSBBcmNQYXRoOw0KKyAgICB9DQorICAgIFNldFRleHQocyk7DQorICAgIC8vIExhbmdTZXRXaW5kb3dUZXh0KCp0aGlzLCBJRERfRVhUUkFDVCk7DQorICAgIExhbmdTZXREbGdJdGVtcygqdGhpcywga0xhbmdJRHMsIEFSUkFZX1NJWkUoa0xhbmdJRHMpKTsNCisgIH0NCisgICNlbmRpZg0KKyAgDQorICAjaWZuZGVmIF9TRlgNCisgIF9wYXNzd29yZENvbnRyb2wuQXR0YWNoKEdldEl0ZW0oSURFX0VYVFJBQ1RfUEFTU1dPUkQpKTsNCisgIF9wYXNzd29yZENvbnRyb2wuU2V0VGV4dChQYXNzd29yZCk7DQorICBfcGFzc3dvcmRDb250cm9sLlNldFBhc3N3b3JkQ2hhcihURVhUKCcqJykpOw0KKyAgX3BhdGhOYW1lLkF0dGFjaChHZXRJdGVtKElERV9FWFRSQUNUX05BTUUpKTsNCisgICNlbmRpZg0KKw0KKyAgI2lmZGVmIE5PX1JFR0lTVFJZDQorICANCisgIFBhdGhNb2RlID0gTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6a0Z1bGxQYXRoczsNCisgIE92ZXJ3cml0ZU1vZGUgPSBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OmtBc2s7DQorICANCisgICNlbHNlDQorICANCisgIF9pbmZvLkxvYWQoKTsNCisNCisgIGlmIChfaW5mby5QYXRoTW9kZSA9PSBORXh0cmFjdDo6TlBhdGhNb2RlOjprQ3VyUGF0aHMpDQorICAgIF9pbmZvLlBhdGhNb2RlID0gTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6a0Z1bGxQYXRoczsNCisNCisgIGlmICghUGF0aE1vZGVfRm9yY2UgJiYgX2luZm8uUGF0aE1vZGVfRm9yY2UpDQorICAgIFBhdGhNb2RlID0gX2luZm8uUGF0aE1vZGU7DQorICBpZiAoIU92ZXJ3cml0ZU1vZGVfRm9yY2UgJiYgX2luZm8uT3ZlcndyaXRlTW9kZV9Gb3JjZSkNCisgICAgT3ZlcndyaXRlTW9kZSA9IF9pbmZvLk92ZXJ3cml0ZU1vZGU7DQorDQorICAvLyBDaGVja0J1dHRvbl9Ud29Cb29scyhJRFhfRVhUUkFDVF9BTFRfU1RSRUFNUywgQWx0U3RyZWFtcywgX2luZm8uQWx0U3RyZWFtcyk7DQorICBDaGVja0J1dHRvbl9Ud29Cb29scyhJRFhfRVhUUkFDVF9OVF9TRUNVUiwgICAgTnRTZWN1cml0eSwgX2luZm8uTnRTZWN1cml0eSk7DQorICBDaGVja0J1dHRvbl9Ud29Cb29scyhJRFhfRVhUUkFDVF9FTElNX0RVUCwgICAgRWxpbUR1cCwgICAgX2luZm8uRWxpbUR1cCk7DQorICANCisgIENoZWNrQnV0dG9uKElEWF9QQVNTV09SRF9TSE9XLCBfaW5mby5TaG93UGFzc3dvcmQuVmFsKTsNCisgIFVwZGF0ZVBhc3N3b3JkQ29udHJvbCgpOw0KKw0KKyAgI2VuZGlmDQorDQorICBfcGF0aC5BdHRhY2goR2V0SXRlbShJRENfRVhUUkFDVF9QQVRIKSk7DQorDQorICBVU3RyaW5nIHBhdGhQcmVmaXggPSBEaXJQYXRoOw0KKw0KKyAgI2lmbmRlZiBfU0ZYDQorICANCisgIGlmIChfaW5mby5TcGxpdERlc3QuVmFsKQ0KKyAgew0KKyAgICBDaGVja0J1dHRvbihJRFhfRVhUUkFDVF9OQU1FX0VOQUJMRSwgdHJ1ZSk7DQorICAgIFVTdHJpbmcgcGF0aE5hbWU7DQorICAgIFNwbGl0UGF0aFRvUGFydHNfU21hcnQoRGlyUGF0aCwgcGF0aFByZWZpeCwgcGF0aE5hbWUpOw0KKyAgICBpZiAocGF0aFByZWZpeC5Jc0VtcHR5KCkpDQorICAgICAgcGF0aFByZWZpeCA9IHBhdGhOYW1lOw0KKyAgICBlbHNlDQorICAgICAgX3BhdGhOYW1lLlNldFRleHQocGF0aE5hbWUpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgICBTaG93SXRlbV9Cb29sKElERV9FWFRSQUNUX05BTUUsIGZhbHNlKTsNCisNCisgICNlbmRpZg0KKw0KKyAgX3BhdGguU2V0VGV4dChwYXRoUHJlZml4KTsNCisNCisgICNpZm5kZWYgTk9fUkVHSVNUUlkNCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBfaW5mby5QYXRocy5TaXplKCkgJiYgaSA8IGtIaXN0b3J5U2l6ZTsgaSsrKQ0KKyAgICBfcGF0aC5BZGRTdHJpbmcoX2luZm8uUGF0aHNbaV0pOw0KKyAgI2VuZGlmDQorDQorICAvKg0KKyAgaWYgKF9pbmZvLlBhdGhzLlNpemUoKSA+IDApDQorICAgIF9wYXRoLlNldEN1clNlbCgwKTsNCisgIGVsc2UNCisgICAgX3BhdGguU2V0Q3VyU2VsKC0xKTsNCisgICovDQorDQorICAjaWZuZGVmIF9TRlgNCisNCisgIF9wYXRoTW9kZS5BdHRhY2goR2V0SXRlbShJRENfRVhUUkFDVF9QQVRIX01PREUpKTsNCisgIF9vdmVyd3JpdGVNb2RlLkF0dGFjaChHZXRJdGVtKElEQ19FWFRSQUNUX09WRVJXUklURV9NT0RFKSk7DQorDQorICBBZGRDb21ib0l0ZW1zKF9wYXRoTW9kZSwga1BhdGhNb2RlX0lEcywgQVJSQVlfU0laRShrUGF0aE1vZGVfSURzKSwga1BhdGhNb2RlQnV0dG9uc1ZhbHMsIFBhdGhNb2RlKTsNCisgIEFkZENvbWJvSXRlbXMoX292ZXJ3cml0ZU1vZGUsIGtPdmVyd3JpdGVNb2RlX0lEcywgQVJSQVlfU0laRShrT3ZlcndyaXRlTW9kZV9JRHMpLCBrT3ZlcndyaXRlQnV0dG9uc1ZhbHMsIE92ZXJ3cml0ZU1vZGUpOw0KKw0KKyAgI2VuZGlmDQorDQorICBISUNPTiBpY29uID0gTG9hZEljb24oZ19oSW5zdGFuY2UsIE1BS0VJTlRSRVNPVVJDRShJRElfSUNPTikpOw0KKyAgU2V0SWNvbihJQ09OX0JJRywgaWNvbik7DQorIA0KKyAgLy8gQ1dpbmRvdyBmaWxlc1dpbmRvdyA9IEdldEl0ZW0oSURDX0VYVFJBQ1RfUkFESU9fRklMRVMpOw0KKyAgLy8gZmlsZXNXaW5kb3cuRW5hYmxlKF9lbmFibGVGaWxlc0J1dHRvbik7DQorDQorICBOb3JtYWxpemVQb3NpdGlvbigpOw0KKw0KKyAgcmV0dXJuIENNb2RhbERpYWxvZzo6T25Jbml0KCk7DQorfQ0KKw0KKyNpZm5kZWYgX1NGWA0KK3ZvaWQgQ0V4dHJhY3REaWFsb2c6OlVwZGF0ZVBhc3N3b3JkQ29udHJvbCgpDQorew0KKyAgX3Bhc3N3b3JkQ29udHJvbC5TZXRQYXNzd29yZENoYXIoSXNTaG93UGFzc3dvcmRDaGVja2VkKCkgPyAwIDogVEVYVCgnKicpKTsNCisgIFVTdHJpbmcgcGFzc3dvcmQ7DQorICBfcGFzc3dvcmRDb250cm9sLkdldFRleHQocGFzc3dvcmQpOw0KKyAgX3Bhc3N3b3JkQ29udHJvbC5TZXRUZXh0KHBhc3N3b3JkKTsNCit9DQorI2VuZGlmDQorDQorYm9vbCBDRXh0cmFjdERpYWxvZzo6T25CdXR0b25DbGlja2VkKGludCBidXR0b25JRCwgSFdORCBidXR0b25IV05EKQ0KK3sNCisgIHN3aXRjaChidXR0b25JRCkNCisgIHsNCisgICAgY2FzZSBJREJfRVhUUkFDVF9TRVRfUEFUSDoNCisgICAgICBPbkJ1dHRvblNldFBhdGgoKTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgI2lmbmRlZiBfU0ZYDQorICAgIGNhc2UgSURYX0VYVFJBQ1RfTkFNRV9FTkFCTEU6DQorICAgICAgU2hvd0l0ZW1fQm9vbChJREVfRVhUUkFDVF9OQU1FLCBJc0J1dHRvbkNoZWNrZWRCb29sKElEWF9FWFRSQUNUX05BTUVfRU5BQkxFKSk7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIGNhc2UgSURYX1BBU1NXT1JEX1NIT1c6DQorICAgIHsNCisgICAgICBVcGRhdGVQYXNzd29yZENvbnRyb2woKTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgICAjZW5kaWYNCisgIH0NCisgIHJldHVybiBDTW9kYWxEaWFsb2c6Ok9uQnV0dG9uQ2xpY2tlZChidXR0b25JRCwgYnV0dG9uSFdORCk7DQorfQ0KKw0KK3ZvaWQgQ0V4dHJhY3REaWFsb2c6Ok9uQnV0dG9uU2V0UGF0aCgpDQorew0KKyAgVVN0cmluZyBjdXJyZW50UGF0aDsNCisgIF9wYXRoLkdldFRleHQoY3VycmVudFBhdGgpOw0KKyAgVVN0cmluZyB0aXRsZSA9IExhbmdTdHJpbmcoSURTX0VYVFJBQ1RfU0VUX0ZPTERFUik7DQorICBVU3RyaW5nIHJlc3VsdFBhdGg7DQorICBpZiAoIU15QnJvd3NlRm9yRm9sZGVyKCp0aGlzLCB0aXRsZSwgY3VycmVudFBhdGgsIHJlc3VsdFBhdGgpKQ0KKyAgICByZXR1cm47DQorICAjaWZuZGVmIE5PX1JFR0lTVFJZDQorICBfcGF0aC5TZXRDdXJTZWwoLTEpOw0KKyAgI2VuZGlmDQorICBfcGF0aC5TZXRUZXh0KHJlc3VsdFBhdGgpOw0KK30NCisNCit2b2lkIEFkZFVuaXF1ZVN0cmluZyhVU3RyaW5nVmVjdG9yICZsaXN0LCBjb25zdCBVU3RyaW5nICZzKQ0KK3sNCisgIEZPUl9WRUNUT1IgKGksIGxpc3QpDQorICAgIGlmIChzLklzRXF1YWxUb05vQ2FzZShsaXN0W2ldKSkNCisgICAgICByZXR1cm47DQorICBsaXN0LkFkZChzKTsNCit9DQorDQordm9pZCBDRXh0cmFjdERpYWxvZzo6T25PSygpDQorew0KKyAgI2lmbmRlZiBfU0ZYDQorICBpbnQgcGF0aE1vZGUyID0ga1BhdGhNb2RlQnV0dG9uc1ZhbHNbX3BhdGhNb2RlLkdldEN1clNlbCgpXTsNCisgIGlmIChQYXRoTW9kZSAhPSBORXh0cmFjdDo6TlBhdGhNb2RlOjprQ3VyUGF0aHMgfHwNCisgICAgICBwYXRoTW9kZTIgIT0gTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6a0Z1bGxQYXRocykNCisgICAgUGF0aE1vZGUgPSAoTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6RUVudW0pcGF0aE1vZGUyOw0KKw0KKyAgT3ZlcndyaXRlTW9kZSA9IChORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OkVFbnVtKWtPdmVyd3JpdGVCdXR0b25zVmFsc1tfb3ZlcndyaXRlTW9kZS5HZXRDdXJTZWwoKV07DQorDQorICAvLyBfZmlsZXNNb2RlID0gKE5FeHRyYWN0aW9uRGlhbG9nOjpORmlsZXNNb2RlOjpFRW51bSlHZXRGaWxlc01vZGUoKTsNCisNCisgIF9wYXNzd29yZENvbnRyb2wuR2V0VGV4dChQYXNzd29yZCk7DQorDQorICAjZW5kaWYNCisNCisgICNpZm5kZWYgTk9fUkVHSVNUUlkNCisNCisgIC8vIEdldEJ1dHRvbl9Cb29scyhJRFhfRVhUUkFDVF9BTFRfU1RSRUFNUywgQWx0U3RyZWFtcywgX2luZm8uQWx0U3RyZWFtcyk7DQorICBHZXRCdXR0b25fQm9vbHMoSURYX0VYVFJBQ1RfTlRfU0VDVVIsICAgIE50U2VjdXJpdHksIF9pbmZvLk50U2VjdXJpdHkpOw0KKyAgR2V0QnV0dG9uX0Jvb2xzKElEWF9FWFRSQUNUX0VMSU1fRFVQLCAgICBFbGltRHVwLCAgICBfaW5mby5FbGltRHVwKTsNCisNCisgIGJvb2wgc2hvd1Bhc3N3b3JkID0gSXNTaG93UGFzc3dvcmRDaGVja2VkKCk7DQorICBpZiAoc2hvd1Bhc3N3b3JkICE9IF9pbmZvLlNob3dQYXNzd29yZC5WYWwpDQorICB7DQorICAgIF9pbmZvLlNob3dQYXNzd29yZC5EZWYgPSB0cnVlOw0KKyAgICBfaW5mby5TaG93UGFzc3dvcmQuVmFsID0gc2hvd1Bhc3N3b3JkOw0KKyAgfQ0KKw0KKyAgaWYgKF9pbmZvLlBhdGhNb2RlICE9IHBhdGhNb2RlMikNCisgIHsNCisgICAgX2luZm8uUGF0aE1vZGVfRm9yY2UgPSB0cnVlOw0KKyAgICBfaW5mby5QYXRoTW9kZSA9IChORXh0cmFjdDo6TlBhdGhNb2RlOjpFRW51bSlwYXRoTW9kZTI7DQorICAgIC8qDQorICAgIC8vIHdlIGFsbG93IGtBYnNQYXRocyBpbiByZWdpc3RyeS4NCisgICAgaWYgKF9pbmZvLlBhdGhNb2RlID09IE5FeHRyYWN0OjpOUGF0aE1vZGU6OmtBYnNQYXRocykNCisgICAgICBfaW5mby5QYXRoTW9kZSA9IE5FeHRyYWN0OjpOUGF0aE1vZGU6OmtGdWxsUGF0aHM7DQorICAgICovDQorICB9DQorDQorICBpZiAoIU92ZXJ3cml0ZU1vZGVfRm9yY2UgJiYgX2luZm8uT3ZlcndyaXRlTW9kZSAhPSBPdmVyd3JpdGVNb2RlKQ0KKyAgICBfaW5mby5PdmVyd3JpdGVNb2RlX0ZvcmNlID0gdHJ1ZTsNCisgIF9pbmZvLk92ZXJ3cml0ZU1vZGUgPSBPdmVyd3JpdGVNb2RlOw0KKw0KKw0KKyAgI2Vsc2UNCisgIA0KKyAgRWxpbUR1cC5WYWwgPSBJc0J1dHRvbkNoZWNrZWRCb29sKElEWF9FWFRSQUNUX0VMSU1fRFVQKTsNCisNCisgICNlbmRpZg0KKyAgDQorICBVU3RyaW5nIHM7DQorICANCisgICNpZmRlZiBOT19SRUdJU1RSWQ0KKyAgDQorICBfcGF0aC5HZXRUZXh0KHMpOw0KKyAgDQorICAjZWxzZQ0KKw0KKyAgaW50IGN1cnJlbnRJdGVtID0gX3BhdGguR2V0Q3VyU2VsKCk7DQorICBpZiAoY3VycmVudEl0ZW0gPT0gQ0JfRVJSKQ0KKyAgew0KKyAgICBfcGF0aC5HZXRUZXh0KHMpOw0KKyAgICBpZiAoX3BhdGguR2V0Q291bnQoKSA+PSBrSGlzdG9yeVNpemUpDQorICAgICAgY3VycmVudEl0ZW0gPSBfcGF0aC5HZXRDb3VudCgpIC0gMTsNCisgIH0NCisgIGVsc2UNCisgICAgX3BhdGguR2V0TEJUZXh0KGN1cnJlbnRJdGVtLCBzKTsNCisgIA0KKyAgI2VuZGlmDQorDQorICBzLlRyaW0oKTsNCisgIE5OYW1lOjpOb3JtYWxpemVEaXJQYXRoUHJlZml4KHMpOw0KKyAgDQorICAjaWZuZGVmIF9TRlgNCisgIA0KKyAgYm9vbCBzcGxpdERlc3QgPSBJc0J1dHRvbkNoZWNrZWRCb29sKElEWF9FWFRSQUNUX05BTUVfRU5BQkxFKTsNCisgIGlmIChzcGxpdERlc3QpDQorICB7DQorICAgIFVTdHJpbmcgcGF0aE5hbWU7DQorICAgIF9wYXRoTmFtZS5HZXRUZXh0KHBhdGhOYW1lKTsNCisgICAgcGF0aE5hbWUuVHJpbSgpOw0KKyAgICBzICs9IHBhdGhOYW1lOw0KKyAgICBOTmFtZTo6Tm9ybWFsaXplRGlyUGF0aFByZWZpeChzKTsNCisgIH0NCisgIGlmIChzcGxpdERlc3QgIT0gX2luZm8uU3BsaXREZXN0LlZhbCkNCisgIHsNCisgICAgX2luZm8uU3BsaXREZXN0LkRlZiA9IHRydWU7DQorICAgIF9pbmZvLlNwbGl0RGVzdC5WYWwgPSBzcGxpdERlc3Q7DQorICB9DQorDQorICAjZW5kaWYNCisNCisgIERpclBhdGggPSBzOw0KKyAgDQorICAjaWZuZGVmIE5PX1JFR0lTVFJZDQorICBfaW5mby5QYXRocy5DbGVhcigpOw0KKyAgI2lmbmRlZiBfU0ZYDQorICBBZGRVbmlxdWVTdHJpbmcoX2luZm8uUGF0aHMsIHMpOw0KKyAgI2VuZGlmDQorICBmb3IgKGludCBpID0gMDsgaSA8IF9wYXRoLkdldENvdW50KCk7IGkrKykNCisgICAgaWYgKGkgIT0gY3VycmVudEl0ZW0pDQorICAgIHsNCisgICAgICBVU3RyaW5nIHNUZW1wOw0KKyAgICAgIF9wYXRoLkdldExCVGV4dChpLCBzVGVtcCk7DQorICAgICAgc1RlbXAuVHJpbSgpOw0KKyAgICAgIEFkZFVuaXF1ZVN0cmluZyhfaW5mby5QYXRocywgc1RlbXApOw0KKyAgICB9DQorICBfaW5mby5TYXZlKCk7DQorICAjZW5kaWYNCisgIA0KKyAgQ01vZGFsRGlhbG9nOjpPbk9LKCk7DQorfQ0KKw0KKyNpZm5kZWYgTk9fUkVHSVNUUlkNCitzdGF0aWMgTFBDV1NUUiBrSGVscFRvcGljID0gTCJmbS9wbHVnaW5zLzctemlwL2V4dHJhY3QuaHRtIjsNCit2b2lkIENFeHRyYWN0RGlhbG9nOjpPbkhlbHAoKQ0KK3sNCisgIFNob3dIZWxwV2luZG93KE5VTEwsIGtIZWxwVG9waWMpOw0KKyAgQ01vZGFsRGlhbG9nOjpPbkhlbHAoKTsNCit9DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9HVUkvRXh0cmFjdERpYWxvZy5oIGIvbHptYS9DUFAvN3ppcC9VSS9HVUkvRXh0cmFjdERpYWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOGM3ODYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0dVSS9FeHRyYWN0RGlhbG9nLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8vIEV4dHJhY3REaWFsb2cuaA0KKw0KKyNpZm5kZWYgX19FWFRSQUNUX0RJQUxPR19IDQorI2RlZmluZSBfX0VYVFJBQ1RfRElBTE9HX0gNCisNCisjaW5jbHVkZSAiRXh0cmFjdERpYWxvZ1Jlcy5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0NvbnRyb2wvQ29tYm9Cb3guaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9Db250cm9sL0VkaXQuaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0V4dHJhY3RNb2RlLmgiDQorDQorI2luY2x1ZGUgIi4uL0ZpbGVNYW5hZ2VyL0RpYWxvZ1NpemUuaCINCisNCisjaWZuZGVmIE5PX1JFR0lTVFJZDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9aaXBSZWdpc3RyeS5oIg0KKyNlbmRpZg0KKw0KK25hbWVzcGFjZSBORXh0cmFjdGlvbkRpYWxvZw0KK3sNCisgIC8qDQorICBuYW1lc3BhY2UgTkZpbGVzTW9kZQ0KKyAgew0KKyAgICBlbnVtIEVFbnVtDQorICAgIHsNCisgICAgICBrU2VsZWN0ZWQsDQorICAgICAga0FsbCwNCisgICAgICBrU3BlY2lmaWVkDQorICAgIH07DQorICB9DQorICAqLw0KK30NCisNCitjbGFzcyBDRXh0cmFjdERpYWxvZzogcHVibGljIE5XaW5kb3dzOjpOQ29udHJvbDo6Q01vZGFsRGlhbG9nDQorew0KKyAgI2lmZGVmIE5PX1JFR0lTVFJZDQorICBOV2luZG93czo6TkNvbnRyb2w6OkNEaWFsb2dDaGlsZENvbnRyb2wgX3BhdGg7DQorICAjZWxzZQ0KKyAgTldpbmRvd3M6Ok5Db250cm9sOjpDQ29tYm9Cb3ggX3BhdGg7DQorICAjZW5kaWYNCisNCisgICNpZm5kZWYgX1NGWA0KKyAgTldpbmRvd3M6Ok5Db250cm9sOjpDRWRpdCBfcGF0aE5hbWU7DQorICBOV2luZG93czo6TkNvbnRyb2w6OkNFZGl0IF9wYXNzd29yZENvbnRyb2w7DQorICBOV2luZG93czo6TkNvbnRyb2w6OkNDb21ib0JveCBfcGF0aE1vZGU7DQorICBOV2luZG93czo6TkNvbnRyb2w6OkNDb21ib0JveCBfb3ZlcndyaXRlTW9kZTsNCisgICNlbmRpZg0KKw0KKyAgI2lmbmRlZiBfU0ZYDQorICAvLyBpbnQgR2V0RmlsZXNNb2RlKCkgY29uc3Q7DQorICB2b2lkIFVwZGF0ZVBhc3N3b3JkQ29udHJvbCgpOw0KKyAgI2VuZGlmDQorICANCisgIHZvaWQgT25CdXR0b25TZXRQYXRoKCk7DQorDQorICB2b2lkIENoZWNrQnV0dG9uX1R3b0Jvb2xzKFVJTlQgaWQsIGNvbnN0IENCb29sUGFpciAmYjEsIGNvbnN0IENCb29sUGFpciAmYjIpOw0KKyAgdm9pZCBHZXRCdXR0b25fQm9vbHMoVUlOVCBpZCwgQ0Jvb2xQYWlyICZiMSwgQ0Jvb2xQYWlyICZiMik7DQorICB2aXJ0dWFsIGJvb2wgT25Jbml0KCk7DQorICB2aXJ0dWFsIGJvb2wgT25CdXR0b25DbGlja2VkKGludCBidXR0b25JRCwgSFdORCBidXR0b25IV05EKTsNCisgIHZpcnR1YWwgdm9pZCBPbk9LKCk7DQorICANCisgICNpZm5kZWYgTk9fUkVHSVNUUlkNCisNCisgIHZpcnR1YWwgdm9pZCBPbkhlbHAoKTsNCisNCisgIE5FeHRyYWN0OjpDSW5mbyBfaW5mbzsNCisgIA0KKyAgI2VuZGlmDQorICANCisgIGJvb2wgSXNTaG93UGFzc3dvcmRDaGVja2VkKCkgY29uc3QgeyByZXR1cm4gSXNCdXR0b25DaGVja2VkQm9vbChJRFhfUEFTU1dPUkRfU0hPVyk7IH0NCitwdWJsaWM6DQorICAvLyBib29sIF9lbmFibGVTZWxlY3RlZEZpbGVzQnV0dG9uOw0KKyAgLy8gYm9vbCBfZW5hYmxlRmlsZXNCdXR0b247DQorICAvLyBORXh0cmFjdGlvbkRpYWxvZzo6TkZpbGVzTW9kZTo6RUVudW0gRmlsZXNNb2RlOw0KKw0KKyAgVVN0cmluZyBEaXJQYXRoOw0KKyAgVVN0cmluZyBBcmNQYXRoOw0KKw0KKyAgI2lmbmRlZiBfU0ZYDQorICBVU3RyaW5nIFBhc3N3b3JkOw0KKyAgI2VuZGlmDQorICBib29sIFBhdGhNb2RlX0ZvcmNlOw0KKyAgYm9vbCBPdmVyd3JpdGVNb2RlX0ZvcmNlOw0KKyAgTkV4dHJhY3Q6Ok5QYXRoTW9kZTo6RUVudW0gUGF0aE1vZGU7DQorICBORXh0cmFjdDo6Tk92ZXJ3cml0ZU1vZGU6OkVFbnVtIE92ZXJ3cml0ZU1vZGU7DQorDQorICAjaWZuZGVmIF9TRlgNCisgIC8vIENCb29sUGFpciBBbHRTdHJlYW1zOw0KKyAgQ0Jvb2xQYWlyIE50U2VjdXJpdHk7DQorICAjZW5kaWYNCisNCisgIENCb29sUGFpciBFbGltRHVwOw0KKw0KKyAgSU5UX1BUUiBDcmVhdGUoSFdORCBhV25kUGFyZW50ID0gMCkNCisgIHsNCisgICAgI2lmZGVmIF9TRlgNCisgICAgQklHX0RJQUxPR19TSVpFKDI0MCwgNjQpOw0KKyAgICAjZWxzZQ0KKyAgICBCSUdfRElBTE9HX1NJWkUoMzAwLCAxNjApOw0KKyAgICAjZW5kaWYNCisgICAgcmV0dXJuIENNb2RhbERpYWxvZzo6Q3JlYXRlKFNJWkVEX0RJQUxPRyhJRERfRVhUUkFDVCksIGFXbmRQYXJlbnQpOw0KKyAgfQ0KKw0KKyAgQ0V4dHJhY3REaWFsb2coKToNCisgICAgUGF0aE1vZGVfRm9yY2UoZmFsc2UpLA0KKyAgICBPdmVyd3JpdGVNb2RlX0ZvcmNlKGZhbHNlKQ0KKyAgew0KKyAgICBFbGltRHVwLlZhbCA9IHRydWU7DQorICB9DQorDQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0dVSS9FeHRyYWN0RGlhbG9nLnJjIGIvbHptYS9DUFAvN3ppcC9VSS9HVUkvRXh0cmFjdERpYWxvZy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQ2NTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvN3ppcC9VSS9HVUkvRXh0cmFjdERpYWxvZy5yYwpAQCAtMCwwICsxLDk4IEBACisjaW5jbHVkZSAiRXh0cmFjdERpYWxvZ1Jlcy5oIg0KKyNpbmNsdWRlICIuLi8uLi9HdWlDb21tb24ucmMiDQorDQorI2RlZmluZSB4YyAzMzYNCisjZGVmaW5lIHljIDE2OA0KKw0KKyN1bmRlZiBnMXhzDQorI3VuZGVmIGcyeA0KKyN1bmRlZiBnMngyDQorI3VuZGVmIGcyeHMNCisjdW5kZWYgZzJ4czINCisNCisjZGVmaW5lIGcxeHMgMTYwDQorDQorI2RlZmluZSBnU3BhY2UgMjANCisjZGVmaW5lIGcyeCAobSArIGcxeHMgKyBnU3BhY2UpDQorI2RlZmluZSBnMngyIChnMnggKyBtKQ0KKyNkZWZpbmUgZzJ4cyAoeGMgLSBnMXhzIC0gZ1NwYWNlKQ0KKyNkZWZpbmUgZzJ4czIgKGcyeHMgLSBtIC0gbSkNCisNCisjdW5kZWYgR1JPVVBfWV9TSVpFDQorI2lmZGVmIFVOREVSX0NFDQorI2RlZmluZSBHUk9VUF9ZX1NJWkUgOA0KKyNlbHNlDQorI2RlZmluZSBHUk9VUF9ZX1NJWkUgNTYNCisjZW5kaWYNCisNCitJRERfRVhUUkFDVCAgRElBTE9HICAwLCAwLCB4cywgeXMgIE1ZX01PREFMX0RJQUxPR19TVFlMRSAgTVlfRk9OVA0KK0NBUFRJT04gIkV4dHJhY3QiDQorQkVHSU4NCisgIExURVhUICAgICAiRSZ4dHJhY3QgdG86IiwgSURUX0VYVFJBQ1RfRVhUUkFDVF9UTywgbSwgbSwgeGMsIDgNCisgIENPTUJPQk9YICBJRENfRVhUUkFDVF9QQVRILCBtLCBtICsgMTIsIHhjIC0gYnhzRG90cyAtIDEyLCAxMDAsIE1ZX0NPTUJPX1dJVEhfRURJVA0KKyAgUFVTSEJVVFRPTiAgIi4uLiIsIElEQl9FWFRSQUNUX1NFVF9QQVRILCB4cyAtIG0gLSBieHNEb3RzLCBtICsgMTIgLSAyLCBieHNEb3RzLCBieXMsIFdTX0dST1VQDQorDQorICBDT05UUk9MICAgIiIsIElEWF9FWFRSQUNUX05BTUVfRU5BQkxFLCBNWV9DSEVDS0JPWCwgbSwgbSArIDM0LCAxMiwgMTANCisgIEVESVRURVhUICBJREVfRVhUUkFDVF9OQU1FLCBtICsgMTIgKyAyLCBtICsgMzIsIGcxeHMgLSAxMiAtIDIsIDE0LCBFU19BVVRPSFNDUk9MTA0KKw0KKyAgTFRFWFQgICAgICJQYXRoIG1vZGU6IiwgSURUX0VYVFJBQ1RfUEFUSF9NT0RFLCBtLCBtICsgNTIsIGcxeHMsIDgNCisgIENPTUJPQk9YICBJRENfRVhUUkFDVF9QQVRIX01PREUsIG0sIG0gKyA2NCwgZzF4cywgMTQwLCBNWV9DT01CTw0KKw0KKyAgQ09OVFJPTCAgICJFbGltaW5hdGUgZHVwbGljYXRpb24gb2Ygcm9vdCBmb2xkZXIiLCBJRFhfRVhUUkFDVF9FTElNX0RVUCwgTVlfQ0hFQ0tCT1gsDQorICAgICAgICAgICAgbSwgbSArIDg0LCBnMXhzLCAxMA0KKw0KKyAgTFRFWFQgICAgICJPdmVyd3JpdGUgbW9kZToiLCBJRFRfRVhUUkFDVF9PVkVSV1JJVEVfTU9ERSwgbSwgbSArIDEwNCwgZzF4cywgOA0KKyAgQ09NQk9CT1ggIElEQ19FWFRSQUNUX09WRVJXUklURV9NT0RFLCBtLCBtICsgMTE2LCBnMXhzLCAxNDAsIE1ZX0NPTUJPDQorDQorDQorICBHUk9VUEJPWCAgIlBhc3N3b3JkIiwgSURHX1BBU1NXT1JELCBnMngsIG0gKyAzNiwgZzJ4cywgR1JPVVBfWV9TSVpFDQorICBFRElUVEVYVCAgSURFX0VYVFJBQ1RfUEFTU1dPUkQsIGcyeDIsIG0gKyA1MCwgZzJ4czIsIDE0LCBFU19QQVNTV09SRCB8IEVTX0FVVE9IU0NST0xMDQorICBDT05UUk9MICAgIlNob3cgUGFzc3dvcmQiLCBJRFhfUEFTU1dPUkRfU0hPVywgTVlfQ0hFQ0tCT1gsIGcyeDIsIG0gKyA3MiwgZzJ4czIsIDEwDQorDQorLy8gIENPTlRST0wgICAiUmVzdG9yZSBhbHRlcm5hdGUgZGF0YSBzdHJlYW1zIiwgSURYX0VYVFJBQ1RfQUxUX1NUUkVBTVMsIE1ZX0NIRUNLQk9YLA0KKy8vICAgICAgICAgICAgZzJ4LCBtICsgMTA0LCBnMnhzLCAxMA0KKyAgQ09OVFJPTCAgICJSZXN0b3JlIGZpbGUgc2VjdXJpdHkiLCBJRFhfRVhUUkFDVF9OVF9TRUNVUiwgTVlfQ0hFQ0tCT1gsDQorICAgICAgICAgICAgZzJ4LCBtICsgMTA0LCBnMnhzLCAxMA0KKyAgDQorICBERUZQVVNIQlVUVE9OICAiT0siLCAgICAgSURPSywgICAgIGJ4MywgYnksIGJ4cywgYnlzLCBXU19HUk9VUA0KKyAgUFVTSEJVVFRPTiAgICAgIkNhbmNlbCIsIElEQ0FOQ0VMLCBieDIsIGJ5LCBieHMsIGJ5cw0KKyAgUFVTSEJVVFRPTiAgICAgIkhlbHAiLCAgIElESEVMUCwgICBieDEsIGJ5LCBieHMsIGJ5cw0KK0VORA0KKw0KKw0KKyNpZmRlZiBVTkRFUl9DRQ0KKw0KKyN1bmRlZiBtDQorI2RlZmluZSBtIDQNCisNCisjdW5kZWYgeGMNCisjdW5kZWYgeWMNCisNCisjZGVmaW5lIHhjIDE1Mg0KKyNkZWZpbmUgeWMgMTI4DQorDQorI3VuZGVmIGcxeHMNCisNCisjZGVmaW5lIGcxeHMgNjQNCisNCitJRERfRVhUUkFDVF8yICBESUFMT0cgIDAsIDAsIHhzLCB5cyAgTVlfTU9EQUxfRElBTE9HX1NUWUxFICBNWV9GT05UDQorQ0FQVElPTiAiRXh0cmFjdCINCitCRUdJTg0KKyAgTFRFWFQgICAgICJFJnh0cmFjdCB0bzoiLCBJRFRfRVhUUkFDVF9FWFRSQUNUX1RPLCBtLCBtLCB4YyAtIGJ4c0RvdHMgLSA4LCA4DQorICBDT01CT0JPWCAgSURDX0VYVFJBQ1RfUEFUSCwgbSwgbSArIDEyLCB4YyAtIGJ4c0RvdHMgLSA4LCAxMDAsIE1ZX0NPTUJPX1dJVEhfRURJVA0KKyAgUFVTSEJVVFRPTiAgIi4uLiIsIElEQl9FWFRSQUNUX1NFVF9QQVRILCB4cyAtIG0gLSBieHNEb3RzLCBtICsgMTIgLSAzLCBieHNEb3RzLCBieXMsIFdTX0dST1VQDQorDQorICBMVEVYVCAgICAgIlBhdGggbW9kZToiLCBJRFRfRVhUUkFDVF9QQVRIX01PREUsIG0sIG0gKyAzNiwgZzF4cywgOA0KKyAgQ09NQk9CT1ggIElEQ19FWFRSQUNUX1BBVEhfTU9ERSwgbSArIGcxeHMsIG0gKyAzNiwgeGMgLSBnMXhzLCAxMDAsIE1ZX0NPTUJPDQorDQorICBMVEVYVCAgICAgIk92ZXJ3cml0ZSBtb2RlOiIsIElEVF9FWFRSQUNUX09WRVJXUklURV9NT0RFLCBtLCBtICsgNTYsIGcxeHMsIDgNCisgIENPTUJPQk9YICBJRENfRVhUUkFDVF9PVkVSV1JJVEVfTU9ERSwgbSArIGcxeHMsIG0gKyA1NiwgeGMgLSBnMXhzLCAxMDAsIE1ZX0NPTUJPDQorDQorICBMVEVYVCAgICAgIlBhc3N3b3JkIiwgSURHX1BBU1NXT1JELCBtLCBtICsgNzYsIGcxeHMsIDgNCisgIEVESVRURVhUICBJREVfRVhUUkFDVF9QQVNTV09SRCwgbSArIGcxeHMsIG0gKyA3NiwgeGMgLSBnMXhzLCAxNCwgRVNfUEFTU1dPUkQgfCBFU19BVVRPSFNDUk9MTA0KKyAgQ09OVFJPTCAgICJTaG93IFBhc3N3b3JkIiwgSURYX1BBU1NXT1JEX1NIT1csIE1ZX0NIRUNLQk9YLCBtLCBtICsgOTIsIHhjLCAxMA0KKyAgDQorICBPS19DQU5DRUwNCitFTkQNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0dVSS9FeHRyYWN0RGlhbG9nUmVzLmggYi9sem1hL0NQUC83emlwL1VJL0dVSS9FeHRyYWN0RGlhbG9nUmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3MzdlNAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvR1VJL0V4dHJhY3REaWFsb2dSZXMuaApAQCAtMCwwICsxLDI0IEBACisjZGVmaW5lIElERF9FWFRSQUNUICAgICAzNDAwDQorI2RlZmluZSBJRERfRVhUUkFDVF8yICAxMzQwMA0KKw0KKyNkZWZpbmUgSURDX0VYVFJBQ1RfUEFUSCAgICAgICAgICAgICAxMDANCisjZGVmaW5lIElEQl9FWFRSQUNUX1NFVF9QQVRIICAgICAgICAgMTAxDQorI2RlZmluZSBJRENfRVhUUkFDVF9QQVRIX01PREUgICAgICAgIDEwMg0KKyNkZWZpbmUgSURDX0VYVFJBQ1RfT1ZFUldSSVRFX01PREUgICAxMDMNCisNCisjZGVmaW5lIElERV9FWFRSQUNUX1BBU1NXT1JEICAgICAgICAgMTIwDQorDQorI2RlZmluZSBJREVfRVhUUkFDVF9OQU1FICAgICAgICAgICAgIDEzMA0KKyNkZWZpbmUgSURYX0VYVFJBQ1RfTkFNRV9FTkFCTEUgICAgICAxMzENCisNCisNCisjZGVmaW5lIElEVF9FWFRSQUNUX0VYVFJBQ1RfVE8gICAgICAzNDAxDQorI2RlZmluZSBJRFRfRVhUUkFDVF9QQVRIX01PREUgICAgICAgMzQxMA0KKyNkZWZpbmUgSURUX0VYVFJBQ1RfT1ZFUldSSVRFX01PREUgIDM0MjANCisNCisjZGVmaW5lIElEWF9FWFRSQUNUX0VMSU1fRFVQICAgICAgICAzNDMwDQorI2RlZmluZSBJRFhfRVhUUkFDVF9OVF9TRUNVUiAgICAgICAgMzQzMQ0KKy8vICNkZWZpbmUgSURYX0VYVFJBQ1RfQUxUX1NUUkVBTVMJICAgIDM0MzINCisNCisjZGVmaW5lIElEWF9QQVNTV09SRF9TSE9XICAgICAgICAgICAzODAzDQorI2RlZmluZSBJREdfUEFTU1dPUkQgICAgICAgICAgICAgICAgMzgwNw0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvR1VJL0V4dHJhY3RHVUkuY3BwIGIvbHptYS9DUFAvN3ppcC9VSS9HVUkvRXh0cmFjdEdVSS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3ODY0OAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvR1VJL0V4dHJhY3RHVUkuY3BwCkBAIC0wLDAgKzEsMjcwIEBACisvLyBFeHRyYWN0R1VJLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vLi4vQ29tbW9uL0ludFRvU3RyaW5nLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZURpci5oIg0KKyNpbmNsdWRlICIuLi8uLi8uLi9XaW5kb3dzL0ZpbGVGaW5kLmgiDQorI2luY2x1ZGUgIi4uLy4uLy4uL1dpbmRvd3MvRmlsZU5hbWUuaCINCisjaW5jbHVkZSAiLi4vLi4vLi4vV2luZG93cy9UaHJlYWQuaCINCisNCisjaW5jbHVkZSAiLi4vRmlsZU1hbmFnZXIvRXh0cmFjdENhbGxiYWNrLmgiDQorI2luY2x1ZGUgIi4uL0ZpbGVNYW5hZ2VyL0Zvcm1hdFV0aWxzLmgiDQorI2luY2x1ZGUgIi4uL0ZpbGVNYW5hZ2VyL0xhbmdVdGlscy5oIg0KKyNpbmNsdWRlICIuLi9GaWxlTWFuYWdlci9yZXNvdXJjZUd1aS5oIg0KKyNpbmNsdWRlICIuLi9GaWxlTWFuYWdlci9PdmVyd3JpdGVEaWFsb2dSZXMuaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0FyY2hpdmVFeHRyYWN0Q2FsbGJhY2suaCINCisjaW5jbHVkZSAiLi4vQ29tbW9uL1Byb3BJRFV0aWxzLmgiDQorDQorI2luY2x1ZGUgIi4uL0V4cGxvcmVyL015TWVzc2FnZXMuaCINCisNCisjaW5jbHVkZSAicmVzb3VyY2UyLmgiDQorI2luY2x1ZGUgIkV4dHJhY3RSZXMuaCINCisNCisjaW5jbHVkZSAiRXh0cmFjdERpYWxvZy5oIg0KKyNpbmNsdWRlICJFeHRyYWN0R1VJLmgiDQorI2luY2x1ZGUgIkhhc2hHVUkuaCINCisNCisjaW5jbHVkZSAiLi4vRmlsZU1hbmFnZXIvUHJvcGVydHlOYW1lUmVzLmgiDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KK3VzaW5nIG5hbWVzcGFjZSBORmlsZTsNCit1c2luZyBuYW1lc3BhY2UgTkRpcjsNCisNCitzdGF0aWMgY29uc3Qgd2NoYXJfdCAqa0luY29ycmVjdE91dERpciA9IEwiSW5jb3JyZWN0IG91dHB1dCBkaXJlY3RvcnkgcGF0aCI7DQorDQorI2lmbmRlZiBfU0ZYDQorDQorc3RhdGljIHZvaWQgQWRkVmFsdWVQYWlyKFVTdHJpbmcgJnMsIFVJTlQgcmVzb3VyY2VJRCwgVUludDY0IHZhbHVlLCBib29sIGFkZENvbG9uID0gdHJ1ZSkNCit7DQorICB3Y2hhcl90IHN6WzMyXTsNCisgIHMgKz0gTGFuZ1N0cmluZyhyZXNvdXJjZUlEKTsNCisgIGlmIChhZGRDb2xvbikNCisgICAgcyArPSBMJzonOw0KKyAgcyArPSBMJyAnOw0KKyAgQ29udmVydFVJbnQ2NFRvU3RyaW5nKHZhbHVlLCBzeik7DQorICBzICs9IHN6Ow0KKyAgcyArPSBMJ1xuJzsNCit9DQorDQorc3RhdGljIHZvaWQgQWRkU2l6ZVBhaXIoVVN0cmluZyAmcywgVUlOVCByZXNvdXJjZUlELCBVSW50NjQgdmFsdWUpDQorew0KKyAgd2NoYXJfdCBzelszMl07DQorICBzICs9IExhbmdTdHJpbmcocmVzb3VyY2VJRCk7DQorICBzICs9IEwiOiAiOw0KKyAgQ29udmVydFVJbnQ2NFRvU3RyaW5nKHZhbHVlLCBzeik7DQorICBzICs9IE15Rm9ybWF0TmV3KElEU19GSUxFX1NJWkUsIHN6KTsNCisgIC8vIHMgKz0gc3o7DQorICBpZiAodmFsdWUgPj0gKDEgPDwgMjApKQ0KKyAgew0KKyAgICBDb252ZXJ0VUludDY0VG9TdHJpbmcodmFsdWUgPj4gMjAsIHN6KTsNCisgICAgcyArPSBMIiAoIjsNCisgICAgcyArPSBzejsNCisgICAgcyArPSBMIiBNQikiOw0KKyAgfQ0KKyAgcyArPSBMJ1xuJzsNCit9DQorDQorI2VuZGlmDQorDQorY2xhc3MgQ1RocmVhZEV4dHJhY3Rpbmc6IHB1YmxpYyBDUHJvZ3Jlc3NUaHJlYWRWaXJ0DQorew0KKyAgSFJFU1VMVCBQcm9jZXNzVmlydCgpOw0KK3B1YmxpYzoNCisgIENDb2RlY3MgKmNvZGVjczsNCisgIENFeHRyYWN0Q2FsbGJhY2tJbXAgKkV4dHJhY3RDYWxsYmFja1NwZWM7DQorICBjb25zdCBDT2JqZWN0VmVjdG9yPENPcGVuVHlwZT4gKkZvcm1hdEluZGljZXM7DQorICBjb25zdCBDSW50VmVjdG9yICpFeGNsdWRlZEZvcm1hdEluZGljZXM7DQorDQorICBVU3RyaW5nVmVjdG9yICpBcmNoaXZlUGF0aHM7DQorICBVU3RyaW5nVmVjdG9yICpBcmNoaXZlUGF0aHNGdWxsOw0KKyAgY29uc3QgTldpbGRjYXJkOjpDQ2Vuc29yTm9kZSAqV2lsZGNhcmRDZW5zb3I7DQorICBjb25zdCBDRXh0cmFjdE9wdGlvbnMgKk9wdGlvbnM7DQorICAjaWZuZGVmIF9TRlgNCisgIENIYXNoQnVuZGxlICpIYXNoQnVuZGxlOw0KKyAgI2VuZGlmDQorICBDTXlDb21QdHI8SUV4dHJhY3RDYWxsYmFja1VJPiBFeHRyYWN0Q2FsbGJhY2s7DQorICBVU3RyaW5nIFRpdGxlOw0KK307DQorDQorSFJFU1VMVCBDVGhyZWFkRXh0cmFjdGluZzo6UHJvY2Vzc1ZpcnQoKQ0KK3sNCisgIENEZWNvbXByZXNzU3RhdCBTdGF0Ow0KKyAgI2lmbmRlZiBfU0ZYDQorICBpZiAoSGFzaEJ1bmRsZSkNCisgICAgSGFzaEJ1bmRsZS0+SW5pdCgpOw0KKyAgI2VuZGlmDQorDQorICBIUkVTVUxUIHJlcyA9IEV4dHJhY3QoY29kZWNzLA0KKyAgICAgICpGb3JtYXRJbmRpY2VzLCAqRXhjbHVkZWRGb3JtYXRJbmRpY2VzLA0KKyAgICAgICpBcmNoaXZlUGF0aHMsICpBcmNoaXZlUGF0aHNGdWxsLA0KKyAgICAgICpXaWxkY2FyZENlbnNvciwgKk9wdGlvbnMsIEV4dHJhY3RDYWxsYmFja1NwZWMsIEV4dHJhY3RDYWxsYmFjaywNCisgICAgICAjaWZuZGVmIF9TRlgNCisgICAgICAgIEhhc2hCdW5kbGUsDQorICAgICAgI2VuZGlmDQorICAgICAgRmluYWxNZXNzYWdlLkVycm9yTWVzc2FnZS5NZXNzYWdlLCBTdGF0KTsNCisgICNpZm5kZWYgX1NGWA0KKyAgaWYgKHJlcyA9PSBTX09LICYmIE9wdGlvbnMtPlRlc3RNb2RlICYmIEV4dHJhY3RDYWxsYmFja1NwZWMtPklzT0soKSkNCisgIHsNCisgICAgVVN0cmluZyBzOw0KKyAgICANCisgICAgQWRkVmFsdWVQYWlyKHMsIElEU19BUkNISVZFU19DT0xPTiwgU3RhdC5OdW1BcmNoaXZlcywgZmFsc2UpOw0KKyAgICBBZGRTaXplUGFpcihzLCBJRFNfUFJPUF9QQUNLRURfU0laRSwgU3RhdC5QYWNrU2l6ZSk7DQorDQorICAgIGlmICghSGFzaEJ1bmRsZSkNCisgICAgew0KKyAgICAgIGlmIChTdGF0Lk51bUZvbGRlcnMgIT0gMCkNCisgICAgICAgIEFkZFZhbHVlUGFpcihzLCBJRFNfUFJPUF9GT0xERVJTLCBTdGF0Lk51bUZvbGRlcnMpOw0KKyAgICAgIEFkZFZhbHVlUGFpcihzLCBJRFNfUFJPUF9GSUxFUywgU3RhdC5OdW1GaWxlcyk7DQorICAgICAgQWRkU2l6ZVBhaXIocywgSURTX1BST1BfU0laRSwgU3RhdC5VbnBhY2tTaXplKTsNCisgICAgICBpZiAoU3RhdC5OdW1BbHRTdHJlYW1zICE9IDApDQorICAgICAgew0KKyAgICAgICAgcyArPSBMJ1xuJzsNCisgICAgICAgIEFkZFZhbHVlUGFpcihzLCBJRFNfUFJPUF9OVU1fQUxUX1NUUkVBTVMsIFN0YXQuTnVtQWx0U3RyZWFtcyk7DQorICAgICAgICBBZGRTaXplUGFpcihzLCBJRFNfUFJPUF9BTFRfU1RSRUFNU19TSVpFLCBTdGF0LkFsdFN0cmVhbXNfVW5wYWNrU2l6ZSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBpZiAoSGFzaEJ1bmRsZSkNCisgICAgew0KKyAgICAgIHMgKz0gTCdcbic7DQorICAgICAgQWRkSGFzaEJ1bmRsZVJlcyhzLCAqSGFzaEJ1bmRsZSwgVVN0cmluZygpKTsNCisgICAgfQ0KKyAgICANCisgICAgcyArPSBMJ1xuJzsNCisgICAgcyArPSBMYW5nU3RyaW5nKElEU19NRVNTQUdFX05PX0VSUk9SUyk7DQorICAgIA0KKyAgICBGaW5hbE1lc3NhZ2UuT2tNZXNzYWdlLlRpdGxlID0gVGl0bGU7DQorICAgIEZpbmFsTWVzc2FnZS5Pa01lc3NhZ2UuTWVzc2FnZSA9IHM7DQorICB9DQorICAjZW5kaWYNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK0hSRVNVTFQgRXh0cmFjdEdVSSgNCisgICAgQ0NvZGVjcyAqY29kZWNzLA0KKyAgICBjb25zdCBDT2JqZWN0VmVjdG9yPENPcGVuVHlwZT4gJmZvcm1hdEluZGljZXMsDQorICAgIGNvbnN0IENJbnRWZWN0b3IgJmV4Y2x1ZGVkRm9ybWF0SW5kaWNlcywNCisgICAgVVN0cmluZ1ZlY3RvciAmYXJjaGl2ZVBhdGhzLA0KKyAgICBVU3RyaW5nVmVjdG9yICZhcmNoaXZlUGF0aHNGdWxsLA0KKyAgICBjb25zdCBOV2lsZGNhcmQ6OkNDZW5zb3JOb2RlICZ3aWxkY2FyZENlbnNvciwNCisgICAgQ0V4dHJhY3RPcHRpb25zICZvcHRpb25zLA0KKyAgICAjaWZuZGVmIF9TRlgNCisgICAgQ0hhc2hCdW5kbGUgKmhiLA0KKyAgICAjZW5kaWYNCisgICAgYm9vbCBzaG93RGlhbG9nLA0KKyAgICBib29sICZtZXNzYWdlV2FzRGlzcGxheWVkLA0KKyAgICBDRXh0cmFjdENhbGxiYWNrSW1wICpleHRyYWN0Q2FsbGJhY2ssDQorICAgIEhXTkQgaHduZFBhcmVudCkNCit7DQorICBtZXNzYWdlV2FzRGlzcGxheWVkID0gZmFsc2U7DQorDQorICBDVGhyZWFkRXh0cmFjdGluZyBleHRyYWN0ZXI7DQorICBleHRyYWN0ZXIuY29kZWNzID0gY29kZWNzOw0KKyAgZXh0cmFjdGVyLkZvcm1hdEluZGljZXMgPSAmZm9ybWF0SW5kaWNlczsNCisgIGV4dHJhY3Rlci5FeGNsdWRlZEZvcm1hdEluZGljZXMgPSAmZXhjbHVkZWRGb3JtYXRJbmRpY2VzOw0KKw0KKyAgaWYgKCFvcHRpb25zLlRlc3RNb2RlKQ0KKyAgew0KKyAgICBGU3RyaW5nIG91dHB1dERpciA9IG9wdGlvbnMuT3V0cHV0RGlyOw0KKyAgICAjaWZuZGVmIFVOREVSX0NFDQorICAgIGlmIChvdXRwdXREaXIuSXNFbXB0eSgpKQ0KKyAgICAgIEdldEN1cnJlbnREaXIob3V0cHV0RGlyKTsNCisgICAgI2VuZGlmDQorICAgIGlmIChzaG93RGlhbG9nKQ0KKyAgICB7DQorICAgICAgQ0V4dHJhY3REaWFsb2cgZGlhbG9nOw0KKyAgICAgIEZTdHJpbmcgb3V0cHV0RGlyRnVsbDsNCisgICAgICBpZiAoIU15R2V0RnVsbFBhdGhOYW1lKG91dHB1dERpciwgb3V0cHV0RGlyRnVsbCkpDQorICAgICAgew0KKyAgICAgICAgU2hvd0Vycm9yTWVzc2FnZShrSW5jb3JyZWN0T3V0RGlyKTsNCisgICAgICAgIG1lc3NhZ2VXYXNEaXNwbGF5ZWQgPSB0cnVlOw0KKyAgICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgICB9DQorICAgICAgTk5hbWU6Ok5vcm1hbGl6ZURpclBhdGhQcmVmaXgob3V0cHV0RGlyRnVsbCk7DQorDQorICAgICAgZGlhbG9nLkRpclBhdGggPSBmczJ1cyhvdXRwdXREaXJGdWxsKTsNCisNCisgICAgICBkaWFsb2cuT3ZlcndyaXRlTW9kZSA9IG9wdGlvbnMuT3ZlcndyaXRlTW9kZTsNCisgICAgICBkaWFsb2cuT3ZlcndyaXRlTW9kZV9Gb3JjZSA9IG9wdGlvbnMuT3ZlcndyaXRlTW9kZV9Gb3JjZTsNCisgICAgICBkaWFsb2cuUGF0aE1vZGUgPSBvcHRpb25zLlBhdGhNb2RlOw0KKyAgICAgIGRpYWxvZy5QYXRoTW9kZV9Gb3JjZSA9IG9wdGlvbnMuUGF0aE1vZGVfRm9yY2U7DQorICAgICAgZGlhbG9nLkVsaW1EdXAgPSBvcHRpb25zLkVsaW1EdXA7DQorDQorICAgICAgaWYgKGFyY2hpdmVQYXRoc0Z1bGwuU2l6ZSgpID09IDEpDQorICAgICAgICBkaWFsb2cuQXJjUGF0aCA9IGFyY2hpdmVQYXRoc0Z1bGxbMF07DQorDQorICAgICAgI2lmbmRlZiBfU0ZYDQorICAgICAgLy8gZGlhbG9nLkFsdFN0cmVhbXMgPSBvcHRpb25zLk50T3B0aW9ucy5BbHRTdHJlYW1zOw0KKyAgICAgIGRpYWxvZy5OdFNlY3VyaXR5ID0gb3B0aW9ucy5OdE9wdGlvbnMuTnRTZWN1cml0eTsNCisgICAgICBpZiAoZXh0cmFjdENhbGxiYWNrLT5QYXNzd29yZElzRGVmaW5lZCkNCisgICAgICAgIGRpYWxvZy5QYXNzd29yZCA9IGV4dHJhY3RDYWxsYmFjay0+UGFzc3dvcmQ7DQorICAgICAgI2VuZGlmDQorDQorICAgICAgaWYgKGRpYWxvZy5DcmVhdGUoaHduZFBhcmVudCkgIT0gSURPSykNCisgICAgICAgIHJldHVybiBFX0FCT1JUOw0KKw0KKyAgICAgIG91dHB1dERpciA9IHVzMmZzKGRpYWxvZy5EaXJQYXRoKTsNCisNCisgICAgICBvcHRpb25zLk92ZXJ3cml0ZU1vZGUgPSBkaWFsb2cuT3ZlcndyaXRlTW9kZTsNCisgICAgICBvcHRpb25zLlBhdGhNb2RlID0gZGlhbG9nLlBhdGhNb2RlOw0KKyAgICAgIG9wdGlvbnMuRWxpbUR1cCA9IGRpYWxvZy5FbGltRHVwOw0KKyAgICAgIA0KKyAgICAgICNpZm5kZWYgX1NGWA0KKyAgICAgIC8vIG9wdGlvbnMuTnRPcHRpb25zLkFsdFN0cmVhbXMgPSBkaWFsb2cuQWx0U3RyZWFtczsNCisgICAgICBvcHRpb25zLk50T3B0aW9ucy5OdFNlY3VyaXR5ID0gZGlhbG9nLk50U2VjdXJpdHk7DQorICAgICAgZXh0cmFjdENhbGxiYWNrLT5QYXNzd29yZCA9IGRpYWxvZy5QYXNzd29yZDsNCisgICAgICBleHRyYWN0Q2FsbGJhY2stPlBhc3N3b3JkSXNEZWZpbmVkID0gIWRpYWxvZy5QYXNzd29yZC5Jc0VtcHR5KCk7DQorICAgICAgI2VuZGlmDQorICAgIH0NCisgICAgaWYgKCFNeUdldEZ1bGxQYXRoTmFtZShvdXRwdXREaXIsIG9wdGlvbnMuT3V0cHV0RGlyKSkNCisgICAgew0KKyAgICAgIFNob3dFcnJvck1lc3NhZ2Uoa0luY29ycmVjdE91dERpcik7DQorICAgICAgbWVzc2FnZVdhc0Rpc3BsYXllZCA9IHRydWU7DQorICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgfQ0KKyAgICBOTmFtZTo6Tm9ybWFsaXplRGlyUGF0aFByZWZpeChvcHRpb25zLk91dHB1dERpcik7DQorICAgIA0KKyAgICAvKg0KKyAgICBpZighQ3JlYXRlQ29tcGxleERpcmVjdG9yeShvcHRpb25zLk91dHB1dERpcikpDQorICAgIHsNCisgICAgICBVU3RyaW5nIHMgPSBHZXRVbmljb2RlU3RyaW5nKE5FcnJvcjo6TXlGb3JtYXRNZXNzYWdlKEdldExhc3RFcnJvcigpKSk7DQorICAgICAgVVN0cmluZyBzMiA9IE15Rm9ybWF0TmV3KElEU19DQU5OT1RfQ1JFQVRFX0ZPTERFUiwNCisgICAgICAjaWZkZWYgTEFORw0KKyAgICAgIDB4MDIwMDA2MDMsDQorICAgICAgI2VuZGlmDQorICAgICAgb3B0aW9ucy5PdXRwdXREaXIpOw0KKyAgICAgIE15TWVzc2FnZUJveChzMiArIFVTdHJpbmcoTCdcbicpICsgcyk7DQorICAgICAgcmV0dXJuIEVfRkFJTDsNCisgICAgfQ0KKyAgICAqLw0KKyAgfQ0KKyAgDQorICBVU3RyaW5nIHRpdGxlID0gTGFuZ1N0cmluZyhvcHRpb25zLlRlc3RNb2RlID8gSURTX1BST0dSRVNTX1RFU1RJTkcgOiBJRFNfUFJPR1JFU1NfRVhUUkFDVElORyk7DQorDQorICBleHRyYWN0ZXIuVGl0bGUgPSB0aXRsZTsNCisgIGV4dHJhY3Rlci5FeHRyYWN0Q2FsbGJhY2tTcGVjID0gZXh0cmFjdENhbGxiYWNrOw0KKyAgZXh0cmFjdGVyLkV4dHJhY3RDYWxsYmFja1NwZWMtPlByb2dyZXNzRGlhbG9nID0gJmV4dHJhY3Rlci5Qcm9ncmVzc0RpYWxvZzsNCisgIGV4dHJhY3Rlci5FeHRyYWN0Q2FsbGJhY2sgPSBleHRyYWN0Q2FsbGJhY2s7DQorICBleHRyYWN0ZXIuRXh0cmFjdENhbGxiYWNrU3BlYy0+SW5pdCgpOw0KKw0KKyAgZXh0cmFjdGVyLlByb2dyZXNzRGlhbG9nLkNvbXByZXNzaW5nTW9kZSA9IGZhbHNlOw0KKw0KKyAgZXh0cmFjdGVyLkFyY2hpdmVQYXRocyA9ICZhcmNoaXZlUGF0aHM7DQorICBleHRyYWN0ZXIuQXJjaGl2ZVBhdGhzRnVsbCA9ICZhcmNoaXZlUGF0aHNGdWxsOw0KKyAgZXh0cmFjdGVyLldpbGRjYXJkQ2Vuc29yID0gJndpbGRjYXJkQ2Vuc29yOw0KKyAgZXh0cmFjdGVyLk9wdGlvbnMgPSAmb3B0aW9uczsNCisgICNpZm5kZWYgX1NGWA0KKyAgZXh0cmFjdGVyLkhhc2hCdW5kbGUgPSBoYjsNCisgICNlbmRpZg0KKw0KKyAgZXh0cmFjdGVyLlByb2dyZXNzRGlhbG9nLkljb25JRCA9IElESV9JQ09OOw0KKw0KKyAgUklOT0soZXh0cmFjdGVyLkNyZWF0ZSh0aXRsZSwgaHduZFBhcmVudCkpOw0KKyAgbWVzc2FnZVdhc0Rpc3BsYXllZCA9IGV4dHJhY3Rlci5UaHJlYWRGaW5pc2hlZE9LICYNCisgICAgICBleHRyYWN0ZXIuUHJvZ3Jlc3NEaWFsb2cuTWVzc2FnZXNEaXNwbGF5ZWQ7DQorICByZXR1cm4gZXh0cmFjdGVyLlJlc3VsdDsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9HVUkvRXh0cmFjdEdVSS5oIGIvbHptYS9DUFAvN3ppcC9VSS9HVUkvRXh0cmFjdEdVSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NmU1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0dVSS9FeHRyYWN0R1VJLmgKQEAgLTAsMCArMSwzOCBAQAorLy8gR1VJL0V4dHJhY3RHVUkuaA0KKw0KKyNpZm5kZWYgX19FWFRSQUNUX0dVSV9IDQorI2RlZmluZSBfX0VYVFJBQ1RfR1VJX0gNCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL0V4dHJhY3QuaCINCisNCisjaW5jbHVkZSAiLi4vRmlsZU1hbmFnZXIvRXh0cmFjdENhbGxiYWNrLmgiDQorDQorLyoNCisgIFJFU1VMVCBjYW4gYmUgU19PSywgZXZlbiBpZiB0aGVyZSBhcmUgZXJyb3JzISEhDQorICBpZiBSRVNVTFQgPT0gU19PSywgY2hlY2sgZXh0cmFjdENhbGxiYWNrLT5Jc09LKCkgYWZ0ZXIgRXh0cmFjdEdVSSgpLg0KKw0KKyAgUkVTVUxUID0gRV9BQk9SVCAtIHVzZXIgYnJlYWsuDQorICBSRVNVTFQgIT0gRV9BQk9SVDoNCisgIHsNCisgICBtZXNzYWdlV2FzRGlzcGxheWVkID0gdHJ1ZSAgLSBtZXNzYWdlIHdhcyBkaXNwbGF5ZWQgYWxyZWFkeS4NCisgICBtZXNzYWdlV2FzRGlzcGxheWVkID0gZmFsc2UgLSB0aGVyZSB3YXMgc29tZSBpbnRlcm5hbCBlcnJvciwgc28geW91IG11c3Qgc2hvdyBlcnJvciBtZXNzYWdlLg0KKyAgfQ0KKyovDQorDQorSFJFU1VMVCBFeHRyYWN0R1VJKA0KKyAgICBDQ29kZWNzICpjb2RlY3MsDQorICAgIGNvbnN0IENPYmplY3RWZWN0b3I8Q09wZW5UeXBlPiAmZm9ybWF0SW5kaWNlcywNCisgICAgY29uc3QgQ0ludFZlY3RvciAmZXhjbHVkZWRGb3JtYXRJbmRpY2VzLA0KKyAgICBVU3RyaW5nVmVjdG9yICZhcmNoaXZlUGF0aHMsDQorICAgIFVTdHJpbmdWZWN0b3IgJmFyY2hpdmVQYXRoc0Z1bGwsDQorICAgIGNvbnN0IE5XaWxkY2FyZDo6Q0NlbnNvck5vZGUgJndpbGRjYXJkQ2Vuc29yLA0KKyAgICBDRXh0cmFjdE9wdGlvbnMgJm9wdGlvbnMsDQorICAgICNpZm5kZWYgX1NGWA0KKyAgICBDSGFzaEJ1bmRsZSAqaGIsDQorICAgICNlbmRpZg0KKyAgICBib29sIHNob3dEaWFsb2csDQorICAgIGJvb2wgJm1lc3NhZ2VXYXNEaXNwbGF5ZWQsDQorICAgIENFeHRyYWN0Q2FsbGJhY2tJbXAgKmV4dHJhY3RDYWxsYmFjaywNCisgICAgSFdORCBod25kUGFyZW50ID0gTlVMTCk7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvN3ppcC9VSS9HVUkvRXh0cmFjdFJlcy5oIGIvbHptYS9DUFAvN3ppcC9VSS9HVUkvRXh0cmFjdFJlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwN2FkMTkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC83emlwL1VJL0dVSS9FeHRyYWN0UmVzLmgKQEAgLTAsMCArMSw0NCBAQAorI2RlZmluZSBJRFNfTUVNX0VSUk9SICAgICAgICAgICAgICAgICAgIDMwMDANCisNCisjZGVmaW5lIElEU19DQU5OT1RfQ1JFQVRFX0ZPTERFUiAgICAgICAgMzAwMw0KKyNkZWZpbmUgSURTX1VQREFURV9OT1RfU1VQUE9SVEVEICAgICAgICAzMDA0DQorI2RlZmluZSBJRFNfQ0FOVF9PUEVOX0FSQ0hJVkUgICAgICAgICAgIDMwMDUNCisjZGVmaW5lIElEU19DQU5UX09QRU5fRU5DUllQVEVEX0FSQ0hJVkUgMzAwNg0KKyNkZWZpbmUgSURTX1VOU1VQUE9SVEVEX0FSQ0hJVkVfVFlQRSAgICAzMDA3DQorDQorI2RlZmluZSBJRFNfUFJPR1JFU1NfRVhUUkFDVElORyAgICAgICAgIDMzMDANCisNCisjZGVmaW5lIElEU19FWFRSQUNUX1NFVF9GT0xERVIgICAgICAgICAgMzQwMg0KKw0KKyNkZWZpbmUgSURTX0VYVFJBQ1RfUEFUSFNfRlVMTCAgICAgICAgICAzNDExDQorI2RlZmluZSBJRFNfRVhUUkFDVF9QQVRIU19OTyAgICAgICAgICAgIDM0MTINCisjZGVmaW5lIElEU19FWFRSQUNUX1BBVEhTX0FCUyAgICAgICAgICAgMzQxMw0KKyNkZWZpbmUgSURTX1BBVEhfTU9ERV9SRUxBVCAgICAgICAgICAgICAzNDE0DQorDQorI2RlZmluZSBJRFNfRVhUUkFDVF9PVkVSV1JJVEVfQVNLICAgICAgICAgICAgIDM0MjENCisjZGVmaW5lIElEU19FWFRSQUNUX09WRVJXUklURV9XSVRIT1VUX1BST01QVCAgMzQyMg0KKyNkZWZpbmUgSURTX0VYVFJBQ1RfT1ZFUldSSVRFX1NLSVBfRVhJU1RJTkcgICAzNDIzDQorI2RlZmluZSBJRFNfRVhUUkFDVF9PVkVSV1JJVEVfUkVOQU1FICAgICAgICAgIDM0MjQNCisjZGVmaW5lIElEU19FWFRSQUNUX09WRVJXUklURV9SRU5BTUVfRVhJU1RJTkcgMzQyNQ0KKw0KKyNkZWZpbmUgSURTX0VYVFJBQ1RfTUVTU0FHRV9VTlNVUFBPUlRFRF9NRVRIT0QgICAgMzcwMA0KKyNkZWZpbmUgSURTX0VYVFJBQ1RfTUVTU0FHRV9EQVRBX0VSUk9SICAgICAgICAgICAgMzcwMQ0KKyNkZWZpbmUgSURTX0VYVFJBQ1RfTUVTU0FHRV9DUkNfRVJST1IgICAgICAgICAgICAgMzcwMg0KKyNkZWZpbmUgSURTX0VYVFJBQ1RfTUVTU0FHRV9EQVRBX0VSUk9SX0VOQ1JZUFRFRCAgMzcwMw0KKyNkZWZpbmUgSURTX0VYVFJBQ1RfTUVTU0FHRV9DUkNfRVJST1JfRU5DUllQVEVEICAgMzcwNA0KKw0KKyNkZWZpbmUgSURTX0VYVFJBQ1RfTVNHX1dST05HX1BTVyAgICAgICAgICAgIDM3MTANCisvLyAjZGVmaW5lIElEU19FWFRSQUNUX01TR19FTkNSWVBURUQgICAgICAgICAgICAzNzExDQorDQorI2RlZmluZSBJRFNfRVhUUkFDVF9NU0dfVU5TVVBQT1JURURfTUVUSE9EICAgMzcyMQ0KKyNkZWZpbmUgSURTX0VYVFJBQ1RfTVNHX0RBVEFfRVJST1IgICAgICAgICAgIDM3MjINCisjZGVmaW5lIElEU19FWFRSQUNUX01TR19DUkNfRVJST1IgICAgICAgICAgICAzNzIzDQorI2RlZmluZSBJRFNfRVhUUkFDVF9NU0dfVU5BVkFJTEFCTEVfREFUQSAgICAgMzcyNA0KKyNkZWZpbmUgSURTX0VYVFJBQ1RfTVNHX1VFWFBFQ1RFRF9FTkQgICAgICAgIDM3MjUNCisjZGVmaW5lIElEU19FWFRSQUNUX01TR19EQVRBX0FGVEVSX0VORCAgICAgICAzNzI2DQorI2RlZmluZSBJRFNfRVhUUkFDVF9NU0dfSVNfTk9UX0FSQyAgICAgICAgICAgMzcyNw0KKyNkZWZpbmUgSURTX0VYVFJBQ1RfTVNHX0hFQURFUlNfRVJST1IgICAgICAgIDM3MjgNCisNCisjZGVmaW5lIElEU19PUEVOX01TR19VTkFWQUlMQUJMRV9TVEFSVCAgICAgICAzNzYzDQorI2RlZmluZSBJRFNfT1BFTl9NU0dfVU5DT05GSVJNRURfU1RBUlQgICAgICAgMzc2NA0KKyNkZWZpbmUgSURTX09QRU5fTVNHX1VOU1VQUE9SVEVEX0ZFQVRVUkUgICAgIDM3NjgNCmRpZmYgLS1naXQgYS9sem1hL0NQUC83emlwL1VJL0dVSS9IYXNoR1VJLmggYi9sem1hL0NQUC83emlwL1VJL0dVSS9IYXNoR1VJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiMDY2NgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvR1VJL0hhc2hHVUkuaApAQCAtMCwwICsxLDE2IEBACisvLyBIYXNoR1VJLmgNCisNCisjaWZuZGVmIF9fSEFTSF9HVUlfSA0KKyNkZWZpbmUgX19IQVNIX0dVSV9IDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9IYXNoQ2FsYy5oIg0KKw0KK0hSRVNVTFQgSGFzaENhbGNHVUkoDQorICAgIERFQ0xfRVhURVJOQUxfQ09ERUNTX0xPQ19WQVJTDQorICAgIGNvbnN0IE5XaWxkY2FyZDo6Q0NlbnNvciAmY2Vuc29yLA0KKyAgICBjb25zdCBDSGFzaE9wdGlvbnMgJm9wdGlvbnMsDQorICAgIGJvb2wgJm1lc3NhZ2VXYXNEaXNwbGF5ZWQpOw0KKw0KK3ZvaWQgQWRkSGFzaEJ1bmRsZVJlcyhVU3RyaW5nICZzLCBjb25zdCBDSGFzaEJ1bmRsZSAmaGIsIGNvbnN0IFVTdHJpbmcgJmZpcnN0RmlsZU5hbWUpOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQLzd6aXAvVUkvR1VJL3Jlc291cmNlMi5oIGIvbHptYS9DUFAvN3ppcC9VSS9HVUkvcmVzb3VyY2UyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUyZTcxZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQLzd6aXAvVUkvR1VJL3Jlc291cmNlMi5oCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBJRFNfUFJPR1JFU1NfQ09NUFJFU1NJTkcgIDMzMDENCisjZGVmaW5lIElEU19BUkNISVZFU19DT0xPTiAgICAgICAgMzkwNw0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0J1aWxkLm1hayBiL2x6bWEvQ1BQL0J1aWxkLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGM5YzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQnVpbGQubWFrCkBAIC0wLDAgKzEsMTE5IEBACitMSUJTID0gJChMSUJTKSBvbGVhdXQzMi5saWIgb2xlMzIubGliDQorDQorIUlGTkRFRiBNWV9OT19VTklDT0RFDQorQ0ZMQUdTID0gJChDRkxBR1MpIC1EVU5JQ09ERSAtRF9VTklDT0RFDQorIUVORElGDQorDQorIyBDRkxBR1MgPSAkKENGTEFHUykgLUZBc2MgLUZhJE8vQXNtLw0KKw0KKyFJRk5ERUYgTw0KKyFJRkRFRiBDUFUNCitPPSQoQ1BVKQ0KKyFFTFNFDQorTz1PDQorIUVORElGDQorIUVORElGDQorDQorIUlGICIkKENQVSkiID09ICJBTUQ2NCINCitNWV9NTCA9IG1sNjQgLUR4NjQNCishRUxTRUlGICIkKENQVSkiID09ICJBUk0iDQorTVlfTUwgPSBhcm1hc20NCishRUxTRQ0KK01ZX01MID0gbWwNCishRU5ESUYNCisNCisNCishSUZERUYgVU5ERVJfQ0UNCitSRkxBR1MgPSAkKFJGTEFHUykgLWRVTkRFUl9DRQ0KKyFJRkRFRiBNWV9DT05TT0xFDQorTEZMQUdTID0gJChMRkxBR1MpIC9FTlRSWTptYWluQUNSVFN0YXJ0dXANCishRU5ESUYNCishRUxTRQ0KKyFJRk5ERUYgTkVXX0NPTVBJTEVSDQorTEZMQUdTID0gJChMRkxBR1MpIC1PUFQ6Tk9XSU45OA0KKyFFTkRJRg0KK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtR3INCitMSUJTID0gJChMSUJTKSB1c2VyMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYg0KKyFFTkRJRg0KKw0KKyFJRiAiJChDUFUpIiA9PSAiQVJNIg0KK0NPTVBMX0FTTSA9ICQoTVlfTUwpICQqKiAkTy8kKCpCKS5vYmoNCishRUxTRQ0KK0NPTVBMX0FTTSA9ICQoTVlfTUwpIC1jIC1GbyRPLyAkKioNCishRU5ESUYNCisNCitDRkxBR1MgPSAkKENGTEFHUykgLW5vbG9nbyAtYyAtRm8kTy8gLVc0IC1XWCAtRUhzYyAtR3kgLUdSLQ0KKw0KKyFJRkRFRiBNWV9TVEFUSUNfTElOSw0KKyFJRk5ERUYgTVlfU0lOR0xFX1RIUkVBRA0KK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtTVQNCishRU5ESUYNCishRUxTRQ0KK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtTUQNCishRU5ESUYNCisNCishSUZERUYgTkVXX0NPTVBJTEVSDQorQ0ZMQUdTID0gJChDRkxBR1MpIC1HUy0gLVpjOmZvclNjb3BlDQorIUlGTkRFRiBVTkRFUl9DRQ0KK0NGTEFHUyA9ICQoQ0ZMQUdTKSAtTVAyDQorIUVORElGDQorIUVMU0UNCitDRkxBR1MgPSAkKENGTEFHUykNCishRU5ESUYNCisNCitDRkxBR1NfTzEgPSAkKENGTEFHUykgLU8xDQorQ0ZMQUdTX08yID0gJChDRkxBR1MpIC1PMg0KKw0KK0xGTEFHUyA9ICQoTEZMQUdTKSAtbm9sb2dvIC1PUFQ6UkVGIC1PUFQ6SUNGDQorDQorIUlGTkRFRiBVTkRFUl9DRQ0KK0xGTEFHUyA9ICQoTEZMQUdTKSAvTEFSR0VBRERSRVNTQVdBUkUNCishRU5ESUYNCisNCishSUZERUYgREVGX0ZJTEUNCitMRkxBR1MgPSAkKExGTEFHUykgLURMTCAtREVGOiQoREVGX0ZJTEUpDQorIUVORElGDQorDQorTVlfU1VCX1NZU19WRVI9Ni4wDQorIUlGREVGIE1ZX0NPTlNPTEUNCisjIExGTEFHUyA9ICQoTEZMQUdTKSAvU1VCU1lTVEVNOmNvbnNvbGUsJChNWV9TVUJfU1lTX1ZFUikNCishRUxTRQ0KKyMgTEZMQUdTID0gJChMRkxBR1MpIC9TVUJTWVNURU06d2luZG93cywkKE1ZX1NVQl9TWVNfVkVSKQ0KKyFFTkRJRg0KKw0KK1BST0dQQVRIID0gJE9cJChQUk9HKQ0KKw0KK0NPTVBMX08xICAgPSAkKENDKSAkKENGTEFHU19PMSkgJCoqDQorQ09NUExfTzIgICA9ICQoQ0MpICQoQ0ZMQUdTX08yKSAkKioNCitDT01QTF9QQ0ggID0gJChDQykgJChDRkxBR1NfTzEpIC1ZYyJTdGRBZnguaCIgLUZwJE8vYS5wY2ggJCoqDQorQ09NUEwgICAgICA9ICQoQ0MpICQoQ0ZMQUdTX08xKSAtWXUiU3RkQWZ4LmgiIC1GcCRPL2EucGNoICQqKg0KKw0KK0NPTVBMQiAgICA9ICQoQ0MpICQoQ0ZMQUdTX08xKSAtWXUiU3RkQWZ4LmgiIC1GcCRPL2EucGNoICQ8DQorIyBDT01QTEJfTzIgPSAkKENDKSAkKENGTEFHU19PMikgLVl1IlN0ZEFmeC5oIiAtRnAkTy9hLnBjaCAkPA0KK0NPTVBMQl9PMiA9ICQoQ0MpICQoQ0ZMQUdTX08yKSAkPA0KKw0KK0NDT01QTF9QQ0ggID0gJChDQykgJChDRkxBR1NfTzIpIC1ZYyJQcmVjb21wLmgiIC1GcCRPL2EucGNoICQqKg0KK0NDT01QTF9VU0UgID0gJChDQykgJChDRkxBR1NfTzIpIC1ZdSJQcmVjb21wLmgiIC1GcCRPL2EucGNoICQqKg0KK0NDT01QTCAgICAgID0gJChDQykgJChDRkxBR1NfTzIpICQqKg0KK0NDT01QTEIgICAgID0gJChDQykgJChDRkxBR1NfTzIpICQ8DQorDQorDQorYWxsOiAkKFBST0dQQVRIKQ0KKw0KK2NsZWFuOg0KKwktZGVsIC9RICQoUFJPR1BBVEgpICRPXCouZXhlICRPXCouZGxsICRPXCoub2JqICRPXCoubGliICRPXCouZXhwICRPXCoucmVzICRPXCoucGNoICRPXCouYXNtDQorDQorJE86DQorCWlmIG5vdCBleGlzdCAiJE8iIG1rZGlyICIkTyINCiskTy9Bc206DQorCWlmIG5vdCBleGlzdCAiJE8vQXNtIiBta2RpciAiJE8vQXNtIg0KKw0KKyQoUFJPR1BBVEgpOiAkTyAkTy9Bc20gJChPQkpTKSAkKERFRl9GSUxFKQ0KKwlsaW5rICQoTEZMQUdTKSAtb3V0OiQoUFJPR1BBVEgpICQoT0JKUykgJChMSUJTKQ0KKw0KKyFJRk5ERUYgTk9fREVGQVVMVF9SRVMNCiskT1xyZXNvdXJjZS5yZXM6ICQoKkIpLnJjDQorCXJjICQoUkZMQUdTKSAtZm8kQCAkKioNCishRU5ESUYNCiskT1xTdGRBZngub2JqOiAkKCpCKS5jcHANCisJJChDT01QTF9QQ0gpDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvQ29tbW9uL0F1dG9QdHIuaCBiL2x6bWEvQ1BQL0NvbW1vbi9BdXRvUHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzZmI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9BdXRvUHRyLmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29tbW9uL0F1dG9QdHIuaA0KKw0KKyNpZm5kZWYgX19DT01NT05fQVVUT1BUUl9IDQorI2RlZmluZSBfX0NPTU1PTl9BVVRPUFRSX0gNCisNCit0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBDTXlBdXRvUHRyDQorew0KKyAgVCAqX3A7DQorcHVibGljOg0KKyAgQ015QXV0b1B0cihUICpwID0gMCkgOiBfcChwKSB7fQ0KKyAgQ015QXV0b1B0cihDTXlBdXRvUHRyPFQ+JiBwKTogX3AocC5yZWxlYXNlKCkpIHt9DQorICBDTXlBdXRvUHRyPFQ+JiBvcGVyYXRvcj0oQ015QXV0b1B0cjxUPiYgcCkNCisgIHsNCisgICAgcmVzZXQocC5yZWxlYXNlKCkpOw0KKyAgICByZXR1cm4gKCp0aGlzKTsNCisgIH0NCisgIH5DTXlBdXRvUHRyKCkgeyBkZWxldGUgX3A7IH0NCisgIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpfcDsgfQ0KKyAgLy8gVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICgmKip0aGlzKTsgfQ0KKyAgVCogZ2V0KCkgY29uc3QgeyByZXR1cm4gX3A7IH0NCisgIFQqIHJlbGVhc2UoKQ0KKyAgew0KKyAgICBUICp0bXAgPSBfcDsNCisgICAgX3AgPSAwOw0KKyAgICByZXR1cm4gdG1wOw0KKyAgfQ0KKyAgdm9pZCByZXNldChUKiBwID0gMCkNCisgIHsNCisgICAgaWYgKHAgIT0gX3ApDQorICAgICAgZGVsZXRlIF9wOw0KKyAgICBfcCA9IHA7DQorICB9DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vQ1JDLmNwcCBiL2x6bWEvQ1BQL0NvbW1vbi9DUkMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYzUyYzQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vQ1JDLmNwcApAQCAtMCwwICsxLDcgQEAKKy8vIENvbW1vbi9DUkMuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9DLzd6Q3JjLmgiDQorDQorc3RydWN0IENDUkNUYWJsZUluaXQgeyBDQ1JDVGFibGVJbml0KCkgeyBDcmNHZW5lcmF0ZVRhYmxlKCk7IH0gfSBnX0NSQ1RhYmxlSW5pdDsNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vQ19GaWxlSU8uY3BwIGIvbHptYS9DUFAvQ29tbW9uL0NfRmlsZUlPLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjhhNDI3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL0NfRmlsZUlPLmNwcApAQCAtMCwwICsxLDkyIEBACisvLyBDb21tb24vQ19GaWxlSU8uY3BwDQorDQorI2luY2x1ZGUgIkNfRmlsZUlPLmgiDQorDQorI2luY2x1ZGUgPGZjbnRsLmg+DQorI2lmZGVmIF9XSU4zMg0KKyNpbmNsdWRlIDxpby5oPg0KKyNlbHNlDQorI2luY2x1ZGUgPHVuaXN0ZC5oPg0KKyNlbmRpZg0KKw0KK25hbWVzcGFjZSBOQyB7DQorbmFtZXNwYWNlIE5GaWxlIHsNCituYW1lc3BhY2UgTklPIHsNCisNCitib29sIENGaWxlQmFzZTo6T3BlbkJpbmFyeShjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpDQorew0KKyAgI2lmZGVmIE9fQklOQVJZDQorICBmbGFncyB8PSBPX0JJTkFSWTsNCisgICNlbmRpZg0KKyAgQ2xvc2UoKTsNCisgIF9oYW5kbGUgPSA6Om9wZW4obmFtZSwgZmxhZ3MsIDA2NjYpOw0KKyAgcmV0dXJuIF9oYW5kbGUgIT0gLTE7DQorfQ0KKw0KK2Jvb2wgQ0ZpbGVCYXNlOjpDbG9zZSgpDQorew0KKyAgaWYgKF9oYW5kbGUgPT0gLTEpDQorICAgIHJldHVybiB0cnVlOw0KKyAgaWYgKGNsb3NlKF9oYW5kbGUpICE9IDApDQorICAgIHJldHVybiBmYWxzZTsNCisgIF9oYW5kbGUgPSAtMTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sIENGaWxlQmFzZTo6R2V0TGVuZ3RoKFVJbnQ2NCAmbGVuZ3RoKSBjb25zdA0KK3sNCisgIG9mZl90IGN1clBvcyA9IFNlZWsoMCwgU0VFS19DVVIpOw0KKyAgb2ZmX3QgbGVuZ3RoVGVtcCA9IFNlZWsoMCwgU0VFS19FTkQpOw0KKyAgU2VlayhjdXJQb3MsIFNFRUtfU0VUKTsNCisgIGxlbmd0aCA9IChVSW50NjQpbGVuZ3RoVGVtcDsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitvZmZfdCBDRmlsZUJhc2U6OlNlZWsob2ZmX3QgZGlzdGFuY2VUb01vdmUsIGludCBtb3ZlTWV0aG9kKSBjb25zdA0KK3sNCisgIHJldHVybiA6OmxzZWVrKF9oYW5kbGUsIGRpc3RhbmNlVG9Nb3ZlLCBtb3ZlTWV0aG9kKTsNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENJbkZpbGUNCisNCitib29sIENJbkZpbGU6Ok9wZW4oY29uc3QgY2hhciAqbmFtZSkNCit7DQorICByZXR1cm4gQ0ZpbGVCYXNlOjpPcGVuQmluYXJ5KG5hbWUsIE9fUkRPTkxZKTsNCit9DQorDQorYm9vbCBDSW5GaWxlOjpPcGVuU2hhcmVkKGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wpDQorew0KKyAgcmV0dXJuIE9wZW4obmFtZSk7DQorfQ0KKw0KK3NzaXplX3QgQ0luRmlsZTo6UmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkNCit7DQorICByZXR1cm4gcmVhZChfaGFuZGxlLCBkYXRhLCBzaXplKTsNCit9DQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENPdXRGaWxlDQorDQorYm9vbCBDT3V0RmlsZTo6Q3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgY3JlYXRlQWx3YXlzKQ0KK3sNCisgIGlmIChjcmVhdGVBbHdheXMpDQorICB7DQorICAgIENsb3NlKCk7DQorICAgIF9oYW5kbGUgPSA6OmNyZWF0KG5hbWUsIDA2NjYpOw0KKyAgICByZXR1cm4gX2hhbmRsZSAhPSAtMTsNCisgIH0NCisgIHJldHVybiBPcGVuQmluYXJ5KG5hbWUsIE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1dST05MWSk7DQorfQ0KKw0KK2Jvb2wgQ091dEZpbGU6Ok9wZW4oY29uc3QgY2hhciAqbmFtZSwgRFdPUkQgY3JlYXRpb25EaXNwb3NpdGlvbikNCit7DQorICByZXR1cm4gQ3JlYXRlKG5hbWUsIGZhbHNlKTsNCit9DQorDQorc3NpemVfdCBDT3V0RmlsZTo6V3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpDQorew0KKyAgcmV0dXJuIHdyaXRlKF9oYW5kbGUsIGRhdGEsIHNpemUpOw0KK30NCisNCit9fX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vQ19GaWxlSU8uaCBiL2x6bWEvQ1BQL0NvbW1vbi9DX0ZpbGVJTy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNDAwYjQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vQ19GaWxlSU8uaApAQCAtMCwwICsxLDUzIEBACisvLyBDb21tb24vQ19GaWxlSU8uaA0KKw0KKyNpZm5kZWYgX19DT01NT05fQ19GSUxFSU9fSA0KKyNkZWZpbmUgX19DT01NT05fQ19GSUxFSU9fSA0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCisNCisjaW5jbHVkZSAiTXlUeXBlcy5oIg0KKyNpbmNsdWRlICJNeVdpbmRvd3MuaCINCisNCisjaWZkZWYgX1dJTjMyDQorI2lmZGVmIF9NU0NfVkVSDQordHlwZWRlZiBzaXplX3Qgc3NpemVfdDsNCisjZW5kaWYNCisjZW5kaWYNCisNCituYW1lc3BhY2UgTkMgew0KK25hbWVzcGFjZSBORmlsZSB7DQorbmFtZXNwYWNlIE5JTyB7DQorDQorY2xhc3MgQ0ZpbGVCYXNlDQorew0KK3Byb3RlY3RlZDoNCisgIGludCBfaGFuZGxlOw0KKyAgYm9vbCBPcGVuQmluYXJ5KGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncyk7DQorcHVibGljOg0KKyAgQ0ZpbGVCYXNlKCk6IF9oYW5kbGUoLTEpIHt9Ow0KKyAgfkNGaWxlQmFzZSgpIHsgQ2xvc2UoKTsgfQ0KKyAgYm9vbCBDbG9zZSgpOw0KKyAgYm9vbCBHZXRMZW5ndGgoVUludDY0ICZsZW5ndGgpIGNvbnN0Ow0KKyAgb2ZmX3QgU2VlayhvZmZfdCBkaXN0YW5jZVRvTW92ZSwgaW50IG1vdmVNZXRob2QpIGNvbnN0Ow0KK307DQorDQorY2xhc3MgQ0luRmlsZTogcHVibGljIENGaWxlQmFzZQ0KK3sNCitwdWJsaWM6DQorICBib29sIE9wZW4oY29uc3QgY2hhciAqbmFtZSk7DQorICBib29sIE9wZW5TaGFyZWQoY29uc3QgY2hhciAqbmFtZSwgYm9vbCBzaGFyZUZvcldyaXRlKTsNCisgIHNzaXplX3QgUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7DQorfTsNCisNCitjbGFzcyBDT3V0RmlsZTogcHVibGljIENGaWxlQmFzZQ0KK3sNCitwdWJsaWM6DQorICBib29sIENyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBib29sIGNyZWF0ZUFsd2F5cyk7DQorICBib29sIE9wZW4oY29uc3QgY2hhciAqbmFtZSwgRFdPUkQgY3JlYXRpb25EaXNwb3NpdGlvbik7DQorICBzc2l6ZV90IFdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsNCit9Ow0KKw0KK319fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9Db21UcnkuaCBiL2x6bWEvQ1BQL0NvbW1vbi9Db21UcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmIzMDI5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL0NvbVRyeS5oCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvbVRyeS5oDQorDQorI2lmbmRlZiBfX0NPTV9UUllfSA0KKyNkZWZpbmUgX19DT01fVFJZX0gNCisNCisjaW5jbHVkZSAiTXlXaW5kb3dzLmgiDQorLy8gI2luY2x1ZGUgIkV4Y2VwdGlvbi5oIg0KKy8vICNpbmNsdWRlICJOZXdIYW5kbGVyLmgiDQorDQorI2RlZmluZSBDT01fVFJZX0JFR0lOIHRyeSB7DQorI2RlZmluZSBDT01fVFJZX0VORCB9IGNhdGNoKC4uLikgeyByZXR1cm4gRV9PVVRPRk1FTU9SWTsgfQ0KKyAgDQorICAvLyBjYXRjaChjb25zdCBDTmV3RXhjZXB0aW9uICYpIHsgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7IH0NCisgIC8vIGNhdGNoKGNvbnN0IENTeXN0ZW1FeGNlcHRpb24gJmUpIHsgcmV0dXJuIGUuRXJyb3JDb2RlOyB9DQorICAvLyBjYXRjaCguLi4pIHsgcmV0dXJuIEVfRkFJTDsgfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9Db21tYW5kTGluZVBhcnNlci5jcHAgYi9sem1hL0NQUC9Db21tb24vQ29tbWFuZExpbmVQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjY5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vQ29tbWFuZExpbmVQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMTk4IEBACisvLyBDb21tYW5kTGluZVBhcnNlci5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIkNvbW1hbmRMaW5lUGFyc2VyLmgiDQorDQorc3RhdGljIGJvb2wgSXNTdHJpbmcxUHJlZml4ZWRCeVN0cmluZzJfTm9DYXNlKGNvbnN0IHdjaGFyX3QgKnUsIGNvbnN0IGNoYXIgKmEpDQorew0KKyAgZm9yICg7OykNCisgIHsNCisgICAgY2hhciBjID0gKmE7DQorICAgIGlmIChjID09IDApDQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIGlmIChNeUNoYXJMb3dlcl9Bc2NpaShjKSAhPSBNeUNoYXJMb3dlcl9Bc2NpaSgqdSkpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBhKys7DQorICAgIHUrKzsNCisgIH0NCit9DQorDQorbmFtZXNwYWNlIE5Db21tYW5kTGluZVBhcnNlciB7DQorDQorYm9vbCBTcGxpdENvbW1hbmRMaW5lKGNvbnN0IFVTdHJpbmcgJnNyYywgVVN0cmluZyAmZGVzdDEsIFVTdHJpbmcgJmRlc3QyKQ0KK3sNCisgIGRlc3QxLkVtcHR5KCk7DQorICBkZXN0Mi5FbXB0eSgpOw0KKyAgYm9vbCBxdW90ZU1vZGUgPSBmYWxzZTsNCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgc3JjLkxlbigpOyBpKyspDQorICB7DQorICAgIHdjaGFyX3QgYyA9IHNyY1tpXTsNCisgICAgaWYgKChjID09IEwnICcgfHwgYyA9PSBMJ1x0JykgJiYgIXF1b3RlTW9kZSkNCisgICAgew0KKyAgICAgIGRlc3QyID0gc3JjLlB0cihpICsgMSk7DQorICAgICAgcmV0dXJuIGkgIT0gMDsNCisgICAgfQ0KKyAgICBpZiAoYyA9PSBMJ1wiJykNCisgICAgICBxdW90ZU1vZGUgPSAhcXVvdGVNb2RlOw0KKyAgICBlbHNlDQorICAgICAgZGVzdDEgKz0gYzsNCisgIH0NCisgIHJldHVybiBpICE9IDA7DQorfQ0KKw0KK3ZvaWQgU3BsaXRDb21tYW5kTGluZShjb25zdCBVU3RyaW5nICZzLCBVU3RyaW5nVmVjdG9yICZwYXJ0cykNCit7DQorICBVU3RyaW5nIHNUZW1wID0gczsNCisgIHNUZW1wLlRyaW0oKTsNCisgIHBhcnRzLkNsZWFyKCk7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBVU3RyaW5nIHMxLCBzMjsNCisgICAgaWYgKFNwbGl0Q29tbWFuZExpbmUoc1RlbXAsIHMxLCBzMikpDQorICAgICAgcGFydHMuQWRkKHMxKTsNCisgICAgaWYgKHMyLklzRW1wdHkoKSkNCisgICAgICBicmVhazsNCisgICAgc1RlbXAgPSBzMjsNCisgIH0NCit9DQorDQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtTdG9wU3dpdGNoUGFyc2luZyA9ICItLSI7DQorDQorc3RhdGljIGJvb2wgaW5saW5lIElzSXRTd2l0Y2hDaGFyKHdjaGFyX3QgYykNCit7DQorICByZXR1cm4gKGMgPT0gJy0nKTsNCit9DQorDQorQ1BhcnNlcjo6Q1BhcnNlcih1bnNpZ25lZCBudW1Td2l0Y2hlcyk6DQorICBfbnVtU3dpdGNoZXMobnVtU3dpdGNoZXMpLA0KKyAgX3N3aXRjaGVzKDApDQorew0KKyAgX3N3aXRjaGVzID0gbmV3IENTd2l0Y2hSZXN1bHRbbnVtU3dpdGNoZXNdOw0KK30NCisNCitDUGFyc2VyOjp+Q1BhcnNlcigpDQorew0KKyAgZGVsZXRlIFtdX3N3aXRjaGVzOw0KK30NCisNCisNCisvLyBpZiAocykgY29udGFpbnMgc3dpdGNoIHRoZW4gZnVuY3Rpb24gdXBkYXRlcyBzd2l0Y2ggc3RydWN0dXJlcw0KKy8vIG91dDogdHJ1ZSwgaWYgKHMpIGlzIGEgc3dpdGNoDQorYm9vbCBDUGFyc2VyOjpQYXJzZVN0cmluZyhjb25zdCBVU3RyaW5nICZzLCBjb25zdCBDU3dpdGNoRm9ybSAqc3dpdGNoRm9ybXMpDQorew0KKyAgaWYgKHMuSXNFbXB0eSgpIHx8ICFJc0l0U3dpdGNoQ2hhcihzWzBdKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKw0KKyAgdW5zaWduZWQgcG9zID0gMTsNCisgIHVuc2lnbmVkIHN3aXRjaEluZGV4ID0gMDsNCisgIGludCBtYXhMZW4gPSAtMTsNCisgIA0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IF9udW1Td2l0Y2hlczsgaSsrKQ0KKyAgew0KKyAgICBjb25zdCBjaGFyICprZXkgPSBzd2l0Y2hGb3Jtc1tpXS5LZXk7DQorICAgIHVuc2lnbmVkIHN3aXRjaExlbiA9IE15U3RyaW5nTGVuKGtleSk7DQorICAgIGlmICgoaW50KXN3aXRjaExlbiA8PSBtYXhMZW4gfHwgcG9zICsgc3dpdGNoTGVuID4gcy5MZW4oKSkNCisgICAgICBjb250aW51ZTsNCisgICAgaWYgKElzU3RyaW5nMVByZWZpeGVkQnlTdHJpbmcyX05vQ2FzZSgoY29uc3Qgd2NoYXJfdCAqKXMgKyBwb3MsIGtleSkpDQorICAgIHsNCisgICAgICBzd2l0Y2hJbmRleCA9IGk7DQorICAgICAgbWF4TGVuID0gc3dpdGNoTGVuOw0KKyAgICB9DQorICB9DQorDQorICBpZiAobWF4TGVuIDwgMCkNCisgIHsNCisgICAgRXJyb3JNZXNzYWdlID0gIlVua25vd24gc3dpdGNoOiI7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIHBvcyArPSBtYXhMZW47DQorICANCisgIENTd2l0Y2hSZXN1bHQgJnN3ID0gX3N3aXRjaGVzW3N3aXRjaEluZGV4XTsNCisgIGNvbnN0IENTd2l0Y2hGb3JtICZmb3JtID0gc3dpdGNoRm9ybXNbc3dpdGNoSW5kZXhdOw0KKyAgDQorICBpZiAoIWZvcm0uTXVsdGkgJiYgc3cuVGhlcmVJcykNCisgIHsNCisgICAgRXJyb3JNZXNzYWdlID0gIk11bHRpcGxlIGluc3RhbmNlcyBmb3Igc3dpdGNoOiI7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIHN3LlRoZXJlSXMgPSB0cnVlOw0KKw0KKyAgaW50IHJlbSA9IHMuTGVuKCkgLSBwb3M7DQorICBpZiAocmVtIDwgZm9ybS5NaW5MZW4pDQorICB7DQorICAgIEVycm9yTWVzc2FnZSA9ICJUb28gc2hvcnQgc3dpdGNoOiI7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIA0KKyAgc3cuV2l0aE1pbnVzID0gZmFsc2U7DQorICBzdy5Qb3N0Q2hhckluZGV4ID0gLTE7DQorICANCisgIHN3aXRjaCAoZm9ybS5UeXBlKQ0KKyAgew0KKyAgICBjYXNlIE5Td2l0Y2hUeXBlOjprTWludXM6DQorICAgICAgaWYgKHJlbSAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgIHN3LldpdGhNaW51cyA9IChzW3Bvc10gPT0gJy0nKTsNCisgICAgICAgIGlmIChzdy5XaXRoTWludXMpDQorICAgICAgICAgIHBvcysrOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgICANCisgICAgY2FzZSBOU3dpdGNoVHlwZTo6a0NoYXI6DQorICAgICAgaWYgKHJlbSAhPSAwKQ0KKyAgICAgIHsNCisgICAgICAgIHdjaGFyX3QgYyA9IHNbcG9zXTsNCisgICAgICAgIGlmIChjIDw9IDB4N0YpDQorICAgICAgICB7DQorICAgICAgICAgIHN3LlBvc3RDaGFySW5kZXggPSBGaW5kQ2hhclBvc0luU3RyaW5nKGZvcm0uUG9zdENoYXJTZXQsIChjaGFyKWMpOw0KKyAgICAgICAgICBpZiAoc3cuUG9zdENoYXJJbmRleCA+PSAwKQ0KKyAgICAgICAgICAgIHBvcysrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgICANCisgICAgY2FzZSBOU3dpdGNoVHlwZTo6a1N0cmluZzoNCisgICAgICBzdy5Qb3N0U3RyaW5ncy5BZGQoKGNvbnN0IHdjaGFyX3QgKilzICsgcG9zKTsNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIGlmIChwb3MgIT0gcy5MZW4oKSkNCisgIHsNCisgICAgRXJyb3JNZXNzYWdlID0gIlRvbyBsb25nIHN3aXRjaDoiOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBDUGFyc2VyOjpQYXJzZVN0cmluZ3MoY29uc3QgQ1N3aXRjaEZvcm0gKnN3aXRjaEZvcm1zLCBjb25zdCBVU3RyaW5nVmVjdG9yICZjb21tYW5kU3RyaW5ncykNCit7DQorICBFcnJvckxpbmUuRW1wdHkoKTsNCisgIGJvb2wgc3RvcFN3aXRjaCA9IGZhbHNlOw0KKyAgRk9SX1ZFQ1RPUiAoaSwgY29tbWFuZFN0cmluZ3MpDQorICB7DQorICAgIGNvbnN0IFVTdHJpbmcgJnMgPSBjb21tYW5kU3RyaW5nc1tpXTsNCisgICAgaWYgKCFzdG9wU3dpdGNoKQ0KKyAgICB7DQorICAgICAgaWYgKHMuSXNFcXVhbFRvKGtTdG9wU3dpdGNoUGFyc2luZykpDQorICAgICAgew0KKyAgICAgICAgc3RvcFN3aXRjaCA9IHRydWU7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKCFzLklzRW1wdHkoKSAmJiBJc0l0U3dpdGNoQ2hhcihzWzBdKSkNCisgICAgICB7DQorICAgICAgICBpZiAoUGFyc2VTdHJpbmcocywgc3dpdGNoRm9ybXMpKQ0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIEVycm9yTGluZSA9IHM7DQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgfQ0KKyAgICB9DQorICAgIE5vblN3aXRjaFN0cmluZ3MuQWRkKHMpOw0KKyAgfQ0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vQ29tbWFuZExpbmVQYXJzZXIuaCBiL2x6bWEvQ1BQL0NvbW1vbi9Db21tYW5kTGluZVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NjYxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vQ29tbWFuZExpbmVQYXJzZXIuaApAQCAtMCwwICsxLDYzIEBACisvLyBDb21tb24vQ29tbWFuZExpbmVQYXJzZXIuaA0KKw0KKyNpZm5kZWYgX19DT01NT05fQ09NTUFORF9MSU5FX1BBUlNFUl9IDQorI2RlZmluZSBfX0NPTU1PTl9DT01NQU5EX0xJTkVfUEFSU0VSX0gNCisNCisjaW5jbHVkZSAiTXlTdHJpbmcuaCINCisNCituYW1lc3BhY2UgTkNvbW1hbmRMaW5lUGFyc2VyIHsNCisNCitib29sIFNwbGl0Q29tbWFuZExpbmUoY29uc3QgVVN0cmluZyAmc3JjLCBVU3RyaW5nICZkZXN0MSwgVVN0cmluZyAmZGVzdDIpOw0KK3ZvaWQgU3BsaXRDb21tYW5kTGluZShjb25zdCBVU3RyaW5nICZzLCBVU3RyaW5nVmVjdG9yICZwYXJ0cyk7DQorDQorbmFtZXNwYWNlIE5Td2l0Y2hUeXBlDQorew0KKyAgZW51bSBFRW51bQ0KKyAgew0KKyAgICBrU2ltcGxlLA0KKyAgICBrTWludXMsDQorICAgIGtTdHJpbmcsDQorICAgIGtDaGFyDQorICB9Ow0KK30NCisNCitzdHJ1Y3QgQ1N3aXRjaEZvcm0NCit7DQorICBjb25zdCBjaGFyICpLZXk7DQorICBCeXRlIFR5cGU7DQorICBib29sIE11bHRpOw0KKyAgQnl0ZSBNaW5MZW47DQorICAvLyBpbnQgTWF4TGVuOw0KKyAgY29uc3QgY2hhciAqUG9zdENoYXJTZXQ7DQorfTsNCisNCitzdHJ1Y3QgQ1N3aXRjaFJlc3VsdA0KK3sNCisgIGJvb2wgVGhlcmVJczsNCisgIGJvb2wgV2l0aE1pbnVzOw0KKyAgaW50IFBvc3RDaGFySW5kZXg7DQorICBVU3RyaW5nVmVjdG9yIFBvc3RTdHJpbmdzOw0KKyAgDQorICBDU3dpdGNoUmVzdWx0KCk6IFRoZXJlSXMoZmFsc2UpIHt9Ow0KK307DQorICANCitjbGFzcyBDUGFyc2VyDQorew0KKyAgdW5zaWduZWQgX251bVN3aXRjaGVzOw0KKyAgQ1N3aXRjaFJlc3VsdCAqX3N3aXRjaGVzOw0KKw0KKyAgYm9vbCBQYXJzZVN0cmluZyhjb25zdCBVU3RyaW5nICZzLCBjb25zdCBDU3dpdGNoRm9ybSAqc3dpdGNoRm9ybXMpOw0KK3B1YmxpYzoNCisgIFVTdHJpbmdWZWN0b3IgTm9uU3dpdGNoU3RyaW5nczsNCisgIEFTdHJpbmcgRXJyb3JNZXNzYWdlOw0KKyAgVVN0cmluZyBFcnJvckxpbmU7DQorICANCisgIENQYXJzZXIodW5zaWduZWQgbnVtU3dpdGNoZXMpOw0KKyAgfkNQYXJzZXIoKTsNCisgIGJvb2wgUGFyc2VTdHJpbmdzKGNvbnN0IENTd2l0Y2hGb3JtICpzd2l0Y2hGb3JtcywgY29uc3QgVVN0cmluZ1ZlY3RvciAmY29tbWFuZFN0cmluZ3MpOw0KKyAgY29uc3QgQ1N3aXRjaFJlc3VsdCYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIF9zd2l0Y2hlc1tpbmRleF07IH0NCit9Ow0KKw0KK30NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vQ29tbW9uLmggYi9sem1hL0NQUC9Db21tb24vQ29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5OTA3NwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9Db21tb24uaApAQCAtMCwwICsxLDEzIEBACisvLyBDb21tb24uaA0KKw0KKyNpZm5kZWYgX19DT01NT05fQ09NTU9OX0gNCisjZGVmaW5lIF9fQ09NTU9OX0NPTU1PTl9IDQorDQorI2luY2x1ZGUgIi4uLy4uL0MvQ29tcGlsZXIuaCINCisNCisjaW5jbHVkZSAiTXlXaW5kb3dzLmgiDQorI2luY2x1ZGUgIk5ld0hhbmRsZXIuaCINCisNCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZigoYSlbMV0pKQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9DcmNSZWcuY3BwIGIvbHptYS9DUFAvQ29tbW9uL0NyY1JlZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhMTk5NgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9DcmNSZWcuY3BwCkBAIC0wLDAgKzEsMTExIEBACisvLyBDcmNSZWcuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9DLzd6Q3JjLmgiDQorI2luY2x1ZGUgIi4uLy4uL0MvQ3B1QXJjaC5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlDb20uaCINCisNCisjaW5jbHVkZSAiLi4vN3ppcC9JQ29kZXIuaCINCisjaW5jbHVkZSAiLi4vN3ppcC9Db21tb24vUmVnaXN0ZXJDb2RlYy5oIg0KKw0KK0VYVEVSTl9DX0JFR0lODQorDQordHlwZWRlZiBVSW50MzIgKE1ZX0ZBU1RfQ0FMTCAqQ1JDX0ZVTkMpKFVJbnQzMiB2LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgY29uc3QgVUludDMyICp0YWJsZSk7DQorDQorZXh0ZXJuIENSQ19GVU5DIGdfQ3JjVXBkYXRlOw0KKw0KKyNpZmRlZiBNWV9DUFVfWDg2X09SX0FNRDY0DQorICBVSW50MzIgTVlfRkFTVF9DQUxMIENyY1VwZGF0ZVQ4KFVJbnQzMiB2LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgY29uc3QgVUludDMyICp0YWJsZSk7DQorI2VuZGlmDQorDQorI2lmbmRlZiBNWV9DUFVfQkUNCisgIFVJbnQzMiBNWV9GQVNUX0NBTEwgQ3JjVXBkYXRlVDQoVUludDMyIHYsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBjb25zdCBVSW50MzIgKnRhYmxlKTsNCisjZW5kaWYNCisNCitFWFRFUk5fQ19FTkQNCisNCitjbGFzcyBDQ3JjSGFzaGVyOg0KKyAgcHVibGljIElIYXNoZXIsDQorICBwdWJsaWMgSUNvbXByZXNzU2V0Q29kZXJQcm9wZXJ0aWVzLA0KKyAgcHVibGljIENNeVVua25vd25JbXANCit7DQorICBVSW50MzIgX2NyYzsNCisgIENSQ19GVU5DIF91cGRhdGVGdW5jOw0KKyAgYm9vbCBTZXRGdW5jdGlvbnMoVUludDMyIHRTaXplKTsNCitwdWJsaWM6DQorICBDQ3JjSGFzaGVyKCk6IF9jcmMoQ1JDX0lOSVRfVkFMKSB7IFNldEZ1bmN0aW9ucygwKTsgfQ0KKw0KKyAgTVlfVU5LTk9XTl9JTVAxKElDb21wcmVzc1NldENvZGVyUHJvcGVydGllcykNCisNCisgIFNURE1FVEhPRF8odm9pZCwgSW5pdCkoKTsNCisgIFNURE1FVEhPRF8odm9pZCwgVXBkYXRlKShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSk7DQorICBTVERNRVRIT0RfKHZvaWQsIEZpbmFsKShCeXRlICpkaWdlc3QpOw0KKyAgU1RETUVUSE9EXyhVSW50MzIsIEdldERpZ2VzdFNpemUpKCk7DQorICBTVERNRVRIT0QoU2V0Q29kZXJQcm9wZXJ0aWVzKShjb25zdCBQUk9QSUQgKnByb3BJRHMsIGNvbnN0IFBST1BWQVJJQU5UICpwcm9wcywgVUludDMyIG51bVByb3BzKTsNCit9Ow0KKw0KK1NURE1FVEhPRElNUF8odm9pZCkgQ0NyY0hhc2hlcjo6SW5pdCgpDQorew0KKyAgX2NyYyA9IENSQ19JTklUX1ZBTDsNCit9DQorDQorU1RETUVUSE9ESU1QXyh2b2lkKSBDQ3JjSGFzaGVyOjpVcGRhdGUoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUpDQorew0KKyAgX2NyYyA9IF91cGRhdGVGdW5jKF9jcmMsIGRhdGEsIHNpemUsIGdfQ3JjVGFibGUpOw0KK30NCisNCitTVERNRVRIT0RJTVBfKHZvaWQpIENDcmNIYXNoZXI6OkZpbmFsKEJ5dGUgKmRpZ2VzdCkNCit7DQorICBVSW50MzIgdmFsID0gQ1JDX0dFVF9ESUdFU1QoX2NyYyk7DQorICBTZXRVaTMyKGRpZ2VzdCwgdmFsKTsNCit9DQorDQorU1RETUVUSE9ESU1QXyhVSW50MzIpIENDcmNIYXNoZXI6OkdldERpZ2VzdFNpemUoKQ0KK3sNCisgIHJldHVybiA0Ow0KK30NCisNCitib29sIENDcmNIYXNoZXI6OlNldEZ1bmN0aW9ucyhVSW50MzIgdFNpemUpDQorew0KKyAgX3VwZGF0ZUZ1bmMgPSBnX0NyY1VwZGF0ZTsNCisgIGlmICh0U2l6ZSA9PSA0KQ0KKyAgew0KKyAgICAjaWZuZGVmIE1ZX0NQVV9CRQ0KKyAgICBfdXBkYXRlRnVuYyA9IENyY1VwZGF0ZVQ0Ow0KKyAgICAjZW5kaWYNCisgIH0NCisgIGVsc2UgaWYgKHRTaXplID09IDgpDQorICB7DQorICAgICNpZmRlZiBNWV9DUFVfWDg2X09SX0FNRDY0DQorICAgICAgX3VwZGF0ZUZ1bmMgPSBDcmNVcGRhdGVUODsNCisgICAgI2Vsc2UNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgICNlbmRpZg0KKyAgfQ0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK1NURE1FVEhPRElNUCBDQ3JjSGFzaGVyOjpTZXRDb2RlclByb3BlcnRpZXMoY29uc3QgUFJPUElEICpwcm9wSURzLA0KKyAgICBjb25zdCBQUk9QVkFSSUFOVCAqY29kZXJQcm9wcywgVUludDMyIG51bVByb3BzKQ0KK3sNCisgIGZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtUHJvcHM7IGkrKykNCisgIHsNCisgICAgY29uc3QgUFJPUFZBUklBTlQgJnByb3AgPSBjb2RlclByb3BzW2ldOw0KKyAgICBpZiAocHJvcElEc1tpXSA9PSBOQ29kZXJQcm9wSUQ6OmtEZWZhdWx0UHJvcCkNCisgICAgew0KKyAgICAgIGlmIChwcm9wLnZ0ICE9IFZUX1VJNCkNCisgICAgICAgIHJldHVybiBFX0lOVkFMSURBUkc7DQorICAgICAgaWYgKCFTZXRGdW5jdGlvbnMocHJvcC51bFZhbCkpDQorICAgICAgICByZXR1cm4gRV9OT1RJTVBMOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gU19PSzsNCit9DQorDQorc3RhdGljIElIYXNoZXIgKkNyZWF0ZUhhc2hlcigpIHsgcmV0dXJuIG5ldyBDQ3JjSGFzaGVyKCk7IH0NCisNCitzdGF0aWMgQ0hhc2hlckluZm8gZ19IYXNoZXJJbmZvID0geyBDcmVhdGVIYXNoZXIsIDB4MSwgTCJDUkMzMiIsIDQgfTsNCisNCitSRUdJU1RFUl9IQVNIRVIoQ3JjMzIpDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvQ29tbW9uL0RlZnMuaCBiL2x6bWEvQ1BQL0NvbW1vbi9EZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliOGVjZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9EZWZzLmgKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29tbW9uL0RlZnMuaA0KKw0KKyNpZm5kZWYgX19DT01NT05fREVGU19IDQorI2RlZmluZSBfX0NPTU1PTl9ERUZTX0gNCisNCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIFQgTXlNaW4oVCBhLCBUIGIpDQorICB7ICByZXR1cm4gYSA8IGIgPyBhIDogYjsgfQ0KK3RlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgVCBNeU1heChUIGEsIFQgYikNCisgIHsgIHJldHVybiBhID4gYiA/IGEgOiBiOyB9DQorDQordGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBpbnQgTXlDb21wYXJlKFQgYSwgVCBiKQ0KKyAgeyAgcmV0dXJuIGEgPCBiID8gLTEgOiAoYSA9PSBiID8gMCA6IDEpOyB9DQorDQoraW5saW5lIGludCBCb29sVG9JbnQoYm9vbCB2YWx1ZSkNCisgIHsgcmV0dXJuICh2YWx1ZSA/IDE6IDApOyB9DQorDQoraW5saW5lIGJvb2wgSW50VG9Cb29sKGludCB2YWx1ZSkNCisgIHsgcmV0dXJuICh2YWx1ZSAhPSAwKTsgfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9EeW5hbWljQnVmZmVyLmggYi9sem1hL0NQUC9Db21tb24vRHluYW1pY0J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYWJmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vRHluYW1pY0J1ZmZlci5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvbW1vbi9EeW5hbWljQnVmZmVyLmgNCisNCisjaWZuZGVmIF9fQ09NTU9OX0RZTkFNSUNfQlVGRkVSX0gNCisjZGVmaW5lIF9fQ09NTU9OX0RZTkFNSUNfQlVGRkVSX0gNCisNCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgQ0R5bmFtaWNCdWZmZXINCit7DQorICBUICpfaXRlbXM7DQorICBzaXplX3QgX3NpemU7DQorICBzaXplX3QgX3BvczsNCisNCisgIENEeW5hbWljQnVmZmVyKGNvbnN0IENEeW5hbWljQnVmZmVyICZidWZmZXIpOw0KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ0R5bmFtaWNCdWZmZXIgJmJ1ZmZlcik7DQorDQorICB2b2lkIEdyb3coc2l6ZV90IHNpemUpDQorICB7DQorICAgIHNpemVfdCBkZWx0YSA9IF9zaXplID49IDY0ID8gX3NpemUgOiA2NDsNCisgICAgaWYgKGRlbHRhIDwgc2l6ZSkNCisgICAgICBkZWx0YSA9IHNpemU7DQorICAgIHNpemVfdCBuZXdDYXAgPSBfc2l6ZSArIGRlbHRhOw0KKyAgICBpZiAobmV3Q2FwIDwgZGVsdGEpDQorICAgIHsNCisgICAgICBuZXdDYXAgPSBfc2l6ZSArIHNpemU7DQorICAgICAgaWYgKG5ld0NhcCA8IHNpemUpDQorICAgICAgICB0aHJvdyAyMDEyMDExNjsNCisgICAgfQ0KKw0KKyAgICBUICpuZXdCdWZmZXIgPSBuZXcgVFtuZXdDYXBdOw0KKyAgICBtZW1jcHkobmV3QnVmZmVyLCBfaXRlbXMsIF9wb3MgKiBzaXplb2YoVCkpOw0KKyAgICBkZWxldGUgW11faXRlbXM7DQorICAgIF9pdGVtcyA9IG5ld0J1ZmZlcjsNCisgICAgX3NpemUgPSBuZXdDYXA7DQorICB9DQorDQorcHVibGljOg0KKyAgQ0R5bmFtaWNCdWZmZXIoKTogX2l0ZW1zKDApLCBfc2l6ZSgwKSwgX3BvcygwKSB7fQ0KKyAgLy8gb3BlcmF0b3IgVCAqKCkgeyByZXR1cm4gX2l0ZW1zOyB9Ow0KKyAgb3BlcmF0b3IgY29uc3QgVCAqKCkgY29uc3QgeyByZXR1cm4gX2l0ZW1zOyB9Ow0KKyAgfkNEeW5hbWljQnVmZmVyKCkgeyBkZWxldGUgW11faXRlbXM7IH0NCisNCisgIFQgKkdldEN1clB0ckFuZEdyb3coc2l6ZV90IGFkZFNpemUpDQorICB7DQorICAgIHNpemVfdCByZW0gPSBfc2l6ZSAtIF9wb3M7DQorICAgIGlmIChyZW0gPCBhZGRTaXplKQ0KKyAgICAgIEdyb3coYWRkU2l6ZSAtIHJlbSk7DQorICAgIFQgKnJlcyA9IF9pdGVtcyArIF9wb3M7DQorICAgIF9wb3MgKz0gYWRkU2l6ZTsNCisgICAgcmV0dXJuIHJlczsNCisgIH0NCisNCisgIGNvbnN0IHNpemVfdCBHZXRQb3MoKSBjb25zdCB7IHJldHVybiBfcG9zOyB9DQorDQorICAvLyB2b2lkIEVtcHR5KCkgeyBfcG9zID0gMDsgfQ0KK307DQorDQordHlwZWRlZiBDRHluYW1pY0J1ZmZlcjx1bnNpZ25lZCBjaGFyPiBDQnl0ZUR5bmFtaWNCdWZmZXI7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvQ29tbW9uL0ludFRvU3RyaW5nLmNwcCBiL2x6bWEvQ1BQL0NvbW1vbi9JbnRUb1N0cmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzNTExNQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9JbnRUb1N0cmluZy5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKy8vIENvbW1vbi9JbnRUb1N0cmluZy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIkludFRvU3RyaW5nLmgiDQorDQorI2RlZmluZSBDT05WRVJUX0lOVF9UT19TVFIoY2hhclR5cGUsIHRlbXBTaXplKSBcDQorICB1bnNpZ25lZCBjaGFyIHRlbXBbdGVtcFNpemVdOyB1bnNpZ25lZCBpID0gMDsgXA0KKyAgd2hpbGUgKHZhbCA+PSAxMCkgeyB0ZW1wW2krK10gPSAodW5zaWduZWQgY2hhcikoJzAnICsgKHVuc2lnbmVkKSh2YWwgJSAxMCkpOyB2YWwgLz0gMTA7IH0gXA0KKyAgKnMrKyA9IChjaGFyVHlwZSkoJzAnICsgKHVuc2lnbmVkKXZhbCk7IFwNCisgIHdoaWxlIChpICE9IDApIHsgaS0tOyAqcysrID0gdGVtcFtpXTsgfSBcDQorICAqcyA9IDA7DQorDQordm9pZCBDb252ZXJ0VUludDMyVG9TdHJpbmcoVUludDMyIHZhbCwgY2hhciAqcykgdGhyb3coKQ0KK3sNCisgIENPTlZFUlRfSU5UX1RPX1NUUihjaGFyLCAxNik7DQorfQ0KKw0KK3ZvaWQgQ29udmVydFVJbnQ2NFRvU3RyaW5nKFVJbnQ2NCB2YWwsIGNoYXIgKnMpIHRocm93KCkNCit7DQorICBpZiAodmFsIDw9IChVSW50MzIpMHhGRkZGRkZGRikNCisgIHsNCisgICAgQ29udmVydFVJbnQzMlRvU3RyaW5nKChVSW50MzIpdmFsLCBzKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ09OVkVSVF9JTlRfVE9fU1RSKGNoYXIsIDI0KTsNCit9DQorDQordm9pZCBDb252ZXJ0VUludDY0VG9PY3QoVUludDY0IHZhbCwgY2hhciAqcykgdGhyb3coKQ0KK3sNCisgIFVJbnQ2NCB2ID0gdmFsOw0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDE7OyBpKyspDQorICB7DQorICAgIHYgPj49IDM7DQorICAgIGlmICh2ID09IDApDQorICAgICAgYnJlYWs7DQorICB9DQorICBzW2ldID0gMDsNCisgIGRvDQorICB7DQorICAgIHVuc2lnbmVkIHQgPSAodW5zaWduZWQpKHZhbCAmIDB4Nyk7DQorICAgIHZhbCA+Pj0gMzsNCisgICAgc1stLWldID0gKGNoYXIpKCcwJyArIHQpOw0KKyAgfQ0KKyAgd2hpbGUgKGkpOw0KK30NCisNCit2b2lkIENvbnZlcnRVSW50MzJUb0hleChVSW50MzIgdmFsLCBjaGFyICpzKSB0aHJvdygpDQorew0KKyAgVUludDMyIHYgPSB2YWw7DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMTs7IGkrKykNCisgIHsNCisgICAgdiA+Pj0gNDsNCisgICAgaWYgKHYgPT0gMCkNCisgICAgICBicmVhazsNCisgIH0NCisgIHNbaV0gPSAwOw0KKyAgZG8NCisgIHsNCisgICAgdW5zaWduZWQgdCA9ICh1bnNpZ25lZCkoKHZhbCAmIDB4RikpOw0KKyAgICB2YWwgPj49IDQ7DQorICAgIHNbLS1pXSA9IChjaGFyKSgodCA8IDEwKSA/ICgnMCcgKyB0KSA6ICgnQScgKyAodCAtIDEwKSkpOw0KKyAgfQ0KKyAgd2hpbGUgKGkpOw0KK30NCisNCit2b2lkIENvbnZlcnRVSW50NjRUb0hleChVSW50NjQgdmFsLCBjaGFyICpzKSB0aHJvdygpDQorew0KKyAgVUludDY0IHYgPSB2YWw7DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMTs7IGkrKykNCisgIHsNCisgICAgdiA+Pj0gNDsNCisgICAgaWYgKHYgPT0gMCkNCisgICAgICBicmVhazsNCisgIH0NCisgIHNbaV0gPSAwOw0KKyAgZG8NCisgIHsNCisgICAgdW5zaWduZWQgdCA9ICh1bnNpZ25lZCkoKHZhbCAmIDB4RikpOw0KKyAgICB2YWwgPj49IDQ7DQorICAgIHNbLS1pXSA9IChjaGFyKSgodCA8IDEwKSA/ICgnMCcgKyB0KSA6ICgnQScgKyAodCAtIDEwKSkpOw0KKyAgfQ0KKyAgd2hpbGUgKGkpOw0KK30NCisNCit2b2lkIENvbnZlcnRVSW50MzJUb0hleDhEaWdpdHMoVUludDMyIHZhbCwgY2hhciAqcykgdGhyb3coKQ0KK3sNCisgIHNbOF0gPSAwOw0KKyAgZm9yIChpbnQgaSA9IDc7IGkgPj0gMDsgaS0tKQ0KKyAgew0KKyAgICB1bnNpZ25lZCB0ID0gdmFsICYgMHhGOw0KKyAgICB2YWwgPj49IDQ7DQorICAgIHNbaV0gPSAoY2hhcikoKCh0IDwgMTApID8gKCcwJyArIHQpIDogKCdBJyArICh0IC0gMTApKSkpOw0KKyAgfQ0KK30NCisNCisvKg0KK3ZvaWQgQ29udmVydFVJbnQzMlRvSGV4OERpZ2l0cyhVSW50MzIgdmFsLCB3Y2hhcl90ICpzKQ0KK3sNCisgIHNbOF0gPSAwOw0KKyAgZm9yIChpbnQgaSA9IDc7IGkgPj0gMDsgaS0tKQ0KKyAgew0KKyAgICB1bnNpZ25lZCB0ID0gdmFsICYgMHhGOw0KKyAgICB2YWwgPj49IDQ7DQorICAgIHNbaV0gPSAod2NoYXJfdCkoKCh0IDwgMTApID8gKCcwJyArIHQpIDogKCdBJyArICh0IC0gMTApKSkpOw0KKyAgfQ0KK30NCisqLw0KKw0KK3ZvaWQgQ29udmVydFVJbnQzMlRvU3RyaW5nKFVJbnQzMiB2YWwsIHdjaGFyX3QgKnMpIHRocm93KCkNCit7DQorICBDT05WRVJUX0lOVF9UT19TVFIod2NoYXJfdCwgMTYpOw0KK30NCisNCit2b2lkIENvbnZlcnRVSW50NjRUb1N0cmluZyhVSW50NjQgdmFsLCB3Y2hhcl90ICpzKSB0aHJvdygpDQorew0KKyAgaWYgKHZhbCA8PSAoVUludDMyKTB4RkZGRkZGRkYpDQorICB7DQorICAgIENvbnZlcnRVSW50MzJUb1N0cmluZygoVUludDMyKXZhbCwgcyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIENPTlZFUlRfSU5UX1RPX1NUUih3Y2hhcl90LCAyNCk7DQorfQ0KKw0KK3ZvaWQgQ29udmVydEludDY0VG9TdHJpbmcoSW50NjQgdmFsLCBjaGFyICpzKSB0aHJvdygpDQorew0KKyAgaWYgKHZhbCA8IDApDQorICB7DQorICAgICpzKysgPSAnLSc7DQorICAgIHZhbCA9IC12YWw7DQorICB9DQorICBDb252ZXJ0VUludDY0VG9TdHJpbmcodmFsLCBzKTsNCit9DQorDQordm9pZCBDb252ZXJ0SW50NjRUb1N0cmluZyhJbnQ2NCB2YWwsIHdjaGFyX3QgKnMpIHRocm93KCkNCit7DQorICBpZiAodmFsIDwgMCkNCisgIHsNCisgICAgKnMrKyA9IEwnLSc7DQorICAgIHZhbCA9IC12YWw7DQorICB9DQorICBDb252ZXJ0VUludDY0VG9TdHJpbmcodmFsLCBzKTsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvQ29tbW9uL0ludFRvU3RyaW5nLmggYi9sem1hL0NQUC9Db21tb24vSW50VG9TdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzUwOTM0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL0ludFRvU3RyaW5nLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29tbW9uL0ludFRvU3RyaW5nLmgNCisNCisjaWZuZGVmIF9fQ09NTU9OX0lOVF9UT19TVFJJTkdfSA0KKyNkZWZpbmUgX19DT01NT05fSU5UX1RPX1NUUklOR19IDQorDQorI2luY2x1ZGUgIk15VHlwZXMuaCINCisNCit2b2lkIENvbnZlcnRVSW50MzJUb1N0cmluZyhVSW50MzIgdmFsdWUsIGNoYXIgKnMpIHRocm93KCk7DQordm9pZCBDb252ZXJ0VUludDY0VG9TdHJpbmcoVUludDY0IHZhbHVlLCBjaGFyICpzKSB0aHJvdygpOw0KKw0KK3ZvaWQgQ29udmVydFVJbnQzMlRvU3RyaW5nKFVJbnQzMiB2YWx1ZSwgd2NoYXJfdCAqcykgdGhyb3coKTsNCit2b2lkIENvbnZlcnRVSW50NjRUb1N0cmluZyhVSW50NjQgdmFsdWUsIHdjaGFyX3QgKnMpIHRocm93KCk7DQorDQordm9pZCBDb252ZXJ0VUludDY0VG9PY3QoVUludDY0IHZhbHVlLCBjaGFyICpzKSB0aHJvdygpOw0KKw0KK3ZvaWQgQ29udmVydFVJbnQzMlRvSGV4KFVJbnQzMiB2YWx1ZSwgY2hhciAqcykgdGhyb3coKTsNCit2b2lkIENvbnZlcnRVSW50NjRUb0hleChVSW50NjQgdmFsdWUsIGNoYXIgKnMpIHRocm93KCk7DQordm9pZCBDb252ZXJ0VUludDMyVG9IZXg4RGlnaXRzKFVJbnQzMiB2YWx1ZSwgY2hhciAqcykgdGhyb3coKTsNCisvLyB2b2lkIENvbnZlcnRVSW50MzJUb0hleDhEaWdpdHMoVUludDMyIHZhbHVlLCB3Y2hhcl90ICpzKSB0aHJvdygpOw0KKw0KK3ZvaWQgQ29udmVydEludDY0VG9TdHJpbmcoSW50NjQgdmFsdWUsIGNoYXIgKnMpIHRocm93KCk7DQordm9pZCBDb252ZXJ0SW50NjRUb1N0cmluZyhJbnQ2NCB2YWx1ZSwgd2NoYXJfdCAqcykgdGhyb3coKTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vTGFuZy5oIGIvbHptYS9DUFAvQ29tbW9uL0xhbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODUwZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL0xhbmcuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb21tb24vTGFuZy5oDQorDQorI2lmbmRlZiBfX0NPTU1PTl9MQU5HX0gNCisjZGVmaW5lIF9fQ09NTU9OX0xBTkdfSA0KKw0KKyNpbmNsdWRlICJNeVN0cmluZy5oIg0KKw0KK2NsYXNzIENMYW5nDQorew0KKyAgd2NoYXJfdCAqX3RleHQ7DQorICBDUmVjb3JkVmVjdG9yPFVJbnQzMj4gX2lkczsNCisgIENSZWNvcmRWZWN0b3I8VUludDMyPiBfb2Zmc2V0czsNCisNCisgIGJvb2wgT3BlbkZyb21TdHJpbmcoY29uc3QgQVN0cmluZyAmcyk7DQorcHVibGljOg0KKyAgQ0xhbmcoKTogX3RleHQoMCkge30NCisgIH5DTGFuZygpIHsgQ2xlYXIoKTsgfTsNCisgIGJvb2wgT3BlbihDRlNUUiBmaWxlTmFtZSwgY29uc3Qgd2NoYXJfdCAqaWQpOw0KKyAgdm9pZCBDbGVhcigpIHRocm93KCk7DQorICBjb25zdCB3Y2hhcl90ICpHZXQoVUludDMyIGlkKSBjb25zdCB0aHJvdygpOw0KK307DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvQ29tbW9uL0xpc3RGaWxlVXRpbHMuY3BwIGIvbHptYS9DUFAvQ29tbW9uL0xpc3RGaWxlVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTgwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vTGlzdEZpbGVVdGlscy5jcHAKQEAgLTAsMCArMSwxMTcgQEAKKy8vIENvbW1vbi9MaXN0RmlsZVV0aWxzLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQy9DcHVBcmNoLmgiDQorDQorI2luY2x1ZGUgIi4uL1dpbmRvd3MvRmlsZUlPLmgiDQorDQorI2luY2x1ZGUgIkxpc3RGaWxlVXRpbHMuaCINCisjaW5jbHVkZSAiTXlCdWZmZXIuaCINCisjaW5jbHVkZSAiU3RyaW5nQ29udmVydC5oIg0KKyNpbmNsdWRlICJVVEZDb252ZXJ0LmgiDQorDQorc3RhdGljIGNvbnN0IGNoYXIga1F1b3RlQ2hhciA9ICdcIic7DQorDQorc3RhdGljIHZvaWQgQWRkTmFtZShVU3RyaW5nVmVjdG9yICZzdHJpbmdzLCBVU3RyaW5nICZzKQ0KK3sNCisgIHMuVHJpbSgpOw0KKyAgaWYgKHMuTGVuKCkgPj0gMiAmJiBzWzBdID09IGtRdW90ZUNoYXIgJiYgcy5CYWNrKCkgPT0ga1F1b3RlQ2hhcikNCisgIHsNCisgICAgcy5EZWxldGVCYWNrKCk7DQorICAgIHMuRGVsZXRlKDApOw0KKyAgfQ0KKyAgaWYgKCFzLklzRW1wdHkoKSkNCisgICAgc3RyaW5ncy5BZGQocyk7DQorfQ0KKw0KK2Jvb2wgUmVhZE5hbWVzRnJvbUxpc3RGaWxlKENGU1RSIGZpbGVOYW1lLCBVU3RyaW5nVmVjdG9yICZzdHJpbmdzLCBVSU5UIGNvZGVQYWdlKQ0KK3sNCisgIE5XaW5kb3dzOjpORmlsZTo6TklPOjpDSW5GaWxlIGZpbGU7DQorICBpZiAoIWZpbGUuT3BlbihmaWxlTmFtZSkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIFVJbnQ2NCBmaWxlU2l6ZTsNCisgIGlmICghZmlsZS5HZXRMZW5ndGgoZmlsZVNpemUpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBpZiAoZmlsZVNpemUgPj0gKChVSW50MzIpMSA8PCAzMSkgLSAzMikNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgVVN0cmluZyB1Ow0KKyAgaWYgKGNvZGVQYWdlID09IE1ZX19DUF9VVEYxNiB8fCBjb2RlUGFnZSA9PSBNWV9fQ1BfVVRGMTZCRSkNCisgIHsNCisgICAgaWYgKChmaWxlU2l6ZSAmIDEpICE9IDApDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBDQnl0ZUFyciBidWYoKHNpemVfdClmaWxlU2l6ZSk7DQorICAgIFVJbnQzMiBwcm9jZXNzZWQ7DQorICAgIGlmICghZmlsZS5SZWFkKGJ1ZiwgKFVJbnQzMilmaWxlU2l6ZSwgcHJvY2Vzc2VkKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIGlmIChwcm9jZXNzZWQgIT0gZmlsZVNpemUpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBmaWxlLkNsb3NlKCk7DQorICAgIHVuc2lnbmVkIG51bSA9ICh1bnNpZ25lZClmaWxlU2l6ZSAvIDI7DQorICAgIHdjaGFyX3QgKnAgPSB1LkdldEJ1ZmZlcihudW0pOw0KKyAgICBpZiAoY29kZVBhZ2UgPT0gTVlfX0NQX1VURjE2KQ0KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW07IGkrKykNCisgICAgICB7DQorICAgICAgICB3Y2hhcl90IGMgPSBHZXRVaTE2KGJ1ZiArIGkgKiAyKTsNCisgICAgICAgIGlmIChjID09IDApDQorICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIHBbaV0gPSBjOw0KKyAgICAgIH0NCisgICAgZWxzZQ0KKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW07IGkrKykNCisgICAgICB7DQorICAgICAgICB3Y2hhcl90IGMgPSAod2NoYXJfdClHZXRCZTE2KGJ1ZiArIGkgKiAyKTsNCisgICAgICAgIGlmIChjID09IDApDQorICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIHBbaV0gPSBjOw0KKyAgICAgIH0NCisgICAgdS5SZWxlYXNlQnVmZmVyKG51bSk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIEFTdHJpbmcgczsNCisgICAgY2hhciAqcCA9IHMuR2V0QnVmZmVyKCh1bnNpZ25lZClmaWxlU2l6ZSk7DQorICAgIFVJbnQzMiBwcm9jZXNzZWQ7DQorICAgIGlmICghZmlsZS5SZWFkKHAsIChVSW50MzIpZmlsZVNpemUsIHByb2Nlc3NlZCkpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBpZiAocHJvY2Vzc2VkICE9IGZpbGVTaXplKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgZmlsZS5DbG9zZSgpOw0KKyAgICBwW3Byb2Nlc3NlZF0gPSAwOw0KKyAgICBzLlJlbGVhc2VCdWZmZXIoKTsNCisgICAgaWYgKHMuTGVuKCkgIT0gcHJvY2Vzc2VkKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgDQorICAgIC8vICNpZmRlZiBDUF9VVEY4DQorICAgIGlmIChjb2RlUGFnZSA9PSBDUF9VVEY4KQ0KKyAgICB7DQorICAgICAgaWYgKCFDb252ZXJ0VVRGOFRvVW5pY29kZShzLCB1KSkNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIC8vICNlbmRpZg0KKyAgICAgIE11bHRpQnl0ZVRvVW5pY29kZVN0cmluZzIodSwgcywgY29kZVBhZ2UpOw0KKyAgfQ0KKw0KKyAgY29uc3Qgd2NoYXJfdCBrR29vZEJPTSA9IDB4RkVGRjsNCisgIGNvbnN0IHdjaGFyX3Qga0JhZEJPTSAgPSAweEZGRkU7DQorICANCisgIFVTdHJpbmcgczsNCisgIHVuc2lnbmVkIGkgPSAwOw0KKyAgZm9yICg7IGkgPCB1LkxlbigpICYmIHVbaV0gPT0ga0dvb2RCT007IGkrKyk7DQorICBmb3IgKDsgaSA8IHUuTGVuKCk7IGkrKykNCisgIHsNCisgICAgd2NoYXJfdCBjID0gdVtpXTsNCisgICAgaWYgKGMgPT0ga0dvb2RCT00gfHwgYyA9PSBrQmFkQk9NKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgaWYgKGMgPT0gTCdcbicgfHwgYyA9PSAweEQpDQorICAgIHsNCisgICAgICBBZGROYW1lKHN0cmluZ3MsIHMpOw0KKyAgICAgIHMuRW1wdHkoKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgcyArPSBjOw0KKyAgfQ0KKyAgQWRkTmFtZShzdHJpbmdzLCBzKTsNCisgIHJldHVybiB0cnVlOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vTGlzdEZpbGVVdGlscy5oIGIvbHptYS9DUFAvQ29tbW9uL0xpc3RGaWxlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzMyZDhlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL0xpc3RGaWxlVXRpbHMuaApAQCAtMCwwICsxLDE0IEBACisvLyBDb21tb24vTGlzdEZpbGVVdGlscy5oDQorDQorI2lmbmRlZiBfX0NPTU1PTl9MSVNUX0ZJTEVfVVRJTFNfSA0KKyNkZWZpbmUgX19DT01NT05fTElTVF9GSUxFX1VUSUxTX0gNCisNCisjaW5jbHVkZSAiTXlTdHJpbmcuaCINCisjaW5jbHVkZSAiTXlUeXBlcy5oIg0KKw0KKyNkZWZpbmUgTVlfX0NQX1VURjE2ICAgMTIwMA0KKyNkZWZpbmUgTVlfX0NQX1VURjE2QkUgMTIwMQ0KKw0KK2Jvb2wgUmVhZE5hbWVzRnJvbUxpc3RGaWxlKENGU1RSIGZpbGVOYW1lLCBVU3RyaW5nVmVjdG9yICZzdHJpbmdzLCBVSU5UIGNvZGVQYWdlID0gQ1BfT0VNQ1ApOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9NeUJ1ZmZlci5oIGIvbHptYS9DUFAvQ29tbW9uL015QnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiZGVhNgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9NeUJ1ZmZlci5oCkBAIC0wLDAgKzEsMjM3IEBACisvLyBDb21tb24vTXlCdWZmZXIuaA0KKw0KKyNpZm5kZWYgX19DT01NT05fTVlfQlVGRkVSX0gNCisjZGVmaW5lIF9fQ09NTU9OX01ZX0JVRkZFUl9IDQorDQorI2luY2x1ZGUgIkRlZnMuaCINCisNCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgQ0J1ZmZlcg0KK3sNCisgIFQgKl9pdGVtczsNCisgIHNpemVfdCBfc2l6ZTsNCisNCisgIHZvaWQgQ29weVRvRW1wdHkoY29uc3QgQ0J1ZmZlciAmYnVmZmVyKQ0KKyAgew0KKyAgICBpZiAoYnVmZmVyLl9zaXplID4gMCkNCisgICAgew0KKyAgICAgIF9pdGVtcyA9IG5ldyBUW2J1ZmZlci5fc2l6ZV07DQorICAgICAgbWVtY3B5KF9pdGVtcywgYnVmZmVyLl9pdGVtcywgYnVmZmVyLl9zaXplICogc2l6ZW9mKFQpKTsNCisgICAgICBfc2l6ZSA9IGJ1ZmZlci5fc2l6ZTsNCisgICAgfQ0KKyAgfQ0KK3B1YmxpYzoNCisgIHZvaWQgRnJlZSgpDQorICB7DQorICAgIGlmIChfaXRlbXMpDQorICAgIHsNCisgICAgICBkZWxldGUgW11faXRlbXM7DQorICAgICAgX2l0ZW1zID0gMDsNCisgICAgfQ0KKyAgICBfc2l6ZSA9IDA7DQorICB9DQorICANCisgIENCdWZmZXIoKTogX2l0ZW1zKDApLCBfc2l6ZSgwKSB7fTsNCisgIENCdWZmZXIoc2l6ZV90IHNpemUpOiBfaXRlbXMoMCksIF9zaXplKDApIHsgX2l0ZW1zID0gbmV3IFRbc2l6ZV07IF9zaXplID0gc2l6ZTsgfQ0KKyAgQ0J1ZmZlcihjb25zdCBDQnVmZmVyICZidWZmZXIpOiBfaXRlbXMoMCksIF9zaXplKDApIHsgQ29weVRvRW1wdHkoYnVmZmVyKTsgfQ0KKyAgfkNCdWZmZXIoKSB7IGRlbGV0ZSBbXV9pdGVtczsgfQ0KKw0KKyAgb3BlcmF0b3IgICAgICAgVCAqKCkgICAgICAgeyByZXR1cm4gX2l0ZW1zOyB9Ow0KKyAgb3BlcmF0b3IgY29uc3QgVCAqKCkgY29uc3QgeyByZXR1cm4gX2l0ZW1zOyB9Ow0KKyAgc2l6ZV90IFNpemUoKSBjb25zdCB7IHJldHVybiBfc2l6ZTsgfQ0KKw0KKyAgdm9pZCBBbGxvYyhzaXplX3Qgc2l6ZSkNCisgIHsNCisgICAgaWYgKHNpemUgIT0gX3NpemUpDQorICAgIHsNCisgICAgICBGcmVlKCk7DQorICAgICAgaWYgKHNpemUgIT0gMCkNCisgICAgICB7DQorICAgICAgICBfaXRlbXMgPSBuZXcgVFtzaXplXTsNCisgICAgICAgIF9zaXplID0gc2l6ZTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisNCisgIHZvaWQgQWxsb2NBdExlYXN0KHNpemVfdCBzaXplKQ0KKyAgew0KKyAgICBpZiAoc2l6ZSA+IF9zaXplKQ0KKyAgICB7DQorICAgICAgRnJlZSgpOw0KKyAgICAgIF9pdGVtcyA9IG5ldyBUW3NpemVdOw0KKyAgICAgIF9zaXplID0gc2l6ZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgdm9pZCBDb3B5RnJvbShjb25zdCBUICpkYXRhLCBzaXplX3Qgc2l6ZSkNCisgIHsNCisgICAgQWxsb2Moc2l6ZSk7DQorICAgIG1lbWNweShfaXRlbXMsIGRhdGEsIHNpemUgKiBzaXplb2YoVCkpOw0KKyAgfQ0KKw0KKyAgdm9pZCBDaGFuZ2VTaXplX0tlZXBEYXRhKHNpemVfdCBuZXdTaXplLCBzaXplX3Qga2VlcFNpemUpDQorICB7DQorICAgIGlmIChuZXdTaXplID09IF9zaXplKQ0KKyAgICAgIHJldHVybjsNCisgICAgVCAqbmV3QnVmZmVyID0gTlVMTDsNCisgICAgaWYgKG5ld1NpemUgPiAwKQ0KKyAgICB7DQorICAgICAgbmV3QnVmZmVyID0gbmV3IFRbbmV3U2l6ZV07DQorICAgICAgaWYgKF9zaXplID4gMCkNCisgICAgICAgIG1lbWNweShuZXdCdWZmZXIsIF9pdGVtcywgTXlNaW4oTXlNaW4oX3NpemUsIGtlZXBTaXplKSwgbmV3U2l6ZSkgKiBzaXplb2YoVCkpOw0KKyAgICB9DQorICAgIGRlbGV0ZSBbXV9pdGVtczsNCisgICAgX2l0ZW1zID0gbmV3QnVmZmVyOw0KKyAgICBfc2l6ZSA9IG5ld1NpemU7DQorICB9DQorDQorICBDQnVmZmVyJiBvcGVyYXRvcj0oY29uc3QgQ0J1ZmZlciAmYnVmZmVyKQ0KKyAgew0KKyAgICBGcmVlKCk7DQorICAgIENvcHlUb0VtcHR5KGJ1ZmZlcik7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCit9Ow0KKw0KK3RlbXBsYXRlIDxjbGFzcyBUPg0KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBDQnVmZmVyPFQ+JiBiMSwgY29uc3QgQ0J1ZmZlcjxUPiYgYjIpDQorew0KKyAgc2l6ZV90IHNpemUxID0gYjEuU2l6ZSgpOw0KKyAgaWYgKHNpemUxICE9IGIyLlNpemUoKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIG1lbWNtcChiMSwgYjIsIHNpemUxICogc2l6ZW9mKFQpKSA9PSAwOw0KK30NCisNCit0ZW1wbGF0ZSA8Y2xhc3MgVD4NCitib29sIG9wZXJhdG9yIT0oY29uc3QgQ0J1ZmZlcjxUPiYgYjEsIGNvbnN0IENCdWZmZXI8VD4mIGIyKQ0KK3sNCisgIHNpemVfdCBzaXplMSA9IGIxLlNpemUoKTsNCisgIGlmIChzaXplMSA9PSBiMi5TaXplKCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIHJldHVybiBtZW1jbXAoYjEsIGIyLCBzaXplMSAqIHNpemVvZihUKSkgIT0gMDsNCit9DQorDQorDQordHlwZWRlZiBDQnVmZmVyPGNoYXI+IENDaGFyQnVmZmVyOw0KK3R5cGVkZWYgQ0J1ZmZlcjx3Y2hhcl90PiBDV0NoYXJCdWZmZXI7DQordHlwZWRlZiBDQnVmZmVyPHVuc2lnbmVkIGNoYXI+IENCeXRlQnVmZmVyOw0KKw0KKw0KK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBDT2JqQXJyYXkNCit7DQorcHJvdGVjdGVkOg0KKyAgVCAqX2l0ZW1zOw0KK3ByaXZhdGU6DQorICAvLyB3ZSBkaXNhYmxlIGNvbnN0cnVjdG9ycw0KKyAgQ09iakFycmF5KGNvbnN0IENPYmpBcnJheSAmYnVmZmVyKTsNCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENPYmpBcnJheSAmYnVmZmVyKTsNCitwdWJsaWM6DQorICB2b2lkIEZyZWUoKQ0KKyAgew0KKyAgICBkZWxldGUgW11faXRlbXM7DQorICAgIF9pdGVtcyA9IDA7DQorICB9DQorICBDT2JqQXJyYXkoc2l6ZV90IHNpemUpOiBfaXRlbXMoMCkgeyBpZiAoc2l6ZSAhPSAwKSBfaXRlbXMgPSBuZXcgVFtzaXplXTsgfQ0KKyAgQ09iakFycmF5KCk6IF9pdGVtcygwKSB7fTsNCisgIH5DT2JqQXJyYXkoKSB7IGRlbGV0ZSBbXV9pdGVtczsgfQ0KKyAgDQorICBvcGVyYXRvciAgICAgICBUICooKSAgICAgICB7IHJldHVybiBfaXRlbXM7IH07DQorICBvcGVyYXRvciBjb25zdCBUICooKSBjb25zdCB7IHJldHVybiBfaXRlbXM7IH07DQorICANCisgIHZvaWQgQWxsb2Moc2l6ZV90IG5ld1NpemUpDQorICB7DQorICAgIGRlbGV0ZSBbXV9pdGVtczsNCisgICAgX2l0ZW1zID0gMDsNCisgICAgX2l0ZW1zID0gbmV3IFRbbmV3U2l6ZV07DQorICB9DQorfTsNCisNCit0eXBlZGVmIENPYmpBcnJheTx1bnNpZ25lZCBjaGFyPiBDQnl0ZUFycjsNCit0eXBlZGVmIENPYmpBcnJheTxib29sPiBDQm9vbEFycjsNCit0eXBlZGVmIENPYmpBcnJheTxpbnQ+IENJbnRBcnI7DQorDQorLy8gI2RlZmluZSBDUmVjQXJyYXkgQ09iakFycmF5DQorDQordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIENPYmpBcnJheTINCit7DQorLy8gcHJvdGVjdGVkOg0KKyAgVCAqX2l0ZW1zOw0KKyAgdW5zaWduZWQgX3NpemU7DQorDQorICBDT2JqQXJyYXkyKGNvbnN0IENPYmpBcnJheTIgJmJ1ZmZlcik7DQorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDT2JqQXJyYXkyICZidWZmZXIpOw0KK3B1YmxpYzoNCisgIA0KKyAgdm9pZCBGcmVlKCkNCisgIHsNCisgICAgZGVsZXRlIFtdX2l0ZW1zOw0KKyAgICBfaXRlbXMgPSAwOw0KKyAgICBfc2l6ZSA9IDA7DQorICB9DQorICBDT2JqQXJyYXkyKCk6IF9pdGVtcygwKSwgX3NpemUoMCkge307DQorICAvKg0KKyAgQ09iakFycmF5Mihjb25zdCBDT2JqQXJyYXkyICZidWZmZXIpOiBfaXRlbXMoMCksIF9zaXplKDApDQorICB7DQorICAgIHNpemVfdCBuZXdTaXplID0gYnVmZmVyLl9zaXplOw0KKyAgICBpZiAobmV3U2l6ZSA+IDApDQorICAgIHsNCisgICAgICBUICpuZXdCdWZmZXIgPSBuZXcgVFtuZXdTaXplXTs7DQorICAgICAgX2l0ZW1zID0gbmV3QnVmZmVyOw0KKyAgICAgIF9zaXplID0gbmV3U2l6ZTsNCisgICAgICBjb25zdCBUICpzcmMgPSBidWZmZXI7DQorICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdTaXplOyBpKyspDQorICAgICAgICBuZXdCdWZmZXJbaV0gPSBzcmNbaV07DQorICAgIH0NCisgIH0NCisgICovDQorICAvKg0KKyAgQ09iakFycmF5MihzaXplX3Qgc2l6ZSk6IF9pdGVtcygwKSwgX3NpemUoMCkNCisgIHsNCisgICAgaWYgKHNpemUgIT0gMCkNCisgICAgew0KKyAgICAgIF9pdGVtcyA9IG5ldyBUW3NpemVdOw0KKyAgICAgIF9zaXplID0gc2l6ZTsNCisgICAgfQ0KKyAgfQ0KKyAgKi8NCisNCisgIH5DT2JqQXJyYXkyKCkgeyBkZWxldGUgW11faXRlbXM7IH0NCisgIA0KKyAgb3BlcmF0b3IgICAgICAgVCAqKCkgICAgICAgeyByZXR1cm4gX2l0ZW1zOyB9Ow0KKyAgb3BlcmF0b3IgY29uc3QgVCAqKCkgY29uc3QgeyByZXR1cm4gX2l0ZW1zOyB9Ow0KKyAgDQorICB1bnNpZ25lZCBTaXplKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKV9zaXplOyB9DQorICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBfc2l6ZSA9PSAwOyB9DQorDQorICAvLyBTZXRTaXplIGRvZXNuJ3Qga2VlcCBvbGQgaXRlbXMuIEl0IGFsbG9jYXRlcyBuZXcgYXJyYXkgaWYgc2l6ZSBpcyBub3QgZXF1YWwNCisgIHZvaWQgU2V0U2l6ZSh1bnNpZ25lZCBzaXplKQ0KKyAgew0KKyAgICBpZiAoc2l6ZSA9PSBfc2l6ZSkNCisgICAgICByZXR1cm47DQorICAgIFQgKm5ld0J1ZmZlciA9IE5VTEw7DQorICAgIGlmIChzaXplID4gMCkNCisgICAgICBuZXdCdWZmZXIgPSBuZXcgVFtzaXplXTsNCisgICAgZGVsZXRlIFtdX2l0ZW1zOw0KKyAgICBfaXRlbXMgPSBuZXdCdWZmZXI7DQorICAgIF9zaXplID0gc2l6ZTsNCisgIH0NCisNCisgIC8qDQorICBDT2JqQXJyYXkyJiBvcGVyYXRvcj0oY29uc3QgQ09iakFycmF5MiAmYnVmZmVyKQ0KKyAgew0KKyAgICBGcmVlKCk7DQorICAgIHNpemVfdCBuZXdTaXplID0gYnVmZmVyLl9zaXplOw0KKyAgICBpZiAobmV3U2l6ZSA+IDApDQorICAgIHsNCisgICAgICBUICpuZXdCdWZmZXIgPSBuZXcgVFtuZXdTaXplXTs7DQorICAgICAgX2l0ZW1zID0gbmV3QnVmZmVyOw0KKyAgICAgIF9zaXplID0gbmV3U2l6ZTsNCisgICAgICBjb25zdCBUICpzcmMgPSBidWZmZXI7DQorICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdTaXplOyBpKyspDQorICAgICAgICBuZXdCdWZmZXJbaV0gPSBzcmNbaV07DQorICAgIH0NCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgKi8NCit9Ow0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9NeUNvbS5oIGIvbHptYS9DUFAvQ29tbW9uL015Q29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0YTA4MwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9NeUNvbS5oCkBAIC0wLDAgKzEsMjQyIEBACisvLyBNeUNvbS5oDQorDQorI2lmbmRlZiBfX01ZX0NPTV9IDQorI2RlZmluZSBfX01ZX0NPTV9IDQorDQorI2luY2x1ZGUgIk15V2luZG93cy5oIg0KKyNpbmNsdWRlICJOZXdIYW5kbGVyLmgiDQorDQorI2lmbmRlZiBSSU5PSw0KKyNkZWZpbmUgUklOT0soeCkgeyBIUkVTVUxUIF9fcmVzdWx0XyA9ICh4KTsgaWYgKF9fcmVzdWx0XyAhPSBTX09LKSByZXR1cm4gX19yZXN1bHRfOyB9DQorI2VuZGlmDQorDQordGVtcGxhdGUgPGNsYXNzIFQ+DQorY2xhc3MgQ015Q29tUHRyDQorew0KKyAgVCogX3A7DQorcHVibGljOg0KKyAgQ015Q29tUHRyKCk6IF9wKE5VTEwpIHt9DQorICBDTXlDb21QdHIoVCogcCkgdGhyb3coKSB7IGlmICgoX3AgPSBwKSAhPSBOVUxMKSBwLT5BZGRSZWYoKTsgfQ0KKyAgQ015Q29tUHRyKGNvbnN0IENNeUNvbVB0cjxUPiYgbHApIHRocm93KCkgeyBpZiAoKF9wID0gbHAuX3ApICE9IE5VTEwpIF9wLT5BZGRSZWYoKTsgfQ0KKyAgfkNNeUNvbVB0cigpIHsgaWYgKF9wKSBfcC0+UmVsZWFzZSgpOyB9DQorICB2b2lkIFJlbGVhc2UoKSB7IGlmIChfcCkgeyBfcC0+UmVsZWFzZSgpOyBfcCA9IE5VTEw7IH0gfQ0KKyAgb3BlcmF0b3IgVCooKSBjb25zdCB7ICByZXR1cm4gKFQqKV9wOyAgfQ0KKyAgLy8gVCYgb3BlcmF0b3IqKCkgY29uc3QgeyAgcmV0dXJuICpfcDsgfQ0KKyAgVCoqIG9wZXJhdG9yJigpIHsgcmV0dXJuICZfcDsgfQ0KKyAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIF9wOyB9DQorICBUKiBvcGVyYXRvcj0oVCogcCkNCisgIHsNCisgICAgaWYgKHApDQorICAgICAgcC0+QWRkUmVmKCk7DQorICAgIGlmIChfcCkNCisgICAgICBfcC0+UmVsZWFzZSgpOw0KKyAgICBfcCA9IHA7DQorICAgIHJldHVybiBwOw0KKyAgfQ0KKyAgVCogb3BlcmF0b3I9KGNvbnN0IENNeUNvbVB0cjxUPiYgbHApIHsgcmV0dXJuICgqdGhpcyA9IGxwLl9wKTsgfQ0KKyAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7IHJldHVybiAoX3AgPT0gTlVMTCk7IH0NCisgIC8vIGJvb2wgb3BlcmF0b3I9PShUKiBwVCkgY29uc3QgeyAgcmV0dXJuIF9wID09IHBUOyB9DQorICB2b2lkIEF0dGFjaChUKiBwMikNCisgIHsNCisgICAgUmVsZWFzZSgpOw0KKyAgICBfcCA9IHAyOw0KKyAgfQ0KKyAgVCogRGV0YWNoKCkNCisgIHsNCisgICAgVCogcHQgPSBfcDsNCisgICAgX3AgPSBOVUxMOw0KKyAgICByZXR1cm4gcHQ7DQorICB9DQorICAjaWZkZWYgX1dJTjMyDQorICBIUkVTVUxUIENvQ3JlYXRlSW5zdGFuY2UoUkVGQ0xTSUQgcmNsc2lkLCBSRUZJSUQgaWlkLCBMUFVOS05PV04gcFVua091dGVyID0gTlVMTCwgRFdPUkQgZHdDbHNDb250ZXh0ID0gQ0xTQ1RYX0FMTCkNCisgIHsNCisgICAgcmV0dXJuIDo6Q29DcmVhdGVJbnN0YW5jZShyY2xzaWQsIHBVbmtPdXRlciwgZHdDbHNDb250ZXh0LCBpaWQsICh2b2lkKiopJl9wKTsNCisgIH0NCisgICNlbmRpZg0KKyAgLyoNCisgIEhSRVNVTFQgQ29DcmVhdGVJbnN0YW5jZShMUENPTEVTVFIgc3pQcm9nSUQsIExQVU5LTk9XTiBwVW5rT3V0ZXIgPSBOVUxMLCBEV09SRCBkd0Nsc0NvbnRleHQgPSBDTFNDVFhfQUxMKQ0KKyAgew0KKyAgICBDTFNJRCBjbHNpZDsNCisgICAgSFJFU1VMVCBociA9IENMU0lERnJvbVByb2dJRChzelByb2dJRCwgJmNsc2lkKTsNCisgICAgQVRMQVNTRVJUKF9wID09IE5VTEwpOw0KKyAgICBpZiAoU1VDQ0VFREVEKGhyKSkNCisgICAgICBociA9IDo6Q29DcmVhdGVJbnN0YW5jZShjbHNpZCwgcFVua091dGVyLCBkd0Nsc0NvbnRleHQsIF9fdXVpZG9mKFQpLCAodm9pZCoqKSZfcCk7DQorICAgIHJldHVybiBocjsNCisgIH0NCisgICovDQorICB0ZW1wbGF0ZSA8Y2xhc3MgUT4NCisgIEhSRVNVTFQgUXVlcnlJbnRlcmZhY2UoUkVGR1VJRCBpaWQsIFEqKiBwcCkgY29uc3QgdGhyb3coKQ0KKyAgew0KKyAgICByZXR1cm4gX3AtPlF1ZXJ5SW50ZXJmYWNlKGlpZCwgKHZvaWQqKilwcCk7DQorICB9DQorfTsNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQoraW5saW5lIEhSRVNVTFQgU3RyaW5nVG9Cc3RyKExQQ09MRVNUUiBzcmMsIEJTVFIgKmJzdHIpDQorew0KKyAgKmJzdHIgPSA6OlN5c0FsbG9jU3RyaW5nKHNyYyk7DQorICByZXR1cm4gKCpic3RyICE9IE5VTEwpID8gU19PSyA6IEVfT1VUT0ZNRU1PUlk7DQorfQ0KKw0KK2NsYXNzIENNeUNvbUJTVFINCit7DQorICBCU1RSIG1fc3RyOw0KK3B1YmxpYzoNCisgIA0KKyAgQ015Q29tQlNUUigpOiBtX3N0cihOVUxMKSB7fQ0KKyAgQ015Q29tQlNUUihMUENPTEVTVFIgc3JjKSB7IG1fc3RyID0gOjpTeXNBbGxvY1N0cmluZyhzcmMpOyB9DQorICAvLyBDTXlDb21CU1RSKGludCBuU2l6ZSkgeyBtX3N0ciA9IDo6U3lzQWxsb2NTdHJpbmdMZW4oTlVMTCwgblNpemUpOyB9DQorICAvLyBDTXlDb21CU1RSKGludCBuU2l6ZSwgTFBDT0xFU1RSIHN6KSB7IG1fc3RyID0gOjpTeXNBbGxvY1N0cmluZ0xlbihzeiwgblNpemUpOyAgfQ0KKyAgQ015Q29tQlNUUihjb25zdCBDTXlDb21CU1RSJiBzcmMpIHsgbV9zdHIgPSBzcmMuTXlDb3B5KCk7IH0NCisgIC8qDQorICBDTXlDb21CU1RSKFJFRkdVSUQgc3JjKQ0KKyAgew0KKyAgICBMUE9MRVNUUiBzekd1aWQ7DQorICAgIFN0cmluZ0Zyb21DTFNJRChzcmMsICZzekd1aWQpOw0KKyAgICBtX3N0ciA9IDo6U3lzQWxsb2NTdHJpbmcoc3pHdWlkKTsNCisgICAgQ29UYXNrTWVtRnJlZShzekd1aWQpOw0KKyAgfQ0KKyAgKi8NCisgIH5DTXlDb21CU1RSKCkgeyA6OlN5c0ZyZWVTdHJpbmcobV9zdHIpOyB9DQorICBDTXlDb21CU1RSJiBvcGVyYXRvcj0oY29uc3QgQ015Q29tQlNUUiYgc3JjKQ0KKyAgew0KKyAgICBpZiAobV9zdHIgIT0gc3JjLm1fc3RyKQ0KKyAgICB7DQorICAgICAgaWYgKG1fc3RyKQ0KKyAgICAgICAgOjpTeXNGcmVlU3RyaW5nKG1fc3RyKTsNCisgICAgICBtX3N0ciA9IHNyYy5NeUNvcHkoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICBDTXlDb21CU1RSJiBvcGVyYXRvcj0oTFBDT0xFU1RSIHNyYykNCisgIHsNCisgICAgOjpTeXNGcmVlU3RyaW5nKG1fc3RyKTsNCisgICAgbV9zdHIgPSA6OlN5c0FsbG9jU3RyaW5nKHNyYyk7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCisgIC8vIHVuc2lnbmVkIExlbigpIGNvbnN0IHsgcmV0dXJuIDo6U3lzU3RyaW5nTGVuKG1fc3RyKTsgfQ0KKyAgb3BlcmF0b3IgQlNUUigpIGNvbnN0IHsgcmV0dXJuIG1fc3RyOyB9DQorICBCU1RSKiBvcGVyYXRvciYoKSB7IHJldHVybiAmbV9zdHI7IH0NCisgIEJTVFIgTXlDb3B5KCkgY29uc3QNCisgIHsNCisgICAgaW50IGJ5dGVMZW4gPSA6OlN5c1N0cmluZ0J5dGVMZW4obV9zdHIpOw0KKyAgICBCU1RSIHJlcyA9IDo6U3lzQWxsb2NTdHJpbmdCeXRlTGVuKE5VTEwsIGJ5dGVMZW4pOw0KKyAgICBtZW1jcHkocmVzLCBtX3N0ciwgYnl0ZUxlbik7DQorICAgIHJldHVybiByZXM7DQorICB9DQorICAvKg0KKyAgdm9pZCBBdHRhY2goQlNUUiBzcmMpIHsgbV9zdHIgPSBzcmM7IH0NCisgIEJTVFIgRGV0YWNoKCkNCisgIHsNCisgICAgQlNUUiBzID0gbV9zdHI7DQorICAgIG1fc3RyID0gTlVMTDsNCisgICAgcmV0dXJuIHM7DQorICB9DQorICAqLw0KKyAgdm9pZCBFbXB0eSgpDQorICB7DQorICAgIDo6U3lzRnJlZVN0cmluZyhtX3N0cik7DQorICAgIG1fc3RyID0gTlVMTDsNCisgIH0NCisgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gKG1fc3RyID09IE5VTEwpOyB9DQorfTsNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorY2xhc3MgQ015VW5rbm93bkltcA0KK3sNCitwdWJsaWM6DQorICBVTE9ORyBfX21fUmVmQ291bnQ7DQorICBDTXlVbmtub3duSW1wKCk6IF9fbV9SZWZDb3VudCgwKSB7fQ0KK307DQorDQorI2RlZmluZSBNWV9RVUVSWUlOVEVSRkFDRV9CRUdJTiBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIFwNCisoUkVGR1VJRCBpaWQsIHZvaWQgKipvdXRPYmplY3QpIHRocm93KCkgeyAqb3V0T2JqZWN0ID0gTlVMTDsNCisNCisjZGVmaW5lIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKGkpIGVsc2UgaWYgKGlpZCA9PSBJSURfICMjIGkpIFwNCisgICAgeyAqb3V0T2JqZWN0ID0gKHZvaWQgKikoaSAqKXRoaXM7IH0NCisNCisjZGVmaW5lIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZX1VOS05PV04oaSkgaWYgKGlpZCA9PSBJSURfSVVua25vd24pIFwNCisgICAgeyAqb3V0T2JqZWN0ID0gKHZvaWQgKikoSVVua25vd24gKikoaSAqKXRoaXM7IH0NCisNCisjZGVmaW5lIE1ZX1FVRVJZSU5URVJGQUNFX0JFR0lOMihpKSBNWV9RVUVSWUlOVEVSRkFDRV9CRUdJTiBcDQorICAgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZX1VOS05PV04oaSkgXA0KKyAgICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShpKQ0KKw0KKyNkZWZpbmUgTVlfUVVFUllJTlRFUkZBQ0VfRU5EIGVsc2UgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7IEFkZFJlZigpOyByZXR1cm4gU19PSzsgfQ0KKw0KKyNkZWZpbmUgTVlfQUREUkVGX1JFTEVBU0UgXA0KK1NURE1FVEhPRF8oVUxPTkcsIEFkZFJlZikoKSB0aHJvdygpIHsgcmV0dXJuICsrX19tX1JlZkNvdW50OyB9IFwNCitTVERNRVRIT0RfKFVMT05HLCBSZWxlYXNlKSgpIHsgaWYgKC0tX19tX1JlZkNvdW50ICE9IDApICBcDQorICByZXR1cm4gX19tX1JlZkNvdW50OyBkZWxldGUgdGhpczsgcmV0dXJuIDA7IH0NCisNCisjZGVmaW5lIE1ZX1VOS05PV05fSU1QX1NQRUMoaSkgXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfQkVHSU4gXA0KKyAgaSBcDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTkQgXA0KKyAgTVlfQUREUkVGX1JFTEVBU0UNCisNCisNCisjZGVmaW5lIE1ZX1VOS05PV05fSU1QIE1ZX1FVRVJZSU5URVJGQUNFX0JFR0lOIFwNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZX1VOS05PV04oSVVua25vd24pIFwNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VORCBcDQorICBNWV9BRERSRUZfUkVMRUFTRQ0KKw0KKyNkZWZpbmUgTVlfVU5LTk9XTl9JTVAxKGkpIE1ZX1VOS05PV05fSU1QX1NQRUMoIFwNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZX1VOS05PV04oaSkgXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoaSkgXA0KKyAgKQ0KKw0KKyNkZWZpbmUgTVlfVU5LTk9XTl9JTVAyKGkxLCBpMikgTVlfVU5LTk9XTl9JTVBfU1BFQyggXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUllfVU5LTk9XTihpMSkgXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoaTEpIFwNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKGkyKSBcDQorICApDQorDQorI2RlZmluZSBNWV9VTktOT1dOX0lNUDMoaTEsIGkyLCBpMykgTVlfVU5LTk9XTl9JTVBfU1BFQyggXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUllfVU5LTk9XTihpMSkgXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoaTEpIFwNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKGkyKSBcDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShpMykgXA0KKyAgKQ0KKw0KKyNkZWZpbmUgTVlfVU5LTk9XTl9JTVA0KGkxLCBpMiwgaTMsIGk0KSBNWV9VTktOT1dOX0lNUF9TUEVDKCBcDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWV9VTktOT1dOKGkxKSBcDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShpMSkgXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoaTIpIFwNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKGkzKSBcDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShpNCkgXA0KKyAgKQ0KKw0KKyNkZWZpbmUgTVlfVU5LTk9XTl9JTVA1KGkxLCBpMiwgaTMsIGk0LCBpNSkgTVlfVU5LTk9XTl9JTVBfU1BFQyggXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUllfVU5LTk9XTihpMSkgXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoaTEpIFwNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKGkyKSBcDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShpMykgXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoaTQpIFwNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKGk1KSBcDQorICApDQorDQorI2RlZmluZSBNWV9VTktOT1dOX0lNUDYoaTEsIGkyLCBpMywgaTQsIGk1LCBpNikgTVlfVU5LTk9XTl9JTVBfU1BFQyggXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUllfVU5LTk9XTihpMSkgXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoaTEpIFwNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKGkyKSBcDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShpMykgXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoaTQpIFwNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKGk1KSBcDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShpNikgXA0KKyAgKQ0KKw0KKyNkZWZpbmUgTVlfVU5LTk9XTl9JTVA3KGkxLCBpMiwgaTMsIGk0LCBpNSwgaTYsIGk3KSBNWV9VTktOT1dOX0lNUF9TUEVDKCBcDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWV9VTktOT1dOKGkxKSBcDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShpMSkgXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoaTIpIFwNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKGkzKSBcDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShpNCkgXA0KKyAgTVlfUVVFUllJTlRFUkZBQ0VfRU5UUlkoaTUpIFwNCisgIE1ZX1FVRVJZSU5URVJGQUNFX0VOVFJZKGk2KSBcDQorICBNWV9RVUVSWUlOVEVSRkFDRV9FTlRSWShpNykgXA0KKyAgKQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9NeUV4Y2VwdGlvbi5oIGIvbHptYS9DUFAvQ29tbW9uL015RXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5ZmU2OQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9NeUV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsMTQgQEAKKy8vIENvbW1vbi9FeGNlcHRpb24uaA0KKw0KKyNpZm5kZWYgX19DT01NT05fRVhDRVBUSU9OX0gNCisjZGVmaW5lIF9fQ09NTU9OX0VYQ0VQVElPTl9IDQorDQorI2luY2x1ZGUgIk15V2luZG93cy5oIg0KKw0KK3N0cnVjdCBDU3lzdGVtRXhjZXB0aW9uDQorew0KKyAgSFJFU1VMVCBFcnJvckNvZGU7DQorICBDU3lzdGVtRXhjZXB0aW9uKEhSRVNVTFQgZXJyb3JDb2RlKTogRXJyb3JDb2RlKGVycm9yQ29kZSkge30NCit9Ow0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9NeUd1aWREZWYuaCBiL2x6bWEvQ1BQL0NvbW1vbi9NeUd1aWREZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDM1OWUyCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL015R3VpZERlZi5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvbW1vbi9NeUd1aWREZWYuaA0KKw0KKyNpZm5kZWYgR1VJRF9ERUZJTkVEDQorI2RlZmluZSBHVUlEX0RFRklORUQNCisNCisjaW5jbHVkZSAiTXlUeXBlcy5oIg0KKw0KK3R5cGVkZWYgc3RydWN0IHsNCisgIFVJbnQzMiBEYXRhMTsNCisgIFVJbnQxNiBEYXRhMjsNCisgIFVJbnQxNiBEYXRhMzsNCisgIHVuc2lnbmVkIGNoYXIgRGF0YTRbOF07DQorfSBHVUlEOw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KKyNkZWZpbmUgUkVGR1VJRCBjb25zdCBHVUlEICYNCisjZWxzZQ0KKyNkZWZpbmUgUkVGR1VJRCBjb25zdCBHVUlEICoNCisjZW5kaWYNCisNCisjZGVmaW5lIFJFRkNMU0lEIFJFRkdVSUQNCisjZGVmaW5lIFJFRklJRCBSRUZHVUlEDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQoraW5saW5lIGludCBvcGVyYXRvcj09KFJFRkdVSUQgZzEsIFJFRkdVSUQgZzIpDQorew0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXNpemVvZihnMSk7IGkrKykNCisgICAgaWYgKCgodW5zaWduZWQgY2hhciAqKSZnMSlbaV0gIT0gKCh1bnNpZ25lZCBjaGFyICopJmcyKVtpXSkNCisgICAgICByZXR1cm4gMDsNCisgIHJldHVybiAxOw0KK30NCitpbmxpbmUgaW50IG9wZXJhdG9yIT0oUkVGR1VJRCBnMSwgUkVGR1VJRCBnMikgeyByZXR1cm4gIShnMSA9PSBnMik7IH0NCisjZW5kaWYNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCisgICNkZWZpbmUgTVlfRVhURVJOX0MgZXh0ZXJuICJDIg0KKyNlbHNlDQorICAjZGVmaW5lIE1ZX0VYVEVSTl9DIGV4dGVybg0KKyNlbmRpZg0KKw0KKyNlbmRpZg0KKw0KKw0KKyNpZmRlZiBERUZJTkVfR1VJRA0KKyN1bmRlZiBERUZJTkVfR1VJRA0KKyNlbmRpZg0KKw0KKyNpZmRlZiBJTklUR1VJRA0KKyAgI2RlZmluZSBERUZJTkVfR1VJRChuYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYsIGI3LCBiOCkgXA0KKyAgICBNWV9FWFRFUk5fQyBjb25zdCBHVUlEIG5hbWUgPSB7IGwsIHcxLCB3MiwgeyBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNywgYjggfSB9DQorI2Vsc2UNCisgICNkZWZpbmUgREVGSU5FX0dVSUQobmFtZSwgbCwgdzEsIHcyLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNywgYjgpIFwNCisgICAgTVlfRVhURVJOX0MgY29uc3QgR1VJRCBuYW1lDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvQ29tbW9uL015SW5pdEd1aWQuaCBiL2x6bWEvQ1BQL0NvbW1vbi9NeUluaXRHdWlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmZWExOQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9NeUluaXRHdWlkLmgKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29tbW9uL015SW5pdEd1aWQuaA0KKw0KKyNpZm5kZWYgX19DT01NT05fTVlfSU5JVEdVSURfSA0KKyNkZWZpbmUgX19DT01NT05fTVlfSU5JVEdVSURfSA0KKw0KKy8qDQorVGhpcyBmaWxlIG11c3QgYmUgaW5jbHVkZWQgb25seSB0byBvbmUgQysrIGZpbGUgaW4gcHJvamVjdCBiZWZvcmUNCitkZWNsYXJhdGlvbnMgb2YgQ09NIGludGVyZmFjZXMgd2l0aCBERUZJTkVfR1VJRCBtYWNyby4NCisNCitFYWNoIEdVSUQgbXVzdCBiZSBpbml0aWFsaXplZCBleGFjdGx5IG9uY2UgaW4gcHJvamVjdC4NCitUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgREVGSU5FX0dVSUQgbWFjcm8gaW4gZ3VpZGRlZi5oIChNeUd1aWREZWYuaCk6DQorICAtIGlmIElOSVRHVUlEIGlzIG5vdCBkZWZpbmVkOiAgREVGSU5FX0dVSUQgZGVjbGFyZXMgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIHRoZSBzeW1ib2wgbmFtZS4NCisgIC0gaWYgSU5JVEdVSUQgaXMgICAgIGRlZmluZWQ6ICBERUZJTkVfR1VJRCBpbml0aWFsaXplcyB0aGUgc3ltYm9sIG5hbWUgdG8gdGhlIHZhbHVlIG9mIHRoZSBHVUlELg0KKw0KK0Fsc28gd2UgbmVlZCBJSURfSVVua25vd24gdGhhdCBpcyBpbml0aWFsaXplZCBpbiBzb21lIGZpbGUgZm9yIGxpbmtpbmc6DQorICBNU1ZDOiAgYnkgZGVmYXVsdCB0aGUgbGlua2VyIHVzZXMgc29tZSBsaWIgZmlsZSB0aGF0IGNvbnRhaW5zIElJRF9JVW5rbm93bg0KKyAgTWluR1c6IGFkZCAtbHV1aWQgc3dpdGNoIGZvciBsaW5rZXINCisgIFdpbkNFOiB3ZSBkZWZpbmUgSUlEX0lVbmtub3duIGluIHRoaXMgZmlsZQ0KKyAgT3RoZXI6IHdlIGRlZmluZSBJSURfSVVua25vd24gaW4gdGhpcyBmaWxlDQorKi8NCisNCisjaWZkZWYgX1dJTjMyDQorDQorI2lmZGVmIFVOREVSX0NFDQorI2luY2x1ZGUgPGJhc2V0eXBzLmg+DQorI2VuZGlmDQorDQorI2luY2x1ZGUgPGluaXRndWlkLmg+DQorDQorI2lmZGVmIFVOREVSX0NFDQorREVGSU5FX0dVSUQoSUlEX0lVbmtub3duLA0KKzB4MDAwMDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ2KTsNCisjZW5kaWYNCisNCisjZWxzZQ0KKw0KKyNkZWZpbmUgSU5JVEdVSUQNCisjaW5jbHVkZSAiTXlHdWlkRGVmLmgiDQorREVGSU5FX0dVSUQoSUlEX0lVbmtub3duLA0KKzB4MDAwMDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ2KTsNCisNCisjZW5kaWYNCisNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vTXlTdHJpbmcuY3BwIGIvbHptYS9DUFAvQ29tbW9uL015U3RyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDdhMTgxCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL015U3RyaW5nLmNwcApAQCAtMCwwICsxLDEyMTUgQEAKKy8vIENvbW1vbi9NeVN0cmluZy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2lmZGVmIF9XSU4zMg0KKyNpbmNsdWRlIDx3aW5kb3dzLmg+DQorI2luY2x1ZGUgPHdjaGFyLmg+DQorI2Vsc2UNCisjaW5jbHVkZSA8Y3R5cGUuaD4NCisjZW5kaWYNCisNCisjaWYgIWRlZmluZWQoX1VOSUNPREUpIHx8ICFkZWZpbmVkKFVTRV9VTklDT0RFX0ZTVFJJTkcpDQorI2luY2x1ZGUgIlN0cmluZ0NvbnZlcnQuaCINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiTXlTdHJpbmcuaCINCisNCisjZGVmaW5lIE1ZX1NUUklOR19ORVcoX1RfLCBfc2l6ZV8pIG5ldyBfVF9bX3NpemVfXQ0KKy8vICNkZWZpbmUgTVlfU1RSSU5HX05FVyhfVF8sIF9zaXplXykgKChfVF8gKilteV9uZXcoKHNpemVfdCkoX3NpemVfKSAqIHNpemVvZihfVF8pKSkNCisNCisvKg0KK2lubGluZSBjb25zdCBjaGFyKiBNeVN0cmluZ0dldE5leHRDaGFyUG9pbnRlcihjb25zdCBjaGFyICpwKSB0aHJvdygpDQorew0KKyAgI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkNCisgIHJldHVybiBDaGFyTmV4dEEocCk7DQorICAjZWxzZQ0KKyAgcmV0dXJuIHAgKyAxOw0KKyAgI2VuZGlmDQorfQ0KKyovDQorDQoraW50IEZpbmRDaGFyUG9zSW5TdHJpbmcoY29uc3QgY2hhciAqcywgY2hhciBjKSB0aHJvdygpDQorew0KKyAgZm9yIChjb25zdCBjaGFyICpwID0gczs7IHArKykNCisgIHsNCisgICAgaWYgKCpwID09IGMpDQorICAgICAgcmV0dXJuIChpbnQpKHAgLSBzKTsNCisgICAgaWYgKCpwID09IDApDQorICAgICAgcmV0dXJuIC0xOw0KKyAgICAvLyBNeVN0cmluZ0dldE5leHRDaGFyUG9pbnRlcihwKTsNCisgIH0NCit9DQorDQoraW50IEZpbmRDaGFyUG9zSW5TdHJpbmcoY29uc3Qgd2NoYXJfdCAqcywgd2NoYXJfdCBjKSB0aHJvdygpDQorew0KKyAgZm9yIChjb25zdCB3Y2hhcl90ICpwID0gczs7IHArKykNCisgIHsNCisgICAgaWYgKCpwID09IGMpDQorICAgICAgcmV0dXJuIChpbnQpKHAgLSBzKTsNCisgICAgaWYgKCpwID09IDApDQorICAgICAgcmV0dXJuIC0xOw0KKyAgfQ0KK30NCisNCisvKg0KK3ZvaWQgTXlTdHJpbmdVcHBlcl9Bc2NpaSh3Y2hhcl90ICpzKQ0KK3sNCisgIGZvciAoOzspDQorICB7DQorICAgIHdjaGFyX3QgYyA9ICpzOw0KKyAgICBpZiAoYyA9PSAwKQ0KKyAgICAgIHJldHVybjsNCisgICAgKnMrKyA9IE15Q2hhclVwcGVyX0FzY2lpKGMpOw0KKyAgfQ0KK30NCisqLw0KKw0KK3ZvaWQgTXlTdHJpbmdMb3dlcl9Bc2NpaSh3Y2hhcl90ICpzKSB0aHJvdygpDQorew0KKyAgZm9yICg7OykNCisgIHsNCisgICAgd2NoYXJfdCBjID0gKnM7DQorICAgIGlmIChjID09IDApDQorICAgICAgcmV0dXJuOw0KKyAgICAqcysrID0gTXlDaGFyTG93ZXJfQXNjaWkoYyk7DQorICB9DQorfQ0KKw0KKyNpZmRlZiBfV0lOMzINCisNCisjaWZkZWYgX1VOSUNPREUNCisNCisvLyB3Y2hhcl90ICogTXlTdHJpbmdVcHBlcih3Y2hhcl90ICpzKSB7IHJldHVybiBDaGFyVXBwZXJXKHMpOyB9DQorLy8gd2NoYXJfdCAqIE15U3RyaW5nTG93ZXIod2NoYXJfdCAqcykgeyByZXR1cm4gQ2hhckxvd2VyVyhzKTsgfQ0KKy8vIGZvciBXaW5DRSAtIEZTdHJpbmcgLSBjaGFyDQorLy8gY29uc3QgY2hhciAqTXlTdHJpbmdHZXRQcmV2Q2hhclBvaW50ZXIoY29uc3QgY2hhciAqIC8qIGJhc2UgKi8sIGNvbnN0IGNoYXIgKnApIHsgcmV0dXJuIHAgLSAxOyB9DQorDQorI2Vsc2UNCisNCisvLyBjb25zdCBjaGFyICogTXlTdHJpbmdHZXRQcmV2Q2hhclBvaW50ZXIoY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcCkgdGhyb3coKSB7IHJldHVybiBDaGFyUHJldkEoYmFzZSwgcCk7IH0NCisvLyBjaGFyICogTXlTdHJpbmdVcHBlcihjaGFyICpzKSB7IHJldHVybiBDaGFyVXBwZXJBKHMpOyB9DQorLy8gY2hhciAqIE15U3RyaW5nTG93ZXIoY2hhciAqcykgeyByZXR1cm4gQ2hhckxvd2VyQShzKTsgfQ0KKw0KK3djaGFyX3QgTXlDaGFyVXBwZXJfV0lOKHdjaGFyX3QgYykgdGhyb3coKQ0KK3sNCisgIHdjaGFyX3QgKnJlcyA9IENoYXJVcHBlclcoKExQV1NUUikoVUlOVF9QVFIpKHVuc2lnbmVkKWMpOw0KKyAgaWYgKHJlcyAhPSAwIHx8IDo6R2V0TGFzdEVycm9yKCkgIT0gRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpDQorICAgIHJldHVybiAod2NoYXJfdCkodW5zaWduZWQpKFVJTlRfUFRSKXJlczsNCisgIGNvbnN0IGludCBrQnVmU2l6ZSA9IDQ7DQorICBjaGFyIHNba0J1ZlNpemUgKyAxXTsNCisgIGludCBudW1DaGFycyA9IDo6V2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsICZjLCAxLCBzLCBrQnVmU2l6ZSwgMCwgMCk7DQorICBpZiAobnVtQ2hhcnMgPT0gMCB8fCBudW1DaGFycyA+IGtCdWZTaXplKQ0KKyAgICByZXR1cm4gYzsNCisgIHNbbnVtQ2hhcnNdID0gMDsNCisgIDo6Q2hhclVwcGVyQShzKTsNCisgIDo6TXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHMsIG51bUNoYXJzLCAmYywgMSk7DQorICByZXR1cm4gYzsNCit9DQorDQorLyoNCit3Y2hhcl90IE15Q2hhckxvd2VyX1dJTih3Y2hhcl90IGMpDQorew0KKyAgd2NoYXJfdCAqcmVzID0gQ2hhckxvd2VyVygoTFBXU1RSKShVSU5UX1BUUikodW5zaWduZWQpYyk7DQorICBpZiAocmVzICE9IDAgfHwgOjpHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCkNCisgICAgcmV0dXJuICh3Y2hhcl90KSh1bnNpZ25lZCkoVUlOVF9QVFIpcmVzOw0KKyAgY29uc3QgaW50IGtCdWZTaXplID0gNDsNCisgIGNoYXIgc1trQnVmU2l6ZSArIDFdOw0KKyAgaW50IG51bUNoYXJzID0gOjpXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgJmMsIDEsIHMsIGtCdWZTaXplLCAwLCAwKTsNCisgIGlmIChudW1DaGFycyA9PSAwIHx8IG51bUNoYXJzID4ga0J1ZlNpemUpDQorICAgIHJldHVybiBjOw0KKyAgc1tudW1DaGFyc10gPSAwOw0KKyAgOjpDaGFyTG93ZXJBKHMpOw0KKyAgOjpNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgcywgbnVtQ2hhcnMsICZjLCAxKTsNCisgIHJldHVybiBjOw0KK30NCisqLw0KKw0KKy8qDQord2NoYXJfdCAqIE15U3RyaW5nVXBwZXIod2NoYXJfdCAqcykNCit7DQorICBpZiAocyA9PSAwKQ0KKyAgICByZXR1cm4gMDsNCisgIHdjaGFyX3QgKnJlcyA9IENoYXJVcHBlclcocyk7DQorICBpZiAocmVzICE9IDAgfHwgOjpHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCkNCisgICAgcmV0dXJuIHJlczsNCisgIEFTdHJpbmcgYSA9IFVuaWNvZGVTdHJpbmdUb011bHRpQnl0ZShzKTsNCisgIGEuTWFrZVVwcGVyKCk7DQorICBNeVN0cmluZ0NvcHkocywgKGNvbnN0IHdjaGFyX3QgKilNdWx0aUJ5dGVUb1VuaWNvZGVTdHJpbmcoYSkpOw0KKyAgcmV0dXJuIHM7DQorfQ0KKyovDQorDQorLyoNCit3Y2hhcl90ICogTXlTdHJpbmdMb3dlcih3Y2hhcl90ICpzKQ0KK3sNCisgIGlmIChzID09IDApDQorICAgIHJldHVybiAwOw0KKyAgd2NoYXJfdCAqcmVzID0gQ2hhckxvd2VyVyhzKTsNCisgIGlmIChyZXMgIT0gMCB8fCA6OkdldExhc3RFcnJvcigpICE9IEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKQ0KKyAgICByZXR1cm4gcmVzOw0KKyAgQVN0cmluZyBhID0gVW5pY29kZVN0cmluZ1RvTXVsdGlCeXRlKHMpOw0KKyAgYS5NYWtlTG93ZXIoKTsNCisgIE15U3RyaW5nQ29weShzLCAoY29uc3Qgd2NoYXJfdCAqKU11bHRpQnl0ZVRvVW5pY29kZVN0cmluZyhhKSk7DQorICByZXR1cm4gczsNCit9DQorKi8NCisNCisjZW5kaWYNCisNCisjZW5kaWYNCisNCitib29sIElzU3RyaW5nMVByZWZpeGVkQnlTdHJpbmcyKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikgdGhyb3coKQ0KK3sNCisgIGZvciAoOzspDQorICB7DQorICAgIHVuc2lnbmVkIGNoYXIgYzIgPSAodW5zaWduZWQgY2hhcikqczIrKzsgaWYgKGMyID09IDApIHJldHVybiB0cnVlOw0KKyAgICB1bnNpZ25lZCBjaGFyIGMxID0gKHVuc2lnbmVkIGNoYXIpKnMxKys7IGlmIChjMSAhPSBjMikgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KK30NCisNCitib29sIFN0cmluZ3NBcmVFcXVhbE5vQ2FzZShjb25zdCB3Y2hhcl90ICpzMSwgY29uc3Qgd2NoYXJfdCAqczIpIHRocm93KCkNCit7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICB3Y2hhcl90IGMxID0gKnMxKys7DQorICAgIHdjaGFyX3QgYzIgPSAqczIrKzsNCisgICAgaWYgKGMxICE9IGMyICYmIE15Q2hhclVwcGVyKGMxKSAhPSBNeUNoYXJVcHBlcihjMikpIHJldHVybiBmYWxzZTsNCisgICAgaWYgKGMxID09IDApIHJldHVybiB0cnVlOw0KKyAgfQ0KK30NCisNCisvLyAtLS0tLS0tLS0tIEFTQ0lJIC0tLS0tLS0tLS0NCisNCitib29sIEFTdHJpbmc6OklzUHJlZml4ZWRCeV9Bc2NpaV9Ob0Nhc2UoY29uc3QgY2hhciAqcykgY29uc3QgdGhyb3coKQ0KK3sNCisgIGNvbnN0IGNoYXIgKnMxID0gX2NoYXJzOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgY2hhciBjMiA9ICpzKys7DQorICAgIGlmIChjMiA9PSAwKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICBjaGFyIGMxID0gKnMxKys7DQorICAgIGlmIChNeUNoYXJMb3dlcl9Bc2NpaShjMSkgIT0NCisgICAgICAgIE15Q2hhckxvd2VyX0FzY2lpKGMyKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICB9DQorfQ0KKw0KK2Jvb2wgVVN0cmluZzo6SXNQcmVmaXhlZEJ5X0FzY2lpX05vQ2FzZShjb25zdCBjaGFyICpzKSBjb25zdCB0aHJvdygpDQorew0KKyAgY29uc3Qgd2NoYXJfdCAqczEgPSBfY2hhcnM7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBjaGFyIGMyID0gKnMrKzsNCisgICAgaWYgKGMyID09IDApDQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIHdjaGFyX3QgYzEgPSAqczErKzsNCisgICAgaWYgKE15Q2hhckxvd2VyX0FzY2lpKGMxKSAhPSAodW5zaWduZWQgY2hhcilNeUNoYXJMb3dlcl9Bc2NpaShjMikpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KK30NCisNCitib29sIFN0cmluZ3NBcmVFcXVhbF9Bc2NpaShjb25zdCB3Y2hhcl90ICp1LCBjb25zdCBjaGFyICphKSB0aHJvdygpDQorew0KKyAgZm9yICg7OykNCisgIHsNCisgICAgdW5zaWduZWQgY2hhciBjID0gKmE7DQorICAgIGlmIChjICE9ICp1KQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgaWYgKGMgPT0gMCkNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgYSsrOw0KKyAgICB1Kys7DQorICB9DQorfQ0KKw0KK2Jvb2wgU3RyaW5nc0FyZUVxdWFsTm9DYXNlX0FzY2lpKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikgdGhyb3coKQ0KK3sNCisgIGZvciAoOzspDQorICB7DQorICAgIGNoYXIgYzEgPSAqczErKzsNCisgICAgY2hhciBjMiA9ICpzMisrOw0KKyAgICBpZiAoYzEgIT0gYzIgJiYgTXlDaGFyTG93ZXJfQXNjaWkoYzEpICE9IE15Q2hhckxvd2VyX0FzY2lpKGMyKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIGlmIChjMSA9PSAwKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KK30NCisNCitib29sIFN0cmluZ3NBcmVFcXVhbE5vQ2FzZV9Bc2NpaShjb25zdCB3Y2hhcl90ICpzMSwgY29uc3Qgd2NoYXJfdCAqczIpIHRocm93KCkNCit7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICB3Y2hhcl90IGMxID0gKnMxKys7DQorICAgIHdjaGFyX3QgYzIgPSAqczIrKzsNCisgICAgaWYgKGMxICE9IGMyICYmIE15Q2hhckxvd2VyX0FzY2lpKGMxKSAhPSBNeUNoYXJMb3dlcl9Bc2NpaShjMikpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBpZiAoYzEgPT0gMCkNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCit9DQorDQorYm9vbCBTdHJpbmdzQXJlRXF1YWxOb0Nhc2VfQXNjaWkoY29uc3Qgd2NoYXJfdCAqczEsIGNvbnN0IGNoYXIgKnMyKSB0aHJvdygpDQorew0KKyAgZm9yICg7OykNCisgIHsNCisgICAgd2NoYXJfdCBjMSA9ICpzMSsrOw0KKyAgICBjaGFyIGMyID0gKnMyKys7DQorICAgIGlmIChjMSAhPSAodW5zaWduZWQgY2hhciljMiAmJiAoYzEgPiAweDdGIHx8IE15Q2hhckxvd2VyX0FzY2lpKGMxKSAhPSAodW5zaWduZWQgY2hhcilNeUNoYXJMb3dlcl9Bc2NpaShjMikpKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgaWYgKGMxID09IDApDQorICAgICAgcmV0dXJuIHRydWU7DQorICB9DQorfQ0KKw0KK2Jvb2wgSXNTdHJpbmcxUHJlZml4ZWRCeVN0cmluZzIoY29uc3Qgd2NoYXJfdCAqczEsIGNvbnN0IHdjaGFyX3QgKnMyKSB0aHJvdygpDQorew0KKyAgZm9yICg7OykNCisgIHsNCisgICAgd2NoYXJfdCBjMiA9ICpzMisrOyBpZiAoYzIgPT0gMCkgcmV0dXJuIHRydWU7DQorICAgIHdjaGFyX3QgYzEgPSAqczErKzsgaWYgKGMxICE9IGMyKSByZXR1cm4gZmFsc2U7DQorICB9DQorfQ0KKw0KKy8vIE5URlMgb3JkZXI6IHVzZXMgdXBwZXIgY2FzZQ0KK2ludCBNeVN0cmluZ0NvbXBhcmVOb0Nhc2UoY29uc3Qgd2NoYXJfdCAqczEsIGNvbnN0IHdjaGFyX3QgKnMyKSB0aHJvdygpDQorew0KKyAgZm9yICg7OykNCisgIHsNCisgICAgd2NoYXJfdCBjMSA9ICpzMSsrOw0KKyAgICB3Y2hhcl90IGMyID0gKnMyKys7DQorICAgIGlmIChjMSAhPSBjMikNCisgICAgew0KKyAgICAgIHdjaGFyX3QgdTEgPSBNeUNoYXJVcHBlcihjMSk7DQorICAgICAgd2NoYXJfdCB1MiA9IE15Q2hhclVwcGVyKGMyKTsNCisgICAgICBpZiAodTEgPCB1MikgcmV0dXJuIC0xOw0KKyAgICAgIGlmICh1MSA+IHUyKSByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBpZiAoYzEgPT0gMCkgcmV0dXJuIDA7DQorICB9DQorfQ0KKw0KK2ludCBNeVN0cmluZ0NvbXBhcmVOb0Nhc2VfTihjb25zdCB3Y2hhcl90ICpzMSwgY29uc3Qgd2NoYXJfdCAqczIsIHVuc2lnbmVkIG51bSkgdGhyb3coKQ0KK3sNCisgIGZvciAoOyBudW0gIT0gMDsgbnVtLS0pDQorICB7DQorICAgIHdjaGFyX3QgYzEgPSAqczErKzsNCisgICAgd2NoYXJfdCBjMiA9ICpzMisrOw0KKyAgICBpZiAoYzEgIT0gYzIpDQorICAgIHsNCisgICAgICB3Y2hhcl90IHUxID0gTXlDaGFyVXBwZXIoYzEpOw0KKyAgICAgIHdjaGFyX3QgdTIgPSBNeUNoYXJVcHBlcihjMik7DQorICAgICAgaWYgKHUxIDwgdTIpIHJldHVybiAtMTsNCisgICAgICBpZiAodTEgPiB1MikgcmV0dXJuIDE7DQorICAgIH0NCisgICAgaWYgKGMxID09IDApIHJldHVybiAwOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KKw0KKy8vIC0tLS0tLS0tLS0gQVN0cmluZyAtLS0tLS0tLS0tDQorDQordm9pZCBBU3RyaW5nOjpJbnNlcnRTcGFjZSh1bnNpZ25lZCAmaW5kZXgsIHVuc2lnbmVkIHNpemUpDQorew0KKyAgR3JvdyhzaXplKTsNCisgIE1vdmVJdGVtcyhpbmRleCArIHNpemUsIGluZGV4KTsNCit9DQorDQordm9pZCBBU3RyaW5nOjpSZUFsbG9jKHVuc2lnbmVkIG5ld0xpbWl0KQ0KK3sNCisgIGlmIChuZXdMaW1pdCA8IF9sZW4gfHwgbmV3TGltaXQgPj0gMHgyMDAwMDAwMCkgdGhyb3cgMjAxMzAyMjA7DQorICAvLyBNWV9TVFJJTkdfUkVBTExPQyhfY2hhcnMsIGNoYXIsIG5ld0xpbWl0ICsgMSwgX2xlbiArIDEpOw0KKyAgY2hhciAqbmV3QnVmID0gTVlfU1RSSU5HX05FVyhjaGFyLCBuZXdMaW1pdCArIDEpOw0KKyAgbWVtY3B5KG5ld0J1ZiwgX2NoYXJzLCAoc2l6ZV90KShfbGVuICsgMSkpOyBcDQorICBNWV9TVFJJTkdfREVMRVRFKF9jaGFycyk7DQorICBfY2hhcnMgPSBuZXdCdWY7DQorDQorICBfbGltaXQgPSBuZXdMaW1pdDsNCit9DQorDQordm9pZCBBU3RyaW5nOjpTZXRTdGFydExlbih1bnNpZ25lZCBsZW4pDQorew0KKyAgX2NoYXJzID0gMDsNCisgIF9jaGFycyA9IE1ZX1NUUklOR19ORVcoY2hhciwgbGVuICsgMSk7DQorICBfbGVuID0gbGVuOw0KKyAgX2xpbWl0ID0gbGVuOw0KK30NCisNCit2b2lkIEFTdHJpbmc6Okdyb3dfMSgpDQorew0KKyAgdW5zaWduZWQgbmV4dCA9IF9sZW47DQorICBuZXh0ICs9IG5leHQgLyAyOw0KKyAgbmV4dCArPSAxNjsNCisgIG5leHQgJj0gfih1bnNpZ25lZCkxNTsNCisgIFJlQWxsb2MobmV4dCAtIDEpOw0KK30NCisNCit2b2lkIEFTdHJpbmc6Okdyb3codW5zaWduZWQgbikNCit7DQorICB1bnNpZ25lZCBmcmVlU2l6ZSA9IF9saW1pdCAtIF9sZW47DQorICBpZiAobiA8PSBmcmVlU2l6ZSkNCisgICAgcmV0dXJuOw0KKyAgDQorICB1bnNpZ25lZCBuZXh0ID0gX2xlbiArIG47DQorICBuZXh0ICs9IG5leHQgLyAyOw0KKyAgbmV4dCArPSAxNjsNCisgIG5leHQgJj0gfih1bnNpZ25lZCkxNTsNCisgIFJlQWxsb2MobmV4dCAtIDEpOw0KK30NCisNCisvKg0KK0FTdHJpbmc6OkFTdHJpbmcodW5zaWduZWQgbnVtLCBjb25zdCBjaGFyICpzKQ0KK3sNCisgIHVuc2lnbmVkIGxlbiA9IE15U3RyaW5nTGVuKHMpOw0KKyAgaWYgKG51bSA+IGxlbikNCisgICAgbnVtID0gbGVuOw0KKyAgU2V0U3RhcnRMZW4obnVtKTsNCisgIG1lbWNweShfY2hhcnMsIHMsIG51bSk7DQorICBfY2hhcnNbbnVtXSA9IDA7DQorfQ0KKyovDQorDQorQVN0cmluZzo6QVN0cmluZyh1bnNpZ25lZCBudW0sIGNvbnN0IEFTdHJpbmcgJnMpDQorew0KKyAgaWYgKG51bSA+IHMuX2xlbikNCisgICAgbnVtID0gcy5fbGVuOw0KKyAgU2V0U3RhcnRMZW4obnVtKTsNCisgIG1lbWNweShfY2hhcnMsIHMuX2NoYXJzLCBudW0pOw0KKyAgX2NoYXJzW251bV0gPSAwOw0KK30NCisNCitBU3RyaW5nOjpBU3RyaW5nKGNvbnN0IEFTdHJpbmcgJnMsIGNoYXIgYykNCit7DQorICBTZXRTdGFydExlbihzLkxlbigpICsgMSk7DQorICBjaGFyICpjaGFycyA9IF9jaGFyczsNCisgIHVuc2lnbmVkIGxlbiA9IHMuTGVuKCk7DQorICBtZW1jcHkoY2hhcnMsIHMsIGxlbik7DQorICBjaGFyc1tsZW5dID0gYzsNCisgIGNoYXJzW2xlbiArIDFdID0gMDsNCit9DQorDQorQVN0cmluZzo6QVN0cmluZyhjb25zdCBjaGFyICpzMSwgdW5zaWduZWQgbnVtMSwgY29uc3QgY2hhciAqczIsIHVuc2lnbmVkIG51bTIpDQorew0KKyAgU2V0U3RhcnRMZW4obnVtMSArIG51bTIpOw0KKyAgY2hhciAqY2hhcnMgPSBfY2hhcnM7DQorICBtZW1jcHkoY2hhcnMsIHMxLCBudW0xKTsNCisgIG1lbWNweShjaGFycyArIG51bTEsIHMyLCBudW0yICsgMSk7DQorfQ0KKw0KK0FTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IEFTdHJpbmcgJnMxLCBjb25zdCBBU3RyaW5nICZzMikgeyByZXR1cm4gQVN0cmluZyhzMSwgczEuTGVuKCksIHMyLCBzMi5MZW4oKSk7IH0NCitBU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBBU3RyaW5nICZzMSwgY29uc3QgY2hhciAgICAqczIpIHsgcmV0dXJuIEFTdHJpbmcoczEsIHMxLkxlbigpLCBzMiwgTXlTdHJpbmdMZW4oczIpKTsgfQ0KK0FTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IGNoYXIgICAgKnMxLCBjb25zdCBBU3RyaW5nICZzMikgeyByZXR1cm4gQVN0cmluZyhzMSwgTXlTdHJpbmdMZW4oczEpLCBzMiwgczIuTGVuKCkpOyB9DQorDQorQVN0cmluZzo6QVN0cmluZygpDQorew0KKyAgX2NoYXJzID0gMDsNCisgIF9jaGFycyA9IE1ZX1NUUklOR19ORVcoY2hhciwgNCk7DQorICBfbGVuID0gMDsNCisgIF9saW1pdCA9IDQgLSAxOw0KKyAgX2NoYXJzWzBdID0gMDsNCit9DQorDQorQVN0cmluZzo6QVN0cmluZyhjaGFyIGMpDQorew0KKyAgU2V0U3RhcnRMZW4oMSk7DQorICBfY2hhcnNbMF0gPSBjOw0KKyAgX2NoYXJzWzFdID0gMDsNCit9DQorDQorQVN0cmluZzo6QVN0cmluZyhjb25zdCBjaGFyICpzKQ0KK3sNCisgIFNldFN0YXJ0TGVuKE15U3RyaW5nTGVuKHMpKTsNCisgIE15U3RyaW5nQ29weShfY2hhcnMsIHMpOw0KK30NCisNCitBU3RyaW5nOjpBU3RyaW5nKGNvbnN0IEFTdHJpbmcgJnMpDQorew0KKyAgU2V0U3RhcnRMZW4ocy5fbGVuKTsNCisgIE15U3RyaW5nQ29weShfY2hhcnMsIHMuX2NoYXJzKTsNCit9DQorDQorQVN0cmluZyAmQVN0cmluZzo6b3BlcmF0b3I9KGNoYXIgYykNCit7DQorICBpZiAoMSA+IF9saW1pdCkNCisgIHsNCisgICAgY2hhciAqbmV3QnVmID0gTVlfU1RSSU5HX05FVyhjaGFyLCAxICsgMSk7DQorICAgIE1ZX1NUUklOR19ERUxFVEUoX2NoYXJzKTsNCisgICAgX2NoYXJzID0gbmV3QnVmOw0KKyAgICBfbGltaXQgPSAxOw0KKyAgfQ0KKyAgX2xlbiA9IDE7DQorICBfY2hhcnNbMF0gPSBjOw0KKyAgX2NoYXJzWzFdID0gMDsNCisgIHJldHVybiAqdGhpczsNCit9DQorDQorQVN0cmluZyAmQVN0cmluZzo6b3BlcmF0b3I9KGNvbnN0IGNoYXIgKnMpDQorew0KKyAgdW5zaWduZWQgbGVuID0gTXlTdHJpbmdMZW4ocyk7DQorICBpZiAobGVuID4gX2xpbWl0KQ0KKyAgew0KKyAgICBjaGFyICpuZXdCdWYgPSBNWV9TVFJJTkdfTkVXKGNoYXIsIGxlbiArIDEpOw0KKyAgICBNWV9TVFJJTkdfREVMRVRFKF9jaGFycyk7DQorICAgIF9jaGFycyA9IG5ld0J1ZjsNCisgICAgX2xpbWl0ID0gbGVuOw0KKyAgfQ0KKyAgX2xlbiA9IGxlbjsNCisgIE15U3RyaW5nQ29weShfY2hhcnMsIHMpOw0KKyAgcmV0dXJuICp0aGlzOw0KK30NCisNCitBU3RyaW5nICZBU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgQVN0cmluZyAmcykNCit7DQorICBpZiAoJnMgPT0gdGhpcykNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgdW5zaWduZWQgbGVuID0gcy5fbGVuOw0KKyAgaWYgKGxlbiA+IF9saW1pdCkNCisgIHsNCisgICAgY2hhciAqbmV3QnVmID0gTVlfU1RSSU5HX05FVyhjaGFyLCBsZW4gKyAxKTsNCisgICAgTVlfU1RSSU5HX0RFTEVURShfY2hhcnMpOw0KKyAgICBfY2hhcnMgPSBuZXdCdWY7DQorICAgIF9saW1pdCA9IGxlbjsNCisgIH0NCisgIF9sZW4gPSBsZW47DQorICBNeVN0cmluZ0NvcHkoX2NoYXJzLCBzLl9jaGFycyk7DQorICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK0FTdHJpbmcgJkFTdHJpbmc6Om9wZXJhdG9yKz0oY29uc3QgY2hhciAqcykNCit7DQorICB1bnNpZ25lZCBsZW4gPSBNeVN0cmluZ0xlbihzKTsNCisgIEdyb3cobGVuKTsNCisgIE15U3RyaW5nQ29weShfY2hhcnMgKyBfbGVuLCBzKTsNCisgIF9sZW4gKz0gbGVuOw0KKyAgcmV0dXJuICp0aGlzOw0KK30NCisNCitBU3RyaW5nICZBU3RyaW5nOjpvcGVyYXRvcis9KGNvbnN0IEFTdHJpbmcgJnMpDQorew0KKyAgR3JvdyhzLl9sZW4pOw0KKyAgTXlTdHJpbmdDb3B5KF9jaGFycyArIF9sZW4sIHMuX2NoYXJzKTsNCisgIF9sZW4gKz0gcy5fbGVuOw0KKyAgcmV0dXJuICp0aGlzOw0KK30NCisNCit2b2lkIEFTdHJpbmc6OlNldEZyb20oY29uc3QgY2hhciAqcywgdW5zaWduZWQgbGVuKSAvLyBubyBjaGVjaw0KK3sNCisgIGlmIChsZW4gPiBfbGltaXQpDQorICB7DQorICAgIGNoYXIgKm5ld0J1ZiA9IE1ZX1NUUklOR19ORVcoY2hhciwgbGVuICsgMSk7DQorICAgIE1ZX1NUUklOR19ERUxFVEUoX2NoYXJzKTsNCisgICAgX2NoYXJzID0gbmV3QnVmOw0KKyAgICBfbGltaXQgPSBsZW47DQorICB9DQorICBtZW1jcHkoX2NoYXJzLCBzLCBsZW4pOw0KKyAgX2NoYXJzW2xlbl0gPSAwOw0KKyAgX2xlbiA9IGxlbjsNCit9DQorDQoraW50IEFTdHJpbmc6OkZpbmQoY29uc3QgQVN0cmluZyAmcywgdW5zaWduZWQgc3RhcnRJbmRleCkgY29uc3QgdGhyb3coKQ0KK3sNCisgIGlmIChzLklzRW1wdHkoKSkNCisgICAgcmV0dXJuIHN0YXJ0SW5kZXg7DQorICBmb3IgKDsgc3RhcnRJbmRleCA8IF9sZW47IHN0YXJ0SW5kZXgrKykNCisgIHsNCisgICAgdW5zaWduZWQgajsNCisgICAgZm9yIChqID0gMDsgaiA8IHMuX2xlbiAmJiBzdGFydEluZGV4ICsgaiA8IF9sZW47IGorKykNCisgICAgICBpZiAoX2NoYXJzW3N0YXJ0SW5kZXggKyBqXSAhPSBzLl9jaGFyc1tqXSkNCisgICAgICAgIGJyZWFrOw0KKyAgICBpZiAoaiA9PSBzLl9sZW4pDQorICAgICAgcmV0dXJuIChpbnQpc3RhcnRJbmRleDsNCisgIH0NCisgIHJldHVybiAtMTsNCit9DQorDQoraW50IEFTdHJpbmc6OlJldmVyc2VGaW5kKGNoYXIgYykgY29uc3QgdGhyb3coKQ0KK3sNCisgIGlmIChfbGVuID09IDApDQorICAgIHJldHVybiAtMTsNCisgIGNvbnN0IGNoYXIgKnAgPSBfY2hhcnMgKyBfbGVuIC0gMTsNCisgIGZvciAoOzspDQorICB7DQorICAgIGlmICgqcCA9PSBjKQ0KKyAgICAgIHJldHVybiAoaW50KShwIC0gX2NoYXJzKTsNCisgICAgaWYgKHAgPT0gX2NoYXJzKQ0KKyAgICAgIHJldHVybiAtMTsNCisgICAgcC0tOyAvLyBwID0gR2V0UHJldkNoYXJQb2ludGVyKF9jaGFycywgcCk7DQorICB9DQorfQ0KKw0KK3ZvaWQgQVN0cmluZzo6VHJpbUxlZnQoKSB0aHJvdygpDQorew0KKyAgY29uc3QgY2hhciAqcCA9IF9jaGFyczsNCisgIGZvciAoOzsgcCsrKQ0KKyAgew0KKyAgICBjaGFyIGMgPSAqcDsNCisgICAgaWYgKGMgIT0gJyAnICYmIGMgIT0gJ1xuJyAmJiBjICE9ICdcdCcpDQorICAgICAgYnJlYWs7DQorICB9DQorICB1bnNpZ25lZCBwb3MgPSAodW5zaWduZWQpKHAgLSBfY2hhcnMpOw0KKyAgaWYgKHBvcyAhPSAwKQ0KKyAgew0KKyAgICBNb3ZlSXRlbXMoMCwgcG9zKTsNCisgICAgX2xlbiAtPSBwb3M7DQorICB9DQorfQ0KKw0KK3ZvaWQgQVN0cmluZzo6VHJpbVJpZ2h0KCkgdGhyb3coKQ0KK3sNCisgIGNvbnN0IGNoYXIgKnAgPSBfY2hhcnM7DQorICBpbnQgaTsNCisgIGZvciAoaSA9IF9sZW4gLSAxOyBpID49IDA7IGktLSkNCisgIHsNCisgICAgY2hhciBjID0gcFtpXTsNCisgICAgaWYgKGMgIT0gJyAnICYmIGMgIT0gJ1xuJyAmJiBjICE9ICdcdCcpDQorICAgICAgYnJlYWs7DQorICB9DQorICBpKys7DQorICBpZiAoKHVuc2lnbmVkKWkgIT0gX2xlbikNCisgIHsNCisgICAgX2NoYXJzW2ldID0gMDsNCisgICAgX2xlbiA9IGk7DQorICB9DQorfQ0KKw0KK3ZvaWQgQVN0cmluZzo6SW5zZXJ0QXRGcm9udChjaGFyIGMpDQorew0KKyAgaWYgKF9saW1pdCA9PSBfbGVuKQ0KKyAgICBHcm93XzEoKTsNCisgIE1vdmVJdGVtcygxLCAwKTsNCisgIF9jaGFyc1swXSA9IGM7DQorICBfbGVuKys7DQorfQ0KKw0KKy8qDQordm9pZCBBU3RyaW5nOjpJbnNlcnQodW5zaWduZWQgaW5kZXgsIGNoYXIgYykNCit7DQorICBJbnNlcnRTcGFjZShpbmRleCwgMSk7DQorICBfY2hhcnNbaW5kZXhdID0gYzsNCisgIF9sZW4rKzsNCit9DQorKi8NCisNCit2b2lkIEFTdHJpbmc6Okluc2VydCh1bnNpZ25lZCBpbmRleCwgY29uc3QgY2hhciAqcykNCit7DQorICB1bnNpZ25lZCBudW0gPSBNeVN0cmluZ0xlbihzKTsNCisgIGlmIChudW0gIT0gMCkNCisgIHsNCisgICAgSW5zZXJ0U3BhY2UoaW5kZXgsIG51bSk7DQorICAgIG1lbWNweShfY2hhcnMgKyBpbmRleCwgcywgbnVtKTsNCisgICAgX2xlbiArPSBudW07DQorICB9DQorfQ0KKw0KK3ZvaWQgQVN0cmluZzo6SW5zZXJ0KHVuc2lnbmVkIGluZGV4LCBjb25zdCBBU3RyaW5nICZzKQ0KK3sNCisgIHVuc2lnbmVkIG51bSA9IHMuTGVuKCk7DQorICBpZiAobnVtICE9IDApDQorICB7DQorICAgIEluc2VydFNwYWNlKGluZGV4LCBudW0pOw0KKyAgICBtZW1jcHkoX2NoYXJzICsgaW5kZXgsIHMsIG51bSk7DQorICAgIF9sZW4gKz0gbnVtOw0KKyAgfQ0KK30NCisNCit2b2lkIEFTdHJpbmc6OlJlbW92ZUNoYXIoY2hhciBjaCkgdGhyb3coKQ0KK3sNCisgIGludCBwb3MgPSBGaW5kKGNoKTsNCisgIGlmIChwb3MgPCAwKQ0KKyAgICByZXR1cm47DQorICBjb25zdCBjaGFyICpzcmMgPSBfY2hhcnM7DQorICBjaGFyICpkZXN0ID0gX2NoYXJzICsgcG9zOw0KKyAgcG9zKys7DQorICB1bnNpZ25lZCBsZW4gPSBfbGVuOw0KKyAgZm9yICg7ICh1bnNpZ25lZClwb3MgPCBsZW47IHBvcysrKQ0KKyAgew0KKyAgICBjaGFyIGMgPSBzcmNbKHVuc2lnbmVkKXBvc107DQorICAgIGlmIChjICE9IGNoKQ0KKyAgICAgICpkZXN0KysgPSBjOw0KKyAgfQ0KKyAgKmRlc3QgPSAwOw0KKyAgX2xlbiA9ICh1bnNpZ25lZCkoZGVzdCAtIF9jaGFycyk7DQorfQ0KKw0KKy8vICEhISEhISEhISEhISEhISB0ZXN0IGl0IGlmIG5ld0NoYXIgPSAnXDAnDQordm9pZCBBU3RyaW5nOjpSZXBsYWNlKGNoYXIgb2xkQ2hhciwgY2hhciBuZXdDaGFyKSB0aHJvdygpDQorew0KKyAgaWYgKG9sZENoYXIgPT0gbmV3Q2hhcikNCisgICAgcmV0dXJuOyAvLyAwOw0KKyAgLy8gdW5zaWduZWQgbnVtYmVyID0gMDsNCisgIGludCBwb3MgPSAwOw0KKyAgd2hpbGUgKCh1bnNpZ25lZClwb3MgPCBfbGVuKQ0KKyAgew0KKyAgICBwb3MgPSBGaW5kKG9sZENoYXIsIHBvcyk7DQorICAgIGlmIChwb3MgPCAwKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBfY2hhcnNbcG9zXSA9IG5ld0NoYXI7DQorICAgIHBvcysrOw0KKyAgICAvLyBudW1iZXIrKzsNCisgIH0NCisgIHJldHVybjsgLy8gIG51bWJlcjsNCit9DQorDQordm9pZCBBU3RyaW5nOjpSZXBsYWNlKGNvbnN0IEFTdHJpbmcgJm9sZFN0cmluZywgY29uc3QgQVN0cmluZyAmbmV3U3RyaW5nKQ0KK3sNCisgIGlmIChvbGRTdHJpbmcuSXNFbXB0eSgpKQ0KKyAgICByZXR1cm47IC8vIDA7DQorICBpZiAob2xkU3RyaW5nID09IG5ld1N0cmluZykNCisgICAgcmV0dXJuOyAvLyAwOw0KKyAgdW5zaWduZWQgb2xkTGVuID0gb2xkU3RyaW5nLkxlbigpOw0KKyAgdW5zaWduZWQgbmV3TGVuID0gbmV3U3RyaW5nLkxlbigpOw0KKyAgLy8gdW5zaWduZWQgbnVtYmVyID0gMDsNCisgIGludCBwb3MgPSAwOw0KKyAgd2hpbGUgKCh1bnNpZ25lZClwb3MgPCBfbGVuKQ0KKyAgew0KKyAgICBwb3MgPSBGaW5kKG9sZFN0cmluZywgcG9zKTsNCisgICAgaWYgKHBvcyA8IDApDQorICAgICAgYnJlYWs7DQorICAgIERlbGV0ZShwb3MsIG9sZExlbik7DQorICAgIEluc2VydChwb3MsIG5ld1N0cmluZyk7DQorICAgIHBvcyArPSBuZXdMZW47DQorICAgIC8vIG51bWJlcisrOw0KKyAgfQ0KKyAgLy8gcmV0dXJuIG51bWJlcjsNCit9DQorDQordm9pZCBBU3RyaW5nOjpEZWxldGUodW5zaWduZWQgaW5kZXgpIHRocm93KCkNCit7DQorICBNb3ZlSXRlbXMoaW5kZXgsIGluZGV4ICsgMSk7DQorICBfbGVuLS07DQorfQ0KKw0KK3ZvaWQgQVN0cmluZzo6RGVsZXRlKHVuc2lnbmVkIGluZGV4LCB1bnNpZ25lZCBjb3VudCkgdGhyb3coKQ0KK3sNCisgIGlmIChpbmRleCArIGNvdW50ID4gX2xlbikNCisgICAgY291bnQgPSBfbGVuIC0gaW5kZXg7DQorICBpZiAoY291bnQgPiAwKQ0KKyAgew0KKyAgICBNb3ZlSXRlbXMoaW5kZXgsIGluZGV4ICsgY291bnQpOw0KKyAgICBfbGVuIC09IGNvdW50Ow0KKyAgfQ0KK30NCisNCit2b2lkIEFTdHJpbmc6OkRlbGV0ZUZyb250YWwodW5zaWduZWQgbnVtKSB0aHJvdygpDQorew0KKyAgaWYgKG51bSAhPSAwKQ0KKyAgew0KKyAgICBNb3ZlSXRlbXMoMCwgbnVtKTsNCisgICAgX2xlbiAtPSBudW07DQorICB9DQorfQ0KKw0KKy8qDQorQVN0cmluZyBvcGVyYXRvcisoY29uc3QgQVN0cmluZyAmczEsIGNvbnN0IEFTdHJpbmcgJnMyKQ0KK3sNCisgIEFTdHJpbmcgcmVzdWx0KHMxKTsNCisgIHJlc3VsdCArPSBzMjsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKw0KK0FTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IEFTdHJpbmcgJnMsIGNvbnN0IGNoYXIgKmNoYXJzKQ0KK3sNCisgIEFTdHJpbmcgcmVzdWx0KHMpOw0KKyAgcmVzdWx0ICs9IGNoYXJzOw0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQorDQorQVN0cmluZyBvcGVyYXRvcisoY29uc3QgY2hhciAqY2hhcnMsIGNvbnN0IEFTdHJpbmcgJnMpDQorew0KKyAgQVN0cmluZyByZXN1bHQoY2hhcnMpOw0KKyAgcmVzdWx0ICs9IHM7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisNCitBU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBBU3RyaW5nICZzLCBjaGFyIGMpDQorew0KKyAgQVN0cmluZyByZXN1bHQocyk7DQorICByZXN1bHQgKz0gYzsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKyovDQorDQorLyoNCitBU3RyaW5nIG9wZXJhdG9yKyhjaGFyIGMsIGNvbnN0IEFTdHJpbmcgJnMpDQorew0KKyAgQVN0cmluZyByZXN1bHQoYyk7DQorICByZXN1bHQgKz0gczsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKyovDQorDQorDQorDQorDQorLy8gLS0tLS0tLS0tLSBVU3RyaW5nIC0tLS0tLS0tLS0NCisNCit2b2lkIFVTdHJpbmc6Okluc2VydFNwYWNlKHVuc2lnbmVkIGluZGV4LCB1bnNpZ25lZCBzaXplKQ0KK3sNCisgIEdyb3coc2l6ZSk7DQorICBNb3ZlSXRlbXMoaW5kZXggKyBzaXplLCBpbmRleCk7DQorfQ0KKw0KK3ZvaWQgVVN0cmluZzo6UmVBbGxvYyh1bnNpZ25lZCBuZXdMaW1pdCkNCit7DQorICBpZiAobmV3TGltaXQgPCBfbGVuIHx8IG5ld0xpbWl0ID49IDB4MjAwMDAwMDApIHRocm93IDIwMTMwMjIxOw0KKyAgLy8gTVlfU1RSSU5HX1JFQUxMT0MoX2NoYXJzLCB3Y2hhcl90LCBuZXdMaW1pdCArIDEsIF9sZW4gKyAxKTsNCisgIHdjaGFyX3QgKm5ld0J1ZiA9IE1ZX1NUUklOR19ORVcod2NoYXJfdCwgbmV3TGltaXQgKyAxKTsNCisgIHdtZW1jcHkobmV3QnVmLCBfY2hhcnMsIF9sZW4gKyAxKTsNCisgIE1ZX1NUUklOR19ERUxFVEUoX2NoYXJzKTsNCisgIF9jaGFycyA9IG5ld0J1ZjsNCisNCisgIF9saW1pdCA9IG5ld0xpbWl0Ow0KK30NCisNCit2b2lkIFVTdHJpbmc6OlNldFN0YXJ0TGVuKHVuc2lnbmVkIGxlbikNCit7DQorICBfY2hhcnMgPSAwOw0KKyAgX2NoYXJzID0gTVlfU1RSSU5HX05FVyh3Y2hhcl90LCBsZW4gKyAxKTsNCisgIF9sZW4gPSBsZW47DQorICBfbGltaXQgPSBsZW47DQorfQ0KKw0KK3ZvaWQgVVN0cmluZzo6R3Jvd18xKCkNCit7DQorICB1bnNpZ25lZCBuZXh0ID0gX2xlbjsNCisgIG5leHQgKz0gbmV4dCAvIDI7DQorICBuZXh0ICs9IDE2Ow0KKyAgbmV4dCAmPSB+KHVuc2lnbmVkKTE1Ow0KKyAgUmVBbGxvYyhuZXh0IC0gMSk7DQorfQ0KKw0KK3ZvaWQgVVN0cmluZzo6R3Jvdyh1bnNpZ25lZCBuKQ0KK3sNCisgIHVuc2lnbmVkIGZyZWVTaXplID0gX2xpbWl0IC0gX2xlbjsNCisgIGlmIChuIDw9IGZyZWVTaXplKQ0KKyAgICByZXR1cm47DQorICANCisgIHVuc2lnbmVkIG5leHQgPSBfbGVuICsgbjsNCisgIG5leHQgKz0gbmV4dCAvIDI7DQorICBuZXh0ICs9IDE2Ow0KKyAgbmV4dCAmPSB+KHVuc2lnbmVkKTE1Ow0KKyAgUmVBbGxvYyhuZXh0IC0gMSk7DQorfQ0KKw0KKw0KK1VTdHJpbmc6OlVTdHJpbmcodW5zaWduZWQgbnVtLCBjb25zdCB3Y2hhcl90ICpzKQ0KK3sNCisgIHVuc2lnbmVkIGxlbiA9IE15U3RyaW5nTGVuKHMpOw0KKyAgaWYgKG51bSA+IGxlbikNCisgICAgbnVtID0gbGVuOw0KKyAgU2V0U3RhcnRMZW4obnVtKTsNCisgIHdtZW1jcHkoX2NoYXJzLCBzLCBudW0pOw0KKyAgX2NoYXJzW251bV0gPSAwOw0KK30NCisNCisNCitVU3RyaW5nOjpVU3RyaW5nKHVuc2lnbmVkIG51bSwgY29uc3QgVVN0cmluZyAmcykNCit7DQorICBpZiAobnVtID4gcy5fbGVuKQ0KKyAgICBudW0gPSBzLl9sZW47DQorICBTZXRTdGFydExlbihudW0pOw0KKyAgd21lbWNweShfY2hhcnMsIHMuX2NoYXJzLCBudW0pOw0KKyAgX2NoYXJzW251bV0gPSAwOw0KK30NCisNCitVU3RyaW5nOjpVU3RyaW5nKGNvbnN0IFVTdHJpbmcgJnMsIHdjaGFyX3QgYykNCit7DQorICBTZXRTdGFydExlbihzLkxlbigpICsgMSk7DQorICB3Y2hhcl90ICpjaGFycyA9IF9jaGFyczsNCisgIHVuc2lnbmVkIGxlbiA9IHMuTGVuKCk7DQorICB3bWVtY3B5KGNoYXJzLCBzLCBsZW4pOw0KKyAgY2hhcnNbbGVuXSA9IGM7DQorICBjaGFyc1tsZW4gKyAxXSA9IDA7DQorfQ0KKw0KK1VTdHJpbmc6OlVTdHJpbmcoY29uc3Qgd2NoYXJfdCAqczEsIHVuc2lnbmVkIG51bTEsIGNvbnN0IHdjaGFyX3QgKnMyLCB1bnNpZ25lZCBudW0yKQ0KK3sNCisgIFNldFN0YXJ0TGVuKG51bTEgKyBudW0yKTsNCisgIHdjaGFyX3QgKmNoYXJzID0gX2NoYXJzOw0KKyAgd21lbWNweShjaGFycywgczEsIG51bTEpOw0KKyAgd21lbWNweShjaGFycyArIG51bTEsIHMyLCBudW0yICsgMSk7DQorfQ0KKw0KK1VTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IFVTdHJpbmcgJnMxLCBjb25zdCBVU3RyaW5nICZzMikgeyByZXR1cm4gVVN0cmluZyhzMSwgczEuTGVuKCksIHMyLCBzMi5MZW4oKSk7IH0NCitVU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBVU3RyaW5nICZzMSwgY29uc3Qgd2NoYXJfdCAqczIpIHsgcmV0dXJuIFVTdHJpbmcoczEsIHMxLkxlbigpLCBzMiwgTXlTdHJpbmdMZW4oczIpKTsgfQ0KK1VTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IHdjaGFyX3QgKnMxLCBjb25zdCBVU3RyaW5nICZzMikgeyByZXR1cm4gVVN0cmluZyhzMSwgTXlTdHJpbmdMZW4oczEpLCBzMiwgczIuTGVuKCkpOyB9DQorDQorVVN0cmluZzo6VVN0cmluZygpDQorew0KKyAgX2NoYXJzID0gMDsNCisgIF9jaGFycyA9IE1ZX1NUUklOR19ORVcod2NoYXJfdCwgNCk7DQorICBfbGVuID0gMDsNCisgIF9saW1pdCA9IDQgLSAxOw0KKyAgX2NoYXJzWzBdID0gMDsNCit9DQorDQorVVN0cmluZzo6VVN0cmluZyh3Y2hhcl90IGMpDQorew0KKyAgU2V0U3RhcnRMZW4oMSk7DQorICBfY2hhcnNbMF0gPSBjOw0KKyAgX2NoYXJzWzFdID0gMDsNCit9DQorDQorVVN0cmluZzo6VVN0cmluZyhjb25zdCB3Y2hhcl90ICpzKQ0KK3sNCisgIFNldFN0YXJ0TGVuKE15U3RyaW5nTGVuKHMpKTsNCisgIE15U3RyaW5nQ29weShfY2hhcnMsIHMpOw0KK30NCisNCitVU3RyaW5nOjpVU3RyaW5nKGNvbnN0IFVTdHJpbmcgJnMpDQorew0KKyAgU2V0U3RhcnRMZW4ocy5fbGVuKTsNCisgIE15U3RyaW5nQ29weShfY2hhcnMsIHMuX2NoYXJzKTsNCit9DQorDQorVVN0cmluZyAmVVN0cmluZzo6b3BlcmF0b3I9KHdjaGFyX3QgYykNCit7DQorICBpZiAoMSA+IF9saW1pdCkNCisgIHsNCisgICAgd2NoYXJfdCAqbmV3QnVmID0gTVlfU1RSSU5HX05FVyh3Y2hhcl90LCAxICsgMSk7DQorICAgIE1ZX1NUUklOR19ERUxFVEUoX2NoYXJzKTsNCisgICAgX2NoYXJzID0gbmV3QnVmOw0KKyAgICBfbGltaXQgPSAxOw0KKyAgfQ0KKyAgX2xlbiA9IDE7DQorICBfY2hhcnNbMF0gPSBjOw0KKyAgX2NoYXJzWzFdID0gMDsNCisgIHJldHVybiAqdGhpczsNCit9DQorDQorVVN0cmluZyAmVVN0cmluZzo6b3BlcmF0b3I9KGNvbnN0IHdjaGFyX3QgKnMpDQorew0KKyAgdW5zaWduZWQgbGVuID0gTXlTdHJpbmdMZW4ocyk7DQorICBpZiAobGVuID4gX2xpbWl0KQ0KKyAgew0KKyAgICB3Y2hhcl90ICpuZXdCdWYgPSBNWV9TVFJJTkdfTkVXKHdjaGFyX3QsIGxlbiArIDEpOw0KKyAgICBNWV9TVFJJTkdfREVMRVRFKF9jaGFycyk7DQorICAgIF9jaGFycyA9IG5ld0J1ZjsNCisgICAgX2xpbWl0ID0gbGVuOw0KKyAgfQ0KKyAgX2xlbiA9IGxlbjsNCisgIE15U3RyaW5nQ29weShfY2hhcnMsIHMpOw0KKyAgcmV0dXJuICp0aGlzOw0KK30NCisNCitVU3RyaW5nICZVU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgVVN0cmluZyAmcykNCit7DQorICBpZiAoJnMgPT0gdGhpcykNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgdW5zaWduZWQgbGVuID0gcy5fbGVuOw0KKyAgaWYgKGxlbiA+IF9saW1pdCkNCisgIHsNCisgICAgd2NoYXJfdCAqbmV3QnVmID0gTVlfU1RSSU5HX05FVyh3Y2hhcl90LCBsZW4gKyAxKTsNCisgICAgTVlfU1RSSU5HX0RFTEVURShfY2hhcnMpOw0KKyAgICBfY2hhcnMgPSBuZXdCdWY7DQorICAgIF9saW1pdCA9IGxlbjsNCisgIH0NCisgIF9sZW4gPSBsZW47DQorICBNeVN0cmluZ0NvcHkoX2NoYXJzLCBzLl9jaGFycyk7DQorICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK1VTdHJpbmcgJlVTdHJpbmc6Om9wZXJhdG9yKz0oY29uc3Qgd2NoYXJfdCAqcykNCit7DQorICB1bnNpZ25lZCBsZW4gPSBNeVN0cmluZ0xlbihzKTsNCisgIEdyb3cobGVuKTsNCisgIE15U3RyaW5nQ29weShfY2hhcnMgKyBfbGVuLCBzKTsNCisgIF9sZW4gKz0gbGVuOw0KKyAgcmV0dXJuICp0aGlzOw0KK30NCisNCitVU3RyaW5nICZVU3RyaW5nOjpvcGVyYXRvcis9KGNvbnN0IFVTdHJpbmcgJnMpDQorew0KKyAgR3JvdyhzLl9sZW4pOw0KKyAgTXlTdHJpbmdDb3B5KF9jaGFycyArIF9sZW4sIHMuX2NoYXJzKTsNCisgIF9sZW4gKz0gcy5fbGVuOw0KKyAgcmV0dXJuICp0aGlzOw0KK30NCisNCit2b2lkIFVTdHJpbmc6OlNldEZyb20oY29uc3Qgd2NoYXJfdCAqcywgdW5zaWduZWQgbGVuKSAvLyBubyBjaGVjaw0KK3sNCisgIGlmIChsZW4gPiBfbGltaXQpDQorICB7DQorICAgIHdjaGFyX3QgKm5ld0J1ZiA9IE1ZX1NUUklOR19ORVcod2NoYXJfdCwgbGVuICsgMSk7DQorICAgIE1ZX1NUUklOR19ERUxFVEUoX2NoYXJzKTsNCisgICAgX2NoYXJzID0gbmV3QnVmOw0KKyAgICBfbGltaXQgPSBsZW47DQorICB9DQorICB3bWVtY3B5KF9jaGFycywgcywgbGVuKTsNCisgIF9jaGFyc1tsZW5dID0gMDsNCisgIF9sZW4gPSBsZW47DQorfQ0KKw0KK3ZvaWQgVVN0cmluZzo6U2V0RnJvbUFzY2lpKGNvbnN0IGNoYXIgKnMpDQorew0KKyAgdW5zaWduZWQgbGVuID0gTXlTdHJpbmdMZW4ocyk7DQorICBpZiAobGVuID4gX2xpbWl0KQ0KKyAgew0KKyAgICB3Y2hhcl90ICpuZXdCdWYgPSBNWV9TVFJJTkdfTkVXKHdjaGFyX3QsIGxlbiArIDEpOw0KKyAgICBNWV9TVFJJTkdfREVMRVRFKF9jaGFycyk7DQorICAgIF9jaGFycyA9IG5ld0J1ZjsNCisgICAgX2xpbWl0ID0gbGVuOw0KKyAgfQ0KKyAgd2NoYXJfdCAqY2hhcnMgPSBfY2hhcnM7DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspDQorICAgIGNoYXJzW2ldID0gc1tpXTsNCisgIGNoYXJzW2xlbl0gPSAwOw0KKyAgX2xlbiA9IGxlbjsNCit9DQorDQordm9pZCBVU3RyaW5nOjpBZGRBc2NpaVN0cihjb25zdCBjaGFyICpzKQ0KK3sNCisgIHVuc2lnbmVkIGxlbiA9IE15U3RyaW5nTGVuKHMpOw0KKyAgR3JvdyhsZW4pOw0KKyAgd2NoYXJfdCAqY2hhcnMgPSBfY2hhcnMgKyBfbGVuOw0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgaSsrKQ0KKyAgICBjaGFyc1tpXSA9IHNbaV07DQorICBjaGFyc1tsZW5dID0gMDsNCisgIF9sZW4gKz0gbGVuOw0KK30NCisNCisNCisNCitpbnQgVVN0cmluZzo6RmluZChjb25zdCBVU3RyaW5nICZzLCB1bnNpZ25lZCBzdGFydEluZGV4KSBjb25zdCB0aHJvdygpDQorew0KKyAgaWYgKHMuSXNFbXB0eSgpKQ0KKyAgICByZXR1cm4gc3RhcnRJbmRleDsNCisgIGZvciAoOyBzdGFydEluZGV4IDwgX2xlbjsgc3RhcnRJbmRleCsrKQ0KKyAgew0KKyAgICB1bnNpZ25lZCBqOw0KKyAgICBmb3IgKGogPSAwOyBqIDwgcy5fbGVuICYmIHN0YXJ0SW5kZXggKyBqIDwgX2xlbjsgaisrKQ0KKyAgICAgIGlmIChfY2hhcnNbc3RhcnRJbmRleCArIGpdICE9IHMuX2NoYXJzW2pdKQ0KKyAgICAgICAgYnJlYWs7DQorICAgIGlmIChqID09IHMuX2xlbikNCisgICAgICByZXR1cm4gKGludClzdGFydEluZGV4Ow0KKyAgfQ0KKyAgcmV0dXJuIC0xOw0KK30NCisNCitpbnQgVVN0cmluZzo6UmV2ZXJzZUZpbmQod2NoYXJfdCBjKSBjb25zdCB0aHJvdygpDQorew0KKyAgaWYgKF9sZW4gPT0gMCkNCisgICAgcmV0dXJuIC0xOw0KKyAgY29uc3Qgd2NoYXJfdCAqcCA9IF9jaGFycyArIF9sZW4gLSAxOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgaWYgKCpwID09IGMpDQorICAgICAgcmV0dXJuIChpbnQpKHAgLSBfY2hhcnMpOw0KKyAgICBpZiAocCA9PSBfY2hhcnMpDQorICAgICAgcmV0dXJuIC0xOw0KKyAgICBwLS07DQorICB9DQorfQ0KKw0KK3ZvaWQgVVN0cmluZzo6VHJpbUxlZnQoKSB0aHJvdygpDQorew0KKyAgY29uc3Qgd2NoYXJfdCAqcCA9IF9jaGFyczsNCisgIGZvciAoOzsgcCsrKQ0KKyAgew0KKyAgICB3Y2hhcl90IGMgPSAqcDsNCisgICAgaWYgKGMgIT0gJyAnICYmIGMgIT0gJ1xuJyAmJiBjICE9ICdcdCcpDQorICAgICAgYnJlYWs7DQorICB9DQorICB1bnNpZ25lZCBwb3MgPSAodW5zaWduZWQpKHAgLSBfY2hhcnMpOw0KKyAgaWYgKHBvcyAhPSAwKQ0KKyAgew0KKyAgICBNb3ZlSXRlbXMoMCwgcG9zKTsNCisgICAgX2xlbiAtPSBwb3M7DQorICB9DQorfQ0KKw0KK3ZvaWQgVVN0cmluZzo6VHJpbVJpZ2h0KCkgdGhyb3coKQ0KK3sNCisgIGNvbnN0IHdjaGFyX3QgKnAgPSBfY2hhcnM7DQorICBpbnQgaTsNCisgIGZvciAoaSA9IF9sZW4gLSAxOyBpID49IDA7IGktLSkNCisgIHsNCisgICAgd2NoYXJfdCBjID0gcFtpXTsNCisgICAgaWYgKGMgIT0gJyAnICYmIGMgIT0gJ1xuJyAmJiBjICE9ICdcdCcpDQorICAgICAgYnJlYWs7DQorICB9DQorICBpKys7DQorICBpZiAoKHVuc2lnbmVkKWkgIT0gX2xlbikNCisgIHsNCisgICAgX2NoYXJzW2ldID0gMDsNCisgICAgX2xlbiA9IGk7DQorICB9DQorfQ0KKw0KK3ZvaWQgVVN0cmluZzo6SW5zZXJ0QXRGcm9udCh3Y2hhcl90IGMpDQorew0KKyAgaWYgKF9saW1pdCA9PSBfbGVuKQ0KKyAgICBHcm93XzEoKTsNCisgIE1vdmVJdGVtcygxLCAwKTsNCisgIF9jaGFyc1swXSA9IGM7DQorICBfbGVuKys7DQorfQ0KKw0KKy8qDQordm9pZCBVU3RyaW5nOjpJbnNlcnQodW5zaWduZWQgaW5kZXgsIHdjaGFyX3QgYykNCit7DQorICBJbnNlcnRTcGFjZShpbmRleCwgMSk7DQorICBfY2hhcnNbaW5kZXhdID0gYzsNCisgIF9sZW4rKzsNCit9DQorKi8NCisNCit2b2lkIFVTdHJpbmc6Okluc2VydCh1bnNpZ25lZCBpbmRleCwgY29uc3Qgd2NoYXJfdCAqcykNCit7DQorICB1bnNpZ25lZCBudW0gPSBNeVN0cmluZ0xlbihzKTsNCisgIGlmIChudW0gIT0gMCkNCisgIHsNCisgICAgSW5zZXJ0U3BhY2UoaW5kZXgsIG51bSk7DQorICAgIHdtZW1jcHkoX2NoYXJzICsgaW5kZXgsIHMsIG51bSk7DQorICAgIF9sZW4gKz0gbnVtOw0KKyAgfQ0KK30NCisNCit2b2lkIFVTdHJpbmc6Okluc2VydCh1bnNpZ25lZCBpbmRleCwgY29uc3QgVVN0cmluZyAmcykNCit7DQorICB1bnNpZ25lZCBudW0gPSBzLkxlbigpOw0KKyAgaWYgKG51bSAhPSAwKQ0KKyAgew0KKyAgICBJbnNlcnRTcGFjZShpbmRleCwgbnVtKTsNCisgICAgd21lbWNweShfY2hhcnMgKyBpbmRleCwgcywgbnVtKTsNCisgICAgX2xlbiArPSBudW07DQorICB9DQorfQ0KKw0KK3ZvaWQgVVN0cmluZzo6UmVtb3ZlQ2hhcih3Y2hhcl90IGNoKSB0aHJvdygpDQorew0KKyAgaW50IHBvcyA9IEZpbmQoY2gpOw0KKyAgaWYgKHBvcyA8IDApDQorICAgIHJldHVybjsNCisgIGNvbnN0IHdjaGFyX3QgKnNyYyA9IF9jaGFyczsNCisgIHdjaGFyX3QgKmRlc3QgPSBfY2hhcnMgKyBwb3M7DQorICBwb3MrKzsNCisgIHVuc2lnbmVkIGxlbiA9IF9sZW47DQorICBmb3IgKDsgKHVuc2lnbmVkKXBvcyA8IGxlbjsgcG9zKyspDQorICB7DQorICAgIHdjaGFyX3QgYyA9IHNyY1sodW5zaWduZWQpcG9zXTsNCisgICAgaWYgKGMgIT0gY2gpDQorICAgICAgKmRlc3QrKyA9IGM7DQorICB9DQorICAqZGVzdCA9IDA7DQorICBfbGVuID0gKHVuc2lnbmVkKShkZXN0IC0gX2NoYXJzKTsNCit9DQorDQorLy8gISEhISEhISEhISEhISEhIHRlc3QgaXQgaWYgbmV3Q2hhciA9ICdcMCcNCit2b2lkIFVTdHJpbmc6OlJlcGxhY2Uod2NoYXJfdCBvbGRDaGFyLCB3Y2hhcl90IG5ld0NoYXIpIHRocm93KCkNCit7DQorICBpZiAob2xkQ2hhciA9PSBuZXdDaGFyKQ0KKyAgICByZXR1cm47IC8vIDA7DQorICAvLyB1bnNpZ25lZCBudW1iZXIgPSAwOw0KKyAgaW50IHBvcyA9IDA7DQorICB3aGlsZSAoKHVuc2lnbmVkKXBvcyA8IF9sZW4pDQorICB7DQorICAgIHBvcyA9IEZpbmQob2xkQ2hhciwgcG9zKTsNCisgICAgaWYgKHBvcyA8IDApDQorICAgICAgYnJlYWs7DQorICAgIF9jaGFyc1twb3NdID0gbmV3Q2hhcjsNCisgICAgcG9zKys7DQorICAgIC8vIG51bWJlcisrOw0KKyAgfQ0KKyAgcmV0dXJuOyAvLyAgbnVtYmVyOw0KK30NCisNCit2b2lkIFVTdHJpbmc6OlJlcGxhY2UoY29uc3QgVVN0cmluZyAmb2xkU3RyaW5nLCBjb25zdCBVU3RyaW5nICZuZXdTdHJpbmcpDQorew0KKyAgaWYgKG9sZFN0cmluZy5Jc0VtcHR5KCkpDQorICAgIHJldHVybjsgLy8gMDsNCisgIGlmIChvbGRTdHJpbmcgPT0gbmV3U3RyaW5nKQ0KKyAgICByZXR1cm47IC8vIDA7DQorICB1bnNpZ25lZCBvbGRMZW4gPSBvbGRTdHJpbmcuTGVuKCk7DQorICB1bnNpZ25lZCBuZXdMZW4gPSBuZXdTdHJpbmcuTGVuKCk7DQorICAvLyB1bnNpZ25lZCBudW1iZXIgPSAwOw0KKyAgaW50IHBvcyA9IDA7DQorICB3aGlsZSAoKHVuc2lnbmVkKXBvcyA8IF9sZW4pDQorICB7DQorICAgIHBvcyA9IEZpbmQob2xkU3RyaW5nLCBwb3MpOw0KKyAgICBpZiAocG9zIDwgMCkNCisgICAgICBicmVhazsNCisgICAgRGVsZXRlKHBvcywgb2xkTGVuKTsNCisgICAgSW5zZXJ0KHBvcywgbmV3U3RyaW5nKTsNCisgICAgcG9zICs9IG5ld0xlbjsNCisgICAgLy8gbnVtYmVyKys7DQorICB9DQorICAvLyByZXR1cm4gbnVtYmVyOw0KK30NCisNCit2b2lkIFVTdHJpbmc6OkRlbGV0ZSh1bnNpZ25lZCBpbmRleCkgdGhyb3coKQ0KK3sNCisgIE1vdmVJdGVtcyhpbmRleCwgaW5kZXggKyAxKTsNCisgIF9sZW4tLTsNCit9DQorDQordm9pZCBVU3RyaW5nOjpEZWxldGUodW5zaWduZWQgaW5kZXgsIHVuc2lnbmVkIGNvdW50KSB0aHJvdygpDQorew0KKyAgaWYgKGluZGV4ICsgY291bnQgPiBfbGVuKQ0KKyAgICBjb3VudCA9IF9sZW4gLSBpbmRleDsNCisgIGlmIChjb3VudCA+IDApDQorICB7DQorICAgIE1vdmVJdGVtcyhpbmRleCwgaW5kZXggKyBjb3VudCk7DQorICAgIF9sZW4gLT0gY291bnQ7DQorICB9DQorfQ0KKw0KK3ZvaWQgVVN0cmluZzo6RGVsZXRlRnJvbnRhbCh1bnNpZ25lZCBudW0pIHRocm93KCkNCit7DQorICBpZiAobnVtICE9IDApDQorICB7DQorICAgIE1vdmVJdGVtcygwLCBudW0pOw0KKyAgICBfbGVuIC09IG51bTsNCisgIH0NCit9DQorDQorDQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKy8qDQoraW50IE15U3RyaW5nQ29tcGFyZU5vQ2FzZShjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpDQorew0KKyAgcmV0dXJuIE15U3RyaW5nQ29tcGFyZU5vQ2FzZShNdWx0aUJ5dGVUb1VuaWNvZGVTdHJpbmcoczEpLCBNdWx0aUJ5dGVUb1VuaWNvZGVTdHJpbmcoczIpKTsNCit9DQorKi8NCisNCitzdGF0aWMgaW5saW5lIFVJTlQgR2V0Q3VycmVudENvZGVQYWdlKCkNCit7DQorICAjaWYgZGVmaW5lZChVTkRFUl9DRSkgfHwgIWRlZmluZWQoX1dJTjMyKQ0KKyAgcmV0dXJuIENQX0FDUDsNCisgICNlbHNlDQorICByZXR1cm4gOjpBcmVGaWxlQXBpc0FOU0koKSA/IENQX0FDUCA6IENQX09FTUNQOw0KKyAgI2VuZGlmDQorfQ0KKw0KKyNpZmRlZiBVU0VfVU5JQ09ERV9GU1RSSU5HDQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KKw0KK0FTdHJpbmcgZnMyZmFzKENGU1RSIHMpDQorew0KKyAgcmV0dXJuIFVuaWNvZGVTdHJpbmdUb011bHRpQnl0ZShzLCBHZXRDdXJyZW50Q29kZVBhZ2UoKSk7DQorfQ0KKw0KK0ZTdHJpbmcgZmFzMmZzKGNvbnN0IEFTdHJpbmcgJnMpDQorew0KKyAgcmV0dXJuIE11bHRpQnl0ZVRvVW5pY29kZVN0cmluZyhzLCBHZXRDdXJyZW50Q29kZVBhZ2UoKSk7DQorfQ0KKw0KKyNlbmRpZg0KKw0KKyNlbHNlDQorDQorVVN0cmluZyBmczJ1cyhjb25zdCBGU3RyaW5nICZzKQ0KK3sNCisgIHJldHVybiBNdWx0aUJ5dGVUb1VuaWNvZGVTdHJpbmcoKEFTdHJpbmcpcywgR2V0Q3VycmVudENvZGVQYWdlKCkpOw0KK30NCisNCitGU3RyaW5nIHVzMmZzKGNvbnN0IHdjaGFyX3QgKnMpDQorew0KKyAgcmV0dXJuIFVuaWNvZGVTdHJpbmdUb011bHRpQnl0ZShzLCBHZXRDdXJyZW50Q29kZVBhZ2UoKSk7DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9NeVN0cmluZy5oIGIvbHptYS9DUFAvQ29tbW9uL015U3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4YWNjZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9NeVN0cmluZy5oCkBAIC0wLDAgKzEsNTI1IEBACisvLyBDb21tb24vU3RyaW5nLmgNCisNCisjaWZuZGVmIF9fQ09NTU9OX1NUUklOR19IDQorI2RlZmluZSBfX0NPTU1PTl9TVFJJTkdfSA0KKw0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisNCisjaWZuZGVmIF9XSU4zMg0KKyNpbmNsdWRlIDx3Y3R5cGUuaD4NCisjaW5jbHVkZSA8d2NoYXIuaD4NCisjZW5kaWYNCisNCisjaW5jbHVkZSAiTXlUeXBlcy5oIg0KKyNpbmNsdWRlICJNeVZlY3Rvci5oIg0KKw0KK2lubGluZSB1bnNpZ25lZCBNeVN0cmluZ0xlbihjb25zdCBjaGFyICpzKQ0KK3sNCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSAwOyBzW2ldICE9IDA7IGkrKyk7DQorICByZXR1cm4gaTsNCit9DQorDQoraW5saW5lIHZvaWQgTXlTdHJpbmdDb3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykNCit7DQorICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9IDApOw0KK30NCisNCitpbmxpbmUgY2hhciAqTXlTdHBDcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKQ0KK3sNCisgIGZvciAoOzspDQorICB7DQorICAgIGNoYXIgYyA9ICpzcmM7DQorICAgICpkZXN0ID0gYzsNCisgICAgaWYgKGMgPT0gMCkNCisgICAgICByZXR1cm4gZGVzdDsNCisgICAgc3JjKys7DQorICAgIGRlc3QrKzsNCisgIH0NCit9DQorDQoraW5saW5lIHVuc2lnbmVkIE15U3RyaW5nTGVuKGNvbnN0IHdjaGFyX3QgKnMpDQorew0KKyAgdW5zaWduZWQgaTsNCisgIGZvciAoaSA9IDA7IHNbaV0gIT0gMDsgaSsrKTsNCisgIHJldHVybiBpOw0KK30NCisNCitpbmxpbmUgdm9pZCBNeVN0cmluZ0NvcHkod2NoYXJfdCAqZGVzdCwgY29uc3Qgd2NoYXJfdCAqc3JjKQ0KK3sNCisgIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gMCk7DQorfQ0KKw0KK2ludCBGaW5kQ2hhclBvc0luU3RyaW5nKGNvbnN0IGNoYXIgKnMsIGNoYXIgYykgdGhyb3coKTsNCitpbnQgRmluZENoYXJQb3NJblN0cmluZyhjb25zdCB3Y2hhcl90ICpzLCB3Y2hhcl90IGMpIHRocm93KCk7DQorDQorI2lmZGVmIF9XSU4zMg0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgICAjZGVmaW5lIFNUUklOR19VTklDT0RFX1RIUk9XDQorICAjZW5kaWYNCisjZW5kaWYNCisNCisjaWZuZGVmIFNUUklOR19VTklDT0RFX1RIUk9XDQorICAjZGVmaW5lIFNUUklOR19VTklDT0RFX1RIUk9XIHRocm93KCkNCisjZW5kaWYNCisNCisvKg0KK2lubGluZSBjaGFyIE15Q2hhclVwcGVyX0FzY2lpKGNoYXIgYykNCit7DQorICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpDQorICAgIHJldHVybiAoY2hhcikoYyAtIDB4MjApOw0KKyAgcmV0dXJuIGM7DQorfQ0KK2lubGluZSB3Y2hhcl90IE15Q2hhclVwcGVyX0FzY2lpKHdjaGFyX3QgYykNCit7DQorICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpDQorICAgIHJldHVybiAod2NoYXJfdCkoYyAtIDB4MjApOw0KKyAgcmV0dXJuIGM7DQorfQ0KKyovDQorDQoraW5saW5lIGNoYXIgTXlDaGFyTG93ZXJfQXNjaWkoY2hhciBjKQ0KK3sNCisgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykNCisgICAgcmV0dXJuIChjaGFyKShjICsgMHgyMCk7DQorICByZXR1cm4gYzsNCit9DQorDQoraW5saW5lIHdjaGFyX3QgTXlDaGFyTG93ZXJfQXNjaWkod2NoYXJfdCBjKQ0KK3sNCisgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykNCisgICAgcmV0dXJuICh3Y2hhcl90KShjICsgMHgyMCk7DQorICByZXR1cm4gYzsNCit9DQorDQord2NoYXJfdCBNeUNoYXJVcHBlcl9XSU4od2NoYXJfdCBjKSB0aHJvdygpOw0KKw0KK2lubGluZSB3Y2hhcl90IE15Q2hhclVwcGVyKHdjaGFyX3QgYykgdGhyb3coKQ0KK3sNCisgIGlmIChjIDwgJ2EnKSByZXR1cm4gYzsNCisgIGlmIChjIDw9ICd6JykgcmV0dXJuICh3Y2hhcl90KShjIC0gMHgyMCk7DQorICBpZiAoYyA8PSAweDdGKSByZXR1cm4gYzsNCisgICNpZmRlZiBfV0lOMzINCisgICAgI2lmZGVmIF9VTklDT0RFDQorICAgICAgcmV0dXJuICh3Y2hhcl90KSh1bnNpZ25lZCkoVUlOVF9QVFIpQ2hhclVwcGVyVygoTFBXU1RSKShVSU5UX1BUUikodW5zaWduZWQpYyk7DQorICAgICNlbHNlDQorICAgICAgcmV0dXJuICh3Y2hhcl90KU15Q2hhclVwcGVyX1dJTihjKTsNCisgICAgI2VuZGlmDQorICAjZWxzZQ0KKyAgICByZXR1cm4gKHdjaGFyX3QpdG93dXBwZXIoYyk7DQorICAjZW5kaWYNCit9DQorDQorLyoNCit3Y2hhcl90IE15Q2hhckxvd2VyX1dJTih3Y2hhcl90IGMpIHRocm93KCk7DQorDQoraW5saW5lIHdjaGFyX3QgTXlDaGFyTG93ZXIod2NoYXJfdCBjKSB0aHJvdygpDQorew0KKyAgaWYgKGMgPCAnQScpIHJldHVybiBjOw0KKyAgaWYgKGMgPD0gJ1onKSByZXR1cm4gKHdjaGFyX3QpKGMgKyAweDIwKTsNCisgIGlmIChjIDw9IDB4N0YpIHJldHVybiBjOw0KKyAgI2lmZGVmIF9XSU4zMg0KKyAgICAjaWZkZWYgX1VOSUNPREUNCisgICAgICByZXR1cm4gKHdjaGFyX3QpKHVuc2lnbmVkKShVSU5UX1BUUilDaGFyTG93ZXJXKChMUFdTVFIpKFVJTlRfUFRSKSh1bnNpZ25lZCljKTsNCisgICAgI2Vsc2UNCisgICAgICByZXR1cm4gKHdjaGFyX3QpTXlDaGFyTG93ZXJfV0lOKGMpOw0KKyAgICAjZW5kaWYNCisgICNlbHNlDQorICAgIHJldHVybiAod2NoYXJfdCl0b2xvd2VyKGMpOw0KKyAgI2VuZGlmDQorfQ0KKyovDQorDQorLy8gY2hhciAqTXlTdHJpbmdVcHBlcihjaGFyICpzKSB0aHJvdygpOw0KKy8vIGNoYXIgKk15U3RyaW5nTG93ZXIoY2hhciAqcykgdGhyb3coKTsNCisNCisvLyB2b2lkIE15U3RyaW5nVXBwZXJfQXNjaWkod2NoYXJfdCAqcykgdGhyb3coKTsNCit2b2lkIE15U3RyaW5nTG93ZXJfQXNjaWkod2NoYXJfdCAqcykgdGhyb3coKTsNCisvLyB3Y2hhcl90ICpNeVN0cmluZ1VwcGVyKHdjaGFyX3QgKnMpIFNUUklOR19VTklDT0RFX1RIUk9XOw0KKy8vIHdjaGFyX3QgKk15U3RyaW5nTG93ZXIod2NoYXJfdCAqcykgU1RSSU5HX1VOSUNPREVfVEhST1c7DQorDQorYm9vbCBTdHJpbmdzQXJlRXF1YWxOb0Nhc2UoY29uc3Qgd2NoYXJfdCAqczEsIGNvbnN0IHdjaGFyX3QgKnMyKSB0aHJvdygpOw0KKw0KK2Jvb2wgSXNTdHJpbmcxUHJlZml4ZWRCeVN0cmluZzIoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKSB0aHJvdygpOw0KK2Jvb2wgSXNTdHJpbmcxUHJlZml4ZWRCeVN0cmluZzIoY29uc3Qgd2NoYXJfdCAqczEsIGNvbnN0IHdjaGFyX3QgKnMyKSB0aHJvdygpOw0KKw0KK2ludCBNeVN0cmluZ0NvbXBhcmVOb0Nhc2UoY29uc3Qgd2NoYXJfdCAqczEsIGNvbnN0IHdjaGFyX3QgKnMyKSB0aHJvdygpOw0KK2ludCBNeVN0cmluZ0NvbXBhcmVOb0Nhc2VfTihjb25zdCB3Y2hhcl90ICpzMSwgY29uc3Qgd2NoYXJfdCAqczIsIHVuc2lnbmVkIG51bSkgdGhyb3coKTsNCisNCisvLyAtLS0tLS0tLS0tIEFTQ0lJIC0tLS0tLS0tLS0NCisvLyBjaGFyIHZhbHVlcyBpbiBBU0NJSSBzdHJpbmdzIG11c3QgYmUgbGVzcyB0aGVuIDEyOA0KK2Jvb2wgU3RyaW5nc0FyZUVxdWFsX0FzY2lpKGNvbnN0IHdjaGFyX3QgKnUsIGNvbnN0IGNoYXIgKmEpIHRocm93KCk7DQorYm9vbCBTdHJpbmdzQXJlRXF1YWxOb0Nhc2VfQXNjaWkoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKSB0aHJvdygpOw0KK2Jvb2wgU3RyaW5nc0FyZUVxdWFsTm9DYXNlX0FzY2lpKGNvbnN0IHdjaGFyX3QgKnMxLCBjb25zdCBjaGFyICpzMikgdGhyb3coKTsNCitib29sIFN0cmluZ3NBcmVFcXVhbE5vQ2FzZV9Bc2NpaShjb25zdCB3Y2hhcl90ICpzMSwgY29uc3Qgd2NoYXJfdCAqczIpIHRocm93KCk7DQorDQorI2RlZmluZSBNWV9TVFJJTkdfREVMRVRFKF9wXykgZGVsZXRlIFtdX3BfOw0KKy8vICNkZWZpbmUgTVlfU1RSSU5HX0RFTEVURShfcF8pIG15X2RlbGV0ZShfcF8pOw0KKw0KK2NsYXNzIEFTdHJpbmcNCit7DQorICBjaGFyICpfY2hhcnM7DQorICB1bnNpZ25lZCBfbGVuOw0KKyAgdW5zaWduZWQgX2xpbWl0Ow0KKw0KKyAgdm9pZCBNb3ZlSXRlbXModW5zaWduZWQgZGVzdCwgdW5zaWduZWQgc3JjKQ0KKyAgew0KKyAgICBtZW1tb3ZlKF9jaGFycyArIGRlc3QsIF9jaGFycyArIHNyYywgKHNpemVfdCkoX2xlbiAtIHNyYyArIDEpICogc2l6ZW9mKGNoYXIpKTsNCisgIH0NCisgIA0KKyAgdm9pZCBJbnNlcnRTcGFjZSh1bnNpZ25lZCAmaW5kZXgsIHVuc2lnbmVkIHNpemUpOw0KKyAgDQorICB2b2lkIFJlQWxsb2ModW5zaWduZWQgbmV3TGltaXQpOw0KKyAgdm9pZCBTZXRTdGFydExlbih1bnNpZ25lZCBsZW4pOw0KKyAgdm9pZCBHcm93XzEoKTsNCisgIHZvaWQgR3Jvdyh1bnNpZ25lZCBuKTsNCisNCisgIC8vIEFTdHJpbmcodW5zaWduZWQgbnVtLCBjb25zdCBjaGFyICpzKTsNCisgIEFTdHJpbmcodW5zaWduZWQgbnVtLCBjb25zdCBBU3RyaW5nICZzKTsNCisgIEFTdHJpbmcoY29uc3QgQVN0cmluZyAmcywgY2hhciBjKTsgLy8gaXQncyBmb3IgU3RyaW5nICsgY2hhcg0KKyAgQVN0cmluZyhjb25zdCBjaGFyICpzMSwgdW5zaWduZWQgbnVtMSwgY29uc3QgY2hhciAqczIsIHVuc2lnbmVkIG51bTIpOw0KKw0KKyAgZnJpZW5kIEFTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IEFTdHJpbmcgJnMsIGNoYXIgYykgeyByZXR1cm4gQVN0cmluZyhzLCBjKTsgfSA7DQorICAvLyBmcmllbmQgQVN0cmluZyBvcGVyYXRvcisoY2hhciBjLCBjb25zdCBBU3RyaW5nICZzKTsgLy8gaXMgbm90IHN1cHBvcnRlZA0KKw0KKyAgZnJpZW5kIEFTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IEFTdHJpbmcgJnMxLCBjb25zdCBBU3RyaW5nICZzMik7DQorICBmcmllbmQgQVN0cmluZyBvcGVyYXRvcisoY29uc3QgQVN0cmluZyAmczEsIGNvbnN0IGNoYXIgICAgKnMyKTsNCisgIGZyaWVuZCBBU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBjaGFyICAgICpzMSwgY29uc3QgQVN0cmluZyAmczIpOw0KKw0KK3B1YmxpYzoNCisgIEFTdHJpbmcoKTsNCisgIEFTdHJpbmcoY2hhciBjKTsNCisgIEFTdHJpbmcoY29uc3QgY2hhciAqcyk7DQorICBBU3RyaW5nKGNvbnN0IEFTdHJpbmcgJnMpOw0KKyAgfkFTdHJpbmcoKSB7IE1ZX1NUUklOR19ERUxFVEUoX2NoYXJzKTsgfQ0KKw0KKyAgdW5zaWduZWQgTGVuKCkgY29uc3QgeyByZXR1cm4gX2xlbjsgfQ0KKyAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gX2xlbiA9PSAwOyB9DQorICB2b2lkIEVtcHR5KCkgeyBfbGVuID0gMDsgX2NoYXJzWzBdID0gMDsgfQ0KKw0KKyAgb3BlcmF0b3IgY29uc3QgY2hhciAqKCkgY29uc3QgeyByZXR1cm4gX2NoYXJzOyB9DQorICBjb25zdCBjaGFyICpQdHIoKSBjb25zdCB7IHJldHVybiBfY2hhcnM7IH0NCisgIGNvbnN0IGNoYXIgKlB0cih1bnNpZ25lZCBwb3MpIGNvbnN0IHsgcmV0dXJuIF9jaGFycyArIHBvczsgfQ0KKyAgY29uc3QgY2hhciAqUmlnaHRQdHIodW5zaWduZWQgbnVtKSBjb25zdCB7IHJldHVybiBfY2hhcnMgKyBfbGVuIC0gbnVtOyB9DQorICBjaGFyIEJhY2soKSBjb25zdCB7IHJldHVybiBfY2hhcnNbX2xlbiAtIDFdOyB9DQorDQorICB2b2lkIFJlcGxhY2VPbmVDaGFyQXRQb3ModW5zaWduZWQgcG9zLCBjaGFyIGMpIHsgX2NoYXJzW3Bvc10gPSBjOyB9DQorDQorICAvLyBUaGUgbWluaW11bSBzaXplIG9mIHRoZSBjaGFyYWN0ZXIgYnVmZmVyIGluIGNoYXJhY3RlcnMuDQorICAvLyBUaGlzIHZhbHVlIGRvZXMgbm90IGluY2x1ZGUgc3BhY2UgZm9yIGEgbnVsbCB0ZXJtaW5hdG9yLg0KKyAgY2hhciAqR2V0QnVmZmVyKHVuc2lnbmVkIG1pbkJ1ZkxlbikNCisgIHsNCisgICAgaWYgKG1pbkJ1ZkxlbiA+IF9saW1pdCkNCisgICAgICBSZUFsbG9jKG1pbkJ1Zkxlbik7DQorICAgIHJldHVybiBfY2hhcnM7DQorICB9DQorICB2b2lkIFJlbGVhc2VCdWZmZXIoKSB7IFJlbGVhc2VCdWZmZXIoTXlTdHJpbmdMZW4oX2NoYXJzKSk7IH0NCisgIHZvaWQgUmVsZWFzZUJ1ZmZlcih1bnNpZ25lZCBuZXdMZW4pIHsgX2xlbiA9IG5ld0xlbjsgX2NoYXJzW25ld0xlbl0gPSAwOyB9DQorDQorICBBU3RyaW5nICZvcGVyYXRvcj0oY2hhciBjKTsNCisgIEFTdHJpbmcgJm9wZXJhdG9yPShjb25zdCBjaGFyICpzKTsNCisgIEFTdHJpbmcgJm9wZXJhdG9yPShjb25zdCBBU3RyaW5nICZzKTsNCisNCisgIEFTdHJpbmcgJm9wZXJhdG9yKz0oY2hhciBjKQ0KKyAgew0KKyAgICBpZiAoX2xpbWl0ID09IF9sZW4pDQorICAgICAgR3Jvd18xKCk7DQorICAgIHVuc2lnbmVkIGxlbiA9IF9sZW47DQorICAgIGNoYXIgKmNoYXJzID0gX2NoYXJzOw0KKyAgICBjaGFyc1tsZW4rK10gPSBjOw0KKyAgICBjaGFyc1tsZW5dID0gMDsNCisgICAgX2xlbiA9IGxlbjsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKw0KKyAgQVN0cmluZyAmb3BlcmF0b3IrPShjb25zdCBjaGFyICpzKTsNCisgIEFTdHJpbmcgJm9wZXJhdG9yKz0oY29uc3QgQVN0cmluZyAmcyk7DQorDQorICB2b2lkIFNldEZyb20oY29uc3QgY2hhciAqcywgdW5zaWduZWQgbGVuKTsgLy8gbm8gY2hlY2sNCisgIC8vIEFTdHJpbmcgTWlkKHVuc2lnbmVkIHN0YXJ0SW5kZXgsIHVuc2lnbmVkIGNvdW50KSBjb25zdCB7IHJldHVybiBBU3RyaW5nKGNvdW50LCBfY2hhcnMgKyBzdGFydEluZGV4KTsgfQ0KKyAgQVN0cmluZyBMZWZ0KHVuc2lnbmVkIGNvdW50KSBjb25zdCB7IHJldHVybiBBU3RyaW5nKGNvdW50LCAqdGhpcyk7IH0NCisNCisgIC8vIHZvaWQgTWFrZVVwcGVyKCkgeyBNeVN0cmluZ1VwcGVyKF9jaGFycyk7IH0NCisgIC8vIHZvaWQgTWFrZUxvd2VyKCkgeyBNeVN0cmluZ0xvd2VyKF9jaGFycyk7IH0NCisNCisNCisgIC8vIGludCBDb21wYXJlKGNvbnN0IGNoYXIgKnMpIGNvbnN0IHsgcmV0dXJuIE15U3RyaW5nQ29tcGFyZShfY2hhcnMsIHMpOyB9DQorICAvLyBpbnQgQ29tcGFyZShjb25zdCBBU3RyaW5nICZzKSBjb25zdCB7IHJldHVybiBNeVN0cmluZ0NvbXBhcmUoX2NoYXJzLCBzLl9jaGFycyk7IH0NCisgIC8vIGludCBDb21wYXJlTm9DYXNlKGNvbnN0IGNoYXIgKnMpIGNvbnN0IHsgcmV0dXJuIE15U3RyaW5nQ29tcGFyZU5vQ2FzZShfY2hhcnMsIHMpOyB9DQorICAvLyBpbnQgQ29tcGFyZU5vQ2FzZShjb25zdCBBU3RyaW5nICZzKSBjb25zdCB7IHJldHVybiBNeVN0cmluZ0NvbXBhcmVOb0Nhc2UoX2NoYXJzLCBzLl9jaGFycyk7IH0NCisgIGJvb2wgSXNQcmVmaXhlZEJ5KGNvbnN0IGNoYXIgKnMpIGNvbnN0IHsgcmV0dXJuIElzU3RyaW5nMVByZWZpeGVkQnlTdHJpbmcyKF9jaGFycywgcyk7IH0NCisgIGJvb2wgSXNQcmVmaXhlZEJ5X0FzY2lpX05vQ2FzZShjb25zdCBjaGFyICpzKSBjb25zdCB0aHJvdygpOw0KKyANCisgIGludCBGaW5kKGNoYXIgYykgY29uc3QgeyByZXR1cm4gRmluZENoYXJQb3NJblN0cmluZyhfY2hhcnMsIGMpOyB9DQorICBpbnQgRmluZChjaGFyIGMsIHVuc2lnbmVkIHN0YXJ0SW5kZXgpIGNvbnN0DQorICB7DQorICAgIGludCBwb3MgPSBGaW5kQ2hhclBvc0luU3RyaW5nKF9jaGFycyArIHN0YXJ0SW5kZXgsIGMpOw0KKyAgICByZXR1cm4gcG9zIDwgMCA/IC0xIDogKGludClzdGFydEluZGV4ICsgcG9zOw0KKyAgfQ0KKyAgaW50IFJldmVyc2VGaW5kKGNoYXIgYykgY29uc3QgdGhyb3coKTsNCisgIGludCBGaW5kKGNvbnN0IEFTdHJpbmcgJnMpIGNvbnN0IHsgcmV0dXJuIEZpbmQocywgMCk7IH0NCisgIGludCBGaW5kKGNvbnN0IEFTdHJpbmcgJnMsIHVuc2lnbmVkIHN0YXJ0SW5kZXgpIGNvbnN0IHRocm93KCk7DQorDQorICB2b2lkIFRyaW1MZWZ0KCkgdGhyb3coKTsNCisgIHZvaWQgVHJpbVJpZ2h0KCkgdGhyb3coKTsNCisgIHZvaWQgVHJpbSgpDQorICB7DQorICAgIFRyaW1SaWdodCgpOw0KKyAgICBUcmltTGVmdCgpOw0KKyAgfQ0KKw0KKyAgdm9pZCBJbnNlcnRBdEZyb250KGNoYXIgYyk7DQorICAvLyB2b2lkIEluc2VydCh1bnNpZ25lZCBpbmRleCwgY2hhciBjKTsNCisgIHZvaWQgSW5zZXJ0KHVuc2lnbmVkIGluZGV4LCBjb25zdCBjaGFyICpzKTsNCisgIHZvaWQgSW5zZXJ0KHVuc2lnbmVkIGluZGV4LCBjb25zdCBBU3RyaW5nICZzKTsNCisNCisgIHZvaWQgUmVtb3ZlQ2hhcihjaGFyIGNoKSB0aHJvdygpOw0KKyAgdm9pZCBSZXBsYWNlKGNoYXIgb2xkQ2hhciwgY2hhciBuZXdDaGFyKSB0aHJvdygpOw0KKyAgdm9pZCBSZXBsYWNlKGNvbnN0IEFTdHJpbmcgJm9sZFN0cmluZywgY29uc3QgQVN0cmluZyAmbmV3U3RyaW5nKTsNCisgIA0KKyAgdm9pZCBEZWxldGUodW5zaWduZWQgaW5kZXgpIHRocm93KCk7DQorICB2b2lkIERlbGV0ZSh1bnNpZ25lZCBpbmRleCwgdW5zaWduZWQgY291bnQpIHRocm93KCk7DQorICB2b2lkIERlbGV0ZUZyb250YWwodW5zaWduZWQgbnVtKSB0aHJvdygpOw0KKyAgdm9pZCBEZWxldGVCYWNrKCkgeyBfY2hhcnNbLS1fbGVuXSA9IDA7IH0NCisgIHZvaWQgRGVsZXRlRnJvbSh1bnNpZ25lZCBpbmRleCkNCisgIHsNCisgICAgaWYgKGluZGV4IDwgX2xlbikNCisgICAgew0KKyAgICAgIF9sZW4gPSBpbmRleDsNCisgICAgICBfY2hhcnNbaW5kZXhdID0gMDsNCisgICAgfQ0KKyAgfQ0KK307DQorDQorYm9vbCBvcGVyYXRvcjwoY29uc3QgQVN0cmluZyAmczEsIGNvbnN0IEFTdHJpbmcgJnMyKTsNCitib29sIG9wZXJhdG9yPihjb25zdCBBU3RyaW5nICZzMSwgY29uc3QgQVN0cmluZyAmczIpOw0KKw0KKy8qDQorYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFTdHJpbmcgJnMxLCBjb25zdCBBU3RyaW5nICZzMik7DQorYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFTdHJpbmcgJnMxLCBjb25zdCBjaGFyICAgICpzMik7DQorYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNoYXIgICAgKnMxLCBjb25zdCBBU3RyaW5nICZzMik7DQorDQorYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFTdHJpbmcgJnMxLCBjb25zdCBBU3RyaW5nICZzMik7DQorYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFTdHJpbmcgJnMxLCBjb25zdCBjaGFyICAgICpzMik7DQorYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNoYXIgICAgKnMxLCBjb25zdCBBU3RyaW5nICZzMik7DQorKi8NCisNCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFTdHJpbmcgJnMxLCBjb25zdCBBU3RyaW5nICZzMikgeyByZXR1cm4gczEuTGVuKCkgPT0gczIuTGVuKCkgJiYgc3RyY21wKHMxLCBzMikgPT0gMDsgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQVN0cmluZyAmczEsIGNvbnN0IGNoYXIgICAgKnMyKSB7IHJldHVybiBzdHJjbXAoczEsIHMyKSA9PSAwOyB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjaGFyICAgICpzMSwgY29uc3QgQVN0cmluZyAmczIpIHsgcmV0dXJuIHN0cmNtcChzMSwgczIpID09IDA7IH0NCisNCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFTdHJpbmcgJnMxLCBjb25zdCBBU3RyaW5nICZzMikgeyByZXR1cm4gczEuTGVuKCkgIT0gczIuTGVuKCkgfHwgc3RyY21wKHMxLCBzMikgIT0gMDsgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQVN0cmluZyAmczEsIGNvbnN0IGNoYXIgICAgKnMyKSB7IHJldHVybiBzdHJjbXAoczEsIHMyKSAhPSAwOyB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjaGFyICAgICpzMSwgY29uc3QgQVN0cmluZyAmczIpIHsgcmV0dXJuIHN0cmNtcChzMSwgczIpICE9IDA7IH0NCisNCisNCisNCitjbGFzcyBVU3RyaW5nDQorew0KKyAgd2NoYXJfdCAqX2NoYXJzOw0KKyAgdW5zaWduZWQgX2xlbjsNCisgIHVuc2lnbmVkIF9saW1pdDsNCisNCisgIHZvaWQgTW92ZUl0ZW1zKHVuc2lnbmVkIGRlc3QsIHVuc2lnbmVkIHNyYykNCisgIHsNCisgICAgbWVtbW92ZShfY2hhcnMgKyBkZXN0LCBfY2hhcnMgKyBzcmMsIChzaXplX3QpKF9sZW4gLSBzcmMgKyAxKSAqIHNpemVvZih3Y2hhcl90KSk7DQorICB9DQorICANCisgIHZvaWQgSW5zZXJ0U3BhY2UodW5zaWduZWQgaW5kZXgsIHVuc2lnbmVkIHNpemUpOw0KKyAgDQorICB2b2lkIFJlQWxsb2ModW5zaWduZWQgbmV3TGltaXQpOw0KKyAgdm9pZCBTZXRTdGFydExlbih1bnNpZ25lZCBsZW4pOw0KKyAgdm9pZCBHcm93XzEoKTsNCisgIHZvaWQgR3Jvdyh1bnNpZ25lZCBuKTsNCisNCisgIFVTdHJpbmcodW5zaWduZWQgbnVtLCBjb25zdCB3Y2hhcl90ICpzKTsgLy8gZm9yIE1pZA0KKyAgVVN0cmluZyh1bnNpZ25lZCBudW0sIGNvbnN0IFVTdHJpbmcgJnMpOyAvLyBmb3IgTGVmdA0KKyAgVVN0cmluZyhjb25zdCBVU3RyaW5nICZzLCB3Y2hhcl90IGMpOyAvLyBpdCdzIGZvciBTdHJpbmcgKyBjaGFyDQorICBVU3RyaW5nKGNvbnN0IHdjaGFyX3QgKnMxLCB1bnNpZ25lZCBudW0xLCBjb25zdCB3Y2hhcl90ICpzMiwgdW5zaWduZWQgbnVtMik7DQorDQorICBmcmllbmQgVVN0cmluZyBvcGVyYXRvcisoY29uc3QgVVN0cmluZyAmcywgd2NoYXJfdCBjKSB7IHJldHVybiBVU3RyaW5nKHMsIGMpOyB9IDsNCisgIC8vIGZyaWVuZCBVU3RyaW5nIG9wZXJhdG9yKyh3Y2hhcl90IGMsIGNvbnN0IFVTdHJpbmcgJnMpOyAvLyBpcyBub3Qgc3VwcG9ydGVkDQorDQorICBmcmllbmQgVVN0cmluZyBvcGVyYXRvcisoY29uc3QgVVN0cmluZyAmczEsIGNvbnN0IFVTdHJpbmcgJnMyKTsNCisgIGZyaWVuZCBVU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBVU3RyaW5nICZzMSwgY29uc3Qgd2NoYXJfdCAqczIpOw0KKyAgZnJpZW5kIFVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IHdjaGFyX3QgKnMxLCBjb25zdCBVU3RyaW5nICZzMik7DQorDQorcHVibGljOg0KKyAgVVN0cmluZygpOw0KKyAgVVN0cmluZyh3Y2hhcl90IGMpOw0KKyAgVVN0cmluZyhjb25zdCB3Y2hhcl90ICpzKTsNCisgIFVTdHJpbmcoY29uc3QgVVN0cmluZyAmcyk7DQorICB+VVN0cmluZygpIHsgTVlfU1RSSU5HX0RFTEVURShfY2hhcnMpOyB9DQorDQorICB1bnNpZ25lZCBMZW4oKSBjb25zdCB7IHJldHVybiBfbGVuOyB9DQorICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBfbGVuID09IDA7IH0NCisgIHZvaWQgRW1wdHkoKSB7IF9sZW4gPSAwOyBfY2hhcnNbMF0gPSAwOyB9DQorDQorICBvcGVyYXRvciBjb25zdCB3Y2hhcl90ICooKSBjb25zdCB7IHJldHVybiBfY2hhcnM7IH0NCisgIGNvbnN0IHdjaGFyX3QgKlB0cigpIGNvbnN0IHsgcmV0dXJuIF9jaGFyczsgfQ0KKyAgY29uc3Qgd2NoYXJfdCAqUHRyKHVuc2lnbmVkIHBvcykgY29uc3QgeyByZXR1cm4gX2NoYXJzICsgcG9zOyB9DQorICBjb25zdCB3Y2hhcl90ICpSaWdodFB0cih1bnNpZ25lZCBudW0pIGNvbnN0IHsgcmV0dXJuIF9jaGFycyArIF9sZW4gLSBudW07IH0NCisgIHdjaGFyX3QgQmFjaygpIGNvbnN0IHsgcmV0dXJuIF9jaGFyc1tfbGVuIC0gMV07IH0NCisNCisgIHZvaWQgUmVwbGFjZU9uZUNoYXJBdFBvcyh1bnNpZ25lZCBwb3MsIHdjaGFyX3QgYykgeyBfY2hhcnNbcG9zXSA9IGM7IH0NCisNCisgIC8vIFRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGNoYXJhY3RlciBidWZmZXIgaW4gY2hhcmFjdGVycy4NCisgIC8vIFRoaXMgdmFsdWUgZG9lcyBub3QgaW5jbHVkZSBzcGFjZSBmb3IgYSBudWxsIHRlcm1pbmF0b3IuDQorICB3Y2hhcl90ICpHZXRCdWZmZXIodW5zaWduZWQgbWluQnVmTGVuKQ0KKyAgew0KKyAgICBpZiAobWluQnVmTGVuID4gX2xpbWl0KQ0KKyAgICAgIFJlQWxsb2MobWluQnVmTGVuKTsNCisgICAgcmV0dXJuIF9jaGFyczsNCisgIH0NCisgIHZvaWQgUmVsZWFzZUJ1ZmZlcigpIHsgUmVsZWFzZUJ1ZmZlcihNeVN0cmluZ0xlbihfY2hhcnMpKTsgfQ0KKyAgdm9pZCBSZWxlYXNlQnVmZmVyKHVuc2lnbmVkIG5ld0xlbikgeyBfbGVuID0gbmV3TGVuOyBfY2hhcnNbbmV3TGVuXSA9IDA7IH0NCisNCisgIFVTdHJpbmcgJm9wZXJhdG9yPSh3Y2hhcl90IGMpOw0KKyAgVVN0cmluZyAmb3BlcmF0b3I9KGNvbnN0IHdjaGFyX3QgKnMpOw0KKyAgVVN0cmluZyAmb3BlcmF0b3I9KGNvbnN0IFVTdHJpbmcgJnMpOw0KKw0KKyAgVVN0cmluZyAmb3BlcmF0b3IrPSh3Y2hhcl90IGMpDQorICB7DQorICAgIGlmIChfbGltaXQgPT0gX2xlbikNCisgICAgICBHcm93XzEoKTsNCisgICAgdW5zaWduZWQgbGVuID0gX2xlbjsNCisgICAgd2NoYXJfdCAqY2hhcnMgPSBfY2hhcnM7DQorICAgIGNoYXJzW2xlbisrXSA9IGM7DQorICAgIGNoYXJzW2xlbl0gPSAwOw0KKyAgICBfbGVuID0gbGVuOw0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorDQorICBVU3RyaW5nICZvcGVyYXRvcis9KGNvbnN0IHdjaGFyX3QgKnMpOw0KKyAgVVN0cmluZyAmb3BlcmF0b3IrPShjb25zdCBVU3RyaW5nICZzKTsNCisNCisgIHZvaWQgU2V0RnJvbShjb25zdCB3Y2hhcl90ICpzLCB1bnNpZ25lZCBsZW4pOyAvLyBubyBjaGVjaw0KKw0KKyAgdm9pZCBTZXRGcm9tQXNjaWkoY29uc3QgY2hhciAqcyk7DQorICB2b2lkIEFkZEFzY2lpU3RyKGNvbnN0IGNoYXIgKnMpOw0KKw0KKyAgVVN0cmluZyBNaWQodW5zaWduZWQgc3RhcnRJbmRleCwgdW5zaWduZWQgY291bnQpIGNvbnN0IHsgcmV0dXJuIFVTdHJpbmcoY291bnQsIF9jaGFycyArIHN0YXJ0SW5kZXgpOyB9DQorICBVU3RyaW5nIExlZnQodW5zaWduZWQgY291bnQpIGNvbnN0IHsgcmV0dXJuIFVTdHJpbmcoY291bnQsICp0aGlzKTsgfQ0KKw0KKyAgLy8gdm9pZCBNYWtlVXBwZXIoKSB7IE15U3RyaW5nVXBwZXIoX2NoYXJzKTsgfQ0KKyAgLy8gdm9pZCBNYWtlVXBwZXIoKSB7IE15U3RyaW5nVXBwZXJfQXNjaWkoX2NoYXJzKTsgfQ0KKyAgLy8gdm9pZCBNYWtlVXBwZXJfQXNjaWkoKSB7IE15U3RyaW5nVXBwZXJfQXNjaWkoX2NoYXJzKTsgfQ0KKyAgdm9pZCBNYWtlTG93ZXJfQXNjaWkoKSB7IE15U3RyaW5nTG93ZXJfQXNjaWkoX2NoYXJzKTsgfQ0KKw0KKyAgYm9vbCBJc0VxdWFsVG8oY29uc3QgY2hhciAqcykgY29uc3QgeyByZXR1cm4gU3RyaW5nc0FyZUVxdWFsX0FzY2lpKF9jaGFycywgcyk7IH0NCisgIGJvb2wgSXNFcXVhbFRvTm9DYXNlKGNvbnN0IHdjaGFyX3QgKnMpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ3NBcmVFcXVhbE5vQ2FzZShfY2hhcnMsIHMpOyB9DQorICBpbnQgQ29tcGFyZShjb25zdCB3Y2hhcl90ICpzKSBjb25zdCB7IHJldHVybiB3Y3NjbXAoX2NoYXJzLCBzKTsgfQ0KKyAgLy8gaW50IENvbXBhcmUoY29uc3QgVVN0cmluZyAmcykgY29uc3QgeyByZXR1cm4gTXlTdHJpbmdDb21wYXJlKF9jaGFycywgcy5fY2hhcnMpOyB9DQorICAvLyBpbnQgQ29tcGFyZU5vQ2FzZShjb25zdCB3Y2hhcl90ICpzKSBjb25zdCB7IHJldHVybiBNeVN0cmluZ0NvbXBhcmVOb0Nhc2UoX2NoYXJzLCBzKTsgfQ0KKyAgLy8gaW50IENvbXBhcmVOb0Nhc2UoY29uc3QgVVN0cmluZyAmcykgY29uc3QgeyByZXR1cm4gTXlTdHJpbmdDb21wYXJlTm9DYXNlKF9jaGFycywgcy5fY2hhcnMpOyB9DQorICBib29sIElzUHJlZml4ZWRCeShjb25zdCB3Y2hhcl90ICpzKSBjb25zdCB7IHJldHVybiBJc1N0cmluZzFQcmVmaXhlZEJ5U3RyaW5nMihfY2hhcnMsIHMpOyB9Ow0KKyAgYm9vbCBJc1ByZWZpeGVkQnlfQXNjaWlfTm9DYXNlKGNvbnN0IGNoYXIgKnMpIGNvbnN0IHRocm93KCk7DQorDQorICBpbnQgRmluZCh3Y2hhcl90IGMpIGNvbnN0IHsgcmV0dXJuIEZpbmRDaGFyUG9zSW5TdHJpbmcoX2NoYXJzLCBjKTsgfQ0KKyAgaW50IEZpbmQod2NoYXJfdCBjLCB1bnNpZ25lZCBzdGFydEluZGV4KSBjb25zdA0KKyAgew0KKyAgICBpbnQgcG9zID0gRmluZENoYXJQb3NJblN0cmluZyhfY2hhcnMgKyBzdGFydEluZGV4LCBjKTsNCisgICAgcmV0dXJuIHBvcyA8IDAgPyAtMSA6IChpbnQpc3RhcnRJbmRleCArIHBvczsNCisgIH0NCisgIGludCBGaW5kKGNvbnN0IFVTdHJpbmcgJnMpIGNvbnN0IHsgcmV0dXJuIEZpbmQocywgMCk7IH0NCisgIGludCBGaW5kKGNvbnN0IFVTdHJpbmcgJnMsIHVuc2lnbmVkIHN0YXJ0SW5kZXgpIGNvbnN0IHRocm93KCk7DQorICBpbnQgUmV2ZXJzZUZpbmQod2NoYXJfdCBjKSBjb25zdCB0aHJvdygpOw0KKw0KKyAgdm9pZCBUcmltTGVmdCgpIHRocm93KCk7DQorICB2b2lkIFRyaW1SaWdodCgpIHRocm93KCk7DQorICB2b2lkIFRyaW0oKQ0KKyAgew0KKyAgICBUcmltUmlnaHQoKTsNCisgICAgVHJpbUxlZnQoKTsNCisgIH0NCisNCisgIHZvaWQgSW5zZXJ0QXRGcm9udCh3Y2hhcl90IGMpOw0KKyAgLy8gdm9pZCBJbnNlcnQodW5zaWduZWQgaW5kZXgsIHdjaGFyX3QgYyk7DQorICB2b2lkIEluc2VydCh1bnNpZ25lZCBpbmRleCwgY29uc3Qgd2NoYXJfdCAqcyk7DQorICB2b2lkIEluc2VydCh1bnNpZ25lZCBpbmRleCwgY29uc3QgVVN0cmluZyAmcyk7DQorDQorICB2b2lkIFJlbW92ZUNoYXIod2NoYXJfdCBjaCkgdGhyb3coKTsNCisgIHZvaWQgUmVwbGFjZSh3Y2hhcl90IG9sZENoYXIsIHdjaGFyX3QgbmV3Q2hhcikgdGhyb3coKTsNCisgIHZvaWQgUmVwbGFjZShjb25zdCBVU3RyaW5nICZvbGRTdHJpbmcsIGNvbnN0IFVTdHJpbmcgJm5ld1N0cmluZyk7DQorICANCisgIHZvaWQgRGVsZXRlKHVuc2lnbmVkIGluZGV4KSB0aHJvdygpOw0KKyAgdm9pZCBEZWxldGUodW5zaWduZWQgaW5kZXgsIHVuc2lnbmVkIGNvdW50KSB0aHJvdygpOw0KKyAgdm9pZCBEZWxldGVGcm9udGFsKHVuc2lnbmVkIG51bSkgdGhyb3coKTsNCisgIHZvaWQgRGVsZXRlQmFjaygpIHsgX2NoYXJzWy0tX2xlbl0gPSAwOyB9DQorICB2b2lkIERlbGV0ZUZyb20odW5zaWduZWQgaW5kZXgpDQorICB7DQorICAgIGlmIChpbmRleCA8IF9sZW4pDQorICAgIHsNCisgICAgICBfbGVuID0gaW5kZXg7DQorICAgICAgX2NoYXJzW2luZGV4XSA9IDA7DQorICAgIH0NCisgIH0NCit9Ow0KKw0KK2Jvb2wgb3BlcmF0b3I8KGNvbnN0IFVTdHJpbmcgJnMxLCBjb25zdCBVU3RyaW5nICZzMik7DQorYm9vbCBvcGVyYXRvcj4oY29uc3QgVVN0cmluZyAmczEsIGNvbnN0IFVTdHJpbmcgJnMyKTsNCisNCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVTdHJpbmcgJnMxLCBjb25zdCBVU3RyaW5nICZzMikgeyByZXR1cm4gczEuTGVuKCkgPT0gczIuTGVuKCkgJiYgd2NzY21wKHMxLCBzMikgPT0gMDsgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVVN0cmluZyAmczEsIGNvbnN0IHdjaGFyX3QgKnMyKSB7IHJldHVybiB3Y3NjbXAoczEsIHMyKSA9PSAwOyB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCB3Y2hhcl90ICpzMSwgY29uc3QgVVN0cmluZyAmczIpIHsgcmV0dXJuIHdjc2NtcChzMSwgczIpID09IDA7IH0NCisNCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFVTdHJpbmcgJnMxLCBjb25zdCBVU3RyaW5nICZzMikgeyByZXR1cm4gczEuTGVuKCkgIT0gczIuTGVuKCkgfHwgd2NzY21wKHMxLCBzMikgIT0gMDsgfQ0KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgVVN0cmluZyAmczEsIGNvbnN0IHdjaGFyX3QgKnMyKSB7IHJldHVybiB3Y3NjbXAoczEsIHMyKSAhPSAwOyB9DQoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCB3Y2hhcl90ICpzMSwgY29uc3QgVVN0cmluZyAmczIpIHsgcmV0dXJuIHdjc2NtcChzMSwgczIpICE9IDA7IH0NCisNCisNCit0eXBlZGVmIENPYmplY3RWZWN0b3I8QVN0cmluZz4gQVN0cmluZ1ZlY3RvcjsNCit0eXBlZGVmIENPYmplY3RWZWN0b3I8VVN0cmluZz4gVVN0cmluZ1ZlY3RvcjsNCisNCisjaWZkZWYgX1VOSUNPREUNCisgIHR5cGVkZWYgVVN0cmluZyBDU3lzU3RyaW5nOw0KKyNlbHNlDQorICB0eXBlZGVmIEFTdHJpbmcgQ1N5c1N0cmluZzsNCisjZW5kaWYNCisNCit0eXBlZGVmIENPYmplY3RWZWN0b3I8Q1N5c1N0cmluZz4gQ1N5c1N0cmluZ1ZlY3RvcjsNCisNCisNCisvLyAtLS0tLS0tLS0tIEZTdHJpbmcgLS0tLS0tLS0tLQ0KKw0KKyNpZmRlZiBfV0lOMzINCisgICNkZWZpbmUgVVNFX1VOSUNPREVfRlNUUklORw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBVU0VfVU5JQ09ERV9GU1RSSU5HDQorDQorICAjZGVmaW5lIF9fRlRFWFQocXVvdGUpIEwjI3F1b3RlDQorDQorICB0eXBlZGVmIHdjaGFyX3QgRkNoYXI7DQorICB0eXBlZGVmIFVTdHJpbmcgRlN0cmluZzsNCisNCisgICNkZWZpbmUgZnMydXMoX3hfKSAoX3hfKQ0KKyAgI2RlZmluZSB1czJmcyhfeF8pIChfeF8pDQorICBGU3RyaW5nIGZhczJmcyhjb25zdCBBU3RyaW5nICZzKTsNCisgIEFTdHJpbmcgZnMyZmFzKGNvbnN0IEZDaGFyICpzKTsNCisNCisjZWxzZQ0KKw0KKyAgI2RlZmluZSBfX0ZURVhUKHF1b3RlKSBxdW90ZQ0KKw0KKyAgdHlwZWRlZiBjaGFyIEZDaGFyOw0KKyAgdHlwZWRlZiBBU3RyaW5nIEZTdHJpbmc7DQorDQorICBVU3RyaW5nIGZzMnVzKGNvbnN0IEZTdHJpbmcgJnMpOw0KKyAgRlN0cmluZyB1czJmcyhjb25zdCB3Y2hhcl90ICpzKTsNCisgICNkZWZpbmUgZmFzMmZzKF94XykgKF94XykNCisgICNkZWZpbmUgZnMyZmFzKF94XykgKF94XykNCisNCisjZW5kaWYNCisNCisjZGVmaW5lIEZURVhUKHF1b3RlKSBfX0ZURVhUKHF1b3RlKQ0KKw0KKyNkZWZpbmUgRkNIQVJfUEFUSF9TRVBBUkFUT1IgRlRFWFQoQ0hBUl9QQVRIX1NFUEFSQVRPUikNCisjZGVmaW5lIEZTVFJJTkdfUEFUSF9TRVBBUkFUT1IgRlRFWFQoU1RSSU5HX1BBVEhfU0VQQVJBVE9SKQ0KKyNkZWZpbmUgRkNIQVJfQU5ZX01BU0sgRlRFWFQoJyonKQ0KKyNkZWZpbmUgRlNUUklOR19BTllfTUFTSyBGVEVYVCgiKiIpDQordHlwZWRlZiBjb25zdCBGQ2hhciAqQ0ZTVFI7DQorDQordHlwZWRlZiBDT2JqZWN0VmVjdG9yPEZTdHJpbmc+IEZTdHJpbmdWZWN0b3I7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvQ29tbW9uL015VHlwZXMuaCBiL2x6bWEvQ1BQL0NvbW1vbi9NeVR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5NzM5YwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9NeVR5cGVzLmgKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29tbW9uL015VHlwZXMuaA0KKw0KKyNpZm5kZWYgX19DT01NT05fTVlfVFlQRVNfSA0KKyNkZWZpbmUgX19DT01NT05fTVlfVFlQRVNfSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9DLzd6VHlwZXMuaCINCisNCit0eXBlZGVmIGludCBIUmVzOw0KKw0KK3N0cnVjdCBDQm9vbFBhaXINCit7DQorICBib29sIFZhbDsNCisgIGJvb2wgRGVmOw0KKw0KKyAgQ0Jvb2xQYWlyKCk6IFZhbChmYWxzZSksIERlZihmYWxzZSkge30NCisgIA0KKyAgdm9pZCBJbml0KCkNCisgIHsNCisgICAgVmFsID0gZmFsc2U7DQorICAgIERlZiA9IGZhbHNlOw0KKyAgfQ0KKw0KKyAgdm9pZCBTZXRUcnVlVHJ1ZSgpDQorICB7DQorICAgIFZhbCA9IHRydWU7DQorICAgIERlZiA9IHRydWU7DQorICB9DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vTXlVbmtub3duLmggYi9sem1hL0NQUC9Db21tb24vTXlVbmtub3duLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzNTEyNAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9NeVVua25vd24uaApAQCAtMCwwICsxLDEzIEBACisvLyBNeVVua25vd24uaA0KKw0KKyNpZm5kZWYgX19NWV9VTktOT1dOX0gNCisjZGVmaW5lIF9fTVlfVU5LTk9XTl9IDQorDQorI2lmZGVmIF9XSU4zMg0KKyNpbmNsdWRlIDxiYXNldHlwcy5oPg0KKyNpbmNsdWRlIDx1bmtud24uaD4NCisjZWxzZQ0KKyNpbmNsdWRlICJNeVdpbmRvd3MuaCINCisjZW5kaWYNCisgIA0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9NeVZlY3Rvci5jcHAgYi9sem1hL0NQUC9Db21tb24vTXlWZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNmQxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vTXlWZWN0b3IuY3BwCkBAIC0wLDAgKzEsMyBAQAorLy8gQ29tbW9uL015VmVjdG9yLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vTXlWZWN0b3IuaCBiL2x6bWEvQ1BQL0NvbW1vbi9NeVZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMWFhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vTXlWZWN0b3IuaApAQCAtMCwwICsxLDYxNSBAQAorLy8gQ29tbW9uL015VmVjdG9yLmgNCisNCisjaWZuZGVmIF9fQ09NTU9OX01ZX1ZFQ1RPUl9IDQorI2RlZmluZSBfX0NPTU1PTl9NWV9WRUNUT1JfSA0KKw0KK3RlbXBsYXRlIDxjbGFzcyBUPg0KK2NsYXNzIENSZWNvcmRWZWN0b3INCit7DQorICBUICpfaXRlbXM7DQorICB1bnNpZ25lZCBfc2l6ZTsNCisgIHVuc2lnbmVkIF9jYXBhY2l0eTsNCisgIA0KKyAgdm9pZCBNb3ZlSXRlbXModW5zaWduZWQgZGVzdEluZGV4LCB1bnNpZ25lZCBzcmNJbmRleCkNCisgIHsNCisgICAgbWVtbW92ZShfaXRlbXMgKyBkZXN0SW5kZXgsIF9pdGVtcyArIHNyY0luZGV4LCAoc2l6ZV90KShfc2l6ZSAtIHNyY0luZGV4KSAqIChzaXplX3Qpc2l6ZW9mKFQpKTsNCisgIH0NCisNCisgIHZvaWQgUmVzZXJ2ZU9uZVBvc2l0aW9uKCkNCisgIHsNCisgICAgaWYgKF9zaXplID09IF9jYXBhY2l0eSkNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIG5ld0NhcGFjaXR5ID0gX2NhcGFjaXR5ICsgKF9jYXBhY2l0eSA+PiAyKSArIDE7DQorICAgICAgVCAqcCA9IG5ldyBUW25ld0NhcGFjaXR5XTsNCisgICAgICBtZW1jcHkocCwgX2l0ZW1zLCAoc2l6ZV90KV9zaXplICogKHNpemVfdClzaXplb2YoVCkpOw0KKyAgICAgIGRlbGV0ZSBbXV9pdGVtczsNCisgICAgICBfaXRlbXMgPSBwOw0KKyAgICAgIF9jYXBhY2l0eSA9IG5ld0NhcGFjaXR5Ow0KKyAgICB9DQorICB9DQorDQorcHVibGljOg0KKw0KKyAgQ1JlY29yZFZlY3RvcigpOiBfaXRlbXMoMCksIF9zaXplKDApLCBfY2FwYWNpdHkoMCkge30NCisgIA0KKyAgQ1JlY29yZFZlY3Rvcihjb25zdCBDUmVjb3JkVmVjdG9yICZ2KTogX2l0ZW1zKDApLCBfc2l6ZSgwKSwgX2NhcGFjaXR5KDApDQorICB7DQorICAgIHVuc2lnbmVkIHNpemUgPSB2LlNpemUoKTsNCisgICAgaWYgKHNpemUgIT0gMCkNCisgICAgew0KKyAgICAgIF9pdGVtcyA9IG5ldyBUW3NpemVdOw0KKyAgICAgIF9zaXplID0gc2l6ZTsNCisgICAgICBfY2FwYWNpdHkgPSBzaXplOw0KKyAgICAgIG1lbWNweShfaXRlbXMsIHYuX2l0ZW1zLCAoc2l6ZV90KXNpemUgKiAoc2l6ZV90KXNpemVvZihUKSk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgdW5zaWduZWQgU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9zaXplOyB9DQorICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBfc2l6ZSA9PSAwOyB9DQorICANCisgIHZvaWQgQ29uc3RydWN0UmVzZXJ2ZSh1bnNpZ25lZCBzaXplKQ0KKyAgew0KKyAgICBpZiAoc2l6ZSAhPSAwKQ0KKyAgICB7DQorICAgICAgX2l0ZW1zID0gbmV3IFRbc2l6ZV07DQorICAgICAgX2NhcGFjaXR5ID0gc2l6ZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgdm9pZCBSZXNlcnZlKHVuc2lnbmVkIG5ld0NhcGFjaXR5KQ0KKyAgew0KKyAgICBpZiAobmV3Q2FwYWNpdHkgPiBfY2FwYWNpdHkpDQorICAgIHsNCisgICAgICBUICpwID0gbmV3IFRbbmV3Q2FwYWNpdHldOw0KKyAgICAgIG1lbWNweShwLCBfaXRlbXMsIChzaXplX3QpX3NpemUgKiAoc2l6ZV90KXNpemVvZihUKSk7DQorICAgICAgZGVsZXRlIFtdX2l0ZW1zOw0KKyAgICAgIF9pdGVtcyA9IHA7DQorICAgICAgX2NhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7DQorICAgIH0NCisgIH0NCisNCisgIHZvaWQgQ2xlYXJBbmRSZXNlcnZlKHVuc2lnbmVkIG5ld0NhcGFjaXR5KQ0KKyAgew0KKyAgICBDbGVhcigpOw0KKyAgICBpZiAobmV3Q2FwYWNpdHkgPiBfY2FwYWNpdHkpDQorICAgIHsNCisgICAgICBkZWxldGUgW11faXRlbXM7DQorICAgICAgX2l0ZW1zID0gTlVMTDsNCisgICAgICBfY2FwYWNpdHkgPSAwOw0KKyAgICAgIF9pdGVtcyA9IG5ldyBUW25ld0NhcGFjaXR5XTsNCisgICAgICBfY2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgdm9pZCBDbGVhckFuZFNldFNpemUodW5zaWduZWQgbmV3U2l6ZSkNCisgIHsNCisgICAgQ2xlYXJBbmRSZXNlcnZlKG5ld1NpemUpOw0KKyAgICBfc2l6ZSA9IG5ld1NpemU7DQorICB9DQorDQorICB2b2lkIENoYW5nZVNpemVfS2VlcERhdGEodW5zaWduZWQgbmV3U2l6ZSkNCisgIHsNCisgICAgaWYgKG5ld1NpemUgPiBfY2FwYWNpdHkpDQorICAgIHsNCisgICAgICBUICpwID0gbmV3IFRbbmV3U2l6ZV07DQorICAgICAgbWVtY3B5KHAsIF9pdGVtcywgKHNpemVfdClfc2l6ZSAqIChzaXplX3Qpc2l6ZW9mKFQpKTsNCisgICAgICBkZWxldGUgW11faXRlbXM7DQorICAgICAgX2l0ZW1zID0gcDsNCisgICAgICBfY2FwYWNpdHkgPSBuZXdTaXplOw0KKyAgICB9DQorICAgIF9zaXplID0gbmV3U2l6ZTsNCisgIH0NCisNCisgIHZvaWQgUmVzZXJ2ZURvd24oKQ0KKyAgew0KKyAgICBpZiAoX3NpemUgPT0gX2NhcGFjaXR5KQ0KKyAgICAgIHJldHVybjsNCisgICAgVCAqcCA9IE5VTEw7DQorICAgIGlmIChfc2l6ZSAhPSAwKQ0KKyAgICB7DQorICAgICAgcCA9IG5ldyBUW19zaXplXTsNCisgICAgICBtZW1jcHkocCwgX2l0ZW1zLCAoc2l6ZV90KV9zaXplICogKHNpemVfdClzaXplb2YoVCkpOw0KKyAgICB9DQorICAgIGRlbGV0ZSBbXV9pdGVtczsNCisgICAgX2l0ZW1zID0gcDsNCisgICAgX2NhcGFjaXR5ID0gX3NpemU7DQorICB9DQorICANCisgIH5DUmVjb3JkVmVjdG9yKCkgeyBkZWxldGUgW11faXRlbXM7IH0NCisgIA0KKyAgdm9pZCBDbGVhckFuZEZyZWUoKQ0KKyAgew0KKyAgICBkZWxldGUgW11faXRlbXM7DQorICAgIF9pdGVtcyA9IE5VTEw7DQorICAgIF9zaXplID0gMDsNCisgICAgX2NhcGFjaXR5ID0gMDsNCisgIH0NCisgIA0KKyAgdm9pZCBDbGVhcigpIHsgX3NpemUgPSAwOyB9DQorDQorICB2b2lkIERlbGV0ZUJhY2soKSB7IF9zaXplLS07IH0NCisgIA0KKyAgdm9pZCBEZWxldGVGcm9tKHVuc2lnbmVkIGluZGV4KQ0KKyAgew0KKyAgICAvLyBpZiAoaW5kZXggPD0gX3NpemUpDQorICAgICAgX3NpemUgPSBpbmRleDsNCisgIH0NCisgIA0KKyAgdm9pZCBEZWxldGVGcm9udGFsKHVuc2lnbmVkIG51bSkNCisgIHsNCisgICAgaWYgKG51bSAhPSAwKQ0KKyAgICB7DQorICAgICAgTW92ZUl0ZW1zKDAsIG51bSk7DQorICAgICAgX3NpemUgLT0gbnVtOw0KKyAgICB9DQorICB9DQorDQorICB2b2lkIERlbGV0ZSh1bnNpZ25lZCBpbmRleCkNCisgIHsNCisgICAgTW92ZUl0ZW1zKGluZGV4LCBpbmRleCArIDEpOw0KKyAgICBfc2l6ZSAtPSAxOw0KKyAgfQ0KKw0KKyAgLyoNCisgIHZvaWQgRGVsZXRlKHVuc2lnbmVkIGluZGV4LCB1bnNpZ25lZCBudW0pDQorICB7DQorICAgIGlmIChudW0gPiAwKQ0KKyAgICB7DQorICAgICAgTW92ZUl0ZW1zKGluZGV4LCBpbmRleCArIG51bSk7DQorICAgICAgX3NpemUgLT0gbnVtOw0KKyAgICB9DQorICB9DQorICAqLw0KKw0KKyAgQ1JlY29yZFZlY3RvciYgb3BlcmF0b3I9KGNvbnN0IENSZWNvcmRWZWN0b3IgJnYpDQorICB7DQorICAgIHVuc2lnbmVkIHNpemUgPSB2LlNpemUoKTsNCisgICAgaWYgKHNpemUgPiBfY2FwYWNpdHkpDQorICAgIHsNCisgICAgICBkZWxldGUgW11faXRlbXM7DQorICAgICAgX2NhcGFjaXR5ID0gMDsNCisgICAgICBfc2l6ZSA9IDA7DQorICAgICAgX2l0ZW1zID0gTlVMTDsNCisgICAgICBfaXRlbXMgPSBuZXcgVFtzaXplXTsNCisgICAgICBfY2FwYWNpdHkgPSBzaXplOw0KKyAgICB9DQorICAgIF9zaXplID0gc2l6ZTsNCisgICAgbWVtY3B5KF9pdGVtcywgdi5faXRlbXMsIChzaXplX3Qpc2l6ZSAqIChzaXplX3Qpc2l6ZW9mKFQpKTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKw0KKyAgQ1JlY29yZFZlY3RvciYgb3BlcmF0b3IrPShjb25zdCBDUmVjb3JkVmVjdG9yICZ2KQ0KKyAgew0KKyAgICB1bnNpZ25lZCBzaXplID0gdi5TaXplKCk7DQorICAgIFJlc2VydmUoX3NpemUgKyBzaXplKTsNCisgICAgbWVtY3B5KF9pdGVtcyArIF9zaXplLCB2Ll9pdGVtcywgKHNpemVfdClzaXplICogKHNpemVfdClzaXplb2YoVCkpOw0KKyAgICBfc2l6ZSArPSBzaXplOw0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICANCisgIHVuc2lnbmVkIEFkZChjb25zdCBUIGl0ZW0pDQorICB7DQorICAgIFJlc2VydmVPbmVQb3NpdGlvbigpOw0KKyAgICBfaXRlbXNbX3NpemVdID0gaXRlbTsNCisgICAgcmV0dXJuIF9zaXplKys7DQorICB9DQorDQorICB2b2lkIEFkZEluUmVzZXJ2ZWQoY29uc3QgVCBpdGVtKQ0KKyAgew0KKyAgICBfaXRlbXNbX3NpemUrK10gPSBpdGVtOw0KKyAgfQ0KKw0KKyAgdm9pZCBJbnNlcnQodW5zaWduZWQgaW5kZXgsIGNvbnN0IFQgaXRlbSkNCisgIHsNCisgICAgUmVzZXJ2ZU9uZVBvc2l0aW9uKCk7DQorICAgIE1vdmVJdGVtcyhpbmRleCArIDEsIGluZGV4KTsNCisgICAgX2l0ZW1zW2luZGV4XSA9IGl0ZW07DQorICAgIF9zaXplKys7DQorICB9DQorDQorICB2b2lkIE1vdmVUb0Zyb250KHVuc2lnbmVkIGluZGV4KQ0KKyAgew0KKyAgICBpZiAoaW5kZXggIT0gMCkNCisgICAgew0KKyAgICAgIFQgdGVtcCA9IF9pdGVtc1tpbmRleF07DQorICAgICAgbWVtbW92ZShfaXRlbXMgKyAxLCBfaXRlbXMsIChzaXplX3QpaW5kZXggKiAoc2l6ZV90KXNpemVvZihUKSk7DQorICAgICAgX2l0ZW1zWzBdID0gdGVtcDsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgY29uc3QgVCYgb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gX2l0ZW1zW2luZGV4XTsgfQ0KKyAgICAgICAgVCYgb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgICAgICAgeyByZXR1cm4gX2l0ZW1zW2luZGV4XTsgfQ0KKyAgY29uc3QgVCYgRnJvbnQoKSBjb25zdCB7IHJldHVybiBfaXRlbXNbMF07IH0NCisgICAgICAgIFQmIEZyb250KCkgICAgICAgeyByZXR1cm4gX2l0ZW1zWzBdOyB9DQorICBjb25zdCBUJiBCYWNrKCkgY29uc3QgIHsgcmV0dXJuIF9pdGVtc1tfc2l6ZSAtIDFdOyB9DQorICAgICAgICBUJiBCYWNrKCkgICAgICAgIHsgcmV0dXJuIF9pdGVtc1tfc2l6ZSAtIDFdOyB9DQorDQorICAvKg0KKyAgdm9pZCBTd2FwKHVuc2lnbmVkIGksIHVuc2lnbmVkIGopDQorICB7DQorICAgIFQgdGVtcCA9IF9pdGVtc1tpXTsNCisgICAgX2l0ZW1zW2ldID0gX2l0ZW1zW2pdOw0KKyAgICBfaXRlbXNbal0gPSB0ZW1wOw0KKyAgfQ0KKyAgKi8NCisNCisgIGludCBGaW5kSW5Tb3J0ZWQoY29uc3QgVCBpdGVtLCB1bnNpZ25lZCBsZWZ0LCB1bnNpZ25lZCByaWdodCkgY29uc3QNCisgIHsNCisgICAgd2hpbGUgKGxlZnQgIT0gcmlnaHQpDQorICAgIHsNCisgICAgICB1bnNpZ25lZCBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7DQorICAgICAgY29uc3QgVCBtaWRWYWwgPSAoKnRoaXMpW21pZF07DQorICAgICAgaWYgKGl0ZW0gPT0gbWlkVmFsKQ0KKyAgICAgICAgcmV0dXJuIG1pZDsNCisgICAgICBpZiAoaXRlbSA8IG1pZFZhbCkNCisgICAgICAgIHJpZ2h0ID0gbWlkOw0KKyAgICAgIGVsc2UNCisgICAgICAgIGxlZnQgPSBtaWQgKyAxOw0KKyAgICB9DQorICAgIHJldHVybiAtMTsNCisgIH0NCisNCisgIGludCBGaW5kSW5Tb3J0ZWQyKGNvbnN0IFQgJml0ZW0sIHVuc2lnbmVkIGxlZnQsIHVuc2lnbmVkIHJpZ2h0KSBjb25zdA0KKyAgew0KKyAgICB3aGlsZSAobGVmdCAhPSByaWdodCkNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsNCisgICAgICBjb25zdCBUJiBtaWRWYWwgPSAoKnRoaXMpW21pZF07DQorICAgICAgaW50IGNvbXAgPSBpdGVtLkNvbXBhcmUobWlkVmFsKTsNCisgICAgICBpZiAoY29tcCA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIG1pZDsNCisgICAgICBpZiAoY29tcCA8IDApDQorICAgICAgICByaWdodCA9IG1pZDsNCisgICAgICBlbHNlDQorICAgICAgICBsZWZ0ID0gbWlkICsgMTsNCisgICAgfQ0KKyAgICByZXR1cm4gLTE7DQorICB9DQorDQorICBpbnQgRmluZEluU29ydGVkKGNvbnN0IFQgaXRlbSkgY29uc3QNCisgIHsNCisgICAgcmV0dXJuIEZpbmRJblNvcnRlZChpdGVtLCAwLCBfc2l6ZSk7DQorICB9DQorDQorICBpbnQgRmluZEluU29ydGVkMihjb25zdCBUICZpdGVtKSBjb25zdA0KKyAgew0KKyAgICByZXR1cm4gRmluZEluU29ydGVkMihpdGVtLCAwLCBfc2l6ZSk7DQorICB9DQorDQorICB1bnNpZ25lZCBBZGRUb1VuaXF1ZVNvcnRlZChjb25zdCBUIGl0ZW0pDQorICB7DQorICAgIHVuc2lnbmVkIGxlZnQgPSAwLCByaWdodCA9IF9zaXplOw0KKyAgICB3aGlsZSAobGVmdCAhPSByaWdodCkNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsNCisgICAgICBjb25zdCBUIG1pZFZhbCA9ICgqdGhpcylbbWlkXTsNCisgICAgICBpZiAoaXRlbSA9PSBtaWRWYWwpDQorICAgICAgICByZXR1cm4gbWlkOw0KKyAgICAgIGlmIChpdGVtIDwgbWlkVmFsKQ0KKyAgICAgICAgcmlnaHQgPSBtaWQ7DQorICAgICAgZWxzZQ0KKyAgICAgICAgbGVmdCA9IG1pZCArIDE7DQorICAgIH0NCisgICAgSW5zZXJ0KHJpZ2h0LCBpdGVtKTsNCisgICAgcmV0dXJuIHJpZ2h0Ow0KKyAgfQ0KKw0KKyAgdW5zaWduZWQgQWRkVG9VbmlxdWVTb3J0ZWQyKGNvbnN0IFQgJml0ZW0pDQorICB7DQorICAgIHVuc2lnbmVkIGxlZnQgPSAwLCByaWdodCA9IF9zaXplOw0KKyAgICB3aGlsZSAobGVmdCAhPSByaWdodCkNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsNCisgICAgICBjb25zdCBUJiBtaWRWYWwgPSAoKnRoaXMpW21pZF07DQorICAgICAgaW50IGNvbXAgPSBpdGVtLkNvbXBhcmUobWlkVmFsKTsNCisgICAgICBpZiAoY29tcCA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIG1pZDsNCisgICAgICBpZiAoY29tcCA8IDApDQorICAgICAgICByaWdodCA9IG1pZDsNCisgICAgICBlbHNlDQorICAgICAgICBsZWZ0ID0gbWlkICsgMTsNCisgICAgfQ0KKyAgICBJbnNlcnQocmlnaHQsIGl0ZW0pOw0KKyAgICByZXR1cm4gcmlnaHQ7DQorICB9DQorDQorICBzdGF0aWMgdm9pZCBTb3J0UmVmRG93bihUKiBwLCB1bnNpZ25lZCBrLCB1bnNpZ25lZCBzaXplLCBpbnQgKCpjb21wYXJlKShjb25zdCBUKiwgY29uc3QgVCosIHZvaWQgKiksIHZvaWQgKnBhcmFtKQ0KKyAgew0KKyAgICBUIHRlbXAgPSBwW2tdOw0KKyAgICBmb3IgKDs7KQ0KKyAgICB7DQorICAgICAgdW5zaWduZWQgcyA9IChrIDw8IDEpOw0KKyAgICAgIGlmIChzID4gc2l6ZSkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGlmIChzIDwgc2l6ZSAmJiBjb21wYXJlKHAgKyBzICsgMSwgcCArIHMsIHBhcmFtKSA+IDApDQorICAgICAgICBzKys7DQorICAgICAgaWYgKGNvbXBhcmUoJnRlbXAsIHAgKyBzLCBwYXJhbSkgPj0gMCkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIHBba10gPSBwW3NdOw0KKyAgICAgIGsgPSBzOw0KKyAgICB9DQorICAgIHBba10gPSB0ZW1wOw0KKyAgfQ0KKw0KKyAgdm9pZCBTb3J0KGludCAoKmNvbXBhcmUpKGNvbnN0IFQqLCBjb25zdCBUKiwgdm9pZCAqKSwgdm9pZCAqcGFyYW0pDQorICB7DQorICAgIHVuc2lnbmVkIHNpemUgPSBfc2l6ZTsNCisgICAgaWYgKHNpemUgPD0gMSkNCisgICAgICByZXR1cm47DQorICAgIFQqIHAgPSAoJkZyb250KCkpIC0gMTsNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIGkgPSBzaXplID4+IDE7DQorICAgICAgZG8NCisgICAgICAgIFNvcnRSZWZEb3duKHAsIGksIHNpemUsIGNvbXBhcmUsIHBhcmFtKTsNCisgICAgICB3aGlsZSAoLS1pICE9IDApOw0KKyAgICB9DQorICAgIGRvDQorICAgIHsNCisgICAgICBUIHRlbXAgPSBwW3NpemVdOw0KKyAgICAgIHBbc2l6ZS0tXSA9IHBbMV07DQorICAgICAgcFsxXSA9IHRlbXA7DQorICAgICAgU29ydFJlZkRvd24ocCwgMSwgc2l6ZSwgY29tcGFyZSwgcGFyYW0pOw0KKyAgICB9DQorICAgIHdoaWxlIChzaXplID4gMSk7DQorICB9DQorDQorICBzdGF0aWMgdm9pZCBTb3J0UmVmRG93bjIoVCogcCwgdW5zaWduZWQgaywgdW5zaWduZWQgc2l6ZSkNCisgIHsNCisgICAgVCB0ZW1wID0gcFtrXTsNCisgICAgZm9yICg7OykNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIHMgPSAoayA8PCAxKTsNCisgICAgICBpZiAocyA+IHNpemUpDQorICAgICAgICBicmVhazsNCisgICAgICBpZiAocyA8IHNpemUgJiYgcFtzICsgMV0uQ29tcGFyZShwW3NdKSA+IDApDQorICAgICAgICBzKys7DQorICAgICAgaWYgKHRlbXAuQ29tcGFyZShwW3NdKSA+PSAwKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgcFtrXSA9IHBbc107DQorICAgICAgayA9IHM7DQorICAgIH0NCisgICAgcFtrXSA9IHRlbXA7DQorICB9DQorDQorICB2b2lkIFNvcnQyKCkNCisgIHsNCisgICAgdW5zaWduZWQgc2l6ZSA9IF9zaXplOw0KKyAgICBpZiAoc2l6ZSA8PSAxKQ0KKyAgICAgIHJldHVybjsNCisgICAgVCogcCA9ICgmRnJvbnQoKSkgLSAxOw0KKyAgICB7DQorICAgICAgdW5zaWduZWQgaSA9IHNpemUgPj4gMTsNCisgICAgICBkbw0KKyAgICAgICAgU29ydFJlZkRvd24yKHAsIGksIHNpemUpOw0KKyAgICAgIHdoaWxlICgtLWkgIT0gMCk7DQorICAgIH0NCisgICAgZG8NCisgICAgew0KKyAgICAgIFQgdGVtcCA9IHBbc2l6ZV07DQorICAgICAgcFtzaXplLS1dID0gcFsxXTsNCisgICAgICBwWzFdID0gdGVtcDsNCisgICAgICBTb3J0UmVmRG93bjIocCwgMSwgc2l6ZSk7DQorICAgIH0NCisgICAgd2hpbGUgKHNpemUgPiAxKTsNCisgIH0NCit9Ow0KKw0KK3R5cGVkZWYgQ1JlY29yZFZlY3RvcjxpbnQ+IENJbnRWZWN0b3I7DQordHlwZWRlZiBDUmVjb3JkVmVjdG9yPHVuc2lnbmVkIGludD4gQ1VJbnRWZWN0b3I7DQordHlwZWRlZiBDUmVjb3JkVmVjdG9yPGJvb2w+IENCb29sVmVjdG9yOw0KK3R5cGVkZWYgQ1JlY29yZFZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBDQnl0ZVZlY3RvcjsNCit0eXBlZGVmIENSZWNvcmRWZWN0b3I8dm9pZCAqPiBDUG9pbnRlclZlY3RvcjsNCisNCit0ZW1wbGF0ZSA8Y2xhc3MgVD4NCitjbGFzcyBDT2JqZWN0VmVjdG9yDQorew0KKyAgQ1BvaW50ZXJWZWN0b3IgX3Y7DQorcHVibGljOg0KKyAgdW5zaWduZWQgU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF92LlNpemUoKTsgfQ0KKyAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gX3YuSXNFbXB0eSgpOyB9DQorICB2b2lkIFJlc2VydmVEb3duKCkgeyBfdi5SZXNlcnZlRG93bigpOyB9DQorICAvLyB2b2lkIFJlc2VydmUodW5zaWduZWQgbmV3Q2FwYWNpdHkpIHsgX3YuUmVzZXJ2ZShuZXdDYXBhY2l0eSk7IH0NCisgIHZvaWQgQ2xlYXJBbmRSZXNlcnZlKHVuc2lnbmVkIG5ld0NhcGFjaXR5KSB7IENsZWFyKCk7IF92LkNsZWFyQW5kUmVzZXJ2ZShuZXdDYXBhY2l0eSk7IH0NCisNCisgIENPYmplY3RWZWN0b3IoKSB7fTsNCisgIENPYmplY3RWZWN0b3IoY29uc3QgQ09iamVjdFZlY3RvciAmdikNCisgIHsNCisgICAgdW5zaWduZWQgc2l6ZSA9IHYuU2l6ZSgpOw0KKyAgICBfdi5Db25zdHJ1Y3RSZXNlcnZlKHNpemUpOw0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQ0KKyAgICAgIF92LkFkZEluUmVzZXJ2ZWQobmV3IFQodltpXSkpOw0KKyAgfQ0KKyAgQ09iamVjdFZlY3RvciYgb3BlcmF0b3I9KGNvbnN0IENPYmplY3RWZWN0b3IgJnYpDQorICB7DQorICAgIENsZWFyKCk7DQorICAgIHVuc2lnbmVkIHNpemUgPSB2LlNpemUoKTsNCisgICAgX3YuUmVzZXJ2ZShzaXplKTsNCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7IGkrKykNCisgICAgICBfdi5BZGRJblJlc2VydmVkKG5ldyBUKHZbaV0pKTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKw0KKyAgQ09iamVjdFZlY3RvciYgb3BlcmF0b3IrPShjb25zdCBDT2JqZWN0VmVjdG9yICZ2KQ0KKyAgew0KKyAgICB1bnNpZ25lZCBzaXplID0gdi5TaXplKCk7DQorICAgIF92LlJlc2VydmUoU2l6ZSgpICsgc2l6ZSk7DQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyBpKyspDQorICAgICAgX3YuQWRkSW5SZXNlcnZlZChuZXcgVCh2W2ldKSk7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCisgIA0KKyAgY29uc3QgVCYgb3BlcmF0b3JbXSh1bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gKigoVCAqKV92W2luZGV4XSk7IH0NCisgICAgICAgIFQmIG9wZXJhdG9yW10odW5zaWduZWQgaW5kZXgpICAgICAgIHsgcmV0dXJuICooKFQgKilfdltpbmRleF0pOyB9DQorICBjb25zdCBUJiBGcm9udCgpIGNvbnN0IHsgcmV0dXJuIG9wZXJhdG9yW10oMCk7IH0NCisgICAgICAgIFQmIEZyb250KCkgICAgICAgeyByZXR1cm4gb3BlcmF0b3JbXSgwKTsgfQ0KKyAgY29uc3QgVCYgQmFjaygpIGNvbnN0ICB7IHJldHVybiBvcGVyYXRvcltdKF92LlNpemUoKSAtIDEpOyB9DQorICAgICAgICBUJiBCYWNrKCkgICAgICAgIHsgcmV0dXJuIG9wZXJhdG9yW10oX3YuU2l6ZSgpIC0gMSk7IH0NCisgIA0KKyAgdm9pZCBNb3ZlVG9Gcm9udCh1bnNpZ25lZCBpbmRleCkgeyBfdi5Nb3ZlVG9Gcm9udChpbmRleCk7IH0NCisNCisgIHVuc2lnbmVkIEFkZChjb25zdCBUJiBpdGVtKSB7IHJldHVybiBfdi5BZGQobmV3IFQoaXRlbSkpOyB9DQorICANCisgIHZvaWQgQWRkSW5SZXNlcnZlZChjb25zdCBUJiBpdGVtKSB7IF92LkFkZEluUmVzZXJ2ZWQobmV3IFQoaXRlbSkpOyB9DQorICANCisgIFQmIEFkZE5ldygpDQorICB7DQorICAgIFQgKnAgPSBuZXcgVDsNCisgICAgX3YuQWRkKHApOw0KKyAgICByZXR1cm4gKnA7DQorICB9DQorICANCisgIFQmIEFkZE5ld0luUmVzZXJ2ZWQoKQ0KKyAgew0KKyAgICBUICpwID0gbmV3IFQ7DQorICAgIF92LkFkZEluUmVzZXJ2ZWQocCk7DQorICAgIHJldHVybiAqcDsNCisgIH0NCisgIA0KKyAgdm9pZCBJbnNlcnQodW5zaWduZWQgaW5kZXgsIGNvbnN0IFQmIGl0ZW0pIHsgX3YuSW5zZXJ0KGluZGV4LCBuZXcgVChpdGVtKSk7IH0NCisgIA0KKyAgVCYgSW5zZXJ0TmV3KHVuc2lnbmVkIGluZGV4KQ0KKyAgew0KKyAgICBUICpwID0gbmV3IFQ7DQorICAgIF92Lkluc2VydChpbmRleCwgcCk7DQorICAgIHJldHVybiAqcDsNCisgIH0NCisNCisgIH5DT2JqZWN0VmVjdG9yKCkNCisgIHsNCisgICAgZm9yICh1bnNpZ25lZCBpID0gX3YuU2l6ZSgpOyBpICE9IDA7KQ0KKyAgICAgIGRlbGV0ZSAoVCAqKV92Wy0taV07DQorICB9DQorICANCisgIHZvaWQgQ2xlYXJBbmRGcmVlKCkNCisgIHsNCisgICAgQ2xlYXIoKTsNCisgICAgX3YuQ2xlYXJBbmRGcmVlKCk7DQorICB9DQorICANCisgIHZvaWQgQ2xlYXIoKQ0KKyAgew0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBfdi5TaXplKCk7IGkgIT0gMDspDQorICAgICAgZGVsZXRlIChUICopX3ZbLS1pXTsNCisgICAgX3YuQ2xlYXIoKTsNCisgIH0NCisgIA0KKyAgdm9pZCBEZWxldGVGcm9tKHVuc2lnbmVkIGluZGV4KQ0KKyAgew0KKyAgICB1bnNpZ25lZCBzaXplID0gX3YuU2l6ZSgpOw0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBpbmRleDsgaSA8IHNpemU7IGkrKykNCisgICAgICBkZWxldGUgKFQgKilfdltpXTsNCisgICAgX3YuRGVsZXRlRnJvbShpbmRleCk7DQorICB9DQorDQorICB2b2lkIERlbGV0ZUZyb250YWwodW5zaWduZWQgbnVtKQ0KKyAgew0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtOyBpKyspDQorICAgICAgZGVsZXRlIChUICopX3ZbaV07DQorICAgIF92LkRlbGV0ZUZyb250YWwobnVtKTsNCisgIH0NCisNCisgIHZvaWQgRGVsZXRlQmFjaygpDQorICB7DQorICAgIGRlbGV0ZSAoVCAqKV92W192LlNpemUoKSAtIDFdOw0KKyAgICBfdi5EZWxldGVCYWNrKCk7DQorICB9DQorDQorICB2b2lkIERlbGV0ZSh1bnNpZ25lZCBpbmRleCkNCisgIHsNCisgICAgZGVsZXRlIChUICopX3ZbaW5kZXhdOw0KKyAgICBfdi5EZWxldGUoaW5kZXgpOw0KKyAgfQ0KKw0KKyAgLyoNCisgIHZvaWQgRGVsZXRlKHVuc2lnbmVkIGluZGV4LCB1bnNpZ25lZCBudW0pDQorICB7DQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW07IGkrKykNCisgICAgICBkZWxldGUgKFQgKilfdltpbmRleCArIGldOw0KKyAgICBfdi5EZWxldGUoaW5kZXgsIG51bSk7DQorICB9DQorICAqLw0KKw0KKyAgLyoNCisgIGludCBGaW5kKGNvbnN0IFQmIGl0ZW0pIGNvbnN0DQorICB7DQorICAgIHVuc2lnbmVkIHNpemUgPSBTaXplKCk7DQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyBpKyspDQorICAgICAgaWYgKGl0ZW0gPT0gKCp0aGlzKVtpXSkNCisgICAgICAgIHJldHVybiBpOw0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICAqLw0KKyAgDQorICBpbnQgRmluZEluU29ydGVkKGNvbnN0IFQmIGl0ZW0pIGNvbnN0DQorICB7DQorICAgIHVuc2lnbmVkIGxlZnQgPSAwLCByaWdodCA9IFNpemUoKTsNCisgICAgd2hpbGUgKGxlZnQgIT0gcmlnaHQpDQorICAgIHsNCisgICAgICB1bnNpZ25lZCBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7DQorICAgICAgY29uc3QgVCYgbWlkVmFsID0gKCp0aGlzKVttaWRdOw0KKyAgICAgIGludCBjb21wID0gaXRlbS5Db21wYXJlKG1pZFZhbCk7DQorICAgICAgaWYgKGNvbXAgPT0gMCkNCisgICAgICAgIHJldHVybiBtaWQ7DQorICAgICAgaWYgKGNvbXAgPCAwKQ0KKyAgICAgICAgcmlnaHQgPSBtaWQ7DQorICAgICAgZWxzZQ0KKyAgICAgICAgbGVmdCA9IG1pZCArIDE7DQorICAgIH0NCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKw0KKyAgdW5zaWduZWQgQWRkVG9VbmlxdWVTb3J0ZWQoY29uc3QgVCYgaXRlbSkNCisgIHsNCisgICAgdW5zaWduZWQgbGVmdCA9IDAsIHJpZ2h0ID0gU2l6ZSgpOw0KKyAgICB3aGlsZSAobGVmdCAhPSByaWdodCkNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsNCisgICAgICBjb25zdCBUJiBtaWRWYWwgPSAoKnRoaXMpW21pZF07DQorICAgICAgaW50IGNvbXAgPSBpdGVtLkNvbXBhcmUobWlkVmFsKTsNCisgICAgICBpZiAoY29tcCA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIG1pZDsNCisgICAgICBpZiAoY29tcCA8IDApDQorICAgICAgICByaWdodCA9IG1pZDsNCisgICAgICBlbHNlDQorICAgICAgICBsZWZ0ID0gbWlkICsgMTsNCisgICAgfQ0KKyAgICBJbnNlcnQocmlnaHQsIGl0ZW0pOw0KKyAgICByZXR1cm4gcmlnaHQ7DQorICB9DQorDQorICAvKg0KKyAgdW5zaWduZWQgQWRkVG9Tb3J0ZWQoY29uc3QgVCYgaXRlbSkNCisgIHsNCisgICAgdW5zaWduZWQgbGVmdCA9IDAsIHJpZ2h0ID0gU2l6ZSgpOw0KKyAgICB3aGlsZSAobGVmdCAhPSByaWdodCkNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsNCisgICAgICBjb25zdCBUJiBtaWRWYWwgPSAoKnRoaXMpW21pZF07DQorICAgICAgaW50IGNvbXAgPSBpdGVtLkNvbXBhcmUobWlkVmFsKTsNCisgICAgICBpZiAoY29tcCA9PSAwKQ0KKyAgICAgIHsNCisgICAgICAgIHJpZ2h0ID0gbWlkICsgMTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpZiAoY29tcCA8IDApDQorICAgICAgICByaWdodCA9IG1pZDsNCisgICAgICBlbHNlDQorICAgICAgICBsZWZ0ID0gbWlkICsgMTsNCisgICAgfQ0KKyAgICBJbnNlcnQocmlnaHQsIGl0ZW0pOw0KKyAgICByZXR1cm4gcmlnaHQ7DQorICB9DQorICAqLw0KKw0KKyAgdm9pZCBTb3J0KGludCAoKmNvbXBhcmUpKHZvaWQgKmNvbnN0ICosIHZvaWQgKmNvbnN0ICosIHZvaWQgKiksIHZvaWQgKnBhcmFtKQ0KKyAgICB7IF92LlNvcnQoY29tcGFyZSwgcGFyYW0pOyB9DQorDQorICBzdGF0aWMgaW50IENvbXBhcmVPYmplY3RJdGVtcyh2b2lkICpjb25zdCAqYTEsIHZvaWQgKmNvbnN0ICphMiwgdm9pZCAqIC8qIHBhcmFtICovKQ0KKyAgICB7IHJldHVybiAoKigqKChjb25zdCBUICoqKWExKSkpLkNvbXBhcmUoKigqKChjb25zdCBUICoqKWEyKSkpOyB9DQorDQorICB2b2lkIFNvcnQoKSB7IF92LlNvcnQoQ29tcGFyZU9iamVjdEl0ZW1zLCAwKTsgfQ0KK307DQorDQorI2RlZmluZSBGT1JfVkVDVE9SKF9pXywgX3ZfKSBmb3IgKHVuc2lnbmVkIF9pXyA9IDA7IF9pXyA8IChfdl8pLlNpemUoKTsgX2lfKyspDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvQ29tbW9uL015V2luZG93cy5jcHAgYi9sem1hL0NQUC9Db21tb24vTXlXaW5kb3dzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzlmN2JlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL015V2luZG93cy5jcHAKQEAgLTAsMCArMSwxNDUgQEAKKy8vIE15V2luZG93cy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2lmbmRlZiBfV0lOMzINCisNCisjaW5jbHVkZSA8c3RkbGliLmg+DQorDQorI2luY2x1ZGUgIk15V2luZG93cy5oIg0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqQWxsb2NhdGVGb3JCU1RSKHNpemVfdCBjYikgeyByZXR1cm4gOjptYWxsb2MoY2IpOyB9DQorc3RhdGljIGlubGluZSB2b2lkIEZyZWVGb3JCU1RSKHZvaWQgKnB2KSB7IDo6ZnJlZShwdik7fQ0KKw0KKy8qIFdpbjMyIHVzZXMgRFdPUkQgKDMyLWJpdCkgdHlwZSB0byBzdG9yZSBzaXplIG9mIHN0cmluZyBiZWZvcmUgKE9MRUNIQVIgKikgc3RyaW5nLg0KKyAgV2UgbXVzdCBzZWxlY3QgQ0JzdHJTaXplVHlwZSBmb3IgYW5vdGhlciBzeXN0ZW1zIChub3QgV2luMzIpOg0KKw0KKyAgICBpZiAoQ0JzdHJTaXplVHlwZSBpcyBVSU5UMzIpLA0KKyAgICAgICAgICB0aGVuIHdlIHN1cHBvcnQgb25seSBzdHJpbmdzIHNtYWxsZXIgdGhhbiA0IEdCLg0KKyAgICAgICAgICBXaW4zMiB2ZXJzaW9uIGFsd2F5cyBoYXMgdGhhdCBsaW1pdGF0aW9uLg0KKyAgDQorICAgIGlmIChDQnN0clNpemVUeXBlIGlzIFVJTlQpLA0KKyAgICAgICAgICAoVUlOVCBjYW4gYmUgMTYvMzIvNjQtYml0KQ0KKyAgICAgICAgICBXZSBjYW4gc3VwcG9ydCBzdHJpbmdzIGxhcmdlciB0aGFuIDQgR0IgKGlmIFVJTlQgaXMgNjQtYml0KSwNCisgICAgICAgICAgYnV0IHNpemVvZihVSU5UKSBjYW4gYmUgZGlmZmVyZW50IGluIHBhcnRzIGNvbXBpbGVkIGJ5DQorICAgICAgICAgIGRpZmZlcmVudCBjb21waWxlcnMvc2V0dGluZ3MsDQorICAgICAgICAgIGFuZCB3ZSBjYW4ndCBzZW5kIHN1Y2ggQlNUUiBzdHJpbmdzIGJldHdlZW4gc3VjaCBwYXJ0cy4NCisqLw0KKw0KK3R5cGVkZWYgVUlOVDMyIENCc3RyU2l6ZVR5cGU7DQorLy8gdHlwZWRlZiBVSU5UIENCc3RyU2l6ZVR5cGU7DQorDQorI2RlZmluZSBrX0JzdHJTaXplX01heCAweEZGRkZGRkZGDQorLy8gI2RlZmluZSBrX0JzdHJTaXplX01heCBVSU5UX01BWA0KKy8vICNkZWZpbmUga19Cc3RyU2l6ZV9NYXggKChVSU5UKShJTlQpLTEpDQorDQorQlNUUiBTeXNBbGxvY1N0cmluZ0J5dGVMZW4oTFBDU1RSIHMsIFVJTlQgbGVuKQ0KK3sNCisgIC8qIE9yaWdpbmFsIFN5c0FsbG9jU3RyaW5nQnl0ZUxlbiBpbiBXaW4zMiBtYXliZSBmaWxscyBvbmx5IHVuYWxpZ25lZCBudWxsIE9MRUNIQVIgYXQgdGhlIGVuZC4NCisgICAgIFdlIHByb3ZpZGUgYWxzbyBhbGlnbmVkIG51bGwgT0xFQ0hBUiBhdCB0aGUgZW5kLiAqLw0KKw0KKyAgaWYgKGxlbiA+PSAoa19Cc3RyU2l6ZV9NYXggLSBzaXplb2YoT0xFQ0hBUikgLSBzaXplb2YoT0xFQ0hBUikgLSBzaXplb2YoQ0JzdHJTaXplVHlwZSkpKQ0KKyAgICByZXR1cm4gTlVMTDsNCisNCisgIFVJTlQgc2l6ZSA9IChsZW4gKyBzaXplb2YoT0xFQ0hBUikgKyBzaXplb2YoT0xFQ0hBUikgLSAxKSAmIH4oc2l6ZW9mKE9MRUNIQVIpIC0gMSk7DQorICB2b2lkICpwID0gQWxsb2NhdGVGb3JCU1RSKHNpemUgKyBzaXplb2YoQ0JzdHJTaXplVHlwZSkpOw0KKyAgaWYgKCFwKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgICooQ0JzdHJTaXplVHlwZSAqKXAgPSAoQ0JzdHJTaXplVHlwZSlsZW47DQorICBCU1RSIGJzdHIgPSAoQlNUUikoKENCc3RyU2l6ZVR5cGUgKilwICsgMSk7DQorICBpZiAocykNCisgICAgbWVtY3B5KGJzdHIsIHMsIGxlbik7DQorICBmb3IgKDsgbGVuIDwgc2l6ZTsgbGVuKyspDQorICAgICgoQnl0ZSAqKWJzdHIpW2xlbl0gPSAwOw0KKyAgcmV0dXJuIGJzdHI7DQorfQ0KKw0KK0JTVFIgU3lzQWxsb2NTdHJpbmdMZW4oY29uc3QgT0xFQ0hBUiAqcywgVUlOVCBsZW4pDQorew0KKyAgaWYgKGxlbiA+PSAoa19Cc3RyU2l6ZV9NYXggLSBzaXplb2YoT0xFQ0hBUikgLSBzaXplb2YoQ0JzdHJTaXplVHlwZSkpIC8gc2l6ZW9mKE9MRUNIQVIpKQ0KKyAgICByZXR1cm4gTlVMTDsNCisNCisgIFVJTlQgc2l6ZSA9IGxlbiAqIHNpemVvZihPTEVDSEFSKTsNCisgIHZvaWQgKnAgPSBBbGxvY2F0ZUZvckJTVFIoc2l6ZSArIHNpemVvZihDQnN0clNpemVUeXBlKSArIHNpemVvZihPTEVDSEFSKSk7DQorICBpZiAoIXApDQorICAgIHJldHVybiBOVUxMOw0KKyAgKihDQnN0clNpemVUeXBlICopcCA9IChDQnN0clNpemVUeXBlKXNpemU7DQorICBCU1RSIGJzdHIgPSAoQlNUUikoKENCc3RyU2l6ZVR5cGUgKilwICsgMSk7DQorICBpZiAocykNCisgICAgbWVtY3B5KGJzdHIsIHMsIHNpemUpOw0KKyAgYnN0cltsZW5dID0gMDsNCisgIHJldHVybiBic3RyOw0KK30NCisNCitCU1RSIFN5c0FsbG9jU3RyaW5nKGNvbnN0IE9MRUNIQVIgKnMpDQorew0KKyAgaWYgKCFzKQ0KKyAgICByZXR1cm4gMDsNCisgIGNvbnN0IE9MRUNIQVIgKnMyID0gczsNCisgIHdoaWxlICgqczIgIT0gMCkNCisgICAgczIrKzsNCisgIHJldHVybiBTeXNBbGxvY1N0cmluZ0xlbihzLCAoVUlOVCkoczIgLSBzKSk7DQorfQ0KKw0KK3ZvaWQgU3lzRnJlZVN0cmluZyhCU1RSIGJzdHIpDQorew0KKyAgaWYgKGJzdHIpDQorICAgIEZyZWVGb3JCU1RSKChDQnN0clNpemVUeXBlICopYnN0ciAtIDEpOw0KK30NCisNCitVSU5UIFN5c1N0cmluZ0J5dGVMZW4oQlNUUiBic3RyKQ0KK3sNCisgIGlmICghYnN0cikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gKigoQ0JzdHJTaXplVHlwZSAqKWJzdHIgLSAxKTsNCit9DQorDQorVUlOVCBTeXNTdHJpbmdMZW4oQlNUUiBic3RyKQ0KK3sNCisgIGlmICghYnN0cikNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gKigoQ0JzdHJTaXplVHlwZSAqKWJzdHIgLSAxKSAvIHNpemVvZihPTEVDSEFSKTsNCit9DQorDQorDQorSFJFU1VMVCBWYXJpYW50Q2xlYXIoVkFSSUFOVEFSRyAqcHJvcCkNCit7DQorICBpZiAocHJvcC0+dnQgPT0gVlRfQlNUUikNCisgICAgU3lzRnJlZVN0cmluZyhwcm9wLT5ic3RyVmFsKTsNCisgIHByb3AtPnZ0ID0gVlRfRU1QVFk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBWYXJpYW50Q29weShWQVJJQU5UQVJHICpkZXN0LCBjb25zdCBWQVJJQU5UQVJHICpzcmMpDQorew0KKyAgSFJFU1VMVCByZXMgPSA6OlZhcmlhbnRDbGVhcihkZXN0KTsNCisgIGlmIChyZXMgIT0gU19PSykNCisgICAgcmV0dXJuIHJlczsNCisgIGlmIChzcmMtPnZ0ID09IFZUX0JTVFIpDQorICB7DQorICAgIGRlc3QtPmJzdHJWYWwgPSBTeXNBbGxvY1N0cmluZ0J5dGVMZW4oKExQQ1NUUilzcmMtPmJzdHJWYWwsDQorICAgICAgICBTeXNTdHJpbmdCeXRlTGVuKHNyYy0+YnN0clZhbCkpOw0KKyAgICBpZiAoIWRlc3QtPmJzdHJWYWwpDQorICAgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7DQorICAgIGRlc3QtPnZ0ID0gVlRfQlNUUjsNCisgIH0NCisgIGVsc2UNCisgICAgKmRlc3QgPSAqc3JjOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0xPTkcgQ29tcGFyZUZpbGVUaW1lKGNvbnN0IEZJTEVUSU1FKiBmdDEsIGNvbnN0IEZJTEVUSU1FKiBmdDIpDQorew0KKyAgaWYgKGZ0MS0+ZHdIaWdoRGF0ZVRpbWUgPCBmdDItPmR3SGlnaERhdGVUaW1lKSByZXR1cm4gLTE7DQorICBpZiAoZnQxLT5kd0hpZ2hEYXRlVGltZSA+IGZ0Mi0+ZHdIaWdoRGF0ZVRpbWUpIHJldHVybiAxOw0KKyAgaWYgKGZ0MS0+ZHdMb3dEYXRlVGltZSA8IGZ0Mi0+ZHdMb3dEYXRlVGltZSkgcmV0dXJuIC0xOw0KKyAgaWYgKGZ0MS0+ZHdMb3dEYXRlVGltZSA+IGZ0Mi0+ZHdMb3dEYXRlVGltZSkgcmV0dXJuIDE7DQorICByZXR1cm4gMDsNCit9DQorDQorRFdPUkQgR2V0TGFzdEVycm9yKCkNCit7DQorICByZXR1cm4gMDsNCit9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvQ29tbW9uL015V2luZG93cy5oIGIvbHptYS9DUFAvQ29tbW9uL015V2luZG93cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMTQ1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vTXlXaW5kb3dzLmgKQEAgLTAsMCArMSwyMTYgQEAKKy8vIE15V2luZG93cy5oDQorDQorI2lmbmRlZiBfX01ZX1dJTkRPV1NfSA0KKyNkZWZpbmUgX19NWV9XSU5ET1dTX0gNCisNCisjaWZkZWYgX1dJTjMyDQorDQorI2luY2x1ZGUgPHdpbmRvd3MuaD4NCisNCisjaWZkZWYgVU5ERVJfQ0UNCisgICN1bmRlZiBWQVJJQU5UX1RSVUUNCisgICNkZWZpbmUgVkFSSUFOVF9UUlVFICgoVkFSSUFOVF9CT09MKS0xKQ0KKyNlbmRpZg0KKw0KKyNlbHNlDQorDQorI2luY2x1ZGUgPHN0ZGRlZi5oPiAvLyBmb3Igd2NoYXJfdA0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisNCisjaW5jbHVkZSAiTXlHdWlkRGVmLmgiDQorDQorI2RlZmluZSBXSU5BUEkNCisNCit0eXBlZGVmIGNoYXIgQ0hBUjsNCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUNIQVI7DQorDQorI3VuZGVmIEJZVEUNCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQllURTsNCisNCit0eXBlZGVmIHNob3J0IFNIT1JUOw0KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgVVNIT1JUOw0KKw0KKyN1bmRlZiBXT1JEDQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBXT1JEOw0KK3R5cGVkZWYgc2hvcnQgVkFSSUFOVF9CT09MOw0KKw0KK3R5cGVkZWYgaW50IElOVDsNCit0eXBlZGVmIEludDMyIElOVDMyOw0KK3R5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQ7DQordHlwZWRlZiBVSW50MzIgVUlOVDMyOw0KK3R5cGVkZWYgSU5UMzIgTE9ORzsgICAvLyBMT05HLCBVTE9ORyBhbmQgRFdPUkQgbXVzdCBiZSAzMi1iaXQNCit0eXBlZGVmIFVJTlQzMiBVTE9ORzsNCisNCisjdW5kZWYgRFdPUkQNCit0eXBlZGVmIFVJTlQzMiBEV09SRDsNCisNCit0eXBlZGVmIEludDY0IExPTkdMT05HOw0KK3R5cGVkZWYgVUludDY0IFVMT05HTE9ORzsNCisNCit0eXBlZGVmIHN0cnVjdCBfTEFSR0VfSU5URUdFUiB7IExPTkdMT05HIFF1YWRQYXJ0OyB9IExBUkdFX0lOVEVHRVI7DQordHlwZWRlZiBzdHJ1Y3QgX1VMQVJHRV9JTlRFR0VSIHsgVUxPTkdMT05HIFF1YWRQYXJ0OyB9IFVMQVJHRV9JTlRFR0VSOw0KKw0KK3R5cGVkZWYgY29uc3QgQ0hBUiAqTFBDU1RSOw0KK3R5cGVkZWYgQ0hBUiBUQ0hBUjsNCit0eXBlZGVmIGNvbnN0IFRDSEFSICpMUENUU1RSOw0KK3R5cGVkZWYgd2NoYXJfdCBXQ0hBUjsNCit0eXBlZGVmIFdDSEFSIE9MRUNIQVI7DQordHlwZWRlZiBjb25zdCBXQ0hBUiAqTFBDV1NUUjsNCit0eXBlZGVmIE9MRUNIQVIgKkJTVFI7DQordHlwZWRlZiBjb25zdCBPTEVDSEFSICpMUENPTEVTVFI7DQordHlwZWRlZiBPTEVDSEFSICpMUE9MRVNUUjsNCisNCit0eXBlZGVmIHN0cnVjdCBfRklMRVRJTUUNCit7DQorICBEV09SRCBkd0xvd0RhdGVUaW1lOw0KKyAgRFdPUkQgZHdIaWdoRGF0ZVRpbWU7DQorfSBGSUxFVElNRTsNCisNCisjZGVmaW5lIEhSRVNVTFQgTE9ORw0KKyNkZWZpbmUgRkFJTEVEKFN0YXR1cykgKChIUkVTVUxUKShTdGF0dXMpPDApDQordHlwZWRlZiBVTE9ORyBQUk9QSUQ7DQordHlwZWRlZiBMT05HIFNDT0RFOw0KKw0KKyNkZWZpbmUgU19PSyAgICAoKEhSRVNVTFQpMHgwMDAwMDAwMEwpDQorI2RlZmluZSBTX0ZBTFNFICgoSFJFU1VMVCkweDAwMDAwMDAxTCkNCisjZGVmaW5lIEVfTk9USU1QTCAoKEhSRVNVTFQpMHg4MDAwNDAwMUwpDQorI2RlZmluZSBFX05PSU5URVJGQUNFICgoSFJFU1VMVCkweDgwMDA0MDAyTCkNCisjZGVmaW5lIEVfQUJPUlQgKChIUkVTVUxUKTB4ODAwMDQwMDRMKQ0KKyNkZWZpbmUgRV9GQUlMICgoSFJFU1VMVCkweDgwMDA0MDA1TCkNCisjZGVmaW5lIFNUR19FX0lOVkFMSURGVU5DVElPTiAoKEhSRVNVTFQpMHg4MDAzMDAwMUwpDQorI2RlZmluZSBFX09VVE9GTUVNT1JZICgoSFJFU1VMVCkweDgwMDcwMDBFTCkNCisjZGVmaW5lIEVfSU5WQUxJREFSRyAoKEhSRVNVTFQpMHg4MDA3MDA1N0wpDQorDQorI2lmZGVmIF9NU0NfVkVSDQorI2RlZmluZSBTVERNRVRIT0RDQUxMVFlQRSBfX3N0ZGNhbGwNCisjZWxzZQ0KKyNkZWZpbmUgU1RETUVUSE9EQ0FMTFRZUEUNCisjZW5kaWYNCisNCisjZGVmaW5lIFNURE1FVEhPRF8odCwgZikgdmlydHVhbCB0IFNURE1FVEhPRENBTExUWVBFIGYNCisjZGVmaW5lIFNURE1FVEhPRChmKSBTVERNRVRIT0RfKEhSRVNVTFQsIGYpDQorI2RlZmluZSBTVERNRVRIT0RJTVBfKHR5cGUpIHR5cGUgU1RETUVUSE9EQ0FMTFRZUEUNCisjZGVmaW5lIFNURE1FVEhPRElNUCBTVERNRVRIT0RJTVBfKEhSRVNVTFQpDQorDQorI2RlZmluZSBQVVJFID0gMA0KKw0KKyNkZWZpbmUgTUlETF9JTlRFUkZBQ0UoeCkgc3RydWN0DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorDQorREVGSU5FX0dVSUQoSUlEX0lVbmtub3duLA0KKzB4MDAwMDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ2KTsNCitzdHJ1Y3QgSVVua25vd24NCit7DQorICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChSRUZJSUQgaWlkLCB2b2lkICoqb3V0T2JqZWN0KSBQVVJFOw0KKyAgU1RETUVUSE9EXyhVTE9ORywgQWRkUmVmKSgpIFBVUkU7DQorICBTVERNRVRIT0RfKFVMT05HLCBSZWxlYXNlKSgpIFBVUkU7DQorICAjaWZuZGVmIF9XSU4zMg0KKyAgdmlydHVhbCB+SVVua25vd24oKSB7fQ0KKyAgI2VuZGlmDQorfTsNCisNCit0eXBlZGVmIElVbmtub3duICpMUFVOS05PV047DQorDQorI2VuZGlmDQorDQorI2RlZmluZSBWQVJJQU5UX1RSVUUgKChWQVJJQU5UX0JPT0wpLTEpDQorI2RlZmluZSBWQVJJQU5UX0ZBTFNFICgoVkFSSUFOVF9CT09MKTApDQorDQorZW51bSBWQVJFTlVNDQorew0KKyAgVlRfRU1QVFkgPSAwLA0KKyAgVlRfTlVMTCA9IDEsDQorICBWVF9JMiA9IDIsDQorICBWVF9JNCA9IDMsDQorICBWVF9SNCA9IDQsDQorICBWVF9SOCA9IDUsDQorICBWVF9DWSA9IDYsDQorICBWVF9EQVRFID0gNywNCisgIFZUX0JTVFIgPSA4LA0KKyAgVlRfRElTUEFUQ0ggPSA5LA0KKyAgVlRfRVJST1IgPSAxMCwNCisgIFZUX0JPT0wgPSAxMSwNCisgIFZUX1ZBUklBTlQgPSAxMiwNCisgIFZUX1VOS05PV04gPSAxMywNCisgIFZUX0RFQ0lNQUwgPSAxNCwNCisgIFZUX0kxID0gMTYsDQorICBWVF9VSTEgPSAxNywNCisgIFZUX1VJMiA9IDE4LA0KKyAgVlRfVUk0ID0gMTksDQorICBWVF9JOCA9IDIwLA0KKyAgVlRfVUk4ID0gMjEsDQorICBWVF9JTlQgPSAyMiwNCisgIFZUX1VJTlQgPSAyMywNCisgIFZUX1ZPSUQgPSAyNCwNCisgIFZUX0hSRVNVTFQgPSAyNSwNCisgIFZUX0ZJTEVUSU1FID0gNjQNCit9Ow0KKw0KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgVkFSVFlQRTsNCit0eXBlZGVmIFdPUkQgUFJPUFZBUl9QQUQxOw0KK3R5cGVkZWYgV09SRCBQUk9QVkFSX1BBRDI7DQordHlwZWRlZiBXT1JEIFBST1BWQVJfUEFEMzsNCisNCit0eXBlZGVmIHN0cnVjdCB0YWdQUk9QVkFSSUFOVA0KK3sNCisgIFZBUlRZUEUgdnQ7DQorICBQUk9QVkFSX1BBRDEgd1Jlc2VydmVkMTsNCisgIFBST1BWQVJfUEFEMiB3UmVzZXJ2ZWQyOw0KKyAgUFJPUFZBUl9QQUQzIHdSZXNlcnZlZDM7DQorICB1bmlvbg0KKyAgew0KKyAgICBDSEFSIGNWYWw7DQorICAgIFVDSEFSIGJWYWw7DQorICAgIFNIT1JUIGlWYWw7DQorICAgIFVTSE9SVCB1aVZhbDsNCisgICAgTE9ORyBsVmFsOw0KKyAgICBVTE9ORyB1bFZhbDsNCisgICAgSU5UIGludFZhbDsNCisgICAgVUlOVCB1aW50VmFsOw0KKyAgICBMQVJHRV9JTlRFR0VSIGhWYWw7DQorICAgIFVMQVJHRV9JTlRFR0VSIHVoVmFsOw0KKyAgICBWQVJJQU5UX0JPT0wgYm9vbFZhbDsNCisgICAgU0NPREUgc2NvZGU7DQorICAgIEZJTEVUSU1FIGZpbGV0aW1lOw0KKyAgICBCU1RSIGJzdHJWYWw7DQorICB9Ow0KK30gUFJPUFZBUklBTlQ7DQorDQordHlwZWRlZiBQUk9QVkFSSUFOVCB0YWdWQVJJQU5UOw0KK3R5cGVkZWYgdGFnVkFSSUFOVCBWQVJJQU5UOw0KK3R5cGVkZWYgVkFSSUFOVCBWQVJJQU5UQVJHOw0KKw0KK01ZX0VYVEVSTl9DIEhSRVNVTFQgVmFyaWFudENsZWFyKFZBUklBTlRBUkcgKnByb3ApOw0KK01ZX0VYVEVSTl9DIEhSRVNVTFQgVmFyaWFudENvcHkoVkFSSUFOVEFSRyAqZGVzdCwgY29uc3QgVkFSSUFOVEFSRyAqc3JjKTsNCisNCit0eXBlZGVmIHN0cnVjdCB0YWdTVEFUUFJPUFNURw0KK3sNCisgIExQT0xFU1RSIGxwd3N0ck5hbWU7DQorICBQUk9QSUQgcHJvcGlkOw0KKyAgVkFSVFlQRSB2dDsNCit9IFNUQVRQUk9QU1RHOw0KKw0KK01ZX0VYVEVSTl9DIEJTVFIgU3lzQWxsb2NTdHJpbmdCeXRlTGVuKExQQ1NUUiBwc3osIFVJTlQgbGVuKTsNCitNWV9FWFRFUk5fQyBCU1RSIFN5c0FsbG9jU3RyaW5nTGVuKGNvbnN0IE9MRUNIQVIgKnN6LCBVSU5UIGxlbik7DQorTVlfRVhURVJOX0MgQlNUUiBTeXNBbGxvY1N0cmluZyhjb25zdCBPTEVDSEFSICpzeik7DQorTVlfRVhURVJOX0Mgdm9pZCBTeXNGcmVlU3RyaW5nKEJTVFIgYnN0cik7DQorTVlfRVhURVJOX0MgVUlOVCBTeXNTdHJpbmdCeXRlTGVuKEJTVFIgYnN0cik7DQorTVlfRVhURVJOX0MgVUlOVCBTeXNTdHJpbmdMZW4oQlNUUiBic3RyKTsNCisNCitNWV9FWFRFUk5fQyBEV09SRCBHZXRMYXN0RXJyb3IoKTsNCitNWV9FWFRFUk5fQyBMT05HIENvbXBhcmVGaWxlVGltZShjb25zdCBGSUxFVElNRSogZnQxLCBjb25zdCBGSUxFVElNRSogZnQyKTsNCisNCisjZGVmaW5lIENQX0FDUCAgICAwDQorI2RlZmluZSBDUF9PRU1DUCAgMQ0KKyNkZWZpbmUgQ1BfVVRGOCAgIDY1MDAxDQorDQordHlwZWRlZiBlbnVtIHRhZ1NUUkVBTV9TRUVLDQorew0KKyAgU1RSRUFNX1NFRUtfU0VUID0gMCwNCisgIFNUUkVBTV9TRUVLX0NVUiA9IDEsDQorICBTVFJFQU1fU0VFS19FTkQgPSAyDQorfSBTVFJFQU1fU0VFSzsNCisNCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vTmV3SGFuZGxlci5jcHAgYi9sem1hL0NQUC9Db21tb24vTmV3SGFuZGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwNDg4OQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9OZXdIYW5kbGVyLmNwcApAQCAtMCwwICsxLDE2MiBAQAorLy8gTmV3SGFuZGxlci5jcHANCisgDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisNCisjaW5jbHVkZSAiTmV3SGFuZGxlci5oIg0KKw0KKy8vICNkZWZpbmUgREVCVUdfTUVNT1JZX0xFQUsNCisNCisjaWZuZGVmIERFQlVHX01FTU9SWV9MRUFLDQorDQorI2lmZGVmIF9XSU4zMg0KKw0KKy8qDQordm9pZCAqIG15X25ldyhzaXplX3Qgc2l6ZSkNCit7DQorICAvLyB2b2lkICpwID0gOjpIZWFwQWxsb2MoOjpHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplKTsNCisgIHZvaWQgKnAgPSA6Om1hbGxvYyhzaXplKTsNCisgIGlmIChwID09IDApDQorICAgIHRocm93IENOZXdFeGNlcHRpb24oKTsNCisgIHJldHVybiBwOw0KK30NCisNCit2b2lkIG15X2RlbGV0ZSh2b2lkICpwKSB0aHJvdygpDQorew0KKyAgLy8gaWYgKHAgPT0gMCkgcmV0dXJuOyA6OkhlYXBGcmVlKDo6R2V0UHJvY2Vzc0hlYXAoKSwgMCwgcCk7DQorICA6OmZyZWUocCk7DQorfQ0KKw0KK3ZvaWQgKiBteV9SZWFsbG9jKHZvaWQgKnAsIHNpemVfdCBuZXdTaXplLCBzaXplX3Qgb2xkU2l6ZSkNCit7DQorICB2b2lkICpuZXdCdWYgPSBteV9uZXcobmV3U2l6ZSk7DQorICBtZW1jcHkobmV3QnVmLCBwLCBvbGRTaXplKTsNCisgIG15X2RlbGV0ZShwKTsNCisgIHJldHVybiBuZXdCdWY7DQorfQ0KKyovDQorDQordm9pZCAqDQorI2lmZGVmIF9NU0NfVkVSDQorX19jZGVjbA0KKyNlbmRpZg0KK29wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSkNCit7DQorICAvLyB2b2lkICpwID0gOjpIZWFwQWxsb2MoOjpHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplKTsNCisgIHZvaWQgKnAgPSA6Om1hbGxvYyhzaXplKTsNCisgIGlmIChwID09IDApDQorICAgIHRocm93IENOZXdFeGNlcHRpb24oKTsNCisgIHJldHVybiBwOw0KK30NCisNCit2b2lkDQorI2lmZGVmIF9NU0NfVkVSDQorX19jZGVjbA0KKyNlbmRpZg0KK29wZXJhdG9yIGRlbGV0ZSh2b2lkICpwKSB0aHJvdygpDQorew0KKyAgLy8gaWYgKHAgPT0gMCkgcmV0dXJuOyA6OkhlYXBGcmVlKDo6R2V0UHJvY2Vzc0hlYXAoKSwgMCwgcCk7DQorICA6OmZyZWUocCk7DQorfQ0KKw0KKy8qDQordm9pZCAqDQorI2lmZGVmIF9NU0NfVkVSDQorX19jZGVjbA0KKyNlbmRpZg0KK29wZXJhdG9yIG5ld1tdKHNpemVfdCBzaXplKQ0KK3sNCisgIC8vIHZvaWQgKnAgPSA6OkhlYXBBbGxvYyg6OkdldFByb2Nlc3NIZWFwKCksIDAsIHNpemUpOw0KKyAgdm9pZCAqcCA9IDo6bWFsbG9jKHNpemUpOw0KKyAgaWYgKHAgPT0gMCkNCisgICAgdGhyb3cgQ05ld0V4Y2VwdGlvbigpOw0KKyAgcmV0dXJuIHA7DQorfQ0KKw0KK3ZvaWQNCisjaWZkZWYgX01TQ19WRVINCitfX2NkZWNsDQorI2VuZGlmDQorb3BlcmF0b3IgZGVsZXRlW10odm9pZCAqcCkgdGhyb3coKQ0KK3sNCisgIC8vIGlmIChwID09IDApIHJldHVybjsgOjpIZWFwRnJlZSg6OkdldFByb2Nlc3NIZWFwKCksIDAsIHApOw0KKyAgOjpmcmVlKHApOw0KK30NCisqLw0KKw0KKyNlbmRpZg0KKw0KKyNlbHNlDQorDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorDQorLy8gI3ByYWdtYSBpbml0X3NlZyhsaWIpDQorY29uc3QgaW50IGtEZWJ1Z1NpemUgPSAxMDAwMDAwOw0KK3N0YXRpYyB2b2lkICphW2tEZWJ1Z1NpemVdOw0KK3N0YXRpYyBpbnQgaW5kZXggPSAwOw0KKw0KK3N0YXRpYyBpbnQgbnVtQWxsb2NzID0gMDsNCit2b2lkICogX19jZGVjbCBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpDQorew0KKyAgbnVtQWxsb2NzKys7DQorICB2b2lkICpwID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemUpOw0KKyAgaWYgKGluZGV4IDwga0RlYnVnU2l6ZSkNCisgIHsNCisgICAgYVtpbmRleF0gPSBwOw0KKyAgICBpbmRleCsrOw0KKyAgfQ0KKyAgaWYgKHAgPT0gMCkNCisgICAgdGhyb3cgQ05ld0V4Y2VwdGlvbigpOw0KKyAgcHJpbnRmKCJBbGxvYyAlNmQsIHNpemUgPSAlOGRcbiIsIG51bUFsbG9jcywgc2l6ZSk7DQorICByZXR1cm4gcDsNCit9DQorDQorY2xhc3MgQ0MNCit7DQorcHVibGljOg0KKyAgQ0MoKQ0KKyAgew0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEZWJ1Z1NpemU7IGkrKykNCisgICAgICBhW2ldID0gMDsNCisgIH0NCisgIH5DQygpDQorICB7DQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0RlYnVnU2l6ZTsgaSsrKQ0KKyAgICAgIGlmIChhW2ldICE9IDApDQorICAgICAgICByZXR1cm47DQorICB9DQorfSBnX0NDOw0KKw0KKw0KK3ZvaWQgX19jZGVjbCBvcGVyYXRvciBkZWxldGUodm9pZCAqcCkNCit7DQorICBpZiAocCA9PSAwKQ0KKyAgICByZXR1cm47DQorICAvKg0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKQ0KKyAgICBpZiAoYVtpXSA9PSBwKQ0KKyAgICAgIGFbaV0gPSAwOw0KKyAgKi8NCisgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHApOw0KKyAgbnVtQWxsb2NzLS07DQorICBwcmludGYoIkZyZWUgJWRcbiIsIG51bUFsbG9jcyk7DQorfQ0KKw0KKyNlbmRpZg0KKw0KKy8qDQoraW50IE1lbUVycm9yVkMoc2l6ZV90KQ0KK3sNCisgIHRocm93IENOZXdFeGNlcHRpb24oKTsNCisgIC8vIHJldHVybiAxOw0KK30NCitDTmV3SGFuZGxlclNldHRlcjo6Q05ld0hhbmRsZXJTZXR0ZXIoKQ0KK3sNCisgIC8vIE1lbUVycm9yT2xkVkNGdW5jdGlvbiA9IF9zZXRfbmV3X2hhbmRsZXIoTWVtRXJyb3JWQyk7DQorfQ0KK0NOZXdIYW5kbGVyU2V0dGVyOjp+Q05ld0hhbmRsZXJTZXR0ZXIoKQ0KK3sNCisgIC8vIF9zZXRfbmV3X2hhbmRsZXIoTWVtRXJyb3JPbGRWQ0Z1bmN0aW9uKTsNCit9DQorKi8NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vTmV3SGFuZGxlci5oIGIvbHptYS9DUFAvQ29tbW9uL05ld0hhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWY0YTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL05ld0hhbmRsZXIuaApAQCAtMCwwICsxLDY4IEBACisvLyBDb21tb24vTmV3SGFuZGxlci5oDQorDQorI2lmbmRlZiBfX0NPTU1PTl9ORVdfSEFORExFUl9IDQorI2RlZmluZSBfX0NPTU1PTl9ORVdfSEFORExFUl9IDQorDQorLyoNCitUaGlzIGZpbGUgbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgYW55IGNvZGUgdGhhdCB1c2VzIG9wZXJhdG9ycyAiZGVsZXRlIiBvciAibmV3Ii4NCitBbHNvIHlvdSBtdXN0IGNvbXBpbGUgYW5kIGxpbmsgIk5ld0hhbmRsZXIuY3BwIiwgaWYgeW91IHVzZSBNU1ZDIDYuMC4NCitUaGUgb3BlcmF0b3IgIm5ldyIgaW4gTVNWQyA2LjAgZG9lc24ndCB0aHJvdyBleGNlcHRpb24gImJhZF9hbGxvYyIuDQorU28gd2UgZGVmaW5lIGFub3RoZXIgdmVyc2lvbiBvZiBvcGVyYXRvciAibmV3IiB0aGF0IHRocm93cyAiQ05ld0V4Y2VwdGlvbiIgb24gZmFpbHVyZS4NCisNCitJZiB5b3UgdXNlIGNvbXBpbGVyIHRoYXQgdGhyb3dzIGV4Y2VwdGlvbiBpbiAibmV3IiBvcGVyYXRvciAoR0NDIG9yIG5ldyB2ZXJzaW9uIG9mIE1TVkMpLA0KK3lvdSBjYW4gY29tcGlsZSB3aXRob3V0ICJOZXdIYW5kbGVyLmNwcCIuIFNvIHN0YW5kYXJkIGV4Y2VwdGlvbiAiYmFkX2FsbG9jIiB3aWxsIGJlIHVzZWQuDQorDQorSXQncyBzdGlsbCBhbGxvd2VkIHRvIHVzZSByZWRlZmluZWQgdmVyc2lvbiBvZiBvcGVyYXRvciAibmV3IiBmcm9tICJOZXdIYW5kbGVyLmNwcCINCit3aXRoIGFueSBjb21waWxlci4gNy1aaXAncyBjb2RlIGNhbiB3b3JrIHdpdGggImJhZF9hbGxvYyIgYW5kICJDTmV3RXhjZXB0aW9uIiBleGNlcHRpb25zLg0KK0J1dCBpZiB5b3UgdXNlIHNvbWUgYWRkaXRpb25hbCBjb2RlIChvdXRzaWRlIG9mIDctWmlwJ3MgY29kZSksIHlvdSBtdXN0IGNoZWNrDQordGhhdCByZWRlZmluZWQgdmVyc2lvbiBvZiBvcGVyYXRvciAibmV3IiAodGhhdCB0aHJvd3MgQ05ld0V4Y2VwdGlvbikgaXMgbm90DQorcHJvYmxlbSBmb3IgeW91ciBjb2RlLg0KKw0KK0Fsc28gd2UgZGVjbGFyZSBkZWxldGUodm9pZCAqcCkgdGhyb3coKSB0aGF0IGNyZWF0ZXMgc21hbGxlciBjb2RlLg0KKyovDQorDQorDQorY2xhc3MgQ05ld0V4Y2VwdGlvbiB7fTsNCisNCisjaWZkZWYgV0lOMzINCisvLyBXZSBjYW4gY29tcGlsZSBteV9uZXcgYW5kIG15X2RlbGV0ZSB3aXRoIF9mYXN0Y2FsbA0KKy8qDQordm9pZCAqIG15X25ldyhzaXplX3Qgc2l6ZSk7DQordm9pZCBteV9kZWxldGUodm9pZCAqcCkgdGhyb3coKTsNCisvLyB2b2lkICogbXlfUmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbmV3U2l6ZSwgc2l6ZV90IG9sZFNpemUpOw0KKyovDQorI2VuZGlmDQorDQorI2lmZGVmIF9XSU4zMg0KKw0KK3ZvaWQgKg0KKyNpZmRlZiBfTVNDX1ZFUg0KK19fY2RlY2wNCisjZW5kaWYNCitvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpOw0KKw0KK3ZvaWQNCisjaWZkZWYgX01TQ19WRVINCitfX2NkZWNsDQorI2VuZGlmDQorb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnApIHRocm93KCk7DQorDQorI2VuZGlmDQorDQorLyoNCisjaWZkZWYgX1dJTjMyDQordm9pZCAqDQorI2lmZGVmIF9NU0NfVkVSDQorX19jZGVjbA0KKyNlbmRpZg0KK29wZXJhdG9yIG5ld1tdKHNpemVfdCBzaXplKTsNCisNCit2b2lkDQorI2lmZGVmIF9NU0NfVkVSDQorX19jZGVjbA0KKyNlbmRpZg0KK29wZXJhdG9yIGRlbGV0ZVtdKHZvaWQgKnApIHRocm93KCk7DQorI2VuZGlmDQorKi8NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vU2hhMjU2UmVnLmNwcCBiL2x6bWEvQ1BQL0NvbW1vbi9TaGEyNTZSZWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYWI2NWMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vU2hhMjU2UmVnLmNwcApAQCAtMCwwICsxLDUyIEBACisvLyBTaGEyNTZSZWcuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi8uLi9DL1NoYTI1Ni5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlDb20uaCINCisNCisjaW5jbHVkZSAiLi4vN3ppcC9JQ29kZXIuaCINCisjaW5jbHVkZSAiLi4vN3ppcC9Db21tb24vUmVnaXN0ZXJDb2RlYy5oIg0KKw0KK2NsYXNzIENTaGEyNTZIYXNoZXI6DQorICBwdWJsaWMgSUhhc2hlciwNCisgIHB1YmxpYyBDTXlVbmtub3duSW1wDQorew0KKyAgQ1NoYTI1NiBfc2hhOw0KK3B1YmxpYzoNCisgIENTaGEyNTZIYXNoZXIoKSB7IEluaXQoKTsgfTsNCisNCisgIE1ZX1VOS05PV05fSU1QDQorDQorICBTVERNRVRIT0RfKHZvaWQsIEluaXQpKCk7DQorICBTVERNRVRIT0RfKHZvaWQsIFVwZGF0ZSkoY29uc3Qgdm9pZCAqZGF0YSwgVUludDMyIHNpemUpOw0KKyAgU1RETUVUSE9EXyh2b2lkLCBGaW5hbCkoQnl0ZSAqZGlnZXN0KTsNCisgIFNURE1FVEhPRF8oVUludDMyLCBHZXREaWdlc3RTaXplKSgpOw0KK307DQorDQorU1RETUVUSE9ESU1QXyh2b2lkKSBDU2hhMjU2SGFzaGVyOjpJbml0KCkNCit7DQorICBTaGEyNTZfSW5pdCgmX3NoYSk7DQorfQ0KKw0KK1NURE1FVEhPRElNUF8odm9pZCkgQ1NoYTI1Nkhhc2hlcjo6VXBkYXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplKQ0KK3sNCisgIFNoYTI1Nl9VcGRhdGUoJl9zaGEsIChjb25zdCBCeXRlICopZGF0YSwgc2l6ZSk7DQorfQ0KKw0KK1NURE1FVEhPRElNUF8odm9pZCkgQ1NoYTI1Nkhhc2hlcjo6RmluYWwoQnl0ZSAqZGlnZXN0KQ0KK3sNCisgIFNoYTI1Nl9GaW5hbCgmX3NoYSwgZGlnZXN0KTsNCit9DQorDQorU1RETUVUSE9ESU1QXyhVSW50MzIpIENTaGEyNTZIYXNoZXI6OkdldERpZ2VzdFNpemUoKQ0KK3sNCisgIHJldHVybiBTSEEyNTZfRElHRVNUX1NJWkU7DQorfQ0KKw0KK3N0YXRpYyBJSGFzaGVyICpDcmVhdGVIYXNoZXIoKSB7IHJldHVybiBuZXcgQ1NoYTI1Nkhhc2hlcjsgfQ0KKw0KK3N0YXRpYyBDSGFzaGVySW5mbyBnX0hhc2hlckluZm8gPSB7IENyZWF0ZUhhc2hlciwgMHhBLCBMIlNIQTI1NiIsIFNIQTI1Nl9ESUdFU1RfU0laRSB9Ow0KKw0KK1JFR0lTVEVSX0hBU0hFUihTaGEyNTYpDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvQ29tbW9uL1N0ZEFmeC5oIGIvbHptYS9DUFAvQ29tbW9uL1N0ZEFmeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMTg5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vU3RkQWZ4LmgKQEAgLTAsMCArMSw4IEBACisvLyBTdGRBZnguaA0KKw0KKyNpZm5kZWYgX19TVERBRlhfSA0KKyNkZWZpbmUgX19TVERBRlhfSA0KKw0KKyNpbmNsdWRlICJDb21tb24uaCINCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vU3RkSW5TdHJlYW0uY3BwIGIvbHptYS9DUFAvQ29tbW9uL1N0ZEluU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzk5YzJjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL1N0ZEluU3RyZWFtLmNwcApAQCAtMCwwICsxLDk0IEBACisvLyBDb21tb24vU3RkSW5TdHJlYW0uY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlIDx0Y2hhci5oPg0KKw0KKyNpbmNsdWRlICJTdGRJblN0cmVhbS5oIg0KKyNpbmNsdWRlICJTdHJpbmdDb252ZXJ0LmgiDQorI2luY2x1ZGUgIlVURkNvbnZlcnQuaCINCisNCitzdGF0aWMgY29uc3QgY2hhciBrTmV3TGluZUNoYXIgPSAnXG4nOw0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICprRU9GTWVzc2FnZSA9ICJVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBzdHJlYW0iOw0KK3N0YXRpYyBjb25zdCBjaGFyICprUmVhZEVycm9yTWVzc2FnZSAgPSJFcnJvciByZWFkaW5nIGlucHV0IHN0cmVhbSI7DQorc3RhdGljIGNvbnN0IGNoYXIgKmtJbGxlZ2FsQ2hhck1lc3NhZ2UgPSAiSWxsZWdhbCBjaGFyYWN0ZXIgaW4gaW5wdXQgc3RyZWFtIjsNCisNCitzdGF0aWMgTFBDVFNUUiBrRmlsZU9wZW5Nb2RlID0gVEVYVCgiciIpOw0KKw0KK2V4dGVybiBpbnQgZ19Db2RlUGFnZTsNCisNCitDU3RkSW5TdHJlYW0gZ19TdGRJbihzdGRpbik7DQorDQorYm9vbCBDU3RkSW5TdHJlYW06Ok9wZW4oTFBDVFNUUiBmaWxlTmFtZSkgdGhyb3coKQ0KK3sNCisgIENsb3NlKCk7DQorICBfc3RyZWFtID0gX3Rmb3BlbihmaWxlTmFtZSwga0ZpbGVPcGVuTW9kZSk7DQorICBfc3RyZWFtSXNPcGVuID0gKF9zdHJlYW0gIT0gMCk7DQorICByZXR1cm4gX3N0cmVhbUlzT3BlbjsNCit9DQorDQorYm9vbCBDU3RkSW5TdHJlYW06OkNsb3NlKCkgdGhyb3coKQ0KK3sNCisgIGlmICghX3N0cmVhbUlzT3BlbikNCisgICAgcmV0dXJuIHRydWU7DQorICBfc3RyZWFtSXNPcGVuID0gKGZjbG9zZShfc3RyZWFtKSAhPSAwKTsNCisgIHJldHVybiAhX3N0cmVhbUlzT3BlbjsNCit9DQorDQorQVN0cmluZyBDU3RkSW5TdHJlYW06OlNjYW5TdHJpbmdVbnRpbE5ld0xpbmUoYm9vbCBhbGxvd0VPRikNCit7DQorICBBU3RyaW5nIHM7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBpbnQgaW50Q2hhciA9IEdldENoYXIoKTsNCisgICAgaWYgKGludENoYXIgPT0gRU9GKQ0KKyAgICB7DQorICAgICAgaWYgKGFsbG93RU9GKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgdGhyb3cga0VPRk1lc3NhZ2U7DQorICAgIH0NCisgICAgY2hhciBjID0gKGNoYXIpaW50Q2hhcjsNCisgICAgaWYgKGMgPT0gMCkNCisgICAgICB0aHJvdyBrSWxsZWdhbENoYXJNZXNzYWdlOw0KKyAgICBpZiAoYyA9PSBrTmV3TGluZUNoYXIpDQorICAgICAgYnJlYWs7DQorICAgIHMgKz0gYzsNCisgIH0NCisgIHJldHVybiBzOw0KK30NCisNCitVU3RyaW5nIENTdGRJblN0cmVhbTo6U2NhblVTdHJpbmdVbnRpbE5ld0xpbmUoKQ0KK3sNCisgIEFTdHJpbmcgcyA9IFNjYW5TdHJpbmdVbnRpbE5ld0xpbmUodHJ1ZSk7DQorICBpbnQgY29kZVBhZ2UgPSBnX0NvZGVQYWdlOw0KKyAgaWYgKGNvZGVQYWdlID09IC0xKQ0KKyAgICBjb2RlUGFnZSA9IENQX09FTUNQOw0KKyAgVVN0cmluZyBkZXN0Ow0KKyAgaWYgKGNvZGVQYWdlID09IENQX1VURjgpDQorICAgIENvbnZlcnRVVEY4VG9Vbmljb2RlKHMsIGRlc3QpOw0KKyAgZWxzZQ0KKyAgICBkZXN0ID0gTXVsdGlCeXRlVG9Vbmljb2RlU3RyaW5nKHMsIChVSU5UKWNvZGVQYWdlKTsNCisgIHJldHVybiBkZXN0Ow0KK30NCisNCit2b2lkIENTdGRJblN0cmVhbTo6UmVhZFRvU3RyaW5nKEFTdHJpbmcgJnJlc3VsdFN0cmluZykNCit7DQorICByZXN1bHRTdHJpbmcuRW1wdHkoKTsNCisgIGludCBjOw0KKyAgd2hpbGUgKChjID0gR2V0Q2hhcigpKSAhPSBFT0YpDQorICAgIHJlc3VsdFN0cmluZyArPSAoY2hhciljOw0KK30NCisNCitib29sIENTdGRJblN0cmVhbTo6RW9mKCkgdGhyb3coKQ0KK3sNCisgIHJldHVybiAoZmVvZihfc3RyZWFtKSAhPSAwKTsNCit9DQorDQoraW50IENTdGRJblN0cmVhbTo6R2V0Q2hhcigpDQorew0KKyAgaW50IGMgPSBmZ2V0Yyhfc3RyZWFtKTsgLy8gZ2V0YygpIGRvZXNuJ3Qgd29yayBpbiBCZU9TPw0KKyAgaWYgKGMgPT0gRU9GICYmICFFb2YoKSkNCisgICAgdGhyb3cga1JlYWRFcnJvck1lc3NhZ2U7DQorICByZXR1cm4gYzsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvQ29tbW9uL1N0ZEluU3RyZWFtLmggYi9sem1hL0NQUC9Db21tb24vU3RkSW5TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDE3ZDBhCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL1N0ZEluU3RyZWFtLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29tbW9uL1N0ZEluU3RyZWFtLmgNCisNCisjaWZuZGVmIF9fQ09NTU9OX1NURF9JTl9TVFJFQU1fSA0KKyNkZWZpbmUgX19DT01NT05fU1REX0lOX1NUUkVBTV9IDQorDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorDQorI2luY2x1ZGUgIk15U3RyaW5nLmgiDQorI2luY2x1ZGUgIk15VHlwZXMuaCINCisNCitjbGFzcyBDU3RkSW5TdHJlYW0NCit7DQorICBGSUxFICpfc3RyZWFtOw0KKyAgYm9vbCBfc3RyZWFtSXNPcGVuOw0KK3B1YmxpYzoNCisgIENTdGRJblN0cmVhbSgpOiBfc3RyZWFtKDApLCBfc3RyZWFtSXNPcGVuKGZhbHNlKSB7fTsNCisgIENTdGRJblN0cmVhbShGSUxFICpzdHJlYW0pOiBfc3RyZWFtKHN0cmVhbSksIF9zdHJlYW1Jc09wZW4oZmFsc2UpIHt9Ow0KKyAgfkNTdGRJblN0cmVhbSgpIHsgQ2xvc2UoKTsgfQ0KKw0KKyAgYm9vbCBPcGVuKExQQ1RTVFIgZmlsZU5hbWUpIHRocm93KCk7DQorICBib29sIENsb3NlKCkgdGhyb3coKTsNCisNCisgIEFTdHJpbmcgU2NhblN0cmluZ1VudGlsTmV3TGluZShib29sIGFsbG93RU9GID0gZmFsc2UpOw0KKyAgdm9pZCBSZWFkVG9TdHJpbmcoQVN0cmluZyAmcmVzdWx0U3RyaW5nKTsNCisgIFVTdHJpbmcgU2NhblVTdHJpbmdVbnRpbE5ld0xpbmUoKTsNCisNCisgIGJvb2wgRW9mKCkgdGhyb3coKTsNCisgIGludCBHZXRDaGFyKCk7DQorfTsNCisNCitleHRlcm4gQ1N0ZEluU3RyZWFtIGdfU3RkSW47DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvQ29tbW9uL1N0ZE91dFN0cmVhbS5jcHAgYi9sem1hL0NQUC9Db21tb24vU3RkT3V0U3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWM4M2JiCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL1N0ZE91dFN0cmVhbS5jcHAKQEAgLTAsMCArMSwxMDYgQEAKKy8vIENvbW1vbi9TdGRPdXRTdHJlYW0uY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlIDx0Y2hhci5oPg0KKw0KKyNpbmNsdWRlICJJbnRUb1N0cmluZy5oIg0KKyNpbmNsdWRlICJTdGRPdXRTdHJlYW0uaCINCisjaW5jbHVkZSAiU3RyaW5nQ29udmVydC5oIg0KKyNpbmNsdWRlICJVVEZDb252ZXJ0LmgiDQorDQorc3RhdGljIGNvbnN0IGNoYXIga05ld0xpbmVDaGFyID0gICdcbic7DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtGaWxlT3Blbk1vZGUgPSAid3QiOw0KKw0KK2V4dGVybiBpbnQgZ19Db2RlUGFnZTsNCisNCitDU3RkT3V0U3RyZWFtIGdfU3RkT3V0KHN0ZG91dCk7DQorQ1N0ZE91dFN0cmVhbSBnX1N0ZEVycihzdGRlcnIpOw0KKw0KK2Jvb2wgQ1N0ZE91dFN0cmVhbTo6T3Blbihjb25zdCBjaGFyICpmaWxlTmFtZSkgdGhyb3coKQ0KK3sNCisgIENsb3NlKCk7DQorICBfc3RyZWFtID0gZm9wZW4oZmlsZU5hbWUsIGtGaWxlT3Blbk1vZGUpOw0KKyAgX3N0cmVhbUlzT3BlbiA9IChfc3RyZWFtICE9IDApOw0KKyAgcmV0dXJuIF9zdHJlYW1Jc09wZW47DQorfQ0KKw0KK2Jvb2wgQ1N0ZE91dFN0cmVhbTo6Q2xvc2UoKSB0aHJvdygpDQorew0KKyAgaWYgKCFfc3RyZWFtSXNPcGVuKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIGlmIChmY2xvc2UoX3N0cmVhbSkgIT0gMCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgX3N0cmVhbSA9IDA7DQorICBfc3RyZWFtSXNPcGVuID0gZmFsc2U7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBDU3RkT3V0U3RyZWFtOjpGbHVzaCgpIHRocm93KCkNCit7DQorICByZXR1cm4gKGZmbHVzaChfc3RyZWFtKSA9PSAwKTsNCit9DQorDQorQ1N0ZE91dFN0cmVhbSAmIGVuZGwoQ1N0ZE91dFN0cmVhbSAmIG91dFN0cmVhbSkgdGhyb3coKQ0KK3sNCisgIHJldHVybiBvdXRTdHJlYW0gPDwga05ld0xpbmVDaGFyOw0KK30NCisNCitDU3RkT3V0U3RyZWFtICYgQ1N0ZE91dFN0cmVhbTo6b3BlcmF0b3I8PChjb25zdCB3Y2hhcl90ICpzKQ0KK3sNCisgIGludCBjb2RlUGFnZSA9IGdfQ29kZVBhZ2U7DQorICBpZiAoY29kZVBhZ2UgPT0gLTEpDQorICAgIGNvZGVQYWdlID0gQ1BfT0VNQ1A7DQorICBBU3RyaW5nIGRlc3Q7DQorICBpZiAoY29kZVBhZ2UgPT0gQ1BfVVRGOCkNCisgICAgQ29udmVydFVuaWNvZGVUb1VURjgocywgZGVzdCk7DQorICBlbHNlDQorICAgIFVuaWNvZGVTdHJpbmdUb011bHRpQnl0ZTIoZGVzdCwgcywgKFVJTlQpY29kZVBhZ2UpOw0KKyAgcmV0dXJuIG9wZXJhdG9yPDwoKGNvbnN0IGNoYXIgKilkZXN0KTsNCit9DQorDQordm9pZCBTdGRPdXRfQ29udmVydF9VU3RyaW5nX3RvX0FTdHJpbmcoY29uc3QgVVN0cmluZyAmcywgQVN0cmluZyAmdGVtcCkNCit7DQorICBpbnQgY29kZVBhZ2UgPSBnX0NvZGVQYWdlOw0KKyAgaWYgKGNvZGVQYWdlID09IC0xKQ0KKyAgICBjb2RlUGFnZSA9IENQX09FTUNQOw0KKyAgaWYgKGNvZGVQYWdlID09IENQX1VURjgpDQorICAgIENvbnZlcnRVbmljb2RlVG9VVEY4KHMsIHRlbXApOw0KKyAgZWxzZQ0KKyAgICBVbmljb2RlU3RyaW5nVG9NdWx0aUJ5dGUyKHRlbXAsIHMsIChVSU5UKWNvZGVQYWdlKTsNCit9DQorDQordm9pZCBDU3RkT3V0U3RyZWFtOjpQcmludFVTdHJpbmcoY29uc3QgVVN0cmluZyAmcywgQVN0cmluZyAmdGVtcCkNCit7DQorICBTdGRPdXRfQ29udmVydF9VU3RyaW5nX3RvX0FTdHJpbmcocywgdGVtcCk7DQorICAqdGhpcyA8PCAoY29uc3QgY2hhciAqKXRlbXA7DQorfQ0KKw0KK0NTdGRPdXRTdHJlYW0gJiBDU3RkT3V0U3RyZWFtOjpvcGVyYXRvcjw8KEludDMyIG51bWJlcikgdGhyb3coKQ0KK3sNCisgIGNoYXIgc1szMl07DQorICBDb252ZXJ0SW50NjRUb1N0cmluZyhudW1iZXIsIHMpOw0KKyAgcmV0dXJuIG9wZXJhdG9yPDwocyk7DQorfQ0KKw0KK0NTdGRPdXRTdHJlYW0gJiBDU3RkT3V0U3RyZWFtOjpvcGVyYXRvcjw8KEludDY0IG51bWJlcikgdGhyb3coKQ0KK3sNCisgIGNoYXIgc1szMl07DQorICBDb252ZXJ0SW50NjRUb1N0cmluZyhudW1iZXIsIHMpOw0KKyAgcmV0dXJuIG9wZXJhdG9yPDwocyk7DQorfQ0KKw0KK0NTdGRPdXRTdHJlYW0gJiBDU3RkT3V0U3RyZWFtOjpvcGVyYXRvcjw8KFVJbnQzMiBudW1iZXIpIHRocm93KCkNCit7DQorICBjaGFyIHNbMTZdOw0KKyAgQ29udmVydFVJbnQzMlRvU3RyaW5nKG51bWJlciwgcyk7DQorICByZXR1cm4gb3BlcmF0b3I8PChzKTsNCit9DQorDQorQ1N0ZE91dFN0cmVhbSAmIENTdGRPdXRTdHJlYW06Om9wZXJhdG9yPDwoVUludDY0IG51bWJlcikgdGhyb3coKQ0KK3sNCisgIGNoYXIgc1szMl07DQorICBDb252ZXJ0VUludDY0VG9TdHJpbmcobnVtYmVyLCBzKTsNCisgIHJldHVybiBvcGVyYXRvcjw8KHMpOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vU3RkT3V0U3RyZWFtLmggYi9sem1hL0NQUC9Db21tb24vU3RkT3V0U3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkZTk1OAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9TdGRPdXRTdHJlYW0uaApAQCAtMCwwICsxLDYyIEBACisvLyBDb21tb24vU3RkT3V0U3RyZWFtLmgNCisNCisjaWZuZGVmIF9fQ09NTU9OX1NURF9PVVRfU1RSRUFNX0gNCisjZGVmaW5lIF9fQ09NTU9OX1NURF9PVVRfU1RSRUFNX0gNCisNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisNCisjaW5jbHVkZSAiTXlTdHJpbmcuaCINCisjaW5jbHVkZSAiTXlUeXBlcy5oIg0KKw0KK2NsYXNzIENTdGRPdXRTdHJlYW0NCit7DQorICBGSUxFICpfc3RyZWFtOw0KKyAgYm9vbCBfc3RyZWFtSXNPcGVuOw0KK3B1YmxpYzoNCisgIENTdGRPdXRTdHJlYW0oKTogX3N0cmVhbSgwKSwgX3N0cmVhbUlzT3BlbihmYWxzZSkge307DQorICBDU3RkT3V0U3RyZWFtKEZJTEUgKnN0cmVhbSk6IF9zdHJlYW0oc3RyZWFtKSwgX3N0cmVhbUlzT3BlbihmYWxzZSkge307DQorICB+Q1N0ZE91dFN0cmVhbSgpIHsgQ2xvc2UoKTsgfQ0KKw0KKyAgLy8gdm9pZCBBdHRhY2hTdGRTdHJlYW0oRklMRSAqc3RyZWFtKSB7IF9zdHJlYW0gID0gc3RyZWFtOyBfc3RyZWFtSXNPcGVuID0gZmFsc2U7IH0NCisgIC8vIGJvb2wgSXNEZWZpbmVkKCkgY29uc3QgeyByZXR1cm4gX3N0cmVhbSAgIT0gTlVMTDsgfQ0KKw0KKyAgb3BlcmF0b3IgRklMRSAqKCkgeyByZXR1cm4gX3N0cmVhbTsgfQ0KKyAgYm9vbCBPcGVuKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSB0aHJvdygpOw0KKyAgYm9vbCBDbG9zZSgpIHRocm93KCk7DQorICBib29sIEZsdXNoKCkgdGhyb3coKTsNCisgIA0KKyAgQ1N0ZE91dFN0cmVhbSAmIG9wZXJhdG9yPDwoQ1N0ZE91dFN0cmVhbSAmICgqIGZ1bmMpKENTdGRPdXRTdHJlYW0gICYpKQ0KKyAgew0KKyAgICAoKmZ1bmMpKCp0aGlzKTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKw0KKyAgQ1N0ZE91dFN0cmVhbSAmIG9wZXJhdG9yPDwoY29uc3QgY2hhciAqcykgdGhyb3coKQ0KKyAgew0KKyAgICBmcHV0cyhzLCBfc3RyZWFtKTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKw0KKyAgQ1N0ZE91dFN0cmVhbSAmIG9wZXJhdG9yPDwoY2hhciBjKSB0aHJvdygpDQorICB7DQorICAgIGZwdXRjKGMsIF9zdHJlYW0pOw0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorDQorICBDU3RkT3V0U3RyZWFtICYgb3BlcmF0b3I8PChJbnQzMiBudW1iZXIpIHRocm93KCk7DQorICBDU3RkT3V0U3RyZWFtICYgb3BlcmF0b3I8PChJbnQ2NCBudW1iZXIpIHRocm93KCk7DQorICBDU3RkT3V0U3RyZWFtICYgb3BlcmF0b3I8PChVSW50MzIgbnVtYmVyKSB0aHJvdygpOw0KKyAgQ1N0ZE91dFN0cmVhbSAmIG9wZXJhdG9yPDwoVUludDY0IG51bWJlcikgdGhyb3coKTsNCisNCisgIENTdGRPdXRTdHJlYW0gJiBvcGVyYXRvcjw8KGNvbnN0IHdjaGFyX3QgKnMpOw0KKyAgdm9pZCBQcmludFVTdHJpbmcoY29uc3QgVVN0cmluZyAmcywgQVN0cmluZyAmdGVtcCk7DQorfTsNCisNCitDU3RkT3V0U3RyZWFtICYgZW5kbChDU3RkT3V0U3RyZWFtICYgb3V0U3RyZWFtKSB0aHJvdygpOw0KKw0KK2V4dGVybiBDU3RkT3V0U3RyZWFtIGdfU3RkT3V0Ow0KK2V4dGVybiBDU3RkT3V0U3RyZWFtIGdfU3RkRXJyOw0KKw0KK3ZvaWQgU3RkT3V0X0NvbnZlcnRfVVN0cmluZ190b19BU3RyaW5nKGNvbnN0IFVTdHJpbmcgJnMsIEFTdHJpbmcgJnRlbXApOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmNwcCBiL2x6bWEvQ1BQL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjViMTZmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL1N0cmluZ0NvbnZlcnQuY3BwCkBAIC0wLDAgKzEsMTY1IEBACisvLyBDb21tb24vU3RyaW5nQ29udmVydC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIlN0cmluZ0NvbnZlcnQuaCINCisNCisjaWZuZGVmIF9XSU4zMg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjZW5kaWYNCisNCisjaWZkZWYgX1dJTjMyDQorVVN0cmluZyBNdWx0aUJ5dGVUb1VuaWNvZGVTdHJpbmcoY29uc3QgQVN0cmluZyAmc3JjU3RyaW5nLCBVSU5UIGNvZGVQYWdlKQ0KK3sNCisgIFVTdHJpbmcgcmVzdWx0U3RyaW5nOw0KKyAgaWYgKCFzcmNTdHJpbmcuSXNFbXB0eSgpKQ0KKyAgew0KKyAgICBpbnQgbnVtQ2hhcnMgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKGNvZGVQYWdlLCAwLCBzcmNTdHJpbmcsDQorICAgICAgICBzcmNTdHJpbmcuTGVuKCksIHJlc3VsdFN0cmluZy5HZXRCdWZmZXIoc3JjU3RyaW5nLkxlbigpKSwNCisgICAgICAgIHNyY1N0cmluZy5MZW4oKSArIDEpOw0KKyAgICBpZiAobnVtQ2hhcnMgPT0gMCkNCisgICAgICB0aHJvdyAyODIyMjg7DQorICAgIHJlc3VsdFN0cmluZy5SZWxlYXNlQnVmZmVyKG51bUNoYXJzKTsNCisgIH0NCisgIHJldHVybiByZXN1bHRTdHJpbmc7DQorfQ0KKw0KK3ZvaWQgTXVsdGlCeXRlVG9Vbmljb2RlU3RyaW5nMihVU3RyaW5nICZkZXN0LCBjb25zdCBBU3RyaW5nICZzcmNTdHJpbmcsIFVJTlQgY29kZVBhZ2UpDQorew0KKyAgZGVzdC5FbXB0eSgpOw0KKyAgaWYgKCFzcmNTdHJpbmcuSXNFbXB0eSgpKQ0KKyAgew0KKyAgICB3Y2hhcl90ICpkZXN0QnVmID0gZGVzdC5HZXRCdWZmZXIoc3JjU3RyaW5nLkxlbigpKTsNCisgICAgY29uc3QgY2hhciAqc3AgPSAoY29uc3QgY2hhciAqKXNyY1N0cmluZzsNCisgICAgdW5zaWduZWQgaTsNCisgICAgZm9yIChpID0gMDs7KQ0KKyAgICB7DQorICAgICAgY2hhciBjID0gc3BbaV07DQorICAgICAgaWYgKChCeXRlKWMgPj0gMHg4MCB8fCBjID09IDApDQorICAgICAgICBicmVhazsNCisgICAgICBkZXN0QnVmW2krK10gPSAod2NoYXJfdCljOw0KKyAgICB9DQorDQorICAgIGlmIChpICE9IHNyY1N0cmluZy5MZW4oKSkNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIG51bUNoYXJzID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihjb2RlUGFnZSwgMCwgc3AgKyBpLA0KKyAgICAgICAgICBzcmNTdHJpbmcuTGVuKCkgLSBpLCBkZXN0QnVmICsgaSwNCisgICAgICAgICAgc3JjU3RyaW5nLkxlbigpICsgMSAtIGkpOw0KKyAgICAgIGlmIChudW1DaGFycyA9PSAwKQ0KKyAgICAgICAgdGhyb3cgMjgyMjI4Ow0KKyAgICAgIGkgKz0gbnVtQ2hhcnM7DQorICAgIH0NCisgICAgZGVzdC5SZWxlYXNlQnVmZmVyKGkpOw0KKyAgfQ0KK30NCisNCit2b2lkIFVuaWNvZGVTdHJpbmdUb011bHRpQnl0ZTIoQVN0cmluZyAmZGVzdCwgY29uc3QgVVN0cmluZyAmcywgVUlOVCBjb2RlUGFnZSwgY2hhciBkZWZhdWx0Q2hhciwgYm9vbCAmZGVmYXVsdENoYXJXYXNVc2VkKQ0KK3sNCisgIGRlc3QuRW1wdHkoKTsNCisgIGRlZmF1bHRDaGFyV2FzVXNlZCA9IGZhbHNlOw0KKyAgaWYgKCFzLklzRW1wdHkoKSkNCisgIHsNCisgICAgdW5zaWduZWQgbnVtUmVxdWlyZWRCeXRlcyA9IHMuTGVuKCkgKiAyOw0KKyAgICBjaGFyICpkZXN0QnVmID0gZGVzdC5HZXRCdWZmZXIobnVtUmVxdWlyZWRCeXRlcyk7DQorICAgIHVuc2lnbmVkIGk7DQorICAgIGNvbnN0IHdjaGFyX3QgKnNwID0gKGNvbnN0IHdjaGFyX3QgKilzOw0KKyAgICBmb3IgKGkgPSAwOzspDQorICAgIHsNCisgICAgICB3Y2hhcl90IGMgPSBzcFtpXTsNCisgICAgICBpZiAoYyA+PSAweDgwIHx8IGMgPT0gMCkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlc3RCdWZbaSsrXSA9IChjaGFyKWM7DQorICAgIH0NCisgICAgZGVmYXVsdENoYXJXYXNVc2VkID0gZmFsc2U7DQorICAgIGlmIChpICE9IHMuTGVuKCkpDQorICAgIHsNCisgICAgICBCT09MIGRlZlVzZWQ7DQorICAgICAgdW5zaWduZWQgbnVtQ2hhcnMgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKGNvZGVQYWdlLCAwLCBzcCArIGksIHMuTGVuKCkgLSBpLA0KKyAgICAgICAgICBkZXN0QnVmICsgaSwgbnVtUmVxdWlyZWRCeXRlcyArIDEgLSBpLA0KKyAgICAgICAgICAmZGVmYXVsdENoYXIsICZkZWZVc2VkKTsNCisgICAgICBkZWZhdWx0Q2hhcldhc1VzZWQgPSAoZGVmVXNlZCAhPSBGQUxTRSk7DQorICAgICAgaWYgKG51bUNoYXJzID09IDApDQorICAgICAgICB0aHJvdyAyODIyMjk7DQorICAgICAgaSArPSBudW1DaGFyczsNCisgICAgfQ0KKyAgICBkZXN0LlJlbGVhc2VCdWZmZXIoaSk7DQorICB9DQorfQ0KKw0KK3ZvaWQgVW5pY29kZVN0cmluZ1RvTXVsdGlCeXRlMihBU3RyaW5nICZkZXN0LCBjb25zdCBVU3RyaW5nICZzcmNTdHJpbmcsIFVJTlQgY29kZVBhZ2UpDQorew0KKyAgYm9vbCBkZWZhdWx0Q2hhcldhc1VzZWQ7DQorICBVbmljb2RlU3RyaW5nVG9NdWx0aUJ5dGUyKGRlc3QsIHNyY1N0cmluZywgY29kZVBhZ2UsICdfJywgZGVmYXVsdENoYXJXYXNVc2VkKTsNCit9DQorDQorQVN0cmluZyBVbmljb2RlU3RyaW5nVG9NdWx0aUJ5dGUoY29uc3QgVVN0cmluZyAmcywgVUlOVCBjb2RlUGFnZSwgY2hhciBkZWZhdWx0Q2hhciwgYm9vbCAmZGVmYXVsdENoYXJXYXNVc2VkKQ0KK3sNCisgIEFTdHJpbmcgZGVzdDsNCisgIGRlZmF1bHRDaGFyV2FzVXNlZCA9IGZhbHNlOw0KKyAgaWYgKCFzLklzRW1wdHkoKSkNCisgIHsNCisgICAgdW5zaWduZWQgbnVtUmVxdWlyZWRCeXRlcyA9IHMuTGVuKCkgKiAyOw0KKyAgICBCT09MIGRlZlVzZWQ7DQorICAgIGludCBudW1DaGFycyA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZVBhZ2UsIDAsIHMsIHMuTGVuKCksDQorICAgICAgICBkZXN0LkdldEJ1ZmZlcihudW1SZXF1aXJlZEJ5dGVzKSwgbnVtUmVxdWlyZWRCeXRlcyArIDEsDQorICAgICAgICAmZGVmYXVsdENoYXIsICZkZWZVc2VkKTsNCisgICAgZGVmYXVsdENoYXJXYXNVc2VkID0gKGRlZlVzZWQgIT0gRkFMU0UpOw0KKyAgICBpZiAobnVtQ2hhcnMgPT0gMCkNCisgICAgICB0aHJvdyAyODIyMjk7DQorICAgIGRlc3QuUmVsZWFzZUJ1ZmZlcihudW1DaGFycyk7DQorICB9DQorICByZXR1cm4gZGVzdDsNCit9DQorDQorQVN0cmluZyBVbmljb2RlU3RyaW5nVG9NdWx0aUJ5dGUoY29uc3QgVVN0cmluZyAmc3JjU3RyaW5nLCBVSU5UIGNvZGVQYWdlKQ0KK3sNCisgIGJvb2wgZGVmYXVsdENoYXJXYXNVc2VkOw0KKyAgcmV0dXJuIFVuaWNvZGVTdHJpbmdUb011bHRpQnl0ZShzcmNTdHJpbmcsIGNvZGVQYWdlLCAnXycsIGRlZmF1bHRDaGFyV2FzVXNlZCk7DQorfQ0KKw0KKyNpZm5kZWYgVU5ERVJfQ0UNCitBU3RyaW5nIFN5c3RlbVN0cmluZ1RvT2VtU3RyaW5nKGNvbnN0IENTeXNTdHJpbmcgJnNyY1N0cmluZykNCit7DQorICBBU3RyaW5nIHJlc3VsdDsNCisgIENoYXJUb09lbShzcmNTdHJpbmcsIHJlc3VsdC5HZXRCdWZmZXIoc3JjU3RyaW5nLkxlbigpICogMikpOw0KKyAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoKTsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKyNlbmRpZg0KKw0KKyNlbHNlDQorDQorVVN0cmluZyBNdWx0aUJ5dGVUb1VuaWNvZGVTdHJpbmcoY29uc3QgQVN0cmluZyAmc3JjU3RyaW5nLCBVSU5UIGNvZGVQYWdlKQ0KK3sNCisgIFVTdHJpbmcgcmVzdWx0U3RyaW5nOw0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNyY1N0cmluZy5MZW4oKTsgaSsrKQ0KKyAgICByZXN1bHRTdHJpbmcgKz0gKHdjaGFyX3Qpc3JjU3RyaW5nW2ldOw0KKyAgLyoNCisgIGlmICghc3JjU3RyaW5nLklzRW1wdHkoKSkNCisgIHsNCisgICAgaW50IG51bUNoYXJzID0gbWJzdG93Y3MocmVzdWx0U3RyaW5nLkdldEJ1ZmZlcihzcmNTdHJpbmcuTGVuKCkpLCBzcmNTdHJpbmcsIHNyY1N0cmluZy5MZW4oKSArIDEpOw0KKyAgICBpZiAobnVtQ2hhcnMgPCAwKSB0aHJvdyAiWW91ciBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IFVOSUNPREUiOw0KKyAgICByZXN1bHRTdHJpbmcuUmVsZWFzZUJ1ZmZlcihudW1DaGFycyk7DQorICB9DQorICAqLw0KKyAgcmV0dXJuIHJlc3VsdFN0cmluZzsNCit9DQorDQorQVN0cmluZyBVbmljb2RlU3RyaW5nVG9NdWx0aUJ5dGUoY29uc3QgVVN0cmluZyAmc3JjU3RyaW5nLCBVSU5UIGNvZGVQYWdlKQ0KK3sNCisgIEFTdHJpbmcgcmVzdWx0U3RyaW5nOw0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNyY1N0cmluZy5MZW4oKTsgaSsrKQ0KKyAgICByZXN1bHRTdHJpbmcgKz0gKGNoYXIpc3JjU3RyaW5nW2ldOw0KKyAgLyoNCisgIGlmICghc3JjU3RyaW5nLklzRW1wdHkoKSkNCisgIHsNCisgICAgaW50IG51bVJlcXVpcmVkQnl0ZXMgPSBzcmNTdHJpbmcuTGVuKCkgKiA2ICsgMTsNCisgICAgaW50IG51bUNoYXJzID0gd2NzdG9tYnMocmVzdWx0U3RyaW5nLkdldEJ1ZmZlcihudW1SZXF1aXJlZEJ5dGVzKSwgc3JjU3RyaW5nLCBudW1SZXF1aXJlZEJ5dGVzKTsNCisgICAgaWYgKG51bUNoYXJzIDwgMCkgdGhyb3cgIllvdXIgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBVTklDT0RFIjsNCisgICAgcmVzdWx0U3RyaW5nLlJlbGVhc2VCdWZmZXIobnVtQ2hhcnMpOw0KKyAgfQ0KKyAgKi8NCisgIHJldHVybiByZXN1bHRTdHJpbmc7DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmggYi9sem1hL0NQUC9Db21tb24vU3RyaW5nQ29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NTE4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vU3RyaW5nQ29udmVydC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vIENvbW1vbi9TdHJpbmdDb252ZXJ0LmgNCisNCisjaWZuZGVmIF9fQ09NTU9OX1NUUklOR19DT05WRVJUX0gNCisjZGVmaW5lIF9fQ09NTU9OX1NUUklOR19DT05WRVJUX0gNCisNCisjaW5jbHVkZSAiTXlTdHJpbmcuaCINCisjaW5jbHVkZSAiTXlXaW5kb3dzLmgiDQorDQorVVN0cmluZyBNdWx0aUJ5dGVUb1VuaWNvZGVTdHJpbmcoY29uc3QgQVN0cmluZyAmc3JjU3RyaW5nLCBVSU5UIGNvZGVQYWdlID0gQ1BfQUNQKTsNCisNCisvLyBvcHRpbWl6ZWQgdmVyc2lvbnMgdGhhdCB3b3JrIGZhc3RlciBmb3IgQVNDSUkgc3RyaW5ncw0KK3ZvaWQgTXVsdGlCeXRlVG9Vbmljb2RlU3RyaW5nMihVU3RyaW5nICZkZXN0LCBjb25zdCBBU3RyaW5nICZzcmNTdHJpbmcsIFVJTlQgY29kZVBhZ2UgPSBDUF9BQ1ApOw0KK3ZvaWQgVW5pY29kZVN0cmluZ1RvTXVsdGlCeXRlMihBU3RyaW5nICZkZXN0LCBjb25zdCBVU3RyaW5nICZzLCBVSU5UIGNvZGVQYWdlLCBjaGFyIGRlZmF1bHRDaGFyLCBib29sICZkZWZhdWx0Q2hhcldhc1VzZWQpOw0KK3ZvaWQgVW5pY29kZVN0cmluZ1RvTXVsdGlCeXRlMihBU3RyaW5nICZkZXN0LCBjb25zdCBVU3RyaW5nICZzcmNTdHJpbmcsIFVJTlQgY29kZVBhZ2UpOw0KKw0KK0FTdHJpbmcgVW5pY29kZVN0cmluZ1RvTXVsdGlCeXRlKGNvbnN0IFVTdHJpbmcgJnNyY1N0cmluZywgVUlOVCBjb2RlUGFnZSwgY2hhciBkZWZhdWx0Q2hhciwgYm9vbCAmZGVmYXVsdENoYXJXYXNVc2VkKTsNCitBU3RyaW5nIFVuaWNvZGVTdHJpbmdUb011bHRpQnl0ZShjb25zdCBVU3RyaW5nICZzcmNTdHJpbmcsIFVJTlQgY29kZVBhZ2UgPSBDUF9BQ1ApOw0KKw0KK2lubGluZSBjb25zdCB3Y2hhcl90KiBHZXRVbmljb2RlU3RyaW5nKGNvbnN0IHdjaGFyX3QqIHVuaWNvZGVTdHJpbmcpDQorICB7IHJldHVybiB1bmljb2RlU3RyaW5nOyB9DQoraW5saW5lIGNvbnN0IFVTdHJpbmcmIEdldFVuaWNvZGVTdHJpbmcoY29uc3QgVVN0cmluZyAmdW5pY29kZVN0cmluZykNCisgIHsgcmV0dXJuIHVuaWNvZGVTdHJpbmc7IH0NCitpbmxpbmUgVVN0cmluZyBHZXRVbmljb2RlU3RyaW5nKGNvbnN0IEFTdHJpbmcgJmFuc2lTdHJpbmcpDQorICB7IHJldHVybiBNdWx0aUJ5dGVUb1VuaWNvZGVTdHJpbmcoYW5zaVN0cmluZyk7IH0NCitpbmxpbmUgVVN0cmluZyBHZXRVbmljb2RlU3RyaW5nKGNvbnN0IEFTdHJpbmcgJm11bHRpQnl0ZVN0cmluZywgVUlOVCBjb2RlUGFnZSkNCisgIHsgcmV0dXJuIE11bHRpQnl0ZVRvVW5pY29kZVN0cmluZyhtdWx0aUJ5dGVTdHJpbmcsIGNvZGVQYWdlKTsgfQ0KK2lubGluZSBjb25zdCB3Y2hhcl90KiBHZXRVbmljb2RlU3RyaW5nKGNvbnN0IHdjaGFyX3QqIHVuaWNvZGVTdHJpbmcsIFVJTlQpDQorICB7IHJldHVybiB1bmljb2RlU3RyaW5nOyB9DQoraW5saW5lIGNvbnN0IFVTdHJpbmcmIEdldFVuaWNvZGVTdHJpbmcoY29uc3QgVVN0cmluZyAmdW5pY29kZVN0cmluZywgVUlOVCkNCisgIHsgcmV0dXJuIHVuaWNvZGVTdHJpbmc7IH0NCisNCitpbmxpbmUgY29uc3QgY2hhciogR2V0QW5zaVN0cmluZyhjb25zdCBjaGFyKiBhbnNpU3RyaW5nKQ0KKyAgeyByZXR1cm4gYW5zaVN0cmluZzsgfQ0KK2lubGluZSBjb25zdCBBU3RyaW5nJiBHZXRBbnNpU3RyaW5nKGNvbnN0IEFTdHJpbmcgJmFuc2lTdHJpbmcpDQorICB7IHJldHVybiBhbnNpU3RyaW5nOyB9DQoraW5saW5lIEFTdHJpbmcgR2V0QW5zaVN0cmluZyhjb25zdCBVU3RyaW5nICZ1bmljb2RlU3RyaW5nKQ0KKyAgeyByZXR1cm4gVW5pY29kZVN0cmluZ1RvTXVsdGlCeXRlKHVuaWNvZGVTdHJpbmcpOyB9DQorDQoraW5saW5lIGNvbnN0IGNoYXIqIEdldE9lbVN0cmluZyhjb25zdCBjaGFyKiBvZW1TdHJpbmcpDQorICB7IHJldHVybiBvZW1TdHJpbmc7IH0NCitpbmxpbmUgY29uc3QgQVN0cmluZyYgR2V0T2VtU3RyaW5nKGNvbnN0IEFTdHJpbmcgJm9lbVN0cmluZykNCisgIHsgcmV0dXJuIG9lbVN0cmluZzsgfQ0KK2lubGluZSBBU3RyaW5nIEdldE9lbVN0cmluZyhjb25zdCBVU3RyaW5nICZ1bmljb2RlU3RyaW5nKQ0KKyAgeyByZXR1cm4gVW5pY29kZVN0cmluZ1RvTXVsdGlCeXRlKHVuaWNvZGVTdHJpbmcsIENQX09FTUNQKTsgfQ0KKw0KKw0KKyNpZmRlZiBfVU5JQ09ERQ0KKyAgaW5saW5lIGNvbnN0IHdjaGFyX3QqIEdldFN5c3RlbVN0cmluZyhjb25zdCB3Y2hhcl90KiB1bmljb2RlU3RyaW5nKQ0KKyAgICB7IHJldHVybiB1bmljb2RlU3RyaW5nO30NCisgIGlubGluZSBjb25zdCBVU3RyaW5nJiBHZXRTeXN0ZW1TdHJpbmcoY29uc3QgVVN0cmluZyAmdW5pY29kZVN0cmluZykNCisgICAgeyByZXR1cm4gdW5pY29kZVN0cmluZzt9DQorICBpbmxpbmUgY29uc3Qgd2NoYXJfdCogR2V0U3lzdGVtU3RyaW5nKGNvbnN0IHdjaGFyX3QqIHVuaWNvZGVTdHJpbmcsIFVJTlQgLyogY29kZVBhZ2UgKi8pDQorICAgIHsgcmV0dXJuIHVuaWNvZGVTdHJpbmc7fQ0KKyAgaW5saW5lIGNvbnN0IFVTdHJpbmcmIEdldFN5c3RlbVN0cmluZyhjb25zdCBVU3RyaW5nICZ1bmljb2RlU3RyaW5nLCBVSU5UIC8qIGNvZGVQYWdlICovKQ0KKyAgICB7IHJldHVybiB1bmljb2RlU3RyaW5nO30NCisgIGlubGluZSBVU3RyaW5nIEdldFN5c3RlbVN0cmluZyhjb25zdCBBU3RyaW5nICZtdWx0aUJ5dGVTdHJpbmcsIFVJTlQgY29kZVBhZ2UpDQorICAgIHsgcmV0dXJuIE11bHRpQnl0ZVRvVW5pY29kZVN0cmluZyhtdWx0aUJ5dGVTdHJpbmcsIGNvZGVQYWdlKTt9DQorICBpbmxpbmUgVVN0cmluZyBHZXRTeXN0ZW1TdHJpbmcoY29uc3QgQVN0cmluZyAmbXVsdGlCeXRlU3RyaW5nKQ0KKyAgICB7IHJldHVybiBNdWx0aUJ5dGVUb1VuaWNvZGVTdHJpbmcobXVsdGlCeXRlU3RyaW5nKTt9DQorI2Vsc2UNCisgIGlubGluZSBjb25zdCBjaGFyKiBHZXRTeXN0ZW1TdHJpbmcoY29uc3QgY2hhciAqYW5zaVN0cmluZykNCisgICAgeyByZXR1cm4gYW5zaVN0cmluZzsgfQ0KKyAgaW5saW5lIGNvbnN0IEFTdHJpbmcmIEdldFN5c3RlbVN0cmluZyhjb25zdCBBU3RyaW5nICZtdWx0aUJ5dGVTdHJpbmcsIFVJTlQpDQorICAgIHsgcmV0dXJuIG11bHRpQnl0ZVN0cmluZzsgfQ0KKyAgaW5saW5lIGNvbnN0IGNoYXIgKiBHZXRTeXN0ZW1TdHJpbmcoY29uc3QgY2hhciAqbXVsdGlCeXRlU3RyaW5nLCBVSU5UKQ0KKyAgICB7IHJldHVybiBtdWx0aUJ5dGVTdHJpbmc7IH0NCisgIGlubGluZSBBU3RyaW5nIEdldFN5c3RlbVN0cmluZyhjb25zdCBVU3RyaW5nICZ1bmljb2RlU3RyaW5nKQ0KKyAgICB7IHJldHVybiBVbmljb2RlU3RyaW5nVG9NdWx0aUJ5dGUodW5pY29kZVN0cmluZyk7IH0NCisgIGlubGluZSBBU3RyaW5nIEdldFN5c3RlbVN0cmluZyhjb25zdCBVU3RyaW5nICZ1bmljb2RlU3RyaW5nLCBVSU5UIGNvZGVQYWdlKQ0KKyAgICB7IHJldHVybiBVbmljb2RlU3RyaW5nVG9NdWx0aUJ5dGUodW5pY29kZVN0cmluZywgY29kZVBhZ2UpOyB9DQorI2VuZGlmDQorDQorI2lmbmRlZiBVTkRFUl9DRQ0KK0FTdHJpbmcgU3lzdGVtU3RyaW5nVG9PZW1TdHJpbmcoY29uc3QgQ1N5c1N0cmluZyAmc3JjU3RyaW5nKTsNCisjZW5kaWYNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vU3RyaW5nVG9JbnQuY3BwIGIvbHptYS9DUFAvQ29tbW9uL1N0cmluZ1RvSW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWQ0ODNlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL1N0cmluZ1RvSW50LmNwcApAQCAtMCwwICsxLDE0NCBAQAorLy8gQ29tbW9uL1N0cmluZ1RvSW50LmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiU3RyaW5nVG9JbnQuaCINCisNCitzdGF0aWMgY29uc3QgVUludDMyIGtfVUludDMyX21heCA9IDB4RkZGRkZGRkY7DQorc3RhdGljIGNvbnN0IFVJbnQ2NCBrX1VJbnQ2NF9tYXggPSBVSU5UNjRfQ09OU1QoMHhGRkZGRkZGRkZGRkZGRkZGKTsNCisvLyBzdGF0aWMgY29uc3QgVUludDY0IGtfVUludDY0X21heCA9IChVSW50NjQpKEludDY0KS0xOw0KKw0KKyNkZWZpbmUgQ09OVkVSVF9TVFJJTkdfVE9fVUlOVF9GVU5DKHVpbnRUeXBlLCBjaGFyVHlwZSkgXA0KKyAgdWludFR5cGUgQ29udmVydFN0cmluZ1RvICMjIHVpbnRUeXBlKGNvbnN0IGNoYXJUeXBlICpzLCBjb25zdCBjaGFyVHlwZSAqKmVuZCkgdGhyb3coKSB7IFwNCisgICAgaWYgKGVuZCkgKmVuZCA9IHM7IFwNCisgICAgdWludFR5cGUgcmVzID0gMDsgXA0KKyAgICBmb3IgKDs7IHMrKykgeyBcDQorICAgICAgY2hhclR5cGUgYyA9ICpzOyBcDQorICAgICAgaWYgKGMgPCAnMCcgfHwgYyA+ICc5JykgeyBpZiAoZW5kKSAqZW5kID0gczsgcmV0dXJuIHJlczsgfSBcDQorICAgICAgaWYgKHJlcyA+IChrXyAjIyB1aW50VHlwZSAjIyBfbWF4KSAvIDEwKSByZXR1cm4gMDsgXA0KKyAgICAgIHJlcyAqPSAxMDsgXA0KKyAgICAgIHVuc2lnbmVkIHYgPSAoYyAtICcwJyk7IFwNCisgICAgICBpZiAocmVzID4gKGtfICMjIHVpbnRUeXBlICMjIF9tYXgpIC0gdikgcmV0dXJuIDA7IFwNCisgICAgICByZXMgKz0gdjsgfX0NCisNCitDT05WRVJUX1NUUklOR19UT19VSU5UX0ZVTkMoVUludDMyLCBjaGFyKQ0KK0NPTlZFUlRfU1RSSU5HX1RPX1VJTlRfRlVOQyhVSW50MzIsIHdjaGFyX3QpDQorQ09OVkVSVF9TVFJJTkdfVE9fVUlOVF9GVU5DKFVJbnQ2NCwgY2hhcikNCitDT05WRVJUX1NUUklOR19UT19VSU5UX0ZVTkMoVUludDY0LCB3Y2hhcl90KQ0KKw0KK0ludDMyIENvbnZlcnRTdHJpbmdUb0ludDMyKGNvbnN0IHdjaGFyX3QgKnMsIGNvbnN0IHdjaGFyX3QgKiplbmQpIHRocm93KCkNCit7DQorICBpZiAoZW5kKQ0KKyAgICAqZW5kID0gczsNCisgIGNvbnN0IHdjaGFyX3QgKnMyID0gczsNCisgIGlmICgqcyA9PSAnLScpDQorICAgIHMyKys7DQorICBpZiAoKnMyID09IDApDQorICAgIHJldHVybiAwOw0KKyAgY29uc3Qgd2NoYXJfdCAqZW5kMjsNCisgIFVJbnQzMiByZXMgPSBDb252ZXJ0U3RyaW5nVG9VSW50MzIoczIsICZlbmQyKTsNCisgIGlmICgqcyA9PSAnLScpDQorICB7DQorICAgIGlmIChyZXMgPiAoKFVJbnQzMikxIDw8ICgzMiAtIDEpKSkNCisgICAgICByZXR1cm4gMDsNCisgIH0NCisgIGVsc2UgaWYgKChyZXMgJiAoKFVJbnQzMikxIDw8ICgzMiAtIDEpKSkgIT0gMCkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoZW5kKQ0KKyAgICAqZW5kID0gZW5kMjsNCisgIGlmICgqcyA9PSAnLScpDQorICAgIHJldHVybiAtKEludDMyKXJlczsNCisgIHJldHVybiAoSW50MzIpcmVzOw0KK30NCisNCitVSW50MzIgQ29udmVydE9jdFN0cmluZ1RvVUludDMyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKiplbmQpIHRocm93KCkNCit7DQorICBpZiAoZW5kKQ0KKyAgICAqZW5kID0gczsNCisgIFVJbnQzMiByZXMgPSAwOw0KKyAgZm9yICg7OyBzKyspDQorICB7DQorICAgIGNoYXIgYyA9ICpzOw0KKyAgICBpZiAoYyA8ICcwJyB8fCBjID4gJzcnKQ0KKyAgICB7DQorICAgICAgaWYgKGVuZCkNCisgICAgICAgICplbmQgPSBzOw0KKyAgICAgIHJldHVybiByZXM7DQorICAgIH0NCisgICAgaWYgKChyZXMgJiAoVUludDMyKTcgPDwgKDMyIC0gMykpICE9IDApDQorICAgICAgcmV0dXJuIDA7DQorICAgIHJlcyA8PD0gMzsNCisgICAgcmVzIHw9ICh1bnNpZ25lZCkoYyAtICcwJyk7DQorICB9DQorfQ0KKw0KK1VJbnQ2NCBDb252ZXJ0T2N0U3RyaW5nVG9VSW50NjQoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqKmVuZCkgdGhyb3coKQ0KK3sNCisgIGlmIChlbmQpDQorICAgICplbmQgPSBzOw0KKyAgVUludDY0IHJlcyA9IDA7DQorICBmb3IgKDs7IHMrKykNCisgIHsNCisgICAgY2hhciBjID0gKnM7DQorICAgIGlmIChjIDwgJzAnIHx8IGMgPiAnNycpDQorICAgIHsNCisgICAgICBpZiAoZW5kKQ0KKyAgICAgICAgKmVuZCA9IHM7DQorICAgICAgcmV0dXJuIHJlczsNCisgICAgfQ0KKyAgICBpZiAoKHJlcyAmIChVSW50NjQpNyA8PCAoNjQgLSAzKSkgIT0gMCkNCisgICAgICByZXR1cm4gMDsNCisgICAgcmVzIDw8PSAzOw0KKyAgICByZXMgfD0gKHVuc2lnbmVkKShjIC0gJzAnKTsNCisgIH0NCit9DQorDQorVUludDMyIENvbnZlcnRIZXhTdHJpbmdUb1VJbnQzMihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICoqZW5kKSB0aHJvdygpDQorew0KKyAgaWYgKGVuZCkNCisgICAgKmVuZCA9IHM7DQorICBVSW50MzIgcmVzID0gMDsNCisgIGZvciAoOzsgcysrKQ0KKyAgew0KKyAgICBjaGFyIGMgPSAqczsNCisgICAgdW5zaWduZWQgdjsNCisgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB2ID0gKGMgLSAnMCcpOw0KKyAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykgdiA9IDEwICsgKGMgLSAnQScpOw0KKyAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykgdiA9IDEwICsgKGMgLSAnYScpOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBpZiAoZW5kKQ0KKyAgICAgICAgKmVuZCA9IHM7DQorICAgICAgcmV0dXJuIHJlczsNCisgICAgfQ0KKyAgICBpZiAoKHJlcyAmIChVSW50MzIpMHhGIDw8ICgzMiAtIDQpKSAhPSAwKQ0KKyAgICAgIHJldHVybiAwOw0KKyAgICByZXMgPDw9IDQ7DQorICAgIHJlcyB8PSB2Ow0KKyAgfQ0KK30NCisNCitVSW50NjQgQ29udmVydEhleFN0cmluZ1RvVUludDY0KGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKiplbmQpIHRocm93KCkNCit7DQorICBpZiAoZW5kKQ0KKyAgICAqZW5kID0gczsNCisgIFVJbnQ2NCByZXMgPSAwOw0KKyAgZm9yICg7OyBzKyspDQorICB7DQorICAgIGNoYXIgYyA9ICpzOw0KKyAgICB1bnNpZ25lZCB2Ow0KKyAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHYgPSAoYyAtICcwJyk7DQorICAgIGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSB2ID0gMTAgKyAoYyAtICdBJyk7DQorICAgIGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSB2ID0gMTAgKyAoYyAtICdhJyk7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGlmIChlbmQpDQorICAgICAgICAqZW5kID0gczsNCisgICAgICByZXR1cm4gcmVzOw0KKyAgICB9DQorICAgIGlmICgocmVzICYgKFVJbnQ2NCkweEYgPDwgKDY0IC0gNCkpICE9IDApDQorICAgICAgcmV0dXJuIDA7DQorICAgIHJlcyA8PD0gNDsNCisgICAgcmVzIHw9IHY7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9TdHJpbmdUb0ludC5oIGIvbHptYS9DUFAvQ29tbW9uL1N0cmluZ1RvSW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwZDFlZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9TdHJpbmdUb0ludC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvbW1vbi9TdHJpbmdUb0ludC5oDQorDQorI2lmbmRlZiBfX0NPTU1PTl9TVFJJTkdfVE9fSU5UX0gNCisjZGVmaW5lIF9fQ09NTU9OX1NUUklOR19UT19JTlRfSA0KKw0KKyNpbmNsdWRlICJNeVR5cGVzLmgiDQorDQorVUludDMyIENvbnZlcnRTdHJpbmdUb1VJbnQzMihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICoqZW5kKSB0aHJvdygpOw0KK1VJbnQ2NCBDb252ZXJ0U3RyaW5nVG9VSW50NjQoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqKmVuZCkgdGhyb3coKTsNCitVSW50MzIgQ29udmVydFN0cmluZ1RvVUludDMyKGNvbnN0IHdjaGFyX3QgKnMsIGNvbnN0IHdjaGFyX3QgKiplbmQpIHRocm93KCk7DQorVUludDY0IENvbnZlcnRTdHJpbmdUb1VJbnQ2NChjb25zdCB3Y2hhcl90ICpzLCBjb25zdCB3Y2hhcl90ICoqZW5kKSB0aHJvdygpOw0KKw0KK0ludDMyIENvbnZlcnRTdHJpbmdUb0ludDMyKGNvbnN0IHdjaGFyX3QgKnMsIGNvbnN0IHdjaGFyX3QgKiplbmQpIHRocm93KCk7DQorDQorVUludDMyIENvbnZlcnRPY3RTdHJpbmdUb1VJbnQzMihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICoqZW5kKSB0aHJvdygpOw0KK1VJbnQ2NCBDb252ZXJ0T2N0U3RyaW5nVG9VSW50NjQoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqKmVuZCkgdGhyb3coKTsNCisNCitVSW50MzIgQ29udmVydEhleFN0cmluZ1RvVUludDMyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKiplbmQpIHRocm93KCk7DQorVUludDY0IENvbnZlcnRIZXhTdHJpbmdUb1VJbnQ2NChjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICoqZW5kKSB0aHJvdygpOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9UZXh0Q29uZmlnLmNwcCBiL2x6bWEvQ1BQL0NvbW1vbi9UZXh0Q29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzdlNzcwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL1RleHRDb25maWcuY3BwCkBAIC0wLDAgKzEsMTI0IEBACisvLyBDb21tb24vVGV4dENvbmZpZy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIlRleHRDb25maWcuaCINCisjaW5jbHVkZSAiVVRGQ29udmVydC5oIg0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBJc0RlbGltaXRDaGFyKGNoYXIgYykNCit7DQorICByZXR1cm4gKGMgPT0gJyAnIHx8IGMgPT0gMHgwQSB8fCBjID09IDB4MEQgfHwgYyA9PSAnXDAnIHx8IGMgPT0gJ1x0Jyk7DQorfQ0KKyAgICANCitzdGF0aWMgQVN0cmluZyBHZXRJRFN0cmluZyhjb25zdCBjaGFyICpzLCB1bnNpZ25lZCAmZmluaXNoUG9zKQ0KK3sNCisgIEFTdHJpbmcgcmVzdWx0Ow0KKyAgZm9yIChmaW5pc2hQb3MgPSAwOyA7IGZpbmlzaFBvcysrKQ0KKyAgew0KKyAgICBjaGFyIGMgPSBzW2ZpbmlzaFBvc107DQorICAgIGlmIChJc0RlbGltaXRDaGFyKGMpIHx8IGMgPT0gJz0nKQ0KKyAgICAgIGJyZWFrOw0KKyAgICByZXN1bHQgKz0gYzsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKw0KK3N0YXRpYyBib29sIFdhaXROZXh0TGluZShjb25zdCBBU3RyaW5nICZzLCB1bnNpZ25lZCAmcG9zKQ0KK3sNCisgIGZvciAoOyBwb3MgPCBzLkxlbigpOyBwb3MrKykNCisgICAgaWYgKHNbcG9zXSA9PSAweDBBKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitzdGF0aWMgYm9vbCBTa2lwU3BhY2VzKGNvbnN0IEFTdHJpbmcgJnMsIHVuc2lnbmVkICZwb3MpDQorew0KKyAgZm9yICg7IHBvcyA8IHMuTGVuKCk7IHBvcysrKQ0KKyAgew0KKyAgICBjaGFyIGMgPSBzW3Bvc107DQorICAgIGlmICghSXNEZWxpbWl0Q2hhcihjKSkNCisgICAgew0KKyAgICAgIGlmIChjICE9ICc7JykNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIGlmICghV2FpdE5leHRMaW5lKHMsIHBvcykpDQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbCBHZXRUZXh0Q29uZmlnKGNvbnN0IEFTdHJpbmcgJnMsIENPYmplY3RWZWN0b3I8Q1RleHRDb25maWdQYWlyPiAmcGFpcnMpDQorew0KKyAgcGFpcnMuQ2xlYXIoKTsNCisgIHVuc2lnbmVkIHBvcyA9IDA7DQorDQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisgIC8vIHJlYWQgc3RyaW5ncw0KKw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgaWYgKCFTa2lwU3BhY2VzKHMsIHBvcykpDQorICAgICAgYnJlYWs7DQorICAgIENUZXh0Q29uZmlnUGFpciBwYWlyOw0KKyAgICB1bnNpZ25lZCBmaW5pc2hQb3M7DQorICAgIEFTdHJpbmcgdGVtcCA9IEdldElEU3RyaW5nKCgoY29uc3QgY2hhciAqKXMpICsgcG9zLCBmaW5pc2hQb3MpOw0KKyAgICBpZiAoIUNvbnZlcnRVVEY4VG9Vbmljb2RlKHRlbXAsIHBhaXIuSUQpKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgaWYgKGZpbmlzaFBvcyA9PSAwKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgcG9zICs9IGZpbmlzaFBvczsNCisgICAgaWYgKCFTa2lwU3BhY2VzKHMsIHBvcykpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBpZiAoc1twb3NdICE9ICc9JykNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIHBvcysrOw0KKyAgICBpZiAoIVNraXBTcGFjZXMocywgcG9zKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIGlmIChzW3Bvc10gIT0gJ1wiJykNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIHBvcysrOw0KKyAgICBBU3RyaW5nIG1lc3NhZ2U7DQorICAgIGZvciAoOzspDQorICAgIHsNCisgICAgICBpZiAocG9zID49IHMuTGVuKCkpDQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgY2hhciBjID0gc1twb3MrK107DQorICAgICAgaWYgKGMgPT0gJ1wiJykNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGlmIChjID09ICdcXCcpDQorICAgICAgew0KKyAgICAgICAgY2hhciBjID0gc1twb3MrK107DQorICAgICAgICBzd2l0Y2goYykNCisgICAgICAgIHsNCisgICAgICAgICAgY2FzZSAnbic6IG1lc3NhZ2UgKz0gJ1xuJzsgYnJlYWs7DQorICAgICAgICAgIGNhc2UgJ3QnOiBtZXNzYWdlICs9ICdcdCc7IGJyZWFrOw0KKyAgICAgICAgICBjYXNlICdcXCc6IG1lc3NhZ2UgKz0gJ1xcJzsgYnJlYWs7DQorICAgICAgICAgIGNhc2UgJ1wiJzogbWVzc2FnZSArPSAnXCInOyBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDogbWVzc2FnZSArPSAnXFwnOyBtZXNzYWdlICs9IGM7IGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgICBtZXNzYWdlICs9IGM7DQorICAgIH0NCisgICAgaWYgKCFDb252ZXJ0VVRGOFRvVW5pY29kZShtZXNzYWdlLCBwYWlyLlN0cmluZykpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBwYWlycy5BZGQocGFpcik7DQorICB9DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQoraW50IEZpbmRUZXh0Q29uZmlnSXRlbShjb25zdCBDT2JqZWN0VmVjdG9yPENUZXh0Q29uZmlnUGFpcj4gJnBhaXJzLCBjb25zdCBVU3RyaW5nICZpZCkgdGhyb3coKQ0KK3sNCisgIEZPUl9WRUNUT1IgKGksIHBhaXJzKQ0KKyAgICBpZiAocGFpcnNbaV0uSUQgPT0gaWQpDQorICAgICAgcmV0dXJuIGk7DQorICByZXR1cm4gLTE7DQorfQ0KKw0KK1VTdHJpbmcgR2V0VGV4dENvbmZpZ1ZhbHVlKGNvbnN0IENPYmplY3RWZWN0b3I8Q1RleHRDb25maWdQYWlyPiAmcGFpcnMsIGNvbnN0IFVTdHJpbmcgJmlkKQ0KK3sNCisgIGludCBpbmRleCA9IEZpbmRUZXh0Q29uZmlnSXRlbShwYWlycywgaWQpOw0KKyAgaWYgKGluZGV4IDwgMCkNCisgICAgcmV0dXJuIFVTdHJpbmcoKTsNCisgIHJldHVybiBwYWlyc1tpbmRleF0uU3RyaW5nOw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vVGV4dENvbmZpZy5oIGIvbHptYS9DUFAvQ29tbW9uL1RleHRDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjgxZmNmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvQ29tbW9uL1RleHRDb25maWcuaApAQCAtMCwwICsxLDIxIEBACisvLyBDb21tb24vVGV4dENvbmZpZy5oDQorDQorI2lmbmRlZiBfX0NPTU1PTl9URVhUX0NPTkZJR19IDQorI2RlZmluZSBfX0NPTU1PTl9URVhUX0NPTkZJR19IDQorDQorI2luY2x1ZGUgIk15U3RyaW5nLmgiDQorDQorc3RydWN0IENUZXh0Q29uZmlnUGFpcg0KK3sNCisgIFVTdHJpbmcgSUQ7DQorICBVU3RyaW5nIFN0cmluZzsNCit9Ow0KKw0KK2Jvb2wgR2V0VGV4dENvbmZpZyhjb25zdCBBU3RyaW5nICZ0ZXh0LCBDT2JqZWN0VmVjdG9yPENUZXh0Q29uZmlnUGFpcj4gJnBhaXJzKTsNCisNCitpbnQgRmluZFRleHRDb25maWdJdGVtKGNvbnN0IENPYmplY3RWZWN0b3I8Q1RleHRDb25maWdQYWlyPiAmcGFpcnMsIGNvbnN0IFVTdHJpbmcgJmlkKSB0aHJvdygpOw0KK1VTdHJpbmcgR2V0VGV4dENvbmZpZ1ZhbHVlKGNvbnN0IENPYmplY3RWZWN0b3I8Q1RleHRDb25maWdQYWlyPiAmcGFpcnMsIGNvbnN0IFVTdHJpbmcgJmlkKTsNCisNCisjZW5kaWYNCisNCisNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vVVRGQ29udmVydC5jcHAgYi9sem1hL0NQUC9Db21tb24vVVRGQ29udmVydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzZmY2OAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9VVEZDb252ZXJ0LmNwcApAQCAtMCwwICsxLDE3NiBAQAorLy8gVVRGQ29udmVydC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIk15VHlwZXMuaCINCisjaW5jbHVkZSAiVVRGQ29udmVydC5oIg0KKw0KK3N0YXRpYyBjb25zdCBCeXRlIGtVdGY4TGltaXRzWzVdID0geyAweEMwLCAweEUwLCAweEYwLCAweEY4LCAweEZDIH07DQorDQorYm9vbCBDaGVja1VURjgoY29uc3QgY2hhciAqc3JjKSB0aHJvdygpDQorew0KKyAgZm9yICg7OykNCisgIHsNCisgICAgQnl0ZSBjOw0KKyAgICB1bnNpZ25lZCBudW1BZGRzOw0KKyAgICBjID0gKnNyYysrOw0KKyAgICBpZiAoYyA9PSAwKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKw0KKyAgICBpZiAoYyA8IDB4ODApDQorICAgICAgY29udGludWU7DQorICAgIGlmIChjIDwgMHhDMCkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIGZvciAobnVtQWRkcyA9IDE7IG51bUFkZHMgPCA1OyBudW1BZGRzKyspDQorICAgICAgaWYgKGMgPCBrVXRmOExpbWl0c1tudW1BZGRzXSkNCisgICAgICAgIGJyZWFrOw0KKyAgICBVSW50MzIgdmFsdWUgPSAoYyAtIGtVdGY4TGltaXRzW251bUFkZHMgLSAxXSk7DQorDQorICAgIGRvDQorICAgIHsNCisgICAgICBCeXRlIGMyID0gKnNyYysrOw0KKyAgICAgIGlmIChjMiA8IDB4ODAgfHwgYzIgPj0gMHhDMCkNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICB2YWx1ZSA8PD0gNjsNCisgICAgICB2YWx1ZSB8PSAoYzIgLSAweDgwKTsNCisgICAgfQ0KKyAgICB3aGlsZSAoLS1udW1BZGRzKTsNCisgICAgDQorICAgIGlmICh2YWx1ZSA+PSAweDExMDAwMCkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICB9DQorfQ0KKw0KKw0KK3N0YXRpYyBCb29sIFV0ZjhfVG9fVXRmMTYod2NoYXJfdCAqZGVzdCwgc2l6ZV90ICpkZXN0TGVuLCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNMZW4pIHRocm93KCkNCit7DQorICBzaXplX3QgZGVzdFBvcyA9IDAsIHNyY1BvcyA9IDA7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBCeXRlIGM7DQorICAgIHVuc2lnbmVkIG51bUFkZHM7DQorICAgIGlmIChzcmNQb3MgPT0gc3JjTGVuKQ0KKyAgICB7DQorICAgICAgKmRlc3RMZW4gPSBkZXN0UG9zOw0KKyAgICAgIHJldHVybiBUcnVlOw0KKyAgICB9DQorICAgIGMgPSAoQnl0ZSlzcmNbc3JjUG9zKytdOw0KKw0KKyAgICBpZiAoYyA8IDB4ODApDQorICAgIHsNCisgICAgICBpZiAoZGVzdCkNCisgICAgICAgIGRlc3RbZGVzdFBvc10gPSAod2NoYXJfdCljOw0KKyAgICAgIGRlc3RQb3MrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoYyA8IDB4QzApDQorICAgICAgYnJlYWs7DQorICAgIGZvciAobnVtQWRkcyA9IDE7IG51bUFkZHMgPCA1OyBudW1BZGRzKyspDQorICAgICAgaWYgKGMgPCBrVXRmOExpbWl0c1tudW1BZGRzXSkNCisgICAgICAgIGJyZWFrOw0KKyAgICBVSW50MzIgdmFsdWUgPSAoYyAtIGtVdGY4TGltaXRzW251bUFkZHMgLSAxXSk7DQorDQorICAgIGRvDQorICAgIHsNCisgICAgICBCeXRlIGMyOw0KKyAgICAgIGlmIChzcmNQb3MgPT0gc3JjTGVuKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgYzIgPSAoQnl0ZSlzcmNbc3JjUG9zKytdOw0KKyAgICAgIGlmIChjMiA8IDB4ODAgfHwgYzIgPj0gMHhDMCkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIHZhbHVlIDw8PSA2Ow0KKyAgICAgIHZhbHVlIHw9IChjMiAtIDB4ODApOw0KKyAgICB9DQorICAgIHdoaWxlICgtLW51bUFkZHMpOw0KKyAgICANCisgICAgaWYgKHZhbHVlIDwgMHgxMDAwMCkNCisgICAgew0KKyAgICAgIGlmIChkZXN0KQ0KKyAgICAgICAgZGVzdFtkZXN0UG9zXSA9ICh3Y2hhcl90KXZhbHVlOw0KKyAgICAgIGRlc3RQb3MrKzsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICB2YWx1ZSAtPSAweDEwMDAwOw0KKyAgICAgIGlmICh2YWx1ZSA+PSAweDEwMDAwMCkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGlmIChkZXN0KQ0KKyAgICAgIHsNCisgICAgICAgIGRlc3RbZGVzdFBvcyArIDBdID0gKHdjaGFyX3QpKDB4RDgwMCArICh2YWx1ZSA+PiAxMCkpOw0KKyAgICAgICAgZGVzdFtkZXN0UG9zICsgMV0gPSAod2NoYXJfdCkoMHhEQzAwICsgKHZhbHVlICYgMHgzRkYpKTsNCisgICAgICB9DQorICAgICAgZGVzdFBvcyArPSAyOw0KKyAgICB9DQorICB9DQorICAqZGVzdExlbiA9IGRlc3RQb3M7DQorICByZXR1cm4gRmFsc2U7DQorfQ0KKw0KK3N0YXRpYyBCb29sIFV0ZjE2X1RvX1V0ZjgoY2hhciAqZGVzdCwgc2l6ZV90ICpkZXN0TGVuLCBjb25zdCB3Y2hhcl90ICpzcmMsIHNpemVfdCBzcmNMZW4pDQorew0KKyAgc2l6ZV90IGRlc3RQb3MgPSAwLCBzcmNQb3MgPSAwOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgdW5zaWduZWQgbnVtQWRkczsNCisgICAgVUludDMyIHZhbHVlOw0KKyAgICBpZiAoc3JjUG9zID09IHNyY0xlbikNCisgICAgew0KKyAgICAgICpkZXN0TGVuID0gZGVzdFBvczsNCisgICAgICByZXR1cm4gVHJ1ZTsNCisgICAgfQ0KKyAgICB2YWx1ZSA9IHNyY1tzcmNQb3MrK107DQorICAgIGlmICh2YWx1ZSA8IDB4ODApDQorICAgIHsNCisgICAgICBpZiAoZGVzdCkNCisgICAgICAgIGRlc3RbZGVzdFBvc10gPSAoY2hhcil2YWx1ZTsNCisgICAgICBkZXN0UG9zKys7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8IDB4RTAwMCkNCisgICAgew0KKyAgICAgIFVJbnQzMiBjMjsNCisgICAgICBpZiAodmFsdWUgPj0gMHhEQzAwIHx8IHNyY1BvcyA9PSBzcmNMZW4pDQorICAgICAgICBicmVhazsNCisgICAgICBjMiA9IHNyY1tzcmNQb3MrK107DQorICAgICAgaWYgKGMyIDwgMHhEQzAwIHx8IGMyID49IDB4RTAwMCkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIHZhbHVlID0gKCgodmFsdWUgLSAweEQ4MDApIDw8IDEwKSB8IChjMiAtIDB4REMwMCkpICsgMHgxMDAwMDsNCisgICAgfQ0KKyAgICBmb3IgKG51bUFkZHMgPSAxOyBudW1BZGRzIDwgNTsgbnVtQWRkcysrKQ0KKyAgICAgIGlmICh2YWx1ZSA8ICgoKFVJbnQzMikxKSA8PCAobnVtQWRkcyAqIDUgKyA2KSkpDQorICAgICAgICBicmVhazsNCisgICAgaWYgKGRlc3QpDQorICAgICAgZGVzdFtkZXN0UG9zXSA9IChjaGFyKShrVXRmOExpbWl0c1tudW1BZGRzIC0gMV0gKyAodmFsdWUgPj4gKDYgKiBudW1BZGRzKSkpOw0KKyAgICBkZXN0UG9zKys7DQorICAgIGRvDQorICAgIHsNCisgICAgICBudW1BZGRzLS07DQorICAgICAgaWYgKGRlc3QpDQorICAgICAgICBkZXN0W2Rlc3RQb3NdID0gKGNoYXIpKDB4ODAgKyAoKHZhbHVlID4+ICg2ICogbnVtQWRkcykpICYgMHgzRikpOw0KKyAgICAgIGRlc3RQb3MrKzsNCisgICAgfQ0KKyAgICB3aGlsZSAobnVtQWRkcyAhPSAwKTsNCisgIH0NCisgICpkZXN0TGVuID0gZGVzdFBvczsNCisgIHJldHVybiBGYWxzZTsNCit9DQorDQorYm9vbCBDb252ZXJ0VVRGOFRvVW5pY29kZShjb25zdCBBU3RyaW5nICZzcmMsIFVTdHJpbmcgJmRlc3QpDQorew0KKyAgZGVzdC5FbXB0eSgpOw0KKyAgc2l6ZV90IGRlc3RMZW4gPSAwOw0KKyAgVXRmOF9Ub19VdGYxNihOVUxMLCAmZGVzdExlbiwgc3JjLCBzcmMuTGVuKCkpOw0KKyAgQm9vbCByZXMgPSBVdGY4X1RvX1V0ZjE2KGRlc3QuR2V0QnVmZmVyKCh1bnNpZ25lZClkZXN0TGVuKSwgJmRlc3RMZW4sIHNyYywgc3JjLkxlbigpKTsNCisgIGRlc3QuUmVsZWFzZUJ1ZmZlcigodW5zaWduZWQpZGVzdExlbik7DQorICByZXR1cm4gcmVzID8gdHJ1ZSA6IGZhbHNlOw0KK30NCisNCitib29sIENvbnZlcnRVbmljb2RlVG9VVEY4KGNvbnN0IFVTdHJpbmcgJnNyYywgQVN0cmluZyAmZGVzdCkNCit7DQorICBkZXN0LkVtcHR5KCk7DQorICBzaXplX3QgZGVzdExlbiA9IDA7DQorICBVdGYxNl9Ub19VdGY4KE5VTEwsICZkZXN0TGVuLCBzcmMsIHNyYy5MZW4oKSk7DQorICBCb29sIHJlcyA9IFV0ZjE2X1RvX1V0ZjgoZGVzdC5HZXRCdWZmZXIoKHVuc2lnbmVkKWRlc3RMZW4pLCAmZGVzdExlbiwgc3JjLCBzcmMuTGVuKCkpOw0KKyAgZGVzdC5SZWxlYXNlQnVmZmVyKCh1bnNpZ25lZClkZXN0TGVuKTsNCisgIHJldHVybiByZXMgPyB0cnVlIDogZmFsc2U7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9VVEZDb252ZXJ0LmggYi9sem1hL0NQUC9Db21tb24vVVRGQ29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWI2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vVVRGQ29udmVydC5oCkBAIC0wLDAgKzEsMTIgQEAKKy8vIENvbW1vbi9VVEZDb252ZXJ0LmgNCisNCisjaWZuZGVmIF9fQ09NTU9OX1VURl9DT05WRVJUX0gNCisjZGVmaW5lIF9fQ09NTU9OX1VURl9DT05WRVJUX0gNCisNCisjaW5jbHVkZSAiTXlTdHJpbmcuaCINCisNCitib29sIENoZWNrVVRGOChjb25zdCBjaGFyICpzcmMpIHRocm93KCk7DQorYm9vbCBDb252ZXJ0VVRGOFRvVW5pY29kZShjb25zdCBBU3RyaW5nICZ1dGZTdHJpbmcsIFVTdHJpbmcgJnJlc3VsdFN0cmluZyk7DQorYm9vbCBDb252ZXJ0VW5pY29kZVRvVVRGOChjb25zdCBVU3RyaW5nICZ1bmljb2RlU3RyaW5nLCBBU3RyaW5nICZyZXN1bHRTdHJpbmcpOw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9XaWxkY2FyZC5jcHAgYi9sem1hL0NQUC9Db21tb24vV2lsZGNhcmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZjQ3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9Db21tb24vV2lsZGNhcmQuY3BwCkBAIC0wLDAgKzEsNjE1IEBACisvLyBDb21tb24vV2lsZGNhcmQuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJXaWxkY2FyZC5oIg0KKw0KK2Jvb2wgZ19DYXNlU2Vuc2l0aXZlID0NCisgICNpZmRlZiBfV0lOMzINCisgICAgZmFsc2U7DQorICAjZWxzZQ0KKyAgICB0cnVlOw0KKyAgI2VuZGlmDQorDQorDQorYm9vbCBJc1BhdGgxUHJlZml4ZWRCeVBhdGgyKGNvbnN0IHdjaGFyX3QgKnMxLCBjb25zdCB3Y2hhcl90ICpzMikNCit7DQorICBpZiAoZ19DYXNlU2Vuc2l0aXZlKQ0KKyAgew0KKyAgICBmb3IgKDs7KQ0KKyAgICB7DQorICAgICAgd2NoYXJfdCBjMiA9ICpzMisrOyBpZiAoYzIgPT0gMCkgcmV0dXJuIHRydWU7DQorICAgICAgd2NoYXJfdCBjMSA9ICpzMSsrOw0KKyAgICAgIGlmIChNeUNoYXJVcHBlcihjMSkgIT0NCisgICAgICAgICAgTXlDaGFyVXBwZXIoYzIpKQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorDQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICB3Y2hhcl90IGMyID0gKnMyKys7IGlmIChjMiA9PSAwKSByZXR1cm4gdHJ1ZTsNCisgICAgd2NoYXJfdCBjMSA9ICpzMSsrOyBpZiAoYzEgIT0gYzIpIHJldHVybiBmYWxzZTsNCisgIH0NCit9DQorDQoraW50IENvbXBhcmVGaWxlTmFtZXMoY29uc3Qgd2NoYXJfdCAqczEsIGNvbnN0IHdjaGFyX3QgKnMyKSBTVFJJTkdfVU5JQ09ERV9USFJPVw0KK3sNCisgIGlmIChnX0Nhc2VTZW5zaXRpdmUpDQorICAgIHJldHVybiB3Y3NjbXAoczEsIHMyKTsNCisgIHJldHVybiBNeVN0cmluZ0NvbXBhcmVOb0Nhc2UoczEsIHMyKTsNCit9DQorDQorI2lmbmRlZiBVU0VfVU5JQ09ERV9GU1RSSU5HDQoraW50IENvbXBhcmVGaWxlTmFtZXMoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQ0KK3sNCisgIGlmIChnX0Nhc2VTZW5zaXRpdmUpDQorICAgIHJldHVybiB3Y3NjbXAoZnMydXMoczEpLCBmczJ1cyhzMikpOw0KKyAgcmV0dXJuIE15U3RyaW5nQ29tcGFyZU5vQ2FzZShmczJ1cyhzMSksIGZzMnVzKHMyKSk7DQorfQ0KKyNlbmRpZg0KKw0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gdGhpcyBmdW5jdGlvbiBjb21wYXJlcyBuYW1lIHdpdGggbWFzaw0KKy8vID8gLSBhbnkgY2hhcg0KKy8vICogLSBhbnkgY2hhciBvciBlbXB0eQ0KKw0KK3N0YXRpYyBib29sIEVuaGFuY2VkTWFza1Rlc3QoY29uc3Qgd2NoYXJfdCAqbWFzaywgY29uc3Qgd2NoYXJfdCAqbmFtZSkNCit7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICB3Y2hhcl90IG0gPSAqbWFzazsNCisgICAgd2NoYXJfdCBjID0gKm5hbWU7DQorICAgIGlmIChtID09IDApDQorICAgICAgcmV0dXJuIChjID09IDApOw0KKyAgICBpZiAobSA9PSAnKicpDQorICAgIHsNCisgICAgICBpZiAoRW5oYW5jZWRNYXNrVGVzdChtYXNrICsgMSwgbmFtZSkpDQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICBpZiAoYyA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGlmIChtID09ICc/JykNCisgICAgICB7DQorICAgICAgICBpZiAoYyA9PSAwKQ0KKyAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKG0gIT0gYykNCisgICAgICAgIGlmIChnX0Nhc2VTZW5zaXRpdmUgfHwgTXlDaGFyVXBwZXIobSkgIT0gTXlDaGFyVXBwZXIoYykpDQorICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICBtYXNrKys7DQorICAgIH0NCisgICAgbmFtZSsrOw0KKyAgfQ0KK30NCisNCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIFNwbGl0cyBwYXRoIHRvIHN0cmluZ3MNCisNCit2b2lkIFNwbGl0UGF0aFRvUGFydHMoY29uc3QgVVN0cmluZyAmcGF0aCwgVVN0cmluZ1ZlY3RvciAmcGF0aFBhcnRzKQ0KK3sNCisgIHBhdGhQYXJ0cy5DbGVhcigpOw0KKyAgdW5zaWduZWQgbGVuID0gcGF0aC5MZW4oKTsNCisgIGlmIChsZW4gPT0gMCkNCisgICAgcmV0dXJuOw0KKyAgVVN0cmluZyBuYW1lOw0KKyAgdW5zaWduZWQgcHJldiA9IDA7DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspDQorICAgIGlmIChJc0NoYXJEaXJMaW1pdGVyKHBhdGhbaV0pKQ0KKyAgICB7DQorICAgICAgbmFtZS5TZXRGcm9tKHBhdGguUHRyKHByZXYpLCBpIC0gcHJldik7DQorICAgICAgcGF0aFBhcnRzLkFkZChuYW1lKTsNCisgICAgICBwcmV2ID0gaSArIDE7DQorICAgIH0NCisgIG5hbWUuU2V0RnJvbShwYXRoLlB0cihwcmV2KSwgbGVuIC0gcHJldik7DQorICBwYXRoUGFydHMuQWRkKG5hbWUpOw0KK30NCisNCit2b2lkIFNwbGl0UGF0aFRvUGFydHNfMihjb25zdCBVU3RyaW5nICZwYXRoLCBVU3RyaW5nICZkaXJQcmVmaXgsIFVTdHJpbmcgJm5hbWUpDQorew0KKyAgY29uc3Qgd2NoYXJfdCAqc3RhcnQgPSBwYXRoOw0KKyAgY29uc3Qgd2NoYXJfdCAqcCA9IHN0YXJ0ICsgcGF0aC5MZW4oKTsNCisgIGZvciAoOyBwICE9IHN0YXJ0OyBwLS0pDQorICAgIGlmIChJc0NoYXJEaXJMaW1pdGVyKCoocCAtIDEpKSkNCisgICAgICBicmVhazsNCisgIGRpclByZWZpeC5TZXRGcm9tKHBhdGgsICh1bnNpZ25lZCkocCAtIHN0YXJ0KSk7DQorICBuYW1lID0gcDsNCit9DQorDQordm9pZCBTcGxpdFBhdGhUb1BhcnRzX1NtYXJ0KGNvbnN0IFVTdHJpbmcgJnBhdGgsIFVTdHJpbmcgJmRpclByZWZpeCwgVVN0cmluZyAmbmFtZSkNCit7DQorICBjb25zdCB3Y2hhcl90ICpzdGFydCA9IHBhdGg7DQorICBjb25zdCB3Y2hhcl90ICpwID0gc3RhcnQgKyBwYXRoLkxlbigpOw0KKyAgaWYgKHAgIT0gc3RhcnQpDQorICB7DQorICAgIGlmIChJc0NoYXJEaXJMaW1pdGVyKCoocCAtIDEpKSkNCisgICAgICBwLS07DQorICAgIGZvciAoOyBwICE9IHN0YXJ0OyBwLS0pDQorICAgICAgaWYgKElzQ2hhckRpckxpbWl0ZXIoKihwIC0gMSkpKQ0KKyAgICAgICAgYnJlYWs7DQorICB9DQorICBkaXJQcmVmaXguU2V0RnJvbShwYXRoLCAodW5zaWduZWQpKHAgLSBzdGFydCkpOw0KKyAgbmFtZSA9IHA7DQorfQ0KKw0KK1VTdHJpbmcgRXh0cmFjdERpclByZWZpeEZyb21QYXRoKGNvbnN0IFVTdHJpbmcgJnBhdGgpDQorew0KKyAgY29uc3Qgd2NoYXJfdCAqc3RhcnQgPSBwYXRoOw0KKyAgY29uc3Qgd2NoYXJfdCAqcCA9IHN0YXJ0ICsgcGF0aC5MZW4oKTsNCisgIGZvciAoOyBwICE9IHN0YXJ0OyBwLS0pDQorICAgIGlmIChJc0NoYXJEaXJMaW1pdGVyKCoocCAtIDEpKSkNCisgICAgICBicmVhazsNCisgIHJldHVybiBwYXRoLkxlZnQoKHVuc2lnbmVkKShwIC0gc3RhcnQpKTsNCit9DQorDQorVVN0cmluZyBFeHRyYWN0RmlsZU5hbWVGcm9tUGF0aChjb25zdCBVU3RyaW5nICZwYXRoKQ0KK3sNCisgIGNvbnN0IHdjaGFyX3QgKnN0YXJ0ID0gcGF0aDsNCisgIGNvbnN0IHdjaGFyX3QgKnAgPSBzdGFydCArIHBhdGguTGVuKCk7DQorICBmb3IgKDsgcCAhPSBzdGFydDsgcC0tKQ0KKyAgICBpZiAoSXNDaGFyRGlyTGltaXRlcigqKHAgLSAxKSkpDQorICAgICAgYnJlYWs7DQorICByZXR1cm4gcDsNCit9DQorDQorDQorYm9vbCBEb2VzV2lsZGNhcmRNYXRjaE5hbWUoY29uc3QgVVN0cmluZyAmbWFzaywgY29uc3QgVVN0cmluZyAmbmFtZSkNCit7DQorICByZXR1cm4gRW5oYW5jZWRNYXNrVGVzdChtYXNrLCBuYW1lKTsNCit9DQorDQorYm9vbCBEb2VzTmFtZUNvbnRhaW5XaWxkY2FyZChjb25zdCBVU3RyaW5nICZwYXRoKQ0KK3sNCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwYXRoLkxlbigpOyBpKyspDQorICB7DQorICAgIHdjaGFyX3QgYyA9IHBhdGhbaV07DQorICAgIGlmIChjID09ICcqJyB8fCBjID09ICc/JykNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorDQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScNCisvLyBOV2lsZGNhcmQNCisNCituYW1lc3BhY2UgTldpbGRjYXJkIHsNCisNCisNCisjaWZkZWYgX1dJTjMyDQorYm9vbCBJc0RyaXZlQ29sb25OYW1lKGNvbnN0IHdjaGFyX3QgKnMpDQorew0KKyAgd2NoYXJfdCBjID0gc1swXTsNCisgIHJldHVybiBjICE9IDAgJiYgc1sxXSA9PSAnOicgJiYgc1syXSA9PSAwICYmIChjID49ICdhJyAmJiBjIDw9ICd6JyB8fCBjID49ICdBJyAmJiBjIDw9ICdaJyk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qDQorDQorTSA9IE1hc2tQYXJ0cy5TaXplKCk7DQorTiA9IFRlc3ROYW1lUGFydHMuU2l6ZSgpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgIERpcg0KK0ZvckZpbGUgICAgIHJlYyAgIE08PU4gIFtOLU0sIE4pICAgICAgICAgICAgICAgICAgICAgICAgICAtDQorIUZvckRpciAgbm9ucmVjICAgTT1OICAgWzAsIE0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0NCisgDQorRm9yRGlyICAgICAgcmVjICAgTTxOICAgWzAsIE0pIC4uLiBbTi1NLTEsIE4tMSkgIHNhbWUgYXMgRm9yQm90aC1GaWxlDQorIUZvckZpbGUgbm9ucmVjICAgICAgICAgWzAsIE0pICAgICAgICAgICAgICAgICAgIHNhbWUgYXMgRm9yQm90aC1GaWxlDQorDQorRm9yRmlsZSAgICAgcmVjICAgbTw9TiAgWzAsIE0pIC4uLiBbTi1NLCBOKSAgICAgIHNhbWUgYXMgRm9yQm90aC1GaWxlDQorRm9yRGlyICAgbm9ucmVjICAgICAgICAgWzAsIE0pICAgICAgICAgICAgICAgICAgIHNhbWUgYXMgRm9yQm90aC1GaWxlDQorDQorKi8NCisNCitib29sIENJdGVtOjpBcmVBbGxBbGxvd2VkKCkgY29uc3QNCit7DQorICByZXR1cm4gRm9yRmlsZSAmJiBGb3JEaXIgJiYgV2lsZGNhcmRNYXRjaGluZyAmJiBQYXRoUGFydHMuU2l6ZSgpID09IDEgJiYgUGF0aFBhcnRzLkZyb250KCkgPT0gTCIqIjsNCit9DQorDQorYm9vbCBDSXRlbTo6Q2hlY2tQYXRoKGNvbnN0IFVTdHJpbmdWZWN0b3IgJnBhdGhQYXJ0cywgYm9vbCBpc0ZpbGUpIGNvbnN0DQorew0KKyAgaWYgKCFpc0ZpbGUgJiYgIUZvckRpcikNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgaW50IGRlbHRhID0gKGludClwYXRoUGFydHMuU2l6ZSgpIC0gKGludClQYXRoUGFydHMuU2l6ZSgpOw0KKyAgaWYgKGRlbHRhIDwgMCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgaW50IHN0YXJ0ID0gMDsNCisgIGludCBmaW5pc2ggPSAwOw0KKyAgDQorICBpZiAoaXNGaWxlKQ0KKyAgew0KKyAgICBpZiAoIUZvckRpcikNCisgICAgew0KKyAgICAgIGlmIChSZWN1cnNpdmUpDQorICAgICAgICBzdGFydCA9IGRlbHRhOw0KKyAgICAgIGVsc2UgaWYgKGRlbHRhICE9MCkNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgICBpZiAoIUZvckZpbGUgJiYgZGVsdGEgPT0gMCkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICANCisgIGlmIChSZWN1cnNpdmUpDQorICB7DQorICAgIGZpbmlzaCA9IGRlbHRhOw0KKyAgICBpZiAoaXNGaWxlICYmICFGb3JGaWxlKQ0KKyAgICAgIGZpbmlzaCA9IGRlbHRhIC0gMTsNCisgIH0NCisgIA0KKyAgZm9yIChpbnQgZCA9IHN0YXJ0OyBkIDw9IGZpbmlzaDsgZCsrKQ0KKyAgew0KKyAgICB1bnNpZ25lZCBpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgUGF0aFBhcnRzLlNpemUoKTsgaSsrKQ0KKyAgICB7DQorICAgICAgaWYgKFdpbGRjYXJkTWF0Y2hpbmcpDQorICAgICAgew0KKyAgICAgICAgaWYgKCFEb2VzV2lsZGNhcmRNYXRjaE5hbWUoUGF0aFBhcnRzW2ldLCBwYXRoUGFydHNbaSArIGRdKSkNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisgICAgICB7DQorICAgICAgICBpZiAoQ29tcGFyZUZpbGVOYW1lcyhQYXRoUGFydHNbaV0sIHBhdGhQYXJ0c1tpICsgZF0pICE9IDApDQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaSA9PSBQYXRoUGFydHMuU2l6ZSgpKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIENDZW5zb3JOb2RlOjpBcmVBbGxBbGxvd2VkKCkgY29uc3QNCit7DQorICBpZiAoIU5hbWUuSXNFbXB0eSgpIHx8DQorICAgICAgIVN1Yk5vZGVzLklzRW1wdHkoKSB8fA0KKyAgICAgICFFeGNsdWRlSXRlbXMuSXNFbXB0eSgpIHx8DQorICAgICAgSW5jbHVkZUl0ZW1zLlNpemUoKSAhPSAxKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICByZXR1cm4gSW5jbHVkZUl0ZW1zLkZyb250KCkuQXJlQWxsQWxsb3dlZCgpOw0KK30NCisNCitpbnQgQ0NlbnNvck5vZGU6OkZpbmRTdWJOb2RlKGNvbnN0IFVTdHJpbmcgJm5hbWUpIGNvbnN0DQorew0KKyAgRk9SX1ZFQ1RPUiAoaSwgU3ViTm9kZXMpDQorICAgIGlmIChDb21wYXJlRmlsZU5hbWVzKFN1Yk5vZGVzW2ldLk5hbWUsIG5hbWUpID09IDApDQorICAgICAgcmV0dXJuIGk7DQorICByZXR1cm4gLTE7DQorfQ0KKw0KK3ZvaWQgQ0NlbnNvck5vZGU6OkFkZEl0ZW1TaW1wbGUoYm9vbCBpbmNsdWRlLCBDSXRlbSAmaXRlbSkNCit7DQorICBpZiAoaW5jbHVkZSkNCisgICAgSW5jbHVkZUl0ZW1zLkFkZChpdGVtKTsNCisgIGVsc2UNCisgICAgRXhjbHVkZUl0ZW1zLkFkZChpdGVtKTsNCit9DQorDQordm9pZCBDQ2Vuc29yTm9kZTo6QWRkSXRlbShib29sIGluY2x1ZGUsIENJdGVtICZpdGVtKQ0KK3sNCisgIGlmIChpdGVtLlBhdGhQYXJ0cy5TaXplKCkgPD0gMSkNCisgIHsNCisgICAgaWYgKGl0ZW0uUGF0aFBhcnRzLlNpemUoKSAhPSAwICYmIGl0ZW0uV2lsZGNhcmRNYXRjaGluZykNCisgICAgew0KKyAgICAgIGlmICghRG9lc05hbWVDb250YWluV2lsZGNhcmQoaXRlbS5QYXRoUGFydHMuRnJvbnQoKSkpDQorICAgICAgICBpdGVtLldpbGRjYXJkTWF0Y2hpbmcgPSBmYWxzZTsNCisgICAgfQ0KKyAgICBBZGRJdGVtU2ltcGxlKGluY2x1ZGUsIGl0ZW0pOw0KKyAgICByZXR1cm47DQorICB9DQorICBjb25zdCBVU3RyaW5nICZmcm9udCA9IGl0ZW0uUGF0aFBhcnRzLkZyb250KCk7DQorICANCisgIC8vIFdlIGNhbid0IGlnbm9yZSB3aWxkY2FyZCwgc2luY2Ugd2UgZG9uJ3QgYWxsb3cgd2lsZGNhcmQgaW4gU3ViTm9kZXNbXS5OYW1lDQorICAvLyBpZiAoaXRlbS5XaWxkY2FyZCkNCisgIGlmIChEb2VzTmFtZUNvbnRhaW5XaWxkY2FyZChmcm9udCkpDQorICB7DQorICAgIEFkZEl0ZW1TaW1wbGUoaW5jbHVkZSwgaXRlbSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludCBpbmRleCA9IEZpbmRTdWJOb2RlKGZyb250KTsNCisgIGlmIChpbmRleCA8IDApDQorICAgIGluZGV4ID0gU3ViTm9kZXMuQWRkKENDZW5zb3JOb2RlKGZyb250LCB0aGlzKSk7DQorICBpdGVtLlBhdGhQYXJ0cy5EZWxldGUoMCk7DQorICBTdWJOb2Rlc1tpbmRleF0uQWRkSXRlbShpbmNsdWRlLCBpdGVtKTsNCit9DQorDQordm9pZCBDQ2Vuc29yTm9kZTo6QWRkSXRlbShib29sIGluY2x1ZGUsIGNvbnN0IFVTdHJpbmcgJnBhdGgsIGJvb2wgcmVjdXJzaXZlLCBib29sIGZvckZpbGUsIGJvb2wgZm9yRGlyLCBib29sIHdpbGRjYXJkTWF0Y2hpbmcpDQorew0KKyAgQ0l0ZW0gaXRlbTsNCisgIFNwbGl0UGF0aFRvUGFydHMocGF0aCwgaXRlbS5QYXRoUGFydHMpOw0KKyAgaXRlbS5SZWN1cnNpdmUgPSByZWN1cnNpdmU7DQorICBpdGVtLkZvckZpbGUgPSBmb3JGaWxlOw0KKyAgaXRlbS5Gb3JEaXIgPSBmb3JEaXI7DQorICBpdGVtLldpbGRjYXJkTWF0Y2hpbmcgPSB3aWxkY2FyZE1hdGNoaW5nOw0KKyAgQWRkSXRlbShpbmNsdWRlLCBpdGVtKTsNCit9DQorDQorYm9vbCBDQ2Vuc29yTm9kZTo6TmVlZENoZWNrU3ViRGlycygpIGNvbnN0DQorew0KKyAgRk9SX1ZFQ1RPUiAoaSwgSW5jbHVkZUl0ZW1zKQ0KKyAgew0KKyAgICBjb25zdCBDSXRlbSAmaXRlbSA9IEluY2x1ZGVJdGVtc1tpXTsNCisgICAgaWYgKGl0ZW0uUmVjdXJzaXZlIHx8IGl0ZW0uUGF0aFBhcnRzLlNpemUoKSA+IDEpDQorICAgICAgcmV0dXJuIHRydWU7DQorICB9DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wgQ0NlbnNvck5vZGU6OkFyZVRoZXJlSW5jbHVkZUl0ZW1zKCkgY29uc3QNCit7DQorICBpZiAoSW5jbHVkZUl0ZW1zLlNpemUoKSA+IDApDQorICAgIHJldHVybiB0cnVlOw0KKyAgRk9SX1ZFQ1RPUiAoaSwgU3ViTm9kZXMpDQorICAgIGlmIChTdWJOb2Rlc1tpXS5BcmVUaGVyZUluY2x1ZGVJdGVtcygpKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIENDZW5zb3JOb2RlOjpDaGVja1BhdGhDdXJyZW50KGJvb2wgaW5jbHVkZSwgY29uc3QgVVN0cmluZ1ZlY3RvciAmcGF0aFBhcnRzLCBib29sIGlzRmlsZSkgY29uc3QNCit7DQorICBjb25zdCBDT2JqZWN0VmVjdG9yPENJdGVtPiAmaXRlbXMgPSBpbmNsdWRlID8gSW5jbHVkZUl0ZW1zIDogRXhjbHVkZUl0ZW1zOw0KKyAgRk9SX1ZFQ1RPUiAoaSwgaXRlbXMpDQorICAgIGlmIChpdGVtc1tpXS5DaGVja1BhdGgocGF0aFBhcnRzLCBpc0ZpbGUpKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIENDZW5zb3JOb2RlOjpDaGVja1BhdGhWZWN0KGNvbnN0IFVTdHJpbmdWZWN0b3IgJnBhdGhQYXJ0cywgYm9vbCBpc0ZpbGUsIGJvb2wgJmluY2x1ZGUpIGNvbnN0DQorew0KKyAgaWYgKENoZWNrUGF0aEN1cnJlbnQoZmFsc2UsIHBhdGhQYXJ0cywgaXNGaWxlKSkNCisgIHsNCisgICAgaW5jbHVkZSA9IGZhbHNlOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIGluY2x1ZGUgPSB0cnVlOw0KKyAgYm9vbCBmaW5kZWQgPSBDaGVja1BhdGhDdXJyZW50KHRydWUsIHBhdGhQYXJ0cywgaXNGaWxlKTsNCisgIGlmIChwYXRoUGFydHMuU2l6ZSgpIDw9IDEpDQorICAgIHJldHVybiBmaW5kZWQ7DQorICBpbnQgaW5kZXggPSBGaW5kU3ViTm9kZShwYXRoUGFydHMuRnJvbnQoKSk7DQorICBpZiAoaW5kZXggPj0gMCkNCisgIHsNCisgICAgVVN0cmluZ1ZlY3RvciBwYXRoUGFydHMyID0gcGF0aFBhcnRzOw0KKyAgICBwYXRoUGFydHMyLkRlbGV0ZSgwKTsNCisgICAgaWYgKFN1Yk5vZGVzW2luZGV4XS5DaGVja1BhdGhWZWN0KHBhdGhQYXJ0czIsIGlzRmlsZSwgaW5jbHVkZSkpDQorICAgICAgcmV0dXJuIHRydWU7DQorICB9DQorICByZXR1cm4gZmluZGVkOw0KK30NCisNCitib29sIENDZW5zb3JOb2RlOjpDaGVja1BhdGgyKGJvb2wgaXNBbHRTdHJlYW0sIGNvbnN0IFVTdHJpbmcgJnBhdGgsIGJvb2wgaXNGaWxlLCBib29sICZpbmNsdWRlKSBjb25zdA0KK3sNCisgIFVTdHJpbmdWZWN0b3IgcGF0aFBhcnRzOw0KKyAgU3BsaXRQYXRoVG9QYXJ0cyhwYXRoLCBwYXRoUGFydHMpOw0KKyAgaWYgKENoZWNrUGF0aFZlY3QocGF0aFBhcnRzLCBpc0ZpbGUsIGluY2x1ZGUpKQ0KKyAgew0KKyAgICBpZiAoIWluY2x1ZGUgfHwgIWlzQWx0U3RyZWFtKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgaWYgKGlzQWx0U3RyZWFtICYmICFwYXRoUGFydHMuSXNFbXB0eSgpKQ0KKyAgew0KKyAgICBVU3RyaW5nICZiYWNrID0gcGF0aFBhcnRzLkJhY2soKTsNCisgICAgaW50IHBvcyA9IGJhY2suRmluZChMJzonKTsNCisgICAgaWYgKHBvcyA+IDApDQorICAgIHsNCisgICAgICBiYWNrLkRlbGV0ZUZyb20ocG9zKTsNCisgICAgICByZXR1cm4gQ2hlY2tQYXRoVmVjdChwYXRoUGFydHMsIGlzRmlsZSwgaW5jbHVkZSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbCBDQ2Vuc29yTm9kZTo6Q2hlY2tQYXRoKGJvb2wgaXNBbHRTdHJlYW0sIGNvbnN0IFVTdHJpbmcgJnBhdGgsIGJvb2wgaXNGaWxlKSBjb25zdA0KK3sNCisgIGJvb2wgaW5jbHVkZTsNCisgIGlmIChDaGVja1BhdGgyKGlzQWx0U3RyZWFtLCBwYXRoLCBpc0ZpbGUsIGluY2x1ZGUpKQ0KKyAgICByZXR1cm4gaW5jbHVkZTsNCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbCBDQ2Vuc29yTm9kZTo6Q2hlY2tQYXRoVG9Sb290KGJvb2wgaW5jbHVkZSwgVVN0cmluZ1ZlY3RvciAmcGF0aFBhcnRzLCBib29sIGlzRmlsZSkgY29uc3QNCit7DQorICBpZiAoQ2hlY2tQYXRoQ3VycmVudChpbmNsdWRlLCBwYXRoUGFydHMsIGlzRmlsZSkpDQorICAgIHJldHVybiB0cnVlOw0KKyAgaWYgKFBhcmVudCA9PSAwKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBwYXRoUGFydHMuSW5zZXJ0KDAsIE5hbWUpOw0KKyAgcmV0dXJuIFBhcmVudC0+Q2hlY2tQYXRoVG9Sb290KGluY2x1ZGUsIHBhdGhQYXJ0cywgaXNGaWxlKTsNCit9DQorDQorLyoNCitib29sIENDZW5zb3JOb2RlOjpDaGVja1BhdGhUb1Jvb3QoYm9vbCBpbmNsdWRlLCBjb25zdCBVU3RyaW5nICZwYXRoLCBib29sIGlzRmlsZSkgY29uc3QNCit7DQorICBVU3RyaW5nVmVjdG9yIHBhdGhQYXJ0czsNCisgIFNwbGl0UGF0aFRvUGFydHMocGF0aCwgcGF0aFBhcnRzKTsNCisgIHJldHVybiBDaGVja1BhdGhUb1Jvb3QoaW5jbHVkZSwgcGF0aFBhcnRzLCBpc0ZpbGUpOw0KK30NCisqLw0KKw0KK3ZvaWQgQ0NlbnNvck5vZGU6OkFkZEl0ZW0yKGJvb2wgaW5jbHVkZSwgY29uc3QgVVN0cmluZyAmcGF0aCwgYm9vbCByZWN1cnNpdmUsIGJvb2wgd2lsZGNhcmRNYXRjaGluZykNCit7DQorICBpZiAocGF0aC5Jc0VtcHR5KCkpDQorICAgIHJldHVybjsNCisgIGJvb2wgZm9yRmlsZSA9IHRydWU7DQorICBib29sIGZvckZvbGRlciA9IHRydWU7DQorICBVU3RyaW5nIHBhdGgyID0gcGF0aDsNCisgIGlmIChJc0NoYXJEaXJMaW1pdGVyKHBhdGguQmFjaygpKSkNCisgIHsNCisgICAgcGF0aDIuRGVsZXRlQmFjaygpOw0KKyAgICBmb3JGaWxlID0gZmFsc2U7DQorICB9DQorICBBZGRJdGVtKGluY2x1ZGUsIHBhdGgyLCByZWN1cnNpdmUsIGZvckZpbGUsIGZvckZvbGRlciwgd2lsZGNhcmRNYXRjaGluZyk7DQorfQ0KKw0KK3ZvaWQgQ0NlbnNvck5vZGU6OkV4dGVuZEV4Y2x1ZGUoY29uc3QgQ0NlbnNvck5vZGUgJmZyb21Ob2RlcykNCit7DQorICBFeGNsdWRlSXRlbXMgKz0gZnJvbU5vZGVzLkV4Y2x1ZGVJdGVtczsNCisgIEZPUl9WRUNUT1IgKGksIGZyb21Ob2Rlcy5TdWJOb2RlcykNCisgIHsNCisgICAgY29uc3QgQ0NlbnNvck5vZGUgJm5vZGUgPSBmcm9tTm9kZXMuU3ViTm9kZXNbaV07DQorICAgIGludCBzdWJOb2RlSW5kZXggPSBGaW5kU3ViTm9kZShub2RlLk5hbWUpOw0KKyAgICBpZiAoc3ViTm9kZUluZGV4IDwgMCkNCisgICAgICBzdWJOb2RlSW5kZXggPSBTdWJOb2Rlcy5BZGQoQ0NlbnNvck5vZGUobm9kZS5OYW1lLCB0aGlzKSk7DQorICAgIFN1Yk5vZGVzW3N1Yk5vZGVJbmRleF0uRXh0ZW5kRXhjbHVkZShub2RlKTsNCisgIH0NCit9DQorDQoraW50IENDZW5zb3I6OkZpbmRQcmVmaXgoY29uc3QgVVN0cmluZyAmcHJlZml4KSBjb25zdA0KK3sNCisgIEZPUl9WRUNUT1IgKGksIFBhaXJzKQ0KKyAgICBpZiAoQ29tcGFyZUZpbGVOYW1lcyhQYWlyc1tpXS5QcmVmaXgsIHByZWZpeCkgPT0gMCkNCisgICAgICByZXR1cm4gaTsNCisgIHJldHVybiAtMTsNCit9DQorDQordm9pZCBDQ2Vuc29yOjpBZGRJdGVtKEVDZW5zb3JQYXRoTW9kZSBwYXRoTW9kZSwgYm9vbCBpbmNsdWRlLCBjb25zdCBVU3RyaW5nICZwYXRoLCBib29sIHJlY3Vyc2l2ZSwgYm9vbCB3aWxkY2FyZE1hdGNoaW5nKQ0KK3sNCisgIFVTdHJpbmdWZWN0b3IgcGF0aFBhcnRzOw0KKyAgaWYgKHBhdGguSXNFbXB0eSgpKQ0KKyAgICB0aHJvdyAiRW1wdHkgZmlsZSBwYXRoIjsNCisgIFNwbGl0UGF0aFRvUGFydHMocGF0aCwgcGF0aFBhcnRzKTsNCisgIGJvb2wgZm9yRmlsZSA9IHRydWU7DQorICBpZiAocGF0aFBhcnRzLkJhY2soKS5Jc0VtcHR5KCkpDQorICB7DQorICAgIGZvckZpbGUgPSBmYWxzZTsNCisgICAgcGF0aFBhcnRzLkRlbGV0ZUJhY2soKTsNCisgIH0NCisgIA0KKyAgVVN0cmluZyBwcmVmaXg7DQorICANCisgIGlmIChwYXRoTW9kZSAhPSBrX0Fic1BhdGgpDQorICB7DQorICAgIGNvbnN0IFVTdHJpbmcgJmZyb250ID0gcGF0aFBhcnRzLkZyb250KCk7DQorICAgIGJvb2wgaXNBYnMgPSBmYWxzZTsNCisgICAgDQorICAgIGlmIChmcm9udC5Jc0VtcHR5KCkpDQorICAgICAgaXNBYnMgPSB0cnVlOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAjaWZkZWYgX1dJTjMyDQorICAgICAgDQorICAgICAgaWYgKElzRHJpdmVDb2xvbk5hbWUoZnJvbnQpKQ0KKyAgICAgICAgaXNBYnMgPSB0cnVlOw0KKyAgICAgIGVsc2UNCisgICAgICANCisgICAgICAjZW5kaWYNCisgICAgICANCisgICAgICAgIEZPUl9WRUNUT1IgKGksIHBhdGhQYXJ0cykNCisgICAgICAgIHsNCisgICAgICAgICAgY29uc3QgVVN0cmluZyAmcGFydCA9IHBhdGhQYXJ0c1tpXTsNCisgICAgICAgICAgaWYgKHBhcnQgPT0gTCIuLiIgfHwgcGFydCA9PSBMIi4iKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgaXNBYnMgPSB0cnVlOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHVuc2lnbmVkIG51bUFic1BhcnRzID0gMDsNCisgICAgaWYgKGlzQWJzKQ0KKyAgICAgIGlmIChwYXRoUGFydHMuU2l6ZSgpID4gMSkNCisgICAgICAgIG51bUFic1BhcnRzID0gcGF0aFBhcnRzLlNpemUoKSAtIDE7DQorICAgICAgZWxzZQ0KKyAgICAgICAgbnVtQWJzUGFydHMgPSAxOw0KKyAgICAgIA0KKyAgICAjaWZkZWYgX1dJTjMyDQorICAgIA0KKyAgICAvLyBcXD9cIGNhc2UNCisgICAgaWYgKG51bUFic1BhcnRzID49IDMpDQorICAgIHsNCisgICAgICBpZiAocGF0aFBhcnRzWzBdLklzRW1wdHkoKSAmJg0KKyAgICAgICAgICBwYXRoUGFydHNbMV0uSXNFbXB0eSgpICYmDQorICAgICAgICAgIHBhdGhQYXJ0c1syXSA9PSBMIj8iKQ0KKyAgICAgIHsNCisgICAgICAgIHByZWZpeCA9DQorICAgICAgICAgICAgV1NUUklOR19QQVRIX1NFUEFSQVRPUg0KKyAgICAgICAgICAgIFdTVFJJTkdfUEFUSF9TRVBBUkFUT1IgTCI/Ig0KKyAgICAgICAgICAgIFdTVFJJTkdfUEFUSF9TRVBBUkFUT1I7DQorICAgICAgICBudW1BYnNQYXJ0cyAtPSAzOw0KKyAgICAgICAgcGF0aFBhcnRzLkRlbGV0ZUZyb250YWwoMyk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICAjZW5kaWYNCisgICAgDQorICAgIGlmIChudW1BYnNQYXJ0cyA+IDEgJiYgcGF0aE1vZGUgPT0ga19GdWxsUGF0aCkNCisgICAgICBudW1BYnNQYXJ0cyA9IDE7DQorDQorICAgIC8vIFdlIGNhbid0IGlnbm9yZSB3aWxkY2FyZCwgc2luY2Ugd2UgZG9uJ3QgYWxsb3cgd2lsZGNhcmQgaW4gU3ViTm9kZXNbXS5OYW1lDQorICAgIC8vIGlmICh3aWxkY2FyZE1hdGNoaW5nKQ0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtQWJzUGFydHM7IGkrKykNCisgICAgew0KKyAgICAgIHsNCisgICAgICAgIGNvbnN0IFVTdHJpbmcgJmZyb250ID0gcGF0aFBhcnRzLkZyb250KCk7DQorICAgICAgICBpZiAoRG9lc05hbWVDb250YWluV2lsZGNhcmQoZnJvbnQpKQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIHByZWZpeCArPSBmcm9udDsNCisgICAgICAgIHByZWZpeCArPSBXQ0hBUl9QQVRIX1NFUEFSQVRPUjsNCisgICAgICB9DQorICAgICAgcGF0aFBhcnRzLkRlbGV0ZSgwKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaW50IGluZGV4ID0gRmluZFByZWZpeChwcmVmaXgpOw0KKyAgaWYgKGluZGV4IDwgMCkNCisgICAgaW5kZXggPSBQYWlycy5BZGQoQ1BhaXIocHJlZml4KSk7DQorDQorICBDSXRlbSBpdGVtOw0KKyAgaXRlbS5QYXRoUGFydHMgPSBwYXRoUGFydHM7DQorICBpdGVtLkZvckRpciA9IHRydWU7DQorICBpdGVtLkZvckZpbGUgPSBmb3JGaWxlOw0KKyAgaXRlbS5SZWN1cnNpdmUgPSByZWN1cnNpdmU7DQorICBpdGVtLldpbGRjYXJkTWF0Y2hpbmcgPSB3aWxkY2FyZE1hdGNoaW5nOw0KKyAgUGFpcnNbaW5kZXhdLkhlYWQuQWRkSXRlbShpbmNsdWRlLCBpdGVtKTsNCit9DQorDQorYm9vbCBDQ2Vuc29yOjpDaGVja1BhdGgoYm9vbCBpc0FsdFN0cmVhbSwgY29uc3QgVVN0cmluZyAmcGF0aCwgYm9vbCBpc0ZpbGUpIGNvbnN0DQorew0KKyAgYm9vbCBmaW5kZWQgPSBmYWxzZTsNCisgIEZPUl9WRUNUT1IgKGksIFBhaXJzKQ0KKyAgew0KKyAgICBib29sIGluY2x1ZGU7DQorICAgIGlmIChQYWlyc1tpXS5IZWFkLkNoZWNrUGF0aDIoaXNBbHRTdHJlYW0sIHBhdGgsIGlzRmlsZSwgaW5jbHVkZSkpDQorICAgIHsNCisgICAgICBpZiAoIWluY2x1ZGUpDQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgZmluZGVkID0gdHJ1ZTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZpbmRlZDsNCit9DQorDQordm9pZCBDQ2Vuc29yOjpFeHRlbmRFeGNsdWRlKCkNCit7DQorICB1bnNpZ25lZCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IFBhaXJzLlNpemUoKTsgaSsrKQ0KKyAgICBpZiAoUGFpcnNbaV0uUHJlZml4LklzRW1wdHkoKSkNCisgICAgICBicmVhazsNCisgIGlmIChpID09IFBhaXJzLlNpemUoKSkNCisgICAgcmV0dXJuOw0KKyAgdW5zaWduZWQgaW5kZXggPSBpOw0KKyAgZm9yIChpID0gMDsgaSA8IFBhaXJzLlNpemUoKTsgaSsrKQ0KKyAgICBpZiAoaW5kZXggIT0gaSkNCisgICAgICBQYWlyc1tpXS5IZWFkLkV4dGVuZEV4Y2x1ZGUoUGFpcnNbaW5kZXhdLkhlYWQpOw0KK30NCisNCit2b2lkIENDZW5zb3I6OkFkZFBhdGhzVG9DZW5zb3IoRUNlbnNvclBhdGhNb2RlIGNlbnNvclBhdGhNb2RlKQ0KK3sNCisgIEZPUl9WRUNUT1IoaSwgQ2Vuc29yUGF0aHMpDQorICB7DQorICAgIGNvbnN0IENDZW5zb3JQYXRoICZjcCA9IENlbnNvclBhdGhzW2ldOw0KKyAgICBBZGRJdGVtKGNlbnNvclBhdGhNb2RlLCBjcC5JbmNsdWRlLCBjcC5QYXRoLCBjcC5SZWN1cnNpdmUsIGNwLldpbGRjYXJkTWF0Y2hpbmcpOw0KKyAgfQ0KKyAgQ2Vuc29yUGF0aHMuQ2xlYXIoKTsNCit9DQorDQordm9pZCBDQ2Vuc29yOjpBZGRQcmVJdGVtKGJvb2wgaW5jbHVkZSwgY29uc3QgVVN0cmluZyAmcGF0aCwgYm9vbCByZWN1cnNpdmUsIGJvb2wgd2lsZGNhcmRNYXRjaGluZykNCit7DQorICBDQ2Vuc29yUGF0aCAmY3AgPSBDZW5zb3JQYXRocy5BZGROZXcoKTsNCisgIGNwLlBhdGggPSBwYXRoOw0KKyAgY3AuSW5jbHVkZSA9IGluY2x1ZGU7DQorICBjcC5SZWN1cnNpdmUgPSByZWN1cnNpdmU7DQorICBjcC5XaWxkY2FyZE1hdGNoaW5nID0gd2lsZGNhcmRNYXRjaGluZzsNCit9DQorDQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL0NvbW1vbi9XaWxkY2FyZC5oIGIvbHptYS9DUFAvQ29tbW9uL1dpbGRjYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiNzY1YwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9XaWxkY2FyZC5oCkBAIC0wLDAgKzEsMTU3IEBACisvLyBDb21tb24vV2lsZGNhcmQuaA0KKw0KKyNpZm5kZWYgX19DT01NT05fV0lMRENBUkRfSA0KKyNkZWZpbmUgX19DT01NT05fV0lMRENBUkRfSA0KKw0KKyNpbmNsdWRlICJNeVN0cmluZy5oIg0KKw0KK2ludCBDb21wYXJlRmlsZU5hbWVzKGNvbnN0IHdjaGFyX3QgKnMxLCBjb25zdCB3Y2hhcl90ICpzMikgU1RSSU5HX1VOSUNPREVfVEhST1c7DQorI2lmbmRlZiBVU0VfVU5JQ09ERV9GU1RSSU5HDQorICBpbnQgQ29tcGFyZUZpbGVOYW1lcyhjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOw0KKyNlbmRpZg0KKw0KK2Jvb2wgSXNQYXRoMVByZWZpeGVkQnlQYXRoMihjb25zdCB3Y2hhcl90ICpzMSwgY29uc3Qgd2NoYXJfdCAqczIpOw0KKw0KK2lubGluZSBib29sIElzQ2hhckRpckxpbWl0ZXIod2NoYXJfdCBjKQ0KK3sNCisgIHJldHVybiBjID09IFdDSEFSX1BBVEhfU0VQQVJBVE9SDQorICAgICNpZmRlZiBfV0lOMzINCisgICAgICB8fCBjID09IEwnLycNCisgICAgI2VuZGlmDQorICAgIDsNCit9DQorDQordm9pZCBTcGxpdFBhdGhUb1BhcnRzKGNvbnN0IFVTdHJpbmcgJnBhdGgsIFVTdHJpbmdWZWN0b3IgJnBhdGhQYXJ0cyk7DQordm9pZCBTcGxpdFBhdGhUb1BhcnRzXzIoY29uc3QgVVN0cmluZyAmcGF0aCwgVVN0cmluZyAmZGlyUHJlZml4LCBVU3RyaW5nICZuYW1lKTsNCit2b2lkIFNwbGl0UGF0aFRvUGFydHNfU21hcnQoY29uc3QgVVN0cmluZyAmcGF0aCwgVVN0cmluZyAmZGlyUHJlZml4LCBVU3RyaW5nICZuYW1lKTsgLy8gaWdub3JlcyBkaXIgZGVsaW1pdGVyIGF0IHRoZSBlbmQgb2YgKHBhdGgpDQorDQorVVN0cmluZyBFeHRyYWN0RGlyUHJlZml4RnJvbVBhdGgoY29uc3QgVVN0cmluZyAmcGF0aCk7DQorVVN0cmluZyBFeHRyYWN0RmlsZU5hbWVGcm9tUGF0aChjb25zdCBVU3RyaW5nICZwYXRoKTsNCisNCitib29sIERvZXNOYW1lQ29udGFpbldpbGRjYXJkKGNvbnN0IFVTdHJpbmcgJnBhdGgpOw0KK2Jvb2wgRG9lc1dpbGRjYXJkTWF0Y2hOYW1lKGNvbnN0IFVTdHJpbmcgJm1hc2ssIGNvbnN0IFVTdHJpbmcgJm5hbWUpOw0KKw0KK25hbWVzcGFjZSBOV2lsZGNhcmQgew0KKw0KKyNpZmRlZiBfV0lOMzINCisvLyByZXR1cm5zIHRydWUsIGlmIG5hbWUgaXMgbGlrZSAiYToiLCAiYzoiLCAuLi4NCitib29sIElzRHJpdmVDb2xvbk5hbWUoY29uc3Qgd2NoYXJfdCAqcyk7DQorI2VuZGlmDQorDQorDQorc3RydWN0IENJdGVtDQorew0KKyAgVVN0cmluZ1ZlY3RvciBQYXRoUGFydHM7DQorICBib29sIFJlY3Vyc2l2ZTsNCisgIGJvb2wgRm9yRmlsZTsNCisgIGJvb2wgRm9yRGlyOw0KKyAgYm9vbCBXaWxkY2FyZE1hdGNoaW5nOw0KKyAgDQorICAjaWZkZWYgX1dJTjMyDQorICBib29sIElzRHJpdmVJdGVtKCkgY29uc3QNCisgIHsNCisgICAgcmV0dXJuIFBhdGhQYXJ0cy5TaXplKCkgPT0gMSAmJiAhRm9yRmlsZSAmJiBGb3JEaXIgJiYgSXNEcml2ZUNvbG9uTmFtZShQYXRoUGFydHNbMF0pOw0KKyAgfQ0KKyAgI2VuZGlmDQorDQorICAvLyBDSXRlbSgpOiBXaWxkY2FyZE1hdGNoaW5nKHRydWUpIHt9DQorDQorICBib29sIEFyZUFsbEFsbG93ZWQoKSBjb25zdDsNCisgIGJvb2wgQ2hlY2tQYXRoKGNvbnN0IFVTdHJpbmdWZWN0b3IgJnBhdGhQYXJ0cywgYm9vbCBpc0ZpbGUpIGNvbnN0Ow0KK307DQorDQorY2xhc3MgQ0NlbnNvck5vZGUNCit7DQorICBDQ2Vuc29yTm9kZSAqUGFyZW50Ow0KKyAgDQorICBib29sIENoZWNrUGF0aEN1cnJlbnQoYm9vbCBpbmNsdWRlLCBjb25zdCBVU3RyaW5nVmVjdG9yICZwYXRoUGFydHMsIGJvb2wgaXNGaWxlKSBjb25zdDsNCisgIHZvaWQgQWRkSXRlbVNpbXBsZShib29sIGluY2x1ZGUsIENJdGVtICZpdGVtKTsNCisgIGJvb2wgQ2hlY2tQYXRoVmVjdChjb25zdCBVU3RyaW5nVmVjdG9yICZwYXRoUGFydHMsIGJvb2wgaXNGaWxlLCBib29sICZpbmNsdWRlKSBjb25zdDsNCitwdWJsaWM6DQorICBDQ2Vuc29yTm9kZSgpOiBQYXJlbnQoMCkgeyB9Ow0KKyAgQ0NlbnNvck5vZGUoY29uc3QgVVN0cmluZyAmbmFtZSwgQ0NlbnNvck5vZGUgKnBhcmVudCk6IE5hbWUobmFtZSksIFBhcmVudChwYXJlbnQpIHsgfTsNCisNCisgIFVTdHJpbmcgTmFtZTsgLy8gd2lsZGNhcmQgaXMgbm90IGFsbG93ZWQgaGVyZQ0KKyAgQ09iamVjdFZlY3RvcjxDQ2Vuc29yTm9kZT4gU3ViTm9kZXM7DQorICBDT2JqZWN0VmVjdG9yPENJdGVtPiBJbmNsdWRlSXRlbXM7DQorICBDT2JqZWN0VmVjdG9yPENJdGVtPiBFeGNsdWRlSXRlbXM7DQorDQorICBib29sIEFyZUFsbEFsbG93ZWQoKSBjb25zdDsNCisNCisgIGludCBGaW5kU3ViTm9kZShjb25zdCBVU3RyaW5nICZwYXRoKSBjb25zdDsNCisNCisgIHZvaWQgQWRkSXRlbShib29sIGluY2x1ZGUsIENJdGVtICZpdGVtKTsNCisgIHZvaWQgQWRkSXRlbShib29sIGluY2x1ZGUsIGNvbnN0IFVTdHJpbmcgJnBhdGgsIGJvb2wgcmVjdXJzaXZlLCBib29sIGZvckZpbGUsIGJvb2wgZm9yRGlyLCBib29sIHdpbGRjYXJkTWF0Y2hpbmcpOw0KKyAgdm9pZCBBZGRJdGVtMihib29sIGluY2x1ZGUsIGNvbnN0IFVTdHJpbmcgJnBhdGgsIGJvb2wgcmVjdXJzaXZlLCBib29sIHdpbGRjYXJkTWF0Y2hpbmcpOw0KKw0KKyAgYm9vbCBOZWVkQ2hlY2tTdWJEaXJzKCkgY29uc3Q7DQorICBib29sIEFyZVRoZXJlSW5jbHVkZUl0ZW1zKCkgY29uc3Q7DQorDQorICBib29sIENoZWNrUGF0aDIoYm9vbCBpc0FsdFN0cmVhbSwgY29uc3QgVVN0cmluZyAmcGF0aCwgYm9vbCBpc0ZpbGUsIGJvb2wgJmluY2x1ZGUpIGNvbnN0Ow0KKyAgYm9vbCBDaGVja1BhdGgoYm9vbCBpc0FsdFN0cmVhbSwgY29uc3QgVVN0cmluZyAmcGF0aCwgYm9vbCBpc0ZpbGUpIGNvbnN0Ow0KKw0KKyAgYm9vbCBDaGVja1BhdGhUb1Jvb3QoYm9vbCBpbmNsdWRlLCBVU3RyaW5nVmVjdG9yICZwYXRoUGFydHMsIGJvb2wgaXNGaWxlKSBjb25zdDsNCisgIC8vIGJvb2wgQ2hlY2tQYXRoVG9Sb290KGNvbnN0IFVTdHJpbmcgJnBhdGgsIGJvb2wgaXNGaWxlLCBib29sIGluY2x1ZGUpIGNvbnN0Ow0KKyAgdm9pZCBFeHRlbmRFeGNsdWRlKGNvbnN0IENDZW5zb3JOb2RlICZmcm9tTm9kZXMpOw0KK307DQorDQorc3RydWN0IENQYWlyDQorew0KKyAgVVN0cmluZyBQcmVmaXg7DQorICBDQ2Vuc29yTm9kZSBIZWFkOw0KKyAgDQorICBDUGFpcihjb25zdCBVU3RyaW5nICZwcmVmaXgpOiBQcmVmaXgocHJlZml4KSB7IH07DQorfTsNCisNCitlbnVtIEVDZW5zb3JQYXRoTW9kZQ0KK3sNCisgIGtfUmVsYXRQYXRoLCAgLy8gYWJzb2x1dGUgcHJlZml4IGFzIFByZWZpeCwgcmVtYWluIHBhdGggaW4gVHJlZQ0KKyAga19GdWxsUGF0aCwgICAvLyBkcml2ZSBwcmVmaXggYXMgUHJlZml4LCByZW1haW4gcGF0aCBpbiBUcmVlDQorICBrX0Fic1BhdGggICAgIC8vIGZ1bGwgcGF0aCBpbiBUcmVlDQorfTsNCisNCitzdHJ1Y3QgQ0NlbnNvclBhdGgNCit7DQorICBVU3RyaW5nIFBhdGg7DQorICBib29sIEluY2x1ZGU7DQorICBib29sIFJlY3Vyc2l2ZTsNCisgIGJvb2wgV2lsZGNhcmRNYXRjaGluZzsNCisNCisgIENDZW5zb3JQYXRoKCk6DQorICAgIEluY2x1ZGUodHJ1ZSksDQorICAgIFJlY3Vyc2l2ZShmYWxzZSksDQorICAgIFdpbGRjYXJkTWF0Y2hpbmcodHJ1ZSkNCisgICAge30NCit9Ow0KKw0KK2NsYXNzIENDZW5zb3INCit7DQorICBpbnQgRmluZFByZWZpeChjb25zdCBVU3RyaW5nICZwcmVmaXgpIGNvbnN0Ow0KK3B1YmxpYzoNCisgIENPYmplY3RWZWN0b3I8Q1BhaXI+IFBhaXJzOw0KKw0KKyAgQ09iamVjdFZlY3RvcjxOV2lsZGNhcmQ6OkNDZW5zb3JQYXRoPiBDZW5zb3JQYXRoczsNCisgIA0KKyAgYm9vbCBBbGxBcmVSZWxhdGl2ZSgpIGNvbnN0DQorICAgIHsgcmV0dXJuIChQYWlycy5TaXplKCkgPT0gMSAmJiBQYWlycy5Gcm9udCgpLlByZWZpeC5Jc0VtcHR5KCkpOyB9DQorICANCisgIHZvaWQgQWRkSXRlbShFQ2Vuc29yUGF0aE1vZGUgcGF0aE1vZGUsIGJvb2wgaW5jbHVkZSwgY29uc3QgVVN0cmluZyAmcGF0aCwgYm9vbCByZWN1cnNpdmUsIGJvb2wgd2lsZGNhcmRNYXRjaGluZyk7DQorICBib29sIENoZWNrUGF0aChib29sIGlzQWx0U3RyZWFtLCBjb25zdCBVU3RyaW5nICZwYXRoLCBib29sIGlzRmlsZSkgY29uc3Q7DQorICB2b2lkIEV4dGVuZEV4Y2x1ZGUoKTsNCisNCisgIHZvaWQgQWRkUGF0aHNUb0NlbnNvcihOV2lsZGNhcmQ6OkVDZW5zb3JQYXRoTW9kZSBjZW5zb3JQYXRoTW9kZSk7DQorICB2b2lkIEFkZFByZUl0ZW0oYm9vbCBpbmNsdWRlLCBjb25zdCBVU3RyaW5nICZwYXRoLCBib29sIHJlY3Vyc2l2ZSwgYm9vbCB3aWxkY2FyZE1hdGNoaW5nKTsNCisgIHZvaWQgQWRkUHJlSXRlbShjb25zdCBVU3RyaW5nICZwYXRoKQ0KKyAgew0KKyAgICBBZGRQcmVJdGVtKHRydWUsIHBhdGgsIGZhbHNlLCBmYWxzZSk7DQorICB9DQorICB2b2lkIEFkZFByZUl0ZW1fV2lsZGNhcmQoKQ0KKyAgew0KKyAgICBBZGRQcmVJdGVtKHRydWUsIEwiKiIsIGZhbHNlLCB0cnVlKTsNCisgIH0NCit9Ow0KKw0KKw0KK30NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9Db21tb24vWHpDcmM2NFJlZy5jcHAgYi9sem1hL0NQUC9Db21tb24vWHpDcmM2NFJlZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5ZDJlMwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL0NvbW1vbi9YekNyYzY0UmVnLmNwcApAQCAtMCwwICsxLDU0IEBACisvLyBYekNyYzY0UmVnLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQy9DcHVBcmNoLmgiDQorI2luY2x1ZGUgIi4uLy4uL0MvWHpDcmM2NC5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlDb20uaCINCisNCisjaW5jbHVkZSAiLi4vN3ppcC9JQ29kZXIuaCINCisjaW5jbHVkZSAiLi4vN3ppcC9Db21tb24vUmVnaXN0ZXJDb2RlYy5oIg0KKw0KK2NsYXNzIENYekNyYzY0SGFzaGVyOg0KKyAgcHVibGljIElIYXNoZXIsDQorICBwdWJsaWMgQ015VW5rbm93bkltcA0KK3sNCisgIFVJbnQ2NCBfY3JjOw0KK3B1YmxpYzoNCisgIENYekNyYzY0SGFzaGVyKCk6IF9jcmMoQ1JDNjRfSU5JVF9WQUwpIHt9DQorDQorICBNWV9VTktOT1dOX0lNUA0KKw0KKyAgU1RETUVUSE9EXyh2b2lkLCBJbml0KSgpOw0KKyAgU1RETUVUSE9EXyh2b2lkLCBVcGRhdGUpKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplKTsNCisgIFNURE1FVEhPRF8odm9pZCwgRmluYWwpKEJ5dGUgKmRpZ2VzdCk7DQorICBTVERNRVRIT0RfKFVJbnQzMiwgR2V0RGlnZXN0U2l6ZSkoKTsNCit9Ow0KKw0KK1NURE1FVEhPRElNUF8odm9pZCkgQ1h6Q3JjNjRIYXNoZXI6OkluaXQoKQ0KK3sNCisgIF9jcmMgPSBDUkM2NF9JTklUX1ZBTDsNCit9DQorDQorU1RETUVUSE9ESU1QXyh2b2lkKSBDWHpDcmM2NEhhc2hlcjo6VXBkYXRlKGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplKQ0KK3sNCisgIF9jcmMgPSBDcmM2NFVwZGF0ZShfY3JjLCBkYXRhLCBzaXplKTsNCit9DQorDQorU1RETUVUSE9ESU1QXyh2b2lkKSBDWHpDcmM2NEhhc2hlcjo6RmluYWwoQnl0ZSAqZGlnZXN0KQ0KK3sNCisgIFVJbnQ2NCB2YWwgPSBDUkM2NF9HRVRfRElHRVNUKF9jcmMpOw0KKyAgU2V0VWk2NChkaWdlc3QsIHZhbCk7DQorfQ0KKw0KK1NURE1FVEhPRElNUF8oVUludDMyKSBDWHpDcmM2NEhhc2hlcjo6R2V0RGlnZXN0U2l6ZSgpDQorew0KKyAgcmV0dXJuIDg7DQorfQ0KKw0KK3N0YXRpYyBJSGFzaGVyICpDcmVhdGVIYXNoZXIoKSB7IHJldHVybiBuZXcgQ1h6Q3JjNjRIYXNoZXI7IH0NCisNCitzdGF0aWMgQ0hhc2hlckluZm8gZ19IYXNoZXJJbmZvID0geyBDcmVhdGVIYXNoZXIsIDB4NCwgTCJDUkM2NCIsIDggfTsNCisNCitSRUdJU1RFUl9IQVNIRVIoQ3JjNjQpDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9DT00uaCBiL2x6bWEvQ1BQL1dpbmRvd3MvQ09NLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhNmQyOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvQ09NLmgKQEAgLTAsMCArMSw2OCBAQAorLy8gV2luZG93cy9DT00uaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX0NPTV9IDQorI2RlZmluZSBfX1dJTkRPV1NfQ09NX0gNCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL015U3RyaW5nLmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkNPTSB7DQorDQorI2lmZGVmIF9XSU4zMg0KKyAgDQorY2xhc3MgQ0NvbUluaXRpYWxpemVyDQorew0KK3B1YmxpYzoNCisgIENDb21Jbml0aWFsaXplcigpDQorICB7DQorICAgICNpZmRlZiBVTkRFUl9DRQ0KKyAgICBDb0luaXRpYWxpemVFeChOVUxMLCBDT0lOSVRfTVVMVElUSFJFQURFRCk7DQorICAgICNlbHNlDQorICAgIC8vIGl0J3Mgc2luZ2xlIHRocmVhZC4gRG8gd2UgbmVlZCBtdWx0aXRocmVhZD8NCisgICAgQ29Jbml0aWFsaXplKE5VTEwpOw0KKyAgICAjZW5kaWYNCisgIH07DQorICB+Q0NvbUluaXRpYWxpemVyKCkgeyBDb1VuaW5pdGlhbGl6ZSgpOyB9Ow0KK307DQorDQorY2xhc3MgQ1N0Z01lZGl1bQ0KK3sNCisgIFNUR01FRElVTSBfb2JqZWN0Ow0KK3B1YmxpYzoNCisgIGJvb2wgX211c3RCZVJlbGVhc2VkOw0KKyAgQ1N0Z01lZGl1bSgpOiBfbXVzdEJlUmVsZWFzZWQoZmFsc2UpIHt9DQorICB+Q1N0Z01lZGl1bSgpIHsgRnJlZSgpOyB9DQorICB2b2lkIEZyZWUoKQ0KKyAgew0KKyAgICBpZiAoX211c3RCZVJlbGVhc2VkKQ0KKyAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJl9vYmplY3QpOw0KKyAgICBfbXVzdEJlUmVsZWFzZWQgPSBmYWxzZTsNCisgIH0NCisgIGNvbnN0IFNUR01FRElVTSogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZfb2JqZWN0O30NCisgIFNUR01FRElVTSogb3BlcmF0b3ItPigpIHsgcmV0dXJuICZfb2JqZWN0O30NCisgIFNUR01FRElVTSogb3BlcmF0b3ImKCkgeyByZXR1cm4gJl9vYmplY3Q7IH0NCit9Ow0KKw0KKyNlbmRpZg0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBHVUlEIDwtLT4gU3RyaW5nIENvbnZlcnNpb25zDQorVVN0cmluZyBHVUlEVG9TdHJpbmdXKFJFRkdVSUQgZ3VpZCk7DQorQVN0cmluZyBHVUlEVG9TdHJpbmdBKFJFRkdVSUQgZ3VpZCk7DQorI2lmZGVmIFVOSUNPREUNCisgICNkZWZpbmUgR1VJRFRvU3RyaW5nIEdVSURUb1N0cmluZ1cNCisjZWxzZQ0KKyAgI2RlZmluZSBHVUlEVG9TdHJpbmcgR1VJRFRvU3RyaW5nQQ0KKyNlbmRpZg0KKw0KK0hSRVNVTFQgU3RyaW5nVG9HVUlEVyhjb25zdCB3Y2hhcl90ICpzdHJpbmcsIEdVSUQgJmNsYXNzSUQpOw0KK0hSRVNVTFQgU3RyaW5nVG9HVUlEQShjb25zdCBjaGFyICpzdHJpbmcsIEdVSUQgJmNsYXNzSUQpOw0KKyNpZmRlZiBVTklDT0RFDQorICAjZGVmaW5lIFN0cmluZ1RvR1VJRCBTdHJpbmdUb0dVSURXDQorI2Vsc2UNCisgICNkZWZpbmUgU3RyaW5nVG9HVUlEIFN0cmluZ1RvR1VJREENCisjZW5kaWYNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvQ29tbW9uRGlhbG9nLmNwcCBiL2x6bWEvQ1BQL1dpbmRvd3MvQ29tbW9uRGlhbG9nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGI1YjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9Db21tb25EaWFsb2cuY3BwCkBAIC0wLDAgKzEsMTgzIEBACisvLyBXaW5kb3dzL0NvbW1vbkRpYWxvZy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2lmZGVmIFVOREVSX0NFDQorI2luY2x1ZGUgPGNvbW1kbGcuaD4NCisjZW5kaWYNCisNCisjaWZuZGVmIF9VTklDT0RFDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIkNvbW1vbkRpYWxvZy5oIg0KKyNpbmNsdWRlICJEZWZzLmgiDQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KK2V4dGVybiBib29sIGdfSXNOVDsNCisjZW5kaWYNCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCisNCitjbGFzcyBDRG91YmxlWmVyb1N0cmluZ0xpc3RBDQorew0KKyAgTFBUU1RSIEJ1ZjsNCisgIHVuc2lnbmVkIFNpemU7DQorcHVibGljOg0KKyAgQ0RvdWJsZVplcm9TdHJpbmdMaXN0QShMUFNUUiBidWYsIHVuc2lnbmVkIHNpemUpOiBCdWYoYnVmKSwgU2l6ZShzaXplKSB7fQ0KKyAgYm9vbCBBZGQoTFBDU1RSIHMpIHRocm93KCk7DQorICB2b2lkIEZpbmlzaCgpIHsgKkJ1ZiA9IDA7IH0NCit9Ow0KKw0KK2Jvb2wgQ0RvdWJsZVplcm9TdHJpbmdMaXN0QTo6QWRkKExQQ1NUUiBzKSB0aHJvdygpDQorew0KKyAgdW5zaWduZWQgbGVuID0gTXlTdHJpbmdMZW4ocykgKyAxOw0KKyAgaWYgKGxlbiA+PSBTaXplKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBNeVN0cmluZ0NvcHkoQnVmLCBzKTsNCisgIEJ1ZiArPSBsZW47DQorICBTaXplIC09IGxlbjsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCisjZW5kaWYNCisNCitjbGFzcyBDRG91YmxlWmVyb1N0cmluZ0xpc3RXDQorew0KKyAgTFBXU1RSIEJ1ZjsNCisgIHVuc2lnbmVkIFNpemU7DQorcHVibGljOg0KKyAgQ0RvdWJsZVplcm9TdHJpbmdMaXN0VyhMUFdTVFIgYnVmLCB1bnNpZ25lZCBzaXplKTogQnVmKGJ1ZiksIFNpemUoc2l6ZSkge30NCisgIGJvb2wgQWRkKExQQ1dTVFIgcykgdGhyb3coKTsNCisgIHZvaWQgRmluaXNoKCkgeyAqQnVmID0gMDsgfQ0KK307DQorDQorYm9vbCBDRG91YmxlWmVyb1N0cmluZ0xpc3RXOjpBZGQoTFBDV1NUUiBzKSB0aHJvdygpDQorew0KKyAgdW5zaWduZWQgbGVuID0gTXlTdHJpbmdMZW4ocykgKyAxOw0KKyAgaWYgKGxlbiA+PSBTaXplKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBNeVN0cmluZ0NvcHkoQnVmLCBzKTsNCisgIEJ1ZiArPSBsZW47DQorICBTaXplIC09IGxlbjsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCisjZGVmaW5lIE1ZX19PRk5fUFJPSkVDVCAgMHgwMDQwMDAwMA0KKyNkZWZpbmUgTVlfX09GTl9TSE9XX0FMTCAweDAxMDAwMDAwDQorDQorLyogaWYgKGxwc3RyRmlsdGVyID09IE5VTEwgJiYgbkZpbHRlckluZGV4ID09IDApDQorICBNU0ROIDogInRoZSBzeXN0ZW0gZG9lc24ndCBzaG93IGFueSBmaWxlcyIsDQorICBidXQgV2luWFAtNjQgc2hvd3MgYWxsIGZpbGVzLiBXaHkgPz8/ICovDQorDQorLyoNCitzdHJ1Y3R1cmVzDQorICBPUEVORklMRU5BTUVXDQorICBPUEVORklMRU5BTUVBDQorY29udGFpbiBhZGRpdGlvbmFsIG1lbWJlcnM6DQorI2lmIChfV0lOMzJfV0lOTlQgPj0gMHgwNTAwKQ0KKyAgdm9pZCAqcHZSZXNlcnZlZDsNCisgIERXT1JEIGR3UmVzZXJ2ZWQ7DQorICBEV09SRCBGbGFnc0V4Ow0KKyNlbmRpZg0KKw0KK0lmIHdlIGNvbXBpbGUgdGhlIHNvdXJjZSBjb2RlIHdpdGggKF9XSU4zMl9XSU5OVCA+PSAweDA1MDApLCBzb21lIGZ1bmN0aW9ucw0KK3dpbGwgbm90IHdvcmsgYXQgTlQgNC4wLCBpZiB3ZSB1c2Ugc2l6ZW9mKE9QRU5GSUxFTkFNRSopLg0KK1NvIHdlIHVzZSBzaXplIG9mIG9sZCB2ZXJzaW9uIG9mIHN0cnVjdHVyZS4gKi8NCisNCisjaWYgZGVmaW5lZChVTkRFUl9DRSkgfHwgZGVmaW5lZChfV0lONjQpIHx8IChfV0lOMzJfV0lOTlQgPCAweDA1MDApDQorLy8gfHwgIWRlZmluZWQoV0lOVkVSKQ0KKyAgI2RlZmluZSBteV9jb21wYXRpYl9PUEVORklMRU5BTUVBX3NpemUgc2l6ZW9mKE9QRU5GSUxFTkFNRUEpDQorICAjZGVmaW5lIG15X2NvbXBhdGliX09QRU5GSUxFTkFNRVdfc2l6ZSBzaXplb2YoT1BFTkZJTEVOQU1FVykNCisjZWxzZQ0KKyAgI2RlZmluZSBteV9jb21wYXRpYl9PUEVORklMRU5BTUVBX3NpemUgT1BFTkZJTEVOQU1FX1NJWkVfVkVSU0lPTl80MDBBDQorICAjZGVmaW5lIG15X2NvbXBhdGliX09QRU5GSUxFTkFNRVdfc2l6ZSBPUEVORklMRU5BTUVfU0laRV9WRVJTSU9OXzQwMFcNCisjZW5kaWYNCisNCisjZGVmaW5lIENPTlZfVV9Ub19BKGRlc3QsIHNyYywgdGVtcCkgQVN0cmluZyB0ZW1wOyBpZiAoc3JjKSB7IHRlbXAgPSBHZXRTeXN0ZW1TdHJpbmcoc3JjKTsgZGVzdCA9IHRlbXA7IH0NCisNCitib29sIE15R2V0T3BlbkZpbGVOYW1lKEhXTkQgaHduZCwgTFBDV1NUUiB0aXRsZSwNCisgICAgTFBDV1NUUiBpbml0aWFsRGlyLA0KKyAgICBMUENXU1RSIGZpbGVQYXRoLA0KKyAgICBMUENXU1RSIGZpbHRlckRlc2NyaXB0aW9uLA0KKyAgICBMUENXU1RSIGZpbHRlciwNCisgICAgVVN0cmluZyAmcmVzUGF0aA0KKyAgICAjaWZkZWYgVU5ERVJfQ0UNCisgICAgLCBib29sIG9wZW5Gb2xkZXINCisgICAgI2VuZGlmDQorICAgICkNCit7DQorICBjb25zdCB1bnNpZ25lZCBrQnVmU2l6ZSA9IE1BWF9QQVRIICogMjsNCisgIGNvbnN0IHVuc2lnbmVkIGtGaWx0ZXJCdWZTaXplID0gTUFYX1BBVEg7DQorICBpZiAoIWZpbHRlcikNCisgICAgZmlsdGVyID0gTCIqLioiOw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIENIQVIgYnVmW2tCdWZTaXplXTsNCisgICAgTXlTdHJpbmdDb3B5KGJ1ZiwgKGNvbnN0IGNoYXIgKilHZXRTeXN0ZW1TdHJpbmcoZmlsZVBhdGgpKTsNCisgICAgLy8gT1BFTkZJTEVOQU1FX05UNEENCisgICAgT1BFTkZJTEVOQU1FQSBwOw0KKyAgICBtZW1zZXQoJnAsIDAsIHNpemVvZihwKSk7DQorICAgIHAubFN0cnVjdFNpemUgPSBteV9jb21wYXRpYl9PUEVORklMRU5BTUVBX3NpemU7DQorICAgIHAuaHduZE93bmVyID0gaHduZDsNCisgICAgQ0hBUiBmaWx0ZXJCdWZba0ZpbHRlckJ1ZlNpemVdOw0KKyAgICB7DQorICAgICAgQ0RvdWJsZVplcm9TdHJpbmdMaXN0QSBkeihmaWx0ZXJCdWYsIGtGaWx0ZXJCdWZTaXplKTsNCisgICAgICBkei5BZGQoR2V0U3lzdGVtU3RyaW5nKGZpbHRlckRlc2NyaXB0aW9uID8gZmlsdGVyRGVzY3JpcHRpb24gOiBmaWx0ZXIpKTsNCisgICAgICBkei5BZGQoR2V0U3lzdGVtU3RyaW5nKGZpbHRlcikpOw0KKyAgICAgIGR6LkZpbmlzaCgpOw0KKyAgICAgIHAubHBzdHJGaWx0ZXIgPSBmaWx0ZXJCdWY7DQorICAgICAgcC5uRmlsdGVySW5kZXggPSAxOw0KKyAgICB9DQorICAgIA0KKyAgICBwLmxwc3RyRmlsZSA9IGJ1ZjsNCisgICAgcC5uTWF4RmlsZSA9IGtCdWZTaXplOw0KKyAgICBDT05WX1VfVG9fQShwLmxwc3RySW5pdGlhbERpciwgaW5pdGlhbERpciwgaW5pdGlhbERpckEpOw0KKyAgICBDT05WX1VfVG9fQShwLmxwc3RyVGl0bGUsIHRpdGxlLCB0aXRsZUEpOw0KKyAgICBwLkZsYWdzID0gT0ZOX0VYUExPUkVSIHwgT0ZOX0hJREVSRUFET05MWTsNCisNCisgICAgYm9vbCByZXMgPSBCT09MVG9Cb29sKDo6R2V0T3BlbkZpbGVOYW1lQSgmcCkpOw0KKyAgICByZXNQYXRoID0gR2V0VW5pY29kZVN0cmluZyhidWYpOw0KKyAgICByZXR1cm4gcmVzOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgI2VuZGlmDQorICB7DQorICAgIFdDSEFSIGJ1ZltrQnVmU2l6ZV07DQorICAgIE15U3RyaW5nQ29weShidWYsIGZpbGVQYXRoKTsNCisgICAgLy8gT1BFTkZJTEVOQU1FX05UNFcNCisgICAgT1BFTkZJTEVOQU1FVyBwOw0KKyAgICBtZW1zZXQoJnAsIDAsIHNpemVvZihwKSk7DQorICAgIHAubFN0cnVjdFNpemUgPSBteV9jb21wYXRpYl9PUEVORklMRU5BTUVXX3NpemU7DQorICAgIHAuaHduZE93bmVyID0gaHduZDsNCisgICAgDQorICAgIFdDSEFSIGZpbHRlckJ1ZltrRmlsdGVyQnVmU2l6ZV07DQorICAgIHsNCisgICAgICBDRG91YmxlWmVyb1N0cmluZ0xpc3RXIGR6KGZpbHRlckJ1Ziwga0ZpbHRlckJ1ZlNpemUpOw0KKyAgICAgIGR6LkFkZChmaWx0ZXJEZXNjcmlwdGlvbiA/IGZpbHRlckRlc2NyaXB0aW9uIDogZmlsdGVyKTsNCisgICAgICBkei5BZGQoZmlsdGVyKTsNCisgICAgICBkei5GaW5pc2goKTsNCisgICAgICBwLmxwc3RyRmlsdGVyID0gZmlsdGVyQnVmOw0KKyAgICAgIHAubkZpbHRlckluZGV4ID0gMTsNCisgICAgfQ0KKyAgICAgICAgDQorICAgIHAubHBzdHJGaWxlID0gYnVmOw0KKyAgICBwLm5NYXhGaWxlID0ga0J1ZlNpemU7DQorICAgIHAubHBzdHJJbml0aWFsRGlyID0gaW5pdGlhbERpcjsNCisgICAgcC5scHN0clRpdGxlID0gdGl0bGU7DQorICAgIHAuRmxhZ3MgPSBPRk5fRVhQTE9SRVIgfCBPRk5fSElERVJFQURPTkxZDQorICAgICAgICAjaWZkZWYgVU5ERVJfQ0UNCisgICAgICAgIHwgKG9wZW5Gb2xkZXIgPyAoTVlfX09GTl9QUk9KRUNUIHwgTVlfX09GTl9TSE9XX0FMTCkgOiAwKQ0KKyAgICAgICAgI2VuZGlmDQorICAgICAgICA7DQorDQorICAgIGJvb2wgcmVzID0gQk9PTFRvQm9vbCg6OkdldE9wZW5GaWxlTmFtZVcoJnApKTsNCisgICAgcmVzUGF0aCA9IGJ1ZjsNCisgICAgcmV0dXJuIHJlczsNCisgIH0NCit9DQorDQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvQ29tbW9uRGlhbG9nLmggYi9sem1hL0NQUC9XaW5kb3dzL0NvbW1vbkRpYWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZmVjMjgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL0NvbW1vbkRpYWxvZy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIFdpbmRvd3MvQ29tbW9uRGlhbG9nLmgNCisNCisjaWZuZGVmIF9fV0lORE9XU19DT01NT05fRElBTE9HX0gNCisjZGVmaW5lIF9fV0lORE9XU19DT01NT05fRElBTE9HX0gNCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL015U3RyaW5nLmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCisNCitib29sIE15R2V0T3BlbkZpbGVOYW1lKEhXTkQgaHduZCwgTFBDV1NUUiB0aXRsZSwNCisgICAgTFBDV1NUUiBpbml0aWFsRGlyLCAgLy8gY2FuIGJlIE5VTEwsIHNvIGRpciBwcmVmaXggaW4gZmlsZVBhdGggd2lsbCBiZSB1c2VkDQorICAgIExQQ1dTVFIgZmlsZVBhdGgsICAgIC8vIGZ1bGwgcGF0aA0KKyAgICBMUENXU1RSIGZpbHRlckRlc2NyaXB0aW9uLCAgLy8gbGlrZSAiQWxsIGZpbGVzICgqLiopIg0KKyAgICBMUENXU1RSIGZpbHRlciwgICAgICAgICAgICAgLy8gbGlrZSAiKi5leGUiDQorICAgIFVTdHJpbmcgJnJlc1BhdGgNCisgICAgI2lmZGVmIFVOREVSX0NFDQorICAgICwgYm9vbCBvcGVuRm9sZGVyID0gZmFsc2UNCisgICAgI2VuZGlmDQorKTsNCisNCit9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9Db250cm9sL0NvbWJvQm94LmNwcCBiL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9Db21ib0JveC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExMDJmMwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9Db21ib0JveC5jcHAKQEAgLTAsMCArMSw1OCBAQAorLy8gV2luZG93cy9Db250cm9sL0NvbWJvQm94LmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaWZuZGVmIF9VTklDT0RFDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIkNvbWJvQm94LmgiDQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KK2V4dGVybiBib29sIGdfSXNOVDsNCisjZW5kaWYNCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBOQ29udHJvbCB7DQorDQorTFJFU1VMVCBDQ29tYm9Cb3g6OkdldExCVGV4dChpbnQgaW5kZXgsIENTeXNTdHJpbmcgJnMpDQorew0KKyAgcy5FbXB0eSgpOw0KKyAgTFJFU1VMVCBsZW4gPSBHZXRMQlRleHRMZW4oaW5kZXgpOw0KKyAgaWYgKGxlbiA9PSBDQl9FUlIpDQorICAgIHJldHVybiBsZW47DQorICBsZW4gPSBHZXRMQlRleHQoaW5kZXgsIHMuR2V0QnVmZmVyKChpbnQpbGVuICsgMSkpOw0KKyAgcy5SZWxlYXNlQnVmZmVyKCk7DQorICByZXR1cm4gbGVuOw0KK30NCisNCisjaWZuZGVmIF9VTklDT0RFDQorTFJFU1VMVCBDQ29tYm9Cb3g6OkFkZFN0cmluZyhMUENXU1RSIHMpDQorew0KKyAgaWYgKGdfSXNOVCkNCisgICAgcmV0dXJuIFNlbmRNZXNzYWdlVyhDQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pcyk7DQorICByZXR1cm4gQWRkU3RyaW5nKEdldFN5c3RlbVN0cmluZyhzKSk7DQorfQ0KKw0KK0xSRVNVTFQgQ0NvbWJvQm94OjpHZXRMQlRleHQoaW50IGluZGV4LCBVU3RyaW5nICZzKQ0KK3sNCisgIHMuRW1wdHkoKTsNCisgIGlmIChnX0lzTlQpDQorICB7DQorICAgIExSRVNVTFQgbGVuID0gU2VuZE1lc3NhZ2VXKENCX0dFVExCVEVYVExFTiwgaW5kZXgsIDApOw0KKyAgICBpZiAobGVuID09IENCX0VSUikNCisgICAgICByZXR1cm4gbGVuOw0KKyAgICBsZW4gPSBTZW5kTWVzc2FnZVcoQ0JfR0VUTEJURVhULCBpbmRleCwgKExQQVJBTSlzLkdldEJ1ZmZlcigoaW50KWxlbiArIDEpKTsNCisgICAgcy5SZWxlYXNlQnVmZmVyKCk7DQorICAgIHJldHVybiBsZW47DQorICB9DQorICBBU3RyaW5nIHNhOw0KKyAgTFJFU1VMVCBsZW4gPSBHZXRMQlRleHQoaW5kZXgsIHNhKTsNCisgIGlmIChsZW4gPT0gQ0JfRVJSKQ0KKyAgICByZXR1cm4gbGVuOw0KKyAgcyA9IEdldFVuaWNvZGVTdHJpbmcoc2EpOw0KKyAgcmV0dXJuIHMuTGVuKCk7DQorfQ0KKyNlbmRpZg0KKw0KK319DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9Db250cm9sL0NvbWJvQm94LmggYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvQ29tYm9Cb3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWUxNzMwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL0NvbWJvQm94LmgKQEAgLTAsMCArMSw2MyBAQAorLy8gV2luZG93cy9Db250cm9sL0NvbWJvQm94LmgNCisNCisjaWZuZGVmIF9fV0lORE9XU19DT05UUk9MX0NPTUJPQk9YX0gNCisjZGVmaW5lIF9fV0lORE9XU19DT05UUk9MX0NPTUJPQk9YX0gNCisNCisjaW5jbHVkZSA8Y29tbWN0cmwuaD4NCisNCisjaW5jbHVkZSAiLi4vV2luZG93LmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkNvbnRyb2wgew0KKw0KK2NsYXNzIENDb21ib0JveDogcHVibGljIENXaW5kb3cNCit7DQorcHVibGljOg0KKyAgdm9pZCBSZXNldENvbnRlbnQoKSB7IFNlbmRNZXNzYWdlKENCX1JFU0VUQ09OVEVOVCwgMCwgMCk7IH0NCisgIExSRVNVTFQgQWRkU3RyaW5nKExQQ1RTVFIgcykgeyByZXR1cm4gU2VuZE1lc3NhZ2UoQ0JfQUREU1RSSU5HLCAwLCAoTFBBUkFNKXMpOyB9DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBMUkVTVUxUIEFkZFN0cmluZyhMUENXU1RSIHMpOw0KKyAgI2VuZGlmDQorICBMUkVTVUxUIFNldEN1clNlbChpbnQgaW5kZXgpIHsgcmV0dXJuIFNlbmRNZXNzYWdlKENCX1NFVENVUlNFTCwgaW5kZXgsIDApOyB9DQorICBpbnQgR2V0Q3VyU2VsKCkgeyByZXR1cm4gKGludClTZW5kTWVzc2FnZShDQl9HRVRDVVJTRUwsIDAsIDApOyB9DQorICBpbnQgR2V0Q291bnQoKSB7IHJldHVybiAoaW50KVNlbmRNZXNzYWdlKENCX0dFVENPVU5ULCAwLCAwKTsgfQ0KKyAgDQorICBMUkVTVUxUIEdldExCVGV4dExlbihpbnQgaW5kZXgpIHsgcmV0dXJuIFNlbmRNZXNzYWdlKENCX0dFVExCVEVYVExFTiwgaW5kZXgsIDApOyB9DQorICBMUkVTVUxUIEdldExCVGV4dChpbnQgaW5kZXgsIExQVFNUUiBzKSB7IHJldHVybiBTZW5kTWVzc2FnZShDQl9HRVRMQlRFWFQsIGluZGV4LCAoTFBBUkFNKXMpOyB9DQorICBMUkVTVUxUIEdldExCVGV4dChpbnQgaW5kZXgsIENTeXNTdHJpbmcgJnMpOw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgTFJFU1VMVCBHZXRMQlRleHQoaW50IGluZGV4LCBVU3RyaW5nICZzKTsNCisgICNlbmRpZg0KKw0KKyAgTFJFU1VMVCBTZXRJdGVtRGF0YShpbnQgaW5kZXgsIExQQVJBTSBsUGFyYW0pIHsgcmV0dXJuIFNlbmRNZXNzYWdlKENCX1NFVElURU1EQVRBLCBpbmRleCwgbFBhcmFtKTsgfQ0KKyAgTFJFU1VMVCBHZXRJdGVtRGF0YShpbnQgaW5kZXgpIHsgcmV0dXJuIFNlbmRNZXNzYWdlKENCX0dFVElURU1EQVRBLCBpbmRleCwgMCk7IH0NCisNCisgIExSRVNVTFQgR2V0SXRlbURhdGFfb2ZfQ3VyU2VsKCkgeyByZXR1cm4gR2V0SXRlbURhdGEoR2V0Q3VyU2VsKCkpOyB9DQorDQorICB2b2lkIFNob3dEcm9wRG93bihib29sIHNob3cgPSB0cnVlKSB7IFNlbmRNZXNzYWdlKENCX1NIT1dEUk9QRE9XTiwgc2hvdyA/IFRSVUUgOiBGQUxTRSwgMCk7ICB9DQorfTsNCisNCisjaWZuZGVmIFVOREVSX0NFDQorDQorY2xhc3MgQ0NvbWJvQm94RXg6IHB1YmxpYyBDQ29tYm9Cb3gNCit7DQorcHVibGljOg0KKyAgYm9vbCBTZXRVbmljb2RlRm9ybWF0KGJvb2wgZlVuaWNvZGUpIHsgcmV0dXJuIExSRVNVTFRUb0Jvb2woU2VuZE1lc3NhZ2UoQ0JFTV9TRVRVTklDT0RFRk9STUFULCBCT09MVG9Cb29sKGZVbmljb2RlKSwgMCkpOyB9DQorDQorICBMUkVTVUxUIERlbGV0ZUl0ZW0oaW50IGluZGV4KSB7IHJldHVybiBTZW5kTWVzc2FnZShDQkVNX0RFTEVURUlURU0sIGluZGV4LCAwKTsgfQ0KKyAgTFJFU1VMVCBJbnNlcnRJdGVtKENPTUJPQk9YRVhJVEVNICppdGVtKSB7IHJldHVybiBTZW5kTWVzc2FnZShDQkVNX0lOU0VSVElURU0sIDAsIChMUEFSQU0paXRlbSk7IH0NCisgICNpZm5kZWYgX1VOSUNPREUNCisgIExSRVNVTFQgSW5zZXJ0SXRlbShDT01CT0JPWEVYSVRFTVcgKml0ZW0pIHsgcmV0dXJuIFNlbmRNZXNzYWdlKENCRU1fSU5TRVJUSVRFTVcsIDAsIChMUEFSQU0paXRlbSk7IH0NCisgICNlbmRpZg0KKw0KKyAgTFJFU1VMVCBTZXRJdGVtKENPTUJPQk9YRVhJVEVNICppdGVtKSB7IHJldHVybiBTZW5kTWVzc2FnZShDQkVNX1NFVElURU0sIDAsIChMUEFSQU0paXRlbSk7IH0NCisgIERXT1JEIFNldEV4dGVuZGVkU3R5bGUoRFdPUkQgZXhNYXNrLCBEV09SRCBleFN0eWxlKSB7IHJldHVybiAoRFdPUkQpU2VuZE1lc3NhZ2UoQ0JFTV9TRVRFWFRFTkRFRFNUWUxFLCBleE1hc2ssIGV4U3R5bGUpOyB9DQorICBIV05EIEdldEVkaXRDb250cm9sKCkgeyByZXR1cm4gKEhXTkQpU2VuZE1lc3NhZ2UoQ0JFTV9HRVRFRElUQ09OVFJPTCwgMCwgMCk7IH0NCisgIEhJTUFHRUxJU1QgU2V0SW1hZ2VMaXN0KEhJTUFHRUxJU1QgaW1hZ2VMaXN0KSB7IHJldHVybiAoSElNQUdFTElTVClTZW5kTWVzc2FnZShDQkVNX1NFVElNQUdFTElTVCwgMCwgKExQQVJBTSlpbWFnZUxpc3QpOyB9DQorfTsNCisNCisjZW5kaWYNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9Db21tYW5kQmFyLmggYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvQ29tbWFuZEJhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzVkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvQ29tbWFuZEJhci5oCkBAIC0wLDAgKzEsNDggQEAKKy8vIFdpbmRvd3MvQ29udHJvbC9Db21tYW5kQmFyLmgNCisgIA0KKyNpZm5kZWYgX19XSU5ET1dTX0NPTlRST0xfQ09NTUFOREJBUl9IDQorI2RlZmluZSBfX1dJTkRPV1NfQ09OVFJPTF9DT01NQU5EQkFSX0gNCisNCisjaWZkZWYgVU5ERVJfQ0UNCisNCisjaW5jbHVkZSAiLi4vV2luZG93LmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkNvbnRyb2wgew0KKw0KK2NsYXNzIENDb21tYW5kQmFyOiBwdWJsaWMgTldpbmRvd3M6OkNXaW5kb3cNCit7DQorcHVibGljOg0KKyAgYm9vbCBDcmVhdGUoSElOU1RBTkNFIGhJbnN0LCBIV05EIGh3bmRQYXJlbnQsIGludCBpZENtZEJhcikNCisgIHsNCisgICAgX3dpbmRvdyA9IDo6Q29tbWFuZEJhcl9DcmVhdGUoaEluc3QsIGh3bmRQYXJlbnQsIGlkQ21kQmFyKTsNCisgICAgcmV0dXJuIChfd2luZG93ICE9IE5VTEwpOw0KKyAgfQ0KKyAgDQorICAvLyBNYWNyb3MNCisgIC8vIHZvaWQgRGVzdHJveSgpIHsgQ29tbWFuZEJhcl9EZXN0cm95KF93aW5kb3cpOyB9DQorICAvLyBib29sIEFkZEJ1dHRvbnMoVUlOVCBudW1CdXR0b25zLCBMUFRCQlVUVE9OIGJ1dHRvbnMpIHsgcmV0dXJuIEJPT0xUb0Jvb2woU2VuZE1lc3NhZ2UoVEJfQUREQlVUVE9OUywgKFdQQVJBTSludW1CdXR0b25zLCAoTFBBUkFNKWJ1dHRvbnMpKTsgfQ0KKyAgYm9vbCBJbnNlcnRCdXR0b24oaW50IGlCdXR0b24sIExQVEJCVVRUT04gYnV0dG9uKSB7IHJldHVybiBCT09MVG9Cb29sKFNlbmRNZXNzYWdlKFRCX0lOU0VSVEJVVFRPTiwgKFdQQVJBTSlpQnV0dG9uLCAoTFBBUkFNKWJ1dHRvbikpOyB9DQorICBCT09MIEFkZFRvb2xUaXBzKFVJTlQgbnVtVG9vbFRpcHMsIExQVFNUUiB0b29sVGlwcykgeyByZXR1cm4gQk9PTFRvQm9vbChTZW5kTWVzc2FnZShUQl9TRVRUT09MVElQUywgKFdQQVJBTSludW1Ub29sVGlwcywgKExQQVJBTSl0b29sVGlwcykpOyB9DQorICB2b2lkIEF1dG9TaXplKCkgeyBTZW5kTWVzc2FnZShUQl9BVVRPU0laRSwgMCwgMCk7IH0NCisNCisgIGJvb2wgQWRkQWRvcm5tZW50cyhEV09SRCBkd0ZsYWdzKSB7IHJldHVybiBCT09MVG9Cb29sKDo6Q29tbWFuZEJhcl9BZGRBZG9ybm1lbnRzKF93aW5kb3csIGR3RmxhZ3MsIDApKTsgfQ0KKyAgaW50IEFkZEJpdG1hcChISU5TVEFOQ0UgaEluc3QsIGludCBpZEJpdG1hcCwgaW50IGlOdW1JbWFnZXMsIGludCBpSW1hZ2VXaWR0aCwgaW50IGlJbWFnZUhlaWdodCkgeyByZXR1cm4gOjpDb21tYW5kQmFyX0FkZEJpdG1hcChfd2luZG93LCBoSW5zdCwgaWRCaXRtYXAsIGlOdW1JbWFnZXMsIGlJbWFnZVdpZHRoLCBpSW1hZ2VIZWlnaHQpOyB9DQorICBib29sIERyYXdNZW51QmFyKFdPUkQgaUJ1dHRvbikgeyByZXR1cm4gQk9PTFRvQm9vbCg6OkNvbW1hbmRCYXJfRHJhd01lbnVCYXIoX3dpbmRvdywgaUJ1dHRvbikpOyB9DQorICBITUVOVSBHZXRNZW51KFdPUkQgaUJ1dHRvbikgeyByZXR1cm4gOjpDb21tYW5kQmFyX0dldE1lbnUoX3dpbmRvdywgaUJ1dHRvbik7IH0NCisgIGludCBIZWlnaHQoKSB7IHJldHVybiBDb21tYW5kQmFyX0hlaWdodChfd2luZG93KTsgfQ0KKyAgSFdORCBJbnNlcnRDb21ib0JveChISU5TVEFOQ0UgaEluc3QsIGludCBpV2lkdGgsIFVJTlQgZHdTdHlsZSwgV09SRCBpZENvbWJvQm94LCBXT1JEIGlCdXR0b24pIHsgcmV0dXJuIDo6Q29tbWFuZEJhcl9JbnNlcnRDb21ib0JveChfd2luZG93LCBoSW5zdCwgaVdpZHRoLCBkd1N0eWxlLCBpZENvbWJvQm94LCBpQnV0dG9uKTsgfQ0KKyAgYm9vbCBJbnNlcnRNZW51YmFyKEhJTlNUQU5DRSBoSW5zdCwgV09SRCBpZE1lbnUsIFdPUkQgaUJ1dHRvbikgeyByZXR1cm4gQk9PTFRvQm9vbCg6OkNvbW1hbmRCYXJfSW5zZXJ0TWVudWJhcihfd2luZG93LCBoSW5zdCwgaWRNZW51LCBpQnV0dG9uKSk7IH0NCisgIGJvb2wgSW5zZXJ0TWVudWJhckV4KEhJTlNUQU5DRSBoSW5zdCwgTFBUU1RSIHBzek1lbnUsIFdPUkQgaUJ1dHRvbikgeyByZXR1cm4gQk9PTFRvQm9vbCg6OkNvbW1hbmRCYXJfSW5zZXJ0TWVudWJhckV4KF93aW5kb3csIGhJbnN0LCBwc3pNZW51LCBpQnV0dG9uKSk7IH0NCisgIGJvb2wgU2hvdyhib29sIGNtZFNob3cpIHsgcmV0dXJuIEJPT0xUb0Jvb2woOjpDb21tYW5kQmFyX1Nob3coX3dpbmRvdywgQm9vbFRvQk9PTChjbWRTaG93KSkpOyB9DQorICANCisNCisgIC8vIENFIDQuMA0KKyAgdm9pZCBBbGlnbkFkb3JubWVudHMoKSB7IENvbW1hbmRCYXJfQWxpZ25BZG9ybm1lbnRzKF93aW5kb3cpOyB9DQorfTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9EaWFsb2cuY3BwIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL0RpYWxvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhMDllZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9EaWFsb2cuY3BwCkBAIC0wLDAgKzEsMjUwIEBACisvLyBXaW5kb3dzL0NvbnRyb2wvRGlhbG9nLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaWZuZGVmIF9VTklDT0RFDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorI2VuZGlmDQorDQorI2luY2x1ZGUgIkRpYWxvZy5oIg0KKw0KK2V4dGVybiBISU5TVEFOQ0UgZ19oSW5zdGFuY2U7DQorI2lmbmRlZiBfVU5JQ09ERQ0KK2V4dGVybiBib29sIGdfSXNOVDsNCisjZW5kaWYNCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBOQ29udHJvbCB7DQorDQorc3RhdGljIElOVF9QVFIgQVBJRU5UUlkgRGlhbG9nUHJvY2VkdXJlKEhXTkQgZGlhbG9nSFdORCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQ0KK3sNCisgIENXaW5kb3cgdGVtcERpYWxvZyhkaWFsb2dIV05EKTsNCisgIGlmIChtZXNzYWdlID09IFdNX0lOSVRESUFMT0cpDQorICAgIHRlbXBEaWFsb2cuU2V0VXNlckRhdGFMb25nUHRyKGxQYXJhbSk7DQorICBDRGlhbG9nICpkaWFsb2cgPSAoQ0RpYWxvZyAqKSh0ZW1wRGlhbG9nLkdldFVzZXJEYXRhTG9uZ1B0cigpKTsNCisgIGlmIChkaWFsb2cgPT0gTlVMTCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaWYgKG1lc3NhZ2UgPT0gV01fSU5JVERJQUxPRykNCisgICAgZGlhbG9nLT5BdHRhY2goZGlhbG9nSFdORCk7DQorICB0cnkgeyByZXR1cm4gQm9vbFRvQk9PTChkaWFsb2ctPk9uTWVzc2FnZShtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSkpOyB9DQorICBjYXRjaCguLi4pIHsgcmV0dXJuIFRSVUU7IH0NCit9DQorDQorYm9vbCBDRGlhbG9nOjpPbk1lc3NhZ2UoVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQ0KK3sNCisgIHN3aXRjaCAobWVzc2FnZSkNCisgIHsNCisgICAgY2FzZSBXTV9JTklURElBTE9HOiByZXR1cm4gT25Jbml0KCk7DQorICAgIGNhc2UgV01fQ09NTUFORDogcmV0dXJuIE9uQ29tbWFuZCh3UGFyYW0sIGxQYXJhbSk7DQorICAgIGNhc2UgV01fTk9USUZZOiByZXR1cm4gT25Ob3RpZnkoKFVJTlQpd1BhcmFtLCAoTFBOTUhEUikgbFBhcmFtKTsNCisgICAgY2FzZSBXTV9USU1FUjogcmV0dXJuIE9uVGltZXIod1BhcmFtLCBsUGFyYW0pOw0KKyAgICBjYXNlIFdNX1NJWkU6IHJldHVybiBPblNpemUod1BhcmFtLCBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkpOw0KKyAgICBjYXNlIFdNX0hFTFA6IE9uSGVscCgpOyByZXR1cm4gdHJ1ZTsNCisgICAgLyoNCisgICAgICAgIE9uSGVscCgNCisgICAgICAgICAgI2lmZGVmIFVOREVSX0NFDQorICAgICAgICAgICh2b2lkICopDQorICAgICAgICAgICNlbHNlDQorICAgICAgICAgIChMUEhFTFBJTkZPKQ0KKyAgICAgICAgICAjZW5kaWYNCisgICAgICAgICAgbFBhcmFtKTsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAqLw0KKyAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7DQorICB9DQorfQ0KKw0KK2Jvb2wgQ0RpYWxvZzo6T25Db21tYW5kKFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pDQorew0KKyAgcmV0dXJuIE9uQ29tbWFuZChISVdPUkQod1BhcmFtKSwgTE9XT1JEKHdQYXJhbSksIGxQYXJhbSk7DQorfQ0KKw0KK2Jvb2wgQ0RpYWxvZzo6T25Db21tYW5kKGludCBjb2RlLCBpbnQgaXRlbUlELCBMUEFSQU0gbFBhcmFtKQ0KK3sNCisgIGlmIChjb2RlID09IEJOX0NMSUNLRUQpDQorICAgIHJldHVybiBPbkJ1dHRvbkNsaWNrZWQoaXRlbUlELCAoSFdORClsUGFyYW0pOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIENEaWFsb2c6Ok9uQnV0dG9uQ2xpY2tlZChpbnQgYnV0dG9uSUQsIEhXTkQgLyogYnV0dG9uSFdORCAqLykNCit7DQorICBzd2l0Y2ggKGJ1dHRvbklEKQ0KKyAgew0KKyAgICBjYXNlIElET0s6IE9uT0soKTsgYnJlYWs7DQorICAgIGNhc2UgSURDQU5DRUw6IE9uQ2FuY2VsKCk7IGJyZWFrOw0KKyAgICBjYXNlIElESEVMUDogT25IZWxwKCk7IGJyZWFrOw0KKyAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7DQorICB9DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorc3RhdGljIGJvb2wgR2V0V29ya0FyZWFSZWN0KFJFQ1QgKnJlY3QpDQorew0KKyAgLy8gdXNlIGFub3RoZXIgZnVuY3Rpb24gZm9yIG11bHRpLW1vbml0b3IuDQorICByZXR1cm4gQk9PTFRvQm9vbCg6OlN5c3RlbVBhcmFtZXRlcnNJbmZvKFNQSV9HRVRXT1JLQVJFQSwgMCwgcmVjdCwgMCkpOw0KK30NCisNCitib29sIElzRGlhbG9nU2l6ZU9LKGludCB4U2l6ZSwgaW50IHlTaXplKQ0KK3sNCisgIC8vIGl0IHJldHVybnMgZm9yIHN5c3RlbSBmb250LiBSZWFsIGZvbnQgdXNlcyBhbm90aGVyIHZhbHVlcw0KKyAgTE9ORyB2ID0gR2V0RGlhbG9nQmFzZVVuaXRzKCk7DQorICBpbnQgeCA9IExPV09SRCh2KTsNCisgIGludCB5ID0gSElXT1JEKHYpOw0KKw0KKyAgUkVDVCByZWN0Ow0KKyAgR2V0V29ya0FyZWFSZWN0KCZyZWN0KTsNCisgIGludCB3eCA9IFJFQ1RfU0laRV9YKHJlY3QpOw0KKyAgaW50IHd5ID0gUkVDVF9TSVpFX1kocmVjdCk7DQorICByZXR1cm4NCisgICAgeFNpemUgLyA0ICogeCA8PSB3eCAmJg0KKyAgICB5U2l6ZSAvIDggKiB5IDw9IHd5Ow0KK30NCisNCitib29sIENEaWFsb2c6OkdldE1hcmdpbnMoaW50IG1hcmdpbiwgaW50ICZ4LCBpbnQgJnkpDQorew0KKyAgeCA9IG1hcmdpbjsNCisgIHkgPSBtYXJnaW47DQorICBSRUNUIHJlY3Q7DQorICByZWN0LmxlZnQgPSAwOw0KKyAgcmVjdC50b3AgPSAwOw0KKyAgcmVjdC5yaWdodCA9IG1hcmdpbjsNCisgIHJlY3QuYm90dG9tID0gbWFyZ2luOw0KKyAgaWYgKCFNYXBSZWN0KCZyZWN0KSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgeCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7DQorICB5ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitpbnQgQ0RpYWxvZzo6VW5pdHNfVG9fUGl4ZWxzX1goaW50IHVuaXRzKQ0KK3sNCisgIFJFQ1QgcmVjdDsNCisgIHJlY3QubGVmdCA9IDA7DQorICByZWN0LnRvcCA9IDA7DQorICByZWN0LnJpZ2h0ID0gdW5pdHM7DQorICByZWN0LmJvdHRvbSA9IHVuaXRzOw0KKyAgaWYgKCFNYXBSZWN0KCZyZWN0KSkNCisgICAgcmV0dXJuIHVuaXRzICogMyAvIDI7DQorICByZXR1cm4gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsNCit9DQorDQorYm9vbCBDRGlhbG9nOjpHZXRJdGVtU2l6ZXMoaW50IGlkLCBpbnQgJngsIGludCAmeSkNCit7DQorICBSRUNUIHJlY3Q7DQorICBpZiAoITo6R2V0V2luZG93UmVjdChHZXRJdGVtKGlkKSwgJnJlY3QpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICB4ID0gUkVDVF9TSVpFX1gocmVjdCk7DQorICB5ID0gUkVDVF9TSVpFX1kocmVjdCk7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQordm9pZCBDRGlhbG9nOjpHZXRDbGllbnRSZWN0T2ZJdGVtKGludCBpZCwgUkVDVCAmcmVjdCkNCit7DQorICA6OkdldFdpbmRvd1JlY3QoR2V0SXRlbShpZCksICZyZWN0KTsNCisgIFNjcmVlblRvQ2xpZW50KCZyZWN0KTsNCit9DQorDQorYm9vbCBDRGlhbG9nOjpNb3ZlSXRlbShpbnQgaWQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIHJlcGFpbnQpDQorew0KKyAgcmV0dXJuIEJPT0xUb0Jvb2woOjpNb3ZlV2luZG93KEdldEl0ZW0oaWQpLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBCb29sVG9CT09MKHJlcGFpbnQpKSk7DQorfQ0KKw0KK3ZvaWQgQ0RpYWxvZzo6Tm9ybWFsaXplU2l6ZShib29sIGZ1bGxOb3JtYWxpemUpDQorew0KKyAgUkVDVCB3b3JrUmVjdDsNCisgIEdldFdvcmtBcmVhUmVjdCgmd29ya1JlY3QpOw0KKyAgaW50IHhTaXplID0gUkVDVF9TSVpFX1god29ya1JlY3QpOw0KKyAgaW50IHlTaXplID0gUkVDVF9TSVpFX1kod29ya1JlY3QpOw0KKyAgUkVDVCByZWN0Ow0KKyAgR2V0V2luZG93UmVjdCgmcmVjdCk7DQorICBpbnQgeFNpemUyID0gUkVDVF9TSVpFX1gocmVjdCk7DQorICBpbnQgeVNpemUyID0gUkVDVF9TSVpFX1kocmVjdCk7DQorICBib29sIG5lZWRNb3ZlID0gKHhTaXplMiA+IHhTaXplIHx8IHlTaXplMiA+IHlTaXplKTsNCisgIGlmICh4U2l6ZTIgPiB4U2l6ZSB8fCAobmVlZE1vdmUgJiYgZnVsbE5vcm1hbGl6ZSkpDQorICB7DQorICAgIHJlY3QubGVmdCA9IHdvcmtSZWN0LmxlZnQ7DQorICAgIHJlY3QucmlnaHQgPSB3b3JrUmVjdC5yaWdodDsNCisgICAgeFNpemUyID0geFNpemU7DQorICB9DQorICBpZiAoeVNpemUyID4geVNpemUgfHwgKG5lZWRNb3ZlICYmIGZ1bGxOb3JtYWxpemUpKQ0KKyAgew0KKyAgICByZWN0LnRvcCA9IHdvcmtSZWN0LnRvcDsNCisgICAgcmVjdC5ib3R0b20gPSB3b3JrUmVjdC5ib3R0b207DQorICAgIHlTaXplMiA9IHlTaXplOw0KKyAgfQ0KKyAgaWYgKG5lZWRNb3ZlKQ0KKyAgew0KKyAgICBpZiAoZnVsbE5vcm1hbGl6ZSkNCisgICAgICBTaG93KFNXX1NIT1dNQVhJTUlaRUQpOw0KKyAgICBlbHNlDQorICAgICAgTW92ZShyZWN0LmxlZnQsIHJlY3QudG9wLCB4U2l6ZTIsIHlTaXplMiwgdHJ1ZSk7DQorICB9DQorfQ0KKw0KK3ZvaWQgQ0RpYWxvZzo6Tm9ybWFsaXplUG9zaXRpb24oKQ0KK3sNCisgIFJFQ1Qgd29ya1JlY3QsIHJlY3Q7DQorICBHZXRXb3JrQXJlYVJlY3QoJndvcmtSZWN0KTsNCisgIEdldFdpbmRvd1JlY3QoJnJlY3QpOw0KKyAgaWYgKHJlY3QuYm90dG9tID4gd29ya1JlY3QuYm90dG9tICYmIHJlY3QudG9wID4gd29ya1JlY3QudG9wKQ0KKyAgICBNb3ZlKHJlY3QubGVmdCwgd29ya1JlY3QudG9wLCBSRUNUX1NJWkVfWChyZWN0KSwgUkVDVF9TSVpFX1kocmVjdCksIHRydWUpOw0KK30NCisNCitib29sIENNb2RlbGVzc0RpYWxvZzo6Q3JlYXRlKExQQ1RTVFIgdGVtcGxhdGVOYW1lLCBIV05EIHBhcmVudFdpbmRvdykNCit7DQorICBIV05EIGFIV05EID0gQ3JlYXRlRGlhbG9nUGFyYW0oZ19oSW5zdGFuY2UsIHRlbXBsYXRlTmFtZSwgcGFyZW50V2luZG93LCBEaWFsb2dQcm9jZWR1cmUsIChMUEFSQU0pdGhpcyk7DQorICBpZiAoYUhXTkQgPT0gMCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgQXR0YWNoKGFIV05EKTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitJTlRfUFRSIENNb2RhbERpYWxvZzo6Q3JlYXRlKExQQ1RTVFIgdGVtcGxhdGVOYW1lLCBIV05EIHBhcmVudFdpbmRvdykNCit7DQorICByZXR1cm4gRGlhbG9nQm94UGFyYW0oZ19oSW5zdGFuY2UsIHRlbXBsYXRlTmFtZSwgcGFyZW50V2luZG93LCBEaWFsb2dQcm9jZWR1cmUsIChMUEFSQU0pdGhpcyk7DQorfQ0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCisNCitib29sIENNb2RlbGVzc0RpYWxvZzo6Q3JlYXRlKExQQ1dTVFIgdGVtcGxhdGVOYW1lLCBIV05EIHBhcmVudFdpbmRvdykNCit7DQorICBIV05EIGFIV05EOw0KKyAgaWYgKGdfSXNOVCkNCisgICAgYUhXTkQgPSBDcmVhdGVEaWFsb2dQYXJhbVcoZ19oSW5zdGFuY2UsIHRlbXBsYXRlTmFtZSwgcGFyZW50V2luZG93LCBEaWFsb2dQcm9jZWR1cmUsIChMUEFSQU0pdGhpcyk7DQorICBlbHNlDQorICB7DQorICAgIEFTdHJpbmcgbmFtZTsNCisgICAgTFBDU1RSIHRlbXBsYXRlTmFtZUE7DQorICAgIGlmIChJU19JTlRSRVNPVVJDRSh0ZW1wbGF0ZU5hbWUpKQ0KKyAgICAgIHRlbXBsYXRlTmFtZUEgPSAoTFBDU1RSKXRlbXBsYXRlTmFtZTsNCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgbmFtZSA9IEdldFN5c3RlbVN0cmluZyh0ZW1wbGF0ZU5hbWUpOw0KKyAgICAgIHRlbXBsYXRlTmFtZUEgPSBuYW1lOw0KKyAgICB9DQorICAgIGFIV05EID0gQ3JlYXRlRGlhbG9nUGFyYW1BKGdfaEluc3RhbmNlLCB0ZW1wbGF0ZU5hbWVBLCBwYXJlbnRXaW5kb3csIERpYWxvZ1Byb2NlZHVyZSwgKExQQVJBTSl0aGlzKTsNCisgIH0NCisgIGlmIChhSFdORCA9PSAwKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBBdHRhY2goYUhXTkQpOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK0lOVF9QVFIgQ01vZGFsRGlhbG9nOjpDcmVhdGUoTFBDV1NUUiB0ZW1wbGF0ZU5hbWUsIEhXTkQgcGFyZW50V2luZG93KQ0KK3sNCisgIGlmIChnX0lzTlQpDQorICAgIHJldHVybiBEaWFsb2dCb3hQYXJhbVcoZ19oSW5zdGFuY2UsIHRlbXBsYXRlTmFtZSwgcGFyZW50V2luZG93LCBEaWFsb2dQcm9jZWR1cmUsIChMUEFSQU0pdGhpcyk7DQorICBBU3RyaW5nIG5hbWU7DQorICBMUENTVFIgdGVtcGxhdGVOYW1lQTsNCisgIGlmIChJU19JTlRSRVNPVVJDRSh0ZW1wbGF0ZU5hbWUpKQ0KKyAgICB0ZW1wbGF0ZU5hbWVBID0gKExQQ1NUUil0ZW1wbGF0ZU5hbWU7DQorICBlbHNlDQorICB7DQorICAgIG5hbWUgPSBHZXRTeXN0ZW1TdHJpbmcodGVtcGxhdGVOYW1lKTsNCisgICAgdGVtcGxhdGVOYW1lQSA9IG5hbWU7DQorICB9DQorICByZXR1cm4gRGlhbG9nQm94UGFyYW1BKGdfaEluc3RhbmNlLCB0ZW1wbGF0ZU5hbWVBLCBwYXJlbnRXaW5kb3csIERpYWxvZ1Byb2NlZHVyZSwgKExQQVJBTSl0aGlzKTsNCit9DQorI2VuZGlmDQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvRGlhbG9nLmggYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvRGlhbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1MzBlNQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9EaWFsb2cuaApAQCAtMCwwICsxLDE2NyBAQAorLy8gV2luZG93cy9Db250cm9sL0RpYWxvZy5oDQorDQorI2lmbmRlZiBfX1dJTkRPV1NfQ09OVFJPTF9ESUFMT0dfSA0KKyNkZWZpbmUgX19XSU5ET1dTX0NPTlRST0xfRElBTE9HX0gNCisNCisjaW5jbHVkZSAiLi4vV2luZG93LmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkNvbnRyb2wgew0KKw0KK2NsYXNzIENEaWFsb2c6IHB1YmxpYyBDV2luZG93DQorew0KK3B1YmxpYzoNCisgIENEaWFsb2coSFdORCB3bmQgPSBOVUxMKTogQ1dpbmRvdyh3bmQpe307DQorICB2aXJ0dWFsIH5DRGlhbG9nKCkge307DQorDQorICBIV05EIEdldEl0ZW0oaW50IGl0ZW1JRCkgY29uc3QNCisgICAgeyByZXR1cm4gR2V0RGxnSXRlbShfd2luZG93LCBpdGVtSUQpOyB9DQorDQorICBib29sIEVuYWJsZUl0ZW0oaW50IGl0ZW1JRCwgYm9vbCBlbmFibGUpIGNvbnN0DQorICAgIHsgcmV0dXJuIEJPT0xUb0Jvb2woOjpFbmFibGVXaW5kb3coR2V0SXRlbShpdGVtSUQpLCBCb29sVG9CT09MKGVuYWJsZSkpKTsgfQ0KKw0KKyAgYm9vbCBTaG93SXRlbShpbnQgaXRlbUlELCBpbnQgY21kU2hvdykgY29uc3QNCisgICAgeyByZXR1cm4gQk9PTFRvQm9vbCg6OlNob3dXaW5kb3coR2V0SXRlbShpdGVtSUQpLCBjbWRTaG93KSk7IH0NCisNCisgIGJvb2wgU2hvd0l0ZW1fQm9vbChpbnQgaXRlbUlELCBib29sIHNob3cpIGNvbnN0DQorICAgIHsgcmV0dXJuIFNob3dJdGVtKGl0ZW1JRCwgc2hvdyA/IFNXX1NIT1c6IFNXX0hJREUpOyB9DQorDQorICBib29sIEhpZGVJdGVtKGludCBpdGVtSUQpIGNvbnN0IHsgcmV0dXJuIFNob3dJdGVtKGl0ZW1JRCwgU1dfSElERSk7IH0NCisNCisgIGJvb2wgU2V0SXRlbVRleHQoaW50IGl0ZW1JRCwgTFBDVFNUUiBzKQ0KKyAgICB7IHJldHVybiBCT09MVG9Cb29sKFNldERsZ0l0ZW1UZXh0KF93aW5kb3csIGl0ZW1JRCwgcykpOyB9DQorDQorICAjaWZuZGVmIF9VTklDT0RFDQorICBib29sIFNldEl0ZW1UZXh0KGludCBpdGVtSUQsIExQQ1dTVFIgcykNCisgIHsNCisgICAgQ1dpbmRvdyB3aW5kb3coR2V0SXRlbShpdGVtSUQpKTsNCisgICAgcmV0dXJuIHdpbmRvdy5TZXRUZXh0KHMpOw0KKyAgfQ0KKyAgI2VuZGlmDQorDQorICBVSU5UIEdldEl0ZW1UZXh0KGludCBpdGVtSUQsIExQVFNUUiBzdHJpbmcsIGludCBtYXhDb3VudCkNCisgICAgeyByZXR1cm4gR2V0RGxnSXRlbVRleHQoX3dpbmRvdywgaXRlbUlELCBzdHJpbmcsIG1heENvdW50KTsgfQ0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgLyoNCisgIGJvb2wgR2V0SXRlbVRleHQoaW50IGl0ZW1JRCwgTFBXU1RSIHN0cmluZywgaW50IG1heENvdW50KQ0KKyAgew0KKyAgICBDV2luZG93IHdpbmRvdyhHZXRJdGVtKGl0ZW1JRCkpOw0KKyAgICByZXR1cm4gd2luZG93LkdldFRleHQoc3RyaW5nLCBtYXhDb3VudCk7DQorICB9DQorICAqLw0KKyAgI2VuZGlmDQorDQorICBib29sIFNldEl0ZW1JbnQoaW50IGl0ZW1JRCwgVUlOVCB2YWx1ZSwgYm9vbCBpc1NpZ25lZCkNCisgICAgeyByZXR1cm4gQk9PTFRvQm9vbChTZXREbGdJdGVtSW50KF93aW5kb3csIGl0ZW1JRCwgdmFsdWUsIEJvb2xUb0JPT0woaXNTaWduZWQpKSk7IH0NCisgIGJvb2wgR2V0SXRlbUludChpbnQgaXRlbUlELCBib29sIGlzU2lnbmVkLCBVSU5UICZ2YWx1ZSkNCisgIHsNCisgICAgQk9PTCByZXN1bHQ7DQorICAgIHZhbHVlID0gR2V0RGxnSXRlbUludChfd2luZG93LCBpdGVtSUQsICZyZXN1bHQsIEJvb2xUb0JPT0woaXNTaWduZWQpKTsNCisgICAgcmV0dXJuIEJPT0xUb0Jvb2wocmVzdWx0KTsNCisgIH0NCisNCisgIEhXTkQgR2V0TmV4dEdyb3VwSXRlbShIV05EIGNvbnRyb2wsIGJvb2wgcHJldmlvdXMpDQorICAgIHsgcmV0dXJuIEdldE5leHREbGdHcm91cEl0ZW0oX3dpbmRvdywgY29udHJvbCwgQm9vbFRvQk9PTChwcmV2aW91cykpOyB9DQorICBIV05EIEdldE5leHRUYWJJdGVtKEhXTkQgY29udHJvbCwgYm9vbCBwcmV2aW91cykNCisgICAgeyByZXR1cm4gR2V0TmV4dERsZ1RhYkl0ZW0oX3dpbmRvdywgY29udHJvbCwgQm9vbFRvQk9PTChwcmV2aW91cykpOyB9DQorDQorICBib29sIE1hcFJlY3QoTFBSRUNUIHJlY3QpDQorICAgIHsgcmV0dXJuIEJPT0xUb0Jvb2woTWFwRGlhbG9nUmVjdChfd2luZG93LCByZWN0KSk7IH0NCisNCisgIGJvb2wgSXNNZXNzYWdlKExQTVNHIG1lc3NhZ2UpDQorICAgIHsgcmV0dXJuIEJPT0xUb0Jvb2woSXNEaWFsb2dNZXNzYWdlKF93aW5kb3csIG1lc3NhZ2UpKTsgfQ0KKw0KKyAgTFJFU1VMVCBTZW5kSXRlbU1lc3NhZ2UoaW50IGl0ZW1JRCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQ0KKyAgICB7IHJldHVybiBTZW5kRGxnSXRlbU1lc3NhZ2UoX3dpbmRvdywgaXRlbUlELCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7IH0NCisNCisgIGJvb2wgQ2hlY2tCdXR0b24oaW50IGJ1dHRvbklELCBVSU5UIGNoZWNrU3RhdGUpDQorICAgIHsgcmV0dXJuIEJPT0xUb0Jvb2woQ2hlY2tEbGdCdXR0b24oX3dpbmRvdywgYnV0dG9uSUQsIGNoZWNrU3RhdGUpKTsgfQ0KKyAgYm9vbCBDaGVja0J1dHRvbihpbnQgYnV0dG9uSUQsIGJvb2wgY2hlY2tTdGF0ZSkNCisgICAgeyByZXR1cm4gQ2hlY2tCdXR0b24oYnV0dG9uSUQsIFVJTlQoY2hlY2tTdGF0ZSA/IEJTVF9DSEVDS0VEIDogQlNUX1VOQ0hFQ0tFRCkpOyB9DQorDQorICBVSU5UIElzQnV0dG9uQ2hlY2tlZChpbnQgYnV0dG9uSUQpIGNvbnN0DQorICAgIHsgcmV0dXJuIElzRGxnQnV0dG9uQ2hlY2tlZChfd2luZG93LCBidXR0b25JRCk7IH0NCisgIGJvb2wgSXNCdXR0b25DaGVja2VkQm9vbChpbnQgYnV0dG9uSUQpIGNvbnN0DQorICAgIHsgcmV0dXJuIChJc0J1dHRvbkNoZWNrZWQoYnV0dG9uSUQpID09IEJTVF9DSEVDS0VEKTsgfQ0KKw0KKyAgYm9vbCBDaGVja1JhZGlvQnV0dG9uKGludCBmaXJzdEJ1dHRvbklELCBpbnQgbGFzdEJ1dHRvbklELCBpbnQgY2hlY2tCdXR0b25JRCkNCisgICAgeyByZXR1cm4gQk9PTFRvQm9vbCg6OkNoZWNrUmFkaW9CdXR0b24oX3dpbmRvdywgZmlyc3RCdXR0b25JRCwgbGFzdEJ1dHRvbklELCBjaGVja0J1dHRvbklEKSk7IH0NCisNCisgIHZpcnR1YWwgYm9vbCBPbk1lc3NhZ2UoVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsNCisgIHZpcnR1YWwgYm9vbCBPbkluaXQoKSB7IHJldHVybiB0cnVlOyB9DQorICB2aXJ0dWFsIGJvb2wgT25Db21tYW5kKFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOw0KKyAgdmlydHVhbCBib29sIE9uQ29tbWFuZChpbnQgY29kZSwgaW50IGl0ZW1JRCwgTFBBUkFNIGxQYXJhbSk7DQorICB2aXJ0dWFsIGJvb2wgT25TaXplKFdQQVJBTSAvKiB3UGFyYW0gKi8sIGludCAvKiB4U2l6ZSAqLywgaW50IC8qIHlTaXplICovKSB7IHJldHVybiBmYWxzZTsgfQ0KKw0KKyAgLyoNCisgICNpZmRlZiBVTkRFUl9DRQ0KKyAgdmlydHVhbCB2b2lkIE9uSGVscCh2b2lkICopIHsgT25IZWxwKCk7IH07DQorICAjZWxzZQ0KKyAgdmlydHVhbCB2b2lkIE9uSGVscChMUEhFTFBJTkZPKSB7IE9uSGVscCgpOyB9Ow0KKyAgI2VuZGlmDQorICAqLw0KKyAgdmlydHVhbCB2b2lkIE9uSGVscCgpIHt9Ow0KKw0KKyAgdmlydHVhbCBib29sIE9uQnV0dG9uQ2xpY2tlZChpbnQgYnV0dG9uSUQsIEhXTkQgYnV0dG9uSFdORCk7DQorICB2aXJ0dWFsIHZvaWQgT25PSygpIHt9Ow0KKyAgdmlydHVhbCB2b2lkIE9uQ2FuY2VsKCkge307DQorICB2aXJ0dWFsIGJvb2wgT25Ob3RpZnkoVUlOVCAvKiBjb250cm9sSUQgKi8sIExQTk1IRFIgLyogbFBhcmFtICovKSB7IHJldHVybiBmYWxzZTsgfQ0KKyAgdmlydHVhbCBib29sIE9uVGltZXIoV1BBUkFNIC8qIHRpbWVySUQgKi8sIExQQVJBTSAvKiBjYWxsYmFjayAqLykgeyByZXR1cm4gZmFsc2U7IH0NCisNCisgIExPTkdfUFRSIFNldE1zZ1Jlc3VsdChMT05HX1BUUiBuZXdMb25nUHRyICkNCisgICAgeyByZXR1cm4gU2V0TG9uZ1B0cihEV0xQX01TR1JFU1VMVCwgbmV3TG9uZ1B0cik7IH0NCisgIExPTkdfUFRSIEdldE1zZ1Jlc3VsdCgpIGNvbnN0DQorICAgIHsgcmV0dXJuIEdldExvbmdQdHIoRFdMUF9NU0dSRVNVTFQpOyB9DQorDQorICBib29sIEdldE1hcmdpbnMoaW50IG1hcmdpbiwgaW50ICZ4LCBpbnQgJnkpOw0KKyAgaW50IFVuaXRzX1RvX1BpeGVsc19YKGludCB1bml0cyk7DQorICBib29sIEdldEl0ZW1TaXplcyhpbnQgaWQsIGludCAmeCwgaW50ICZ5KTsNCisgIHZvaWQgR2V0Q2xpZW50UmVjdE9mSXRlbShpbnQgaWQsIFJFQ1QgJnJlY3QpOw0KKyAgYm9vbCBNb3ZlSXRlbShpbnQgaWQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIHJlcGFpbnQgPSB0cnVlKTsNCisNCisgIHZvaWQgTm9ybWFsaXplU2l6ZShib29sIGZ1bGxOb3JtYWxpemUgPSBmYWxzZSk7DQorICB2b2lkIE5vcm1hbGl6ZVBvc2l0aW9uKCk7DQorfTsNCisNCitjbGFzcyBDTW9kZWxlc3NEaWFsb2c6IHB1YmxpYyBDRGlhbG9nDQorew0KK3B1YmxpYzoNCisgIGJvb2wgQ3JlYXRlKExQQ1RTVFIgdGVtcGxhdGVOYW1lLCBIV05EIHBhcmVudFdpbmRvdyk7DQorICBib29sIENyZWF0ZShVSU5UIHJlc0lELCBIV05EIHBhcmVudFdpbmRvdykgeyByZXR1cm4gQ3JlYXRlKE1BS0VJTlRSRVNPVVJDRVcocmVzSUQpLCBwYXJlbnRXaW5kb3cpOyB9DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBib29sIENyZWF0ZShMUENXU1RSIHRlbXBsYXRlTmFtZSwgSFdORCBwYXJlbnRXaW5kb3cpOw0KKyAgI2VuZGlmDQorICB2aXJ0dWFsIHZvaWQgT25PSygpIHsgRGVzdHJveSgpOyB9DQorICB2aXJ0dWFsIHZvaWQgT25DYW5jZWwoKSB7IERlc3Ryb3koKTsgfQ0KK307DQorDQorY2xhc3MgQ01vZGFsRGlhbG9nOiBwdWJsaWMgQ0RpYWxvZw0KK3sNCitwdWJsaWM6DQorICBJTlRfUFRSIENyZWF0ZShMUENUU1RSIHRlbXBsYXRlTmFtZSwgSFdORCBwYXJlbnRXaW5kb3cpOw0KKyAgSU5UX1BUUiBDcmVhdGUoVUlOVCByZXNJRCwgSFdORCBwYXJlbnRXaW5kb3cpIHsgcmV0dXJuIENyZWF0ZShNQUtFSU5UUkVTT1VSQ0VXKHJlc0lEKSwgcGFyZW50V2luZG93KTsgfQ0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgSU5UX1BUUiBDcmVhdGUoTFBDV1NUUiB0ZW1wbGF0ZU5hbWUsIEhXTkQgcGFyZW50V2luZG93KTsNCisgICNlbmRpZg0KKw0KKyAgYm9vbCBFbmQoSU5UX1BUUiByZXN1bHQpIHsgcmV0dXJuIEJPT0xUb0Jvb2woOjpFbmREaWFsb2coX3dpbmRvdywgcmVzdWx0KSk7IH0NCisgIHZpcnR1YWwgdm9pZCBPbk9LKCkgeyBFbmQoSURPSyk7IH0NCisgIHZpcnR1YWwgdm9pZCBPbkNhbmNlbCgpIHsgRW5kKElEQ0FOQ0VMKTsgfQ0KK307DQorDQorY2xhc3MgQ0RpYWxvZ0NoaWxkQ29udHJvbDogcHVibGljIE5XaW5kb3dzOjpDV2luZG93DQorew0KKyAgaW50IG1fSUQ7DQorcHVibGljOg0KKyAgdm9pZCBJbml0KGNvbnN0IE5XaW5kb3dzOjpOQ29udHJvbDo6Q0RpYWxvZyAmcGFyZW50RGlhbG9nLCBpbnQgaWQpDQorICB7DQorICAgIG1fSUQgPSBpZDsNCisgICAgQXR0YWNoKHBhcmVudERpYWxvZy5HZXRJdGVtKGlkKSk7DQorICB9DQorfTsNCisNCitib29sIElzRGlhbG9nU2l6ZU9LKGludCB4U2l6ZSwgaW50IHlTaXplKTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9FZGl0LmggYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvRWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTM4OTkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvRWRpdC5oCkBAIC0wLDAgKzEsMTkgQEAKKy8vIFdpbmRvd3MvQ29udHJvbC9FZGl0LmgNCisNCisjaWZuZGVmIF9fV0lORE9XU19DT05UUk9MX0VESVRfSA0KKyNkZWZpbmUgX19XSU5ET1dTX0NPTlRST0xfRURJVF9IDQorDQorI2luY2x1ZGUgIi4uL1dpbmRvdy5oIg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorbmFtZXNwYWNlIE5Db250cm9sIHsNCisNCitjbGFzcyBDRWRpdDogcHVibGljIENXaW5kb3cNCit7DQorcHVibGljOg0KKyAgdm9pZCBTZXRQYXNzd29yZENoYXIoV1BBUkFNIGMpIHsgU2VuZE1lc3NhZ2UoRU1fU0VUUEFTU1dPUkRDSEFSLCBjKTsgfQ0KK307DQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvSW1hZ2VMaXN0LmNwcCBiL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9JbWFnZUxpc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDFjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvSW1hZ2VMaXN0LmNwcApAQCAtMCwwICsxLDEwIEBACisvLyBXaW5kb3dzL0NvbnRyb2wvSW1hZ2VMaXN0LmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiSW1hZ2VMaXN0LmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkNvbnRyb2wgew0KKw0KK319DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9Db250cm9sL0ltYWdlTGlzdC5oIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL0ltYWdlTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MmVhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvSW1hZ2VMaXN0LmgKQEAgLTAsMCArMSw4NyBAQAorLy8gV2luZG93cy9Db250cm9sL0ltYWdlTGlzdC5oDQorDQorI2lmbmRlZiBfX1dJTkRPV1NfQ09OVFJPTF9JTUFHRV9MSVNUX0gNCisjZGVmaW5lIF9fV0lORE9XU19DT05UUk9MX0lNQUdFX0xJU1RfSA0KKw0KKyNpbmNsdWRlIDxjb21tY3RybC5oPg0KKw0KKyNpbmNsdWRlICIuLi9EZWZzLmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkNvbnRyb2wgew0KKw0KK2NsYXNzIENJbWFnZUxpc3QNCit7DQorICBISU1BR0VMSVNUIG1fT2JqZWN0Ow0KK3B1YmxpYzoNCisgIG9wZXJhdG9yIEhJTUFHRUxJU1QoKSBjb25zdCB7cmV0dXJuIG1fT2JqZWN0OyB9DQorICBDSW1hZ2VMaXN0KCk6IG1fT2JqZWN0KE5VTEwpIHt9DQorICBib29sIEF0dGFjaChISU1BR0VMSVNUIGltYWdlTGlzdCkNCisgIHsNCisgICAgaWYgKGltYWdlTGlzdCA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgbV9PYmplY3QgPSBpbWFnZUxpc3Q7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKw0KKyAgSElNQUdFTElTVCBEZXRhY2goKQ0KKyAgew0KKyAgICBISU1BR0VMSVNUIGltYWdlTGlzdCA9IG1fT2JqZWN0Ow0KKyAgICBtX09iamVjdCA9IE5VTEw7DQorICAgIHJldHVybiBpbWFnZUxpc3Q7DQorICB9DQorICANCisgIGJvb2wgQ3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgVUlOVCBmbGFncywgaW50IGluaXRpYWxOdW1iZXIsIGludCBncm93KQ0KKyAgew0KKyAgICBISU1BR0VMSVNUIGEgPSBJbWFnZUxpc3RfQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZsYWdzLA0KKyAgICAgIGluaXRpYWxOdW1iZXIsIGdyb3cpOw0KKyAgICBpZiAoYSA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgcmV0dXJuIEF0dGFjaChhKTsNCisgIH0NCisgIA0KKyAgYm9vbCBEZXN0cm95KCkgLy8gRGVsZXRlSW1hZ2VMaXN0KCkgaW4gTUZDDQorICB7DQorICAgIGlmIChtX09iamVjdCA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgcmV0dXJuIEJPT0xUb0Jvb2woSW1hZ2VMaXN0X0Rlc3Ryb3koRGV0YWNoKCkpKTsNCisgIH0NCisNCisgIH5DSW1hZ2VMaXN0KCkNCisgICAgeyBEZXN0cm95KCk7IH0NCisNCisgIGludCBHZXRJbWFnZUNvdW50KCkgY29uc3QNCisgICAgeyByZXR1cm4gSW1hZ2VMaXN0X0dldEltYWdlQ291bnQobV9PYmplY3QpOyB9DQorDQorICBib29sIEdldEltYWdlSW5mbyhpbnQgaW5kZXgsIElNQUdFSU5GTyogaW1hZ2VJbmZvKSBjb25zdA0KKyAgICB7IHJldHVybiBCT09MVG9Cb29sKEltYWdlTGlzdF9HZXRJbWFnZUluZm8obV9PYmplY3QsIGluZGV4LCBpbWFnZUluZm8pKTsgfQ0KKw0KKyAgaW50IEFkZChIQklUTUFQIGhibUltYWdlLCBIQklUTUFQIGhibU1hc2sgPSAwKQ0KKyAgICB7IHJldHVybiBJbWFnZUxpc3RfQWRkKG1fT2JqZWN0LCBoYm1JbWFnZSwgaGJtTWFzayk7IH0NCisgIGludCBBZGRNYXNrZWQoSEJJVE1BUCBoYm1JbWFnZSwgQ09MT1JSRUYgbWFzaykNCisgICAgeyByZXR1cm4gSW1hZ2VMaXN0X0FkZE1hc2tlZChtX09iamVjdCwgaGJtSW1hZ2UsIG1hc2spOyB9DQorICBpbnQgQWRkSWNvbihISUNPTiBpY29uKQ0KKyAgICB7IHJldHVybiBJbWFnZUxpc3RfQWRkSWNvbihtX09iamVjdCwgaWNvbik7IH0NCisgIGludCBSZXBsYWNlKGludCBpbmRleCwgSElDT04gaWNvbikNCisgICAgeyByZXR1cm4gSW1hZ2VMaXN0X1JlcGxhY2VJY29uKG1fT2JqZWN0LCBpbmRleCwgaWNvbik7IH0NCisNCisgIC8vIElmIGluZGV4IGlzIC0xLCB0aGUgZnVuY3Rpb24gcmVtb3ZlcyBhbGwgaW1hZ2VzLg0KKyAgYm9vbCBSZW1vdmUoaW50IGluZGV4KQ0KKyAgICB7IHJldHVybiBCT09MVG9Cb29sKEltYWdlTGlzdF9SZW1vdmUobV9PYmplY3QsIGluZGV4KSk7IH0NCisgIGJvb2wgUmVtb3ZlQWxsKCkNCisgICAgeyByZXR1cm4gQk9PTFRvQm9vbChJbWFnZUxpc3RfUmVtb3ZlQWxsKG1fT2JqZWN0KSk7IH0NCisNCisgIEhJQ09OIEV4dHJhY3RJY29uKGludCBpbmRleCkNCisgICAgeyByZXR1cm4gSW1hZ2VMaXN0X0V4dHJhY3RJY29uKE5VTEwsIG1fT2JqZWN0LCBpbmRleCk7IH0NCisgIEhJQ09OIEdldEljb24oaW50IGluZGV4LCBVSU5UIGZsYWdzKQ0KKyAgICB7IHJldHVybiBJbWFnZUxpc3RfR2V0SWNvbihtX09iamVjdCwgaW5kZXgsIGZsYWdzKTsgfQ0KKw0KKyAgYm9vbCBHZXRJY29uU2l6ZShpbnQgJndpZHRoLCBpbnQgJmhlaWdodCkgY29uc3QNCisgICAgeyByZXR1cm4gQk9PTFRvQm9vbChJbWFnZUxpc3RfR2V0SWNvblNpemUobV9PYmplY3QsICZ3aWR0aCwgJmhlaWdodCkpOyB9DQorICBib29sIFNldEljb25TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkNCisgICAgeyByZXR1cm4gQk9PTFRvQm9vbChJbWFnZUxpc3RfU2V0SWNvblNpemUobV9PYmplY3QsIHdpZHRoLCBoZWlnaHQpKTsgfQ0KK307DQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvTGlzdFZpZXcuY3BwIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL0xpc3RWaWV3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjIyZjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL0xpc3RWaWV3LmNwcApAQCAtMCwwICsxLDE1NSBAQAorLy8gV2luZG93cy9Db250cm9sL0xpc3RWaWV3LmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiTGlzdFZpZXcuaCINCisNCisjaWZuZGVmIF9VTklDT0RFDQorZXh0ZXJuIGJvb2wgZ19Jc05UOw0KKyNlbmRpZg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorbmFtZXNwYWNlIE5Db250cm9sIHsNCisNCitib29sIENMaXN0Vmlldzo6Q3JlYXRlRXgoRFdPUkQgZXhTdHlsZSwgRFdPUkQgc3R5bGUsDQorICAgICAgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsDQorICAgICAgSFdORCBwYXJlbnRXaW5kb3csIEhNRU5VIGlkT3JITWVudSwNCisgICAgICBISU5TVEFOQ0UgaW5zdGFuY2UsIExQVk9JRCBjcmVhdGVQYXJhbSkNCit7DQorICByZXR1cm4gQ1dpbmRvdzo6Q3JlYXRlRXgoZXhTdHlsZSwgV0NfTElTVFZJRVcsIFRFWFQoIiIpLCBzdHlsZSwgeCwgeSwgd2lkdGgsDQorICAgICAgaGVpZ2h0LCBwYXJlbnRXaW5kb3csIGlkT3JITWVudSwgaW5zdGFuY2UsIGNyZWF0ZVBhcmFtKTsNCit9DQorDQorYm9vbCBDTGlzdFZpZXc6OkdldEl0ZW1QYXJhbShpbnQgaW5kZXgsIExQQVJBTSAmcGFyYW0pIGNvbnN0DQorew0KKyAgTFZJVEVNIGl0ZW07DQorICBpdGVtLmlJdGVtID0gaW5kZXg7DQorICBpdGVtLmlTdWJJdGVtID0gMDsNCisgIGl0ZW0ubWFzayA9IExWSUZfUEFSQU07DQorICBib29sIGFSZXN1bHQgPSBHZXRJdGVtKCZpdGVtKTsNCisgIHBhcmFtID0gaXRlbS5sUGFyYW07DQorICByZXR1cm4gYVJlc3VsdDsNCit9DQorDQoraW50IENMaXN0Vmlldzo6SW5zZXJ0Q29sdW1uKGludCBjb2x1bW5JbmRleCwgTFBDVFNUUiB0ZXh0LCBpbnQgd2lkdGgpDQorew0KKyAgTFZDT0xVTU4gY2k7DQorICBjaS5tYXNrID0gTFZDRl9URVhUIHwgTFZDRl9XSURUSCB8IExWQ0ZfU1VCSVRFTTsNCisgIGNpLnBzelRleHQgPSAoTFBUU1RSKXRleHQ7DQorICBjaS5pU3ViSXRlbSA9IGNvbHVtbkluZGV4Ow0KKyAgY2kuY3ggPSB3aWR0aDsNCisgIHJldHVybiBJbnNlcnRDb2x1bW4oY29sdW1uSW5kZXgsICZjaSk7DQorfQ0KKw0KK2ludCBDTGlzdFZpZXc6Okluc2VydEl0ZW0oaW50IGluZGV4LCBMUENUU1RSIHRleHQpDQorew0KKyAgTFZJVEVNIGl0ZW07DQorICBpdGVtLm1hc2sgPSBMVklGX1RFWFQgfCBMVklGX1BBUkFNOw0KKyAgaXRlbS5pSXRlbSA9IGluZGV4Ow0KKyAgaXRlbS5sUGFyYW0gPSBpbmRleDsNCisgIGl0ZW0ucHN6VGV4dCA9IChMUFRTVFIpdGV4dDsNCisgIGl0ZW0uaVN1Ykl0ZW0gPSAwOw0KKyAgcmV0dXJuIEluc2VydEl0ZW0oJml0ZW0pOw0KK30NCisNCitpbnQgQ0xpc3RWaWV3OjpTZXRTdWJJdGVtKGludCBpbmRleCwgaW50IHN1YkluZGV4LCBMUENUU1RSIHRleHQpDQorew0KKyAgTFZJVEVNIGl0ZW07DQorICBpdGVtLm1hc2sgPSBMVklGX1RFWFQ7DQorICBpdGVtLmlJdGVtID0gaW5kZXg7DQorICBpdGVtLnBzelRleHQgPSAoTFBUU1RSKXRleHQ7DQorICBpdGVtLmlTdWJJdGVtID0gc3ViSW5kZXg7DQorICByZXR1cm4gU2V0SXRlbSgmaXRlbSk7DQorfQ0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCisNCitpbnQgQ0xpc3RWaWV3OjpJbnNlcnRDb2x1bW4oaW50IGNvbHVtbkluZGV4LCBMUENXU1RSIHRleHQsIGludCB3aWR0aCkNCit7DQorICBMVkNPTFVNTlcgY2k7DQorICBjaS5tYXNrID0gTFZDRl9URVhUIHwgTFZDRl9XSURUSCB8IExWQ0ZfU1VCSVRFTTsNCisgIGNpLnBzelRleHQgPSAoTFBXU1RSKXRleHQ7DQorICBjaS5pU3ViSXRlbSA9IGNvbHVtbkluZGV4Ow0KKyAgY2kuY3ggPSB3aWR0aDsNCisgIHJldHVybiBJbnNlcnRDb2x1bW4oY29sdW1uSW5kZXgsICZjaSk7DQorfQ0KKw0KK2ludCBDTGlzdFZpZXc6Okluc2VydEl0ZW0oaW50IGluZGV4LCBMUENXU1RSIHRleHQpDQorew0KKyAgTFZJVEVNVyBpdGVtOw0KKyAgaXRlbS5tYXNrID0gTFZJRl9URVhUIHwgTFZJRl9QQVJBTTsNCisgIGl0ZW0uaUl0ZW0gPSBpbmRleDsNCisgIGl0ZW0ubFBhcmFtID0gaW5kZXg7DQorICBpdGVtLnBzelRleHQgPSAoTFBXU1RSKXRleHQ7DQorICBpdGVtLmlTdWJJdGVtID0gMDsNCisgIHJldHVybiBJbnNlcnRJdGVtKCZpdGVtKTsNCit9DQorDQoraW50IENMaXN0Vmlldzo6U2V0U3ViSXRlbShpbnQgaW5kZXgsIGludCBzdWJJbmRleCwgTFBDV1NUUiB0ZXh0KQ0KK3sNCisgIExWSVRFTVcgaXRlbTsNCisgIGl0ZW0ubWFzayA9IExWSUZfVEVYVDsNCisgIGl0ZW0uaUl0ZW0gPSBpbmRleDsNCisgIGl0ZW0ucHN6VGV4dCA9IChMUFdTVFIpdGV4dDsNCisgIGl0ZW0uaVN1Ykl0ZW0gPSBzdWJJbmRleDsNCisgIHJldHVybiBTZXRJdGVtKCZpdGVtKTsNCit9DQorDQorI2VuZGlmDQorDQorc3RhdGljIExSRVNVTFQgQVBJRU5UUlkgTGlzdFZpZXdTdWJjbGFzc1Byb2MoSFdORCBod25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pDQorew0KKyAgQ1dpbmRvdyB3aW5kb3coaHduZCk7DQorICBDTGlzdFZpZXcyICp3ID0gKENMaXN0VmlldzIgKikod2luZG93LkdldFVzZXJEYXRhTG9uZ1B0cigpKTsNCisgIGlmICh3ID09IE5VTEwpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIHctPk9uTWVzc2FnZShtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7DQorfQ0KKw0KK0xSRVNVTFQgQ0xpc3RWaWV3Mjo6T25NZXNzYWdlKFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkNCit7DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBpZiAoZ19Jc05UKQ0KKyAgICByZXR1cm4gQ2FsbFdpbmRvd1Byb2NXKF9vcmlnV2luZG93UHJvYywgKnRoaXMsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsNCisgIGVsc2UNCisgICNlbmRpZg0KKyAgICByZXR1cm4gQ2FsbFdpbmRvd1Byb2MoX29yaWdXaW5kb3dQcm9jLCAqdGhpcywgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOw0KK30NCisNCit2b2lkIENMaXN0VmlldzI6OlNldFdpbmRvd1Byb2MoKQ0KK3sNCisgIFNldFVzZXJEYXRhTG9uZ1B0cigoTE9OR19QVFIpdGhpcyk7DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBpZiAoZ19Jc05UKQ0KKyAgICBfb3JpZ1dpbmRvd1Byb2MgPSAoV05EUFJPQylTZXRMb25nUHRyVyhHV0xQX1dORFBST0MsIChMT05HX1BUUilMaXN0Vmlld1N1YmNsYXNzUHJvYyk7DQorICBlbHNlDQorICAjZW5kaWYNCisgICAgX29yaWdXaW5kb3dQcm9jID0gKFdORFBST0MpU2V0TG9uZ1B0cihHV0xQX1dORFBST0MsIChMT05HX1BUUilMaXN0Vmlld1N1YmNsYXNzUHJvYyk7DQorfQ0KKw0KKy8qDQorTFJFU1VMVCBDTGlzdFZpZXczOjpPbk1lc3NhZ2UoVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQ0KK3sNCisgIExSRVNVTFQgcmVzID0gQ0xpc3RWaWV3Mjo6T25NZXNzYWdlKG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsNCisgIGlmIChtZXNzYWdlID09IFdNX0dFVERMR0NPREUpDQorICB7DQorICAgIC8vIHdoZW4gdXNlciBwcmVzc2VzIFJFVFVSTiwgd2luZG93cyBzZW5kcyBkZWZhdWx0IChmaXJzdCkgYnV0dG9uIGNvbW1hbmQgdG8gcGFyZW50IGRpYWxvZy4NCisgICAgLy8gd2UgZGlzYWJsZSB0aGlzOg0KKyAgICBNU0cgKm1zZyA9IChNU0cgKilsUGFyYW07DQorICAgIFdQQVJBTSBrZXkgPSB3UGFyYW07DQorICAgIGJvb2wgY2hhbmdlID0gZmFsc2U7DQorICAgIGlmIChtc2cpDQorICAgIHsNCisgICAgICBpZiAobXNnLT5tZXNzYWdlID09IFdNX0tFWURPV04gJiYgbXNnLT53UGFyYW0gPT0gVktfUkVUVVJOKQ0KKyAgICAgICAgY2hhbmdlID0gdHJ1ZTsNCisgICAgfQ0KKyAgICBlbHNlIGlmICh3UGFyYW0gPT0gVktfUkVUVVJOKQ0KKyAgICAgIGNoYW5nZSA9IHRydWU7DQorICAgIGlmIChjaGFuZ2UpDQorICAgICAgcmVzIHw9IERMR0NfV0FOVEFMTEtFWVM7DQorICB9DQorICByZXR1cm4gcmVzOw0KK30NCisqLw0KKyAgDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvTGlzdFZpZXcuaCBiL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9MaXN0Vmlldy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OTdjODEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvTGlzdFZpZXcuaApAQCAtMCwwICsxLDEzMiBAQAorLy8gV2luZG93cy9Db250cm9sL0xpc3RWaWV3LmgNCisNCisjaWZuZGVmIF9fV0lORE9XU19DT05UUk9MX0xJU1RWSUVXX0gNCisjZGVmaW5lIF9fV0lORE9XU19DT05UUk9MX0xJU1RWSUVXX0gNCisNCisjaW5jbHVkZSAiLi4vV2luZG93LmgiDQorDQorI2luY2x1ZGUgPGNvbW1jdHJsLmg+DQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkNvbnRyb2wgew0KKw0KK2NsYXNzIENMaXN0VmlldzogcHVibGljIE5XaW5kb3dzOjpDV2luZG93DQorew0KK3B1YmxpYzoNCisgIGJvb2wgQ3JlYXRlRXgoRFdPUkQgZXhTdHlsZSwgRFdPUkQgc3R5bGUsDQorICAgICAgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsDQorICAgICAgSFdORCBwYXJlbnRXaW5kb3csIEhNRU5VIGlkT3JITWVudSwNCisgICAgICBISU5TVEFOQ0UgaW5zdGFuY2UsIExQVk9JRCBjcmVhdGVQYXJhbSk7DQorDQorICB2b2lkIFNldFVuaWNvZGVGb3JtYXQoKQ0KKyAgew0KKyAgICAjaWZuZGVmIFVOREVSX0NFDQorICAgIExpc3RWaWV3X1NldFVuaWNvZGVGb3JtYXQoX3dpbmRvdywgVFJVRSk7DQorICAgICNlbmRpZg0KKyAgfQ0KKyANCisgIGJvb2wgRGVsZXRlQWxsSXRlbXMoKSB7IHJldHVybiBCT09MVG9Cb29sKExpc3RWaWV3X0RlbGV0ZUFsbEl0ZW1zKF93aW5kb3cpKTsgfQ0KKyAgYm9vbCBEZWxldGVDb2x1bW4oaW50IGNvbHVtbkluZGV4KSB7IHJldHVybiBCT09MVG9Cb29sKExpc3RWaWV3X0RlbGV0ZUNvbHVtbihfd2luZG93LCBjb2x1bW5JbmRleCkpOyB9DQorDQorICBpbnQgSW5zZXJ0Q29sdW1uKGludCBjb2x1bW5JbmRleCwgY29uc3QgTFZDT0xVTU4gKmNvbHVtbkluZm8pIHsgcmV0dXJuIExpc3RWaWV3X0luc2VydENvbHVtbihfd2luZG93LCBjb2x1bW5JbmRleCwgY29sdW1uSW5mbyk7IH0NCisgIGludCBJbnNlcnRDb2x1bW4oaW50IGNvbHVtbkluZGV4LCBMUENUU1RSIHRleHQsIGludCB3aWR0aCk7DQorICBpbnQgSW5zZXJ0SXRlbShjb25zdCBMVklURU0qIGl0ZW0pIHsgcmV0dXJuIExpc3RWaWV3X0luc2VydEl0ZW0oX3dpbmRvdywgaXRlbSk7IH0NCisgIGludCBJbnNlcnRJdGVtKGludCBpbmRleCwgTFBDVFNUUiB0ZXh0KTsNCisgIGJvb2wgU2V0SXRlbShjb25zdCBMVklURU0qIGl0ZW0pIHsgcmV0dXJuIEJPT0xUb0Jvb2woTGlzdFZpZXdfU2V0SXRlbShfd2luZG93LCBpdGVtKSk7IH0NCisgIGludCBTZXRTdWJJdGVtKGludCBpbmRleCwgaW50IHN1YkluZGV4LCBMUENUU1RSIHRleHQpOw0KKw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKw0KKyAgaW50IEluc2VydENvbHVtbihpbnQgY29sdW1uSW5kZXgsIGNvbnN0IExWQ09MVU1OVyAqY29sdW1uSW5mbykgeyByZXR1cm4gKGludClTZW5kTWVzc2FnZShMVk1fSU5TRVJUQ09MVU1OVywgKFdQQVJBTSljb2x1bW5JbmRleCwgKExQQVJBTSljb2x1bW5JbmZvKTsgfQ0KKyAgaW50IEluc2VydENvbHVtbihpbnQgY29sdW1uSW5kZXgsIExQQ1dTVFIgdGV4dCwgaW50IHdpZHRoKTsNCisgIGludCBJbnNlcnRJdGVtKGNvbnN0IExWX0lURU1XKiBpdGVtKSB7IHJldHVybiAoaW50KVNlbmRNZXNzYWdlKExWTV9JTlNFUlRJVEVNVywgMCwgKExQQVJBTSlpdGVtKTsgfQ0KKyAgaW50IEluc2VydEl0ZW0oaW50IGluZGV4LCBMUENXU1RSIHRleHQpOw0KKyAgYm9vbCBTZXRJdGVtKGNvbnN0IExWX0lURU1XKiBpdGVtKSB7IHJldHVybiBCT09MVG9Cb29sKChCT09MKVNlbmRNZXNzYWdlKExWTV9TRVRJVEVNVywgMCwgKExQQVJBTSlpdGVtKSk7IH0NCisgIGludCBTZXRTdWJJdGVtKGludCBpbmRleCwgaW50IHN1YkluZGV4LCBMUENXU1RSIHRleHQpOw0KKw0KKyAgI2VuZGlmDQorDQorICBib29sIERlbGV0ZUl0ZW0oaW50IGl0ZW1JbmRleCkgeyByZXR1cm4gQk9PTFRvQm9vbChMaXN0Vmlld19EZWxldGVJdGVtKF93aW5kb3csIGl0ZW1JbmRleCkpOyB9DQorDQorICBVSU5UIEdldFNlbGVjdGVkQ291bnQoKSBjb25zdCB7IHJldHVybiBMaXN0Vmlld19HZXRTZWxlY3RlZENvdW50KF93aW5kb3cpOyB9DQorICBpbnQgR2V0SXRlbUNvdW50KCkgY29uc3QgeyByZXR1cm4gTGlzdFZpZXdfR2V0SXRlbUNvdW50KF93aW5kb3cpOyB9DQorDQorICBJTlQgR2V0U2VsZWN0aW9uTWFyaygpIGNvbnN0IHsgcmV0dXJuIExpc3RWaWV3X0dldFNlbGVjdGlvbk1hcmsoX3dpbmRvdyk7IH0NCisNCisgIHZvaWQgU2V0SXRlbUNvdW50KGludCBudW1JdGVtcykgeyBMaXN0Vmlld19TZXRJdGVtQ291bnQoX3dpbmRvdywgbnVtSXRlbXMpOyB9DQorICB2b2lkIFNldEl0ZW1Db3VudEV4KGludCBudW1JdGVtcywgRFdPUkQgZmxhZ3MpIHsgIExpc3RWaWV3X1NldEl0ZW1Db3VudEV4KF93aW5kb3csIG51bUl0ZW1zLCBmbGFncyk7IH0NCisNCisgIGludCBHZXROZXh0SXRlbShpbnQgc3RhcnRJbmRleCwgVUlOVCBmbGFncykgY29uc3QgeyByZXR1cm4gTGlzdFZpZXdfR2V0TmV4dEl0ZW0oX3dpbmRvdywgc3RhcnRJbmRleCwgZmxhZ3MpOyB9DQorICBpbnQgR2V0TmV4dFNlbGVjdGVkSXRlbShpbnQgc3RhcnRJbmRleCkgY29uc3QgeyByZXR1cm4gR2V0TmV4dEl0ZW0oc3RhcnRJbmRleCwgTFZOSV9TRUxFQ1RFRCk7IH0NCisgIGludCBHZXRGb2N1c2VkSXRlbSgpIGNvbnN0IHsgcmV0dXJuIEdldE5leHRJdGVtKC0xLCBMVk5JX0ZPQ1VTRUQpOyB9DQorICANCisgIGJvb2wgR2V0SXRlbShMVklURU0qIGl0ZW0pIGNvbnN0IHsgcmV0dXJuIEJPT0xUb0Jvb2woTGlzdFZpZXdfR2V0SXRlbShfd2luZG93LCBpdGVtKSk7IH0NCisgIGJvb2wgR2V0SXRlbVBhcmFtKGludCBpdGVtSW5kZXgsIExQQVJBTSAmcGFyYW0pIGNvbnN0Ow0KKyAgdm9pZCBHZXRJdGVtVGV4dChpbnQgaXRlbUluZGV4LCBpbnQgc3ViSXRlbUluZGV4LCBMUFRTVFIgdGV4dCwgaW50IHRleHRTaXplTWF4KSBjb25zdA0KKyAgICB7IExpc3RWaWV3X0dldEl0ZW1UZXh0KF93aW5kb3csIGl0ZW1JbmRleCwgc3ViSXRlbUluZGV4LCB0ZXh0LCB0ZXh0U2l6ZU1heCk7IH0NCisgIGJvb2wgU29ydEl0ZW1zKFBGTkxWQ09NUEFSRSBjb21wYXJlRnVuY3Rpb24sIExQQVJBTSBkYXRhUGFyYW0pDQorICAgIHsgcmV0dXJuIEJPT0xUb0Jvb2woTGlzdFZpZXdfU29ydEl0ZW1zKF93aW5kb3csIGNvbXBhcmVGdW5jdGlvbiwgZGF0YVBhcmFtKSk7IH0NCisNCisgIHZvaWQgU2V0SXRlbVN0YXRlKGludCBpbmRleCwgVUlOVCBzdGF0ZSwgVUlOVCBtYXNrKSB7IExpc3RWaWV3X1NldEl0ZW1TdGF0ZShfd2luZG93LCBpbmRleCwgc3RhdGUsIG1hc2spOyB9DQorICB2b2lkIFNldEl0ZW1TdGF0ZV9TZWxlY3RlZChpbnQgaW5kZXgsIGJvb2wgc2VsZWN0KSB7IFNldEl0ZW1TdGF0ZShpbmRleCwgc2VsZWN0ID8gTFZJU19TRUxFQ1RFRCA6IDAsIExWSVNfU0VMRUNURUQpOyB9DQorICB2b2lkIFNldEl0ZW1TdGF0ZV9TZWxlY3RlZChpbnQgaW5kZXgpIHsgU2V0SXRlbVN0YXRlKGluZGV4LCBMVklTX1NFTEVDVEVELCBMVklTX1NFTEVDVEVEKTsgfQ0KKyAgdm9pZCBTZWxlY3RBbGwoKSB7IFNldEl0ZW1TdGF0ZV9TZWxlY3RlZCgtMSk7IH0NCisgIHZvaWQgU2V0SXRlbVN0YXRlX0ZvY3VzZWRTZWxlY3RlZChpbnQgaW5kZXgpIHsgU2V0SXRlbVN0YXRlKGluZGV4LCBMVklTX0ZPQ1VTRUQgfCBMVklTX1NFTEVDVEVELCBMVklTX0ZPQ1VTRUQgfCBMVklTX1NFTEVDVEVEKTsgfQ0KKyAgVUlOVCBHZXRJdGVtU3RhdGUoaW50IGluZGV4LCBVSU5UIG1hc2spIGNvbnN0IHsgcmV0dXJuIExpc3RWaWV3X0dldEl0ZW1TdGF0ZShfd2luZG93LCBpbmRleCwgbWFzayk7IH0NCisgIGJvb2wgSXNJdGVtU2VsZWN0ZWQoaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBHZXRJdGVtU3RhdGUoaW5kZXgsIExWSVNfU0VMRUNURUQpID09IExWSVNfU0VMRUNURUQ7IH0NCisNCisgIGJvb2wgR2V0Q29sdW1uKGludCBjb2x1bW5JbmRleCwgTFZDT0xVTU4qIGNvbHVtbkluZm8pIGNvbnN0DQorICAgIHsgcmV0dXJuIEJPT0xUb0Jvb2woTGlzdFZpZXdfR2V0Q29sdW1uKF93aW5kb3csIGNvbHVtbkluZGV4LCBjb2x1bW5JbmZvKSk7IH0NCisNCisgIEhJTUFHRUxJU1QgU2V0SW1hZ2VMaXN0KEhJTUFHRUxJU1QgaW1hZ2VMaXN0LCBpbnQgaW1hZ2VMaXN0VHlwZSkNCisgICAgeyByZXR1cm4gTGlzdFZpZXdfU2V0SW1hZ2VMaXN0KF93aW5kb3csIGltYWdlTGlzdCwgaW1hZ2VMaXN0VHlwZSk7IH0NCisNCisgIC8vIHZlcnNpb24gNC43MDogTlQ1IHwgKE5UNCArIGllMykgfCB3OTggfCAodzk1ICsgaWUzKQ0KKyAgRFdPUkQgR2V0RXh0ZW5kZWRMaXN0Vmlld1N0eWxlKCkgeyByZXR1cm4gTGlzdFZpZXdfR2V0RXh0ZW5kZWRMaXN0Vmlld1N0eWxlKF93aW5kb3cpOyB9DQorICB2b2lkIFNldEV4dGVuZGVkTGlzdFZpZXdTdHlsZShEV09SRCBleFN0eWxlKSB7IExpc3RWaWV3X1NldEV4dGVuZGVkTGlzdFZpZXdTdHlsZShfd2luZG93LCBleFN0eWxlKTsgfQ0KKyAgdm9pZCBTZXRFeHRlbmRlZExpc3RWaWV3U3R5bGUoRFdPUkQgZXhNYXNrLCBEV09SRCBleFN0eWxlKSB7IExpc3RWaWV3X1NldEV4dGVuZGVkTGlzdFZpZXdTdHlsZUV4KF93aW5kb3csIGV4TWFzaywgZXhTdHlsZSk7IH0NCisNCisgIHZvaWQgU2V0Q2hlY2tTdGF0ZShVSU5UIGluZGV4LCBib29sIGNoZWNrU3RhdGUpIHsgTGlzdFZpZXdfU2V0Q2hlY2tTdGF0ZShfd2luZG93LCBpbmRleCwgQm9vbFRvQk9PTChjaGVja1N0YXRlKSk7IH0NCisgIGJvb2wgR2V0Q2hlY2tTdGF0ZShVSU5UIGluZGV4KSB7IHJldHVybiBCT09MVG9Cb29sKExpc3RWaWV3X0dldENoZWNrU3RhdGUoX3dpbmRvdywgaW5kZXgpKTsgfQ0KKw0KKyAgYm9vbCBFbnN1cmVWaXNpYmxlKGludCBpbmRleCwgYm9vbCBwYXJ0aWFsT0spIHsgcmV0dXJuIEJPT0xUb0Jvb2woTGlzdFZpZXdfRW5zdXJlVmlzaWJsZShfd2luZG93LCBpbmRleCwgQm9vbFRvQk9PTChwYXJ0aWFsT0spKSk7IH0NCisNCisgIGJvb2wgR2V0SXRlbVJlY3QoaW50IGluZGV4LCBSRUNUICpyZWN0LCBpbnQgY29kZSkgeyByZXR1cm4gQk9PTFRvQm9vbChMaXN0Vmlld19HZXRJdGVtUmVjdChfd2luZG93LCBpbmRleCwgcmVjdCwgY29kZSkpOyB9DQorDQorICBIV05EIEdldEVkaXRDb250cm9sKCkgeyByZXR1cm4gTGlzdFZpZXdfR2V0RWRpdENvbnRyb2woX3dpbmRvdykgOyB9DQorICBIV05EIEVkaXRMYWJlbChpbnQgaXRlbUluZGV4KSB7IHJldHVybiBMaXN0Vmlld19FZGl0TGFiZWwoX3dpbmRvdywgaXRlbUluZGV4KSA7IH0NCisNCisgIGJvb2wgUmVkcmF3SXRlbXMoaW50IGZpcnN0SW5kZXgsIGludCBsYXN0SW5kZXgpIHsgcmV0dXJuIEJPT0xUb0Jvb2woTGlzdFZpZXdfUmVkcmF3SXRlbXMoX3dpbmRvdywgZmlyc3RJbmRleCwgbGFzdEluZGV4KSk7IH0NCisgIGJvb2wgUmVkcmF3QWxsSXRlbXMoKQ0KKyAgew0KKyAgICBpZiAoR2V0SXRlbUNvdW50KCkgPiAwKQ0KKyAgICAgIHJldHVybiBSZWRyYXdJdGVtcygwLCBHZXRJdGVtQ291bnQoKSAtIDEpOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIGJvb2wgUmVkcmF3SXRlbShpbnQgaW5kZXgpIHsgcmV0dXJuIFJlZHJhd0l0ZW1zKGluZGV4LCBpbmRleCk7IH0NCisgDQorICBpbnQgSGl0VGVzdChMUExWSElUVEVTVElORk8gaW5mbykgeyByZXR1cm4gTGlzdFZpZXdfSGl0VGVzdChfd2luZG93LCBpbmZvKTsgfQ0KKyAgQ09MT1JSRUYgR2V0QmtDb2xvcigpIHsgcmV0dXJuIExpc3RWaWV3X0dldEJrQ29sb3IoX3dpbmRvdyk7IH0NCisgIGJvb2wgU2V0Q29sdW1uV2lkdGgoaW50IGlDb2wsIGludCBjeCkgeyByZXR1cm4gQk9PTFRvQm9vbChMaXN0Vmlld19TZXRDb2x1bW5XaWR0aChfd2luZG93LCBpQ29sLCBjeCkpOyB9DQorICBib29sIFNldENvbHVtbldpZHRoQXV0byhpbnQgaUNvbCkgeyByZXR1cm4gU2V0Q29sdW1uV2lkdGgoaUNvbCwgTFZTQ1dfQVVUT1NJWkUpOyB9DQorfTsNCisNCitjbGFzcyBDTGlzdFZpZXcyOiBwdWJsaWMgQ0xpc3RWaWV3DQorew0KKyAgV05EUFJPQyBfb3JpZ1dpbmRvd1Byb2M7DQorcHVibGljOg0KKyAgdm9pZCBTZXRXaW5kb3dQcm9jKCk7DQorICB2aXJ0dWFsIExSRVNVTFQgT25NZXNzYWdlKFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7DQorfTsNCisNCisvKg0KK2NsYXNzIENMaXN0VmlldzM6IHB1YmxpYyBDTGlzdFZpZXcyDQorew0KK3B1YmxpYzoNCisgIHZpcnR1YWwgTFJFU1VMVCBPbk1lc3NhZ2UoVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsNCit9Ow0KKyovDQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvUHJvZ3Jlc3NCYXIuaCBiL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9Qcm9ncmVzc0Jhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZGM5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvUHJvZ3Jlc3NCYXIuaApAQCAtMCwwICsxLDMxIEBACisvLyBXaW5kb3dzL0NvbnRyb2wvUHJvZ3Jlc3NCYXIuaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX0NPTlRST0xfUFJPR1JFU1NCQVJfSA0KKyNkZWZpbmUgX19XSU5ET1dTX0NPTlRST0xfUFJPR1JFU1NCQVJfSA0KKw0KKyNpbmNsdWRlICIuLi9XaW5kb3cuaCINCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBOQ29udHJvbCB7DQorDQorY2xhc3MgQ1Byb2dyZXNzQmFyOiBwdWJsaWMgQ1dpbmRvdw0KK3sNCitwdWJsaWM6DQorICBMUkVTVUxUIFNldFBvcyhpbnQgcG9zKSB7IHJldHVybiBTZW5kTWVzc2FnZShQQk1fU0VUUE9TLCBwb3MsIDApOyB9DQorICBMUkVTVUxUIERlbHRhUG9zKGludCBpbmNyZW1lbnQpIHsgcmV0dXJuIFNlbmRNZXNzYWdlKFBCTV9ERUxUQVBPUywgaW5jcmVtZW50LCAwKTsgfQ0KKyAgVUlOVCBHZXRQb3MoKSB7IHJldHVybiAoVUlOVClTZW5kTWVzc2FnZShQQk1fR0VUUE9TLCAwLCAwKTsgfQ0KKyAgTFJFU1VMVCBTZXRSYW5nZSh1bnNpZ25lZCBzaG9ydCBtaW5WYWx1ZSwgdW5zaWduZWQgc2hvcnQgbWF4VmFsdWUpIHsgcmV0dXJuIFNlbmRNZXNzYWdlKFBCTV9TRVRSQU5HRSwgMCwgTUFLRUxQQVJBTShtaW5WYWx1ZSwgbWF4VmFsdWUpKTsgfQ0KKyAgRFdPUkQgU2V0UmFuZ2UzMihpbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSkgeyByZXR1cm4gKERXT1JEKVNlbmRNZXNzYWdlKFBCTV9TRVRSQU5HRTMyLCBtaW5WYWx1ZSwgbWF4VmFsdWUpOyB9DQorICBpbnQgU2V0U3RlcChpbnQgc3RlcCkgeyByZXR1cm4gKGludClTZW5kTWVzc2FnZShQQk1fU0VUU1RFUCwgc3RlcCwgMCk7IH0NCisgIExSRVNVTFQgU3RlcEl0KCkgeyByZXR1cm4gU2VuZE1lc3NhZ2UoUEJNX1NURVBJVCwgMCwgMCk7IH0NCisgIElOVCBHZXRSYW5nZShib29sIG1pblZhbHVlLCBQUEJSQU5HRSByYW5nZSkgeyByZXR1cm4gKElOVClTZW5kTWVzc2FnZShQQk1fR0VUUkFOR0UsIEJvb2xUb0JPT0wobWluVmFsdWUpLCAoTFBBUkFNKXJhbmdlKTsgfQ0KKyAgDQorICAjaWZuZGVmIFVOREVSX0NFDQorICBDT0xPUlJFRiBTZXRCYXJDb2xvcihDT0xPUlJFRiBjb2xvcikgeyByZXR1cm4gKENPTE9SUkVGKVNlbmRNZXNzYWdlKFBCTV9TRVRCQVJDT0xPUiwgMCwgY29sb3IpOyB9DQorICBDT0xPUlJFRiBTZXRCYWNrZ3JvdW5kQ29sb3IoQ09MT1JSRUYgY29sb3IpIHsgcmV0dXJuIChDT0xPUlJFRilTZW5kTWVzc2FnZShQQk1fU0VUQktDT0xPUiwgMCwgY29sb3IpOyB9DQorICAjZW5kaWYNCit9Ow0KKw0KK319DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9Db250cm9sL1Byb3BlcnR5UGFnZS5jcHAgYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvUHJvcGVydHlQYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk0MGM4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL1Byb3BlcnR5UGFnZS5jcHAKQEAgLTAsMCArMSwxNDMgQEAKKy8vIFdpbmRvd3MvQ29udHJvbC9Qcm9wZXJ0eVBhZ2UuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiUHJvcGVydHlQYWdlLmgiDQorDQorZXh0ZXJuIEhJTlNUQU5DRSBnX2hJbnN0YW5jZTsNCisjaWZuZGVmIF9VTklDT0RFDQorZXh0ZXJuIGJvb2wgZ19Jc05UOw0KKyNlbmRpZg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorbmFtZXNwYWNlIE5Db250cm9sIHsNCisNCitzdGF0aWMgSU5UX1BUUiBBUElFTlRSWSBNeVByb3BlcnlQYWdlUHJvY2VkdXJlKEhXTkQgZGlhbG9nSFdORCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQ0KK3sNCisgIENXaW5kb3cgdGVtcERpYWxvZyhkaWFsb2dIV05EKTsNCisgIGlmIChtZXNzYWdlID09IFdNX0lOSVRESUFMT0cpDQorICAgIHRlbXBEaWFsb2cuU2V0VXNlckRhdGFMb25nUHRyKCgoUFJPUFNIRUVUUEFHRSAqKWxQYXJhbSktPmxQYXJhbSk7DQorICBDRGlhbG9nICpkaWFsb2cgPSAoQ0RpYWxvZyAqKSh0ZW1wRGlhbG9nLkdldFVzZXJEYXRhTG9uZ1B0cigpKTsNCisgIGlmIChkaWFsb2cgPT0gTlVMTCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaWYgKG1lc3NhZ2UgPT0gV01fSU5JVERJQUxPRykNCisgICAgZGlhbG9nLT5BdHRhY2goZGlhbG9nSFdORCk7DQorICB0cnkgeyByZXR1cm4gQm9vbFRvQk9PTChkaWFsb2ctPk9uTWVzc2FnZShtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSkpOyB9DQorICBjYXRjaCguLi4pIHsgcmV0dXJuIFRSVUU7IH0NCit9DQorDQorYm9vbCBDUHJvcGVydHlQYWdlOjpPbk5vdGlmeShVSU5UIC8qIGNvbnRyb2xJRCAqLywgTFBOTUhEUiBsUGFyYW0pDQorew0KKyAgc3dpdGNoIChsUGFyYW0tPmNvZGUpDQorICB7DQorICAgIGNhc2UgUFNOX0FQUExZOiBTZXRNc2dSZXN1bHQoT25BcHBseShMUFBTSE5PVElGWShsUGFyYW0pKSk7IGJyZWFrOw0KKyAgICBjYXNlIFBTTl9LSUxMQUNUSVZFOiBTZXRNc2dSZXN1bHQoQm9vbFRvQk9PTChPbktpbGxBY3RpdmUoTFBQU0hOT1RJRlkobFBhcmFtKSkpKTsgYnJlYWs7DQorICAgIGNhc2UgUFNOX1NFVEFDVElWRTogU2V0TXNnUmVzdWx0KE9uU2V0QWN0aXZlKExQUFNITk9USUZZKGxQYXJhbSkpKTsgYnJlYWs7DQorICAgIGNhc2UgUFNOX1JFU0VUOiBPblJlc2V0KExQUFNITk9USUZZKGxQYXJhbSkpOyBicmVhazsNCisgICAgY2FzZSBQU05fSEVMUDogT25Ob3RpZnlIZWxwKExQUFNITk9USUZZKGxQYXJhbSkpOyBicmVhazsNCisgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK0lOVF9QVFIgTXlQcm9wZXJ0eVNoZWV0KGNvbnN0IENPYmplY3RWZWN0b3I8Q1BhZ2VJbmZvPiAmcGFnZXNJbmZvLCBIV05EIGh3bmRQYXJlbnQsIGNvbnN0IFVTdHJpbmcgJnRpdGxlKQ0KK3sNCisgICNpZm5kZWYgX1VOSUNPREUNCisgIEFTdHJpbmdWZWN0b3IgdGl0bGVzOw0KKyAgI2VuZGlmDQorICAjaWZuZGVmIF9VTklDT0RFDQorICBDUmVjb3JkVmVjdG9yPFBST1BTSEVFVFBBR0VBPiBwYWdlc0E7DQorICAjZW5kaWYNCisgIENSZWNvcmRWZWN0b3I8UFJPUFNIRUVUUEFHRVc+IHBhZ2VzVzsNCisNCisgIHVuc2lnbmVkIGk7DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNJbmZvLlNpemUoKTsgaSsrKQ0KKyAgICB0aXRsZXMuQWRkKEdldFN5c3RlbVN0cmluZyhwYWdlc0luZm9baV0uVGl0bGUpKTsNCisgICNlbmRpZg0KKw0KKyAgZm9yIChpID0gMDsgaSA8IHBhZ2VzSW5mby5TaXplKCk7IGkrKykNCisgIHsNCisgICAgY29uc3QgQ1BhZ2VJbmZvICZwYWdlSW5mbyA9IHBhZ2VzSW5mb1tpXTsNCisgICAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgICB7DQorICAgICAgUFJPUFNIRUVUUEFHRSBwYWdlOw0KKyAgICAgIHBhZ2UuZHdTaXplID0gc2l6ZW9mKHBhZ2UpOw0KKyAgICAgIHBhZ2UuZHdGbGFncyA9IFBTUF9IQVNIRUxQOw0KKyAgICAgIHBhZ2UuaEluc3RhbmNlID0gZ19oSW5zdGFuY2U7DQorICAgICAgcGFnZS5wc3pUZW1wbGF0ZSA9IE1BS0VJTlRSRVNPVVJDRShwYWdlSW5mby5JRCk7DQorICAgICAgcGFnZS5wc3pJY29uID0gTlVMTDsNCisgICAgICBwYWdlLnBmbkRsZ1Byb2MgPSBOV2luZG93czo6TkNvbnRyb2w6Ok15UHJvcGVyeVBhZ2VQcm9jZWR1cmU7DQorICAgICAgDQorICAgICAgaWYgKHRpdGxlc1tpXS5Jc0VtcHR5KCkpDQorICAgICAgICBwYWdlLnBzelRpdGxlID0gTlVMTDsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgcGFnZS5kd0ZsYWdzIHw9IFBTUF9VU0VUSVRMRTsNCisgICAgICAgIHBhZ2UucHN6VGl0bGUgPSB0aXRsZXNbaV07DQorICAgICAgfQ0KKyAgICAgIHBhZ2UubFBhcmFtID0gKExQQVJBTSlwYWdlSW5mby5QYWdlOw0KKyAgICAgIHBhZ2UucGZuQ2FsbGJhY2sgPSBOVUxMOw0KKyAgICAgIHBhZ2VzQS5BZGQocGFnZSk7DQorICAgIH0NCisgICAgI2VuZGlmDQorICAgIHsNCisgICAgICBQUk9QU0hFRVRQQUdFVyBwYWdlOw0KKyAgICAgIHBhZ2UuZHdTaXplID0gc2l6ZW9mKHBhZ2UpOw0KKyAgICAgIHBhZ2UuZHdGbGFncyA9IFBTUF9IQVNIRUxQOw0KKyAgICAgIHBhZ2UuaEluc3RhbmNlID0gZ19oSW5zdGFuY2U7DQorICAgICAgcGFnZS5wc3pUZW1wbGF0ZSA9IE1BS0VJTlRSRVNPVVJDRVcocGFnZUluZm8uSUQpOw0KKyAgICAgIHBhZ2UucHN6SWNvbiA9IE5VTEw7DQorICAgICAgcGFnZS5wZm5EbGdQcm9jID0gTldpbmRvd3M6Ok5Db250cm9sOjpNeVByb3BlcnlQYWdlUHJvY2VkdXJlOw0KKyAgICAgIA0KKyAgICAgIGlmIChwYWdlSW5mby5UaXRsZS5Jc0VtcHR5KCkpDQorICAgICAgICBwYWdlLnBzelRpdGxlID0gTlVMTDsNCisgICAgICBlbHNlDQorICAgICAgew0KKyAgICAgICAgcGFnZS5kd0ZsYWdzIHw9IFBTUF9VU0VUSVRMRTsNCisgICAgICAgIHBhZ2UucHN6VGl0bGUgPSBwYWdlSW5mby5UaXRsZTsNCisgICAgICB9DQorICAgICAgcGFnZS5sUGFyYW0gPSAoTFBBUkFNKXBhZ2VJbmZvLlBhZ2U7DQorICAgICAgcGFnZS5wZm5DYWxsYmFjayA9IE5VTEw7DQorICAgICAgcGFnZXNXLkFkZChwYWdlKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIFBST1BTSEVFVEhFQURFUiBzaGVldDsNCisgICAgc2hlZXQuZHdTaXplID0gc2l6ZW9mKHNoZWV0KTsNCisgICAgc2hlZXQuZHdGbGFncyA9IFBTSF9QUk9QU0hFRVRQQUdFOw0KKyAgICBzaGVldC5od25kUGFyZW50ID0gaHduZFBhcmVudDsNCisgICAgc2hlZXQuaEluc3RhbmNlID0gZ19oSW5zdGFuY2U7DQorICAgIEFTdHJpbmcgdGl0bGVBID0gR2V0U3lzdGVtU3RyaW5nKHRpdGxlKTsNCisgICAgc2hlZXQucHN6Q2FwdGlvbiA9IHRpdGxlQTsNCisgICAgc2hlZXQublBhZ2VzID0gcGFnZXNJbmZvLlNpemUoKTsNCisgICAgc2hlZXQublN0YXJ0UGFnZSA9IDA7DQorICAgIHNoZWV0LnBwc3AgPSAmcGFnZXNBLkZyb250KCk7DQorICAgIHNoZWV0LnBmbkNhbGxiYWNrID0gTlVMTDsNCisgICAgcmV0dXJuIDo6UHJvcGVydHlTaGVldEEoJnNoZWV0KTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBQUk9QU0hFRVRIRUFERVJXIHNoZWV0Ow0KKyAgICBzaGVldC5kd1NpemUgPSBzaXplb2Yoc2hlZXQpOw0KKyAgICBzaGVldC5kd0ZsYWdzID0gUFNIX1BST1BTSEVFVFBBR0U7DQorICAgIHNoZWV0Lmh3bmRQYXJlbnQgPSBod25kUGFyZW50Ow0KKyAgICBzaGVldC5oSW5zdGFuY2UgPSBnX2hJbnN0YW5jZTsNCisgICAgc2hlZXQucHN6Q2FwdGlvbiA9IHRpdGxlOw0KKyAgICBzaGVldC5uUGFnZXMgPSBwYWdlc0luZm8uU2l6ZSgpOw0KKyAgICBzaGVldC5uU3RhcnRQYWdlID0gMDsNCisgICAgc2hlZXQucHBzcCA9ICZwYWdlc1cuRnJvbnQoKTsNCisgICAgc2hlZXQucGZuQ2FsbGJhY2sgPSBOVUxMOw0KKyAgICByZXR1cm4gOjpQcm9wZXJ0eVNoZWV0Vygmc2hlZXQpOw0KKyAgfQ0KK30NCisNCit9fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9Qcm9wZXJ0eVBhZ2UuaCBiL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9Qcm9wZXJ0eVBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTNkZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL1Byb3BlcnR5UGFnZS5oCkBAIC0wLDAgKzEsNDggQEAKKy8vIFdpbmRvd3MvQ29udHJvbC9Qcm9wZXJ0eVBhZ2UuaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX0NPTlRST0xfUFJPUEVSVFlQQUdFX0gNCisjZGVmaW5lIF9fV0lORE9XU19DT05UUk9MX1BST1BFUlRZUEFHRV9IDQorDQorI2luY2x1ZGUgPHByc2h0Lmg+DQorDQorI2luY2x1ZGUgIkRpYWxvZy5oIg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorbmFtZXNwYWNlIE5Db250cm9sIHsNCisNCitJTlRfUFRSIEFQSUVOVFJZIFByb3BlcnlQYWdlUHJvY2VkdXJlKEhXTkQgZGlhbG9nSFdORCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsNCisNCitjbGFzcyBDUHJvcGVydHlQYWdlOiBwdWJsaWMgQ0RpYWxvZw0KK3sNCitwdWJsaWM6DQorICBDUHJvcGVydHlQYWdlKEhXTkQgd2luZG93ID0gTlVMTCk6IENEaWFsb2cod2luZG93KXt9Ow0KKyAgDQorICB2b2lkIENoYW5nZWQoKSB7IFByb3BTaGVldF9DaGFuZ2VkKEdldFBhcmVudCgpLCAoSFdORCkqdGhpcyk7IH0NCisgIHZvaWQgVW5DaGFuZ2VkKCkgeyBQcm9wU2hlZXRfVW5DaGFuZ2VkKEdldFBhcmVudCgpLCAoSFdORCkqdGhpcyk7IH0NCisNCisgIHZpcnR1YWwgYm9vbCBPbk5vdGlmeShVSU5UIGNvbnRyb2xJRCwgTFBOTUhEUiBsUGFyYW0pOw0KKw0KKyAgdmlydHVhbCBib29sIE9uS2lsbEFjdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9IC8vIGZhbHNlID0gT0sNCisgIHZpcnR1YWwgYm9vbCBPbktpbGxBY3RpdmUoY29uc3QgUFNITk9USUZZICopIHsgcmV0dXJuIE9uS2lsbEFjdGl2ZSgpOyB9DQorICB2aXJ0dWFsIExPTkcgT25TZXRBY3RpdmUoKSB7IHJldHVybiBmYWxzZTsgfSAvLyBmYWxzZSA9IE9LDQorICB2aXJ0dWFsIExPTkcgT25TZXRBY3RpdmUoY29uc3QgUFNITk9USUZZICopIHsgcmV0dXJuIE9uU2V0QWN0aXZlKCk7IH0NCisgIHZpcnR1YWwgTE9ORyBPbkFwcGx5KCkgeyByZXR1cm4gUFNOUkVUX05PRVJST1I7IH0NCisgIHZpcnR1YWwgTE9ORyBPbkFwcGx5KGNvbnN0IFBTSE5PVElGWSAqKSB7IHJldHVybiBPbkFwcGx5KCk7IH0NCisgIHZpcnR1YWwgdm9pZCBPbk5vdGlmeUhlbHAoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIE9uTm90aWZ5SGVscChjb25zdCBQU0hOT1RJRlkgKikgeyBPbk5vdGlmeUhlbHAoKTsgfQ0KKyAgdmlydHVhbCB2b2lkIE9uUmVzZXQoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIE9uUmVzZXQoY29uc3QgUFNITk9USUZZICopIHsgT25SZXNldCgpOyB9DQorfTsNCisNCitzdHJ1Y3QgQ1BhZ2VJbmZvDQorew0KKyAgQ1Byb3BlcnR5UGFnZSAqUGFnZTsNCisgIFVTdHJpbmcgVGl0bGU7DQorICBVSU5UIElEOw0KK307DQorDQorSU5UX1BUUiBNeVByb3BlcnR5U2hlZXQoY29uc3QgQ09iamVjdFZlY3RvcjxDUGFnZUluZm8+ICZwYWdlc0luZm8sIEhXTkQgaHduZFBhcmVudCwgY29uc3QgVVN0cmluZyAmdGl0bGUpOw0KKw0KK319DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9Db250cm9sL1JlQmFyLmggYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvUmVCYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQ3YmY0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL1JlQmFyLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gV2luZG93cy9Db250cm9sL1JlQmFyLmgNCisgIA0KKyNpZm5kZWYgX19XSU5ET1dTX0NPTlRST0xfUkVCQVJfSA0KKyNkZWZpbmUgX19XSU5ET1dTX0NPTlRST0xfUkVCQVJfSA0KKw0KKyNpbmNsdWRlICIuLi9XaW5kb3cuaCINCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBOQ29udHJvbCB7DQorDQorY2xhc3MgQ1JlQmFyOiBwdWJsaWMgTldpbmRvd3M6OkNXaW5kb3cNCit7DQorcHVibGljOg0KKyAgYm9vbCBTZXRCYXJJbmZvKExQUkVCQVJJTkZPIGJhckluZm8pDQorICAgIHsgcmV0dXJuIExSRVNVTFRUb0Jvb2woU2VuZE1lc3NhZ2UoUkJfU0VUQkFSSU5GTywgMCwgKExQQVJBTSliYXJJbmZvKSk7IH0NCisgIGJvb2wgSW5zZXJ0QmFuZChpbnQgaW5kZXgsIExQUkVCQVJCQU5ESU5GTyBiYW5kSW5mbykNCisgICAgeyByZXR1cm4gTFJFU1VMVFRvQm9vbChTZW5kTWVzc2FnZShSQl9JTlNFUlRCQU5ELCBpbmRleCwgKExQQVJBTSliYW5kSW5mbykpOyB9DQorICBib29sIFNldEJhbmRJbmZvKHVuc2lnbmVkIGluZGV4LCBMUFJFQkFSQkFORElORk8gYmFuZEluZm8pDQorICAgIHsgcmV0dXJuIExSRVNVTFRUb0Jvb2woU2VuZE1lc3NhZ2UoUkJfU0VUQkFORElORk8sIGluZGV4LCAoTFBBUkFNKWJhbmRJbmZvKSk7IH0NCisgIHZvaWQgTWF4aW1pemVCYW5kKHVuc2lnbmVkIGluZGV4LCBib29sIGlkZWFsKQ0KKyAgICB7IFNlbmRNZXNzYWdlKFJCX01BWElNSVpFQkFORCwgaW5kZXgsIEJvb2xUb0JPT0woaWRlYWwpKTsgfQ0KKyAgYm9vbCBTaXplVG9SZWN0KExQUkVDVCByZWN0KQ0KKyAgICB7IHJldHVybiBMUkVTVUxUVG9Cb29sKFNlbmRNZXNzYWdlKFJCX1NJWkVUT1JFQ1QsIDAsIChMUEFSQU0pcmVjdCkpOyB9DQorICBVSU5UIEdldEhlaWdodCgpDQorICAgIHsgcmV0dXJuIChVSU5UKVNlbmRNZXNzYWdlKFJCX0dFVEJBUkhFSUdIVCk7IH0NCisgIFVJTlQgR2V0QmFuZENvdW50KCkNCisgICAgeyByZXR1cm4gKFVJTlQpU2VuZE1lc3NhZ2UoUkJfR0VUQkFORENPVU5UKTsgfQ0KKyAgYm9vbCBEZWxldGVCYW5kKFVJTlQgaW5kZXgpDQorICAgIHsgcmV0dXJuIExSRVNVTFRUb0Jvb2woU2VuZE1lc3NhZ2UoUkJfREVMRVRFQkFORCwgaW5kZXgpKTsgfQ0KK307DQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvU3RhdGljLmggYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvU3RhdGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1YjllOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9TdGF0aWMuaApAQCAtMCwwICsxLDI4IEBACisvLyBXaW5kb3dzL0NvbnRyb2wvU3RhdGljLmgNCisNCisjaWZuZGVmIF9fV0lORE9XU19DT05UUk9MX1NUQVRJQ19IDQorI2RlZmluZSBfX1dJTkRPV1NfQ09OVFJPTF9TVEFUSUNfSA0KKw0KKyNpbmNsdWRlICIuLi9XaW5kb3cuaCINCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBOQ29udHJvbCB7DQorDQorY2xhc3MgQ1N0YXRpYzogcHVibGljIENXaW5kb3cNCit7DQorcHVibGljOg0KKyAgSEFORExFIFNldEltYWdlKFdQQVJBTSBpbWFnZVR5cGUsIEhBTkRMRSBoYW5kbGUpIHsgcmV0dXJuIChIQU5ETEUpU2VuZE1lc3NhZ2UoU1RNX1NFVElNQUdFLCBpbWFnZVR5cGUsIChMUEFSQU0paGFuZGxlKTsgfQ0KKyAgSEFORExFIEdldEltYWdlKFdQQVJBTSBpbWFnZVR5cGUpIHsgcmV0dXJuIChIQU5ETEUpU2VuZE1lc3NhZ2UoU1RNX0dFVElNQUdFLCBpbWFnZVR5cGUsIDApOyB9DQorDQorICAjaWZkZWYgVU5ERVJfQ0UNCisgIEhJQ09OIFNldEljb24oSElDT04gaWNvbikgeyByZXR1cm4gKEhJQ09OKVNldEltYWdlKElNQUdFX0lDT04sIGljb24pOyB9DQorICBISUNPTiBHZXRJY29uKCkgeyByZXR1cm4gKEhJQ09OKUdldEltYWdlKElNQUdFX0lDT04pOyB9DQorICAjZWxzZQ0KKyAgSElDT04gU2V0SWNvbihISUNPTiBpY29uKSB7IHJldHVybiAoSElDT04pU2VuZE1lc3NhZ2UoU1RNX1NFVElDT04sIChXUEFSQU0paWNvbiwgMCk7IH0NCisgIEhJQ09OIEdldEljb24oKSB7IHJldHVybiAoSElDT04pU2VuZE1lc3NhZ2UoU1RNX0dFVElDT04sIDAsIDApOyB9DQorICAjZW5kaWYNCit9Ow0KKw0KK319DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9Db250cm9sL1N0YXR1c0Jhci5oIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL1N0YXR1c0Jhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxODVjNDIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvU3RhdHVzQmFyLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gV2luZG93cy9Db250cm9sL1N0YXR1c0Jhci5oDQorDQorI2lmbmRlZiBfX1dJTkRPV1NfQ09OVFJPTF9TVEFUVVNCQVJfSA0KKyNkZWZpbmUgX19XSU5ET1dTX0NPTlRST0xfU1RBVFVTQkFSX0gNCisNCisjaW5jbHVkZSAiLi4vV2luZG93LmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkNvbnRyb2wgew0KKw0KK2NsYXNzIENTdGF0dXNCYXI6IHB1YmxpYyBOV2luZG93czo6Q1dpbmRvdw0KK3sNCitwdWJsaWM6DQorICBib29sIENyZWF0ZShMT05HIHN0eWxlLCBMUENUU1RSIHRleHQsIEhXTkQgaHduZFBhcmVudCwgVUlOVCBpZCkNCisgICAgeyByZXR1cm4gKF93aW5kb3cgPSA6OkNyZWF0ZVN0YXR1c1dpbmRvdyhzdHlsZSwgdGV4dCwgaHduZFBhcmVudCwgaWQpKSAhPSAwOyB9DQorICBib29sIFNldFRleHQoTFBDVFNUUiB0ZXh0KQ0KKyAgICB7IHJldHVybiBDV2luZG93OjpTZXRUZXh0KHRleHQpOyB9DQorICBib29sIFNldFRleHQodW5zaWduZWQgaW5kZXgsIExQQ1RTVFIgdGV4dCwgVUlOVCB0eXBlKQ0KKyAgICB7IHJldHVybiBMUkVTVUxUVG9Cb29sKFNlbmRNZXNzYWdlKFNCX1NFVFRFWFQsIGluZGV4IHwgdHlwZSwgKExQQVJBTSl0ZXh0KSk7IH0NCisgIGJvb2wgU2V0VGV4dCh1bnNpZ25lZCBpbmRleCwgTFBDVFNUUiB0ZXh0KQ0KKyAgICB7IHJldHVybiBTZXRUZXh0KGluZGV4LCB0ZXh0LCAwKTsgfQ0KKw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgYm9vbCBDcmVhdGUoTE9ORyBzdHlsZSwgTFBDV1NUUiB0ZXh0LCBIV05EIGh3bmRQYXJlbnQsIFVJTlQgaWQpDQorICAgIHsgcmV0dXJuIChfd2luZG93ID0gOjpDcmVhdGVTdGF0dXNXaW5kb3dXKHN0eWxlLCB0ZXh0LCBod25kUGFyZW50LCBpZCkpICE9IDA7IH0NCisgIGJvb2wgU2V0VGV4dChMUENXU1RSIHRleHQpDQorICAgIHsgcmV0dXJuIENXaW5kb3c6OlNldFRleHQodGV4dCk7IH0NCisgIGJvb2wgU2V0VGV4dCh1bnNpZ25lZCBpbmRleCwgTFBDV1NUUiB0ZXh0LCBVSU5UIHR5cGUpDQorICAgIHsgcmV0dXJuIExSRVNVTFRUb0Jvb2woU2VuZE1lc3NhZ2UoU0JfU0VUVEVYVFcsIGluZGV4IHwgdHlwZSwgKExQQVJBTSl0ZXh0KSk7IH0NCisgIGJvb2wgU2V0VGV4dCh1bnNpZ25lZCBpbmRleCwgTFBDV1NUUiB0ZXh0KQ0KKyAgICB7IHJldHVybiBTZXRUZXh0KGluZGV4LCB0ZXh0LCAwKTsgfQ0KKyAgI2VuZGlmDQorDQorICBib29sIFNldFBhcnRzKHVuc2lnbmVkIG51bVBhcnRzLCBjb25zdCBpbnQgKmVkZ2VQb3N0aW9ucykNCisgICAgeyByZXR1cm4gTFJFU1VMVFRvQm9vbChTZW5kTWVzc2FnZShTQl9TRVRQQVJUUywgbnVtUGFydHMsIChMUEFSQU0pZWRnZVBvc3Rpb25zKSk7IH0NCisgIHZvaWQgU2ltcGxlKGJvb2wgc2ltcGxlKQ0KKyAgICB7IFNlbmRNZXNzYWdlKFNCX1NJTVBMRSwgQm9vbFRvQk9PTChzaW1wbGUpLCAwKTsgfQ0KK307DQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvU3RkQWZ4LmggYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvU3RkQWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhMDg4ZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9TdGRBZnguaApAQCAtMCwwICsxLDggQEAKKy8vIFN0ZEFmeC5oDQorDQorI2lmbmRlZiBfX1NUREFGWF9IDQorI2RlZmluZSBfX1NUREFGWF9IDQorDQorI2luY2x1ZGUgIi4uLy4uL0NvbW1vbi9Db21tb24uaCINCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvVG9vbEJhci5oIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL1Rvb2xCYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmM0NDQzCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL1Rvb2xCYXIuaApAQCAtMCwwICsxLDQzIEBACisvLyBXaW5kb3dzL0NvbnRyb2wvVG9vbEJhci5oDQorICANCisjaWZuZGVmIF9fV0lORE9XU19DT05UUk9MX1RPT0xCQVJfSA0KKyNkZWZpbmUgX19XSU5ET1dTX0NPTlRST0xfVE9PTEJBUl9IDQorDQorI2luY2x1ZGUgIi4uL1dpbmRvdy5oIg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorbmFtZXNwYWNlIE5Db250cm9sIHsNCisNCitjbGFzcyBDVG9vbEJhcjogcHVibGljIE5XaW5kb3dzOjpDV2luZG93DQorew0KK3B1YmxpYzoNCisgIHZvaWQgQXV0b1NpemUoKSB7IFNlbmRNZXNzYWdlKFRCX0FVVE9TSVpFLCAwLCAwKTsgfQ0KKyAgRFdPUkQgR2V0QnV0dG9uU2l6ZSgpIHsgcmV0dXJuIChEV09SRClTZW5kTWVzc2FnZShUQl9HRVRCVVRUT05TSVpFLCAwLCAwKTsgfQ0KKyAgDQorICBib29sIEdldE1heFNpemUoTFBTSVpFIHNpemUpDQorICAjaWZkZWYgVU5ERVJfQ0UNCisgIHsNCisgICAgLy8gbWF5YmUgaXQgbXVzdCBiZSBmaXhlZCBmb3IgbW9yZSB0aGFuIDEgYnV0dG9ucw0KKyAgICBEV09SRCB2YWwgPSBHZXRCdXR0b25TaXplKCk7DQorICAgIHNpemUtPmN4ID0gTE9XT1JEKHZhbCk7DQorICAgIHNpemUtPmN5ID0gSElXT1JEKHZhbCk7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgI2Vsc2UNCisgIHsNCisgICAgcmV0dXJuIExSRVNVTFRUb0Jvb2woU2VuZE1lc3NhZ2UoVEJfR0VUTUFYU0laRSwgMCwgKExQQVJBTSlzaXplKSk7DQorICB9DQorICAjZW5kaWYNCisNCisgIGJvb2wgRW5hYmxlQnV0dG9uKFVJTlQgYnV0dG9uSUQsIGJvb2wgZW5hYmxlKSB7IHJldHVybiBMUkVTVUxUVG9Cb29sKFNlbmRNZXNzYWdlKFRCX0VOQUJMRUJVVFRPTiwgYnV0dG9uSUQsIE1BS0VMT05HKEJvb2xUb0JPT0woZW5hYmxlKSwgMCkpKTsgfQ0KKyAgdm9pZCBCdXR0b25TdHJ1Y3RTaXplKCkgeyBTZW5kTWVzc2FnZShUQl9CVVRUT05TVFJVQ1RTSVpFLCBzaXplb2YoVEJCVVRUT04pKTsgfQ0KKyAgSElNQUdFTElTVCBTZXRJbWFnZUxpc3QoVUlOVCBsaXN0SW5kZXgsIEhJTUFHRUxJU1QgaW1hZ2VMaXN0KSB7IHJldHVybiBISU1BR0VMSVNUKFNlbmRNZXNzYWdlKFRCX1NFVElNQUdFTElTVCwgbGlzdEluZGV4LCAoTFBBUkFNKWltYWdlTGlzdCkpOyB9DQorICBib29sIEFkZEJ1dHRvbihVSU5UIG51bUJ1dHRvbnMsIExQVEJCVVRUT04gYnV0dG9ucykgeyByZXR1cm4gTFJFU1VMVFRvQm9vbChTZW5kTWVzc2FnZShUQl9BRERCVVRUT05TLCBudW1CdXR0b25zLCAoTFBBUkFNKWJ1dHRvbnMpKTsgfQ0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgYm9vbCBBZGRCdXR0b25XKFVJTlQgbnVtQnV0dG9ucywgTFBUQkJVVFRPTiBidXR0b25zKSB7IHJldHVybiBMUkVTVUxUVG9Cb29sKFNlbmRNZXNzYWdlKFRCX0FEREJVVFRPTlNXLCBudW1CdXR0b25zLCAoTFBBUkFNKWJ1dHRvbnMpKTsgfQ0KKyAgI2VuZGlmDQorfTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9UcmFja2Jhci5oIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL1RyYWNrYmFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExOTM2YgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9UcmFja2Jhci5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIFdpbmRvd3MvQ29udHJvbC9UcmFja2Jhci5oDQorDQorI2lmbmRlZiBfX1dJTkRPV1NfQ09OVFJPTF9UUkFDS0JBUl9IDQorI2RlZmluZSBfX1dJTkRPV1NfQ09OVFJPTF9UUkFDS0JBUl9IDQorDQorI2luY2x1ZGUgIi4uL1dpbmRvdy5oIg0KKyNpbmNsdWRlICIuLi9EZWZzLmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkNvbnRyb2wgew0KKw0KK2NsYXNzIENUcmFja2JhcjE6IHB1YmxpYyBDV2luZG93DQorew0KK3B1YmxpYzoNCisgIHZvaWQgU2V0UmFuZ2UoaW50IG1pbmltdW0sIGludCBtYXhpbXVtLCBib29sIHJlZHJhdyA9IHRydWUpDQorICAgIHsgU2VuZE1lc3NhZ2UoVEJNX1NFVFJBTkdFLCBCb29sVG9CT09MKHJlZHJhdyksIE1BS0VMT05HKG1pbmltdW0sIG1heGltdW0pKTsgfQ0KKyAgdm9pZCBTZXRQb3MoaW50IHBvcywgYm9vbCByZWRyYXcgPSB0cnVlKQ0KKyAgICB7IFNlbmRNZXNzYWdlKFRCTV9TRVRQT1MsIEJvb2xUb0JPT0wocmVkcmF3KSwgcG9zKTsgfQ0KKyAgdm9pZCBTZXRUaWNGcmVxKGludCBmcmVxKQ0KKyAgICB7IFNlbmRNZXNzYWdlKFRCTV9TRVRUSUNGUkVRLCBmcmVxKTsgfQ0KKyAgDQorICBpbnQgR2V0UG9zKCkNCisgICAgeyByZXR1cm4gKGludClTZW5kTWVzc2FnZShUQk1fR0VUUE9TKTsgfQ0KK307DQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvV2luZG93Mi5jcHAgYi9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvV2luZG93Mi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4OGMzYQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvQ29udHJvbC9XaW5kb3cyLmNwcApAQCAtMCwwICsxLDIwMCBAQAorLy8gV2luZG93cy9Db250cm9sL1dpbmRvdzIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCisjaW5jbHVkZSAiLi4vLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiV2luZG93Mi5oIg0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCitleHRlcm4gYm9vbCBnX0lzTlQ7DQorI2VuZGlmDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCisNCisjaWZuZGVmIF9VTklDT0RFDQorQVRPTSBNeVJlZ2lzdGVyQ2xhc3MoQ09OU1QgV05EQ0xBU1NXICp3bmRDbGFzcyk7DQorI2VuZGlmDQorDQorbmFtZXNwYWNlIE5Db250cm9sIHsNCisNCisjaWZkZWYgVU5ERVJfQ0UNCisjZGVmaW5lIE1ZX1NUQVJUX1dNX0NSRUFURSBXTV9DUkVBVEUNCisjZWxzZQ0KKyNkZWZpbmUgTVlfU1RBUlRfV01fQ1JFQVRFIFdNX05DQ1JFQVRFDQorI2VuZGlmDQorDQorc3RhdGljIExSRVNVTFQgQ0FMTEJBQ0sgV2luZG93UHJvY2VkdXJlKEhXTkQgYUhXTkQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkNCit7DQorICBDV2luZG93IHRlbXBXaW5kb3coYUhXTkQpOw0KKyAgaWYgKG1lc3NhZ2UgPT0gTVlfU1RBUlRfV01fQ1JFQVRFKQ0KKyAgICB0ZW1wV2luZG93LlNldFVzZXJEYXRhTG9uZ1B0cigoTE9OR19QVFIpKCgoTFBDUkVBVEVTVFJVQ1QpbFBhcmFtKS0+bHBDcmVhdGVQYXJhbXMpKTsNCisgIENXaW5kb3cyICp3aW5kb3cgPSAoQ1dpbmRvdzIgKikodGVtcFdpbmRvdy5HZXRVc2VyRGF0YUxvbmdQdHIoKSk7DQorICBpZiAod2luZG93ICE9IE5VTEwgJiYgbWVzc2FnZSA9PSBNWV9TVEFSVF9XTV9DUkVBVEUpDQorICAgIHdpbmRvdy0+QXR0YWNoKGFIV05EKTsNCisgIGlmICh3aW5kb3cgPT0gMCkNCisgIHsNCisgICAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgICBpZiAoZ19Jc05UKQ0KKyAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jVyhhSFdORCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOw0KKyAgICBlbHNlDQorICAgICNlbmRpZg0KKyAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGFIV05ELCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7DQorICB9DQorICByZXR1cm4gd2luZG93LT5Pbk1lc3NhZ2UobWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOw0KK30NCisNCitib29sIENXaW5kb3cyOjpDcmVhdGVFeChEV09SRCBleFN0eWxlLCBMUENUU1RSIGNsYXNzTmFtZSwgTFBDVFNUUiB3aW5kb3dOYW1lLA0KKyAgICBEV09SRCBzdHlsZSwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsDQorICAgIEhXTkQgcGFyZW50V2luZG93LCBITUVOVSBpZE9ySE1lbnUsIEhJTlNUQU5DRSBpbnN0YW5jZSkNCit7DQorICBXTkRDTEFTUyB3YzsNCisgIGlmICghOjpHZXRDbGFzc0luZm8oaW5zdGFuY2UsIGNsYXNzTmFtZSwgJndjKSkNCisgIHsNCisgICAgLy8gd2Muc3R5bGUgICAgICAgICAgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsNCisgICAgd2Muc3R5bGUgICAgICAgICAgPSAwOw0KKyAgICB3Yy5scGZuV25kUHJvYyAgICA9IFdpbmRvd1Byb2NlZHVyZTsNCisgICAgd2MuY2JDbHNFeHRyYSAgICAgPSAwOw0KKyAgICB3Yy5jYlduZEV4dHJhICAgICA9IDA7DQorICAgIHdjLmhJbnN0YW5jZSAgICAgID0gaW5zdGFuY2U7DQorICAgIHdjLmhJY29uICAgICAgICAgID0gTlVMTDsNCisgICAgd2MuaEN1cnNvciAgICAgICAgPSBMb2FkQ3Vyc29yKE5VTEwsIElEQ19BUlJPVyk7DQorICAgIHdjLmhickJhY2tncm91bmQgID0gKEhCUlVTSCkoQ09MT1JfV0lORE9XICsgMSk7DQorICAgIHdjLmxwc3pNZW51TmFtZSAgID0gTlVMTDsNCisgICAgd2MubHBzekNsYXNzTmFtZSAgPSBjbGFzc05hbWU7DQorICAgIGlmICg6OlJlZ2lzdGVyQ2xhc3MoJndjKSA9PSAwKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIHJldHVybiBDV2luZG93OjpDcmVhdGVFeChleFN0eWxlLCBjbGFzc05hbWUsIHdpbmRvd05hbWUsIHN0eWxlLA0KKyAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBhcmVudFdpbmRvdywgaWRPckhNZW51LCBpbnN0YW5jZSwgdGhpcyk7DQorfQ0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCisNCitib29sIENXaW5kb3cyOjpDcmVhdGVFeChEV09SRCBleFN0eWxlLCBMUENXU1RSIGNsYXNzTmFtZSwgTFBDV1NUUiB3aW5kb3dOYW1lLA0KKyAgICBEV09SRCBzdHlsZSwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsDQorICAgIEhXTkQgcGFyZW50V2luZG93LCBITUVOVSBpZE9ySE1lbnUsIEhJTlNUQU5DRSBpbnN0YW5jZSkNCit7DQorICBib29sIG5lZWRSZWdpc3RlcjsNCisgIGlmIChnX0lzTlQpDQorICB7DQorICAgIFdORENMQVNTVyB3YzsNCisgICAgbmVlZFJlZ2lzdGVyID0gOjpHZXRDbGFzc0luZm9XKGluc3RhbmNlLCBjbGFzc05hbWUsICZ3YykgPT0gMDsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgV05EQ0xBU1NBIHdpbmRvd0NsYXNzQTsNCisgICAgQVN0cmluZyBjbGFzc05hbWVBOw0KKyAgICBMUENTVFIgY2xhc3NOYW1lUDsNCisgICAgaWYgKElTX0lOVFJFU09VUkNFKGNsYXNzTmFtZSkpDQorICAgICAgY2xhc3NOYW1lUCA9IChMUENTVFIpY2xhc3NOYW1lOw0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBjbGFzc05hbWVBID0gR2V0U3lzdGVtU3RyaW5nKGNsYXNzTmFtZSk7DQorICAgICAgY2xhc3NOYW1lUCA9IGNsYXNzTmFtZUE7DQorICAgIH0NCisgICAgbmVlZFJlZ2lzdGVyID0gOjpHZXRDbGFzc0luZm9BKGluc3RhbmNlLCBjbGFzc05hbWVQLCAmd2luZG93Q2xhc3NBKSA9PSAwOw0KKyAgfQ0KKyAgaWYgKG5lZWRSZWdpc3RlcikNCisgIHsNCisgICAgV05EQ0xBU1NXIHdjOw0KKyAgICAvLyB3Yy5zdHlsZSAgICAgICAgICA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOw0KKyAgICB3Yy5zdHlsZSAgICAgICAgICA9IDA7DQorICAgIHdjLmxwZm5XbmRQcm9jICAgID0gV2luZG93UHJvY2VkdXJlOw0KKyAgICB3Yy5jYkNsc0V4dHJhICAgICA9IDA7DQorICAgIHdjLmNiV25kRXh0cmEgICAgID0gMDsNCisgICAgd2MuaEluc3RhbmNlICAgICAgPSBpbnN0YW5jZTsNCisgICAgd2MuaEljb24gICAgICAgICAgPSBOVUxMOw0KKyAgICB3Yy5oQ3Vyc29yICAgICAgICA9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XKTsNCisgICAgd2MuaGJyQmFja2dyb3VuZCAgPSAoSEJSVVNIKShDT0xPUl9XSU5ET1cgKyAxKTsNCisgICAgd2MubHBzek1lbnVOYW1lICAgPSBOVUxMOw0KKyAgICB3Yy5scHN6Q2xhc3NOYW1lICA9IGNsYXNzTmFtZTsNCisgICAgaWYgKE15UmVnaXN0ZXJDbGFzcygmd2MpID09IDApDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKyAgcmV0dXJuIENXaW5kb3c6OkNyZWF0ZUV4KGV4U3R5bGUsIGNsYXNzTmFtZSwgd2luZG93TmFtZSwgc3R5bGUsDQorICAgICAgeCwgeSwgd2lkdGgsIGhlaWdodCwgcGFyZW50V2luZG93LCBpZE9ySE1lbnUsIGluc3RhbmNlLCB0aGlzKTsNCit9DQorDQorI2VuZGlmDQorDQorTFJFU1VMVCBDV2luZG93Mjo6RGVmUHJvYyhVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pDQorew0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKGdfSXNOVCkNCisgICAgcmV0dXJuIERlZldpbmRvd1Byb2NXKF93aW5kb3csIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsNCisgIGVsc2UNCisgICNlbmRpZg0KKyAgICByZXR1cm4gRGVmV2luZG93UHJvYyhfd2luZG93LCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7DQorfQ0KKw0KK0xSRVNVTFQgQ1dpbmRvdzI6Ok9uTWVzc2FnZShVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pDQorew0KKyAgTFJFU1VMVCByZXN1bHQ7DQorICBzd2l0Y2ggKG1lc3NhZ2UpDQorICB7DQorICAgIGNhc2UgV01fQ1JFQVRFOg0KKyAgICAgIGlmICghT25DcmVhdGUoKENSRUFURVNUUlVDVCAqKWxQYXJhbSkpDQorICAgICAgICByZXR1cm4gLTE7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgV01fQ09NTUFORDoNCisgICAgICBpZiAoT25Db21tYW5kKHdQYXJhbSwgbFBhcmFtLCByZXN1bHQpKQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBXTV9OT1RJRlk6DQorICAgICAgaWYgKE9uTm90aWZ5KChVSU5UKXdQYXJhbSwgKExQTk1IRFIpIGxQYXJhbSwgcmVzdWx0KSkNCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgV01fREVTVFJPWToNCisgICAgICBPbkRlc3Ryb3koKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBXTV9DTE9TRToNCisgICAgICBPbkNsb3NlKCk7DQorICAgICAgcmV0dXJuIDA7DQorICAgIGNhc2UgV01fU0laRToNCisgICAgICBpZiAoT25TaXplKHdQYXJhbSwgTE9XT1JEKGxQYXJhbSksIEhJV09SRChsUGFyYW0pKSkNCisgICAgICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcmV0dXJuIERlZlByb2MobWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOw0KK30NCisNCitib29sIENXaW5kb3cyOjpPbkNvbW1hbmQoV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSwgTFJFU1VMVCAmcmVzdWx0KQ0KK3sNCisgIHJldHVybiBPbkNvbW1hbmQoSElXT1JEKHdQYXJhbSksIExPV09SRCh3UGFyYW0pLCBsUGFyYW0sIHJlc3VsdCk7DQorfQ0KKw0KK2Jvb2wgQ1dpbmRvdzI6Ok9uQ29tbWFuZChpbnQgLyogY29kZSAqLywgaW50IC8qIGl0ZW1JRCAqLywgTFBBUkFNIC8qIGxQYXJhbSAqLywgTFJFU1VMVCAmIC8qIHJlc3VsdCAqLykNCit7DQorICByZXR1cm4gZmFsc2U7DQorICAvLyByZXR1cm4gRGVmUHJvYyhtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7DQorICAvKg0KKyAgaWYgKGNvZGUgPT0gQk5fQ0xJQ0tFRCkNCisgICAgcmV0dXJuIE9uQnV0dG9uQ2xpY2tlZChpdGVtSUQsIChIV05EKWxQYXJhbSk7DQorICAqLw0KK30NCisNCisvKg0KK2Jvb2wgQ0RpYWxvZzo6T25CdXR0b25DbGlja2VkKGludCBidXR0b25JRCwgSFdORCBidXR0b25IV05EKQ0KK3sNCisgIHN3aXRjaChhQnV0dG9uSUQpDQorICB7DQorICAgIGNhc2UgSURPSzoNCisgICAgICBPbk9LKCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgSURDQU5DRUw6DQorICAgICAgT25DYW5jZWwoKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBJREhFTFA6DQorICAgICAgT25IZWxwKCk7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KKyovDQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0NvbnRyb2wvV2luZG93Mi5oIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL1dpbmRvdzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTY1ZGFhCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9Db250cm9sL1dpbmRvdzIuaApAQCAtMCwwICsxLDUxIEBACisvLyBXaW5kb3dzL0NvbnRyb2wvV2luZG93Mi5oDQorDQorI2lmbmRlZiBfX1dJTkRPV1NfQ09OVFJPTF9XSU5ET1cyX0gNCisjZGVmaW5lIF9fV0lORE9XU19DT05UUk9MX1dJTkRPVzJfSA0KKw0KKyNpbmNsdWRlICIuLi9XaW5kb3cuaCINCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBOQ29udHJvbCB7DQorDQorY2xhc3MgQ1dpbmRvdzI6IHB1YmxpYyBDV2luZG93DQorew0KKyAgTFJFU1VMVCBEZWZQcm9jKFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7DQorcHVibGljOg0KKyAgQ1dpbmRvdzIoSFdORCBuZXdXaW5kb3cgPSBOVUxMKTogQ1dpbmRvdyhuZXdXaW5kb3cpe307DQorICB2aXJ0dWFsIH5DV2luZG93MigpIHt9Ow0KKw0KKyAgYm9vbCBDcmVhdGVFeChEV09SRCBleFN0eWxlLCBMUENUU1RSIGNsYXNzTmFtZSwgTFBDVFNUUiB3aW5kb3dOYW1lLA0KKyAgICAgIERXT1JEIHN0eWxlLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwNCisgICAgICBIV05EIHBhcmVudFdpbmRvdywgSE1FTlUgaWRPckhNZW51LCBISU5TVEFOQ0UgaW5zdGFuY2UpOw0KKw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgYm9vbCBDcmVhdGVFeChEV09SRCBleFN0eWxlLCBMUENXU1RSIGNsYXNzTmFtZSwgTFBDV1NUUiB3aW5kb3dOYW1lLA0KKyAgICAgIERXT1JEIHN0eWxlLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwNCisgICAgICBIV05EIHBhcmVudFdpbmRvdywgSE1FTlUgaWRPckhNZW51LCBISU5TVEFOQ0UgaW5zdGFuY2UpOw0KKyAgI2VuZGlmDQorDQorICB2aXJ0dWFsIExSRVNVTFQgT25NZXNzYWdlKFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7DQorICB2aXJ0dWFsIGJvb2wgT25DcmVhdGUoQ1JFQVRFU1RSVUNUICogLyogY3JlYXRlU3RydWN0ICovKSB7IHJldHVybiB0cnVlOyB9DQorICAvLyB2aXJ0dWFsIExSRVNVTFQgT25Db21tYW5kKFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOw0KKyAgdmlydHVhbCBib29sIE9uQ29tbWFuZChXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtLCBMUkVTVUxUICZyZXN1bHQpOw0KKyAgdmlydHVhbCBib29sIE9uQ29tbWFuZChpbnQgY29kZSwgaW50IGl0ZW1JRCwgTFBBUkFNIGxQYXJhbSwgTFJFU1VMVCAmcmVzdWx0KTsNCisgIHZpcnR1YWwgYm9vbCBPblNpemUoV1BBUkFNIC8qIHdQYXJhbSAqLywgaW50IC8qIHhTaXplICovLCBpbnQgLyogeVNpemUgKi8pIHsgcmV0dXJuIGZhbHNlOyB9DQorICB2aXJ0dWFsIGJvb2wgT25Ob3RpZnkoVUlOVCAvKiBjb250cm9sSUQgKi8sIExQTk1IRFIgLyogbFBhcmFtICovLCBMUkVTVUxUICYgLyogcmVzdWx0ICovKSB7IHJldHVybiBmYWxzZTsgfQ0KKyAgdmlydHVhbCB2b2lkIE9uRGVzdHJveSgpIHsgUG9zdFF1aXRNZXNzYWdlKDApOyB9DQorICB2aXJ0dWFsIHZvaWQgT25DbG9zZSgpIHsgRGVzdHJveSgpOyB9DQorICAvKg0KKyAgdmlydHVhbCBMUkVTVUxUICBPbkhlbHAoTFBIRUxQSU5GTyBoZWxwSW5mbykgeyBPbkhlbHAoKTsgfTsNCisgIHZpcnR1YWwgTFJFU1VMVCAgT25IZWxwKCkge307DQorICB2aXJ0dWFsIGJvb2wgT25CdXR0b25DbGlja2VkKGludCBidXR0b25JRCwgSFdORCBidXR0b25IV05EKTsNCisgIHZpcnR1YWwgdm9pZCBPbk9LKCkge307DQorICB2aXJ0dWFsIHZvaWQgT25DYW5jZWwoKSB7fTsNCisgICovDQorDQorICBMT05HX1BUUiBTZXRNc2dSZXN1bHQoTE9OR19QVFIgbmV3TG9uZ1B0cikgeyByZXR1cm4gU2V0TG9uZ1B0cihEV0xQX01TR1JFU1VMVCwgbmV3TG9uZ1B0cik7IH0NCisgIExPTkdfUFRSIEdldE1zZ1Jlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIEdldExvbmdQdHIoRFdMUF9NU0dSRVNVTFQpOyB9DQorfTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvRExMLmNwcCBiL2x6bWEvQ1BQL1dpbmRvd3MvRExMLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDg1YmEzCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9ETEwuY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvLyBXaW5kb3dzL0RMTC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIkRMTC5oIg0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCitleHRlcm4gYm9vbCBnX0lzTlQ7DQorI2VuZGlmDQorDQorZXh0ZXJuIEhJTlNUQU5DRSBnX2hJbnN0YW5jZTsNCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBORExMIHsNCisNCitib29sIENMaWJyYXJ5OjpGcmVlKCkgdGhyb3coKQ0KK3sNCisgIGlmIChfbW9kdWxlID09IDApDQorICAgIHJldHVybiB0cnVlOw0KKyAgaWYgKCE6OkZyZWVMaWJyYXJ5KF9tb2R1bGUpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBfbW9kdWxlID0gMDsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sIENMaWJyYXJ5OjpMb2FkRXgoQ0ZTVFIgcGF0aCwgRFdPUkQgZmxhZ3MpIHRocm93KCkNCit7DQorICBpZiAoIUZyZWUoKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIF9tb2R1bGUgPSA6OkxvYWRMaWJyYXJ5RXgoZnMyZmFzKHBhdGgpLCBOVUxMLCBmbGFncyk7DQorICB9DQorICBlbHNlDQorICAjZW5kaWYNCisgIHsNCisgICAgX21vZHVsZSA9IDo6TG9hZExpYnJhcnlFeFcoZnMydXMocGF0aCksIE5VTEwsIGZsYWdzKTsNCisgIH0NCisgIHJldHVybiAoX21vZHVsZSAhPSBOVUxMKTsNCit9DQorDQorYm9vbCBDTGlicmFyeTo6TG9hZChDRlNUUiBwYXRoKSB0aHJvdygpDQorew0KKyAgaWYgKCFGcmVlKCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgICNpZm5kZWYgX1VOSUNPREUNCisgIGlmICghZ19Jc05UKQ0KKyAgew0KKyAgICBfbW9kdWxlID0gOjpMb2FkTGlicmFyeShmczJmYXMocGF0aCkpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgI2VuZGlmDQorICB7DQorICAgIF9tb2R1bGUgPSA6OkxvYWRMaWJyYXJ5VyhmczJ1cyhwYXRoKSk7DQorICB9DQorICByZXR1cm4gKF9tb2R1bGUgIT0gTlVMTCk7DQorfQ0KKw0KK2Jvb2wgTXlHZXRNb2R1bGVGaWxlTmFtZShGU3RyaW5nICZwYXRoKQ0KK3sNCisgIEhNT0RVTEUgaE1vZHVsZSA9IGdfaEluc3RhbmNlOw0KKyAgcGF0aC5FbXB0eSgpOw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIFRDSEFSIHNbTUFYX1BBVEggKyAyXTsNCisgICAgc1swXSA9IDA7DQorICAgIERXT1JEIHNpemUgPSA6OkdldE1vZHVsZUZpbGVOYW1lKGhNb2R1bGUsIHMsIE1BWF9QQVRIICsgMSk7DQorICAgIGlmIChzaXplIDw9IE1BWF9QQVRIICYmIHNpemUgIT0gMCkNCisgICAgew0KKyAgICAgIHBhdGggPSBmYXMyZnMocyk7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBXQ0hBUiBzW01BWF9QQVRIICsgMl07DQorICAgIHNbMF0gPSAwOw0KKyAgICBEV09SRCBzaXplID0gOjpHZXRNb2R1bGVGaWxlTmFtZVcoaE1vZHVsZSwgcywgTUFYX1BBVEggKyAxKTsNCisgICAgaWYgKHNpemUgPD0gTUFYX1BBVEggJiYgc2l6ZSAhPSAwKQ0KKyAgICB7DQorICAgICAgcGF0aCA9IHVzMmZzKHMpOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KKyNpZm5kZWYgX1NGWA0KKw0KK0ZTdHJpbmcgR2V0TW9kdWxlRGlyUHJlZml4KCkNCit7DQorICBGU3RyaW5nIHM7DQorICBpZiAoTXlHZXRNb2R1bGVGaWxlTmFtZShzKSkNCisgIHsNCisgICAgaW50IHBvcyA9IHMuUmV2ZXJzZUZpbmQoRkNIQVJfUEFUSF9TRVBBUkFUT1IpOw0KKyAgICBpZiAocG9zID49IDApDQorICAgIHsNCisgICAgICBzLkRlbGV0ZUZyb20ocG9zICsgMSk7DQorICAgICAgcmV0dXJuIHM7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGVEVYVCgiLiIpIEZTVFJJTkdfUEFUSF9TRVBBUkFUT1I7DQorfQ0KKw0KKyNlbmRpZg0KKw0KK319DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9ETEwuaCBiL2x6bWEvQ1BQL1dpbmRvd3MvRExMLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYxY2Y4OQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvRExMLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gV2luZG93cy9ETEwuaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX0RMTF9IDQorI2RlZmluZSBfX1dJTkRPV1NfRExMX0gNCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL015U3RyaW5nLmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkRMTCB7DQorDQorI2lmZGVmIFVOREVSX0NFDQorI2RlZmluZSBNeV9HZXRQcm9jQWRkcmVzcyhtb2R1bGUsIHByb2NOYW1lKSA6OkdldFByb2NBZGRyZXNzQShtb2R1bGUsIHByb2NOYW1lKQ0KKyNlbHNlDQorI2RlZmluZSBNeV9HZXRQcm9jQWRkcmVzcyhtb2R1bGUsIHByb2NOYW1lKSA6OkdldFByb2NBZGRyZXNzKG1vZHVsZSwgcHJvY05hbWUpDQorI2VuZGlmDQorIA0KK2NsYXNzIENMaWJyYXJ5DQorew0KKyAgSE1PRFVMRSBfbW9kdWxlOw0KK3B1YmxpYzoNCisgIENMaWJyYXJ5KCk6IF9tb2R1bGUoTlVMTCkge307DQorICB+Q0xpYnJhcnkoKSB7IEZyZWUoKTsgfQ0KKw0KKyAgb3BlcmF0b3IgSE1PRFVMRSgpIGNvbnN0IHsgcmV0dXJuIF9tb2R1bGU7IH0NCisgIEhNT0RVTEUqIG9wZXJhdG9yJigpIHsgcmV0dXJuICZfbW9kdWxlOyB9DQorICBib29sIElzTG9hZGVkKCkgY29uc3QgeyByZXR1cm4gKF9tb2R1bGUgIT0gTlVMTCk7IH07DQorDQorICB2b2lkIEF0dGFjaChITU9EVUxFIG0pDQorICB7DQorICAgIEZyZWUoKTsNCisgICAgX21vZHVsZSA9IG07DQorICB9DQorICBITU9EVUxFIERldGFjaCgpDQorICB7DQorICAgIEhNT0RVTEUgbSA9IF9tb2R1bGU7DQorICAgIF9tb2R1bGUgPSBOVUxMOw0KKyAgICByZXR1cm4gbTsNCisgIH0NCisNCisgIGJvb2wgRnJlZSgpIHRocm93KCk7DQorICBib29sIExvYWRFeChDRlNUUiBwYXRoLCBEV09SRCBmbGFncyA9IExPQURfTElCUkFSWV9BU19EQVRBRklMRSkgdGhyb3coKTsNCisgIGJvb2wgTG9hZChDRlNUUiBwYXRoKSB0aHJvdygpOw0KKyAgRkFSUFJPQyBHZXRQcm9jKExQQ1NUUiBwcm9jTmFtZSkgY29uc3QgeyByZXR1cm4gTXlfR2V0UHJvY0FkZHJlc3MoX21vZHVsZSwgcHJvY05hbWUpOyB9DQorfTsNCisNCitib29sIE15R2V0TW9kdWxlRmlsZU5hbWUoRlN0cmluZyAmcGF0aCk7DQorDQorRlN0cmluZyBHZXRNb2R1bGVEaXJQcmVmaXgoKTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvRGVmcy5oIGIvbHptYS9DUFAvV2luZG93cy9EZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNkNjkyZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvRGVmcy5oCkBAIC0wLDAgKzEsMTcgQEAKKy8vIFdpbmRvd3MvRGVmcy5oDQorDQorI2lmbmRlZiBfX1dJTkRPV1NfREVGU19IDQorI2RlZmluZSBfX1dJTkRPV1NfREVGU19IDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9NeVdpbmRvd3MuaCINCisNCisjaWZkZWYgX1dJTjMyDQoraW5saW5lIGJvb2wgTFJFU1VMVFRvQm9vbChMUkVTVUxUIHYpIHsgcmV0dXJuICh2ICE9IEZBTFNFKTsgfQ0KK2lubGluZSBib29sIEJPT0xUb0Jvb2woQk9PTCB2KSB7IHJldHVybiAodiAhPSBGQUxTRSk7IH0NCitpbmxpbmUgQk9PTCBCb29sVG9CT09MKGJvb2wgdikgeyByZXR1cm4gKHYgPyBUUlVFOiBGQUxTRSk7IH0NCisjZW5kaWYNCisNCitpbmxpbmUgVkFSSUFOVF9CT09MIEJvb2xUb1ZBUklBTlRfQk9PTChib29sIHYpIHsgcmV0dXJuICh2ID8gVkFSSUFOVF9UUlVFOiBWQVJJQU5UX0ZBTFNFKTsgfQ0KK2lubGluZSBib29sIFZBUklBTlRfQk9PTFRvQm9vbChWQVJJQU5UX0JPT0wgdikgeyByZXR1cm4gKHYgIT0gVkFSSUFOVF9GQUxTRSk7IH0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0Vycm9yTXNnLmNwcCBiL2x6bWEvQ1BQL1dpbmRvd3MvRXJyb3JNc2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MjllNzUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL0Vycm9yTXNnLmNwcApAQCAtMCwwICsxLDYxIEBACisvLyBXaW5kb3dzL0Vycm9yTXNnLmgNCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KKyNpbmNsdWRlICIuLi9Db21tb24vU3RyaW5nQ29udmVydC5oIg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICJFcnJvck1zZy5oIg0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCitleHRlcm4gYm9vbCBnX0lzTlQ7DQorI2VuZGlmDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkVycm9yIHsNCisNCitzdGF0aWMgYm9vbCBNeUZvcm1hdE1lc3NhZ2UoRFdPUkQgZXJyb3JDb2RlLCBVU3RyaW5nICZtZXNzYWdlKQ0KK3sNCisgIExQVk9JRCBtc2dCdWY7DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBpZiAoIWdfSXNOVCkNCisgIHsNCisgICAgaWYgKDo6Rm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfA0KKyAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfCBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywNCisgICAgICAgIE5VTEwsIGVycm9yQ29kZSwgMCwgKExQVFNUUikgJm1zZ0J1ZiwgMCwgTlVMTCkgPT0gMCkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIG1lc3NhZ2UgPSBHZXRVbmljb2RlU3RyaW5nKChMUENUU1RSKW1zZ0J1Zik7DQorICB9DQorICBlbHNlDQorICAjZW5kaWYNCisgIHsNCisgICAgaWYgKDo6Rm9ybWF0TWVzc2FnZVcoRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwNCisgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsDQorICAgICAgICBOVUxMLCBlcnJvckNvZGUsIDAsIChMUFdTVFIpICZtc2dCdWYsIDAsIE5VTEwpID09IDApDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBtZXNzYWdlID0gKExQQ1dTVFIpbXNnQnVmOw0KKyAgfQ0KKyAgOjpMb2NhbEZyZWUobXNnQnVmKTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitVU3RyaW5nIE15Rm9ybWF0TWVzc2FnZShEV09SRCBlcnJvckNvZGUpDQorew0KKyAgVVN0cmluZyBtZXNzYWdlOw0KKyAgaWYgKCFNeUZvcm1hdE1lc3NhZ2UoZXJyb3JDb2RlLCBtZXNzYWdlKSkNCisgIHsNCisgICAgd2NoYXJfdCBzWzE2XTsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspDQorICAgIHsNCisgICAgICB1bnNpZ25lZCB0ID0gZXJyb3JDb2RlICYgMHhGOw0KKyAgICAgIGVycm9yQ29kZSA+Pj0gNDsNCisgICAgICBzWzcgLSBpXSA9ICh3Y2hhcl90KSgodCA8IDEwKSA/ICgnMCcgKyB0KSA6ICgnQScgKyAodCAtIDEwKSkpOw0KKyAgICB9DQorICAgIHNbOF0gPSAnXDAnOw0KKyAgICBtZXNzYWdlID0gKFVTdHJpbmcpTCJFcnJvciAjIiArIHM7DQorICB9DQorICByZXR1cm4gbWVzc2FnZTsNCit9DQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0Vycm9yTXNnLmggYi9sem1hL0NQUC9XaW5kb3dzL0Vycm9yTXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA1ZTk1MAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvRXJyb3JNc2cuaApAQCAtMCwwICsxLDE1IEBACisvLyBXaW5kb3dzL0Vycm9yTXNnLmgNCisNCisjaWZuZGVmIF9fV0lORE9XU19FUlJPUl9NU0dfSA0KKyNkZWZpbmUgX19XSU5ET1dTX0VSUk9SX01TR19IDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9NeVN0cmluZy5oIg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorbmFtZXNwYWNlIE5FcnJvciB7DQorDQorVVN0cmluZyBNeUZvcm1hdE1lc3NhZ2UoRFdPUkQgZXJyb3JDb2RlKTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZURpci5jcHAgYi9sem1hL0NQUC9XaW5kb3dzL0ZpbGVEaXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMTU2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL0ZpbGVEaXIuY3BwCkBAIC0wLDAgKzEsNTgzIEBACisvLyBXaW5kb3dzL0ZpbGVEaXIuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCisjaW5jbHVkZSAiLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiRmlsZURpci5oIg0KKyNpbmNsdWRlICJGaWxlRmluZC5oIg0KKyNpbmNsdWRlICJGaWxlTmFtZS5oIg0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCitleHRlcm4gYm9vbCBnX0lzTlQ7DQorI2VuZGlmDQorDQordXNpbmcgbmFtZXNwYWNlIE5XaW5kb3dzOw0KK3VzaW5nIG5hbWVzcGFjZSBORmlsZTsNCit1c2luZyBuYW1lc3BhY2UgTk5hbWU7DQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkZpbGUgew0KK25hbWVzcGFjZSBORGlyIHsNCisNCisjaWZuZGVmIFVOREVSX0NFDQorDQorYm9vbCBHZXRXaW5kb3dzRGlyKEZTdHJpbmcgJnBhdGgpDQorew0KKyAgVUlOVCBuZWVkTGVuZ3RoOw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIFRDSEFSIHNbTUFYX1BBVEggKyAyXTsNCisgICAgc1swXSA9IDA7DQorICAgIG5lZWRMZW5ndGggPSA6OkdldFdpbmRvd3NEaXJlY3RvcnkocywgTUFYX1BBVEggKyAxKTsNCisgICAgcGF0aCA9IGZhczJmcyhzKTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBXQ0hBUiBzW01BWF9QQVRIICsgMl07DQorICAgIHNbMF0gPSAwOw0KKyAgICBuZWVkTGVuZ3RoID0gOjpHZXRXaW5kb3dzRGlyZWN0b3J5VyhzLCBNQVhfUEFUSCArIDEpOw0KKyAgICBwYXRoID0gdXMyZnMocyk7DQorICB9DQorICByZXR1cm4gKG5lZWRMZW5ndGggPiAwICYmIG5lZWRMZW5ndGggPD0gTUFYX1BBVEgpOw0KK30NCisNCitib29sIEdldFN5c3RlbURpcihGU3RyaW5nICZwYXRoKQ0KK3sNCisgIFVJTlQgbmVlZExlbmd0aDsNCisgICNpZm5kZWYgX1VOSUNPREUNCisgIGlmICghZ19Jc05UKQ0KKyAgew0KKyAgICBUQ0hBUiBzW01BWF9QQVRIICsgMl07DQorICAgIHNbMF0gPSAwOw0KKyAgICBuZWVkTGVuZ3RoID0gOjpHZXRTeXN0ZW1EaXJlY3RvcnkocywgTUFYX1BBVEggKyAxKTsNCisgICAgcGF0aCA9IGZhczJmcyhzKTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBXQ0hBUiBzW01BWF9QQVRIICsgMl07DQorICAgIHNbMF0gPSAwOw0KKyAgICBuZWVkTGVuZ3RoID0gOjpHZXRTeXN0ZW1EaXJlY3RvcnlXKHMsIE1BWF9QQVRIICsgMSk7DQorICAgIHBhdGggPSB1czJmcyhzKTsNCisgIH0NCisgIHJldHVybiAobmVlZExlbmd0aCA+IDAgJiYgbmVlZExlbmd0aCA8PSBNQVhfUEFUSCk7DQorfQ0KKyNlbmRpZg0KKw0KK2Jvb2wgU2V0RGlyVGltZShDRlNUUiBwYXRoLCBjb25zdCBGSUxFVElNRSAqY1RpbWUsIGNvbnN0IEZJTEVUSU1FICphVGltZSwgY29uc3QgRklMRVRJTUUgKm1UaW1lKQ0KK3sNCisgICNpZm5kZWYgX1VOSUNPREUNCisgIGlmICghZ19Jc05UKQ0KKyAgew0KKyAgICA6OlNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgICNlbmRpZg0KKyAgDQorICBIQU5ETEUgaERpciA9IElOVkFMSURfSEFORExFX1ZBTFVFOw0KKyAgSUZfVVNFX01BSU5fUEFUSA0KKyAgICBoRGlyID0gOjpDcmVhdGVGaWxlVyhmczJ1cyhwYXRoKSwgR0VORVJJQ19XUklURSwgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURSwNCisgICAgICAgIE5VTEwsIE9QRU5fRVhJU1RJTkcsIEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTLCBOVUxMKTsNCisgICNpZmRlZiBXSU5fTE9OR19QQVRIDQorICBpZiAoaERpciA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSAmJiBVU0VfU1VQRVJfUEFUSCkNCisgIHsNCisgICAgVVN0cmluZyBsb25nUGF0aDsNCisgICAgaWYgKEdldFN1cGVyUGF0aChwYXRoLCBsb25nUGF0aCwgVVNFX01BSU5fUEFUSCkpDQorICAgICAgaERpciA9IDo6Q3JlYXRlRmlsZVcobG9uZ1BhdGgsIEdFTkVSSUNfV1JJVEUsIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUsDQorICAgICAgICAgIE5VTEwsIE9QRU5fRVhJU1RJTkcsIEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTLCBOVUxMKTsNCisgIH0NCisgICNlbmRpZg0KKw0KKyAgYm9vbCByZXMgPSBmYWxzZTsNCisgIGlmIChoRGlyICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQ0KKyAgew0KKyAgICByZXMgPSBCT09MVG9Cb29sKDo6U2V0RmlsZVRpbWUoaERpciwgY1RpbWUsIGFUaW1lLCBtVGltZSkpOw0KKyAgICA6OkNsb3NlSGFuZGxlKGhEaXIpOw0KKyAgfQ0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorYm9vbCBTZXRGaWxlQXR0cmliKENGU1RSIHBhdGgsIERXT1JEIGF0dHJpYikNCit7DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBpZiAoIWdfSXNOVCkNCisgIHsNCisgICAgaWYgKDo6U2V0RmlsZUF0dHJpYnV0ZXMoZnMyZmFzKHBhdGgpLCBhdHRyaWIpKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgI2VuZGlmDQorICB7DQorICAgIElGX1VTRV9NQUlOX1BBVEgNCisgICAgICBpZiAoOjpTZXRGaWxlQXR0cmlidXRlc1coZnMydXMocGF0aCksIGF0dHJpYikpDQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgI2lmZGVmIFdJTl9MT05HX1BBVEgNCisgICAgaWYgKFVTRV9TVVBFUl9QQVRIKQ0KKyAgICB7DQorICAgICAgVVN0cmluZyBsb25nUGF0aDsNCisgICAgICBpZiAoR2V0U3VwZXJQYXRoKHBhdGgsIGxvbmdQYXRoLCBVU0VfTUFJTl9QQVRIKSkNCisgICAgICAgIHJldHVybiBCT09MVG9Cb29sKDo6U2V0RmlsZUF0dHJpYnV0ZXNXKGxvbmdQYXRoLCBhdHRyaWIpKTsNCisgICAgfQ0KKyAgICAjZW5kaWYNCisgIH0NCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbCBSZW1vdmVEaXIoQ0ZTVFIgcGF0aCkNCit7DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBpZiAoIWdfSXNOVCkNCisgIHsNCisgICAgaWYgKDo6UmVtb3ZlRGlyZWN0b3J5KGZzMmZhcyhwYXRoKSkpDQorICAgICAgcmV0dXJuIHRydWU7DQorICB9DQorICBlbHNlDQorICAjZW5kaWYNCisgIHsNCisgICAgSUZfVVNFX01BSU5fUEFUSA0KKyAgICAgIGlmICg6OlJlbW92ZURpcmVjdG9yeVcoZnMydXMocGF0aCkpKQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICNpZmRlZiBXSU5fTE9OR19QQVRIDQorICAgIGlmIChVU0VfU1VQRVJfUEFUSCkNCisgICAgew0KKyAgICAgIFVTdHJpbmcgbG9uZ1BhdGg7DQorICAgICAgaWYgKEdldFN1cGVyUGF0aChwYXRoLCBsb25nUGF0aCwgVVNFX01BSU5fUEFUSCkpDQorICAgICAgICByZXR1cm4gQk9PTFRvQm9vbCg6OlJlbW92ZURpcmVjdG9yeVcobG9uZ1BhdGgpKTsNCisgICAgfQ0KKyAgICAjZW5kaWYNCisgIH0NCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbCBNeU1vdmVGaWxlKENGU1RSIG9sZEZpbGUsIENGU1RSIG5ld0ZpbGUpDQorew0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIGlmICg6Ok1vdmVGaWxlKGZzMmZhcyhvbGRGaWxlKSwgZnMyZmFzKG5ld0ZpbGUpKSkNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBJRl9VU0VfTUFJTl9QQVRIXzIob2xkRmlsZSwgbmV3RmlsZSkNCisgICAgICBpZiAoOjpNb3ZlRmlsZVcoZnMydXMob2xkRmlsZSksIGZzMnVzKG5ld0ZpbGUpKSkNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAjaWZkZWYgV0lOX0xPTkdfUEFUSA0KKyAgICBpZiAoVVNFX1NVUEVSX1BBVEhfMikNCisgICAgew0KKyAgICAgIFVTdHJpbmcgZDEsIGQyOw0KKyAgICAgIGlmIChHZXRTdXBlclBhdGhzKG9sZEZpbGUsIG5ld0ZpbGUsIGQxLCBkMiwgVVNFX01BSU5fUEFUSF8yKSkNCisgICAgICAgIHJldHVybiBCT09MVG9Cb29sKDo6TW92ZUZpbGVXKGQxLCBkMikpOw0KKyAgICB9DQorICAgICNlbmRpZg0KKyAgfQ0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCisjaWZuZGVmIFVOREVSX0NFDQorDQorRVhURVJOX0NfQkVHSU4NCit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqRnVuY19DcmVhdGVIYXJkTGlua1cpKA0KKyAgICBMUENXU1RSIGxwRmlsZU5hbWUsDQorICAgIExQQ1dTVFIgbHBFeGlzdGluZ0ZpbGVOYW1lLA0KKyAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBTZWN1cml0eUF0dHJpYnV0ZXMNCisgICAgKTsNCitFWFRFUk5fQ19FTkQNCisNCitib29sIE15Q3JlYXRlSGFyZExpbmsoQ0ZTVFIgbmV3RmlsZU5hbWUsIENGU1RSIGV4aXN0RmlsZU5hbWUpDQorew0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7DQorICAgIHJldHVybiBmYWxzZTsNCisgICAgLyoNCisgICAgaWYgKDo6Q3JlYXRlSGFyZExpbmsoZnMyZmFzKG5ld0ZpbGVOYW1lKSwgZnMyZmFzKGV4aXN0RmlsZU5hbWUpLCBOVUxMKSkNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgKi8NCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBGdW5jX0NyZWF0ZUhhcmRMaW5rVyBteV9DcmVhdGVIYXJkTGlua1cgPSAoRnVuY19DcmVhdGVIYXJkTGlua1cpDQorICAgICAgICA6OkdldFByb2NBZGRyZXNzKDo6R2V0TW9kdWxlSGFuZGxlVyhMImtlcm5lbDMyLmRsbCIpLCAiQ3JlYXRlSGFyZExpbmtXIik7DQorICAgIGlmICghbXlfQ3JlYXRlSGFyZExpbmtXKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgSUZfVVNFX01BSU5fUEFUSF8yKG5ld0ZpbGVOYW1lLCBleGlzdEZpbGVOYW1lKQ0KKyAgICAgIGlmIChteV9DcmVhdGVIYXJkTGlua1coZnMydXMobmV3RmlsZU5hbWUpLCBmczJ1cyhleGlzdEZpbGVOYW1lKSwgTlVMTCkpDQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgI2lmZGVmIFdJTl9MT05HX1BBVEgNCisgICAgaWYgKFVTRV9TVVBFUl9QQVRIXzIpDQorICAgIHsNCisgICAgICBVU3RyaW5nIGQxLCBkMjsNCisgICAgICBpZiAoR2V0U3VwZXJQYXRocyhuZXdGaWxlTmFtZSwgZXhpc3RGaWxlTmFtZSwgZDEsIGQyLCBVU0VfTUFJTl9QQVRIXzIpKQ0KKyAgICAgICAgcmV0dXJuIEJPT0xUb0Jvb2wobXlfQ3JlYXRlSGFyZExpbmtXKGQxLCBkMiwgTlVMTCkpOw0KKyAgICB9DQorICAgICNlbmRpZg0KKyAgfQ0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCisjZW5kaWYNCisNCitib29sIENyZWF0ZURpcihDRlNUUiBwYXRoKQ0KK3sNCisgICNpZm5kZWYgX1VOSUNPREUNCisgIGlmICghZ19Jc05UKQ0KKyAgew0KKyAgICBpZiAoOjpDcmVhdGVEaXJlY3RvcnkoZnMyZmFzKHBhdGgpLCBOVUxMKSkNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBJRl9VU0VfTUFJTl9QQVRIDQorICAgICAgaWYgKDo6Q3JlYXRlRGlyZWN0b3J5VyhmczJ1cyhwYXRoKSwgTlVMTCkpDQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgI2lmZGVmIFdJTl9MT05HX1BBVEgNCisgICAgaWYgKCghVVNFX01BSU5fUEFUSCB8fCA6OkdldExhc3RFcnJvcigpICE9IEVSUk9SX0FMUkVBRFlfRVhJU1RTKSAmJiBVU0VfU1VQRVJfUEFUSCkNCisgICAgew0KKyAgICAgIFVTdHJpbmcgbG9uZ1BhdGg7DQorICAgICAgaWYgKEdldFN1cGVyUGF0aChwYXRoLCBsb25nUGF0aCwgVVNFX01BSU5fUEFUSCkpDQorICAgICAgICByZXR1cm4gQk9PTFRvQm9vbCg6OkNyZWF0ZURpcmVjdG9yeVcobG9uZ1BhdGgsIE5VTEwpKTsNCisgICAgfQ0KKyAgICAjZW5kaWYNCisgIH0NCisgIHJldHVybiBmYWxzZTsNCit9DQorDQorYm9vbCBDcmVhdGVDb21wbGV4RGlyKENGU1RSIF9hUGF0aE5hbWUpDQorew0KKyAgRlN0cmluZyBwYXRoTmFtZSA9IF9hUGF0aE5hbWU7DQorICBpbnQgcG9zID0gcGF0aE5hbWUuUmV2ZXJzZUZpbmQoRkNIQVJfUEFUSF9TRVBBUkFUT1IpOw0KKyAgaWYgKHBvcyA+IDAgJiYgKHVuc2lnbmVkKXBvcyA9PSBwYXRoTmFtZS5MZW4oKSAtIDEpDQorICB7DQorICAgIGlmIChwYXRoTmFtZS5MZW4oKSA9PSAzICYmIHBhdGhOYW1lWzFdID09IEwnOicpDQorICAgICAgcmV0dXJuIHRydWU7IC8vIERpc2sgZm9sZGVyOw0KKyAgICBwYXRoTmFtZS5EZWxldGUocG9zKTsNCisgIH0NCisgIGNvbnN0IEZTdHJpbmcgcGF0aE5hbWUyID0gcGF0aE5hbWU7DQorICBwb3MgPSBwYXRoTmFtZS5MZW4oKTsNCisgIA0KKyAgZm9yICg7OykNCisgIHsNCisgICAgaWYgKENyZWF0ZURpcihwYXRoTmFtZSkpDQorICAgICAgYnJlYWs7DQorICAgIGlmICg6OkdldExhc3RFcnJvcigpID09IEVSUk9SX0FMUkVBRFlfRVhJU1RTKQ0KKyAgICB7DQorICAgICAgTkZpbmQ6OkNGaWxlSW5mbyBmaWxlSW5mbzsNCisgICAgICBpZiAoIWZpbGVJbmZvLkZpbmQocGF0aE5hbWUpKSAvLyBGb3IgbmV0d29yayBmb2xkZXJzDQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICBpZiAoIWZpbGVJbmZvLklzRGlyKCkpDQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcG9zID0gcGF0aE5hbWUuUmV2ZXJzZUZpbmQoRkNIQVJfUEFUSF9TRVBBUkFUT1IpOw0KKyAgICBpZiAocG9zIDwgMCB8fCBwb3MgPT0gMCkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIGlmIChwYXRoTmFtZVtwb3MgLSAxXSA9PSBMJzonKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgcGF0aE5hbWUuRGVsZXRlRnJvbShwb3MpOw0KKyAgfQ0KKyAgDQorICB3aGlsZSAocG9zIDwgKGludClwYXRoTmFtZTIuTGVuKCkpDQorICB7DQorICAgIHBvcyA9IHBhdGhOYW1lMi5GaW5kKEZDSEFSX1BBVEhfU0VQQVJBVE9SLCBwb3MgKyAxKTsNCisgICAgaWYgKHBvcyA8IDApDQorICAgICAgcG9zID0gcGF0aE5hbWUyLkxlbigpOw0KKyAgICBwYXRoTmFtZS5TZXRGcm9tKHBhdGhOYW1lMiwgcG9zKTsNCisgICAgaWYgKCFDcmVhdGVEaXIocGF0aE5hbWUpKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIA0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wgRGVsZXRlRmlsZUFsd2F5cyhDRlNUUiBwYXRoKQ0KK3sNCisgIGlmICghU2V0RmlsZUF0dHJpYihwYXRoLCAwKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIGlmICg6OkRlbGV0ZUZpbGUoZnMyZmFzKHBhdGgpKSkNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBJRl9VU0VfTUFJTl9QQVRIDQorICAgICAgaWYgKDo6RGVsZXRlRmlsZVcoZnMydXMocGF0aCkpKQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICNpZmRlZiBXSU5fTE9OR19QQVRIDQorICAgIGlmIChVU0VfU1VQRVJfUEFUSCkNCisgICAgew0KKyAgICAgIFVTdHJpbmcgbG9uZ1BhdGg7DQorICAgICAgaWYgKEdldFN1cGVyUGF0aChwYXRoLCBsb25nUGF0aCwgVVNFX01BSU5fUEFUSCkpDQorICAgICAgICByZXR1cm4gQk9PTFRvQm9vbCg6OkRlbGV0ZUZpbGVXKGxvbmdQYXRoKSk7DQorICAgIH0NCisgICAgI2VuZGlmDQorICB9DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wgUmVtb3ZlRGlyV2l0aFN1Ykl0ZW1zKGNvbnN0IEZTdHJpbmcgJnBhdGgpDQorew0KKyAgYm9vbCBuZWVkUmVtb3ZlU3ViSXRlbXMgPSB0cnVlOw0KKyAgew0KKyAgICBORmluZDo6Q0ZpbGVJbmZvIGZpOw0KKyAgICBpZiAoIWZpLkZpbmQocGF0aCkpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBpZiAoIWZpLklzRGlyKCkpDQorICAgIHsNCisgICAgICA6OlNldExhc3RFcnJvcihFUlJPUl9ESVJFQ1RPUlkpOw0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgICBpZiAoZmkuSGFzUmVwYXJzZVBvaW50KCkpDQorICAgICAgbmVlZFJlbW92ZVN1Ykl0ZW1zID0gZmFsc2U7DQorICB9DQorDQorICBpZiAobmVlZFJlbW92ZVN1Ykl0ZW1zKQ0KKyAgew0KKyAgICBGU3RyaW5nIHMgPSBwYXRoOw0KKyAgICBzICs9IEZDSEFSX1BBVEhfU0VQQVJBVE9SOw0KKyAgICB1bnNpZ25lZCBwcmVmaXhTaXplID0gcy5MZW4oKTsNCisgICAgcyArPSBGQ0hBUl9BTllfTUFTSzsNCisgICAgTkZpbmQ6OkNFbnVtZXJhdG9yIGVudW1lcmF0b3Iocyk7DQorICAgIE5GaW5kOjpDRmlsZUluZm8gZmk7DQorICAgIHdoaWxlIChlbnVtZXJhdG9yLk5leHQoZmkpKQ0KKyAgICB7DQorICAgICAgcy5EZWxldGVGcm9tKHByZWZpeFNpemUpOw0KKyAgICAgIHMgKz0gZmkuTmFtZTsNCisgICAgICBpZiAoZmkuSXNEaXIoKSkNCisgICAgICB7DQorICAgICAgICBpZiAoIVJlbW92ZURpcldpdGhTdWJJdGVtcyhzKSkNCisgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgIH0NCisgICAgICBlbHNlIGlmICghRGVsZXRlRmlsZUFsd2F5cyhzKSkNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgfQ0KKyAgDQorICBpZiAoIVNldEZpbGVBdHRyaWIocGF0aCwgMCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIHJldHVybiBSZW1vdmVEaXIocGF0aCk7DQorfQ0KKw0KKyNpZmRlZiBVTkRFUl9DRQ0KKw0KK2Jvb2wgTXlHZXRGdWxsUGF0aE5hbWUoQ0ZTVFIgcGF0aCwgRlN0cmluZyAmcmVzRnVsbFBhdGgpDQorew0KKyAgcmVzRnVsbFBhdGggPSBwYXRoOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KKyNlbHNlDQorDQorYm9vbCBNeUdldEZ1bGxQYXRoTmFtZShDRlNUUiBwYXRoLCBGU3RyaW5nICZyZXNGdWxsUGF0aCkNCit7DQorICByZXR1cm4gR2V0RnVsbFBhdGgocGF0aCwgcmVzRnVsbFBhdGgpOw0KK30NCisNCitib29sIFNldEN1cnJlbnREaXIoQ0ZTVFIgcGF0aCkNCit7DQorICAvLyBTZXRDdXJyZW50RGlyZWN0b3J5IGRvZXNuJ3Qgc3VwcG9ydCBcXD9cIHByZWZpeA0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIHJldHVybiBCT09MVG9Cb29sKDo6U2V0Q3VycmVudERpcmVjdG9yeShmczJmYXMocGF0aCkpKTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICByZXR1cm4gQk9PTFRvQm9vbCg6OlNldEN1cnJlbnREaXJlY3RvcnlXKGZzMnVzKHBhdGgpKSk7DQorICB9DQorfQ0KKw0KK2Jvb2wgR2V0Q3VycmVudERpcihGU3RyaW5nICZwYXRoKQ0KK3sNCisgIHBhdGguRW1wdHkoKTsNCisgIERXT1JEIG5lZWRMZW5ndGg7DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBpZiAoIWdfSXNOVCkNCisgIHsNCisgICAgVENIQVIgc1tNQVhfUEFUSCArIDJdOw0KKyAgICBzWzBdID0gMDsNCisgICAgbmVlZExlbmd0aCA9IDo6R2V0Q3VycmVudERpcmVjdG9yeShNQVhfUEFUSCArIDEsIHMpOw0KKyAgICBwYXRoID0gZmFzMmZzKHMpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgI2VuZGlmDQorICB7DQorICAgIFdDSEFSIHNbTUFYX1BBVEggKyAyXTsNCisgICAgc1swXSA9IDA7DQorICAgIG5lZWRMZW5ndGggPSA6OkdldEN1cnJlbnREaXJlY3RvcnlXKE1BWF9QQVRIICsgMSwgcyk7DQorICAgIHBhdGggPSB1czJmcyhzKTsNCisgIH0NCisgIHJldHVybiAobmVlZExlbmd0aCA+IDAgJiYgbmVlZExlbmd0aCA8PSBNQVhfUEFUSCk7DQorfQ0KKw0KKyNlbmRpZg0KKw0KK2Jvb2wgR2V0RnVsbFBhdGhBbmRTcGxpdChDRlNUUiBwYXRoLCBGU3RyaW5nICZyZXNEaXJQcmVmaXgsIEZTdHJpbmcgJnJlc0ZpbGVOYW1lKQ0KK3sNCisgIGJvb2wgcmVzID0gTXlHZXRGdWxsUGF0aE5hbWUocGF0aCwgcmVzRGlyUHJlZml4KTsNCisgIGlmICghcmVzKQ0KKyAgICByZXNEaXJQcmVmaXggPSBwYXRoOw0KKyAgaW50IHBvcyA9IHJlc0RpclByZWZpeC5SZXZlcnNlRmluZChGQ0hBUl9QQVRIX1NFUEFSQVRPUik7DQorICByZXNGaWxlTmFtZSA9IHJlc0RpclByZWZpeC5QdHIocG9zICsgMSk7DQorICByZXNEaXJQcmVmaXguRGVsZXRlRnJvbShwb3MgKyAxKTsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK2Jvb2wgR2V0T25seURpclByZWZpeChDRlNUUiBwYXRoLCBGU3RyaW5nICZyZXNEaXJQcmVmaXgpDQorew0KKyAgRlN0cmluZyByZXNGaWxlTmFtZTsNCisgIHJldHVybiBHZXRGdWxsUGF0aEFuZFNwbGl0KHBhdGgsIHJlc0RpclByZWZpeCwgcmVzRmlsZU5hbWUpOw0KK30NCisNCitib29sIE15R2V0VGVtcFBhdGgoRlN0cmluZyAmcGF0aCkNCit7DQorICBwYXRoLkVtcHR5KCk7DQorICBEV09SRCBuZWVkTGVuZ3RoOw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIFRDSEFSIHNbTUFYX1BBVEggKyAyXTsNCisgICAgc1swXSA9IDA7DQorICAgIG5lZWRMZW5ndGggPSA6OkdldFRlbXBQYXRoKE1BWF9QQVRIICsgMSwgcyk7DQorICAgIHBhdGggPSBmYXMyZnMocyk7DQorICB9DQorICBlbHNlDQorICAjZW5kaWYNCisgIHsNCisgICAgV0NIQVIgc1tNQVhfUEFUSCArIDJdOw0KKyAgICBzWzBdID0gMDsNCisgICAgbmVlZExlbmd0aCA9IDo6R2V0VGVtcFBhdGhXKE1BWF9QQVRIICsgMSwgcyk7Ow0KKyAgICBwYXRoID0gdXMyZnMocyk7DQorICB9DQorICByZXR1cm4gKG5lZWRMZW5ndGggPiAwICYmIG5lZWRMZW5ndGggPD0gTUFYX1BBVEgpOw0KK30NCisNCitzdGF0aWMgYm9vbCBDcmVhdGVUZW1wRmlsZShDRlNUUiBwcmVmaXgsIGJvb2wgYWRkUmFuZG9tLCBGU3RyaW5nICZwYXRoLCBOSU86OkNPdXRGaWxlICpvdXRGaWxlKQ0KK3sNCisgIFVJbnQzMiBkID0gKEdldFRpY2tDb3VudCgpIDw8IDEyKSBeIChHZXRDdXJyZW50VGhyZWFkSWQoKSA8PCAxNCkgXiBHZXRDdXJyZW50UHJvY2Vzc0lkKCk7DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgMTAwOyBpKyspDQorICB7DQorICAgIHBhdGggPSBwcmVmaXg7DQorICAgIGlmIChhZGRSYW5kb20pDQorICAgIHsNCisgICAgICBGQ2hhciBzWzE2XTsNCisgICAgICBVSW50MzIgdmFsdWUgPSBkOw0KKyAgICAgIHVuc2lnbmVkIGs7DQorICAgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykNCisgICAgICB7DQorICAgICAgICB1bnNpZ25lZCB0ID0gdmFsdWUgJiAweEY7DQorICAgICAgICB2YWx1ZSA+Pj0gNDsNCisgICAgICAgIHNba10gPSAoY2hhcikoKHQgPCAxMCkgPyAoJzAnICsgdCkgOiAoJ0EnICsgKHQgLSAxMCkpKTsNCisgICAgICB9DQorICAgICAgc1trXSA9ICdcMCc7DQorICAgICAgaWYgKG91dEZpbGUpDQorICAgICAgICBwYXRoICs9IEZDaGFyKCcuJyk7DQorICAgICAgcGF0aCArPSBzOw0KKyAgICAgIFVJbnQzMiBzdGVwID0gR2V0VGlja0NvdW50KCkgKyAyOw0KKyAgICAgIGlmIChzdGVwID09IDApDQorICAgICAgICBzdGVwID0gMTsNCisgICAgICBkICs9IHN0ZXA7DQorICAgIH0NCisgICAgYWRkUmFuZG9tID0gdHJ1ZTsNCisgICAgaWYgKG91dEZpbGUpDQorICAgICAgcGF0aCArPSBGVEVYVCgiLnRtcCIpOw0KKyAgICBpZiAoTkZpbmQ6OkRvZXNGaWxlT3JEaXJFeGlzdChwYXRoKSkNCisgICAgew0KKyAgICAgIFNldExhc3RFcnJvcihFUlJPUl9BTFJFQURZX0VYSVNUUyk7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKG91dEZpbGUpDQorICAgIHsNCisgICAgICBpZiAob3V0RmlsZS0+Q3JlYXRlKHBhdGgsIGZhbHNlKSkNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGlmIChDcmVhdGVEaXIocGF0aCkpDQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOw0KKyAgICBpZiAoZXJyb3IgIT0gRVJST1JfRklMRV9FWElTVFMgJiYNCisgICAgICAgIGVycm9yICE9IEVSUk9SX0FMUkVBRFlfRVhJU1RTKQ0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcGF0aC5FbXB0eSgpOw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIENUZW1wRmlsZTo6Q3JlYXRlKENGU1RSIHByZWZpeCwgTklPOjpDT3V0RmlsZSAqb3V0RmlsZSkNCit7DQorICBpZiAoIVJlbW92ZSgpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBpZiAoIUNyZWF0ZVRlbXBGaWxlKHByZWZpeCwgZmFsc2UsIF9wYXRoLCBvdXRGaWxlKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgX211c3RCZURlbGV0ZWQgPSB0cnVlOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wgQ1RlbXBGaWxlOjpDcmVhdGVSYW5kb21JblRlbXBGb2xkZXIoQ0ZTVFIgbmFtZVByZWZpeCwgTklPOjpDT3V0RmlsZSAqb3V0RmlsZSkNCit7DQorICBpZiAoIVJlbW92ZSgpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBGU3RyaW5nIHRlbXBQYXRoOw0KKyAgaWYgKCFNeUdldFRlbXBQYXRoKHRlbXBQYXRoKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgaWYgKCFDcmVhdGVUZW1wRmlsZSh0ZW1wUGF0aCArIG5hbWVQcmVmaXgsIHRydWUsIF9wYXRoLCBvdXRGaWxlKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgX211c3RCZURlbGV0ZWQgPSB0cnVlOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wgQ1RlbXBGaWxlOjpSZW1vdmUoKQ0KK3sNCisgIGlmICghX211c3RCZURlbGV0ZWQpDQorICAgIHJldHVybiB0cnVlOw0KKyAgX211c3RCZURlbGV0ZWQgPSAhRGVsZXRlRmlsZUFsd2F5cyhfcGF0aCk7DQorICByZXR1cm4gIV9tdXN0QmVEZWxldGVkOw0KK30NCisNCitib29sIENUZW1wRmlsZTo6TW92ZVRvKENGU1RSIG5hbWUsIGJvb2wgZGVsZXRlRGVzdEJlZm9yZSkNCit7DQorICBpZiAoZGVsZXRlRGVzdEJlZm9yZSkNCisgICAgaWYgKE5GaW5kOjpEb2VzRmlsZUV4aXN0KG5hbWUpKQ0KKyAgICAgIGlmICghRGVsZXRlRmlsZUFsd2F5cyhuYW1lKSkNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgIERpc2FibGVEZWxldGluZygpOw0KKyAgcmV0dXJuIE15TW92ZUZpbGUoX3BhdGgsIG5hbWUpOw0KK30NCisNCitib29sIENUZW1wRGlyOjpDcmVhdGUoQ0ZTVFIgcHJlZml4KQ0KK3sNCisgIGlmICghUmVtb3ZlKCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIEZTdHJpbmcgdGVtcFBhdGg7DQorICBpZiAoIU15R2V0VGVtcFBhdGgodGVtcFBhdGgpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBpZiAoIUNyZWF0ZVRlbXBGaWxlKHRlbXBQYXRoICsgcHJlZml4LCB0cnVlLCBfcGF0aCwgTlVMTCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIF9tdXN0QmVEZWxldGVkID0gdHJ1ZTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sIENUZW1wRGlyOjpSZW1vdmUoKQ0KK3sNCisgIGlmICghX211c3RCZURlbGV0ZWQpDQorICAgIHJldHVybiB0cnVlOw0KKyAgX211c3RCZURlbGV0ZWQgPSAhUmVtb3ZlRGlyV2l0aFN1Ykl0ZW1zKF9wYXRoKTsNCisgIHJldHVybiAhX211c3RCZURlbGV0ZWQ7DQorfQ0KKw0KK319fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZURpci5oIGIvbHptYS9DUFAvV2luZG93cy9GaWxlRGlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3NTc4OAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZURpci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8vIFdpbmRvd3MvRmlsZURpci5oDQorDQorI2lmbmRlZiBfX1dJTkRPV1NfRklMRV9ESVJfSA0KKyNkZWZpbmUgX19XSU5ET1dTX0ZJTEVfRElSX0gNCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL015U3RyaW5nLmgiDQorDQorI2luY2x1ZGUgIkZpbGVJTy5oIg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorbmFtZXNwYWNlIE5GaWxlIHsNCituYW1lc3BhY2UgTkRpciB7DQorDQorYm9vbCBHZXRXaW5kb3dzRGlyKEZTdHJpbmcgJnBhdGgpOw0KK2Jvb2wgR2V0U3lzdGVtRGlyKEZTdHJpbmcgJnBhdGgpOw0KKw0KK2Jvb2wgU2V0RGlyVGltZShDRlNUUiBwYXRoLCBjb25zdCBGSUxFVElNRSAqY1RpbWUsIGNvbnN0IEZJTEVUSU1FICphVGltZSwgY29uc3QgRklMRVRJTUUgKm1UaW1lKTsNCitib29sIFNldEZpbGVBdHRyaWIoQ0ZTVFIgcGF0aCwgRFdPUkQgYXR0cmliKTsNCitib29sIE15TW92ZUZpbGUoQ0ZTVFIgZXhpc3RGaWxlTmFtZSwgQ0ZTVFIgbmV3RmlsZU5hbWUpOw0KKw0KKyNpZm5kZWYgVU5ERVJfQ0UNCitib29sIE15Q3JlYXRlSGFyZExpbmsoQ0ZTVFIgbmV3RmlsZU5hbWUsIENGU1RSIGV4aXN0RmlsZU5hbWUpOw0KKyNlbmRpZg0KKw0KK2Jvb2wgUmVtb3ZlRGlyKENGU1RSIHBhdGgpOw0KK2Jvb2wgQ3JlYXRlRGlyKENGU1RSIHBhdGgpOw0KK2Jvb2wgQ3JlYXRlQ29tcGxleERpcihDRlNUUiBwYXRoKTsNCitib29sIERlbGV0ZUZpbGVBbHdheXMoQ0ZTVFIgbmFtZSk7DQorYm9vbCBSZW1vdmVEaXJXaXRoU3ViSXRlbXMoY29uc3QgRlN0cmluZyAmcGF0aCk7DQorDQorYm9vbCBNeUdldEZ1bGxQYXRoTmFtZShDRlNUUiBwYXRoLCBGU3RyaW5nICZyZXNGdWxsUGF0aCk7DQorYm9vbCBHZXRGdWxsUGF0aEFuZFNwbGl0KENGU1RSIHBhdGgsIEZTdHJpbmcgJnJlc0RpclByZWZpeCwgRlN0cmluZyAmcmVzRmlsZU5hbWUpOw0KK2Jvb2wgR2V0T25seURpclByZWZpeChDRlNUUiBwYXRoLCBGU3RyaW5nICZyZXNEaXJQcmVmaXgpOw0KKw0KKyNpZm5kZWYgVU5ERVJfQ0UNCisNCitib29sIFNldEN1cnJlbnREaXIoQ0ZTVFIgcGF0aCk7DQorYm9vbCBHZXRDdXJyZW50RGlyKEZTdHJpbmcgJnJlc3VsdFBhdGgpOw0KKw0KKyNlbmRpZg0KKw0KK2Jvb2wgTXlHZXRUZW1wUGF0aChGU3RyaW5nICZyZXN1bHRQYXRoKTsNCisNCitjbGFzcyBDVGVtcEZpbGUNCit7DQorICBib29sIF9tdXN0QmVEZWxldGVkOw0KKyAgRlN0cmluZyBfcGF0aDsNCisgIHZvaWQgRGlzYWJsZURlbGV0aW5nKCkgeyBfbXVzdEJlRGVsZXRlZCA9IGZhbHNlOyB9DQorcHVibGljOg0KKyAgQ1RlbXBGaWxlKCk6IF9tdXN0QmVEZWxldGVkKGZhbHNlKSB7fQ0KKyAgfkNUZW1wRmlsZSgpIHsgUmVtb3ZlKCk7IH0NCisgIGNvbnN0IEZTdHJpbmcgJkdldFBhdGgoKSBjb25zdCB7IHJldHVybiBfcGF0aDsgfQ0KKyAgYm9vbCBDcmVhdGUoQ0ZTVFIgcGF0aFByZWZpeCwgTklPOjpDT3V0RmlsZSAqb3V0RmlsZSk7IC8vIHBhdGhQcmVmaXggaXMgbm90IGZvbGRlciBwcmVmaXgNCisgIGJvb2wgQ3JlYXRlUmFuZG9tSW5UZW1wRm9sZGVyKENGU1RSIG5hbWVQcmVmaXgsIE5JTzo6Q091dEZpbGUgKm91dEZpbGUpOw0KKyAgYm9vbCBSZW1vdmUoKTsNCisgIGJvb2wgTW92ZVRvKENGU1RSIG5hbWUsIGJvb2wgZGVsZXRlRGVzdEJlZm9yZSk7DQorfTsNCisNCitjbGFzcyBDVGVtcERpcg0KK3sNCisgIGJvb2wgX211c3RCZURlbGV0ZWQ7DQorICBGU3RyaW5nIF9wYXRoOw0KK3B1YmxpYzoNCisgIENUZW1wRGlyKCk6IF9tdXN0QmVEZWxldGVkKGZhbHNlKSB7fQ0KKyAgfkNUZW1wRGlyKCkgeyBSZW1vdmUoKTsgIH0NCisgIGNvbnN0IEZTdHJpbmcgJkdldFBhdGgoKSBjb25zdCB7IHJldHVybiBfcGF0aDsgfQ0KKyAgdm9pZCBEaXNhYmxlRGVsZXRpbmcoKSB7IF9tdXN0QmVEZWxldGVkID0gZmFsc2U7IH0NCisgIGJvb2wgQ3JlYXRlKENGU1RSIG5hbWVQcmVmaXgpIDsNCisgIGJvb2wgUmVtb3ZlKCk7DQorfTsNCisNCisjaWYgIWRlZmluZWQoVU5ERVJfQ0UpDQorY2xhc3MgQ0N1cnJlbnREaXJSZXN0b3Jlcg0KK3sNCisgIEZTdHJpbmcgX3BhdGg7DQorcHVibGljOg0KKyAgYm9vbCBOZWVkUmVzdG9yZTsNCisNCisgIENDdXJyZW50RGlyUmVzdG9yZXIoKTogTmVlZFJlc3RvcmUodHJ1ZSkNCisgIHsNCisgICAgR2V0Q3VycmVudERpcihfcGF0aCk7DQorICB9DQorICB+Q0N1cnJlbnREaXJSZXN0b3JlcigpDQorICB7DQorICAgIGlmICghTmVlZFJlc3RvcmUpDQorICAgICAgcmV0dXJuOw0KKyAgICBGU3RyaW5nIHM7DQorICAgIGlmIChHZXRDdXJyZW50RGlyKHMpKQ0KKyAgICAgIGlmIChzICE9IF9wYXRoKQ0KKyAgICAgICAgU2V0Q3VycmVudERpcihfcGF0aCk7DQorICB9DQorfTsNCisjZW5kaWYNCisNCit9fX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0ZpbGVGaW5kLmNwcCBiL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZUZpbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzBiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL0ZpbGVGaW5kLmNwcApAQCAtMCwwICsxLDU3OSBAQAorLy8gV2luZG93cy9GaWxlRmluZC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIkZpbGVGaW5kLmgiDQorI2luY2x1ZGUgIkZpbGVJTy5oIg0KKyNpbmNsdWRlICJGaWxlTmFtZS5oIg0KKyNpZm5kZWYgX1VOSUNPREUNCisjaW5jbHVkZSAiLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisjZW5kaWYNCisNCisjaWZuZGVmIF9VTklDT0RFDQorZXh0ZXJuIGJvb2wgZ19Jc05UOw0KKyNlbmRpZg0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOV2luZG93czsNCit1c2luZyBuYW1lc3BhY2UgTkZpbGU7DQordXNpbmcgbmFtZXNwYWNlIE5OYW1lOw0KKw0KKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoVU5ERVJfQ0UpDQorDQorRVhURVJOX0NfQkVHSU4NCisNCit0eXBlZGVmIGVudW0NCit7DQorICBNeV9GaW5kU3RyZWFtSW5mb1N0YW5kYXJkLA0KKyAgTXlfRmluZFN0cmVhbUluZm9NYXhJbmZvTGV2ZWwNCit9IE1ZX1NUUkVBTV9JTkZPX0xFVkVMUzsNCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgIExBUkdFX0lOVEVHRVIgU3RyZWFtU2l6ZTsNCisgIFdDSEFSIGNTdHJlYW1OYW1lW01BWF9QQVRIICsgMzZdOw0KK30gTVlfV0lOMzJfRklORF9TVFJFQU1fREFUQSwgKk1ZX1BXSU4zMl9GSU5EX1NUUkVBTV9EQVRBOw0KKw0KK3R5cGVkZWYgV0lOQkFTRUFQSSBIQU5ETEUgKFdJTkFQSSAqRmluZEZpcnN0U3RyZWFtV19QdHIpKExQQ1dTVFIgZmlsZU5hbWUsIE1ZX1NUUkVBTV9JTkZPX0xFVkVMUyBpbmZvTGV2ZWwsDQorICAgIExQVk9JRCBmaW5kU3RyZWFtRGF0YSwgRFdPUkQgZmxhZ3MpOw0KKw0KK3R5cGVkZWYgV0lOQkFTRUFQSSBCT09MIChBUElFTlRSWSAqRmluZE5leHRTdHJlYW1XX1B0cikoSEFORExFIGZpbmRTdHJlYW0sIExQVk9JRCBmaW5kU3RyZWFtRGF0YSk7DQorDQorRVhURVJOX0NfRU5EDQorDQorI2VuZGlmDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkZpbGUgew0KKw0KKyNpZmRlZiBTVVBQT1JUX0RFVklDRV9GSUxFDQorbmFtZXNwYWNlIE5TeXN0ZW0NCit7DQorYm9vbCBNeUdldERpc2tGcmVlU3BhY2UoQ0ZTVFIgcm9vdFBhdGgsIFVJbnQ2NCAmY2x1c3RlclNpemUsIFVJbnQ2NCAmdG90YWxTaXplLCBVSW50NjQgJmZyZWVTaXplKTsNCit9DQorI2VuZGlmDQorDQorbmFtZXNwYWNlIE5GaW5kIHsNCisNCitib29sIENGaWxlSW5mbzo6SXNEb3RzKCkgY29uc3QgdGhyb3coKQ0KK3sNCisgIGlmICghSXNEaXIoKSB8fCBOYW1lLklzRW1wdHkoKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgaWYgKE5hbWVbMF0gIT0gRlRFWFQoJy4nKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIE5hbWUuTGVuKCkgPT0gMSB8fCAoTmFtZS5MZW4oKSA9PSAyICYmIE5hbWVbMV0gPT0gRlRFWFQoJy4nKSk7DQorfQ0KKw0KKyNkZWZpbmUgV0lOX0ZEX1RPX01ZX0ZJKGZpLCBmZCkgXA0KKyAgZmkuQXR0cmliID0gZmQuZHdGaWxlQXR0cmlidXRlczsgXA0KKyAgZmkuQ1RpbWUgPSBmZC5mdENyZWF0aW9uVGltZTsgXA0KKyAgZmkuQVRpbWUgPSBmZC5mdExhc3RBY2Nlc3NUaW1lOyBcDQorICBmaS5NVGltZSA9IGZkLmZ0TGFzdFdyaXRlVGltZTsgXA0KKyAgZmkuU2l6ZSA9ICgoKFVJbnQ2NClmZC5uRmlsZVNpemVIaWdoKSA8PCAzMikgKyBmZC5uRmlsZVNpemVMb3c7IFwNCisgIGZpLklzQWx0U3RyZWFtID0gZmFsc2U7IFwNCisgIGZpLklzRGV2aWNlID0gZmFsc2U7DQorDQorICAvKg0KKyAgI2lmZGVmIFVOREVSX0NFDQorICBmaS5PYmplY3RJRCA9IGZkLmR3T0lEOw0KKyAgI2Vsc2UNCisgIGZpLlJlcGFyc2VUYWcgPSBmZC5kd1Jlc2VydmVkMDsNCisgICNlbmRpZg0KKyAgKi8NCisNCitzdGF0aWMgdm9pZCBDb252ZXJ0X1dJTjMyX0ZJTkRfREFUQV90b19GaWxlSW5mbyhjb25zdCBXSU4zMl9GSU5EX0RBVEFXICZmZCwgQ0ZpbGVJbmZvICZmaSkNCit7DQorICBXSU5fRkRfVE9fTVlfRkkoZmksIGZkKTsNCisgIGZpLk5hbWUgPSB1czJmcyhmZC5jRmlsZU5hbWUpOw0KKyAgI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkNCisgIC8vIGZpLlNob3J0TmFtZSA9IHVzMmZzKGZkLmNBbHRlcm5hdGVGaWxlTmFtZSk7DQorICAjZW5kaWYNCit9DQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KKw0KK3N0YXRpYyB2b2lkIENvbnZlcnRfV0lOMzJfRklORF9EQVRBX3RvX0ZpbGVJbmZvKGNvbnN0IFdJTjMyX0ZJTkRfREFUQSAmZmQsIENGaWxlSW5mbyAmZmkpDQorew0KKyAgV0lOX0ZEX1RPX01ZX0ZJKGZpLCBmZCk7DQorICBmaS5OYW1lID0gZmFzMmZzKGZkLmNGaWxlTmFtZSk7DQorICAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKyAgLy8gZmkuU2hvcnROYW1lID0gZmFzMmZzKGZkLmNBbHRlcm5hdGVGaWxlTmFtZSk7DQorICAjZW5kaWYNCit9DQorI2VuZGlmDQorICANCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENGaW5kRmlsZQ0KKw0KK2Jvb2wgQ0ZpbmRGaWxlQmFzZTo6Q2xvc2UoKSB0aHJvdygpDQorew0KKyAgaWYgKF9oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpDQorICAgIHJldHVybiB0cnVlOw0KKyAgaWYgKCE6OkZpbmRDbG9zZShfaGFuZGxlKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgX2hhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wgQ0ZpbmRGaWxlOjpGaW5kRmlyc3QoQ0ZTVFIgcGF0aCwgQ0ZpbGVJbmZvICZmaSkNCit7DQorICBpZiAoIUNsb3NlKCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgICNpZm5kZWYgX1VOSUNPREUNCisgIGlmICghZ19Jc05UKQ0KKyAgew0KKyAgICBXSU4zMl9GSU5EX0RBVEFBIGZkOw0KKyAgICBfaGFuZGxlID0gOjpGaW5kRmlyc3RGaWxlQShmczJmYXMocGF0aCksICZmZCk7DQorICAgIGlmIChfaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgQ29udmVydF9XSU4zMl9GSU5EX0RBVEFfdG9fRmlsZUluZm8oZmQsIGZpKTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBXSU4zMl9GSU5EX0RBVEFXIGZkOw0KKw0KKyAgICBJRl9VU0VfTUFJTl9QQVRIDQorICAgICAgX2hhbmRsZSA9IDo6RmluZEZpcnN0RmlsZVcoZnMydXMocGF0aCksICZmZCk7DQorICAgICNpZmRlZiBXSU5fTE9OR19QQVRIDQorICAgIGlmIChfaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFICYmIFVTRV9TVVBFUl9QQVRIKQ0KKyAgICB7DQorICAgICAgVVN0cmluZyBsb25nUGF0aDsNCisgICAgICBpZiAoR2V0U3VwZXJQYXRoKHBhdGgsIGxvbmdQYXRoLCBVU0VfTUFJTl9QQVRIKSkNCisgICAgICAgIF9oYW5kbGUgPSA6OkZpbmRGaXJzdEZpbGVXKGxvbmdQYXRoLCAmZmQpOw0KKyAgICB9DQorICAgICNlbmRpZg0KKyAgICBpZiAoX2hhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIENvbnZlcnRfV0lOMzJfRklORF9EQVRBX3RvX0ZpbGVJbmZvKGZkLCBmaSk7DQorICB9DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBDRmluZEZpbGU6OkZpbmROZXh0KENGaWxlSW5mbyAmZmkpDQorew0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIFdJTjMyX0ZJTkRfREFUQUEgZmQ7DQorICAgIGlmICghOjpGaW5kTmV4dEZpbGVBKF9oYW5kbGUsICZmZCkpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBDb252ZXJ0X1dJTjMyX0ZJTkRfREFUQV90b19GaWxlSW5mbyhmZCwgZmkpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgI2VuZGlmDQorICB7DQorICAgIFdJTjMyX0ZJTkRfREFUQVcgZmQ7DQorICAgIGlmICghOjpGaW5kTmV4dEZpbGVXKF9oYW5kbGUsICZmZCkpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBDb252ZXJ0X1dJTjMyX0ZJTkRfREFUQV90b19GaWxlSW5mbyhmZCwgZmkpOw0KKyAgfQ0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoVU5ERVJfQ0UpDQorDQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBBbHRTdHJlYW1zDQorDQorc3RhdGljIEZpbmRGaXJzdFN0cmVhbVdfUHRyIGdfRmluZEZpcnN0U3RyZWFtVzsNCitzdGF0aWMgRmluZE5leHRTdHJlYW1XX1B0ciBnX0ZpbmROZXh0U3RyZWFtVzsNCisNCitzdHJ1Y3QgQ0ZpbmRTdHJlYW1Mb2FkZXINCit7DQorICBDRmluZFN0cmVhbUxvYWRlcigpDQorICB7DQorICAgIGdfRmluZEZpcnN0U3RyZWFtVyA9IChGaW5kRmlyc3RTdHJlYW1XX1B0cik6OkdldFByb2NBZGRyZXNzKDo6R2V0TW9kdWxlSGFuZGxlQSgia2VybmVsMzIuZGxsIiksICJGaW5kRmlyc3RTdHJlYW1XIik7DQorICAgIGdfRmluZE5leHRTdHJlYW1XID0gKEZpbmROZXh0U3RyZWFtV19QdHIpOjpHZXRQcm9jQWRkcmVzcyg6OkdldE1vZHVsZUhhbmRsZUEoImtlcm5lbDMyLmRsbCIpLCAiRmluZE5leHRTdHJlYW1XIik7DQorICB9DQorfSBnX0ZpbmRTdHJlYW1Mb2FkZXI7DQorDQorYm9vbCBDU3RyZWFtSW5mbzo6SXNNYWluU3RyZWFtKCkgY29uc3QgdGhyb3coKQ0KK3sNCisgIHJldHVybiBOYW1lID09IEwiOjokREFUQSI7DQorfTsNCisNCitVU3RyaW5nIENTdHJlYW1JbmZvOjpHZXRSZWR1Y2VkTmFtZSgpIGNvbnN0DQorew0KKyAgVVN0cmluZyBzID0gTmFtZTsNCisgIGlmIChzLkxlbigpID49IDYpDQorICAgIGlmICh3Y3NjbXAocy5SaWdodFB0cig2KSwgTCI6JERBVEEiKSA9PSAwKQ0KKyAgICAgIHMuRGVsZXRlRnJvbShzLkxlbigpIC0gNik7DQorICByZXR1cm4gczsNCit9DQorDQorc3RhdGljIHZvaWQgQ29udmVydF9XSU4zMl9GSU5EX1NUUkVBTV9EQVRBX3RvX1N0cmVhbUluZm8oY29uc3QgTVlfV0lOMzJfRklORF9TVFJFQU1fREFUQSAmc2QsIENTdHJlYW1JbmZvICZzaSkNCit7DQorICBzaS5TaXplID0gc2QuU3RyZWFtU2l6ZS5RdWFkUGFydDsNCisgIHNpLk5hbWUgPSBzZC5jU3RyZWFtTmFtZTsNCit9DQorDQorYm9vbCBDRmluZFN0cmVhbTo6RmluZEZpcnN0KENGU1RSIHBhdGgsIENTdHJlYW1JbmZvICZzaSkNCit7DQorICBpZiAoIUNsb3NlKCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIGlmICghZ19GaW5kRmlyc3RTdHJlYW1XKQ0KKyAgew0KKyAgICA6OlNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIHsNCisgICAgTVlfV0lOMzJfRklORF9TVFJFQU1fREFUQSBzZDsNCisgICAgSUZfVVNFX01BSU5fUEFUSA0KKyAgICAgIF9oYW5kbGUgPSBnX0ZpbmRGaXJzdFN0cmVhbVcoZnMydXMocGF0aCksIE15X0ZpbmRTdHJlYW1JbmZvU3RhbmRhcmQsICZzZCwgMCk7DQorICAgIGlmIChfaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQ0KKyAgICB7DQorICAgICAgaWYgKDo6R2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSEFORExFX0VPRikNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAvLyBsb25nIG5hbWUgY2FuIGJlIHRyaWNreSBmb3IgcGF0aCBsaWtlICIuXGRpck5hbWUiLg0KKyAgICAgICNpZmRlZiBXSU5fTE9OR19QQVRIDQorICAgICAgaWYgKFVTRV9TVVBFUl9QQVRIKQ0KKyAgICAgIHsNCisgICAgICAgIFVTdHJpbmcgbG9uZ1BhdGg7DQorICAgICAgICBpZiAoR2V0U3VwZXJQYXRoKHBhdGgsIGxvbmdQYXRoLCBVU0VfTUFJTl9QQVRIKSkNCisgICAgICAgICAgX2hhbmRsZSA9IGdfRmluZEZpcnN0U3RyZWFtVyhsb25nUGF0aCwgTXlfRmluZFN0cmVhbUluZm9TdGFuZGFyZCwgJnNkLCAwKTsNCisgICAgICB9DQorICAgICAgI2VuZGlmDQorICAgIH0NCisgICAgaWYgKF9oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBDb252ZXJ0X1dJTjMyX0ZJTkRfU1RSRUFNX0RBVEFfdG9fU3RyZWFtSW5mbyhzZCwgc2kpOw0KKyAgfQ0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wgQ0ZpbmRTdHJlYW06OkZpbmROZXh0KENTdHJlYW1JbmZvICZzaSkNCit7DQorICBpZiAoIWdfRmluZE5leHRTdHJlYW1XKQ0KKyAgew0KKyAgICA6OlNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIHsNCisgICAgTVlfV0lOMzJfRklORF9TVFJFQU1fREFUQSBzZDsNCisgICAgaWYgKCFnX0ZpbmROZXh0U3RyZWFtVyhfaGFuZGxlLCAmc2QpKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgQ29udmVydF9XSU4zMl9GSU5EX1NUUkVBTV9EQVRBX3RvX1N0cmVhbUluZm8oc2QsIHNpKTsNCisgIH0NCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sIENTdHJlYW1FbnVtZXJhdG9yOjpOZXh0KENTdHJlYW1JbmZvICZzaSwgYm9vbCAmZm91bmQpDQorew0KKyAgYm9vbCByZXM7DQorICBpZiAoX2ZpbmQuSXNIYW5kbGVBbGxvY2F0ZWQoKSkNCisgICAgcmVzID0gX2ZpbmQuRmluZE5leHQoc2kpOw0KKyAgZWxzZQ0KKyAgICByZXMgPSBfZmluZC5GaW5kRmlyc3QoX2ZpbGVQYXRoLCBzaSk7DQorICBpZiAocmVzKQ0KKyAgew0KKyAgICBmb3VuZCA9IHRydWU7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgZm91bmQgPSBmYWxzZTsNCisgIHJldHVybiAoOjpHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9IQU5ETEVfRU9GKTsNCit9DQorDQorI2VuZGlmDQorDQorDQorI2RlZmluZSBNWV9DTEVBUl9GSUxFVElNRShmdCkgZnQuZHdMb3dEYXRlVGltZSA9IGZ0LmR3SGlnaERhdGVUaW1lID0gMDsNCisNCit2b2lkIENGaWxlSW5mb0Jhc2U6OkNsZWFyKCkgdGhyb3coKQ0KK3sNCisgIFNpemUgPSAwOw0KKyAgTVlfQ0xFQVJfRklMRVRJTUUoQ1RpbWUpOw0KKyAgTVlfQ0xFQVJfRklMRVRJTUUoQVRpbWUpOw0KKyAgTVlfQ0xFQVJfRklMRVRJTUUoTVRpbWUpOw0KKyAgQXR0cmliID0gMDsNCisgIElzQWx0U3RyZWFtID0gZmFsc2U7DQorICBJc0RldmljZSA9IGZhbHNlOw0KK30NCisNCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKw0KK3N0YXRpYyBpbnQgRmluZEFsdFN0cmVhbUNvbG9uKENGU1RSIHBhdGgpDQorew0KKyAgZm9yIChpbnQgaSA9IDA7OyBpKyspDQorICB7DQorICAgIEZDaGFyIGMgPSBwYXRoW2ldOw0KKyAgICBpZiAoYyA9PSAwKQ0KKyAgICAgIHJldHVybiAtMTsNCisgICAgaWYgKGMgPT0gJzonKQ0KKyAgICB7DQorICAgICAgaWYgKHBhdGhbaSArIDFdID09ICdcXCcpDQorICAgICAgICBpZiAoaSA9PSAxIHx8IChpID4gMSAmJiBwYXRoW2kgLSAyXSA9PSAnXFwnKSkNCisgICAgICAgIHsNCisgICAgICAgICAgd2NoYXJfdCBjMCA9IHBhdGhbaSAtIDFdOw0KKyAgICAgICAgICBpZiAoYzAgPj0gJ2EnICYmIGMwIDw9ICd6JyB8fA0KKyAgICAgICAgICAgICAgYzAgPj0gJ0EnICYmIGMwIDw9ICdaJykNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICByZXR1cm4gaTsNCisgICAgfQ0KKyAgfQ0KK30NCisNCisjZW5kaWYNCisNCitib29sIENGaWxlSW5mbzo6RmluZChDRlNUUiBwYXRoKQ0KK3sNCisgICNpZmRlZiBTVVBQT1JUX0RFVklDRV9GSUxFDQorICBpZiAoSXNEZXZpY2VQYXRoKHBhdGgpKQ0KKyAgew0KKyAgICBDbGVhcigpOw0KKyAgICBOYW1lID0gcGF0aCArIDQ7DQorDQorICAgIElzRGV2aWNlID0gdHJ1ZTsNCisgICAgaWYgKC8qIHBhdGhbMF0gPT0gJ1xcJyAmJiBwYXRoWzFdID09ICdcXCcgJiYgcGF0aFsyXSA9PSAnLicgJiYgcGF0aFszXSA9PSAnXFwnICYmICovDQorICAgICAgICBwYXRoWzVdID09ICc6JyAmJiBwYXRoWzZdID09IDApDQorICAgIHsNCisgICAgICBGQ2hhciBkcml2ZVs0XSA9IHsgcGF0aFs0XSwgJzonLCAnXFwnLCAwIH07DQorICAgICAgVUludDY0IGNsdXN0ZXJTaXplLCB0b3RhbFNpemUsIGZyZWVTaXplOw0KKyAgICAgIGlmIChOU3lzdGVtOjpNeUdldERpc2tGcmVlU3BhY2UoZHJpdmUsIGNsdXN0ZXJTaXplLCB0b3RhbFNpemUsIGZyZWVTaXplKSkNCisgICAgICB7DQorICAgICAgICBTaXplID0gdG90YWxTaXplOw0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIE5JTzo6Q0luRmlsZSBpbkZpbGU7DQorICAgIC8vIDo6T3V0cHV0RGVidWdTdHJpbmdXKHBhdGgpOw0KKyAgICBpZiAoIWluRmlsZS5PcGVuKHBhdGgpKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgLy8gOjpPdXRwdXREZWJ1Z1N0cmluZ1coTCItLS0iKTsNCisgICAgaWYgKGluRmlsZS5TaXplRGVmaW5lZCkNCisgICAgICBTaXplID0gaW5GaWxlLlNpemU7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgI2VuZGlmDQorDQorICAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKw0KKyAgaW50IGNvbG9uUG9zID0gRmluZEFsdFN0cmVhbUNvbG9uKHBhdGgpOw0KKyAgaWYgKGNvbG9uUG9zID49IDApDQorICB7DQorICAgIFVTdHJpbmcgc3RyZWFtTmFtZSA9IGZzMnVzKHBhdGggKyAodW5zaWduZWQpY29sb25Qb3MpOw0KKyAgICBGU3RyaW5nIGZpbGVQYXRoID0gcGF0aDsNCisgICAgZmlsZVBhdGguRGVsZXRlRnJvbShjb2xvblBvcyk7DQorICAgIHN0cmVhbU5hbWUgKz0gTCI6JERBVEEiOyAvLyBjaGFuZ2UgaXQhISEhDQorICAgIGlmIChGaW5kKGZpbGVQYXRoKSkNCisgICAgew0KKyAgICAgIC8vIGlmIChJc0RpcigpKQ0KKyAgICAgICAgQXR0cmliICY9IH5GSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7DQorICAgICAgU2l6ZSA9IDA7DQorICAgICAgQ1N0cmVhbUVudW1lcmF0b3IgZW51bWVyYXRvcihmaWxlUGF0aCk7DQorICAgICAgZm9yICg7OykNCisgICAgICB7DQorICAgICAgICBDU3RyZWFtSW5mbyBzaTsNCisgICAgICAgIGJvb2wgZm91bmQ7DQorICAgICAgICBpZiAoIWVudW1lcmF0b3IuTmV4dChzaSwgZm91bmQpKQ0KKyAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICBpZiAoIWZvdW5kKQ0KKyAgICAgICAgew0KKyAgICAgICAgICA6OlNldExhc3RFcnJvcihFUlJPUl9GSUxFX05PVF9GT1VORCk7DQorICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChzaS5OYW1lLklzRXF1YWxUb05vQ2FzZShzdHJlYW1OYW1lKSkNCisgICAgICAgIHsNCisgICAgICAgICAgTmFtZSArPSB1czJmcyhzaS5OYW1lKTsNCisgICAgICAgICAgTmFtZS5EZWxldGVGcm9tKE5hbWUuTGVuKCkgLSA2KTsNCisgICAgICAgICAgU2l6ZSA9IHNpLlNpemU7DQorICAgICAgICAgIElzQWx0U3RyZWFtID0gdHJ1ZTsNCisgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICANCisgICNlbmRpZg0KKw0KKyAgQ0ZpbmRGaWxlIGZpbmRlcjsNCisgIGlmIChmaW5kZXIuRmluZEZpcnN0KHBhdGgsICp0aGlzKSkNCisgICAgcmV0dXJuIHRydWU7DQorICAjaWZkZWYgX1dJTjMyDQorICB7DQorICAgIERXT1JEIGxhc3RFcnJvciA9IEdldExhc3RFcnJvcigpOw0KKyAgICBpZiAobGFzdEVycm9yID09IEVSUk9SX0JBRF9ORVRQQVRIIHx8DQorICAgICAgICBsYXN0RXJyb3IgPT0gRVJST1JfRklMRV9OT1RfRk9VTkQgfHwNCisgICAgICAgIGxhc3RFcnJvciA9PSBFUlJPUl9JTlZBTElEX05BTUUgLy8gZm9yICJcXFNFUlZFUlxzaGFyZWQiIHBhdGhzIHRoYXQgYXJlIHRyYW5zbGF0ZWQgdG8gIlxcP1xVTkNcU0VSVkVSXHNoYXJlZCINCisgICAgICAgICkNCisgICAgew0KKyAgICAgIHVuc2lnbmVkIGxlbiA9IE15U3RyaW5nTGVuKHBhdGgpOw0KKyAgICAgIGlmIChsZW4gPiAyICYmIHBhdGhbMF0gPT0gJ1xcJyAmJiBwYXRoWzFdID09ICdcXCcpDQorICAgICAgew0KKyAgICAgICAgaW50IHN0YXJ0UG9zID0gMjsNCisgICAgICAgIGlmIChsZW4gPiBrU3VwZXJVbmNQYXRoUHJlZml4U2l6ZSAmJiBJc1N1cGVyVW5jUGF0aChwYXRoKSkNCisgICAgICAgICAgc3RhcnRQb3MgPSBrU3VwZXJVbmNQYXRoUHJlZml4U2l6ZTsNCisgICAgICAgIGludCBwb3MgPSBGaW5kQ2hhclBvc0luU3RyaW5nKHBhdGggKyBzdGFydFBvcywgRlRFWFQoJ1xcJykpOw0KKyAgICAgICAgaWYgKHBvcyA+PSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBwb3MgKz0gc3RhcnRQb3MgKyAxOw0KKyAgICAgICAgICBsZW4gLT0gcG9zOw0KKyAgICAgICAgICBpbnQgcG9zMiA9IEZpbmRDaGFyUG9zSW5TdHJpbmcocGF0aCArIHBvcywgRlRFWFQoJ1xcJykpOw0KKyAgICAgICAgICBpZiAocG9zMiA8IDAgfHwgcG9zMiA9PSAoaW50KWxlbiAtIDEpDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBGU3RyaW5nIHMgPSBwYXRoOw0KKyAgICAgICAgICAgIGlmIChwb3MyIDwgMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICBwb3MyID0gbGVuOw0KKyAgICAgICAgICAgICAgcyArPSBGVEVYVCgnXFwnKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcyArPSBGQ0hBUl9BTllfTUFTSzsNCisgICAgICAgICAgICBpZiAoZmluZGVyLkZpbmRGaXJzdChzLCAqdGhpcykpDQorICAgICAgICAgICAgICBpZiAoTmFtZSA9PSBGVEVYVCgiLiIpKQ0KKyAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBOYW1lLlNldEZyb20ocy5QdHIocG9zKSwgcG9zMik7DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIDo6U2V0TGFzdEVycm9yKGxhc3RFcnJvcik7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgICNlbmRpZg0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIERvZXNGaWxlRXhpc3QoQ0ZTVFIgbmFtZSkNCit7DQorICBDRmlsZUluZm8gZmk7DQorICByZXR1cm4gZmkuRmluZChuYW1lKSAmJiAhZmkuSXNEaXIoKTsNCit9DQorDQorYm9vbCBEb2VzRGlyRXhpc3QoQ0ZTVFIgbmFtZSkNCit7DQorICBDRmlsZUluZm8gZmk7DQorICByZXR1cm4gZmkuRmluZChuYW1lKSAmJiBmaS5Jc0RpcigpOw0KK30NCitib29sIERvZXNGaWxlT3JEaXJFeGlzdChDRlNUUiBuYW1lKQ0KK3sNCisgIENGaWxlSW5mbyBmaTsNCisgIHJldHVybiBmaS5GaW5kKG5hbWUpOw0KK30NCisNCitib29sIENFbnVtZXJhdG9yOjpOZXh0QW55KENGaWxlSW5mbyAmZmkpDQorew0KKyAgaWYgKF9maW5kRmlsZS5Jc0hhbmRsZUFsbG9jYXRlZCgpKQ0KKyAgICByZXR1cm4gX2ZpbmRGaWxlLkZpbmROZXh0KGZpKTsNCisgIGVsc2UNCisgICAgcmV0dXJuIF9maW5kRmlsZS5GaW5kRmlyc3QoX3dpbGRjYXJkLCBmaSk7DQorfQ0KKw0KK2Jvb2wgQ0VudW1lcmF0b3I6Ok5leHQoQ0ZpbGVJbmZvICZmaSkNCit7DQorICBmb3IgKDs7KQ0KKyAgew0KKyAgICBpZiAoIU5leHRBbnkoZmkpKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgaWYgKCFmaS5Jc0RvdHMoKSkNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCit9DQorDQorYm9vbCBDRW51bWVyYXRvcjo6TmV4dChDRmlsZUluZm8gJmZpLCBib29sICZmb3VuZCkNCit7DQorICBpZiAoTmV4dChmaSkpDQorICB7DQorICAgIGZvdW5kID0gdHJ1ZTsNCisgICAgcmV0dXJuIHRydWU7DQorICB9DQorICBmb3VuZCA9IGZhbHNlOw0KKyAgcmV0dXJuICg6OkdldExhc3RFcnJvcigpID09IEVSUk9SX05PX01PUkVfRklMRVMpOw0KK30NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENGaW5kQ2hhbmdlTm90aWZpY2F0aW9uDQorLy8gRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uIGNhbiByZXR1cm4gMC4gTVNETiBkb2Vzbid0IHRlbGwgYWJvdXQgaXQuDQorDQorYm9vbCBDRmluZENoYW5nZU5vdGlmaWNhdGlvbjo6Q2xvc2UoKSB0aHJvdygpDQorew0KKyAgaWYgKCFJc0hhbmRsZUFsbG9jYXRlZCgpKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIGlmICghOjpGaW5kQ2xvc2VDaGFuZ2VOb3RpZmljYXRpb24oX2hhbmRsZSkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIF9oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsNCisgIHJldHVybiB0cnVlOw0KK30NCisgICAgICAgICAgIA0KK0hBTkRMRSBDRmluZENoYW5nZU5vdGlmaWNhdGlvbjo6RmluZEZpcnN0KENGU1RSIHBhdGgsIGJvb2wgd2F0Y2hTdWJ0cmVlLCBEV09SRCBub3RpZnlGaWx0ZXIpDQorew0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICAgIF9oYW5kbGUgPSA6OkZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvbihmczJmYXMocGF0aCksIEJvb2xUb0JPT0wod2F0Y2hTdWJ0cmVlKSwgbm90aWZ5RmlsdGVyKTsNCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBJRl9VU0VfTUFJTl9QQVRIDQorICAgIF9oYW5kbGUgPSA6OkZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvblcoZnMydXMocGF0aCksIEJvb2xUb0JPT0wod2F0Y2hTdWJ0cmVlKSwgbm90aWZ5RmlsdGVyKTsNCisgICAgI2lmZGVmIFdJTl9MT05HX1BBVEgNCisgICAgaWYgKCFJc0hhbmRsZUFsbG9jYXRlZCgpKQ0KKyAgICB7DQorICAgICAgVVN0cmluZyBsb25nUGF0aDsNCisgICAgICBpZiAoR2V0U3VwZXJQYXRoKHBhdGgsIGxvbmdQYXRoLCBVU0VfTUFJTl9QQVRIKSkNCisgICAgICAgIF9oYW5kbGUgPSA6OkZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvblcobG9uZ1BhdGgsIEJvb2xUb0JPT0wod2F0Y2hTdWJ0cmVlKSwgbm90aWZ5RmlsdGVyKTsNCisgICAgfQ0KKyAgICAjZW5kaWYNCisgIH0NCisgIHJldHVybiBfaGFuZGxlOw0KK30NCisNCisjaWZuZGVmIFVOREVSX0NFDQorDQorYm9vbCBNeUdldExvZ2ljYWxEcml2ZVN0cmluZ3MoQ09iamVjdFZlY3RvcjxGU3RyaW5nPiAmZHJpdmVTdHJpbmdzKQ0KK3sNCisgIGRyaXZlU3RyaW5ncy5DbGVhcigpOw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIGRyaXZlU3RyaW5ncy5DbGVhcigpOw0KKyAgICBVSU5UMzIgc2l6ZSA9IEdldExvZ2ljYWxEcml2ZVN0cmluZ3MoMCwgTlVMTCk7DQorICAgIGlmIChzaXplID09IDApDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBBU3RyaW5nIGJ1ZjsNCisgICAgVUlOVDMyIG5ld1NpemUgPSBHZXRMb2dpY2FsRHJpdmVTdHJpbmdzKHNpemUsIGJ1Zi5HZXRCdWZmZXIoc2l6ZSkpOw0KKyAgICBpZiAobmV3U2l6ZSA9PSAwIHx8IG5ld1NpemUgPiBzaXplKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgQVN0cmluZyBzOw0KKyAgICBmb3IgKFVJTlQzMiBpID0gMDsgaSA8IG5ld1NpemU7IGkrKykNCisgICAgew0KKyAgICAgIGNoYXIgYyA9IGJ1ZltpXTsNCisgICAgICBpZiAoYyA9PSAnXDAnKQ0KKyAgICAgIHsNCisgICAgICAgIGRyaXZlU3RyaW5ncy5BZGQoZmFzMmZzKHMpKTsNCisgICAgICAgIHMuRW1wdHkoKTsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgICAgcyArPSBjOw0KKyAgICB9DQorICAgIHJldHVybiBzLklzRW1wdHkoKTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBVSU5UMzIgc2l6ZSA9IEdldExvZ2ljYWxEcml2ZVN0cmluZ3NXKDAsIE5VTEwpOw0KKyAgICBpZiAoc2l6ZSA9PSAwKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgVVN0cmluZyBidWY7DQorICAgIFVJTlQzMiBuZXdTaXplID0gR2V0TG9naWNhbERyaXZlU3RyaW5nc1coc2l6ZSwgYnVmLkdldEJ1ZmZlcihzaXplKSk7DQorICAgIGlmIChuZXdTaXplID09IDAgfHwgbmV3U2l6ZSA+IHNpemUpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBVU3RyaW5nIHM7DQorICAgIGZvciAoVUlOVDMyIGkgPSAwOyBpIDwgbmV3U2l6ZTsgaSsrKQ0KKyAgICB7DQorICAgICAgV0NIQVIgYyA9IGJ1ZltpXTsNCisgICAgICBpZiAoYyA9PSBMJ1wwJykNCisgICAgICB7DQorICAgICAgICBkcml2ZVN0cmluZ3MuQWRkKHVzMmZzKHMpKTsNCisgICAgICAgIHMuRW1wdHkoKTsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgICAgcyArPSBjOw0KKyAgICB9DQorICAgIHJldHVybiBzLklzRW1wdHkoKTsNCisgIH0NCit9DQorDQorI2VuZGlmDQorDQorfX19DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9GaWxlRmluZC5oIGIvbHptYS9DUFAvV2luZG93cy9GaWxlRmluZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMjUyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL0ZpbGVGaW5kLmgKQEAgLTAsMCArMSwxNTggQEAKKy8vIFdpbmRvd3MvRmlsZUZpbmQuaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX0ZJTEVfRklORF9IDQorI2RlZmluZSBfX1dJTkRPV1NfRklMRV9GSU5EX0gNCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL015U3RyaW5nLmgiDQorI2luY2x1ZGUgIkRlZnMuaCINCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBORmlsZSB7DQorbmFtZXNwYWNlIE5GaW5kIHsNCisNCituYW1lc3BhY2UgTkF0dHJpYnV0ZXMNCit7DQorICBpbmxpbmUgYm9vbCBJc1JlYWRPbmx5KERXT1JEIGF0dHJpYikgeyByZXR1cm4gKGF0dHJpYiAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKSAhPSAwOyB9DQorICBpbmxpbmUgYm9vbCBJc0hpZGRlbihEV09SRCBhdHRyaWIpIHsgcmV0dXJuIChhdHRyaWIgJiBGSUxFX0FUVFJJQlVURV9ISURERU4pICE9IDA7IH0NCisgIGlubGluZSBib29sIElzU3lzdGVtKERXT1JEIGF0dHJpYikgeyByZXR1cm4gKGF0dHJpYiAmIEZJTEVfQVRUUklCVVRFX1NZU1RFTSkgIT0gMDsgfQ0KKyAgaW5saW5lIGJvb2wgSXNEaXIoRFdPUkQgYXR0cmliKSB7IHJldHVybiAoYXR0cmliICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSAhPSAwOyB9DQorICBpbmxpbmUgYm9vbCBJc0FyY2hpdmVkKERXT1JEIGF0dHJpYikgeyByZXR1cm4gKGF0dHJpYiAmIEZJTEVfQVRUUklCVVRFX0FSQ0hJVkUpICE9IDA7IH0NCisgIGlubGluZSBib29sIElzQ29tcHJlc3NlZChEV09SRCBhdHRyaWIpIHsgcmV0dXJuIChhdHRyaWIgJiBGSUxFX0FUVFJJQlVURV9DT01QUkVTU0VEKSAhPSAwOyB9DQorICBpbmxpbmUgYm9vbCBJc0VuY3J5cHRlZChEV09SRCBhdHRyaWIpIHsgcmV0dXJuIChhdHRyaWIgJiBGSUxFX0FUVFJJQlVURV9FTkNSWVBURUQpICE9IDA7IH0NCit9DQorDQorY2xhc3MgQ0ZpbGVJbmZvQmFzZQ0KK3sNCisgIGJvb2wgTWF0Y2hlc01hc2soVUlOVDMyIG1hc2spIGNvbnN0IHsgcmV0dXJuICgoQXR0cmliICYgbWFzaykgIT0gMCk7IH0NCitwdWJsaWM6DQorICBVSW50NjQgU2l6ZTsNCisgIEZJTEVUSU1FIENUaW1lOw0KKyAgRklMRVRJTUUgQVRpbWU7DQorICBGSUxFVElNRSBNVGltZTsNCisgIERXT1JEIEF0dHJpYjsNCisgIGJvb2wgSXNBbHRTdHJlYW07DQorICBib29sIElzRGV2aWNlOw0KKw0KKyAgLyoNCisgICNpZmRlZiBVTkRFUl9DRQ0KKyAgRFdPUkQgT2JqZWN0SUQ7DQorICAjZWxzZQ0KKyAgVUlOVDMyIFJlcGFyc2VUYWc7DQorICAjZW5kaWYNCisgICovDQorDQorICBDRmlsZUluZm9CYXNlKCkgeyBDbGVhcigpOyB9DQorICB2b2lkIENsZWFyKCkgdGhyb3coKTsNCisNCisgIHZvaWQgU2V0QXNEaXIoKSB7IEF0dHJpYiA9IEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWTsgfQ0KKw0KKyAgYm9vbCBJc0FyY2hpdmVkKCkgY29uc3QgeyByZXR1cm4gTWF0Y2hlc01hc2soRklMRV9BVFRSSUJVVEVfQVJDSElWRSk7IH0NCisgIGJvb2wgSXNDb21wcmVzc2VkKCkgY29uc3QgeyByZXR1cm4gTWF0Y2hlc01hc2soRklMRV9BVFRSSUJVVEVfQ09NUFJFU1NFRCk7IH0NCisgIGJvb2wgSXNEaXIoKSBjb25zdCB7IHJldHVybiBNYXRjaGVzTWFzayhGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpOyB9DQorICBib29sIElzRW5jcnlwdGVkKCkgY29uc3QgeyByZXR1cm4gTWF0Y2hlc01hc2soRklMRV9BVFRSSUJVVEVfRU5DUllQVEVEKTsgfQ0KKyAgYm9vbCBJc0hpZGRlbigpIGNvbnN0IHsgcmV0dXJuIE1hdGNoZXNNYXNrKEZJTEVfQVRUUklCVVRFX0hJRERFTik7IH0NCisgIGJvb2wgSXNOb3JtYWwoKSBjb25zdCB7IHJldHVybiBNYXRjaGVzTWFzayhGSUxFX0FUVFJJQlVURV9OT1JNQUwpOyB9DQorICBib29sIElzT2ZmbGluZSgpIGNvbnN0IHsgcmV0dXJuIE1hdGNoZXNNYXNrKEZJTEVfQVRUUklCVVRFX09GRkxJTkUpOyB9DQorICBib29sIElzUmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBNYXRjaGVzTWFzayhGSUxFX0FUVFJJQlVURV9SRUFET05MWSk7IH0NCisgIGJvb2wgSGFzUmVwYXJzZVBvaW50KCkgY29uc3QgeyByZXR1cm4gTWF0Y2hlc01hc2soRklMRV9BVFRSSUJVVEVfUkVQQVJTRV9QT0lOVCk7IH0NCisgIGJvb2wgSXNTcGFyc2UoKSBjb25zdCB7IHJldHVybiBNYXRjaGVzTWFzayhGSUxFX0FUVFJJQlVURV9TUEFSU0VfRklMRSk7IH0NCisgIGJvb2wgSXNTeXN0ZW0oKSBjb25zdCB7IHJldHVybiBNYXRjaGVzTWFzayhGSUxFX0FUVFJJQlVURV9TWVNURU0pOyB9DQorICBib29sIElzVGVtcG9yYXJ5KCkgY29uc3QgeyByZXR1cm4gTWF0Y2hlc01hc2soRklMRV9BVFRSSUJVVEVfVEVNUE9SQVJZKTsgfQ0KK307DQorDQorc3RydWN0IENGaWxlSW5mbzogcHVibGljIENGaWxlSW5mb0Jhc2UNCit7DQorICBGU3RyaW5nIE5hbWU7DQorICAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKyAgLy8gRlN0cmluZyBTaG9ydE5hbWU7DQorICAjZW5kaWYNCisNCisgIGJvb2wgSXNEb3RzKCkgY29uc3QgdGhyb3coKTsNCisgIGJvb2wgRmluZChDRlNUUiB3aWxkY2FyZCk7DQorfTsNCisNCitjbGFzcyBDRmluZEZpbGVCYXNlDQorew0KK3Byb3RlY3RlZDoNCisgIEhBTkRMRSBfaGFuZGxlOw0KK3B1YmxpYzoNCisgIGJvb2wgSXNIYW5kbGVBbGxvY2F0ZWQoKSBjb25zdCB7IHJldHVybiBfaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFOyB9DQorICBDRmluZEZpbGVCYXNlKCk6IF9oYW5kbGUoSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHt9DQorICB+Q0ZpbmRGaWxlQmFzZSgpIHsgQ2xvc2UoKTsgfQ0KKyAgYm9vbCBDbG9zZSgpIHRocm93KCk7DQorfTsNCisNCitjbGFzcyBDRmluZEZpbGU6IHB1YmxpYyBDRmluZEZpbGVCYXNlDQorew0KK3B1YmxpYzoNCisgIGJvb2wgRmluZEZpcnN0KENGU1RSIHdpbGRjYXJkLCBDRmlsZUluZm8gJmZpbGVJbmZvKTsNCisgIGJvb2wgRmluZE5leHQoQ0ZpbGVJbmZvICZmaWxlSW5mbyk7DQorfTsNCisNCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKw0KK3N0cnVjdCBDU3RyZWFtSW5mbw0KK3sNCisgIFVTdHJpbmcgTmFtZTsNCisgIFVJbnQ2NCBTaXplOw0KKw0KKyAgVVN0cmluZyBHZXRSZWR1Y2VkTmFtZSgpIGNvbnN0Ow0KKyAgYm9vbCBJc01haW5TdHJlYW0oKSBjb25zdCB0aHJvdygpOw0KK307DQorDQorY2xhc3MgQ0ZpbmRTdHJlYW06IHB1YmxpYyBDRmluZEZpbGVCYXNlDQorew0KK3B1YmxpYzoNCisgIGJvb2wgRmluZEZpcnN0KENGU1RSIGZpbGVQYXRoLCBDU3RyZWFtSW5mbyAmc3RyZWFtSW5mbyk7DQorICBib29sIEZpbmROZXh0KENTdHJlYW1JbmZvICZzdHJlYW1JbmZvKTsNCit9Ow0KKw0KK2NsYXNzIENTdHJlYW1FbnVtZXJhdG9yDQorew0KKyAgQ0ZpbmRTdHJlYW0gX2ZpbmQ7DQorICBGU3RyaW5nIF9maWxlUGF0aDsNCisNCisgIGJvb2wgTmV4dEFueShDRmlsZUluZm8gJmZpbGVJbmZvKTsNCitwdWJsaWM6DQorICBDU3RyZWFtRW51bWVyYXRvcihjb25zdCBGU3RyaW5nICZmaWxlUGF0aCk6IF9maWxlUGF0aChmaWxlUGF0aCkge30NCisgIGJvb2wgTmV4dChDU3RyZWFtSW5mbyAmc3RyZWFtSW5mbywgYm9vbCAmZm91bmQpOw0KK307DQorDQorI2VuZGlmDQorDQorYm9vbCBEb2VzRmlsZUV4aXN0KENGU1RSIG5hbWUpOw0KK2Jvb2wgRG9lc0RpckV4aXN0KENGU1RSIG5hbWUpOw0KK2Jvb2wgRG9lc0ZpbGVPckRpckV4aXN0KENGU1RSIG5hbWUpOw0KKw0KK2NsYXNzIENFbnVtZXJhdG9yDQorew0KKyAgQ0ZpbmRGaWxlIF9maW5kRmlsZTsNCisgIEZTdHJpbmcgX3dpbGRjYXJkOw0KKw0KKyAgYm9vbCBOZXh0QW55KENGaWxlSW5mbyAmZmlsZUluZm8pOw0KK3B1YmxpYzoNCisgIENFbnVtZXJhdG9yKGNvbnN0IEZTdHJpbmcgJndpbGRjYXJkKTogX3dpbGRjYXJkKHdpbGRjYXJkKSB7fQ0KKyAgYm9vbCBOZXh0KENGaWxlSW5mbyAmZmlsZUluZm8pOw0KKyAgYm9vbCBOZXh0KENGaWxlSW5mbyAmZmlsZUluZm8sIGJvb2wgJmZvdW5kKTsNCit9Ow0KKw0KK2NsYXNzIENGaW5kQ2hhbmdlTm90aWZpY2F0aW9uDQorew0KKyAgSEFORExFIF9oYW5kbGU7DQorcHVibGljOg0KKyAgb3BlcmF0b3IgSEFORExFICgpIHsgcmV0dXJuIF9oYW5kbGU7IH0NCisgIGJvb2wgSXNIYW5kbGVBbGxvY2F0ZWQoKSBjb25zdCB7IHJldHVybiBfaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFICYmIF9oYW5kbGUgIT0gMDsgfQ0KKyAgQ0ZpbmRDaGFuZ2VOb3RpZmljYXRpb24oKTogX2hhbmRsZShJTlZBTElEX0hBTkRMRV9WQUxVRSkge30NCisgIH5DRmluZENoYW5nZU5vdGlmaWNhdGlvbigpIHsgQ2xvc2UoKTsgfQ0KKyAgYm9vbCBDbG9zZSgpIHRocm93KCk7DQorICBIQU5ETEUgRmluZEZpcnN0KENGU1RSIHBhdGhOYW1lLCBib29sIHdhdGNoU3VidHJlZSwgRFdPUkQgbm90aWZ5RmlsdGVyKTsNCisgIGJvb2wgRmluZE5leHQoKSB7IHJldHVybiBCT09MVG9Cb29sKDo6RmluZE5leHRDaGFuZ2VOb3RpZmljYXRpb24oX2hhbmRsZSkpOyB9DQorfTsNCisNCisjaWZuZGVmIFVOREVSX0NFDQorYm9vbCBNeUdldExvZ2ljYWxEcml2ZVN0cmluZ3MoQ09iamVjdFZlY3RvcjxGU3RyaW5nPiAmZHJpdmVTdHJpbmdzKTsNCisjZW5kaWYNCisNCit9fX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0ZpbGVJTy5jcHAgYi9sem1hL0NQUC9XaW5kb3dzL0ZpbGVJTy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjZjVjMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZUlPLmNwcApAQCAtMCwwICsxLDQzMiBAQAorLy8gV2luZG93cy9GaWxlSU8uY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpZmRlZiBTVVBQT1JUX0RFVklDRV9GSUxFDQorI2luY2x1ZGUgIi4uLy4uL0MvQWxsb2MuaCINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiRmlsZUlPLmgiDQorI2luY2x1ZGUgIkZpbGVOYW1lLmgiDQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KK2V4dGVybiBib29sIGdfSXNOVDsNCisjZW5kaWYNCisNCit1c2luZyBuYW1lc3BhY2UgTldpbmRvd3M7DQordXNpbmcgbmFtZXNwYWNlIE5GaWxlOw0KK3VzaW5nIG5hbWVzcGFjZSBOTmFtZTsNCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBORmlsZSB7DQorDQorI2lmZGVmIFNVUFBPUlRfREVWSUNFX0ZJTEUNCisNCituYW1lc3BhY2UgTlN5c3RlbQ0KK3sNCitib29sIE15R2V0RGlza0ZyZWVTcGFjZShDRlNUUiByb290UGF0aCwgVUludDY0ICZjbHVzdGVyU2l6ZSwgVUludDY0ICZ0b3RhbFNpemUsIFVJbnQ2NCAmZnJlZVNpemUpOw0KK30NCisjZW5kaWYNCisNCituYW1lc3BhY2UgTklPIHsNCisNCisvKg0KK1dpblhQLTY0IENyZWF0ZUZpbGUoKToNCisgICIiICAgICAgICAgICAgIC0gIEVSUk9SX1BBVEhfTk9UX0ZPVU5EDQorICA6c3RyZWFtICAgICAgICAtICBPSw0KKyAgLjpzdHJlYW0gICAgICAgLSAgRVJST1JfUEFUSF9OT1RfRk9VTkQNCisgIC5cOnN0cmVhbSAgICAgIC0gIE9LDQorICANCisgIGZvbGRlclw6c3RyZWFtIC0gIEVSUk9SX0lOVkFMSURfTkFNRQ0KKyAgZm9sZGVyOnN0cmVhbSAgLSAgT0sNCisNCisgIGM6XDpzdHJlYW0gICAgIC0gIE9LDQorDQorICBjOjpzdHJlYW0gICAgICAtICBFUlJPUl9JTlZBTElEX05BTUUsIGlmIGN1cnJlbnQgZGlyIGlzIE5PVCBST09UICggYzpcZGlyMSApDQorICBjOjpzdHJlYW0gICAgICAtICBPSywgICAgICAgICAgICAgICAgIGlmIGN1cnJlbnQgZGlyIGlzIFJPT1QgICAgICggYzpcICkNCisqLw0KKw0KK2Jvb2wgQ0ZpbGVCYXNlOjpDcmVhdGUoQ0ZTVFIgcGF0aCwgRFdPUkQgZGVzaXJlZEFjY2VzcywNCisgICAgRFdPUkQgc2hhcmVNb2RlLCBEV09SRCBjcmVhdGlvbkRpc3Bvc2l0aW9uLCBEV09SRCBmbGFnc0FuZEF0dHJpYnV0ZXMpDQorew0KKyAgaWYgKCFDbG9zZSgpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICAjaWZkZWYgU1VQUE9SVF9ERVZJQ0VfRklMRQ0KKyAgSXNEZXZpY2VGaWxlID0gZmFsc2U7DQorICAjZW5kaWYNCisNCisgICNpZm5kZWYgX1VOSUNPREUNCisgIGlmICghZ19Jc05UKQ0KKyAgew0KKyAgICBfaGFuZGxlID0gOjpDcmVhdGVGaWxlKGZzMmZhcyhwYXRoKSwgZGVzaXJlZEFjY2Vzcywgc2hhcmVNb2RlLA0KKyAgICAgICAgKExQU0VDVVJJVFlfQVRUUklCVVRFUylOVUxMLCBjcmVhdGlvbkRpc3Bvc2l0aW9uLCBmbGFnc0FuZEF0dHJpYnV0ZXMsIChIQU5ETEUpTlVMTCk7DQorICB9DQorICBlbHNlDQorICAjZW5kaWYNCisgIHsNCisgICAgSUZfVVNFX01BSU5fUEFUSA0KKyAgICAgIF9oYW5kbGUgPSA6OkNyZWF0ZUZpbGVXKGZzMnVzKHBhdGgpLCBkZXNpcmVkQWNjZXNzLCBzaGFyZU1vZGUsDQorICAgICAgICAoTFBTRUNVUklUWV9BVFRSSUJVVEVTKU5VTEwsIGNyZWF0aW9uRGlzcG9zaXRpb24sIGZsYWdzQW5kQXR0cmlidXRlcywgKEhBTkRMRSlOVUxMKTsNCisgICAgI2lmZGVmIFdJTl9MT05HX1BBVEgNCisgICAgaWYgKF9oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgJiYgVVNFX1NVUEVSX1BBVEgpDQorICAgIHsNCisgICAgICBVU3RyaW5nIHN1cGVyUGF0aDsNCisgICAgICBpZiAoR2V0U3VwZXJQYXRoKHBhdGgsIHN1cGVyUGF0aCwgVVNFX01BSU5fUEFUSCkpDQorICAgICAgICBfaGFuZGxlID0gOjpDcmVhdGVGaWxlVyhzdXBlclBhdGgsIGRlc2lyZWRBY2Nlc3MsIHNoYXJlTW9kZSwNCisgICAgICAgICAgICAoTFBTRUNVUklUWV9BVFRSSUJVVEVTKU5VTEwsIGNyZWF0aW9uRGlzcG9zaXRpb24sIGZsYWdzQW5kQXR0cmlidXRlcywgKEhBTkRMRSlOVUxMKTsNCisgICAgfQ0KKyAgICAjZW5kaWYNCisgIH0NCisgIHJldHVybiAoX2hhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSk7DQorfQ0KKw0KK2Jvb2wgQ0ZpbGVCYXNlOjpDbG9zZSgpIHRocm93KCkNCit7DQorICBpZiAoX2hhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkNCisgICAgcmV0dXJuIHRydWU7DQorICBpZiAoITo6Q2xvc2VIYW5kbGUoX2hhbmRsZSkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIF9oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sIENGaWxlQmFzZTo6R2V0UG9zaXRpb24oVUludDY0ICZwb3NpdGlvbikgY29uc3QgdGhyb3coKQ0KK3sNCisgIHJldHVybiBTZWVrKDAsIEZJTEVfQ1VSUkVOVCwgcG9zaXRpb24pOw0KK30NCisNCitib29sIENGaWxlQmFzZTo6R2V0TGVuZ3RoKFVJbnQ2NCAmbGVuZ3RoKSBjb25zdCB0aHJvdygpDQorew0KKyAgI2lmZGVmIFNVUFBPUlRfREVWSUNFX0ZJTEUNCisgIGlmIChJc0RldmljZUZpbGUgJiYgU2l6ZURlZmluZWQpDQorICB7DQorICAgIGxlbmd0aCA9IFNpemU7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgI2VuZGlmDQorDQorICBEV09SRCBzaXplSGlnaDsNCisgIERXT1JEIHNpemVMb3cgPSA6OkdldEZpbGVTaXplKF9oYW5kbGUsICZzaXplSGlnaCk7DQorICBpZiAoc2l6ZUxvdyA9PSAweEZGRkZGRkZGKQ0KKyAgICBpZiAoOjpHZXRMYXN0RXJyb3IoKSAhPSBOT19FUlJPUikNCisgICAgICByZXR1cm4gZmFsc2U7DQorICBsZW5ndGggPSAoKChVSW50NjQpc2l6ZUhpZ2gpIDw8IDMyKSArIHNpemVMb3c7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBDRmlsZUJhc2U6OlNlZWsoSW50NjQgZGlzdGFuY2VUb01vdmUsIERXT1JEIG1vdmVNZXRob2QsIFVJbnQ2NCAmbmV3UG9zaXRpb24pIGNvbnN0IHRocm93KCkNCit7DQorICAjaWZkZWYgU1VQUE9SVF9ERVZJQ0VfRklMRQ0KKyAgaWYgKElzRGV2aWNlRmlsZSAmJiBTaXplRGVmaW5lZCAmJiBtb3ZlTWV0aG9kID09IEZJTEVfRU5EKQ0KKyAgew0KKyAgICBkaXN0YW5jZVRvTW92ZSArPSBTaXplOw0KKyAgICBtb3ZlTWV0aG9kID0gRklMRV9CRUdJTjsNCisgIH0NCisgICNlbmRpZg0KKw0KKyAgTE9ORyBoaWdoID0gKExPTkcpKGRpc3RhbmNlVG9Nb3ZlID4+IDMyKTsNCisgIERXT1JEIGxvdyA9IDo6U2V0RmlsZVBvaW50ZXIoX2hhbmRsZSwgKExPTkcpKGRpc3RhbmNlVG9Nb3ZlICYgMHhGRkZGRkZGRiksICZoaWdoLCBtb3ZlTWV0aG9kKTsNCisgIGlmIChsb3cgPT0gMHhGRkZGRkZGRikNCisgICAgaWYgKDo6R2V0TGFzdEVycm9yKCkgIT0gTk9fRVJST1IpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgbmV3UG9zaXRpb24gPSAoKChVSW50NjQpaGlnaCkgPDwgMzIpICsgbG93Ow0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wgQ0ZpbGVCYXNlOjpTZWVrKFVJbnQ2NCBwb3NpdGlvbiwgVUludDY0ICZuZXdQb3NpdGlvbikgY29uc3QgdGhyb3coKQ0KK3sNCisgIHJldHVybiBTZWVrKHBvc2l0aW9uLCBGSUxFX0JFR0lOLCBuZXdQb3NpdGlvbik7DQorfQ0KKw0KK2Jvb2wgQ0ZpbGVCYXNlOjpTZWVrVG9CZWdpbigpIGNvbnN0IHRocm93KCkNCit7DQorICBVSW50NjQgbmV3UG9zaXRpb247DQorICByZXR1cm4gU2VlaygwLCBuZXdQb3NpdGlvbik7DQorfQ0KKw0KK2Jvb2wgQ0ZpbGVCYXNlOjpTZWVrVG9FbmQoVUludDY0ICZuZXdQb3NpdGlvbikgY29uc3QgdGhyb3coKQ0KK3sNCisgIHJldHVybiBTZWVrKDAsIEZJTEVfRU5ELCBuZXdQb3NpdGlvbik7DQorfQ0KKw0KKy8vIC0tLS0tLS0tLS0gQ0luRmlsZSAtLS0tLS0tLS0NCisNCisjaWZkZWYgU1VQUE9SVF9ERVZJQ0VfRklMRQ0KKw0KK3ZvaWQgQ0luRmlsZTo6Q29ycmVjdERldmljZVNpemUoKQ0KK3sNCisgIC8vIG1heWJlIHdlIG11c3QgZGVjcmVhc2Uga0NsdXN0ZXJTaXplIHRvIDEgPDwgMTIsIGlmIHdlIHdhbnQgY29ycmVjdCBzaXplIGF0IHRhaWwNCisgIHN0YXRpYyBjb25zdCBVSW50MzIga0NsdXN0ZXJTaXplID0gMSA8PCAxNDsNCisgIFVJbnQ2NCBwb3MgPSBTaXplICYgfihVSW50NjQpKGtDbHVzdGVyU2l6ZSAtIDEpOw0KKyAgVUludDY0IHJlYWxOZXdQb3NpdGlvbjsNCisgIGlmICghU2Vlayhwb3MsIHJlYWxOZXdQb3NpdGlvbikpDQorICAgIHJldHVybjsNCisgIEJ5dGUgKmJ1ZiA9IChCeXRlICopTWlkQWxsb2Moa0NsdXN0ZXJTaXplKTsNCisNCisgIGJvb2wgbmVlZGJhY2t3YXJkID0gdHJ1ZTsNCisNCisgIGZvciAoOzspDQorICB7DQorICAgIFVJbnQzMiBwcm9jZXNzZWQgPSAwOw0KKyAgICAvLyB1cCB0ZXN0IGlzIHNsb3cgZm9yICJQaHlzaWNhbERyaXZlIi4NCisgICAgLy8gcHJvY2Vzc2VkIHNpemUgZm9yIGxhdGVzdCBibG9jayBmb3IgIlBoeXNpY2FsRHJpdmUwIiBpcyAwLg0KKyAgICBpZiAoIVJlYWQxKGJ1Ziwga0NsdXN0ZXJTaXplLCBwcm9jZXNzZWQpKQ0KKyAgICAgIGJyZWFrOw0KKyAgICBpZiAocHJvY2Vzc2VkID09IDApDQorICAgICAgYnJlYWs7DQorICAgIG5lZWRiYWNrd2FyZCA9IGZhbHNlOw0KKyAgICBTaXplID0gcG9zICsgcHJvY2Vzc2VkOw0KKyAgICBpZiAocHJvY2Vzc2VkICE9IGtDbHVzdGVyU2l6ZSkNCisgICAgICBicmVhazsNCisgICAgcG9zICs9IGtDbHVzdGVyU2l6ZTsNCisgIH0NCisNCisgIGlmIChuZWVkYmFja3dhcmQgJiYgcG9zICE9IDApDQorICB7DQorICAgIHBvcyAtPSBrQ2x1c3RlclNpemU7DQorICAgIGZvciAoOzspDQorICAgIHsNCisgICAgICAvLyBicmVhazsNCisgICAgICBpZiAoIVNlZWsocG9zLCByZWFsTmV3UG9zaXRpb24pKQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgaWYgKCFidWYpDQorICAgICAgew0KKyAgICAgICAgYnVmID0gKEJ5dGUgKilNaWRBbGxvYyhrQ2x1c3RlclNpemUpOw0KKyAgICAgICAgaWYgKCFidWYpDQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBVSW50MzIgcHJvY2Vzc2VkID0gMDsNCisgICAgICAvLyB0aGF0IGNvZGUgZG9lc24ndCB3b3JrIGZvciAiUGh5c2ljYWxEcml2ZTAiDQorICAgICAgaWYgKCFSZWFkMShidWYsIGtDbHVzdGVyU2l6ZSwgcHJvY2Vzc2VkKSkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGlmIChwcm9jZXNzZWQgIT0gMCkNCisgICAgICB7DQorICAgICAgICBTaXplID0gcG9zICsgcHJvY2Vzc2VkOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChwb3MgPT0gMCkNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIHBvcyAtPSBrQ2x1c3RlclNpemU7DQorICAgIH0NCisgIH0NCisgIE1pZEZyZWUoYnVmKTsNCit9DQorDQorDQordm9pZCBDSW5GaWxlOjpDYWxjRGV2aWNlU2l6ZShDRlNUUiBzKQ0KK3sNCisgIFNpemVEZWZpbmVkID0gZmFsc2U7DQorICBTaXplID0gMDsNCisgIGlmIChfaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFIHx8ICFJc0RldmljZUZpbGUpDQorICAgIHJldHVybjsNCisgICNpZmRlZiBVTkRFUl9DRQ0KKw0KKyAgU2l6ZURlZmluZWQgPSB0cnVlOw0KKyAgU2l6ZSA9IDEyOCA8PCAyMDsNCisgIA0KKyAgI2Vsc2UNCisgIA0KKyAgUEFSVElUSU9OX0lORk9STUFUSU9OIHBhcnRJbmZvOw0KKyAgYm9vbCBuZWVkQ29ycmVjdFNpemUgPSB0cnVlOw0KKw0KKyAgLyoNCisgICAgV2luWFAgNjQtYml0Og0KKw0KKyAgICBIREQgXFwuXFBoeXNpY2FsRHJpdmUwIChNQlIpOg0KKyAgICAgIEdldFBhcnRpdGlvbkluZm8gPT0gR2VvbWV0cnlFeCA6ICBjb3JycmVjdCBzaXplPyAoaW5jbHVkZXMgdGFpbCkNCisgICAgICBHZW9tZXRyeSAgIDogIHNtYWxsZXIgdGhhbiBHZW9tZXRyeUV4IChubyB0YWlsLCBtYXliZSBjb3JyZWN0IHRvbz8pDQorICAgICAgTXlHZXREaXNrRnJlZVNwYWNlIDogRkFJTA0KKyAgICAgIFNpemUgY29ycmVjdGlvbiBpcyBzbG93IGFuZCBibG9jayBzaXplIChrQ2x1c3RlclNpemUpIG11c3QgYmUgc21hbGw/DQorDQorICAgIEhERCBwYXJ0aXRpb24gXFwuXE46IChOVEZTKToNCisgICAgICBNeUdldERpc2tGcmVlU3BhY2UgICA6ICBTaXplIG9mIE5URlMgY2x1c3RlcnMuIFNhbWUgc2l6ZSBjYW4gYmUgY2FsY3VsYXRlZCBhZnRlciBjb3JyZWN0aW9uDQorICAgICAgR2V0UGFydGl0aW9uSW5mbyAgICAgOiAgc2l6ZSBvZiBwYXJ0aXRpb24gZGF0YTogTlRGUyBjbHVzdGVycyArIFRBSUw7IFRBSUwgY29udGFpbnMgZXh0cmEgZW1wdHkgc2VjdG9ycyBhbmQgY29weSBvZiBmaXJzdCBzZWN0b3Igb2YgTlRGUw0KKyAgICAgIEdlb21ldHJ5IC8gQ2RSb21HZW9tZXRyeSAvIEdlb21ldHJ5RXggOiAgc2l6ZSBvZiBIREQgKG5vdCB0aGF0IHBhcnRpdGlvbikNCisNCisgICAgQ0QtUk9NIGRyaXZlIChJU08pOg0KKyAgICAgIE15R2V0RGlza0ZyZWVTcGFjZSAgIDogIGNvcnJlY3Qgc2l6ZS4gU2FtZSBzaXplIGNhbiBiZSBjYWxjdWxhdGVkIGFmdGVyIGNvcnJlY3Rpb24NCisgICAgICBHZW9tZXRyeSA9PSBDZFJvbUdlb21ldHJ5ICA6ICBzbWFsbGVyIHRoYW4gY29ycnJlY3Qgc2l6ZQ0KKyAgICAgIEdldFBhcnRpdGlvbkluZm8gPT0gR2VvbWV0cnlFeCA6ICBsYXJnZXIgdGhhbiBjb3JycmVjdCBzaXplDQorDQorICAgIEZsb3BweSBcXC5cYTogKEZBVCk6DQorICAgICAgR2VvbWV0cnkgOiAgY29ycmVjdCBzaXplLg0KKyAgICAgIENkUm9tR2VvbWV0cnkgLyBHZW9tZXRyeUV4IC8gR2V0UGFydGl0aW9uSW5mbyAvIE15R2V0RGlza0ZyZWVTcGFjZSAtIEZBSUwNCisgICAgICBjb3JyZWN0aW9uIHdvcmtzIE9LIGZvciBGQVQuDQorICAgICAgY29ycmVjdGlvbiB3b3JrcyBPSyBmb3Igbm9uLUZBVCwgaWYga0NsdXN0ZXJTaXplID0gNTEyLg0KKyAgKi8NCisNCisgIGlmIChHZXRQYXJ0aXRpb25JbmZvKCZwYXJ0SW5mbykpDQorICB7DQorICAgIFNpemUgPSBwYXJ0SW5mby5QYXJ0aXRpb25MZW5ndGguUXVhZFBhcnQ7DQorICAgIFNpemVEZWZpbmVkID0gdHJ1ZTsNCisgICAgbmVlZENvcnJlY3RTaXplID0gZmFsc2U7DQorICAgIGlmICgocylbMF0gPT0gJ1xcJyAmJiAocylbMV0gPT0gJ1xcJyAmJiAocylbMl0gPT0gJy4nICYmIChzKVszXSA9PSAnXFwnICYmIChzKVs1XSA9PSAnOicgJiYgKHMpWzZdID09IDApDQorICAgIHsNCisgICAgICBGQ2hhciBwYXRoWzRdID0geyBzWzRdLCAnOicsICdcXCcsIDAgfTsNCisgICAgICBVSW50NjQgY2x1c3RlclNpemUsIHRvdGFsU2l6ZSwgZnJlZVNpemU7DQorICAgICAgaWYgKE5TeXN0ZW06Ok15R2V0RGlza0ZyZWVTcGFjZShwYXRoLCBjbHVzdGVyU2l6ZSwgdG90YWxTaXplLCBmcmVlU2l6ZSkpDQorICAgICAgICBTaXplID0gdG90YWxTaXplOw0KKyAgICAgIGVsc2UNCisgICAgICAgIG5lZWRDb3JyZWN0U2l6ZSA9IHRydWU7DQorICAgIH0NCisgIH0NCisgIA0KKyAgaWYgKCFTaXplRGVmaW5lZCkNCisgIHsNCisgICAgbXlfRElTS19HRU9NRVRSWV9FWCBnZW9tRXg7DQorICAgIFNpemVEZWZpbmVkID0gR2V0R2VvbWV0cnlFeCgmZ2VvbUV4KTsNCisgICAgaWYgKFNpemVEZWZpbmVkKQ0KKyAgICAgIFNpemUgPSBnZW9tRXguRGlza1NpemUuUXVhZFBhcnQ7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIERJU0tfR0VPTUVUUlkgZ2VvbTsNCisgICAgICBTaXplRGVmaW5lZCA9IEdldEdlb21ldHJ5KCZnZW9tKTsNCisgICAgICBpZiAoIVNpemVEZWZpbmVkKQ0KKyAgICAgICAgU2l6ZURlZmluZWQgPSBHZXRDZFJvbUdlb21ldHJ5KCZnZW9tKTsNCisgICAgICBpZiAoU2l6ZURlZmluZWQpDQorICAgICAgICBTaXplID0gZ2VvbS5DeWxpbmRlcnMuUXVhZFBhcnQgKiBnZW9tLlRyYWNrc1BlckN5bGluZGVyICogZ2VvbS5TZWN0b3JzUGVyVHJhY2sgKiBnZW9tLkJ5dGVzUGVyU2VjdG9yOw0KKyAgICB9DQorICB9DQorICANCisgIGlmIChuZWVkQ29ycmVjdFNpemUgJiYgU2l6ZURlZmluZWQgJiYgU2l6ZSAhPSAwKQ0KKyAgew0KKyAgICBDb3JyZWN0RGV2aWNlU2l6ZSgpOw0KKyAgICBTZWVrVG9CZWdpbigpOw0KKyAgfQ0KKw0KKyAgLy8gU2Vla1RvQmVnaW4oKTsNCisgICNlbmRpZg0KK30NCisNCisvLyAoKGRlc2lyZWRBY2Nlc3MgJiAoRklMRV9XUklURV9EQVRBIHwgRklMRV9BUFBFTkRfREFUQSB8IEdFTkVSSUNfV1JJVEUpKSA9PSAwICYmDQorDQorI2RlZmluZSBNWV9ERVZJQ0VfRVhUUkFfQ09ERSBcDQorICBJc0RldmljZUZpbGUgPSBJc0RldmljZVBhdGgoZmlsZU5hbWUpOyBcDQorICBDYWxjRGV2aWNlU2l6ZShmaWxlTmFtZSk7DQorI2Vsc2UNCisjZGVmaW5lIE1ZX0RFVklDRV9FWFRSQV9DT0RFDQorI2VuZGlmDQorDQorYm9vbCBDSW5GaWxlOjpPcGVuKENGU1RSIGZpbGVOYW1lLCBEV09SRCBzaGFyZU1vZGUsIERXT1JEIGNyZWF0aW9uRGlzcG9zaXRpb24sIERXT1JEIGZsYWdzQW5kQXR0cmlidXRlcykNCit7DQorICBib29sIHJlcyA9IENyZWF0ZShmaWxlTmFtZSwgR0VORVJJQ19SRUFELCBzaGFyZU1vZGUsIGNyZWF0aW9uRGlzcG9zaXRpb24sIGZsYWdzQW5kQXR0cmlidXRlcyk7DQorICBNWV9ERVZJQ0VfRVhUUkFfQ09ERQ0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorYm9vbCBDSW5GaWxlOjpPcGVuU2hhcmVkKENGU1RSIGZpbGVOYW1lLCBib29sIHNoYXJlRm9yV3JpdGUpDQoreyByZXR1cm4gT3BlbihmaWxlTmFtZSwgRklMRV9TSEFSRV9SRUFEIHwgKHNoYXJlRm9yV3JpdGUgPyBGSUxFX1NIQVJFX1dSSVRFIDogMCksIE9QRU5fRVhJU1RJTkcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCk7IH0NCisNCitib29sIENJbkZpbGU6Ok9wZW4oQ0ZTVFIgZmlsZU5hbWUpDQorICB7IHJldHVybiBPcGVuU2hhcmVkKGZpbGVOYW1lLCBmYWxzZSk7IH0NCisNCisvLyBSZWFkRmlsZSBhbmQgV3JpdGVGaWxlIGZ1bmN0aW9ucyBpbiBXaW5kb3dzIGhhdmUgQlVHOg0KKy8vIElmIHlvdSBSZWFkIG9yIFdyaXRlIDY0TUIgb3IgbW9yZSAocHJvYmFibHkgbWluX2ZhaWx1cmVfc2l6ZSA9IDY0TUIgLSAzMktCICsgMSkNCisvLyBmcm9tL3RvIE5ldHdvcmsgZmlsZSwgaXQgcmV0dXJucyBFUlJPUl9OT19TWVNURU1fUkVTT1VSQ0VTDQorLy8gKEluc3VmZmljaWVudCBzeXN0ZW0gcmVzb3VyY2VzIGV4aXN0IHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0ZWQgc2VydmljZSkuDQorDQorLy8gUHJvYmFibHkgaW4gc29tZSB2ZXJzaW9uIG9mIFdpbmRvd3MgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggb3RoZXIgc2l6ZXM6DQorLy8gZm9yIDMyIE1CIChtYXliZSBhbHNvIGZvciAxNiBNQikuDQorLy8gQW5kIG1lc3NhZ2UgY2FuIGJlICJOZXR3b3JrIGNvbm5lY3Rpb24gd2FzIGxvc3QiDQorDQorc3RhdGljIFVJbnQzMiBrQ2h1bmtTaXplTWF4ID0gKDEgPDwgMjIpOw0KKw0KK2Jvb2wgQ0luRmlsZTo6UmVhZDEodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAmcHJvY2Vzc2VkU2l6ZSkgdGhyb3coKQ0KK3sNCisgIERXT1JEIHByb2Nlc3NlZExvYyA9IDA7DQorICBib29sIHJlcyA9IEJPT0xUb0Jvb2woOjpSZWFkRmlsZShfaGFuZGxlLCBkYXRhLCBzaXplLCAmcHJvY2Vzc2VkTG9jLCBOVUxMKSk7DQorICBwcm9jZXNzZWRTaXplID0gKFVJbnQzMilwcm9jZXNzZWRMb2M7DQorICByZXR1cm4gcmVzOw0KK30NCisNCitib29sIENJbkZpbGU6OlJlYWRQYXJ0KHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgJnByb2Nlc3NlZFNpemUpIHRocm93KCkNCit7DQorICBpZiAoc2l6ZSA+IGtDaHVua1NpemVNYXgpDQorICAgIHNpemUgPSBrQ2h1bmtTaXplTWF4Ow0KKyAgcmV0dXJuIFJlYWQxKGRhdGEsIHNpemUsIHByb2Nlc3NlZFNpemUpOw0KK30NCisNCitib29sIENJbkZpbGU6OlJlYWQodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAmcHJvY2Vzc2VkU2l6ZSkgdGhyb3coKQ0KK3sNCisgIHByb2Nlc3NlZFNpemUgPSAwOw0KKyAgZG8NCisgIHsNCisgICAgVUludDMyIHByb2Nlc3NlZExvYyA9IDA7DQorICAgIGJvb2wgcmVzID0gUmVhZFBhcnQoZGF0YSwgc2l6ZSwgcHJvY2Vzc2VkTG9jKTsNCisgICAgcHJvY2Vzc2VkU2l6ZSArPSBwcm9jZXNzZWRMb2M7DQorICAgIGlmICghcmVzKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgaWYgKHByb2Nlc3NlZExvYyA9PSAwKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICBkYXRhID0gKHZvaWQgKikoKHVuc2lnbmVkIGNoYXIgKilkYXRhICsgcHJvY2Vzc2VkTG9jKTsNCisgICAgc2l6ZSAtPSBwcm9jZXNzZWRMb2M7DQorICB9DQorICB3aGlsZSAoc2l6ZSA+IDApOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8vIC0tLS0tLS0tLS0gQ091dEZpbGUgLS0tLS0tLS0tDQorDQorc3RhdGljIGlubGluZSBEV09SRCBHZXRDcmVhdGlvbkRpc3Bvc2l0aW9uKGJvb2wgY3JlYXRlQWx3YXlzKQ0KKyAgeyByZXR1cm4gY3JlYXRlQWx3YXlzPyBDUkVBVEVfQUxXQVlTOiBDUkVBVEVfTkVXOyB9DQorDQorYm9vbCBDT3V0RmlsZTo6T3BlbihDRlNUUiBmaWxlTmFtZSwgRFdPUkQgc2hhcmVNb2RlLCBEV09SRCBjcmVhdGlvbkRpc3Bvc2l0aW9uLCBEV09SRCBmbGFnc0FuZEF0dHJpYnV0ZXMpDQorICB7IHJldHVybiBDRmlsZUJhc2U6OkNyZWF0ZShmaWxlTmFtZSwgR0VORVJJQ19XUklURSwgc2hhcmVNb2RlLCBjcmVhdGlvbkRpc3Bvc2l0aW9uLCBmbGFnc0FuZEF0dHJpYnV0ZXMpOyB9DQorDQorYm9vbCBDT3V0RmlsZTo6T3BlbihDRlNUUiBmaWxlTmFtZSwgRFdPUkQgY3JlYXRpb25EaXNwb3NpdGlvbikNCisgIHsgcmV0dXJuIE9wZW4oZmlsZU5hbWUsIEZJTEVfU0hBUkVfUkVBRCwgY3JlYXRpb25EaXNwb3NpdGlvbiwgRklMRV9BVFRSSUJVVEVfTk9STUFMKTsgfQ0KKw0KK2Jvb2wgQ091dEZpbGU6OkNyZWF0ZShDRlNUUiBmaWxlTmFtZSwgYm9vbCBjcmVhdGVBbHdheXMpDQorICB7IHJldHVybiBPcGVuKGZpbGVOYW1lLCBHZXRDcmVhdGlvbkRpc3Bvc2l0aW9uKGNyZWF0ZUFsd2F5cykpOyB9DQorDQorYm9vbCBDT3V0RmlsZTo6Q3JlYXRlQWx3YXlzKENGU1RSIGZpbGVOYW1lLCBEV09SRCBmbGFnc0FuZEF0dHJpYnV0ZXMpDQorICB7IHJldHVybiBPcGVuKGZpbGVOYW1lLCBGSUxFX1NIQVJFX1JFQUQsIEdldENyZWF0aW9uRGlzcG9zaXRpb24odHJ1ZSksIGZsYWdzQW5kQXR0cmlidXRlcyk7IH0NCisNCitib29sIENPdXRGaWxlOjpTZXRUaW1lKGNvbnN0IEZJTEVUSU1FICpjVGltZSwgY29uc3QgRklMRVRJTUUgKmFUaW1lLCBjb25zdCBGSUxFVElNRSAqbVRpbWUpIHRocm93KCkNCisgIHsgcmV0dXJuIEJPT0xUb0Jvb2woOjpTZXRGaWxlVGltZShfaGFuZGxlLCBjVGltZSwgYVRpbWUsIG1UaW1lKSk7IH0NCisNCitib29sIENPdXRGaWxlOjpTZXRNVGltZShjb25zdCBGSUxFVElNRSAqbVRpbWUpIHRocm93KCkgeyAgcmV0dXJuIFNldFRpbWUoTlVMTCwgTlVMTCwgbVRpbWUpOyB9DQorDQorYm9vbCBDT3V0RmlsZTo6V3JpdGVQYXJ0KGNvbnN0IHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgJnByb2Nlc3NlZFNpemUpIHRocm93KCkNCit7DQorICBpZiAoc2l6ZSA+IGtDaHVua1NpemVNYXgpDQorICAgIHNpemUgPSBrQ2h1bmtTaXplTWF4Ow0KKyAgRFdPUkQgcHJvY2Vzc2VkTG9jID0gMDsNCisgIGJvb2wgcmVzID0gQk9PTFRvQm9vbCg6OldyaXRlRmlsZShfaGFuZGxlLCBkYXRhLCBzaXplLCAmcHJvY2Vzc2VkTG9jLCBOVUxMKSk7DQorICBwcm9jZXNzZWRTaXplID0gKFVJbnQzMilwcm9jZXNzZWRMb2M7DQorICByZXR1cm4gcmVzOw0KK30NCisNCitib29sIENPdXRGaWxlOjpXcml0ZShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICZwcm9jZXNzZWRTaXplKSB0aHJvdygpDQorew0KKyAgcHJvY2Vzc2VkU2l6ZSA9IDA7DQorICBkbw0KKyAgew0KKyAgICBVSW50MzIgcHJvY2Vzc2VkTG9jID0gMDsNCisgICAgYm9vbCByZXMgPSBXcml0ZVBhcnQoZGF0YSwgc2l6ZSwgcHJvY2Vzc2VkTG9jKTsNCisgICAgcHJvY2Vzc2VkU2l6ZSArPSBwcm9jZXNzZWRMb2M7DQorICAgIGlmICghcmVzKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgaWYgKHByb2Nlc3NlZExvYyA9PSAwKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICBkYXRhID0gKGNvbnN0IHZvaWQgKikoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilkYXRhICsgcHJvY2Vzc2VkTG9jKTsNCisgICAgc2l6ZSAtPSBwcm9jZXNzZWRMb2M7DQorICB9DQorICB3aGlsZSAoc2l6ZSA+IDApOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wgQ091dEZpbGU6OlNldEVuZE9mRmlsZSgpIHRocm93KCkgeyByZXR1cm4gQk9PTFRvQm9vbCg6OlNldEVuZE9mRmlsZShfaGFuZGxlKSk7IH0NCisNCitib29sIENPdXRGaWxlOjpTZXRMZW5ndGgoVUludDY0IGxlbmd0aCkgdGhyb3coKQ0KK3sNCisgIFVJbnQ2NCBuZXdQb3NpdGlvbjsNCisgIGlmICghU2VlayhsZW5ndGgsIG5ld1Bvc2l0aW9uKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgaWYgKG5ld1Bvc2l0aW9uICE9IGxlbmd0aCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIFNldEVuZE9mRmlsZSgpOw0KK30NCisNCit9fX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0ZpbGVJTy5oIGIvbHptYS9DUFAvV2luZG93cy9GaWxlSU8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjY5MWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9GaWxlSU8uaApAQCAtMCwwICsxLDIwMSBAQAorLy8gV2luZG93cy9GaWxlSU8uaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX0ZJTEVfSU9fSA0KKyNkZWZpbmUgX19XSU5ET1dTX0ZJTEVfSU9fSA0KKw0KKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoVU5ERVJfQ0UpDQorI2luY2x1ZGUgPHdpbmlvY3RsLmg+DQorI2VuZGlmDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9NeVN0cmluZy5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlCdWZmZXIuaCINCisNCisjaW5jbHVkZSAiRGVmcy5oIg0KKw0KKyNkZWZpbmUgX215X0lPX1JFUEFSU0VfVEFHX01PVU5UX1BPSU5UICAoMHhBMDAwMDAwM0wpDQorI2RlZmluZSBfbXlfSU9fUkVQQVJTRV9UQUdfU1lNTElOSyAgICAgICgweEEwMDAwMDBDTCkNCisNCisjZGVmaW5lIF9teV9TWU1MSU5LX0ZMQUdfUkVMQVRJVkUgMQ0KKw0KKyNkZWZpbmUgbXlfRlNDVExfU0VUX1JFUEFSU0VfUE9JTlQgIENUTF9DT0RFKEZJTEVfREVWSUNFX0ZJTEVfU1lTVEVNLCA0MSwgTUVUSE9EX0JVRkZFUkVELCBGSUxFX1NQRUNJQUxfQUNDRVNTKSAvLyBSRVBBUlNFX0RBVEFfQlVGRkVSDQorI2RlZmluZSBteV9GU0NUTF9HRVRfUkVQQVJTRV9QT0lOVCAgQ1RMX0NPREUoRklMRV9ERVZJQ0VfRklMRV9TWVNURU0sIDQyLCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfQU5ZX0FDQ0VTUykgICAgIC8vIFJFUEFSU0VfREFUQV9CVUZGRVINCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBORmlsZSB7DQorDQorI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkNCitib29sIEZpbGxMaW5rRGF0YShDQnl0ZUJ1ZmZlciAmZGVzdCwgY29uc3Qgd2NoYXJfdCAqcGF0aCwgYm9vbCBpc1N5bUxpbmspOw0KKyNlbmRpZg0KKw0KK3N0cnVjdCBDUmVwYXJzZVNob3J0SW5mbw0KK3sNCisgIHVuc2lnbmVkIE9mZnNldDsNCisgIHVuc2lnbmVkIFNpemU7DQorDQorICBib29sIFBhcnNlKGNvbnN0IEJ5dGUgKnAsIHNpemVfdCBzaXplKTsNCit9Ow0KKw0KK3N0cnVjdCBDUmVwYXJzZUF0dHINCit7DQorICBVSW50MzIgVGFnOw0KKyAgVUludDMyIEZsYWdzOw0KKyAgVVN0cmluZyBTdWJzTmFtZTsNCisgIFVTdHJpbmcgUHJpbnROYW1lOw0KKw0KKyAgQ1JlcGFyc2VBdHRyKCk6IFRhZygwKSwgRmxhZ3MoMCkge30NCisgIGJvb2wgUGFyc2UoY29uc3QgQnl0ZSAqcCwgc2l6ZV90IHNpemUpOw0KKw0KKyAgYm9vbCBJc01vdW50UG9pbnQoKSBjb25zdCB7IHJldHVybiBUYWcgPT0gX215X0lPX1JFUEFSU0VfVEFHX01PVU5UX1BPSU5UOyB9IC8vIGl0J3MgSnVuY3Rpb24NCisgIGJvb2wgSXNTeW1MaW5rKCkgY29uc3QgeyByZXR1cm4gVGFnID09IF9teV9JT19SRVBBUlNFX1RBR19TWU1MSU5LOyB9DQorICBib29sIElzUmVsYXRpdmUoKSBjb25zdCB7IHJldHVybiBGbGFncyA9PSBfbXlfU1lNTElOS19GTEFHX1JFTEFUSVZFOyB9DQorICAvLyBib29sIElzVm9sdW1lKCkgY29uc3Q7DQorDQorICBib29sIElzT2tOYW1lUGFpcigpIGNvbnN0Ow0KKyAgVVN0cmluZyBHZXRQYXRoKCkgY29uc3Q7DQorfTsNCisNCituYW1lc3BhY2UgTklPIHsNCisNCitib29sIEdldFJlcGFyc2VEYXRhKENGU1RSIHBhdGgsIENCeXRlQnVmZmVyICZyZXBhcnNlRGF0YSwgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gKmZpbGVJbmZvID0gTlVMTCk7DQorYm9vbCBTZXRSZXBhcnNlRGF0YShDRlNUUiBwYXRoLCBib29sIGlzRGlyLCBjb25zdCB2b2lkICpkYXRhLCBEV09SRCBzaXplKTsNCisNCitjbGFzcyBDRmlsZUJhc2UNCit7DQorcHJvdGVjdGVkOg0KKyAgSEFORExFIF9oYW5kbGU7DQorICANCisgIGJvb2wgQ3JlYXRlKENGU1RSIHBhdGgsIERXT1JEIGRlc2lyZWRBY2Nlc3MsDQorICAgICAgRFdPUkQgc2hhcmVNb2RlLCBEV09SRCBjcmVhdGlvbkRpc3Bvc2l0aW9uLCBEV09SRCBmbGFnc0FuZEF0dHJpYnV0ZXMpOw0KKw0KK3B1YmxpYzoNCisNCisgIGJvb2wgRGV2aWNlSW9Db250cm9sKERXT1JEIGNvbnRyb2xDb2RlLCBMUFZPSUQgaW5CdWZmZXIsIERXT1JEIGluU2l6ZSwNCisgICAgICBMUFZPSUQgb3V0QnVmZmVyLCBEV09SRCBvdXRTaXplLCBMUERXT1JEIGJ5dGVzUmV0dXJuZWQsIExQT1ZFUkxBUFBFRCBvdmVybGFwcGVkID0gTlVMTCkgY29uc3QNCisgIHsNCisgICAgcmV0dXJuIEJPT0xUb0Jvb2woOjpEZXZpY2VJb0NvbnRyb2woX2hhbmRsZSwgY29udHJvbENvZGUsIGluQnVmZmVyLCBpblNpemUsDQorICAgICAgICBvdXRCdWZmZXIsIG91dFNpemUsIGJ5dGVzUmV0dXJuZWQsIG92ZXJsYXBwZWQpKTsNCisgIH0NCisNCisgIGJvb2wgRGV2aWNlSW9Db250cm9sT3V0KERXT1JEIGNvbnRyb2xDb2RlLCBMUFZPSUQgb3V0QnVmZmVyLCBEV09SRCBvdXRTaXplLCBMUERXT1JEIGJ5dGVzUmV0dXJuZWQpIGNvbnN0DQorICB7DQorICAgIHJldHVybiBEZXZpY2VJb0NvbnRyb2woY29udHJvbENvZGUsIE5VTEwsIDAsIG91dEJ1ZmZlciwgb3V0U2l6ZSwgYnl0ZXNSZXR1cm5lZCk7DQorICB9DQorDQorICBib29sIERldmljZUlvQ29udHJvbE91dChEV09SRCBjb250cm9sQ29kZSwgTFBWT0lEIG91dEJ1ZmZlciwgRFdPUkQgb3V0U2l6ZSkgY29uc3QNCisgIHsNCisgICAgRFdPUkQgYnl0ZXNSZXR1cm5lZDsNCisgICAgcmV0dXJuIERldmljZUlvQ29udHJvbE91dChjb250cm9sQ29kZSwgb3V0QnVmZmVyLCBvdXRTaXplLCAmYnl0ZXNSZXR1cm5lZCk7DQorICB9DQorDQorcHVibGljOg0KKyAgI2lmZGVmIFNVUFBPUlRfREVWSUNFX0ZJTEUNCisgIGJvb2wgSXNEZXZpY2VGaWxlOw0KKyAgYm9vbCBTaXplRGVmaW5lZDsNCisgIFVJbnQ2NCBTaXplOyAvLyBpdCBjYW4gYmUgbGFyZ2VyIHRoYW4gcmVhbCBhdmFpbGFibGUgc2l6ZQ0KKyAgI2VuZGlmDQorDQorICBDRmlsZUJhc2UoKTogX2hhbmRsZShJTlZBTElEX0hBTkRMRV9WQUxVRSkge307DQorICB+Q0ZpbGVCYXNlKCkgeyBDbG9zZSgpOyB9DQorDQorICBib29sIENsb3NlKCkgdGhyb3coKTsNCisNCisgIGJvb2wgR2V0UG9zaXRpb24oVUludDY0ICZwb3NpdGlvbikgY29uc3QgdGhyb3coKTsNCisgIGJvb2wgR2V0TGVuZ3RoKFVJbnQ2NCAmbGVuZ3RoKSBjb25zdCB0aHJvdygpOw0KKw0KKyAgYm9vbCBTZWVrKEludDY0IGRpc3RhbmNlVG9Nb3ZlLCBEV09SRCBtb3ZlTWV0aG9kLCBVSW50NjQgJm5ld1Bvc2l0aW9uKSBjb25zdCB0aHJvdygpOw0KKyAgYm9vbCBTZWVrKFVJbnQ2NCBwb3NpdGlvbiwgVUludDY0ICZuZXdQb3NpdGlvbikgY29uc3QgdGhyb3coKTsNCisgIGJvb2wgU2Vla1RvQmVnaW4oKSBjb25zdCB0aHJvdygpOw0KKyAgYm9vbCBTZWVrVG9FbmQoVUludDY0ICZuZXdQb3NpdGlvbikgY29uc3QgdGhyb3coKTsNCisgIA0KKyAgYm9vbCBHZXRGaWxlSW5mb3JtYXRpb24oQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gKmluZm8pIGNvbnN0DQorICAgIHsgcmV0dXJuIEJPT0xUb0Jvb2woR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUoX2hhbmRsZSwgaW5mbykpOyB9DQorDQorICBzdGF0aWMgYm9vbCBHZXRGaWxlSW5mb3JtYXRpb24oQ0ZTVFIgcGF0aCwgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gKmluZm8pDQorICB7DQorICAgIE5JTzo6Q0ZpbGVCYXNlIGZpbGU7DQorICAgIGlmICghZmlsZS5DcmVhdGUocGF0aCwgMCwgRklMRV9TSEFSRV9SRUFELCBPUEVOX0VYSVNUSU5HLCBGSUxFX0ZMQUdfQkFDS1VQX1NFTUFOVElDUykpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICByZXR1cm4gZmlsZS5HZXRGaWxlSW5mb3JtYXRpb24oaW5mbyk7DQorICB9DQorfTsNCisNCisjaWZuZGVmIFVOREVSX0NFDQorI2RlZmluZSBJT0NUTF9DRFJPTV9CQVNFICBGSUxFX0RFVklDRV9DRF9ST00NCisjZGVmaW5lIElPQ1RMX0NEUk9NX0dFVF9EUklWRV9HRU9NRVRSWSAgQ1RMX0NPREUoSU9DVExfQ0RST01fQkFTRSwgMHgwMDEzLCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfUkVBRF9BQ0NFU1MpDQorLy8gI2RlZmluZSBJT0NUTF9DRFJPTV9NRURJQV9SRU1PVkFMICBDVExfQ09ERShJT0NUTF9DRFJPTV9CQVNFLCAweDAyMDEsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9SRUFEX0FDQ0VTUykNCisNCisvLyBJT0NUTF9ESVNLX0dFVF9EUklWRV9HRU9NRVRSWV9FWCB3b3JrcyBzaW5jZSBXaW5YUA0KKyNkZWZpbmUgbXlfSU9DVExfRElTS19HRVRfRFJJVkVfR0VPTUVUUllfRVggIENUTF9DT0RFKElPQ1RMX0RJU0tfQkFTRSwgMHgwMDI4LCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfQU5ZX0FDQ0VTUykNCisNCitzdHJ1Y3QgbXlfRElTS19HRU9NRVRSWV9FWA0KK3sNCisgIERJU0tfR0VPTUVUUlkgR2VvbWV0cnk7DQorICBMQVJHRV9JTlRFR0VSIERpc2tTaXplOw0KKyAgQllURSBEYXRhWzFdOw0KK307DQorI2VuZGlmDQorDQorY2xhc3MgQ0luRmlsZTogcHVibGljIENGaWxlQmFzZQ0KK3sNCisgICNpZmRlZiBTVVBQT1JUX0RFVklDRV9GSUxFDQorDQorICAjaWZuZGVmIFVOREVSX0NFDQorICANCisgIGJvb2wgR2V0R2VvbWV0cnkoRElTS19HRU9NRVRSWSAqcmVzKSBjb25zdA0KKyAgICB7IHJldHVybiBEZXZpY2VJb0NvbnRyb2xPdXQoSU9DVExfRElTS19HRVRfRFJJVkVfR0VPTUVUUlksIHJlcywgc2l6ZW9mKCpyZXMpKTsgfQ0KKw0KKyAgYm9vbCBHZXRHZW9tZXRyeUV4KG15X0RJU0tfR0VPTUVUUllfRVggKnJlcykgY29uc3QNCisgICAgeyByZXR1cm4gRGV2aWNlSW9Db250cm9sT3V0KG15X0lPQ1RMX0RJU0tfR0VUX0RSSVZFX0dFT01FVFJZX0VYLCByZXMsIHNpemVvZigqcmVzKSk7IH0NCisNCisgIGJvb2wgR2V0Q2RSb21HZW9tZXRyeShESVNLX0dFT01FVFJZICpyZXMpIGNvbnN0DQorICAgIHsgcmV0dXJuIERldmljZUlvQ29udHJvbE91dChJT0NUTF9DRFJPTV9HRVRfRFJJVkVfR0VPTUVUUlksIHJlcywgc2l6ZW9mKCpyZXMpKTsgfQ0KKyAgDQorICBib29sIEdldFBhcnRpdGlvbkluZm8oUEFSVElUSU9OX0lORk9STUFUSU9OICpyZXMpDQorICAgIHsgcmV0dXJuIERldmljZUlvQ29udHJvbE91dChJT0NUTF9ESVNLX0dFVF9QQVJUSVRJT05fSU5GTywgTFBWT0lEKHJlcyksIHNpemVvZigqcmVzKSk7IH0NCisgIA0KKyAgI2VuZGlmDQorDQorICB2b2lkIENvcnJlY3REZXZpY2VTaXplKCk7DQorICB2b2lkIENhbGNEZXZpY2VTaXplKENGU1RSIG5hbWUpOw0KKyAgDQorICAjZW5kaWYNCisNCitwdWJsaWM6DQorICBib29sIE9wZW4oQ0ZTVFIgZmlsZU5hbWUsIERXT1JEIHNoYXJlTW9kZSwgRFdPUkQgY3JlYXRpb25EaXNwb3NpdGlvbiwgRFdPUkQgZmxhZ3NBbmRBdHRyaWJ1dGVzKTsNCisgIGJvb2wgT3BlblNoYXJlZChDRlNUUiBmaWxlTmFtZSwgYm9vbCBzaGFyZUZvcldyaXRlKTsNCisgIGJvb2wgT3BlbihDRlNUUiBmaWxlTmFtZSk7DQorDQorICAjaWZuZGVmIFVOREVSX0NFDQorDQorICBib29sIE9wZW5SZXBhcnNlKENGU1RSIGZpbGVOYW1lKQ0KKyAgew0KKyAgICByZXR1cm4gT3BlbihmaWxlTmFtZSwgRklMRV9TSEFSRV9SRUFELCBPUEVOX0VYSVNUSU5HLA0KKyAgICAgICAgRklMRV9GTEFHX09QRU5fUkVQQVJTRV9QT0lOVCB8IEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTKTsNCisgIH0NCisgIA0KKyAgI2VuZGlmDQorDQorICBib29sIFJlYWQxKHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgJnByb2Nlc3NlZFNpemUpIHRocm93KCk7DQorICBib29sIFJlYWRQYXJ0KHZvaWQgKmRhdGEsIFVJbnQzMiBzaXplLCBVSW50MzIgJnByb2Nlc3NlZFNpemUpIHRocm93KCk7DQorICBib29sIFJlYWQodm9pZCAqZGF0YSwgVUludDMyIHNpemUsIFVJbnQzMiAmcHJvY2Vzc2VkU2l6ZSkgdGhyb3coKTsNCit9Ow0KKw0KK2NsYXNzIENPdXRGaWxlOiBwdWJsaWMgQ0ZpbGVCYXNlDQorew0KK3B1YmxpYzoNCisgIGJvb2wgT3BlbihDRlNUUiBmaWxlTmFtZSwgRFdPUkQgc2hhcmVNb2RlLCBEV09SRCBjcmVhdGlvbkRpc3Bvc2l0aW9uLCBEV09SRCBmbGFnc0FuZEF0dHJpYnV0ZXMpOw0KKyAgYm9vbCBPcGVuKENGU1RSIGZpbGVOYW1lLCBEV09SRCBjcmVhdGlvbkRpc3Bvc2l0aW9uKTsNCisgIGJvb2wgQ3JlYXRlKENGU1RSIGZpbGVOYW1lLCBib29sIGNyZWF0ZUFsd2F5cyk7DQorICBib29sIENyZWF0ZUFsd2F5cyhDRlNUUiBmaWxlTmFtZSwgRFdPUkQgZmxhZ3NBbmRBdHRyaWJ1dGVzKTsNCisNCisgIGJvb2wgU2V0VGltZShjb25zdCBGSUxFVElNRSAqY1RpbWUsIGNvbnN0IEZJTEVUSU1FICphVGltZSwgY29uc3QgRklMRVRJTUUgKm1UaW1lKSB0aHJvdygpOw0KKyAgYm9vbCBTZXRNVGltZShjb25zdCBGSUxFVElNRSAqbVRpbWUpIHRocm93KCk7DQorICBib29sIFdyaXRlUGFydChjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICZwcm9jZXNzZWRTaXplKSB0aHJvdygpOw0KKyAgYm9vbCBXcml0ZShjb25zdCB2b2lkICpkYXRhLCBVSW50MzIgc2l6ZSwgVUludDMyICZwcm9jZXNzZWRTaXplKSB0aHJvdygpOw0KKyAgYm9vbCBTZXRFbmRPZkZpbGUoKSB0aHJvdygpOw0KKyAgYm9vbCBTZXRMZW5ndGgoVUludDY0IGxlbmd0aCkgdGhyb3coKTsNCit9Ow0KKw0KK319fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZUxpbmsuY3BwIGIvbHptYS9DUFAvV2luZG93cy9GaWxlTGluay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkMWQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZUxpbmsuY3BwCkBAIC0wLDAgKzEsNDI2IEBACisvLyBXaW5kb3dzL0ZpbGVMaW5rLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vLi4vQy9DcHVBcmNoLmgiDQorDQorI2lmZGVmIFNVUFBPUlRfREVWSUNFX0ZJTEUNCisjaW5jbHVkZSAiLi4vLi4vQy9BbGxvYy5oIg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICJGaWxlRGlyLmgiDQorI2luY2x1ZGUgIkZpbGVGaW5kLmgiDQorI2luY2x1ZGUgIkZpbGVJTy5oIg0KKyNpbmNsdWRlICJGaWxlTmFtZS5oIg0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCitleHRlcm4gYm9vbCBnX0lzTlQ7DQorI2VuZGlmDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkZpbGUgew0KKw0KK3VzaW5nIG5hbWVzcGFjZSBOTmFtZTsNCisNCisvKg0KKyAgUmVwYXJzZSBQb2ludHMgKEp1bmN0aW9ucyBhbmQgU3ltYm9saWMgTGlua3MpOg0KKyAgc3RydWN0DQorICB7DQorICAgIFVJbnQzMiBUYWc7DQorICAgIFVJbnQxNiBTaXplOyAgICAgLy8gbm90IGluY2x1ZGluZyBzdGFydGluZyA4IGJ5dGVzDQorICAgIFVJbnQxNiBSZXNlcnZlZDsgLy8gPSAwDQorICAgIA0KKyAgICBVSW50MTYgU3Vic3RpdHV0ZU9mZnNldDsgLy8gb2Zmc2V0IGluIGJ5dGVzIGZyb20gIHN0YXJ0IG9mIG5hbWVzQ2hhcnMNCisgICAgVUludDE2IFN1YnN0aXR1dGVMZW47ICAgIC8vIHNpemUgaW4gYnl0ZXMsIGl0IGRvZXNuJ3QgaW5jbHVkZSB0YWlsZWQgTlVMDQorICAgIFVJbnQxNiBQcmludE9mZnNldDsgICAgICAvLyBvZmZzZXQgaW4gYnl0ZXMgZnJvbSAgc3RhcnQgb2YgbmFtZXNDaGFycw0KKyAgICBVSW50MTYgUHJpbnRMZW47ICAgICAgICAgLy8gc2l6ZSBpbiBieXRlcywgaXQgZG9lc24ndCBpbmNsdWRlIHRhaWxlZCBOVUwNCisgICAgDQorICAgIFtVSW50MzJdIEZsYWdzOyAgLy8gZm9yIFN5bWJvbGljIExpbmtzIG9ubHkuDQorICAgIA0KKyAgICBVSW50MTYgbmFtZXNDaGFyc1tdDQorICB9DQorDQorICBNT1VOVF9QT0lOVCAoSnVuY3Rpb24gcG9pbnQpOg0KKyAgICAxKSB0aGVyZSBpcyBOVUwgd2NoYXIgYWZ0ZXIgcGF0aA0KKyAgICAyKSBEZWZhdWx0IE9yZGVyIGluIHRhYmxlOg0KKyAgICAgICAgIFN1YnN0aXR1dGUgUGF0aA0KKyAgICAgICAgIFByaW50IFBhdGgNCisgICAgMykgcGF0aG5hbWVzIGNhbiBub3QgY29udGFpbiBkb3QgZGlyZWN0b3J5IG5hbWVzDQorDQorICBTWU1MSU5LOg0KKyAgICAxKSB0aGVyZSBpcyBubyBOVUwgd2NoYXIgYWZ0ZXIgcGF0aA0KKyAgICAyKSBEZWZhdWx0IE9yZGVyIGluIHRhYmxlOg0KKyAgICAgICAgIFByaW50IFBhdGgNCisgICAgICAgICBTdWJzdGl0dXRlIFBhdGgNCisqLw0KKw0KKy8qDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrUmVwYXJzZUZsYWdzX0FsaWFzICAgICAgID0gKDEgPDwgMjkpOw0KK3N0YXRpYyBjb25zdCBVSW50MzIga1JlcGFyc2VGbGFnc19IaWdoTGF0ZW5jeSA9ICgxIDw8IDMwKTsNCitzdGF0aWMgY29uc3QgVUludDMyIGtSZXBhcnNlRmxhZ3NfTWljcm9zb2Z0ICAgPSAoKFVJbnQzMikxIDw8IDMxKTsNCisNCisjZGVmaW5lIF9teV9JT19SRVBBUlNFX1RBR19IU00gICAgICAgICAgKDB4QzAwMDAwMDRMKQ0KKyNkZWZpbmUgX215X0lPX1JFUEFSU0VfVEFHX0hTTTIgICAgICAgICAoMHg4MDAwMDAwNkwpDQorI2RlZmluZSBfbXlfSU9fUkVQQVJTRV9UQUdfU0lTICAgICAgICAgICgweDgwMDAwMDA3TCkNCisjZGVmaW5lIF9teV9JT19SRVBBUlNFX1RBR19XSU0gICAgICAgICAgKDB4ODAwMDAwMDhMKQ0KKyNkZWZpbmUgX215X0lPX1JFUEFSU0VfVEFHX0NTViAgICAgICAgICAoMHg4MDAwMDAwOUwpDQorI2RlZmluZSBfbXlfSU9fUkVQQVJTRV9UQUdfREZTICAgICAgICAgICgweDgwMDAwMDBBTCkNCisjZGVmaW5lIF9teV9JT19SRVBBUlNFX1RBR19ERlNSICAgICAgICAgKDB4ODAwMDAwMTJMKQ0KKyovDQorDQorI2RlZmluZSBHZXQxNihwKSBHZXRVaTE2KHApDQorI2RlZmluZSBHZXQzMihwKSBHZXRVaTMyKHApDQorDQorI2RlZmluZSBTZXQxNihwLCB2KSBTZXRVaTE2KHAsIHYpDQorI2RlZmluZSBTZXQzMihwLCB2KSBTZXRVaTMyKHAsIHYpDQorDQorc3RhdGljIGNvbnN0IHdjaGFyX3QgKmtfTGlua1ByZWZpeCA9IEwiXFw/P1xcIjsNCitzdGF0aWMgY29uc3QgdW5zaWduZWQga19MaW5rUHJlZml4X1NpemUgPSA0Ow0KKw0KK3N0YXRpYyBjb25zdCBib29sIElzTGlua1ByZWZpeChjb25zdCB3Y2hhcl90ICpzKQ0KK3sNCisgIHJldHVybiBJc1N0cmluZzFQcmVmaXhlZEJ5U3RyaW5nMihzLCBrX0xpbmtQcmVmaXgpOw0KK30NCisNCisvKg0KK3N0YXRpYyBjb25zdCB3Y2hhcl90ICprX1ZvbHVtZVByZWZpeCA9IEwiVm9sdW1leyI7DQorc3RhdGljIGNvbnN0IGJvb2wgSXNWb2x1bWVOYW1lKGNvbnN0IHdjaGFyX3QgKnMpDQorew0KKyAgcmV0dXJuIElzU3RyaW5nMVByZWZpeGVkQnlTdHJpbmcyKHMsIGtfVm9sdW1lUHJlZml4KTsNCit9DQorKi8NCisNCit2b2lkIFdyaXRlU3RyaW5nKEJ5dGUgKmRlc3QsIGNvbnN0IHdjaGFyX3QgKnBhdGgpDQorew0KKyAgZm9yICg7OykNCisgIHsNCisgICAgd2NoYXJfdCBjID0gKnBhdGgrKzsNCisgICAgaWYgKGMgPT0gMCkNCisgICAgICByZXR1cm47DQorICAgIFNldDE2KGRlc3QsIChVSW50MTYpYyk7DQorICAgIGRlc3QgKz0gMjsNCisgIH0NCit9DQorDQorYm9vbCBGaWxsTGlua0RhdGEoQ0J5dGVCdWZmZXIgJmRlc3QsIGNvbnN0IHdjaGFyX3QgKnBhdGgsIGJvb2wgaXNTeW1MaW5rKQ0KK3sNCisgIGJvb2wgaXNBYnMgPSBJc0Fic29sdXRlUGF0aChwYXRoKTsNCisgIGlmICghaXNBYnMgJiYgIWlzU3ltTGluaykNCisgICAgcmV0dXJuIGZhbHNlOw0KKw0KKyAgYm9vbCBuZWVkUHJpbnROYW1lID0gdHJ1ZTsNCisNCisgIGlmIChJc1N1cGVyUGF0aChwYXRoKSkNCisgIHsNCisgICAgcGF0aCArPSBrU3VwZXJQYXRoUHJlZml4U2l6ZTsNCisgICAgaWYgKCFJc0RyaXZlUGF0aChwYXRoKSkNCisgICAgICBuZWVkUHJpbnROYW1lID0gZmFsc2U7DQorICB9DQorDQorICBjb25zdCB1bnNpZ25lZCBhZGRfUHJlZml4X0xlbiA9IGlzQWJzID8ga19MaW5rUHJlZml4X1NpemUgOiAwOw0KKyAgICANCisgIHVuc2lnbmVkIGxlbjIgPSBNeVN0cmluZ0xlbihwYXRoKSAqIDI7DQorICBjb25zdCB1bnNpZ25lZCBsZW4xID0gbGVuMiArIGFkZF9QcmVmaXhfTGVuICogMjsNCisgIGlmICghbmVlZFByaW50TmFtZSkNCisgICAgbGVuMiA9IDA7DQorDQorICB1bnNpZ25lZCB0b3RhbE5hbWVzU2l6ZSA9IChsZW4xICsgbGVuMik7DQorDQorICAvKiBzb21lIFdJTSBpbWFnZXggc29mdHdhcmUgdXNlcyBvbGQgc2NoZW1lIGZvciBzeW1ib2xpYyBsaW5rcy4NCisgICAgIHNvIHdlIGNhbiBvbGQgc2NoZW1lIGZvciBieXRlIHRvIGJ5dGUgY29tcGF0aWJpbGl0eSAqLw0KKw0KKyAgYm9vbCBuZXdPcmRlclNjaGVtZSA9IGlzU3ltTGluazsNCisgIC8vIG5ld09yZGVyU2NoZW1lID0gZmFsc2U7DQorDQorICBpZiAoIW5ld09yZGVyU2NoZW1lKQ0KKyAgICB0b3RhbE5hbWVzU2l6ZSArPSAyICogMjsNCisNCisgIGNvbnN0IHNpemVfdCBzaXplID0gOCArIDggKyAoaXNTeW1MaW5rID8gNCA6IDApICsgdG90YWxOYW1lc1NpemU7DQorICBkZXN0LkFsbG9jKHNpemUpOw0KKyAgbWVtc2V0KGRlc3QsIDAsIHNpemUpOw0KKyAgY29uc3QgVUludDMyIHRhZyA9IGlzU3ltTGluayA/DQorICAgICAgX215X0lPX1JFUEFSU0VfVEFHX1NZTUxJTksgOg0KKyAgICAgIF9teV9JT19SRVBBUlNFX1RBR19NT1VOVF9QT0lOVDsNCisgIEJ5dGUgKnAgPSBkZXN0Ow0KKyAgU2V0MzIocCwgdGFnKTsNCisgIFNldDE2KHAgKyA0LCAoVUludDE2KShzaXplIC0gOCkpOw0KKyAgU2V0MTYocCArIDYsIDApOw0KKyAgcCArPSA4Ow0KKw0KKyAgdW5zaWduZWQgc3ViT2ZmcyA9IDA7DQorICB1bnNpZ25lZCBwcmludE9mZnMgPSAwOw0KKyAgaWYgKG5ld09yZGVyU2NoZW1lKQ0KKyAgICBzdWJPZmZzID0gbGVuMjsNCisgIGVsc2UNCisgICAgcHJpbnRPZmZzID0gbGVuMSArIDI7DQorDQorICBTZXQxNihwICsgMCwgKFVJbnQxNilzdWJPZmZzKTsNCisgIFNldDE2KHAgKyAyLCAoVUludDE2KWxlbjEpOw0KKyAgU2V0MTYocCArIDQsIChVSW50MTYpcHJpbnRPZmZzKTsNCisgIFNldDE2KHAgKyA2LCAoVUludDE2KWxlbjIpOw0KKw0KKyAgcCArPSA4Ow0KKyAgaWYgKGlzU3ltTGluaykNCisgIHsNCisgICAgVUludDMyIGZsYWdzID0gaXNBYnMgPyAwIDogX215X1NZTUxJTktfRkxBR19SRUxBVElWRTsNCisgICAgU2V0MzIocCwgZmxhZ3MpOw0KKyAgICBwICs9IDQ7DQorICB9DQorDQorICBpZiAoYWRkX1ByZWZpeF9MZW4gIT0gMCkNCisgICAgV3JpdGVTdHJpbmcocCArIHN1Yk9mZnMsIGtfTGlua1ByZWZpeCk7DQorICBXcml0ZVN0cmluZyhwICsgc3ViT2ZmcyArIGFkZF9QcmVmaXhfTGVuICogMiwgcGF0aCk7DQorICBpZiAobmVlZFByaW50TmFtZSkNCisgICAgV3JpdGVTdHJpbmcocCArIHByaW50T2ZmcywgcGF0aCk7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorc3RhdGljIHZvaWQgR2V0U3RyaW5nKGNvbnN0IEJ5dGUgKnAsIHVuc2lnbmVkIGxlbiwgVVN0cmluZyAmcmVzKQ0KK3sNCisgIHdjaGFyX3QgKnMgPSByZXMuR2V0QnVmZmVyKGxlbik7DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspDQorICAgIHNbaV0gPSBHZXQxNihwICsgaSAqIDIpOw0KKyAgc1tsZW5dID0gMDsNCisgIHJlcy5SZWxlYXNlQnVmZmVyKCk7DQorfQ0KKw0KK2Jvb2wgQ1JlcGFyc2VBdHRyOjpQYXJzZShjb25zdCBCeXRlICpwLCBzaXplX3Qgc2l6ZSkNCit7DQorICBpZiAoc2l6ZSA8IDgpDQorICAgIHJldHVybiBmYWxzZTsNCisgIFRhZyA9IEdldDMyKHApOw0KKyAgVUludDMyIGxlbiA9IEdldDE2KHAgKyA0KTsNCisgIGlmIChsZW4gKyA4ID4gc2l6ZSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgLyoNCisgIGlmICgodHlwZSAmIGtSZXBhcnNlRmxhZ3NfQWxpYXMpID09IDAgfHwNCisgICAgICAodHlwZSAmIGtSZXBhcnNlRmxhZ3NfTWljcm9zb2Z0KSA9PSAwIHx8DQorICAgICAgKHR5cGUgJiAweEZGRkYpICE9IDMpDQorICAqLw0KKyAgaWYgKFRhZyAhPSBfbXlfSU9fUkVQQVJTRV9UQUdfTU9VTlRfUE9JTlQgJiYNCisgICAgICBUYWcgIT0gX215X0lPX1JFUEFSU0VfVEFHX1NZTUxJTkspDQorICAgIC8vIHJldHVybiB0cnVlOw0KKyAgICByZXR1cm4gZmFsc2U7DQorDQorICBpZiAoR2V0MTYocCArIDYpICE9IDApIC8vIHBhZGRpbmcNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgDQorICBwICs9IDg7DQorICBzaXplIC09IDg7DQorICANCisgIGlmIChsZW4gIT0gc2l6ZSkgLy8gZG8gd2UgbmVlZCB0aGF0IGNoZWNrPw0KKyAgICByZXR1cm4gZmFsc2U7DQorICANCisgIGlmIChsZW4gPCA4KQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICB1bnNpZ25lZCBzdWJPZmZzID0gR2V0MTYocCk7DQorICB1bnNpZ25lZCBzdWJMZW4gPSBHZXQxNihwICsgMik7DQorICB1bnNpZ25lZCBwcmludE9mZnMgPSBHZXQxNihwICsgNCk7DQorICB1bnNpZ25lZCBwcmludExlbiA9IEdldDE2KHAgKyA2KTsNCisgIGxlbiAtPSA4Ow0KKyAgcCArPSA4Ow0KKw0KKyAgRmxhZ3MgPSAwOw0KKyAgaWYgKFRhZyA9PSBfbXlfSU9fUkVQQVJTRV9UQUdfU1lNTElOSykNCisgIHsNCisgICAgaWYgKGxlbiA8IDQpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICBGbGFncyA9IEdldDMyKHApOw0KKyAgICBsZW4gLT0gNDsNCisgICAgcCArPSA0Ow0KKyAgfQ0KKw0KKyAgaWYgKChzdWJPZmZzICYgMSkgIT0gMCB8fCBzdWJPZmZzID4gbGVuIHx8IGxlbiAtIHN1Yk9mZnMgPCBzdWJMZW4pDQorICAgIHJldHVybiBmYWxzZTsNCisgIGlmICgocHJpbnRPZmZzICYgMSkgIT0gMCB8fCBwcmludE9mZnMgPiBsZW4gfHwgbGVuIC0gcHJpbnRPZmZzIDwgcHJpbnRMZW4pDQorICAgIHJldHVybiBmYWxzZTsNCisgIEdldFN0cmluZyhwICsgc3ViT2Zmcywgc3ViTGVuID4+IDEsIFN1YnNOYW1lKTsNCisgIEdldFN0cmluZyhwICsgcHJpbnRPZmZzLCBwcmludExlbiA+PiAxLCBQcmludE5hbWUpOw0KKw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wgQ1JlcGFyc2VTaG9ydEluZm86OlBhcnNlKGNvbnN0IEJ5dGUgKnAsIHNpemVfdCBzaXplKQ0KK3sNCisgIGNvbnN0IEJ5dGUgKnN0YXJ0ID0gcDsNCisgIE9mZnNldD0gMDsNCisgIFNpemUgPSAwOw0KKyAgaWYgKHNpemUgPCA4KQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBVSW50MzIgVGFnID0gR2V0MzIocCk7DQorICBVSW50MzIgbGVuID0gR2V0MTYocCArIDQpOw0KKyAgaWYgKGxlbiArIDggPiBzaXplKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICAvKg0KKyAgaWYgKCh0eXBlICYga1JlcGFyc2VGbGFnc19BbGlhcykgPT0gMCB8fA0KKyAgICAgICh0eXBlICYga1JlcGFyc2VGbGFnc19NaWNyb3NvZnQpID09IDAgfHwNCisgICAgICAodHlwZSAmIDB4RkZGRikgIT0gMykNCisgICovDQorICBpZiAoVGFnICE9IF9teV9JT19SRVBBUlNFX1RBR19NT1VOVF9QT0lOVCAmJg0KKyAgICAgIFRhZyAhPSBfbXlfSU9fUkVQQVJTRV9UQUdfU1lNTElOSykNCisgICAgLy8gcmV0dXJuIHRydWU7DQorICAgIHJldHVybiBmYWxzZTsNCisNCisgIGlmIChHZXQxNihwICsgNikgIT0gMCkgLy8gcGFkZGluZw0KKyAgICByZXR1cm4gZmFsc2U7DQorICANCisgIHAgKz0gODsNCisgIHNpemUgLT0gODsNCisgIA0KKyAgaWYgKGxlbiAhPSBzaXplKSAvLyBkbyB3ZSBuZWVkIHRoYXQgY2hlY2s/DQorICAgIHJldHVybiBmYWxzZTsNCisgIA0KKyAgaWYgKGxlbiA8IDgpDQorICAgIHJldHVybiBmYWxzZTsNCisgIHVuc2lnbmVkIHN1Yk9mZnMgPSBHZXQxNihwKTsNCisgIHVuc2lnbmVkIHN1YkxlbiA9IEdldDE2KHAgKyAyKTsNCisgIHVuc2lnbmVkIHByaW50T2ZmcyA9IEdldDE2KHAgKyA0KTsNCisgIHVuc2lnbmVkIHByaW50TGVuID0gR2V0MTYocCArIDYpOw0KKyAgbGVuIC09IDg7DQorICBwICs9IDg7DQorDQorICAvLyBVSW50MzIgRmxhZ3MgPSAwOw0KKyAgaWYgKFRhZyA9PSBfbXlfSU9fUkVQQVJTRV9UQUdfU1lNTElOSykNCisgIHsNCisgICAgaWYgKGxlbiA8IDQpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAvLyBGbGFncyA9IEdldDMyKHApOw0KKyAgICBsZW4gLT0gNDsNCisgICAgcCArPSA0Ow0KKyAgfQ0KKw0KKyAgaWYgKChzdWJPZmZzICYgMSkgIT0gMCB8fCBzdWJPZmZzID4gbGVuIHx8IGxlbiAtIHN1Yk9mZnMgPCBzdWJMZW4pDQorICAgIHJldHVybiBmYWxzZTsNCisgIGlmICgocHJpbnRPZmZzICYgMSkgIT0gMCB8fCBwcmludE9mZnMgPiBsZW4gfHwgbGVuIC0gcHJpbnRPZmZzIDwgcHJpbnRMZW4pDQorICAgIHJldHVybiBmYWxzZTsNCisNCisgIE9mZnNldCA9ICh1bnNpZ25lZCkocCAtIHN0YXJ0KSArIHN1Yk9mZnM7DQorICBTaXplID0gc3ViTGVuOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK2Jvb2wgQ1JlcGFyc2VBdHRyOjpJc09rTmFtZVBhaXIoKSBjb25zdA0KK3sNCisgIGlmIChJc0xpbmtQcmVmaXgoU3Vic05hbWUpKQ0KKyAgew0KKyAgICBpZiAoIUlzRHJpdmVQYXRoKFN1YnNOYW1lLlB0cihrX0xpbmtQcmVmaXhfU2l6ZSkpKQ0KKyAgICAgIHJldHVybiBQcmludE5hbWUuSXNFbXB0eSgpOw0KKyAgICBpZiAod2NzY21wKFN1YnNOYW1lLlB0cihrX0xpbmtQcmVmaXhfU2l6ZSksIFByaW50TmFtZSkgPT0gMCkNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIHJldHVybiB3Y3NjbXAoU3Vic05hbWUsIFByaW50TmFtZSkgPT0gMDsNCit9DQorDQorLyoNCitib29sIENSZXBhcnNlQXR0cjo6SXNWb2x1bWUoKSBjb25zdA0KK3sNCisgIGlmICghSXNMaW5rUHJlZml4KFN1YnNOYW1lKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIElzVm9sdW1lTmFtZShTdWJzTmFtZS5QdHIoa19MaW5rUHJlZml4X1NpemUpKTsNCit9DQorKi8NCisNCitVU3RyaW5nIENSZXBhcnNlQXR0cjo6R2V0UGF0aCgpIGNvbnN0DQorew0KKyAgVVN0cmluZyBzID0gU3Vic05hbWU7DQorICBpZiAoSXNMaW5rUHJlZml4KHMpKQ0KKyAgew0KKyAgICBzLlJlcGxhY2VPbmVDaGFyQXRQb3MoMSwgJ1xcJyk7DQorICAgIGlmIChJc0RyaXZlUGF0aChzLlB0cihrX0xpbmtQcmVmaXhfU2l6ZSkpKQ0KKyAgICAgIHMuRGVsZXRlRnJvbnRhbChrX0xpbmtQcmVmaXhfU2l6ZSk7DQorICB9DQorICByZXR1cm4gczsNCit9DQorDQorDQorI2lmZGVmIFNVUFBPUlRfREVWSUNFX0ZJTEUNCisNCituYW1lc3BhY2UgTlN5c3RlbQ0KK3sNCitib29sIE15R2V0RGlza0ZyZWVTcGFjZShDRlNUUiByb290UGF0aCwgVUludDY0ICZjbHVzdGVyU2l6ZSwgVUludDY0ICZ0b3RhbFNpemUsIFVJbnQ2NCAmZnJlZVNpemUpOw0KK30NCisjZW5kaWYNCisNCisjaWZuZGVmIFVOREVSX0NFDQorDQorbmFtZXNwYWNlIE5JTyB7DQorDQorYm9vbCBHZXRSZXBhcnNlRGF0YShDRlNUUiBwYXRoLCBDQnl0ZUJ1ZmZlciAmcmVwYXJzZURhdGEsIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OICpmaWxlSW5mbykNCit7DQorICByZXBhcnNlRGF0YS5GcmVlKCk7DQorICBDSW5GaWxlIGZpbGU7DQorICBpZiAoIWZpbGUuT3BlblJlcGFyc2UocGF0aCkpDQorICAgIHJldHVybiBmYWxzZTsNCisNCisgIGlmIChmaWxlSW5mbykNCisgICAgZmlsZS5HZXRGaWxlSW5mb3JtYXRpb24oZmlsZUluZm8pOw0KKw0KKyAgY29uc3QgdW5zaWduZWQga0J1ZlNpemUgPSBNQVhJTVVNX1JFUEFSU0VfREFUQV9CVUZGRVJfU0laRTsNCisgIENCeXRlQXJyIGJ1ZihrQnVmU2l6ZSk7DQorICBEV09SRCByZXR1cm5lZFNpemU7DQorICBpZiAoIWZpbGUuRGV2aWNlSW9Db250cm9sT3V0KG15X0ZTQ1RMX0dFVF9SRVBBUlNFX1BPSU5ULCBidWYsIGtCdWZTaXplLCAmcmV0dXJuZWRTaXplKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmVwYXJzZURhdGEuQ29weUZyb20oYnVmLCByZXR1cm5lZFNpemUpOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK3N0YXRpYyBib29sIENyZWF0ZVByZWZpeERpck9mRmlsZShDRlNUUiBwYXRoKQ0KK3sNCisgIEZTdHJpbmcgcGF0aDIgPSBwYXRoOw0KKyAgaW50IHBvcyA9IHBhdGgyLlJldmVyc2VGaW5kKEZDSEFSX1BBVEhfU0VQQVJBVE9SKTsNCisgIGlmIChwb3MgPCAwKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisgICNpZmRlZiBfV0lOMzINCisgIGlmIChwb3MgPT0gMiAmJiBwYXRoMlsxXSA9PSBMJzonKQ0KKyAgICByZXR1cm4gdHJ1ZTsgLy8gd2UgZG9uJ3QgY3JlYXRlIERpc2sgZm9sZGVyOw0KKyAgI2VuZGlmDQorICBwYXRoMi5EZWxldGVGcm9tKHBvcyk7DQorICByZXR1cm4gTkRpcjo6Q3JlYXRlQ29tcGxleERpcihwYXRoMik7DQorfQ0KKw0KKy8vIElmIHRoZXJlIGlzIFJlcHJhc2UgZGF0YSBhbHJlYWR5LCBpdCBzdGlsbCB3cml0ZXMgbmV3IFJlcGFyc2UgZGF0YQ0KK2Jvb2wgU2V0UmVwYXJzZURhdGEoQ0ZTVFIgcGF0aCwgYm9vbCBpc0RpciwgY29uc3Qgdm9pZCAqZGF0YSwgRFdPUkQgc2l6ZSkNCit7DQorICBORmlsZTo6TkZpbmQ6OkNGaWxlSW5mbyBmaTsNCisgIGlmIChmaS5GaW5kKHBhdGgpKQ0KKyAgew0KKyAgICBpZiAoZmkuSXNEaXIoKSAhPSBpc0RpcikNCisgICAgew0KKyAgICAgIDo6U2V0TGFzdEVycm9yKEVSUk9SX0RJUkVDVE9SWSk7DQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorICBlbHNlDQorICB7DQorICAgIGlmIChpc0RpcikNCisgICAgew0KKyAgICAgIGlmICghTkRpcjo6Q3JlYXRlQ29tcGxleERpcihwYXRoKSkNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICBDcmVhdGVQcmVmaXhEaXJPZkZpbGUocGF0aCk7DQorICAgICAgQ091dEZpbGUgZmlsZTsNCisgICAgICBpZiAoIWZpbGUuQ3JlYXRlKHBhdGgsIENSRUFURV9ORVcpKQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICB9DQorDQorICBDT3V0RmlsZSBmaWxlOw0KKyAgaWYgKCFmaWxlLk9wZW4ocGF0aCwNCisgICAgICBGSUxFX1NIQVJFX1dSSVRFLA0KKyAgICAgIE9QRU5fRVhJU1RJTkcsDQorICAgICAgRklMRV9GTEFHX09QRU5fUkVQQVJTRV9QT0lOVCB8IEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKw0KKyAgRFdPUkQgcmV0dXJuZWRTaXplOw0KKyAgaWYgKCFmaWxlLkRldmljZUlvQ29udHJvbChteV9GU0NUTF9TRVRfUkVQQVJTRV9QT0lOVCwgKHZvaWQgKilkYXRhLCBzaXplLCBOVUxMLCAwLCAmcmV0dXJuZWRTaXplKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK30NCisNCisjZW5kaWYNCisNCit9fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZU1hcHBpbmcuY3BwIGIvbHptYS9DUFAvV2luZG93cy9GaWxlTWFwcGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjNGE5NAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZU1hcHBpbmcuY3BwCkBAIC0wLDAgKzEsMTIgQEAKKy8vIFdpbmRvd3MvRmlsZU1hcHBpbmcuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJGaWxlTWFwcGluZy5oIg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorbmFtZXNwYWNlIE5GaWxlIHsNCituYW1lc3BhY2UgTk1hcHBpbmcgew0KKw0KKw0KK319fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZU1hcHBpbmcuaCBiL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZU1hcHBpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QwNzZiCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9GaWxlTWFwcGluZy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vIFdpbmRvd3MvRmlsZU1hcHBpbmcuaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX0ZJTEVNQVBQSU5HX0gNCisjZGVmaW5lIF9fV0lORE9XU19GSUxFTUFQUElOR19IDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9NeVR5cGVzLmgiDQorDQorI2luY2x1ZGUgIkhhbmRsZS5oIg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorDQorY2xhc3MgQ0ZpbGVNYXBwaW5nOiBwdWJsaWMgQ0hhbmRsZQ0KK3sNCitwdWJsaWM6DQorICBXUmVzIENyZWF0ZShEV09SRCBwcm90ZWN0LCBVSW50NjQgbWF4U2l6ZSwgTFBDVFNUUiBuYW1lKQ0KKyAgew0KKyAgICBfaGFuZGxlID0gOjpDcmVhdGVGaWxlTWFwcGluZyhJTlZBTElEX0hBTkRMRV9WQUxVRSwgTlVMTCwgcHJvdGVjdCwgKERXT1JEKShtYXhTaXplID4+IDMyKSwgKERXT1JEKW1heFNpemUsIG5hbWUpOw0KKyAgICByZXR1cm4gOjpHZXRMYXN0RXJyb3IoKTsNCisgIH0NCisNCisgIFdSZXMgT3BlbihEV09SRA0KKyAgICAgICNpZm5kZWYgVU5ERVJfQ0UNCisgICAgICBkZXNpcmVkQWNjZXNzDQorICAgICAgI2VuZGlmDQorICAgICAgLCBMUENUU1RSIG5hbWUpDQorICB7DQorICAgICNpZmRlZiBVTkRFUl9DRQ0KKyAgICBXUmVzIHJlcyA9IENyZWF0ZShQQUdFX1JFQURPTkxZLCAwLCBuYW1lKTsNCisgICAgaWYgKHJlcyA9PSBFUlJPUl9BTFJFQURZX0VYSVNUUykNCisgICAgICByZXR1cm4gMDsNCisgICAgQ2xvc2UoKTsNCisgICAgaWYgKHJlcyA9PSAwKQ0KKyAgICAgIHJlcyA9IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EOw0KKyAgICByZXR1cm4gcmVzOw0KKyAgICAjZWxzZQ0KKyAgICBfaGFuZGxlID0gOjpPcGVuRmlsZU1hcHBpbmcoZGVzaXJlZEFjY2VzcywgRkFMU0UsIG5hbWUpOw0KKyAgICBpZiAoX2hhbmRsZSAhPSAwKQ0KKyAgICAgIHJldHVybiAwOw0KKyAgICByZXR1cm4gOjpHZXRMYXN0RXJyb3IoKTsNCisgICAgI2VuZGlmDQorICB9DQorDQorICBMUFZPSUQgTWFwKERXT1JEIGRlc2lyZWRBY2Nlc3MsIFVJbnQ2NCBmaWxlT2Zmc2V0LCBTSVpFX1QgbnVtYmVyT2ZCeXRlc1RvTWFwKQ0KKyAgew0KKyAgICByZXR1cm4gOjpNYXBWaWV3T2ZGaWxlKF9oYW5kbGUsIGRlc2lyZWRBY2Nlc3MsIChEV09SRCkoZmlsZU9mZnNldCA+PiAzMiksIChEV09SRClmaWxlT2Zmc2V0LCBudW1iZXJPZkJ5dGVzVG9NYXApOw0KKyAgfQ0KKw0KKyAgI2lmbmRlZiBVTkRFUl9DRQ0KKyAgTFBWT0lEIE1hcChEV09SRCBkZXNpcmVkQWNjZXNzLCBVSW50NjQgZmlsZU9mZnNldCwgU0laRV9UIG51bWJlck9mQnl0ZXNUb01hcCwgTFBWT0lEIGJhc2VBZGRyZXNzKQ0KKyAgew0KKyAgICByZXR1cm4gOjpNYXBWaWV3T2ZGaWxlRXgoX2hhbmRsZSwgZGVzaXJlZEFjY2VzcywgKERXT1JEKShmaWxlT2Zmc2V0ID4+IDMyKSwgKERXT1JEKWZpbGVPZmZzZXQsIG51bWJlck9mQnl0ZXNUb01hcCwgYmFzZUFkZHJlc3MpOw0KKyAgfQ0KKyAgI2VuZGlmDQorfTsNCisNCitjbGFzcyBDRmlsZVVubWFwcGVyDQorew0KKyAgY29uc3Qgdm9pZCAqX2RhdGE7DQorcHVibGljOg0KKyAgQ0ZpbGVVbm1hcHBlcihjb25zdCB2b2lkICpkYXRhKSA6IF9kYXRhKGRhdGEpIHt9DQorICB+Q0ZpbGVVbm1hcHBlcigpIHsgOjpVbm1hcFZpZXdPZkZpbGUoX2RhdGEpOyB9DQorfTsNCisNCit9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9GaWxlTmFtZS5jcHAgYi9sem1hL0NQUC9XaW5kb3dzL0ZpbGVOYW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTg5Y2ViCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9GaWxlTmFtZS5jcHAKQEAgLTAsMCArMSw2ODcgQEAKKy8vIFdpbmRvd3MvRmlsZU5hbWUuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJGaWxlTmFtZS5oIg0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCitleHRlcm4gYm9vbCBnX0lzTlQ7DQorI2VuZGlmDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkZpbGUgew0KK25hbWVzcGFjZSBOTmFtZSB7DQorDQorI2lmbmRlZiBVU0VfVU5JQ09ERV9GU1RSSU5HDQordm9pZCBOb3JtYWxpemVEaXJQYXRoUHJlZml4KEZTdHJpbmcgJmRpclBhdGgpDQorew0KKyAgaWYgKGRpclBhdGguSXNFbXB0eSgpKQ0KKyAgICByZXR1cm47DQorICBpZiAoZGlyUGF0aC5CYWNrKCkgIT0gRkNIQVJfUEFUSF9TRVBBUkFUT1IpDQorICAgIGRpclBhdGggKz0gRkNIQVJfUEFUSF9TRVBBUkFUT1I7DQorfQ0KKyNlbmRpZg0KKw0KK3ZvaWQgTm9ybWFsaXplRGlyUGF0aFByZWZpeChVU3RyaW5nICZkaXJQYXRoKQ0KK3sNCisgIGlmIChkaXJQYXRoLklzRW1wdHkoKSkNCisgICAgcmV0dXJuOw0KKyAgaWYgKGRpclBhdGguQmFjaygpICE9IFdDSEFSX1BBVEhfU0VQQVJBVE9SKQ0KKyAgICBkaXJQYXRoICs9IFdDSEFSX1BBVEhfU0VQQVJBVE9SOw0KK30NCisNCisNCisjaWZkZWYgX1dJTjMyDQorDQorY29uc3Qgd2NoYXJfdCAqa1N1cGVyUGF0aFByZWZpeCA9IEwiXFxcXD9cXCI7DQorc3RhdGljIGNvbnN0IHdjaGFyX3QgKmtTdXBlclVuY1ByZWZpeCA9IEwiXFxcXD9cXFVOQ1xcIjsNCisNCisjZGVmaW5lIElTX0RFVklDRV9QQVRIKHMpICAoKHMpWzBdID09ICdcXCcgJiYgKHMpWzFdID09ICdcXCcgJiYgKHMpWzJdID09ICcuJyAmJiAocylbM10gPT0gJ1xcJykNCisjZGVmaW5lIElTX1NVUEVSX1BSRUZJWChzKSAoKHMpWzBdID09ICdcXCcgJiYgKHMpWzFdID09ICdcXCcgJiYgKHMpWzJdID09ICc/JyAmJiAocylbM10gPT0gJ1xcJykNCisjZGVmaW5lIElTX1NVUEVSX09SX0RFVklDRV9QQVRIKHMpICgocylbMF0gPT0gJ1xcJyAmJiAocylbMV0gPT0gJ1xcJyAmJiAoKHMpWzJdID09ICc/JyB8fCAocylbMl0gPT0gJy4nKSAmJiAocylbM10gPT0gJ1xcJykNCisjZGVmaW5lIElTX0xFVFRFUl9DSEFSKGMpICgoYykgPj0gJ2EnICYmIChjKSA8PSAneicgfHwgKGMpID49ICdBJyAmJiAoYykgPD0gJ1onKQ0KKw0KKyNkZWZpbmUgSVNfVU5DX1dJVEhfU0xBU0gocykgKCBcDQorICAoKHMpWzBdID09ICdVJyB8fCAocylbMF0gPT0gJ3UnKSAmJiBcDQorICAoKHMpWzFdID09ICdOJyB8fCAocylbMV0gPT0gJ24nKSAmJiBcDQorICAoKHMpWzJdID09ICdDJyB8fCAocylbMl0gPT0gJ2MnKSAmJiBcDQorICAgKHMpWzNdID09ICdcXCcpDQorDQorYm9vbCBJc0RldmljZVBhdGgoQ0ZTVFIgcykgdGhyb3coKQ0KK3sNCisgICNpZmRlZiBVTkRFUl9DRQ0KKw0KKyAgcyA9IHM7DQorICByZXR1cm4gZmFsc2U7DQorICAvKg0KKyAgLy8gYWN0dWFsbHkgd2UgZG9uJ3Qga25vdyB0aGUgd2F5IHRvIG9wZW4gZGV2aWNlIGZpbGUgaW4gV2luQ0UuDQorICB1bnNpZ25lZCBsZW4gPSBNeVN0cmluZ0xlbihzKTsNCisgIGlmIChsZW4gPCA1IHx8IGxlbiA+IDUgfHwgbWVtY21wKHMsIEZURVhUKCJEU0siKSwgMyAqIHNpemVvZihGQ2hhcikpICE9IDApDQorICAgIHJldHVybiBmYWxzZTsNCisgIGlmIChzWzRdICE9ICc6JykNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgLy8gZm9yIHJlYWRpbmcgdXNlIFNHX1JFUSBzZzsgaWYgKERldmljZUlvQ29udHJvbChkc2ssIElPQ1RMX0RJU0tfUkVBRCkpOw0KKyAgKi8NCisgIA0KKyAgI2Vsc2UNCisgIA0KKyAgaWYgKCFJU19ERVZJQ0VfUEFUSChzKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgdW5zaWduZWQgbGVuID0gTXlTdHJpbmdMZW4ocyk7DQorICBpZiAobGVuID09IDYgJiYgc1s1XSA9PSAnOicpDQorICAgIHJldHVybiB0cnVlOw0KKyAgaWYgKGxlbiA8IDE4IHx8IGxlbiA+IDIyIHx8IG1lbWNtcChzICsga0RldmljZVBhdGhQcmVmaXhTaXplLCBGVEVYVCgiUGh5c2ljYWxEcml2ZSIpLCAxMyAqIHNpemVvZihGQ2hhcikpICE9IDApDQorICAgIHJldHVybiBmYWxzZTsNCisgIGZvciAodW5zaWduZWQgaSA9IDE3OyBpIDwgbGVuOyBpKyspDQorICAgIGlmIChzW2ldIDwgJzAnIHx8IHNbaV0gPiAnOScpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgcmV0dXJuIHRydWU7DQorICANCisgICNlbmRpZg0KK30NCisNCitib29sIElzU3VwZXJVbmNQYXRoKENGU1RSIHMpIHRocm93KCkgeyByZXR1cm4gKElTX1NVUEVSX1BSRUZJWChzKSAmJiBJU19VTkNfV0lUSF9TTEFTSChzICsga1N1cGVyUGF0aFByZWZpeFNpemUpKTsgfQ0KKw0KK2Jvb2wgSXNEcml2ZVBhdGgoY29uc3Qgd2NoYXJfdCAqcykgdGhyb3coKSB7IHJldHVybiBJU19MRVRURVJfQ0hBUihzWzBdKSAmJiBzWzFdID09ICc6JyAmJiBzWzJdID09ICdcXCc7IH0NCitib29sIElzU3VwZXJQYXRoKGNvbnN0IHdjaGFyX3QgKnMpIHRocm93KCkgeyByZXR1cm4gSVNfU1VQRVJfUFJFRklYKHMpOyB9DQorYm9vbCBJc1N1cGVyT3JEZXZpY2VQYXRoKGNvbnN0IHdjaGFyX3QgKnMpIHRocm93KCkgeyByZXR1cm4gSVNfU1VQRVJfT1JfREVWSUNFX1BBVEgocyk7IH0NCisvLyBib29sIElzU3VwZXJVbmNQYXRoKGNvbnN0IHdjaGFyX3QgKnMpIHsgcmV0dXJuIChJU19TVVBFUl9QUkVGSVgocykgJiYgSVNfVU5DX1dJVEhfU0xBU0gocyArIGtTdXBlclBhdGhQcmVmaXhTaXplKSk7IH0NCisNCisjaWZuZGVmIFVTRV9VTklDT0RFX0ZTVFJJTkcNCitib29sIElzRHJpdmVQYXRoKENGU1RSIHMpIHRocm93KCkgeyByZXR1cm4gSVNfTEVUVEVSX0NIQVIoc1swXSkgJiYgc1sxXSA9PSAnOicgJiYgc1syXSA9PSAnXFwnOyB9DQorYm9vbCBJc1N1cGVyUGF0aChDRlNUUiBzKSB0aHJvdygpIHsgcmV0dXJuIElTX1NVUEVSX1BSRUZJWChzKTsgfQ0KK2Jvb2wgSXNTdXBlck9yRGV2aWNlUGF0aChDRlNUUiBzKSB0aHJvdygpIHsgcmV0dXJuIElTX1NVUEVSX09SX0RFVklDRV9QQVRIKHMpOyB9DQorI2VuZGlmIC8vIFVTRV9VTklDT0RFX0ZTVFJJTkcNCisNCitib29sIElzQWJzb2x1dGVQYXRoKGNvbnN0IHdjaGFyX3QgKnMpIHRocm93KCkNCit7DQorICByZXR1cm4gc1swXSA9PSBXQ0hBUl9QQVRIX1NFUEFSQVRPUiB8fCBJc0RyaXZlUGF0aChzKTsNCit9DQorDQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtEcml2ZVByZWZpeFNpemUgPSAzOyAvKiBjOlwgKi8NCisNCisjaWZuZGVmIFVTRV9VTklDT0RFX0ZTVFJJTkcNCisNCitzdGF0aWMgdW5zaWduZWQgR2V0Um9vdFByZWZpeFNpemVfT2ZfTmV0d29ya1BhdGgoQ0ZTVFIgcykgdGhyb3coKQ0KK3sNCisgIC8vIE5ldHdvcmsgcGF0aDogd2UgbG9vayAic2VydmVyXHBhdGhcIiBhcyByb290IHByZWZpeA0KKyAgaW50IHBvcyA9IEZpbmRDaGFyUG9zSW5TdHJpbmcocywgJ1xcJyk7DQorICBpZiAocG9zIDwgMCkNCisgICAgcmV0dXJuIDA7DQorICBpbnQgcG9zMiA9IEZpbmRDaGFyUG9zSW5TdHJpbmcocyArIHBvcyArIDEsICdcXCcpOw0KKyAgaWYgKHBvczIgPCAwKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBwb3MgKyBwb3MyICsgMjsNCit9DQorDQorc3RhdGljIHVuc2lnbmVkIEdldFJvb3RQcmVmaXhTaXplX09mX1NpbXBsZVBhdGgoQ0ZTVFIgcykgdGhyb3coKQ0KK3sNCisgIGlmIChJc0RyaXZlUGF0aChzKSkNCisgICAgcmV0dXJuIGtEcml2ZVByZWZpeFNpemU7DQorICBpZiAoc1swXSAhPSAnXFwnIHx8IHNbMV0gIT0gJ1xcJykNCisgICAgcmV0dXJuIDA7DQorICB1bnNpZ25lZCBzaXplID0gR2V0Um9vdFByZWZpeFNpemVfT2ZfTmV0d29ya1BhdGgocyArIDIpOw0KKyAgcmV0dXJuIChzaXplID09IDApID8gMCA6IDIgKyBzaXplOw0KK30NCisNCitzdGF0aWMgdW5zaWduZWQgR2V0Um9vdFByZWZpeFNpemVfT2ZfU3VwZXJQYXRoKENGU1RSIHMpIHRocm93KCkNCit7DQorICBpZiAoSVNfVU5DX1dJVEhfU0xBU0gocyArIGtTdXBlclBhdGhQcmVmaXhTaXplKSkNCisgIHsNCisgICAgdW5zaWduZWQgc2l6ZSA9IEdldFJvb3RQcmVmaXhTaXplX09mX05ldHdvcmtQYXRoKHMgKyBrU3VwZXJVbmNQYXRoUHJlZml4U2l6ZSk7DQorICAgIHJldHVybiAoc2l6ZSA9PSAwKSA/IDAgOiBrU3VwZXJVbmNQYXRoUHJlZml4U2l6ZSArIHNpemU7DQorICB9DQorICAvLyB3ZSBzdXBwb3J0IFxcP1xjOlwgcGF0aHMgYW5kIHZvbHVtZSBHVUlEIHBhdGhzIFxcP1xWb2x1bWV7R1VJRH1cIg0KKyAgaW50IHBvcyA9IEZpbmRDaGFyUG9zSW5TdHJpbmcocyArIGtTdXBlclBhdGhQcmVmaXhTaXplLCBGQ0hBUl9QQVRIX1NFUEFSQVRPUik7DQorICBpZiAocG9zIDwgMCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4ga1N1cGVyUGF0aFByZWZpeFNpemUgKyBwb3MgKyAxOw0KK30NCisNCit1bnNpZ25lZCBHZXRSb290UHJlZml4U2l6ZShDRlNUUiBzKSB0aHJvdygpDQorew0KKyAgaWYgKElTX0RFVklDRV9QQVRIKHMpKQ0KKyAgICByZXR1cm4ga0RldmljZVBhdGhQcmVmaXhTaXplOw0KKyAgaWYgKElzU3VwZXJQYXRoKHMpKQ0KKyAgICByZXR1cm4gR2V0Um9vdFByZWZpeFNpemVfT2ZfU3VwZXJQYXRoKHMpOw0KKyAgcmV0dXJuIEdldFJvb3RQcmVmaXhTaXplX09mX1NpbXBsZVBhdGgocyk7DQorfQ0KKw0KKyNlbmRpZiAvLyBVU0VfVU5JQ09ERV9GU1RSSU5HDQorDQorc3RhdGljIHVuc2lnbmVkIEdldFJvb3RQcmVmaXhTaXplX09mX05ldHdvcmtQYXRoKGNvbnN0IHdjaGFyX3QgKnMpIHRocm93KCkNCit7DQorICAvLyBOZXR3b3JrIHBhdGg6IHdlIGxvb2sgInNlcnZlclxwYXRoXCIgYXMgcm9vdCBwcmVmaXgNCisgIGludCBwb3MgPSBGaW5kQ2hhclBvc0luU3RyaW5nKHMsIEwnXFwnKTsNCisgIGlmIChwb3MgPCAwKQ0KKyAgICByZXR1cm4gMDsNCisgIGludCBwb3MyID0gRmluZENoYXJQb3NJblN0cmluZyhzICsgcG9zICsgMSwgTCdcXCcpOw0KKyAgaWYgKHBvczIgPCAwKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBwb3MgKyBwb3MyICsgMjsNCit9DQorDQorc3RhdGljIHVuc2lnbmVkIEdldFJvb3RQcmVmaXhTaXplX09mX1NpbXBsZVBhdGgoY29uc3Qgd2NoYXJfdCAqcykgdGhyb3coKQ0KK3sNCisgIGlmIChJc0RyaXZlUGF0aChzKSkNCisgICAgcmV0dXJuIGtEcml2ZVByZWZpeFNpemU7DQorICBpZiAoc1swXSAhPSAnXFwnIHx8IHNbMV0gIT0gJ1xcJykNCisgICAgcmV0dXJuIDA7DQorICB1bnNpZ25lZCBzaXplID0gR2V0Um9vdFByZWZpeFNpemVfT2ZfTmV0d29ya1BhdGgocyArIDIpOw0KKyAgcmV0dXJuIChzaXplID09IDApID8gMCA6IDIgKyBzaXplOw0KK30NCisNCitzdGF0aWMgdW5zaWduZWQgR2V0Um9vdFByZWZpeFNpemVfT2ZfU3VwZXJQYXRoKGNvbnN0IHdjaGFyX3QgKnMpIHRocm93KCkNCit7DQorICBpZiAoSVNfVU5DX1dJVEhfU0xBU0gocyArIGtTdXBlclBhdGhQcmVmaXhTaXplKSkNCisgIHsNCisgICAgdW5zaWduZWQgc2l6ZSA9IEdldFJvb3RQcmVmaXhTaXplX09mX05ldHdvcmtQYXRoKHMgKyBrU3VwZXJVbmNQYXRoUHJlZml4U2l6ZSk7DQorICAgIHJldHVybiAoc2l6ZSA9PSAwKSA/IDAgOiBrU3VwZXJVbmNQYXRoUHJlZml4U2l6ZSArIHNpemU7DQorICB9DQorICAvLyB3ZSBzdXBwb3J0IFxcP1xjOlwgcGF0aHMgYW5kIHZvbHVtZSBHVUlEIHBhdGhzIFxcP1xWb2x1bWV7R1VJRH1cIg0KKyAgaW50IHBvcyA9IEZpbmRDaGFyUG9zSW5TdHJpbmcocyArIGtTdXBlclBhdGhQcmVmaXhTaXplLCBMJ1xcJyk7DQorICBpZiAocG9zIDwgMCkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4ga1N1cGVyUGF0aFByZWZpeFNpemUgKyBwb3MgKyAxOw0KK30NCisNCit1bnNpZ25lZCBHZXRSb290UHJlZml4U2l6ZShjb25zdCB3Y2hhcl90ICpzKSB0aHJvdygpDQorew0KKyAgaWYgKElTX0RFVklDRV9QQVRIKHMpKQ0KKyAgICByZXR1cm4ga0RldmljZVBhdGhQcmVmaXhTaXplOw0KKyAgaWYgKElzU3VwZXJQYXRoKHMpKQ0KKyAgICByZXR1cm4gR2V0Um9vdFByZWZpeFNpemVfT2ZfU3VwZXJQYXRoKHMpOw0KKyAgcmV0dXJuIEdldFJvb3RQcmVmaXhTaXplX09mX1NpbXBsZVBhdGgocyk7DQorfQ0KKw0KKyNlbHNlIC8vIF9XSU4zMg0KKw0KK2Jvb2wgSXNBYnNvbHV0ZVBhdGgoY29uc3Qgd2NoYXJfdCAqcykgdGhyb3coKSB7IHJldHVybiBzWzBdID09IFdDSEFSX1BBVEhfU0VQQVJBVE9SIH0NCisNCisjaWZuZGVmIFVTRV9VTklDT0RFX0ZTVFJJTkcNCit1bnNpZ25lZCBHZXRSb290UHJlZml4U2l6ZShDRlNUUiBzKSB0aHJvdygpIHsgcmV0dXJuIHNbMF0gPT0gQ0hBUl9QQVRIX1NFUFJBVE9SID8gMSA6IDA7IH0NCisjZW5kaWYNCit1bnNpZ25lZCBHZXRSb290UHJlZml4U2l6ZShjb25zdCB3Y2hhcl90ICpzKSB0aHJvdygpIHsgcmV0dXJuIHNbMF0gPT0gQ0hBUl9QQVRIX1NFUFJBVE9SID8gMSA6IDA7IH0NCisNCisjZW5kaWYgLy8gX1dJTjMyDQorDQorDQorI2lmbmRlZiBVTkRFUl9DRQ0KKw0KK3N0YXRpYyBib29sIEdldEN1ckRpcihVU3RyaW5nICZwYXRoKQ0KK3sNCisgIHBhdGguRW1wdHkoKTsNCisgIERXT1JEIG5lZWRMZW5ndGg7DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBpZiAoIWdfSXNOVCkNCisgIHsNCisgICAgVENIQVIgc1tNQVhfUEFUSCArIDJdOw0KKyAgICBzWzBdID0gMDsNCisgICAgbmVlZExlbmd0aCA9IDo6R2V0Q3VycmVudERpcmVjdG9yeShNQVhfUEFUSCArIDEsIHMpOw0KKyAgICBwYXRoID0gZnMydXMoZmFzMmZzKHMpKTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBXQ0hBUiBzW01BWF9QQVRIICsgMl07DQorICAgIHNbMF0gPSAwOw0KKyAgICBuZWVkTGVuZ3RoID0gOjpHZXRDdXJyZW50RGlyZWN0b3J5VyhNQVhfUEFUSCArIDEsIHMpOw0KKyAgICBwYXRoID0gczsNCisgIH0NCisgIHJldHVybiAobmVlZExlbmd0aCA+IDAgJiYgbmVlZExlbmd0aCA8PSBNQVhfUEFUSCk7DQorfQ0KKw0KK3N0YXRpYyBib29sIFJlc29sdmVEb3RzRm9sZGVycyhVU3RyaW5nICZzKQ0KK3sNCisgICNpZmRlZiBfV0lOMzINCisgIHMuUmVwbGFjZShMJy8nLCBXQ0hBUl9QQVRIX1NFUEFSQVRPUik7DQorICAjZW5kaWYNCisgIGZvciAoaW50IGkgPSAwOzspDQorICB7DQorICAgIHdjaGFyX3QgYyA9IHNbaV07DQorICAgIGlmIChjID09IDApDQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIGlmIChjID09ICcuJyAmJiAoaSA9PSAwIHx8IHNbaSAtIDFdID09IFdDSEFSX1BBVEhfU0VQQVJBVE9SKSkNCisgICAgew0KKyAgICAgIHdjaGFyX3QgYzEgPSBzW2kgKyAxXTsNCisgICAgICBpZiAoYzEgPT0gJy4nKQ0KKyAgICAgIHsNCisgICAgICAgIHdjaGFyX3QgYzIgPSBzW2kgKyAyXTsNCisgICAgICAgIGlmIChjMiA9PSBXQ0hBUl9QQVRIX1NFUEFSQVRPUiB8fCBjMiA9PSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICBpZiAoaSA9PSAwKQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgaW50IGsgPSBpIC0gMjsNCisgICAgICAgICAgZm9yICg7IGsgPj0gMDsgay0tKQ0KKyAgICAgICAgICAgIGlmIChzW2tdID09IFdDSEFSX1BBVEhfU0VQQVJBVE9SKQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIHVuc2lnbmVkIG51bTsNCisgICAgICAgICAgaWYgKGsgPj0gMCkNCisgICAgICAgICAgew0KKyAgICAgICAgICAgIG51bSA9IGkgKyAyIC0gazsNCisgICAgICAgICAgICBpID0gazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBlbHNlDQorICAgICAgICAgIHsNCisgICAgICAgICAgICBudW0gPSAoYzIgPT0gMCA/IChpICsgMikgOiAoaSArIDMpKTsNCisgICAgICAgICAgICBpID0gMDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzLkRlbGV0ZShpLCBudW0pOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgIHsNCisgICAgICAgIGlmIChjMSA9PSBXQ0hBUl9QQVRIX1NFUEFSQVRPUiB8fCBjMSA9PSAwKQ0KKyAgICAgICAgew0KKyAgICAgICAgICB1bnNpZ25lZCBudW0gPSAyOw0KKyAgICAgICAgICBpZiAoaSAhPSAwKQ0KKyAgICAgICAgICAgIGktLTsNCisgICAgICAgICAgZWxzZSBpZiAoYzEgPT0gMCkNCisgICAgICAgICAgICBudW0gPSAxOw0KKyAgICAgICAgICBzLkRlbGV0ZShpLCBudW0pOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgaSsrOw0KKyAgfQ0KK30NCisNCisjZW5kaWYgLy8gVU5ERVJfQ0UNCisNCisjZGVmaW5lIExPTkdfUEFUSF9ET1RTX0ZPTERFUlNfUEFSU0lORw0KKw0KKw0KKy8qDQorV2luZG93cyAoYXQgbGVhc3QgNjQtYml0IFhQKSBjYW4ndCByZXNvbHZlICIuIiBvciAiLi4iIGluIHBhdGhzIHRoYXQgc3RhcnQgd2l0aCBTdXBlclByZWZpeCBcXD9cDQorVG8gc29sdmUgdGhhdCBwcm9ibGVtIHdlIGNoZWNrIHN1Y2ggcGF0aDoNCisgICAtIHN1cGVyIHBhdGggY29udGFpbnMgICAgICAgICIuIiBvciAiLi4iIC0gd2UgdXNlIGtTdXBlclBhdGhUeXBlX1VzZU9ubHlTdXBlcg0KKyAgIC0gc3VwZXIgcGF0aCBkb2Vzbid0IGNvbnRhaW4gIi4iIG9yICIuLiIgLSB3ZSB1c2Uga1N1cGVyUGF0aFR5cGVfVXNlT25seU1haW4NCisqLw0KKyNpZmRlZiBMT05HX1BBVEhfRE9UU19GT0xERVJTX1BBUlNJTkcNCisjaWZuZGVmIFVOREVSX0NFDQorc3RhdGljIGJvb2wgQXJlVGhlcmVEb3RzRm9sZGVycyhDRlNUUiBzKQ0KK3sNCisgIGZvciAodW5zaWduZWQgaSA9IDA7OyBpKyspDQorICB7DQorICAgIEZDaGFyIGMgPSBzW2ldOw0KKyAgICBpZiAoYyA9PSAwKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgaWYgKGMgPT0gJy4nICYmIChpID09IDAgfHwgc1tpIC0gMV0gPT0gQ0hBUl9QQVRIX1NFUEFSQVRPUikpDQorICAgIHsNCisgICAgICBGQ2hhciBjMSA9IHNbaSArIDFdOw0KKyAgICAgIGlmIChjMSA9PSAwIHx8IGMxID09IENIQVJfUEFUSF9TRVBBUkFUT1IgfHwNCisgICAgICAgICAgKGMxID09ICcuJyAmJiAoc1tpICsgMl0gPT0gMCB8fCBzW2kgKyAyXSA9PSBDSEFSX1BBVEhfU0VQQVJBVE9SKSkpDQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKyAgfQ0KK30NCisjZW5kaWYNCisjZW5kaWYgLy8gTE9OR19QQVRIX0RPVFNfRk9MREVSU19QQVJTSU5HDQorDQorI2lmZGVmIFdJTl9MT05HX1BBVEgNCisNCisvKg0KK01vc3Qgb2YgV2luZG93cyB2ZXJzaW9ucyBoYXZlIHByb2JsZW1zLCBpZiBzb21lIGZpbGUgb3IgZGlyIG5hbWUNCitjb250YWlucyAnLicgb3IgJyAnIGF0IHRoZSBlbmQgb2YgbmFtZSAoQmFkIFBhdGgpLg0KK1RvIHNvbHZlIHRoYXQgcHJvYmxlbSwgd2UgYWx3YXlzIHVzZSBTdXBlciBQYXRoICgiXFw/XCIgcHJlZml4IGFuZCBmdWxsIHBhdGgpDQoraW4gc3VjaCBjYXNlcy4gTm90ZSB0aGF0ICIuIiBhbmQgIi4uIiBhcmUgbm90IGJhZCBuYW1lcy4NCisNCitUaGVyZSBhcmUgMyBjYXNlczoNCisgIDEpIElmIHRoZSBwYXRoIGlzIGFscmVhZHkgU3VwZXIgUGF0aCwgd2UgdXNlIHRoYXQgcGF0aA0KKyAgMikgSWYgdGhlIHBhdGggaXMgbm90IFN1cGVyIFBhdGggOg0KKyAgICAgMi4xKSBCYWQgUGF0aDsgIHdlIHVzZSBvbmx5IFN1cGVyIFBhdGguDQorICAgICAyLjIpIEdvb2QgUGF0aDsgd2UgdXNlIE1haW4gUGF0aC4gSWYgaXQgZmFpbHMsIHdlIHVzZSBTdXBlciBQYXRoLg0KKw0KKyBOZWVkVG9Vc2VPcmlnaW5hbFBhdGggcmV0dXJuczoNCisgICAga1N1cGVyUGF0aFR5cGVfVXNlT25seU1haW4gICAgOiBTdXBlciBhbHJlYWR5DQorICAgIGtTdXBlclBhdGhUeXBlX1VzZU9ubHlTdXBlciAgICA6IG5vdCBTdXBlciwgQmFkIFBhdGgNCisgICAga1N1cGVyUGF0aFR5cGVfVXNlTWFpbkFuZFN1cGVyIDogbm90IFN1cGVyLCBHb29kIFBhdGgNCisqLw0KKw0KK2ludCBHZXRVc2VTdXBlclBhdGhUeXBlKENGU1RSIHMpIHRocm93KCkNCit7DQorICBpZiAoSXNTdXBlck9yRGV2aWNlUGF0aChzKSkNCisgIHsNCisgICAgI2lmZGVmIExPTkdfUEFUSF9ET1RTX0ZPTERFUlNfUEFSU0lORw0KKyAgICBpZiAoKHMpWzJdICE9ICcuJykNCisgICAgICBpZiAoQXJlVGhlcmVEb3RzRm9sZGVycyhzICsga1N1cGVyUGF0aFByZWZpeFNpemUpKQ0KKyAgICAgICAgcmV0dXJuIGtTdXBlclBhdGhUeXBlX1VzZU9ubHlTdXBlcjsNCisgICAgI2VuZGlmDQorICAgIHJldHVybiBrU3VwZXJQYXRoVHlwZV9Vc2VPbmx5TWFpbjsNCisgIH0NCisNCisgIGZvciAodW5zaWduZWQgaSA9IDA7OyBpKyspDQorICB7DQorICAgIEZDaGFyIGMgPSBzW2ldOw0KKyAgICBpZiAoYyA9PSAwKQ0KKyAgICAgIHJldHVybiBrU3VwZXJQYXRoVHlwZV9Vc2VNYWluQW5kU3VwZXI7DQorICAgIGlmIChjID09ICcuJyB8fCBjID09ICcgJykNCisgICAgew0KKyAgICAgIEZDaGFyIGMyID0gc1tpICsgMV07DQorICAgICAgaWYgKGMyID09IDAgfHwgYzIgPT0gQ0hBUl9QQVRIX1NFUEFSQVRPUikNCisgICAgICB7DQorICAgICAgICAvLyBpZiBpdCdzICIuIiBvciAiLi4iLCBpdCdzIG5vdCBiYWQgbmFtZS4NCisgICAgICAgIGlmIChjID09ICcuJykNCisgICAgICAgIHsNCisgICAgICAgICAgaWYgKGkgPT0gMCB8fCBzW2kgLSAxXSA9PSBDSEFSX1BBVEhfU0VQQVJBVE9SKQ0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICBpZiAoc1tpIC0gMV0gPT0gJy4nKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGkgLSAxID09IDAgfHwgc1tpIC0gMl0gPT0gQ0hBUl9QQVRIX1NFUEFSQVRPUikNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4ga1N1cGVyUGF0aFR5cGVfVXNlT25seVN1cGVyOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCisNCisNCisvKg0KKyAgIHJldHVybnMgZmFsc2UgaW4gdHdvIGNhc2VzOg0KKyAgICAgLSBpZiBHZXRDdXJEaXIgd2FzIHVzZWQsIGFuZCBHZXRDdXJEaXIgcmV0dXJuZWQgZXJyb3IuDQorICAgICAtIGlmIHdlIGNhbid0IHJlc29sdmUgIi4uIiBuYW1lLg0KKyAgIGlmIHBhdGggaXMgIi4iLCAiLi4iLCByZXMgaXMgZW1wdHkuDQorICAgaWYgaXQncyBTdXBlciBQYXRoIGFscmVhZHksIHJlcyBpcyBlbXB0eS4NCisgICBmb3IgXCoqKiogLCBhbmQgaWYgR2V0Q3VyRGlyIGlzIG5vdCBkcml2ZSAoYzpcKSwgcmVzIGlzIGVtcHR5DQorICAgZm9yIGFic29sdXRlIHBhdGhzLCByZXR1cm5zIHRydWUsIHJlcyBpcyBTdXBlciBwYXRoLg0KKyovDQorDQorDQorc3RhdGljIGJvb2wgR2V0U3VwZXJQYXRoQmFzZShDRlNUUiBzLCBVU3RyaW5nICZyZXMpDQorew0KKyAgcmVzLkVtcHR5KCk7DQorICANCisgIEZDaGFyIGMgPSBzWzBdOw0KKyAgaWYgKGMgPT0gMCkNCisgICAgcmV0dXJuIHRydWU7DQorICBpZiAoYyA9PSAnLicgJiYgKHNbMV0gPT0gMCB8fCAoc1sxXSA9PSAnLicgJiYgc1syXSA9PSAwKSkpDQorICAgIHJldHVybiB0cnVlOw0KKyAgDQorICBpZiAoSXNTdXBlck9yRGV2aWNlUGF0aChzKSkNCisgIHsNCisgICAgI2lmZGVmIExPTkdfUEFUSF9ET1RTX0ZPTERFUlNfUEFSU0lORw0KKyAgICANCisgICAgaWYgKChzKVsyXSA9PSAnLicpDQorICAgICAgcmV0dXJuIHRydWU7DQorDQorICAgIC8vIHdlIHdpbGwgcmV0dXJuIHRydWUgaGVyZSwgc28gd2Ugd2lsbCB0cnkgdG8gdXNlIHRoZXNlIHByb2JsZW0gcGF0aHMuDQorDQorICAgIGlmICghQXJlVGhlcmVEb3RzRm9sZGVycyhzICsga1N1cGVyUGF0aFByZWZpeFNpemUpKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICANCisgICAgVVN0cmluZyB0ZW1wID0gZnMydXMocyk7DQorICAgIHVuc2lnbmVkIGZpeGVkU2l6ZSA9IEdldFJvb3RQcmVmaXhTaXplX09mX1N1cGVyUGF0aCh0ZW1wKTsNCisgICAgaWYgKGZpeGVkU2l6ZSA9PSAwKQ0KKyAgICAgIHJldHVybiB0cnVlOw0KKw0KKyAgICBVU3RyaW5nIHJlbSA9ICZ0ZW1wW2ZpeGVkU2l6ZV07DQorICAgIGlmICghUmVzb2x2ZURvdHNGb2xkZXJzKHJlbSkpDQorICAgICAgcmV0dXJuIHRydWU7DQorDQorICAgIHRlbXAuRGVsZXRlRnJvbShmaXhlZFNpemUpOw0KKyAgICByZXMgKz0gdGVtcDsNCisgICAgcmVzICs9IHJlbTsNCisgICAgDQorICAgICNlbmRpZg0KKw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisNCisgIGlmIChjID09IENIQVJfUEFUSF9TRVBBUkFUT1IpDQorICB7DQorICAgIGlmIChzWzFdID09IENIQVJfUEFUSF9TRVBBUkFUT1IpDQorICAgIHsNCisgICAgICBVU3RyaW5nIHRlbXAgPSBmczJ1cyhzICsgMik7DQorICAgICAgdW5zaWduZWQgZml4ZWRTaXplID0gR2V0Um9vdFByZWZpeFNpemVfT2ZfTmV0d29ya1BhdGgodGVtcCk7DQorICAgICAgaWYgKGZpeGVkU2l6ZSA9PSAwKSAvLyBtYXliZSB3ZSBtdXN0IGlnbm9yZSB0aGF0IGVycm9yIHRvIGFsbG93IHNob3J0IG5ldHdvcmsgcGF0aHM/DQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgVVN0cmluZyByZW0gPSAmdGVtcFtmaXhlZFNpemVdOw0KKyAgICAgIGlmICghUmVzb2x2ZURvdHNGb2xkZXJzKHJlbSkpDQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgcmVzICs9IGtTdXBlclVuY1ByZWZpeDsNCisgICAgICB0ZW1wLkRlbGV0ZUZyb20oZml4ZWRTaXplKTsNCisgICAgICByZXMgKz0gdGVtcDsNCisgICAgICByZXMgKz0gcmVtOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICB9DQorICBlbHNlDQorICB7DQorICAgIGlmIChJc0RyaXZlUGF0aChzKSkNCisgICAgew0KKyAgICAgIFVTdHJpbmcgdGVtcCA9IGZzMnVzKHMpOw0KKyAgICAgIFVTdHJpbmcgcmVtID0gJnRlbXBba0RyaXZlUHJlZml4U2l6ZV07DQorICAgICAgaWYgKCFSZXNvbHZlRG90c0ZvbGRlcnMocmVtKSkNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgIHJlcyArPSBrU3VwZXJQYXRoUHJlZml4Ow0KKyAgICAgIHRlbXAuRGVsZXRlRnJvbShrRHJpdmVQcmVmaXhTaXplKTsNCisgICAgICByZXMgKz0gdGVtcDsNCisgICAgICByZXMgKz0gcmVtOw0KKyAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorICB9DQorDQorICBVU3RyaW5nIGN1ckRpcjsNCisgIGlmICghR2V0Q3VyRGlyKGN1ckRpcikpDQorICAgIHJldHVybiBmYWxzZTsNCisgIGlmIChjdXJEaXIuQmFjaygpICE9IFdDSEFSX1BBVEhfU0VQQVJBVE9SKQ0KKyAgICBjdXJEaXIgKz0gV0NIQVJfUEFUSF9TRVBBUkFUT1I7DQorDQorICB1bnNpZ25lZCBmaXhlZFNpemVTdGFydCA9IDA7DQorICB1bnNpZ25lZCBmaXhlZFNpemUgPSAwOw0KKyAgY29uc3Qgd2NoYXJfdCAqc3VwZXJNYXJrZXIgPSBOVUxMOw0KKyAgaWYgKElzU3VwZXJQYXRoKGN1ckRpcikpDQorICB7DQorICAgIGZpeGVkU2l6ZSA9IEdldFJvb3RQcmVmaXhTaXplX09mX1N1cGVyUGF0aChjdXJEaXIpOw0KKyAgICBpZiAoZml4ZWRTaXplID09IDApDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBpZiAoSXNEcml2ZVBhdGgoY3VyRGlyKSkNCisgICAgew0KKyAgICAgIHN1cGVyTWFya2VyID0ga1N1cGVyUGF0aFByZWZpeDsNCisgICAgICBmaXhlZFNpemUgPSBrRHJpdmVQcmVmaXhTaXplOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGlmIChjdXJEaXJbMF0gIT0gQ0hBUl9QQVRIX1NFUEFSQVRPUiB8fCBjdXJEaXJbMV0gIT0gQ0hBUl9QQVRIX1NFUEFSQVRPUikNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICBmaXhlZFNpemVTdGFydCA9IDI7DQorICAgICAgZml4ZWRTaXplID0gR2V0Um9vdFByZWZpeFNpemVfT2ZfTmV0d29ya1BhdGgoJmN1ckRpclsyXSk7DQorICAgICAgaWYgKGZpeGVkU2l6ZSA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgIHN1cGVyTWFya2VyID0ga1N1cGVyVW5jUHJlZml4Ow0KKyAgICB9DQorICB9DQorICANCisgIFVTdHJpbmcgdGVtcDsNCisgIGlmIChjID09IENIQVJfUEFUSF9TRVBBUkFUT1IpDQorICB7DQorICAgIHRlbXAgPSBmczJ1cyhzICsgMSk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIHRlbXAgKz0gJmN1ckRpcltmaXhlZFNpemVTdGFydCArIGZpeGVkU2l6ZV07DQorICAgIHRlbXAgKz0gZnMydXMocyk7DQorICB9DQorICBpZiAoIVJlc29sdmVEb3RzRm9sZGVycyh0ZW1wKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgaWYgKHN1cGVyTWFya2VyKQ0KKyAgICByZXMgKz0gc3VwZXJNYXJrZXI7DQorICByZXMgKz0gY3VyRGlyLk1pZChmaXhlZFNpemVTdGFydCwgZml4ZWRTaXplKTsNCisgIHJlcyArPSB0ZW1wOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KKw0KKy8qDQorICBJbiB0aGF0IGNhc2UgaWYgR2V0U3VwZXJQYXRoQmFzZSBkb2Vzbid0IHJldHVybiBuZXcgcGF0aCwgd2UgZG9uJ3QgbmVlZA0KKyAgdG8gdXNlIHNhbWUgcGF0aCB0aGF0IHdhcyB1c2VkIGFzIG1haW4gcGF0aA0KKyAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgR2V0U3VwZXJQYXRoQmFzZSAgc3VwZXJQYXRoLklzRW1wdHkoKSBvbmx5SWZOZXcNCisgICAgIGZhbHNlICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAqICAgICAgICAgIEdldEN1ckRpciBFcnJvcg0KKyAgICAgdHJ1ZSAgICAgICAgICAgIGZhbHNlICAgICAgICAgICAgICogICAgICAgICAgdXNlIFN1cGVyIHBhdGgNCisgICAgIHRydWUgICAgICAgICAgICB0cnVlICAgICAgICAgICAgIHRydWUgICAgICAgIGRvbid0IHVzZSBhbnkgcGF0aCwgd2UgYWxyZWFkeSB1c2VkIG1haW5QYXRoDQorICAgICB0cnVlICAgICAgICAgICAgdHJ1ZSAgICAgICAgICAgICBmYWxzZSAgICAgICB1c2UgbWFpbiBwYXRoIGFzIFN1cGVyIFBhdGgsIHdlIGRvbid0IHRyeSBtYWluTWF0aA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhhdCBjYXNlIGlzIHBvc3NpYmxlIG5vdyBpZiBHZXRDdXJEaXIgcmV0dXJucyB1bmtub3cNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgb2YgcGF0aCAobm90IGRyaXZlIGFuZCBub3QgbmV0d29yaykNCisNCisgIFdlIGNhbiBjaGFuZ2UgdGhhdCBjb2RlIGlmIHdlIHdhbnQgdG8gdHJ5IG1haW5QYXRoLCBpZiBHZXRTdXBlclBhdGhCYXNlIHJldHVybnMgZXJyb3IsDQorICBhbmQgd2UgZGlkbid0IHRyeSBtYWluUGF0aCBzdGlsbC4NCisgIElmIHdlIHdhbnQgdG8gd29yayB0aGF0IHdheSwgd2UgZG9uJ3QgbmVlZCB0byB1c2UgR2V0U3VwZXJQYXRoQmFzZSByZXR1cm4gY29kZS4NCisqLw0KKw0KK2Jvb2wgR2V0U3VwZXJQYXRoKENGU1RSIHBhdGgsIFVTdHJpbmcgJnN1cGVyUGF0aCwgYm9vbCBvbmx5SWZOZXcpDQorew0KKyAgaWYgKEdldFN1cGVyUGF0aEJhc2UocGF0aCwgc3VwZXJQYXRoKSkNCisgIHsNCisgICAgaWYgKHN1cGVyUGF0aC5Jc0VtcHR5KCkpDQorICAgIHsNCisgICAgICAvLyBhY3R1YWxseSB0aGUgb25seSBwb3NzaWJsZSB3aGVuIG9ubHlJZk5ldyA9PSB0cnVlIGFuZCBzdXBlclBhdGggaXMgZW1wdHkNCisgICAgICAvLyBpcyBjYXNlIHdoZW4NCisNCisgICAgICBpZiAob25seUlmTmV3KQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgIHN1cGVyUGF0aCA9IGZzMnVzKHBhdGgpOw0KKyAgICB9DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCitib29sIEdldFN1cGVyUGF0aHMoQ0ZTVFIgczEsIENGU1RSIHMyLCBVU3RyaW5nICZkMSwgVVN0cmluZyAmZDIsIGJvb2wgb25seUlmTmV3KQ0KK3sNCisgIGlmICghR2V0U3VwZXJQYXRoQmFzZShzMSwgZDEpIHx8DQorICAgICAgIUdldFN1cGVyUGF0aEJhc2UoczIsIGQyKSkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgaWYgKGQxLklzRW1wdHkoKSAmJiBkMi5Jc0VtcHR5KCkgJiYgb25seUlmTmV3KQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBpZiAoZDEuSXNFbXB0eSgpKSBkMSA9IGZzMnVzKHMxKTsNCisgIGlmIChkMi5Jc0VtcHR5KCkpIGQyID0gZnMydXMoczIpOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KKw0KKy8qDQorLy8gcmV0dXJucyB0cnVlLCBpZiB3ZSBuZWVkIGFkZGl0aW9uYWwgdXNlIHdpdGggTmV3IFN1cGVyIHBhdGguDQorYm9vbCBHZXRTdXBlclBhdGgoQ0ZTVFIgcGF0aCwgVVN0cmluZyAmc3VwZXJQYXRoKQ0KK3sNCisgIGlmIChHZXRTdXBlclBhdGhCYXNlKHBhdGgsIHN1cGVyUGF0aCkpDQorICAgIHJldHVybiAhc3VwZXJQYXRoLklzRW1wdHkoKTsNCisgIHJldHVybiBmYWxzZTsNCit9DQorKi8NCisjZW5kaWYgLy8gV0lOX0xPTkdfUEFUSA0KKw0KK2Jvb2wgR2V0RnVsbFBhdGgoQ0ZTVFIgZGlyUHJlZml4LCBDRlNUUiBzLCBGU3RyaW5nICZyZXMpDQorew0KKyAgcmVzID0gczsNCisNCisgICNpZmRlZiBVTkRFUl9DRQ0KKw0KKyAgaWYgKHNbMF0gIT0gQ0hBUl9QQVRIX1NFUEFSQVRPUikNCisgIHsNCisgICAgaWYgKCFkaXJQcmVmaXgpDQorICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICByZXMgPSBkaXJQcmVmaXg7DQorICAgIHJlcyArPSBzOw0KKyAgfQ0KKw0KKyAgI2Vsc2UNCisNCisgIHVuc2lnbmVkIHByZWZpeFNpemUgPSBHZXRSb290UHJlZml4U2l6ZShzKTsNCisgIGlmIChwcmVmaXhTaXplICE9IDApDQorICB7DQorICAgIGlmICghQXJlVGhlcmVEb3RzRm9sZGVycyhzICsgcHJlZml4U2l6ZSkpDQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIA0KKyAgICBVU3RyaW5nIHJlbSA9IGZzMnVzKHMgKyBwcmVmaXhTaXplKTsNCisgICAgaWYgKCFSZXNvbHZlRG90c0ZvbGRlcnMocmVtKSkNCisgICAgICByZXR1cm4gdHJ1ZTsgLy8gbWF5YmUgZmFsc2U7DQorICAgIHJlcy5EZWxldGVGcm9tKHByZWZpeFNpemUpOw0KKyAgICByZXMgKz0gdXMyZnMocmVtKTsNCisgICAgcmV0dXJuIHRydWU7DQorICB9DQorDQorICAvKg0KKyAgRkNoYXIgYyA9IHNbMF07DQorICBpZiAoYyA9PSAwKQ0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIGlmIChjID09ICcuJyAmJiAoc1sxXSA9PSAwIHx8IChzWzFdID09ICcuJyAmJiBzWzJdID09IDApKSkNCisgICAgcmV0dXJuIHRydWU7DQorICBpZiAoYyA9PSBDSEFSX1BBVEhfU0VQQVJBVE9SICYmIHNbMV0gPT0gQ0hBUl9QQVRIX1NFUEFSQVRPUikNCisgICAgcmV0dXJuIHRydWU7DQorICBpZiAoSXNEcml2ZVBhdGgocykpDQorICAgIHJldHVybiB0cnVlOw0KKyAgKi8NCisNCisgIFVTdHJpbmcgY3VyRGlyOw0KKyAgaWYgKGRpclByZWZpeCkNCisgICAgY3VyRGlyID0gZnMydXMoZGlyUHJlZml4KTsNCisgIGVsc2UNCisgIHsNCisgICAgaWYgKCFHZXRDdXJEaXIoY3VyRGlyKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICBpZiAoIWN1ckRpci5Jc0VtcHR5KCkgJiYgY3VyRGlyLkJhY2soKSAhPSBXQ0hBUl9QQVRIX1NFUEFSQVRPUikNCisgICAgY3VyRGlyICs9IFdDSEFSX1BBVEhfU0VQQVJBVE9SOw0KKw0KKyAgdW5zaWduZWQgZml4ZWRTaXplID0gMDsNCisNCisgICNpZmRlZiBfV0lOMzINCisNCisgIGlmIChJc1N1cGVyUGF0aChjdXJEaXIpKQ0KKyAgew0KKyAgICBmaXhlZFNpemUgPSBHZXRSb290UHJlZml4U2l6ZV9PZl9TdXBlclBhdGgoY3VyRGlyKTsNCisgICAgaWYgKGZpeGVkU2l6ZSA9PSAwKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgaWYgKElzRHJpdmVQYXRoKGN1ckRpcikpDQorICAgICAgZml4ZWRTaXplID0ga0RyaXZlUHJlZml4U2l6ZTsNCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgaWYgKGN1ckRpclswXSAhPSBXQ0hBUl9QQVRIX1NFUEFSQVRPUiB8fCBjdXJEaXJbMV0gIT0gV0NIQVJfUEFUSF9TRVBBUkFUT1IpDQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgZml4ZWRTaXplID0gR2V0Um9vdFByZWZpeFNpemVfT2ZfTmV0d29ya1BhdGgoJmN1ckRpclsyXSk7DQorICAgICAgaWYgKGZpeGVkU2l6ZSA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgIGZpeGVkU2l6ZSArPSAyOw0KKyAgICB9DQorICB9DQorDQorICAjZW5kaWYgLy8gX1dJTjMyDQorICANCisgIFVTdHJpbmcgdGVtcDsNCisgIGlmIChzWzBdID09IENIQVJfUEFUSF9TRVBBUkFUT1IpDQorICB7DQorICAgIHRlbXAgPSBmczJ1cyhzICsgMSk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIHRlbXAgKz0gY3VyRGlyLlB0cihmaXhlZFNpemUpOw0KKyAgICB0ZW1wICs9IGZzMnVzKHMpOw0KKyAgfQ0KKyAgaWYgKCFSZXNvbHZlRG90c0ZvbGRlcnModGVtcCkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIGN1ckRpci5EZWxldGVGcm9tKGZpeGVkU2l6ZSk7DQorICByZXMgPSB1czJmcyhjdXJEaXIpOw0KKyAgcmVzICs9IHVzMmZzKHRlbXApOw0KKyAgDQorICAjZW5kaWYgLy8gVU5ERVJfQ0UNCisNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sIEdldEZ1bGxQYXRoKENGU1RSIHBhdGgsIEZTdHJpbmcgJmZ1bGxQYXRoKQ0KK3sNCisgIHJldHVybiBHZXRGdWxsUGF0aChOVUxMLCBwYXRoLCBmdWxsUGF0aCk7DQorfQ0KKw0KK319fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZU5hbWUuaCBiL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZU5hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDU1NjU0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9GaWxlTmFtZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vIFdpbmRvd3MvRmlsZU5hbWUuaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX0ZJTEVfTkFNRV9IDQorI2RlZmluZSBfX1dJTkRPV1NfRklMRV9OQU1FX0gNCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL015U3RyaW5nLmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkZpbGUgew0KK25hbWVzcGFjZSBOTmFtZSB7DQorDQordm9pZCBOb3JtYWxpemVEaXJQYXRoUHJlZml4KEZTdHJpbmcgJmRpclBhdGgpOyAvLyBlbnN1cmVzIHRoYXQgaXQgZW5kZWQgd2l0aCAnXFwnLCBpZiBkaXJQYXRoIGlzIG5vdCBlcG10eQ0KK3ZvaWQgTm9ybWFsaXplRGlyUGF0aFByZWZpeChVU3RyaW5nICZkaXJQYXRoKTsNCisNCisjaWZkZWYgX1dJTjMyDQorDQorZXh0ZXJuIGNvbnN0IHdjaGFyX3QgKmtTdXBlclBhdGhQcmVmaXg7IC8qIFxcP1wgKi8NCitjb25zdCB1bnNpZ25lZCBrRGV2aWNlUGF0aFByZWZpeFNpemUgPSA0Ow0KK2NvbnN0IHVuc2lnbmVkIGtTdXBlclBhdGhQcmVmaXhTaXplID0gNDsNCitjb25zdCB1bnNpZ25lZCBrU3VwZXJVbmNQYXRoUHJlZml4U2l6ZSA9IGtTdXBlclBhdGhQcmVmaXhTaXplICsgNDsNCisNCitib29sIElzRGV2aWNlUGF0aChDRlNUUiBzKSB0aHJvdygpOyAvKiBcXC5cICovDQorYm9vbCBJc1N1cGVyVW5jUGF0aChDRlNUUiBzKSB0aHJvdygpOw0KKw0KK2Jvb2wgSXNEcml2ZVBhdGgoY29uc3Qgd2NoYXJfdCAqcykgdGhyb3coKTsNCitib29sIElzU3VwZXJQYXRoKGNvbnN0IHdjaGFyX3QgKnMpIHRocm93KCk7DQorYm9vbCBJc1N1cGVyT3JEZXZpY2VQYXRoKGNvbnN0IHdjaGFyX3QgKnMpIHRocm93KCk7DQorDQorI2lmbmRlZiBVU0VfVU5JQ09ERV9GU1RSSU5HDQorYm9vbCBJc0RyaXZlUGF0aChDRlNUUiBzKSB0aHJvdygpOw0KK2Jvb2wgSXNTdXBlclBhdGgoQ0ZTVFIgcykgdGhyb3coKTsNCitib29sIElzU3VwZXJPckRldmljZVBhdGgoQ0ZTVFIgcykgdGhyb3coKTsNCisjZW5kaWYNCisNCisjZW5kaWYgLy8gX1dJTjMyDQorDQorYm9vbCBJc0Fic29sdXRlUGF0aChjb25zdCB3Y2hhcl90ICpzKSB0aHJvdygpOw0KK3Vuc2lnbmVkIEdldFJvb3RQcmVmaXhTaXplKGNvbnN0IHdjaGFyX3QgKnMpIHRocm93KCk7DQorDQorI2lmZGVmIFdJTl9MT05HX1BBVEgNCisNCitjb25zdCBpbnQga1N1cGVyUGF0aFR5cGVfVXNlT25seU1haW4gPSAwOw0KK2NvbnN0IGludCBrU3VwZXJQYXRoVHlwZV9Vc2VPbmx5U3VwZXIgPSAxOw0KK2NvbnN0IGludCBrU3VwZXJQYXRoVHlwZV9Vc2VNYWluQW5kU3VwZXIgPSAyOw0KKw0KK2ludCBHZXRVc2VTdXBlclBhdGhUeXBlKENGU1RSIHMpIHRocm93KCk7DQorYm9vbCBHZXRTdXBlclBhdGgoQ0ZTVFIgcGF0aCwgVVN0cmluZyAmbG9uZ1BhdGgsIGJvb2wgb25seUlmTmV3KTsNCitib29sIEdldFN1cGVyUGF0aHMoQ0ZTVFIgczEsIENGU1RSIHMyLCBVU3RyaW5nICZkMSwgVVN0cmluZyAmZDIsIGJvb2wgb25seUlmTmV3KTsNCisNCisjZGVmaW5lIFVTRV9NQUlOX1BBVEggKF9fdXNlU3VwZXJQYXRoVHlwZSAhPSBrU3VwZXJQYXRoVHlwZV9Vc2VPbmx5U3VwZXIpDQorI2RlZmluZSBVU0VfTUFJTl9QQVRIXzIgKF9fdXNlU3VwZXJQYXRoVHlwZTEgIT0ga1N1cGVyUGF0aFR5cGVfVXNlT25seVN1cGVyICYmIF9fdXNlU3VwZXJQYXRoVHlwZTIgIT0ga1N1cGVyUGF0aFR5cGVfVXNlT25seVN1cGVyKQ0KKw0KKyNkZWZpbmUgVVNFX1NVUEVSX1BBVEggKF9fdXNlU3VwZXJQYXRoVHlwZSAhPSBrU3VwZXJQYXRoVHlwZV9Vc2VPbmx5TWFpbikNCisjZGVmaW5lIFVTRV9TVVBFUl9QQVRIXzIgKF9fdXNlU3VwZXJQYXRoVHlwZTEgIT0ga1N1cGVyUGF0aFR5cGVfVXNlT25seU1haW4gfHwgX191c2VTdXBlclBhdGhUeXBlMiAhPSBrU3VwZXJQYXRoVHlwZV9Vc2VPbmx5TWFpbikNCisNCisjZGVmaW5lIElGX1VTRV9NQUlOX1BBVEggaW50IF9fdXNlU3VwZXJQYXRoVHlwZSA9IEdldFVzZVN1cGVyUGF0aFR5cGUocGF0aCk7IGlmIChVU0VfTUFJTl9QQVRIKQ0KKyNkZWZpbmUgSUZfVVNFX01BSU5fUEFUSF8yKHgxLCB4MikgXA0KKyAgICBpbnQgX191c2VTdXBlclBhdGhUeXBlMSA9IEdldFVzZVN1cGVyUGF0aFR5cGUoeDEpOyBcDQorICAgIGludCBfX3VzZVN1cGVyUGF0aFR5cGUyID0gR2V0VXNlU3VwZXJQYXRoVHlwZSh4Mik7IFwNCisgICAgaWYgKFVTRV9NQUlOX1BBVEhfMikNCisNCisjZWxzZQ0KKw0KKyNkZWZpbmUgSUZfVVNFX01BSU5fUEFUSA0KKyNkZWZpbmUgSUZfVVNFX01BSU5fUEFUSF8yKHgxLCB4MikNCisNCisjZW5kaWYgLy8gV0lOX0xPTkdfUEFUSA0KKw0KK2Jvb2wgR2V0RnVsbFBhdGgoQ0ZTVFIgZGlyUHJlZml4LCBDRlNUUiBwYXRoLCBGU3RyaW5nICZmdWxsUGF0aCk7DQorYm9vbCBHZXRGdWxsUGF0aChDRlNUUiBwYXRoLCBGU3RyaW5nICZmdWxsUGF0aCk7DQorDQorfX19DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9GaWxlU3lzdGVtLmNwcCBiL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZVN5c3RlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2MTA2MgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZVN5c3RlbS5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8vIFdpbmRvd3MvRmlsZVN5c3RlbS5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2lmbmRlZiBVTkRFUl9DRQ0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCisjaW5jbHVkZSAiLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiRmlsZVN5c3RlbS5oIg0KKyNpbmNsdWRlICJEZWZzLmgiDQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KK2V4dGVybiBib29sIGdfSXNOVDsNCisjZW5kaWYNCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBORmlsZSB7DQorbmFtZXNwYWNlIE5TeXN0ZW0gew0KKw0KK2Jvb2wgTXlHZXRWb2x1bWVJbmZvcm1hdGlvbigNCisgICAgQ0ZTVFIgcm9vdFBhdGgsDQorICAgIFVTdHJpbmcgJnZvbHVtZU5hbWUsDQorICAgIExQRFdPUkQgdm9sdW1lU2VyaWFsTnVtYmVyLA0KKyAgICBMUERXT1JEIG1heGltdW1Db21wb25lbnRMZW5ndGgsDQorICAgIExQRFdPUkQgZmlsZVN5c3RlbUZsYWdzLA0KKyAgICBVU3RyaW5nICZmaWxlU3lzdGVtTmFtZSkNCit7DQorICBCT09MIHJlczsNCisgICNpZm5kZWYgX1VOSUNPREUNCisgIGlmICghZ19Jc05UKQ0KKyAgew0KKyAgICBUQ0hBUiB2W01BWF9QQVRIICsgMl07IHZbMF0gPSAwOw0KKyAgICBUQ0hBUiBmW01BWF9QQVRIICsgMl07IGZbMF0gPSAwOw0KKyAgICByZXMgPSBHZXRWb2x1bWVJbmZvcm1hdGlvbihmczJmYXMocm9vdFBhdGgpLA0KKyAgICAgICAgdiwgTUFYX1BBVEgsDQorICAgICAgICB2b2x1bWVTZXJpYWxOdW1iZXIsIG1heGltdW1Db21wb25lbnRMZW5ndGgsIGZpbGVTeXN0ZW1GbGFncywNCisgICAgICAgIGYsIE1BWF9QQVRIKTsNCisgICAgdm9sdW1lTmFtZSA9IE11bHRpQnl0ZVRvVW5pY29kZVN0cmluZyh2KTsNCisgICAgZmlsZVN5c3RlbU5hbWUgPSBNdWx0aUJ5dGVUb1VuaWNvZGVTdHJpbmcoZik7DQorICB9DQorICBlbHNlDQorICAjZW5kaWYNCisgIHsNCisgICAgV0NIQVIgdltNQVhfUEFUSCArIDJdOyB2WzBdID0gMDsNCisgICAgV0NIQVIgZltNQVhfUEFUSCArIDJdOyBmWzBdID0gMDsNCisgICAgcmVzID0gR2V0Vm9sdW1lSW5mb3JtYXRpb25XKGZzMnVzKHJvb3RQYXRoKSwNCisgICAgICAgIHYsIE1BWF9QQVRILA0KKyAgICAgICAgdm9sdW1lU2VyaWFsTnVtYmVyLCBtYXhpbXVtQ29tcG9uZW50TGVuZ3RoLCBmaWxlU3lzdGVtRmxhZ3MsDQorICAgICAgICBmLCBNQVhfUEFUSCk7DQorICAgIHZvbHVtZU5hbWUgPSB2Ow0KKyAgICBmaWxlU3lzdGVtTmFtZSA9IGY7DQorICB9DQorICByZXR1cm4gQk9PTFRvQm9vbChyZXMpOw0KK30NCisNCitVSU5UIE15R2V0RHJpdmVUeXBlKENGU1RSIHBhdGhOYW1lKQ0KK3sNCisgICNpZm5kZWYgX1VOSUNPREUNCisgIGlmICghZ19Jc05UKQ0KKyAgew0KKyAgICByZXR1cm4gR2V0RHJpdmVUeXBlKGZzMmZhcyhwYXRoTmFtZSkpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgI2VuZGlmDQorICB7DQorICAgIHJldHVybiBHZXREcml2ZVR5cGVXKGZzMnVzKHBhdGhOYW1lKSk7DQorICB9DQorfQ0KKw0KK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogR2V0RGlza0ZyZWVTcGFjZUV4QV9Qb2ludGVyKSgNCisgIExQQ1NUUiBscERpcmVjdG9yeU5hbWUsICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0b3J5IG5hbWUNCisgIFBVTEFSR0VfSU5URUdFUiBscEZyZWVCeXRlc0F2YWlsYWJsZSwgICAgLy8gYnl0ZXMgYXZhaWxhYmxlIHRvIGNhbGxlcg0KKyAgUFVMQVJHRV9JTlRFR0VSIGxwVG90YWxOdW1iZXJPZkJ5dGVzLCAgICAvLyBieXRlcyBvbiBkaXNrDQorICBQVUxBUkdFX0lOVEVHRVIgbHBUb3RhbE51bWJlck9mRnJlZUJ5dGVzIC8vIGZyZWUgYnl0ZXMgb24gZGlzaw0KKyk7DQorDQordHlwZWRlZiBCT09MIChXSU5BUEkgKiBHZXREaXNrRnJlZVNwYWNlRXhXX1BvaW50ZXIpKA0KKyAgTFBDV1NUUiBscERpcmVjdG9yeU5hbWUsICAgICAgICAgICAgICAgICAvLyBkaXJlY3RvcnkgbmFtZQ0KKyAgUFVMQVJHRV9JTlRFR0VSIGxwRnJlZUJ5dGVzQXZhaWxhYmxlLCAgICAvLyBieXRlcyBhdmFpbGFibGUgdG8gY2FsbGVyDQorICBQVUxBUkdFX0lOVEVHRVIgbHBUb3RhbE51bWJlck9mQnl0ZXMsICAgIC8vIGJ5dGVzIG9uIGRpc2sNCisgIFBVTEFSR0VfSU5URUdFUiBscFRvdGFsTnVtYmVyT2ZGcmVlQnl0ZXMgLy8gZnJlZSBieXRlcyBvbiBkaXNrDQorKTsNCisNCitib29sIE15R2V0RGlza0ZyZWVTcGFjZShDRlNUUiByb290UGF0aCwgVUludDY0ICZjbHVzdGVyU2l6ZSwgVUludDY0ICZ0b3RhbFNpemUsIFVJbnQ2NCAmZnJlZVNpemUpDQorew0KKyAgRFdPUkQgbnVtU2VjdG9yc1BlckNsdXN0ZXIsIGJ5dGVzUGVyU2VjdG9yLCBudW1GcmVlQ2x1c3RlcnMsIG51bUNsdXN0ZXJzOw0KKyAgYm9vbCBzaXplSXNEZXRlY3RlZCA9IGZhbHNlOw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIEdldERpc2tGcmVlU3BhY2VFeEFfUG9pbnRlciBwR2V0RGlza0ZyZWVTcGFjZUV4ID0gKEdldERpc2tGcmVlU3BhY2VFeEFfUG9pbnRlcilHZXRQcm9jQWRkcmVzcygNCisgICAgICAgIEdldE1vZHVsZUhhbmRsZShURVhUKCJrZXJuZWwzMi5kbGwiKSksICJHZXREaXNrRnJlZVNwYWNlRXhBIik7DQorICAgIGlmIChwR2V0RGlza0ZyZWVTcGFjZUV4KQ0KKyAgICB7DQorICAgICAgVUxBUkdFX0lOVEVHRVIgZnJlZUJ5dGVzVG9DYWxsZXIyLCB0b3RhbFNpemUyLCBmcmVlU2l6ZTI7DQorICAgICAgc2l6ZUlzRGV0ZWN0ZWQgPSBCT09MVG9Cb29sKHBHZXREaXNrRnJlZVNwYWNlRXgoZnMyZmFzKHJvb3RQYXRoKSwgJmZyZWVCeXRlc1RvQ2FsbGVyMiwgJnRvdGFsU2l6ZTIsICZmcmVlU2l6ZTIpKTsNCisgICAgICB0b3RhbFNpemUgPSB0b3RhbFNpemUyLlF1YWRQYXJ0Ow0KKyAgICAgIGZyZWVTaXplID0gZnJlZVNpemUyLlF1YWRQYXJ0Ow0KKyAgICB9DQorICAgIGlmICghOjpHZXREaXNrRnJlZVNwYWNlKGZzMmZhcyhyb290UGF0aCksICZudW1TZWN0b3JzUGVyQ2x1c3RlciwgJmJ5dGVzUGVyU2VjdG9yLCAmbnVtRnJlZUNsdXN0ZXJzLCAmbnVtQ2x1c3RlcnMpKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBHZXREaXNrRnJlZVNwYWNlRXhXX1BvaW50ZXIgcEdldERpc2tGcmVlU3BhY2VFeCA9IChHZXREaXNrRnJlZVNwYWNlRXhXX1BvaW50ZXIpR2V0UHJvY0FkZHJlc3MoDQorICAgICAgICBHZXRNb2R1bGVIYW5kbGUoVEVYVCgia2VybmVsMzIuZGxsIikpLCAiR2V0RGlza0ZyZWVTcGFjZUV4VyIpOw0KKyAgICBpZiAocEdldERpc2tGcmVlU3BhY2VFeCkNCisgICAgew0KKyAgICAgIFVMQVJHRV9JTlRFR0VSIGZyZWVCeXRlc1RvQ2FsbGVyMiwgdG90YWxTaXplMiwgZnJlZVNpemUyOw0KKyAgICAgIHNpemVJc0RldGVjdGVkID0gQk9PTFRvQm9vbChwR2V0RGlza0ZyZWVTcGFjZUV4KGZzMnVzKHJvb3RQYXRoKSwgJmZyZWVCeXRlc1RvQ2FsbGVyMiwgJnRvdGFsU2l6ZTIsICZmcmVlU2l6ZTIpKTsNCisgICAgICB0b3RhbFNpemUgPSB0b3RhbFNpemUyLlF1YWRQYXJ0Ow0KKyAgICAgIGZyZWVTaXplID0gZnJlZVNpemUyLlF1YWRQYXJ0Ow0KKyAgICB9DQorICAgIGlmICghOjpHZXREaXNrRnJlZVNwYWNlVyhmczJ1cyhyb290UGF0aCksICZudW1TZWN0b3JzUGVyQ2x1c3RlciwgJmJ5dGVzUGVyU2VjdG9yLCAmbnVtRnJlZUNsdXN0ZXJzLCAmbnVtQ2x1c3RlcnMpKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIGNsdXN0ZXJTaXplID0gKFVJbnQ2NClieXRlc1BlclNlY3RvciAqIChVSW50NjQpbnVtU2VjdG9yc1BlckNsdXN0ZXI7DQorICBpZiAoIXNpemVJc0RldGVjdGVkKQ0KKyAgew0KKyAgICB0b3RhbFNpemUgPSBjbHVzdGVyU2l6ZSAqIChVSW50NjQpbnVtQ2x1c3RlcnM7DQorICAgIGZyZWVTaXplID0gY2x1c3RlclNpemUgKiAoVUludDY0KW51bUZyZWVDbHVzdGVyczsNCisgIH0NCisgIHJldHVybiB0cnVlOw0KK30NCisNCit9fX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL0ZpbGVTeXN0ZW0uaCBiL2x6bWEvQ1BQL1dpbmRvd3MvRmlsZVN5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTQ5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL0ZpbGVTeXN0ZW0uaApAQCAtMCwwICsxLDI3IEBACisvLyBXaW5kb3dzL0ZpbGVTeXN0ZW0uaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX0ZJTEVfU1lTVEVNX0gNCisjZGVmaW5lIF9fV0lORE9XU19GSUxFX1NZU1RFTV9IDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9NeVN0cmluZy5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlUeXBlcy5oIg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorbmFtZXNwYWNlIE5GaWxlIHsNCituYW1lc3BhY2UgTlN5c3RlbSB7DQorDQorYm9vbCBNeUdldFZvbHVtZUluZm9ybWF0aW9uKA0KKyAgICBDRlNUUiByb290UGF0aCAgLA0KKyAgICBVU3RyaW5nICZ2b2x1bWVOYW1lLA0KKyAgICBMUERXT1JEIHZvbHVtZVNlcmlhbE51bWJlciwNCisgICAgTFBEV09SRCBtYXhpbXVtQ29tcG9uZW50TGVuZ3RoLA0KKyAgICBMUERXT1JEIGZpbGVTeXN0ZW1GbGFncywNCisgICAgVVN0cmluZyAmZmlsZVN5c3RlbU5hbWUpOw0KKw0KK1VJTlQgTXlHZXREcml2ZVR5cGUoQ0ZTVFIgcGF0aE5hbWUpOw0KKw0KK2Jvb2wgTXlHZXREaXNrRnJlZVNwYWNlKENGU1RSIHJvb3RQYXRoLCBVSW50NjQgJmNsdXN0ZXJTaXplLCBVSW50NjQgJnRvdGFsU2l6ZSwgVUludDY0ICZmcmVlU2l6ZSk7DQorDQorfX19DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9IYW5kbGUuaCBiL2x6bWEvQ1BQL1dpbmRvd3MvSGFuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1ZWViOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvSGFuZGxlLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gV2luZG93cy9IYW5kbGUuaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX0hBTkRMRV9IDQorI2RlZmluZSBfX1dJTkRPV1NfSEFORExFX0gNCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KKw0KK2NsYXNzIENIYW5kbGUNCit7DQorcHJvdGVjdGVkOg0KKyAgSEFORExFIF9oYW5kbGU7DQorcHVibGljOg0KKyAgb3BlcmF0b3IgSEFORExFKCkgeyByZXR1cm4gX2hhbmRsZTsgfQ0KKyAgQ0hhbmRsZSgpOiBfaGFuZGxlKE5VTEwpIHt9DQorICB+Q0hhbmRsZSgpIHsgQ2xvc2UoKTsgfQ0KKyAgYm9vbCBJc0NyZWF0ZWQoKSBjb25zdCB7IHJldHVybiAoX2hhbmRsZSAhPSBOVUxMKTsgfQ0KKyAgYm9vbCBDbG9zZSgpDQorICB7DQorICAgIGlmIChfaGFuZGxlID09IE5VTEwpDQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIGlmICghOjpDbG9zZUhhbmRsZShfaGFuZGxlKSkNCisgICAgICByZXR1cm4gZmFsc2U7DQorICAgIF9oYW5kbGUgPSBOVUxMOw0KKyAgICByZXR1cm4gdHJ1ZTsNCisgIH0NCisgIHZvaWQgQXR0YWNoKEhBTkRMRSBoYW5kbGUpIHsgX2hhbmRsZSA9IGhhbmRsZTsgfQ0KKyAgSEFORExFIERldGFjaCgpDQorICB7DQorICAgIEhBTkRMRSBoYW5kbGUgPSBfaGFuZGxlOw0KKyAgICBfaGFuZGxlID0gTlVMTDsNCisgICAgcmV0dXJuIGhhbmRsZTsNCisgIH0NCit9Ow0KKw0KK30NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL01lbW9yeUxvY2suY3BwIGIvbHptYS9DUFAvV2luZG93cy9NZW1vcnlMb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTliNmIwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9NZW1vcnlMb2NrLmNwcApAQCAtMCwwICsxLDcwIEBACisvLyBXaW5kb3dzL01lbW9yeUxvY2suY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorbmFtZXNwYWNlIE5TZWN1cml0eSB7DQorDQorI2lmbmRlZiBVTkRFUl9DRQ0KKw0KKyNpZmRlZiBfVU5JQ09ERQ0KKyNkZWZpbmUgTVlfRlVOQ19TRUxFQ1QoZikgOjogZg0KKyNlbHNlDQorI2RlZmluZSBNWV9GVU5DX1NFTEVDVChmKSBteV8gIyMgZg0KK2V4dGVybiAiQyIgew0KK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogRnVuY19PcGVuUHJvY2Vzc1Rva2VuKShIQU5ETEUgUHJvY2Vzc0hhbmRsZSwgRFdPUkQgRGVzaXJlZEFjY2VzcywgUEhBTkRMRSBUb2tlbkhhbmRsZSk7DQordHlwZWRlZiBCT09MIChXSU5BUEkgKiBGdW5jX0xvb2t1cFByaXZpbGVnZVZhbHVlKShMUENUU1RSIGxwU3lzdGVtTmFtZSwgTFBDVFNUUiBscE5hbWUsIFBMVUlEIGxwTHVpZCk7DQordHlwZWRlZiBCT09MIChXSU5BUEkgKiBGdW5jX0FkanVzdFRva2VuUHJpdmlsZWdlcykoSEFORExFIFRva2VuSGFuZGxlLCBCT09MIERpc2FibGVBbGxQcml2aWxlZ2VzLA0KKyAgICBQVE9LRU5fUFJJVklMRUdFUyBOZXdTdGF0ZSwgRFdPUkQgQnVmZmVyTGVuZ3RoLCBQVE9LRU5fUFJJVklMRUdFUyBQcmV2aW91c1N0YXRlLCBQRFdPUkQgUmV0dXJuTGVuZ3RoKTsNCit9DQorI2RlZmluZSBHRVRfUFJPQ19BRERSKGZmZiwgbmFtZSkgRnVuY18gIyMgZmZmICBteV8gIyMgZmZmICA9IChGdW5jXyAjIyBmZmYpR2V0UHJvY0FkZHJlc3MoaE1vZHVsZSwgbmFtZSkNCisjZW5kaWYNCisNCitib29sIEVuYWJsZVByaXZpbGVnZShMUENUU1RSIHByaXZpbGVnZU5hbWUsIGJvb2wgZW5hYmxlKQ0KK3sNCisgIGJvb2wgcmVzID0gZmFsc2U7DQorDQorICAjaWZuZGVmIF9VTklDT0RFDQorDQorICBITU9EVUxFIGhNb2R1bGUgPSA6OkxvYWRMaWJyYXJ5KFRFWFQoIkFkdmFwaTMyLmRsbCIpKTsNCisgIGlmIChoTW9kdWxlID09IE5VTEwpDQorICAgIHJldHVybiBmYWxzZTsNCisgIA0KKyAgR0VUX1BST0NfQUREUihPcGVuUHJvY2Vzc1Rva2VuLCAiT3BlblByb2Nlc3NUb2tlbiIpOw0KKyAgR0VUX1BST0NfQUREUihMb29rdXBQcml2aWxlZ2VWYWx1ZSwgIkxvb2t1cFByaXZpbGVnZVZhbHVlQSIpOw0KKyAgR0VUX1BST0NfQUREUihBZGp1c3RUb2tlblByaXZpbGVnZXMsICJBZGp1c3RUb2tlblByaXZpbGVnZXMiKTsNCisgIA0KKyAgaWYgKG15X09wZW5Qcm9jZXNzVG9rZW4gJiYNCisgICAgICBteV9BZGp1c3RUb2tlblByaXZpbGVnZXMgJiYNCisgICAgICBteV9Mb29rdXBQcml2aWxlZ2VWYWx1ZSkNCisgIA0KKyAgI2VuZGlmDQorDQorICB7DQorICAgIEhBTkRMRSB0b2tlbjsNCisgICAgaWYgKE1ZX0ZVTkNfU0VMRUNUKE9wZW5Qcm9jZXNzVG9rZW4pKDo6R2V0Q3VycmVudFByb2Nlc3MoKSwgVE9LRU5fQURKVVNUX1BSSVZJTEVHRVMsICZ0b2tlbikpDQorICAgIHsNCisgICAgICBUT0tFTl9QUklWSUxFR0VTIHRwOw0KKyAgICAgIGlmIChNWV9GVU5DX1NFTEVDVChMb29rdXBQcml2aWxlZ2VWYWx1ZSkoTlVMTCwgcHJpdmlsZWdlTmFtZSwgJih0cC5Qcml2aWxlZ2VzWzBdLkx1aWQpKSkNCisgICAgICB7DQorICAgICAgICB0cC5Qcml2aWxlZ2VDb3VudCA9IDE7DQorICAgICAgICB0cC5Qcml2aWxlZ2VzWzBdLkF0dHJpYnV0ZXMgPSAoZW5hYmxlID8gU0VfUFJJVklMRUdFX0VOQUJMRUQgOiAwKTsNCisgICAgICAgIGlmIChNWV9GVU5DX1NFTEVDVChBZGp1c3RUb2tlblByaXZpbGVnZXMpKHRva2VuLCBGQUxTRSwgJnRwLCAwLCBOVUxMLCBOVUxMKSkNCisgICAgICAgICAgcmVzID0gKEdldExhc3RFcnJvcigpID09IEVSUk9SX1NVQ0NFU1MpOw0KKyAgICAgIH0NCisgICAgICA6OkNsb3NlSGFuZGxlKHRva2VuKTsNCisgICAgfQ0KKyAgfQ0KKyAgICANCisgICNpZm5kZWYgX1VOSUNPREUNCisNCisgIDo6RnJlZUxpYnJhcnkoaE1vZHVsZSk7DQorICANCisgICNlbmRpZg0KKw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorI2VuZGlmDQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL01lbW9yeUxvY2suaCBiL2x6bWEvQ1BQL1dpbmRvd3MvTWVtb3J5TG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YzZiY2IKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL01lbW9yeUxvY2suaApAQCAtMCwwICsxLDM2IEBACisvLyBXaW5kb3dzL01lbW9yeUxvY2suaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX01FTU9SWV9MT0NLX0gNCisjZGVmaW5lIF9fV0lORE9XU19NRU1PUllfTE9DS19IDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTlNlY3VyaXR5IHsNCisNCisjaWZuZGVmIFVOREVSX0NFDQorDQorICBib29sIEVuYWJsZVByaXZpbGVnZShMUENUU1RSIHByaXZpbGVnZU5hbWUsIGJvb2wgZW5hYmxlID0gdHJ1ZSk7DQorDQoraW5saW5lIGJvb2wgRW5hYmxlUHJpdmlsZWdlX0xvY2tNZW1vcnkoYm9vbCBlbmFibGUgPSB0cnVlKQ0KK3sNCisgIHJldHVybiBFbmFibGVQcml2aWxlZ2UoU0VfTE9DS19NRU1PUllfTkFNRSwgZW5hYmxlKTsNCit9DQorDQoraW5saW5lIHZvaWQgRW5hYmxlUHJpdmlsZWdlX1N5bUxpbmsoKQ0KK3sNCisgIC8qIFByb2JhYmx5IHdlIGRvIG5vdCB0byBzZXQgYW55IFByaXZpbGVnZSBmb3IganVuY3Rpb24gcG9pbnRzLg0KKyAgICAgQnV0IHdlIG5lZWQgdGhlbSBmb3IgU3ltYm9saWMgbGlua3MgKi8NCisgIE5TZWN1cml0eTo6RW5hYmxlUHJpdmlsZWdlKFNFX1JFU1RPUkVfTkFNRSk7DQorICANCisgIC8qIFByb2JhYmx5IHdlIG5lZWQgb25seSBTRV9SRVNUT1JFX05BTUUsIGJ1dCB0aGVyZSBpcyBhbHNvDQorICAgICBTRV9DUkVBVEVfU1lNQk9MSUNfTElOS19OQU1FLiBTbyB3ZSBzZXQgaXQgYWxzby4gRG8gd2UgbmVlZCBpdD8gKi8NCisNCisgIE5TZWN1cml0eTo6RW5hYmxlUHJpdmlsZWdlKFRFWFQoIlNlQ3JlYXRlU3ltYm9saWNMaW5rUHJpdmlsZWdlIikpOyAvLyBTRV9DUkVBVEVfU1lNQk9MSUNfTElOS19OQU1FDQorICANCisgIC8vIERvIHdlIG5lZWQgdG8gc2V0IFNFX0JBQ0tVUF9OQU1FID8NCit9DQorDQorI2VuZGlmDQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL050Q2hlY2suaCBiL2x6bWEvQ1BQL1dpbmRvd3MvTnRDaGVjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZmE5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL050Q2hlY2suaApAQCAtMCwwICsxLDQ0IEBACisvLyBXaW5kb3dzL050Q2hlY2suaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX05UX0NIRUNLX0gNCisjZGVmaW5lIF9fV0lORE9XU19OVF9DSEVDS19IDQorDQorI2lmZGVmIF9XSU4zMg0KKw0KKyNpZiAhZGVmaW5lZChfV0lONjQpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KK3N0YXRpYyBpbmxpbmUgYm9vbCBJc0l0V2luZG93c05UKCkNCit7DQorICBPU1ZFUlNJT05JTkZPIHZpOw0KKyAgdmkuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZih2aSk7DQorICByZXR1cm4gKDo6R2V0VmVyc2lvbkV4KCZ2aSkgJiYgdmkuZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVCk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCisgICNpZiBkZWZpbmVkKF9XSU42NCkgfHwgZGVmaW5lZChVTkRFUl9DRSkNCisgICAgYm9vbCBnX0lzTlQgPSB0cnVlOw0KKyAgICAjZGVmaW5lIFNFVF9JU19OVA0KKyAgI2Vsc2UNCisgICAgYm9vbCBnX0lzTlQgPSBmYWxzZTsNCisgICAgI2RlZmluZSBTRVRfSVNfTlQgZ19Jc05UID0gSXNJdFdpbmRvd3NOVCgpOw0KKyAgI2VuZGlmDQorICAjZGVmaW5lIE5UX0NIRUNLX0FDVElPTg0KKyAgLy8gI2RlZmluZSBOVF9DSEVDS19BQ1RJT04geyBOVF9DSEVDS19GQUlMX0FDVElPTiB9DQorI2Vsc2UNCisgICNpZiAhZGVmaW5lZChfV0lONjQpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKyAgICAjZGVmaW5lIE5UX0NIRUNLX0FDVElPTiBpZiAoIUlzSXRXaW5kb3dzTlQoKSkgeyBOVF9DSEVDS19GQUlMX0FDVElPTiB9DQorICAjZWxzZQ0KKyAgICAjZGVmaW5lIE5UX0NIRUNLX0FDVElPTg0KKyAgI2VuZGlmDQorICAjZGVmaW5lIFNFVF9JU19OVA0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgTlRfQ0hFQ0sgIE5UX0NIRUNLX0FDVElPTiBTRVRfSVNfTlQNCisNCisjZWxzZQ0KKw0KKyNkZWZpbmUgTlRfQ0hFQ0sNCisNCisjZW5kaWYNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL1Byb3BWYXJpYW50LmNwcCBiL2x6bWEvQ1BQL1dpbmRvd3MvUHJvcFZhcmlhbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjBlMDAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL1Byb3BWYXJpYW50LmNwcApAQCAtMCwwICsxLDMwMCBAQAorLy8gV2luZG93cy9Qcm9wVmFyaWFudC5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9EZWZzLmgiDQorDQorI2luY2x1ZGUgIlByb3BWYXJpYW50LmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkNPTSB7DQorDQorSFJFU1VMVCBQcm9wVmFyRW1fQWxsb2NfQnN0cihQUk9QVkFSSUFOVCAqcCwgdW5zaWduZWQgbnVtQ2hhcnMpIHRocm93KCkNCit7DQorICBwLT5ic3RyVmFsID0gOjpTeXNBbGxvY1N0cmluZ0xlbigwLCBudW1DaGFycyk7DQorICBpZiAoIXAtPmJzdHJWYWwpDQorICB7DQorICAgIHAtPnZ0ID0gVlRfRVJST1I7DQorICAgIHAtPnNjb2RlID0gRV9PVVRPRk1FTU9SWTsNCisgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7DQorICB9DQorICBwLT52dCA9IFZUX0JTVFI7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBQcm9wVmFyRW1fU2V0X1N0cihQUk9QVkFSSUFOVCAqcCwgY29uc3QgY2hhciAqcykgdGhyb3coKQ0KK3sNCisgIFVJTlQgbGVuID0gKFVJTlQpc3RybGVuKHMpOw0KKyAgcC0+YnN0clZhbCA9IDo6U3lzQWxsb2NTdHJpbmdMZW4oMCwgbGVuKTsNCisgIGlmICghcC0+YnN0clZhbCkNCisgIHsNCisgICAgcC0+dnQgPSBWVF9FUlJPUjsNCisgICAgcC0+c2NvZGUgPSBFX09VVE9GTUVNT1JZOw0KKyAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsNCisgIH0NCisgIHAtPnZ0ID0gVlRfQlNUUjsNCisgIEJTVFIgZGVzdCA9IHAtPmJzdHJWYWw7DQorICBmb3IgKFVJTlQgaSA9IDA7IGkgPD0gbGVuOyBpKyspDQorICAgIGRlc3RbaV0gPSBzW2ldOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0NQcm9wVmFyaWFudDo6Q1Byb3BWYXJpYW50KGNvbnN0IFBST1BWQVJJQU5UICZ2YXJTcmMpDQorew0KKyAgdnQgPSBWVF9FTVBUWTsNCisgIEludGVybmFsQ29weSgmdmFyU3JjKTsNCit9DQorDQorQ1Byb3BWYXJpYW50OjpDUHJvcFZhcmlhbnQoY29uc3QgQ1Byb3BWYXJpYW50ICZ2YXJTcmMpDQorew0KKyAgdnQgPSBWVF9FTVBUWTsNCisgIEludGVybmFsQ29weSgmdmFyU3JjKTsNCit9DQorDQorQ1Byb3BWYXJpYW50OjpDUHJvcFZhcmlhbnQoQlNUUiBic3RyU3JjKQ0KK3sNCisgIHZ0ID0gVlRfRU1QVFk7DQorICAqdGhpcyA9IGJzdHJTcmM7DQorfQ0KKw0KK0NQcm9wVmFyaWFudDo6Q1Byb3BWYXJpYW50KExQQ09MRVNUUiBscHN6U3JjKQ0KK3sNCisgIHZ0ID0gVlRfRU1QVFk7DQorICAqdGhpcyA9IGxwc3pTcmM7DQorfQ0KKw0KK0NQcm9wVmFyaWFudCYgQ1Byb3BWYXJpYW50OjpvcGVyYXRvcj0oY29uc3QgQ1Byb3BWYXJpYW50ICZ2YXJTcmMpDQorew0KKyAgSW50ZXJuYWxDb3B5KCZ2YXJTcmMpOw0KKyAgcmV0dXJuICp0aGlzOw0KK30NCitDUHJvcFZhcmlhbnQmIENQcm9wVmFyaWFudDo6b3BlcmF0b3I9KGNvbnN0IFBST1BWQVJJQU5UICZ2YXJTcmMpDQorew0KKyAgSW50ZXJuYWxDb3B5KCZ2YXJTcmMpOw0KKyAgcmV0dXJuICp0aGlzOw0KK30NCisNCitDUHJvcFZhcmlhbnQmIENQcm9wVmFyaWFudDo6b3BlcmF0b3I9KEJTVFIgYnN0clNyYykNCit7DQorICAqdGhpcyA9IChMUENPTEVTVFIpYnN0clNyYzsNCisgIHJldHVybiAqdGhpczsNCit9DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKmtNZW1FeGNlcHRpb24gPSAib3V0IG9mIG1lbW9yeSI7DQorDQorQ1Byb3BWYXJpYW50JiBDUHJvcFZhcmlhbnQ6Om9wZXJhdG9yPShMUENPTEVTVFIgbHBzelNyYykNCit7DQorICBJbnRlcm5hbENsZWFyKCk7DQorICB2dCA9IFZUX0JTVFI7DQorICB3UmVzZXJ2ZWQxID0gMDsNCisgIGJzdHJWYWwgPSA6OlN5c0FsbG9jU3RyaW5nKGxwc3pTcmMpOw0KKyAgaWYgKCFic3RyVmFsICYmIGxwc3pTcmMpDQorICB7DQorICAgIHRocm93IGtNZW1FeGNlcHRpb247DQorICAgIC8vIHZ0ID0gVlRfRVJST1I7DQorICAgIC8vIHNjb2RlID0gRV9PVVRPRk1FTU9SWTsNCisgIH0NCisgIHJldHVybiAqdGhpczsNCit9DQorDQorQ1Byb3BWYXJpYW50JiBDUHJvcFZhcmlhbnQ6Om9wZXJhdG9yPShjb25zdCBjaGFyICpzKQ0KK3sNCisgIEludGVybmFsQ2xlYXIoKTsNCisgIHZ0ID0gVlRfQlNUUjsNCisgIHdSZXNlcnZlZDEgPSAwOw0KKyAgVUlOVCBsZW4gPSAoVUlOVClzdHJsZW4ocyk7DQorICBic3RyVmFsID0gOjpTeXNBbGxvY1N0cmluZ0xlbigwLCBsZW4pOw0KKyAgaWYgKCFic3RyVmFsKQ0KKyAgew0KKyAgICB0aHJvdyBrTWVtRXhjZXB0aW9uOw0KKyAgICAvLyB2dCA9IFZUX0VSUk9SOw0KKyAgICAvLyBzY29kZSA9IEVfT1VUT0ZNRU1PUlk7DQorICB9DQorICBlbHNlDQorICB7DQorICAgIGZvciAoVUlOVCBpID0gMDsgaSA8PSBsZW47IGkrKykNCisgICAgICBic3RyVmFsW2ldID0gc1tpXTsNCisgIH0NCisgIHJldHVybiAqdGhpczsNCit9DQorDQorQ1Byb3BWYXJpYW50JiBDUHJvcFZhcmlhbnQ6Om9wZXJhdG9yPShib29sIGJTcmMpIHRocm93KCkNCit7DQorICBpZiAodnQgIT0gVlRfQk9PTCkNCisgIHsNCisgICAgSW50ZXJuYWxDbGVhcigpOw0KKyAgICB2dCA9IFZUX0JPT0w7DQorICB9DQorICBib29sVmFsID0gYlNyYyA/IFZBUklBTlRfVFJVRSA6IFZBUklBTlRfRkFMU0U7DQorICByZXR1cm4gKnRoaXM7DQorfQ0KKw0KK0JTVFIgQ1Byb3BWYXJpYW50OjpBbGxvY0JzdHIodW5zaWduZWQgbnVtQ2hhcnMpDQorew0KKyAgaWYgKHZ0ICE9IFZUX0VNUFRZKQ0KKyAgICBJbnRlcm5hbENsZWFyKCk7DQorICB2dCA9IFZUX0JTVFI7DQorICB3UmVzZXJ2ZWQxID0gMDsNCisgIGJzdHJWYWwgPSA6OlN5c0FsbG9jU3RyaW5nTGVuKDAsIG51bUNoYXJzKTsNCisgIGlmICghYnN0clZhbCkNCisgIHsNCisgICAgdGhyb3cga01lbUV4Y2VwdGlvbjsNCisgICAgLy8gdnQgPSBWVF9FUlJPUjsNCisgICAgLy8gc2NvZGUgPSBFX09VVE9GTUVNT1JZOw0KKyAgfQ0KKyAgcmV0dXJuIGJzdHJWYWw7DQorfQ0KKw0KKyNkZWZpbmUgU0VUX1BST1BfRlVOQyh0eXBlLCBpZCwgZGVzdCkgXA0KKyAgQ1Byb3BWYXJpYW50JiBDUHJvcFZhcmlhbnQ6Om9wZXJhdG9yPSh0eXBlIHZhbHVlKSB0aHJvdygpIFwNCisgIHsgaWYgKHZ0ICE9IGlkKSB7IEludGVybmFsQ2xlYXIoKTsgdnQgPSBpZDsgfSBcDQorICAgIGRlc3QgPSB2YWx1ZTsgcmV0dXJuICp0aGlzOyB9DQorDQorU0VUX1BST1BfRlVOQyhCeXRlLCBWVF9VSTEsIGJWYWwpDQorLy8gU0VUX1BST1BfRlVOQyhJbnQxNiwgVlRfSTIsIGlWYWwpDQorU0VUX1BST1BfRlVOQyhJbnQzMiwgVlRfSTQsIGxWYWwpDQorU0VUX1BST1BfRlVOQyhVSW50MzIsIFZUX1VJNCwgdWxWYWwpDQorU0VUX1BST1BfRlVOQyhVSW50NjQsIFZUX1VJOCwgdWhWYWwuUXVhZFBhcnQpDQorU0VUX1BST1BfRlVOQyhJbnQ2NCwgVlRfSTgsIGhWYWwuUXVhZFBhcnQpDQorU0VUX1BST1BfRlVOQyhjb25zdCBGSUxFVElNRSAmLCBWVF9GSUxFVElNRSwgZmlsZXRpbWUpDQorDQorSFJFU1VMVCBQcm9wVmFyaWFudF9DbGVhcihQUk9QVkFSSUFOVCAqcHJvcCkgdGhyb3coKQ0KK3sNCisgIHN3aXRjaCAocHJvcC0+dnQpDQorICB7DQorICAgIGNhc2UgVlRfRU1QVFk6DQorICAgIGNhc2UgVlRfVUkxOg0KKyAgICBjYXNlIFZUX0kxOg0KKyAgICBjYXNlIFZUX0kyOg0KKyAgICBjYXNlIFZUX1VJMjoNCisgICAgY2FzZSBWVF9CT09MOg0KKyAgICBjYXNlIFZUX0k0Og0KKyAgICBjYXNlIFZUX1VJNDoNCisgICAgY2FzZSBWVF9SNDoNCisgICAgY2FzZSBWVF9JTlQ6DQorICAgIGNhc2UgVlRfVUlOVDoNCisgICAgY2FzZSBWVF9FUlJPUjoNCisgICAgY2FzZSBWVF9GSUxFVElNRToNCisgICAgY2FzZSBWVF9VSTg6DQorICAgIGNhc2UgVlRfUjg6DQorICAgIGNhc2UgVlRfQ1k6DQorICAgIGNhc2UgVlRfREFURToNCisgICAgICBwcm9wLT52dCA9IFZUX0VNUFRZOw0KKyAgICAgIHByb3AtPndSZXNlcnZlZDEgPSAwOw0KKyAgICAgIHByb3AtPndSZXNlcnZlZDIgPSAwOw0KKyAgICAgIHByb3AtPndSZXNlcnZlZDMgPSAwOw0KKyAgICAgIHByb3AtPnVoVmFsLlF1YWRQYXJ0ID0gMDsNCisgICAgICByZXR1cm4gU19PSzsNCisgIH0NCisgIHJldHVybiA6OlZhcmlhbnRDbGVhcigoVkFSSUFOVEFSRyAqKXByb3ApOw0KKyAgLy8gcmV0dXJuIDo6UHJvcFZhcmlhbnRDbGVhcihwcm9wKTsNCisgIC8vIFByb3BWYXJpYW50Q2xlYXIgY2FuIGNsZWFyIFZUX0JMT0IuDQorfQ0KKw0KK0hSRVNVTFQgQ1Byb3BWYXJpYW50OjpDbGVhcigpIHRocm93KCkNCit7DQorICBpZiAodnQgPT0gVlRfRU1QVFkpDQorICAgIHJldHVybiBTX09LOw0KKyAgcmV0dXJuIFByb3BWYXJpYW50X0NsZWFyKHRoaXMpOw0KK30NCisNCitIUkVTVUxUIENQcm9wVmFyaWFudDo6Q29weShjb25zdCBQUk9QVkFSSUFOVCogcFNyYykgdGhyb3coKQ0KK3sNCisgIDo6VmFyaWFudENsZWFyKCh0YWdWQVJJQU5UICopdGhpcyk7DQorICBzd2l0Y2gocFNyYy0+dnQpDQorICB7DQorICAgIGNhc2UgVlRfVUkxOg0KKyAgICBjYXNlIFZUX0kxOg0KKyAgICBjYXNlIFZUX0kyOg0KKyAgICBjYXNlIFZUX1VJMjoNCisgICAgY2FzZSBWVF9CT09MOg0KKyAgICBjYXNlIFZUX0k0Og0KKyAgICBjYXNlIFZUX1VJNDoNCisgICAgY2FzZSBWVF9SNDoNCisgICAgY2FzZSBWVF9JTlQ6DQorICAgIGNhc2UgVlRfVUlOVDoNCisgICAgY2FzZSBWVF9FUlJPUjoNCisgICAgY2FzZSBWVF9GSUxFVElNRToNCisgICAgY2FzZSBWVF9VSTg6DQorICAgIGNhc2UgVlRfUjg6DQorICAgIGNhc2UgVlRfQ1k6DQorICAgIGNhc2UgVlRfREFURToNCisgICAgICBtZW1tb3ZlKChQUk9QVkFSSUFOVCopdGhpcywgcFNyYywgc2l6ZW9mKFBST1BWQVJJQU5UKSk7DQorICAgICAgcmV0dXJuIFNfT0s7DQorICB9DQorICByZXR1cm4gOjpWYXJpYW50Q29weSgodGFnVkFSSUFOVCAqKXRoaXMsICh0YWdWQVJJQU5UICopY29uc3RfY2FzdDxQUk9QVkFSSUFOVCAqPihwU3JjKSk7DQorfQ0KKw0KKw0KK0hSRVNVTFQgQ1Byb3BWYXJpYW50OjpBdHRhY2goUFJPUFZBUklBTlQgKnBTcmMpIHRocm93KCkNCit7DQorICBIUkVTVUxUIGhyID0gQ2xlYXIoKTsNCisgIGlmIChGQUlMRUQoaHIpKQ0KKyAgICByZXR1cm4gaHI7DQorICBtZW1jcHkodGhpcywgcFNyYywgc2l6ZW9mKFBST1BWQVJJQU5UKSk7DQorICBwU3JjLT52dCA9IFZUX0VNUFRZOw0KKyAgcmV0dXJuIFNfT0s7DQorfQ0KKw0KK0hSRVNVTFQgQ1Byb3BWYXJpYW50OjpEZXRhY2goUFJPUFZBUklBTlQgKnBEZXN0KSB0aHJvdygpDQorew0KKyAgaWYgKHBEZXN0LT52dCAhPSBWVF9FTVBUWSkNCisgIHsNCisgICAgSFJFU1VMVCBociA9IFByb3BWYXJpYW50X0NsZWFyKHBEZXN0KTsNCisgICAgaWYgKEZBSUxFRChocikpDQorICAgICAgcmV0dXJuIGhyOw0KKyAgfQ0KKyAgbWVtY3B5KHBEZXN0LCB0aGlzLCBzaXplb2YoUFJPUFZBUklBTlQpKTsNCisgIHZ0ID0gVlRfRU1QVFk7DQorICByZXR1cm4gU19PSzsNCit9DQorDQorSFJFU1VMVCBDUHJvcFZhcmlhbnQ6OkludGVybmFsQ2xlYXIoKSB0aHJvdygpDQorew0KKyAgaWYgKHZ0ID09IFZUX0VNUFRZKQ0KKyAgICByZXR1cm4gU19PSzsNCisgIEhSRVNVTFQgaHIgPSBDbGVhcigpOw0KKyAgaWYgKEZBSUxFRChocikpDQorICB7DQorICAgIHZ0ID0gVlRfRVJST1I7DQorICAgIHNjb2RlID0gaHI7DQorICB9DQorICByZXR1cm4gaHI7DQorfQ0KKw0KK3ZvaWQgQ1Byb3BWYXJpYW50OjpJbnRlcm5hbENvcHkoY29uc3QgUFJPUFZBUklBTlQgKnBTcmMpDQorew0KKyAgSFJFU1VMVCBociA9IENvcHkocFNyYyk7DQorICBpZiAoRkFJTEVEKGhyKSkNCisgIHsNCisgICAgaWYgKGhyID09IEVfT1VUT0ZNRU1PUlkpDQorICAgICAgdGhyb3cga01lbUV4Y2VwdGlvbjsNCisgICAgdnQgPSBWVF9FUlJPUjsNCisgICAgc2NvZGUgPSBocjsNCisgIH0NCit9DQorDQoraW50IENQcm9wVmFyaWFudDo6Q29tcGFyZShjb25zdCBDUHJvcFZhcmlhbnQgJmEpIHRocm93KCkNCit7DQorICBpZiAodnQgIT0gYS52dCkNCisgICAgcmV0dXJuIE15Q29tcGFyZSh2dCwgYS52dCk7DQorICBzd2l0Y2ggKHZ0KQ0KKyAgew0KKyAgICBjYXNlIFZUX0VNUFRZOiByZXR1cm4gMDsNCisgICAgLy8gY2FzZSBWVF9JMTogcmV0dXJuIE15Q29tcGFyZShjVmFsLCBhLmNWYWwpOw0KKyAgICBjYXNlIFZUX1VJMTogcmV0dXJuIE15Q29tcGFyZShiVmFsLCBhLmJWYWwpOw0KKyAgICBjYXNlIFZUX0kyOiByZXR1cm4gTXlDb21wYXJlKGlWYWwsIGEuaVZhbCk7DQorICAgIGNhc2UgVlRfVUkyOiByZXR1cm4gTXlDb21wYXJlKHVpVmFsLCBhLnVpVmFsKTsNCisgICAgY2FzZSBWVF9JNDogcmV0dXJuIE15Q29tcGFyZShsVmFsLCBhLmxWYWwpOw0KKyAgICBjYXNlIFZUX1VJNDogcmV0dXJuIE15Q29tcGFyZSh1bFZhbCwgYS51bFZhbCk7DQorICAgIC8vIGNhc2UgVlRfVUlOVDogcmV0dXJuIE15Q29tcGFyZSh1aW50VmFsLCBhLnVpbnRWYWwpOw0KKyAgICBjYXNlIFZUX0k4OiByZXR1cm4gTXlDb21wYXJlKGhWYWwuUXVhZFBhcnQsIGEuaFZhbC5RdWFkUGFydCk7DQorICAgIGNhc2UgVlRfVUk4OiByZXR1cm4gTXlDb21wYXJlKHVoVmFsLlF1YWRQYXJ0LCBhLnVoVmFsLlF1YWRQYXJ0KTsNCisgICAgY2FzZSBWVF9CT09MOiByZXR1cm4gLU15Q29tcGFyZShib29sVmFsLCBhLmJvb2xWYWwpOw0KKyAgICBjYXNlIFZUX0ZJTEVUSU1FOiByZXR1cm4gOjpDb21wYXJlRmlsZVRpbWUoJmZpbGV0aW1lLCAmYS5maWxldGltZSk7DQorICAgIGNhc2UgVlRfQlNUUjogcmV0dXJuIDA7IC8vIE5vdCBpbXBsZW1lbnRlZA0KKyAgICBkZWZhdWx0OiByZXR1cm4gMDsNCisgIH0NCit9DQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL1Byb3BWYXJpYW50LmggYi9sem1hL0NQUC9XaW5kb3dzL1Byb3BWYXJpYW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1NzcwNQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvUHJvcFZhcmlhbnQuaApAQCAtMCwwICsxLDEwNyBAQAorLy8gV2luZG93cy9Qcm9wVmFyaWFudC5oDQorDQorI2lmbmRlZiBfX1dJTkRPV1NfUFJPUF9WQVJJQU5UX0gNCisjZGVmaW5lIF9fV0lORE9XU19QUk9QX1ZBUklBTlRfSA0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlUeXBlcy5oIg0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlXaW5kb3dzLmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTkNPTSB7DQorDQorSFJFU1VMVCBQcm9wVmFyaWFudF9DbGVhcihQUk9QVkFSSUFOVCAqcCkgdGhyb3coKTsNCisNCitIUkVTVUxUIFByb3BWYXJFbV9BbGxvY19Cc3RyKFBST1BWQVJJQU5UICpwLCB1bnNpZ25lZCBudW1DaGFycykgdGhyb3coKTsNCitIUkVTVUxUIFByb3BWYXJFbV9TZXRfU3RyKFBST1BWQVJJQU5UICpwLCBjb25zdCBjaGFyICpzKSB0aHJvdygpOw0KKw0KK2lubGluZSB2b2lkIFByb3BWYXJFbV9TZXRfVUludDMyKFBST1BWQVJJQU5UICpwLCBVSW50MzIgdikgdGhyb3coKQ0KK3sNCisgIHAtPnZ0ID0gVlRfVUk0Ow0KKyAgcC0+dWxWYWwgPSB2Ow0KK30NCisNCitpbmxpbmUgdm9pZCBQcm9wVmFyRW1fU2V0X1VJbnQ2NChQUk9QVkFSSUFOVCAqcCwgVUludDY0IHYpIHRocm93KCkNCit7DQorICBwLT52dCA9IFZUX1VJODsNCisgIHAtPnVoVmFsLlF1YWRQYXJ0ID0gdjsNCit9DQorDQoraW5saW5lIHZvaWQgUHJvcFZhckVtX1NldF9GaWxlVGltZTY0KFBST1BWQVJJQU5UICpwLCBVSW50NjQgdikgdGhyb3coKQ0KK3sNCisgIHAtPnZ0ID0gVlRfRklMRVRJTUU7DQorICBwLT5maWxldGltZS5kd0xvd0RhdGVUaW1lID0gKERXT1JEKXY7DQorICBwLT5maWxldGltZS5kd0hpZ2hEYXRlVGltZSA9IChEV09SRCkodiA+PiAzMik7DQorfQ0KKw0KK2lubGluZSB2b2lkIFByb3BWYXJFbV9TZXRfQm9vbChQUk9QVkFSSUFOVCAqcCwgYm9vbCBiKSB0aHJvdygpDQorew0KKyAgcC0+dnQgPSBWVF9CT09MOw0KKyAgcC0+Ym9vbFZhbCA9IChiID8gVkFSSUFOVF9UUlVFIDogVkFSSUFOVF9GQUxTRSk7DQorfQ0KKw0KKw0KK2NsYXNzIENQcm9wVmFyaWFudCA6IHB1YmxpYyB0YWdQUk9QVkFSSUFOVA0KK3sNCitwdWJsaWM6DQorICBDUHJvcFZhcmlhbnQoKQ0KKyAgew0KKyAgICB2dCA9IFZUX0VNUFRZOw0KKyAgICB3UmVzZXJ2ZWQxID0gMDsNCisgICAgLy8gd1Jlc2VydmVkMiA9IDA7DQorICAgIC8vIHdSZXNlcnZlZDMgPSAwOw0KKyAgICAvLyB1aFZhbC5RdWFkUGFydCA9IDA7DQorICAgIGJzdHJWYWwgPSAwOw0KKyAgfQ0KKyAgfkNQcm9wVmFyaWFudCgpIHRocm93KCkgeyBDbGVhcigpOyB9DQorICBDUHJvcFZhcmlhbnQoY29uc3QgUFJPUFZBUklBTlQgJnZhclNyYyk7DQorICBDUHJvcFZhcmlhbnQoY29uc3QgQ1Byb3BWYXJpYW50ICZ2YXJTcmMpOw0KKyAgQ1Byb3BWYXJpYW50KEJTVFIgYnN0clNyYyk7DQorICBDUHJvcFZhcmlhbnQoTFBDT0xFU1RSIGxwc3pTcmMpOw0KKyAgQ1Byb3BWYXJpYW50KGJvb2wgYlNyYykgeyB2dCA9IFZUX0JPT0w7IHdSZXNlcnZlZDEgPSAwOyBib29sVmFsID0gKGJTcmMgPyBWQVJJQU5UX1RSVUUgOiBWQVJJQU5UX0ZBTFNFKTsgfTsNCisgIENQcm9wVmFyaWFudChCeXRlIHZhbHVlKSB7IHZ0ID0gVlRfVUkxOyB3UmVzZXJ2ZWQxID0gMDsgYlZhbCA9IHZhbHVlOyB9DQorDQorcHJpdmF0ZToNCisgIENQcm9wVmFyaWFudChJbnQxNiB2YWx1ZSk7IC8vIHsgdnQgPSBWVF9JMjsgd1Jlc2VydmVkMSA9IDA7IGlWYWwgPSB2YWx1ZTsgfQ0KKyAgQ1Byb3BWYXJpYW50KEludDMyIHZhbHVlKTsgLy8geyB2dCA9IFZUX0k0OyB3UmVzZXJ2ZWQxID0gMDsgbFZhbCA9IHZhbHVlOyB9DQorDQorcHVibGljOg0KKyAgQ1Byb3BWYXJpYW50KFVJbnQzMiB2YWx1ZSkgeyB2dCA9IFZUX1VJNDsgd1Jlc2VydmVkMSA9IDA7IHVsVmFsID0gdmFsdWU7IH0NCisgIENQcm9wVmFyaWFudChVSW50NjQgdmFsdWUpIHsgdnQgPSBWVF9VSTg7IHdSZXNlcnZlZDEgPSAwOyB1aFZhbC5RdWFkUGFydCA9IHZhbHVlOyB9DQorICBDUHJvcFZhcmlhbnQoSW50NjQgdmFsdWUpIHsgdnQgPSBWVF9JODsgd1Jlc2VydmVkMSA9IDA7IGhWYWwuUXVhZFBhcnQgPSB2YWx1ZTsgfQ0KKyAgQ1Byb3BWYXJpYW50KGNvbnN0IEZJTEVUSU1FICZ2YWx1ZSkgeyB2dCA9IFZUX0ZJTEVUSU1FOyB3UmVzZXJ2ZWQxID0gMDsgZmlsZXRpbWUgPSB2YWx1ZTsgfQ0KKw0KKyAgQ1Byb3BWYXJpYW50JiBvcGVyYXRvcj0oY29uc3QgQ1Byb3BWYXJpYW50ICZ2YXJTcmMpOw0KKyAgQ1Byb3BWYXJpYW50JiBvcGVyYXRvcj0oY29uc3QgUFJPUFZBUklBTlQgJnZhclNyYyk7DQorICBDUHJvcFZhcmlhbnQmIG9wZXJhdG9yPShCU1RSIGJzdHJTcmMpOw0KKyAgQ1Byb3BWYXJpYW50JiBvcGVyYXRvcj0oTFBDT0xFU1RSIGxwc3pTcmMpOw0KKyAgQ1Byb3BWYXJpYW50JiBvcGVyYXRvcj0oY29uc3QgY2hhciAqcyk7DQorICANCisgIENQcm9wVmFyaWFudCYgb3BlcmF0b3I9KGJvb2wgYlNyYykgdGhyb3coKTsNCisgIENQcm9wVmFyaWFudCYgb3BlcmF0b3I9KEJ5dGUgdmFsdWUpIHRocm93KCk7DQorICANCitwcml2YXRlOg0KKyAgQ1Byb3BWYXJpYW50JiBvcGVyYXRvcj0oSW50MTYgdmFsdWUpIHRocm93KCk7DQorDQorcHVibGljOg0KKyAgQ1Byb3BWYXJpYW50JiBvcGVyYXRvcj0oSW50MzIgdmFsdWUpIHRocm93KCk7DQorICBDUHJvcFZhcmlhbnQmIG9wZXJhdG9yPShVSW50MzIgdmFsdWUpIHRocm93KCk7DQorICBDUHJvcFZhcmlhbnQmIG9wZXJhdG9yPShVSW50NjQgdmFsdWUpIHRocm93KCk7DQorICBDUHJvcFZhcmlhbnQmIG9wZXJhdG9yPShJbnQ2NCB2YWx1ZSkgdGhyb3coKTsNCisgIENQcm9wVmFyaWFudCYgb3BlcmF0b3I9KGNvbnN0IEZJTEVUSU1FICZ2YWx1ZSkgdGhyb3coKTsNCisNCisgIEJTVFIgQWxsb2NCc3RyKHVuc2lnbmVkIG51bUNoYXJzKTsNCisNCisgIEhSRVNVTFQgQ2xlYXIoKSB0aHJvdygpOw0KKyAgSFJFU1VMVCBDb3B5KGNvbnN0IFBST1BWQVJJQU5UICpwU3JjKSB0aHJvdygpOw0KKyAgSFJFU1VMVCBBdHRhY2goUFJPUFZBUklBTlQgKnBTcmMpIHRocm93KCk7DQorICBIUkVTVUxUIERldGFjaChQUk9QVkFSSUFOVCAqcERlc3QpIHRocm93KCk7DQorDQorICBIUkVTVUxUIEludGVybmFsQ2xlYXIoKSB0aHJvdygpOw0KKyAgdm9pZCBJbnRlcm5hbENvcHkoY29uc3QgUFJPUFZBUklBTlQgKnBTcmMpOw0KKw0KKyAgaW50IENvbXBhcmUoY29uc3QgQ1Byb3BWYXJpYW50ICZhKSB0aHJvdygpOw0KK307DQorDQorfX0NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL1Byb3BWYXJpYW50Q29udi5jcHAgYi9sem1hL0NQUC9XaW5kb3dzL1Byb3BWYXJpYW50Q29udi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhMGQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvUHJvcFZhcmlhbnRDb252LmNwcApAQCAtMCwwICsxLDk5IEBACisvLyBQcm9wVmFyaWFudENvbnZlcnQuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vSW50VG9TdHJpbmcuaCINCisNCisjaW5jbHVkZSAiRGVmcy5oIg0KKyNpbmNsdWRlICJQcm9wVmFyaWFudENvbnYuaCINCisNCisjZGVmaW5lIFVJTlRfVE9fU1RSXzIoYywgdmFsKSB7IHNbMF0gPSAoYyk7IHNbMV0gPSAoY2hhcikoJzAnICsgKHZhbCkgLyAxMCk7IHNbMl0gPSAoY2hhcikoJzAnICsgKHZhbCkgJSAxMCk7IHMgKz0gMzsgfQ0KKw0KK2Jvb2wgQ29udmVydEZpbGVUaW1lVG9TdHJpbmcoY29uc3QgRklMRVRJTUUgJmZ0LCBjaGFyICpzLCBib29sIGluY2x1ZGVUaW1lLCBib29sIGluY2x1ZGVTZWNvbmRzKSB0aHJvdygpDQorew0KKyAgU1lTVEVNVElNRSBzdDsNCisgIGlmICghQk9PTFRvQm9vbChGaWxlVGltZVRvU3lzdGVtVGltZSgmZnQsICZzdCkpKQ0KKyAgew0KKyAgICAqcyA9IDA7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIHVuc2lnbmVkIHZhbCA9IHN0LndZZWFyOw0KKyAgaWYgKHZhbCA+PSAxMDAwMCkNCisgIHsNCisgICAgKnMrKyA9IChjaGFyKSgnMCcgKyB2YWwgLyAxMDAwMCk7DQorICAgIHZhbCAlPSAxMDAwMDsNCisgIH0NCisgIHsNCisgICAgc1szXSA9IChjaGFyKSgnMCcgKyB2YWwgJSAxMCk7IHZhbCAvPSAxMDsNCisgICAgc1syXSA9IChjaGFyKSgnMCcgKyB2YWwgJSAxMCk7IHZhbCAvPSAxMDsNCisgICAgc1sxXSA9IChjaGFyKSgnMCcgKyB2YWwgJSAxMCk7DQorICAgIHNbMF0gPSAoY2hhcikoJzAnICsgdmFsIC8gMTApOw0KKyAgICBzICs9IDQ7DQorICB9DQorICBVSU5UX1RPX1NUUl8yKCctJywgc3Qud01vbnRoKTsNCisgIFVJTlRfVE9fU1RSXzIoJy0nLCBzdC53RGF5KTsNCisgIGlmIChpbmNsdWRlVGltZSkNCisgIHsNCisgICAgVUlOVF9UT19TVFJfMignICcsIHN0LndIb3VyKTsNCisgICAgVUlOVF9UT19TVFJfMignOicsIHN0LndNaW51dGUpOw0KKyAgICBpZiAoaW5jbHVkZVNlY29uZHMpDQorICAgICAgVUlOVF9UT19TVFJfMignOicsIHN0LndTZWNvbmQpOw0KKyAgfQ0KKyAgKnMgPSAwOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK3ZvaWQgQ29udmVydEZpbGVUaW1lVG9TdHJpbmcoY29uc3QgRklMRVRJTUUgJmZ0LCB3Y2hhcl90ICpkZXN0LCBib29sIGluY2x1ZGVUaW1lLCBib29sIGluY2x1ZGVTZWNvbmRzKSB0aHJvdygpDQorew0KKyAgY2hhciBzWzMyXTsNCisgIENvbnZlcnRGaWxlVGltZVRvU3RyaW5nKGZ0LCBzLCBpbmNsdWRlVGltZSwgaW5jbHVkZVNlY29uZHMpOw0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDs7IGkrKykNCisgIHsNCisgICAgdW5zaWduZWQgY2hhciBjID0gc1tpXTsNCisgICAgZGVzdFtpXSA9IGM7DQorICAgIGlmIChjID09IDApDQorICAgICAgcmV0dXJuOw0KKyAgfQ0KK30NCisNCit2b2lkIENvbnZlcnRQcm9wVmFyaWFudFRvU2hvcnRTdHJpbmcoY29uc3QgUFJPUFZBUklBTlQgJnByb3AsIGNoYXIgKmRlc3QpIHRocm93KCkNCit7DQorICAqZGVzdCA9IDA7DQorICBzd2l0Y2ggKHByb3AudnQpDQorICB7DQorICAgIGNhc2UgVlRfRU1QVFk6IHJldHVybjsNCisgICAgY2FzZSBWVF9CU1RSOiBkZXN0WzBdID0gJz8nOyBkZXN0WzFdID0gMDsgcmV0dXJuOw0KKyAgICBjYXNlIFZUX1VJMTogQ29udmVydFVJbnQzMlRvU3RyaW5nKHByb3AuYlZhbCwgZGVzdCk7IHJldHVybjsNCisgICAgY2FzZSBWVF9VSTI6IENvbnZlcnRVSW50MzJUb1N0cmluZyhwcm9wLnVpVmFsLCBkZXN0KTsgcmV0dXJuOw0KKyAgICBjYXNlIFZUX1VJNDogQ29udmVydFVJbnQzMlRvU3RyaW5nKHByb3AudWxWYWwsIGRlc3QpOyByZXR1cm47DQorICAgIGNhc2UgVlRfVUk4OiBDb252ZXJ0VUludDY0VG9TdHJpbmcocHJvcC51aFZhbC5RdWFkUGFydCwgZGVzdCk7IHJldHVybjsNCisgICAgY2FzZSBWVF9GSUxFVElNRTogQ29udmVydEZpbGVUaW1lVG9TdHJpbmcocHJvcC5maWxldGltZSwgZGVzdCwgdHJ1ZSwgdHJ1ZSk7IHJldHVybjsNCisgICAgLy8gY2FzZSBWVF9JMTogcmV0dXJuIENvbnZlcnRJbnQ2NFRvU3RyaW5nKHByb3AuY1ZhbCwgZGVzdCk7IHJldHVybjsNCisgICAgY2FzZSBWVF9JMjogQ29udmVydEludDY0VG9TdHJpbmcocHJvcC5pVmFsLCBkZXN0KTsgcmV0dXJuOw0KKyAgICBjYXNlIFZUX0k0OiBDb252ZXJ0SW50NjRUb1N0cmluZyhwcm9wLmxWYWwsIGRlc3QpOyByZXR1cm47DQorICAgIGNhc2UgVlRfSTg6IENvbnZlcnRJbnQ2NFRvU3RyaW5nKHByb3AuaFZhbC5RdWFkUGFydCwgZGVzdCk7IHJldHVybjsNCisgICAgY2FzZSBWVF9CT09MOiBkZXN0WzBdID0gVkFSSUFOVF9CT09MVG9Cb29sKHByb3AuYm9vbFZhbCkgPyAnKycgOiAnLSc7IGRlc3RbMV0gPSAwOyByZXR1cm47DQorICAgIGRlZmF1bHQ6IGRlc3RbMF0gPSAnPyc7IGRlc3RbMV0gPSAnOic7IENvbnZlcnRVSW50NjRUb1N0cmluZyhwcm9wLnZ0LCBkZXN0ICsgMik7DQorICB9DQorfQ0KKw0KK3ZvaWQgQ29udmVydFByb3BWYXJpYW50VG9TaG9ydFN0cmluZyhjb25zdCBQUk9QVkFSSUFOVCAmcHJvcCwgd2NoYXJfdCAqZGVzdCkgdGhyb3coKQ0KK3sNCisgICpkZXN0ID0gMDsNCisgIHN3aXRjaCAocHJvcC52dCkNCisgIHsNCisgICAgY2FzZSBWVF9FTVBUWTogcmV0dXJuOw0KKyAgICBjYXNlIFZUX0JTVFI6IGRlc3RbMF0gPSAnPyc7IGRlc3RbMV0gPSAwOyByZXR1cm47DQorICAgIGNhc2UgVlRfVUkxOiBDb252ZXJ0VUludDMyVG9TdHJpbmcocHJvcC5iVmFsLCBkZXN0KTsgcmV0dXJuOw0KKyAgICBjYXNlIFZUX1VJMjogQ29udmVydFVJbnQzMlRvU3RyaW5nKHByb3AudWlWYWwsIGRlc3QpOyByZXR1cm47DQorICAgIGNhc2UgVlRfVUk0OiBDb252ZXJ0VUludDMyVG9TdHJpbmcocHJvcC51bFZhbCwgZGVzdCk7IHJldHVybjsNCisgICAgY2FzZSBWVF9VSTg6IENvbnZlcnRVSW50NjRUb1N0cmluZyhwcm9wLnVoVmFsLlF1YWRQYXJ0LCBkZXN0KTsgcmV0dXJuOw0KKyAgICBjYXNlIFZUX0ZJTEVUSU1FOiBDb252ZXJ0RmlsZVRpbWVUb1N0cmluZyhwcm9wLmZpbGV0aW1lLCBkZXN0LCB0cnVlLCB0cnVlKTsgcmV0dXJuOw0KKyAgICAvLyBjYXNlIFZUX0kxOiByZXR1cm4gQ29udmVydEludDY0VG9TdHJpbmcocHJvcC5jVmFsLCBkZXN0KTsgcmV0dXJuOw0KKyAgICBjYXNlIFZUX0kyOiBDb252ZXJ0SW50NjRUb1N0cmluZyhwcm9wLmlWYWwsIGRlc3QpOyByZXR1cm47DQorICAgIGNhc2UgVlRfSTQ6IENvbnZlcnRJbnQ2NFRvU3RyaW5nKHByb3AubFZhbCwgZGVzdCk7IHJldHVybjsNCisgICAgY2FzZSBWVF9JODogQ29udmVydEludDY0VG9TdHJpbmcocHJvcC5oVmFsLlF1YWRQYXJ0LCBkZXN0KTsgcmV0dXJuOw0KKyAgICBjYXNlIFZUX0JPT0w6IGRlc3RbMF0gPSBWQVJJQU5UX0JPT0xUb0Jvb2wocHJvcC5ib29sVmFsKSA/ICcrJyA6ICctJzsgZGVzdFsxXSA9IDA7IHJldHVybjsNCisgICAgZGVmYXVsdDogZGVzdFswXSA9ICc/JzsgZGVzdFsxXSA9ICc6JzsgQ29udmVydFVJbnQzMlRvU3RyaW5nKHByb3AudnQsIGRlc3QgKyAyKTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9Qcm9wVmFyaWFudENvbnYuaCBiL2x6bWEvQ1BQL1dpbmRvd3MvUHJvcFZhcmlhbnRDb252LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4Mjk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvUHJvcFZhcmlhbnRDb252LmgKQEAgLTAsMCArMSwzMCBAQAorLy8gV2luZG93cy9Qcm9wVmFyaWFudENvbnYuaA0KKw0KKyNpZm5kZWYgX19QUk9QX1ZBUklBTlRfQ09OVl9IDQorI2RlZmluZSBfX1BST1BfVkFSSUFOVF9DT05WX0gNCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL015VHlwZXMuaCINCisNCisvLyBwcm92aWRlIGF0IGxlYXN0IDMyIGJ5dGVzIGZvciBidWZmZXIgaW5jbHVkaW5nIHplcm8tZW5kDQorYm9vbCBDb252ZXJ0RmlsZVRpbWVUb1N0cmluZyhjb25zdCBGSUxFVElNRSAmZnQsIGNoYXIgKnMsIGJvb2wgaW5jbHVkZVRpbWUgPSB0cnVlLCBib29sIGluY2x1ZGVTZWNvbmRzID0gdHJ1ZSkgdGhyb3coKTsNCit2b2lkIENvbnZlcnRGaWxlVGltZVRvU3RyaW5nKGNvbnN0IEZJTEVUSU1FICZmdCwgd2NoYXJfdCAqcywgYm9vbCBpbmNsdWRlVGltZSA9IHRydWUsIGJvb2wgaW5jbHVkZVNlY29uZHMgPSB0cnVlKSB0aHJvdygpOw0KKw0KKy8vIHByb3ZpZGUgYXQgbGVhc3QgMzIgYnl0ZXMgZm9yIGJ1ZmZlciBpbmNsdWRpbmcgemVyby1lbmQNCisvLyBkb24ndCBzZW5kIFZUX0JTVFIgdG8gdGhlc2UgZnVuY3Rpb25zDQordm9pZCBDb252ZXJ0UHJvcFZhcmlhbnRUb1Nob3J0U3RyaW5nKGNvbnN0IFBST1BWQVJJQU5UICZwcm9wLCBjaGFyICpkZXN0KSB0aHJvdygpOw0KK3ZvaWQgQ29udmVydFByb3BWYXJpYW50VG9TaG9ydFN0cmluZyhjb25zdCBQUk9QVkFSSUFOVCAmcHJvcCwgd2NoYXJfdCAqZGVzdCkgdGhyb3coKTsNCisNCitpbmxpbmUgYm9vbCBDb252ZXJ0UHJvcFZhcmlhbnRUb1VJbnQ2NChjb25zdCBQUk9QVkFSSUFOVCAmcHJvcCwgVUludDY0ICZ2YWx1ZSkNCit7DQorICBzd2l0Y2ggKHByb3AudnQpDQorICB7DQorICAgIGNhc2UgVlRfVUk4OiB2YWx1ZSA9IChVSW50NjQpcHJvcC51aFZhbC5RdWFkUGFydDsgcmV0dXJuIHRydWU7DQorICAgIGNhc2UgVlRfVUk0OiB2YWx1ZSA9IHByb3AudWxWYWw7IHJldHVybiB0cnVlOw0KKyAgICBjYXNlIFZUX1VJMjogdmFsdWUgPSBwcm9wLnVpVmFsOyByZXR1cm4gdHJ1ZTsNCisgICAgY2FzZSBWVF9VSTE6IHZhbHVlID0gcHJvcC5iVmFsOyByZXR1cm4gdHJ1ZTsNCisgICAgY2FzZSBWVF9FTVBUWTogcmV0dXJuIGZhbHNlOw0KKyAgICBkZWZhdWx0OiB0aHJvdyAxNTExOTk7DQorICB9DQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvUmVnaXN0cnkuY3BwIGIvbHptYS9DUFAvV2luZG93cy9SZWdpc3RyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzYTc1MQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvUmVnaXN0cnkuY3BwCkBAIC0wLDAgKzEsMzY4IEBACisvLyBXaW5kb3dzL1JlZ2lzdHJ5LmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaWZuZGVmIF9VTklDT0RFDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9TdHJpbmdDb252ZXJ0LmgiDQorI2VuZGlmDQorI2luY2x1ZGUgIlJlZ2lzdHJ5LmgiDQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KK2V4dGVybiBib29sIGdfSXNOVDsNCisjZW5kaWYNCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBOUmVnaXN0cnkgew0KKw0KKyNkZWZpbmUgTVlBU1NFUlQoZXhwcikgLy8gX0FTU0VSVEUoZXhwcikNCisNCitMT05HIENLZXk6OkNyZWF0ZShIS0VZIHBhcmVudEtleSwgTFBDVFNUUiBrZXlOYW1lLA0KKyAgICBMUFRTVFIga2V5Q2xhc3MsIERXT1JEIG9wdGlvbnMsIFJFR1NBTSBhY2Nlc3NNYXNrLA0KKyAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgc2VjdXJpdHlBdHRyaWJ1dGVzLCBMUERXT1JEIGRpc3Bvc2l0aW9uKSB0aHJvdygpDQorew0KKyAgTVlBU1NFUlQocGFyZW50S2V5ICE9IE5VTEwpOw0KKyAgRFdPUkQgZGlzcG9zaXRpb25SZWFsOw0KKyAgSEtFWSBrZXkgPSBOVUxMOw0KKyAgTE9ORyByZXMgPSBSZWdDcmVhdGVLZXlFeChwYXJlbnRLZXksIGtleU5hbWUsIDAsIGtleUNsYXNzLA0KKyAgICAgIG9wdGlvbnMsIGFjY2Vzc01hc2ssIHNlY3VyaXR5QXR0cmlidXRlcywgJmtleSwgJmRpc3Bvc2l0aW9uUmVhbCk7DQorICBpZiAoZGlzcG9zaXRpb24gIT0gTlVMTCkNCisgICAgKmRpc3Bvc2l0aW9uID0gZGlzcG9zaXRpb25SZWFsOw0KKyAgaWYgKHJlcyA9PSBFUlJPUl9TVUNDRVNTKQ0KKyAgew0KKyAgICByZXMgPSBDbG9zZSgpOw0KKyAgICBfb2JqZWN0ID0ga2V5Ow0KKyAgfQ0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorTE9ORyBDS2V5OjpPcGVuKEhLRVkgcGFyZW50S2V5LCBMUENUU1RSIGtleU5hbWUsIFJFR1NBTSBhY2Nlc3NNYXNrKSB0aHJvdygpDQorew0KKyAgTVlBU1NFUlQocGFyZW50S2V5ICE9IE5VTEwpOw0KKyAgSEtFWSBrZXkgPSBOVUxMOw0KKyAgTE9ORyByZXMgPSBSZWdPcGVuS2V5RXgocGFyZW50S2V5LCBrZXlOYW1lLCAwLCBhY2Nlc3NNYXNrLCAma2V5KTsNCisgIGlmIChyZXMgPT0gRVJST1JfU1VDQ0VTUykNCisgIHsNCisgICAgcmVzID0gQ2xvc2UoKTsNCisgICAgTVlBU1NFUlQocmVzID09IEVSUk9SX1NVQ0NFU1MpOw0KKyAgICBfb2JqZWN0ID0ga2V5Ow0KKyAgfQ0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorTE9ORyBDS2V5OjpDbG9zZSgpIHRocm93KCkNCit7DQorICBMT05HIHJlcyA9IEVSUk9SX1NVQ0NFU1M7DQorICBpZiAoX29iamVjdCAhPSBOVUxMKQ0KKyAgew0KKyAgICByZXMgPSBSZWdDbG9zZUtleShfb2JqZWN0KTsNCisgICAgX29iamVjdCA9IE5VTEw7DQorICB9DQorICByZXR1cm4gcmVzOw0KK30NCisNCisvLyB3aW45NSwgd2luOTg6IGRlbGV0ZXMgc3Vua2V5IGFuZCBhbGwgaXRzIHN1YmtleXMNCisvLyB3aW5OVCB0byBiZSBkZWxldGVkIG11c3Qgbm90IGhhdmUgc3Via2V5cw0KK0xPTkcgQ0tleTo6RGVsZXRlU3ViS2V5KExQQ1RTVFIgc3ViS2V5TmFtZSkgdGhyb3coKQ0KK3sNCisgIE1ZQVNTRVJUKF9vYmplY3QgIT0gTlVMTCk7DQorICByZXR1cm4gUmVnRGVsZXRlS2V5KF9vYmplY3QsIHN1YktleU5hbWUpOw0KK30NCisNCitMT05HIENLZXk6OlJlY3Vyc2VEZWxldGVLZXkoTFBDVFNUUiBzdWJLZXlOYW1lKSB0aHJvdygpDQorew0KKyAgQ0tleSBrZXk7DQorICBMT05HIHJlcyA9IGtleS5PcGVuKF9vYmplY3QsIHN1YktleU5hbWUsIEtFWV9SRUFEIHwgS0VZX1dSSVRFKTsNCisgIGlmIChyZXMgIT0gRVJST1JfU1VDQ0VTUykNCisgICAgcmV0dXJuIHJlczsNCisgIEZJTEVUSU1FIGZpbGVUaW1lOw0KKyAgY29uc3QgVUludDMyIGtCdWZmZXJTaXplID0gTUFYX1BBVEggKyAxOyAvLyAyNTYgaW4gQVRMDQorICBEV09SRCBzaXplID0ga0J1ZmZlclNpemU7DQorICBUQ0hBUiBidWZmZXJba0J1ZmZlclNpemVdOw0KKyAgd2hpbGUgKFJlZ0VudW1LZXlFeChrZXkuX29iamVjdCwgMCwgYnVmZmVyLCAmc2l6ZSwgTlVMTCwgTlVMTCwgTlVMTCwgJmZpbGVUaW1lKSA9PSBFUlJPUl9TVUNDRVNTKQ0KKyAgew0KKyAgICByZXMgPSBrZXkuUmVjdXJzZURlbGV0ZUtleShidWZmZXIpOw0KKyAgICBpZiAocmVzICE9IEVSUk9SX1NVQ0NFU1MpDQorICAgICAgcmV0dXJuIHJlczsNCisgICAgc2l6ZSA9IGtCdWZmZXJTaXplOw0KKyAgfQ0KKyAga2V5LkNsb3NlKCk7DQorICByZXR1cm4gRGVsZXRlU3ViS2V5KHN1YktleU5hbWUpOw0KK30NCisNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gVmFsdWUgRnVuY3Rpb25zDQorDQorc3RhdGljIGlubGluZSBVSW50MzIgQm9vbFRvVUlOVDMyKGJvb2wgdmFsdWUpIHsgIHJldHVybiAodmFsdWUgPyAxOiAwKTsgfQ0KK3N0YXRpYyBpbmxpbmUgYm9vbCBVSU5UMzJUb0Jvb2woVUludDMyIHZhbHVlKSB7ICByZXR1cm4gKHZhbHVlICE9IDApOyB9DQorDQorDQorTE9ORyBDS2V5OjpEZWxldGVWYWx1ZShMUENUU1RSIG5hbWUpIHRocm93KCkNCit7DQorICBNWUFTU0VSVChfb2JqZWN0ICE9IE5VTEwpOw0KKyAgcmV0dXJuIDo6UmVnRGVsZXRlVmFsdWUoX29iamVjdCwgbmFtZSk7DQorfQ0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCitMT05HIENLZXk6OkRlbGV0ZVZhbHVlKExQQ1dTVFIgbmFtZSkNCit7DQorICBNWUFTU0VSVChfb2JqZWN0ICE9IE5VTEwpOw0KKyAgaWYgKGdfSXNOVCkNCisgICAgcmV0dXJuIDo6UmVnRGVsZXRlVmFsdWVXKF9vYmplY3QsIG5hbWUpOw0KKyAgcmV0dXJuIERlbGV0ZVZhbHVlKG5hbWUgPT0gMCA/IDAgOiAoTFBDU1RSKUdldFN5c3RlbVN0cmluZyhuYW1lKSk7DQorfQ0KKyNlbmRpZg0KKw0KK0xPTkcgQ0tleTo6U2V0VmFsdWUoTFBDVFNUUiBuYW1lLCBVSW50MzIgdmFsdWUpIHRocm93KCkNCit7DQorICBNWUFTU0VSVChfb2JqZWN0ICE9IE5VTEwpOw0KKyAgcmV0dXJuIFJlZ1NldFZhbHVlRXgoX29iamVjdCwgbmFtZSwgMCwgUkVHX0RXT1JELA0KKyAgICAgIChCWVRFICogY29uc3QpJnZhbHVlLCBzaXplb2YoVUludDMyKSk7DQorfQ0KKw0KK0xPTkcgQ0tleTo6U2V0VmFsdWUoTFBDVFNUUiBuYW1lLCBib29sIHZhbHVlKSB0aHJvdygpDQorew0KKyAgcmV0dXJuIFNldFZhbHVlKG5hbWUsIEJvb2xUb1VJTlQzMih2YWx1ZSkpOw0KK30NCisNCitMT05HIENLZXk6OlNldFZhbHVlKExQQ1RTVFIgbmFtZSwgTFBDVFNUUiB2YWx1ZSkgdGhyb3coKQ0KK3sNCisgIE1ZQVNTRVJUKHZhbHVlICE9IE5VTEwpOw0KKyAgTVlBU1NFUlQoX29iamVjdCAhPSBOVUxMKTsNCisgIHJldHVybiBSZWdTZXRWYWx1ZUV4KF9vYmplY3QsIG5hbWUsIDAsIFJFR19TWiwNCisgICAgICAoY29uc3QgQllURSAqICl2YWx1ZSwgKGxzdHJsZW4odmFsdWUpICsgMSkgKiBzaXplb2YoVENIQVIpKTsNCit9DQorDQorLyoNCitMT05HIENLZXk6OlNldFZhbHVlKExQQ1RTVFIgbmFtZSwgY29uc3QgQ1N5c1N0cmluZyAmdmFsdWUpDQorew0KKyAgTVlBU1NFUlQodmFsdWUgIT0gTlVMTCk7DQorICBNWUFTU0VSVChfb2JqZWN0ICE9IE5VTEwpOw0KKyAgcmV0dXJuIFJlZ1NldFZhbHVlRXgoX29iamVjdCwgbmFtZSwgTlVMTCwgUkVHX1NaLA0KKyAgICAgIChjb25zdCBCWVRFICopKGNvbnN0IFRDSEFSICopdmFsdWUsICh2YWx1ZS5MZW4oKSArIDEpICogc2l6ZW9mKFRDSEFSKSk7DQorfQ0KKyovDQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KKw0KK0xPTkcgQ0tleTo6U2V0VmFsdWUoTFBDV1NUUiBuYW1lLCBMUENXU1RSIHZhbHVlKQ0KK3sNCisgIE1ZQVNTRVJUKHZhbHVlICE9IE5VTEwpOw0KKyAgTVlBU1NFUlQoX29iamVjdCAhPSBOVUxMKTsNCisgIGlmIChnX0lzTlQpDQorICAgIHJldHVybiBSZWdTZXRWYWx1ZUV4Vyhfb2JqZWN0LCBuYW1lLCBOVUxMLCBSRUdfU1osDQorICAgICAgKGNvbnN0IEJZVEUgKiApdmFsdWUsIChEV09SRCkoKHdjc2xlbih2YWx1ZSkgKyAxKSAqIHNpemVvZih3Y2hhcl90KSkpOw0KKyAgcmV0dXJuIFNldFZhbHVlKG5hbWUgPT0gMCA/IDAgOiAoTFBDU1RSKUdldFN5c3RlbVN0cmluZyhuYW1lKSwNCisgICAgdmFsdWUgPT0gMCA/IDAgOiAoTFBDU1RSKUdldFN5c3RlbVN0cmluZyh2YWx1ZSkpOw0KK30NCisNCisjZW5kaWYNCisNCisNCitMT05HIENLZXk6OlNldFZhbHVlKExQQ1RTVFIgbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsIFVJbnQzMiBzaXplKSB0aHJvdygpDQorew0KKyAgTVlBU1NFUlQodmFsdWUgIT0gTlVMTCk7DQorICBNWUFTU0VSVChfb2JqZWN0ICE9IE5VTEwpOw0KKyAgcmV0dXJuIFJlZ1NldFZhbHVlRXgoX29iamVjdCwgbmFtZSwgMCwgUkVHX0JJTkFSWSwNCisgICAgICAoY29uc3QgQllURSAqKXZhbHVlLCBzaXplKTsNCit9DQorDQorTE9ORyBTZXRWYWx1ZShIS0VZIHBhcmVudEtleSwgTFBDVFNUUiBrZXlOYW1lLCBMUENUU1RSIHZhbHVlTmFtZSwgTFBDVFNUUiB2YWx1ZSkNCit7DQorICBNWUFTU0VSVCh2YWx1ZSAhPSBOVUxMKTsNCisgIENLZXkga2V5Ow0KKyAgTE9ORyByZXMgPSBrZXkuQ3JlYXRlKHBhcmVudEtleSwga2V5TmFtZSk7DQorICBpZiAocmVzID09IEVSUk9SX1NVQ0NFU1MpDQorICAgIHJlcyA9IGtleS5TZXRWYWx1ZSh2YWx1ZU5hbWUsIHZhbHVlKTsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK0xPTkcgQ0tleTo6U2V0S2V5VmFsdWUoTFBDVFNUUiBrZXlOYW1lLCBMUENUU1RSIHZhbHVlTmFtZSwgTFBDVFNUUiB2YWx1ZSkgdGhyb3coKQ0KK3sNCisgIE1ZQVNTRVJUKHZhbHVlICE9IE5VTEwpOw0KKyAgQ0tleSBrZXk7DQorICBMT05HIHJlcyA9IGtleS5DcmVhdGUoX29iamVjdCwga2V5TmFtZSk7DQorICBpZiAocmVzID09IEVSUk9SX1NVQ0NFU1MpDQorICAgIHJlcyA9IGtleS5TZXRWYWx1ZSh2YWx1ZU5hbWUsIHZhbHVlKTsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK0xPTkcgQ0tleTo6UXVlcnlWYWx1ZShMUENUU1RSIG5hbWUsIFVJbnQzMiAmdmFsdWUpIHRocm93KCkNCit7DQorICBEV09SRCB0eXBlID0gMDsNCisgIERXT1JEIGNvdW50ID0gc2l6ZW9mKERXT1JEKTsNCisgIExPTkcgcmVzID0gUmVnUXVlcnlWYWx1ZUV4KF9vYmplY3QsIChMUFRTVFIpbmFtZSwgTlVMTCwgJnR5cGUsDQorICAgIChMUEJZVEUpJnZhbHVlLCAmY291bnQpOw0KKyAgTVlBU1NFUlQoKHJlcyAhPSBFUlJPUl9TVUNDRVNTKSB8fCAodHlwZSA9PSBSRUdfRFdPUkQpKTsNCisgIE1ZQVNTRVJUKChyZXMgIT0gRVJST1JfU1VDQ0VTUykgfHwgKGNvdW50ID09IHNpemVvZihVSW50MzIpKSk7DQorICByZXR1cm4gcmVzOw0KK30NCisNCitMT05HIENLZXk6OlF1ZXJ5VmFsdWUoTFBDVFNUUiBuYW1lLCBib29sICZ2YWx1ZSkgdGhyb3coKQ0KK3sNCisgIFVJbnQzMiB1aW50VmFsdWUgPSBCb29sVG9VSU5UMzIodmFsdWUpOw0KKyAgTE9ORyByZXMgPSBRdWVyeVZhbHVlKG5hbWUsIHVpbnRWYWx1ZSk7DQorICB2YWx1ZSA9IFVJTlQzMlRvQm9vbCh1aW50VmFsdWUpOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorTE9ORyBDS2V5OjpHZXRWYWx1ZV9JZk9rKExQQ1RTVFIgbmFtZSwgVUludDMyICZ2YWx1ZSkgdGhyb3coKQ0KK3sNCisgIFVJbnQzMiBuZXdWYWw7DQorICBMT05HIHJlcyA9IFF1ZXJ5VmFsdWUobmFtZSwgbmV3VmFsKTsNCisgIGlmIChyZXMgPT0gRVJST1JfU1VDQ0VTUykNCisgICAgdmFsdWUgPSBuZXdWYWw7DQorICByZXR1cm4gcmVzOw0KK30NCisNCitMT05HIENLZXk6OkdldFZhbHVlX0lmT2soTFBDVFNUUiBuYW1lLCBib29sICZ2YWx1ZSkgdGhyb3coKQ0KK3sNCisgIGJvb2wgbmV3VmFsOw0KKyAgTE9ORyByZXMgPSBRdWVyeVZhbHVlKG5hbWUsIG5ld1ZhbCk7DQorICBpZiAocmVzID09IEVSUk9SX1NVQ0NFU1MpDQorICAgIHZhbHVlID0gbmV3VmFsOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorTE9ORyBDS2V5OjpRdWVyeVZhbHVlKExQQ1RTVFIgbmFtZSwgTFBUU1RSIHZhbHVlLCBVSW50MzIgJmNvdW50KSB0aHJvdygpDQorew0KKyAgTVlBU1NFUlQoY291bnQgIT0gTlVMTCk7DQorICBEV09SRCB0eXBlID0gMDsNCisgIExPTkcgcmVzID0gUmVnUXVlcnlWYWx1ZUV4KF9vYmplY3QsIChMUFRTVFIpbmFtZSwgTlVMTCwgJnR5cGUsIChMUEJZVEUpdmFsdWUsIChEV09SRCAqKSZjb3VudCk7DQorICBNWUFTU0VSVCgocmVzICE9IEVSUk9SX1NVQ0NFU1MpIHx8ICh0eXBlID09IFJFR19TWikgfHwgKHR5cGUgPT0gUkVHX01VTFRJX1NaKSB8fCAodHlwZSA9PSBSRUdfRVhQQU5EX1NaKSk7DQorICByZXR1cm4gcmVzOw0KK30NCisNCitMT05HIENLZXk6OlF1ZXJ5VmFsdWUoTFBDVFNUUiBuYW1lLCBDU3lzU3RyaW5nICZ2YWx1ZSkNCit7DQorICB2YWx1ZS5FbXB0eSgpOw0KKyAgRFdPUkQgdHlwZSA9IDA7DQorICBVSW50MzIgY3VycmVudFNpemUgPSAwOw0KKyAgTE9ORyByZXMgPSBSZWdRdWVyeVZhbHVlRXgoX29iamVjdCwgKExQVFNUUiluYW1lLCBOVUxMLCAmdHlwZSwgTlVMTCwgKERXT1JEICopJmN1cnJlbnRTaXplKTsNCisgIGlmIChyZXMgIT0gRVJST1JfU1VDQ0VTUyAmJiByZXMgIT0gRVJST1JfTU9SRV9EQVRBKQ0KKyAgICByZXR1cm4gcmVzOw0KKyAgcmVzID0gUXVlcnlWYWx1ZShuYW1lLCB2YWx1ZS5HZXRCdWZmZXIoY3VycmVudFNpemUpLCBjdXJyZW50U2l6ZSk7DQorICB2YWx1ZS5SZWxlYXNlQnVmZmVyKCk7DQorICByZXR1cm4gcmVzOw0KK30NCisNCisjaWZuZGVmIF9VTklDT0RFDQorTE9ORyBDS2V5OjpRdWVyeVZhbHVlKExQQ1dTVFIgbmFtZSwgTFBXU1RSIHZhbHVlLCBVSW50MzIgJmNvdW50KQ0KK3sNCisgIE1ZQVNTRVJUKGNvdW50ICE9IE5VTEwpOw0KKyAgRFdPUkQgdHlwZSA9IDA7DQorICBMT05HIHJlcyA9IFJlZ1F1ZXJ5VmFsdWVFeFcoX29iamVjdCwgbmFtZSwgTlVMTCwgJnR5cGUsIChMUEJZVEUpdmFsdWUsIChEV09SRCAqKSZjb3VudCk7DQorICBNWUFTU0VSVCgocmVzICE9IEVSUk9SX1NVQ0NFU1MpIHx8ICh0eXBlID09IFJFR19TWikgfHwgKHR5cGUgPT0gUkVHX01VTFRJX1NaKSB8fCAodHlwZSA9PSBSRUdfRVhQQU5EX1NaKSk7DQorICByZXR1cm4gcmVzOw0KK30NCitMT05HIENLZXk6OlF1ZXJ5VmFsdWUoTFBDV1NUUiBuYW1lLCBVU3RyaW5nICZ2YWx1ZSkNCit7DQorICB2YWx1ZS5FbXB0eSgpOw0KKyAgRFdPUkQgdHlwZSA9IDA7DQorICBVSW50MzIgY3VycmVudFNpemUgPSAwOw0KKw0KKyAgTE9ORyByZXM7DQorICBpZiAoZ19Jc05UKQ0KKyAgew0KKyAgICByZXMgPSBSZWdRdWVyeVZhbHVlRXhXKF9vYmplY3QsIG5hbWUsIE5VTEwsICZ0eXBlLCBOVUxMLCAoRFdPUkQgKikmY3VycmVudFNpemUpOw0KKyAgICBpZiAocmVzICE9IEVSUk9SX1NVQ0NFU1MgJiYgcmVzICE9IEVSUk9SX01PUkVfREFUQSkNCisgICAgICByZXR1cm4gcmVzOw0KKyAgICByZXMgPSBRdWVyeVZhbHVlKG5hbWUsIHZhbHVlLkdldEJ1ZmZlcihjdXJyZW50U2l6ZSksIGN1cnJlbnRTaXplKTsNCisgICAgdmFsdWUuUmVsZWFzZUJ1ZmZlcigpOw0KKyAgfQ0KKyAgZWxzZQ0KKyAgew0KKyAgICBBU3RyaW5nIHZUZW1wOw0KKyAgICByZXMgPSBRdWVyeVZhbHVlKG5hbWUgPT0gMCA/IDAgOiAoTFBDU1RSKUdldFN5c3RlbVN0cmluZyhuYW1lKSwgdlRlbXApOw0KKyAgICB2YWx1ZSA9IEdldFVuaWNvZGVTdHJpbmcodlRlbXApOw0KKyAgfQ0KKyAgcmV0dXJuIHJlczsNCit9DQorI2VuZGlmDQorDQorTE9ORyBDS2V5OjpRdWVyeVZhbHVlKExQQ1RTVFIgbmFtZSwgdm9pZCAqdmFsdWUsIFVJbnQzMiAmY291bnQpIHRocm93KCkNCit7DQorICBEV09SRCB0eXBlID0gMDsNCisgIExPTkcgcmVzID0gUmVnUXVlcnlWYWx1ZUV4KF9vYmplY3QsIChMUFRTVFIpbmFtZSwgTlVMTCwgJnR5cGUsIChMUEJZVEUpdmFsdWUsIChEV09SRCAqKSZjb3VudCk7DQorICBNWUFTU0VSVCgocmVzICE9IEVSUk9SX1NVQ0NFU1MpIHx8ICh0eXBlID09IFJFR19CSU5BUlkpKTsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KKw0KK0xPTkcgQ0tleTo6UXVlcnlWYWx1ZShMUENUU1RSIG5hbWUsIENCeXRlQnVmZmVyICZ2YWx1ZSwgVUludDMyICZkYXRhU2l6ZSkNCit7DQorICBEV09SRCB0eXBlID0gMDsNCisgIGRhdGFTaXplID0gMDsNCisgIExPTkcgcmVzID0gUmVnUXVlcnlWYWx1ZUV4KF9vYmplY3QsIChMUFRTVFIpbmFtZSwgTlVMTCwgJnR5cGUsIE5VTEwsIChEV09SRCAqKSZkYXRhU2l6ZSk7DQorICBpZiAocmVzICE9IEVSUk9SX1NVQ0NFU1MgJiYgcmVzICE9IEVSUk9SX01PUkVfREFUQSkNCisgICAgcmV0dXJuIHJlczsNCisgIHZhbHVlLkFsbG9jKGRhdGFTaXplKTsNCisgIHJldHVybiBRdWVyeVZhbHVlKG5hbWUsIChCWVRFICopdmFsdWUsIGRhdGFTaXplKTsNCit9DQorDQorTE9ORyBDS2V5OjpFbnVtS2V5cyhDU3lzU3RyaW5nVmVjdG9yICZrZXlOYW1lcykNCit7DQorICBrZXlOYW1lcy5DbGVhcigpOw0KKyAgQ1N5c1N0cmluZyBrZXlOYW1lOw0KKyAgZm9yIChVSW50MzIgaW5kZXggPSAwOyA7IGluZGV4KyspDQorICB7DQorICAgIGNvbnN0IFVJbnQzMiBrQnVmZmVyU2l6ZSA9IE1BWF9QQVRIICsgMTsgLy8gMjU2IGluIEFUTA0KKyAgICBGSUxFVElNRSBsYXN0V3JpdGVUaW1lOw0KKyAgICBVSW50MzIgbmFtZVNpemUgPSBrQnVmZmVyU2l6ZTsNCisgICAgTE9ORyByZXN1bHQgPSA6OlJlZ0VudW1LZXlFeChfb2JqZWN0LCBpbmRleCwga2V5TmFtZS5HZXRCdWZmZXIoa0J1ZmZlclNpemUpLA0KKyAgICAgICAgKERXT1JEICopJm5hbWVTaXplLCBOVUxMLCBOVUxMLCBOVUxMLCAmbGFzdFdyaXRlVGltZSk7DQorICAgIGtleU5hbWUuUmVsZWFzZUJ1ZmZlcigpOw0KKyAgICBpZiAocmVzdWx0ID09IEVSUk9SX05PX01PUkVfSVRFTVMpDQorICAgICAgYnJlYWs7DQorICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykNCisgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICBrZXlOYW1lcy5BZGQoa2V5TmFtZSk7DQorICB9DQorICByZXR1cm4gRVJST1JfU1VDQ0VTUzsNCit9DQorDQorTE9ORyBDS2V5OjpTZXRWYWx1ZV9TdHJpbmdzKExQQ1RTVFIgdmFsdWVOYW1lLCBjb25zdCBVU3RyaW5nVmVjdG9yICZzdHJpbmdzKSB0aHJvdygpDQorew0KKyAgVUludDMyIG51bUNoYXJzID0gMDsNCisgIHVuc2lnbmVkIGk7DQorICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5ncy5TaXplKCk7IGkrKykNCisgICAgbnVtQ2hhcnMgKz0gc3RyaW5nc1tpXS5MZW4oKSArIDE7DQorICBDQnVmZmVyPHdjaGFyX3Q+IGJ1ZmZlcihudW1DaGFycyk7DQorICB1bnNpZ25lZCBwb3MgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IHN0cmluZ3MuU2l6ZSgpOyBpKyspDQorICB7DQorICAgIGNvbnN0IFVTdHJpbmcgJnMgPSBzdHJpbmdzW2ldOw0KKyAgICBNeVN0cmluZ0NvcHkoKHdjaGFyX3QgKilidWZmZXIgKyBwb3MsIChjb25zdCB3Y2hhcl90ICopcyk7DQorICAgIHBvcyArPSBzLkxlbigpICsgMTsNCisgIH0NCisgIHJldHVybiBTZXRWYWx1ZSh2YWx1ZU5hbWUsIGJ1ZmZlciwgbnVtQ2hhcnMgKiBzaXplb2Yod2NoYXJfdCkpOw0KK30NCisNCitMT05HIENLZXk6OkdldFZhbHVlX1N0cmluZ3MoTFBDVFNUUiB2YWx1ZU5hbWUsIFVTdHJpbmdWZWN0b3IgJnN0cmluZ3MpDQorew0KKyAgc3RyaW5ncy5DbGVhcigpOw0KKyAgQ0J5dGVCdWZmZXIgYnVmZmVyOw0KKyAgVUludDMyIGRhdGFTaXplOw0KKyAgTE9ORyByZXMgPSBRdWVyeVZhbHVlKHZhbHVlTmFtZSwgYnVmZmVyLCBkYXRhU2l6ZSk7DQorICBpZiAocmVzICE9IEVSUk9SX1NVQ0NFU1MpDQorICAgIHJldHVybiByZXM7DQorICBpZiAoZGF0YVNpemUgJSBzaXplb2Yod2NoYXJfdCkgIT0gMCkNCisgICAgcmV0dXJuIEVfRkFJTDsNCisgIGNvbnN0IHdjaGFyX3QgKmRhdGEgPSAoY29uc3Qgd2NoYXJfdCAqKShjb25zdCBCeXRlICAqKWJ1ZmZlcjsNCisgIHVuc2lnbmVkIG51bUNoYXJzID0gZGF0YVNpemUgLyBzaXplb2Yod2NoYXJfdCk7DQorICBVU3RyaW5nIHM7DQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtQ2hhcnM7IGkrKykNCisgIHsNCisgICAgd2NoYXJfdCBjID0gZGF0YVtpXTsNCisgICAgaWYgKGMgPT0gMCkNCisgICAgew0KKyAgICAgIHN0cmluZ3MuQWRkKHMpOw0KKyAgICAgIHMuRW1wdHkoKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgcyArPSBjOw0KKyAgfQ0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL1JlZ2lzdHJ5LmggYi9sem1hL0NQUC9XaW5kb3dzL1JlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjNjY2MgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvUmVnaXN0cnkuaApAQCAtMCwwICsxLDg0IEBACisvLyBXaW5kb3dzL1JlZ2lzdHJ5LmgNCisNCisjaWZuZGVmIF9fV0lORE9XU19SRUdJU1RSWV9IDQorI2RlZmluZSBfX1dJTkRPV1NfUkVHSVNUUllfSA0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlCdWZmZXIuaCINCisjaW5jbHVkZSAiLi4vQ29tbW9uL015U3RyaW5nLmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTlJlZ2lzdHJ5IHsNCisNCitMT05HIFNldFZhbHVlKEhLRVkgcGFyZW50S2V5LCBMUENUU1RSIGtleU5hbWUsIExQQ1RTVFIgdmFsdWVOYW1lLCBMUENUU1RSIHZhbHVlKTsNCisNCitjbGFzcyBDS2V5DQorew0KKyAgSEtFWSBfb2JqZWN0Ow0KK3B1YmxpYzoNCisgIENLZXkoKTogX29iamVjdChOVUxMKSB7fQ0KKyAgfkNLZXkoKSB7IENsb3NlKCk7IH0NCisNCisgIG9wZXJhdG9yIEhLRVkoKSBjb25zdCB7IHJldHVybiBfb2JqZWN0OyB9DQorICB2b2lkIEF0dGFjaChIS0VZIGtleSkgeyBfb2JqZWN0ID0ga2V5OyB9DQorICBIS0VZIERldGFjaCgpDQorICB7DQorICAgIEhLRVkga2V5ID0gX29iamVjdDsNCisgICAgX29iamVjdCA9IE5VTEw7DQorICAgIHJldHVybiBrZXk7DQorICB9DQorDQorICBMT05HIENyZWF0ZShIS0VZIHBhcmVudEtleSwgTFBDVFNUUiBrZXlOYW1lLA0KKyAgICAgIExQVFNUUiBrZXlDbGFzcyA9IFJFR19OT05FLCBEV09SRCBvcHRpb25zID0gUkVHX09QVElPTl9OT05fVk9MQVRJTEUsDQorICAgICAgUkVHU0FNIGFjY2Vzc01hc2sgPSBLRVlfQUxMX0FDQ0VTUywNCisgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgc2VjdXJpdHlBdHRyaWJ1dGVzID0gTlVMTCwNCisgICAgICBMUERXT1JEIGRpc3Bvc2l0aW9uID0gTlVMTCkgdGhyb3coKTsNCisgIExPTkcgT3BlbihIS0VZIHBhcmVudEtleSwgTFBDVFNUUiBrZXlOYW1lLCBSRUdTQU0gYWNjZXNzTWFzayA9IEtFWV9BTExfQUNDRVNTKSB0aHJvdygpOw0KKw0KKyAgTE9ORyBDbG9zZSgpIHRocm93KCk7DQorDQorICBMT05HIERlbGV0ZVN1YktleShMUENUU1RSIHN1YktleU5hbWUpIHRocm93KCk7DQorICBMT05HIFJlY3Vyc2VEZWxldGVLZXkoTFBDVFNUUiBzdWJLZXlOYW1lKSB0aHJvdygpOw0KKw0KKyAgTE9ORyBEZWxldGVWYWx1ZShMUENUU1RSIG5hbWUpIHRocm93KCk7DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBMT05HIERlbGV0ZVZhbHVlKExQQ1dTVFIgbmFtZSk7DQorICAjZW5kaWYNCisNCisgIExPTkcgU2V0VmFsdWUoTFBDVFNUUiB2YWx1ZU5hbWUsIFVJbnQzMiB2YWx1ZSkgdGhyb3coKTsNCisgIExPTkcgU2V0VmFsdWUoTFBDVFNUUiB2YWx1ZU5hbWUsIGJvb2wgdmFsdWUpIHRocm93KCk7DQorICBMT05HIFNldFZhbHVlKExQQ1RTVFIgdmFsdWVOYW1lLCBMUENUU1RSIHZhbHVlKSB0aHJvdygpOw0KKyAgLy8gTE9ORyBTZXRWYWx1ZShMUENUU1RSIHZhbHVlTmFtZSwgY29uc3QgQ1N5c1N0cmluZyAmdmFsdWUpOw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgTE9ORyBTZXRWYWx1ZShMUENXU1RSIG5hbWUsIExQQ1dTVFIgdmFsdWUpOw0KKyAgLy8gTE9ORyBTZXRWYWx1ZShMUENXU1RSIG5hbWUsIGNvbnN0IFVTdHJpbmcgJnZhbHVlKTsNCisgICNlbmRpZg0KKw0KKyAgTE9ORyBTZXRWYWx1ZShMUENUU1RSIG5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLCBVSW50MzIgc2l6ZSkgdGhyb3coKTsNCisNCisgIExPTkcgU2V0VmFsdWVfU3RyaW5ncyhMUENUU1RSIHZhbHVlTmFtZSwgY29uc3QgVVN0cmluZ1ZlY3RvciAmc3RyaW5ncykgdGhyb3coKTsNCisgIExPTkcgR2V0VmFsdWVfU3RyaW5ncyhMUENUU1RSIHZhbHVlTmFtZSwgVVN0cmluZ1ZlY3RvciAmc3RyaW5ncyk7DQorDQorICBMT05HIFNldEtleVZhbHVlKExQQ1RTVFIga2V5TmFtZSwgTFBDVFNUUiB2YWx1ZU5hbWUsIExQQ1RTVFIgdmFsdWUpIHRocm93KCk7DQorDQorICBMT05HIFF1ZXJ5VmFsdWUoTFBDVFNUUiBuYW1lLCBVSW50MzIgJnZhbHVlKSB0aHJvdygpOw0KKyAgTE9ORyBRdWVyeVZhbHVlKExQQ1RTVFIgbmFtZSwgYm9vbCAmdmFsdWUpIHRocm93KCk7DQorICBMT05HIFF1ZXJ5VmFsdWUoTFBDVFNUUiBuYW1lLCBMUFRTVFIgdmFsdWUsIFVJbnQzMiAmZGF0YVNpemUpIHRocm93KCk7DQorICBMT05HIFF1ZXJ5VmFsdWUoTFBDVFNUUiBuYW1lLCBDU3lzU3RyaW5nICZ2YWx1ZSk7DQorDQorICBMT05HIEdldFZhbHVlX0lmT2soTFBDVFNUUiBuYW1lLCBVSW50MzIgJnZhbHVlKSB0aHJvdygpOw0KKyAgTE9ORyBHZXRWYWx1ZV9JZk9rKExQQ1RTVFIgbmFtZSwgYm9vbCAmdmFsdWUpIHRocm93KCk7DQorDQorICAjaWZuZGVmIF9VTklDT0RFDQorICBMT05HIFF1ZXJ5VmFsdWUoTFBDV1NUUiBuYW1lLCBMUFdTVFIgdmFsdWUsIFVJbnQzMiAmZGF0YVNpemUpOw0KKyAgTE9ORyBRdWVyeVZhbHVlKExQQ1dTVFIgbmFtZSwgVVN0cmluZyAmdmFsdWUpOw0KKyAgI2VuZGlmDQorDQorICBMT05HIFF1ZXJ5VmFsdWUoTFBDVFNUUiBuYW1lLCB2b2lkICp2YWx1ZSwgVUludDMyICZkYXRhU2l6ZSkgdGhyb3coKTsNCisgIExPTkcgUXVlcnlWYWx1ZShMUENUU1RSIG5hbWUsIENCeXRlQnVmZmVyICZ2YWx1ZSwgVUludDMyICZkYXRhU2l6ZSk7DQorDQorICBMT05HIEVudW1LZXlzKENTeXNTdHJpbmdWZWN0b3IgJmtleU5hbWVzKTsNCit9Ow0KKw0KK319DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9SZXNvdXJjZVN0cmluZy5jcHAgYi9sem1hL0NQUC9XaW5kb3dzL1Jlc291cmNlU3RyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjBlNzEzCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9SZXNvdXJjZVN0cmluZy5jcHAKQEAgLTAsMCArMSwxMDMgQEAKKy8vIFdpbmRvd3MvUmVzb3VyY2VTdHJpbmcuY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCisjaW5jbHVkZSAiLi4vQ29tbW9uL1N0cmluZ0NvbnZlcnQuaCINCisjZW5kaWYNCisNCisjaW5jbHVkZSAiUmVzb3VyY2VTdHJpbmcuaCINCisNCitleHRlcm4gSElOU1RBTkNFIGdfaEluc3RhbmNlOw0KKyNpZm5kZWYgX1VOSUNPREUNCitleHRlcm4gYm9vbCBnX0lzTlQ7DQorI2VuZGlmDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCisNCisjaWZuZGVmIF9VTklDT0RFDQorDQorc3RhdGljIENTeXNTdHJpbmcgTXlMb2FkU3RyaW5nQShISU5TVEFOQ0UgaEluc3RhbmNlLCBVSU5UIHJlc291cmNlSUQpDQorew0KKyAgQ1N5c1N0cmluZyBzOw0KKyAgaW50IHNpemUgPSAxMjg7DQorICBpbnQgbGVuOw0KKyAgZG8NCisgIHsNCisgICAgc2l6ZSA8PD0gMTsNCisgICAgbGVuID0gOjpMb2FkU3RyaW5nKGhJbnN0YW5jZSwgcmVzb3VyY2VJRCwgcy5HZXRCdWZmZXIoc2l6ZSAtIDEpLCBzaXplKTsNCisgIH0NCisgIHdoaWxlIChzaXplIC0gbGVuIDw9IDEpOw0KKyAgcy5SZWxlYXNlQnVmZmVyKCk7DQorICByZXR1cm4gczsNCit9DQorDQorI2VuZGlmDQorDQorc3RhdGljIGNvbnN0IGludCBrU3RhcnRTaXplID0gMjU2Ow0KKw0KK3N0YXRpYyB2b2lkIE15TG9hZFN0cmluZzIoSElOU1RBTkNFIGhJbnN0YW5jZSwgVUlOVCByZXNvdXJjZUlELCBVU3RyaW5nICZzKQ0KK3sNCisgIGludCBzaXplID0ga1N0YXJ0U2l6ZTsNCisgIGludCBsZW47DQorICBkbw0KKyAgew0KKyAgICBzaXplIDw8PSAxOw0KKyAgICBsZW4gPSA6OkxvYWRTdHJpbmdXKGhJbnN0YW5jZSwgcmVzb3VyY2VJRCwgcy5HZXRCdWZmZXIoc2l6ZSAtIDEpLCBzaXplKTsNCisgIH0NCisgIHdoaWxlIChzaXplIC0gbGVuIDw9IDEpOw0KKyAgcy5SZWxlYXNlQnVmZmVyKCk7DQorfQ0KKw0KKy8vIE5UNCBkb2Vzbid0IHN1cHBvcnQgTG9hZFN0cmluZ1coLCwsIDApIHRvIGdldCBwb2ludGVyIHRvIHJlc291cmNlIHN0cmluZy4gU28gd2UgZG9uJ3QgdXNlIGl0Lg0KKw0KK1VTdHJpbmcgTXlMb2FkU3RyaW5nKFVJTlQgcmVzb3VyY2VJRCkNCit7DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBpZiAoIWdfSXNOVCkNCisgICAgcmV0dXJuIEdldFVuaWNvZGVTdHJpbmcoTXlMb2FkU3RyaW5nQShnX2hJbnN0YW5jZSwgcmVzb3VyY2VJRCkpOw0KKyAgZWxzZQ0KKyAgI2VuZGlmDQorICB7DQorICAgIHsNCisgICAgICB3Y2hhcl90IHNba1N0YXJ0U2l6ZV07DQorICAgICAgc1swXSA9IDA7DQorICAgICAgaW50IGxlbiA9IDo6TG9hZFN0cmluZ1coZ19oSW5zdGFuY2UsIHJlc291cmNlSUQsIHMsIGtTdGFydFNpemUpOw0KKyAgICAgIGlmIChrU3RhcnRTaXplIC0gbGVuID4gMSkNCisgICAgICAgIHJldHVybiBzOw0KKyAgICB9DQorICAgIFVTdHJpbmcgZGVzdDsNCisgICAgTXlMb2FkU3RyaW5nMihnX2hJbnN0YW5jZSwgcmVzb3VyY2VJRCwgZGVzdCk7DQorICAgIHJldHVybiBkZXN0Ow0KKyAgfQ0KK30NCisNCit2b2lkIE15TG9hZFN0cmluZyhISU5TVEFOQ0UgaEluc3RhbmNlLCBVSU5UIHJlc291cmNlSUQsIFVTdHJpbmcgJmRlc3QpDQorew0KKyAgZGVzdC5FbXB0eSgpOw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICAgIE11bHRpQnl0ZVRvVW5pY29kZVN0cmluZzIoZGVzdCwgTXlMb2FkU3RyaW5nQShoSW5zdGFuY2UsIHJlc291cmNlSUQpKTsNCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICB7DQorICAgICAgd2NoYXJfdCBzW2tTdGFydFNpemVdOw0KKyAgICAgIHNbMF0gPSAwOw0KKyAgICAgIGludCBsZW4gPSA6OkxvYWRTdHJpbmdXKGhJbnN0YW5jZSwgcmVzb3VyY2VJRCwgcywga1N0YXJ0U2l6ZSk7DQorICAgICAgaWYgKGtTdGFydFNpemUgLSBsZW4gPiAxKQ0KKyAgICAgIHsNCisgICAgICAgIGRlc3QgPSBzOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBNeUxvYWRTdHJpbmcyKGhJbnN0YW5jZSwgcmVzb3VyY2VJRCwgZGVzdCk7DQorICB9DQorfQ0KKw0KK3ZvaWQgTXlMb2FkU3RyaW5nKFVJTlQgcmVzb3VyY2VJRCwgVVN0cmluZyAmZGVzdCkNCit7DQorICBNeUxvYWRTdHJpbmcoZ19oSW5zdGFuY2UsIHJlc291cmNlSUQsIGRlc3QpOw0KK30NCisNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9SZXNvdXJjZVN0cmluZy5oIGIvbHptYS9DUFAvV2luZG93cy9SZXNvdXJjZVN0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYWVmNGIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL1Jlc291cmNlU3RyaW5nLmgKQEAgLTAsMCArMSwxNiBAQAorLy8gV2luZG93cy9SZXNvdXJjZVN0cmluZy5oDQorDQorI2lmbmRlZiBfX1dJTkRPV1NfUkVTT1VSQ0VfU1RSSU5HX0gNCisjZGVmaW5lIF9fV0lORE9XU19SRVNPVVJDRV9TVFJJTkdfSA0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlTdHJpbmcuaCINCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KKw0KK1VTdHJpbmcgTXlMb2FkU3RyaW5nKFVJTlQgcmVzb3VyY2VJRCk7DQordm9pZCBNeUxvYWRTdHJpbmcoSElOU1RBTkNFIGhJbnN0YW5jZSwgVUlOVCByZXNvdXJjZUlELCBVU3RyaW5nICZkZXN0KTsNCit2b2lkIE15TG9hZFN0cmluZyhVSU5UIHJlc291cmNlSUQsIFVTdHJpbmcgJmRlc3QpOw0KKw0KK30NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL1NlY3VyaXR5VXRpbHMuY3BwIGIvbHptYS9DUFAvV2luZG93cy9TZWN1cml0eVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWVmMzJjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9TZWN1cml0eVV0aWxzLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLy8gV2luZG93cy9TZWN1cml0eVV0aWxzLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiU2VjdXJpdHlVdGlscy5oIg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorbmFtZXNwYWNlIE5TZWN1cml0eSB7DQorDQorLyoNCitib29sIE15TG9va3VwQWNjb3VudFNpZChMUENUU1RSIHN5c3RlbU5hbWUsIFBTSUQgc2lkLA0KKyAgQ1N5c1N0cmluZyAmYWNjb3VudE5hbWUsIENTeXNTdHJpbmcgJmRvbWFpbk5hbWUsIFBTSURfTkFNRV9VU0Ugc2lkTmFtZVVzZSkNCit7DQorICBEV09SRCBhY2NvdW50TmFtZVNpemUgPSAwLCBkb21haW5OYW1lU2l6ZSA9IDA7DQorDQorICBpZiAoITo6TG9va3VwQWNjb3VudFNpZChzeXN0ZW1OYW1lLCBzaWQsDQorICAgICAgYWNjb3VudE5hbWUuR2V0QnVmZmVyKDApLCAmYWNjb3VudE5hbWVTaXplLA0KKyAgICAgIGRvbWFpbk5hbWUuR2V0QnVmZmVyKDApLCAmZG9tYWluTmFtZVNpemUsIHNpZE5hbWVVc2UpKQ0KKyAgew0KKyAgICBpZiAoOjpHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIGJvb2wgcmVzdWx0ID0gQk9PTFRvQm9vbCg6Okxvb2t1cEFjY291bnRTaWQoc3lzdGVtTmFtZSwgc2lkLA0KKyAgICAgIGFjY291bnROYW1lLkdldEJ1ZmZlcihhY2NvdW50TmFtZVNpemUpLCAmYWNjb3VudE5hbWVTaXplLA0KKyAgICAgIGRvbWFpbk5hbWUuR2V0QnVmZmVyKGRvbWFpbk5hbWVTaXplKSwgJmRvbWFpbk5hbWVTaXplLCBzaWROYW1lVXNlKSk7DQorICBhY2NvdW50TmFtZS5SZWxlYXNlQnVmZmVyKCk7DQorICBkb21haW5OYW1lLlJlbGVhc2VCdWZmZXIoKTsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKyovDQorICANCitzdGF0aWMgdm9pZCBTZXRMc2FTdHJpbmcoTFBXU1RSIHNyYywgUExTQV9VTklDT0RFX1NUUklORyBkZXN0KQ0KK3sNCisgIGludCBsZW4gPSAoaW50KXdjc2xlbihzcmMpOw0KKyAgZGVzdC0+TGVuZ3RoID0gKFVTSE9SVCkobGVuICogc2l6ZW9mKFdDSEFSKSk7DQorICBkZXN0LT5NYXhpbXVtTGVuZ3RoID0gKFVTSE9SVCkoKGxlbiArIDEpICogc2l6ZW9mKFdDSEFSKSk7DQorICBkZXN0LT5CdWZmZXIgPSBzcmM7DQorfQ0KKw0KKy8qDQorc3RhdGljIHZvaWQgTXlMb29rdXBTaWRzKENQb2xpY3kgJnBvbGljeSwgUFNJRCBwcykNCit7DQorICBMU0FfUkVGRVJFTkNFRF9ET01BSU5fTElTVCAqcmVmZXJlbmNlZERvbWFpbnMgPSBOVUxMOw0KKyAgTFNBX1RSQU5TTEFURURfTkFNRSAqbmFtZXMgPSBOVUxMOw0KKyAgTlRTVEFUVVMgbnRzID0gcG9saWN5Lkxvb2t1cFNpZHMoMSwgJnBzLCAmcmVmZXJlbmNlZERvbWFpbnMsICZuYW1lcyk7DQorICBpbnQgcmVzID0gTHNhTnRTdGF0dXNUb1dpbkVycm9yKG50cyk7DQorICBMc2FGcmVlTWVtb3J5KHJlZmVyZW5jZWREb21haW5zKTsNCisgIExzYUZyZWVNZW1vcnkobmFtZXMpOw0KK30NCisqLw0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIExvb2t1cEFjY291bnROYW1lV1ApKA0KKyAgICBMUENXU1RSIGxwU3lzdGVtTmFtZSwNCisgICAgTFBDV1NUUiBscEFjY291bnROYW1lLA0KKyAgICBQU0lEIFNpZCwNCisgICAgTFBEV09SRCBjYlNpZCwNCisgICAgTFBXU1RSIFJlZmVyZW5jZWREb21haW5OYW1lLA0KKyAgICBMUERXT1JEIGNjaFJlZmVyZW5jZWREb21haW5OYW1lLA0KKyAgICBQU0lEX05BTUVfVVNFIHBlVXNlDQorICAgICk7DQorI2VuZGlmDQorDQorc3RhdGljIFBTSUQgR2V0U2lkKExQV1NUUiBhY2NvdW50TmFtZSkNCit7DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBITU9EVUxFIGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUoVEVYVCgiQWR2YXBpMzIuZGxsIikpOw0KKyAgaWYgKGhNb2R1bGUgPT0gTlVMTCkNCisgICAgcmV0dXJuIE5VTEw7DQorICBMb29rdXBBY2NvdW50TmFtZVdQIGxvb2t1cEFjY291bnROYW1lVyA9IChMb29rdXBBY2NvdW50TmFtZVdQKUdldFByb2NBZGRyZXNzKGhNb2R1bGUsICJMb29rdXBBY2NvdW50TmFtZVciKTsNCisgIGlmIChsb29rdXBBY2NvdW50TmFtZVcgPT0gTlVMTCkNCisgICAgcmV0dXJuIE5VTEw7DQorICAjZW5kaWYNCisNCisgIERXT1JEIHNpZExlbiA9IDAsIGRvbWFpbkxlbiA9IDA7DQorICBTSURfTkFNRV9VU0Ugc2lkTmFtZVVzZTsNCisgIGlmICghDQorICAgICNpZmRlZiBfVU5JQ09ERQ0KKyAgICA6Okxvb2t1cEFjY291bnROYW1lVw0KKyAgICAjZWxzZQ0KKyAgICBsb29rdXBBY2NvdW50TmFtZVcNCisgICAgI2VuZGlmDQorICAgIChOVUxMLCBhY2NvdW50TmFtZSwgTlVMTCwgJnNpZExlbiwgTlVMTCwgJmRvbWFpbkxlbiwgJnNpZE5hbWVVc2UpKQ0KKyAgew0KKyAgICBpZiAoOjpHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKQ0KKyAgICB7DQorICAgICAgUFNJRCBwU2lkID0gOjpIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2lkTGVuKTsNCisgICAgICBMUFdTVFIgZG9tYWluTmFtZSA9IChMUFdTVFIpOjpIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgKGRvbWFpbkxlbiArIDEpICogc2l6ZW9mKFdDSEFSKSk7DQorICAgICAgQk9PTCByZXMgPQ0KKyAgICAgICAgI2lmZGVmIF9VTklDT0RFDQorICAgICAgICA6Okxvb2t1cEFjY291bnROYW1lVw0KKyAgICAgICAgI2Vsc2UNCisgICAgICAgIGxvb2t1cEFjY291bnROYW1lVw0KKyAgICAgICAgI2VuZGlmDQorICAgICAgICAoTlVMTCwgYWNjb3VudE5hbWUsIHBTaWQsICZzaWRMZW4sIGRvbWFpbk5hbWUsICZkb21haW5MZW4sICZzaWROYW1lVXNlKTsNCisgICAgICA6OkhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRvbWFpbk5hbWUpOw0KKyAgICAgIGlmIChyZXMpDQorICAgICAgICByZXR1cm4gcFNpZDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KKw0KKyNkZWZpbmUgTVlfX1NFX0xPQ0tfTUVNT1JZX05BTUUgTCJTZUxvY2tNZW1vcnlQcml2aWxlZ2UiDQorDQorYm9vbCBBZGRMb2NrTWVtb3J5UHJpdmlsZWdlKCkNCit7DQorICBDUG9saWN5IHBvbGljeTsNCisgIExTQV9PQkpFQ1RfQVRUUklCVVRFUyBhdHRyOw0KKyAgYXR0ci5MZW5ndGggPSBzaXplb2YoYXR0cik7DQorICBhdHRyLlJvb3REaXJlY3RvcnkgPSBOVUxMOw0KKyAgYXR0ci5PYmplY3ROYW1lICA9IE5VTEw7DQorICBhdHRyLkF0dHJpYnV0ZXMgPSAwOw0KKyAgYXR0ci5TZWN1cml0eURlc2NyaXB0b3IgPSBOVUxMOw0KKyAgYXR0ci5TZWN1cml0eVF1YWxpdHlPZlNlcnZpY2UgID0gTlVMTDsNCisgIGlmIChwb2xpY3kuT3BlbihOVUxMLCAmYXR0ciwNCisgICAgICAvLyBHRU5FUklDX1dSSVRFKQ0KKyAgICAgIFBPTElDWV9BTExfQUNDRVNTKQ0KKyAgICAgIC8vIFNUQU5EQVJEX1JJR0hUU19SRVFVSVJFRCwNCisgICAgICAvLyBHRU5FUklDX1JFQUQgfCBHRU5FUklDX0VYRUNVVEUgfCBQT0xJQ1lfVklFV19MT0NBTF9JTkZPUk1BVElPTiB8IFBPTElDWV9MT09LVVBfTkFNRVMpDQorICAgICAgIT0gMCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgTFNBX1VOSUNPREVfU1RSSU5HIHVzZXJSaWdodHM7DQorICB3Y2hhcl90IHNbMTI4XSA9IE1ZX19TRV9MT0NLX01FTU9SWV9OQU1FOw0KKyAgU2V0THNhU3RyaW5nKHMsICZ1c2VyUmlnaHRzKTsNCisgIFdDSEFSIHVzZXJOYW1lWzI1NiArIDJdOw0KKyAgRFdPUkQgc2l6ZSA9IDI1NjsNCisgIGlmICghR2V0VXNlck5hbWVXKHVzZXJOYW1lLCAmc2l6ZSkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIFBTSUQgcHNpZCA9IEdldFNpZCh1c2VyTmFtZSk7DQorICBpZiAocHNpZCA9PSBOVUxMKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBib29sIHJlcyA9IGZhbHNlOw0KKw0KKyAgLyoNCisgIFBMU0FfVU5JQ09ERV9TVFJJTkcgdXNlclJpZ2h0c0FycmF5Ow0KKyAgVUxPTkcgY291bnRPZlJpZ2h0czsNCisgIE5UU1RBVFVTIHN0YXR1cyA9IHBvbGljeS5FbnVtZXJhdGVBY2NvdW50UmlnaHRzKHBzaWQsICZ1c2VyUmlnaHRzQXJyYXksICZjb3VudE9mUmlnaHRzKTsNCisgIGlmIChzdGF0dXMgIT0gMCkNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgYm9vbCBmaW5kZWQgPSBmYWxzZTsNCisgIGZvciAoVUxPTkcgaSA9IDA7IGkgPCBjb3VudE9mUmlnaHRzOyBpKyspDQorICB7DQorICAgIExTQV9VTklDT0RFX1NUUklORyAmdXIgPSB1c2VyUmlnaHRzQXJyYXlbaV07DQorICAgIGlmICh1ci5MZW5ndGggIT0gcy5MZW5ndGgoKSAqIHNpemVvZihXQ0hBUikpDQorICAgICAgY29udGludWU7DQorICAgIGlmICh3Y3NuY21wKHVyLkJ1ZmZlciwgcywgcy5MZW5ndGgoKSkgIT0gMCkNCisgICAgICBjb250aW51ZTsNCisgICAgZmluZGVkID0gdHJ1ZTsNCisgICAgcmVzID0gdHJ1ZTsNCisgICAgYnJlYWs7DQorICB9DQorICBpZiAoIWZpbmRlZCkNCisgICovDQorICB7DQorICAgIC8qDQorICAgIExTQV9FTlVNRVJBVElPTl9JTkZPUk1BVElPTiAqZW51bXM7DQorICAgIFVMT05HIGNvdW50UmV0dXJuZWQ7DQorICAgIE5UU1RBVFVTIHN0YXR1cyA9IHBvbGljeS5FbnVtZXJhdGVBY2NvdW50c1dpdGhVc2VyUmlnaHQoJnVzZXJSaWdodHMsICZlbnVtcywgJmNvdW50UmV0dXJuZWQpOw0KKyAgICBpZiAoc3RhdHVzID09IDApDQorICAgIHsNCisgICAgICBmb3IgKFVMT05HIGkgPSAwOyBpIDwgY291bnRSZXR1cm5lZDsgaSsrKQ0KKyAgICAgICAgTXlMb29rdXBTaWRzKHBvbGljeSwgZW51bXNbaV0uU2lkKTsNCisgICAgICBpZiAoZW51bXMpDQorICAgICAgICA6OkxzYUZyZWVNZW1vcnkoZW51bXMpOw0KKyAgICAgIHJlcyA9IHRydWU7DQorICAgIH0NCisgICAgKi8NCisgICAgTlRTVEFUVVMgc3RhdHVzID0gcG9saWN5LkFkZEFjY291bnRSaWdodHMocHNpZCwgJnVzZXJSaWdodHMpOw0KKyAgICBpZiAoc3RhdHVzID09IDApDQorICAgICAgcmVzID0gdHJ1ZTsNCisgICAgLy8gVUxPTkcgcmVzID0gTHNhTnRTdGF0dXNUb1dpbkVycm9yKHN0YXR1cyk7DQorICB9DQorICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwc2lkKTsNCisgIHJldHVybiByZXM7DQorfQ0KKw0KK319DQorDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9TZWN1cml0eVV0aWxzLmggYi9sem1hL0NQUC9XaW5kb3dzL1NlY3VyaXR5VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmI2NjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9TZWN1cml0eVV0aWxzLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8vIFdpbmRvd3MvU2VjdXJpdHlVdGlscy5oDQorDQorI2lmbmRlZiBfX1dJTkRPV1NfU0VDVVJJVFlfVVRJTFNfSA0KKyNkZWZpbmUgX19XSU5ET1dTX1NFQ1VSSVRZX1VUSUxTX0gNCisNCisjaW5jbHVkZSA8TlRTZWNBUEkuaD4NCisNCisjaW5jbHVkZSAiRGVmcy5oIg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorbmFtZXNwYWNlIE5TZWN1cml0eSB7DQorDQorY2xhc3MgQ0FjY2Vzc1Rva2VuDQorew0KKyAgSEFORExFIF9oYW5kbGU7DQorcHVibGljOg0KKyAgQ0FjY2Vzc1Rva2VuKCk6IF9oYW5kbGUoTlVMTCkge307DQorICB+Q0FjY2Vzc1Rva2VuKCkgeyBDbG9zZSgpOyB9DQorICBib29sIENsb3NlKCkNCisgIHsNCisgICAgaWYgKF9oYW5kbGUgPT0gTlVMTCkNCisgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgYm9vbCByZXMgPSBCT09MVG9Cb29sKDo6Q2xvc2VIYW5kbGUoX2hhbmRsZSkpOw0KKyAgICBpZiAocmVzKQ0KKyAgICAgIF9oYW5kbGUgPSBOVUxMOw0KKyAgICByZXR1cm4gcmVzOw0KKyAgfQ0KKw0KKyAgYm9vbCBPcGVuUHJvY2Vzc1Rva2VuKEhBTkRMRSBwcm9jZXNzSGFuZGxlLCBEV09SRCBkZXNpcmVkQWNjZXNzKQ0KKyAgew0KKyAgICBDbG9zZSgpOw0KKyAgICByZXR1cm4gQk9PTFRvQm9vbCg6Ok9wZW5Qcm9jZXNzVG9rZW4ocHJvY2Vzc0hhbmRsZSwgZGVzaXJlZEFjY2VzcywgJl9oYW5kbGUpKTsNCisgIH0NCisNCisgIC8qDQorICBib29sIE9wZW5UaHJlYWRUb2tlbihIQU5ETEUgdGhyZWFkSGFuZGxlLCBEV09SRCBkZXNpcmVkQWNjZXNzLCBib29sIG9wZW5Bc1NlbGYpDQorICB7DQorICAgIENsb3NlKCk7DQorICAgIHJldHVybiBCT09MVG9Cb29sKDo6T3BlblRyZWFkVG9rZW4odGhyZWFkSGFuZGxlLCBkZXNpcmVkQWNjZXNzLCBCb29sVG9CT09MKGFuT3BlbkFzU2VsZiksICZfaGFuZGxlKSk7DQorICB9DQorICAqLw0KKw0KKyAgYm9vbCBBZGp1c3RQcml2aWxlZ2VzKGJvb2wgZGlzYWJsZUFsbFByaXZpbGVnZXMsIFBUT0tFTl9QUklWSUxFR0VTIG5ld1N0YXRlLA0KKyAgICAgIERXT1JEIGJ1ZmZlckxlbmd0aCwgUFRPS0VOX1BSSVZJTEVHRVMgcHJldmlvdXNTdGF0ZSwgUERXT1JEIHJldHVybkxlbmd0aCkNCisgICAgeyByZXR1cm4gQk9PTFRvQm9vbCg6OkFkanVzdFRva2VuUHJpdmlsZWdlcyhfaGFuZGxlLCBCb29sVG9CT09MKGRpc2FibGVBbGxQcml2aWxlZ2VzKSwNCisgICAgICBuZXdTdGF0ZSwgYnVmZmVyTGVuZ3RoLCBwcmV2aW91c1N0YXRlLCByZXR1cm5MZW5ndGgpKTsgfQ0KKyAgDQorICBib29sIEFkanVzdFByaXZpbGVnZXMoYm9vbCBkaXNhYmxlQWxsUHJpdmlsZWdlcywgUFRPS0VOX1BSSVZJTEVHRVMgbmV3U3RhdGUpDQorICAgIHsgcmV0dXJuIEFkanVzdFByaXZpbGVnZXMoZGlzYWJsZUFsbFByaXZpbGVnZXMsIG5ld1N0YXRlLCAwLCBOVUxMLCBOVUxMKTsgfQ0KKyAgDQorICBib29sIEFkanVzdFByaXZpbGVnZXMoUFRPS0VOX1BSSVZJTEVHRVMgbmV3U3RhdGUpDQorICAgIHsgcmV0dXJuIEFkanVzdFByaXZpbGVnZXMoZmFsc2UsIG5ld1N0YXRlKTsgfQ0KKw0KK307DQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KK3R5cGVkZWYgTlRTVEFUVVMgKE5UQVBJICpMc2FPcGVuUG9saWN5UCkoUExTQV9VTklDT0RFX1NUUklORyBTeXN0ZW1OYW1lLA0KKyAgICBQTFNBX09CSkVDVF9BVFRSSUJVVEVTIE9iamVjdEF0dHJpYnV0ZXMsIEFDQ0VTU19NQVNLIERlc2lyZWRBY2Nlc3MsIFBMU0FfSEFORExFIFBvbGljeUhhbmRsZSk7DQordHlwZWRlZiBOVFNUQVRVUyAoTlRBUEkgKkxzYUNsb3NlUCkoTFNBX0hBTkRMRSBPYmplY3RIYW5kbGUpOw0KK3R5cGVkZWYgTlRTVEFUVVMgKE5UQVBJICpMc2FBZGRBY2NvdW50UmlnaHRzUCkoTFNBX0hBTkRMRSBQb2xpY3lIYW5kbGUsDQorICAgIFBTSUQgQWNjb3VudFNpZCwgUExTQV9VTklDT0RFX1NUUklORyBVc2VyUmlnaHRzLCBVTE9ORyBDb3VudE9mUmlnaHRzICk7DQorI2RlZmluZSBNWV9TVEFUVVNfTk9UX0lNUExFTUVOVEVEICAgICAgICAgICAoKE5UU1RBVFVTKTB4QzAwMDAwMDJMKQ0KKyNlbmRpZg0KKw0KK3N0cnVjdCBDUG9saWN5DQorew0KK3Byb3RlY3RlZDoNCisgIExTQV9IQU5ETEUgX2hhbmRsZTsNCisgICNpZm5kZWYgX1VOSUNPREUNCisgIEhNT0RVTEUgaE1vZHVsZTsNCisgICNlbmRpZg0KK3B1YmxpYzoNCisgIG9wZXJhdG9yIExTQV9IQU5ETEUoKSBjb25zdCB7IHJldHVybiBfaGFuZGxlOyB9DQorICBDUG9saWN5KCk6IF9oYW5kbGUoTlVMTCkNCisgIHsNCisgICAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgICBoTW9kdWxlID0gR2V0TW9kdWxlSGFuZGxlKFRFWFQoIkFkdmFwaTMyLmRsbCIpKTsNCisgICAgI2VuZGlmDQorICB9Ow0KKyAgfkNQb2xpY3koKSB7IENsb3NlKCk7IH0NCisNCisgIE5UU1RBVFVTIE9wZW4oUExTQV9VTklDT0RFX1NUUklORyBzeXN0ZW1OYW1lLCBQTFNBX09CSkVDVF9BVFRSSUJVVEVTIG9iamVjdEF0dHJpYnV0ZXMsDQorICAgICAgQUNDRVNTX01BU0sgZGVzaXJlZEFjY2VzcykNCisgIHsNCisgICAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgICBpZiAoaE1vZHVsZSA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiBNWV9TVEFUVVNfTk9UX0lNUExFTUVOVEVEOw0KKyAgICBMc2FPcGVuUG9saWN5UCBsc2FPcGVuUG9saWN5ID0gKExzYU9wZW5Qb2xpY3lQKUdldFByb2NBZGRyZXNzKGhNb2R1bGUsICJMc2FPcGVuUG9saWN5Iik7DQorICAgIGlmIChsc2FPcGVuUG9saWN5ID09IE5VTEwpDQorICAgICAgcmV0dXJuIE1ZX1NUQVRVU19OT1RfSU1QTEVNRU5URUQ7DQorICAgICNlbmRpZg0KKw0KKyAgICBDbG9zZSgpOw0KKyAgICByZXR1cm4NCisgICAgICAjaWZkZWYgX1VOSUNPREUNCisgICAgICA6OkxzYU9wZW5Qb2xpY3kNCisgICAgICAjZWxzZQ0KKyAgICAgIGxzYU9wZW5Qb2xpY3kNCisgICAgICAjZW5kaWYNCisgICAgICAoc3lzdGVtTmFtZSwgb2JqZWN0QXR0cmlidXRlcywgZGVzaXJlZEFjY2VzcywgJl9oYW5kbGUpOw0KKyAgfQ0KKyAgDQorICBOVFNUQVRVUyBDbG9zZSgpDQorICB7DQorICAgIGlmIChfaGFuZGxlID09IE5VTEwpDQorICAgICAgcmV0dXJuIDA7DQorDQorICAgICNpZm5kZWYgX1VOSUNPREUNCisgICAgaWYgKGhNb2R1bGUgPT0gTlVMTCkNCisgICAgICByZXR1cm4gTVlfU1RBVFVTX05PVF9JTVBMRU1FTlRFRDsNCisgICAgTHNhQ2xvc2VQIGxzYUNsb3NlID0gKExzYUNsb3NlUClHZXRQcm9jQWRkcmVzcyhoTW9kdWxlLCAiTHNhQ2xvc2UiKTsNCisgICAgaWYgKGxzYUNsb3NlID09IE5VTEwpDQorICAgICAgcmV0dXJuIE1ZX1NUQVRVU19OT1RfSU1QTEVNRU5URUQ7DQorICAgICNlbmRpZg0KKw0KKyAgICBOVFNUQVRVUyByZXMgPQ0KKyAgICAgICNpZmRlZiBfVU5JQ09ERQ0KKyAgICAgIDo6THNhQ2xvc2UNCisgICAgICAjZWxzZQ0KKyAgICAgIGxzYUNsb3NlDQorICAgICAgI2VuZGlmDQorICAgICAgKF9oYW5kbGUpOw0KKyAgICBfaGFuZGxlID0gTlVMTDsNCisgICAgcmV0dXJuIHJlczsNCisgIH0NCisgIA0KKyAgTlRTVEFUVVMgRW51bWVyYXRlQWNjb3VudHNXaXRoVXNlclJpZ2h0KFBMU0FfVU5JQ09ERV9TVFJJTkcgdXNlclJpZ2h0cywNCisgICAgICBQTFNBX0VOVU1FUkFUSU9OX0lORk9STUFUSU9OICplbnVtZXJhdGlvbkJ1ZmZlciwgUFVMT05HIGNvdW50UmV0dXJuZWQpDQorICAgIHsgcmV0dXJuIExzYUVudW1lcmF0ZUFjY291bnRzV2l0aFVzZXJSaWdodChfaGFuZGxlLCB1c2VyUmlnaHRzLCAodm9pZCAqKillbnVtZXJhdGlvbkJ1ZmZlciwgY291bnRSZXR1cm5lZCk7IH0NCisNCisgIE5UU1RBVFVTIEVudW1lcmF0ZUFjY291bnRSaWdodHMoUFNJRCBzaWQsIFBMU0FfVU5JQ09ERV9TVFJJTkcqIHVzZXJSaWdodHMsIFBVTE9ORyBjb3VudE9mUmlnaHRzKQ0KKyAgICB7IHJldHVybiA6OkxzYUVudW1lcmF0ZUFjY291bnRSaWdodHMoX2hhbmRsZSwgc2lkLCB1c2VyUmlnaHRzLCBjb3VudE9mUmlnaHRzKTsgfQ0KKw0KKyAgTlRTVEFUVVMgTG9va3VwU2lkcyhVTE9ORyBjb3VudCwgUFNJRCogc2lkcywNCisgICAgICBQTFNBX1JFRkVSRU5DRURfRE9NQUlOX0xJU1QqIHJlZmVyZW5jZWREb21haW5zLCBQTFNBX1RSQU5TTEFURURfTkFNRSogbmFtZXMpDQorICAgIHsgcmV0dXJuIExzYUxvb2t1cFNpZHMoX2hhbmRsZSwgY291bnQsIHNpZHMsIHJlZmVyZW5jZWREb21haW5zLCBuYW1lcyk7IH0NCisNCisgIE5UU1RBVFVTIEFkZEFjY291bnRSaWdodHMoUFNJRCBhY2NvdW50U2lkLCBQTFNBX1VOSUNPREVfU1RSSU5HIHVzZXJSaWdodHMsIFVMT05HIGNvdW50T2ZSaWdodHMpDQorICB7DQorICAgICNpZm5kZWYgX1VOSUNPREUNCisgICAgaWYgKGhNb2R1bGUgPT0gTlVMTCkNCisgICAgICByZXR1cm4gTVlfU1RBVFVTX05PVF9JTVBMRU1FTlRFRDsNCisgICAgTHNhQWRkQWNjb3VudFJpZ2h0c1AgbHNhQWRkQWNjb3VudFJpZ2h0cyA9IChMc2FBZGRBY2NvdW50UmlnaHRzUClHZXRQcm9jQWRkcmVzcyhoTW9kdWxlLCAiTHNhQWRkQWNjb3VudFJpZ2h0cyIpOw0KKyAgICBpZiAobHNhQWRkQWNjb3VudFJpZ2h0cyA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiBNWV9TVEFUVVNfTk9UX0lNUExFTUVOVEVEOw0KKyAgICAjZW5kaWYNCisNCisgICAgcmV0dXJuDQorICAgICAgI2lmZGVmIF9VTklDT0RFDQorICAgICAgOjpMc2FBZGRBY2NvdW50UmlnaHRzDQorICAgICAgI2Vsc2UNCisgICAgICBsc2FBZGRBY2NvdW50UmlnaHRzDQorICAgICAgI2VuZGlmDQorICAgICAgKF9oYW5kbGUsIGFjY291bnRTaWQsIHVzZXJSaWdodHMsIGNvdW50T2ZSaWdodHMpOw0KKyAgfQ0KKyAgTlRTVEFUVVMgQWRkQWNjb3VudFJpZ2h0cyhQU0lEIGFjY291bnRTaWQsIFBMU0FfVU5JQ09ERV9TVFJJTkcgdXNlclJpZ2h0cykNCisgICAgeyByZXR1cm4gQWRkQWNjb3VudFJpZ2h0cyhhY2NvdW50U2lkLCB1c2VyUmlnaHRzLCAxKTsgfQ0KKw0KKyAgTlRTVEFUVVMgUmVtb3ZlQWNjb3VudFJpZ2h0cyhQU0lEIGFjY291bnRTaWQsIGJvb2wgYWxsUmlnaHRzLCBQTFNBX1VOSUNPREVfU1RSSU5HIHVzZXJSaWdodHMsIFVMT05HIGNvdW50T2ZSaWdodHMpDQorICAgIHsgcmV0dXJuIExzYVJlbW92ZUFjY291bnRSaWdodHMoX2hhbmRsZSwgYWNjb3VudFNpZCwgKEJPT0xFQU4pKGFsbFJpZ2h0cyA/IFRSVUUgOiBGQUxTRSksIHVzZXJSaWdodHMsIGNvdW50T2ZSaWdodHMpOyB9DQorfTsNCisNCitib29sIEFkZExvY2tNZW1vcnlQcml2aWxlZ2UoKTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvU2hlbGwuY3BwIGIvbHptYS9DUFAvV2luZG93cy9TaGVsbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkNjFhOQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvU2hlbGwuY3BwCkBAIC0wLDAgKzEsMzM0IEBACisvLyBXaW5kb3dzL1NoZWxsLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL015Q29tLmgiDQorI2lmbmRlZiBfVU5JQ09ERQ0KKyNpbmNsdWRlICIuLi9Db21tb24vU3RyaW5nQ29udmVydC5oIg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICJDT00uaCINCisjaW5jbHVkZSAiU2hlbGwuaCINCisNCisjaWZuZGVmIF9VTklDT0RFDQorZXh0ZXJuIGJvb2wgZ19Jc05UOw0KKyNlbmRpZg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorbmFtZXNwYWNlIE5TaGVsbCB7DQorDQorI2lmbmRlZiBVTkRFUl9DRQ0KKw0KKy8vIFNIR2V0TWFsbG9jIGlzIHVuc3VwcG9ydGVkIGluIFdpbmRvd3MgTW9iaWxlPw0KKw0KK3ZvaWQgQ0l0ZW1JRExpc3Q6OkZyZWUoKQ0KK3sNCisgIGlmIChtX09iamVjdCA9PSBOVUxMKQ0KKyAgICByZXR1cm47DQorICBDTXlDb21QdHI8SU1hbGxvYz4gc2hlbGxNYWxsb2M7DQorICBpZiAoOjpTSEdldE1hbGxvYygmc2hlbGxNYWxsb2MpICE9IE5PRVJST1IpDQorICAgIHRocm93IDQxMDk5Ow0KKyAgc2hlbGxNYWxsb2MtPkZyZWUobV9PYmplY3QpOw0KKyAgbV9PYmplY3QgPSBOVUxMOw0KK30NCisNCisvKg0KK0NJdGVtSURMaXN0OjooTFBDSVRFTUlETElTVCBpdGVtSURMaXN0KTogbV9PYmplY3QoTlVMTCkNCisgIHsgICp0aGlzID0gaXRlbUlETGlzdDsgfQ0KK0NJdGVtSURMaXN0OjooY29uc3QgQ0l0ZW1JRExpc3QmIGl0ZW1JRExpc3QpOiBtX09iamVjdChOVUxMKQ0KKyAgeyAgKnRoaXMgPSBpdGVtSURMaXN0OyB9DQorDQorQ0l0ZW1JRExpc3QmIENJdGVtSURMaXN0OjpvcGVyYXRvcj0oTFBDSVRFTUlETElTVCBvYmplY3QpDQorew0KKyAgRnJlZSgpOw0KKyAgaWYgKG9iamVjdCAhPSAwKQ0KKyAgew0KKyAgICBVSU5UMzIgc2l6ZSA9IEdldFNpemUob2JqZWN0KTsNCisgICAgbV9PYmplY3QgPSAoTFBJVEVNSURMSVNUKUNvVGFza01lbUFsbG9jKHNpemUpOw0KKyAgICBpZiAobV9PYmplY3QgIT0gTlVMTCkNCisgICAgICBNb3ZlTWVtb3J5KG1fT2JqZWN0LCBvYmplY3QsIHNpemUpOw0KKyAgfQ0KKyAgcmV0dXJuICp0aGlzOw0KK30NCisNCitDSXRlbUlETGlzdCYgQ0l0ZW1JRExpc3Q6Om9wZXJhdG9yPShjb25zdCBDSXRlbUlETGlzdCAmb2JqZWN0KQ0KK3sNCisgIEZyZWUoKTsNCisgIGlmIChvYmplY3QubV9PYmplY3QgIT0gTlVMTCkNCisgIHsNCisgICAgVUlOVDMyIHNpemUgPSBHZXRTaXplKG9iamVjdC5tX09iamVjdCk7DQorICAgIG1fT2JqZWN0ID0gKExQSVRFTUlETElTVClDb1Rhc2tNZW1BbGxvYyhzaXplKTsNCisgICAgaWYgKG1fT2JqZWN0ICE9IE5VTEwpDQorICAgICAgTW92ZU1lbW9yeShtX09iamVjdCwgb2JqZWN0Lm1fT2JqZWN0LCBzaXplKTsNCisgIH0NCisgIHJldHVybiAqdGhpczsNCit9DQorKi8NCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIENEcm9wDQorDQordm9pZCBDRHJvcDo6QXR0YWNoKEhEUk9QIG9iamVjdCkNCit7DQorICBGcmVlKCk7DQorICBtX09iamVjdCA9IG9iamVjdDsNCisgIG1fQXNzaWduZWQgPSB0cnVlOw0KK30NCisNCit2b2lkIENEcm9wOjpGcmVlKCkNCit7DQorICBpZiAobV9NdXN0QmVGaW5pc2hlZCAmJiBtX0Fzc2lnbmVkKQ0KKyAgICBGaW5pc2goKTsNCisgIG1fQXNzaWduZWQgPSBmYWxzZTsNCit9DQorDQorVUlOVCBDRHJvcDo6UXVlcnlDb3VudE9mRmlsZXMoKQ0KK3sNCisgIHJldHVybiBRdWVyeUZpbGUoMHhGRkZGRkZGRiwgKExQVFNUUilOVUxMLCAwKTsNCit9DQorDQorVVN0cmluZyBDRHJvcDo6UXVlcnlGaWxlTmFtZShVSU5UIGZpbGVJbmRleCkNCit7DQorICBVU3RyaW5nIGZpbGVOYW1lOw0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgaWYgKCFnX0lzTlQpDQorICB7DQorICAgIEFTdHJpbmcgZmlsZU5hbWVBOw0KKyAgICBVSU5UIGJ1ZmZlclNpemUgPSBRdWVyeUZpbGUoZmlsZUluZGV4LCAoTFBUU1RSKU5VTEwsIDApOw0KKyAgICBRdWVyeUZpbGUoZmlsZUluZGV4LCBmaWxlTmFtZUEuR2V0QnVmZmVyKGJ1ZmZlclNpemUgKyAyKSwgYnVmZmVyU2l6ZSArIDEpOw0KKyAgICBmaWxlTmFtZUEuUmVsZWFzZUJ1ZmZlcigpOw0KKyAgICBmaWxlTmFtZSA9IEdldFVuaWNvZGVTdHJpbmcoZmlsZU5hbWVBKTsNCisgIH0NCisgIGVsc2UNCisgICNlbmRpZg0KKyAgew0KKyAgICBVSU5UIGJ1ZmZlclNpemUgPSBRdWVyeUZpbGUoZmlsZUluZGV4LCAoTFBXU1RSKU5VTEwsIDApOw0KKyAgICBRdWVyeUZpbGUoZmlsZUluZGV4LCBmaWxlTmFtZS5HZXRCdWZmZXIoYnVmZmVyU2l6ZSArIDIpLCBidWZmZXJTaXplICsgMSk7DQorICAgIGZpbGVOYW1lLlJlbGVhc2VCdWZmZXIoKTsNCisgIH0NCisgIHJldHVybiBmaWxlTmFtZTsNCit9DQorDQordm9pZCBDRHJvcDo6UXVlcnlGaWxlTmFtZXMoVVN0cmluZ1ZlY3RvciAmZmlsZU5hbWVzKQ0KK3sNCisgIFVJTlQgbnVtRmlsZXMgPSBRdWVyeUNvdW50T2ZGaWxlcygpOw0KKyAgZmlsZU5hbWVzLkNsZWFyQW5kUmVzZXJ2ZShudW1GaWxlcyk7DQorICBmb3IgKFVJTlQgaSA9IDA7IGkgPCBudW1GaWxlczsgaSsrKQ0KKyAgICBmaWxlTmFtZXMuQWRkSW5SZXNlcnZlZChRdWVyeUZpbGVOYW1lKGkpKTsNCit9DQorDQorDQorYm9vbCBHZXRQYXRoRnJvbUlETGlzdChMUENJVEVNSURMSVNUIGl0ZW1JRExpc3QsIENTeXNTdHJpbmcgJnBhdGgpDQorew0KKyAgYm9vbCByZXN1bHQgPSBCT09MVG9Cb29sKDo6U0hHZXRQYXRoRnJvbUlETGlzdChpdGVtSURMaXN0LCBwYXRoLkdldEJ1ZmZlcihNQVhfUEFUSCAqIDIpKSk7DQorICBwYXRoLlJlbGVhc2VCdWZmZXIoKTsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KKw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBVTkRFUl9DRQ0KKw0KK2Jvb2wgQnJvd3NlRm9yRm9sZGVyKExQQlJPV1NFSU5GTywgQ1N5c1N0cmluZykNCit7DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wgQnJvd3NlRm9yRm9sZGVyKEhXTkQsIExQQ1RTVFIsIFVJTlQsIExQQ1RTVFIsIENTeXNTdHJpbmcgJikNCit7DQorICByZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wgQnJvd3NlRm9yRm9sZGVyKEhXTkQgLyogb3duZXIgKi8sIExQQ1RTVFIgLyogdGl0bGUgKi8sDQorICAgIExQQ1RTVFIgLyogaW5pdGlhbEZvbGRlciAqLywgQ1N5c1N0cmluZyAmIC8qIHJlc3VsdFBhdGggKi8pDQorew0KKyAgLyoNCisgIC8vIFNIQnJvd3NlRm9yRm9sZGVyIGRvZXNuJ3Qgd29yayBiZWZvcmUgQ0UgNi4wID8NCisgIGlmIChHZXRQcm9jQWRkcmVzcyhMb2FkTGlicmFyeShMImNlc2hlbGwuZGxsIiwgTCJTSEJyb3dzZUZvckZvbGRlciIpID09IDApDQorICAgIE1lc3NhZ2VCb3hXKDAsIEwibm8iLCBMIiIsIDApOw0KKyAgZWxzZQ0KKyAgICBNZXNzYWdlQm94VygwLCBMInllcyIsIEwiIiwgMCk7DQorICAqLw0KKyAgLyoNCisgIFVTdHJpbmcgcyA9IEwiYWxsIGZpbGVzIjsNCisgIHMgKz0gTCIgKCouKikiOw0KKyAgcmV0dXJuIE15R2V0T3BlbkZpbGVOYW1lKG93bmVyLCB0aXRsZSwgaW5pdGlhbEZvbGRlciwgcywgcmVzdWx0UGF0aCwgdHJ1ZSk7DQorICAqLw0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCisNCisjZWxzZQ0KKw0KK2Jvb2wgQnJvd3NlRm9yRm9sZGVyKExQQlJPV1NFSU5GTyBicm93c2VJbmZvLCBDU3lzU3RyaW5nICZyZXN1bHRQYXRoKQ0KK3sNCisgIE5XaW5kb3dzOjpOQ09NOjpDQ29tSW5pdGlhbGl6ZXIgY29tSW5pdGlhbGl6ZXI7DQorICBMUElURU1JRExJU1QgaXRlbUlETGlzdCA9IDo6U0hCcm93c2VGb3JGb2xkZXIoYnJvd3NlSW5mbyk7DQorICBpZiAoaXRlbUlETGlzdCA9PSBOVUxMKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBDSXRlbUlETGlzdCBpdGVtSURMaXN0SG9sZGVyOw0KKyAgaXRlbUlETGlzdEhvbGRlci5BdHRhY2goaXRlbUlETGlzdCk7DQorICByZXR1cm4gR2V0UGF0aEZyb21JRExpc3QoaXRlbUlETGlzdCwgcmVzdWx0UGF0aCk7DQorfQ0KKw0KKw0KK2ludCBDQUxMQkFDSyBCcm93c2VDYWxsYmFja1Byb2MoSFdORCBod25kLCBVSU5UIHVNc2csIExQQVJBTSAvKiBscCAqLywgTFBBUkFNIGRhdGEpDQorew0KKyAgI2lmbmRlZiBVTkRFUl9DRQ0KKyAgc3dpdGNoKHVNc2cpDQorICB7DQorICAgIGNhc2UgQkZGTV9JTklUSUFMSVpFRDoNCisgICAgew0KKyAgICAgIFNlbmRNZXNzYWdlKGh3bmQsIEJGRk1fU0VUU0VMRUNUSU9OLCBUUlVFLCBkYXRhKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICAvKg0KKyAgICBjYXNlIEJGRk1fU0VMQ0hBTkdFRDoNCisgICAgew0KKyAgICAgIFRDSEFSIGRpcltNQVhfUEFUSF07DQorICAgICAgaWYgKDo6U0hHZXRQYXRoRnJvbUlETGlzdCgoTFBJVEVNSURMSVNUKSBscCAsIGRpcikpDQorICAgICAgICBTZW5kTWVzc2FnZShod25kLCBCRkZNX1NFVFNUQVRVU1RFWFQsIDAsIChMUEFSQU0pZGlyKTsNCisgICAgICBlbHNlDQorICAgICAgICBTZW5kTWVzc2FnZShod25kLCBCRkZNX1NFVFNUQVRVU1RFWFQsIDAsIChMUEFSQU0pVEVYVCgiIikpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgICovDQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICAjZW5kaWYNCisgIHJldHVybiAwOw0KK30NCisNCisNCitib29sIEJyb3dzZUZvckZvbGRlcihIV05EIG93bmVyLCBMUENUU1RSIHRpdGxlLCBVSU5UIHVsRmxhZ3MsDQorICAgIExQQ1RTVFIgaW5pdGlhbEZvbGRlciwgQ1N5c1N0cmluZyAmcmVzdWx0UGF0aCkNCit7DQorICBDU3lzU3RyaW5nIGRpc3BsYXlOYW1lOw0KKyAgQlJPV1NFSU5GTyBicm93c2VJbmZvOw0KKyAgYnJvd3NlSW5mby5od25kT3duZXIgPSBvd25lcjsNCisgIGJyb3dzZUluZm8ucGlkbFJvb3QgPSBOVUxMOw0KKw0KKyAgLy8gdGhlcmUgYXJlIFVuaWNvZGUvYXN0cmluZyBwcm9ibGVtcyBpbiBXaW5DRSBTREshISENCisgICNpZmRlZiBVTkRFUl9DRQ0KKyAgYnJvd3NlSW5mby5wc3pEaXNwbGF5TmFtZSA9IChMUFNUUilkaXNwbGF5TmFtZS5HZXRCdWZmZXIoTUFYX1BBVEgpOw0KKyAgYnJvd3NlSW5mby5scHN6VGl0bGUgPSAoTFBDU1RSKXRpdGxlOw0KKyAgI2Vsc2UNCisgIGJyb3dzZUluZm8ucHN6RGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZS5HZXRCdWZmZXIoTUFYX1BBVEgpOw0KKyAgYnJvd3NlSW5mby5scHN6VGl0bGUgPSB0aXRsZTsNCisgICNlbmRpZg0KKyAgYnJvd3NlSW5mby51bEZsYWdzID0gdWxGbGFnczsNCisgIGJyb3dzZUluZm8ubHBmbiA9IChpbml0aWFsRm9sZGVyICE9IE5VTEwpID8gQnJvd3NlQ2FsbGJhY2tQcm9jIDogTlVMTDsNCisgIGJyb3dzZUluZm8ubFBhcmFtID0gKExQQVJBTSlpbml0aWFsRm9sZGVyOw0KKyAgcmV0dXJuIEJyb3dzZUZvckZvbGRlcigmYnJvd3NlSW5mbywgcmVzdWx0UGF0aCk7DQorfQ0KKw0KK2Jvb2wgQnJvd3NlRm9yRm9sZGVyKEhXTkQgb3duZXIsIExQQ1RTVFIgdGl0bGUsDQorICAgIExQQ1RTVFIgaW5pdGlhbEZvbGRlciwgQ1N5c1N0cmluZyAmcmVzdWx0UGF0aCkNCit7DQorICByZXR1cm4gQnJvd3NlRm9yRm9sZGVyKG93bmVyLCB0aXRsZSwNCisgICAgICAjaWZuZGVmIFVOREVSX0NFDQorICAgICAgQklGX05FV0RJQUxPR1NUWUxFIHwNCisgICAgICAjZW5kaWYNCisgICAgICBCSUZfUkVUVVJOT05MWUZTRElSUyB8IEJJRl9TVEFUVVNURVhULCBpbml0aWFsRm9sZGVyLCByZXN1bHRQYXRoKTsNCisgIC8vIEJJRl9TVEFUVVNURVhUOyBCSUZfVVNFTkVXVUkgICAoVmVyc2lvbiA1LjApDQorfQ0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCisNCit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFNIR2V0UGF0aEZyb21JRExpc3RXUCkoTFBDSVRFTUlETElTVCBwaWRsLCBMUFdTVFIgcHN6UGF0aCk7DQorDQorYm9vbCBHZXRQYXRoRnJvbUlETGlzdChMUENJVEVNSURMSVNUIGl0ZW1JRExpc3QsIFVTdHJpbmcgJnBhdGgpDQorew0KKyAgcGF0aC5FbXB0eSgpOw0KKyAgU0hHZXRQYXRoRnJvbUlETGlzdFdQIHNoR2V0UGF0aEZyb21JRExpc3RXID0gKFNIR2V0UGF0aEZyb21JRExpc3RXUCkNCisgICAgOjpHZXRQcm9jQWRkcmVzcyg6OkdldE1vZHVsZUhhbmRsZVcoTCJzaGVsbDMyLmRsbCIpLCAiU0hHZXRQYXRoRnJvbUlETGlzdFciKTsNCisgIGlmIChzaEdldFBhdGhGcm9tSURMaXN0VyA9PSAwKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBib29sIHJlc3VsdCA9IEJPT0xUb0Jvb2woc2hHZXRQYXRoRnJvbUlETGlzdFcoaXRlbUlETGlzdCwgcGF0aC5HZXRCdWZmZXIoTUFYX1BBVEggKiAyKSkpOw0KKyAgcGF0aC5SZWxlYXNlQnVmZmVyKCk7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisNCit0eXBlZGVmIExQSVRFTUlETElTVCAoV0lOQVBJICogU0hCcm93c2VGb3JGb2xkZXJXUCkoTFBCUk9XU0VJTkZPVyBscGJpKTsNCisNCitib29sIEJyb3dzZUZvckZvbGRlcihMUEJST1dTRUlORk9XIGJyb3dzZUluZm8sIFVTdHJpbmcgJnJlc3VsdFBhdGgpDQorew0KKyAgTldpbmRvd3M6Ok5DT006OkNDb21Jbml0aWFsaXplciBjb21Jbml0aWFsaXplcjsNCisgIFNIQnJvd3NlRm9yRm9sZGVyV1Agc2hCcm93c2VGb3JGb2xkZXJXID0gKFNIQnJvd3NlRm9yRm9sZGVyV1ApDQorICAgIDo6R2V0UHJvY0FkZHJlc3MoOjpHZXRNb2R1bGVIYW5kbGVXKEwic2hlbGwzMi5kbGwiKSwgIlNIQnJvd3NlRm9yRm9sZGVyVyIpOw0KKyAgaWYgKHNoQnJvd3NlRm9yRm9sZGVyVyA9PSAwKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICBMUElURU1JRExJU1QgaXRlbUlETGlzdCA9IHNoQnJvd3NlRm9yRm9sZGVyVyhicm93c2VJbmZvKTsNCisgIGlmIChpdGVtSURMaXN0ID09IE5VTEwpDQorICAgIHJldHVybiBmYWxzZTsNCisgIENJdGVtSURMaXN0IGl0ZW1JRExpc3RIb2xkZXI7DQorICBpdGVtSURMaXN0SG9sZGVyLkF0dGFjaChpdGVtSURMaXN0KTsNCisgIHJldHVybiBHZXRQYXRoRnJvbUlETGlzdChpdGVtSURMaXN0LCByZXN1bHRQYXRoKTsNCit9DQorDQorDQoraW50IENBTExCQUNLIEJyb3dzZUNhbGxiYWNrUHJvYzIoSFdORCBod25kLCBVSU5UIHVNc2csIExQQVJBTSAvKiBscCAqLywgTFBBUkFNIGRhdGEpDQorew0KKyAgc3dpdGNoKHVNc2cpDQorICB7DQorICAgIGNhc2UgQkZGTV9JTklUSUFMSVpFRDoNCisgICAgew0KKyAgICAgIFNlbmRNZXNzYWdlVyhod25kLCBCRkZNX1NFVFNFTEVDVElPTlcsIFRSVUUsIGRhdGEpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIC8qDQorICAgIGNhc2UgQkZGTV9TRUxDSEFOR0VEOg0KKyAgICB7DQorICAgICAgd2NoYXJfdCBkaXJbTUFYX1BBVEggKiAyXTsNCisNCisgICAgICBpZiAoc2hHZXRQYXRoRnJvbUlETGlzdFcoKExQSVRFTUlETElTVClscCAsIGRpcikpDQorICAgICAgICBTZW5kTWVzc2FnZVcoaHduZCwgQkZGTV9TRVRTVEFUVVNURVhUVywgMCwgKExQQVJBTSlkaXIpOw0KKyAgICAgIGVsc2UNCisgICAgICAgIFNlbmRNZXNzYWdlVyhod25kLCBCRkZNX1NFVFNUQVRVU1RFWFRXLCAwLCAoTFBBUkFNKUwiIik7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgKi8NCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCisNCitzdGF0aWMgYm9vbCBCcm93c2VGb3JGb2xkZXIoSFdORCBvd25lciwgTFBDV1NUUiB0aXRsZSwgVUlOVCB1bEZsYWdzLA0KKyAgICBMUENXU1RSIGluaXRpYWxGb2xkZXIsIFVTdHJpbmcgJnJlc3VsdFBhdGgpDQorew0KKyAgVVN0cmluZyBkaXNwbGF5TmFtZTsNCisgIEJST1dTRUlORk9XIGJyb3dzZUluZm87DQorICBicm93c2VJbmZvLmh3bmRPd25lciA9IG93bmVyOw0KKyAgYnJvd3NlSW5mby5waWRsUm9vdCA9IE5VTEw7DQorICBicm93c2VJbmZvLnBzekRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWUuR2V0QnVmZmVyKE1BWF9QQVRIKTsNCisgIGJyb3dzZUluZm8ubHBzelRpdGxlID0gdGl0bGU7DQorICBicm93c2VJbmZvLnVsRmxhZ3MgPSB1bEZsYWdzOw0KKyAgYnJvd3NlSW5mby5scGZuID0gKGluaXRpYWxGb2xkZXIgIT0gTlVMTCkgPyBCcm93c2VDYWxsYmFja1Byb2MyIDogTlVMTDsNCisgIGJyb3dzZUluZm8ubFBhcmFtID0gKExQQVJBTSlpbml0aWFsRm9sZGVyOw0KKyAgcmV0dXJuIEJyb3dzZUZvckZvbGRlcigmYnJvd3NlSW5mbywgcmVzdWx0UGF0aCk7DQorfQ0KKw0KK2Jvb2wgQnJvd3NlRm9yRm9sZGVyKEhXTkQgb3duZXIsIExQQ1dTVFIgdGl0bGUsIExQQ1dTVFIgaW5pdGlhbEZvbGRlciwgVVN0cmluZyAmcmVzdWx0UGF0aCkNCit7DQorICBpZiAoZ19Jc05UKQ0KKyAgICByZXR1cm4gQnJvd3NlRm9yRm9sZGVyKG93bmVyLCB0aXRsZSwNCisgICAgICBCSUZfTkVXRElBTE9HU1RZTEUgfCBCSUZfUkVUVVJOT05MWUZTRElSUw0KKyAgICAgIC8vICB8IEJJRl9TVEFUVVNURVhUIC8vIFRoaXMgZmxhZyBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gQklGX05FV0RJQUxPR1NUWUxFIGlzIHNwZWNpZmllZC4NCisgICAgICAsIGluaXRpYWxGb2xkZXIsIHJlc3VsdFBhdGgpOw0KKyAgLy8gQklGX1NUQVRVU1RFWFQ7IEJJRl9VU0VORVdVSSAgIChWZXJzaW9uIDUuMCkNCisgIENTeXNTdHJpbmcgczsNCisgIGJvb2wgcmVzID0gQnJvd3NlRm9yRm9sZGVyKG93bmVyLCBHZXRTeXN0ZW1TdHJpbmcodGl0bGUpLA0KKyAgICAgIEJJRl9ORVdESUFMT0dTVFlMRSB8IEJJRl9SRVRVUk5PTkxZRlNESVJTDQorICAgICAgLy8gfCBCSUZfU1RBVFVTVEVYVCAgLy8gVGhpcyBmbGFnIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBCSUZfTkVXRElBTE9HU1RZTEUgaXMgc3BlY2lmaWVkLg0KKyAgICAgICwgR2V0U3lzdGVtU3RyaW5nKGluaXRpYWxGb2xkZXIpLCBzKTsNCisgIHJlc3VsdFBhdGggPSBHZXRVbmljb2RlU3RyaW5nKHMpOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorI2VuZGlmDQorDQorI2VuZGlmDQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL1NoZWxsLmggYi9sem1hL0NQUC9XaW5kb3dzL1NoZWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2ODA0MAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvU2hlbGwuaApAQCAtMCwwICsxLDk0IEBACisvLyBXaW5kb3dzL1NoZWxsLmgNCisNCisjaWZuZGVmIF9fV0lORE9XU19TSEVMTF9IDQorI2RlZmluZSBfX1dJTkRPV1NfU0hFTExfSA0KKw0KKyNpbmNsdWRlIDx3aW5kb3dzLmg+DQorI2luY2x1ZGUgPHNobG9iai5oPg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vTXlTdHJpbmcuaCINCisNCisjaW5jbHVkZSAiRGVmcy5oIg0KKw0KK25hbWVzcGFjZSBOV2luZG93c3sNCituYW1lc3BhY2UgTlNoZWxsew0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisvLyBDSXRlbUlETGlzdA0KKyNpZm5kZWYgVU5ERVJfQ0UNCisNCitjbGFzcyBDSXRlbUlETGlzdA0KK3sNCisgIExQSVRFTUlETElTVCBtX09iamVjdDsNCitwdWJsaWM6DQorICBDSXRlbUlETGlzdCgpOiBtX09iamVjdChOVUxMKSB7fQ0KKyAgLy8gQ0l0ZW1JRExpc3QoTFBDSVRFTUlETElTVCBpdGVtSURMaXN0KTsNCisgIC8vIENJdGVtSURMaXN0KGNvbnN0IENJdGVtSURMaXN0JiBpdGVtSURMaXN0KTsNCisgIH5DSXRlbUlETGlzdCgpIHsgRnJlZSgpOyB9DQorICB2b2lkIEZyZWUoKTsNCisgIHZvaWQgQXR0YWNoKExQSVRFTUlETElTVCBvYmplY3QpDQorICB7DQorICAgIEZyZWUoKTsNCisgICAgbV9PYmplY3QgPSBvYmplY3Q7DQorICB9DQorICBMUElURU1JRExJU1QgRGV0YWNoKCkNCisgIHsNCisgICAgTFBJVEVNSURMSVNUIG9iamVjdCA9IG1fT2JqZWN0Ow0KKyAgICBtX09iamVjdCA9IE5VTEw7DQorICAgIHJldHVybiBvYmplY3Q7DQorICB9DQorICBvcGVyYXRvciBMUElURU1JRExJU1QoKSB7IHJldHVybiBtX09iamVjdDt9DQorICBvcGVyYXRvciBMUENJVEVNSURMSVNUKCkgY29uc3QgeyByZXR1cm4gbV9PYmplY3Q7fQ0KKyAgTFBJVEVNSURMSVNUKiBvcGVyYXRvciYoKSB7IHJldHVybiAmbV9PYmplY3Q7IH0NCisgIExQSVRFTUlETElTVCBvcGVyYXRvci0+KCkgeyByZXR1cm4gbV9PYmplY3Q7IH0NCisNCisgIC8vIENJdGVtSURMaXN0JiBvcGVyYXRvcj0oTFBDSVRFTUlETElTVCBvYmplY3QpOw0KKyAgLy8gQ0l0ZW1JRExpc3QmIG9wZXJhdG9yPShjb25zdCBDSXRlbUlETGlzdCAmb2JqZWN0KTsNCit9Ow0KKw0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorLy8gQ0Ryb3ANCisNCitjbGFzcyBDRHJvcA0KK3sNCisgIEhEUk9QIG1fT2JqZWN0Ow0KKyAgYm9vbCBtX011c3RCZUZpbmlzaGVkOw0KKyAgYm9vbCBtX0Fzc2lnbmVkOw0KKyAgdm9pZCBGcmVlKCk7DQorcHVibGljOg0KKyAgQ0Ryb3AoYm9vbCBtdXN0QmVGaW5pc2hlZCkgOiBtX011c3RCZUZpbmlzaGVkKG11c3RCZUZpbmlzaGVkKSwgbV9Bc3NpZ25lZChmYWxzZSkge30NCisgIH5DRHJvcCgpIHsgRnJlZSgpOyB9DQorDQorICB2b2lkIEF0dGFjaChIRFJPUCBvYmplY3QpOw0KKyAgb3BlcmF0b3IgSERST1AoKSB7IHJldHVybiBtX09iamVjdDt9DQorICBib29sIFF1ZXJ5UG9pbnQoTFBQT0lOVCBwb2ludCkNCisgICAgeyByZXR1cm4gQk9PTFRvQm9vbCg6OkRyYWdRdWVyeVBvaW50KG1fT2JqZWN0LCBwb2ludCkpOyB9DQorICB2b2lkIEZpbmlzaCgpIHsgIDo6RHJhZ0ZpbmlzaChtX09iamVjdCk7IH0NCisgIFVJTlQgUXVlcnlGaWxlKFVJTlQgZmlsZUluZGV4LCBMUFRTVFIgZmlsZU5hbWUsIFVJTlQgZmlsZU5hbWVTaXplKQ0KKyAgICB7IHJldHVybiA6OkRyYWdRdWVyeUZpbGUobV9PYmplY3QsIGZpbGVJbmRleCwgZmlsZU5hbWUsIGZpbGVOYW1lU2l6ZSk7IH0NCisgICNpZm5kZWYgX1VOSUNPREUNCisgIFVJTlQgUXVlcnlGaWxlKFVJTlQgZmlsZUluZGV4LCBMUFdTVFIgZmlsZU5hbWUsIFVJTlQgZmlsZU5hbWVTaXplKQ0KKyAgICB7IHJldHVybiA6OkRyYWdRdWVyeUZpbGVXKG1fT2JqZWN0LCBmaWxlSW5kZXgsIGZpbGVOYW1lLCBmaWxlTmFtZVNpemUpOyB9DQorICAjZW5kaWYNCisgIFVJTlQgUXVlcnlDb3VudE9mRmlsZXMoKTsNCisgIFVTdHJpbmcgUXVlcnlGaWxlTmFtZShVSU5UIGZpbGVJbmRleCk7DQorICB2b2lkIFF1ZXJ5RmlsZU5hbWVzKFVTdHJpbmdWZWN0b3IgJmZpbGVOYW1lcyk7DQorfTsNCisNCisjZW5kaWYNCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KKy8vIEZ1bmN0aW9ucw0KKw0KK2Jvb2wgR2V0UGF0aEZyb21JRExpc3QoTFBDSVRFTUlETElTVCBpdGVtSURMaXN0LCBDU3lzU3RyaW5nICZwYXRoKTsNCitib29sIEJyb3dzZUZvckZvbGRlcihMUEJST1dTRUlORk8gbHBiaSwgQ1N5c1N0cmluZyAmcmVzdWx0UGF0aCk7DQorYm9vbCBCcm93c2VGb3JGb2xkZXIoSFdORCBvd25lciwgTFBDVFNUUiB0aXRsZSwgTFBDVFNUUiBpbml0aWFsRm9sZGVyLCBDU3lzU3RyaW5nICZyZXN1bHRQYXRoKTsNCisNCisjaWZuZGVmIF9VTklDT0RFDQorYm9vbCBHZXRQYXRoRnJvbUlETGlzdChMUENJVEVNSURMSVNUIGl0ZW1JRExpc3QsIFVTdHJpbmcgJnBhdGgpOw0KK2Jvb2wgQnJvd3NlRm9yRm9sZGVyKExQQlJPV1NFSU5GTyBscGJpLCBVU3RyaW5nICZyZXN1bHRQYXRoKTsNCitib29sIEJyb3dzZUZvckZvbGRlcihIV05EIG93bmVyLCBMUENXU1RSIHRpdGxlLCBMUENXU1RSIGluaXRpYWxGb2xkZXIsIFVTdHJpbmcgJnJlc3VsdFBhdGgpOw0KKyNlbmRpZg0KK319DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9TdGRBZnguaCBiL2x6bWEvQ1BQL1dpbmRvd3MvU3RkQWZ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhNDg5NQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvU3RkQWZ4LmgKQEAgLTAsMCArMSw4IEBACisvLyBTdGRBZnguaA0KKw0KKyNpZm5kZWYgX19TVERBRlhfSA0KKyNkZWZpbmUgX19TVERBRlhfSA0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vQ29tbW9uLmgiDQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9TeW5jaHJvbml6YXRpb24uY3BwIGIvbHptYS9DUFAvV2luZG93cy9TeW5jaHJvbml6YXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjFhZDkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL1N5bmNocm9uaXphdGlvbi5jcHAKQEAgLTAsMCArMSwxMCBAQAorLy8gV2luZG93cy9TeW5jaHJvbml6YXRpb24uY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICJTeW5jaHJvbml6YXRpb24uaCINCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBOU3luY2hyb25pemF0aW9uIHsNCisNCit9fQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvU3luY2hyb25pemF0aW9uLmggYi9sem1hL0NQUC9XaW5kb3dzL1N5bmNocm9uaXphdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NmRhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL1N5bmNocm9uaXphdGlvbi5oCkBAIC0wLDAgKzEsMTY0IEBACisvLyBXaW5kb3dzL1N5bmNocm9uaXphdGlvbi5oDQorDQorI2lmbmRlZiBfX1dJTkRPV1NfU1lOQ0hST05JWkFUSU9OX0gNCisjZGVmaW5lIF9fV0lORE9XU19TWU5DSFJPTklaQVRJT05fSA0KKw0KKyNpbmNsdWRlICIuLi8uLi9DL1RocmVhZHMuaCINCisNCisjaW5jbHVkZSAiRGVmcy5oIg0KKw0KKyNpZmRlZiBfV0lOMzINCisjaW5jbHVkZSAiSGFuZGxlLmgiDQorI2VuZGlmDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTlN5bmNocm9uaXphdGlvbiB7DQorDQorY2xhc3MgQ0Jhc2VFdmVudA0KK3sNCitwcm90ZWN0ZWQ6DQorICA6OkNFdmVudCBfb2JqZWN0Ow0KK3B1YmxpYzoNCisgIGJvb2wgSXNDcmVhdGVkKCkgeyByZXR1cm4gRXZlbnRfSXNDcmVhdGVkKCZfb2JqZWN0KSAhPSAwOyB9DQorICBvcGVyYXRvciBIQU5ETEUoKSB7IHJldHVybiBfb2JqZWN0OyB9DQorICBDQmFzZUV2ZW50KCkgeyBFdmVudF9Db25zdHJ1Y3QoJl9vYmplY3QpOyB9DQorICB+Q0Jhc2VFdmVudCgpIHsgQ2xvc2UoKTsgfQ0KKyAgV1JlcyBDbG9zZSgpIHsgcmV0dXJuIEV2ZW50X0Nsb3NlKCZfb2JqZWN0KTsgfQ0KKyAgI2lmZGVmIF9XSU4zMg0KKyAgV1JlcyBDcmVhdGUoYm9vbCBtYW51YWxSZXNldCwgYm9vbCBpbml0aWFsbHlPd24sIExQQ1RTVFIgbmFtZSA9IE5VTEwsIExQU0VDVVJJVFlfQVRUUklCVVRFUyBzYSA9IE5VTEwpDQorICB7DQorICAgIF9vYmplY3QgPSA6OkNyZWF0ZUV2ZW50KHNhLCBCb29sVG9CT09MKG1hbnVhbFJlc2V0KSwgQm9vbFRvQk9PTChpbml0aWFsbHlPd24pLCBuYW1lKTsNCisgICAgaWYgKG5hbWUgPT0gTlVMTCAmJiBfb2JqZWN0ICE9IDApDQorICAgICAgcmV0dXJuIDA7DQorICAgIHJldHVybiA6OkdldExhc3RFcnJvcigpOw0KKyAgfQ0KKyAgV1JlcyBPcGVuKERXT1JEIGRlc2lyZWRBY2Nlc3MsIGJvb2wgaW5oZXJpdEhhbmRsZSwgTFBDVFNUUiBuYW1lKQ0KKyAgew0KKyAgICBfb2JqZWN0ID0gOjpPcGVuRXZlbnQoZGVzaXJlZEFjY2VzcywgQm9vbFRvQk9PTChpbmhlcml0SGFuZGxlKSwgbmFtZSk7DQorICAgIGlmIChfb2JqZWN0ICE9IDApDQorICAgICAgcmV0dXJuIDA7DQorICAgIHJldHVybiA6OkdldExhc3RFcnJvcigpOw0KKyAgfQ0KKyAgI2VuZGlmDQorDQorICBXUmVzIFNldCgpIHsgcmV0dXJuIEV2ZW50X1NldCgmX29iamVjdCk7IH0NCisgIC8vIGJvb2wgUHVsc2UoKSB7IHJldHVybiBCT09MVG9Cb29sKDo6UHVsc2VFdmVudChfaGFuZGxlKSk7IH0NCisgIFdSZXMgUmVzZXQoKSB7IHJldHVybiBFdmVudF9SZXNldCgmX29iamVjdCk7IH0NCisgIFdSZXMgTG9jaygpIHsgcmV0dXJuIEV2ZW50X1dhaXQoJl9vYmplY3QpOyB9DQorfTsNCisNCitjbGFzcyBDTWFudWFsUmVzZXRFdmVudDogcHVibGljIENCYXNlRXZlbnQNCit7DQorcHVibGljOg0KKyAgV1JlcyBDcmVhdGUoYm9vbCBpbml0aWFsbHlPd24gPSBmYWxzZSkNCisgIHsNCisgICAgcmV0dXJuIE1hbnVhbFJlc2V0RXZlbnRfQ3JlYXRlKCZfb2JqZWN0LCBpbml0aWFsbHlPd24gPyAxOiAwKTsNCisgIH0NCisgIFdSZXMgQ3JlYXRlSWZOb3RDcmVhdGVkKCkNCisgIHsNCisgICAgaWYgKElzQ3JlYXRlZCgpKQ0KKyAgICAgIHJldHVybiAwOw0KKyAgICByZXR1cm4gTWFudWFsUmVzZXRFdmVudF9DcmVhdGVOb3RTaWduYWxlZCgmX29iamVjdCk7DQorICB9DQorICAjaWZkZWYgX1dJTjMyDQorICBXUmVzIENyZWF0ZVdpdGhOYW1lKGJvb2wgaW5pdGlhbGx5T3duLCBMUENUU1RSIG5hbWUpDQorICB7DQorICAgIHJldHVybiBDQmFzZUV2ZW50OjpDcmVhdGUodHJ1ZSwgaW5pdGlhbGx5T3duLCBuYW1lKTsNCisgIH0NCisgICNlbmRpZg0KK307DQorDQorY2xhc3MgQ0F1dG9SZXNldEV2ZW50OiBwdWJsaWMgQ0Jhc2VFdmVudA0KK3sNCitwdWJsaWM6DQorICBXUmVzIENyZWF0ZSgpDQorICB7DQorICAgIHJldHVybiBBdXRvUmVzZXRFdmVudF9DcmVhdGVOb3RTaWduYWxlZCgmX29iamVjdCk7DQorICB9DQorICBXUmVzIENyZWF0ZUlmTm90Q3JlYXRlZCgpDQorICB7DQorICAgIGlmIChJc0NyZWF0ZWQoKSkNCisgICAgICByZXR1cm4gMDsNCisgICAgcmV0dXJuIEF1dG9SZXNldEV2ZW50X0NyZWF0ZU5vdFNpZ25hbGVkKCZfb2JqZWN0KTsNCisgIH0NCit9Ow0KKw0KKyNpZmRlZiBfV0lOMzINCitjbGFzcyBDT2JqZWN0OiBwdWJsaWMgQ0hhbmRsZQ0KK3sNCitwdWJsaWM6DQorICBXUmVzIExvY2soRFdPUkQgdGltZW91dEludGVydmFsID0gSU5GSU5JVEUpDQorICAgIHsgcmV0dXJuICg6OldhaXRGb3JTaW5nbGVPYmplY3QoX2hhbmRsZSwgdGltZW91dEludGVydmFsKSA9PSBXQUlUX09CSkVDVF8wID8gMCA6IDo6R2V0TGFzdEVycm9yKCkpOyB9DQorfTsNCitjbGFzcyBDTXV0ZXg6IHB1YmxpYyBDT2JqZWN0DQorew0KK3B1YmxpYzoNCisgIFdSZXMgQ3JlYXRlKGJvb2wgaW5pdGlhbGx5T3duLCBMUENUU1RSIG5hbWUgPSBOVUxMLCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgc2EgPSBOVUxMKQ0KKyAgew0KKyAgICBfaGFuZGxlID0gOjpDcmVhdGVNdXRleChzYSwgQm9vbFRvQk9PTChpbml0aWFsbHlPd24pLCBuYW1lKTsNCisgICAgaWYgKG5hbWUgPT0gTlVMTCAmJiBfaGFuZGxlICE9IDApDQorICAgICAgcmV0dXJuIDA7DQorICAgIHJldHVybiA6OkdldExhc3RFcnJvcigpOw0KKyAgfQ0KKyAgI2lmbmRlZiBVTkRFUl9DRQ0KKyAgV1JlcyBPcGVuKERXT1JEIGRlc2lyZWRBY2Nlc3MsIGJvb2wgaW5oZXJpdEhhbmRsZSwgTFBDVFNUUiBuYW1lKQ0KKyAgew0KKyAgICBfaGFuZGxlID0gOjpPcGVuTXV0ZXgoZGVzaXJlZEFjY2VzcywgQm9vbFRvQk9PTChpbmhlcml0SGFuZGxlKSwgbmFtZSk7DQorICAgIGlmIChfaGFuZGxlICE9IDApDQorICAgICAgcmV0dXJuIDA7DQorICAgIHJldHVybiA6OkdldExhc3RFcnJvcigpOw0KKyAgfQ0KKyAgI2VuZGlmDQorICBXUmVzIFJlbGVhc2UoKQ0KKyAgew0KKyAgICByZXR1cm4gOjpSZWxlYXNlTXV0ZXgoX2hhbmRsZSkgPyAwIDogOjpHZXRMYXN0RXJyb3IoKTsNCisgIH0NCit9Ow0KK2NsYXNzIENNdXRleExvY2sNCit7DQorICBDTXV0ZXggKl9vYmplY3Q7DQorcHVibGljOg0KKyAgQ011dGV4TG9jayhDTXV0ZXggJm9iamVjdCk6IF9vYmplY3QoJm9iamVjdCkgeyBfb2JqZWN0LT5Mb2NrKCk7IH0NCisgIH5DTXV0ZXhMb2NrKCkgeyBfb2JqZWN0LT5SZWxlYXNlKCk7IH0NCit9Ow0KKyNlbmRpZg0KKw0KK2NsYXNzIENTZW1hcGhvcmUNCit7DQorICA6OkNTZW1hcGhvcmUgX29iamVjdDsNCitwdWJsaWM6DQorICBDU2VtYXBob3JlKCkgeyBTZW1hcGhvcmVfQ29uc3RydWN0KCZfb2JqZWN0KTsgfQ0KKyAgfkNTZW1hcGhvcmUoKSB7IENsb3NlKCk7IH0NCisgIFdSZXMgQ2xvc2UoKSB7ICByZXR1cm4gU2VtYXBob3JlX0Nsb3NlKCZfb2JqZWN0KTsgfQ0KKyAgb3BlcmF0b3IgSEFORExFKCkgeyByZXR1cm4gX29iamVjdDsgfQ0KKyAgV1JlcyBDcmVhdGUoVUludDMyIGluaXRpYWxseUNvdW50LCBVSW50MzIgbWF4Q291bnQpDQorICB7DQorICAgIHJldHVybiBTZW1hcGhvcmVfQ3JlYXRlKCZfb2JqZWN0LCBpbml0aWFsbHlDb3VudCwgbWF4Q291bnQpOw0KKyAgfQ0KKyAgV1JlcyBSZWxlYXNlKCkgeyByZXR1cm4gU2VtYXBob3JlX1JlbGVhc2UxKCZfb2JqZWN0KTsgfQ0KKyAgV1JlcyBSZWxlYXNlKFVJbnQzMiByZWxlYXNlQ291bnQpIHsgcmV0dXJuIFNlbWFwaG9yZV9SZWxlYXNlTigmX29iamVjdCwgcmVsZWFzZUNvdW50KTsgfQ0KKyAgV1JlcyBMb2NrKCkgeyByZXR1cm4gU2VtYXBob3JlX1dhaXQoJl9vYmplY3QpOyB9DQorfTsNCisNCitjbGFzcyBDQ3JpdGljYWxTZWN0aW9uDQorew0KKyAgOjpDQ3JpdGljYWxTZWN0aW9uIF9vYmplY3Q7DQorcHVibGljOg0KKyAgQ0NyaXRpY2FsU2VjdGlvbigpIHsgQ3JpdGljYWxTZWN0aW9uX0luaXQoJl9vYmplY3QpOyB9DQorICB+Q0NyaXRpY2FsU2VjdGlvbigpIHsgQ3JpdGljYWxTZWN0aW9uX0RlbGV0ZSgmX29iamVjdCk7IH0NCisgIHZvaWQgRW50ZXIoKSB7IENyaXRpY2FsU2VjdGlvbl9FbnRlcigmX29iamVjdCk7IH0NCisgIHZvaWQgTGVhdmUoKSB7IENyaXRpY2FsU2VjdGlvbl9MZWF2ZSgmX29iamVjdCk7IH0NCit9Ow0KKw0KK2NsYXNzIENDcml0aWNhbFNlY3Rpb25Mb2NrDQorew0KKyAgQ0NyaXRpY2FsU2VjdGlvbiAqX29iamVjdDsNCisgIHZvaWQgVW5sb2NrKCkgIHsgX29iamVjdC0+TGVhdmUoKTsgfQ0KK3B1YmxpYzoNCisgIENDcml0aWNhbFNlY3Rpb25Mb2NrKENDcml0aWNhbFNlY3Rpb24gJm9iamVjdCk6IF9vYmplY3QoJm9iamVjdCkge19vYmplY3QtPkVudGVyKCk7IH0NCisgIH5DQ3JpdGljYWxTZWN0aW9uTG9jaygpIHsgVW5sb2NrKCk7IH0NCit9Ow0KKw0KK319DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9TeXN0ZW0uY3BwIGIvbHptYS9DUFAvV2luZG93cy9TeXN0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NWVhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL1N5c3RlbS5jcHAKQEAgLTAsMCArMSw3MiBAQAorLy8gV2luZG93cy9TeXN0ZW0uY3BwDQorDQorI2luY2x1ZGUgIlN0ZEFmeC5oIg0KKw0KKyNpbmNsdWRlICIuLi9Db21tb24vRGVmcy5oIg0KKw0KKyNpbmNsdWRlICJTeXN0ZW0uaCINCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBOU3lzdGVtIHsNCisNCitVSW50MzIgR2V0TnVtYmVyT2ZQcm9jZXNzb3JzKCkNCit7DQorICBTWVNURU1fSU5GTyBzeXN0ZW1JbmZvOw0KKyAgR2V0U3lzdGVtSW5mbygmc3lzdGVtSW5mbyk7DQorICByZXR1cm4gKFVJbnQzMilzeXN0ZW1JbmZvLmR3TnVtYmVyT2ZQcm9jZXNzb3JzOw0KK30NCisNCisjaWZuZGVmIFVOREVSX0NFDQorDQorI2lmICFkZWZpbmVkKF9XSU42NCkgJiYgZGVmaW5lZChfX0dOVUNfXykNCisNCit0eXBlZGVmIHN0cnVjdCBfTVlfTUVNT1JZU1RBVFVTRVggew0KKyAgRFdPUkQgZHdMZW5ndGg7DQorICBEV09SRCBkd01lbW9yeUxvYWQ7DQorICBEV09SRExPTkcgdWxsVG90YWxQaHlzOw0KKyAgRFdPUkRMT05HIHVsbEF2YWlsUGh5czsNCisgIERXT1JETE9ORyB1bGxUb3RhbFBhZ2VGaWxlOw0KKyAgRFdPUkRMT05HIHVsbEF2YWlsUGFnZUZpbGU7DQorICBEV09SRExPTkcgdWxsVG90YWxWaXJ0dWFsOw0KKyAgRFdPUkRMT05HIHVsbEF2YWlsVmlydHVhbDsNCisgIERXT1JETE9ORyB1bGxBdmFpbEV4dGVuZGVkVmlydHVhbDsNCit9IE1ZX01FTU9SWVNUQVRVU0VYLCAqTVlfTFBNRU1PUllTVEFUVVNFWDsNCisNCisjZWxzZQ0KKw0KKyNkZWZpbmUgTVlfTUVNT1JZU1RBVFVTRVggTUVNT1JZU1RBVFVTRVgNCisjZGVmaW5lIE1ZX0xQTUVNT1JZU1RBVFVTRVggTFBNRU1PUllTVEFUVVNFWA0KKw0KKyNlbmRpZg0KKw0KK3R5cGVkZWYgQk9PTCAoV0lOQVBJICpHbG9iYWxNZW1vcnlTdGF0dXNFeFApKE1ZX0xQTUVNT1JZU1RBVFVTRVggbHBCdWZmZXIpOw0KKw0KKyNlbmRpZg0KKw0KK1VJbnQ2NCBHZXRSYW1TaXplKCkNCit7DQorICAjaWZuZGVmIFVOREVSX0NFDQorICBNWV9NRU1PUllTVEFUVVNFWCBzdGF0Ow0KKyAgc3RhdC5kd0xlbmd0aCA9IHNpemVvZihzdGF0KTsNCisgICNlbmRpZg0KKyAgI2lmZGVmIF9XSU42NA0KKyAgaWYgKCE6Okdsb2JhbE1lbW9yeVN0YXR1c0V4KCZzdGF0KSkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gTXlNaW4oc3RhdC51bGxUb3RhbFZpcnR1YWwsIHN0YXQudWxsVG90YWxQaHlzKTsNCisgICNlbHNlDQorICAjaWZuZGVmIFVOREVSX0NFDQorICBHbG9iYWxNZW1vcnlTdGF0dXNFeFAgZ2xvYmFsTWVtb3J5U3RhdHVzRXggPSAoR2xvYmFsTWVtb3J5U3RhdHVzRXhQKQ0KKyAgICAgIDo6R2V0UHJvY0FkZHJlc3MoOjpHZXRNb2R1bGVIYW5kbGUoVEVYVCgia2VybmVsMzIuZGxsIikpLCAiR2xvYmFsTWVtb3J5U3RhdHVzRXgiKTsNCisgIGlmIChnbG9iYWxNZW1vcnlTdGF0dXNFeCAhPSAwICYmIGdsb2JhbE1lbW9yeVN0YXR1c0V4KCZzdGF0KSkNCisgICAgcmV0dXJuIE15TWluKHN0YXQudWxsVG90YWxWaXJ0dWFsLCBzdGF0LnVsbFRvdGFsUGh5cyk7DQorICAjZW5kaWYNCisgIHsNCisgICAgTUVNT1JZU1RBVFVTIHN0YXQ7DQorICAgIHN0YXQuZHdMZW5ndGggPSBzaXplb2Yoc3RhdCk7DQorICAgIDo6R2xvYmFsTWVtb3J5U3RhdHVzKCZzdGF0KTsNCisgICAgcmV0dXJuIE15TWluKHN0YXQuZHdUb3RhbFZpcnR1YWwsIHN0YXQuZHdUb3RhbFBoeXMpOw0KKyAgfQ0KKyAgI2VuZGlmDQorfQ0KKw0KK319DQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9TeXN0ZW0uaCBiL2x6bWEvQ1BQL1dpbmRvd3MvU3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhNWUxZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1BQL1dpbmRvd3MvU3lzdGVtLmgKQEAgLTAsMCArMSwxNiBAQAorLy8gV2luZG93cy9TeXN0ZW0uaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX1NZU1RFTV9IDQorI2RlZmluZSBfX1dJTkRPV1NfU1lTVEVNX0gNCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL015VHlwZXMuaCINCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBOU3lzdGVtIHsNCisNCitVSW50MzIgR2V0TnVtYmVyT2ZQcm9jZXNzb3JzKCk7DQorVUludDY0IEdldFJhbVNpemUoKTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvVGhyZWFkLmggYi9sem1hL0NQUC9XaW5kb3dzL1RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNTg2M2MKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL1RocmVhZC5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIFdpbmRvd3MvVGhyZWFkLmgNCisNCisjaWZuZGVmIF9fV0lORE9XU19USFJFQURfSA0KKyNkZWZpbmUgX19XSU5ET1dTX1RIUkVBRF9IDQorDQorI2luY2x1ZGUgIi4uLy4uL0MvVGhyZWFkcy5oIg0KKw0KKyNpbmNsdWRlICJEZWZzLmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCisNCitjbGFzcyBDVGhyZWFkDQorew0KKyAgOjpDVGhyZWFkIHRocmVhZDsNCitwdWJsaWM6DQorICBDVGhyZWFkKCkgeyBUaHJlYWRfQ29uc3RydWN0KCZ0aHJlYWQpOyB9DQorICB+Q1RocmVhZCgpIHsgQ2xvc2UoKTsgfQ0KKyAgYm9vbCBJc0NyZWF0ZWQoKSB7IHJldHVybiBUaHJlYWRfV2FzQ3JlYXRlZCgmdGhyZWFkKSAhPSAwOyB9DQorICBXUmVzIENsb3NlKCkgIHsgcmV0dXJuIFRocmVhZF9DbG9zZSgmdGhyZWFkKTsgfQ0KKyAgV1JlcyBDcmVhdGUoVEhSRUFEX0ZVTkNfUkVUX1RZUEUgKFRIUkVBRF9GVU5DX0NBTExfVFlQRSAqc3RhcnRBZGRyZXNzKSh2b2lkICopLCBMUFZPSUQgcGFyYW1ldGVyKQ0KKyAgICB7IHJldHVybiBUaHJlYWRfQ3JlYXRlKCZ0aHJlYWQsIHN0YXJ0QWRkcmVzcywgcGFyYW1ldGVyKTsgfQ0KKyAgV1JlcyBXYWl0KCkgeyByZXR1cm4gVGhyZWFkX1dhaXQoJnRocmVhZCk7IH0NCisgIA0KKyAgI2lmZGVmIF9XSU4zMg0KKyAgb3BlcmF0b3IgSEFORExFKCkgeyByZXR1cm4gdGhyZWFkOyB9DQorICB2b2lkIEF0dGFjaChIQU5ETEUgaGFuZGxlKSB7IHRocmVhZCA9IGhhbmRsZTsgfQ0KKyAgSEFORExFIERldGFjaCgpIHsgSEFORExFIGggPSB0aHJlYWQ7IHRocmVhZCA9IE5VTEw7IHJldHVybiBoOyB9DQorICBEV09SRCBSZXN1bWUoKSB7IHJldHVybiA6OlJlc3VtZVRocmVhZCh0aHJlYWQpOyB9DQorICBEV09SRCBTdXNwZW5kKCkgeyByZXR1cm4gOjpTdXNwZW5kVGhyZWFkKHRocmVhZCk7IH0NCisgIGJvb2wgVGVybWluYXRlKERXT1JEIGV4aXRDb2RlKSB7IHJldHVybiBCT09MVG9Cb29sKDo6VGVybWluYXRlVGhyZWFkKHRocmVhZCwgZXhpdENvZGUpKTsgfQ0KKyAgaW50IEdldFByaW9yaXR5KCkgeyByZXR1cm4gOjpHZXRUaHJlYWRQcmlvcml0eSh0aHJlYWQpOyB9DQorICBib29sIFNldFByaW9yaXR5KGludCBwcmlvcml0eSkgeyByZXR1cm4gQk9PTFRvQm9vbCg6OlNldFRocmVhZFByaW9yaXR5KHRocmVhZCwgcHJpb3JpdHkpKTsgfQ0KKyAgI2VuZGlmDQorfTsNCisNCit9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvbHptYS9DUFAvV2luZG93cy9UaW1lVXRpbHMuY3BwIGIvbHptYS9DUFAvV2luZG93cy9UaW1lVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjMxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NQUC9XaW5kb3dzL1RpbWVVdGlscy5jcHAKQEAgLTAsMCArMSwyMDMgQEAKKy8vIFdpbmRvd3MvVGltZVV0aWxzLmNwcA0KKw0KKyNpbmNsdWRlICJTdGRBZnguaCINCisNCisjaW5jbHVkZSAiRGVmcy5oIg0KKyNpbmNsdWRlICJUaW1lVXRpbHMuaCINCisNCituYW1lc3BhY2UgTldpbmRvd3Mgew0KK25hbWVzcGFjZSBOVGltZSB7DQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrTnVtVGltZVF1YW50dW1zSW5TZWNvbmQgPSAxMDAwMDAwMDsNCitzdGF0aWMgY29uc3QgVUludDMyIGtGaWxlVGltZVN0YXJ0WWVhciA9IDE2MDE7DQorc3RhdGljIGNvbnN0IFVJbnQzMiBrRG9zVGltZVN0YXJ0WWVhciA9IDE5ODA7DQorc3RhdGljIGNvbnN0IFVJbnQzMiBrVW5peFRpbWVTdGFydFllYXIgPSAxOTcwOw0KK3N0YXRpYyBjb25zdCBVSW50NjQga1VuaXhUaW1lT2Zmc2V0ID0NCisgICAgKFVJbnQ2NCk2MCAqIDYwICogMjQgKiAoODkgKyAzNjUgKiAoa1VuaXhUaW1lU3RhcnRZZWFyIC0ga0ZpbGVUaW1lU3RhcnRZZWFyKSk7DQorc3RhdGljIGNvbnN0IFVJbnQ2NCBrTnVtU2Vjb25kc0luRmlsZVRpbWUgPSAoVUludDY0KShJbnQ2NCktMSAvIGtOdW1UaW1lUXVhbnR1bXNJblNlY29uZDsNCisNCitib29sIERvc1RpbWVUb0ZpbGVUaW1lKFVJbnQzMiBkb3NUaW1lLCBGSUxFVElNRSAmZnQpIHRocm93KCkNCit7DQorICAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKyAgcmV0dXJuIEJPT0xUb0Jvb2woOjpEb3NEYXRlVGltZVRvRmlsZVRpbWUoKFVJbnQxNikoZG9zVGltZSA+PiAxNiksIChVSW50MTYpKGRvc1RpbWUgJiAweEZGRkYpLCAmZnQpKTsNCisgICNlbHNlDQorICBmdC5kd0xvd0RhdGVUaW1lID0gMDsNCisgIGZ0LmR3SGlnaERhdGVUaW1lID0gMDsNCisgIFVJbnQ2NCByZXM7DQorICBpZiAoIUdldFNlY29uZHNTaW5jZTE2MDEoa0Rvc1RpbWVTdGFydFllYXIgKyAoZG9zVGltZSA+PiAyNSksIChkb3NUaW1lID4+IDIxKSAmIDB4RiwgKGRvc1RpbWUgPj4gMTYpICYgMHgxRiwNCisgICAgICAoZG9zVGltZSA+PiAxMSkgJiAweDFGLCAoZG9zVGltZSA+PiA1KSAmIDB4M0YsIChkb3NUaW1lICYgMHgxRikgKiAyLCByZXMpKQ0KKyAgICByZXR1cm4gZmFsc2U7DQorICByZXMgKj0ga051bVRpbWVRdWFudHVtc0luU2Vjb25kOw0KKyAgZnQuZHdMb3dEYXRlVGltZSA9IChVSW50MzIpcmVzOw0KKyAgZnQuZHdIaWdoRGF0ZVRpbWUgPSAoVUludDMyKShyZXMgPj4gMzIpOw0KKyAgcmV0dXJuIHRydWU7DQorICAjZW5kaWYNCit9DQorDQorc3RhdGljIGNvbnN0IFVJbnQzMiBrSGlnaERvc1RpbWUgPSAweEZGOUZCRjdEOw0KK3N0YXRpYyBjb25zdCBVSW50MzIga0xvd0Rvc1RpbWUgPSAweDIxMDAwMDsNCisNCisjZGVmaW5lIFBFUklPRF80ICg0ICogMzY1ICsgMSkNCisjZGVmaW5lIFBFUklPRF8xMDAgKFBFUklPRF80ICogMjUgLSAxKQ0KKyNkZWZpbmUgUEVSSU9EXzQwMCAoUEVSSU9EXzEwMCAqIDQgKyAxKQ0KKw0KK2Jvb2wgRmlsZVRpbWVUb0Rvc1RpbWUoY29uc3QgRklMRVRJTUUgJmZ0LCBVSW50MzIgJmRvc1RpbWUpIHRocm93KCkNCit7DQorICAjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFVOREVSX0NFKQ0KKw0KKyAgV09SRCBkYXRlUGFydCwgdGltZVBhcnQ7DQorICBpZiAoITo6RmlsZVRpbWVUb0Rvc0RhdGVUaW1lKCZmdCwgJmRhdGVQYXJ0LCAmdGltZVBhcnQpKQ0KKyAgew0KKyAgICBkb3NUaW1lID0gKGZ0LmR3SGlnaERhdGVUaW1lID49IDB4MDFDMDAwMDApID8ga0hpZ2hEb3NUaW1lIDoga0xvd0Rvc1RpbWU7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIGRvc1RpbWUgPSAoKChVSW50MzIpZGF0ZVBhcnQpIDw8IDE2KSArIHRpbWVQYXJ0Ow0KKw0KKyAgI2Vsc2UNCisNCisgIHVuc2lnbmVkIHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYzsNCisgIFVJbnQ2NCB2NjQgPSBmdC5kd0xvd0RhdGVUaW1lIHwgKChVSW50NjQpZnQuZHdIaWdoRGF0ZVRpbWUgPDwgMzIpOw0KKyAgQnl0ZSBtc1tdID0geyAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxIH07DQorICB1bnNpZ25lZCB0ZW1wOw0KKyAgVUludDMyIHY7DQorICB2NjQgKz0gKGtOdW1UaW1lUXVhbnR1bXNJblNlY29uZCAqIDIgLSAxKTsNCisgIHY2NCAvPSBrTnVtVGltZVF1YW50dW1zSW5TZWNvbmQ7DQorICBzZWMgPSAodW5zaWduZWQpKHY2NCAlIDYwKTsNCisgIHY2NCAvPSA2MDsNCisgIG1pbiA9ICh1bnNpZ25lZCkodjY0ICUgNjApOw0KKyAgdjY0IC89IDYwOw0KKyAgaG91ciA9ICh1bnNpZ25lZCkodjY0ICUgMjQpOw0KKyAgdjY0IC89IDI0Ow0KKw0KKyAgdiA9IChVSW50MzIpdjY0Ow0KKw0KKyAgeWVhciA9ICh1bnNpZ25lZCkoa0ZpbGVUaW1lU3RhcnRZZWFyICsgdiAvIFBFUklPRF80MDAgKiA0MDApOw0KKyAgdiAlPSBQRVJJT0RfNDAwOw0KKw0KKyAgdGVtcCA9ICh1bnNpZ25lZCkodiAvIFBFUklPRF8xMDApOw0KKyAgaWYgKHRlbXAgPT0gNCkNCisgICAgdGVtcCA9IDM7DQorICB5ZWFyICs9IHRlbXAgKiAxMDA7DQorICB2IC09IHRlbXAgKiBQRVJJT0RfMTAwOw0KKw0KKyAgdGVtcCA9IHYgLyBQRVJJT0RfNDsNCisgIGlmICh0ZW1wID09IDI1KQ0KKyAgICB0ZW1wID0gMjQ7DQorICB5ZWFyICs9IHRlbXAgKiA0Ow0KKyAgdiAtPSB0ZW1wICogUEVSSU9EXzQ7DQorDQorICB0ZW1wID0gdiAvIDM2NTsNCisgIGlmICh0ZW1wID09IDQpDQorICAgIHRlbXAgPSAzOw0KKyAgeWVhciArPSB0ZW1wOw0KKyAgdiAtPSB0ZW1wICogMzY1Ow0KKw0KKyAgaWYgKHllYXIgJSA0ID09IDAgJiYgKHllYXIgJSAxMDAgIT0gMCB8fCB5ZWFyICUgNDAwID09IDApKQ0KKyAgICBtc1sxXSA9IDI5Ow0KKyAgZm9yIChtb24gPSAxOyBtb24gPD0gMTI7IG1vbisrKQ0KKyAgew0KKyAgICB1bnNpZ25lZCBzID0gbXNbbW9uIC0gMV07DQorICAgIGlmICh2IDwgcykNCisgICAgICBicmVhazsNCisgICAgdiAtPSBzOw0KKyAgfQ0KKyAgZGF5ID0gKHVuc2lnbmVkKXYgKyAxOw0KKw0KKyAgZG9zVGltZSA9IGtMb3dEb3NUaW1lOw0KKyAgaWYgKHllYXIgPCBrRG9zVGltZVN0YXJ0WWVhcikNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgeWVhciAtPSBrRG9zVGltZVN0YXJ0WWVhcjsNCisgIGRvc1RpbWUgPSBrSGlnaERvc1RpbWU7DQorICBpZiAoeWVhciA+PSAxMjgpDQorICAgIHJldHVybiBmYWxzZTsNCisgIGRvc1RpbWUgPSAoeWVhciA8PCAyNSkgfCAobW9uIDw8IDIxKSB8IChkYXkgPDwgMTYpIHwgKGhvdXIgPDwgMTEpIHwgKG1pbiA8PCA1KSB8IChzZWMgPj4gMSk7DQorICAjZW5kaWYNCisgIHJldHVybiB0cnVlOw0KK30NCisNCit2b2lkIFVuaXhUaW1lVG9GaWxlVGltZShVSW50MzIgdW5peFRpbWUsIEZJTEVUSU1FICZmdCkgdGhyb3coKQ0KK3sNCisgIFVJbnQ2NCB2ID0gKGtVbml4VGltZU9mZnNldCArIChVSW50NjQpdW5peFRpbWUpICoga051bVRpbWVRdWFudHVtc0luU2Vjb25kOw0KKyAgZnQuZHdMb3dEYXRlVGltZSA9IChEV09SRCl2Ow0KKyAgZnQuZHdIaWdoRGF0ZVRpbWUgPSAoRFdPUkQpKHYgPj4gMzIpOw0KK30NCisNCitib29sIFVuaXhUaW1lNjRUb0ZpbGVUaW1lKEludDY0IHVuaXhUaW1lLCBGSUxFVElNRSAmZnQpIHRocm93KCkNCit7DQorICBpZiAodW5peFRpbWUgPiBrTnVtU2Vjb25kc0luRmlsZVRpbWUgLSBrVW5peFRpbWVPZmZzZXQpDQorICB7DQorICAgIGZ0LmR3TG93RGF0ZVRpbWUgPSBmdC5kd0hpZ2hEYXRlVGltZSA9IChVSW50MzIpKEludDMyKS0xOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICBJbnQ2NCB2ID0gKEludDY0KWtVbml4VGltZU9mZnNldCArIHVuaXhUaW1lOw0KKyAgaWYgKHYgPCAwKQ0KKyAgew0KKyAgICBmdC5kd0xvd0RhdGVUaW1lID0gZnQuZHdIaWdoRGF0ZVRpbWUgPSAwOw0KKyAgICByZXR1cm4gZmFsc2U7DQorICB9DQorICBVSW50NjQgdjIgPSAoVUludDY0KXYgKiBrTnVtVGltZVF1YW50dW1zSW5TZWNvbmQ7DQorICBmdC5kd0xvd0RhdGVUaW1lID0gKERXT1JEKXYyOw0KKyAgZnQuZHdIaWdoRGF0ZVRpbWUgPSAoRFdPUkQpKHYyID4+IDMyKTsNCisgIHJldHVybiB0cnVlOw0KK30NCisNCitJbnQ2NCBGaWxlVGltZVRvVW5peFRpbWU2NChjb25zdCBGSUxFVElNRSAmZnQpIHRocm93KCkNCit7DQorICBVSW50NjQgd2luVGltZSA9ICgoKFVJbnQ2NClmdC5kd0hpZ2hEYXRlVGltZSkgPDwgMzIpICsgZnQuZHdMb3dEYXRlVGltZTsNCisgIHJldHVybiAoSW50NjQpKHdpblRpbWUgLyBrTnVtVGltZVF1YW50dW1zSW5TZWNvbmQpIC0ga1VuaXhUaW1lT2Zmc2V0Ow0KK30NCisNCitib29sIEZpbGVUaW1lVG9Vbml4VGltZShjb25zdCBGSUxFVElNRSAmZnQsIFVJbnQzMiAmdW5peFRpbWUpIHRocm93KCkNCit7DQorICBVSW50NjQgd2luVGltZSA9ICgoKFVJbnQ2NClmdC5kd0hpZ2hEYXRlVGltZSkgPDwgMzIpICsgZnQuZHdMb3dEYXRlVGltZTsNCisgIHdpblRpbWUgLz0ga051bVRpbWVRdWFudHVtc0luU2Vjb25kOw0KKyAgaWYgKHdpblRpbWUgPCBrVW5peFRpbWVPZmZzZXQpDQorICB7DQorICAgIHVuaXhUaW1lID0gMDsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKyAgd2luVGltZSAtPSBrVW5peFRpbWVPZmZzZXQ7DQorICBpZiAod2luVGltZSA+IDB4RkZGRkZGRkYpDQorICB7DQorICAgIHVuaXhUaW1lID0gMHhGRkZGRkZGRjsNCisgICAgcmV0dXJuIGZhbHNlOw0KKyAgfQ0KKyAgdW5peFRpbWUgPSAoVUludDMyKXdpblRpbWU7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBHZXRTZWNvbmRzU2luY2UxNjAxKHVuc2lnbmVkIHllYXIsIHVuc2lnbmVkIG1vbnRoLCB1bnNpZ25lZCBkYXksDQorICB1bnNpZ25lZCBob3VyLCB1bnNpZ25lZCBtaW4sIHVuc2lnbmVkIHNlYywgVUludDY0ICZyZXNTZWNvbmRzKSB0aHJvdygpDQorew0KKyAgcmVzU2Vjb25kcyA9IDA7DQorICBpZiAoeWVhciA8IGtGaWxlVGltZVN0YXJ0WWVhciB8fCB5ZWFyID49IDEwMDAwIHx8IG1vbnRoIDwgMSB8fCBtb250aCA+IDEyIHx8DQorICAgICAgZGF5IDwgMSB8fCBkYXkgPiAzMSB8fCBob3VyID4gMjMgfHwgbWluID4gNTkgfHwgc2VjID4gNTkpDQorICAgIHJldHVybiBmYWxzZTsNCisgIFVJbnQzMiBudW1ZZWFycyA9IHllYXIgLSBrRmlsZVRpbWVTdGFydFllYXI7DQorICBVSW50MzIgbnVtRGF5cyA9IG51bVllYXJzICogMzY1ICsgbnVtWWVhcnMgLyA0IC0gbnVtWWVhcnMgLyAxMDAgKyBudW1ZZWFycyAvIDQwMDsNCisgIEJ5dGUgbXNbXSA9IHsgMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMSB9Ow0KKyAgaWYgKHllYXIgJSA0ID09IDAgJiYgKHllYXIgJSAxMDAgIT0gMCB8fCB5ZWFyICUgNDAwID09IDApKQ0KKyAgICBtc1sxXSA9IDI5Ow0KKyAgbW9udGgtLTsNCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtb250aDsgaSsrKQ0KKyAgICBudW1EYXlzICs9IG1zW2ldOw0KKyAgbnVtRGF5cyArPSBkYXkgLSAxOw0KKyAgcmVzU2Vjb25kcyA9ICgoVUludDY0KShudW1EYXlzICogMjQgKyBob3VyKSAqIDYwICsgbWluKSAqIDYwICsgc2VjOw0KKyAgcmV0dXJuIHRydWU7DQorfQ0KKw0KK3ZvaWQgR2V0Q3VyVXRjRmlsZVRpbWUoRklMRVRJTUUgJmZ0KSB0aHJvdygpDQorew0KKyAgLy8gQm90aCB2YXJpYW50cyBwcm92aWRlIHNhbWUgbG93IHJlc29sdXRpb24gb24gV2luWFA6IGFib3V0IDE1IG1zLg0KKyAgLy8gQnV0IEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lIGlzIG11Y2ggZmFzdGVyLg0KKw0KKyAgI2lmZGVmIFVOREVSX0NFDQorICBTWVNURU1USU1FIHN0Ow0KKyAgR2V0U3lzdGVtVGltZSgmc3QpOw0KKyAgU3lzdGVtVGltZVRvRmlsZVRpbWUoJnN0LCAmZnQpOw0KKyAgI2Vsc2UNCisgIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKCZmdCk7DQorICAjZW5kaWYNCit9DQorDQorfX0NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL1RpbWVVdGlscy5oIGIvbHptYS9DUFAvV2luZG93cy9UaW1lVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjFmMTFmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9UaW1lVXRpbHMuaApAQCAtMCwwICsxLDIzIEBACisvLyBXaW5kb3dzL1RpbWVVdGlscy5oDQorDQorI2lmbmRlZiBfX1dJTkRPV1NfVElNRV9VVElMU19IDQorI2RlZmluZSBfX1dJTkRPV1NfVElNRV9VVElMU19IDQorDQorI2luY2x1ZGUgIi4uL0NvbW1vbi9NeVR5cGVzLmgiDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCituYW1lc3BhY2UgTlRpbWUgew0KKw0KK2Jvb2wgRG9zVGltZVRvRmlsZVRpbWUoVUludDMyIGRvc1RpbWUsIEZJTEVUSU1FICZmaWxlVGltZSkgdGhyb3coKTsNCitib29sIEZpbGVUaW1lVG9Eb3NUaW1lKGNvbnN0IEZJTEVUSU1FICZmaWxlVGltZSwgVUludDMyICZkb3NUaW1lKSB0aHJvdygpOw0KK3ZvaWQgVW5peFRpbWVUb0ZpbGVUaW1lKFVJbnQzMiB1bml4VGltZSwgRklMRVRJTUUgJmZpbGVUaW1lKSB0aHJvdygpOw0KK2Jvb2wgVW5peFRpbWU2NFRvRmlsZVRpbWUoSW50NjQgdW5peFRpbWUsIEZJTEVUSU1FICZmaWxlVGltZSkgdGhyb3coKTsNCitib29sIEZpbGVUaW1lVG9Vbml4VGltZShjb25zdCBGSUxFVElNRSAmZmlsZVRpbWUsIFVJbnQzMiAmdW5peFRpbWUpIHRocm93KCk7DQorSW50NjQgRmlsZVRpbWVUb1VuaXhUaW1lNjQoY29uc3QgRklMRVRJTUUgJmZ0KSB0aHJvdygpOw0KK2Jvb2wgR2V0U2Vjb25kc1NpbmNlMTYwMSh1bnNpZ25lZCB5ZWFyLCB1bnNpZ25lZCBtb250aCwgdW5zaWduZWQgZGF5LA0KKyAgdW5zaWduZWQgaG91ciwgdW5zaWduZWQgbWluLCB1bnNpZ25lZCBzZWMsIFVJbnQ2NCAmcmVzU2Vjb25kcykgdGhyb3coKTsNCit2b2lkIEdldEN1clV0Y0ZpbGVUaW1lKEZJTEVUSU1FICZmdCkgdGhyb3coKTsNCisNCit9fQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1BQL1dpbmRvd3MvV2luZG93LmNwcCBiL2x6bWEvQ1BQL1dpbmRvd3MvV2luZG93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGIwNjMwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9XaW5kb3cuY3BwCkBAIC0wLDAgKzEsMTY5IEBACisvLyBXaW5kb3dzL1dpbmRvdy5jcHANCisNCisjaW5jbHVkZSAiU3RkQWZ4LmgiDQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KKyNpbmNsdWRlICIuLi9Db21tb24vU3RyaW5nQ29udmVydC5oIg0KKyNlbmRpZg0KKyNpbmNsdWRlICJXaW5kb3cuaCINCisNCisjaWZuZGVmIF9VTklDT0RFDQorZXh0ZXJuIGJvb2wgZ19Jc05UOw0KKyNlbmRpZg0KKw0KK25hbWVzcGFjZSBOV2luZG93cyB7DQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KK0FUT00gTXlSZWdpc3RlckNsYXNzKENPTlNUIFdORENMQVNTVyAqd25kQ2xhc3MpDQorew0KKyAgaWYgKGdfSXNOVCkNCisgICAgcmV0dXJuIFJlZ2lzdGVyQ2xhc3NXKHduZENsYXNzKTsNCisgIFdORENMQVNTQSB3bmRDbGFzc0E7DQorICB3bmRDbGFzc0Euc3R5bGUgPSB3bmRDbGFzcy0+c3R5bGU7DQorICB3bmRDbGFzc0EubHBmblduZFByb2MgPSB3bmRDbGFzcy0+bHBmblduZFByb2M7DQorICB3bmRDbGFzc0EuY2JDbHNFeHRyYSA9IHduZENsYXNzLT5jYkNsc0V4dHJhOw0KKyAgd25kQ2xhc3NBLmNiV25kRXh0cmEgPSB3bmRDbGFzcy0+Y2JXbmRFeHRyYTsNCisgIHduZENsYXNzQS5oSW5zdGFuY2UgPSB3bmRDbGFzcy0+aEluc3RhbmNlOw0KKyAgd25kQ2xhc3NBLmhJY29uID0gd25kQ2xhc3MtPmhJY29uOw0KKyAgd25kQ2xhc3NBLmhDdXJzb3IgPSB3bmRDbGFzcy0+aEN1cnNvcjsNCisgIHduZENsYXNzQS5oYnJCYWNrZ3JvdW5kID0gd25kQ2xhc3MtPmhickJhY2tncm91bmQ7DQorICBBU3RyaW5nIG1lbnVOYW1lOw0KKyAgQVN0cmluZyBjbGFzc05hbWU7DQorICBpZiAoSVNfSU5UUkVTT1VSQ0Uod25kQ2xhc3MtPmxwc3pNZW51TmFtZSkpDQorICAgIHduZENsYXNzQS5scHN6TWVudU5hbWUgPSAoTFBDU1RSKXduZENsYXNzLT5scHN6TWVudU5hbWU7DQorICBlbHNlDQorICB7DQorICAgIG1lbnVOYW1lID0gR2V0U3lzdGVtU3RyaW5nKHduZENsYXNzLT5scHN6TWVudU5hbWUpOw0KKyAgICB3bmRDbGFzc0EubHBzek1lbnVOYW1lID0gbWVudU5hbWU7DQorICB9DQorICBpZiAoSVNfSU5UUkVTT1VSQ0Uod25kQ2xhc3MtPmxwc3pDbGFzc05hbWUpKQ0KKyAgICB3bmRDbGFzc0EubHBzekNsYXNzTmFtZSA9IChMUENTVFIpd25kQ2xhc3MtPmxwc3pDbGFzc05hbWU7DQorICBlbHNlDQorICB7DQorICAgIGNsYXNzTmFtZSA9IEdldFN5c3RlbVN0cmluZyh3bmRDbGFzcy0+bHBzekNsYXNzTmFtZSk7DQorICAgIHduZENsYXNzQS5scHN6Q2xhc3NOYW1lID0gY2xhc3NOYW1lOw0KKyAgfQ0KKyAgcmV0dXJuIFJlZ2lzdGVyQ2xhc3NBKCZ3bmRDbGFzc0EpOw0KK30NCisNCitib29sIENXaW5kb3c6OkNyZWF0ZShMUENXU1RSIGNsYXNzTmFtZSwNCisgICAgICBMUENXU1RSIHdpbmRvd05hbWUsIERXT1JEIHN0eWxlLA0KKyAgICAgIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LA0KKyAgICAgIEhXTkQgcGFyZW50V2luZG93LCBITUVOVSBpZE9ySE1lbnUsDQorICAgICAgSElOU1RBTkNFIGluc3RhbmNlLCBMUFZPSUQgY3JlYXRlUGFyYW0pDQorew0KKyAgaWYgKGdfSXNOVCkNCisgIHsNCisgICAgX3dpbmRvdyA9IDo6Q3JlYXRlV2luZG93VyhjbGFzc05hbWUsIHdpbmRvd05hbWUsDQorICAgICAgICBzdHlsZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcGFyZW50V2luZG93LA0KKyAgICAgICAgaWRPckhNZW51LCBpbnN0YW5jZSwgY3JlYXRlUGFyYW0pOw0KKyAgICAgcmV0dXJuIChfd2luZG93ICE9IE5VTEwpOw0KKyAgfQ0KKyAgcmV0dXJuIENyZWF0ZShHZXRTeXN0ZW1TdHJpbmcoY2xhc3NOYW1lKSwgR2V0U3lzdGVtU3RyaW5nKHdpbmRvd05hbWUpLA0KKyAgICAgICAgc3R5bGUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBhcmVudFdpbmRvdywNCisgICAgICAgIGlkT3JITWVudSwgaW5zdGFuY2UsIGNyZWF0ZVBhcmFtKTsNCit9DQorDQorYm9vbCBDV2luZG93OjpDcmVhdGVFeChEV09SRCBleFN0eWxlLCBMUENXU1RSIGNsYXNzTmFtZSwNCisgICAgICBMUENXU1RSIHdpbmRvd05hbWUsIERXT1JEIHN0eWxlLA0KKyAgICAgIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LA0KKyAgICAgIEhXTkQgcGFyZW50V2luZG93LCBITUVOVSBpZE9ySE1lbnUsDQorICAgICAgSElOU1RBTkNFIGluc3RhbmNlLCBMUFZPSUQgY3JlYXRlUGFyYW0pDQorew0KKyAgaWYgKGdfSXNOVCkNCisgIHsNCisgICAgX3dpbmRvdyA9IDo6Q3JlYXRlV2luZG93RXhXKGV4U3R5bGUsIGNsYXNzTmFtZSwgd2luZG93TmFtZSwNCisgICAgICBzdHlsZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcGFyZW50V2luZG93LA0KKyAgICAgIGlkT3JITWVudSwgaW5zdGFuY2UsIGNyZWF0ZVBhcmFtKTsNCisgICAgIHJldHVybiAoX3dpbmRvdyAhPSBOVUxMKTsNCisgIH0NCisgIEFTdHJpbmcgY2xhc3NOYW1lQTsNCisgIExQQ1NUUiBjbGFzc05hbWVQOw0KKyAgaWYgKElTX0lOVFJFU09VUkNFKGNsYXNzTmFtZSkpDQorICAgIGNsYXNzTmFtZVAgPSAoTFBDU1RSKWNsYXNzTmFtZTsNCisgIGVsc2UNCisgIHsNCisgICAgY2xhc3NOYW1lQSA9IEdldFN5c3RlbVN0cmluZyhjbGFzc05hbWUpOw0KKyAgICBjbGFzc05hbWVQID0gY2xhc3NOYW1lQTsNCisgIH0NCisgIEFTdHJpbmcgd2luZG93TmFtZUE7DQorICBMUENTVFIgd2luZG93TmFtZVA7DQorICBpZiAoSVNfSU5UUkVTT1VSQ0Uod2luZG93TmFtZSkpDQorICAgIHdpbmRvd05hbWVQID0gKExQQ1NUUil3aW5kb3dOYW1lOw0KKyAgZWxzZQ0KKyAgew0KKyAgICB3aW5kb3dOYW1lQSA9IEdldFN5c3RlbVN0cmluZyh3aW5kb3dOYW1lKTsNCisgICAgd2luZG93TmFtZVAgPSB3aW5kb3dOYW1lQTsNCisgIH0NCisgIHJldHVybiBDcmVhdGVFeChleFN0eWxlLCBjbGFzc05hbWVQLCB3aW5kb3dOYW1lUCwNCisgICAgICBzdHlsZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcGFyZW50V2luZG93LA0KKyAgICAgIGlkT3JITWVudSwgaW5zdGFuY2UsIGNyZWF0ZVBhcmFtKTsNCit9DQorDQorI2VuZGlmDQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KK2Jvb2wgTXlTZXRXaW5kb3dUZXh0KEhXTkQgd25kLCBMUENXU1RSIHMpDQorew0KKyAgaWYgKGdfSXNOVCkNCisgICAgcmV0dXJuIEJPT0xUb0Jvb2woOjpTZXRXaW5kb3dUZXh0Vyh3bmQsIHMpKTsNCisgIHJldHVybiBCT09MVG9Cb29sKDo6U2V0V2luZG93VGV4dEEod25kLCBVbmljb2RlU3RyaW5nVG9NdWx0aUJ5dGUocykpKTsNCit9DQorI2VuZGlmDQorDQorYm9vbCBDV2luZG93OjpHZXRUZXh0KENTeXNTdHJpbmcgJnMpDQorew0KKyAgcy5FbXB0eSgpOw0KKyAgaW50IGxlbmd0aCA9IEdldFRleHRMZW5ndGgoKTsNCisgIGlmIChsZW5ndGggPT0gMCkNCisgICAgcmV0dXJuICg6OkdldExhc3RFcnJvcigpID09IEVSUk9SX1NVQ0NFU1MpOw0KKyAgbGVuZ3RoID0gR2V0VGV4dChzLkdldEJ1ZmZlcihsZW5ndGgpLCBsZW5ndGggKyAxKTsNCisgIHMuUmVsZWFzZUJ1ZmZlcigpOw0KKyAgaWYgKGxlbmd0aCA9PSAwKQ0KKyAgICByZXR1cm4gKDo6R2V0TGFzdEVycm9yKCkgIT0gRVJST1JfU1VDQ0VTUyk7DQorICByZXR1cm4gdHJ1ZTsNCit9DQorDQorI2lmbmRlZiBfVU5JQ09ERQ0KK2Jvb2wgQ1dpbmRvdzo6R2V0VGV4dChVU3RyaW5nICZzKQ0KK3sNCisgIGlmIChnX0lzTlQpDQorICB7DQorICAgIHMuRW1wdHkoKTsNCisgICAgaW50IGxlbmd0aCA9IEdldFdpbmRvd1RleHRMZW5ndGhXKF93aW5kb3cpOw0KKyAgICBpZiAobGVuZ3RoID09IDApDQorICAgICAgcmV0dXJuICg6OkdldExhc3RFcnJvcigpID09IEVSUk9SX1NVQ0NFU1MpOw0KKyAgICBsZW5ndGggPSBHZXRXaW5kb3dUZXh0Vyhfd2luZG93LCBzLkdldEJ1ZmZlcihsZW5ndGgpLCBsZW5ndGggKyAxKTsNCisgICAgcy5SZWxlYXNlQnVmZmVyKCk7DQorICAgIGlmIChsZW5ndGggPT0gMCkNCisgICAgICByZXR1cm4gKDo6R2V0TGFzdEVycm9yKCkgPT0gRVJST1JfU1VDQ0VTUyk7DQorICAgIHJldHVybiB0cnVlOw0KKyAgfQ0KKyAgQ1N5c1N0cmluZyBzeXNTdHJpbmc7DQorICBib29sIHJlc3VsdCA9IEdldFRleHQoc3lzU3RyaW5nKTsNCisgIHMgPSBHZXRVbmljb2RlU3RyaW5nKHN5c1N0cmluZyk7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCisjZW5kaWYNCisNCisgDQorLyoNCitib29sIENXaW5kb3c6Ok1vZGlmeVN0eWxlQmFzZShpbnQgc3R5bGVPZmZzZXQsDQorICBEV09SRCByZW1vdmUsIERXT1JEIGFkZCwgVUlOVCBmbGFncykNCit7DQorICBEV09SRCBzdHlsZSA9IEdldFdpbmRvd0xvbmcoc3R5bGVPZmZzZXQpOw0KKyAgRFdPUkQgbmV3U3R5bGUgPSAoc3R5bGUgJiB+cmVtb3ZlKSB8IGFkZDsNCisgIGlmIChzdHlsZSA9PSBuZXdTdHlsZSkNCisgICAgcmV0dXJuIGZhbHNlOyAvLyBpdCBpcyBub3QgZ29vZA0KKw0KKyAgU2V0V2luZG93TG9uZyhzdHlsZU9mZnNldCwgbmV3U3R5bGUpOw0KKyAgaWYgKGZsYWdzICE9IDApDQorICB7DQorICAgIDo6U2V0V2luZG93UG9zKF93aW5kb3csIE5VTEwsIDAsIDAsIDAsIDAsDQorICAgICAgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfCBTV1BfTk9aT1JERVIgfCBTV1BfTk9BQ1RJVkFURSB8IGZsYWdzKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCisqLw0KKw0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NQUC9XaW5kb3dzL1dpbmRvdy5oIGIvbHptYS9DUFAvV2luZG93cy9XaW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGIyMzlkCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUFAvV2luZG93cy9XaW5kb3cuaApAQCAtMCwwICsxLDI4MyBAQAorLy8gV2luZG93cy9XaW5kb3cuaA0KKw0KKyNpZm5kZWYgX19XSU5ET1dTX1dJTkRPV19IDQorI2RlZmluZSBfX1dJTkRPV1NfV0lORE9XX0gNCisNCisjaW5jbHVkZSAiLi4vQ29tbW9uL015U3RyaW5nLmgiDQorDQorI2luY2x1ZGUgIkRlZnMuaCINCisNCisjaWZuZGVmIFVOREVSX0NFDQorDQorI2RlZmluZSBNWV9fV01fQ0hBTkdFVUlTVEFURSAgMHgwMTI3DQorI2RlZmluZSBNWV9fV01fVVBEQVRFVUlTVEFURSAgMHgwMTI4DQorI2RlZmluZSBNWV9fV01fUVVFUllVSVNUQVRFICAgMHgwMTI5DQorDQorLy8gTE9XT1JEKHdQYXJhbSkgdmFsdWVzIGluIFdNXypVSVNUQVRFDQorI2RlZmluZSBNWV9fVUlTX1NFVCAgICAgICAgIDENCisjZGVmaW5lIE1ZX19VSVNfQ0xFQVIgICAgICAgMg0KKyNkZWZpbmUgTVlfX1VJU19JTklUSUFMSVpFICAzDQorDQorLy8gSElXT1JEKHdQYXJhbSkgdmFsdWVzIGluIFdNXypVSVNUQVRFDQorI2RlZmluZSBNWV9fVUlTRl9ISURFRk9DVVMgIDB4MQ0KKyNkZWZpbmUgTVlfX1VJU0ZfSElERUFDQ0VMICAweDINCisjZGVmaW5lIE1ZX19VSVNGX0FDVElWRSAgICAgMHg0DQorDQorI2VuZGlmDQorDQorbmFtZXNwYWNlIE5XaW5kb3dzIHsNCisNCitpbmxpbmUgQVRPTSBNeVJlZ2lzdGVyQ2xhc3MoQ09OU1QgV05EQ0xBU1MgKnduZENsYXNzKQ0KKyAgeyByZXR1cm4gOjpSZWdpc3RlckNsYXNzKHduZENsYXNzKTsgfQ0KKw0KKyNpZm5kZWYgX1VOSUNPREUNCitBVE9NIE15UmVnaXN0ZXJDbGFzcyhDT05TVCBXTkRDTEFTU1cgKnduZENsYXNzKTsNCisjZW5kaWYNCisNCisjaWZkZWYgX1VOSUNPREUNCitpbmxpbmUgYm9vbCBNeVNldFdpbmRvd1RleHQoSFdORCB3bmQsIExQQ1dTVFIgcykgeyByZXR1cm4gQk9PTFRvQm9vbCg6OlNldFdpbmRvd1RleHQod25kLCBzKSk7IH0NCisjZWxzZQ0KK2Jvb2wgTXlTZXRXaW5kb3dUZXh0KEhXTkQgd25kLCBMUENXU1RSIHMpOw0KKyNlbmRpZg0KKw0KKw0KKyNpZmRlZiBVTkRFUl9DRQ0KKyNkZWZpbmUgR1dMUF9VU0VSREFUQSBHV0xfVVNFUkRBVEENCisjZGVmaW5lIEdXTFBfV05EUFJPQyBHV0xfV05EUFJPQw0KKyNkZWZpbmUgQlROU19CVVRUT04gVEJTVFlMRV9CVVRUT04NCisjZGVmaW5lIFdDX0NPTUJPQk9YVyBMIkNvbWJvQm94Ig0KKyNkZWZpbmUgRFdMUF9NU0dSRVNVTFQgRFdMX01TR1JFU1VMVA0KKyNlbmRpZg0KKw0KK2NsYXNzIENXaW5kb3cNCit7DQorcHJpdmF0ZToNCisgICAvLyBib29sIE1vZGlmeVN0eWxlQmFzZShpbnQgc3R5bGVPZmZzZXQsIERXT1JEIHJlbW92ZSwgRFdPUkQgYWRkLCBVSU5UIGZsYWdzKTsNCitwcm90ZWN0ZWQ6DQorICBIV05EIF93aW5kb3c7DQorcHVibGljOg0KKyAgQ1dpbmRvdyhIV05EIG5ld1dpbmRvdyA9IE5VTEwpOiBfd2luZG93KG5ld1dpbmRvdyl7fTsNCisgIENXaW5kb3cmIG9wZXJhdG9yPShIV05EIG5ld1dpbmRvdykNCisgIHsNCisgICAgX3dpbmRvdyA9IG5ld1dpbmRvdzsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgb3BlcmF0b3IgSFdORCgpIGNvbnN0IHsgcmV0dXJuIF93aW5kb3c7IH0NCisgIHZvaWQgQXR0YWNoKEhXTkQgbmV3V2luZG93KSB7IF93aW5kb3cgPSBuZXdXaW5kb3c7IH0NCisgIEhXTkQgRGV0YWNoKCkNCisgIHsNCisgICAgSFdORCB3aW5kb3cgPSBfd2luZG93Ow0KKyAgICBfd2luZG93ID0gTlVMTDsNCisgICAgcmV0dXJuIHdpbmRvdzsNCisgIH0NCisNCisgIGJvb2wgRm9yZWdyb3VuZCgpIHsgcmV0dXJuIEJPT0xUb0Jvb2woOjpTZXRGb3JlZ3JvdW5kV2luZG93KF93aW5kb3cpKTsgfQ0KKyAgDQorICBIV05EIEdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIDo6R2V0UGFyZW50KF93aW5kb3cpOyB9DQorICBib29sIEdldFdpbmRvd1JlY3QoTFBSRUNUIHJlY3QpIGNvbnN0IHsgcmV0dXJuIEJPT0xUb0Jvb2woOjpHZXRXaW5kb3dSZWN0KF93aW5kb3cscmVjdCkpOyB9DQorICAjaWZuZGVmIFVOREVSX0NFDQorICBib29sIElzWm9vbWVkKCkgY29uc3QgeyByZXR1cm4gQk9PTFRvQm9vbCg6OklzWm9vbWVkKF93aW5kb3cpKTsgfQ0KKyAgI2VuZGlmDQorICBib29sIENsaWVudFRvU2NyZWVuKExQUE9JTlQgcG9pbnQpIGNvbnN0IHsgcmV0dXJuIEJPT0xUb0Jvb2woOjpDbGllbnRUb1NjcmVlbihfd2luZG93LCBwb2ludCkpOyB9DQorICBib29sIFNjcmVlblRvQ2xpZW50KExQUE9JTlQgcG9pbnQpIGNvbnN0IHsgcmV0dXJuIEJPT0xUb0Jvb2woOjpTY3JlZW5Ub0NsaWVudChfd2luZG93LCBwb2ludCkpOyB9DQorDQorICBib29sIENyZWF0ZUV4KERXT1JEIGV4U3R5bGUsIExQQ1RTVFIgY2xhc3NOYW1lLA0KKyAgICAgIExQQ1RTVFIgd2luZG93TmFtZSwgRFdPUkQgc3R5bGUsDQorICAgICAgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsDQorICAgICAgSFdORCBwYXJlbnRXaW5kb3csIEhNRU5VIGlkT3JITWVudSwNCisgICAgICBISU5TVEFOQ0UgaW5zdGFuY2UsIExQVk9JRCBjcmVhdGVQYXJhbSkNCisgIHsNCisgICAgX3dpbmRvdyA9IDo6Q3JlYXRlV2luZG93RXgoZXhTdHlsZSwgY2xhc3NOYW1lLCB3aW5kb3dOYW1lLA0KKyAgICAgIHN0eWxlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwYXJlbnRXaW5kb3csDQorICAgICAgaWRPckhNZW51LCBpbnN0YW5jZSwgY3JlYXRlUGFyYW0pOw0KKyAgICByZXR1cm4gKF93aW5kb3cgIT0gTlVMTCk7DQorICB9DQorDQorICBib29sIENyZWF0ZShMUENUU1RSIGNsYXNzTmFtZSwNCisgICAgICBMUENUU1RSIHdpbmRvd05hbWUsIERXT1JEIHN0eWxlLA0KKyAgICAgIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LA0KKyAgICAgIEhXTkQgcGFyZW50V2luZG93LCBITUVOVSBpZE9ySE1lbnUsDQorICAgICAgSElOU1RBTkNFIGluc3RhbmNlLCBMUFZPSUQgY3JlYXRlUGFyYW0pDQorICB7DQorICAgIF93aW5kb3cgPSA6OkNyZWF0ZVdpbmRvdyhjbGFzc05hbWUsIHdpbmRvd05hbWUsDQorICAgICAgc3R5bGUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBhcmVudFdpbmRvdywNCisgICAgICBpZE9ySE1lbnUsIGluc3RhbmNlLCBjcmVhdGVQYXJhbSk7DQorICAgIHJldHVybiAoX3dpbmRvdyAhPSBOVUxMKTsNCisgIH0NCisNCisgICNpZm5kZWYgX1VOSUNPREUNCisgIGJvb2wgQ3JlYXRlKExQQ1dTVFIgY2xhc3NOYW1lLA0KKyAgICAgIExQQ1dTVFIgd2luZG93TmFtZSwgRFdPUkQgc3R5bGUsDQorICAgICAgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsDQorICAgICAgSFdORCBwYXJlbnRXaW5kb3csIEhNRU5VIGlkT3JITWVudSwNCisgICAgICBISU5TVEFOQ0UgaW5zdGFuY2UsIExQVk9JRCBjcmVhdGVQYXJhbSk7DQorICBib29sIENyZWF0ZUV4KERXT1JEIGV4U3R5bGUsIExQQ1dTVFIgY2xhc3NOYW1lLA0KKyAgICAgIExQQ1dTVFIgd2luZG93TmFtZSwgRFdPUkQgc3R5bGUsDQorICAgICAgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsDQorICAgICAgSFdORCBwYXJlbnRXaW5kb3csIEhNRU5VIGlkT3JITWVudSwNCisgICAgICBISU5TVEFOQ0UgaW5zdGFuY2UsIExQVk9JRCBjcmVhdGVQYXJhbSk7DQorICAjZW5kaWYNCisNCisNCisgIGJvb2wgRGVzdHJveSgpDQorICB7DQorICAgIGlmIChfd2luZG93ID09IE5VTEwpDQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIGJvb2wgcmVzdWx0ID0gQk9PTFRvQm9vbCg6OkRlc3Ryb3lXaW5kb3coX3dpbmRvdykpOw0KKyAgICBpZiAocmVzdWx0KQ0KKyAgICAgIF93aW5kb3cgPSBOVUxMOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKyAgYm9vbCBJc1dpbmRvdygpIHsgIHJldHVybiBCT09MVG9Cb29sKDo6SXNXaW5kb3coX3dpbmRvdykpOyB9DQorICBib29sIE1vdmUoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgcmVwYWludCA9IHRydWUpDQorICAgIHsgcmV0dXJuIEJPT0xUb0Jvb2woOjpNb3ZlV2luZG93KF93aW5kb3csIHgsIHksIHdpZHRoLCBoZWlnaHQsIEJvb2xUb0JPT0wocmVwYWludCkpKTsgfQ0KKw0KKyAgYm9vbCBDaGFuZ2VTdWJXaW5kb3dTaXplWChIV05EIGh3bmQsIGludCB4U2l6ZSkNCisgIHsNCisgICAgUkVDVCByZWN0Ow0KKyAgICA6OkdldFdpbmRvd1JlY3QoaHduZCwgJnJlY3QpOw0KKyAgICBQT0lOVCBwMTsNCisgICAgcDEueCA9IHJlY3QubGVmdDsNCisgICAgcDEueSA9IHJlY3QudG9wOw0KKyAgICBTY3JlZW5Ub0NsaWVudCgmcDEpOw0KKyAgICByZXR1cm4gQk9PTFRvQm9vbCg6Ok1vdmVXaW5kb3coaHduZCwgcDEueCwgcDEueSwgeFNpemUsIHJlY3QuYm90dG9tIC0gcmVjdC50b3AsIFRSVUUpKTsNCisgIH0NCisNCisgIHZvaWQgU2NyZWVuVG9DbGllbnQoUkVDVCAqcmVjdCkNCisgIHsNCisgICAgUE9JTlQgcDEsIHAyOw0KKyAgICBwMS54ID0gcmVjdC0+bGVmdDsNCisgICAgcDEueSA9IHJlY3QtPnRvcDsNCisgICAgcDIueCA9IHJlY3QtPnJpZ2h0Ow0KKyAgICBwMi55ID0gcmVjdC0+Ym90dG9tOw0KKyAgICBTY3JlZW5Ub0NsaWVudCgmcDEpOw0KKyAgICBTY3JlZW5Ub0NsaWVudCgmcDIpOw0KKw0KKyAgICByZWN0LT5sZWZ0ID0gcDEueDsNCisgICAgcmVjdC0+dG9wID0gcDEueTsNCisgICAgcmVjdC0+cmlnaHQgPSBwMi54Ow0KKyAgICByZWN0LT5ib3R0b20gPSBwMi55Ow0KKyAgfQ0KKw0KKyAgYm9vbCBHZXRDbGllbnRSZWN0KExQUkVDVCByZWN0KSB7IHJldHVybiBCT09MVG9Cb29sKDo6R2V0Q2xpZW50UmVjdChfd2luZG93LCByZWN0KSk7IH0NCisgIGJvb2wgU2hvdyhpbnQgY21kU2hvdykgeyByZXR1cm4gQk9PTFRvQm9vbCg6OlNob3dXaW5kb3coX3dpbmRvdywgY21kU2hvdykpOyB9DQorICBib29sIFNob3dfQm9vbChib29sIHNob3cpIHsgcmV0dXJuIFNob3coc2hvdyA/IFNXX1NIT1c6IFNXX0hJREUpOyB9DQorDQorICAjaWZuZGVmIFVOREVSX0NFDQorICBib29sIFNldFBsYWNlbWVudChDT05TVCBXSU5ET1dQTEFDRU1FTlQgKnBsYWNlbWVudCkgeyByZXR1cm4gQk9PTFRvQm9vbCg6OlNldFdpbmRvd1BsYWNlbWVudChfd2luZG93LCBwbGFjZW1lbnQpKTsgfQ0KKyAgYm9vbCBHZXRQbGFjZW1lbnQoV0lORE9XUExBQ0VNRU5UICpwbGFjZW1lbnQpIHsgcmV0dXJuIEJPT0xUb0Jvb2woOjpHZXRXaW5kb3dQbGFjZW1lbnQoX3dpbmRvdywgcGxhY2VtZW50KSk7IH0NCisgICNlbmRpZg0KKyAgYm9vbCBVcGRhdGUoKSB7IHJldHVybiBCT09MVG9Cb29sKDo6VXBkYXRlV2luZG93KF93aW5kb3cpKTsgfQ0KKyAgYm9vbCBJbnZhbGlkYXRlUmVjdChMUENSRUNUIHJlY3QsIGJvb2wgYmFja2dyb3VuZEVyYXNlID0gdHJ1ZSkNCisgICAgeyByZXR1cm4gQk9PTFRvQm9vbCg6OkludmFsaWRhdGVSZWN0KF93aW5kb3csIHJlY3QsIEJvb2xUb0JPT0woYmFja2dyb3VuZEVyYXNlKSkpOyB9DQorICB2b2lkIFNldFJlZHJhdyhib29sIHJlZHJhdyA9IHRydWUpIHsgU2VuZE1lc3NhZ2UoV01fU0VUUkVEUkFXLCBCb29sVG9CT09MKHJlZHJhdyksIDApOyB9DQorDQorICBMT05HX1BUUiBTZXRTdHlsZShMT05HX1BUUiBzdHlsZSkgeyByZXR1cm4gU2V0TG9uZ1B0cihHV0xfU1RZTEUsIHN0eWxlKTsgfQ0KKyAgTE9OR19QVFIgR2V0U3R5bGUoKSBjb25zdCB7IHJldHVybiBHZXRMb25nUHRyKEdXTF9TVFlMRSk7IH0NCisgIC8vIGJvb2wgTXlJc01heGltaXplZCgpIGNvbnN0IHsgcmV0dXJuICgoR2V0U3R5bGUoKSAmIFdTX01BWElNSVpFKSAhPSAwKTsgfQ0KKw0KKyAgTE9OR19QVFIgU2V0TG9uZyhpbnQgaW5kZXgsIExPTkcgbmV3TG9uZ1B0cikgeyByZXR1cm4gOjpTZXRXaW5kb3dMb25nKF93aW5kb3csIGluZGV4LCBuZXdMb25nUHRyKTsgfQ0KKyAgTE9OR19QVFIgR2V0TG9uZyhpbnQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIDo6R2V0V2luZG93TG9uZyhfd2luZG93LCBpbmRleCk7IH0NCisgIExPTkdfUFRSIFNldFVzZXJEYXRhTG9uZyhMT05HIG5ld0xvbmdQdHIpIHsgcmV0dXJuIFNldExvbmcoR1dMUF9VU0VSREFUQSwgbmV3TG9uZ1B0cik7IH0NCisgIExPTkdfUFRSIEdldFVzZXJEYXRhTG9uZygpIGNvbnN0IHsgcmV0dXJuIEdldExvbmcoR1dMUF9VU0VSREFUQSk7IH0NCisNCisNCisgICNpZmRlZiBVTkRFUl9DRQ0KKw0KKyAgTE9OR19QVFIgU2V0TG9uZ1B0cihpbnQgaW5kZXgsIExPTkdfUFRSIG5ld0xvbmdQdHIpIHsgcmV0dXJuIFNldExvbmcoaW5kZXgsIG5ld0xvbmdQdHIpOyB9DQorICBMT05HX1BUUiBHZXRMb25nUHRyKGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gR2V0TG9uZyhpbmRleCk7IH0NCisNCisgIExPTkdfUFRSIFNldFVzZXJEYXRhTG9uZ1B0cihMT05HX1BUUiBuZXdMb25nUHRyKSB7IHJldHVybiBTZXRVc2VyRGF0YUxvbmcobmV3TG9uZ1B0cik7IH0NCisgIExPTkdfUFRSIEdldFVzZXJEYXRhTG9uZ1B0cigpIGNvbnN0IHsgcmV0dXJuIEdldFVzZXJEYXRhTG9uZygpOyB9DQorICANCisgICNlbHNlDQorICANCisgIExPTkdfUFRSIFNldExvbmdQdHIoaW50IGluZGV4LCBMT05HX1BUUiBuZXdMb25nUHRyKQ0KKyAgICB7IHJldHVybiA6OlNldFdpbmRvd0xvbmdQdHIoX3dpbmRvdywgaW5kZXgsDQorICAgICAgICAgICNpZm5kZWYgX1dJTjY0DQorICAgICAgICAgIChMT05HKQ0KKyAgICAgICAgICAjZW5kaWYNCisgICAgICAgICAgbmV3TG9uZ1B0cik7IH0NCisgICNpZm5kZWYgX1VOSUNPREUNCisgIExPTkdfUFRSIFNldExvbmdQdHJXKGludCBpbmRleCwgTE9OR19QVFIgbmV3TG9uZ1B0cikNCisgICAgeyByZXR1cm4gOjpTZXRXaW5kb3dMb25nUHRyVyhfd2luZG93LCBpbmRleCwNCisgICAgICAgICAgI2lmbmRlZiBfV0lONjQNCisgICAgICAgICAgKExPTkcpDQorICAgICAgICAgICNlbmRpZg0KKyAgICAgICAgICBuZXdMb25nUHRyKTsgfQ0KKyAgI2VuZGlmDQorDQorICBMT05HX1BUUiBHZXRMb25nUHRyKGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gOjpHZXRXaW5kb3dMb25nUHRyKF93aW5kb3csIGluZGV4KTsgfQ0KKyAgTE9OR19QVFIgU2V0VXNlckRhdGFMb25nUHRyKExPTkdfUFRSIG5ld0xvbmdQdHIpIHsgcmV0dXJuIFNldExvbmdQdHIoR1dMUF9VU0VSREFUQSwgbmV3TG9uZ1B0cik7IH0NCisgIExPTkdfUFRSIEdldFVzZXJEYXRhTG9uZ1B0cigpIGNvbnN0IHsgcmV0dXJuIEdldExvbmdQdHIoR1dMUF9VU0VSREFUQSk7IH0NCisgIA0KKyAgI2VuZGlmDQorICANCisgIC8qDQorICBib29sIE1vZGlmeVN0eWxlKEhXTkQgaFduZCwgRFdPUkQgcmVtb3ZlLCBEV09SRCBhZGQsIFVJTlQgZmxhZ3MgPSAwKQ0KKyAgICB7ICByZXR1cm4gTW9kaWZ5U3R5bGVCYXNlKEdXTF9TVFlMRSwgcmVtb3ZlLCBhZGQsIGZsYWdzKTsgfQ0KKyAgYm9vbCBNb2RpZnlTdHlsZUV4KEhXTkQgaFduZCwgRFdPUkQgcmVtb3ZlLCBEV09SRCBhZGQsIFVJTlQgZmxhZ3MgPSAwKQ0KKyAgICB7IHJldHVybiBNb2RpZnlTdHlsZUJhc2UoR1dMX0VYU1RZTEUsIHJlbW92ZSwgYWRkLCBmbGFncyk7IH0NCisgICovDQorIA0KKyAgSFdORCBTZXRGb2N1cygpIHsgcmV0dXJuIDo6U2V0Rm9jdXMoX3dpbmRvdyk7IH0NCisNCisgIExSRVNVTFQgU2VuZE1lc3NhZ2UoVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtID0gMCwgTFBBUkFNIGxQYXJhbSA9IDApDQorICAgIHsgcmV0dXJuIDo6U2VuZE1lc3NhZ2UoX3dpbmRvdywgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pIDt9DQorICAjaWZuZGVmIF9VTklDT0RFDQorICBMUkVTVUxUIFNlbmRNZXNzYWdlVyhVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0gPSAwLCBMUEFSQU0gbFBhcmFtID0gMCkNCisgICAgeyByZXR1cm4gOjpTZW5kTWVzc2FnZVcoX3dpbmRvdywgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pIDt9DQorICAjZW5kaWYNCisNCisgIGJvb2wgUG9zdE1lc3NhZ2UoVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtID0gMCwgTFBBUkFNIGxQYXJhbSA9IDApDQorICAgIHsgIHJldHVybiBCT09MVG9Cb29sKDo6UG9zdE1lc3NhZ2UoX3dpbmRvdywgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pKSA7fQ0KKyAgI2lmbmRlZiBfVU5JQ09ERQ0KKyAgTFJFU1VMVCBQb3N0TWVzc2FnZVcoVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtID0gMCwgTFBBUkFNIGxQYXJhbSA9IDApDQorICAgIHsgcmV0dXJuIDo6UG9zdE1lc3NhZ2VXKF93aW5kb3csIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKSA7fQ0KKyAgI2VuZGlmDQorDQorICBib29sIFNldFRleHQoTFBDVFNUUiBzKSB7IHJldHVybiBCT09MVG9Cb29sKDo6U2V0V2luZG93VGV4dChfd2luZG93LCBzKSk7IH0NCisgICNpZm5kZWYgX1VOSUNPREUNCisgIGJvb2wgU2V0VGV4dChMUENXU1RSIHMpIHsgcmV0dXJuIE15U2V0V2luZG93VGV4dChfd2luZG93LCBzKTsgfQ0KKyAgI2VuZGlmDQorDQorICBpbnQgR2V0VGV4dExlbmd0aCgpIGNvbnN0DQorICAgIHsgcmV0dXJuIEdldFdpbmRvd1RleHRMZW5ndGgoX3dpbmRvdyk7IH0NCisgIFVJTlQgR2V0VGV4dChMUFRTVFIgc3RyaW5nLCBpbnQgbWF4Q291bnQpIGNvbnN0DQorICAgIHsgcmV0dXJuIEdldFdpbmRvd1RleHQoX3dpbmRvdywgc3RyaW5nLCBtYXhDb3VudCk7IH0NCisgIGJvb2wgR2V0VGV4dChDU3lzU3RyaW5nICZzKTsNCisgICNpZm5kZWYgX1VOSUNPREUNCisgIC8qDQorICBVSU5UIEdldFRleHQoTFBXU1RSIHN0cmluZywgaW50IG1heENvdW50KSBjb25zdA0KKyAgICB7IHJldHVybiBHZXRXaW5kb3dUZXh0Vyhfd2luZG93LCBzdHJpbmcsIG1heENvdW50KTsgfQ0KKyAgKi8NCisgIGJvb2wgR2V0VGV4dChVU3RyaW5nICZzKTsNCisgICNlbmRpZg0KKw0KKyAgYm9vbCBFbmFibGUoYm9vbCBlbmFibGUpDQorICAgIHsgcmV0dXJuIEJPT0xUb0Jvb2woOjpFbmFibGVXaW5kb3coX3dpbmRvdywgQm9vbFRvQk9PTChlbmFibGUpKSk7IH0NCisgIA0KKyAgYm9vbCBJc0VuYWJsZWQoKQ0KKyAgICB7IHJldHVybiBCT09MVG9Cb29sKDo6SXNXaW5kb3dFbmFibGVkKF93aW5kb3cpKTsgfQ0KKyAgDQorICAjaWZuZGVmIFVOREVSX0NFDQorICBITUVOVSBHZXRTeXN0ZW1NZW51KGJvb2wgcmV2ZXJ0KQ0KKyAgICB7IHJldHVybiA6OkdldFN5c3RlbU1lbnUoX3dpbmRvdywgQm9vbFRvQk9PTChyZXZlcnQpKTsgfQ0KKyAgI2VuZGlmDQorDQorICBVSU5UX1BUUiBTZXRUaW1lcihVSU5UX1BUUiBpZEV2ZW50LCBVSU5UIGVsYXBzZSwgVElNRVJQUk9DIHRpbWVyRnVuYyA9IDApDQorICAgIHsgcmV0dXJuIDo6U2V0VGltZXIoX3dpbmRvdywgaWRFdmVudCwgZWxhcHNlLCB0aW1lckZ1bmMpOyB9DQorICBib29sIEtpbGxUaW1lcihVSU5UX1BUUiBpZEV2ZW50KQ0KKyAgICB7cmV0dXJuIEJPT0xUb0Jvb2woOjpLaWxsVGltZXIoX3dpbmRvdywgaWRFdmVudCkpOyB9DQorDQorICBISUNPTiBTZXRJY29uKFdQQVJBTSBzaXplVHlwZSwgSElDT04gaWNvbikgeyByZXR1cm4gKEhJQ09OKVNlbmRNZXNzYWdlKFdNX1NFVElDT04sIHNpemVUeXBlLCAoTFBBUkFNKWljb24pOyB9DQorfTsNCisNCisjZGVmaW5lIFJFQ1RfU0laRV9YKHIpICgocikucmlnaHQgLSAocikubGVmdCkNCisjZGVmaW5lIFJFQ1RfU0laRV9ZKHIpICgocikuYm90dG9tIC0gKHIpLnRvcCkNCisNCitpbmxpbmUgYm9vbCBJc0tleURvd24oaW50IHZpcnRLZXkpIHsgcmV0dXJuICg6OkdldEtleVN0YXRlKHZpcnRLZXkpICYgMHg4MDAwKSAhPSAwOyB9DQorDQorfQ0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2x6bWEvQ1MvN3ppcC9Db21tb24vQ1JDLmNzIGIvbHptYS9DUy83emlwL0NvbW1vbi9DUkMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiYjg0NwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1MvN3ppcC9Db21tb24vQ1JDLmNzCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvbW1vbi9DUkMuY3MNCisNCituYW1lc3BhY2UgU2V2ZW5aaXANCit7DQorCWNsYXNzIENSQw0KKwl7DQorCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHVpbnRbXSBUYWJsZTsNCisNCisJCXN0YXRpYyBDUkMoKQ0KKwkJew0KKwkJCVRhYmxlID0gbmV3IHVpbnRbMjU2XTsNCisJCQljb25zdCB1aW50IGtQb2x5ID0gMHhFREI4ODMyMDsNCisJCQlmb3IgKHVpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykNCisJCQl7DQorCQkJCXVpbnQgciA9IGk7DQorCQkJCWZvciAoaW50IGogPSAwOyBqIDwgODsgaisrKQ0KKwkJCQkJaWYgKChyICYgMSkgIT0gMCkNCisJCQkJCQlyID0gKHIgPj4gMSkgXiBrUG9seTsNCisJCQkJCWVsc2UNCisJCQkJCQlyID4+PSAxOw0KKwkJCQlUYWJsZVtpXSA9IHI7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJdWludCBfdmFsdWUgPSAweEZGRkZGRkZGOw0KKw0KKwkJcHVibGljIHZvaWQgSW5pdCgpIHsgX3ZhbHVlID0gMHhGRkZGRkZGRjsgfQ0KKw0KKwkJcHVibGljIHZvaWQgVXBkYXRlQnl0ZShieXRlIGIpDQorCQl7DQorCQkJX3ZhbHVlID0gVGFibGVbKCgoYnl0ZSkoX3ZhbHVlKSkgXiBiKV0gXiAoX3ZhbHVlID4+IDgpOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgVXBkYXRlKGJ5dGVbXSBkYXRhLCB1aW50IG9mZnNldCwgdWludCBzaXplKQ0KKwkJew0KKwkJCWZvciAodWludCBpID0gMDsgaSA8IHNpemU7IGkrKykNCisJCQkJX3ZhbHVlID0gVGFibGVbKCgoYnl0ZSkoX3ZhbHVlKSkgXiBkYXRhW29mZnNldCArIGldKV0gXiAoX3ZhbHVlID4+IDgpOw0KKwkJfQ0KKw0KKwkJcHVibGljIHVpbnQgR2V0RGlnZXN0KCkgeyByZXR1cm4gX3ZhbHVlIF4gMHhGRkZGRkZGRjsgfQ0KKw0KKwkJc3RhdGljIHVpbnQgQ2FsY3VsYXRlRGlnZXN0KGJ5dGVbXSBkYXRhLCB1aW50IG9mZnNldCwgdWludCBzaXplKQ0KKwkJew0KKwkJCUNSQyBjcmMgPSBuZXcgQ1JDKCk7DQorCQkJLy8gY3JjLkluaXQoKTsNCisJCQljcmMuVXBkYXRlKGRhdGEsIG9mZnNldCwgc2l6ZSk7DQorCQkJcmV0dXJuIGNyYy5HZXREaWdlc3QoKTsNCisJCX0NCisNCisJCXN0YXRpYyBib29sIFZlcmlmeURpZ2VzdCh1aW50IGRpZ2VzdCwgYnl0ZVtdIGRhdGEsIHVpbnQgb2Zmc2V0LCB1aW50IHNpemUpDQorCQl7DQorCQkJcmV0dXJuIChDYWxjdWxhdGVEaWdlc3QoZGF0YSwgb2Zmc2V0LCBzaXplKSA9PSBkaWdlc3QpOw0KKwkJfQ0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1MvN3ppcC9Db21tb24vQ29tbWFuZExpbmVQYXJzZXIuY3MgYi9sem1hL0NTLzd6aXAvQ29tbW9uL0NvbW1hbmRMaW5lUGFyc2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NmY2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NTLzd6aXAvQ29tbW9uL0NvbW1hbmRMaW5lUGFyc2VyLmNzCkBAIC0wLDAgKzEsMjc0IEBACisvLyBDb21tYW5kTGluZVBhcnNlci5jcw0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7DQorDQorbmFtZXNwYWNlIFNldmVuWmlwLkNvbW1hbmRMaW5lUGFyc2VyDQorew0KKwlwdWJsaWMgZW51bSBTd2l0Y2hUeXBlDQorCXsNCisJCVNpbXBsZSwNCisJCVBvc3RNaW51cywNCisJCUxpbWl0ZWRQb3N0U3RyaW5nLA0KKwkJVW5MaW1pdGVkUG9zdFN0cmluZywNCisJCVBvc3RDaGFyDQorCX0NCisNCisJcHVibGljIGNsYXNzIFN3aXRjaEZvcm0NCisJew0KKwkJcHVibGljIHN0cmluZyBJRFN0cmluZzsNCisJCXB1YmxpYyBTd2l0Y2hUeXBlIFR5cGU7DQorCQlwdWJsaWMgYm9vbCBNdWx0aTsNCisJCXB1YmxpYyBpbnQgTWluTGVuOw0KKwkJcHVibGljIGludCBNYXhMZW47DQorCQlwdWJsaWMgc3RyaW5nIFBvc3RDaGFyU2V0Ow0KKw0KKwkJcHVibGljIFN3aXRjaEZvcm0oc3RyaW5nIGlkU3RyaW5nLCBTd2l0Y2hUeXBlIHR5cGUsIGJvb2wgbXVsdGksDQorCQkJaW50IG1pbkxlbiwgaW50IG1heExlbiwgc3RyaW5nIHBvc3RDaGFyU2V0KQ0KKwkJew0KKwkJCUlEU3RyaW5nID0gaWRTdHJpbmc7DQorCQkJVHlwZSA9IHR5cGU7DQorCQkJTXVsdGkgPSBtdWx0aTsNCisJCQlNaW5MZW4gPSBtaW5MZW47DQorCQkJTWF4TGVuID0gbWF4TGVuOw0KKwkJCVBvc3RDaGFyU2V0ID0gcG9zdENoYXJTZXQ7DQorCQl9DQorCQlwdWJsaWMgU3dpdGNoRm9ybShzdHJpbmcgaWRTdHJpbmcsIFN3aXRjaFR5cGUgdHlwZSwgYm9vbCBtdWx0aSwgaW50IG1pbkxlbik6DQorCQkJdGhpcyhpZFN0cmluZywgdHlwZSwgbXVsdGksIG1pbkxlbiwgMCwgIiIpDQorCQl7DQorCQl9DQorCQlwdWJsaWMgU3dpdGNoRm9ybShzdHJpbmcgaWRTdHJpbmcsIFN3aXRjaFR5cGUgdHlwZSwgYm9vbCBtdWx0aSk6DQorCQkJdGhpcyhpZFN0cmluZywgdHlwZSwgbXVsdGksIDApDQorCQl7DQorCQl9DQorCX0NCisNCisJcHVibGljIGNsYXNzIFN3aXRjaFJlc3VsdA0KKwl7DQorCQlwdWJsaWMgYm9vbCBUaGVyZUlzOw0KKwkJcHVibGljIGJvb2wgV2l0aE1pbnVzOw0KKwkJcHVibGljIEFycmF5TGlzdCBQb3N0U3RyaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsNCisJCXB1YmxpYyBpbnQgUG9zdENoYXJJbmRleDsNCisJCXB1YmxpYyBTd2l0Y2hSZXN1bHQoKQ0KKwkJew0KKwkJCVRoZXJlSXMgPSBmYWxzZTsNCisJCX0NCisJfQ0KKw0KKwlwdWJsaWMgY2xhc3MgUGFyc2VyDQorCXsNCisJCXB1YmxpYyBBcnJheUxpc3QgTm9uU3dpdGNoU3RyaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsNCisJCVN3aXRjaFJlc3VsdFtdIF9zd2l0Y2hlczsNCisNCisJCXB1YmxpYyBQYXJzZXIoaW50IG51bVN3aXRjaGVzKQ0KKwkJew0KKwkJCV9zd2l0Y2hlcyA9IG5ldyBTd2l0Y2hSZXN1bHRbbnVtU3dpdGNoZXNdOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtU3dpdGNoZXM7IGkrKykNCisJCQkJX3N3aXRjaGVzW2ldID0gbmV3IFN3aXRjaFJlc3VsdCgpOw0KKwkJfQ0KKw0KKwkJYm9vbCBQYXJzZVN0cmluZyhzdHJpbmcgc3JjU3RyaW5nLCBTd2l0Y2hGb3JtW10gc3dpdGNoRm9ybXMpDQorCQl7DQorCQkJaW50IGxlbiA9IHNyY1N0cmluZy5MZW5ndGg7DQorCQkJaWYgKGxlbiA9PSAwKQ0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJaW50IHBvcyA9IDA7DQorCQkJaWYgKCFJc0l0U3dpdGNoQ2hhcihzcmNTdHJpbmdbcG9zXSkpDQorCQkJCXJldHVybiBmYWxzZTsNCisJCQl3aGlsZSAocG9zIDwgbGVuKQ0KKwkJCXsNCisJCQkJaWYgKElzSXRTd2l0Y2hDaGFyKHNyY1N0cmluZ1twb3NdKSkNCisJCQkJCXBvcysrOw0KKwkJCQljb25zdCBpbnQga05vTGVuID0gLTE7DQorCQkJCWludCBtYXRjaGVkU3dpdGNoSW5kZXggPSAwOw0KKwkJCQlpbnQgbWF4TGVuID0ga05vTGVuOw0KKwkJCQlmb3IgKGludCBzd2l0Y2hJbmRleCA9IDA7IHN3aXRjaEluZGV4IDwgX3N3aXRjaGVzLkxlbmd0aDsgc3dpdGNoSW5kZXgrKykNCisJCQkJew0KKwkJCQkJaW50IHN3aXRjaExlbiA9IHN3aXRjaEZvcm1zW3N3aXRjaEluZGV4XS5JRFN0cmluZy5MZW5ndGg7DQorCQkJCQlpZiAoc3dpdGNoTGVuIDw9IG1heExlbiB8fCBwb3MgKyBzd2l0Y2hMZW4gPiBsZW4pDQorCQkJCQkJY29udGludWU7DQorCQkJCQlpZiAoU3RyaW5nLkNvbXBhcmUoc3dpdGNoRm9ybXNbc3dpdGNoSW5kZXhdLklEU3RyaW5nLCAwLA0KKwkJCQkJCQlzcmNTdHJpbmcsIHBvcywgc3dpdGNoTGVuLCB0cnVlKSA9PSAwKQ0KKwkJCQkJew0KKwkJCQkJCW1hdGNoZWRTd2l0Y2hJbmRleCA9IHN3aXRjaEluZGV4Ow0KKwkJCQkJCW1heExlbiA9IHN3aXRjaExlbjsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlpZiAobWF4TGVuID09IGtOb0xlbikNCisJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIm1heExlbiA9PSBrTm9MZW4iKTsNCisJCQkJU3dpdGNoUmVzdWx0IG1hdGNoZWRTd2l0Y2ggPSBfc3dpdGNoZXNbbWF0Y2hlZFN3aXRjaEluZGV4XTsNCisJCQkJU3dpdGNoRm9ybSBzd2l0Y2hGb3JtID0gc3dpdGNoRm9ybXNbbWF0Y2hlZFN3aXRjaEluZGV4XTsNCisJCQkJaWYgKCghc3dpdGNoRm9ybS5NdWx0aSkgJiYgbWF0Y2hlZFN3aXRjaC5UaGVyZUlzKQ0KKwkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigic3dpdGNoIG11c3QgYmUgc2luZ2xlIik7DQorCQkJCW1hdGNoZWRTd2l0Y2guVGhlcmVJcyA9IHRydWU7DQorCQkJCXBvcyArPSBtYXhMZW47DQorCQkJCWludCB0YWlsU2l6ZSA9IGxlbiAtIHBvczsNCisJCQkJU3dpdGNoVHlwZSB0eXBlID0gc3dpdGNoRm9ybS5UeXBlOw0KKwkJCQlzd2l0Y2ggKHR5cGUpDQorCQkJCXsNCisJCQkJCWNhc2UgU3dpdGNoVHlwZS5Qb3N0TWludXM6DQorCQkJCQkJew0KKwkJCQkJCQlpZiAodGFpbFNpemUgPT0gMCkNCisJCQkJCQkJCW1hdGNoZWRTd2l0Y2guV2l0aE1pbnVzID0gZmFsc2U7DQorCQkJCQkJCWVsc2UNCisJCQkJCQkJew0KKwkJCQkJCQkJbWF0Y2hlZFN3aXRjaC5XaXRoTWludXMgPSAoc3JjU3RyaW5nW3Bvc10gPT0ga1N3aXRjaE1pbnVzKTsNCisJCQkJCQkJCWlmIChtYXRjaGVkU3dpdGNoLldpdGhNaW51cykNCisJCQkJCQkJCQlwb3MrKzsNCisJCQkJCQkJfQ0KKwkJCQkJCQlicmVhazsNCisJCQkJCQl9DQorCQkJCQljYXNlIFN3aXRjaFR5cGUuUG9zdENoYXI6DQorCQkJCQkJew0KKwkJCQkJCQlpZiAodGFpbFNpemUgPCBzd2l0Y2hGb3JtLk1pbkxlbikNCisJCQkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oInN3aXRjaCBpcyBub3QgZnVsbCIpOw0KKwkJCQkJCQlzdHJpbmcgY2hhclNldCA9IHN3aXRjaEZvcm0uUG9zdENoYXJTZXQ7DQorCQkJCQkJCWNvbnN0IGludCBrRW1wdHlDaGFyVmFsdWUgPSAtMTsNCisJCQkJCQkJaWYgKHRhaWxTaXplID09IDApDQorCQkJCQkJCQltYXRjaGVkU3dpdGNoLlBvc3RDaGFySW5kZXggPSBrRW1wdHlDaGFyVmFsdWU7DQorCQkJCQkJCWVsc2UNCisJCQkJCQkJew0KKwkJCQkJCQkJaW50IGluZGV4ID0gY2hhclNldC5JbmRleE9mKHNyY1N0cmluZ1twb3NdKTsNCisJCQkJCQkJCWlmIChpbmRleCA8IDApDQorCQkJCQkJCQkJbWF0Y2hlZFN3aXRjaC5Qb3N0Q2hhckluZGV4ID0ga0VtcHR5Q2hhclZhbHVlOw0KKwkJCQkJCQkJZWxzZQ0KKwkJCQkJCQkJew0KKwkJCQkJCQkJCW1hdGNoZWRTd2l0Y2guUG9zdENoYXJJbmRleCA9IGluZGV4Ow0KKwkJCQkJCQkJCXBvcysrOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQorCQkJCQkJCWJyZWFrOw0KKwkJCQkJCX0NCisJCQkJCWNhc2UgU3dpdGNoVHlwZS5MaW1pdGVkUG9zdFN0cmluZzoNCisJCQkJCWNhc2UgU3dpdGNoVHlwZS5VbkxpbWl0ZWRQb3N0U3RyaW5nOg0KKwkJCQkJCXsNCisJCQkJCQkJaW50IG1pbkxlbiA9IHN3aXRjaEZvcm0uTWluTGVuOw0KKwkJCQkJCQlpZiAodGFpbFNpemUgPCBtaW5MZW4pDQorCQkJCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJzd2l0Y2ggaXMgbm90IGZ1bGwiKTsNCisJCQkJCQkJaWYgKHR5cGUgPT0gU3dpdGNoVHlwZS5VbkxpbWl0ZWRQb3N0U3RyaW5nKQ0KKwkJCQkJCQl7DQorCQkJCQkJCQltYXRjaGVkU3dpdGNoLlBvc3RTdHJpbmdzLkFkZChzcmNTdHJpbmcuU3Vic3RyaW5nKHBvcykpOw0KKwkJCQkJCQkJcmV0dXJuIHRydWU7DQorCQkJCQkJCX0NCisJCQkJCQkJU3RyaW5nIHN0cmluZ1N3aXRjaCA9IHNyY1N0cmluZy5TdWJzdHJpbmcocG9zLCBtaW5MZW4pOw0KKwkJCQkJCQlwb3MgKz0gbWluTGVuOw0KKwkJCQkJCQlmb3IgKGludCBpID0gbWluTGVuOyBpIDwgc3dpdGNoRm9ybS5NYXhMZW4gJiYgcG9zIDwgbGVuOyBpKyssIHBvcysrKQ0KKwkJCQkJCQl7DQorCQkJCQkJCQljaGFyIGMgPSBzcmNTdHJpbmdbcG9zXTsNCisJCQkJCQkJCWlmIChJc0l0U3dpdGNoQ2hhcihjKSkNCisJCQkJCQkJCQlicmVhazsNCisJCQkJCQkJCXN0cmluZ1N3aXRjaCArPSBjOw0KKwkJCQkJCQl9DQorCQkJCQkJCW1hdGNoZWRTd2l0Y2guUG9zdFN0cmluZ3MuQWRkKHN0cmluZ1N3aXRjaCk7DQorCQkJCQkJCWJyZWFrOw0KKwkJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQlyZXR1cm4gdHJ1ZTsNCisNCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIFBhcnNlU3RyaW5ncyhTd2l0Y2hGb3JtW10gc3dpdGNoRm9ybXMsIHN0cmluZ1tdIGNvbW1hbmRTdHJpbmdzKQ0KKwkJew0KKwkJCWludCBudW1Db21tYW5kU3RyaW5ncyA9IGNvbW1hbmRTdHJpbmdzLkxlbmd0aDsNCisJCQlib29sIHN0b3BTd2l0Y2ggPSBmYWxzZTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbW1hbmRTdHJpbmdzOyBpKyspDQorCQkJew0KKwkJCQlzdHJpbmcgcyA9IGNvbW1hbmRTdHJpbmdzW2ldOw0KKwkJCQlpZiAoc3RvcFN3aXRjaCkNCisJCQkJCU5vblN3aXRjaFN0cmluZ3MuQWRkKHMpOw0KKwkJCQllbHNlDQorCQkJCQlpZiAocyA9PSBrU3RvcFN3aXRjaFBhcnNpbmcpDQorCQkJCQlzdG9wU3dpdGNoID0gdHJ1ZTsNCisJCQkJZWxzZQ0KKwkJCQkJaWYgKCFQYXJzZVN0cmluZyhzLCBzd2l0Y2hGb3JtcykpDQorCQkJCQlOb25Td2l0Y2hTdHJpbmdzLkFkZChzKTsNCisJCQl9DQorCQl9DQorDQorCQlwdWJsaWMgU3dpdGNoUmVzdWx0IHRoaXNbaW50IGluZGV4XSB7IGdldCB7IHJldHVybiBfc3dpdGNoZXNbaW5kZXhdOyB9IH0NCisNCisJCXB1YmxpYyBzdGF0aWMgaW50IFBhcnNlQ29tbWFuZChDb21tYW5kRm9ybVtdIGNvbW1hbmRGb3Jtcywgc3RyaW5nIGNvbW1hbmRTdHJpbmcsDQorCQkJb3V0IHN0cmluZyBwb3N0U3RyaW5nKQ0KKwkJew0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZEZvcm1zLkxlbmd0aDsgaSsrKQ0KKwkJCXsNCisJCQkJc3RyaW5nIGlkID0gY29tbWFuZEZvcm1zW2ldLklEU3RyaW5nOw0KKwkJCQlpZiAoY29tbWFuZEZvcm1zW2ldLlBvc3RTdHJpbmdNb2RlKQ0KKwkJCQl7DQorCQkJCQlpZiAoY29tbWFuZFN0cmluZy5JbmRleE9mKGlkKSA9PSAwKQ0KKwkJCQkJew0KKwkJCQkJCXBvc3RTdHJpbmcgPSBjb21tYW5kU3RyaW5nLlN1YnN0cmluZyhpZC5MZW5ndGgpOw0KKwkJCQkJCXJldHVybiBpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJCWlmIChjb21tYW5kU3RyaW5nID09IGlkKQ0KKwkJCQl7DQorCQkJCQlwb3N0U3RyaW5nID0gIiI7DQorCQkJCQlyZXR1cm4gaTsNCisJCQkJfQ0KKwkJCX0NCisJCQlwb3N0U3RyaW5nID0gIiI7DQorCQkJcmV0dXJuIC0xOw0KKwkJfQ0KKw0KKwkJc3RhdGljIGJvb2wgUGFyc2VTdWJDaGFyc0NvbW1hbmQoaW50IG51bUZvcm1zLCBDb21tYW5kU3ViQ2hhcnNTZXRbXSBmb3JtcywNCisJCQlzdHJpbmcgY29tbWFuZFN0cmluZywgQXJyYXlMaXN0IGluZGljZXMpDQorCQl7DQorCQkJaW5kaWNlcy5DbGVhcigpOw0KKwkJCWludCBudW1Vc2VkQ2hhcnMgPSAwOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtRm9ybXM7IGkrKykNCisJCQl7DQorCQkJCUNvbW1hbmRTdWJDaGFyc1NldCBjaGFyc1NldCA9IGZvcm1zW2ldOw0KKwkJCQlpbnQgY3VycmVudEluZGV4ID0gLTE7DQorCQkJCWludCBsZW4gPSBjaGFyc1NldC5DaGFycy5MZW5ndGg7DQorCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGVuOyBqKyspDQorCQkJCXsNCisJCQkJCWNoYXIgYyA9IGNoYXJzU2V0LkNoYXJzW2pdOw0KKwkJCQkJaW50IG5ld0luZGV4ID0gY29tbWFuZFN0cmluZy5JbmRleE9mKGMpOw0KKwkJCQkJaWYgKG5ld0luZGV4ID49IDApDQorCQkJCQl7DQorCQkJCQkJaWYgKGN1cnJlbnRJbmRleCA+PSAwKQ0KKwkJCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCQkJaWYgKGNvbW1hbmRTdHJpbmcuSW5kZXhPZihjLCBuZXdJbmRleCArIDEpID49IDApDQorCQkJCQkJCXJldHVybiBmYWxzZTsNCisJCQkJCQljdXJyZW50SW5kZXggPSBqOw0KKwkJCQkJCW51bVVzZWRDaGFycysrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWlmIChjdXJyZW50SW5kZXggPT0gLTEgJiYgIWNoYXJzU2V0LkVtcHR5QWxsb3dlZCkNCisJCQkJCXJldHVybiBmYWxzZTsNCisJCQkJaW5kaWNlcy5BZGQoY3VycmVudEluZGV4KTsNCisJCQl9DQorCQkJcmV0dXJuIChudW1Vc2VkQ2hhcnMgPT0gY29tbWFuZFN0cmluZy5MZW5ndGgpOw0KKwkJfQ0KKwkJY29uc3QgY2hhciBrU3dpdGNoSUQxID0gJy0nOw0KKwkJY29uc3QgY2hhciBrU3dpdGNoSUQyID0gJy8nOw0KKw0KKwkJY29uc3QgY2hhciBrU3dpdGNoTWludXMgPSAnLSc7DQorCQljb25zdCBzdHJpbmcga1N0b3BTd2l0Y2hQYXJzaW5nID0gIi0tIjsNCisNCisJCXN0YXRpYyBib29sIElzSXRTd2l0Y2hDaGFyKGNoYXIgYykNCisJCXsNCisJCQlyZXR1cm4gKGMgPT0ga1N3aXRjaElEMSB8fCBjID09IGtTd2l0Y2hJRDIpOw0KKwkJfQ0KKwl9DQorDQorCXB1YmxpYyBjbGFzcyBDb21tYW5kRm9ybQ0KKwl7DQorCQlwdWJsaWMgc3RyaW5nIElEU3RyaW5nID0gIiI7DQorCQlwdWJsaWMgYm9vbCBQb3N0U3RyaW5nTW9kZSA9IGZhbHNlOw0KKwkJcHVibGljIENvbW1hbmRGb3JtKHN0cmluZyBpZFN0cmluZywgYm9vbCBwb3N0U3RyaW5nTW9kZSkNCisJCXsNCisJCQlJRFN0cmluZyA9IGlkU3RyaW5nOw0KKwkJCVBvc3RTdHJpbmdNb2RlID0gcG9zdFN0cmluZ01vZGU7DQorCQl9DQorCX0NCisNCisJY2xhc3MgQ29tbWFuZFN1YkNoYXJzU2V0DQorCXsNCisJCXB1YmxpYyBzdHJpbmcgQ2hhcnMgPSAiIjsNCisJCXB1YmxpYyBib29sIEVtcHR5QWxsb3dlZCA9IGZhbHNlOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1MvN3ppcC9Db21tb24vSW5CdWZmZXIuY3MgYi9sem1hL0NTLzd6aXAvQ29tbW9uL0luQnVmZmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNDdjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NTLzd6aXAvQ29tbW9uL0luQnVmZmVyLmNzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIEluQnVmZmVyLmNzDQorDQorbmFtZXNwYWNlIFNldmVuWmlwLkJ1ZmZlcg0KK3sNCisJcHVibGljIGNsYXNzIEluQnVmZmVyDQorCXsNCisJCWJ5dGVbXSBtX0J1ZmZlcjsNCisJCXVpbnQgbV9Qb3M7DQorCQl1aW50IG1fTGltaXQ7DQorCQl1aW50IG1fQnVmZmVyU2l6ZTsNCisJCVN5c3RlbS5JTy5TdHJlYW0gbV9TdHJlYW07DQorCQlib29sIG1fU3RyZWFtV2FzRXhoYXVzdGVkOw0KKwkJdWxvbmcgbV9Qcm9jZXNzZWRTaXplOw0KKw0KKwkJcHVibGljIEluQnVmZmVyKHVpbnQgYnVmZmVyU2l6ZSkNCisJCXsNCisJCQltX0J1ZmZlciA9IG5ldyBieXRlW2J1ZmZlclNpemVdOw0KKwkJCW1fQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBJbml0KFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtKQ0KKwkJew0KKwkJCW1fU3RyZWFtID0gc3RyZWFtOw0KKwkJCW1fUHJvY2Vzc2VkU2l6ZSA9IDA7DQorCQkJbV9MaW1pdCA9IDA7DQorCQkJbV9Qb3MgPSAwOw0KKwkJCW1fU3RyZWFtV2FzRXhoYXVzdGVkID0gZmFsc2U7DQorCQl9DQorDQorCQlwdWJsaWMgYm9vbCBSZWFkQmxvY2soKQ0KKwkJew0KKwkJCWlmIChtX1N0cmVhbVdhc0V4aGF1c3RlZCkNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCW1fUHJvY2Vzc2VkU2l6ZSArPSBtX1BvczsNCisJCQlpbnQgYU51bVByb2Nlc3NlZEJ5dGVzID0gbV9TdHJlYW0uUmVhZChtX0J1ZmZlciwgMCwgKGludCltX0J1ZmZlclNpemUpOw0KKwkJCW1fUG9zID0gMDsNCisJCQltX0xpbWl0ID0gKHVpbnQpYU51bVByb2Nlc3NlZEJ5dGVzOw0KKwkJCW1fU3RyZWFtV2FzRXhoYXVzdGVkID0gKGFOdW1Qcm9jZXNzZWRCeXRlcyA9PSAwKTsNCisJCQlyZXR1cm4gKCFtX1N0cmVhbVdhc0V4aGF1c3RlZCk7DQorCQl9DQorDQorDQorCQlwdWJsaWMgdm9pZCBSZWxlYXNlU3RyZWFtKCkNCisJCXsNCisJCQkvLyBtX1N0cmVhbS5DbG9zZSgpOyANCisJCQltX1N0cmVhbSA9IG51bGw7DQorCQl9DQorDQorCQlwdWJsaWMgYm9vbCBSZWFkQnl0ZShieXRlIGIpIC8vIGNoZWNrIGl0DQorCQl7DQorCQkJaWYgKG1fUG9zID49IG1fTGltaXQpDQorCQkJCWlmICghUmVhZEJsb2NrKCkpDQorCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJYiA9IG1fQnVmZmVyW21fUG9zKytdOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKw0KKwkJcHVibGljIGJ5dGUgUmVhZEJ5dGUoKQ0KKwkJew0KKwkJCS8vIHJldHVybiAoYnl0ZSltX1N0cmVhbS5SZWFkQnl0ZSgpOw0KKwkJCWlmIChtX1BvcyA+PSBtX0xpbWl0KQ0KKwkJCQlpZiAoIVJlYWRCbG9jaygpKQ0KKwkJCQkJcmV0dXJuIDB4RkY7DQorCQkJcmV0dXJuIG1fQnVmZmVyW21fUG9zKytdOw0KKwkJfQ0KKw0KKwkJcHVibGljIHVsb25nIEdldFByb2Nlc3NlZFNpemUoKQ0KKwkJew0KKwkJCXJldHVybiBtX1Byb2Nlc3NlZFNpemUgKyBtX1BvczsNCisJCX0NCisJfQ0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NTLzd6aXAvQ29tbW9uL091dEJ1ZmZlci5jcyBiL2x6bWEvQ1MvN3ppcC9Db21tb24vT3V0QnVmZmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMDVhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NTLzd6aXAvQ29tbW9uL091dEJ1ZmZlci5jcwpAQCAtMCwwICsxLDQ3IEBACisvLyBPdXRCdWZmZXIuY3MNCisNCituYW1lc3BhY2UgU2V2ZW5aaXAuQnVmZmVyDQorew0KKwlwdWJsaWMgY2xhc3MgT3V0QnVmZmVyDQorCXsNCisJCWJ5dGVbXSBtX0J1ZmZlcjsNCisJCXVpbnQgbV9Qb3M7DQorCQl1aW50IG1fQnVmZmVyU2l6ZTsNCisJCVN5c3RlbS5JTy5TdHJlYW0gbV9TdHJlYW07DQorCQl1bG9uZyBtX1Byb2Nlc3NlZFNpemU7DQorDQorCQlwdWJsaWMgT3V0QnVmZmVyKHVpbnQgYnVmZmVyU2l6ZSkNCisJCXsNCisJCQltX0J1ZmZlciA9IG5ldyBieXRlW2J1ZmZlclNpemVdOw0KKwkJCW1fQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBTZXRTdHJlYW0oU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0pIHsgbV9TdHJlYW0gPSBzdHJlYW07IH0NCisJCXB1YmxpYyB2b2lkIEZsdXNoU3RyZWFtKCkgeyBtX1N0cmVhbS5GbHVzaCgpOyB9DQorCQlwdWJsaWMgdm9pZCBDbG9zZVN0cmVhbSgpIHsgbV9TdHJlYW0uQ2xvc2UoKTsgfQ0KKwkJcHVibGljIHZvaWQgUmVsZWFzZVN0cmVhbSgpIHsgbV9TdHJlYW0gPSBudWxsOyB9DQorDQorCQlwdWJsaWMgdm9pZCBJbml0KCkNCisJCXsNCisJCQltX1Byb2Nlc3NlZFNpemUgPSAwOw0KKwkJCW1fUG9zID0gMDsNCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIFdyaXRlQnl0ZShieXRlIGIpDQorCQl7DQorCQkJbV9CdWZmZXJbbV9Qb3MrK10gPSBiOw0KKwkJCWlmIChtX1BvcyA+PSBtX0J1ZmZlclNpemUpDQorCQkJCUZsdXNoRGF0YSgpOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgRmx1c2hEYXRhKCkNCisJCXsNCisJCQlpZiAobV9Qb3MgPT0gMCkNCisJCQkJcmV0dXJuOw0KKwkJCW1fU3RyZWFtLldyaXRlKG1fQnVmZmVyLCAwLCAoaW50KW1fUG9zKTsNCisJCQltX1BvcyA9IDA7DQorCQl9DQorDQorCQlwdWJsaWMgdWxvbmcgR2V0UHJvY2Vzc2VkU2l6ZSgpIHsgcmV0dXJuIG1fUHJvY2Vzc2VkU2l6ZSArIG1fUG9zOyB9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUy83emlwL0NvbXByZXNzL0xaL0lNYXRjaEZpbmRlci5jcyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9MWi9JTWF0Y2hGaW5kZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmYWI4NgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9MWi9JTWF0Y2hGaW5kZXIuY3MKQEAgLTAsMCArMSwyNCBAQAorLy8gSU1hdGNoRmluZGVyLmNzDQorDQordXNpbmcgU3lzdGVtOw0KKw0KK25hbWVzcGFjZSBTZXZlblppcC5Db21wcmVzc2lvbi5MWg0KK3sNCisJaW50ZXJmYWNlIElJbldpbmRvd1N0cmVhbQ0KKwl7DQorCQl2b2lkIFNldFN0cmVhbShTeXN0ZW0uSU8uU3RyZWFtIGluU3RyZWFtKTsNCisJCXZvaWQgSW5pdCgpOw0KKwkJdm9pZCBSZWxlYXNlU3RyZWFtKCk7DQorCQlCeXRlIEdldEluZGV4Qnl0ZShJbnQzMiBpbmRleCk7DQorCQlVSW50MzIgR2V0TWF0Y2hMZW4oSW50MzIgaW5kZXgsIFVJbnQzMiBkaXN0YW5jZSwgVUludDMyIGxpbWl0KTsNCisJCVVJbnQzMiBHZXROdW1BdmFpbGFibGVCeXRlcygpOw0KKwl9DQorDQorCWludGVyZmFjZSBJTWF0Y2hGaW5kZXIgOiBJSW5XaW5kb3dTdHJlYW0NCisJew0KKwkJdm9pZCBDcmVhdGUoVUludDMyIGhpc3RvcnlTaXplLCBVSW50MzIga2VlcEFkZEJ1ZmZlckJlZm9yZSwNCisJCQkJVUludDMyIG1hdGNoTWF4TGVuLCBVSW50MzIga2VlcEFkZEJ1ZmZlckFmdGVyKTsNCisJCVVJbnQzMiBHZXRNYXRjaGVzKFVJbnQzMltdIGRpc3RhbmNlcyk7DQorCQl2b2lkIFNraXAoVUludDMyIG51bSk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUy83emlwL0NvbXByZXNzL0xaL0x6QmluVHJlZS5jcyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9MWi9MekJpblRyZWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5Y2EyMAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9MWi9MekJpblRyZWUuY3MKQEAgLTAsMCArMSwzNjcgQEAKKy8vIEx6QmluVHJlZS5jcw0KKw0KK3VzaW5nIFN5c3RlbTsNCisNCituYW1lc3BhY2UgU2V2ZW5aaXAuQ29tcHJlc3Npb24uTFoNCit7DQorCXB1YmxpYyBjbGFzcyBCaW5UcmVlIDogSW5XaW5kb3csIElNYXRjaEZpbmRlcg0KKwl7DQorCQlVSW50MzIgX2N5Y2xpY0J1ZmZlclBvczsNCisJCVVJbnQzMiBfY3ljbGljQnVmZmVyU2l6ZSA9IDA7DQorCQlVSW50MzIgX21hdGNoTWF4TGVuOw0KKw0KKwkJVUludDMyW10gX3NvbjsNCisJCVVJbnQzMltdIF9oYXNoOw0KKw0KKwkJVUludDMyIF9jdXRWYWx1ZSA9IDB4RkY7DQorCQlVSW50MzIgX2hhc2hNYXNrOw0KKwkJVUludDMyIF9oYXNoU2l6ZVN1bSA9IDA7DQorDQorCQlib29sIEhBU0hfQVJSQVkgPSB0cnVlOw0KKw0KKwkJY29uc3QgVUludDMyIGtIYXNoMlNpemUgPSAxIDw8IDEwOw0KKwkJY29uc3QgVUludDMyIGtIYXNoM1NpemUgPSAxIDw8IDE2Ow0KKwkJY29uc3QgVUludDMyIGtCVDJIYXNoU2l6ZSA9IDEgPDwgMTY7DQorCQljb25zdCBVSW50MzIga1N0YXJ0TWF4TGVuID0gMTsNCisJCWNvbnN0IFVJbnQzMiBrSGFzaDNPZmZzZXQgPSBrSGFzaDJTaXplOw0KKwkJY29uc3QgVUludDMyIGtFbXB0eUhhc2hWYWx1ZSA9IDA7DQorCQljb25zdCBVSW50MzIga01heFZhbEZvck5vcm1hbGl6ZSA9ICgoVUludDMyKTEgPDwgMzEpIC0gMTsNCisJDQorCQlVSW50MzIga051bUhhc2hEaXJlY3RCeXRlcyA9IDA7DQorCQlVSW50MzIga01pbk1hdGNoQ2hlY2sgPSA0Ow0KKwkJVUludDMyIGtGaXhIYXNoU2l6ZSA9IGtIYXNoMlNpemUgKyBrSGFzaDNTaXplOw0KKwkJDQorCQlwdWJsaWMgdm9pZCBTZXRUeXBlKGludCBudW1IYXNoQnl0ZXMpDQorCQl7DQorCQkJSEFTSF9BUlJBWSA9IChudW1IYXNoQnl0ZXMgPiAyKTsNCisJCQlpZiAoSEFTSF9BUlJBWSkNCisJCQl7DQorCQkJCWtOdW1IYXNoRGlyZWN0Qnl0ZXMgPSAwOw0KKwkJCQlrTWluTWF0Y2hDaGVjayA9IDQ7DQorCQkJCWtGaXhIYXNoU2l6ZSA9IGtIYXNoMlNpemUgKyBrSGFzaDNTaXplOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlrTnVtSGFzaERpcmVjdEJ5dGVzID0gMjsNCisJCQkJa01pbk1hdGNoQ2hlY2sgPSAyICsgMTsNCisJCQkJa0ZpeEhhc2hTaXplID0gMDsNCisJCQl9DQorCQl9DQorDQorCQlwdWJsaWMgbmV3IHZvaWQgU2V0U3RyZWFtKFN5c3RlbS5JTy5TdHJlYW0gc3RyZWFtKSB7IGJhc2UuU2V0U3RyZWFtKHN0cmVhbSk7IH0NCisJCXB1YmxpYyBuZXcgdm9pZCBSZWxlYXNlU3RyZWFtKCkgeyBiYXNlLlJlbGVhc2VTdHJlYW0oKTsgfQ0KKwkJDQorCQlwdWJsaWMgbmV3IHZvaWQgSW5pdCgpDQorCQl7DQorCQkJYmFzZS5Jbml0KCk7DQorCQkJZm9yIChVSW50MzIgaSA9IDA7IGkgPCBfaGFzaFNpemVTdW07IGkrKykNCisJCQkJX2hhc2hbaV0gPSBrRW1wdHlIYXNoVmFsdWU7DQorCQkJX2N5Y2xpY0J1ZmZlclBvcyA9IDA7DQorCQkJUmVkdWNlT2Zmc2V0cygtMSk7DQorCQl9DQorDQorCQlwdWJsaWMgbmV3IHZvaWQgTW92ZVBvcygpDQorCQl7DQorCQkJaWYgKCsrX2N5Y2xpY0J1ZmZlclBvcyA+PSBfY3ljbGljQnVmZmVyU2l6ZSkNCisJCQkJX2N5Y2xpY0J1ZmZlclBvcyA9IDA7DQorCQkJYmFzZS5Nb3ZlUG9zKCk7DQorCQkJaWYgKF9wb3MgPT0ga01heFZhbEZvck5vcm1hbGl6ZSkNCisJCQkJTm9ybWFsaXplKCk7DQorCQl9DQorDQorCQlwdWJsaWMgbmV3IEJ5dGUgR2V0SW5kZXhCeXRlKEludDMyIGluZGV4KSB7IHJldHVybiBiYXNlLkdldEluZGV4Qnl0ZShpbmRleCk7IH0NCisNCisJCXB1YmxpYyBuZXcgVUludDMyIEdldE1hdGNoTGVuKEludDMyIGluZGV4LCBVSW50MzIgZGlzdGFuY2UsIFVJbnQzMiBsaW1pdCkNCisJCXsgcmV0dXJuIGJhc2UuR2V0TWF0Y2hMZW4oaW5kZXgsIGRpc3RhbmNlLCBsaW1pdCk7IH0NCisNCisJCXB1YmxpYyBuZXcgVUludDMyIEdldE51bUF2YWlsYWJsZUJ5dGVzKCkgeyByZXR1cm4gYmFzZS5HZXROdW1BdmFpbGFibGVCeXRlcygpOyB9DQorDQorCQlwdWJsaWMgdm9pZCBDcmVhdGUoVUludDMyIGhpc3RvcnlTaXplLCBVSW50MzIga2VlcEFkZEJ1ZmZlckJlZm9yZSwNCisJCQkJVUludDMyIG1hdGNoTWF4TGVuLCBVSW50MzIga2VlcEFkZEJ1ZmZlckFmdGVyKQ0KKwkJew0KKwkJCWlmIChoaXN0b3J5U2l6ZSA+IGtNYXhWYWxGb3JOb3JtYWxpemUgLSAyNTYpDQorCQkJCXRocm93IG5ldyBFeGNlcHRpb24oKTsNCisJCQlfY3V0VmFsdWUgPSAxNiArIChtYXRjaE1heExlbiA+PiAxKTsNCisJCQkJDQorCQkJVUludDMyIHdpbmRvd1Jlc2VydlNpemUgPSAoaGlzdG9yeVNpemUgKyBrZWVwQWRkQnVmZmVyQmVmb3JlICsNCisJCQkJCW1hdGNoTWF4TGVuICsga2VlcEFkZEJ1ZmZlckFmdGVyKSAvIDIgKyAyNTY7DQorDQorCQkJYmFzZS5DcmVhdGUoaGlzdG9yeVNpemUgKyBrZWVwQWRkQnVmZmVyQmVmb3JlLCBtYXRjaE1heExlbiArIGtlZXBBZGRCdWZmZXJBZnRlciwgd2luZG93UmVzZXJ2U2l6ZSk7DQorDQorCQkJX21hdGNoTWF4TGVuID0gbWF0Y2hNYXhMZW47DQorDQorCQkJVUludDMyIGN5Y2xpY0J1ZmZlclNpemUgPSBoaXN0b3J5U2l6ZSArIDE7DQorCQkJaWYgKF9jeWNsaWNCdWZmZXJTaXplICE9IGN5Y2xpY0J1ZmZlclNpemUpDQorCQkJCV9zb24gPSBuZXcgVUludDMyWyhfY3ljbGljQnVmZmVyU2l6ZSA9IGN5Y2xpY0J1ZmZlclNpemUpICogMl07DQorDQorCQkJVUludDMyIGhzID0ga0JUMkhhc2hTaXplOw0KKw0KKwkJCWlmIChIQVNIX0FSUkFZKQ0KKwkJCXsNCisJCQkJaHMgPSBoaXN0b3J5U2l6ZSAtIDE7DQorCQkJCWhzIHw9IChocyA+PiAxKTsNCisJCQkJaHMgfD0gKGhzID4+IDIpOw0KKwkJCQlocyB8PSAoaHMgPj4gNCk7DQorCQkJCWhzIHw9IChocyA+PiA4KTsNCisJCQkJaHMgPj49IDE7DQorCQkJCWhzIHw9IDB4RkZGRjsNCisJCQkJaWYgKGhzID4gKDEgPDwgMjQpKQ0KKwkJCQkJaHMgPj49IDE7DQorCQkJCV9oYXNoTWFzayA9IGhzOw0KKwkJCQlocysrOw0KKwkJCQlocyArPSBrRml4SGFzaFNpemU7DQorCQkJfQ0KKwkJCWlmIChocyAhPSBfaGFzaFNpemVTdW0pDQorCQkJCV9oYXNoID0gbmV3IFVJbnQzMltfaGFzaFNpemVTdW0gPSBoc107DQorCQl9DQorDQorCQlwdWJsaWMgVUludDMyIEdldE1hdGNoZXMoVUludDMyW10gZGlzdGFuY2VzKQ0KKwkJew0KKwkJCVVJbnQzMiBsZW5MaW1pdDsNCisJCQlpZiAoX3BvcyArIF9tYXRjaE1heExlbiA8PSBfc3RyZWFtUG9zKQ0KKwkJCQlsZW5MaW1pdCA9IF9tYXRjaE1heExlbjsNCisJCQllbHNlDQorCQkJew0KKwkJCQlsZW5MaW1pdCA9IF9zdHJlYW1Qb3MgLSBfcG9zOw0KKwkJCQlpZiAobGVuTGltaXQgPCBrTWluTWF0Y2hDaGVjaykNCisJCQkJew0KKwkJCQkJTW92ZVBvcygpOw0KKwkJCQkJcmV0dXJuIDA7DQorCQkJCX0NCisJCQl9DQorDQorCQkJVUludDMyIG9mZnNldCA9IDA7DQorCQkJVUludDMyIG1hdGNoTWluUG9zID0gKF9wb3MgPiBfY3ljbGljQnVmZmVyU2l6ZSkgPyAoX3BvcyAtIF9jeWNsaWNCdWZmZXJTaXplKSA6IDA7DQorCQkJVUludDMyIGN1ciA9IF9idWZmZXJPZmZzZXQgKyBfcG9zOw0KKwkJCVVJbnQzMiBtYXhMZW4gPSBrU3RhcnRNYXhMZW47IC8vIHRvIGF2b2lkIGl0ZW1zIGZvciBsZW4gPCBoYXNoU2l6ZTsNCisJCQlVSW50MzIgaGFzaFZhbHVlLCBoYXNoMlZhbHVlID0gMCwgaGFzaDNWYWx1ZSA9IDA7DQorDQorCQkJaWYgKEhBU0hfQVJSQVkpDQorCQkJew0KKwkJCQlVSW50MzIgdGVtcCA9IENSQy5UYWJsZVtfYnVmZmVyQmFzZVtjdXJdXSBeIF9idWZmZXJCYXNlW2N1ciArIDFdOw0KKwkJCQloYXNoMlZhbHVlID0gdGVtcCAmIChrSGFzaDJTaXplIC0gMSk7DQorCQkJCXRlbXAgXj0gKChVSW50MzIpKF9idWZmZXJCYXNlW2N1ciArIDJdKSA8PCA4KTsNCisJCQkJaGFzaDNWYWx1ZSA9IHRlbXAgJiAoa0hhc2gzU2l6ZSAtIDEpOw0KKwkJCQloYXNoVmFsdWUgPSAodGVtcCBeIChDUkMuVGFibGVbX2J1ZmZlckJhc2VbY3VyICsgM11dIDw8IDUpKSAmIF9oYXNoTWFzazsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCQloYXNoVmFsdWUgPSBfYnVmZmVyQmFzZVtjdXJdIF4gKChVSW50MzIpKF9idWZmZXJCYXNlW2N1ciArIDFdKSA8PCA4KTsNCisNCisJCQlVSW50MzIgY3VyTWF0Y2ggPSBfaGFzaFtrRml4SGFzaFNpemUgKyBoYXNoVmFsdWVdOw0KKwkJCWlmIChIQVNIX0FSUkFZKQ0KKwkJCXsNCisJCQkJVUludDMyIGN1ck1hdGNoMiA9IF9oYXNoW2hhc2gyVmFsdWVdOw0KKwkJCQlVSW50MzIgY3VyTWF0Y2gzID0gX2hhc2hba0hhc2gzT2Zmc2V0ICsgaGFzaDNWYWx1ZV07DQorCQkJCV9oYXNoW2hhc2gyVmFsdWVdID0gX3BvczsNCisJCQkJX2hhc2hba0hhc2gzT2Zmc2V0ICsgaGFzaDNWYWx1ZV0gPSBfcG9zOw0KKwkJCQlpZiAoY3VyTWF0Y2gyID4gbWF0Y2hNaW5Qb3MpDQorCQkJCQlpZiAoX2J1ZmZlckJhc2VbX2J1ZmZlck9mZnNldCArIGN1ck1hdGNoMl0gPT0gX2J1ZmZlckJhc2VbY3VyXSkNCisJCQkJCXsNCisJCQkJCQlkaXN0YW5jZXNbb2Zmc2V0KytdID0gbWF4TGVuID0gMjsNCisJCQkJCQlkaXN0YW5jZXNbb2Zmc2V0KytdID0gX3BvcyAtIGN1ck1hdGNoMiAtIDE7DQorCQkJCQl9DQorCQkJCWlmIChjdXJNYXRjaDMgPiBtYXRjaE1pblBvcykNCisJCQkJCWlmIChfYnVmZmVyQmFzZVtfYnVmZmVyT2Zmc2V0ICsgY3VyTWF0Y2gzXSA9PSBfYnVmZmVyQmFzZVtjdXJdKQ0KKwkJCQkJew0KKwkJCQkJCWlmIChjdXJNYXRjaDMgPT0gY3VyTWF0Y2gyKQ0KKwkJCQkJCQlvZmZzZXQgLT0gMjsNCisJCQkJCQlkaXN0YW5jZXNbb2Zmc2V0KytdID0gbWF4TGVuID0gMzsNCisJCQkJCQlkaXN0YW5jZXNbb2Zmc2V0KytdID0gX3BvcyAtIGN1ck1hdGNoMyAtIDE7DQorCQkJCQkJY3VyTWF0Y2gyID0gY3VyTWF0Y2gzOw0KKwkJCQkJfQ0KKwkJCQlpZiAob2Zmc2V0ICE9IDAgJiYgY3VyTWF0Y2gyID09IGN1ck1hdGNoKQ0KKwkJCQl7DQorCQkJCQlvZmZzZXQgLT0gMjsNCisJCQkJCW1heExlbiA9IGtTdGFydE1heExlbjsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlfaGFzaFtrRml4SGFzaFNpemUgKyBoYXNoVmFsdWVdID0gX3BvczsNCisNCisJCQlVSW50MzIgcHRyMCA9IChfY3ljbGljQnVmZmVyUG9zIDw8IDEpICsgMTsNCisJCQlVSW50MzIgcHRyMSA9IChfY3ljbGljQnVmZmVyUG9zIDw8IDEpOw0KKw0KKwkJCVVJbnQzMiBsZW4wLCBsZW4xOw0KKwkJCWxlbjAgPSBsZW4xID0ga051bUhhc2hEaXJlY3RCeXRlczsNCisJCQkNCisJCQlpZiAoa051bUhhc2hEaXJlY3RCeXRlcyAhPSAwKQ0KKwkJCXsNCisJCQkJaWYgKGN1ck1hdGNoID4gbWF0Y2hNaW5Qb3MpDQorCQkJCXsNCisJCQkJCWlmIChfYnVmZmVyQmFzZVtfYnVmZmVyT2Zmc2V0ICsgY3VyTWF0Y2ggKyBrTnVtSGFzaERpcmVjdEJ5dGVzXSAhPQ0KKwkJCQkJCQlfYnVmZmVyQmFzZVtjdXIgKyBrTnVtSGFzaERpcmVjdEJ5dGVzXSkNCisJCQkJCXsNCisJCQkJCQlkaXN0YW5jZXNbb2Zmc2V0KytdID0gbWF4TGVuID0ga051bUhhc2hEaXJlY3RCeXRlczsNCisJCQkJCQlkaXN0YW5jZXNbb2Zmc2V0KytdID0gX3BvcyAtIGN1ck1hdGNoIC0gMTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisJCQkNCisJCQlVSW50MzIgY291bnQgPSBfY3V0VmFsdWU7DQorCQkJDQorCQkJd2hpbGUodHJ1ZSkNCisJCQl7DQorCQkJCWlmKGN1ck1hdGNoIDw9IG1hdGNoTWluUG9zIHx8IGNvdW50LS0gPT0gMCkNCisJCQkJew0KKwkJCQkJX3NvbltwdHIwXSA9IF9zb25bcHRyMV0gPSBrRW1wdHlIYXNoVmFsdWU7DQorCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCQlVSW50MzIgZGVsdGEgPSBfcG9zIC0gY3VyTWF0Y2g7DQorCQkJCVVJbnQzMiBjeWNsaWNQb3MgPSAoKGRlbHRhIDw9IF9jeWNsaWNCdWZmZXJQb3MpID8NCisJCQkJCQkJKF9jeWNsaWNCdWZmZXJQb3MgLSBkZWx0YSkgOg0KKwkJCQkJCQkoX2N5Y2xpY0J1ZmZlclBvcyAtIGRlbHRhICsgX2N5Y2xpY0J1ZmZlclNpemUpKSA8PCAxOw0KKw0KKwkJCQlVSW50MzIgcGJ5MSA9IF9idWZmZXJPZmZzZXQgKyBjdXJNYXRjaDsNCisJCQkJVUludDMyIGxlbiA9IE1hdGguTWluKGxlbjAsIGxlbjEpOw0KKwkJCQlpZiAoX2J1ZmZlckJhc2VbcGJ5MSArIGxlbl0gPT0gX2J1ZmZlckJhc2VbY3VyICsgbGVuXSkNCisJCQkJew0KKwkJCQkJd2hpbGUoKytsZW4gIT0gbGVuTGltaXQpDQorCQkJCQkJaWYgKF9idWZmZXJCYXNlW3BieTEgKyBsZW5dICE9IF9idWZmZXJCYXNlW2N1ciArIGxlbl0pDQorCQkJCQkJCWJyZWFrOw0KKwkJCQkJaWYgKG1heExlbiA8IGxlbikNCisJCQkJCXsNCisJCQkJCQlkaXN0YW5jZXNbb2Zmc2V0KytdID0gbWF4TGVuID0gbGVuOw0KKwkJCQkJCWRpc3RhbmNlc1tvZmZzZXQrK10gPSBkZWx0YSAtIDE7DQorCQkJCQkJaWYgKGxlbiA9PSBsZW5MaW1pdCkNCisJCQkJCQl7DQorCQkJCQkJCV9zb25bcHRyMV0gPSBfc29uW2N5Y2xpY1Bvc107DQorCQkJCQkJCV9zb25bcHRyMF0gPSBfc29uW2N5Y2xpY1BvcyArIDFdOw0KKwkJCQkJCQlicmVhazsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQkJaWYgKF9idWZmZXJCYXNlW3BieTEgKyBsZW5dIDwgX2J1ZmZlckJhc2VbY3VyICsgbGVuXSkNCisJCQkJew0KKwkJCQkJX3NvbltwdHIxXSA9IGN1ck1hdGNoOw0KKwkJCQkJcHRyMSA9IGN5Y2xpY1BvcyArIDE7DQorCQkJCQljdXJNYXRjaCA9IF9zb25bcHRyMV07DQorCQkJCQlsZW4xID0gbGVuOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJX3NvbltwdHIwXSA9IGN1ck1hdGNoOw0KKwkJCQkJcHRyMCA9IGN5Y2xpY1BvczsNCisJCQkJCWN1ck1hdGNoID0gX3NvbltwdHIwXTsNCisJCQkJCWxlbjAgPSBsZW47DQorCQkJCX0NCisJCQl9DQorCQkJTW92ZVBvcygpOw0KKwkJCXJldHVybiBvZmZzZXQ7DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBTa2lwKFVJbnQzMiBudW0pDQorCQl7DQorCQkJZG8NCisJCQl7DQorCQkJCVVJbnQzMiBsZW5MaW1pdDsNCisJCQkJaWYgKF9wb3MgKyBfbWF0Y2hNYXhMZW4gPD0gX3N0cmVhbVBvcykNCisJCQkJCWxlbkxpbWl0ID0gX21hdGNoTWF4TGVuOw0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCWxlbkxpbWl0ID0gX3N0cmVhbVBvcyAtIF9wb3M7DQorCQkJCQlpZiAobGVuTGltaXQgPCBrTWluTWF0Y2hDaGVjaykNCisJCQkJCXsNCisJCQkJCQlNb3ZlUG9zKCk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJVUludDMyIG1hdGNoTWluUG9zID0gKF9wb3MgPiBfY3ljbGljQnVmZmVyU2l6ZSkgPyAoX3BvcyAtIF9jeWNsaWNCdWZmZXJTaXplKSA6IDA7DQorCQkJCVVJbnQzMiBjdXIgPSBfYnVmZmVyT2Zmc2V0ICsgX3BvczsNCisNCisJCQkJVUludDMyIGhhc2hWYWx1ZTsNCisNCisJCQkJaWYgKEhBU0hfQVJSQVkpDQorCQkJCXsNCisJCQkJCVVJbnQzMiB0ZW1wID0gQ1JDLlRhYmxlW19idWZmZXJCYXNlW2N1cl1dIF4gX2J1ZmZlckJhc2VbY3VyICsgMV07DQorCQkJCQlVSW50MzIgaGFzaDJWYWx1ZSA9IHRlbXAgJiAoa0hhc2gyU2l6ZSAtIDEpOw0KKwkJCQkJX2hhc2hbaGFzaDJWYWx1ZV0gPSBfcG9zOw0KKwkJCQkJdGVtcCBePSAoKFVJbnQzMikoX2J1ZmZlckJhc2VbY3VyICsgMl0pIDw8IDgpOw0KKwkJCQkJVUludDMyIGhhc2gzVmFsdWUgPSB0ZW1wICYgKGtIYXNoM1NpemUgLSAxKTsNCisJCQkJCV9oYXNoW2tIYXNoM09mZnNldCArIGhhc2gzVmFsdWVdID0gX3BvczsNCisJCQkJCWhhc2hWYWx1ZSA9ICh0ZW1wIF4gKENSQy5UYWJsZVtfYnVmZmVyQmFzZVtjdXIgKyAzXV0gPDwgNSkpICYgX2hhc2hNYXNrOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJCWhhc2hWYWx1ZSA9IF9idWZmZXJCYXNlW2N1cl0gXiAoKFVJbnQzMikoX2J1ZmZlckJhc2VbY3VyICsgMV0pIDw8IDgpOw0KKw0KKwkJCQlVSW50MzIgY3VyTWF0Y2ggPSBfaGFzaFtrRml4SGFzaFNpemUgKyBoYXNoVmFsdWVdOw0KKwkJCQlfaGFzaFtrRml4SGFzaFNpemUgKyBoYXNoVmFsdWVdID0gX3BvczsNCisNCisJCQkJVUludDMyIHB0cjAgPSAoX2N5Y2xpY0J1ZmZlclBvcyA8PCAxKSArIDE7DQorCQkJCVVJbnQzMiBwdHIxID0gKF9jeWNsaWNCdWZmZXJQb3MgPDwgMSk7DQorDQorCQkJCVVJbnQzMiBsZW4wLCBsZW4xOw0KKwkJCQlsZW4wID0gbGVuMSA9IGtOdW1IYXNoRGlyZWN0Qnl0ZXM7DQorDQorCQkJCVVJbnQzMiBjb3VudCA9IF9jdXRWYWx1ZTsNCisJCQkJd2hpbGUgKHRydWUpDQorCQkJCXsNCisJCQkJCWlmIChjdXJNYXRjaCA8PSBtYXRjaE1pblBvcyB8fCBjb3VudC0tID09IDApDQorCQkJCQl7DQorCQkJCQkJX3NvbltwdHIwXSA9IF9zb25bcHRyMV0gPSBrRW1wdHlIYXNoVmFsdWU7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorDQorCQkJCQlVSW50MzIgZGVsdGEgPSBfcG9zIC0gY3VyTWF0Y2g7DQorCQkJCQlVSW50MzIgY3ljbGljUG9zID0gKChkZWx0YSA8PSBfY3ljbGljQnVmZmVyUG9zKSA/DQorCQkJCQkJCQkoX2N5Y2xpY0J1ZmZlclBvcyAtIGRlbHRhKSA6DQorCQkJCQkJCQkoX2N5Y2xpY0J1ZmZlclBvcyAtIGRlbHRhICsgX2N5Y2xpY0J1ZmZlclNpemUpKSA8PCAxOw0KKw0KKwkJCQkJVUludDMyIHBieTEgPSBfYnVmZmVyT2Zmc2V0ICsgY3VyTWF0Y2g7DQorCQkJCQlVSW50MzIgbGVuID0gTWF0aC5NaW4obGVuMCwgbGVuMSk7DQorCQkJCQlpZiAoX2J1ZmZlckJhc2VbcGJ5MSArIGxlbl0gPT0gX2J1ZmZlckJhc2VbY3VyICsgbGVuXSkNCisJCQkJCXsNCisJCQkJCQl3aGlsZSAoKytsZW4gIT0gbGVuTGltaXQpDQorCQkJCQkJCWlmIChfYnVmZmVyQmFzZVtwYnkxICsgbGVuXSAhPSBfYnVmZmVyQmFzZVtjdXIgKyBsZW5dKQ0KKwkJCQkJCQkJYnJlYWs7DQorCQkJCQkJaWYgKGxlbiA9PSBsZW5MaW1pdCkNCisJCQkJCQl7DQorCQkJCQkJCV9zb25bcHRyMV0gPSBfc29uW2N5Y2xpY1Bvc107DQorCQkJCQkJCV9zb25bcHRyMF0gPSBfc29uW2N5Y2xpY1BvcyArIDFdOw0KKwkJCQkJCQlicmVhazsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCQlpZiAoX2J1ZmZlckJhc2VbcGJ5MSArIGxlbl0gPCBfYnVmZmVyQmFzZVtjdXIgKyBsZW5dKQ0KKwkJCQkJew0KKwkJCQkJCV9zb25bcHRyMV0gPSBjdXJNYXRjaDsNCisJCQkJCQlwdHIxID0gY3ljbGljUG9zICsgMTsNCisJCQkJCQljdXJNYXRjaCA9IF9zb25bcHRyMV07DQorCQkJCQkJbGVuMSA9IGxlbjsNCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQlfc29uW3B0cjBdID0gY3VyTWF0Y2g7DQorCQkJCQkJcHRyMCA9IGN5Y2xpY1BvczsNCisJCQkJCQljdXJNYXRjaCA9IF9zb25bcHRyMF07DQorCQkJCQkJbGVuMCA9IGxlbjsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlNb3ZlUG9zKCk7DQorCQkJfQ0KKwkJCXdoaWxlICgtLW51bSAhPSAwKTsNCisJCX0NCisNCisJCXZvaWQgTm9ybWFsaXplTGlua3MoVUludDMyW10gaXRlbXMsIFVJbnQzMiBudW1JdGVtcywgVUludDMyIHN1YlZhbHVlKQ0KKwkJew0KKwkJCWZvciAoVUludDMyIGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykNCisJCQl7DQorCQkJCVVJbnQzMiB2YWx1ZSA9IGl0ZW1zW2ldOw0KKwkJCQlpZiAodmFsdWUgPD0gc3ViVmFsdWUpDQorCQkJCQl2YWx1ZSA9IGtFbXB0eUhhc2hWYWx1ZTsNCisJCQkJZWxzZQ0KKwkJCQkJdmFsdWUgLT0gc3ViVmFsdWU7DQorCQkJCWl0ZW1zW2ldID0gdmFsdWU7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJdm9pZCBOb3JtYWxpemUoKQ0KKwkJew0KKwkJCVVJbnQzMiBzdWJWYWx1ZSA9IF9wb3MgLSBfY3ljbGljQnVmZmVyU2l6ZTsNCisJCQlOb3JtYWxpemVMaW5rcyhfc29uLCBfY3ljbGljQnVmZmVyU2l6ZSAqIDIsIHN1YlZhbHVlKTsNCisJCQlOb3JtYWxpemVMaW5rcyhfaGFzaCwgX2hhc2hTaXplU3VtLCBzdWJWYWx1ZSk7DQorCQkJUmVkdWNlT2Zmc2V0cygoSW50MzIpc3ViVmFsdWUpOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgU2V0Q3V0VmFsdWUoVUludDMyIGN1dFZhbHVlKSB7IF9jdXRWYWx1ZSA9IGN1dFZhbHVlOyB9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUy83emlwL0NvbXByZXNzL0xaL0x6SW5XaW5kb3cuY3MgYi9sem1hL0NTLzd6aXAvQ29tcHJlc3MvTFovTHpJbldpbmRvdy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTk3NGNlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUy83emlwL0NvbXByZXNzL0xaL0x6SW5XaW5kb3cuY3MKQEAgLTAsMCArMSwxMzIgQEAKKy8vIEx6SW5XaW5kb3cuY3MNCisNCit1c2luZyBTeXN0ZW07DQorDQorbmFtZXNwYWNlIFNldmVuWmlwLkNvbXByZXNzaW9uLkxaDQorew0KKwlwdWJsaWMgY2xhc3MgSW5XaW5kb3cNCisJew0KKwkJcHVibGljIEJ5dGVbXSBfYnVmZmVyQmFzZSA9IG51bGw7IC8vIHBvaW50ZXIgdG8gYnVmZmVyIHdpdGggZGF0YQ0KKwkJU3lzdGVtLklPLlN0cmVhbSBfc3RyZWFtOw0KKwkJVUludDMyIF9wb3NMaW1pdDsgLy8gb2Zmc2V0IChmcm9tIF9idWZmZXIpIG9mIGZpcnN0IGJ5dGUgd2hlbiBuZXcgYmxvY2sgcmVhZGluZyBtdXN0IGJlIGRvbmUNCisJCWJvb2wgX3N0cmVhbUVuZFdhc1JlYWNoZWQ7IC8vIGlmICh0cnVlKSB0aGVuIF9zdHJlYW1Qb3Mgc2hvd3MgcmVhbCBlbmQgb2Ygc3RyZWFtDQorDQorCQlVSW50MzIgX3BvaW50ZXJUb0xhc3RTYWZlUG9zaXRpb247DQorDQorCQlwdWJsaWMgVUludDMyIF9idWZmZXJPZmZzZXQ7DQorDQorCQlwdWJsaWMgVUludDMyIF9ibG9ja1NpemU7IC8vIFNpemUgb2YgQWxsb2NhdGVkIG1lbW9yeSBibG9jaw0KKwkJcHVibGljIFVJbnQzMiBfcG9zOyAvLyBvZmZzZXQgKGZyb20gX2J1ZmZlcikgb2YgY3VyZW50IGJ5dGUNCisJCVVJbnQzMiBfa2VlcFNpemVCZWZvcmU7IC8vIGhvdyBtYW55IEJZVEVzIG11c3QgYmUga2VwdCBpbiBidWZmZXIgYmVmb3JlIF9wb3MNCisJCVVJbnQzMiBfa2VlcFNpemVBZnRlcjsgLy8gaG93IG1hbnkgQllURXMgbXVzdCBiZSBrZXB0IGJ1ZmZlciBhZnRlciBfcG9zDQorCQlwdWJsaWMgVUludDMyIF9zdHJlYW1Qb3M7IC8vIG9mZnNldCAoZnJvbSBfYnVmZmVyKSBvZiBmaXJzdCBub3QgcmVhZCBieXRlIGZyb20gU3RyZWFtDQorDQorCQlwdWJsaWMgdm9pZCBNb3ZlQmxvY2soKQ0KKwkJew0KKwkJCVVJbnQzMiBvZmZzZXQgPSAoVUludDMyKShfYnVmZmVyT2Zmc2V0KSArIF9wb3MgLSBfa2VlcFNpemVCZWZvcmU7DQorCQkJLy8gd2UgbmVlZCBvbmUgYWRkaXRpb25hbCBieXRlLCBzaW5jZSBNb3ZlUG9zIG1vdmVzIG9uIDEgYnl0ZS4NCisJCQlpZiAob2Zmc2V0ID4gMCkNCisJCQkJb2Zmc2V0LS07DQorCQkJDQorCQkJVUludDMyIG51bUJ5dGVzID0gKFVJbnQzMikoX2J1ZmZlck9mZnNldCkgKyBfc3RyZWFtUG9zIC0gb2Zmc2V0Ow0KKw0KKwkJCS8vIGNoZWNrIG5lZ2F0aXZlIG9mZnNldCA/Pz8/DQorCQkJZm9yIChVSW50MzIgaSA9IDA7IGkgPCBudW1CeXRlczsgaSsrKQ0KKwkJCQlfYnVmZmVyQmFzZVtpXSA9IF9idWZmZXJCYXNlW29mZnNldCArIGldOw0KKwkJCV9idWZmZXJPZmZzZXQgLT0gb2Zmc2V0Ow0KKwkJfQ0KKw0KKwkJcHVibGljIHZpcnR1YWwgdm9pZCBSZWFkQmxvY2soKQ0KKwkJew0KKwkJCWlmIChfc3RyZWFtRW5kV2FzUmVhY2hlZCkNCisJCQkJcmV0dXJuOw0KKwkJCXdoaWxlICh0cnVlKQ0KKwkJCXsNCisJCQkJaW50IHNpemUgPSAoaW50KSgoMCAtIF9idWZmZXJPZmZzZXQpICsgX2Jsb2NrU2l6ZSAtIF9zdHJlYW1Qb3MpOw0KKwkJCQlpZiAoc2l6ZSA9PSAwKQ0KKwkJCQkJcmV0dXJuOw0KKwkJCQlpbnQgbnVtUmVhZEJ5dGVzID0gX3N0cmVhbS5SZWFkKF9idWZmZXJCYXNlLCAoaW50KShfYnVmZmVyT2Zmc2V0ICsgX3N0cmVhbVBvcyksIHNpemUpOw0KKwkJCQlpZiAobnVtUmVhZEJ5dGVzID09IDApDQorCQkJCXsNCisJCQkJCV9wb3NMaW1pdCA9IF9zdHJlYW1Qb3M7DQorCQkJCQlVSW50MzIgcG9pbnRlclRvUG9zdGlvbiA9IF9idWZmZXJPZmZzZXQgKyBfcG9zTGltaXQ7DQorCQkJCQlpZiAocG9pbnRlclRvUG9zdGlvbiA+IF9wb2ludGVyVG9MYXN0U2FmZVBvc2l0aW9uKQ0KKwkJCQkJCV9wb3NMaW1pdCA9IChVSW50MzIpKF9wb2ludGVyVG9MYXN0U2FmZVBvc2l0aW9uIC0gX2J1ZmZlck9mZnNldCk7DQorDQorCQkJCQlfc3RyZWFtRW5kV2FzUmVhY2hlZCA9IHRydWU7DQorCQkJCQlyZXR1cm47DQorCQkJCX0NCisJCQkJX3N0cmVhbVBvcyArPSAoVUludDMyKW51bVJlYWRCeXRlczsNCisJCQkJaWYgKF9zdHJlYW1Qb3MgPj0gX3BvcyArIF9rZWVwU2l6ZUFmdGVyKQ0KKwkJCQkJX3Bvc0xpbWl0ID0gX3N0cmVhbVBvcyAtIF9rZWVwU2l6ZUFmdGVyOw0KKwkJCX0NCisJCX0NCisNCisJCXZvaWQgRnJlZSgpIHsgX2J1ZmZlckJhc2UgPSBudWxsOyB9DQorDQorCQlwdWJsaWMgdm9pZCBDcmVhdGUoVUludDMyIGtlZXBTaXplQmVmb3JlLCBVSW50MzIga2VlcFNpemVBZnRlciwgVUludDMyIGtlZXBTaXplUmVzZXJ2KQ0KKwkJew0KKwkJCV9rZWVwU2l6ZUJlZm9yZSA9IGtlZXBTaXplQmVmb3JlOw0KKwkJCV9rZWVwU2l6ZUFmdGVyID0ga2VlcFNpemVBZnRlcjsNCisJCQlVSW50MzIgYmxvY2tTaXplID0ga2VlcFNpemVCZWZvcmUgKyBrZWVwU2l6ZUFmdGVyICsga2VlcFNpemVSZXNlcnY7DQorCQkJaWYgKF9idWZmZXJCYXNlID09IG51bGwgfHwgX2Jsb2NrU2l6ZSAhPSBibG9ja1NpemUpDQorCQkJew0KKwkJCQlGcmVlKCk7DQorCQkJCV9ibG9ja1NpemUgPSBibG9ja1NpemU7DQorCQkJCV9idWZmZXJCYXNlID0gbmV3IEJ5dGVbX2Jsb2NrU2l6ZV07DQorCQkJfQ0KKwkJCV9wb2ludGVyVG9MYXN0U2FmZVBvc2l0aW9uID0gX2Jsb2NrU2l6ZSAtIGtlZXBTaXplQWZ0ZXI7DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBTZXRTdHJlYW0oU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0pIHsgX3N0cmVhbSA9IHN0cmVhbTsgfQ0KKwkJcHVibGljIHZvaWQgUmVsZWFzZVN0cmVhbSgpIHsgX3N0cmVhbSA9IG51bGw7IH0NCisNCisJCXB1YmxpYyB2b2lkIEluaXQoKQ0KKwkJew0KKwkJCV9idWZmZXJPZmZzZXQgPSAwOw0KKwkJCV9wb3MgPSAwOw0KKwkJCV9zdHJlYW1Qb3MgPSAwOw0KKwkJCV9zdHJlYW1FbmRXYXNSZWFjaGVkID0gZmFsc2U7DQorCQkJUmVhZEJsb2NrKCk7DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBNb3ZlUG9zKCkNCisJCXsNCisJCQlfcG9zKys7DQorCQkJaWYgKF9wb3MgPiBfcG9zTGltaXQpDQorCQkJew0KKwkJCQlVSW50MzIgcG9pbnRlclRvUG9zdGlvbiA9IF9idWZmZXJPZmZzZXQgKyBfcG9zOw0KKwkJCQlpZiAocG9pbnRlclRvUG9zdGlvbiA+IF9wb2ludGVyVG9MYXN0U2FmZVBvc2l0aW9uKQ0KKwkJCQkJTW92ZUJsb2NrKCk7DQorCQkJCVJlYWRCbG9jaygpOw0KKwkJCX0NCisJCX0NCisNCisJCXB1YmxpYyBCeXRlIEdldEluZGV4Qnl0ZShJbnQzMiBpbmRleCkgeyByZXR1cm4gX2J1ZmZlckJhc2VbX2J1ZmZlck9mZnNldCArIF9wb3MgKyBpbmRleF07IH0NCisNCisJCS8vIGluZGV4ICsgbGltaXQgaGF2ZSBub3QgdG8gZXhjZWVkIF9rZWVwU2l6ZUFmdGVyOw0KKwkJcHVibGljIFVJbnQzMiBHZXRNYXRjaExlbihJbnQzMiBpbmRleCwgVUludDMyIGRpc3RhbmNlLCBVSW50MzIgbGltaXQpDQorCQl7DQorCQkJaWYgKF9zdHJlYW1FbmRXYXNSZWFjaGVkKQ0KKwkJCQlpZiAoKF9wb3MgKyBpbmRleCkgKyBsaW1pdCA+IF9zdHJlYW1Qb3MpDQorCQkJCQlsaW1pdCA9IF9zdHJlYW1Qb3MgLSAoVUludDMyKShfcG9zICsgaW5kZXgpOw0KKwkJCWRpc3RhbmNlKys7DQorCQkJLy8gQnl0ZSAqcGJ5ID0gX2J1ZmZlciArIChzaXplX3QpX3BvcyArIGluZGV4Ow0KKwkJCVVJbnQzMiBwYnkgPSBfYnVmZmVyT2Zmc2V0ICsgX3BvcyArIChVSW50MzIpaW5kZXg7DQorDQorCQkJVUludDMyIGk7DQorCQkJZm9yIChpID0gMDsgaSA8IGxpbWl0ICYmIF9idWZmZXJCYXNlW3BieSArIGldID09IF9idWZmZXJCYXNlW3BieSArIGkgLSBkaXN0YW5jZV07IGkrKyk7DQorCQkJcmV0dXJuIGk7DQorCQl9DQorDQorCQlwdWJsaWMgVUludDMyIEdldE51bUF2YWlsYWJsZUJ5dGVzKCkgeyByZXR1cm4gX3N0cmVhbVBvcyAtIF9wb3M7IH0NCisNCisJCXB1YmxpYyB2b2lkIFJlZHVjZU9mZnNldHMoSW50MzIgc3ViVmFsdWUpDQorCQl7DQorCQkJX2J1ZmZlck9mZnNldCArPSAoVUludDMyKXN1YlZhbHVlOw0KKwkJCV9wb3NMaW1pdCAtPSAoVUludDMyKXN1YlZhbHVlOw0KKwkJCV9wb3MgLT0gKFVJbnQzMilzdWJWYWx1ZTsNCisJCQlfc3RyZWFtUG9zIC09IChVSW50MzIpc3ViVmFsdWU7DQorCQl9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUy83emlwL0NvbXByZXNzL0xaL0x6T3V0V2luZG93LmNzIGIvbHptYS9DUy83emlwL0NvbXByZXNzL0xaL0x6T3V0V2luZG93LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OTE0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NTLzd6aXAvQ29tcHJlc3MvTFovTHpPdXRXaW5kb3cuY3MKQEAgLTAsMCArMSwxMTAgQEAKKy8vIEx6T3V0V2luZG93LmNzDQorDQorbmFtZXNwYWNlIFNldmVuWmlwLkNvbXByZXNzaW9uLkxaDQorew0KKwlwdWJsaWMgY2xhc3MgT3V0V2luZG93DQorCXsNCisJCWJ5dGVbXSBfYnVmZmVyID0gbnVsbDsNCisJCXVpbnQgX3BvczsNCisJCXVpbnQgX3dpbmRvd1NpemUgPSAwOw0KKwkJdWludCBfc3RyZWFtUG9zOw0KKwkJU3lzdGVtLklPLlN0cmVhbSBfc3RyZWFtOw0KKw0KKwkJcHVibGljIHVpbnQgVHJhaW5TaXplID0gMDsNCisNCisJCXB1YmxpYyB2b2lkIENyZWF0ZSh1aW50IHdpbmRvd1NpemUpDQorCQl7DQorCQkJaWYgKF93aW5kb3dTaXplICE9IHdpbmRvd1NpemUpDQorCQkJew0KKwkJCQkvLyBTeXN0ZW0uR0MuQ29sbGVjdCgpOw0KKwkJCQlfYnVmZmVyID0gbmV3IGJ5dGVbd2luZG93U2l6ZV07DQorCQkJfQ0KKwkJCV93aW5kb3dTaXplID0gd2luZG93U2l6ZTsNCisJCQlfcG9zID0gMDsNCisJCQlfc3RyZWFtUG9zID0gMDsNCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIEluaXQoU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0sIGJvb2wgc29saWQpDQorCQl7DQorCQkJUmVsZWFzZVN0cmVhbSgpOw0KKwkJCV9zdHJlYW0gPSBzdHJlYW07DQorCQkJaWYgKCFzb2xpZCkNCisJCQl7DQorCQkJCV9zdHJlYW1Qb3MgPSAwOw0KKwkJCQlfcG9zID0gMDsNCisJCQkJVHJhaW5TaXplID0gMDsNCisJCQl9DQorCQl9DQorCQ0KKwkJcHVibGljIGJvb2wgVHJhaW4oU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0pDQorCQl7DQorCQkJbG9uZyBsZW4gPSBzdHJlYW0uTGVuZ3RoOw0KKwkJCXVpbnQgc2l6ZSA9IChsZW4gPCBfd2luZG93U2l6ZSkgPyAodWludClsZW4gOiBfd2luZG93U2l6ZTsNCisJCQlUcmFpblNpemUgPSBzaXplOw0KKwkJCXN0cmVhbS5Qb3NpdGlvbiA9IGxlbiAtIHNpemU7DQorCQkJX3N0cmVhbVBvcyA9IF9wb3MgPSAwOw0KKwkJCXdoaWxlIChzaXplID4gMCkNCisJCQl7DQorCQkJCXVpbnQgY3VyU2l6ZSA9IF93aW5kb3dTaXplIC0gX3BvczsNCisJCQkJaWYgKHNpemUgPCBjdXJTaXplKQ0KKwkJCQkJY3VyU2l6ZSA9IHNpemU7DQorCQkJCWludCBudW1SZWFkQnl0ZXMgPSBzdHJlYW0uUmVhZChfYnVmZmVyLCAoaW50KV9wb3MsIChpbnQpY3VyU2l6ZSk7DQorCQkJCWlmIChudW1SZWFkQnl0ZXMgPT0gMCkNCisJCQkJCXJldHVybiBmYWxzZTsNCisJCQkJc2l6ZSAtPSAodWludCludW1SZWFkQnl0ZXM7DQorCQkJCV9wb3MgKz0gKHVpbnQpbnVtUmVhZEJ5dGVzOw0KKwkJCQlfc3RyZWFtUG9zICs9ICh1aW50KW51bVJlYWRCeXRlczsNCisJCQkJaWYgKF9wb3MgPT0gX3dpbmRvd1NpemUpDQorCQkJCQlfc3RyZWFtUG9zID0gX3BvcyA9IDA7DQorCQkJfQ0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgUmVsZWFzZVN0cmVhbSgpDQorCQl7DQorCQkJRmx1c2goKTsNCisJCQlfc3RyZWFtID0gbnVsbDsNCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIEZsdXNoKCkNCisJCXsNCisJCQl1aW50IHNpemUgPSBfcG9zIC0gX3N0cmVhbVBvczsNCisJCQlpZiAoc2l6ZSA9PSAwKQ0KKwkJCQlyZXR1cm47DQorCQkJX3N0cmVhbS5Xcml0ZShfYnVmZmVyLCAoaW50KV9zdHJlYW1Qb3MsIChpbnQpc2l6ZSk7DQorCQkJaWYgKF9wb3MgPj0gX3dpbmRvd1NpemUpDQorCQkJCV9wb3MgPSAwOw0KKwkJCV9zdHJlYW1Qb3MgPSBfcG9zOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgQ29weUJsb2NrKHVpbnQgZGlzdGFuY2UsIHVpbnQgbGVuKQ0KKwkJew0KKwkJCXVpbnQgcG9zID0gX3BvcyAtIGRpc3RhbmNlIC0gMTsNCisJCQlpZiAocG9zID49IF93aW5kb3dTaXplKQ0KKwkJCQlwb3MgKz0gX3dpbmRvd1NpemU7DQorCQkJZm9yICg7IGxlbiA+IDA7IGxlbi0tKQ0KKwkJCXsNCisJCQkJaWYgKHBvcyA+PSBfd2luZG93U2l6ZSkNCisJCQkJCXBvcyA9IDA7DQorCQkJCV9idWZmZXJbX3BvcysrXSA9IF9idWZmZXJbcG9zKytdOw0KKwkJCQlpZiAoX3BvcyA+PSBfd2luZG93U2l6ZSkNCisJCQkJCUZsdXNoKCk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgUHV0Qnl0ZShieXRlIGIpDQorCQl7DQorCQkJX2J1ZmZlcltfcG9zKytdID0gYjsNCisJCQlpZiAoX3BvcyA+PSBfd2luZG93U2l6ZSkNCisJCQkJRmx1c2goKTsNCisJCX0NCisNCisJCXB1YmxpYyBieXRlIEdldEJ5dGUodWludCBkaXN0YW5jZSkNCisJCXsNCisJCQl1aW50IHBvcyA9IF9wb3MgLSBkaXN0YW5jZSAtIDE7DQorCQkJaWYgKHBvcyA+PSBfd2luZG93U2l6ZSkNCisJCQkJcG9zICs9IF93aW5kb3dTaXplOw0KKwkJCXJldHVybiBfYnVmZmVyW3Bvc107DQorCQl9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUy83emlwL0NvbXByZXNzL0xaTUEvTHptYUJhc2UuY3MgYi9sem1hL0NTLzd6aXAvQ29tcHJlc3MvTFpNQS9Mem1hQmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDQ3YTJhCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUy83emlwL0NvbXByZXNzL0xaTUEvTHptYUJhc2UuY3MKQEAgLTAsMCArMSw3NiBAQAorLy8gTHptYUJhc2UuY3MNCisNCituYW1lc3BhY2UgU2V2ZW5aaXAuQ29tcHJlc3Npb24uTFpNQQ0KK3sNCisJaW50ZXJuYWwgYWJzdHJhY3QgY2xhc3MgQmFzZQ0KKwl7DQorCQlwdWJsaWMgY29uc3QgdWludCBrTnVtUmVwRGlzdGFuY2VzID0gNDsNCisJCXB1YmxpYyBjb25zdCB1aW50IGtOdW1TdGF0ZXMgPSAxMjsNCisNCisJCS8vIHN0YXRpYyBieXRlIFtda0xpdGVyYWxOZXh0U3RhdGVzICA9IHswLCAwLCAwLCAwLCAxLCAyLCAzLCA0LCAgNSwgIDYsICAgNCwgNX07DQorCQkvLyBzdGF0aWMgYnl0ZSBbXWtNYXRjaE5leHRTdGF0ZXMgICAgPSB7NywgNywgNywgNywgNywgNywgNywgMTAsIDEwLCAxMCwgMTAsIDEwfTsNCisJCS8vIHN0YXRpYyBieXRlIFtda1JlcE5leHRTdGF0ZXMgICAgICA9IHs4LCA4LCA4LCA4LCA4LCA4LCA4LCAxMSwgMTEsIDExLCAxMSwgMTF9Ow0KKwkJLy8gc3RhdGljIGJ5dGUgW11rU2hvcnRSZXBOZXh0U3RhdGVzID0gezksIDksIDksIDksIDksIDksIDksIDExLCAxMSwgMTEsIDExLCAxMX07DQorDQorCQlwdWJsaWMgc3RydWN0IFN0YXRlDQorCQl7DQorCQkJcHVibGljIHVpbnQgSW5kZXg7DQorCQkJcHVibGljIHZvaWQgSW5pdCgpIHsgSW5kZXggPSAwOyB9DQorCQkJcHVibGljIHZvaWQgVXBkYXRlQ2hhcigpDQorCQkJew0KKwkJCQlpZiAoSW5kZXggPCA0KSBJbmRleCA9IDA7DQorCQkJCWVsc2UgaWYgKEluZGV4IDwgMTApIEluZGV4IC09IDM7DQorCQkJCWVsc2UgSW5kZXggLT0gNjsNCisJCQl9DQorCQkJcHVibGljIHZvaWQgVXBkYXRlTWF0Y2goKSB7IEluZGV4ID0gKHVpbnQpKEluZGV4IDwgNyA/IDcgOiAxMCk7IH0NCisJCQlwdWJsaWMgdm9pZCBVcGRhdGVSZXAoKSB7IEluZGV4ID0gKHVpbnQpKEluZGV4IDwgNyA/IDggOiAxMSk7IH0NCisJCQlwdWJsaWMgdm9pZCBVcGRhdGVTaG9ydFJlcCgpIHsgSW5kZXggPSAodWludCkoSW5kZXggPCA3ID8gOSA6IDExKTsgfQ0KKwkJCXB1YmxpYyBib29sIElzQ2hhclN0YXRlKCkgeyByZXR1cm4gSW5kZXggPCA3OyB9DQorCQl9DQorDQorCQlwdWJsaWMgY29uc3QgaW50IGtOdW1Qb3NTbG90Qml0cyA9IDY7DQorCQlwdWJsaWMgY29uc3QgaW50IGtEaWNMb2dTaXplTWluID0gMDsNCisJCS8vIHB1YmxpYyBjb25zdCBpbnQga0RpY0xvZ1NpemVNYXggPSAzMDsNCisJCS8vIHB1YmxpYyBjb25zdCB1aW50IGtEaXN0VGFibGVTaXplTWF4ID0ga0RpY0xvZ1NpemVNYXggKiAyOw0KKw0KKwkJcHVibGljIGNvbnN0IGludCBrTnVtTGVuVG9Qb3NTdGF0ZXNCaXRzID0gMjsgLy8gaXQncyBmb3Igc3BlZWQgb3B0aW1pemF0aW9uDQorCQlwdWJsaWMgY29uc3QgdWludCBrTnVtTGVuVG9Qb3NTdGF0ZXMgPSAxIDw8IGtOdW1MZW5Ub1Bvc1N0YXRlc0JpdHM7DQorDQorCQlwdWJsaWMgY29uc3QgdWludCBrTWF0Y2hNaW5MZW4gPSAyOw0KKw0KKwkJcHVibGljIHN0YXRpYyB1aW50IEdldExlblRvUG9zU3RhdGUodWludCBsZW4pDQorCQl7DQorCQkJbGVuIC09IGtNYXRjaE1pbkxlbjsNCisJCQlpZiAobGVuIDwga051bUxlblRvUG9zU3RhdGVzKQ0KKwkJCQlyZXR1cm4gbGVuOw0KKwkJCXJldHVybiAodWludCkoa051bUxlblRvUG9zU3RhdGVzIC0gMSk7DQorCQl9DQorDQorCQlwdWJsaWMgY29uc3QgaW50IGtOdW1BbGlnbkJpdHMgPSA0Ow0KKwkJcHVibGljIGNvbnN0IHVpbnQga0FsaWduVGFibGVTaXplID0gMSA8PCBrTnVtQWxpZ25CaXRzOw0KKwkJcHVibGljIGNvbnN0IHVpbnQga0FsaWduTWFzayA9IChrQWxpZ25UYWJsZVNpemUgLSAxKTsNCisNCisJCXB1YmxpYyBjb25zdCB1aW50IGtTdGFydFBvc01vZGVsSW5kZXggPSA0Ow0KKwkJcHVibGljIGNvbnN0IHVpbnQga0VuZFBvc01vZGVsSW5kZXggPSAxNDsNCisJCXB1YmxpYyBjb25zdCB1aW50IGtOdW1Qb3NNb2RlbHMgPSBrRW5kUG9zTW9kZWxJbmRleCAtIGtTdGFydFBvc01vZGVsSW5kZXg7DQorDQorCQlwdWJsaWMgY29uc3QgdWludCBrTnVtRnVsbERpc3RhbmNlcyA9IDEgPDwgKChpbnQpa0VuZFBvc01vZGVsSW5kZXggLyAyKTsNCisNCisJCXB1YmxpYyBjb25zdCB1aW50IGtOdW1MaXRQb3NTdGF0ZXNCaXRzRW5jb2RpbmdNYXggPSA0Ow0KKwkJcHVibGljIGNvbnN0IHVpbnQga051bUxpdENvbnRleHRCaXRzTWF4ID0gODsNCisNCisJCXB1YmxpYyBjb25zdCBpbnQga051bVBvc1N0YXRlc0JpdHNNYXggPSA0Ow0KKwkJcHVibGljIGNvbnN0IHVpbnQga051bVBvc1N0YXRlc01heCA9ICgxIDw8IGtOdW1Qb3NTdGF0ZXNCaXRzTWF4KTsNCisJCXB1YmxpYyBjb25zdCBpbnQga051bVBvc1N0YXRlc0JpdHNFbmNvZGluZ01heCA9IDQ7DQorCQlwdWJsaWMgY29uc3QgdWludCBrTnVtUG9zU3RhdGVzRW5jb2RpbmdNYXggPSAoMSA8PCBrTnVtUG9zU3RhdGVzQml0c0VuY29kaW5nTWF4KTsNCisNCisJCXB1YmxpYyBjb25zdCBpbnQga051bUxvd0xlbkJpdHMgPSAzOw0KKwkJcHVibGljIGNvbnN0IGludCBrTnVtTWlkTGVuQml0cyA9IDM7DQorCQlwdWJsaWMgY29uc3QgaW50IGtOdW1IaWdoTGVuQml0cyA9IDg7DQorCQlwdWJsaWMgY29uc3QgdWludCBrTnVtTG93TGVuU3ltYm9scyA9IDEgPDwga051bUxvd0xlbkJpdHM7DQorCQlwdWJsaWMgY29uc3QgdWludCBrTnVtTWlkTGVuU3ltYm9scyA9IDEgPDwga051bU1pZExlbkJpdHM7DQorCQlwdWJsaWMgY29uc3QgdWludCBrTnVtTGVuU3ltYm9scyA9IGtOdW1Mb3dMZW5TeW1ib2xzICsga051bU1pZExlblN5bWJvbHMgKw0KKwkJCQkoMSA8PCBrTnVtSGlnaExlbkJpdHMpOw0KKwkJcHVibGljIGNvbnN0IHVpbnQga01hdGNoTWF4TGVuID0ga01hdGNoTWluTGVuICsga051bUxlblN5bWJvbHMgLSAxOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9MWk1BL0x6bWFEZWNvZGVyLmNzIGIvbHptYS9DUy83emlwL0NvbXByZXNzL0xaTUEvTHptYURlY29kZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiZmU2MwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9MWk1BL0x6bWFEZWNvZGVyLmNzCkBAIC0wLDAgKzEsMzk4IEBACisvLyBMem1hRGVjb2Rlci5jcw0KKw0KK3VzaW5nIFN5c3RlbTsNCisNCituYW1lc3BhY2UgU2V2ZW5aaXAuQ29tcHJlc3Npb24uTFpNQQ0KK3sNCisJdXNpbmcgUmFuZ2VDb2RlcjsNCisNCisJcHVibGljIGNsYXNzIERlY29kZXIgOiBJQ29kZXIsIElTZXREZWNvZGVyUHJvcGVydGllcyAvLyAsU3lzdGVtLklPLlN0cmVhbQ0KKwl7DQorCQljbGFzcyBMZW5EZWNvZGVyDQorCQl7DQorCQkJQml0RGVjb2RlciBtX0Nob2ljZSA9IG5ldyBCaXREZWNvZGVyKCk7DQorCQkJQml0RGVjb2RlciBtX0Nob2ljZTIgPSBuZXcgQml0RGVjb2RlcigpOw0KKwkJCUJpdFRyZWVEZWNvZGVyW10gbV9Mb3dDb2RlciA9IG5ldyBCaXRUcmVlRGVjb2RlcltCYXNlLmtOdW1Qb3NTdGF0ZXNNYXhdOw0KKwkJCUJpdFRyZWVEZWNvZGVyW10gbV9NaWRDb2RlciA9IG5ldyBCaXRUcmVlRGVjb2RlcltCYXNlLmtOdW1Qb3NTdGF0ZXNNYXhdOw0KKwkJCUJpdFRyZWVEZWNvZGVyIG1fSGlnaENvZGVyID0gbmV3IEJpdFRyZWVEZWNvZGVyKEJhc2Uua051bUhpZ2hMZW5CaXRzKTsNCisJCQl1aW50IG1fTnVtUG9zU3RhdGVzID0gMDsNCisNCisJCQlwdWJsaWMgdm9pZCBDcmVhdGUodWludCBudW1Qb3NTdGF0ZXMpDQorCQkJew0KKwkJCQlmb3IgKHVpbnQgcG9zU3RhdGUgPSBtX051bVBvc1N0YXRlczsgcG9zU3RhdGUgPCBudW1Qb3NTdGF0ZXM7IHBvc1N0YXRlKyspDQorCQkJCXsNCisJCQkJCW1fTG93Q29kZXJbcG9zU3RhdGVdID0gbmV3IEJpdFRyZWVEZWNvZGVyKEJhc2Uua051bUxvd0xlbkJpdHMpOw0KKwkJCQkJbV9NaWRDb2Rlcltwb3NTdGF0ZV0gPSBuZXcgQml0VHJlZURlY29kZXIoQmFzZS5rTnVtTWlkTGVuQml0cyk7DQorCQkJCX0NCisJCQkJbV9OdW1Qb3NTdGF0ZXMgPSBudW1Qb3NTdGF0ZXM7DQorCQkJfQ0KKw0KKwkJCXB1YmxpYyB2b2lkIEluaXQoKQ0KKwkJCXsNCisJCQkJbV9DaG9pY2UuSW5pdCgpOw0KKwkJCQlmb3IgKHVpbnQgcG9zU3RhdGUgPSAwOyBwb3NTdGF0ZSA8IG1fTnVtUG9zU3RhdGVzOyBwb3NTdGF0ZSsrKQ0KKwkJCQl7DQorCQkJCQltX0xvd0NvZGVyW3Bvc1N0YXRlXS5Jbml0KCk7DQorCQkJCQltX01pZENvZGVyW3Bvc1N0YXRlXS5Jbml0KCk7DQorCQkJCX0NCisJCQkJbV9DaG9pY2UyLkluaXQoKTsNCisJCQkJbV9IaWdoQ29kZXIuSW5pdCgpOw0KKwkJCX0NCisNCisJCQlwdWJsaWMgdWludCBEZWNvZGUoUmFuZ2VDb2Rlci5EZWNvZGVyIHJhbmdlRGVjb2RlciwgdWludCBwb3NTdGF0ZSkNCisJCQl7DQorCQkJCWlmIChtX0Nob2ljZS5EZWNvZGUocmFuZ2VEZWNvZGVyKSA9PSAwKQ0KKwkJCQkJcmV0dXJuIG1fTG93Q29kZXJbcG9zU3RhdGVdLkRlY29kZShyYW5nZURlY29kZXIpOw0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCXVpbnQgc3ltYm9sID0gQmFzZS5rTnVtTG93TGVuU3ltYm9sczsNCisJCQkJCWlmIChtX0Nob2ljZTIuRGVjb2RlKHJhbmdlRGVjb2RlcikgPT0gMCkNCisJCQkJCQlzeW1ib2wgKz0gbV9NaWRDb2Rlcltwb3NTdGF0ZV0uRGVjb2RlKHJhbmdlRGVjb2Rlcik7DQorCQkJCQllbHNlDQorCQkJCQl7DQorCQkJCQkJc3ltYm9sICs9IEJhc2Uua051bU1pZExlblN5bWJvbHM7DQorCQkJCQkJc3ltYm9sICs9IG1fSGlnaENvZGVyLkRlY29kZShyYW5nZURlY29kZXIpOw0KKwkJCQkJfQ0KKwkJCQkJcmV0dXJuIHN5bWJvbDsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisNCisJCWNsYXNzIExpdGVyYWxEZWNvZGVyDQorCQl7DQorCQkJc3RydWN0IERlY29kZXIyDQorCQkJew0KKwkJCQlCaXREZWNvZGVyW10gbV9EZWNvZGVyczsNCisJCQkJcHVibGljIHZvaWQgQ3JlYXRlKCkgeyBtX0RlY29kZXJzID0gbmV3IEJpdERlY29kZXJbMHgzMDBdOyB9DQorCQkJCXB1YmxpYyB2b2lkIEluaXQoKSB7IGZvciAoaW50IGkgPSAwOyBpIDwgMHgzMDA7IGkrKykgbV9EZWNvZGVyc1tpXS5Jbml0KCk7IH0NCisNCisJCQkJcHVibGljIGJ5dGUgRGVjb2RlTm9ybWFsKFJhbmdlQ29kZXIuRGVjb2RlciByYW5nZURlY29kZXIpDQorCQkJCXsNCisJCQkJCXVpbnQgc3ltYm9sID0gMTsNCisJCQkJCWRvDQorCQkJCQkJc3ltYm9sID0gKHN5bWJvbCA8PCAxKSB8IG1fRGVjb2RlcnNbc3ltYm9sXS5EZWNvZGUocmFuZ2VEZWNvZGVyKTsNCisJCQkJCXdoaWxlIChzeW1ib2wgPCAweDEwMCk7DQorCQkJCQlyZXR1cm4gKGJ5dGUpc3ltYm9sOw0KKwkJCQl9DQorDQorCQkJCXB1YmxpYyBieXRlIERlY29kZVdpdGhNYXRjaEJ5dGUoUmFuZ2VDb2Rlci5EZWNvZGVyIHJhbmdlRGVjb2RlciwgYnl0ZSBtYXRjaEJ5dGUpDQorCQkJCXsNCisJCQkJCXVpbnQgc3ltYm9sID0gMTsNCisJCQkJCWRvDQorCQkJCQl7DQorCQkJCQkJdWludCBtYXRjaEJpdCA9ICh1aW50KShtYXRjaEJ5dGUgPj4gNykgJiAxOw0KKwkJCQkJCW1hdGNoQnl0ZSA8PD0gMTsNCisJCQkJCQl1aW50IGJpdCA9IG1fRGVjb2RlcnNbKCgxICsgbWF0Y2hCaXQpIDw8IDgpICsgc3ltYm9sXS5EZWNvZGUocmFuZ2VEZWNvZGVyKTsNCisJCQkJCQlzeW1ib2wgPSAoc3ltYm9sIDw8IDEpIHwgYml0Ow0KKwkJCQkJCWlmIChtYXRjaEJpdCAhPSBiaXQpDQorCQkJCQkJew0KKwkJCQkJCQl3aGlsZSAoc3ltYm9sIDwgMHgxMDApDQorCQkJCQkJCQlzeW1ib2wgPSAoc3ltYm9sIDw8IDEpIHwgbV9EZWNvZGVyc1tzeW1ib2xdLkRlY29kZShyYW5nZURlY29kZXIpOw0KKwkJCQkJCQlicmVhazsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCQl3aGlsZSAoc3ltYm9sIDwgMHgxMDApOw0KKwkJCQkJcmV0dXJuIChieXRlKXN5bWJvbDsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlEZWNvZGVyMltdIG1fQ29kZXJzOw0KKwkJCWludCBtX051bVByZXZCaXRzOw0KKwkJCWludCBtX051bVBvc0JpdHM7DQorCQkJdWludCBtX1Bvc01hc2s7DQorDQorCQkJcHVibGljIHZvaWQgQ3JlYXRlKGludCBudW1Qb3NCaXRzLCBpbnQgbnVtUHJldkJpdHMpDQorCQkJew0KKwkJCQlpZiAobV9Db2RlcnMgIT0gbnVsbCAmJiBtX051bVByZXZCaXRzID09IG51bVByZXZCaXRzICYmDQorCQkJCQltX051bVBvc0JpdHMgPT0gbnVtUG9zQml0cykNCisJCQkJCXJldHVybjsNCisJCQkJbV9OdW1Qb3NCaXRzID0gbnVtUG9zQml0czsNCisJCQkJbV9Qb3NNYXNrID0gKCh1aW50KTEgPDwgbnVtUG9zQml0cykgLSAxOw0KKwkJCQltX051bVByZXZCaXRzID0gbnVtUHJldkJpdHM7DQorCQkJCXVpbnQgbnVtU3RhdGVzID0gKHVpbnQpMSA8PCAobV9OdW1QcmV2Qml0cyArIG1fTnVtUG9zQml0cyk7DQorCQkJCW1fQ29kZXJzID0gbmV3IERlY29kZXIyW251bVN0YXRlc107DQorCQkJCWZvciAodWludCBpID0gMDsgaSA8IG51bVN0YXRlczsgaSsrKQ0KKwkJCQkJbV9Db2RlcnNbaV0uQ3JlYXRlKCk7DQorCQkJfQ0KKw0KKwkJCXB1YmxpYyB2b2lkIEluaXQoKQ0KKwkJCXsNCisJCQkJdWludCBudW1TdGF0ZXMgPSAodWludCkxIDw8IChtX051bVByZXZCaXRzICsgbV9OdW1Qb3NCaXRzKTsNCisJCQkJZm9yICh1aW50IGkgPSAwOyBpIDwgbnVtU3RhdGVzOyBpKyspDQorCQkJCQltX0NvZGVyc1tpXS5Jbml0KCk7DQorCQkJfQ0KKw0KKwkJCXVpbnQgR2V0U3RhdGUodWludCBwb3MsIGJ5dGUgcHJldkJ5dGUpDQorCQkJeyByZXR1cm4gKChwb3MgJiBtX1Bvc01hc2spIDw8IG1fTnVtUHJldkJpdHMpICsgKHVpbnQpKHByZXZCeXRlID4+ICg4IC0gbV9OdW1QcmV2Qml0cykpOyB9DQorDQorCQkJcHVibGljIGJ5dGUgRGVjb2RlTm9ybWFsKFJhbmdlQ29kZXIuRGVjb2RlciByYW5nZURlY29kZXIsIHVpbnQgcG9zLCBieXRlIHByZXZCeXRlKQ0KKwkJCXsgcmV0dXJuIG1fQ29kZXJzW0dldFN0YXRlKHBvcywgcHJldkJ5dGUpXS5EZWNvZGVOb3JtYWwocmFuZ2VEZWNvZGVyKTsgfQ0KKw0KKwkJCXB1YmxpYyBieXRlIERlY29kZVdpdGhNYXRjaEJ5dGUoUmFuZ2VDb2Rlci5EZWNvZGVyIHJhbmdlRGVjb2RlciwgdWludCBwb3MsIGJ5dGUgcHJldkJ5dGUsIGJ5dGUgbWF0Y2hCeXRlKQ0KKwkJCXsgcmV0dXJuIG1fQ29kZXJzW0dldFN0YXRlKHBvcywgcHJldkJ5dGUpXS5EZWNvZGVXaXRoTWF0Y2hCeXRlKHJhbmdlRGVjb2RlciwgbWF0Y2hCeXRlKTsgfQ0KKwkJfTsNCisNCisJCUxaLk91dFdpbmRvdyBtX091dFdpbmRvdyA9IG5ldyBMWi5PdXRXaW5kb3coKTsNCisJCVJhbmdlQ29kZXIuRGVjb2RlciBtX1JhbmdlRGVjb2RlciA9IG5ldyBSYW5nZUNvZGVyLkRlY29kZXIoKTsNCisNCisJCUJpdERlY29kZXJbXSBtX0lzTWF0Y2hEZWNvZGVycyA9IG5ldyBCaXREZWNvZGVyW0Jhc2Uua051bVN0YXRlcyA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4XTsNCisJCUJpdERlY29kZXJbXSBtX0lzUmVwRGVjb2RlcnMgPSBuZXcgQml0RGVjb2RlcltCYXNlLmtOdW1TdGF0ZXNdOw0KKwkJQml0RGVjb2RlcltdIG1fSXNSZXBHMERlY29kZXJzID0gbmV3IEJpdERlY29kZXJbQmFzZS5rTnVtU3RhdGVzXTsNCisJCUJpdERlY29kZXJbXSBtX0lzUmVwRzFEZWNvZGVycyA9IG5ldyBCaXREZWNvZGVyW0Jhc2Uua051bVN0YXRlc107DQorCQlCaXREZWNvZGVyW10gbV9Jc1JlcEcyRGVjb2RlcnMgPSBuZXcgQml0RGVjb2RlcltCYXNlLmtOdW1TdGF0ZXNdOw0KKwkJQml0RGVjb2RlcltdIG1fSXNSZXAwTG9uZ0RlY29kZXJzID0gbmV3IEJpdERlY29kZXJbQmFzZS5rTnVtU3RhdGVzIDw8IEJhc2Uua051bVBvc1N0YXRlc0JpdHNNYXhdOw0KKw0KKwkJQml0VHJlZURlY29kZXJbXSBtX1Bvc1Nsb3REZWNvZGVyID0gbmV3IEJpdFRyZWVEZWNvZGVyW0Jhc2Uua051bUxlblRvUG9zU3RhdGVzXTsNCisJCUJpdERlY29kZXJbXSBtX1Bvc0RlY29kZXJzID0gbmV3IEJpdERlY29kZXJbQmFzZS5rTnVtRnVsbERpc3RhbmNlcyAtIEJhc2Uua0VuZFBvc01vZGVsSW5kZXhdOw0KKw0KKwkJQml0VHJlZURlY29kZXIgbV9Qb3NBbGlnbkRlY29kZXIgPSBuZXcgQml0VHJlZURlY29kZXIoQmFzZS5rTnVtQWxpZ25CaXRzKTsNCisNCisJCUxlbkRlY29kZXIgbV9MZW5EZWNvZGVyID0gbmV3IExlbkRlY29kZXIoKTsNCisJCUxlbkRlY29kZXIgbV9SZXBMZW5EZWNvZGVyID0gbmV3IExlbkRlY29kZXIoKTsNCisNCisJCUxpdGVyYWxEZWNvZGVyIG1fTGl0ZXJhbERlY29kZXIgPSBuZXcgTGl0ZXJhbERlY29kZXIoKTsNCisNCisJCXVpbnQgbV9EaWN0aW9uYXJ5U2l6ZTsNCisJCXVpbnQgbV9EaWN0aW9uYXJ5U2l6ZUNoZWNrOw0KKw0KKwkJdWludCBtX1Bvc1N0YXRlTWFzazsNCisNCisJCXB1YmxpYyBEZWNvZGVyKCkNCisJCXsNCisJCQltX0RpY3Rpb25hcnlTaXplID0gMHhGRkZGRkZGRjsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IEJhc2Uua051bUxlblRvUG9zU3RhdGVzOyBpKyspDQorCQkJCW1fUG9zU2xvdERlY29kZXJbaV0gPSBuZXcgQml0VHJlZURlY29kZXIoQmFzZS5rTnVtUG9zU2xvdEJpdHMpOw0KKwkJfQ0KKw0KKwkJdm9pZCBTZXREaWN0aW9uYXJ5U2l6ZSh1aW50IGRpY3Rpb25hcnlTaXplKQ0KKwkJew0KKwkJCWlmIChtX0RpY3Rpb25hcnlTaXplICE9IGRpY3Rpb25hcnlTaXplKQ0KKwkJCXsNCisJCQkJbV9EaWN0aW9uYXJ5U2l6ZSA9IGRpY3Rpb25hcnlTaXplOw0KKwkJCQltX0RpY3Rpb25hcnlTaXplQ2hlY2sgPSBNYXRoLk1heChtX0RpY3Rpb25hcnlTaXplLCAxKTsNCisJCQkJdWludCBibG9ja1NpemUgPSBNYXRoLk1heChtX0RpY3Rpb25hcnlTaXplQ2hlY2ssICgxIDw8IDEyKSk7DQorCQkJCW1fT3V0V2luZG93LkNyZWF0ZShibG9ja1NpemUpOw0KKwkJCX0NCisJCX0NCisNCisJCXZvaWQgU2V0TGl0ZXJhbFByb3BlcnRpZXMoaW50IGxwLCBpbnQgbGMpDQorCQl7DQorCQkJaWYgKGxwID4gOCkNCisJCQkJdGhyb3cgbmV3IEludmFsaWRQYXJhbUV4Y2VwdGlvbigpOw0KKwkJCWlmIChsYyA+IDgpDQorCQkJCXRocm93IG5ldyBJbnZhbGlkUGFyYW1FeGNlcHRpb24oKTsNCisJCQltX0xpdGVyYWxEZWNvZGVyLkNyZWF0ZShscCwgbGMpOw0KKwkJfQ0KKw0KKwkJdm9pZCBTZXRQb3NCaXRzUHJvcGVydGllcyhpbnQgcGIpDQorCQl7DQorCQkJaWYgKHBiID4gQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heCkNCisJCQkJdGhyb3cgbmV3IEludmFsaWRQYXJhbUV4Y2VwdGlvbigpOw0KKwkJCXVpbnQgbnVtUG9zU3RhdGVzID0gKHVpbnQpMSA8PCBwYjsNCisJCQltX0xlbkRlY29kZXIuQ3JlYXRlKG51bVBvc1N0YXRlcyk7DQorCQkJbV9SZXBMZW5EZWNvZGVyLkNyZWF0ZShudW1Qb3NTdGF0ZXMpOw0KKwkJCW1fUG9zU3RhdGVNYXNrID0gbnVtUG9zU3RhdGVzIC0gMTsNCisJCX0NCisNCisJCWJvb2wgX3NvbGlkID0gZmFsc2U7DQorCQl2b2lkIEluaXQoU3lzdGVtLklPLlN0cmVhbSBpblN0cmVhbSwgU3lzdGVtLklPLlN0cmVhbSBvdXRTdHJlYW0pDQorCQl7DQorCQkJbV9SYW5nZURlY29kZXIuSW5pdChpblN0cmVhbSk7DQorCQkJbV9PdXRXaW5kb3cuSW5pdChvdXRTdHJlYW0sIF9zb2xpZCk7DQorDQorCQkJdWludCBpOw0KKwkJCWZvciAoaSA9IDA7IGkgPCBCYXNlLmtOdW1TdGF0ZXM7IGkrKykNCisJCQl7DQorCQkJCWZvciAodWludCBqID0gMDsgaiA8PSBtX1Bvc1N0YXRlTWFzazsgaisrKQ0KKwkJCQl7DQorCQkJCQl1aW50IGluZGV4ID0gKGkgPDwgQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heCkgKyBqOw0KKwkJCQkJbV9Jc01hdGNoRGVjb2RlcnNbaW5kZXhdLkluaXQoKTsNCisJCQkJCW1fSXNSZXAwTG9uZ0RlY29kZXJzW2luZGV4XS5Jbml0KCk7DQorCQkJCX0NCisJCQkJbV9Jc1JlcERlY29kZXJzW2ldLkluaXQoKTsNCisJCQkJbV9Jc1JlcEcwRGVjb2RlcnNbaV0uSW5pdCgpOw0KKwkJCQltX0lzUmVwRzFEZWNvZGVyc1tpXS5Jbml0KCk7DQorCQkJCW1fSXNSZXBHMkRlY29kZXJzW2ldLkluaXQoKTsNCisJCQl9DQorDQorCQkJbV9MaXRlcmFsRGVjb2Rlci5Jbml0KCk7DQorCQkJZm9yIChpID0gMDsgaSA8IEJhc2Uua051bUxlblRvUG9zU3RhdGVzOyBpKyspDQorCQkJCW1fUG9zU2xvdERlY29kZXJbaV0uSW5pdCgpOw0KKwkJCS8vIG1fUG9zU3BlY0RlY29kZXIuSW5pdCgpOw0KKwkJCWZvciAoaSA9IDA7IGkgPCBCYXNlLmtOdW1GdWxsRGlzdGFuY2VzIC0gQmFzZS5rRW5kUG9zTW9kZWxJbmRleDsgaSsrKQ0KKwkJCQltX1Bvc0RlY29kZXJzW2ldLkluaXQoKTsNCisNCisJCQltX0xlbkRlY29kZXIuSW5pdCgpOw0KKwkJCW1fUmVwTGVuRGVjb2Rlci5Jbml0KCk7DQorCQkJbV9Qb3NBbGlnbkRlY29kZXIuSW5pdCgpOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgQ29kZShTeXN0ZW0uSU8uU3RyZWFtIGluU3RyZWFtLCBTeXN0ZW0uSU8uU3RyZWFtIG91dFN0cmVhbSwNCisJCQlJbnQ2NCBpblNpemUsIEludDY0IG91dFNpemUsIElDb2RlUHJvZ3Jlc3MgcHJvZ3Jlc3MpDQorCQl7DQorCQkJSW5pdChpblN0cmVhbSwgb3V0U3RyZWFtKTsNCisNCisJCQlCYXNlLlN0YXRlIHN0YXRlID0gbmV3IEJhc2UuU3RhdGUoKTsNCisJCQlzdGF0ZS5Jbml0KCk7DQorCQkJdWludCByZXAwID0gMCwgcmVwMSA9IDAsIHJlcDIgPSAwLCByZXAzID0gMDsNCisNCisJCQlVSW50NjQgbm93UG9zNjQgPSAwOw0KKwkJCVVJbnQ2NCBvdXRTaXplNjQgPSAoVUludDY0KW91dFNpemU7DQorCQkJaWYgKG5vd1BvczY0IDwgb3V0U2l6ZTY0KQ0KKwkJCXsNCisJCQkJaWYgKG1fSXNNYXRjaERlY29kZXJzW3N0YXRlLkluZGV4IDw8IEJhc2Uua051bVBvc1N0YXRlc0JpdHNNYXhdLkRlY29kZShtX1JhbmdlRGVjb2RlcikgIT0gMCkNCisJCQkJCXRocm93IG5ldyBEYXRhRXJyb3JFeGNlcHRpb24oKTsNCisJCQkJc3RhdGUuVXBkYXRlQ2hhcigpOw0KKwkJCQlieXRlIGIgPSBtX0xpdGVyYWxEZWNvZGVyLkRlY29kZU5vcm1hbChtX1JhbmdlRGVjb2RlciwgMCwgMCk7DQorCQkJCW1fT3V0V2luZG93LlB1dEJ5dGUoYik7DQorCQkJCW5vd1BvczY0Kys7DQorCQkJfQ0KKwkJCXdoaWxlIChub3dQb3M2NCA8IG91dFNpemU2NCkNCisJCQl7DQorCQkJCS8vIFVJbnQ2NCBuZXh0ID0gTWF0aC5NaW4obm93UG9zNjQgKyAoMSA8PCAxOCksIG91dFNpemU2NCk7DQorCQkJCQkvLyB3aGlsZShub3dQb3M2NCA8IG5leHQpDQorCQkJCXsNCisJCQkJCXVpbnQgcG9zU3RhdGUgPSAodWludClub3dQb3M2NCAmIG1fUG9zU3RhdGVNYXNrOw0KKwkJCQkJaWYgKG1fSXNNYXRjaERlY29kZXJzWyhzdGF0ZS5JbmRleCA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlXS5EZWNvZGUobV9SYW5nZURlY29kZXIpID09IDApDQorCQkJCQl7DQorCQkJCQkJYnl0ZSBiOw0KKwkJCQkJCWJ5dGUgcHJldkJ5dGUgPSBtX091dFdpbmRvdy5HZXRCeXRlKDApOw0KKwkJCQkJCWlmICghc3RhdGUuSXNDaGFyU3RhdGUoKSkNCisJCQkJCQkJYiA9IG1fTGl0ZXJhbERlY29kZXIuRGVjb2RlV2l0aE1hdGNoQnl0ZShtX1JhbmdlRGVjb2RlciwNCisJCQkJCQkJCSh1aW50KW5vd1BvczY0LCBwcmV2Qnl0ZSwgbV9PdXRXaW5kb3cuR2V0Qnl0ZShyZXAwKSk7DQorCQkJCQkJZWxzZQ0KKwkJCQkJCQliID0gbV9MaXRlcmFsRGVjb2Rlci5EZWNvZGVOb3JtYWwobV9SYW5nZURlY29kZXIsICh1aW50KW5vd1BvczY0LCBwcmV2Qnl0ZSk7DQorCQkJCQkJbV9PdXRXaW5kb3cuUHV0Qnl0ZShiKTsNCisJCQkJCQlzdGF0ZS5VcGRhdGVDaGFyKCk7DQorCQkJCQkJbm93UG9zNjQrKzsNCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQl1aW50IGxlbjsNCisJCQkJCQlpZiAobV9Jc1JlcERlY29kZXJzW3N0YXRlLkluZGV4XS5EZWNvZGUobV9SYW5nZURlY29kZXIpID09IDEpDQorCQkJCQkJew0KKwkJCQkJCQlpZiAobV9Jc1JlcEcwRGVjb2RlcnNbc3RhdGUuSW5kZXhdLkRlY29kZShtX1JhbmdlRGVjb2RlcikgPT0gMCkNCisJCQkJCQkJew0KKwkJCQkJCQkJaWYgKG1fSXNSZXAwTG9uZ0RlY29kZXJzWyhzdGF0ZS5JbmRleCA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlXS5EZWNvZGUobV9SYW5nZURlY29kZXIpID09IDApDQorCQkJCQkJCQl7DQorCQkJCQkJCQkJc3RhdGUuVXBkYXRlU2hvcnRSZXAoKTsNCisJCQkJCQkJCQltX091dFdpbmRvdy5QdXRCeXRlKG1fT3V0V2luZG93LkdldEJ5dGUocmVwMCkpOw0KKwkJCQkJCQkJCW5vd1BvczY0Kys7DQorCQkJCQkJCQkJY29udGludWU7DQorCQkJCQkJCQl9DQorCQkJCQkJCX0NCisJCQkJCQkJZWxzZQ0KKwkJCQkJCQl7DQorCQkJCQkJCQlVSW50MzIgZGlzdGFuY2U7DQorCQkJCQkJCQlpZiAobV9Jc1JlcEcxRGVjb2RlcnNbc3RhdGUuSW5kZXhdLkRlY29kZShtX1JhbmdlRGVjb2RlcikgPT0gMCkNCisJCQkJCQkJCXsNCisJCQkJCQkJCQlkaXN0YW5jZSA9IHJlcDE7DQorCQkJCQkJCQl9DQorCQkJCQkJCQllbHNlDQorCQkJCQkJCQl7DQorCQkJCQkJCQkJaWYgKG1fSXNSZXBHMkRlY29kZXJzW3N0YXRlLkluZGV4XS5EZWNvZGUobV9SYW5nZURlY29kZXIpID09IDApDQorCQkJCQkJCQkJCWRpc3RhbmNlID0gcmVwMjsNCisJCQkJCQkJCQllbHNlDQorCQkJCQkJCQkJew0KKwkJCQkJCQkJCQlkaXN0YW5jZSA9IHJlcDM7DQorCQkJCQkJCQkJCXJlcDMgPSByZXAyOw0KKwkJCQkJCQkJCX0NCisJCQkJCQkJCQlyZXAyID0gcmVwMTsNCisJCQkJCQkJCX0NCisJCQkJCQkJCXJlcDEgPSByZXAwOw0KKwkJCQkJCQkJcmVwMCA9IGRpc3RhbmNlOw0KKwkJCQkJCQl9DQorCQkJCQkJCWxlbiA9IG1fUmVwTGVuRGVjb2Rlci5EZWNvZGUobV9SYW5nZURlY29kZXIsIHBvc1N0YXRlKSArIEJhc2Uua01hdGNoTWluTGVuOw0KKwkJCQkJCQlzdGF0ZS5VcGRhdGVSZXAoKTsNCisJCQkJCQl9DQorCQkJCQkJZWxzZQ0KKwkJCQkJCXsNCisJCQkJCQkJcmVwMyA9IHJlcDI7DQorCQkJCQkJCXJlcDIgPSByZXAxOw0KKwkJCQkJCQlyZXAxID0gcmVwMDsNCisJCQkJCQkJbGVuID0gQmFzZS5rTWF0Y2hNaW5MZW4gKyBtX0xlbkRlY29kZXIuRGVjb2RlKG1fUmFuZ2VEZWNvZGVyLCBwb3NTdGF0ZSk7DQorCQkJCQkJCXN0YXRlLlVwZGF0ZU1hdGNoKCk7DQorCQkJCQkJCXVpbnQgcG9zU2xvdCA9IG1fUG9zU2xvdERlY29kZXJbQmFzZS5HZXRMZW5Ub1Bvc1N0YXRlKGxlbildLkRlY29kZShtX1JhbmdlRGVjb2Rlcik7DQorCQkJCQkJCWlmIChwb3NTbG90ID49IEJhc2Uua1N0YXJ0UG9zTW9kZWxJbmRleCkNCisJCQkJCQkJew0KKwkJCQkJCQkJaW50IG51bURpcmVjdEJpdHMgPSAoaW50KSgocG9zU2xvdCA+PiAxKSAtIDEpOw0KKwkJCQkJCQkJcmVwMCA9ICgoMiB8IChwb3NTbG90ICYgMSkpIDw8IG51bURpcmVjdEJpdHMpOw0KKwkJCQkJCQkJaWYgKHBvc1Nsb3QgPCBCYXNlLmtFbmRQb3NNb2RlbEluZGV4KQ0KKwkJCQkJCQkJCXJlcDAgKz0gQml0VHJlZURlY29kZXIuUmV2ZXJzZURlY29kZShtX1Bvc0RlY29kZXJzLA0KKwkJCQkJCQkJCQkJcmVwMCAtIHBvc1Nsb3QgLSAxLCBtX1JhbmdlRGVjb2RlciwgbnVtRGlyZWN0Qml0cyk7DQorCQkJCQkJCQllbHNlDQorCQkJCQkJCQl7DQorCQkJCQkJCQkJcmVwMCArPSAobV9SYW5nZURlY29kZXIuRGVjb2RlRGlyZWN0Qml0cygNCisJCQkJCQkJCQkJbnVtRGlyZWN0Qml0cyAtIEJhc2Uua051bUFsaWduQml0cykgPDwgQmFzZS5rTnVtQWxpZ25CaXRzKTsNCisJCQkJCQkJCQlyZXAwICs9IG1fUG9zQWxpZ25EZWNvZGVyLlJldmVyc2VEZWNvZGUobV9SYW5nZURlY29kZXIpOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQorCQkJCQkJCWVsc2UNCisJCQkJCQkJCXJlcDAgPSBwb3NTbG90Ow0KKwkJCQkJCX0NCisJCQkJCQlpZiAocmVwMCA+PSBtX091dFdpbmRvdy5UcmFpblNpemUgKyBub3dQb3M2NCB8fCByZXAwID49IG1fRGljdGlvbmFyeVNpemVDaGVjaykNCisJCQkJCQl7DQorCQkJCQkJCWlmIChyZXAwID09IDB4RkZGRkZGRkYpDQorCQkJCQkJCQlicmVhazsNCisJCQkJCQkJdGhyb3cgbmV3IERhdGFFcnJvckV4Y2VwdGlvbigpOw0KKwkJCQkJCX0NCisJCQkJCQltX091dFdpbmRvdy5Db3B5QmxvY2socmVwMCwgbGVuKTsNCisJCQkJCQlub3dQb3M2NCArPSBsZW47DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQkJbV9PdXRXaW5kb3cuRmx1c2goKTsNCisJCQltX091dFdpbmRvdy5SZWxlYXNlU3RyZWFtKCk7DQorCQkJbV9SYW5nZURlY29kZXIuUmVsZWFzZVN0cmVhbSgpOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgU2V0RGVjb2RlclByb3BlcnRpZXMoYnl0ZVtdIHByb3BlcnRpZXMpDQorCQl7DQorCQkJaWYgKHByb3BlcnRpZXMuTGVuZ3RoIDwgNSkNCisJCQkJdGhyb3cgbmV3IEludmFsaWRQYXJhbUV4Y2VwdGlvbigpOw0KKwkJCWludCBsYyA9IHByb3BlcnRpZXNbMF0gJSA5Ow0KKwkJCWludCByZW1haW5kZXIgPSBwcm9wZXJ0aWVzWzBdIC8gOTsNCisJCQlpbnQgbHAgPSByZW1haW5kZXIgJSA1Ow0KKwkJCWludCBwYiA9IHJlbWFpbmRlciAvIDU7DQorCQkJaWYgKHBiID4gQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heCkNCisJCQkJdGhyb3cgbmV3IEludmFsaWRQYXJhbUV4Y2VwdGlvbigpOw0KKwkJCVVJbnQzMiBkaWN0aW9uYXJ5U2l6ZSA9IDA7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspDQorCQkJCWRpY3Rpb25hcnlTaXplICs9ICgoVUludDMyKShwcm9wZXJ0aWVzWzEgKyBpXSkpIDw8IChpICogOCk7DQorCQkJU2V0RGljdGlvbmFyeVNpemUoZGljdGlvbmFyeVNpemUpOw0KKwkJCVNldExpdGVyYWxQcm9wZXJ0aWVzKGxwLCBsYyk7DQorCQkJU2V0UG9zQml0c1Byb3BlcnRpZXMocGIpOw0KKwkJfQ0KKw0KKwkJcHVibGljIGJvb2wgVHJhaW4oU3lzdGVtLklPLlN0cmVhbSBzdHJlYW0pDQorCQl7DQorCQkJX3NvbGlkID0gdHJ1ZTsNCisJCQlyZXR1cm4gbV9PdXRXaW5kb3cuVHJhaW4oc3RyZWFtKTsNCisJCX0NCisNCisJCS8qDQorCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5SZWFkIHsgZ2V0IHsgcmV0dXJuIHRydWU7IH19DQorCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5Xcml0ZSB7IGdldCB7IHJldHVybiB0cnVlOyB9fQ0KKwkJcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuU2VlayB7IGdldCB7IHJldHVybiB0cnVlOyB9fQ0KKwkJcHVibGljIG92ZXJyaWRlIGxvbmcgTGVuZ3RoIHsgZ2V0IHsgcmV0dXJuIDA7IH19DQorCQlwdWJsaWMgb3ZlcnJpZGUgbG9uZyBQb3NpdGlvbg0KKwkJew0KKwkJCWdldCB7IHJldHVybiAwOwl9DQorCQkJc2V0IHsgfQ0KKwkJfQ0KKwkJcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKSB7IH0NCisJCXB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIA0KKwkJew0KKwkJCXJldHVybiAwOw0KKwkJfQ0KKwkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KKwkJew0KKwkJfQ0KKwkJcHVibGljIG92ZXJyaWRlIGxvbmcgU2Vlayhsb25nIG9mZnNldCwgU3lzdGVtLklPLlNlZWtPcmlnaW4gb3JpZ2luKQ0KKwkJew0KKwkJCXJldHVybiAwOw0KKwkJfQ0KKwkJcHVibGljIG92ZXJyaWRlIHZvaWQgU2V0TGVuZ3RoKGxvbmcgdmFsdWUpIHt9DQorCQkqLw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9MWk1BL0x6bWFFbmNvZGVyLmNzIGIvbHptYS9DUy83emlwL0NvbXByZXNzL0xaTUEvTHptYUVuY29kZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjMjcwOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9MWk1BL0x6bWFFbmNvZGVyLmNzCkBAIC0wLDAgKzEsMTQ4MCBAQAorLy8gTHptYUVuY29kZXIuY3MNCisNCit1c2luZyBTeXN0ZW07DQorDQorbmFtZXNwYWNlIFNldmVuWmlwLkNvbXByZXNzaW9uLkxaTUENCit7DQorCXVzaW5nIFJhbmdlQ29kZXI7DQorDQorCXB1YmxpYyBjbGFzcyBFbmNvZGVyIDogSUNvZGVyLCBJU2V0Q29kZXJQcm9wZXJ0aWVzLCBJV3JpdGVDb2RlclByb3BlcnRpZXMNCisJew0KKwkJZW51bSBFTWF0Y2hGaW5kZXJUeXBlDQorCQl7DQorCQkJQlQyLA0KKwkJCUJUNCwNCisJCX07DQorDQorCQljb25zdCBVSW50MzIga0lmaW5pdHlQcmljZSA9IDB4RkZGRkZGRjsNCisNCisJCXN0YXRpYyBCeXRlW10gZ19GYXN0UG9zID0gbmV3IEJ5dGVbMSA8PCAxMV07DQorDQorCQlzdGF0aWMgRW5jb2RlcigpDQorCQl7DQorCQkJY29uc3QgQnl0ZSBrRmFzdFNsb3RzID0gMjI7DQorCQkJaW50IGMgPSAyOw0KKwkJCWdfRmFzdFBvc1swXSA9IDA7DQorCQkJZ19GYXN0UG9zWzFdID0gMTsNCisJCQlmb3IgKEJ5dGUgc2xvdEZhc3QgPSAyOyBzbG90RmFzdCA8IGtGYXN0U2xvdHM7IHNsb3RGYXN0KyspDQorCQkJew0KKwkJCQlVSW50MzIgayA9ICgoVUludDMyKTEgPDwgKChzbG90RmFzdCA+PiAxKSAtIDEpKTsNCisJCQkJZm9yIChVSW50MzIgaiA9IDA7IGogPCBrOyBqKyssIGMrKykNCisJCQkJCWdfRmFzdFBvc1tjXSA9IHNsb3RGYXN0Ow0KKwkJCX0NCisJCX0NCisNCisJCXN0YXRpYyBVSW50MzIgR2V0UG9zU2xvdChVSW50MzIgcG9zKQ0KKwkJew0KKwkJCWlmIChwb3MgPCAoMSA8PCAxMSkpDQorCQkJCXJldHVybiBnX0Zhc3RQb3NbcG9zXTsNCisJCQlpZiAocG9zIDwgKDEgPDwgMjEpKQ0KKwkJCQlyZXR1cm4gKFVJbnQzMikoZ19GYXN0UG9zW3BvcyA+PiAxMF0gKyAyMCk7DQorCQkJcmV0dXJuIChVSW50MzIpKGdfRmFzdFBvc1twb3MgPj4gMjBdICsgNDApOw0KKwkJfQ0KKw0KKwkJc3RhdGljIFVJbnQzMiBHZXRQb3NTbG90MihVSW50MzIgcG9zKQ0KKwkJew0KKwkJCWlmIChwb3MgPCAoMSA8PCAxNykpDQorCQkJCXJldHVybiAoVUludDMyKShnX0Zhc3RQb3NbcG9zID4+IDZdICsgMTIpOw0KKwkJCWlmIChwb3MgPCAoMSA8PCAyNykpDQorCQkJCXJldHVybiAoVUludDMyKShnX0Zhc3RQb3NbcG9zID4+IDE2XSArIDMyKTsNCisJCQlyZXR1cm4gKFVJbnQzMikoZ19GYXN0UG9zW3BvcyA+PiAyNl0gKyA1Mik7DQorCQl9DQorDQorCQlCYXNlLlN0YXRlIF9zdGF0ZSA9IG5ldyBCYXNlLlN0YXRlKCk7DQorCQlCeXRlIF9wcmV2aW91c0J5dGU7DQorCQlVSW50MzJbXSBfcmVwRGlzdGFuY2VzID0gbmV3IFVJbnQzMltCYXNlLmtOdW1SZXBEaXN0YW5jZXNdOw0KKw0KKwkJdm9pZCBCYXNlSW5pdCgpDQorCQl7DQorCQkJX3N0YXRlLkluaXQoKTsNCisJCQlfcHJldmlvdXNCeXRlID0gMDsNCisJCQlmb3IgKFVJbnQzMiBpID0gMDsgaSA8IEJhc2Uua051bVJlcERpc3RhbmNlczsgaSsrKQ0KKwkJCQlfcmVwRGlzdGFuY2VzW2ldID0gMDsNCisJCX0NCisNCisJCWNvbnN0IGludCBrRGVmYXVsdERpY3Rpb25hcnlMb2dTaXplID0gMjI7DQorCQljb25zdCBVSW50MzIga051bUZhc3RCeXRlc0RlZmF1bHQgPSAweDIwOw0KKw0KKwkJY2xhc3MgTGl0ZXJhbEVuY29kZXINCisJCXsNCisJCQlwdWJsaWMgc3RydWN0IEVuY29kZXIyDQorCQkJew0KKwkJCQlCaXRFbmNvZGVyW10gbV9FbmNvZGVyczsNCisNCisJCQkJcHVibGljIHZvaWQgQ3JlYXRlKCkgeyBtX0VuY29kZXJzID0gbmV3IEJpdEVuY29kZXJbMHgzMDBdOyB9DQorDQorCQkJCXB1YmxpYyB2b2lkIEluaXQoKSB7IGZvciAoaW50IGkgPSAwOyBpIDwgMHgzMDA7IGkrKykgbV9FbmNvZGVyc1tpXS5Jbml0KCk7IH0NCisNCisJCQkJcHVibGljIHZvaWQgRW5jb2RlKFJhbmdlQ29kZXIuRW5jb2RlciByYW5nZUVuY29kZXIsIGJ5dGUgc3ltYm9sKQ0KKwkJCQl7DQorCQkJCQl1aW50IGNvbnRleHQgPSAxOw0KKwkJCQkJZm9yIChpbnQgaSA9IDc7IGkgPj0gMDsgaS0tKQ0KKwkJCQkJew0KKwkJCQkJCXVpbnQgYml0ID0gKHVpbnQpKChzeW1ib2wgPj4gaSkgJiAxKTsNCisJCQkJCQltX0VuY29kZXJzW2NvbnRleHRdLkVuY29kZShyYW5nZUVuY29kZXIsIGJpdCk7DQorCQkJCQkJY29udGV4dCA9IChjb250ZXh0IDw8IDEpIHwgYml0Ow0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCXB1YmxpYyB2b2lkIEVuY29kZU1hdGNoZWQoUmFuZ2VDb2Rlci5FbmNvZGVyIHJhbmdlRW5jb2RlciwgYnl0ZSBtYXRjaEJ5dGUsIGJ5dGUgc3ltYm9sKQ0KKwkJCQl7DQorCQkJCQl1aW50IGNvbnRleHQgPSAxOw0KKwkJCQkJYm9vbCBzYW1lID0gdHJ1ZTsNCisJCQkJCWZvciAoaW50IGkgPSA3OyBpID49IDA7IGktLSkNCisJCQkJCXsNCisJCQkJCQl1aW50IGJpdCA9ICh1aW50KSgoc3ltYm9sID4+IGkpICYgMSk7DQorCQkJCQkJdWludCBzdGF0ZSA9IGNvbnRleHQ7DQorCQkJCQkJaWYgKHNhbWUpDQorCQkJCQkJew0KKwkJCQkJCQl1aW50IG1hdGNoQml0ID0gKHVpbnQpKChtYXRjaEJ5dGUgPj4gaSkgJiAxKTsNCisJCQkJCQkJc3RhdGUgKz0gKCgxICsgbWF0Y2hCaXQpIDw8IDgpOw0KKwkJCQkJCQlzYW1lID0gKG1hdGNoQml0ID09IGJpdCk7DQorCQkJCQkJfQ0KKwkJCQkJCW1fRW5jb2RlcnNbc3RhdGVdLkVuY29kZShyYW5nZUVuY29kZXIsIGJpdCk7DQorCQkJCQkJY29udGV4dCA9IChjb250ZXh0IDw8IDEpIHwgYml0Ow0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCXB1YmxpYyB1aW50IEdldFByaWNlKGJvb2wgbWF0Y2hNb2RlLCBieXRlIG1hdGNoQnl0ZSwgYnl0ZSBzeW1ib2wpDQorCQkJCXsNCisJCQkJCXVpbnQgcHJpY2UgPSAwOw0KKwkJCQkJdWludCBjb250ZXh0ID0gMTsNCisJCQkJCWludCBpID0gNzsNCisJCQkJCWlmIChtYXRjaE1vZGUpDQorCQkJCQl7DQorCQkJCQkJZm9yICg7IGkgPj0gMDsgaS0tKQ0KKwkJCQkJCXsNCisJCQkJCQkJdWludCBtYXRjaEJpdCA9ICh1aW50KShtYXRjaEJ5dGUgPj4gaSkgJiAxOw0KKwkJCQkJCQl1aW50IGJpdCA9ICh1aW50KShzeW1ib2wgPj4gaSkgJiAxOw0KKwkJCQkJCQlwcmljZSArPSBtX0VuY29kZXJzWygoMSArIG1hdGNoQml0KSA8PCA4KSArIGNvbnRleHRdLkdldFByaWNlKGJpdCk7DQorCQkJCQkJCWNvbnRleHQgPSAoY29udGV4dCA8PCAxKSB8IGJpdDsNCisJCQkJCQkJaWYgKG1hdGNoQml0ICE9IGJpdCkNCisJCQkJCQkJew0KKwkJCQkJCQkJaS0tOw0KKwkJCQkJCQkJYnJlYWs7DQorCQkJCQkJCX0NCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCQlmb3IgKDsgaSA+PSAwOyBpLS0pDQorCQkJCQl7DQorCQkJCQkJdWludCBiaXQgPSAodWludCkoc3ltYm9sID4+IGkpICYgMTsNCisJCQkJCQlwcmljZSArPSBtX0VuY29kZXJzW2NvbnRleHRdLkdldFByaWNlKGJpdCk7DQorCQkJCQkJY29udGV4dCA9IChjb250ZXh0IDw8IDEpIHwgYml0Ow0KKwkJCQkJfQ0KKwkJCQkJcmV0dXJuIHByaWNlOw0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCUVuY29kZXIyW10gbV9Db2RlcnM7DQorCQkJaW50IG1fTnVtUHJldkJpdHM7DQorCQkJaW50IG1fTnVtUG9zQml0czsNCisJCQl1aW50IG1fUG9zTWFzazsNCisNCisJCQlwdWJsaWMgdm9pZCBDcmVhdGUoaW50IG51bVBvc0JpdHMsIGludCBudW1QcmV2Qml0cykNCisJCQl7DQorCQkJCWlmIChtX0NvZGVycyAhPSBudWxsICYmIG1fTnVtUHJldkJpdHMgPT0gbnVtUHJldkJpdHMgJiYgbV9OdW1Qb3NCaXRzID09IG51bVBvc0JpdHMpDQorCQkJCQlyZXR1cm47DQorCQkJCW1fTnVtUG9zQml0cyA9IG51bVBvc0JpdHM7DQorCQkJCW1fUG9zTWFzayA9ICgodWludCkxIDw8IG51bVBvc0JpdHMpIC0gMTsNCisJCQkJbV9OdW1QcmV2Qml0cyA9IG51bVByZXZCaXRzOw0KKwkJCQl1aW50IG51bVN0YXRlcyA9ICh1aW50KTEgPDwgKG1fTnVtUHJldkJpdHMgKyBtX051bVBvc0JpdHMpOw0KKwkJCQltX0NvZGVycyA9IG5ldyBFbmNvZGVyMltudW1TdGF0ZXNdOw0KKwkJCQlmb3IgKHVpbnQgaSA9IDA7IGkgPCBudW1TdGF0ZXM7IGkrKykNCisJCQkJCW1fQ29kZXJzW2ldLkNyZWF0ZSgpOw0KKwkJCX0NCisNCisJCQlwdWJsaWMgdm9pZCBJbml0KCkNCisJCQl7DQorCQkJCXVpbnQgbnVtU3RhdGVzID0gKHVpbnQpMSA8PCAobV9OdW1QcmV2Qml0cyArIG1fTnVtUG9zQml0cyk7DQorCQkJCWZvciAodWludCBpID0gMDsgaSA8IG51bVN0YXRlczsgaSsrKQ0KKwkJCQkJbV9Db2RlcnNbaV0uSW5pdCgpOw0KKwkJCX0NCisNCisJCQlwdWJsaWMgRW5jb2RlcjIgR2V0U3ViQ29kZXIoVUludDMyIHBvcywgQnl0ZSBwcmV2Qnl0ZSkNCisJCQl7IHJldHVybiBtX0NvZGVyc1soKHBvcyAmIG1fUG9zTWFzaykgPDwgbV9OdW1QcmV2Qml0cykgKyAodWludCkocHJldkJ5dGUgPj4gKDggLSBtX051bVByZXZCaXRzKSldOyB9DQorCQl9DQorDQorCQljbGFzcyBMZW5FbmNvZGVyDQorCQl7DQorCQkJUmFuZ2VDb2Rlci5CaXRFbmNvZGVyIF9jaG9pY2UgPSBuZXcgUmFuZ2VDb2Rlci5CaXRFbmNvZGVyKCk7DQorCQkJUmFuZ2VDb2Rlci5CaXRFbmNvZGVyIF9jaG9pY2UyID0gbmV3IFJhbmdlQ29kZXIuQml0RW5jb2RlcigpOw0KKwkJCVJhbmdlQ29kZXIuQml0VHJlZUVuY29kZXJbXSBfbG93Q29kZXIgPSBuZXcgUmFuZ2VDb2Rlci5CaXRUcmVlRW5jb2RlcltCYXNlLmtOdW1Qb3NTdGF0ZXNFbmNvZGluZ01heF07DQorCQkJUmFuZ2VDb2Rlci5CaXRUcmVlRW5jb2RlcltdIF9taWRDb2RlciA9IG5ldyBSYW5nZUNvZGVyLkJpdFRyZWVFbmNvZGVyW0Jhc2Uua051bVBvc1N0YXRlc0VuY29kaW5nTWF4XTsNCisJCQlSYW5nZUNvZGVyLkJpdFRyZWVFbmNvZGVyIF9oaWdoQ29kZXIgPSBuZXcgUmFuZ2VDb2Rlci5CaXRUcmVlRW5jb2RlcihCYXNlLmtOdW1IaWdoTGVuQml0cyk7DQorDQorCQkJcHVibGljIExlbkVuY29kZXIoKQ0KKwkJCXsNCisJCQkJZm9yIChVSW50MzIgcG9zU3RhdGUgPSAwOyBwb3NTdGF0ZSA8IEJhc2Uua051bVBvc1N0YXRlc0VuY29kaW5nTWF4OyBwb3NTdGF0ZSsrKQ0KKwkJCQl7DQorCQkJCQlfbG93Q29kZXJbcG9zU3RhdGVdID0gbmV3IFJhbmdlQ29kZXIuQml0VHJlZUVuY29kZXIoQmFzZS5rTnVtTG93TGVuQml0cyk7DQorCQkJCQlfbWlkQ29kZXJbcG9zU3RhdGVdID0gbmV3IFJhbmdlQ29kZXIuQml0VHJlZUVuY29kZXIoQmFzZS5rTnVtTWlkTGVuQml0cyk7DQorCQkJCX0NCisJCQl9DQorDQorCQkJcHVibGljIHZvaWQgSW5pdChVSW50MzIgbnVtUG9zU3RhdGVzKQ0KKwkJCXsNCisJCQkJX2Nob2ljZS5Jbml0KCk7DQorCQkJCV9jaG9pY2UyLkluaXQoKTsNCisJCQkJZm9yIChVSW50MzIgcG9zU3RhdGUgPSAwOyBwb3NTdGF0ZSA8IG51bVBvc1N0YXRlczsgcG9zU3RhdGUrKykNCisJCQkJew0KKwkJCQkJX2xvd0NvZGVyW3Bvc1N0YXRlXS5Jbml0KCk7DQorCQkJCQlfbWlkQ29kZXJbcG9zU3RhdGVdLkluaXQoKTsNCisJCQkJfQ0KKwkJCQlfaGlnaENvZGVyLkluaXQoKTsNCisJCQl9DQorDQorCQkJcHVibGljIHZvaWQgRW5jb2RlKFJhbmdlQ29kZXIuRW5jb2RlciByYW5nZUVuY29kZXIsIFVJbnQzMiBzeW1ib2wsIFVJbnQzMiBwb3NTdGF0ZSkNCisJCQl7DQorCQkJCWlmIChzeW1ib2wgPCBCYXNlLmtOdW1Mb3dMZW5TeW1ib2xzKQ0KKwkJCQl7DQorCQkJCQlfY2hvaWNlLkVuY29kZShyYW5nZUVuY29kZXIsIDApOw0KKwkJCQkJX2xvd0NvZGVyW3Bvc1N0YXRlXS5FbmNvZGUocmFuZ2VFbmNvZGVyLCBzeW1ib2wpOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJc3ltYm9sIC09IEJhc2Uua051bUxvd0xlblN5bWJvbHM7DQorCQkJCQlfY2hvaWNlLkVuY29kZShyYW5nZUVuY29kZXIsIDEpOw0KKwkJCQkJaWYgKHN5bWJvbCA8IEJhc2Uua051bU1pZExlblN5bWJvbHMpDQorCQkJCQl7DQorCQkJCQkJX2Nob2ljZTIuRW5jb2RlKHJhbmdlRW5jb2RlciwgMCk7DQorCQkJCQkJX21pZENvZGVyW3Bvc1N0YXRlXS5FbmNvZGUocmFuZ2VFbmNvZGVyLCBzeW1ib2wpOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCV9jaG9pY2UyLkVuY29kZShyYW5nZUVuY29kZXIsIDEpOw0KKwkJCQkJCV9oaWdoQ29kZXIuRW5jb2RlKHJhbmdlRW5jb2Rlciwgc3ltYm9sIC0gQmFzZS5rTnVtTWlkTGVuU3ltYm9scyk7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorDQorCQkJcHVibGljIHZvaWQgU2V0UHJpY2VzKFVJbnQzMiBwb3NTdGF0ZSwgVUludDMyIG51bVN5bWJvbHMsIFVJbnQzMltdIHByaWNlcywgVUludDMyIHN0KQ0KKwkJCXsNCisJCQkJVUludDMyIGEwID0gX2Nob2ljZS5HZXRQcmljZTAoKTsNCisJCQkJVUludDMyIGExID0gX2Nob2ljZS5HZXRQcmljZTEoKTsNCisJCQkJVUludDMyIGIwID0gYTEgKyBfY2hvaWNlMi5HZXRQcmljZTAoKTsNCisJCQkJVUludDMyIGIxID0gYTEgKyBfY2hvaWNlMi5HZXRQcmljZTEoKTsNCisJCQkJVUludDMyIGkgPSAwOw0KKwkJCQlmb3IgKGkgPSAwOyBpIDwgQmFzZS5rTnVtTG93TGVuU3ltYm9sczsgaSsrKQ0KKwkJCQl7DQorCQkJCQlpZiAoaSA+PSBudW1TeW1ib2xzKQ0KKwkJCQkJCXJldHVybjsNCisJCQkJCXByaWNlc1tzdCArIGldID0gYTAgKyBfbG93Q29kZXJbcG9zU3RhdGVdLkdldFByaWNlKGkpOw0KKwkJCQl9DQorCQkJCWZvciAoOyBpIDwgQmFzZS5rTnVtTG93TGVuU3ltYm9scyArIEJhc2Uua051bU1pZExlblN5bWJvbHM7IGkrKykNCisJCQkJew0KKwkJCQkJaWYgKGkgPj0gbnVtU3ltYm9scykNCisJCQkJCQlyZXR1cm47DQorCQkJCQlwcmljZXNbc3QgKyBpXSA9IGIwICsgX21pZENvZGVyW3Bvc1N0YXRlXS5HZXRQcmljZShpIC0gQmFzZS5rTnVtTG93TGVuU3ltYm9scyk7DQorCQkJCX0NCisJCQkJZm9yICg7IGkgPCBudW1TeW1ib2xzOyBpKyspDQorCQkJCQlwcmljZXNbc3QgKyBpXSA9IGIxICsgX2hpZ2hDb2Rlci5HZXRQcmljZShpIC0gQmFzZS5rTnVtTG93TGVuU3ltYm9scyAtIEJhc2Uua051bU1pZExlblN5bWJvbHMpOw0KKwkJCX0NCisJCX07DQorDQorCQljb25zdCBVSW50MzIga051bUxlblNwZWNTeW1ib2xzID0gQmFzZS5rTnVtTG93TGVuU3ltYm9scyArIEJhc2Uua051bU1pZExlblN5bWJvbHM7DQorDQorCQljbGFzcyBMZW5QcmljZVRhYmxlRW5jb2RlciA6IExlbkVuY29kZXINCisJCXsNCisJCQlVSW50MzJbXSBfcHJpY2VzID0gbmV3IFVJbnQzMltCYXNlLmtOdW1MZW5TeW1ib2xzIDw8IEJhc2Uua051bVBvc1N0YXRlc0JpdHNFbmNvZGluZ01heF07DQorCQkJVUludDMyIF90YWJsZVNpemU7DQorCQkJVUludDMyW10gX2NvdW50ZXJzID0gbmV3IFVJbnQzMltCYXNlLmtOdW1Qb3NTdGF0ZXNFbmNvZGluZ01heF07DQorDQorCQkJcHVibGljIHZvaWQgU2V0VGFibGVTaXplKFVJbnQzMiB0YWJsZVNpemUpIHsgX3RhYmxlU2l6ZSA9IHRhYmxlU2l6ZTsgfQ0KKw0KKwkJCXB1YmxpYyBVSW50MzIgR2V0UHJpY2UoVUludDMyIHN5bWJvbCwgVUludDMyIHBvc1N0YXRlKQ0KKwkJCXsNCisJCQkJcmV0dXJuIF9wcmljZXNbcG9zU3RhdGUgKiBCYXNlLmtOdW1MZW5TeW1ib2xzICsgc3ltYm9sXTsNCisJCQl9DQorDQorCQkJdm9pZCBVcGRhdGVUYWJsZShVSW50MzIgcG9zU3RhdGUpDQorCQkJew0KKwkJCQlTZXRQcmljZXMocG9zU3RhdGUsIF90YWJsZVNpemUsIF9wcmljZXMsIHBvc1N0YXRlICogQmFzZS5rTnVtTGVuU3ltYm9scyk7DQorCQkJCV9jb3VudGVyc1twb3NTdGF0ZV0gPSBfdGFibGVTaXplOw0KKwkJCX0NCisNCisJCQlwdWJsaWMgdm9pZCBVcGRhdGVUYWJsZXMoVUludDMyIG51bVBvc1N0YXRlcykNCisJCQl7DQorCQkJCWZvciAoVUludDMyIHBvc1N0YXRlID0gMDsgcG9zU3RhdGUgPCBudW1Qb3NTdGF0ZXM7IHBvc1N0YXRlKyspDQorCQkJCQlVcGRhdGVUYWJsZShwb3NTdGF0ZSk7DQorCQkJfQ0KKw0KKwkJCXB1YmxpYyBuZXcgdm9pZCBFbmNvZGUoUmFuZ2VDb2Rlci5FbmNvZGVyIHJhbmdlRW5jb2RlciwgVUludDMyIHN5bWJvbCwgVUludDMyIHBvc1N0YXRlKQ0KKwkJCXsNCisJCQkJYmFzZS5FbmNvZGUocmFuZ2VFbmNvZGVyLCBzeW1ib2wsIHBvc1N0YXRlKTsNCisJCQkJaWYgKC0tX2NvdW50ZXJzW3Bvc1N0YXRlXSA9PSAwKQ0KKwkJCQkJVXBkYXRlVGFibGUocG9zU3RhdGUpOw0KKwkJCX0NCisJCX0NCisNCisJCWNvbnN0IFVJbnQzMiBrTnVtT3B0cyA9IDEgPDwgMTI7DQorCQljbGFzcyBPcHRpbWFsDQorCQl7DQorCQkJcHVibGljIEJhc2UuU3RhdGUgU3RhdGU7DQorDQorCQkJcHVibGljIGJvb2wgUHJldjFJc0NoYXI7DQorCQkJcHVibGljIGJvb2wgUHJldjI7DQorDQorCQkJcHVibGljIFVJbnQzMiBQb3NQcmV2MjsNCisJCQlwdWJsaWMgVUludDMyIEJhY2tQcmV2MjsNCisNCisJCQlwdWJsaWMgVUludDMyIFByaWNlOw0KKwkJCXB1YmxpYyBVSW50MzIgUG9zUHJldjsNCisJCQlwdWJsaWMgVUludDMyIEJhY2tQcmV2Ow0KKw0KKwkJCXB1YmxpYyBVSW50MzIgQmFja3MwOw0KKwkJCXB1YmxpYyBVSW50MzIgQmFja3MxOw0KKwkJCXB1YmxpYyBVSW50MzIgQmFja3MyOw0KKwkJCXB1YmxpYyBVSW50MzIgQmFja3MzOw0KKw0KKwkJCXB1YmxpYyB2b2lkIE1ha2VBc0NoYXIoKSB7IEJhY2tQcmV2ID0gMHhGRkZGRkZGRjsgUHJldjFJc0NoYXIgPSBmYWxzZTsgfQ0KKwkJCXB1YmxpYyB2b2lkIE1ha2VBc1Nob3J0UmVwKCkgeyBCYWNrUHJldiA9IDA7IDsgUHJldjFJc0NoYXIgPSBmYWxzZTsgfQ0KKwkJCXB1YmxpYyBib29sIElzU2hvcnRSZXAoKSB7IHJldHVybiAoQmFja1ByZXYgPT0gMCk7IH0NCisJCX07DQorCQlPcHRpbWFsW10gX29wdGltdW0gPSBuZXcgT3B0aW1hbFtrTnVtT3B0c107DQorCQlMWi5JTWF0Y2hGaW5kZXIgX21hdGNoRmluZGVyID0gbnVsbDsNCisJCVJhbmdlQ29kZXIuRW5jb2RlciBfcmFuZ2VFbmNvZGVyID0gbmV3IFJhbmdlQ29kZXIuRW5jb2RlcigpOw0KKw0KKwkJUmFuZ2VDb2Rlci5CaXRFbmNvZGVyW10gX2lzTWF0Y2ggPSBuZXcgUmFuZ2VDb2Rlci5CaXRFbmNvZGVyW0Jhc2Uua051bVN0YXRlcyA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4XTsNCisJCVJhbmdlQ29kZXIuQml0RW5jb2RlcltdIF9pc1JlcCA9IG5ldyBSYW5nZUNvZGVyLkJpdEVuY29kZXJbQmFzZS5rTnVtU3RhdGVzXTsNCisJCVJhbmdlQ29kZXIuQml0RW5jb2RlcltdIF9pc1JlcEcwID0gbmV3IFJhbmdlQ29kZXIuQml0RW5jb2RlcltCYXNlLmtOdW1TdGF0ZXNdOw0KKwkJUmFuZ2VDb2Rlci5CaXRFbmNvZGVyW10gX2lzUmVwRzEgPSBuZXcgUmFuZ2VDb2Rlci5CaXRFbmNvZGVyW0Jhc2Uua051bVN0YXRlc107DQorCQlSYW5nZUNvZGVyLkJpdEVuY29kZXJbXSBfaXNSZXBHMiA9IG5ldyBSYW5nZUNvZGVyLkJpdEVuY29kZXJbQmFzZS5rTnVtU3RhdGVzXTsNCisJCVJhbmdlQ29kZXIuQml0RW5jb2RlcltdIF9pc1JlcDBMb25nID0gbmV3IFJhbmdlQ29kZXIuQml0RW5jb2RlcltCYXNlLmtOdW1TdGF0ZXMgPDwgQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heF07DQorDQorCQlSYW5nZUNvZGVyLkJpdFRyZWVFbmNvZGVyW10gX3Bvc1Nsb3RFbmNvZGVyID0gbmV3IFJhbmdlQ29kZXIuQml0VHJlZUVuY29kZXJbQmFzZS5rTnVtTGVuVG9Qb3NTdGF0ZXNdOw0KKwkJDQorCQlSYW5nZUNvZGVyLkJpdEVuY29kZXJbXSBfcG9zRW5jb2RlcnMgPSBuZXcgUmFuZ2VDb2Rlci5CaXRFbmNvZGVyW0Jhc2Uua051bUZ1bGxEaXN0YW5jZXMgLSBCYXNlLmtFbmRQb3NNb2RlbEluZGV4XTsNCisJCVJhbmdlQ29kZXIuQml0VHJlZUVuY29kZXIgX3Bvc0FsaWduRW5jb2RlciA9IG5ldyBSYW5nZUNvZGVyLkJpdFRyZWVFbmNvZGVyKEJhc2Uua051bUFsaWduQml0cyk7DQorDQorCQlMZW5QcmljZVRhYmxlRW5jb2RlciBfbGVuRW5jb2RlciA9IG5ldyBMZW5QcmljZVRhYmxlRW5jb2RlcigpOw0KKwkJTGVuUHJpY2VUYWJsZUVuY29kZXIgX3JlcE1hdGNoTGVuRW5jb2RlciA9IG5ldyBMZW5QcmljZVRhYmxlRW5jb2RlcigpOw0KKw0KKwkJTGl0ZXJhbEVuY29kZXIgX2xpdGVyYWxFbmNvZGVyID0gbmV3IExpdGVyYWxFbmNvZGVyKCk7DQorDQorCQlVSW50MzJbXSBfbWF0Y2hEaXN0YW5jZXMgPSBuZXcgVUludDMyW0Jhc2Uua01hdGNoTWF4TGVuICogMiArIDJdOw0KKwkJDQorCQlVSW50MzIgX251bUZhc3RCeXRlcyA9IGtOdW1GYXN0Qnl0ZXNEZWZhdWx0Ow0KKwkJVUludDMyIF9sb25nZXN0TWF0Y2hMZW5ndGg7DQorCQlVSW50MzIgX251bURpc3RhbmNlUGFpcnM7DQorDQorCQlVSW50MzIgX2FkZGl0aW9uYWxPZmZzZXQ7DQorDQorCQlVSW50MzIgX29wdGltdW1FbmRJbmRleDsNCisJCVVJbnQzMiBfb3B0aW11bUN1cnJlbnRJbmRleDsNCisNCisJCWJvb2wgX2xvbmdlc3RNYXRjaFdhc0ZvdW5kOw0KKw0KKwkJVUludDMyW10gX3Bvc1Nsb3RQcmljZXMgPSBuZXcgVUludDMyWzEgPDwgKEJhc2Uua051bVBvc1Nsb3RCaXRzICsgQmFzZS5rTnVtTGVuVG9Qb3NTdGF0ZXNCaXRzKV07DQorCQlVSW50MzJbXSBfZGlzdGFuY2VzUHJpY2VzID0gbmV3IFVJbnQzMltCYXNlLmtOdW1GdWxsRGlzdGFuY2VzIDw8IEJhc2Uua051bUxlblRvUG9zU3RhdGVzQml0c107DQorCQlVSW50MzJbXSBfYWxpZ25QcmljZXMgPSBuZXcgVUludDMyW0Jhc2Uua0FsaWduVGFibGVTaXplXTsNCisJCVVJbnQzMiBfYWxpZ25QcmljZUNvdW50Ow0KKw0KKwkJVUludDMyIF9kaXN0VGFibGVTaXplID0gKGtEZWZhdWx0RGljdGlvbmFyeUxvZ1NpemUgKiAyKTsNCisNCisJCWludCBfcG9zU3RhdGVCaXRzID0gMjsNCisJCVVJbnQzMiBfcG9zU3RhdGVNYXNrID0gKDQgLSAxKTsNCisJCWludCBfbnVtTGl0ZXJhbFBvc1N0YXRlQml0cyA9IDA7DQorCQlpbnQgX251bUxpdGVyYWxDb250ZXh0Qml0cyA9IDM7DQorDQorCQlVSW50MzIgX2RpY3Rpb25hcnlTaXplID0gKDEgPDwga0RlZmF1bHREaWN0aW9uYXJ5TG9nU2l6ZSk7DQorCQlVSW50MzIgX2RpY3Rpb25hcnlTaXplUHJldiA9IDB4RkZGRkZGRkY7DQorCQlVSW50MzIgX251bUZhc3RCeXRlc1ByZXYgPSAweEZGRkZGRkZGOw0KKw0KKwkJSW50NjQgbm93UG9zNjQ7DQorCQlib29sIF9maW5pc2hlZDsNCisJCVN5c3RlbS5JTy5TdHJlYW0gX2luU3RyZWFtOw0KKw0KKwkJRU1hdGNoRmluZGVyVHlwZSBfbWF0Y2hGaW5kZXJUeXBlID0gRU1hdGNoRmluZGVyVHlwZS5CVDQ7DQorCQlib29sIF93cml0ZUVuZE1hcmsgPSBmYWxzZTsNCisJCQ0KKwkJYm9vbCBfbmVlZFJlbGVhc2VNRlN0cmVhbTsNCisNCisJCXZvaWQgQ3JlYXRlKCkNCisJCXsNCisJCQlpZiAoX21hdGNoRmluZGVyID09IG51bGwpDQorCQkJew0KKwkJCQlMWi5CaW5UcmVlIGJ0ID0gbmV3IExaLkJpblRyZWUoKTsNCisJCQkJaW50IG51bUhhc2hCeXRlcyA9IDQ7DQorCQkJCWlmIChfbWF0Y2hGaW5kZXJUeXBlID09IEVNYXRjaEZpbmRlclR5cGUuQlQyKQ0KKwkJCQkJbnVtSGFzaEJ5dGVzID0gMjsNCisJCQkJYnQuU2V0VHlwZShudW1IYXNoQnl0ZXMpOw0KKwkJCQlfbWF0Y2hGaW5kZXIgPSBidDsNCisJCQl9DQorCQkJX2xpdGVyYWxFbmNvZGVyLkNyZWF0ZShfbnVtTGl0ZXJhbFBvc1N0YXRlQml0cywgX251bUxpdGVyYWxDb250ZXh0Qml0cyk7DQorDQorCQkJaWYgKF9kaWN0aW9uYXJ5U2l6ZSA9PSBfZGljdGlvbmFyeVNpemVQcmV2ICYmIF9udW1GYXN0Qnl0ZXNQcmV2ID09IF9udW1GYXN0Qnl0ZXMpDQorCQkJCXJldHVybjsNCisJCQlfbWF0Y2hGaW5kZXIuQ3JlYXRlKF9kaWN0aW9uYXJ5U2l6ZSwga051bU9wdHMsIF9udW1GYXN0Qnl0ZXMsIEJhc2Uua01hdGNoTWF4TGVuICsgMSk7DQorCQkJX2RpY3Rpb25hcnlTaXplUHJldiA9IF9kaWN0aW9uYXJ5U2l6ZTsNCisJCQlfbnVtRmFzdEJ5dGVzUHJldiA9IF9udW1GYXN0Qnl0ZXM7DQorCQl9DQorDQorCQlwdWJsaWMgRW5jb2RlcigpDQorCQl7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtT3B0czsgaSsrKQ0KKwkJCQlfb3B0aW11bVtpXSA9IG5ldyBPcHRpbWFsKCk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBCYXNlLmtOdW1MZW5Ub1Bvc1N0YXRlczsgaSsrKQ0KKwkJCQlfcG9zU2xvdEVuY29kZXJbaV0gPSBuZXcgUmFuZ2VDb2Rlci5CaXRUcmVlRW5jb2RlcihCYXNlLmtOdW1Qb3NTbG90Qml0cyk7DQorCQl9DQorDQorCQl2b2lkIFNldFdyaXRlRW5kTWFya2VyTW9kZShib29sIHdyaXRlRW5kTWFya2VyKQ0KKwkJew0KKwkJCV93cml0ZUVuZE1hcmsgPSB3cml0ZUVuZE1hcmtlcjsNCisJCX0NCisNCisJCXZvaWQgSW5pdCgpDQorCQl7DQorCQkJQmFzZUluaXQoKTsNCisJCQlfcmFuZ2VFbmNvZGVyLkluaXQoKTsNCisNCisJCQl1aW50IGk7DQorCQkJZm9yIChpID0gMDsgaSA8IEJhc2Uua051bVN0YXRlczsgaSsrKQ0KKwkJCXsNCisJCQkJZm9yICh1aW50IGogPSAwOyBqIDw9IF9wb3NTdGF0ZU1hc2s7IGorKykNCisJCQkJew0KKwkJCQkJdWludCBjb21wbGV4U3RhdGUgPSAoaSA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIGo7DQorCQkJCQlfaXNNYXRjaFtjb21wbGV4U3RhdGVdLkluaXQoKTsNCisJCQkJCV9pc1JlcDBMb25nW2NvbXBsZXhTdGF0ZV0uSW5pdCgpOw0KKwkJCQl9DQorCQkJCV9pc1JlcFtpXS5Jbml0KCk7DQorCQkJCV9pc1JlcEcwW2ldLkluaXQoKTsNCisJCQkJX2lzUmVwRzFbaV0uSW5pdCgpOw0KKwkJCQlfaXNSZXBHMltpXS5Jbml0KCk7DQorCQkJfQ0KKwkJCV9saXRlcmFsRW5jb2Rlci5Jbml0KCk7DQorCQkJZm9yIChpID0gMDsgaSA8IEJhc2Uua051bUxlblRvUG9zU3RhdGVzOyBpKyspDQorCQkJCV9wb3NTbG90RW5jb2RlcltpXS5Jbml0KCk7DQorCQkJZm9yIChpID0gMDsgaSA8IEJhc2Uua051bUZ1bGxEaXN0YW5jZXMgLSBCYXNlLmtFbmRQb3NNb2RlbEluZGV4OyBpKyspDQorCQkJCV9wb3NFbmNvZGVyc1tpXS5Jbml0KCk7DQorDQorCQkJX2xlbkVuY29kZXIuSW5pdCgoVUludDMyKTEgPDwgX3Bvc1N0YXRlQml0cyk7DQorCQkJX3JlcE1hdGNoTGVuRW5jb2Rlci5Jbml0KChVSW50MzIpMSA8PCBfcG9zU3RhdGVCaXRzKTsNCisNCisJCQlfcG9zQWxpZ25FbmNvZGVyLkluaXQoKTsNCisNCisJCQlfbG9uZ2VzdE1hdGNoV2FzRm91bmQgPSBmYWxzZTsNCisJCQlfb3B0aW11bUVuZEluZGV4ID0gMDsNCisJCQlfb3B0aW11bUN1cnJlbnRJbmRleCA9IDA7DQorCQkJX2FkZGl0aW9uYWxPZmZzZXQgPSAwOw0KKwkJfQ0KKw0KKwkJdm9pZCBSZWFkTWF0Y2hEaXN0YW5jZXMob3V0IFVJbnQzMiBsZW5SZXMsIG91dCBVSW50MzIgbnVtRGlzdGFuY2VQYWlycykNCisJCXsNCisJCQlsZW5SZXMgPSAwOw0KKwkJCW51bURpc3RhbmNlUGFpcnMgPSBfbWF0Y2hGaW5kZXIuR2V0TWF0Y2hlcyhfbWF0Y2hEaXN0YW5jZXMpOw0KKwkJCWlmIChudW1EaXN0YW5jZVBhaXJzID4gMCkNCisJCQl7DQorCQkJCWxlblJlcyA9IF9tYXRjaERpc3RhbmNlc1tudW1EaXN0YW5jZVBhaXJzIC0gMl07DQorCQkJCWlmIChsZW5SZXMgPT0gX251bUZhc3RCeXRlcykNCisJCQkJCWxlblJlcyArPSBfbWF0Y2hGaW5kZXIuR2V0TWF0Y2hMZW4oKGludClsZW5SZXMgLSAxLCBfbWF0Y2hEaXN0YW5jZXNbbnVtRGlzdGFuY2VQYWlycyAtIDFdLA0KKwkJCQkJCUJhc2Uua01hdGNoTWF4TGVuIC0gbGVuUmVzKTsNCisJCQl9DQorCQkJX2FkZGl0aW9uYWxPZmZzZXQrKzsNCisJCX0NCisNCisNCisJCXZvaWQgTW92ZVBvcyhVSW50MzIgbnVtKQ0KKwkJew0KKwkJCWlmIChudW0gPiAwKQ0KKwkJCXsNCisJCQkJX21hdGNoRmluZGVyLlNraXAobnVtKTsNCisJCQkJX2FkZGl0aW9uYWxPZmZzZXQgKz0gbnVtOw0KKwkJCX0NCisJCX0NCisNCisJCVVJbnQzMiBHZXRSZXBMZW4xUHJpY2UoQmFzZS5TdGF0ZSBzdGF0ZSwgVUludDMyIHBvc1N0YXRlKQ0KKwkJew0KKwkJCXJldHVybiBfaXNSZXBHMFtzdGF0ZS5JbmRleF0uR2V0UHJpY2UwKCkgKw0KKwkJCQkJX2lzUmVwMExvbmdbKHN0YXRlLkluZGV4IDw8IEJhc2Uua051bVBvc1N0YXRlc0JpdHNNYXgpICsgcG9zU3RhdGVdLkdldFByaWNlMCgpOw0KKwkJfQ0KKw0KKwkJVUludDMyIEdldFB1cmVSZXBQcmljZShVSW50MzIgcmVwSW5kZXgsIEJhc2UuU3RhdGUgc3RhdGUsIFVJbnQzMiBwb3NTdGF0ZSkNCisJCXsNCisJCQlVSW50MzIgcHJpY2U7DQorCQkJaWYgKHJlcEluZGV4ID09IDApDQorCQkJew0KKwkJCQlwcmljZSA9IF9pc1JlcEcwW3N0YXRlLkluZGV4XS5HZXRQcmljZTAoKTsNCisJCQkJcHJpY2UgKz0gX2lzUmVwMExvbmdbKHN0YXRlLkluZGV4IDw8IEJhc2Uua051bVBvc1N0YXRlc0JpdHNNYXgpICsgcG9zU3RhdGVdLkdldFByaWNlMSgpOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlwcmljZSA9IF9pc1JlcEcwW3N0YXRlLkluZGV4XS5HZXRQcmljZTEoKTsNCisJCQkJaWYgKHJlcEluZGV4ID09IDEpDQorCQkJCQlwcmljZSArPSBfaXNSZXBHMVtzdGF0ZS5JbmRleF0uR2V0UHJpY2UwKCk7DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJcHJpY2UgKz0gX2lzUmVwRzFbc3RhdGUuSW5kZXhdLkdldFByaWNlMSgpOw0KKwkJCQkJcHJpY2UgKz0gX2lzUmVwRzJbc3RhdGUuSW5kZXhdLkdldFByaWNlKHJlcEluZGV4IC0gMik7DQorCQkJCX0NCisJCQl9DQorCQkJcmV0dXJuIHByaWNlOw0KKwkJfQ0KKw0KKwkJVUludDMyIEdldFJlcFByaWNlKFVJbnQzMiByZXBJbmRleCwgVUludDMyIGxlbiwgQmFzZS5TdGF0ZSBzdGF0ZSwgVUludDMyIHBvc1N0YXRlKQ0KKwkJew0KKwkJCVVJbnQzMiBwcmljZSA9IF9yZXBNYXRjaExlbkVuY29kZXIuR2V0UHJpY2UobGVuIC0gQmFzZS5rTWF0Y2hNaW5MZW4sIHBvc1N0YXRlKTsNCisJCQlyZXR1cm4gcHJpY2UgKyBHZXRQdXJlUmVwUHJpY2UocmVwSW5kZXgsIHN0YXRlLCBwb3NTdGF0ZSk7DQorCQl9DQorCQ0KKwkJVUludDMyIEdldFBvc0xlblByaWNlKFVJbnQzMiBwb3MsIFVJbnQzMiBsZW4sIFVJbnQzMiBwb3NTdGF0ZSkNCisJCXsNCisJCQlVSW50MzIgcHJpY2U7DQorCQkJVUludDMyIGxlblRvUG9zU3RhdGUgPSBCYXNlLkdldExlblRvUG9zU3RhdGUobGVuKTsNCisJCQlpZiAocG9zIDwgQmFzZS5rTnVtRnVsbERpc3RhbmNlcykNCisJCQkJcHJpY2UgPSBfZGlzdGFuY2VzUHJpY2VzWyhsZW5Ub1Bvc1N0YXRlICogQmFzZS5rTnVtRnVsbERpc3RhbmNlcykgKyBwb3NdOw0KKwkJCWVsc2UNCisJCQkJcHJpY2UgPSBfcG9zU2xvdFByaWNlc1sobGVuVG9Qb3NTdGF0ZSA8PCBCYXNlLmtOdW1Qb3NTbG90Qml0cykgKyBHZXRQb3NTbG90Mihwb3MpXSArDQorCQkJCQlfYWxpZ25QcmljZXNbcG9zICYgQmFzZS5rQWxpZ25NYXNrXTsNCisJCQlyZXR1cm4gcHJpY2UgKyBfbGVuRW5jb2Rlci5HZXRQcmljZShsZW4gLSBCYXNlLmtNYXRjaE1pbkxlbiwgcG9zU3RhdGUpOw0KKwkJfQ0KKw0KKwkJVUludDMyIEJhY2t3YXJkKG91dCBVSW50MzIgYmFja1JlcywgVUludDMyIGN1cikNCisJCXsNCisJCQlfb3B0aW11bUVuZEluZGV4ID0gY3VyOw0KKwkJCVVJbnQzMiBwb3NNZW0gPSBfb3B0aW11bVtjdXJdLlBvc1ByZXY7DQorCQkJVUludDMyIGJhY2tNZW0gPSBfb3B0aW11bVtjdXJdLkJhY2tQcmV2Ow0KKwkJCWRvDQorCQkJew0KKwkJCQlpZiAoX29wdGltdW1bY3VyXS5QcmV2MUlzQ2hhcikNCisJCQkJew0KKwkJCQkJX29wdGltdW1bcG9zTWVtXS5NYWtlQXNDaGFyKCk7DQorCQkJCQlfb3B0aW11bVtwb3NNZW1dLlBvc1ByZXYgPSBwb3NNZW0gLSAxOw0KKwkJCQkJaWYgKF9vcHRpbXVtW2N1cl0uUHJldjIpDQorCQkJCQl7DQorCQkJCQkJX29wdGltdW1bcG9zTWVtIC0gMV0uUHJldjFJc0NoYXIgPSBmYWxzZTsNCisJCQkJCQlfb3B0aW11bVtwb3NNZW0gLSAxXS5Qb3NQcmV2ID0gX29wdGltdW1bY3VyXS5Qb3NQcmV2MjsNCisJCQkJCQlfb3B0aW11bVtwb3NNZW0gLSAxXS5CYWNrUHJldiA9IF9vcHRpbXVtW2N1cl0uQmFja1ByZXYyOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCVVJbnQzMiBwb3NQcmV2ID0gcG9zTWVtOw0KKwkJCQlVSW50MzIgYmFja0N1ciA9IGJhY2tNZW07DQorDQorCQkJCWJhY2tNZW0gPSBfb3B0aW11bVtwb3NQcmV2XS5CYWNrUHJldjsNCisJCQkJcG9zTWVtID0gX29wdGltdW1bcG9zUHJldl0uUG9zUHJldjsNCisNCisJCQkJX29wdGltdW1bcG9zUHJldl0uQmFja1ByZXYgPSBiYWNrQ3VyOw0KKwkJCQlfb3B0aW11bVtwb3NQcmV2XS5Qb3NQcmV2ID0gY3VyOw0KKwkJCQljdXIgPSBwb3NQcmV2Ow0KKwkJCX0NCisJCQl3aGlsZSAoY3VyID4gMCk7DQorCQkJYmFja1JlcyA9IF9vcHRpbXVtWzBdLkJhY2tQcmV2Ow0KKwkJCV9vcHRpbXVtQ3VycmVudEluZGV4ID0gX29wdGltdW1bMF0uUG9zUHJldjsNCisJCQlyZXR1cm4gX29wdGltdW1DdXJyZW50SW5kZXg7DQorCQl9DQorDQorCQlVSW50MzJbXSByZXBzID0gbmV3IFVJbnQzMltCYXNlLmtOdW1SZXBEaXN0YW5jZXNdOw0KKwkJVUludDMyW10gcmVwTGVucyA9IG5ldyBVSW50MzJbQmFzZS5rTnVtUmVwRGlzdGFuY2VzXTsNCisNCisNCisJCVVJbnQzMiBHZXRPcHRpbXVtKFVJbnQzMiBwb3NpdGlvbiwgb3V0IFVJbnQzMiBiYWNrUmVzKQ0KKwkJew0KKwkJCWlmIChfb3B0aW11bUVuZEluZGV4ICE9IF9vcHRpbXVtQ3VycmVudEluZGV4KQ0KKwkJCXsNCisJCQkJVUludDMyIGxlblJlcyA9IF9vcHRpbXVtW19vcHRpbXVtQ3VycmVudEluZGV4XS5Qb3NQcmV2IC0gX29wdGltdW1DdXJyZW50SW5kZXg7DQorCQkJCWJhY2tSZXMgPSBfb3B0aW11bVtfb3B0aW11bUN1cnJlbnRJbmRleF0uQmFja1ByZXY7DQorCQkJCV9vcHRpbXVtQ3VycmVudEluZGV4ID0gX29wdGltdW1bX29wdGltdW1DdXJyZW50SW5kZXhdLlBvc1ByZXY7DQorCQkJCXJldHVybiBsZW5SZXM7DQorCQkJfQ0KKwkJCV9vcHRpbXVtQ3VycmVudEluZGV4ID0gX29wdGltdW1FbmRJbmRleCA9IDA7DQorDQorCQkJVUludDMyIGxlbk1haW4sIG51bURpc3RhbmNlUGFpcnM7DQorCQkJaWYgKCFfbG9uZ2VzdE1hdGNoV2FzRm91bmQpDQorCQkJew0KKwkJCQlSZWFkTWF0Y2hEaXN0YW5jZXMob3V0IGxlbk1haW4sIG91dCBudW1EaXN0YW5jZVBhaXJzKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJbGVuTWFpbiA9IF9sb25nZXN0TWF0Y2hMZW5ndGg7DQorCQkJCW51bURpc3RhbmNlUGFpcnMgPSBfbnVtRGlzdGFuY2VQYWlyczsNCisJCQkJX2xvbmdlc3RNYXRjaFdhc0ZvdW5kID0gZmFsc2U7DQorCQkJfQ0KKw0KKwkJCVVJbnQzMiBudW1BdmFpbGFibGVCeXRlcyA9IF9tYXRjaEZpbmRlci5HZXROdW1BdmFpbGFibGVCeXRlcygpICsgMTsNCisJCQlpZiAobnVtQXZhaWxhYmxlQnl0ZXMgPCAyKQ0KKwkJCXsNCisJCQkJYmFja1JlcyA9IDB4RkZGRkZGRkY7DQorCQkJCXJldHVybiAxOw0KKwkJCX0NCisJCQlpZiAobnVtQXZhaWxhYmxlQnl0ZXMgPiBCYXNlLmtNYXRjaE1heExlbikNCisJCQkJbnVtQXZhaWxhYmxlQnl0ZXMgPSBCYXNlLmtNYXRjaE1heExlbjsNCisNCisJCQlVSW50MzIgcmVwTWF4SW5kZXggPSAwOw0KKwkJCVVJbnQzMiBpOwkJCQ0KKwkJCWZvciAoaSA9IDA7IGkgPCBCYXNlLmtOdW1SZXBEaXN0YW5jZXM7IGkrKykNCisJCQl7DQorCQkJCXJlcHNbaV0gPSBfcmVwRGlzdGFuY2VzW2ldOw0KKwkJCQlyZXBMZW5zW2ldID0gX21hdGNoRmluZGVyLkdldE1hdGNoTGVuKDAgLSAxLCByZXBzW2ldLCBCYXNlLmtNYXRjaE1heExlbik7DQorCQkJCWlmIChyZXBMZW5zW2ldID4gcmVwTGVuc1tyZXBNYXhJbmRleF0pDQorCQkJCQlyZXBNYXhJbmRleCA9IGk7DQorCQkJfQ0KKwkJCWlmIChyZXBMZW5zW3JlcE1heEluZGV4XSA+PSBfbnVtRmFzdEJ5dGVzKQ0KKwkJCXsNCisJCQkJYmFja1JlcyA9IHJlcE1heEluZGV4Ow0KKwkJCQlVSW50MzIgbGVuUmVzID0gcmVwTGVuc1tyZXBNYXhJbmRleF07DQorCQkJCU1vdmVQb3MobGVuUmVzIC0gMSk7DQorCQkJCXJldHVybiBsZW5SZXM7DQorCQkJfQ0KKw0KKwkJCWlmIChsZW5NYWluID49IF9udW1GYXN0Qnl0ZXMpDQorCQkJew0KKwkJCQliYWNrUmVzID0gX21hdGNoRGlzdGFuY2VzW251bURpc3RhbmNlUGFpcnMgLSAxXSArIEJhc2Uua051bVJlcERpc3RhbmNlczsNCisJCQkJTW92ZVBvcyhsZW5NYWluIC0gMSk7DQorCQkJCXJldHVybiBsZW5NYWluOw0KKwkJCX0NCisJCQkNCisJCQlCeXRlIGN1cnJlbnRCeXRlID0gX21hdGNoRmluZGVyLkdldEluZGV4Qnl0ZSgwIC0gMSk7DQorCQkJQnl0ZSBtYXRjaEJ5dGUgPSBfbWF0Y2hGaW5kZXIuR2V0SW5kZXhCeXRlKChJbnQzMikoMCAtIF9yZXBEaXN0YW5jZXNbMF0gLSAxIC0gMSkpOw0KKw0KKwkJCWlmIChsZW5NYWluIDwgMiAmJiBjdXJyZW50Qnl0ZSAhPSBtYXRjaEJ5dGUgJiYgcmVwTGVuc1tyZXBNYXhJbmRleF0gPCAyKQ0KKwkJCXsNCisJCQkJYmFja1JlcyA9IChVSW50MzIpMHhGRkZGRkZGRjsNCisJCQkJcmV0dXJuIDE7DQorCQkJfQ0KKw0KKwkJCV9vcHRpbXVtWzBdLlN0YXRlID0gX3N0YXRlOw0KKw0KKwkJCVVJbnQzMiBwb3NTdGF0ZSA9IChwb3NpdGlvbiAmIF9wb3NTdGF0ZU1hc2spOw0KKw0KKwkJCV9vcHRpbXVtWzFdLlByaWNlID0gX2lzTWF0Y2hbKF9zdGF0ZS5JbmRleCA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlXS5HZXRQcmljZTAoKSArDQorCQkJCQlfbGl0ZXJhbEVuY29kZXIuR2V0U3ViQ29kZXIocG9zaXRpb24sIF9wcmV2aW91c0J5dGUpLkdldFByaWNlKCFfc3RhdGUuSXNDaGFyU3RhdGUoKSwgbWF0Y2hCeXRlLCBjdXJyZW50Qnl0ZSk7DQorCQkJX29wdGltdW1bMV0uTWFrZUFzQ2hhcigpOw0KKw0KKwkJCVVJbnQzMiBtYXRjaFByaWNlID0gX2lzTWF0Y2hbKF9zdGF0ZS5JbmRleCA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlXS5HZXRQcmljZTEoKTsNCisJCQlVSW50MzIgcmVwTWF0Y2hQcmljZSA9IG1hdGNoUHJpY2UgKyBfaXNSZXBbX3N0YXRlLkluZGV4XS5HZXRQcmljZTEoKTsNCisNCisJCQlpZiAobWF0Y2hCeXRlID09IGN1cnJlbnRCeXRlKQ0KKwkJCXsNCisJCQkJVUludDMyIHNob3J0UmVwUHJpY2UgPSByZXBNYXRjaFByaWNlICsgR2V0UmVwTGVuMVByaWNlKF9zdGF0ZSwgcG9zU3RhdGUpOw0KKwkJCQlpZiAoc2hvcnRSZXBQcmljZSA8IF9vcHRpbXVtWzFdLlByaWNlKQ0KKwkJCQl7DQorCQkJCQlfb3B0aW11bVsxXS5QcmljZSA9IHNob3J0UmVwUHJpY2U7DQorCQkJCQlfb3B0aW11bVsxXS5NYWtlQXNTaG9ydFJlcCgpOw0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCVVJbnQzMiBsZW5FbmQgPSAoKGxlbk1haW4gPj0gcmVwTGVuc1tyZXBNYXhJbmRleF0pID8gbGVuTWFpbiA6IHJlcExlbnNbcmVwTWF4SW5kZXhdKTsNCisNCisJCQlpZihsZW5FbmQgPCAyKQ0KKwkJCXsNCisJCQkJYmFja1JlcyA9IF9vcHRpbXVtWzFdLkJhY2tQcmV2Ow0KKwkJCQlyZXR1cm4gMTsNCisJCQl9DQorCQkJDQorCQkJX29wdGltdW1bMV0uUG9zUHJldiA9IDA7DQorDQorCQkJX29wdGltdW1bMF0uQmFja3MwID0gcmVwc1swXTsNCisJCQlfb3B0aW11bVswXS5CYWNrczEgPSByZXBzWzFdOw0KKwkJCV9vcHRpbXVtWzBdLkJhY2tzMiA9IHJlcHNbMl07DQorCQkJX29wdGltdW1bMF0uQmFja3MzID0gcmVwc1szXTsNCisNCisJCQlVSW50MzIgbGVuID0gbGVuRW5kOw0KKwkJCWRvDQorCQkJCV9vcHRpbXVtW2xlbi0tXS5QcmljZSA9IGtJZmluaXR5UHJpY2U7DQorCQkJd2hpbGUgKGxlbiA+PSAyKTsNCisNCisJCQlmb3IgKGkgPSAwOyBpIDwgQmFzZS5rTnVtUmVwRGlzdGFuY2VzOyBpKyspDQorCQkJew0KKwkJCQlVSW50MzIgcmVwTGVuID0gcmVwTGVuc1tpXTsNCisJCQkJaWYgKHJlcExlbiA8IDIpDQorCQkJCQljb250aW51ZTsNCisJCQkJVUludDMyIHByaWNlID0gcmVwTWF0Y2hQcmljZSArIEdldFB1cmVSZXBQcmljZShpLCBfc3RhdGUsIHBvc1N0YXRlKTsNCisJCQkJZG8NCisJCQkJew0KKwkJCQkJVUludDMyIGN1ckFuZExlblByaWNlID0gcHJpY2UgKyBfcmVwTWF0Y2hMZW5FbmNvZGVyLkdldFByaWNlKHJlcExlbiAtIDIsIHBvc1N0YXRlKTsNCisJCQkJCU9wdGltYWwgb3B0aW11bSA9IF9vcHRpbXVtW3JlcExlbl07DQorCQkJCQlpZiAoY3VyQW5kTGVuUHJpY2UgPCBvcHRpbXVtLlByaWNlKQ0KKwkJCQkJew0KKwkJCQkJCW9wdGltdW0uUHJpY2UgPSBjdXJBbmRMZW5QcmljZTsNCisJCQkJCQlvcHRpbXVtLlBvc1ByZXYgPSAwOw0KKwkJCQkJCW9wdGltdW0uQmFja1ByZXYgPSBpOw0KKwkJCQkJCW9wdGltdW0uUHJldjFJc0NoYXIgPSBmYWxzZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQl3aGlsZSAoLS1yZXBMZW4gPj0gMik7DQorCQkJfQ0KKw0KKwkJCVVJbnQzMiBub3JtYWxNYXRjaFByaWNlID0gbWF0Y2hQcmljZSArIF9pc1JlcFtfc3RhdGUuSW5kZXhdLkdldFByaWNlMCgpOw0KKwkJCQ0KKwkJCWxlbiA9ICgocmVwTGVuc1swXSA+PSAyKSA/IHJlcExlbnNbMF0gKyAxIDogMik7DQorCQkJaWYgKGxlbiA8PSBsZW5NYWluKQ0KKwkJCXsNCisJCQkJVUludDMyIG9mZnMgPSAwOw0KKwkJCQl3aGlsZSAobGVuID4gX21hdGNoRGlzdGFuY2VzW29mZnNdKQ0KKwkJCQkJb2ZmcyArPSAyOw0KKwkJCQlmb3IgKDsgOyBsZW4rKykNCisJCQkJew0KKwkJCQkJVUludDMyIGRpc3RhbmNlID0gX21hdGNoRGlzdGFuY2VzW29mZnMgKyAxXTsNCisJCQkJCVVJbnQzMiBjdXJBbmRMZW5QcmljZSA9IG5vcm1hbE1hdGNoUHJpY2UgKyBHZXRQb3NMZW5QcmljZShkaXN0YW5jZSwgbGVuLCBwb3NTdGF0ZSk7DQorCQkJCQlPcHRpbWFsIG9wdGltdW0gPSBfb3B0aW11bVtsZW5dOw0KKwkJCQkJaWYgKGN1ckFuZExlblByaWNlIDwgb3B0aW11bS5QcmljZSkNCisJCQkJCXsNCisJCQkJCQlvcHRpbXVtLlByaWNlID0gY3VyQW5kTGVuUHJpY2U7DQorCQkJCQkJb3B0aW11bS5Qb3NQcmV2ID0gMDsNCisJCQkJCQlvcHRpbXVtLkJhY2tQcmV2ID0gZGlzdGFuY2UgKyBCYXNlLmtOdW1SZXBEaXN0YW5jZXM7DQorCQkJCQkJb3B0aW11bS5QcmV2MUlzQ2hhciA9IGZhbHNlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKGxlbiA9PSBfbWF0Y2hEaXN0YW5jZXNbb2Zmc10pDQorCQkJCQl7DQorCQkJCQkJb2ZmcyArPSAyOw0KKwkJCQkJCWlmIChvZmZzID09IG51bURpc3RhbmNlUGFpcnMpDQorCQkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCVVJbnQzMiBjdXIgPSAwOw0KKw0KKwkJCXdoaWxlICh0cnVlKQ0KKwkJCXsNCisJCQkJY3VyKys7DQorCQkJCWlmIChjdXIgPT0gbGVuRW5kKQ0KKwkJCQkJcmV0dXJuIEJhY2t3YXJkKG91dCBiYWNrUmVzLCBjdXIpOw0KKwkJCQlVSW50MzIgbmV3TGVuOw0KKwkJCQlSZWFkTWF0Y2hEaXN0YW5jZXMob3V0IG5ld0xlbiwgb3V0IG51bURpc3RhbmNlUGFpcnMpOw0KKwkJCQlpZiAobmV3TGVuID49IF9udW1GYXN0Qnl0ZXMpDQorCQkJCXsNCisJCQkJCV9udW1EaXN0YW5jZVBhaXJzID0gbnVtRGlzdGFuY2VQYWlyczsNCisJCQkJCV9sb25nZXN0TWF0Y2hMZW5ndGggPSBuZXdMZW47DQorCQkJCQlfbG9uZ2VzdE1hdGNoV2FzRm91bmQgPSB0cnVlOw0KKwkJCQkJcmV0dXJuIEJhY2t3YXJkKG91dCBiYWNrUmVzLCBjdXIpOw0KKwkJCQl9DQorCQkJCXBvc2l0aW9uKys7DQorCQkJCVVJbnQzMiBwb3NQcmV2ID0gX29wdGltdW1bY3VyXS5Qb3NQcmV2Ow0KKwkJCQlCYXNlLlN0YXRlIHN0YXRlOw0KKwkJCQlpZiAoX29wdGltdW1bY3VyXS5QcmV2MUlzQ2hhcikNCisJCQkJew0KKwkJCQkJcG9zUHJldi0tOw0KKwkJCQkJaWYgKF9vcHRpbXVtW2N1cl0uUHJldjIpDQorCQkJCQl7DQorCQkJCQkJc3RhdGUgPSBfb3B0aW11bVtfb3B0aW11bVtjdXJdLlBvc1ByZXYyXS5TdGF0ZTsNCisJCQkJCQlpZiAoX29wdGltdW1bY3VyXS5CYWNrUHJldjIgPCBCYXNlLmtOdW1SZXBEaXN0YW5jZXMpDQorCQkJCQkJCXN0YXRlLlVwZGF0ZVJlcCgpOw0KKwkJCQkJCWVsc2UNCisJCQkJCQkJc3RhdGUuVXBkYXRlTWF0Y2goKTsNCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCQlzdGF0ZSA9IF9vcHRpbXVtW3Bvc1ByZXZdLlN0YXRlOw0KKwkJCQkJc3RhdGUuVXBkYXRlQ2hhcigpOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJCXN0YXRlID0gX29wdGltdW1bcG9zUHJldl0uU3RhdGU7DQorCQkJCWlmIChwb3NQcmV2ID09IGN1ciAtIDEpDQorCQkJCXsNCisJCQkJCWlmIChfb3B0aW11bVtjdXJdLklzU2hvcnRSZXAoKSkNCisJCQkJCQlzdGF0ZS5VcGRhdGVTaG9ydFJlcCgpOw0KKwkJCQkJZWxzZQ0KKwkJCQkJCXN0YXRlLlVwZGF0ZUNoYXIoKTsNCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCVVJbnQzMiBwb3M7DQorCQkJCQlpZiAoX29wdGltdW1bY3VyXS5QcmV2MUlzQ2hhciAmJiBfb3B0aW11bVtjdXJdLlByZXYyKQ0KKwkJCQkJew0KKwkJCQkJCXBvc1ByZXYgPSBfb3B0aW11bVtjdXJdLlBvc1ByZXYyOw0KKwkJCQkJCXBvcyA9IF9vcHRpbXVtW2N1cl0uQmFja1ByZXYyOw0KKwkJCQkJCXN0YXRlLlVwZGF0ZVJlcCgpOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCXBvcyA9IF9vcHRpbXVtW2N1cl0uQmFja1ByZXY7DQorCQkJCQkJaWYgKHBvcyA8IEJhc2Uua051bVJlcERpc3RhbmNlcykNCisJCQkJCQkJc3RhdGUuVXBkYXRlUmVwKCk7DQorCQkJCQkJZWxzZQ0KKwkJCQkJCQlzdGF0ZS5VcGRhdGVNYXRjaCgpOw0KKwkJCQkJfQ0KKwkJCQkJT3B0aW1hbCBvcHQgPSBfb3B0aW11bVtwb3NQcmV2XTsNCisJCQkJCWlmIChwb3MgPCBCYXNlLmtOdW1SZXBEaXN0YW5jZXMpDQorCQkJCQl7DQorCQkJCQkJaWYgKHBvcyA9PSAwKQ0KKwkJCQkJCXsNCisJCQkJCQkJcmVwc1swXSA9IG9wdC5CYWNrczA7DQorCQkJCQkJCXJlcHNbMV0gPSBvcHQuQmFja3MxOw0KKwkJCQkJCQlyZXBzWzJdID0gb3B0LkJhY2tzMjsNCisJCQkJCQkJcmVwc1szXSA9IG9wdC5CYWNrczM7DQorCQkJCQkJfQ0KKwkJCQkJCWVsc2UgaWYgKHBvcyA9PSAxKQ0KKwkJCQkJCXsNCisJCQkJCQkJcmVwc1swXSA9IG9wdC5CYWNrczE7DQorCQkJCQkJCXJlcHNbMV0gPSBvcHQuQmFja3MwOw0KKwkJCQkJCQlyZXBzWzJdID0gb3B0LkJhY2tzMjsNCisJCQkJCQkJcmVwc1szXSA9IG9wdC5CYWNrczM7DQorCQkJCQkJfQ0KKwkJCQkJCWVsc2UgaWYgKHBvcyA9PSAyKQ0KKwkJCQkJCXsNCisJCQkJCQkJcmVwc1swXSA9IG9wdC5CYWNrczI7DQorCQkJCQkJCXJlcHNbMV0gPSBvcHQuQmFja3MwOw0KKwkJCQkJCQlyZXBzWzJdID0gb3B0LkJhY2tzMTsNCisJCQkJCQkJcmVwc1szXSA9IG9wdC5CYWNrczM7DQorCQkJCQkJfQ0KKwkJCQkJCWVsc2UNCisJCQkJCQl7DQorCQkJCQkJCXJlcHNbMF0gPSBvcHQuQmFja3MzOw0KKwkJCQkJCQlyZXBzWzFdID0gb3B0LkJhY2tzMDsNCisJCQkJCQkJcmVwc1syXSA9IG9wdC5CYWNrczE7DQorCQkJCQkJCXJlcHNbM10gPSBvcHQuQmFja3MyOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQlyZXBzWzBdID0gKHBvcyAtIEJhc2Uua051bVJlcERpc3RhbmNlcyk7DQorCQkJCQkJcmVwc1sxXSA9IG9wdC5CYWNrczA7DQorCQkJCQkJcmVwc1syXSA9IG9wdC5CYWNrczE7DQorCQkJCQkJcmVwc1szXSA9IG9wdC5CYWNrczI7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJX29wdGltdW1bY3VyXS5TdGF0ZSA9IHN0YXRlOw0KKwkJCQlfb3B0aW11bVtjdXJdLkJhY2tzMCA9IHJlcHNbMF07DQorCQkJCV9vcHRpbXVtW2N1cl0uQmFja3MxID0gcmVwc1sxXTsNCisJCQkJX29wdGltdW1bY3VyXS5CYWNrczIgPSByZXBzWzJdOw0KKwkJCQlfb3B0aW11bVtjdXJdLkJhY2tzMyA9IHJlcHNbM107DQorCQkJCVVJbnQzMiBjdXJQcmljZSA9IF9vcHRpbXVtW2N1cl0uUHJpY2U7DQorDQorCQkJCWN1cnJlbnRCeXRlID0gX21hdGNoRmluZGVyLkdldEluZGV4Qnl0ZSgwIC0gMSk7DQorCQkJCW1hdGNoQnl0ZSA9IF9tYXRjaEZpbmRlci5HZXRJbmRleEJ5dGUoKEludDMyKSgwIC0gcmVwc1swXSAtIDEgLSAxKSk7DQorDQorCQkJCXBvc1N0YXRlID0gKHBvc2l0aW9uICYgX3Bvc1N0YXRlTWFzayk7DQorDQorCQkJCVVJbnQzMiBjdXJBbmQxUHJpY2UgPSBjdXJQcmljZSArDQorCQkJCQlfaXNNYXRjaFsoc3RhdGUuSW5kZXggPDwgQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heCkgKyBwb3NTdGF0ZV0uR2V0UHJpY2UwKCkgKw0KKwkJCQkJX2xpdGVyYWxFbmNvZGVyLkdldFN1YkNvZGVyKHBvc2l0aW9uLCBfbWF0Y2hGaW5kZXIuR2V0SW5kZXhCeXRlKDAgLSAyKSkuDQorCQkJCQlHZXRQcmljZSghc3RhdGUuSXNDaGFyU3RhdGUoKSwgbWF0Y2hCeXRlLCBjdXJyZW50Qnl0ZSk7DQorDQorCQkJCU9wdGltYWwgbmV4dE9wdGltdW0gPSBfb3B0aW11bVtjdXIgKyAxXTsNCisNCisJCQkJYm9vbCBuZXh0SXNDaGFyID0gZmFsc2U7DQorCQkJCWlmIChjdXJBbmQxUHJpY2UgPCBuZXh0T3B0aW11bS5QcmljZSkNCisJCQkJew0KKwkJCQkJbmV4dE9wdGltdW0uUHJpY2UgPSBjdXJBbmQxUHJpY2U7DQorCQkJCQluZXh0T3B0aW11bS5Qb3NQcmV2ID0gY3VyOw0KKwkJCQkJbmV4dE9wdGltdW0uTWFrZUFzQ2hhcigpOw0KKwkJCQkJbmV4dElzQ2hhciA9IHRydWU7DQorCQkJCX0NCisNCisJCQkJbWF0Y2hQcmljZSA9IGN1clByaWNlICsgX2lzTWF0Y2hbKHN0YXRlLkluZGV4IDw8IEJhc2Uua051bVBvc1N0YXRlc0JpdHNNYXgpICsgcG9zU3RhdGVdLkdldFByaWNlMSgpOw0KKwkJCQlyZXBNYXRjaFByaWNlID0gbWF0Y2hQcmljZSArIF9pc1JlcFtzdGF0ZS5JbmRleF0uR2V0UHJpY2UxKCk7DQorDQorCQkJCWlmIChtYXRjaEJ5dGUgPT0gY3VycmVudEJ5dGUgJiYNCisJCQkJCSEobmV4dE9wdGltdW0uUG9zUHJldiA8IGN1ciAmJiBuZXh0T3B0aW11bS5CYWNrUHJldiA9PSAwKSkNCisJCQkJew0KKwkJCQkJVUludDMyIHNob3J0UmVwUHJpY2UgPSByZXBNYXRjaFByaWNlICsgR2V0UmVwTGVuMVByaWNlKHN0YXRlLCBwb3NTdGF0ZSk7DQorCQkJCQlpZiAoc2hvcnRSZXBQcmljZSA8PSBuZXh0T3B0aW11bS5QcmljZSkNCisJCQkJCXsNCisJCQkJCQluZXh0T3B0aW11bS5QcmljZSA9IHNob3J0UmVwUHJpY2U7DQorCQkJCQkJbmV4dE9wdGltdW0uUG9zUHJldiA9IGN1cjsNCisJCQkJCQluZXh0T3B0aW11bS5NYWtlQXNTaG9ydFJlcCgpOw0KKwkJCQkJCW5leHRJc0NoYXIgPSB0cnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorDQorCQkJCVVJbnQzMiBudW1BdmFpbGFibGVCeXRlc0Z1bGwgPSBfbWF0Y2hGaW5kZXIuR2V0TnVtQXZhaWxhYmxlQnl0ZXMoKSArIDE7DQorCQkJCW51bUF2YWlsYWJsZUJ5dGVzRnVsbCA9IE1hdGguTWluKGtOdW1PcHRzIC0gMSAtIGN1ciwgbnVtQXZhaWxhYmxlQnl0ZXNGdWxsKTsNCisJCQkJbnVtQXZhaWxhYmxlQnl0ZXMgPSBudW1BdmFpbGFibGVCeXRlc0Z1bGw7DQorDQorCQkJCWlmIChudW1BdmFpbGFibGVCeXRlcyA8IDIpDQorCQkJCQljb250aW51ZTsNCisJCQkJaWYgKG51bUF2YWlsYWJsZUJ5dGVzID4gX251bUZhc3RCeXRlcykNCisJCQkJCW51bUF2YWlsYWJsZUJ5dGVzID0gX251bUZhc3RCeXRlczsNCisJCQkJaWYgKCFuZXh0SXNDaGFyICYmIG1hdGNoQnl0ZSAhPSBjdXJyZW50Qnl0ZSkNCisJCQkJew0KKwkJCQkJLy8gdHJ5IExpdGVyYWwgKyByZXAwDQorCQkJCQlVSW50MzIgdCA9IE1hdGguTWluKG51bUF2YWlsYWJsZUJ5dGVzRnVsbCAtIDEsIF9udW1GYXN0Qnl0ZXMpOw0KKwkJCQkJVUludDMyIGxlblRlc3QyID0gX21hdGNoRmluZGVyLkdldE1hdGNoTGVuKDAsIHJlcHNbMF0sIHQpOw0KKwkJCQkJaWYgKGxlblRlc3QyID49IDIpDQorCQkJCQl7DQorCQkJCQkJQmFzZS5TdGF0ZSBzdGF0ZTIgPSBzdGF0ZTsNCisJCQkJCQlzdGF0ZTIuVXBkYXRlQ2hhcigpOw0KKwkJCQkJCVVJbnQzMiBwb3NTdGF0ZU5leHQgPSAocG9zaXRpb24gKyAxKSAmIF9wb3NTdGF0ZU1hc2s7DQorCQkJCQkJVUludDMyIG5leHRSZXBNYXRjaFByaWNlID0gY3VyQW5kMVByaWNlICsNCisJCQkJCQkJX2lzTWF0Y2hbKHN0YXRlMi5JbmRleCA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlTmV4dF0uR2V0UHJpY2UxKCkgKw0KKwkJCQkJCQlfaXNSZXBbc3RhdGUyLkluZGV4XS5HZXRQcmljZTEoKTsNCisJCQkJCQl7DQorCQkJCQkJCVVJbnQzMiBvZmZzZXQgPSBjdXIgKyAxICsgbGVuVGVzdDI7DQorCQkJCQkJCXdoaWxlIChsZW5FbmQgPCBvZmZzZXQpDQorCQkJCQkJCQlfb3B0aW11bVsrK2xlbkVuZF0uUHJpY2UgPSBrSWZpbml0eVByaWNlOw0KKwkJCQkJCQlVSW50MzIgY3VyQW5kTGVuUHJpY2UgPSBuZXh0UmVwTWF0Y2hQcmljZSArIEdldFJlcFByaWNlKA0KKwkJCQkJCQkJMCwgbGVuVGVzdDIsIHN0YXRlMiwgcG9zU3RhdGVOZXh0KTsNCisJCQkJCQkJT3B0aW1hbCBvcHRpbXVtID0gX29wdGltdW1bb2Zmc2V0XTsNCisJCQkJCQkJaWYgKGN1ckFuZExlblByaWNlIDwgb3B0aW11bS5QcmljZSkNCisJCQkJCQkJew0KKwkJCQkJCQkJb3B0aW11bS5QcmljZSA9IGN1ckFuZExlblByaWNlOw0KKwkJCQkJCQkJb3B0aW11bS5Qb3NQcmV2ID0gY3VyICsgMTsNCisJCQkJCQkJCW9wdGltdW0uQmFja1ByZXYgPSAwOw0KKwkJCQkJCQkJb3B0aW11bS5QcmV2MUlzQ2hhciA9IHRydWU7DQorCQkJCQkJCQlvcHRpbXVtLlByZXYyID0gZmFsc2U7DQorCQkJCQkJCX0NCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJVUludDMyIHN0YXJ0TGVuID0gMjsgLy8gc3BlZWQgb3B0aW1pemF0aW9uIA0KKw0KKwkJCQlmb3IgKFVJbnQzMiByZXBJbmRleCA9IDA7IHJlcEluZGV4IDwgQmFzZS5rTnVtUmVwRGlzdGFuY2VzOyByZXBJbmRleCsrKQ0KKwkJCQl7DQorCQkJCQlVSW50MzIgbGVuVGVzdCA9IF9tYXRjaEZpbmRlci5HZXRNYXRjaExlbigwIC0gMSwgcmVwc1tyZXBJbmRleF0sIG51bUF2YWlsYWJsZUJ5dGVzKTsNCisJCQkJCWlmIChsZW5UZXN0IDwgMikNCisJCQkJCQljb250aW51ZTsNCisJCQkJCVVJbnQzMiBsZW5UZXN0VGVtcCA9IGxlblRlc3Q7DQorCQkJCQlkbw0KKwkJCQkJew0KKwkJCQkJCXdoaWxlIChsZW5FbmQgPCBjdXIgKyBsZW5UZXN0KQ0KKwkJCQkJCQlfb3B0aW11bVsrK2xlbkVuZF0uUHJpY2UgPSBrSWZpbml0eVByaWNlOw0KKwkJCQkJCVVJbnQzMiBjdXJBbmRMZW5QcmljZSA9IHJlcE1hdGNoUHJpY2UgKyBHZXRSZXBQcmljZShyZXBJbmRleCwgbGVuVGVzdCwgc3RhdGUsIHBvc1N0YXRlKTsNCisJCQkJCQlPcHRpbWFsIG9wdGltdW0gPSBfb3B0aW11bVtjdXIgKyBsZW5UZXN0XTsNCisJCQkJCQlpZiAoY3VyQW5kTGVuUHJpY2UgPCBvcHRpbXVtLlByaWNlKQ0KKwkJCQkJCXsNCisJCQkJCQkJb3B0aW11bS5QcmljZSA9IGN1ckFuZExlblByaWNlOw0KKwkJCQkJCQlvcHRpbXVtLlBvc1ByZXYgPSBjdXI7DQorCQkJCQkJCW9wdGltdW0uQmFja1ByZXYgPSByZXBJbmRleDsNCisJCQkJCQkJb3B0aW11bS5QcmV2MUlzQ2hhciA9IGZhbHNlOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJCXdoaWxlKC0tbGVuVGVzdCA+PSAyKTsNCisJCQkJCWxlblRlc3QgPSBsZW5UZXN0VGVtcDsNCisNCisJCQkJCWlmIChyZXBJbmRleCA9PSAwKQ0KKwkJCQkJCXN0YXJ0TGVuID0gbGVuVGVzdCArIDE7DQorDQorCQkJCQkvLyBpZiAoX21heE1vZGUpDQorCQkJCQlpZiAobGVuVGVzdCA8IG51bUF2YWlsYWJsZUJ5dGVzRnVsbCkNCisJCQkJCXsNCisJCQkJCQlVSW50MzIgdCA9IE1hdGguTWluKG51bUF2YWlsYWJsZUJ5dGVzRnVsbCAtIDEgLSBsZW5UZXN0LCBfbnVtRmFzdEJ5dGVzKTsNCisJCQkJCQlVSW50MzIgbGVuVGVzdDIgPSBfbWF0Y2hGaW5kZXIuR2V0TWF0Y2hMZW4oKEludDMyKWxlblRlc3QsIHJlcHNbcmVwSW5kZXhdLCB0KTsNCisJCQkJCQlpZiAobGVuVGVzdDIgPj0gMikNCisJCQkJCQl7DQorCQkJCQkJCUJhc2UuU3RhdGUgc3RhdGUyID0gc3RhdGU7DQorCQkJCQkJCXN0YXRlMi5VcGRhdGVSZXAoKTsNCisJCQkJCQkJVUludDMyIHBvc1N0YXRlTmV4dCA9IChwb3NpdGlvbiArIGxlblRlc3QpICYgX3Bvc1N0YXRlTWFzazsNCisJCQkJCQkJVUludDMyIGN1ckFuZExlbkNoYXJQcmljZSA9IA0KKwkJCQkJCQkJCXJlcE1hdGNoUHJpY2UgKyBHZXRSZXBQcmljZShyZXBJbmRleCwgbGVuVGVzdCwgc3RhdGUsIHBvc1N0YXRlKSArIA0KKwkJCQkJCQkJCV9pc01hdGNoWyhzdGF0ZTIuSW5kZXggPDwgQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heCkgKyBwb3NTdGF0ZU5leHRdLkdldFByaWNlMCgpICsNCisJCQkJCQkJCQlfbGl0ZXJhbEVuY29kZXIuR2V0U3ViQ29kZXIocG9zaXRpb24gKyBsZW5UZXN0LCANCisJCQkJCQkJCQlfbWF0Y2hGaW5kZXIuR2V0SW5kZXhCeXRlKChJbnQzMilsZW5UZXN0IC0gMSAtIDEpKS5HZXRQcmljZSh0cnVlLA0KKwkJCQkJCQkJCV9tYXRjaEZpbmRlci5HZXRJbmRleEJ5dGUoKEludDMyKSgoSW50MzIpbGVuVGVzdCAtIDEgLSAoSW50MzIpKHJlcHNbcmVwSW5kZXhdICsgMSkpKSwgDQorCQkJCQkJCQkJX21hdGNoRmluZGVyLkdldEluZGV4Qnl0ZSgoSW50MzIpbGVuVGVzdCAtIDEpKTsNCisJCQkJCQkJc3RhdGUyLlVwZGF0ZUNoYXIoKTsNCisJCQkJCQkJcG9zU3RhdGVOZXh0ID0gKHBvc2l0aW9uICsgbGVuVGVzdCArIDEpICYgX3Bvc1N0YXRlTWFzazsNCisJCQkJCQkJVUludDMyIG5leHRNYXRjaFByaWNlID0gY3VyQW5kTGVuQ2hhclByaWNlICsgX2lzTWF0Y2hbKHN0YXRlMi5JbmRleCA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlTmV4dF0uR2V0UHJpY2UxKCk7DQorCQkJCQkJCVVJbnQzMiBuZXh0UmVwTWF0Y2hQcmljZSA9IG5leHRNYXRjaFByaWNlICsgX2lzUmVwW3N0YXRlMi5JbmRleF0uR2V0UHJpY2UxKCk7DQorCQkJCQkJCQ0KKwkJCQkJCQkvLyBmb3IoOyBsZW5UZXN0MiA+PSAyOyBsZW5UZXN0Mi0tKQ0KKwkJCQkJCQl7DQorCQkJCQkJCQlVSW50MzIgb2Zmc2V0ID0gbGVuVGVzdCArIDEgKyBsZW5UZXN0MjsNCisJCQkJCQkJCXdoaWxlKGxlbkVuZCA8IGN1ciArIG9mZnNldCkNCisJCQkJCQkJCQlfb3B0aW11bVsrK2xlbkVuZF0uUHJpY2UgPSBrSWZpbml0eVByaWNlOw0KKwkJCQkJCQkJVUludDMyIGN1ckFuZExlblByaWNlID0gbmV4dFJlcE1hdGNoUHJpY2UgKyBHZXRSZXBQcmljZSgwLCBsZW5UZXN0Miwgc3RhdGUyLCBwb3NTdGF0ZU5leHQpOw0KKwkJCQkJCQkJT3B0aW1hbCBvcHRpbXVtID0gX29wdGltdW1bY3VyICsgb2Zmc2V0XTsNCisJCQkJCQkJCWlmIChjdXJBbmRMZW5QcmljZSA8IG9wdGltdW0uUHJpY2UpIA0KKwkJCQkJCQkJew0KKwkJCQkJCQkJCW9wdGltdW0uUHJpY2UgPSBjdXJBbmRMZW5QcmljZTsNCisJCQkJCQkJCQlvcHRpbXVtLlBvc1ByZXYgPSBjdXIgKyBsZW5UZXN0ICsgMTsNCisJCQkJCQkJCQlvcHRpbXVtLkJhY2tQcmV2ID0gMDsNCisJCQkJCQkJCQlvcHRpbXVtLlByZXYxSXNDaGFyID0gdHJ1ZTsNCisJCQkJCQkJCQlvcHRpbXVtLlByZXYyID0gdHJ1ZTsNCisJCQkJCQkJCQlvcHRpbXVtLlBvc1ByZXYyID0gY3VyOw0KKwkJCQkJCQkJCW9wdGltdW0uQmFja1ByZXYyID0gcmVwSW5kZXg7DQorCQkJCQkJCQl9DQorCQkJCQkJCX0NCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisNCisJCQkJaWYgKG5ld0xlbiA+IG51bUF2YWlsYWJsZUJ5dGVzKQ0KKwkJCQl7DQorCQkJCQluZXdMZW4gPSBudW1BdmFpbGFibGVCeXRlczsNCisJCQkJCWZvciAobnVtRGlzdGFuY2VQYWlycyA9IDA7IG5ld0xlbiA+IF9tYXRjaERpc3RhbmNlc1tudW1EaXN0YW5jZVBhaXJzXTsgbnVtRGlzdGFuY2VQYWlycyArPSAyKSA7DQorCQkJCQlfbWF0Y2hEaXN0YW5jZXNbbnVtRGlzdGFuY2VQYWlyc10gPSBuZXdMZW47DQorCQkJCQludW1EaXN0YW5jZVBhaXJzICs9IDI7DQorCQkJCX0NCisJCQkJaWYgKG5ld0xlbiA+PSBzdGFydExlbikNCisJCQkJew0KKwkJCQkJbm9ybWFsTWF0Y2hQcmljZSA9IG1hdGNoUHJpY2UgKyBfaXNSZXBbc3RhdGUuSW5kZXhdLkdldFByaWNlMCgpOw0KKwkJCQkJd2hpbGUgKGxlbkVuZCA8IGN1ciArIG5ld0xlbikNCisJCQkJCQlfb3B0aW11bVsrK2xlbkVuZF0uUHJpY2UgPSBrSWZpbml0eVByaWNlOw0KKw0KKwkJCQkJVUludDMyIG9mZnMgPSAwOw0KKwkJCQkJd2hpbGUgKHN0YXJ0TGVuID4gX21hdGNoRGlzdGFuY2VzW29mZnNdKQ0KKwkJCQkJCW9mZnMgKz0gMjsNCisNCisJCQkJCWZvciAoVUludDMyIGxlblRlc3QgPSBzdGFydExlbjsgOyBsZW5UZXN0KyspDQorCQkJCQl7DQorCQkJCQkJVUludDMyIGN1ckJhY2sgPSBfbWF0Y2hEaXN0YW5jZXNbb2ZmcyArIDFdOw0KKwkJCQkJCVVJbnQzMiBjdXJBbmRMZW5QcmljZSA9IG5vcm1hbE1hdGNoUHJpY2UgKyBHZXRQb3NMZW5QcmljZShjdXJCYWNrLCBsZW5UZXN0LCBwb3NTdGF0ZSk7DQorCQkJCQkJT3B0aW1hbCBvcHRpbXVtID0gX29wdGltdW1bY3VyICsgbGVuVGVzdF07DQorCQkJCQkJaWYgKGN1ckFuZExlblByaWNlIDwgb3B0aW11bS5QcmljZSkNCisJCQkJCQl7DQorCQkJCQkJCW9wdGltdW0uUHJpY2UgPSBjdXJBbmRMZW5QcmljZTsNCisJCQkJCQkJb3B0aW11bS5Qb3NQcmV2ID0gY3VyOw0KKwkJCQkJCQlvcHRpbXVtLkJhY2tQcmV2ID0gY3VyQmFjayArIEJhc2Uua051bVJlcERpc3RhbmNlczsNCisJCQkJCQkJb3B0aW11bS5QcmV2MUlzQ2hhciA9IGZhbHNlOw0KKwkJCQkJCX0NCisNCisJCQkJCQlpZiAobGVuVGVzdCA9PSBfbWF0Y2hEaXN0YW5jZXNbb2Zmc10pDQorCQkJCQkJew0KKwkJCQkJCQlpZiAobGVuVGVzdCA8IG51bUF2YWlsYWJsZUJ5dGVzRnVsbCkNCisJCQkJCQkJew0KKwkJCQkJCQkJVUludDMyIHQgPSBNYXRoLk1pbihudW1BdmFpbGFibGVCeXRlc0Z1bGwgLSAxIC0gbGVuVGVzdCwgX251bUZhc3RCeXRlcyk7DQorCQkJCQkJCQlVSW50MzIgbGVuVGVzdDIgPSBfbWF0Y2hGaW5kZXIuR2V0TWF0Y2hMZW4oKEludDMyKWxlblRlc3QsIGN1ckJhY2ssIHQpOw0KKwkJCQkJCQkJaWYgKGxlblRlc3QyID49IDIpDQorCQkJCQkJCQl7DQorCQkJCQkJCQkJQmFzZS5TdGF0ZSBzdGF0ZTIgPSBzdGF0ZTsNCisJCQkJCQkJCQlzdGF0ZTIuVXBkYXRlTWF0Y2goKTsNCisJCQkJCQkJCQlVSW50MzIgcG9zU3RhdGVOZXh0ID0gKHBvc2l0aW9uICsgbGVuVGVzdCkgJiBfcG9zU3RhdGVNYXNrOw0KKwkJCQkJCQkJCVVJbnQzMiBjdXJBbmRMZW5DaGFyUHJpY2UgPSBjdXJBbmRMZW5QcmljZSArDQorCQkJCQkJCQkJCV9pc01hdGNoWyhzdGF0ZTIuSW5kZXggPDwgQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heCkgKyBwb3NTdGF0ZU5leHRdLkdldFByaWNlMCgpICsNCisJCQkJCQkJCQkJX2xpdGVyYWxFbmNvZGVyLkdldFN1YkNvZGVyKHBvc2l0aW9uICsgbGVuVGVzdCwNCisJCQkJCQkJCQkJX21hdGNoRmluZGVyLkdldEluZGV4Qnl0ZSgoSW50MzIpbGVuVGVzdCAtIDEgLSAxKSkuDQorCQkJCQkJCQkJCUdldFByaWNlKHRydWUsDQorCQkJCQkJCQkJCV9tYXRjaEZpbmRlci5HZXRJbmRleEJ5dGUoKEludDMyKWxlblRlc3QgLSAoSW50MzIpKGN1ckJhY2sgKyAxKSAtIDEpLA0KKwkJCQkJCQkJCQlfbWF0Y2hGaW5kZXIuR2V0SW5kZXhCeXRlKChJbnQzMilsZW5UZXN0IC0gMSkpOw0KKwkJCQkJCQkJCXN0YXRlMi5VcGRhdGVDaGFyKCk7DQorCQkJCQkJCQkJcG9zU3RhdGVOZXh0ID0gKHBvc2l0aW9uICsgbGVuVGVzdCArIDEpICYgX3Bvc1N0YXRlTWFzazsNCisJCQkJCQkJCQlVSW50MzIgbmV4dE1hdGNoUHJpY2UgPSBjdXJBbmRMZW5DaGFyUHJpY2UgKyBfaXNNYXRjaFsoc3RhdGUyLkluZGV4IDw8IEJhc2Uua051bVBvc1N0YXRlc0JpdHNNYXgpICsgcG9zU3RhdGVOZXh0XS5HZXRQcmljZTEoKTsNCisJCQkJCQkJCQlVSW50MzIgbmV4dFJlcE1hdGNoUHJpY2UgPSBuZXh0TWF0Y2hQcmljZSArIF9pc1JlcFtzdGF0ZTIuSW5kZXhdLkdldFByaWNlMSgpOw0KKw0KKwkJCQkJCQkJCVVJbnQzMiBvZmZzZXQgPSBsZW5UZXN0ICsgMSArIGxlblRlc3QyOw0KKwkJCQkJCQkJCXdoaWxlIChsZW5FbmQgPCBjdXIgKyBvZmZzZXQpDQorCQkJCQkJCQkJCV9vcHRpbXVtWysrbGVuRW5kXS5QcmljZSA9IGtJZmluaXR5UHJpY2U7DQorCQkJCQkJCQkJY3VyQW5kTGVuUHJpY2UgPSBuZXh0UmVwTWF0Y2hQcmljZSArIEdldFJlcFByaWNlKDAsIGxlblRlc3QyLCBzdGF0ZTIsIHBvc1N0YXRlTmV4dCk7DQorCQkJCQkJCQkJb3B0aW11bSA9IF9vcHRpbXVtW2N1ciArIG9mZnNldF07DQorCQkJCQkJCQkJaWYgKGN1ckFuZExlblByaWNlIDwgb3B0aW11bS5QcmljZSkNCisJCQkJCQkJCQl7DQorCQkJCQkJCQkJCW9wdGltdW0uUHJpY2UgPSBjdXJBbmRMZW5QcmljZTsNCisJCQkJCQkJCQkJb3B0aW11bS5Qb3NQcmV2ID0gY3VyICsgbGVuVGVzdCArIDE7DQorCQkJCQkJCQkJCW9wdGltdW0uQmFja1ByZXYgPSAwOw0KKwkJCQkJCQkJCQlvcHRpbXVtLlByZXYxSXNDaGFyID0gdHJ1ZTsNCisJCQkJCQkJCQkJb3B0aW11bS5QcmV2MiA9IHRydWU7DQorCQkJCQkJCQkJCW9wdGltdW0uUG9zUHJldjIgPSBjdXI7DQorCQkJCQkJCQkJCW9wdGltdW0uQmFja1ByZXYyID0gY3VyQmFjayArIEJhc2Uua051bVJlcERpc3RhbmNlczsNCisJCQkJCQkJCQl9DQorCQkJCQkJCQl9DQorCQkJCQkJCX0NCisJCQkJCQkJb2ZmcyArPSAyOw0KKwkJCQkJCQlpZiAob2ZmcyA9PSBudW1EaXN0YW5jZVBhaXJzKQ0KKwkJCQkJCQkJYnJlYWs7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKw0KKwkJYm9vbCBDaGFuZ2VQYWlyKFVJbnQzMiBzbWFsbERpc3QsIFVJbnQzMiBiaWdEaXN0KQ0KKwkJew0KKwkJCWNvbnN0IGludCBrRGlmID0gNzsNCisJCQlyZXR1cm4gKHNtYWxsRGlzdCA8ICgoVUludDMyKSgxKSA8PCAoMzIgLSBrRGlmKSkgJiYgYmlnRGlzdCA+PSAoc21hbGxEaXN0IDw8IGtEaWYpKTsNCisJCX0NCisNCisJCXZvaWQgV3JpdGVFbmRNYXJrZXIoVUludDMyIHBvc1N0YXRlKQ0KKwkJew0KKwkJCWlmICghX3dyaXRlRW5kTWFyaykNCisJCQkJcmV0dXJuOw0KKw0KKwkJCV9pc01hdGNoWyhfc3RhdGUuSW5kZXggPDwgQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heCkgKyBwb3NTdGF0ZV0uRW5jb2RlKF9yYW5nZUVuY29kZXIsIDEpOw0KKwkJCV9pc1JlcFtfc3RhdGUuSW5kZXhdLkVuY29kZShfcmFuZ2VFbmNvZGVyLCAwKTsNCisJCQlfc3RhdGUuVXBkYXRlTWF0Y2goKTsNCisJCQlVSW50MzIgbGVuID0gQmFzZS5rTWF0Y2hNaW5MZW47DQorCQkJX2xlbkVuY29kZXIuRW5jb2RlKF9yYW5nZUVuY29kZXIsIGxlbiAtIEJhc2Uua01hdGNoTWluTGVuLCBwb3NTdGF0ZSk7DQorCQkJVUludDMyIHBvc1Nsb3QgPSAoMSA8PCBCYXNlLmtOdW1Qb3NTbG90Qml0cykgLSAxOw0KKwkJCVVJbnQzMiBsZW5Ub1Bvc1N0YXRlID0gQmFzZS5HZXRMZW5Ub1Bvc1N0YXRlKGxlbik7DQorCQkJX3Bvc1Nsb3RFbmNvZGVyW2xlblRvUG9zU3RhdGVdLkVuY29kZShfcmFuZ2VFbmNvZGVyLCBwb3NTbG90KTsNCisJCQlpbnQgZm9vdGVyQml0cyA9IDMwOw0KKwkJCVVJbnQzMiBwb3NSZWR1Y2VkID0gKCgoVUludDMyKTEpIDw8IGZvb3RlckJpdHMpIC0gMTsNCisJCQlfcmFuZ2VFbmNvZGVyLkVuY29kZURpcmVjdEJpdHMocG9zUmVkdWNlZCA+PiBCYXNlLmtOdW1BbGlnbkJpdHMsIGZvb3RlckJpdHMgLSBCYXNlLmtOdW1BbGlnbkJpdHMpOw0KKwkJCV9wb3NBbGlnbkVuY29kZXIuUmV2ZXJzZUVuY29kZShfcmFuZ2VFbmNvZGVyLCBwb3NSZWR1Y2VkICYgQmFzZS5rQWxpZ25NYXNrKTsNCisJCX0NCisNCisJCXZvaWQgRmx1c2goVUludDMyIG5vd1BvcykNCisJCXsNCisJCQlSZWxlYXNlTUZTdHJlYW0oKTsNCisJCQlXcml0ZUVuZE1hcmtlcihub3dQb3MgJiBfcG9zU3RhdGVNYXNrKTsNCisJCQlfcmFuZ2VFbmNvZGVyLkZsdXNoRGF0YSgpOw0KKwkJCV9yYW5nZUVuY29kZXIuRmx1c2hTdHJlYW0oKTsNCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIENvZGVPbmVCbG9jayhvdXQgSW50NjQgaW5TaXplLCBvdXQgSW50NjQgb3V0U2l6ZSwgb3V0IGJvb2wgZmluaXNoZWQpDQorCQl7DQorCQkJaW5TaXplID0gMDsNCisJCQlvdXRTaXplID0gMDsNCisJCQlmaW5pc2hlZCA9IHRydWU7DQorDQorCQkJaWYgKF9pblN0cmVhbSAhPSBudWxsKQ0KKwkJCXsNCisJCQkJX21hdGNoRmluZGVyLlNldFN0cmVhbShfaW5TdHJlYW0pOw0KKwkJCQlfbWF0Y2hGaW5kZXIuSW5pdCgpOw0KKwkJCQlfbmVlZFJlbGVhc2VNRlN0cmVhbSA9IHRydWU7DQorCQkJCV9pblN0cmVhbSA9IG51bGw7DQorCQkJCWlmIChfdHJhaW5TaXplID4gMCkNCisJCQkJCV9tYXRjaEZpbmRlci5Ta2lwKF90cmFpblNpemUpOw0KKwkJCX0NCisNCisJCQlpZiAoX2ZpbmlzaGVkKQ0KKwkJCQlyZXR1cm47DQorCQkJX2ZpbmlzaGVkID0gdHJ1ZTsNCisNCisNCisJCQlJbnQ2NCBwcm9ncmVzc1Bvc1ZhbHVlUHJldiA9IG5vd1BvczY0Ow0KKwkJCWlmIChub3dQb3M2NCA9PSAwKQ0KKwkJCXsNCisJCQkJaWYgKF9tYXRjaEZpbmRlci5HZXROdW1BdmFpbGFibGVCeXRlcygpID09IDApDQorCQkJCXsNCisJCQkJCUZsdXNoKChVSW50MzIpbm93UG9zNjQpOw0KKwkJCQkJcmV0dXJuOw0KKwkJCQl9DQorCQkJCVVJbnQzMiBsZW4sIG51bURpc3RhbmNlUGFpcnM7IC8vIGl0J3Mgbm90IHVzZWQNCisJCQkJUmVhZE1hdGNoRGlzdGFuY2VzKG91dCBsZW4sIG91dCBudW1EaXN0YW5jZVBhaXJzKTsNCisJCQkJVUludDMyIHBvc1N0YXRlID0gKFVJbnQzMikobm93UG9zNjQpICYgX3Bvc1N0YXRlTWFzazsNCisJCQkJX2lzTWF0Y2hbKF9zdGF0ZS5JbmRleCA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlXS5FbmNvZGUoX3JhbmdlRW5jb2RlciwgMCk7DQorCQkJCV9zdGF0ZS5VcGRhdGVDaGFyKCk7DQorCQkJCUJ5dGUgY3VyQnl0ZSA9IF9tYXRjaEZpbmRlci5HZXRJbmRleEJ5dGUoKEludDMyKSgwIC0gX2FkZGl0aW9uYWxPZmZzZXQpKTsNCisJCQkJX2xpdGVyYWxFbmNvZGVyLkdldFN1YkNvZGVyKChVSW50MzIpKG5vd1BvczY0KSwgX3ByZXZpb3VzQnl0ZSkuRW5jb2RlKF9yYW5nZUVuY29kZXIsIGN1ckJ5dGUpOw0KKwkJCQlfcHJldmlvdXNCeXRlID0gY3VyQnl0ZTsNCisJCQkJX2FkZGl0aW9uYWxPZmZzZXQtLTsNCisJCQkJbm93UG9zNjQrKzsNCisJCQl9DQorCQkJaWYgKF9tYXRjaEZpbmRlci5HZXROdW1BdmFpbGFibGVCeXRlcygpID09IDApDQorCQkJew0KKwkJCQlGbHVzaCgoVUludDMyKW5vd1BvczY0KTsNCisJCQkJcmV0dXJuOw0KKwkJCX0NCisJCQl3aGlsZSAodHJ1ZSkNCisJCQl7DQorCQkJCVVJbnQzMiBwb3M7DQorCQkJCVVJbnQzMiBsZW4gPSBHZXRPcHRpbXVtKChVSW50MzIpbm93UG9zNjQsIG91dCBwb3MpOw0KKwkJCQkNCisJCQkJVUludDMyIHBvc1N0YXRlID0gKChVSW50MzIpbm93UG9zNjQpICYgX3Bvc1N0YXRlTWFzazsNCisJCQkJVUludDMyIGNvbXBsZXhTdGF0ZSA9IChfc3RhdGUuSW5kZXggPDwgQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heCkgKyBwb3NTdGF0ZTsNCisJCQkJaWYgKGxlbiA9PSAxICYmIHBvcyA9PSAweEZGRkZGRkZGKQ0KKwkJCQl7DQorCQkJCQlfaXNNYXRjaFtjb21wbGV4U3RhdGVdLkVuY29kZShfcmFuZ2VFbmNvZGVyLCAwKTsNCisJCQkJCUJ5dGUgY3VyQnl0ZSA9IF9tYXRjaEZpbmRlci5HZXRJbmRleEJ5dGUoKEludDMyKSgwIC0gX2FkZGl0aW9uYWxPZmZzZXQpKTsNCisJCQkJCUxpdGVyYWxFbmNvZGVyLkVuY29kZXIyIHN1YkNvZGVyID0gX2xpdGVyYWxFbmNvZGVyLkdldFN1YkNvZGVyKChVSW50MzIpbm93UG9zNjQsIF9wcmV2aW91c0J5dGUpOw0KKwkJCQkJaWYgKCFfc3RhdGUuSXNDaGFyU3RhdGUoKSkNCisJCQkJCXsNCisJCQkJCQlCeXRlIG1hdGNoQnl0ZSA9IF9tYXRjaEZpbmRlci5HZXRJbmRleEJ5dGUoKEludDMyKSgwIC0gX3JlcERpc3RhbmNlc1swXSAtIDEgLSBfYWRkaXRpb25hbE9mZnNldCkpOw0KKwkJCQkJCXN1YkNvZGVyLkVuY29kZU1hdGNoZWQoX3JhbmdlRW5jb2RlciwgbWF0Y2hCeXRlLCBjdXJCeXRlKTsNCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCQlzdWJDb2Rlci5FbmNvZGUoX3JhbmdlRW5jb2RlciwgY3VyQnl0ZSk7DQorCQkJCQlfcHJldmlvdXNCeXRlID0gY3VyQnl0ZTsNCisJCQkJCV9zdGF0ZS5VcGRhdGVDaGFyKCk7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlfaXNNYXRjaFtjb21wbGV4U3RhdGVdLkVuY29kZShfcmFuZ2VFbmNvZGVyLCAxKTsNCisJCQkJCWlmIChwb3MgPCBCYXNlLmtOdW1SZXBEaXN0YW5jZXMpDQorCQkJCQl7DQorCQkJCQkJX2lzUmVwW19zdGF0ZS5JbmRleF0uRW5jb2RlKF9yYW5nZUVuY29kZXIsIDEpOw0KKwkJCQkJCWlmIChwb3MgPT0gMCkNCisJCQkJCQl7DQorCQkJCQkJCV9pc1JlcEcwW19zdGF0ZS5JbmRleF0uRW5jb2RlKF9yYW5nZUVuY29kZXIsIDApOw0KKwkJCQkJCQlpZiAobGVuID09IDEpDQorCQkJCQkJCQlfaXNSZXAwTG9uZ1tjb21wbGV4U3RhdGVdLkVuY29kZShfcmFuZ2VFbmNvZGVyLCAwKTsNCisJCQkJCQkJZWxzZQ0KKwkJCQkJCQkJX2lzUmVwMExvbmdbY29tcGxleFN0YXRlXS5FbmNvZGUoX3JhbmdlRW5jb2RlciwgMSk7DQorCQkJCQkJfQ0KKwkJCQkJCWVsc2UNCisJCQkJCQl7DQorCQkJCQkJCV9pc1JlcEcwW19zdGF0ZS5JbmRleF0uRW5jb2RlKF9yYW5nZUVuY29kZXIsIDEpOw0KKwkJCQkJCQlpZiAocG9zID09IDEpDQorCQkJCQkJCQlfaXNSZXBHMVtfc3RhdGUuSW5kZXhdLkVuY29kZShfcmFuZ2VFbmNvZGVyLCAwKTsNCisJCQkJCQkJZWxzZQ0KKwkJCQkJCQl7DQorCQkJCQkJCQlfaXNSZXBHMVtfc3RhdGUuSW5kZXhdLkVuY29kZShfcmFuZ2VFbmNvZGVyLCAxKTsNCisJCQkJCQkJCV9pc1JlcEcyW19zdGF0ZS5JbmRleF0uRW5jb2RlKF9yYW5nZUVuY29kZXIsIHBvcyAtIDIpOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJCWlmIChsZW4gPT0gMSkNCisJCQkJCQkJX3N0YXRlLlVwZGF0ZVNob3J0UmVwKCk7DQorCQkJCQkJZWxzZQ0KKwkJCQkJCXsNCisJCQkJCQkJX3JlcE1hdGNoTGVuRW5jb2Rlci5FbmNvZGUoX3JhbmdlRW5jb2RlciwgbGVuIC0gQmFzZS5rTWF0Y2hNaW5MZW4sIHBvc1N0YXRlKTsNCisJCQkJCQkJX3N0YXRlLlVwZGF0ZVJlcCgpOw0KKwkJCQkJCX0NCisJCQkJCQlVSW50MzIgZGlzdGFuY2UgPSBfcmVwRGlzdGFuY2VzW3Bvc107DQorCQkJCQkJaWYgKHBvcyAhPSAwKQ0KKwkJCQkJCXsNCisJCQkJCQkJZm9yIChVSW50MzIgaSA9IHBvczsgaSA+PSAxOyBpLS0pDQorCQkJCQkJCQlfcmVwRGlzdGFuY2VzW2ldID0gX3JlcERpc3RhbmNlc1tpIC0gMV07DQorCQkJCQkJCV9yZXBEaXN0YW5jZXNbMF0gPSBkaXN0YW5jZTsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCQllbHNlDQorCQkJCQl7DQorCQkJCQkJX2lzUmVwW19zdGF0ZS5JbmRleF0uRW5jb2RlKF9yYW5nZUVuY29kZXIsIDApOw0KKwkJCQkJCV9zdGF0ZS5VcGRhdGVNYXRjaCgpOw0KKwkJCQkJCV9sZW5FbmNvZGVyLkVuY29kZShfcmFuZ2VFbmNvZGVyLCBsZW4gLSBCYXNlLmtNYXRjaE1pbkxlbiwgcG9zU3RhdGUpOw0KKwkJCQkJCXBvcyAtPSBCYXNlLmtOdW1SZXBEaXN0YW5jZXM7DQorCQkJCQkJVUludDMyIHBvc1Nsb3QgPSBHZXRQb3NTbG90KHBvcyk7DQorCQkJCQkJVUludDMyIGxlblRvUG9zU3RhdGUgPSBCYXNlLkdldExlblRvUG9zU3RhdGUobGVuKTsNCisJCQkJCQlfcG9zU2xvdEVuY29kZXJbbGVuVG9Qb3NTdGF0ZV0uRW5jb2RlKF9yYW5nZUVuY29kZXIsIHBvc1Nsb3QpOw0KKw0KKwkJCQkJCWlmIChwb3NTbG90ID49IEJhc2Uua1N0YXJ0UG9zTW9kZWxJbmRleCkNCisJCQkJCQl7DQorCQkJCQkJCWludCBmb290ZXJCaXRzID0gKGludCkoKHBvc1Nsb3QgPj4gMSkgLSAxKTsNCisJCQkJCQkJVUludDMyIGJhc2VWYWwgPSAoKDIgfCAocG9zU2xvdCAmIDEpKSA8PCBmb290ZXJCaXRzKTsNCisJCQkJCQkJVUludDMyIHBvc1JlZHVjZWQgPSBwb3MgLSBiYXNlVmFsOw0KKw0KKwkJCQkJCQlpZiAocG9zU2xvdCA8IEJhc2Uua0VuZFBvc01vZGVsSW5kZXgpDQorCQkJCQkJCQlSYW5nZUNvZGVyLkJpdFRyZWVFbmNvZGVyLlJldmVyc2VFbmNvZGUoX3Bvc0VuY29kZXJzLA0KKwkJCQkJCQkJCQliYXNlVmFsIC0gcG9zU2xvdCAtIDEsIF9yYW5nZUVuY29kZXIsIGZvb3RlckJpdHMsIHBvc1JlZHVjZWQpOw0KKwkJCQkJCQllbHNlDQorCQkJCQkJCXsNCisJCQkJCQkJCV9yYW5nZUVuY29kZXIuRW5jb2RlRGlyZWN0Qml0cyhwb3NSZWR1Y2VkID4+IEJhc2Uua051bUFsaWduQml0cywgZm9vdGVyQml0cyAtIEJhc2Uua051bUFsaWduQml0cyk7DQorCQkJCQkJCQlfcG9zQWxpZ25FbmNvZGVyLlJldmVyc2VFbmNvZGUoX3JhbmdlRW5jb2RlciwgcG9zUmVkdWNlZCAmIEJhc2Uua0FsaWduTWFzayk7DQorCQkJCQkJCQlfYWxpZ25QcmljZUNvdW50Kys7DQorCQkJCQkJCX0NCisJCQkJCQl9DQorCQkJCQkJVUludDMyIGRpc3RhbmNlID0gcG9zOw0KKwkJCQkJCWZvciAoVUludDMyIGkgPSBCYXNlLmtOdW1SZXBEaXN0YW5jZXMgLSAxOyBpID49IDE7IGktLSkNCisJCQkJCQkJX3JlcERpc3RhbmNlc1tpXSA9IF9yZXBEaXN0YW5jZXNbaSAtIDFdOw0KKwkJCQkJCV9yZXBEaXN0YW5jZXNbMF0gPSBkaXN0YW5jZTsNCisJCQkJCQlfbWF0Y2hQcmljZUNvdW50Kys7DQorCQkJCQl9DQorCQkJCQlfcHJldmlvdXNCeXRlID0gX21hdGNoRmluZGVyLkdldEluZGV4Qnl0ZSgoSW50MzIpKGxlbiAtIDEgLSBfYWRkaXRpb25hbE9mZnNldCkpOw0KKwkJCQl9DQorCQkJCV9hZGRpdGlvbmFsT2Zmc2V0IC09IGxlbjsNCisJCQkJbm93UG9zNjQgKz0gbGVuOw0KKwkJCQlpZiAoX2FkZGl0aW9uYWxPZmZzZXQgPT0gMCkNCisJCQkJew0KKwkJCQkJLy8gaWYgKCFfZmFzdE1vZGUpDQorCQkJCQlpZiAoX21hdGNoUHJpY2VDb3VudCA+PSAoMSA8PCA3KSkNCisJCQkJCQlGaWxsRGlzdGFuY2VzUHJpY2VzKCk7DQorCQkJCQlpZiAoX2FsaWduUHJpY2VDb3VudCA+PSBCYXNlLmtBbGlnblRhYmxlU2l6ZSkNCisJCQkJCQlGaWxsQWxpZ25QcmljZXMoKTsNCisJCQkJCWluU2l6ZSA9IG5vd1BvczY0Ow0KKwkJCQkJb3V0U2l6ZSA9IF9yYW5nZUVuY29kZXIuR2V0UHJvY2Vzc2VkU2l6ZUFkZCgpOw0KKwkJCQkJaWYgKF9tYXRjaEZpbmRlci5HZXROdW1BdmFpbGFibGVCeXRlcygpID09IDApDQorCQkJCQl7DQorCQkJCQkJRmx1c2goKFVJbnQzMilub3dQb3M2NCk7DQorCQkJCQkJcmV0dXJuOw0KKwkJCQkJfQ0KKw0KKwkJCQkJaWYgKG5vd1BvczY0IC0gcHJvZ3Jlc3NQb3NWYWx1ZVByZXYgPj0gKDEgPDwgMTIpKQ0KKwkJCQkJew0KKwkJCQkJCV9maW5pc2hlZCA9IGZhbHNlOw0KKwkJCQkJCWZpbmlzaGVkID0gZmFsc2U7DQorCQkJCQkJcmV0dXJuOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKw0KKwkJdm9pZCBSZWxlYXNlTUZTdHJlYW0oKQ0KKwkJew0KKwkJCWlmIChfbWF0Y2hGaW5kZXIgIT0gbnVsbCAmJiBfbmVlZFJlbGVhc2VNRlN0cmVhbSkNCisJCQl7DQorCQkJCV9tYXRjaEZpbmRlci5SZWxlYXNlU3RyZWFtKCk7DQorCQkJCV9uZWVkUmVsZWFzZU1GU3RyZWFtID0gZmFsc2U7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJdm9pZCBTZXRPdXRTdHJlYW0oU3lzdGVtLklPLlN0cmVhbSBvdXRTdHJlYW0pIHsgX3JhbmdlRW5jb2Rlci5TZXRTdHJlYW0ob3V0U3RyZWFtKTsgfQ0KKwkJdm9pZCBSZWxlYXNlT3V0U3RyZWFtKCkgeyBfcmFuZ2VFbmNvZGVyLlJlbGVhc2VTdHJlYW0oKTsgfQ0KKw0KKwkJdm9pZCBSZWxlYXNlU3RyZWFtcygpDQorCQl7DQorCQkJUmVsZWFzZU1GU3RyZWFtKCk7DQorCQkJUmVsZWFzZU91dFN0cmVhbSgpOw0KKwkJfQ0KKw0KKwkJdm9pZCBTZXRTdHJlYW1zKFN5c3RlbS5JTy5TdHJlYW0gaW5TdHJlYW0sIFN5c3RlbS5JTy5TdHJlYW0gb3V0U3RyZWFtLA0KKwkJCQlJbnQ2NCBpblNpemUsIEludDY0IG91dFNpemUpDQorCQl7DQorCQkJX2luU3RyZWFtID0gaW5TdHJlYW07DQorCQkJX2ZpbmlzaGVkID0gZmFsc2U7DQorCQkJQ3JlYXRlKCk7DQorCQkJU2V0T3V0U3RyZWFtKG91dFN0cmVhbSk7DQorCQkJSW5pdCgpOw0KKw0KKwkJCS8vIGlmICghX2Zhc3RNb2RlKQ0KKwkJCXsNCisJCQkJRmlsbERpc3RhbmNlc1ByaWNlcygpOw0KKwkJCQlGaWxsQWxpZ25QcmljZXMoKTsNCisJCQl9DQorDQorCQkJX2xlbkVuY29kZXIuU2V0VGFibGVTaXplKF9udW1GYXN0Qnl0ZXMgKyAxIC0gQmFzZS5rTWF0Y2hNaW5MZW4pOw0KKwkJCV9sZW5FbmNvZGVyLlVwZGF0ZVRhYmxlcygoVUludDMyKTEgPDwgX3Bvc1N0YXRlQml0cyk7DQorCQkJX3JlcE1hdGNoTGVuRW5jb2Rlci5TZXRUYWJsZVNpemUoX251bUZhc3RCeXRlcyArIDEgLSBCYXNlLmtNYXRjaE1pbkxlbik7DQorCQkJX3JlcE1hdGNoTGVuRW5jb2Rlci5VcGRhdGVUYWJsZXMoKFVJbnQzMikxIDw8IF9wb3NTdGF0ZUJpdHMpOw0KKw0KKwkJCW5vd1BvczY0ID0gMDsNCisJCX0NCisNCisNCisJCXB1YmxpYyB2b2lkIENvZGUoU3lzdGVtLklPLlN0cmVhbSBpblN0cmVhbSwgU3lzdGVtLklPLlN0cmVhbSBvdXRTdHJlYW0sDQorCQkJSW50NjQgaW5TaXplLCBJbnQ2NCBvdXRTaXplLCBJQ29kZVByb2dyZXNzIHByb2dyZXNzKQ0KKwkJew0KKwkJCV9uZWVkUmVsZWFzZU1GU3RyZWFtID0gZmFsc2U7DQorCQkJdHJ5DQorCQkJew0KKwkJCQlTZXRTdHJlYW1zKGluU3RyZWFtLCBvdXRTdHJlYW0sIGluU2l6ZSwgb3V0U2l6ZSk7DQorCQkJCXdoaWxlICh0cnVlKQ0KKwkJCQl7DQorCQkJCQlJbnQ2NCBwcm9jZXNzZWRJblNpemU7DQorCQkJCQlJbnQ2NCBwcm9jZXNzZWRPdXRTaXplOw0KKwkJCQkJYm9vbCBmaW5pc2hlZDsNCisJCQkJCUNvZGVPbmVCbG9jayhvdXQgcHJvY2Vzc2VkSW5TaXplLCBvdXQgcHJvY2Vzc2VkT3V0U2l6ZSwgb3V0IGZpbmlzaGVkKTsNCisJCQkJCWlmIChmaW5pc2hlZCkNCisJCQkJCQlyZXR1cm47DQorCQkJCQlpZiAocHJvZ3Jlc3MgIT0gbnVsbCkNCisJCQkJCXsNCisJCQkJCQlwcm9ncmVzcy5TZXRQcm9ncmVzcyhwcm9jZXNzZWRJblNpemUsIHByb2Nlc3NlZE91dFNpemUpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWZpbmFsbHkNCisJCQl7DQorCQkJCVJlbGVhc2VTdHJlYW1zKCk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJY29uc3QgaW50IGtQcm9wU2l6ZSA9IDU7DQorCQlCeXRlW10gcHJvcGVydGllcyA9IG5ldyBCeXRlW2tQcm9wU2l6ZV07DQorDQorCQlwdWJsaWMgdm9pZCBXcml0ZUNvZGVyUHJvcGVydGllcyhTeXN0ZW0uSU8uU3RyZWFtIG91dFN0cmVhbSkNCisJCXsNCisJCQlwcm9wZXJ0aWVzWzBdID0gKEJ5dGUpKChfcG9zU3RhdGVCaXRzICogNSArIF9udW1MaXRlcmFsUG9zU3RhdGVCaXRzKSAqIDkgKyBfbnVtTGl0ZXJhbENvbnRleHRCaXRzKTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykNCisJCQkJcHJvcGVydGllc1sxICsgaV0gPSAoQnl0ZSkoKF9kaWN0aW9uYXJ5U2l6ZSA+PiAoOCAqIGkpKSAmIDB4RkYpOw0KKwkJCW91dFN0cmVhbS5Xcml0ZShwcm9wZXJ0aWVzLCAwLCBrUHJvcFNpemUpOw0KKwkJfQ0KKwkJDQorCQlVSW50MzJbXSB0ZW1wUHJpY2VzID0gbmV3IFVJbnQzMltCYXNlLmtOdW1GdWxsRGlzdGFuY2VzXTsNCisJCVVJbnQzMiBfbWF0Y2hQcmljZUNvdW50Ow0KKw0KKwkJdm9pZCBGaWxsRGlzdGFuY2VzUHJpY2VzKCkNCisJCXsNCisJCQlmb3IgKFVJbnQzMiBpID0gQmFzZS5rU3RhcnRQb3NNb2RlbEluZGV4OyBpIDwgQmFzZS5rTnVtRnVsbERpc3RhbmNlczsgaSsrKQ0KKwkJCXsgDQorCQkJCVVJbnQzMiBwb3NTbG90ID0gR2V0UG9zU2xvdChpKTsNCisJCQkJaW50IGZvb3RlckJpdHMgPSAoaW50KSgocG9zU2xvdCA+PiAxKSAtIDEpOw0KKwkJCQlVSW50MzIgYmFzZVZhbCA9ICgoMiB8IChwb3NTbG90ICYgMSkpIDw8IGZvb3RlckJpdHMpOw0KKwkJCQl0ZW1wUHJpY2VzW2ldID0gQml0VHJlZUVuY29kZXIuUmV2ZXJzZUdldFByaWNlKF9wb3NFbmNvZGVycywgDQorCQkJCQliYXNlVmFsIC0gcG9zU2xvdCAtIDEsIGZvb3RlckJpdHMsIGkgLSBiYXNlVmFsKTsNCisJCQl9DQorDQorCQkJZm9yIChVSW50MzIgbGVuVG9Qb3NTdGF0ZSA9IDA7IGxlblRvUG9zU3RhdGUgPCBCYXNlLmtOdW1MZW5Ub1Bvc1N0YXRlczsgbGVuVG9Qb3NTdGF0ZSsrKQ0KKwkJCXsNCisJCQkJVUludDMyIHBvc1Nsb3Q7DQorCQkJCVJhbmdlQ29kZXIuQml0VHJlZUVuY29kZXIgZW5jb2RlciA9IF9wb3NTbG90RW5jb2RlcltsZW5Ub1Bvc1N0YXRlXTsNCisJCQkNCisJCQkJVUludDMyIHN0ID0gKGxlblRvUG9zU3RhdGUgPDwgQmFzZS5rTnVtUG9zU2xvdEJpdHMpOw0KKwkJCQlmb3IgKHBvc1Nsb3QgPSAwOyBwb3NTbG90IDwgX2Rpc3RUYWJsZVNpemU7IHBvc1Nsb3QrKykNCisJCQkJCV9wb3NTbG90UHJpY2VzW3N0ICsgcG9zU2xvdF0gPSBlbmNvZGVyLkdldFByaWNlKHBvc1Nsb3QpOw0KKwkJCQlmb3IgKHBvc1Nsb3QgPSBCYXNlLmtFbmRQb3NNb2RlbEluZGV4OyBwb3NTbG90IDwgX2Rpc3RUYWJsZVNpemU7IHBvc1Nsb3QrKykNCisJCQkJCV9wb3NTbG90UHJpY2VzW3N0ICsgcG9zU2xvdF0gKz0gKCgoKHBvc1Nsb3QgPj4gMSkgLSAxKSAtIEJhc2Uua051bUFsaWduQml0cykgPDwgUmFuZ2VDb2Rlci5CaXRFbmNvZGVyLmtOdW1CaXRQcmljZVNoaWZ0Qml0cyk7DQorDQorCQkJCVVJbnQzMiBzdDIgPSBsZW5Ub1Bvc1N0YXRlICogQmFzZS5rTnVtRnVsbERpc3RhbmNlczsNCisJCQkJVUludDMyIGk7DQorCQkJCWZvciAoaSA9IDA7IGkgPCBCYXNlLmtTdGFydFBvc01vZGVsSW5kZXg7IGkrKykNCisJCQkJCV9kaXN0YW5jZXNQcmljZXNbc3QyICsgaV0gPSBfcG9zU2xvdFByaWNlc1tzdCArIGldOw0KKwkJCQlmb3IgKDsgaSA8IEJhc2Uua051bUZ1bGxEaXN0YW5jZXM7IGkrKykNCisJCQkJCV9kaXN0YW5jZXNQcmljZXNbc3QyICsgaV0gPSBfcG9zU2xvdFByaWNlc1tzdCArIEdldFBvc1Nsb3QoaSldICsgdGVtcFByaWNlc1tpXTsNCisJCQl9DQorCQkJX21hdGNoUHJpY2VDb3VudCA9IDA7DQorCQl9DQorDQorCQl2b2lkIEZpbGxBbGlnblByaWNlcygpDQorCQl7DQorCQkJZm9yIChVSW50MzIgaSA9IDA7IGkgPCBCYXNlLmtBbGlnblRhYmxlU2l6ZTsgaSsrKQ0KKwkJCQlfYWxpZ25QcmljZXNbaV0gPSBfcG9zQWxpZ25FbmNvZGVyLlJldmVyc2VHZXRQcmljZShpKTsNCisJCQlfYWxpZ25QcmljZUNvdW50ID0gMDsNCisJCX0NCisNCisNCisJCXN0YXRpYyBzdHJpbmdbXSBrTWF0Y2hGaW5kZXJJRHMgPSANCisJCXsNCisJCQkiQlQyIiwNCisJCQkiQlQ0IiwNCisJCX07DQorDQorCQlzdGF0aWMgaW50IEZpbmRNYXRjaEZpbmRlcihzdHJpbmcgcykNCisJCXsNCisJCQlmb3IgKGludCBtID0gMDsgbSA8IGtNYXRjaEZpbmRlcklEcy5MZW5ndGg7IG0rKykNCisJCQkJaWYgKHMgPT0ga01hdGNoRmluZGVySURzW21dKQ0KKwkJCQkJcmV0dXJuIG07DQorCQkJcmV0dXJuIC0xOw0KKwkJfQ0KKwkNCisJCXB1YmxpYyB2b2lkIFNldENvZGVyUHJvcGVydGllcyhDb2RlclByb3BJRFtdIHByb3BJRHMsIG9iamVjdFtdIHByb3BlcnRpZXMpDQorCQl7DQorCQkJZm9yIChVSW50MzIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLkxlbmd0aDsgaSsrKQ0KKwkJCXsNCisJCQkJb2JqZWN0IHByb3AgPSBwcm9wZXJ0aWVzW2ldOw0KKwkJCQlzd2l0Y2ggKHByb3BJRHNbaV0pDQorCQkJCXsNCisJCQkJCWNhc2UgQ29kZXJQcm9wSUQuTnVtRmFzdEJ5dGVzOg0KKwkJCQkJew0KKwkJCQkJCWlmICghKHByb3AgaXMgSW50MzIpKQ0KKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZFBhcmFtRXhjZXB0aW9uKCk7DQorCQkJCQkJSW50MzIgbnVtRmFzdEJ5dGVzID0gKEludDMyKXByb3A7DQorCQkJCQkJaWYgKG51bUZhc3RCeXRlcyA8IDUgfHwgbnVtRmFzdEJ5dGVzID4gQmFzZS5rTWF0Y2hNYXhMZW4pDQorCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkUGFyYW1FeGNlcHRpb24oKTsNCisJCQkJCQlfbnVtRmFzdEJ5dGVzID0gKFVJbnQzMiludW1GYXN0Qnl0ZXM7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCQljYXNlIENvZGVyUHJvcElELkFsZ29yaXRobToNCisJCQkJCXsNCisJCQkJCQkvKg0KKwkJCQkJCWlmICghKHByb3AgaXMgSW50MzIpKQ0KKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZFBhcmFtRXhjZXB0aW9uKCk7DQorCQkJCQkJSW50MzIgbWF4aW1pemUgPSAoSW50MzIpcHJvcDsNCisJCQkJCQlfZmFzdE1vZGUgPSAobWF4aW1pemUgPT0gMCk7DQorCQkJCQkJX21heE1vZGUgPSAobWF4aW1pemUgPj0gMik7DQorCQkJCQkJKi8NCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJCWNhc2UgQ29kZXJQcm9wSUQuTWF0Y2hGaW5kZXI6DQorCQkJCQl7DQorCQkJCQkJaWYgKCEocHJvcCBpcyBTdHJpbmcpKQ0KKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZFBhcmFtRXhjZXB0aW9uKCk7DQorCQkJCQkJRU1hdGNoRmluZGVyVHlwZSBtYXRjaEZpbmRlckluZGV4UHJldiA9IF9tYXRjaEZpbmRlclR5cGU7DQorCQkJCQkJaW50IG0gPSBGaW5kTWF0Y2hGaW5kZXIoKChzdHJpbmcpcHJvcCkuVG9VcHBlcigpKTsNCisJCQkJCQlpZiAobSA8IDApDQorCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkUGFyYW1FeGNlcHRpb24oKTsNCisJCQkJCQlfbWF0Y2hGaW5kZXJUeXBlID0gKEVNYXRjaEZpbmRlclR5cGUpbTsNCisJCQkJCQlpZiAoX21hdGNoRmluZGVyICE9IG51bGwgJiYgbWF0Y2hGaW5kZXJJbmRleFByZXYgIT0gX21hdGNoRmluZGVyVHlwZSkNCisJCQkJCQkJew0KKwkJCQkJCQlfZGljdGlvbmFyeVNpemVQcmV2ID0gMHhGRkZGRkZGRjsNCisJCQkJCQkJX21hdGNoRmluZGVyID0gbnVsbDsNCisJCQkJCQkJfQ0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQkJY2FzZSBDb2RlclByb3BJRC5EaWN0aW9uYXJ5U2l6ZToNCisJCQkJCXsNCisJCQkJCQljb25zdCBpbnQga0RpY0xvZ1NpemVNYXhDb21wcmVzcyA9IDMwOw0KKwkJCQkJCWlmICghKHByb3AgaXMgSW50MzIpKQ0KKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZFBhcmFtRXhjZXB0aW9uKCk7IDsNCisJCQkJCQlJbnQzMiBkaWN0aW9uYXJ5U2l6ZSA9IChJbnQzMilwcm9wOw0KKwkJCQkJCWlmIChkaWN0aW9uYXJ5U2l6ZSA8IChVSW50MzIpKDEgPDwgQmFzZS5rRGljTG9nU2l6ZU1pbikgfHwNCisJCQkJCQkJZGljdGlvbmFyeVNpemUgPiAoVUludDMyKSgxIDw8IGtEaWNMb2dTaXplTWF4Q29tcHJlc3MpKQ0KKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZFBhcmFtRXhjZXB0aW9uKCk7DQorCQkJCQkJX2RpY3Rpb25hcnlTaXplID0gKFVJbnQzMilkaWN0aW9uYXJ5U2l6ZTsNCisJCQkJCQlpbnQgZGljTG9nU2l6ZTsNCisJCQkJCQlmb3IgKGRpY0xvZ1NpemUgPSAwOyBkaWNMb2dTaXplIDwgKFVJbnQzMilrRGljTG9nU2l6ZU1heENvbXByZXNzOyBkaWNMb2dTaXplKyspDQorCQkJCQkJCWlmIChkaWN0aW9uYXJ5U2l6ZSA8PSAoKFVJbnQzMikoMSkgPDwgZGljTG9nU2l6ZSkpDQorCQkJCQkJCQlicmVhazsNCisJCQkJCQlfZGlzdFRhYmxlU2l6ZSA9IChVSW50MzIpZGljTG9nU2l6ZSAqIDI7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCQljYXNlIENvZGVyUHJvcElELlBvc1N0YXRlQml0czoNCisJCQkJCXsNCisJCQkJCQlpZiAoIShwcm9wIGlzIEludDMyKSkNCisJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRQYXJhbUV4Y2VwdGlvbigpOw0KKwkJCQkJCUludDMyIHYgPSAoSW50MzIpcHJvcDsNCisJCQkJCQlpZiAodiA8IDAgfHwgdiA+IChVSW50MzIpQmFzZS5rTnVtUG9zU3RhdGVzQml0c0VuY29kaW5nTWF4KQ0KKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZFBhcmFtRXhjZXB0aW9uKCk7DQorCQkJCQkJX3Bvc1N0YXRlQml0cyA9IChpbnQpdjsNCisJCQkJCQlfcG9zU3RhdGVNYXNrID0gKCgoVUludDMyKTEpIDw8IChpbnQpX3Bvc1N0YXRlQml0cykgLSAxOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQkJY2FzZSBDb2RlclByb3BJRC5MaXRQb3NCaXRzOg0KKwkJCQkJew0KKwkJCQkJCWlmICghKHByb3AgaXMgSW50MzIpKQ0KKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZFBhcmFtRXhjZXB0aW9uKCk7DQorCQkJCQkJSW50MzIgdiA9IChJbnQzMilwcm9wOw0KKwkJCQkJCWlmICh2IDwgMCB8fCB2ID4gKFVJbnQzMilCYXNlLmtOdW1MaXRQb3NTdGF0ZXNCaXRzRW5jb2RpbmdNYXgpDQorCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkUGFyYW1FeGNlcHRpb24oKTsNCisJCQkJCQlfbnVtTGl0ZXJhbFBvc1N0YXRlQml0cyA9IChpbnQpdjsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJCWNhc2UgQ29kZXJQcm9wSUQuTGl0Q29udGV4dEJpdHM6DQorCQkJCQl7DQorCQkJCQkJaWYgKCEocHJvcCBpcyBJbnQzMikpDQorCQkJCQkJCXRocm93IG5ldyBJbnZhbGlkUGFyYW1FeGNlcHRpb24oKTsNCisJCQkJCQlJbnQzMiB2ID0gKEludDMyKXByb3A7DQorCQkJCQkJaWYgKHYgPCAwIHx8IHYgPiAoVUludDMyKUJhc2Uua051bUxpdENvbnRleHRCaXRzTWF4KQ0KKwkJCQkJCQl0aHJvdyBuZXcgSW52YWxpZFBhcmFtRXhjZXB0aW9uKCk7IDsNCisJCQkJCQlfbnVtTGl0ZXJhbENvbnRleHRCaXRzID0gKGludCl2Ow0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQkJY2FzZSBDb2RlclByb3BJRC5FbmRNYXJrZXI6DQorCQkJCQl7DQorCQkJCQkJaWYgKCEocHJvcCBpcyBCb29sZWFuKSkNCisJCQkJCQkJdGhyb3cgbmV3IEludmFsaWRQYXJhbUV4Y2VwdGlvbigpOw0KKwkJCQkJCVNldFdyaXRlRW5kTWFya2VyTW9kZSgoQm9vbGVhbilwcm9wKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJCWRlZmF1bHQ6DQorCQkJCQkJdGhyb3cgbmV3IEludmFsaWRQYXJhbUV4Y2VwdGlvbigpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKw0KKwkJdWludCBfdHJhaW5TaXplID0gMDsNCisJCXB1YmxpYyB2b2lkIFNldFRyYWluU2l6ZSh1aW50IHRyYWluU2l6ZSkNCisJCXsNCisJCQlfdHJhaW5TaXplID0gdHJhaW5TaXplOw0KKwkJfQ0KKwkJDQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUy83emlwL0NvbXByZXNzL0x6bWFBbG9uZS9Mem1hQWxvbmUuY3MgYi9sem1hL0NTLzd6aXAvQ29tcHJlc3MvTHptYUFsb25lL0x6bWFBbG9uZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWE0NDYyCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUy83emlwL0NvbXByZXNzL0x6bWFBbG9uZS9Mem1hQWxvbmUuY3MKQEAgLTAsMCArMSwzNjQgQEAKK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uSU87DQorbmFtZXNwYWNlIFNldmVuWmlwDQorew0KKwl1c2luZyBDb21tYW5kTGluZVBhcnNlcjsNCisJDQorCXB1YmxpYyBjbGFzcyBDRG91YmxlU3RyZWFtOiBTdHJlYW0NCisJew0KKwkJcHVibGljIFN5c3RlbS5JTy5TdHJlYW0gczE7DQorCQlwdWJsaWMgU3lzdGVtLklPLlN0cmVhbSBzMjsNCisJCXB1YmxpYyBpbnQgZmlsZUluZGV4Ow0KKwkJcHVibGljIGxvbmcgc2tpcFNpemU7DQorCQkNCisJCXB1YmxpYyBvdmVycmlkZSBib29sIENhblJlYWQgeyBnZXQgeyByZXR1cm4gdHJ1ZTsgfX0NCisJCXB1YmxpYyBvdmVycmlkZSBib29sIENhbldyaXRlIHsgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9fQ0KKwkJcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuU2VlayB7IGdldCB7IHJldHVybiBmYWxzZTsgfX0NCisJCXB1YmxpYyBvdmVycmlkZSBsb25nIExlbmd0aCB7IGdldCB7IHJldHVybiBzMS5MZW5ndGggKyBzMi5MZW5ndGggLSBza2lwU2l6ZTsgfSB9DQorCQlwdWJsaWMgb3ZlcnJpZGUgbG9uZyBQb3NpdGlvbg0KKwkJew0KKwkJCWdldCB7IHJldHVybiAwOwl9DQorCQkJc2V0IHsgfQ0KKwkJfQ0KKwkJcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKSB7IH0NCisJCXB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIA0KKwkJew0KKwkJCWludCBudW1Ub3RhbCA9IDA7DQorCQkJd2hpbGUgKGNvdW50ID4gMCkNCisJCQl7DQorCQkJCWlmIChmaWxlSW5kZXggPT0gMCkNCisJCQkJew0KKwkJCQkJaW50IG51bSA9IHMxLlJlYWQoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsNCisJCQkJCW9mZnNldCArPSBudW07DQorCQkJCQljb3VudCAtPSBudW07DQorCQkJCQludW1Ub3RhbCArPSBudW07DQorCQkJCQlpZiAobnVtID09IDApDQorCQkJCQkJZmlsZUluZGV4Kys7DQorCQkJCX0NCisJCQkJaWYgKGZpbGVJbmRleCA9PSAxKQ0KKwkJCQl7DQorCQkJCQludW1Ub3RhbCArPSBzMi5SZWFkKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7DQorCQkJCQlyZXR1cm4gbnVtVG90YWw7DQorCQkJCX0NCisJCQl9DQorCQkJcmV0dXJuIG51bVRvdGFsOw0KKwkJfQ0KKwkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KKwkJew0KKwkJCXRocm93IChuZXcgRXhjZXB0aW9uKCJjYW4ndCBXcml0ZSIpKTsNCisJCX0NCisJCXB1YmxpYyBvdmVycmlkZSBsb25nIFNlZWsobG9uZyBvZmZzZXQsIFN5c3RlbS5JTy5TZWVrT3JpZ2luIG9yaWdpbikNCisJCXsNCisJCQl0aHJvdyAobmV3IEV4Y2VwdGlvbigiY2FuJ3QgU2VlayIpKTsNCisJCX0NCisJCXB1YmxpYyBvdmVycmlkZSB2b2lkIFNldExlbmd0aChsb25nIHZhbHVlKQ0KKwkJew0KKwkJCXRocm93IChuZXcgRXhjZXB0aW9uKCJjYW4ndCBTZXRMZW5ndGgiKSk7DQorCQl9DQorCX0NCisJDQorCWNsYXNzIEx6bWFBbG9uZQ0KKwl7DQorCQllbnVtIEtleQ0KKwkJew0KKwkJCUhlbHAxID0gMCwNCisJCQlIZWxwMiwNCisJCQlNb2RlLA0KKwkJCURpY3Rpb25hcnksDQorCQkJRmFzdEJ5dGVzLA0KKwkJCUxpdENvbnRleHQsDQorCQkJTGl0UG9zLA0KKwkJCVBvc0JpdHMsDQorCQkJTWF0Y2hGaW5kZXIsDQorCQkJRU9TLA0KKwkJCVN0ZEluLA0KKwkJCVN0ZE91dCwNCisJCQlUcmFpbg0KKwkJfTsNCisNCisJCXN0YXRpYyB2b2lkIFByaW50SGVscCgpDQorCQl7DQorCQkJU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKCJcblVzYWdlOiAgTFpNQSA8ZXxkPiBbPHN3aXRjaGVzPi4uLl0gaW5wdXRGaWxlIG91dHB1dEZpbGVcbiIgKw0KKwkJCQkiICBlOiBlbmNvZGUgZmlsZVxuIiArDQorCQkJCSIgIGQ6IGRlY29kZSBmaWxlXG4iICsNCisJCQkJIiAgYjogQmVuY2htYXJrXG4iICsNCisJCQkJIjxTd2l0Y2hlcz5cbiIgKw0KKwkJCQkvLyAiICAtYXtOfTogIHNldCBjb21wcmVzc2lvbiBtb2RlIC0gWzAsIDFdLCBkZWZhdWx0OiAxIChtYXgpXG4iICsNCisJCQkJIiAgLWR7Tn06ICBzZXQgZGljdGlvbmFyeSAtIFswLCAyOV0sIGRlZmF1bHQ6IDIzICg4TUIpXG4iICsNCisJCQkJIiAgLWZie059OiBzZXQgbnVtYmVyIG9mIGZhc3QgYnl0ZXMgLSBbNSwgMjczXSwgZGVmYXVsdDogMTI4XG4iICsNCisJCQkJIiAgLWxje059OiBzZXQgbnVtYmVyIG9mIGxpdGVyYWwgY29udGV4dCBiaXRzIC0gWzAsIDhdLCBkZWZhdWx0OiAzXG4iICsNCisJCQkJIiAgLWxwe059OiBzZXQgbnVtYmVyIG9mIGxpdGVyYWwgcG9zIGJpdHMgLSBbMCwgNF0sIGRlZmF1bHQ6IDBcbiIgKw0KKwkJCQkiICAtcGJ7Tn06IHNldCBudW1iZXIgb2YgcG9zIGJpdHMgLSBbMCwgNF0sIGRlZmF1bHQ6IDJcbiIgKw0KKwkJCQkiICAtbWZ7TUZfSUR9OiBzZXQgTWF0Y2ggRmluZGVyOiBbYnQyLCBidDRdLCBkZWZhdWx0OiBidDRcbiIgKw0KKwkJCQkiICAtZW9zOiAgIHdyaXRlIEVuZCBPZiBTdHJlYW0gbWFya2VyXG4iDQorCQkJCS8vICsgIiAgLXNpOiAgICByZWFkIGRhdGEgZnJvbSBzdGRpblxuIg0KKwkJCQkvLyArICIgIC1zbzogICAgd3JpdGUgZGF0YSB0byBzdGRvdXRcbiINCisJCQkJKTsNCisJCX0NCisNCisJCXN0YXRpYyBib29sIEdldE51bWJlcihzdHJpbmcgcywgb3V0IEludDMyIHYpDQorCQl7DQorCQkJdiA9IDA7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLkxlbmd0aDsgaSsrKQ0KKwkJCXsNCisJCQkJY2hhciBjID0gc1tpXTsNCisJCQkJaWYgKGMgPCAnMCcgfHwgYyA+ICc5JykNCisJCQkJCXJldHVybiBmYWxzZTsNCisJCQkJdiAqPSAxMDsNCisJCQkJdiArPSAoSW50MzIpKGMgLSAnMCcpOw0KKwkJCX0NCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisNCisJCXN0YXRpYyBpbnQgSW5jb3JyZWN0Q29tbWFuZCgpDQorCQl7DQorCQkJdGhyb3cgKG5ldyBFeGNlcHRpb24oIkNvbW1hbmQgbGluZSBlcnJvciIpKTsNCisJCQkvLyBTeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoIlxuQ29tbWFuZCBsaW5lIGVycm9yXG4iKTsNCisJCQkvLyByZXR1cm4gMTsNCisJCX0NCisJCXN0YXRpYyBpbnQgTWFpbjIoc3RyaW5nW10gYXJncykNCisJCXsNCisJCQlTeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoIlxuTFpNQSMgNC42MSAgMjAwOC0xMS0yM1xuIik7DQorDQorCQkJaWYgKGFyZ3MuTGVuZ3RoID09IDApDQorCQkJew0KKwkJCQlQcmludEhlbHAoKTsNCisJCQkJcmV0dXJuIDA7DQorCQkJfQ0KKw0KKwkJCVN3aXRjaEZvcm1bXSBrU3dpdGNoRm9ybXMgPSBuZXcgU3dpdGNoRm9ybVsxM107DQorCQkJaW50IHN3ID0gMDsNCisJCQlrU3dpdGNoRm9ybXNbc3crK10gPSBuZXcgU3dpdGNoRm9ybSgiPyIsIFN3aXRjaFR5cGUuU2ltcGxlLCBmYWxzZSk7DQorCQkJa1N3aXRjaEZvcm1zW3N3KytdID0gbmV3IFN3aXRjaEZvcm0oIkgiLCBTd2l0Y2hUeXBlLlNpbXBsZSwgZmFsc2UpOw0KKwkJCWtTd2l0Y2hGb3Jtc1tzdysrXSA9IG5ldyBTd2l0Y2hGb3JtKCJBIiwgU3dpdGNoVHlwZS5VbkxpbWl0ZWRQb3N0U3RyaW5nLCBmYWxzZSwgMSk7DQorCQkJa1N3aXRjaEZvcm1zW3N3KytdID0gbmV3IFN3aXRjaEZvcm0oIkQiLCBTd2l0Y2hUeXBlLlVuTGltaXRlZFBvc3RTdHJpbmcsIGZhbHNlLCAxKTsNCisJCQlrU3dpdGNoRm9ybXNbc3crK10gPSBuZXcgU3dpdGNoRm9ybSgiRkIiLCBTd2l0Y2hUeXBlLlVuTGltaXRlZFBvc3RTdHJpbmcsIGZhbHNlLCAxKTsNCisJCQlrU3dpdGNoRm9ybXNbc3crK10gPSBuZXcgU3dpdGNoRm9ybSgiTEMiLCBTd2l0Y2hUeXBlLlVuTGltaXRlZFBvc3RTdHJpbmcsIGZhbHNlLCAxKTsNCisJCQlrU3dpdGNoRm9ybXNbc3crK10gPSBuZXcgU3dpdGNoRm9ybSgiTFAiLCBTd2l0Y2hUeXBlLlVuTGltaXRlZFBvc3RTdHJpbmcsIGZhbHNlLCAxKTsNCisJCQlrU3dpdGNoRm9ybXNbc3crK10gPSBuZXcgU3dpdGNoRm9ybSgiUEIiLCBTd2l0Y2hUeXBlLlVuTGltaXRlZFBvc3RTdHJpbmcsIGZhbHNlLCAxKTsNCisJCQlrU3dpdGNoRm9ybXNbc3crK10gPSBuZXcgU3dpdGNoRm9ybSgiTUYiLCBTd2l0Y2hUeXBlLlVuTGltaXRlZFBvc3RTdHJpbmcsIGZhbHNlLCAxKTsNCisJCQlrU3dpdGNoRm9ybXNbc3crK10gPSBuZXcgU3dpdGNoRm9ybSgiRU9TIiwgU3dpdGNoVHlwZS5TaW1wbGUsIGZhbHNlKTsNCisJCQlrU3dpdGNoRm9ybXNbc3crK10gPSBuZXcgU3dpdGNoRm9ybSgiU0kiLCBTd2l0Y2hUeXBlLlNpbXBsZSwgZmFsc2UpOw0KKwkJCWtTd2l0Y2hGb3Jtc1tzdysrXSA9IG5ldyBTd2l0Y2hGb3JtKCJTTyIsIFN3aXRjaFR5cGUuU2ltcGxlLCBmYWxzZSk7DQorCQkJa1N3aXRjaEZvcm1zW3N3KytdID0gbmV3IFN3aXRjaEZvcm0oIlQiLCBTd2l0Y2hUeXBlLlVuTGltaXRlZFBvc3RTdHJpbmcsIGZhbHNlLCAxKTsNCisNCisNCisJCQlQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcihzdyk7DQorCQkJdHJ5DQorCQkJew0KKwkJCQlwYXJzZXIuUGFyc2VTdHJpbmdzKGtTd2l0Y2hGb3JtcywgYXJncyk7DQorCQkJfQ0KKwkJCWNhdGNoDQorCQkJew0KKwkJCQlyZXR1cm4gSW5jb3JyZWN0Q29tbWFuZCgpOw0KKwkJCX0NCisNCisJCQlpZiAocGFyc2VyWyhpbnQpS2V5LkhlbHAxXS5UaGVyZUlzIHx8IHBhcnNlclsoaW50KUtleS5IZWxwMl0uVGhlcmVJcykNCisJCQl7DQorCQkJCVByaW50SGVscCgpOw0KKwkJCQlyZXR1cm4gMDsNCisJCQl9DQorDQorCQkJU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdCBub25Td2l0Y2hTdHJpbmdzID0gcGFyc2VyLk5vblN3aXRjaFN0cmluZ3M7DQorDQorCQkJaW50IHBhcmFtSW5kZXggPSAwOw0KKwkJCWlmIChwYXJhbUluZGV4ID49IG5vblN3aXRjaFN0cmluZ3MuQ291bnQpDQorCQkJCXJldHVybiBJbmNvcnJlY3RDb21tYW5kKCk7DQorCQkJc3RyaW5nIGNvbW1hbmQgPSAoc3RyaW5nKW5vblN3aXRjaFN0cmluZ3NbcGFyYW1JbmRleCsrXTsNCisJCQljb21tYW5kID0gY29tbWFuZC5Ub0xvd2VyKCk7DQorDQorCQkJYm9vbCBkaWN0aW9uYXJ5SXNEZWZpbmVkID0gZmFsc2U7DQorCQkJSW50MzIgZGljdGlvbmFyeSA9IDEgPDwgMjE7DQorCQkJaWYgKHBhcnNlclsoaW50KUtleS5EaWN0aW9uYXJ5XS5UaGVyZUlzKQ0KKwkJCXsNCisJCQkJSW50MzIgZGljTG9nOw0KKwkJCQlpZiAoIUdldE51bWJlcigoc3RyaW5nKXBhcnNlclsoaW50KUtleS5EaWN0aW9uYXJ5XS5Qb3N0U3RyaW5nc1swXSwgb3V0IGRpY0xvZykpDQorCQkJCQlJbmNvcnJlY3RDb21tYW5kKCk7DQorCQkJCWRpY3Rpb25hcnkgPSAoSW50MzIpMSA8PCBkaWNMb2c7DQorCQkJCWRpY3Rpb25hcnlJc0RlZmluZWQgPSB0cnVlOw0KKwkJCX0NCisJCQlzdHJpbmcgbWYgPSAiYnQ0IjsNCisJCQlpZiAocGFyc2VyWyhpbnQpS2V5Lk1hdGNoRmluZGVyXS5UaGVyZUlzKQ0KKwkJCQltZiA9IChzdHJpbmcpcGFyc2VyWyhpbnQpS2V5Lk1hdGNoRmluZGVyXS5Qb3N0U3RyaW5nc1swXTsNCisJCQltZiA9IG1mLlRvTG93ZXIoKTsNCisNCisJCQlpZiAoY29tbWFuZCA9PSAiYiIpDQorCQkJew0KKwkJCQljb25zdCBJbnQzMiBrTnVtRGVmYXVsdEl0ZXJlYXRpb25zID0gMTA7DQorCQkJCUludDMyIG51bUl0ZXJhdGlvbnMgPSBrTnVtRGVmYXVsdEl0ZXJlYXRpb25zOw0KKwkJCQlpZiAocGFyYW1JbmRleCA8IG5vblN3aXRjaFN0cmluZ3MuQ291bnQpDQorCQkJCQlpZiAoIUdldE51bWJlcigoc3RyaW5nKW5vblN3aXRjaFN0cmluZ3NbcGFyYW1JbmRleCsrXSwgb3V0IG51bUl0ZXJhdGlvbnMpKQ0KKwkJCQkJCW51bUl0ZXJhdGlvbnMgPSBrTnVtRGVmYXVsdEl0ZXJlYXRpb25zOw0KKwkJCQlyZXR1cm4gTHptYUJlbmNoLkx6bWFCZW5jaG1hcmsobnVtSXRlcmF0aW9ucywgKFVJbnQzMilkaWN0aW9uYXJ5KTsNCisJCQl9DQorDQorCQkJc3RyaW5nIHRyYWluID0gIiI7DQorCQkJaWYgKHBhcnNlclsoaW50KUtleS5UcmFpbl0uVGhlcmVJcykNCisJCQkJdHJhaW4gPSAoc3RyaW5nKXBhcnNlclsoaW50KUtleS5UcmFpbl0uUG9zdFN0cmluZ3NbMF07DQorDQorCQkJYm9vbCBlbmNvZGVNb2RlID0gZmFsc2U7DQorCQkJaWYgKGNvbW1hbmQgPT0gImUiKQ0KKwkJCQllbmNvZGVNb2RlID0gdHJ1ZTsNCisJCQllbHNlIGlmIChjb21tYW5kID09ICJkIikNCisJCQkJZW5jb2RlTW9kZSA9IGZhbHNlOw0KKwkJCWVsc2UNCisJCQkJSW5jb3JyZWN0Q29tbWFuZCgpOw0KKw0KKwkJCWJvb2wgc3RkSW5Nb2RlID0gcGFyc2VyWyhpbnQpS2V5LlN0ZEluXS5UaGVyZUlzOw0KKwkJCWJvb2wgc3RkT3V0TW9kZSA9IHBhcnNlclsoaW50KUtleS5TdGRPdXRdLlRoZXJlSXM7DQorDQorCQkJU3RyZWFtIGluU3RyZWFtID0gbnVsbDsNCisJCQlpZiAoc3RkSW5Nb2RlKQ0KKwkJCXsNCisJCQkJdGhyb3cgKG5ldyBFeGNlcHRpb24oIk5vdCBpbXBsZW1ldGVkIikpOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlpZiAocGFyYW1JbmRleCA+PSBub25Td2l0Y2hTdHJpbmdzLkNvdW50KQ0KKwkJCQkJSW5jb3JyZWN0Q29tbWFuZCgpOw0KKwkJCQlzdHJpbmcgaW5wdXROYW1lID0gKHN0cmluZylub25Td2l0Y2hTdHJpbmdzW3BhcmFtSW5kZXgrK107DQorCQkJCWluU3RyZWFtID0gbmV3IEZpbGVTdHJlYW0oaW5wdXROYW1lLCBGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWQpOw0KKwkJCX0NCisNCisJCQlGaWxlU3RyZWFtIG91dFN0cmVhbSA9IG51bGw7DQorCQkJaWYgKHN0ZE91dE1vZGUpDQorCQkJew0KKwkJCQl0aHJvdyAobmV3IEV4Y2VwdGlvbigiTm90IGltcGxlbWV0ZWQiKSk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCWlmIChwYXJhbUluZGV4ID49IG5vblN3aXRjaFN0cmluZ3MuQ291bnQpDQorCQkJCQlJbmNvcnJlY3RDb21tYW5kKCk7DQorCQkJCXN0cmluZyBvdXRwdXROYW1lID0gKHN0cmluZylub25Td2l0Y2hTdHJpbmdzW3BhcmFtSW5kZXgrK107DQorCQkJCW91dFN0cmVhbSA9IG5ldyBGaWxlU3RyZWFtKG91dHB1dE5hbWUsIEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSk7DQorCQkJfQ0KKw0KKwkJCUZpbGVTdHJlYW0gdHJhaW5TdHJlYW0gPSBudWxsOw0KKwkJCWlmICh0cmFpbi5MZW5ndGggIT0gMCkNCisJCQkJdHJhaW5TdHJlYW0gPSBuZXcgRmlsZVN0cmVhbSh0cmFpbiwgRmlsZU1vZGUuT3BlbiwgRmlsZUFjY2Vzcy5SZWFkKTsNCisNCisJCQlpZiAoZW5jb2RlTW9kZSkNCisJCQl7DQorCQkJCWlmICghZGljdGlvbmFyeUlzRGVmaW5lZCkNCisJCQkJCWRpY3Rpb25hcnkgPSAxIDw8IDIzOw0KKw0KKwkJCQlJbnQzMiBwb3NTdGF0ZUJpdHMgPSAyOw0KKwkJCQlJbnQzMiBsaXRDb250ZXh0Qml0cyA9IDM7IC8vIGZvciBub3JtYWwgZmlsZXMNCisJCQkJLy8gVUludDMyIGxpdENvbnRleHRCaXRzID0gMDsgLy8gZm9yIDMyLWJpdCBkYXRhDQorCQkJCUludDMyIGxpdFBvc0JpdHMgPSAwOw0KKwkJCQkvLyBVSW50MzIgbGl0UG9zQml0cyA9IDI7IC8vIGZvciAzMi1iaXQgZGF0YQ0KKwkJCQlJbnQzMiBhbGdvcml0aG0gPSAyOw0KKwkJCQlJbnQzMiBudW1GYXN0Qnl0ZXMgPSAxMjg7DQorDQorCQkJCWJvb2wgZW9zID0gcGFyc2VyWyhpbnQpS2V5LkVPU10uVGhlcmVJcyB8fCBzdGRJbk1vZGU7DQorDQorCQkJCWlmIChwYXJzZXJbKGludClLZXkuTW9kZV0uVGhlcmVJcykNCisJCQkJCWlmICghR2V0TnVtYmVyKChzdHJpbmcpcGFyc2VyWyhpbnQpS2V5Lk1vZGVdLlBvc3RTdHJpbmdzWzBdLCBvdXQgYWxnb3JpdGhtKSkNCisJCQkJCQlJbmNvcnJlY3RDb21tYW5kKCk7DQorDQorCQkJCWlmIChwYXJzZXJbKGludClLZXkuRmFzdEJ5dGVzXS5UaGVyZUlzKQ0KKwkJCQkJaWYgKCFHZXROdW1iZXIoKHN0cmluZylwYXJzZXJbKGludClLZXkuRmFzdEJ5dGVzXS5Qb3N0U3RyaW5nc1swXSwgb3V0IG51bUZhc3RCeXRlcykpDQorCQkJCQkJSW5jb3JyZWN0Q29tbWFuZCgpOw0KKwkJCQlpZiAocGFyc2VyWyhpbnQpS2V5LkxpdENvbnRleHRdLlRoZXJlSXMpDQorCQkJCQlpZiAoIUdldE51bWJlcigoc3RyaW5nKXBhcnNlclsoaW50KUtleS5MaXRDb250ZXh0XS5Qb3N0U3RyaW5nc1swXSwgb3V0IGxpdENvbnRleHRCaXRzKSkNCisJCQkJCQlJbmNvcnJlY3RDb21tYW5kKCk7DQorCQkJCWlmIChwYXJzZXJbKGludClLZXkuTGl0UG9zXS5UaGVyZUlzKQ0KKwkJCQkJaWYgKCFHZXROdW1iZXIoKHN0cmluZylwYXJzZXJbKGludClLZXkuTGl0UG9zXS5Qb3N0U3RyaW5nc1swXSwgb3V0IGxpdFBvc0JpdHMpKQ0KKwkJCQkJCUluY29ycmVjdENvbW1hbmQoKTsNCisJCQkJaWYgKHBhcnNlclsoaW50KUtleS5Qb3NCaXRzXS5UaGVyZUlzKQ0KKwkJCQkJaWYgKCFHZXROdW1iZXIoKHN0cmluZylwYXJzZXJbKGludClLZXkuUG9zQml0c10uUG9zdFN0cmluZ3NbMF0sIG91dCBwb3NTdGF0ZUJpdHMpKQ0KKwkJCQkJCUluY29ycmVjdENvbW1hbmQoKTsNCisNCisJCQkJQ29kZXJQcm9wSURbXSBwcm9wSURzID0gDQorCQkJCXsNCisJCQkJCUNvZGVyUHJvcElELkRpY3Rpb25hcnlTaXplLA0KKwkJCQkJQ29kZXJQcm9wSUQuUG9zU3RhdGVCaXRzLA0KKwkJCQkJQ29kZXJQcm9wSUQuTGl0Q29udGV4dEJpdHMsDQorCQkJCQlDb2RlclByb3BJRC5MaXRQb3NCaXRzLA0KKwkJCQkJQ29kZXJQcm9wSUQuQWxnb3JpdGhtLA0KKwkJCQkJQ29kZXJQcm9wSUQuTnVtRmFzdEJ5dGVzLA0KKwkJCQkJQ29kZXJQcm9wSUQuTWF0Y2hGaW5kZXIsDQorCQkJCQlDb2RlclByb3BJRC5FbmRNYXJrZXINCisJCQkJfTsNCisJCQkJb2JqZWN0W10gcHJvcGVydGllcyA9IA0KKwkJCQl7DQorCQkJCQkoSW50MzIpKGRpY3Rpb25hcnkpLA0KKwkJCQkJKEludDMyKShwb3NTdGF0ZUJpdHMpLA0KKwkJCQkJKEludDMyKShsaXRDb250ZXh0Qml0cyksDQorCQkJCQkoSW50MzIpKGxpdFBvc0JpdHMpLA0KKwkJCQkJKEludDMyKShhbGdvcml0aG0pLA0KKwkJCQkJKEludDMyKShudW1GYXN0Qnl0ZXMpLA0KKwkJCQkJbWYsDQorCQkJCQllb3MNCisJCQkJfTsNCisNCisJCQkJQ29tcHJlc3Npb24uTFpNQS5FbmNvZGVyIGVuY29kZXIgPSBuZXcgQ29tcHJlc3Npb24uTFpNQS5FbmNvZGVyKCk7DQorCQkJCWVuY29kZXIuU2V0Q29kZXJQcm9wZXJ0aWVzKHByb3BJRHMsIHByb3BlcnRpZXMpOw0KKwkJCQllbmNvZGVyLldyaXRlQ29kZXJQcm9wZXJ0aWVzKG91dFN0cmVhbSk7DQorCQkJCUludDY0IGZpbGVTaXplOw0KKwkJCQlpZiAoZW9zIHx8IHN0ZEluTW9kZSkNCisJCQkJCWZpbGVTaXplID0gLTE7DQorCQkJCWVsc2UNCisJCQkJCWZpbGVTaXplID0gaW5TdHJlYW0uTGVuZ3RoOw0KKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykNCisJCQkJCW91dFN0cmVhbS5Xcml0ZUJ5dGUoKEJ5dGUpKGZpbGVTaXplID4+ICg4ICogaSkpKTsNCisJCQkJaWYgKHRyYWluU3RyZWFtICE9IG51bGwpDQorCQkJCXsNCisJCQkJCUNEb3VibGVTdHJlYW0gZG91YmxlU3RyZWFtID0gbmV3IENEb3VibGVTdHJlYW0oKTsNCisJCQkJCWRvdWJsZVN0cmVhbS5zMSA9IHRyYWluU3RyZWFtOw0KKwkJCQkJZG91YmxlU3RyZWFtLnMyID0gaW5TdHJlYW07DQorCQkJCQlkb3VibGVTdHJlYW0uZmlsZUluZGV4ID0gMDsNCisJCQkJCWluU3RyZWFtID0gZG91YmxlU3RyZWFtOw0KKwkJCQkJbG9uZyB0cmFpbkZpbGVTaXplID0gdHJhaW5TdHJlYW0uTGVuZ3RoOw0KKwkJCQkJZG91YmxlU3RyZWFtLnNraXBTaXplID0gMDsNCisJCQkJCWlmICh0cmFpbkZpbGVTaXplID4gZGljdGlvbmFyeSkNCisJCQkJCQlkb3VibGVTdHJlYW0uc2tpcFNpemUgPSB0cmFpbkZpbGVTaXplIC0gZGljdGlvbmFyeTsNCisJCQkJCXRyYWluU3RyZWFtLlNlZWsoZG91YmxlU3RyZWFtLnNraXBTaXplLCBTZWVrT3JpZ2luLkJlZ2luKTsNCisJCQkJCWVuY29kZXIuU2V0VHJhaW5TaXplKCh1aW50KSh0cmFpbkZpbGVTaXplIC0gZG91YmxlU3RyZWFtLnNraXBTaXplKSk7DQorCQkJCX0NCisJCQkJZW5jb2Rlci5Db2RlKGluU3RyZWFtLCBvdXRTdHJlYW0sIC0xLCAtMSwgbnVsbCk7DQorCQkJfQ0KKwkJCWVsc2UgaWYgKGNvbW1hbmQgPT0gImQiKQ0KKwkJCXsNCisJCQkJYnl0ZVtdIHByb3BlcnRpZXMgPSBuZXcgYnl0ZVs1XTsNCisJCQkJaWYgKGluU3RyZWFtLlJlYWQocHJvcGVydGllcywgMCwgNSkgIT0gNSkNCisJCQkJCXRocm93IChuZXcgRXhjZXB0aW9uKCJpbnB1dCAubHptYSBpcyB0b28gc2hvcnQiKSk7DQorCQkJCUNvbXByZXNzaW9uLkxaTUEuRGVjb2RlciBkZWNvZGVyID0gbmV3IENvbXByZXNzaW9uLkxaTUEuRGVjb2RlcigpOw0KKwkJCQlkZWNvZGVyLlNldERlY29kZXJQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOw0KKwkJCQlpZiAodHJhaW5TdHJlYW0gIT0gbnVsbCkNCisJCQkJew0KKwkJCQkJaWYgKCFkZWNvZGVyLlRyYWluKHRyYWluU3RyZWFtKSkNCisJCQkJCQl0aHJvdyAobmV3IEV4Y2VwdGlvbigiY2FuJ3QgdHJhaW4iKSk7DQorCQkJCX0NCisJCQkJbG9uZyBvdXRTaXplID0gMDsNCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspDQorCQkJCXsNCisJCQkJCWludCB2ID0gaW5TdHJlYW0uUmVhZEJ5dGUoKTsNCisJCQkJCWlmICh2IDwgMCkNCisJCQkJCQl0aHJvdyAobmV3IEV4Y2VwdGlvbigiQ2FuJ3QgUmVhZCAxIikpOw0KKwkJCQkJb3V0U2l6ZSB8PSAoKGxvbmcpKGJ5dGUpdikgPDwgKDggKiBpKTsNCisJCQkJfQ0KKwkJCQlsb25nIGNvbXByZXNzZWRTaXplID0gaW5TdHJlYW0uTGVuZ3RoIC0gaW5TdHJlYW0uUG9zaXRpb247DQorCQkJCWRlY29kZXIuQ29kZShpblN0cmVhbSwgb3V0U3RyZWFtLCBjb21wcmVzc2VkU2l6ZSwgb3V0U2l6ZSwgbnVsbCk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQkJdGhyb3cgKG5ldyBFeGNlcHRpb24oIkNvbW1hbmQgRXJyb3IiKSk7DQorCQkJcmV0dXJuIDA7DQorCQl9DQorDQorCQlbU1RBVGhyZWFkXQ0KKwkJc3RhdGljIGludCBNYWluKHN0cmluZ1tdIGFyZ3MpDQorCQl7DQorCQkJdHJ5DQorCQkJew0KKwkJCQlyZXR1cm4gTWFpbjIoYXJncyk7DQorCQkJfQ0KKwkJCWNhdGNoIChFeGNlcHRpb24gZSkNCisJCQl7DQorCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ7MH0gQ2F1Z2h0IGV4Y2VwdGlvbiAjMS4iLCBlKTsNCisJCQkJLy8gdGhyb3cgZTsNCisJCQkJcmV0dXJuIDE7DQorCQkJfQ0KKwkJfQ0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9Mem1hQWxvbmUvTHptYUFsb25lLmNzcHJvaiBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9Mem1hQWxvbmUvTHptYUFsb25lLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWI3MDczCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUy83emlwL0NvbXByZXNzL0x6bWFBbG9uZS9Mem1hQWxvbmUuY3Nwcm9qCkBAIC0wLDAgKzEsOTAgQEAKK++7vzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjguMC41MDcyNzwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntDRTMzREYxOC1GOUM4LTRENkYtOTA1Ny1EQkI0REI5NkU5NzN9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5Mem1hQWxvbmU8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxBc3NlbWJseU5hbWU+THptYSM8L0Fzc2VtYmx5TmFtZT4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD4uXGJpblxEZWJ1Z1w8L091dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxEZWJ1Z1N5bWJvbHM+ZmFsc2U8L0RlYnVnU3ltYm9scz4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD4uXGJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8UGxhdGZvcm1UYXJnZXQ+QW55Q1BVPC9QbGF0Zm9ybVRhcmdldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXENvbW1vblxDb21tYW5kTGluZVBhcnNlci5jcyI+DQorICAgICAgPExpbms+Q29tbW9uXENvbW1hbmRMaW5lUGFyc2VyLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXC4uXENvbW1vblxDUkMuY3MiPg0KKyAgICAgIDxMaW5rPkNvbW1vblxDUkMuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cSUNvZGVyLmNzIj4NCisgICAgICA8TGluaz5JQ29kZXIuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cTFpcSU1hdGNoRmluZGVyLmNzIj4NCisgICAgICA8TGluaz5MWlxJTWF0Y2hGaW5kZXIuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cTFpcTHpCaW5UcmVlLmNzIj4NCisgICAgICA8TGluaz5MWlxMekJpblRyZWUuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cTFpcTHpJbldpbmRvdy5jcyI+DQorICAgICAgPExpbms+TFpcTHpJbldpbmRvdy5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxMWlxMek91dFdpbmRvdy5jcyI+DQorICAgICAgPExpbms+TFpcTHpPdXRXaW5kb3cuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cTFpNQVxMem1hQmFzZS5jcyI+DQorICAgICAgPExpbms+TFpNQVxMem1hQmFzZS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxMWk1BXEx6bWFEZWNvZGVyLmNzIj4NCisgICAgICA8TGluaz5MWk1BXEx6bWFEZWNvZGVyLmNzPC9MaW5rPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXExaTUFcTHptYUVuY29kZXIuY3MiPg0KKyAgICAgIDxMaW5rPkxaTUFcTHptYUVuY29kZXIuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUmFuZ2VDb2RlclxSYW5nZUNvZGVyLmNzIj4NCisgICAgICA8TGluaz5SYW5nZUNvZGVyXFJhbmdlQ29kZXIuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUmFuZ2VDb2RlclxSYW5nZUNvZGVyQml0LmNzIj4NCisgICAgICA8TGluaz5SYW5nZUNvZGVyXFJhbmdlQ29kZXJCaXQuY3M8L0xpbms+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cUmFuZ2VDb2RlclxSYW5nZUNvZGVyQml0VHJlZS5jcyI+DQorICAgICAgPExpbms+UmFuZ2VDb2RlclxSYW5nZUNvZGVyQml0VHJlZS5jczwvTGluaz4NCisgICAgPC9Db21waWxlPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJMem1hQWxvbmUuY3MiPg0KKyAgICAgIDxTdWJUeXBlPkNvZGU8L1N1YlR5cGU+DQorICAgIDwvQ29tcGlsZT4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iTHptYUJlbmNoLmNzIj4NCisgICAgICA8U3ViVHlwZT5Db2RlPC9TdWJUeXBlPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXFNldHRpbmdzLmNzIj4NCisgICAgICA8QXV0b0dlbj5UcnVlPC9BdXRvR2VuPg0KKyAgICAgIDxEZXBlbmRlbnRVcG9uPlNldHRpbmdzLnNldHRpbmdzPC9EZXBlbmRlbnRVcG9uPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxOb25lIEluY2x1ZGU9IlByb3BlcnRpZXNcU2V0dGluZ3Muc2V0dGluZ3MiPg0KKyAgICAgIDxHZW5lcmF0b3I+U2V0dGluZ3NTaW5nbGVGaWxlR2VuZXJhdG9yPC9HZW5lcmF0b3I+DQorICAgICAgPExhc3RHZW5PdXRwdXQ+U2V0dGluZ3MuY3M8L0xhc3RHZW5PdXRwdXQ+DQorICAgIDwvTm9uZT4NCisgICAgPEFwcERlc2lnbmVyIEluY2x1ZGU9IlByb3BlcnRpZXNcIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU0hBUlAuVGFyZ2V0cyIgLz4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbHptYS9DUy83emlwL0NvbXByZXNzL0x6bWFBbG9uZS9Mem1hQWxvbmUuc2xuIGIvbHptYS9DUy83emlwL0NvbXByZXNzL0x6bWFBbG9uZS9Mem1hQWxvbmUuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NmVlM2UKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0NTLzd6aXAvQ29tcHJlc3MvTHptYUFsb25lL0x6bWFBbG9uZS5zbG4KQEAgLTAsMCArMSwyMCBAQAor77u/DQorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOS4wMA0KKyMgVmlzdWFsIEMjIEV4cHJlc3MgMjAwNQ0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiTHptYUFsb25lIiwgIkx6bWFBbG9uZS5jc3Byb2oiLCAie0NFMzNERjE4LUY5QzgtNEQ2Ri05MDU3LURCQjREQjk2RTk3M30iDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUNCisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQorCQl7Q0UzM0RGMTgtRjlDOC00RDZGLTkwNTctREJCNERCOTZFOTczfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtDRTMzREYxOC1GOUM4LTRENkYtOTA1Ny1EQkI0REI5NkU5NzN9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXtDRTMzREYxOC1GOUM4LTRENkYtOTA1Ny1EQkI0REI5NkU5NzN9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtDRTMzREYxOC1GOUM4LTRENkYtOTA1Ny1EQkI0REI5NkU5NzN9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvbHptYS9DUy83emlwL0NvbXByZXNzL0x6bWFBbG9uZS9Mem1hQmVuY2guY3MgYi9sem1hL0NTLzd6aXAvQ29tcHJlc3MvTHptYUFsb25lL0x6bWFCZW5jaC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTFmZmUyCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUy83emlwL0NvbXByZXNzL0x6bWFBbG9uZS9Mem1hQmVuY2guY3MKQEAgLTAsMCArMSwzNDAgQEAKKy8vIEx6bWFCZW5jaC5jcw0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uSU87DQorDQorbmFtZXNwYWNlIFNldmVuWmlwDQorew0KKwkvLy8gPHN1bW1hcnk+DQorCS8vLyBMWk1BIEJlbmNobWFyaw0KKwkvLy8gPC9zdW1tYXJ5Pg0KKwlpbnRlcm5hbCBhYnN0cmFjdCBjbGFzcyBMem1hQmVuY2gNCisJew0KKwkJY29uc3QgVUludDMyIGtBZGRpdGlvbmFsU2l6ZSA9ICg2IDw8IDIwKTsNCisJCWNvbnN0IFVJbnQzMiBrQ29tcHJlc3NlZEFkZGl0aW9uYWxTaXplID0gKDEgPDwgMTApOw0KKwkJY29uc3QgVUludDMyIGtNYXhMem1hUHJvcFNpemUgPSAxMDsNCisNCisJCWNsYXNzIENSYW5kb21HZW5lcmF0b3INCisJCXsNCisJCQlVSW50MzIgQTE7DQorCQkJVUludDMyIEEyOw0KKwkJCXB1YmxpYyBDUmFuZG9tR2VuZXJhdG9yKCkgeyBJbml0KCk7IH0NCisJCQlwdWJsaWMgdm9pZCBJbml0KCkgeyBBMSA9IDM2MjQzNjA2OTsgQTIgPSA1MjEyODg2Mjk7IH0NCisJCQlwdWJsaWMgVUludDMyIEdldFJuZCgpDQorCQkJew0KKwkJCQlyZXR1cm4NCisJCQkJCSgoQTEgPSAzNjk2OSAqIChBMSAmIDB4ZmZmZikgKyAoQTEgPj4gMTYpKSA8PCAxNikgXg0KKwkJCQkJKChBMiA9IDE4MDAwICogKEEyICYgMHhmZmZmKSArIChBMiA+PiAxNikpKTsNCisJCQl9DQorCQl9Ow0KKw0KKwkJY2xhc3MgQ0JpdFJhbmRvbUdlbmVyYXRvcg0KKwkJew0KKwkJCUNSYW5kb21HZW5lcmF0b3IgUkcgPSBuZXcgQ1JhbmRvbUdlbmVyYXRvcigpOw0KKwkJCVVJbnQzMiBWYWx1ZTsNCisJCQlpbnQgTnVtQml0czsNCisJCQlwdWJsaWMgdm9pZCBJbml0KCkNCisJCQl7DQorCQkJCVZhbHVlID0gMDsNCisJCQkJTnVtQml0cyA9IDA7DQorCQkJfQ0KKwkJCXB1YmxpYyBVSW50MzIgR2V0Um5kKGludCBudW1CaXRzKQ0KKwkJCXsNCisJCQkJVUludDMyIHJlc3VsdDsNCisJCQkJaWYgKE51bUJpdHMgPiBudW1CaXRzKQ0KKwkJCQl7DQorCQkJCQlyZXN1bHQgPSBWYWx1ZSAmICgoKFVJbnQzMikxIDw8IG51bUJpdHMpIC0gMSk7DQorCQkJCQlWYWx1ZSA+Pj0gbnVtQml0czsNCisJCQkJCU51bUJpdHMgLT0gbnVtQml0czsNCisJCQkJCXJldHVybiByZXN1bHQ7DQorCQkJCX0NCisJCQkJbnVtQml0cyAtPSBOdW1CaXRzOw0KKwkJCQlyZXN1bHQgPSAoVmFsdWUgPDwgbnVtQml0cyk7DQorCQkJCVZhbHVlID0gUkcuR2V0Um5kKCk7DQorCQkJCXJlc3VsdCB8PSBWYWx1ZSAmICgoKFVJbnQzMikxIDw8IG51bUJpdHMpIC0gMSk7DQorCQkJCVZhbHVlID4+PSBudW1CaXRzOw0KKwkJCQlOdW1CaXRzID0gMzIgLSBudW1CaXRzOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCX07DQorDQorCQljbGFzcyBDQmVuY2hSYW5kb21HZW5lcmF0b3INCisJCXsNCisJCQlDQml0UmFuZG9tR2VuZXJhdG9yIFJHID0gbmV3IENCaXRSYW5kb21HZW5lcmF0b3IoKTsNCisJCQlVSW50MzIgUG9zOw0KKwkJCVVJbnQzMiBSZXAwOw0KKwkJCQ0KKwkJCXB1YmxpYyBVSW50MzIgQnVmZmVyU2l6ZTsNCisJCQlwdWJsaWMgQnl0ZVtdIEJ1ZmZlciA9IG51bGw7DQorDQorCQkJcHVibGljIENCZW5jaFJhbmRvbUdlbmVyYXRvcigpIHsgfQ0KKw0KKwkJCXB1YmxpYyB2b2lkIFNldChVSW50MzIgYnVmZmVyU2l6ZSkNCisJCQl7DQorCQkJCUJ1ZmZlciA9IG5ldyBCeXRlW2J1ZmZlclNpemVdOw0KKwkJCQlQb3MgPSAwOw0KKwkJCQlCdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsNCisJCQl9DQorCQkJVUludDMyIEdldFJuZEJpdCgpIHsgcmV0dXJuIFJHLkdldFJuZCgxKTsgfQ0KKwkJCVVJbnQzMiBHZXRMb2dSYW5kQml0cyhpbnQgbnVtQml0cykNCisJCQl7DQorCQkJCVVJbnQzMiBsZW4gPSBSRy5HZXRSbmQobnVtQml0cyk7DQorCQkJCXJldHVybiBSRy5HZXRSbmQoKGludClsZW4pOw0KKwkJCX0NCisJCQlVSW50MzIgR2V0T2Zmc2V0KCkNCisJCQl7DQorCQkJCWlmIChHZXRSbmRCaXQoKSA9PSAwKQ0KKwkJCQkJcmV0dXJuIEdldExvZ1JhbmRCaXRzKDQpOw0KKwkJCQlyZXR1cm4gKEdldExvZ1JhbmRCaXRzKDQpIDw8IDEwKSB8IFJHLkdldFJuZCgxMCk7DQorCQkJfQ0KKwkJCVVJbnQzMiBHZXRMZW4xKCkgeyByZXR1cm4gUkcuR2V0Um5kKDEgKyAoaW50KVJHLkdldFJuZCgyKSk7IH0NCisJCQlVSW50MzIgR2V0TGVuMigpIHsgcmV0dXJuIFJHLkdldFJuZCgyICsgKGludClSRy5HZXRSbmQoMikpOyB9DQorCQkJcHVibGljIHZvaWQgR2VuZXJhdGUoKQ0KKwkJCXsNCisJCQkJUkcuSW5pdCgpOw0KKwkJCQlSZXAwID0gMTsNCisJCQkJd2hpbGUgKFBvcyA8IEJ1ZmZlclNpemUpDQorCQkJCXsNCisJCQkJCWlmIChHZXRSbmRCaXQoKSA9PSAwIHx8IFBvcyA8IDEpDQorCQkJCQkJQnVmZmVyW1BvcysrXSA9IChCeXRlKVJHLkdldFJuZCg4KTsNCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQlVSW50MzIgbGVuOw0KKwkJCQkJCWlmIChSRy5HZXRSbmQoMykgPT0gMCkNCisJCQkJCQkJbGVuID0gMSArIEdldExlbjEoKTsNCisJCQkJCQllbHNlDQorCQkJCQkJew0KKwkJCQkJCQlkbw0KKwkJCQkJCQkJUmVwMCA9IEdldE9mZnNldCgpOw0KKwkJCQkJCQl3aGlsZSAoUmVwMCA+PSBQb3MpOw0KKwkJCQkJCQlSZXAwKys7DQorCQkJCQkJCWxlbiA9IDIgKyBHZXRMZW4yKCk7DQorCQkJCQkJfQ0KKwkJCQkJCWZvciAoVUludDMyIGkgPSAwOyBpIDwgbGVuICYmIFBvcyA8IEJ1ZmZlclNpemU7IGkrKywgUG9zKyspDQorCQkJCQkJCUJ1ZmZlcltQb3NdID0gQnVmZmVyW1BvcyAtIFJlcDBdOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfTsNCisNCisJCWNsYXNzIENyY091dFN0cmVhbSA6IFN5c3RlbS5JTy5TdHJlYW0NCisJCXsNCisJCQlwdWJsaWMgQ1JDIENSQyA9IG5ldyBDUkMoKTsNCisJCQlwdWJsaWMgdm9pZCBJbml0KCkgeyBDUkMuSW5pdCgpOyB9DQorCQkJcHVibGljIFVJbnQzMiBHZXREaWdlc3QoKSB7IHJldHVybiBDUkMuR2V0RGlnZXN0KCk7IH0NCisNCisJCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5SZWFkIHsgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9IH0NCisJCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5TZWVrIHsgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9IH0NCisJCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5Xcml0ZSB7IGdldCB7IHJldHVybiB0cnVlOyB9IH0NCisJCQlwdWJsaWMgb3ZlcnJpZGUgSW50NjQgTGVuZ3RoIHsgZ2V0IHsgcmV0dXJuIDA7IH0gfQ0KKwkJCXB1YmxpYyBvdmVycmlkZSBJbnQ2NCBQb3NpdGlvbiB7IGdldCB7IHJldHVybiAwOyB9IHNldCB7IH0gfQ0KKwkJCXB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkgeyB9DQorCQkJcHVibGljIG92ZXJyaWRlIGxvbmcgU2Vlayhsb25nIG9mZnNldCwgU2Vla09yaWdpbiBvcmlnaW4pIHsgcmV0dXJuIDA7IH0NCisJCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRMZW5ndGgobG9uZyB2YWx1ZSkgeyB9DQorCQkJcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkgeyByZXR1cm4gMDsgfQ0KKw0KKwkJCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShieXRlIGIpDQorCQkJew0KKwkJCQlDUkMuVXBkYXRlQnl0ZShiKTsNCisJCQl9DQorCQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KKwkJCXsNCisJCQkJQ1JDLlVwZGF0ZShidWZmZXIsICh1aW50KW9mZnNldCwgKHVpbnQpY291bnQpOw0KKwkJCX0NCisJCX07DQorDQorCQljbGFzcyBDUHJvZ3Jlc3NJbmZvIDogSUNvZGVQcm9ncmVzcw0KKwkJew0KKwkJCXB1YmxpYyBJbnQ2NCBBcHByb3ZlZFN0YXJ0Ow0KKwkJCXB1YmxpYyBJbnQ2NCBJblNpemU7DQorCQkJcHVibGljIFN5c3RlbS5EYXRlVGltZSBUaW1lOw0KKwkJCXB1YmxpYyB2b2lkIEluaXQoKSB7IEluU2l6ZSA9IDA7IH0NCisJCQlwdWJsaWMgdm9pZCBTZXRQcm9ncmVzcyhJbnQ2NCBpblNpemUsIEludDY0IG91dFNpemUpDQorCQkJew0KKwkJCQlpZiAoaW5TaXplID49IEFwcHJvdmVkU3RhcnQgJiYgSW5TaXplID09IDApDQorCQkJCXsNCisJCQkJCVRpbWUgPSBEYXRlVGltZS5VdGNOb3c7DQorCQkJCQlJblNpemUgPSBpblNpemU7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQljb25zdCBpbnQga1N1YkJpdHMgPSA4Ow0KKw0KKwkJc3RhdGljIFVJbnQzMiBHZXRMb2dTaXplKFVJbnQzMiBzaXplKQ0KKwkJew0KKwkJCWZvciAoaW50IGkgPSBrU3ViQml0czsgaSA8IDMyOyBpKyspDQorCQkJCWZvciAoVUludDMyIGogPSAwOyBqIDwgKDEgPDwga1N1YkJpdHMpOyBqKyspDQorCQkJCQlpZiAoc2l6ZSA8PSAoKChVSW50MzIpMSkgPDwgaSkgKyAoaiA8PCAoaSAtIGtTdWJCaXRzKSkpDQorCQkJCQkJcmV0dXJuIChVSW50MzIpKGkgPDwga1N1YkJpdHMpICsgajsNCisJCQlyZXR1cm4gKDMyIDw8IGtTdWJCaXRzKTsNCisJCX0NCisNCisJCXN0YXRpYyBVSW50NjQgTXlNdWx0RGl2NjQoVUludDY0IHZhbHVlLCBVSW50NjQgZWxhcHNlZFRpbWUpDQorCQl7DQorCQkJVUludDY0IGZyZXEgPSBUaW1lU3Bhbi5UaWNrc1BlclNlY29uZDsNCisJCQlVSW50NjQgZWxUaW1lID0gZWxhcHNlZFRpbWU7DQorCQkJd2hpbGUgKGZyZXEgPiAxMDAwMDAwKQ0KKwkJCXsNCisJCQkJZnJlcSA+Pj0gMTsNCisJCQkJZWxUaW1lID4+PSAxOw0KKwkJCX0NCisJCQlpZiAoZWxUaW1lID09IDApDQorCQkJCWVsVGltZSA9IDE7DQorCQkJcmV0dXJuIHZhbHVlICogZnJlcSAvIGVsVGltZTsNCisJCX0NCisNCisJCXN0YXRpYyBVSW50NjQgR2V0Q29tcHJlc3NSYXRpbmcoVUludDMyIGRpY3Rpb25hcnlTaXplLCBVSW50NjQgZWxhcHNlZFRpbWUsIFVJbnQ2NCBzaXplKQ0KKwkJew0KKwkJCVVJbnQ2NCB0ID0gR2V0TG9nU2l6ZShkaWN0aW9uYXJ5U2l6ZSkgLSAoMTggPDwga1N1YkJpdHMpOw0KKwkJCVVJbnQ2NCBudW1Db21tYW5kc0Zvck9uZSA9IDEwNjAgKyAoKHQgKiB0ICogMTApID4+ICgyICoga1N1YkJpdHMpKTsNCisJCQlVSW50NjQgbnVtQ29tbWFuZHMgPSAoVUludDY0KShzaXplKSAqIG51bUNvbW1hbmRzRm9yT25lOw0KKwkJCXJldHVybiBNeU11bHREaXY2NChudW1Db21tYW5kcywgZWxhcHNlZFRpbWUpOw0KKwkJfQ0KKw0KKwkJc3RhdGljIFVJbnQ2NCBHZXREZWNvbXByZXNzUmF0aW5nKFVJbnQ2NCBlbGFwc2VkVGltZSwgVUludDY0IG91dFNpemUsIFVJbnQ2NCBpblNpemUpDQorCQl7DQorCQkJVUludDY0IG51bUNvbW1hbmRzID0gaW5TaXplICogMjIwICsgb3V0U2l6ZSAqIDIwOw0KKwkJCXJldHVybiBNeU11bHREaXY2NChudW1Db21tYW5kcywgZWxhcHNlZFRpbWUpOw0KKwkJfQ0KKw0KKwkJc3RhdGljIFVJbnQ2NCBHZXRUb3RhbFJhdGluZygNCisJCQlVSW50MzIgZGljdGlvbmFyeVNpemUsDQorCQkJVUludDY0IGVsYXBzZWRUaW1lRW4sIFVJbnQ2NCBzaXplRW4sDQorCQkJVUludDY0IGVsYXBzZWRUaW1lRGUsDQorCQkJVUludDY0IGluU2l6ZURlLCBVSW50NjQgb3V0U2l6ZURlKQ0KKwkJew0KKwkJCXJldHVybiAoR2V0Q29tcHJlc3NSYXRpbmcoZGljdGlvbmFyeVNpemUsIGVsYXBzZWRUaW1lRW4sIHNpemVFbikgKw0KKwkJCQlHZXREZWNvbXByZXNzUmF0aW5nKGVsYXBzZWRUaW1lRGUsIGluU2l6ZURlLCBvdXRTaXplRGUpKSAvIDI7DQorCQl9DQorDQorCQlzdGF0aWMgdm9pZCBQcmludFZhbHVlKFVJbnQ2NCB2KQ0KKwkJew0KKwkJCXN0cmluZyBzID0gdi5Ub1N0cmluZygpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpICsgcy5MZW5ndGggPCA2OyBpKyspDQorCQkJCVN5c3RlbS5Db25zb2xlLldyaXRlKCIgIik7DQorCQkJU3lzdGVtLkNvbnNvbGUuV3JpdGUocyk7DQorCQl9DQorDQorCQlzdGF0aWMgdm9pZCBQcmludFJhdGluZyhVSW50NjQgcmF0aW5nKQ0KKwkJew0KKwkJCVByaW50VmFsdWUocmF0aW5nIC8gMTAwMDAwMCk7DQorCQkJU3lzdGVtLkNvbnNvbGUuV3JpdGUoIiBNSVBTIik7DQorCQl9DQorDQorCQlzdGF0aWMgdm9pZCBQcmludFJlc3VsdHMoDQorCQkJVUludDMyIGRpY3Rpb25hcnlTaXplLA0KKwkJCVVJbnQ2NCBlbGFwc2VkVGltZSwNCisJCQlVSW50NjQgc2l6ZSwNCisJCQlib29sIGRlY29tcHJlc3NNb2RlLCBVSW50NjQgc2Vjb25kU2l6ZSkNCisJCXsNCisJCQlVSW50NjQgc3BlZWQgPSBNeU11bHREaXY2NChzaXplLCBlbGFwc2VkVGltZSk7DQorCQkJUHJpbnRWYWx1ZShzcGVlZCAvIDEwMjQpOw0KKwkJCVN5c3RlbS5Db25zb2xlLldyaXRlKCIgS0IvcyAgIik7DQorCQkJVUludDY0IHJhdGluZzsNCisJCQlpZiAoZGVjb21wcmVzc01vZGUpDQorCQkJCXJhdGluZyA9IEdldERlY29tcHJlc3NSYXRpbmcoZWxhcHNlZFRpbWUsIHNpemUsIHNlY29uZFNpemUpOw0KKwkJCWVsc2UNCisJCQkJcmF0aW5nID0gR2V0Q29tcHJlc3NSYXRpbmcoZGljdGlvbmFyeVNpemUsIGVsYXBzZWRUaW1lLCBzaXplKTsNCisJCQlQcmludFJhdGluZyhyYXRpbmcpOw0KKwkJfQ0KKw0KKwkJc3RhdGljIHB1YmxpYyBpbnQgTHptYUJlbmNobWFyayhJbnQzMiBudW1JdGVyYXRpb25zLCBVSW50MzIgZGljdGlvbmFyeVNpemUpDQorCQl7DQorCQkJaWYgKG51bUl0ZXJhdGlvbnMgPD0gMCkNCisJCQkJcmV0dXJuIDA7DQorCQkJaWYgKGRpY3Rpb25hcnlTaXplIDwgKDEgPDwgMTgpKQ0KKwkJCXsNCisJCQkJU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKCJcbkVycm9yOiBkaWN0aW9uYXJ5IHNpemUgZm9yIGJlbmNobWFyayBtdXN0IGJlID49IDE5ICg1MTIgS0IpIik7DQorCQkJCXJldHVybiAxOw0KKwkJCX0NCisJCQlTeXN0ZW0uQ29uc29sZS5Xcml0ZSgiXG4gICAgICAgQ29tcHJlc3NpbmcgICAgICAgICAgICAgICAgRGVjb21wcmVzc2luZ1xuXG4iKTsNCisNCisJCQlDb21wcmVzc2lvbi5MWk1BLkVuY29kZXIgZW5jb2RlciA9IG5ldyBDb21wcmVzc2lvbi5MWk1BLkVuY29kZXIoKTsNCisJCQlDb21wcmVzc2lvbi5MWk1BLkRlY29kZXIgZGVjb2RlciA9IG5ldyBDb21wcmVzc2lvbi5MWk1BLkRlY29kZXIoKTsNCisNCisNCisJCQlDb2RlclByb3BJRFtdIHByb3BJRHMgPSANCisJCQl7IA0KKwkJCQlDb2RlclByb3BJRC5EaWN0aW9uYXJ5U2l6ZSwNCisJCQl9Ow0KKwkJCW9iamVjdFtdIHByb3BlcnRpZXMgPSANCisJCQl7DQorCQkJCShJbnQzMikoZGljdGlvbmFyeVNpemUpLA0KKwkJCX07DQorDQorCQkJVUludDMyIGtCdWZmZXJTaXplID0gZGljdGlvbmFyeVNpemUgKyBrQWRkaXRpb25hbFNpemU7DQorCQkJVUludDMyIGtDb21wcmVzc2VkQnVmZmVyU2l6ZSA9IChrQnVmZmVyU2l6ZSAvIDIpICsga0NvbXByZXNzZWRBZGRpdGlvbmFsU2l6ZTsNCisNCisJCQllbmNvZGVyLlNldENvZGVyUHJvcGVydGllcyhwcm9wSURzLCBwcm9wZXJ0aWVzKTsNCisJCQlTeXN0ZW0uSU8uTWVtb3J5U3RyZWFtIHByb3BTdHJlYW0gPSBuZXcgU3lzdGVtLklPLk1lbW9yeVN0cmVhbSgpOw0KKwkJCWVuY29kZXIuV3JpdGVDb2RlclByb3BlcnRpZXMocHJvcFN0cmVhbSk7DQorCQkJYnl0ZVtdIHByb3BBcnJheSA9IHByb3BTdHJlYW0uVG9BcnJheSgpOw0KKw0KKwkJCUNCZW5jaFJhbmRvbUdlbmVyYXRvciByZyA9IG5ldyBDQmVuY2hSYW5kb21HZW5lcmF0b3IoKTsNCisNCisJCQlyZy5TZXQoa0J1ZmZlclNpemUpOw0KKwkJCXJnLkdlbmVyYXRlKCk7DQorCQkJQ1JDIGNyYyA9IG5ldyBDUkMoKTsNCisJCQljcmMuSW5pdCgpOw0KKwkJCWNyYy5VcGRhdGUocmcuQnVmZmVyLCAwLCByZy5CdWZmZXJTaXplKTsNCisNCisJCQlDUHJvZ3Jlc3NJbmZvIHByb2dyZXNzSW5mbyA9IG5ldyBDUHJvZ3Jlc3NJbmZvKCk7DQorCQkJcHJvZ3Jlc3NJbmZvLkFwcHJvdmVkU3RhcnQgPSBkaWN0aW9uYXJ5U2l6ZTsNCisNCisJCQlVSW50NjQgdG90YWxCZW5jaFNpemUgPSAwOw0KKwkJCVVJbnQ2NCB0b3RhbEVuY29kZVRpbWUgPSAwOw0KKwkJCVVJbnQ2NCB0b3RhbERlY29kZVRpbWUgPSAwOw0KKwkJCVVJbnQ2NCB0b3RhbENvbXByZXNzZWRTaXplID0gMDsNCisNCisJCQlNZW1vcnlTdHJlYW0gaW5TdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKHJnLkJ1ZmZlciwgMCwgKGludClyZy5CdWZmZXJTaXplKTsNCisJCQlNZW1vcnlTdHJlYW0gY29tcHJlc3NlZFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKGludClrQ29tcHJlc3NlZEJ1ZmZlclNpemUpOw0KKwkJCUNyY091dFN0cmVhbSBjcmNPdXRTdHJlYW0gPSBuZXcgQ3JjT3V0U3RyZWFtKCk7DQorCQkJZm9yIChJbnQzMiBpID0gMDsgaSA8IG51bUl0ZXJhdGlvbnM7IGkrKykNCisJCQl7DQorCQkJCXByb2dyZXNzSW5mby5Jbml0KCk7DQorCQkJCWluU3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7DQorCQkJCWNvbXByZXNzZWRTdHJlYW0uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsNCisJCQkJZW5jb2Rlci5Db2RlKGluU3RyZWFtLCBjb21wcmVzc2VkU3RyZWFtLCAtMSwgLTEsIHByb2dyZXNzSW5mbyk7DQorCQkJCVRpbWVTcGFuIHNwMiA9IERhdGVUaW1lLlV0Y05vdyAtIHByb2dyZXNzSW5mby5UaW1lOw0KKwkJCQlVSW50NjQgZW5jb2RlVGltZSA9IChVSW50NjQpc3AyLlRpY2tzOw0KKw0KKwkJCQlsb25nIGNvbXByZXNzZWRTaXplID0gY29tcHJlc3NlZFN0cmVhbS5Qb3NpdGlvbjsNCisJCQkJaWYgKHByb2dyZXNzSW5mby5JblNpemUgPT0gMCkNCisJCQkJCXRocm93IChuZXcgRXhjZXB0aW9uKCJJbnRlcm5hbCBFUlJPUiAxMjgyIikpOw0KKw0KKwkJCQlVSW50NjQgZGVjb2RlVGltZSA9IDA7DQorCQkJCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKQ0KKwkJCQl7DQorCQkJCQljb21wcmVzc2VkU3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7DQorCQkJCQljcmNPdXRTdHJlYW0uSW5pdCgpOw0KKw0KKwkJCQkJZGVjb2Rlci5TZXREZWNvZGVyUHJvcGVydGllcyhwcm9wQXJyYXkpOw0KKwkJCQkJVUludDY0IG91dFNpemUgPSBrQnVmZmVyU2l6ZTsNCisJCQkJCVN5c3RlbS5EYXRlVGltZSBzdGFydFRpbWUgPSBEYXRlVGltZS5VdGNOb3c7DQorCQkJCQlkZWNvZGVyLkNvZGUoY29tcHJlc3NlZFN0cmVhbSwgY3JjT3V0U3RyZWFtLCAwLCAoSW50NjQpb3V0U2l6ZSwgbnVsbCk7DQorCQkJCQlUaW1lU3BhbiBzcCA9IChEYXRlVGltZS5VdGNOb3cgLSBzdGFydFRpbWUpOw0KKwkJCQkJZGVjb2RlVGltZSA9ICh1bG9uZylzcC5UaWNrczsNCisJCQkJCWlmIChjcmNPdXRTdHJlYW0uR2V0RGlnZXN0KCkgIT0gY3JjLkdldERpZ2VzdCgpKQ0KKwkJCQkJCXRocm93IChuZXcgRXhjZXB0aW9uKCJDUkMgRXJyb3IiKSk7DQorCQkJCX0NCisJCQkJVUludDY0IGJlbmNoU2l6ZSA9IGtCdWZmZXJTaXplIC0gKFVJbnQ2NClwcm9ncmVzc0luZm8uSW5TaXplOw0KKwkJCQlQcmludFJlc3VsdHMoZGljdGlvbmFyeVNpemUsIGVuY29kZVRpbWUsIGJlbmNoU2l6ZSwgZmFsc2UsIDApOw0KKwkJCQlTeXN0ZW0uQ29uc29sZS5Xcml0ZSgiICAgICAiKTsNCisJCQkJUHJpbnRSZXN1bHRzKGRpY3Rpb25hcnlTaXplLCBkZWNvZGVUaW1lLCBrQnVmZmVyU2l6ZSwgdHJ1ZSwgKHVsb25nKWNvbXByZXNzZWRTaXplKTsNCisJCQkJU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKCk7DQorDQorCQkJCXRvdGFsQmVuY2hTaXplICs9IGJlbmNoU2l6ZTsNCisJCQkJdG90YWxFbmNvZGVUaW1lICs9IGVuY29kZVRpbWU7DQorCQkJCXRvdGFsRGVjb2RlVGltZSArPSBkZWNvZGVUaW1lOw0KKwkJCQl0b3RhbENvbXByZXNzZWRTaXplICs9ICh1bG9uZyljb21wcmVzc2VkU2l6ZTsNCisJCQl9DQorCQkJU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCisJCQlQcmludFJlc3VsdHMoZGljdGlvbmFyeVNpemUsIHRvdGFsRW5jb2RlVGltZSwgdG90YWxCZW5jaFNpemUsIGZhbHNlLCAwKTsNCisJCQlTeXN0ZW0uQ29uc29sZS5Xcml0ZSgiICAgICAiKTsNCisJCQlQcmludFJlc3VsdHMoZGljdGlvbmFyeVNpemUsIHRvdGFsRGVjb2RlVGltZSwNCisJCQkJCWtCdWZmZXJTaXplICogKFVJbnQ2NCludW1JdGVyYXRpb25zLCB0cnVlLCB0b3RhbENvbXByZXNzZWRTaXplKTsNCisJCQlTeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoIiAgICBBdmVyYWdlIik7DQorCQkJcmV0dXJuIDA7DQorCQl9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUy83emlwL0NvbXByZXNzL0x6bWFBbG9uZS9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9Mem1hQWxvbmUvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5NGFlZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9Mem1hQWxvbmUvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSwyOSBAQAor77u/I3JlZ2lvbiBVc2luZyBkaXJlY3RpdmVzDQorDQordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsNCisNCisjZW5kcmVnaW9uDQorDQorLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyANCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbg0KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4NCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkxaTUEjIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIklnb3IgUGF2bG92IildDQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkxaTUEjIFNESyIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCBAIElnb3IgUGF2bG92IDE5OTktMjAwNCIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0NCisNCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOg0KKy8vDQorLy8gICAgICBNYWpvciBWZXJzaW9uDQorLy8gICAgICBNaW5vciBWZXJzaW9uIA0KKy8vICAgICAgQnVpbGQgTnVtYmVyDQorLy8gICAgICBSZXZpc2lvbg0KKy8vDQorLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgUmV2aXNpb24gYW5kIEJ1aWxkIE51bWJlcnMgDQorLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoNCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiNC4xMi4qIildDQpkaWZmIC0tZ2l0IGEvbHptYS9DUy83emlwL0NvbXByZXNzL0x6bWFBbG9uZS9Qcm9wZXJ0aWVzL1Jlc291cmNlcy5jcyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9Mem1hQWxvbmUvUHJvcGVydGllcy9SZXNvdXJjZXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlNGVlOQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9Mem1hQWxvbmUvUHJvcGVydGllcy9SZXNvdXJjZXMuY3MKQEAgLTAsMCArMSw3MCBAQAor77u/Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvLyA8YXV0b2dlbmVyYXRlZD4NCisvLyAgICAgVGhpcyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgYSB0b29sLg0KKy8vICAgICBSdW50aW1lIFZlcnNpb246Mi4wLjQwNjA3LjQyDQorLy8NCisvLyAgICAgQ2hhbmdlcyB0byB0aGlzIGZpbGUgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvciBhbmQgd2lsbCBiZSBsb3N0IGlmDQorLy8gICAgIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLg0KKy8vIDwvYXV0b2dlbmVyYXRlZD4NCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK25hbWVzcGFjZSBMem1hQWxvbmUuUHJvcGVydGllcw0KK3sNCisJdXNpbmcgU3lzdGVtOw0KKwl1c2luZyBTeXN0ZW0uSU87DQorCXVzaW5nIFN5c3RlbS5SZXNvdXJjZXM7DQorDQorCS8vLyA8c3VtbWFyeT4NCisJLy8vICAgIEEgc3Ryb25nbHktdHlwZWQgcmVzb3VyY2UgY2xhc3MsIGZvciBsb29raW5nIHVwIGxvY2FsaXplZCBzdHJpbmdzLCBldGMuDQorCS8vLyA8L3N1bW1hcnk+DQorCS8vIFRoaXMgY2xhc3Mgd2FzIGF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBTdHJvbmdseSBUeXBlZCBSZXNvdXJjZSBCdWlsZGVyDQorCS8vIGNsYXNzIHZpYSBhIHRvb2wgbGlrZSBSZXNHZW4gb3IgVmlzdWFsIFN0dWRpby5ORVQuDQorCS8vIFRvIGFkZCBvciByZW1vdmUgYSBtZW1iZXIsIGVkaXQgeW91ciAuUmVzWCBmaWxlIHRoZW4gcmVydW4gUmVzR2VuDQorCS8vIHdpdGggdGhlIC9zdHIgb3B0aW9uLCBvciByZWJ1aWxkIHlvdXIgVlMgcHJvamVjdC4NCisJY2xhc3MgUmVzb3VyY2VzDQorCXsNCisNCisJCXByaXZhdGUgc3RhdGljIFN5c3RlbS5SZXNvdXJjZXMuUmVzb3VyY2VNYW5hZ2VyIF9yZXNNZ3I7DQorDQorCQlwcml2YXRlIHN0YXRpYyBTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mbyBfcmVzQ3VsdHVyZTsNCisNCisJCS8qRmFtQU5EQXNzZW0qLw0KKwkJaW50ZXJuYWwgUmVzb3VyY2VzKCkNCisJCXsNCisJCX0NCisNCisJCS8vLyA8c3VtbWFyeT4NCisJCS8vLyAgICBSZXR1cm5zIHRoZSBjYWNoZWQgUmVzb3VyY2VNYW5hZ2VyIGluc3RhbmNlIHVzZWQgYnkgdGhpcyBjbGFzcy4NCisJCS8vLyA8L3N1bW1hcnk+DQorCQlbU3lzdGVtLkNvbXBvbmVudE1vZGVsLkVkaXRvckJyb3dzYWJsZUF0dHJpYnV0ZShTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRWRpdG9yQnJvd3NhYmxlU3RhdGUuQWR2YW5jZWQpXQ0KKwkJcHVibGljIHN0YXRpYyBTeXN0ZW0uUmVzb3VyY2VzLlJlc291cmNlTWFuYWdlciBSZXNvdXJjZU1hbmFnZXINCisJCXsNCisJCQlnZXQNCisJCQl7DQorCQkJCWlmICgoX3Jlc01nciA9PSBudWxsKSkNCisJCQkJew0KKwkJCQkJU3lzdGVtLlJlc291cmNlcy5SZXNvdXJjZU1hbmFnZXIgdGVtcCA9IG5ldyBTeXN0ZW0uUmVzb3VyY2VzLlJlc291cmNlTWFuYWdlcigiUmVzb3VyY2VzIiwgdHlwZW9mKFJlc291cmNlcykuQXNzZW1ibHkpOw0KKwkJCQkJX3Jlc01nciA9IHRlbXA7DQorCQkJCX0NCisJCQkJcmV0dXJuIF9yZXNNZ3I7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLy8vIDxzdW1tYXJ5Pg0KKwkJLy8vICAgIE92ZXJyaWRlcyB0aGUgY3VycmVudCB0aHJlYWQncyBDdXJyZW50VUlDdWx0dXJlIHByb3BlcnR5IGZvciBhbGwNCisJCS8vLyAgICByZXNvdXJjZSBsb29rdXBzIHVzaW5nIHRoaXMgc3Ryb25nbHkgdHlwZWQgcmVzb3VyY2UgY2xhc3MuDQorCQkvLy8gPC9zdW1tYXJ5Pg0KKwkJW1N5c3RlbS5Db21wb25lbnRNb2RlbC5FZGl0b3JCcm93c2FibGVBdHRyaWJ1dGUoU3lzdGVtLkNvbXBvbmVudE1vZGVsLkVkaXRvckJyb3dzYWJsZVN0YXRlLkFkdmFuY2VkKV0NCisJCXB1YmxpYyBzdGF0aWMgU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8gQ3VsdHVyZQ0KKwkJew0KKwkJCWdldA0KKwkJCXsNCisJCQkJcmV0dXJuIF9yZXNDdWx0dXJlOw0KKwkJCX0NCisJCQlzZXQNCisJCQl7DQorCQkJCV9yZXNDdWx0dXJlID0gdmFsdWU7DQorCQkJfQ0KKwkJfQ0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9Mem1hQWxvbmUvUHJvcGVydGllcy9TZXR0aW5ncy5jcyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9Mem1hQWxvbmUvUHJvcGVydGllcy9TZXR0aW5ncy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjgxZmQyCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUy83emlwL0NvbXByZXNzL0x6bWFBbG9uZS9Qcm9wZXJ0aWVzL1NldHRpbmdzLmNzCkBAIC0wLDAgKzEsNDIgQEAKK++7vy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gPGF1dG9nZW5lcmF0ZWQ+DQorLy8gICAgIFRoaXMgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgdG9vbC4NCisvLyAgICAgUnVudGltZSBWZXJzaW9uOjIuMC40MDYwNy40Mg0KKy8vDQorLy8gICAgIENoYW5nZXMgdG8gdGhpcyBmaWxlIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZg0KKy8vICAgICB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC4NCisvLyA8L2F1dG9nZW5lcmF0ZWQ+DQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCituYW1lc3BhY2UgTHptYUFsb25lLlByb3BlcnRpZXMNCit7DQorCXB1YmxpYyBwYXJ0aWFsIGNsYXNzIFNldHRpbmdzIDogU3lzdGVtLkNvbmZpZ3VyYXRpb24uQXBwbGljYXRpb25TZXR0aW5nc0Jhc2UNCisJew0KKwkJcHJpdmF0ZSBzdGF0aWMgU2V0dGluZ3MgbV9WYWx1ZTsNCisNCisJCXByaXZhdGUgc3RhdGljIG9iamVjdCBtX1N5bmNPYmplY3QgPSBuZXcgb2JqZWN0KCk7DQorDQorCQlwdWJsaWMgc3RhdGljIFNldHRpbmdzIFZhbHVlDQorCQl7DQorCQkJZ2V0DQorCQkJew0KKwkJCQlpZiAoKFNldHRpbmdzLm1fVmFsdWUgPT0gbnVsbCkpDQorCQkJCXsNCisJCQkJCVN5c3RlbS5UaHJlYWRpbmcuTW9uaXRvci5FbnRlcihTZXR0aW5ncy5tX1N5bmNPYmplY3QpOw0KKwkJCQkJaWYgKChTZXR0aW5ncy5tX1ZhbHVlID09IG51bGwpKQ0KKwkJCQkJew0KKwkJCQkJCXRyeQ0KKwkJCQkJCXsNCisJCQkJCQkJU2V0dGluZ3MubV9WYWx1ZSA9IG5ldyBTZXR0aW5ncygpOw0KKwkJCQkJCX0NCisJCQkJCQlmaW5hbGx5DQorCQkJCQkJew0KKwkJCQkJCQlTeXN0ZW0uVGhyZWFkaW5nLk1vbml0b3IuRXhpdChTZXR0aW5ncy5tX1N5bmNPYmplY3QpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCQlyZXR1cm4gU2V0dGluZ3MubV9WYWx1ZTsNCisJCQl9DQorCQl9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUy83emlwL0NvbXByZXNzL1JhbmdlQ29kZXIvUmFuZ2VDb2Rlci5jcyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9SYW5nZUNvZGVyL1JhbmdlQ29kZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlZDI0NwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9SYW5nZUNvZGVyL1JhbmdlQ29kZXIuY3MKQEAgLTAsMCArMSwyMzQgQEAKK3VzaW5nIFN5c3RlbTsNCisNCituYW1lc3BhY2UgU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlcg0KK3sNCisJY2xhc3MgRW5jb2Rlcg0KKwl7DQorCQlwdWJsaWMgY29uc3QgdWludCBrVG9wVmFsdWUgPSAoMSA8PCAyNCk7DQorDQorCQlTeXN0ZW0uSU8uU3RyZWFtIFN0cmVhbTsNCisNCisJCXB1YmxpYyBVSW50NjQgTG93Ow0KKwkJcHVibGljIHVpbnQgUmFuZ2U7DQorCQl1aW50IF9jYWNoZVNpemU7DQorCQlieXRlIF9jYWNoZTsNCisNCisJCWxvbmcgU3RhcnRQb3NpdGlvbjsNCisNCisJCXB1YmxpYyB2b2lkIFNldFN0cmVhbShTeXN0ZW0uSU8uU3RyZWFtIHN0cmVhbSkNCisJCXsNCisJCQlTdHJlYW0gPSBzdHJlYW07DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBSZWxlYXNlU3RyZWFtKCkNCisJCXsNCisJCQlTdHJlYW0gPSBudWxsOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgSW5pdCgpDQorCQl7DQorCQkJU3RhcnRQb3NpdGlvbiA9IFN0cmVhbS5Qb3NpdGlvbjsNCisNCisJCQlMb3cgPSAwOw0KKwkJCVJhbmdlID0gMHhGRkZGRkZGRjsNCisJCQlfY2FjaGVTaXplID0gMTsNCisJCQlfY2FjaGUgPSAwOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgRmx1c2hEYXRhKCkNCisJCXsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykNCisJCQkJU2hpZnRMb3coKTsNCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIEZsdXNoU3RyZWFtKCkNCisJCXsNCisJCQlTdHJlYW0uRmx1c2goKTsNCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIENsb3NlU3RyZWFtKCkNCisJCXsNCisJCQlTdHJlYW0uQ2xvc2UoKTsNCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIEVuY29kZSh1aW50IHN0YXJ0LCB1aW50IHNpemUsIHVpbnQgdG90YWwpDQorCQl7DQorCQkJTG93ICs9IHN0YXJ0ICogKFJhbmdlIC89IHRvdGFsKTsNCisJCQlSYW5nZSAqPSBzaXplOw0KKwkJCXdoaWxlIChSYW5nZSA8IGtUb3BWYWx1ZSkNCisJCQl7DQorCQkJCVJhbmdlIDw8PSA4Ow0KKwkJCQlTaGlmdExvdygpOw0KKwkJCX0NCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIFNoaWZ0TG93KCkNCisJCXsNCisJCQlpZiAoKHVpbnQpTG93IDwgKHVpbnQpMHhGRjAwMDAwMCB8fCAodWludCkoTG93ID4+IDMyKSA9PSAxKQ0KKwkJCXsNCisJCQkJYnl0ZSB0ZW1wID0gX2NhY2hlOw0KKwkJCQlkbw0KKwkJCQl7DQorCQkJCQlTdHJlYW0uV3JpdGVCeXRlKChieXRlKSh0ZW1wICsgKExvdyA+PiAzMikpKTsNCisJCQkJCXRlbXAgPSAweEZGOw0KKwkJCQl9DQorCQkJCXdoaWxlICgtLV9jYWNoZVNpemUgIT0gMCk7DQorCQkJCV9jYWNoZSA9IChieXRlKSgoKHVpbnQpTG93KSA+PiAyNCk7DQorCQkJfQ0KKwkJCV9jYWNoZVNpemUrKzsNCisJCQlMb3cgPSAoKHVpbnQpTG93KSA8PCA4Ow0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgRW5jb2RlRGlyZWN0Qml0cyh1aW50IHYsIGludCBudW1Ub3RhbEJpdHMpDQorCQl7DQorCQkJZm9yIChpbnQgaSA9IG51bVRvdGFsQml0cyAtIDE7IGkgPj0gMDsgaS0tKQ0KKwkJCXsNCisJCQkJUmFuZ2UgPj49IDE7DQorCQkJCWlmICgoKHYgPj4gaSkgJiAxKSA9PSAxKQ0KKwkJCQkJTG93ICs9IFJhbmdlOw0KKwkJCQlpZiAoUmFuZ2UgPCBrVG9wVmFsdWUpDQorCQkJCXsNCisJCQkJCVJhbmdlIDw8PSA4Ow0KKwkJCQkJU2hpZnRMb3coKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIEVuY29kZUJpdCh1aW50IHNpemUwLCBpbnQgbnVtVG90YWxCaXRzLCB1aW50IHN5bWJvbCkNCisJCXsNCisJCQl1aW50IG5ld0JvdW5kID0gKFJhbmdlID4+IG51bVRvdGFsQml0cykgKiBzaXplMDsNCisJCQlpZiAoc3ltYm9sID09IDApDQorCQkJCVJhbmdlID0gbmV3Qm91bmQ7DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJTG93ICs9IG5ld0JvdW5kOw0KKwkJCQlSYW5nZSAtPSBuZXdCb3VuZDsNCisJCQl9DQorCQkJd2hpbGUgKFJhbmdlIDwga1RvcFZhbHVlKQ0KKwkJCXsNCisJCQkJUmFuZ2UgPDw9IDg7DQorCQkJCVNoaWZ0TG93KCk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcHVibGljIGxvbmcgR2V0UHJvY2Vzc2VkU2l6ZUFkZCgpDQorCQl7DQorCQkJcmV0dXJuIF9jYWNoZVNpemUgKw0KKwkJCQlTdHJlYW0uUG9zaXRpb24gLSBTdGFydFBvc2l0aW9uICsgNDsNCisJCQkvLyAobG9uZylTdHJlYW0uR2V0UHJvY2Vzc2VkU2l6ZSgpOw0KKwkJfQ0KKwl9DQorDQorCWNsYXNzIERlY29kZXINCisJew0KKwkJcHVibGljIGNvbnN0IHVpbnQga1RvcFZhbHVlID0gKDEgPDwgMjQpOw0KKwkJcHVibGljIHVpbnQgUmFuZ2U7DQorCQlwdWJsaWMgdWludCBDb2RlOw0KKwkJLy8gcHVibGljIEJ1ZmZlci5JbkJ1ZmZlciBTdHJlYW0gPSBuZXcgQnVmZmVyLkluQnVmZmVyKDEgPDwgMTYpOw0KKwkJcHVibGljIFN5c3RlbS5JTy5TdHJlYW0gU3RyZWFtOw0KKw0KKwkJcHVibGljIHZvaWQgSW5pdChTeXN0ZW0uSU8uU3RyZWFtIHN0cmVhbSkNCisJCXsNCisJCQkvLyBTdHJlYW0uSW5pdChzdHJlYW0pOw0KKwkJCVN0cmVhbSA9IHN0cmVhbTsNCisNCisJCQlDb2RlID0gMDsNCisJCQlSYW5nZSA9IDB4RkZGRkZGRkY7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspDQorCQkJCUNvZGUgPSAoQ29kZSA8PCA4KSB8IChieXRlKVN0cmVhbS5SZWFkQnl0ZSgpOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgUmVsZWFzZVN0cmVhbSgpDQorCQl7DQorCQkJLy8gU3RyZWFtLlJlbGVhc2VTdHJlYW0oKTsNCisJCQlTdHJlYW0gPSBudWxsOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgQ2xvc2VTdHJlYW0oKQ0KKwkJew0KKwkJCVN0cmVhbS5DbG9zZSgpOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgTm9ybWFsaXplKCkNCisJCXsNCisJCQl3aGlsZSAoUmFuZ2UgPCBrVG9wVmFsdWUpDQorCQkJew0KKwkJCQlDb2RlID0gKENvZGUgPDwgOCkgfCAoYnl0ZSlTdHJlYW0uUmVhZEJ5dGUoKTsNCisJCQkJUmFuZ2UgPDw9IDg7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgTm9ybWFsaXplMigpDQorCQl7DQorCQkJaWYgKFJhbmdlIDwga1RvcFZhbHVlKQ0KKwkJCXsNCisJCQkJQ29kZSA9IChDb2RlIDw8IDgpIHwgKGJ5dGUpU3RyZWFtLlJlYWRCeXRlKCk7DQorCQkJCVJhbmdlIDw8PSA4Ow0KKwkJCX0NCisJCX0NCisNCisJCXB1YmxpYyB1aW50IEdldFRocmVzaG9sZCh1aW50IHRvdGFsKQ0KKwkJew0KKwkJCXJldHVybiBDb2RlIC8gKFJhbmdlIC89IHRvdGFsKTsNCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIERlY29kZSh1aW50IHN0YXJ0LCB1aW50IHNpemUsIHVpbnQgdG90YWwpDQorCQl7DQorCQkJQ29kZSAtPSBzdGFydCAqIFJhbmdlOw0KKwkJCVJhbmdlICo9IHNpemU7DQorCQkJTm9ybWFsaXplKCk7DQorCQl9DQorDQorCQlwdWJsaWMgdWludCBEZWNvZGVEaXJlY3RCaXRzKGludCBudW1Ub3RhbEJpdHMpDQorCQl7DQorCQkJdWludCByYW5nZSA9IFJhbmdlOw0KKwkJCXVpbnQgY29kZSA9IENvZGU7DQorCQkJdWludCByZXN1bHQgPSAwOw0KKwkJCWZvciAoaW50IGkgPSBudW1Ub3RhbEJpdHM7IGkgPiAwOyBpLS0pDQorCQkJew0KKwkJCQlyYW5nZSA+Pj0gMTsNCisJCQkJLyoNCisJCQkJcmVzdWx0IDw8PSAxOw0KKwkJCQlpZiAoY29kZSA+PSByYW5nZSkNCisJCQkJew0KKwkJCQkJY29kZSAtPSByYW5nZTsNCisJCQkJCXJlc3VsdCB8PSAxOw0KKwkJCQl9DQorCQkJCSovDQorCQkJCXVpbnQgdCA9IChjb2RlIC0gcmFuZ2UpID4+IDMxOw0KKwkJCQljb2RlIC09IHJhbmdlICYgKHQgLSAxKTsNCisJCQkJcmVzdWx0ID0gKHJlc3VsdCA8PCAxKSB8ICgxIC0gdCk7DQorDQorCQkJCWlmIChyYW5nZSA8IGtUb3BWYWx1ZSkNCisJCQkJew0KKwkJCQkJY29kZSA9IChjb2RlIDw8IDgpIHwgKGJ5dGUpU3RyZWFtLlJlYWRCeXRlKCk7DQorCQkJCQlyYW5nZSA8PD0gODsNCisJCQkJfQ0KKwkJCX0NCisJCQlSYW5nZSA9IHJhbmdlOw0KKwkJCUNvZGUgPSBjb2RlOw0KKwkJCXJldHVybiByZXN1bHQ7DQorCQl9DQorDQorCQlwdWJsaWMgdWludCBEZWNvZGVCaXQodWludCBzaXplMCwgaW50IG51bVRvdGFsQml0cykNCisJCXsNCisJCQl1aW50IG5ld0JvdW5kID0gKFJhbmdlID4+IG51bVRvdGFsQml0cykgKiBzaXplMDsNCisJCQl1aW50IHN5bWJvbDsNCisJCQlpZiAoQ29kZSA8IG5ld0JvdW5kKQ0KKwkJCXsNCisJCQkJc3ltYm9sID0gMDsNCisJCQkJUmFuZ2UgPSBuZXdCb3VuZDsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJc3ltYm9sID0gMTsNCisJCQkJQ29kZSAtPSBuZXdCb3VuZDsNCisJCQkJUmFuZ2UgLT0gbmV3Qm91bmQ7DQorCQkJfQ0KKwkJCU5vcm1hbGl6ZSgpOw0KKwkJCXJldHVybiBzeW1ib2w7DQorCQl9DQorDQorCQkvLyB1bG9uZyBHZXRQcm9jZXNzZWRTaXplKCkge3JldHVybiBTdHJlYW0uR2V0UHJvY2Vzc2VkU2l6ZSgpOyB9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUy83emlwL0NvbXByZXNzL1JhbmdlQ29kZXIvUmFuZ2VDb2RlckJpdC5jcyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9SYW5nZUNvZGVyL1JhbmdlQ29kZXJCaXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwYTVhMAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvQ1MvN3ppcC9Db21wcmVzcy9SYW5nZUNvZGVyL1JhbmdlQ29kZXJCaXQuY3MKQEAgLTAsMCArMSwxMTcgQEAKK3VzaW5nIFN5c3RlbTsNCisNCituYW1lc3BhY2UgU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlcg0KK3sNCisJc3RydWN0IEJpdEVuY29kZXINCisJew0KKwkJcHVibGljIGNvbnN0IGludCBrTnVtQml0TW9kZWxUb3RhbEJpdHMgPSAxMTsNCisJCXB1YmxpYyBjb25zdCB1aW50IGtCaXRNb2RlbFRvdGFsID0gKDEgPDwga051bUJpdE1vZGVsVG90YWxCaXRzKTsNCisJCWNvbnN0IGludCBrTnVtTW92ZUJpdHMgPSA1Ow0KKwkJY29uc3QgaW50IGtOdW1Nb3ZlUmVkdWNpbmdCaXRzID0gMjsNCisJCXB1YmxpYyBjb25zdCBpbnQga051bUJpdFByaWNlU2hpZnRCaXRzID0gNjsNCisNCisJCXVpbnQgUHJvYjsNCisNCisJCXB1YmxpYyB2b2lkIEluaXQoKSB7IFByb2IgPSBrQml0TW9kZWxUb3RhbCA+PiAxOyB9DQorDQorCQlwdWJsaWMgdm9pZCBVcGRhdGVNb2RlbCh1aW50IHN5bWJvbCkNCisJCXsNCisJCQlpZiAoc3ltYm9sID09IDApDQorCQkJCVByb2IgKz0gKGtCaXRNb2RlbFRvdGFsIC0gUHJvYikgPj4ga051bU1vdmVCaXRzOw0KKwkJCWVsc2UNCisJCQkJUHJvYiAtPSAoUHJvYikgPj4ga051bU1vdmVCaXRzOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgRW5jb2RlKEVuY29kZXIgZW5jb2RlciwgdWludCBzeW1ib2wpDQorCQl7DQorCQkJLy8gZW5jb2Rlci5FbmNvZGVCaXQoUHJvYiwga051bUJpdE1vZGVsVG90YWxCaXRzLCBzeW1ib2wpOw0KKwkJCS8vIFVwZGF0ZU1vZGVsKHN5bWJvbCk7DQorCQkJdWludCBuZXdCb3VuZCA9IChlbmNvZGVyLlJhbmdlID4+IGtOdW1CaXRNb2RlbFRvdGFsQml0cykgKiBQcm9iOw0KKwkJCWlmIChzeW1ib2wgPT0gMCkNCisJCQl7DQorCQkJCWVuY29kZXIuUmFuZ2UgPSBuZXdCb3VuZDsNCisJCQkJUHJvYiArPSAoa0JpdE1vZGVsVG90YWwgLSBQcm9iKSA+PiBrTnVtTW92ZUJpdHM7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCWVuY29kZXIuTG93ICs9IG5ld0JvdW5kOw0KKwkJCQllbmNvZGVyLlJhbmdlIC09IG5ld0JvdW5kOw0KKwkJCQlQcm9iIC09IChQcm9iKSA+PiBrTnVtTW92ZUJpdHM7DQorCQkJfQ0KKwkJCWlmIChlbmNvZGVyLlJhbmdlIDwgRW5jb2Rlci5rVG9wVmFsdWUpDQorCQkJew0KKwkJCQllbmNvZGVyLlJhbmdlIDw8PSA4Ow0KKwkJCQllbmNvZGVyLlNoaWZ0TG93KCk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJcHJpdmF0ZSBzdGF0aWMgVUludDMyW10gUHJvYlByaWNlcyA9IG5ldyBVSW50MzJba0JpdE1vZGVsVG90YWwgPj4ga051bU1vdmVSZWR1Y2luZ0JpdHNdOw0KKw0KKwkJc3RhdGljIEJpdEVuY29kZXIoKQ0KKwkJew0KKwkJCWNvbnN0IGludCBrTnVtQml0cyA9IChrTnVtQml0TW9kZWxUb3RhbEJpdHMgLSBrTnVtTW92ZVJlZHVjaW5nQml0cyk7DQorCQkJZm9yIChpbnQgaSA9IGtOdW1CaXRzIC0gMTsgaSA+PSAwOyBpLS0pDQorCQkJew0KKwkJCQlVSW50MzIgc3RhcnQgPSAoVUludDMyKTEgPDwgKGtOdW1CaXRzIC0gaSAtIDEpOw0KKwkJCQlVSW50MzIgZW5kID0gKFVJbnQzMikxIDw8IChrTnVtQml0cyAtIGkpOw0KKwkJCQlmb3IgKFVJbnQzMiBqID0gc3RhcnQ7IGogPCBlbmQ7IGorKykNCisJCQkJCVByb2JQcmljZXNbal0gPSAoKFVJbnQzMilpIDw8IGtOdW1CaXRQcmljZVNoaWZ0Qml0cykgKw0KKwkJCQkJCSgoKGVuZCAtIGopIDw8IGtOdW1CaXRQcmljZVNoaWZ0Qml0cykgPj4gKGtOdW1CaXRzIC0gaSAtIDEpKTsNCisJCQl9DQorCQl9DQorDQorCQlwdWJsaWMgdWludCBHZXRQcmljZSh1aW50IHN5bWJvbCkNCisJCXsNCisJCQlyZXR1cm4gUHJvYlByaWNlc1soKChQcm9iIC0gc3ltYm9sKSBeICgoLShpbnQpc3ltYm9sKSkpICYgKGtCaXRNb2RlbFRvdGFsIC0gMSkpID4+IGtOdW1Nb3ZlUmVkdWNpbmdCaXRzXTsNCisJCX0NCisJICBwdWJsaWMgdWludCBHZXRQcmljZTAoKSB7IHJldHVybiBQcm9iUHJpY2VzW1Byb2IgPj4ga051bU1vdmVSZWR1Y2luZ0JpdHNdOyB9DQorCQlwdWJsaWMgdWludCBHZXRQcmljZTEoKSB7IHJldHVybiBQcm9iUHJpY2VzWyhrQml0TW9kZWxUb3RhbCAtIFByb2IpID4+IGtOdW1Nb3ZlUmVkdWNpbmdCaXRzXTsgfQ0KKwl9DQorDQorCXN0cnVjdCBCaXREZWNvZGVyDQorCXsNCisJCXB1YmxpYyBjb25zdCBpbnQga051bUJpdE1vZGVsVG90YWxCaXRzID0gMTE7DQorCQlwdWJsaWMgY29uc3QgdWludCBrQml0TW9kZWxUb3RhbCA9ICgxIDw8IGtOdW1CaXRNb2RlbFRvdGFsQml0cyk7DQorCQljb25zdCBpbnQga051bU1vdmVCaXRzID0gNTsNCisNCisJCXVpbnQgUHJvYjsNCisNCisJCXB1YmxpYyB2b2lkIFVwZGF0ZU1vZGVsKGludCBudW1Nb3ZlQml0cywgdWludCBzeW1ib2wpDQorCQl7DQorCQkJaWYgKHN5bWJvbCA9PSAwKQ0KKwkJCQlQcm9iICs9IChrQml0TW9kZWxUb3RhbCAtIFByb2IpID4+IG51bU1vdmVCaXRzOw0KKwkJCWVsc2UNCisJCQkJUHJvYiAtPSAoUHJvYikgPj4gbnVtTW92ZUJpdHM7DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBJbml0KCkgeyBQcm9iID0ga0JpdE1vZGVsVG90YWwgPj4gMTsgfQ0KKw0KKwkJcHVibGljIHVpbnQgRGVjb2RlKFJhbmdlQ29kZXIuRGVjb2RlciByYW5nZURlY29kZXIpDQorCQl7DQorCQkJdWludCBuZXdCb3VuZCA9ICh1aW50KShyYW5nZURlY29kZXIuUmFuZ2UgPj4ga051bUJpdE1vZGVsVG90YWxCaXRzKSAqICh1aW50KVByb2I7DQorCQkJaWYgKHJhbmdlRGVjb2Rlci5Db2RlIDwgbmV3Qm91bmQpDQorCQkJew0KKwkJCQlyYW5nZURlY29kZXIuUmFuZ2UgPSBuZXdCb3VuZDsNCisJCQkJUHJvYiArPSAoa0JpdE1vZGVsVG90YWwgLSBQcm9iKSA+PiBrTnVtTW92ZUJpdHM7DQorCQkJCWlmIChyYW5nZURlY29kZXIuUmFuZ2UgPCBEZWNvZGVyLmtUb3BWYWx1ZSkNCisJCQkJew0KKwkJCQkJcmFuZ2VEZWNvZGVyLkNvZGUgPSAocmFuZ2VEZWNvZGVyLkNvZGUgPDwgOCkgfCAoYnl0ZSlyYW5nZURlY29kZXIuU3RyZWFtLlJlYWRCeXRlKCk7DQorCQkJCQlyYW5nZURlY29kZXIuUmFuZ2UgPDw9IDg7DQorCQkJCX0NCisJCQkJcmV0dXJuIDA7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXJhbmdlRGVjb2Rlci5SYW5nZSAtPSBuZXdCb3VuZDsNCisJCQkJcmFuZ2VEZWNvZGVyLkNvZGUgLT0gbmV3Qm91bmQ7DQorCQkJCVByb2IgLT0gKFByb2IpID4+IGtOdW1Nb3ZlQml0czsNCisJCQkJaWYgKHJhbmdlRGVjb2Rlci5SYW5nZSA8IERlY29kZXIua1RvcFZhbHVlKQ0KKwkJCQl7DQorCQkJCQlyYW5nZURlY29kZXIuQ29kZSA9IChyYW5nZURlY29kZXIuQ29kZSA8PCA4KSB8IChieXRlKXJhbmdlRGVjb2Rlci5TdHJlYW0uUmVhZEJ5dGUoKTsNCisJCQkJCXJhbmdlRGVjb2Rlci5SYW5nZSA8PD0gODsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gMTsNCisJCQl9DQorCQl9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9DUy83emlwL0NvbXByZXNzL1JhbmdlQ29kZXIvUmFuZ2VDb2RlckJpdFRyZWUuY3MgYi9sem1hL0NTLzd6aXAvQ29tcHJlc3MvUmFuZ2VDb2Rlci9SYW5nZUNvZGVyQml0VHJlZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzA5YzE0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUy83emlwL0NvbXByZXNzL1JhbmdlQ29kZXIvUmFuZ2VDb2RlckJpdFRyZWUuY3MKQEAgLTAsMCArMSwxNTcgQEAKK3VzaW5nIFN5c3RlbTsNCisNCituYW1lc3BhY2UgU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlcg0KK3sNCisJc3RydWN0IEJpdFRyZWVFbmNvZGVyDQorCXsNCisJCUJpdEVuY29kZXJbXSBNb2RlbHM7DQorCQlpbnQgTnVtQml0TGV2ZWxzOw0KKw0KKwkJcHVibGljIEJpdFRyZWVFbmNvZGVyKGludCBudW1CaXRMZXZlbHMpDQorCQl7DQorCQkJTnVtQml0TGV2ZWxzID0gbnVtQml0TGV2ZWxzOw0KKwkJCU1vZGVscyA9IG5ldyBCaXRFbmNvZGVyWzEgPDwgbnVtQml0TGV2ZWxzXTsNCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIEluaXQoKQ0KKwkJew0KKwkJCWZvciAodWludCBpID0gMTsgaSA8ICgxIDw8IE51bUJpdExldmVscyk7IGkrKykNCisJCQkJTW9kZWxzW2ldLkluaXQoKTsNCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIEVuY29kZShFbmNvZGVyIHJhbmdlRW5jb2RlciwgVUludDMyIHN5bWJvbCkNCisJCXsNCisJCQlVSW50MzIgbSA9IDE7DQorCQkJZm9yIChpbnQgYml0SW5kZXggPSBOdW1CaXRMZXZlbHM7IGJpdEluZGV4ID4gMDsgKQ0KKwkJCXsNCisJCQkJYml0SW5kZXgtLTsNCisJCQkJVUludDMyIGJpdCA9IChzeW1ib2wgPj4gYml0SW5kZXgpICYgMTsNCisJCQkJTW9kZWxzW21dLkVuY29kZShyYW5nZUVuY29kZXIsIGJpdCk7DQorCQkJCW0gPSAobSA8PCAxKSB8IGJpdDsNCisJCQl9DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBSZXZlcnNlRW5jb2RlKEVuY29kZXIgcmFuZ2VFbmNvZGVyLCBVSW50MzIgc3ltYm9sKQ0KKwkJew0KKwkJCVVJbnQzMiBtID0gMTsNCisJCQlmb3IgKFVJbnQzMiBpID0gMDsgaSA8IE51bUJpdExldmVsczsgaSsrKQ0KKwkJCXsNCisJCQkJVUludDMyIGJpdCA9IHN5bWJvbCAmIDE7DQorCQkJCU1vZGVsc1ttXS5FbmNvZGUocmFuZ2VFbmNvZGVyLCBiaXQpOw0KKwkJCQltID0gKG0gPDwgMSkgfCBiaXQ7DQorCQkJCXN5bWJvbCA+Pj0gMTsNCisJCQl9DQorCQl9DQorDQorCQlwdWJsaWMgVUludDMyIEdldFByaWNlKFVJbnQzMiBzeW1ib2wpDQorCQl7DQorCQkJVUludDMyIHByaWNlID0gMDsNCisJCQlVSW50MzIgbSA9IDE7DQorCQkJZm9yIChpbnQgYml0SW5kZXggPSBOdW1CaXRMZXZlbHM7IGJpdEluZGV4ID4gMDsgKQ0KKwkJCXsNCisJCQkJYml0SW5kZXgtLTsNCisJCQkJVUludDMyIGJpdCA9IChzeW1ib2wgPj4gYml0SW5kZXgpICYgMTsNCisJCQkJcHJpY2UgKz0gTW9kZWxzW21dLkdldFByaWNlKGJpdCk7DQorCQkJCW0gPSAobSA8PCAxKSArIGJpdDsNCisJCQl9DQorCQkJcmV0dXJuIHByaWNlOw0KKwkJfQ0KKw0KKwkJcHVibGljIFVJbnQzMiBSZXZlcnNlR2V0UHJpY2UoVUludDMyIHN5bWJvbCkNCisJCXsNCisJCQlVSW50MzIgcHJpY2UgPSAwOw0KKwkJCVVJbnQzMiBtID0gMTsNCisJCQlmb3IgKGludCBpID0gTnVtQml0TGV2ZWxzOyBpID4gMDsgaS0tKQ0KKwkJCXsNCisJCQkJVUludDMyIGJpdCA9IHN5bWJvbCAmIDE7DQorCQkJCXN5bWJvbCA+Pj0gMTsNCisJCQkJcHJpY2UgKz0gTW9kZWxzW21dLkdldFByaWNlKGJpdCk7DQorCQkJCW0gPSAobSA8PCAxKSB8IGJpdDsNCisJCQl9DQorCQkJcmV0dXJuIHByaWNlOw0KKwkJfQ0KKw0KKwkJcHVibGljIHN0YXRpYyBVSW50MzIgUmV2ZXJzZUdldFByaWNlKEJpdEVuY29kZXJbXSBNb2RlbHMsIFVJbnQzMiBzdGFydEluZGV4LA0KKwkJCWludCBOdW1CaXRMZXZlbHMsIFVJbnQzMiBzeW1ib2wpDQorCQl7DQorCQkJVUludDMyIHByaWNlID0gMDsNCisJCQlVSW50MzIgbSA9IDE7DQorCQkJZm9yIChpbnQgaSA9IE51bUJpdExldmVsczsgaSA+IDA7IGktLSkNCisJCQl7DQorCQkJCVVJbnQzMiBiaXQgPSBzeW1ib2wgJiAxOw0KKwkJCQlzeW1ib2wgPj49IDE7DQorCQkJCXByaWNlICs9IE1vZGVsc1tzdGFydEluZGV4ICsgbV0uR2V0UHJpY2UoYml0KTsNCisJCQkJbSA9IChtIDw8IDEpIHwgYml0Ow0KKwkJCX0NCisJCQlyZXR1cm4gcHJpY2U7DQorCQl9DQorDQorCQlwdWJsaWMgc3RhdGljIHZvaWQgUmV2ZXJzZUVuY29kZShCaXRFbmNvZGVyW10gTW9kZWxzLCBVSW50MzIgc3RhcnRJbmRleCwNCisJCQlFbmNvZGVyIHJhbmdlRW5jb2RlciwgaW50IE51bUJpdExldmVscywgVUludDMyIHN5bWJvbCkNCisJCXsNCisJCQlVSW50MzIgbSA9IDE7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1CaXRMZXZlbHM7IGkrKykNCisJCQl7DQorCQkJCVVJbnQzMiBiaXQgPSBzeW1ib2wgJiAxOw0KKwkJCQlNb2RlbHNbc3RhcnRJbmRleCArIG1dLkVuY29kZShyYW5nZUVuY29kZXIsIGJpdCk7DQorCQkJCW0gPSAobSA8PCAxKSB8IGJpdDsNCisJCQkJc3ltYm9sID4+PSAxOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlzdHJ1Y3QgQml0VHJlZURlY29kZXINCisJew0KKwkJQml0RGVjb2RlcltdIE1vZGVsczsNCisJCWludCBOdW1CaXRMZXZlbHM7DQorDQorCQlwdWJsaWMgQml0VHJlZURlY29kZXIoaW50IG51bUJpdExldmVscykNCisJCXsNCisJCQlOdW1CaXRMZXZlbHMgPSBudW1CaXRMZXZlbHM7DQorCQkJTW9kZWxzID0gbmV3IEJpdERlY29kZXJbMSA8PCBudW1CaXRMZXZlbHNdOw0KKwkJfQ0KKw0KKwkJcHVibGljIHZvaWQgSW5pdCgpDQorCQl7DQorCQkJZm9yICh1aW50IGkgPSAxOyBpIDwgKDEgPDwgTnVtQml0TGV2ZWxzKTsgaSsrKQ0KKwkJCQlNb2RlbHNbaV0uSW5pdCgpOw0KKwkJfQ0KKw0KKwkJcHVibGljIHVpbnQgRGVjb2RlKFJhbmdlQ29kZXIuRGVjb2RlciByYW5nZURlY29kZXIpDQorCQl7DQorCQkJdWludCBtID0gMTsNCisJCQlmb3IgKGludCBiaXRJbmRleCA9IE51bUJpdExldmVsczsgYml0SW5kZXggPiAwOyBiaXRJbmRleC0tKQ0KKwkJCQltID0gKG0gPDwgMSkgKyBNb2RlbHNbbV0uRGVjb2RlKHJhbmdlRGVjb2Rlcik7DQorCQkJcmV0dXJuIG0gLSAoKHVpbnQpMSA8PCBOdW1CaXRMZXZlbHMpOw0KKwkJfQ0KKw0KKwkJcHVibGljIHVpbnQgUmV2ZXJzZURlY29kZShSYW5nZUNvZGVyLkRlY29kZXIgcmFuZ2VEZWNvZGVyKQ0KKwkJew0KKwkJCXVpbnQgbSA9IDE7DQorCQkJdWludCBzeW1ib2wgPSAwOw0KKwkJCWZvciAoaW50IGJpdEluZGV4ID0gMDsgYml0SW5kZXggPCBOdW1CaXRMZXZlbHM7IGJpdEluZGV4KyspDQorCQkJew0KKwkJCQl1aW50IGJpdCA9IE1vZGVsc1ttXS5EZWNvZGUocmFuZ2VEZWNvZGVyKTsNCisJCQkJbSA8PD0gMTsNCisJCQkJbSArPSBiaXQ7DQorCQkJCXN5bWJvbCB8PSAoYml0IDw8IGJpdEluZGV4KTsNCisJCQl9DQorCQkJcmV0dXJuIHN5bWJvbDsNCisJCX0NCisNCisJCXB1YmxpYyBzdGF0aWMgdWludCBSZXZlcnNlRGVjb2RlKEJpdERlY29kZXJbXSBNb2RlbHMsIFVJbnQzMiBzdGFydEluZGV4LA0KKwkJCVJhbmdlQ29kZXIuRGVjb2RlciByYW5nZURlY29kZXIsIGludCBOdW1CaXRMZXZlbHMpDQorCQl7DQorCQkJdWludCBtID0gMTsNCisJCQl1aW50IHN5bWJvbCA9IDA7DQorCQkJZm9yIChpbnQgYml0SW5kZXggPSAwOyBiaXRJbmRleCA8IE51bUJpdExldmVsczsgYml0SW5kZXgrKykNCisJCQl7DQorCQkJCXVpbnQgYml0ID0gTW9kZWxzW3N0YXJ0SW5kZXggKyBtXS5EZWNvZGUocmFuZ2VEZWNvZGVyKTsNCisJCQkJbSA8PD0gMTsNCisJCQkJbSArPSBiaXQ7DQorCQkJCXN5bWJvbCB8PSAoYml0IDw8IGJpdEluZGV4KTsNCisJCQl9DQorCQkJcmV0dXJuIHN5bWJvbDsNCisJCX0NCisJfQ0KK30NCmRpZmYgLS1naXQgYS9sem1hL0NTLzd6aXAvSUNvZGVyLmNzIGIvbHptYS9DUy83emlwL0lDb2Rlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzVjYjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9DUy83emlwL0lDb2Rlci5jcwpAQCAtMCwwICsxLDE1NyBAQAorLy8gSUNvZGVyLmgNCisNCit1c2luZyBTeXN0ZW07DQorDQorbmFtZXNwYWNlIFNldmVuWmlwDQorew0KKwkvLy8gPHN1bW1hcnk+DQorCS8vLyBUaGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gZXJyb3IgaW4gaW5wdXQgc3RyZWFtIG9jY3VycyBkdXJpbmcgZGVjb2RpbmcuDQorCS8vLyA8L3N1bW1hcnk+DQorCWNsYXNzIERhdGFFcnJvckV4Y2VwdGlvbiA6IEFwcGxpY2F0aW9uRXhjZXB0aW9uDQorCXsNCisJCXB1YmxpYyBEYXRhRXJyb3JFeGNlcHRpb24oKTogYmFzZSgiRGF0YSBFcnJvciIpIHsgfQ0KKwl9DQorDQorCS8vLyA8c3VtbWFyeT4NCisJLy8vIFRoZSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gd2hlbiB0aGUgdmFsdWUgb2YgYW4gYXJndW1lbnQgaXMgb3V0c2lkZSB0aGUgYWxsb3dhYmxlIHJhbmdlLg0KKwkvLy8gPC9zdW1tYXJ5Pg0KKwljbGFzcyBJbnZhbGlkUGFyYW1FeGNlcHRpb24gOiBBcHBsaWNhdGlvbkV4Y2VwdGlvbg0KKwl7DQorCQlwdWJsaWMgSW52YWxpZFBhcmFtRXhjZXB0aW9uKCk6IGJhc2UoIkludmFsaWQgUGFyYW1ldGVyIikgeyB9DQorCX0NCisNCisJcHVibGljIGludGVyZmFjZSBJQ29kZVByb2dyZXNzDQorCXsNCisJCS8vLyA8c3VtbWFyeT4NCisJCS8vLyBDYWxsYmFjayBwcm9ncmVzcy4NCisJCS8vLyA8L3N1bW1hcnk+DQorCQkvLy8gPHBhcmFtIG5hbWU9ImluU2l6ZSI+DQorCQkvLy8gaW5wdXQgc2l6ZS4gLTEgaWYgdW5rbm93bi4NCisJCS8vLyA8L3BhcmFtPg0KKwkJLy8vIDxwYXJhbSBuYW1lPSJvdXRTaXplIj4NCisJCS8vLyBvdXRwdXQgc2l6ZS4gLTEgaWYgdW5rbm93bi4NCisJCS8vLyA8L3BhcmFtPg0KKwkJdm9pZCBTZXRQcm9ncmVzcyhJbnQ2NCBpblNpemUsIEludDY0IG91dFNpemUpOw0KKwl9Ow0KKw0KKwlwdWJsaWMgaW50ZXJmYWNlIElDb2Rlcg0KKwl7DQorCQkvLy8gPHN1bW1hcnk+DQorCQkvLy8gQ29kZXMgc3RyZWFtcy4NCisJCS8vLyA8L3N1bW1hcnk+DQorCQkvLy8gPHBhcmFtIG5hbWU9ImluU3RyZWFtIj4NCisJCS8vLyBpbnB1dCBTdHJlYW0uDQorCQkvLy8gPC9wYXJhbT4NCisJCS8vLyA8cGFyYW0gbmFtZT0ib3V0U3RyZWFtIj4NCisJCS8vLyBvdXRwdXQgU3RyZWFtLg0KKwkJLy8vIDwvcGFyYW0+DQorCQkvLy8gPHBhcmFtIG5hbWU9ImluU2l6ZSI+DQorCQkvLy8gaW5wdXQgU2l6ZS4gLTEgaWYgdW5rbm93bi4NCisJCS8vLyA8L3BhcmFtPg0KKwkJLy8vIDxwYXJhbSBuYW1lPSJvdXRTaXplIj4NCisJCS8vLyBvdXRwdXQgU2l6ZS4gLTEgaWYgdW5rbm93bi4NCisJCS8vLyA8L3BhcmFtPg0KKwkJLy8vIDxwYXJhbSBuYW1lPSJwcm9ncmVzcyI+DQorCQkvLy8gY2FsbGJhY2sgcHJvZ3Jlc3MgcmVmZXJlbmNlLg0KKwkJLy8vIDwvcGFyYW0+DQorCQkvLy8gPGV4Y2VwdGlvbiBjcmVmPSJTZXZlblppcC5EYXRhRXJyb3JFeGNlcHRpb24iPg0KKwkJLy8vIGlmIGlucHV0IHN0cmVhbSBpcyBub3QgdmFsaWQNCisJCS8vLyA8L2V4Y2VwdGlvbj4NCisJCXZvaWQgQ29kZShTeXN0ZW0uSU8uU3RyZWFtIGluU3RyZWFtLCBTeXN0ZW0uSU8uU3RyZWFtIG91dFN0cmVhbSwNCisJCQlJbnQ2NCBpblNpemUsIEludDY0IG91dFNpemUsIElDb2RlUHJvZ3Jlc3MgcHJvZ3Jlc3MpOw0KKwl9Ow0KKw0KKwkvKg0KKwlwdWJsaWMgaW50ZXJmYWNlIElDb2RlcjINCisJew0KKwkJIHZvaWQgQ29kZShJU2VxdWVudGlhbEluU3RyZWFtIFtdaW5TdHJlYW1zLA0KKwkJCQljb25zdCBVSW50NjQgW11pblNpemVzLCANCisJCQkJSVNlcXVlbnRpYWxPdXRTdHJlYW0gW11vdXRTdHJlYW1zLCANCisJCQkJVUludDY0IFtdb3V0U2l6ZXMsDQorCQkJCUlDb2RlUHJvZ3Jlc3MgcHJvZ3Jlc3MpOw0KKwl9Ow0KKyAgKi8NCisNCisJLy8vIDxzdW1tYXJ5Pg0KKwkvLy8gUHJvdmlkZXMgdGhlIGZpZWxkcyB0aGF0IHJlcHJlc2VudCBwcm9wZXJ0aWVzIGlkZW5pdGlmaWVycyBmb3IgY29tcHJlc3NpbmcuDQorCS8vLyA8L3N1bW1hcnk+DQorCXB1YmxpYyBlbnVtIENvZGVyUHJvcElEDQorCXsNCisJCS8vLyA8c3VtbWFyeT4NCisJCS8vLyBTcGVjaWZpZXMgZGVmYXVsdCBwcm9wZXJ0eS4NCisJCS8vLyA8L3N1bW1hcnk+DQorCQlEZWZhdWx0UHJvcCA9IDAsDQorCQkvLy8gPHN1bW1hcnk+DQorCQkvLy8gU3BlY2lmaWVzIHNpemUgb2YgZGljdGlvbmFyeS4NCisJCS8vLyA8L3N1bW1hcnk+DQorCQlEaWN0aW9uYXJ5U2l6ZSwNCisJCS8vLyA8c3VtbWFyeT4NCisJCS8vLyBTcGVjaWZpZXMgc2l6ZSBvZiBtZW1vcnkgZm9yIFBQTSouDQorCQkvLy8gPC9zdW1tYXJ5Pg0KKwkJVXNlZE1lbW9yeVNpemUsDQorCQkvLy8gPHN1bW1hcnk+DQorCQkvLy8gU3BlY2lmaWVzIG9yZGVyIGZvciBQUE0gbWV0aG9kcy4NCisJCS8vLyA8L3N1bW1hcnk+DQorCQlPcmRlciwNCisJCS8vLyA8c3VtbWFyeT4NCisJCS8vLyBTcGVjaWZpZXMgQmxvY2sgU2l6ZS4NCisJCS8vLyA8L3N1bW1hcnk+DQorCQlCbG9ja1NpemUsDQorCQkvLy8gPHN1bW1hcnk+DQorCQkvLy8gU3BlY2lmaWVzIG51bWJlciBvZiBwb3N0aW9uIHN0YXRlIGJpdHMgZm9yIExaTUEgKDAgPD0geCA8PSA0KS4NCisJCS8vLyA8L3N1bW1hcnk+DQorCQlQb3NTdGF0ZUJpdHMsDQorCQkvLy8gPHN1bW1hcnk+DQorCQkvLy8gU3BlY2lmaWVzIG51bWJlciBvZiBsaXRlcmFsIGNvbnRleHQgYml0cyBmb3IgTFpNQSAoMCA8PSB4IDw9IDgpLg0KKwkJLy8vIDwvc3VtbWFyeT4NCisJCUxpdENvbnRleHRCaXRzLA0KKwkJLy8vIDxzdW1tYXJ5Pg0KKwkJLy8vIFNwZWNpZmllcyBudW1iZXIgb2YgbGl0ZXJhbCBwb3NpdGlvbiBiaXRzIGZvciBMWk1BICgwIDw9IHggPD0gNCkuDQorCQkvLy8gPC9zdW1tYXJ5Pg0KKwkJTGl0UG9zQml0cywNCisJCS8vLyA8c3VtbWFyeT4NCisJCS8vLyBTcGVjaWZpZXMgbnVtYmVyIG9mIGZhc3QgYnl0ZXMgZm9yIExaKi4NCisJCS8vLyA8L3N1bW1hcnk+DQorCQlOdW1GYXN0Qnl0ZXMsDQorCQkvLy8gPHN1bW1hcnk+DQorCQkvLy8gU3BlY2lmaWVzIG1hdGNoIGZpbmRlci4gTFpNQTogIkJUMiIsICJCVDQiIG9yICJCVDRCIi4NCisJCS8vLyA8L3N1bW1hcnk+DQorCQlNYXRjaEZpbmRlciwNCisJCS8vLyA8c3VtbWFyeT4NCisJCS8vLyBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBtYXRjaCBmaW5kZXIgY3lja2VzLg0KKwkJLy8vIDwvc3VtbWFyeT4NCisJCU1hdGNoRmluZGVyQ3ljbGVzLA0KKwkJLy8vIDxzdW1tYXJ5Pg0KKwkJLy8vIFNwZWNpZmllcyBudW1iZXIgb2YgcGFzc2VzLg0KKwkJLy8vIDwvc3VtbWFyeT4NCisJCU51bVBhc3NlcywNCisJCS8vLyA8c3VtbWFyeT4NCisJCS8vLyBTcGVjaWZpZXMgbnVtYmVyIG9mIGFsZ29yaXRobS4NCisJCS8vLyA8L3N1bW1hcnk+DQorCQlBbGdvcml0aG0sDQorCQkvLy8gPHN1bW1hcnk+DQorCQkvLy8gU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGhyZWFkcy4NCisJCS8vLyA8L3N1bW1hcnk+DQorCQlOdW1UaHJlYWRzLA0KKwkJLy8vIDxzdW1tYXJ5Pg0KKwkJLy8vIFNwZWNpZmllcyBtb2RlIHdpdGggZW5kIG1hcmtlci4NCisJCS8vLyA8L3N1bW1hcnk+DQorCQlFbmRNYXJrZXINCisJfTsNCisNCisNCisJcHVibGljIGludGVyZmFjZSBJU2V0Q29kZXJQcm9wZXJ0aWVzDQorCXsNCisJCXZvaWQgU2V0Q29kZXJQcm9wZXJ0aWVzKENvZGVyUHJvcElEW10gcHJvcElEcywgb2JqZWN0W10gcHJvcGVydGllcyk7DQorCX07DQorDQorCXB1YmxpYyBpbnRlcmZhY2UgSVdyaXRlQ29kZXJQcm9wZXJ0aWVzDQorCXsNCisJCXZvaWQgV3JpdGVDb2RlclByb3BlcnRpZXMoU3lzdGVtLklPLlN0cmVhbSBvdXRTdHJlYW0pOw0KKwl9DQorDQorCXB1YmxpYyBpbnRlcmZhY2UgSVNldERlY29kZXJQcm9wZXJ0aWVzDQorCXsNCisJCXZvaWQgU2V0RGVjb2RlclByb3BlcnRpZXMoYnl0ZVtdIHByb3BlcnRpZXMpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvRE9DLzd6Qy50eHQgYi9sem1hL0RPQy83ekMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Mjc2NzgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0RPQy83ekMudHh0CkBAIC0wLDAgKzEsMTg3IEBACis3eiBBTlNJLUMgRGVjb2RlciA5LjM1DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKzd6IEFOU0ktQyBwcm92aWRlcyA3ei9MWk1BIGRlY29kaW5nLg0KKzd6IEFOU0ktQyB2ZXJzaW9uIGlzIHNpbXBsaWZpZWQgdmVyc2lvbiBwb3J0ZWQgZnJvbSBDKysgY29kZS4NCisNCitMWk1BIGlzIGRlZmF1bHQgYW5kIGdlbmVyYWwgY29tcHJlc3Npb24gbWV0aG9kIG9mIDd6IGZvcm1hdA0KK2luIDctWmlwIGNvbXByZXNzaW9uIHByb2dyYW0gKHd3dy43LXppcC5vcmcpLiBMWk1BIHByb3ZpZGVzIGhpZ2ggDQorY29tcHJlc3Npb24gcmF0aW8gYW5kIHZlcnkgZmFzdCBkZWNvbXByZXNzaW9uLg0KKw0KKw0KK0xJQ0VOU0UNCistLS0tLS0tDQorDQorN3ogQU5TSS1DIERlY29kZXIgaXMgcGFydCBvZiB0aGUgTFpNQSBTREsuDQorTFpNQSBTREsgaXMgd3JpdHRlbiBhbmQgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluIGJ5IElnb3IgUGF2bG92Lg0KKw0KK0ZpbGVzDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorN3pEZWNvZGUuKiAgIC0gTG93IGxldmVsIDd6IGRlY29kaW5nDQorN3pFeHRyYWN0LiogIC0gSGlnaCBsZXZlbCA3eiBkZWNvZGluZw0KKzd6SGVhZGVyLiogICAtIC43eiBmb3JtYXQgY29uc3RhbnRzDQorN3pJbi4qICAgICAgIC0gLjd6IGFyY2hpdmUgb3BlbmluZw0KKzd6SXRlbS4qICAgICAtIC43eiBzdHJ1Y3R1cmVzDQorN3pNYWluLmMgICAgIC0gVGVzdCBhcHBsaWNhdGlvbg0KKw0KKw0KK0hvdyBUbyBVc2UNCistLS0tLS0tLS0tDQorDQorWW91IGNhbiBjcmVhdGUgLjd6IGFyY2hpdmUgd2l0aCA3ei5leGUsIDd6YS5leGUgb3IgN3pyLmV4ZToNCisNCisgIDd6LmV4ZSBhIGFyY2hpdmUuN3ogKi5odG0gLXIgLW14IC1tMGZiPTI1NQ0KKw0KK0lmIHlvdSBoYXZlIGJpZyBudW1iZXIgb2YgZmlsZXMgaW4gYXJjaGl2ZSwgYW5kIHlvdSBuZWVkIGZhc3QgZXh0cmFjdGluZywgDQoreW91IGNhbiB1c2UgcGFydGx5LXNvbGlkIGFyY2hpdmVzOg0KKyAgDQorICA3emEuZXhlIGEgYXJjaGl2ZS43eiAqLmh0bSAtbXM9NTEySyAtciAtbXggLW0wZmI9MjU1IC1tMGQ9NTEySw0KKw0KK0luIHRoYXQgZXhhbXBsZSA3LVppcCB3aWxsIHVzZSA1MTJLQiBzb2xpZCBibG9ja3MuIFNvIGl0IG5lZWRzIHRvIGRlY29tcHJlc3Mgb25seSANCis1MTJLQiBmb3IgZXh0cmFjdGluZyBvbmUgZmlsZSBmcm9tIHN1Y2ggYXJjaGl2ZS4NCisNCisNCitMaW1pdGF0aW9ucyBvZiBjdXJyZW50IHZlcnNpb24gb2YgN3ogQU5TSS1DIERlY29kZXINCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisgLSBJdCByZWFkcyBvbmx5ICJGaWxlTmFtZSIsICJTaXplIiwgIkxhc3RXcml0ZVRpbWUiIGFuZCAiQ1JDIiBpbmZvcm1hdGlvbiBmb3IgZWFjaCBmaWxlIGluIGFyY2hpdmUuDQorIC0gSXQgc3VwcG9ydHMgb25seSBMWk1BIGFuZCBDb3B5IChubyBjb21wcmVzc2lvbikgbWV0aG9kcyB3aXRoIEJDSiBvciBCQ0oyIGZpbHRlcnMuDQorIC0gSXQgY29udmVydHMgb3JpZ2luYWwgVVRGLTE2IFVuaWNvZGUgZmlsZSBuYW1lcyB0byBVVEYtOCBVbmljb2RlIGZpbGUgbmFtZXMuDQorIA0KK1RoZXNlIGxpbWl0YXRpb25zIHdpbGwgYmUgZml4ZWQgaW4gZnV0dXJlIHZlcnNpb25zLg0KKw0KKw0KK1VzaW5nIDd6IEFOU0ktQyBEZWNvZGVyIFRlc3QgYXBwbGljYXRpb246DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitVc2FnZTogN3pEZWMgPGNvbW1hbmQ+IDxhcmNoaXZlX25hbWU+DQorDQorPENvbW1hbmQ+Og0KKyAgZTogRXh0cmFjdCBmaWxlcyBmcm9tIGFyY2hpdmUNCisgIGw6IExpc3QgY29udGVudHMgb2YgYXJjaGl2ZQ0KKyAgdDogVGVzdCBpbnRlZ3JpdHkgb2YgYXJjaGl2ZQ0KKw0KK0V4YW1wbGU6IA0KKw0KKyAgN3pEZWMgbCBhcmNoaXZlLjd6DQorDQorbGlzdHMgY29udGVudHMgb2YgYXJjaGl2ZS43eg0KKw0KKyAgN3pEZWMgZSBhcmNoaXZlLjd6DQorDQorZXh0cmFjdHMgZmlsZXMgZnJvbSBhcmNoaXZlLjd6IHRvIGN1cnJlbnQgZm9sZGVyLg0KKw0KKw0KK0hvdyB0byB1c2UgLjd6IERlY29kZXINCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorTWVtb3J5IGFsbG9jYXRpb24NCit+fn5+fn5+fn5+fn5+fn5+fg0KKw0KKzd6IERlY29kZXIgdXNlcyB0d28gbWVtb3J5IHBvb2xzOg0KKzEpIFRlbXBvcmFyeSBwb29sDQorMikgTWFpbiBwb29sDQorU3VjaCBzY2hlbWUgY2FuIGFsbG93IHlvdSB0byBhdm9pZCBmcmFnbWVudGF0aW9uIG9mIGFsbG9jYXRlZCBibG9ja3MuDQorDQorDQorU3RlcHMgZm9yIHVzaW5nIDd6IGRlY29kZXINCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1VzZSBjb2RlIGF0IDd6TWFpbi5jIGFzIGV4YW1wbGUuDQorDQorMSkgRGVjbGFyZSB2YXJpYWJsZXM6DQorICBpblN0cmVhbSAgICAgICAgICAgICAgICAgLyogaW1wbGVtZW50cyBJTG9va0luU3RyZWFtIGludGVyZmFjZSAqLw0KKyAgQ1N6QXJFeCBkYjsgICAgICAgICAgICAgIC8qIDd6IGFyY2hpdmUgZGF0YWJhc2Ugc3RydWN0dXJlICovDQorICBJU3pBbGxvYyBhbGxvY0ltcDsgICAgICAgLyogbWVtb3J5IGZ1bmN0aW9ucyBmb3IgbWFpbiBwb29sICovDQorICBJU3pBbGxvYyBhbGxvY1RlbXBJbXA7ICAgLyogbWVtb3J5IGZ1bmN0aW9ucyBmb3IgdGVtcG9yYXJ5IHBvb2wgKi8NCisNCisyKSBjYWxsIENyY0dlbmVyYXRlVGFibGUoKTsgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBDUkMgc3RydWN0dXJlcy4NCisNCiszKSBjYWxsIFN6QXJFeF9Jbml0KCZkYik7IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgZGIgc3RydWN0dXJlcy4NCisNCis0KSBjYWxsIFN6QXJFeF9PcGVuKCZkYiwgaW5TdHJlYW0sICZhbGxvY01haW4sICZhbGxvY1RlbXApIHRvIG9wZW4gYXJjaGl2ZQ0KKw0KK1RoaXMgZnVuY3Rpb24gb3BlbnMgYXJjaGl2ZSAiaW5TdHJlYW0iIGFuZCByZWFkcyBoZWFkZXJzIHRvICJkYiIuDQorQWxsIGl0ZW1zIGluICJkYiIgd2lsbCBiZSBhbGxvY2F0ZWQgd2l0aCAiYWxsb2NNYWluIiBmdW5jdGlvbnMuDQorU3pBckV4X09wZW4gZnVuY3Rpb24gYWxsb2NhdGVzIGFuZCBmcmVlcyB0ZW1wb3Jhcnkgc3RydWN0dXJlcyBieSAiYWxsb2NUZW1wIiBmdW5jdGlvbnMuDQorDQorNSkgTGlzdCBpdGVtcyBvciBFeHRyYWN0IGl0ZW1zDQorDQorICBMaXN0aW5nIGNvZGU6DQorICB+fn5+fn5+fn5+fn5+DQorDQorICAgIFVzZSBTekFyRXhfR2V0RmlsZU5hbWVVdGYxNiBmdW5jdGlvbi4gTG9vayBleGFtcGxlIGNvZGUgaW4gQ1xVdGlsXDd6XDd6TWFpbi5jIGZpbGUuIA0KKyAgICANCisNCisgIEV4dHJhY3RpbmcgY29kZToNCisgIH5+fn5+fn5+fn5+fn5+fn4NCisNCisgIFNaX1JFU1VMVCBTekFyX0V4dHJhY3QoDQorICAgIENBcmNoaXZlRGF0YWJhc2VFeCAqZGIsDQorICAgIElMb29rSW5TdHJlYW0gKmluU3RyZWFtLCANCisgICAgVUludDMyIGZpbGVJbmRleCwgICAgICAgICAvKiBpbmRleCBvZiBmaWxlICovDQorICAgIFVJbnQzMiAqYmxvY2tJbmRleCwgICAgICAgLyogaW5kZXggb2Ygc29saWQgYmxvY2sgKi8NCisgICAgQnl0ZSAqKm91dEJ1ZmZlciwgICAgICAgICAvKiBwb2ludGVyIHRvIHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlciAoYWxsb2NhdGVkIHdpdGggYWxsb2NNYWluKSAqLw0KKyAgICBzaXplX3QgKm91dEJ1ZmZlclNpemUsICAgIC8qIGJ1ZmZlciBzaXplIGZvciBvdXRwdXQgYnVmZmVyICovDQorICAgIHNpemVfdCAqb2Zmc2V0LCAgICAgICAgICAgLyogb2Zmc2V0IG9mIHN0cmVhbSBmb3IgcmVxdWlyZWQgZmlsZSBpbiAqb3V0QnVmZmVyICovDQorICAgIHNpemVfdCAqb3V0U2l6ZVByb2Nlc3NlZCwgLyogc2l6ZSBvZiBmaWxlIGluICpvdXRCdWZmZXIgKi8NCisgICAgSVN6QWxsb2MgKmFsbG9jTWFpbiwNCisgICAgSVN6QWxsb2MgKmFsbG9jVGVtcCk7DQorDQorICBJZiB5b3UgbmVlZCB0byBkZWNvbXByZXNzIG1vcmUgdGhhbiBvbmUgZmlsZSwgeW91IGNhbiBzZW5kIHRoZXNlIHZhbHVlcyBmcm9tIHByZXZpb3VzIGNhbGw6DQorICAgIGJsb2NrSW5kZXgsIA0KKyAgICBvdXRCdWZmZXIsIA0KKyAgICBvdXRCdWZmZXJTaXplLA0KKyAgWW91IGNhbiBjb25zaWRlciAib3V0QnVmZmVyIiBhcyBjYWNoZSBvZiBzb2xpZCBibG9jay4gSWYgeW91ciBhcmNoaXZlIGlzIHNvbGlkLCANCisgIGl0IHdpbGwgaW5jcmVhc2UgZGVjb21wcmVzc2lvbiBzcGVlZC4NCisNCisgIEFmdGVyIGRlY29tcHJlc3NpbmcgeW91IG11c3QgZnJlZSAib3V0QnVmZmVyIjoNCisgIGFsbG9jSW1wLkZyZWUob3V0QnVmZmVyKTsNCisNCis2KSBjYWxsIFN6QXJFeF9GcmVlKCZkYiwgYWxsb2NJbXAuRnJlZSkgdG8gZnJlZSBhbGxvY2F0ZWQgaXRlbXMgaW4gImRiIi4NCisNCisNCisNCisNCitNZW1vcnkgcmVxdWlyZW1lbnRzIGZvciAuN3ogZGVjb2RpbmcgDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorTWVtb3J5IHVzYWdlIGZvciBBcmNoaXZlIG9wZW5pbmc6DQorICAtIFRlbXBvcmFyeSBwb29sOg0KKyAgICAgLSBNZW1vcnkgZm9yIHVuY29tcHJlc3NlZCAuN3ogaGVhZGVycw0KKyAgICAgLSBzb21lIG90aGVyIHRlbXBvcmFyeSBibG9ja3MNCisgIC0gTWFpbiBwb29sOg0KKyAgICAgLSBNZW1vcnkgZm9yIGRhdGFiYXNlOiANCisgICAgICAgRXN0aW1hdGVkIHNpemUgb2Ygb25lIGZpbGUgc3RydWN0dXJlcyBpbiBzb2xpZCBhcmNoaXZlOg0KKyAgICAgICAgIC0gU2l6ZSAoNCBvciA4IEJ5dGVzKQ0KKyAgICAgICAgIC0gQ1JDMzIgKDQgYnl0ZXMpDQorICAgICAgICAgLSBMYXN0V3JpdGVUaW1lICg4IGJ5dGVzKQ0KKyAgICAgICAgIC0gU29tZSBmaWxlIGluZm9ybWF0aW9uICg0IGJ5dGVzKQ0KKyAgICAgICAgIC0gRmlsZSBOYW1lICh2YXJpYWJsZSBsZW5ndGgpICsgcG9pbnRlciArIGFsbG9jYXRpb24gc3RydWN0dXJlcw0KKw0KK01lbW9yeSB1c2FnZSBmb3IgYXJjaGl2ZSBEZWNvbXByZXNzaW5nOg0KKyAgLSBUZW1wb3JhcnkgcG9vbDoNCisgICAgIC0gTWVtb3J5IGZvciBMWk1BIGRlY29tcHJlc3Npbmcgc3RydWN0dXJlcw0KKyAgLSBNYWluIHBvb2w6DQorICAgICAtIE1lbW9yeSBmb3IgZGVjb21wcmVzc2VkIHNvbGlkIGJsb2NrDQorICAgICAtIE1lbW9yeSBmb3IgdGVtcHJvcmFyeSBidWZmZXJzLCBpZiBCQ0oyIGZpbGV0ZXIgaXMgdXNlZC4gVXN1YWxseSB0aGVzZSANCisgICAgICAgdGVtcHJvcmFyeSBidWZmZXJzIGNhbiBiZSBhYm91dCAxNSUgb2Ygc29saWQgYmxvY2sgc2l6ZS4gDQorICANCisNCis3eiBEZWNvZGVyIGRvZXNuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb21wcmVzc2VkIGJsb2Nrcy4gDQorSW5zdGVhZCBvZiB0aGlzLCB5b3UgbXVzdCBhbGxvY2F0ZSBidWZmZXIgd2l0aCBkZXNpcmVkIA0KK3NpemUgYmVmb3JlIGNhbGxpbmcgN3ogRGVjb2Rlci4gVXNlIDd6TWFpbi5jIGFzIGV4YW1wbGUuDQorDQorDQorRGVmaW5lcw0KKy0tLS0tLS0NCisNCitfU1pfQUxMT0NfREVCVUcgICAtIGRlZmluZSBpdCBpZiB5b3Ugd2FudCB0byBkZWJ1ZyBhbGxvYy9mcmVlIG9wZXJhdGlvbnMgdG8gc3RkZXJyLg0KKw0KKw0KKy0tLQ0KKw0KK2h0dHA6Ly93d3cuNy16aXAub3JnDQoraHR0cDovL3d3dy43LXppcC5vcmcvc2RrLmh0bWwNCitodHRwOi8vd3d3LjctemlwLm9yZy9zdXBwb3J0Lmh0bWwNCmRpZmYgLS1naXQgYS9sem1hL0RPQy83ekZvcm1hdC50eHQgYi9sem1hL0RPQy83ekZvcm1hdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4Njc4ZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvRE9DLzd6Rm9ybWF0LnR4dApAQCAtMCwwICsxLDQ2OSBAQAorN3ogRm9ybWF0IGRlc2NyaXB0aW9uICg0LjU5KQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitUaGlzIGZpbGUgY29udGFpbnMgZGVzY3JpcHRpb24gb2YgN3ogYXJjaGl2ZSBmb3JtYXQuIA0KKzd6IGFyY2hpdmUgY2FuIGNvbnRhaW4gZmlsZXMgY29tcHJlc3NlZCB3aXRoIGFueSBtZXRob2QuDQorU2VlICJNZXRob2RzLnR4dCIgZm9yIGRlc2NyaXB0aW9uIGZvciBkZWZpbmVkIGNvbXByZXNzaW5nIG1ldGhvZHMuDQorDQorDQorRm9ybWF0IHN0cnVjdHVyZSBPdmVydmlldw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitTb21lIGZpZWxkcyBjYW4gYmUgb3B0aW9uYWwuDQorDQorQXJjaGl2ZSBzdHJ1Y3R1cmUNCit+fn5+fn5+fn5+fn5+fn5+fiAgDQorU2lnbmF0dXJlSGVhZGVyDQorW1BhY2tlZFN0cmVhbXNdDQorW1BhY2tlZFN0cmVhbXNGb3JIZWFkZXJzXQ0KK1sNCisgIEhlYWRlciANCisgIG9yIA0KKyAgew0KKyAgICBQYWNrZWQgSGVhZGVyDQorICAgIEhlYWRlckluZm8NCisgIH0NCitdDQorDQorDQorDQorSGVhZGVyIHN0cnVjdHVyZQ0KK35+fn5+fn5+fn5+fn5+fn4gIA0KK3sNCisgIEFyY2hpdmVQcm9wZXJ0aWVzDQorICBBZGRpdGlvbmFsU3RyZWFtcw0KKyAgew0KKyAgICBQYWNrSW5mbw0KKyAgICB7DQorICAgICAgUGFja1Bvcw0KKyAgICAgIE51bVBhY2tTdHJlYW1zDQorICAgICAgU2l6ZXNbTnVtUGFja1N0cmVhbXNdDQorICAgICAgQ1JDc1tOdW1QYWNrU3RyZWFtc10NCisgICAgfQ0KKyAgICBDb2RlcnNJbmZvDQorICAgIHsNCisgICAgICBOdW1Gb2xkZXJzDQorICAgICAgRm9sZGVyc1tOdW1Gb2xkZXJzXQ0KKyAgICAgIHsNCisgICAgICAgIE51bUNvZGVycw0KKyAgICAgICAgQ29kZXJzSW5mb1tOdW1Db2RlcnNdDQorICAgICAgICB7DQorICAgICAgICAgIElEDQorICAgICAgICAgIE51bUluU3RyZWFtczsNCisgICAgICAgICAgTnVtT3V0U3RyZWFtczsNCisgICAgICAgICAgUHJvcGVydGllc1NpemUNCisgICAgICAgICAgUHJvcGVydGllc1tQcm9wZXJ0aWVzU2l6ZV0NCisgICAgICAgIH0NCisgICAgICAgIE51bUJpbmRQYWlycw0KKyAgICAgICAgQmluZFBhaXJzSW5mb1tOdW1CaW5kUGFpcnNdDQorICAgICAgICB7DQorICAgICAgICAgIEluSW5kZXg7DQorICAgICAgICAgIE91dEluZGV4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgUGFja2VkSW5kaWNlcw0KKyAgICAgIH0NCisgICAgICBVblBhY2tTaXplW0ZvbGRlcnNdW0ZvbGRlcnMuTnVtT3V0c3RyZWFtc10NCisgICAgICBDUkNzW051bUZvbGRlcnNdDQorICAgIH0NCisgICAgU3ViU3RyZWFtc0luZm8NCisgICAgew0KKyAgICAgIE51bVVuUGFja1N0cmVhbXNJbkZvbGRlcnNbTnVtRm9sZGVyc107DQorICAgICAgVW5QYWNrU2l6ZXNbXQ0KKyAgICAgIENSQ3NbXQ0KKyAgICB9DQorICB9DQorICBNYWluU3RyZWFtc0luZm8NCisgIHsNCisgICAgKFNhbWUgYXMgaW4gQWRkaXRpb25hbFN0cmVhbXMpDQorICB9DQorICBGaWxlc0luZm8NCisgIHsNCisgICAgTnVtRmlsZXMNCisgICAgUHJvcGVydGllc1tdDQorICAgIHsNCisgICAgICBJRA0KKyAgICAgIFNpemUNCisgICAgICBEYXRhDQorICAgIH0NCisgIH0NCit9DQorDQorSGVhZGVySW5mbyBzdHJ1Y3R1cmUNCit+fn5+fn5+fn5+fn5+fn5+fn5+fg0KK3sNCisgIChTYW1lIGFzIGluIEFkZGl0aW9uYWxTdHJlYW1zKQ0KK30NCisNCisNCisNCitOb3RlcyBhYm91dCBOb3RhdGlvbiBhbmQgZW5jb2RpbmcNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCis3eiB1c2VzIGxpdHRsZSBlbmRpYW4gZW5jb2RpbmcuDQorDQorN3ogYXJjaGl2ZSBmb3JtYXQgaGFzIG9wdGlvbmFsIGhlYWRlcnMgdGhhdCBhcmUgbWFya2VkIGFzDQorW10NCitIZWFkZXINCitbXQ0KKw0KK1JFQUxfVUlOVDY0IG1lYW5zIHJlYWwgVUlOVDY0Lg0KKw0KK1VJTlQ2NCBtZWFucyByZWFsIFVJTlQ2NCBlbmNvZGVkIHdpdGggdGhlIGZvbGxvd2luZyBzY2hlbWU6DQorDQorICBTaXplIG9mIGVuY29kaW5nIHNlcXVlbmNlIGRlcGVuZHMgZnJvbSBmaXJzdCBieXRlOg0KKyAgRmlyc3RfQnl0ZSAgRXh0cmFfQnl0ZXMgICAgICAgIFZhbHVlDQorICAoYmluYXJ5KSAgIA0KKyAgMHh4eHh4eHggICAgICAgICAgICAgICA6ICggeHh4eHh4eCAgICAgICAgICAgKQ0KKyAgMTB4eHh4eHggICAgQllURSB5WzFdICA6ICggIHh4eHh4eCA8PCAoOCAqIDEpKSArIHkNCisgIDExMHh4eHh4ICAgIEJZVEUgeVsyXSAgOiAoICAgeHh4eHggPDwgKDggKiAyKSkgKyB5DQorICAuLi4NCisgIDExMTExMTB4ICAgIEJZVEUgeVs2XSAgOiAoICAgICAgIHggPDwgKDggKiA2KSkgKyB5DQorICAxMTExMTExMCAgICBCWVRFIHlbN10gIDogICAgICAgICAgICAgICAgICAgICAgICAgeQ0KKyAgMTExMTExMTEgICAgQllURSB5WzhdICA6ICAgICAgICAgICAgICAgICAgICAgICAgIHkNCisNCisNCisNCitQcm9wZXJ0eSBJRHMNCistLS0tLS0tLS0tLS0NCisNCisweDAwID0ga0VuZA0KKw0KKzB4MDEgPSBrSGVhZGVyDQorDQorMHgwMiA9IGtBcmNoaXZlUHJvcGVydGllcw0KKyAgICANCisweDAzID0ga0FkZGl0aW9uYWxTdHJlYW1zSW5mbw0KKzB4MDQgPSBrTWFpblN0cmVhbXNJbmZvDQorMHgwNSA9IGtGaWxlc0luZm8NCisgICAgDQorMHgwNiA9IGtQYWNrSW5mbw0KKzB4MDcgPSBrVW5QYWNrSW5mbw0KKzB4MDggPSBrU3ViU3RyZWFtc0luZm8NCisNCisweDA5ID0ga1NpemUNCisweDBBID0ga0NSQw0KKw0KKzB4MEIgPSBrRm9sZGVyDQorDQorMHgwQyA9IGtDb2RlcnNVblBhY2tTaXplDQorMHgwRCA9IGtOdW1VblBhY2tTdHJlYW0NCisNCisweDBFID0ga0VtcHR5U3RyZWFtDQorMHgwRiA9IGtFbXB0eUZpbGUNCisweDEwID0ga0FudGkNCisNCisweDExID0ga05hbWUNCisweDEyID0ga0NUaW1lDQorMHgxMyA9IGtBVGltZQ0KKzB4MTQgPSBrTVRpbWUNCisweDE1ID0ga1dpbkF0dHJpYnV0ZXMNCisweDE2ID0ga0NvbW1lbnQNCisNCisweDE3ID0ga0VuY29kZWRIZWFkZXINCisNCisweDE4ID0ga1N0YXJ0UG9zDQorMHgxOSA9IGtEdW1teQ0KKw0KKw0KKzd6IGZvcm1hdCBoZWFkZXJzDQorLS0tLS0tLS0tLS0tLS0tLS0NCisNCitTaWduYXR1cmVIZWFkZXINCit+fn5+fn5+fn5+fn5+fn4NCisgIEJZVEUga1NpZ25hdHVyZVs2XSA9IHsnNycsICd6JywgMHhCQywgMHhBRiwgMHgyNywgMHgxQ307DQorDQorICBBcmNoaXZlVmVyc2lvbg0KKyAgew0KKyAgICBCWVRFIE1ham9yOyAgIC8vIG5vdyA9IDANCisgICAgQllURSBNaW5vcjsgICAvLyBub3cgPSAyDQorICB9Ow0KKw0KKyAgVUlOVDMyIFN0YXJ0SGVhZGVyQ1JDOw0KKw0KKyAgU3RhcnRIZWFkZXINCisgIHsNCisgICAgUkVBTF9VSU5UNjQgTmV4dEhlYWRlck9mZnNldA0KKyAgICBSRUFMX1VJTlQ2NCBOZXh0SGVhZGVyU2l6ZQ0KKyAgICBVSU5UMzIgTmV4dEhlYWRlckNSQw0KKyAgfQ0KKw0KKw0KKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KKw0KKw0KK0FyY2hpdmVQcm9wZXJ0aWVzDQorfn5+fn5+fn5+fn5+fn5+fn4NCitCWVRFIE5JRDo6a0FyY2hpdmVQcm9wZXJ0aWVzICgweDAyKQ0KK2ZvciAoOzspDQorew0KKyAgQllURSBQcm9wZXJ0eVR5cGU7DQorICBpZiAoYVR5cGUgPT0gMCkNCisgICAgYnJlYWs7DQorICBVSU5UNjQgUHJvcGVydHlTaXplOw0KKyAgQllURSBQcm9wZXJ0eURhdGFbUHJvcGVydHlTaXplXTsNCit9DQorDQorDQorRGlnZXN0cyAoTnVtU3RyZWFtcykNCit+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCisgIEJZVEUgQWxsQXJlRGVmaW5lZA0KKyAgaWYgKEFsbEFyZURlZmluZWQgPT0gMCkNCisgIHsNCisgICAgZm9yKE51bVN0cmVhbXMpDQorICAgICAgQklUIERlZmluZWQNCisgIH0NCisgIFVJTlQzMiBDUkNzW051bURlZmluZWRdDQorDQorDQorUGFja0luZm8NCit+fn5+fn5+fn5+fn4NCisgIEJZVEUgTklEOjprUGFja0luZm8gICgweDA2KQ0KKyAgVUlOVDY0IFBhY2tQb3MNCisgIFVJTlQ2NCBOdW1QYWNrU3RyZWFtcw0KKw0KKyAgW10NCisgIEJZVEUgTklEOjprU2l6ZSAgICAoMHgwOSkNCisgIFVJTlQ2NCBQYWNrU2l6ZXNbTnVtUGFja1N0cmVhbXNdDQorICBbXQ0KKw0KKyAgW10NCisgIEJZVEUgTklEOjprQ1JDICAgICAgKDB4MEEpDQorICBQYWNrU3RyZWFtRGlnZXN0c1tOdW1QYWNrU3RyZWFtc10NCisgIFtdDQorDQorICBCWVRFIE5JRDo6a0VuZA0KKw0KKw0KK0ZvbGRlcg0KK35+fn5+fg0KKyAgVUlOVDY0IE51bUNvZGVyczsNCisgIGZvciAoTnVtQ29kZXJzKQ0KKyAgew0KKyAgICBCWVRFIA0KKyAgICB7DQorICAgICAgMDozIENvZGVjSWRTaXplDQorICAgICAgNDogIElzIENvbXBsZXggQ29kZXINCisgICAgICA1OiAgVGhlcmUgQXJlIEF0dHJpYnV0ZXMNCisgICAgICA2OiAgUmVzZXJ2ZWQNCisgICAgICA3OiAgVGhlcmUgYXJlIG1vcmUgYWx0ZXJuYXRpdmUgbWV0aG9kcy4gKE5vdCB1c2VkIGFueW1vcmUsIG11c3QgYmUgMCkuDQorICAgIH0gDQorICAgIEJZVEUgQ29kZWNJZFtDb2RlY0lkU2l6ZV0NCisgICAgaWYgKElzIENvbXBsZXggQ29kZXIpDQorICAgIHsNCisgICAgICBVSU5UNjQgTnVtSW5TdHJlYW1zOw0KKyAgICAgIFVJTlQ2NCBOdW1PdXRTdHJlYW1zOw0KKyAgICB9DQorICAgIGlmIChUaGVyZSBBcmUgQXR0cmlidXRlcykNCisgICAgew0KKyAgICAgIFVJTlQ2NCBQcm9wZXJ0aWVzU2l6ZQ0KKyAgICAgIEJZVEUgUHJvcGVydGllc1tQcm9wZXJ0aWVzU2l6ZV0NCisgICAgfQ0KKyAgfQ0KKyAgICANCisgIE51bUJpbmRQYWlycyA9IE51bU91dFN0cmVhbXNUb3RhbCAtIDE7DQorDQorICBmb3IgKE51bUJpbmRQYWlycykNCisgIHsNCisgICAgVUlOVDY0IEluSW5kZXg7DQorICAgIFVJTlQ2NCBPdXRJbmRleDsNCisgIH0NCisNCisgIE51bVBhY2tlZFN0cmVhbXMgPSBOdW1JblN0cmVhbXNUb3RhbCAtIE51bUJpbmRQYWlyczsNCisgIGlmIChOdW1QYWNrZWRTdHJlYW1zID4gMSkNCisgICAgZm9yKE51bVBhY2tlZFN0cmVhbXMpDQorICAgIHsNCisgICAgICBVSU5UNjQgSW5kZXg7DQorICAgIH07DQorDQorDQorDQorDQorQ29kZXJzIEluZm8NCit+fn5+fn5+fn5+fg0KKw0KKyAgQllURSBOSUQ6OmtVblBhY2tJbmZvICAoMHgwNykNCisNCisNCisgIEJZVEUgTklEOjprRm9sZGVyICAoMHgwQikNCisgIFVJTlQ2NCBOdW1Gb2xkZXJzDQorICBCWVRFIEV4dGVybmFsDQorICBzd2l0Y2goRXh0ZXJuYWwpDQorICB7DQorICAgIGNhc2UgMDoNCisgICAgICBGb2xkZXJzW051bUZvbGRlcnNdDQorICAgIGNhc2UgMToNCisgICAgICBVSU5UNjQgRGF0YVN0cmVhbUluZGV4DQorICB9DQorDQorDQorICBCWVRFIElEOjprQ29kZXJzVW5QYWNrU2l6ZSAgKDB4MEMpDQorICBmb3IoRm9sZGVycykNCisgICAgZm9yKEZvbGRlci5OdW1PdXRTdHJlYW1zKQ0KKyAgICAgVUlOVDY0IFVuUGFja1NpemU7DQorDQorDQorICBbXQ0KKyAgQllURSBOSUQ6OmtDUkMgICAoMHgwQSkNCisgIFVuUGFja0RpZ2VzdHNbTnVtRm9sZGVyc10NCisgIFtdDQorDQorICANCisNCisgIEJZVEUgTklEOjprRW5kDQorDQorDQorDQorU3ViU3RyZWFtcyBJbmZvDQorfn5+fn5+fn5+fn5+fn4NCisgIEJZVEUgTklEOjprU3ViU3RyZWFtc0luZm87ICgweDA4KQ0KKw0KKyAgW10NCisgIEJZVEUgTklEOjprTnVtVW5QYWNrU3RyZWFtOyAoMHgwRCkNCisgIFVJTlQ2NCBOdW1VblBhY2tTdHJlYW1zSW5Gb2xkZXJzW051bUZvbGRlcnNdOw0KKyAgW10NCisNCisNCisgIFtdDQorICBCWVRFIE5JRDo6a1NpemUgICgweDA5KQ0KKyAgVUlOVDY0IFVuUGFja1NpemVzW10NCisgIFtdDQorDQorDQorICBbXQ0KKyAgQllURSBOSUQ6OmtDUkMgICgweDBBKQ0KKyAgRGlnZXN0c1tOdW1iZXIgb2Ygc3RyZWFtcyB3aXRoIHVua25vd24gQ1JDXQ0KKyAgW10NCisNCisgIA0KKyAgQllURSBOSUQ6OmtFbmQNCisNCisNCitTdHJlYW1zIEluZm8NCit+fn5+fn5+fn5+fn4NCisNCisgIFtdDQorICBQYWNrSW5mbw0KKyAgW10NCisNCisNCisgIFtdDQorICBDb2RlcnNJbmZvDQorICBbXQ0KKw0KKw0KKyAgW10NCisgIFN1YlN0cmVhbXNJbmZvDQorICBbXQ0KKw0KKyAgQllURSBOSUQ6OmtFbmQNCisNCisNCitGaWxlc0luZm8NCit+fn5+fn5+fn4NCisgIEJZVEUgTklEOjprRmlsZXNJbmZvOyAgKDB4MDUpDQorICBVSU5UNjQgTnVtRmlsZXMNCisNCisgIGZvciAoOzspDQorICB7DQorICAgIEJZVEUgUHJvcGVydHlUeXBlOw0KKyAgICBpZiAoYVR5cGUgPT0gMCkNCisgICAgICBicmVhazsNCisNCisgICAgVUlOVDY0IFNpemU7DQorDQorICAgIHN3aXRjaChQcm9wZXJ0eVR5cGUpDQorICAgIHsNCisgICAgICBrRW1wdHlTdHJlYW06ICAgKDB4MEUpDQorICAgICAgICBmb3IoTnVtRmlsZXMpDQorICAgICAgICAgIEJJVCBJc0VtcHR5U3RyZWFtDQorDQorICAgICAga0VtcHR5RmlsZTogICAgICgweDBGKQ0KKyAgICAgICAgZm9yKEVtcHR5U3RyZWFtcykNCisgICAgICAgICAgQklUIElzRW1wdHlGaWxlDQorDQorICAgICAga0FudGk6ICAgICAgICAgICgweDEwKQ0KKyAgICAgICAgZm9yKEVtcHR5U3RyZWFtcykNCisgICAgICAgICAgQklUIElzQW50aUZpbGUNCisgICAgICANCisgICAgICBjYXNlIGtDVGltZTogKDB4MTIpDQorICAgICAgY2FzZSBrQVRpbWU6ICgweDEzKQ0KKyAgICAgIGNhc2Uga01UaW1lOiAoMHgxNCkNCisgICAgICAgIEJZVEUgQWxsQXJlRGVmaW5lZA0KKyAgICAgICAgaWYgKEFsbEFyZURlZmluZWQgPT0gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgZm9yKE51bUZpbGVzKQ0KKyAgICAgICAgICAgIEJJVCBUaW1lRGVmaW5lZA0KKyAgICAgICAgfQ0KKyAgICAgICAgQllURSBFeHRlcm5hbDsNCisgICAgICAgIGlmKEV4dGVybmFsICE9IDApDQorICAgICAgICAgIFVJTlQ2NCBEYXRhSW5kZXgNCisgICAgICAgIFtdDQorICAgICAgICBmb3IoRGVmaW5kZWQgSXRlbXMpDQorICAgICAgICAgIFVJTlQ2NCBUaW1lDQorICAgICAgICBbXQ0KKyAgICAgIA0KKyAgICAgIGtOYW1lczogICAgICgweDExKQ0KKyAgICAgICAgQllURSBFeHRlcm5hbDsNCisgICAgICAgIGlmKEV4dGVybmFsICE9IDApDQorICAgICAgICAgIFVJTlQ2NCBEYXRhSW5kZXgNCisgICAgICAgIFtdDQorICAgICAgICBmb3IoRmlsZXMpDQorICAgICAgICB7DQorICAgICAgICAgIHdjaGFyX3QgTmFtZXNbTmFtZVNpemVdOw0KKyAgICAgICAgICB3Y2hhcl90IDA7DQorICAgICAgICB9DQorICAgICAgICBbXQ0KKw0KKyAgICAgIGtBdHRyaWJ1dGVzOiAgKDB4MTUpDQorICAgICAgICBCWVRFIEFsbEFyZURlZmluZWQNCisgICAgICAgIGlmIChBbGxBcmVEZWZpbmVkID09IDApDQorICAgICAgICB7DQorICAgICAgICAgIGZvcihOdW1GaWxlcykNCisgICAgICAgICAgICBCSVQgQXR0cmlidXRlc0FyZURlZmluZWQNCisgICAgICAgIH0NCisgICAgICAgIEJZVEUgRXh0ZXJuYWw7DQorICAgICAgICBpZihFeHRlcm5hbCAhPSAwKQ0KKyAgICAgICAgICBVSU5UNjQgRGF0YUluZGV4DQorICAgICAgICBbXQ0KKyAgICAgICAgZm9yKERlZmluZGVkIEF0dHJpYnV0ZXMpDQorICAgICAgICAgIFVJTlQzMiBBdHRyaWJ1dGVzDQorICAgICAgICBbXQ0KKyAgICB9DQorICB9DQorDQorDQorSGVhZGVyDQorfn5+fn5+DQorICBCWVRFIE5JRDo6a0hlYWRlciAoMHgwMSkNCisNCisgIFtdDQorICBBcmNoaXZlUHJvcGVydGllcw0KKyAgW10NCisNCisgIFtdDQorICBCWVRFIE5JRDo6a0FkZGl0aW9uYWxTdHJlYW1zSW5mbzsgKDB4MDMpDQorICBTdHJlYW1zSW5mbw0KKyAgW10NCisNCisgIFtdDQorICBCWVRFIE5JRDo6a01haW5TdHJlYW1zSW5mbzsgICAgKDB4MDQpDQorICBTdHJlYW1zSW5mbw0KKyAgW10NCisNCisgIFtdDQorICBGaWxlc0luZm8NCisgIFtdDQorDQorICBCWVRFIE5JRDo6a0VuZA0KKw0KKw0KK0hlYWRlckluZm8NCit+fn5+fn5+fn5+DQorICBbXQ0KKyAgQllURSBOSUQ6OmtFbmNvZGVkSGVhZGVyOyAoMHgxNykNCisgIFN0cmVhbXNJbmZvIGZvciBFbmNvZGVkIEhlYWRlcg0KKyAgW10NCisNCisNCistLS0NCitFbmQgb2YgZG9jdW1lbnQNCmRpZmYgLS1naXQgYS9sem1hL0RPQy9NZXRob2RzLnR4dCBiL2x6bWEvRE9DL01ldGhvZHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDBkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0RPQy9NZXRob2RzLnR4dApAQCAtMCwwICsxLDEzMiBAQAorNy1aaXAgbWV0aG9kIElEcyAoOS4yNCkNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK0VhY2ggY29tcHJlc3Npb24gb3IgY3J5cHRvIG1ldGhvZCBpbiA3eiBoYXMgdW5pcXVlIGJpbmFyeSB2YWx1ZSAoSUQpLg0KK1RoZSBsZW5ndGggb2YgSUQgaW4gYnl0ZXMgaXMgYXJiaXRyYXJ5IGJ1dCBpdCBjYW4gbm90IGV4Y2VlZCA2MyBiaXRzICg4IGJ5dGVzKS4NCisNCitJZiB5b3Ugd2FudCB0byBhZGQgc29tZSBuZXcgSUQsIHlvdSBoYXZlIHR3byB3YXlzOg0KKzEpIFdyaXRlIHJlcXVlc3QgZm9yIGFsbG9jYXRpbmcgSURzIHRvIDctemlwIGRldmVsb3BlcnMuDQorMikgR2VuZXJhdGUgOC1ieXRlcyBJRDoNCisNCisgICAgM0YgWlogWlogWlogWlogWlogTU0gTU0gDQorDQorICAgIDNGICAgICAgICAgICAgICAtIFByZWZpeCBmb3IgcmFuZG9tIElEcyAoMSBieXRlKQ0KKyAgICBaWiBaWiBaWiBaWiBaWiAgLSBEZXZlbG9wZXIgSUQgKDUgYnl0ZXMpLiBVc2UgcmVhbCByYW5kb20gYnl0ZXMuIA0KKyAgICAgICAgICAgICAgICAgICAgICANCisgICAgTU0gTU0gICAgICAgICAgIC0gTWV0aG9kIElEICgyIGJ5dGVzKQ0KKw0KKyAgICBZb3UgY2FuIG5vdGlmeSA3LVppcCBkZXZlbG9wZXJzIGFib3V0IHlvdXIgRGV2ZWxvcGVyIElEIC8gTWV0aG9kIElELg0KKw0KKyAgICBOb3RlOiBVc2UgbmV3IElEIG9ubHkgaWYgb2xkIGNvZGVjIGNhbiBub3QgZGVjb2RlIGRhdGEgZW5jb2RlZCB3aXRoIG5ldyB2ZXJzaW9uLg0KKw0KKw0KK0xpc3Qgb2YgZGVmaW5lZCBJRHMNCistLS0tLS0tLS0tLS0tLS0tLS0tDQorICAgICAgDQorMDAgLSBDb3B5DQorDQorMDMgLSBEZWx0YQ0KKzA0IC0geDg2IChCQ0opDQorMDUgLSBQUEMgKEJpZyBFbmRpYW4pDQorMDYgLSBJQTY0DQorMDcgLSBBUk0gKGxpdHRsZSBlbmRpYW4pDQorMDggLSBBUk0gVGh1bWIgKGxpdHRsZSBlbmRpYW4pDQorMDkgLSBTUEFSQw0KKzIxIC0gTFpNQTINCisgICAgICAgICAgDQorMDIuLiAtIENvbW1vbg0KKyAgIDAzIFN3YXANCisgICAgICAtIDIgU3dhcDINCisgICAgICAtIDQgU3dhcDQNCisNCiswMy4uIC0gN3oNCisgICAwMSAtIExaTUENCisgICAgICAwMSAtIFZlcnNpb24NCisgIA0KKyAgIDAzIC0gQnJhbmNoDQorICAgICAgMDEgLSB4ODYNCisgICAgICAgICAwMyAgLSBCQ0oNCisgICAgICAgICAxQiAgLSBCQ0oyDQorICAgICAgMDIgLSBQUEMNCisgICAgICAgICAwNSAtIFBQQyAoQmlnIEVuZGlhbikNCisgICAgICAwMyAtIEFscGhhDQorICAgICAgICAgMDEgLSBBbHBoYQ0KKyAgICAgIDA0IC0gSUE2NA0KKyAgICAgICAgIDAxIC0gSUE2NA0KKyAgICAgIDA1IC0gQVJNDQorICAgICAgICAgMDEgLSBBUk0NCisgICAgICAwNiAtIE02OA0KKyAgICAgICAgIDA1IC0gTTY4IChCaWcgRW5kaWFuKQ0KKyAgICAgIDA3IC0gQVJNIFRodW1iDQorICAgICAgICAgMDEgLSBBUk1UDQorICAgICAgMDggLSBTUEFSQw0KKyAgICAgICAgIDA1IC0gU1BBUkMNCisNCisgICAwNCAtIFBQTUQNCisgICAgICAwMSAtIFZlcnNpb24NCisNCisgICA3RiAtDQorICAgICAgMDEgLSBleHBlcmltZW50YWwgbWV0aG9kcy4NCisNCisNCiswNC4uIC0gTWlzYw0KKyAgIDAwIC0gUmVzZXJ2ZWQNCisgICAwMSAtIFppcA0KKyAgICAgIDAwIC0gQ29weSAobm90IHVzZWQpLiBVc2UgezAwfSBpbnN0ZWFkDQorICAgICAgMDEgLSBTaHJpbmsNCisgICAgICAwNiAtIEltcGxvZGUNCisgICAgICAwOCAtIERlZmxhdGUNCisgICAgICAwOSAtIERlZmxhdGU2NA0KKyAgICAgIDEwIC0gSW1wbG9kaW5nDQorICAgICAgMTIgLSBCWmlwMiAobm90IHVzZWQpLiBVc2UgezA0IDAyIDAyfSBpbnN0ZWFkDQorICAgICAgMTQgLSBMWk1BDQorICAgICAgNjAgLSBKcGVnDQorICAgICAgNjEgLSBXYXZQYWNrDQorICAgICAgNjIgLSBQUE1kDQorICAgICAgNjMgLSB3ekFFUw0KKyAgIDAyIC0gQlppcA0KKyAgICAgIDAyIC0gQlppcDINCisgICAwMyAtIFJhcg0KKyAgICAgIDAxIC0gUmFyMTUNCisgICAgICAwMiAtIFJhcjIwDQorICAgICAgMDMgLSBSYXIyOQ0KKyAgIDA0IC0gQXJqDQorICAgICAgMDEgLSBBcmogKDEsMiwzKQ0KKyAgICAgIDAyIC0gQXJqIDQNCisgICAwNSAtIFoNCisgICAwNiAtIEx6aA0KKyAgIDA3IC0gUmVzZXJ2ZWQgZm9yIDd6DQorICAgMDggLSBDYWINCisgICAwOSAtIE5TSVMNCisgICAgICAwMSAtIERlZmxhdGVOU0lTDQorICAgICAgMDIgLSBCWmlwMk5TSVMNCisNCisNCiswNi4uIC0gQ3J5cHRvIA0KKw0KKyAgIEYwIC0gQ2lwaGVycyB3aXRob3V0IGhhc2hpbmcgYWxnbw0KKw0KKyAgICAgIDAxIC0gQUVTDQorICAgICAgICAgMHggLSBBRVMtMTI4DQorICAgICAgICAgNHggLSBBRVMtMTkyDQorICAgICAgICAgOHggLSBBRVMtMjU2DQorICAgICAgICAgQ3ggLSBBRVMNCisNCisgICAgICAgICB4MCAtIEVDQg0KKyAgICAgICAgIHgxIC0gQ0JDDQorICAgICAgICAgeDIgLSBDRkINCisgICAgICAgICB4MyAtIE9GQg0KKyAgICAgICAgIHg0IC0gQ1RSDQorDQorICAgRjEgLSBDb21iaW5lIENpcGhlcnMNCisgICAgICAwMSAtIFppcA0KKyAgICAgICAgIDAxIC0gTWFpbiBaaXAgY3J5cHRvIGFsZ28NCisgICAgICAwMyAtIFJBUg0KKyAgICAgICAgIDAyIC0gDQorICAgICAgICAgMDMgLSBSYXIyOSBBRVMtMTI4ICsgKG1vZGlmaWVkIFNIQS0xKQ0KKyAgICAgIDA3IC0gN3oNCisgICAgICAgICAwMSAtIEFFUy0yNTYgKyBTSEEtMjU2DQorDQorDQorLS0tDQorRW5kIG9mIGRvY3VtZW50DQpkaWZmIC0tZ2l0IGEvbHptYS9ET0MvaW5zdGFsbGVyLnR4dCBiL2x6bWEvRE9DL2luc3RhbGxlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhZDdkYwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvRE9DL2luc3RhbGxlci50eHQKQEAgLTAsMCArMSwxNjYgQEAKKzctWmlwIGZvciBpbnN0YWxsZXJzIDkuMzgNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorNy1aaXAgaXMgYSBmaWxlIGFyY2hpdmVyIGZvciBXaW5kb3dzIE5ULzIwMDAvMjAwMy8yMDA4L1hQL1Zpc3RhLzcvOC8xMC4gDQorDQorNy1aaXAgZm9yIGluc3RhbGxlcnMgaXMgcGFydCBvZiBMWk1BIFNESy4NCitMWk1BIFNESyBpcyB3cml0dGVuIGFuZCBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4gYnkgSWdvciBQYXZsb3YuDQorDQorSXQncyBhbGxvd2VkIHRvIGpvaW4gNy1aaXAgU0ZYIG1vZHVsZSB3aXRoIGFub3RoZXIgc29mdHdhcmUuDQorSXQncyBhbGxvd2VkIHRvIGNoYW5nZSByZXNvdXJjZXMgb2YgNy1aaXAncyBTRlggbW9kdWxlcy4NCisNCisNCitIT1cgdG8gdXNlDQorLS0tLS0tLS0tLS0NCisNCis3enIuZXhlIGlzIHJlZHVjZWQgdmVyc2lvbiBvZiA3emEuZXhlIG9mIDctWmlwLg0KKzd6ci5leGUgc3VwcG9ydHMgb25seSBmb3JtYXQgd2l0aCB0aGVzZSBjb2RlY3M6IExaTUEsIExaTUEyLCBCQ0osIEJDSjIsIEFSTSwgQ29weS4NCisNCitFeGFtcGxlIG9mIGNvbXByZXNzaW5nIGNvbW1hbmQgZm9yIGluc3RhbGxhdGlvbiBwYWNrYWdlczoNCisNCis3enIgYSBhcmNoaXZlLjd6IGZpbGVzDQorDQorN3pTRC5zZnggaXMgU0ZYIG1vZHVsZSBmb3IgaW5zdGFsbGVycy4gN3pTRC5zZnggdXNlcyBtc3ZjcnQuZGxsLg0KKw0KK1NGWCBtb2R1bGVzIGZvciBpbnN0YWxsZXJzIGFsbG93IHRvIGNyZWF0ZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4gDQorU3VjaCBtb2R1bGUgZXh0cmFjdHMgYXJjaGl2ZSB0byB0ZW1wIGZvbGRlciBhbmQgdGhlbiBydW5zIHNwZWNpZmllZCBwcm9ncmFtIGFuZCByZW1vdmVzIA0KK3RlbXAgZmlsZXMgYWZ0ZXIgcHJvZ3JhbSBmaW5pc2hpbmcuIFNlbGYtZXh0cmFjdCBhcmNoaXZlIGZvciBpbnN0YWxsZXJzIG11c3QgYmUgY3JlYXRlZCANCithcyBqb2luaW5nIDMgZmlsZXM6IFNGWF9Nb2R1bGUsIEluc3RhbGxlcl9Db25maWcsIDd6X0FyY2hpdmUuIA0KK0luc3RhbGxlcl9Db25maWcgaXMgb3B0aW9uYWwgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIHRvIGNyZWF0ZSBpbnN0YWxsZXIgDQorc2VsZi1leHRyYWN0IGFyY2hpdmU6DQorDQorY29weSAvYiA3elNELnNmeCArIGNvbmZpZy50eHQgKyBhcmNoaXZlLjd6IGFyY2hpdmUuZXhlDQorDQorVGhlIHNtYWxsZXN0IGluc3RhbGxhdGlvbiBwYWNrYWdlIHNpemUgY2FuIGJlIGFjaGlldmVkLCBpZiBpbnN0YWxsYXRpb24gZmlsZXMgd2FzIA0KK3VuY29tcHJlc3NlZCBiZWZvcmUgaW5jbHVkaW5nIHRvIDd6IGFyY2hpdmUuDQorDQorLXkgc3dpdGNoIGZvciBpbnN0YWxsZXIgbW9kdWxlIChhdCBydW50aW1lKSBzcGVjaWZpZXMgcXVpZXQgbW9kZSBmb3IgZXh0cmFjdGluZy4NCisNCitJbnN0YWxsZXIgQ29uZmlnIGZpbGUgZm9ybWF0DQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fg0KK0NvbmZpZyBmaWxlIGNvbnRhaW5zIGNvbW1hbmRzIGZvciBJbnN0YWxsZXIuIEZpbGUgYmVnaW5zIGZyb20gc3RyaW5nIA0KKzshQEluc3RhbGxAIVVURi04ISBhbmQgZW5kcyB3aXRoIDshQEluc3RhbGxFbmRAIS4gRmlsZSBtdXN0IGJlIHdyaXR0ZW4gDQoraW4gVVRGLTggZW5jb2RpbmcuIEZpbGUgY29udGFpbnMgc3RyaW5nIHBhaXJzOiANCisNCitJRF9TdHJpbmc9IlZhbHVlIg0KKw0KK0lEX1N0cmluZyAgICAgICAgICBEZXNjcmlwdGlvbiANCisNCitUaXRsZSAgICAgICAgICAgICAgVGl0bGUgZm9yIG1lc3NhZ2VzIA0KK0JlZ2luUHJvbXB0ICAgICAgICBCZWdpbiBQcm9tcHQgbWVzc2FnZSANCitQcm9ncmVzcyAgICAgICAgICAgVmFsdWUgY2FuIGJlICJ5ZXMiIG9yICJubyIuIERlZmF1bHQgdmFsdWUgaXMgInllcyIuIA0KK1J1blByb2dyYW0gICAgICAgICBDb21tYW5kIGZvciBleGVjdXRpbmcuIERlZmF1bHQgdmFsdWUgaXMgInNldHVwLmV4ZSIuIA0KKyAgICAgICAgICAgICAgICAgICBTdWJzdHJpbmcgJSVUIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBwYXRoIHRvIHRlbXBvcmFyeSANCisgICAgICAgICAgICAgICAgICAgZm9sZGVyLCB3aGVyZSBmaWxlcyB3ZXJlIGV4dHJhY3RlZCANCitEaXJlY3RvcnkgICAgICAgICAgRGlyZWN0b3J5IHByZWZpeCBmb3IgIlJ1blByb2dyYW0iLiBEZWZhdWx0IHZhbHVlIGlzICIuXFwiIA0KK0V4ZWN1dGVGaWxlICAgICAgICBOYW1lIG9mIGZpbGUgZm9yIGV4ZWN1dGluZyANCitFeGVjdXRlUGFyYW1ldGVycyAgUGFyYW1ldGVycyBmb3IgIkV4ZWN1dGVGaWxlIiANCisNCisNCitZb3UgY2FuIG9taXQgYW55IHN0cmluZyBwYWlyLg0KKw0KK1RoZXJlIGFyZSB0d28gd2F5cyB0byBydW4gcHJvZ3JhbTogUnVuUHJvZ3JhbSBhbmQgRXhlY3V0ZUZpbGUuIA0KK1VzZSBSdW5Qcm9ncmFtLCBpZiB5b3Ugd2FudCB0byBydW4gc29tZSBwcm9ncmFtIGZyb20gLjd6IGFyY2hpdmUuIA0KK1VzZSBFeGVjdXRlRmlsZSwgaWYgeW91IHdhbnQgdG8gb3BlbiBzb21lIGRvY3VtZW50IGZyb20gLjd6IGFyY2hpdmUgb3IgDQoraWYgeW91IHdhbnQgdG8gZXhlY3V0ZSBzb21lIGNvbW1hbmQgZnJvbSBXaW5kb3dzLg0KKw0KK0lmIHlvdSB1c2UgUnVuUHJvZ3JhbSBhbmQgaWYgeW91IHNwZWNpZnkgZW1wdHkgZGlyZWN0b3J5IHByZWZpeDogRGlyZWN0b3J5PSIiLCANCit0aGUgc3lzdGVtIHNlYXJjaGVzIGZvciB0aGUgZXhlY3V0YWJsZSBmaWxlIGluIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6DQorDQorMS4gVGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiAoaW5zdGFsbGVyKSBsb2FkZWQuIA0KKzIuIFRoZSB0ZW1wb3JhcnkgZm9sZGVyLCB3aGVyZSBmaWxlcyB3ZXJlIGV4dHJhY3RlZC4gDQorMy4gVGhlIFdpbmRvd3Mgc3lzdGVtIGRpcmVjdG9yeS4gDQorDQorDQorQ29uZmlnIGZpbGUgRXhhbXBsZXMNCit+fn5+fn5+fn5+fn5+fn5+fn5+fg0KKw0KKzshQEluc3RhbGxAIVVURi04IQ0KK1RpdGxlPSI3LVppcCA0LjAwIg0KK0JlZ2luUHJvbXB0PSJEbyB5b3Ugd2FudCB0byBpbnN0YWxsIHRoZSA3LVppcCA0LjAwPyINCitSdW5Qcm9ncmFtPSJzZXR1cC5leGUiDQorOyFASW5zdGFsbEVuZEAhDQorDQorDQorDQorOyFASW5zdGFsbEAhVVRGLTghDQorVGl0bGU9IjctWmlwIDQuMDAiDQorQmVnaW5Qcm9tcHQ9IkRvIHlvdSB3YW50IHRvIGluc3RhbGwgdGhlIDctWmlwIDQuMDA/Ig0KK0V4ZWN1dGVGaWxlPSI3emlwLm1zaSINCis7IUBJbnN0YWxsRW5kQCENCisNCisNCisNCis7IUBJbnN0YWxsQCFVVEYtOCENCitUaXRsZT0iNy1aaXAgNC4wMSBVcGRhdGUiDQorQmVnaW5Qcm9tcHQ9IkRvIHlvdSB3YW50IHRvIGluc3RhbGwgdGhlIDctWmlwIDQuMDEgVXBkYXRlPyINCitFeGVjdXRlRmlsZT0ibXNpZXhlYy5leGUiDQorRXhlY3V0ZVBhcmFtZXRlcnM9Ii9pIDd6aXAubXNpIFJFSU5TVEFMTD1BTEwgUkVJTlNUQUxMTU9ERT12b211cyINCis7IUBJbnN0YWxsRW5kQCENCisNCisNCisNCitTbWFsbCBTRlggbW9kdWxlcyBmb3IgaW5zdGFsbGVycw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorN3pTMi5zZnggICAgIC0gc21hbGwgU0ZYIG1vZHVsZSAoR1VJIHZlcnNpb24pDQorN3pTMmNvbi5zZnggIC0gc21hbGwgU0ZYIG1vZHVsZSAoQ29uc29sZSB2ZXJzaW9uKQ0KKw0KK1NtYWxsIFNGWCBtb2R1bGVzIHN1cHBvcnQgdGhpcyBjb2RlY3M6IExaTUEsIExaTUEyLCBCQ0osIEJDSjIsIEFSTSwgQ09QWQ0KKw0KK1NtYWxsIFNGWCBtb2R1bGUgaXMgc2ltaWxhciB0byBjb21tb24gU0ZYIG1vZHVsZSBmb3IgaW5zdGFsbGVycy4NCitUaGUgZGlmZmVyZW5jZSAod2hhdCdzIG5ldyBpbiBzbWFsbCB2ZXJzaW9uKToNCisgLSBTbWFsbGVyIHNpemUgKDMwIEtCIHZzIDEwMCBLQikNCisgLSBDIHNvdXJjZSBjb2RlIGluc3RlYWQgb2Yg0SsrDQorIC0gTm8gaW5zdGFsbGVyIENvbmZpZ3VyYXRpb24gZmlsZQ0KKyAtIE5vIGV4dHJhY3RpbmcgcHJvZ3Jlc3Mgd2luZG93DQorIC0gSXQgZGVjb21wcmVzc2VzIHNvbGlkIDd6IGJsb2NrcyAoaXQgY2FuIGJlIHdob2xlIDd6IGFyY2hpdmUpIHRvIFJBTS4NCisgICBTbyB1c2VyIHRoYXQgY2FsbHMgU0ZYIGluc3RhbGxlciBtdXN0IGhhdmUgZnJlZSBSQU0gb2Ygc2l6ZSBvZiBsYXJnZXN0IA0KKyAgIHNvbGlkIDd6IGJsb2NrIChzaXplIG9mIDd6IGFyY2hpdmUgYXQgc2ltcGxlc3QgY2FzZSkuDQorDQorSG93IHRvIHVzZQ0KKy0tLS0tLS0tLS0NCisNCitjb3B5IC9iIDd6UzIuc2Z4ICsgYXJjaGl2ZS43eiBzZnguZXhlDQorDQorV2hlbiB5b3UgcnVuIGluc3RhbGxlciBzZnggbW9kdWxlIChzZnguZXhlKQ0KKzEpIEl0IGNyZWF0ZXMgIjd6Tk5OTk5OTk4iIHRlbXAgZm9sZGVyIGluIHN5c3RlbSB0ZW1wIGZvbGRlci4NCisyKSBJdCBleHRyYWN0cyAuN3ogYXJjaGl2ZSB0byB0aGF0IGZvbGRlcg0KKzMpIEl0IGV4ZWN1dGVzIG9uZSBmaWxlIGZyb20gIjd6Tk5OTk5OTk4iIHRlbXAgZm9sZGVyLiANCis0KSBJdCByZW1vdmVzICI3ek5OTk5OTk5OIiB0ZW1wIGZvbGRlcg0KKw0KK1lvdSBjYW4gc2VuZCBwYXJhbWV0ZXJzIHRvIGluc3RhbGxlciwgYW5kIGluc3RhbGxlciB3aWxsIHRyYW5zZmVyIHRoZW0gdG8gZXh0cmFjdGVkIC5leGUgZmlsZS4NCisNCitTbWFsbCBTRlggdXNlcyAzIGxldmVscyBvZiBwcmlvcml0aWVzIHRvIHNlbGVjdCBmaWxlIHRvIGV4ZWN1dGU6DQorDQorICAxKSBGaWxlcyBpbiByb290IGZvbGRlciBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGFuIGZpbGVzIGluIHN1YmZvbGRlcnMuDQorICAyKSBGaWxlIGV4dGVuc2lvbiBwcmlvcml0aWVzIChmcm9tIGhpZ2ggdG8gbG93IHByaW9yaXR5IG9yZGVyKTogDQorICAgICAgIGJhdCwgY21kLCBleGUsIGluZiwgbXNpLCBjYWIgKHVuZGVyIFdpbmRvd3MgQ0UpLCBodG1sLCBodG0NCisgIDMpIEZpbGUgbmFtZSBwcmlvcml0aWVzIChmcm9tIGhpZ2ggdG8gbG93IHByaW9yaXR5IG9yZGVyKTogDQorICAgICAgIHNldHVwLCBpbnN0YWxsLCBydW4sIHN0YXJ0DQorDQorV2luZG93cyBDRSAoQVJNKSB2ZXJzaW9uIG9mIDd6UzIuc2Z4IGlzIGluY2x1ZGVkIHRvIDctWmlwIGZvciBXaW5kb3dzIE1vYmlsZSBwYWNrYWdlLg0KKw0KKw0KK0V4YW1wbGVzDQorLS0tLS0tLS0NCisNCisxKSBUbyBjcmVhdGUgY29tcHJlc3NlZCBjb25zb2xlIDctWmlwOg0KKw0KKzd6ciBhIGMuN3ogN3ouZXhlIDd6LmRsbCAtbXgNCitjb3B5IC9iIDd6UzJjb24uc2Z4ICsgYy43eiA3ekNvbXByLmV4ZQ0KKzd6Q29tcHIuZXhlIGIgLW1kMjINCisNCisNCisyKSBUbyBjcmVhdGUgY29tcHJlc3NlZCBHVUkgNy1aaXA6DQorDQorN3pyIGEgZy43eiA3emcuZXhlIDd6LmRsbCAtbXgNCitjb3B5IC9iIDd6UzIuc2Z4ICsgZy43eiA3emdDb21wci5leGUNCis3emdDb21wci5leGUgYiAtbWQyMg0KKw0KKw0KKzMpIFRvIG9wZW4gc29tZSBmaWxlOg0KKw0KKzd6ciBhIGguN3ogcmVhZG1lLnR4dCAtbXgNCitjb3B5IC9iIDd6UzIuc2Z4ICsgaC43eiA3elR4dC5leGUgDQorN3pUeHQuZXhlDQpkaWZmIC0tZ2l0IGEvbHptYS9ET0MvbHptYS1oaXN0b3J5LnR4dCBiL2x6bWEvRE9DL2x6bWEtaGlzdG9yeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5ODM1OAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvRE9DL2x6bWEtaGlzdG9yeS50eHQKQEAgLTAsMCArMSwzMDYgQEAKK0hJU1RPUlkgb2YgdGhlIExaTUEgU0RLDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCis5LjM4IGJldGEgICAgICAyMDE1LTAxLTAzDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkNCistIFRoZSBCVUcgaW4gOS4zMC05LjM3IHdhcyBmaXhlZDoNCisgIElBcmNoaXZlR2V0UmF3UHJvcHMgaW50ZXJmYWNlIHdhcyBkaXNhYmxlZCBmb3IgN3ogYXJjaGl2ZXMuDQorLSBUaGUgQlVHIGluIDkuMjYtOS4zNiB3YXMgZml4ZWQ6DQorICBTb21lIGNvZGUgaW4gQ1BQXDd6aXBcQXJjaGl2ZVw3elwgd29ya2VkIGNvcnJlY3RseSBvbmx5IHVuZGVyIFdpbmRvd3MuDQorDQorDQorOS4zNiBiZXRhICAgICAgMjAxNC0xMi0yNg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JDQorLSBUaGUgQlVHIGluIGNvbW1hbmQgbGluZSB2ZXJzaW9uIHdhcyBmaXhlZDoNCisgIDctWmlwIGNyZWF0ZWQgdGVtcG9yYXJ5IGFyY2hpdmUgaW4gY3VycmVudCBmb2xkZXIgZHVyaW5nIHVwZGF0ZSBhcmNoaXZlDQorICBvcGVyYXRpb24sIGlmIC13e1BhdGh9IHN3aXRjaCB3YXMgbm90IHNwZWNpZmllZC4gDQorICBUaGUgZml4ZWQgNy1aaXAgY3JlYXRlcyB0ZW1wb3JhcnkgYXJjaGl2ZSBpbiBmb2xkZXIgdGhhdCBjb250YWlucyB1cGRhdGVkIGFyY2hpdmUuDQorLSBUaGUgQlVHIGluIDkuMzMtOS4zNSB3YXMgZml4ZWQ6DQorICA3LVppcCBzaWxlbnRseSBpZ25vcmVkIGZpbGUgcmVhZGluZyBlcnJvcnMgZHVyaW5nIDd6IG9yIGd6IGFyY2hpdmUgY3JlYXRpb24sDQorICBhbmQgdGhlIGNyZWF0ZWQgYXJjaGl2ZSBjb250YWluZWQgb25seSBwYXJ0IG9mIGZpbGUgdGhhdCB3YXMgcmVhZCBiZWZvcmUgZXJyb3IuDQorICBUaGUgZml4ZWQgNy1aaXAgc3RvcHMgYXJjaGl2ZSBjcmVhdGlvbiBhbmQgaXQgcmVwb3J0cyBhYm91dCBlcnJvci4NCisNCisNCis5LjM1IGJldGEgICAgICAyMDE0LTEyLTA3DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkNCistIDd6ci5leGUgbm93IHN1cHBvcnQgQUVTIGVuY3J5cHRpb24uDQorLSBTRlggbXVkdWxlcyB3ZXJlIGFkZGVkIHRvIExaTUEgU0RLDQorLSBTb21lIGJ1Z3Mgd2VyZSBmaXhlZC4NCisNCisNCis5LjIxIGJldGEgICAgICAyMDExLTA0LTExDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkNCistIE5ldyBjbGFzcyBGU3RyaW5nIGZvciBmaWxlIG5hbWVzIGF0IGZpbGUgc3lzdGVtcy4NCistIFNwZWVkIG9wdGltaXphdGlvbiBpbiBDUkMgY29kZSBmb3IgYmlnLWVuZGlhbiBDUFVzLg0KKy0gVGhlIEJVRyBpbiBMem1hMkRlYy5jIHdhcyBmaXhlZDoNCisgICAgTHptYTJEZWNvZGUgZnVuY3Rpb24gZGlkbid0IHdvcmsuDQorDQorDQorOS4xOCBiZXRhICAgICAgMjAxMC0xMS0wMg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JDQorLSBOZXcgc21hbGwgU0ZYIG1vZHVsZSBmb3IgaW5zdGFsbGVycyAoU2Z4U2V0dXApLg0KKw0KKw0KKzkuMTIgYmV0YSAgICAgIDIwMTAtMDMtMjQNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBUaGUgQlVHIGluIExaTUEgU0RLIDkuKiB3YXMgZml4ZWQ6IExaTUEyIGNvZGVjIGRpZG4ndCB3b3JrLA0KKyAgaWYgbW9yZSB0aGFuIDEwIHRocmVhZHMgd2VyZSB1c2VkIChvciBtb3JlIHRoYW4gMjAgdGhyZWFkcyBpbiBzb21lIG1vZGVzKS4NCisNCisNCis5LjExIGJldGEgICAgICAyMDEwLTAzLTE1DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy0gUFBNZCBjb21wcmVzc2lvbiBtZXRob2Qgc3VwcG9ydA0KKyAgIA0KKw0KKzkuMDkgICAgICAgICAgIDIwMDktMTItMTINCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBUaGUgYnVnIHdhcyBmaXhlZDoNCisgICBVdGYxNl9Ub19VdGY4IGZ1bnN0aW9ucyBpbiBVVEZDb252ZXJ0LmNwcCBhbmQgN3pNYWluLmMNCisgICBpbmNvcnJlY3RseSBjb252ZXJ0ZWQgc3Vycm9nYXRlIGNoYXJhY3RlcnMgKHRoZSBjb2RlID49IDB4MTAwMDApIHRvIFVURi04Lg0KKy0gU29tZSBidWdzIHdlcmUgZml4ZWQNCisNCisNCis5LjA2ICAgICAgICAgICAyMDA5LTA4LTE3DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy0gU29tZSBjaGFuZ2VzIGluIEFOU0ktQyA3eiBEZWNvZGVyIGludGVyZmFjZXMuDQorDQorDQorOS4wNCAgICAgICAgICAgMjAwOS0wNS0zMA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIExaTUEyIGNvbXByZXNzaW9uIG1ldGhvZCBzdXBwb3J0DQorLSB4eiBmb3JtYXQgc3VwcG9ydA0KKw0KKw0KKzQuNjUgICAgICAgICAgIDIwMDktMDItMDMNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBTb21lIG1pbm9yIGZpeGVzDQorDQorDQorNC42MyAgICAgICAgICAgMjAwOC0xMi0zMQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIFNvbWUgbWlub3IgZml4ZXMNCisNCisNCis0LjYxIGJldGEgICAgICAyMDA4LTExLTIzDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy0gVGhlIGJ1ZyBpbiBBTlNJLUMgTFpNQSBEZWNvZGVyIHdhcyBmaXhlZDoNCisgICAgSWYgZW5jb2RlZCBzdHJlYW0gd2FzIGNvcnJ1cHRlZCwgZGVjb2RlciBjb3VsZCBhY2Nlc3MgbWVtb3J5IA0KKyAgICBvdXRzaWRlIG9mIGFsbG9jYXRlZCByYW5nZS4NCistIFNvbWUgY2hhbmdlcyBpbiBBTlNJLUMgN3ogRGVjb2RlciBpbnRlcmZhY2VzLg0KKy0gTFpNQSBTREsgaXMgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluLg0KKw0KKw0KKzQuNjAgYmV0YSAgICAgIDIwMDgtMDgtMTkNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBTb21lIG1pbm9yIGZpeGVzLg0KKw0KKw0KKzQuNTkgYmV0YSAgICAgIDIwMDgtMDgtMTMNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBUaGUgYnVnIHdhcyBmaXhlZDoNCisgICAgTFpNQSBFbmNvZGVyIGluIGZhc3QgY29tcHJlc3Npb24gbW9kZSBjb3VsZCBhY2Nlc3MgbWVtb3J5IG91dHNpZGUgb2YgDQorICAgIGFsbG9jYXRlZCByYW5nZSBpbiBzb21lIHJhcmUgY2FzZXMuDQorDQorDQorNC41OCBiZXRhICAgICAgMjAwOC0wNS0wNQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIEFOU0ktQyBMWk1BIERlY29kZXIgd2FzIHJld3JpdHRlbiBmb3Igc3BlZWQgb3B0aW1pemF0aW9ucy4NCistIEFOU0ktQyBMWk1BIEVuY29kZXIgd2FzIGluY2x1ZGVkIHRvIExaTUEgU0RLLg0KKy0gQysrIExaTUEgY29kZSBub3cgaXMganVzdCB3cmFwcGVyIG92ZXIgQU5TSS1DIGNvZGUuDQorDQorDQorNC41NyAgICAgICAgICAgMjAwNy0xMi0xMg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIFNwZWVkIG9wdGltaXphdGlvbnMgaW4g0SsrIExaTUEgRGVjb2Rlci4gDQorLSBTbWFsbCBjaGFuZ2VzIGZvciBtb3JlIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEMvQysrIGNvbXBpbGVycy4NCisNCisNCis0LjQ5IGJldGEgICAgICAyMDA3LTA3LTA1DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy0gLjd6IEFOU0ktQyBEZWNvZGVyOg0KKyAgICAgLSBub3cgaXQgc3VwcG9ydHMgQkNKIGFuZCBCQ0oyIGZpbHRlcnMNCisgICAgIC0gbm93IGl0IHN1cHBvcnRzIGZpbGVzIGxhcmdlciB0aGFuIDQgR0IuDQorICAgICAtIG5vdyBpdCBzdXBwb3J0cyAiTGFzdCBXcml0ZSBUaW1lIiBmaWVsZCBmb3IgZmlsZXMuDQorLSBDKysgY29kZSBmb3IgLjd6IGFyY2hpdmVzIGNvbXByZXNzaW5nL2RlY29tcHJlc3NpbmcgZnJvbSA3LXppcCANCisgIHdhcyBpbmNsdWRlZCB0byBMWk1BIFNESy4NCisgIA0KKw0KKzQuNDMgICAgICAgICAgIDIwMDYtMDYtMDQNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBTbWFsbCBjaGFuZ2VzIGZvciBtb3JlIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEMvQysrIGNvbXBpbGVycy4NCisgIA0KKw0KKzQuNDIgICAgICAgICAgIDIwMDYtMDUtMTUNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBTbWFsbCBjaGFuZ2VzIGluIC5oIGZpbGVzIGluIEFOU0ktQyB2ZXJzaW9uLg0KKyAgDQorDQorNC4zOSBiZXRhICAgICAgMjAwNi0wNC0xNA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIFRoZSBidWcgaW4gdmVyc2lvbnMgNC4zM2I6NC4zOGIgd2FzIGZpeGVkOg0KKyAgQysrIHZlcnNpb24gb2YgTFpNQSBlbmNvZGVyIGNvdWxkIG5vdCBjb3JyZWN0bHkgY29tcHJlc3MgDQorICBmaWxlcyBsYXJnZXIgdGhhbiAyIEdCIHdpdGggSEM0IG1hdGNoIGZpbmRlciAoLW1maGM0KS4NCisgIA0KKw0KKzQuMzcgYmV0YSAgICAgIDIwMDUtMDQtMDYNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBGaXhlcyBpbiBDKysgY29kZTogY29kZSBjb3VsZCBubyBiZSBjb21waWxlZCBpZiBfTk9fRVhDRVBUSU9OUyB3YXMgZGVmaW5lZC4gDQorDQorDQorNC4zNSBiZXRhICAgICAgMjAwNS0wMy0wMg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIFRoZSBidWcgd2FzIGZpeGVkIGluIEMrKyB2ZXJzaW9uIG9mIExaTUEgRGVjb2RlcjoNCisgICAgSWYgZW5jb2RlZCBzdHJlYW0gd2FzIGNvcnJ1cHRlZCwgZGVjb2RlciBjb3VsZCBhY2Nlc3MgbWVtb3J5IA0KKyAgICBvdXRzaWRlIG9mIGFsbG9jYXRlZCByYW5nZS4NCisNCisNCis0LjM0IGJldGEgICAgICAyMDA2LTAyLTI3DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy0gQ29tcHJlc3Npbmcgc3BlZWQgYW5kIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGNvbXByZXNzaW5nIHdlcmUgaW5jcmVhc2VkDQorLSBMWk1BIG5vdyBjYW4gdXNlIG9ubHkgdGhlc2UgbWF0Y2ggZmluZGVyczogSEM0LCBCVDIsIEJUMywgQlQ0DQorDQorDQorNC4zMiAgICAgICAgICAgMjAwNS0xMi0wOQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIEphdmEgdmVyc2lvbiBvZiBMWk1BIFNESyB3YXMgaW5jbHVkZWQNCisNCisNCis0LjMwICAgICAgICAgICAyMDA1LTExLTIwDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy0gQ29tcHJlc3Npb24gcmF0aW8gd2FzIGltcHJvdmVkIGluIC1hMiBtb2RlDQorLSBTcGVlZCBvcHRpbWl6YXRpb25zIGZvciBjb21wcmVzc2luZyBpbiAtYTIgbW9kZQ0KKy0gLWZiIHN3aXRjaCBub3cgc3VwcG9ydHMgdmFsdWVzIHVwIHRvIDI3Mw0KKy0gVGhlIGJ1ZyBpbiA3el9DICg3ekluLmMpIHdhcyBmaXhlZDoNCisgIEl0IHVzZWQgQWxsb2MvRnJlZSBmdW5jdGlvbnMgZnJvbSBkaWZmZXJlbnQgbWVtb3J5IHBvb2xzLg0KKyAgU28gaWYgcHJvZ3JhbSB1c2VkIHR3byBtZW1vcnkgcG9vbHMsIGl0IHdvcmtlZCBpbmNvcnJlY3RseS4NCistIDd6X0M6IC43eiBmb3JtYXQgc3VwcG9ydGluZyB3YXMgaW1wcm92ZWQNCistIExaTUEjIFNESyAoQyMuTkVUIHZlcnNpb24pIHdhcyBpbmNsdWRlZA0KKw0KKw0KKzQuMjcgKFVwZGF0ZWQpIDIwMDUtMDktMjENCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBTb21lIEdVSURzL2ludGVyZmFjZXMgaW4gQysrIHdlcmUgY2hhbmdlZC4NCisgSVN0cmVhbS5oOg0KKyAgIElTZXF1ZW50aWFsSW5TdHJlYW06OlJlYWQgbm93IHdvcmtzIGFzIG9sZCBSZWFkUGFydA0KKyAgIElTZXF1ZW50aWFsT3V0U3RyZWFtOjpXcml0ZSBub3cgd29ya3MgYXMgb2xkIFdyaXRlUGFydA0KKw0KKw0KKzQuMjcgICAgICAgICAgIDIwMDUtMDgtMDcNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBUaGUgYnVnIGluIEx6bWFEZWNvZGVTaXplLmMgd2FzIGZpeGVkOg0KKyAgIGlmIF9MWk1BX0lOX0NCIGFuZCBfTFpNQV9PVVRfUkVBRCB3ZXJlIGRlZmluZWQsDQorICAgZGVjb21wcmVzc2luZyB3b3JrZWQgaW5jb3JyZWN0bHkuDQorDQorDQorNC4yNiAgICAgICAgICAgMjAwNS0wOC0wNQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIEZpeGVzIGluIDd6X0MgY29kZSBhbmQgTHptYVRlc3QuYzoNCisgIHByZXZpb3VzIHZlcnNpb25zIGNvdWxkIHdvcmsgaW5jb3JyZWN0bHksDQorICBpZiBtYWxsb2MoMCkgcmV0dXJucyAwDQorDQorDQorNC4yMyAgICAgICAgICAgMjAwNS0wNi0yOQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIFNtYWxsIGZpeGVzIGluIEMrKyBjb2RlDQorDQorDQorNC4yMiAgICAgICAgICAgMjAwNS0wNi0xMA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIFNtYWxsIGZpeGVzDQorDQorDQorNC4yMSAgICAgICAgICAgMjAwNS0wNi0wOA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIEludGVyZmFjZXMgZm9yIEFOU0ktQyBMWk1BIERlY29kZXIgKEx6bWFEZWNvZGUuYykgd2VyZSBjaGFuZ2VkDQorLSBOZXcgYWRkaXRpb25hbCB2ZXJzaW9uIG9mIEFOU0ktQyBMWk1BIERlY29kZXIgd2l0aCB6bGliLWxpa2UgaW50ZXJmYWNlOg0KKyAgICAtIEx6bWFTdGF0ZURlY29kZS5oDQorICAgIC0gTHptYVN0YXRlRGVjb2RlLmMNCisgICAgLSBMem1hU3RhdGVUZXN0LmMNCistIEFOU0ktQyBMWk1BIERlY29kZXIgbm93IGNhbiBkZWNvbXByZXNzIGZpbGVzIGxhcmdlciB0aGFuIDQgR0INCisNCisNCis0LjE3ICAgICAgICAgICAyMDA1LTA0LTE4DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy0gTmV3IGV4YW1wbGUgZm9yIFJBTS0+UkFNIGNvbXByZXNzaW5nL2RlY29tcHJlc3Npbmc6IA0KKyAgTFpNQSArIEJDSiAoZmlsdGVyIGZvciB4ODYgY29kZSk6DQorICAgIC0gTHptYVJhbS5oDQorICAgIC0gTHptYVJhbS5jcHANCisgICAgLSBMem1hUmFtRGVjb2RlLmgNCisgICAgLSBMem1hUmFtRGVjb2RlLmMNCisgICAgLSAtZjg2IHN3aXRjaCBmb3IgbHptYS5leGUNCisNCisNCis0LjE2ICAgICAgICAgICAyMDA1LTAzLTI5DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy0gVGhlIGJ1ZyB3YXMgZml4ZWQgaW4gTHptYURlY29kZS5jIChBTlNJLUMgTFpNQSBEZWNvZGVyKTogDQorICAgSWYgX0xaTUFfT1VUX1JFQUQgd2FzIGRlZmluZWQsIGFuZCBpZiBlbmNvZGVkIHN0cmVhbSB3YXMgY29ycnVwdGVkLA0KKyAgIGRlY29kZXIgY291bGQgYWNjZXNzIG1lbW9yeSBvdXRzaWRlIG9mIGFsbG9jYXRlZCByYW5nZS4NCistIFNwZWVkIG9wdGltaXphdGlvbiBvZiBBTlNJLUMgTFpNQSBEZWNvZGVyIChub3cgaXQncyBhYm91dCAyMCUgZmFzdGVyKS4NCisgIE9sZCB2ZXJzaW9uIG9mIExaTUEgRGVjb2RlciBub3cgaXMgaW4gZmlsZSBMem1hRGVjb2RlU2l6ZS5jLiANCisgIEx6bWFEZWNvZGVTaXplLmMgY2FuIHByb3ZpZGUgc2xpZ2h0bHkgc21hbGxlciBjb2RlIHRoYW4gTHptYURlY29kZS5jDQorLSBTbWFsbCBzcGVlZCBvcHRpbWl6YXRpb24gaW4gTFpNQSBDKysgY29kZQ0KKy0gZmlsdGVyIGZvciBTUEFSQydzIGNvZGUgd2FzIGFkZGVkDQorLSBTaW1wbGlmaWVkIHZlcnNpb24gb2YgLjd6IEFOU0ktQyBEZWNvZGVyIHdhcyBpbmNsdWRlZA0KKw0KKw0KKzQuMDYgICAgICAgICAgIDIwMDQtMDktMDUNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBUaGUgYnVnIGluIHY0LjA1IHdhcyBmaXhlZDoNCisgICAgTFpNQS1FbmNvZGVyIGRpZG4ndCByZWxlYXNlIG91dHB1dCBzdHJlYW0gaW4gc29tZSBjYXNlcy4NCisNCisNCis0LjA1ICAgICAgICAgICAyMDA0LTA4LTI1DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy0gU291cmNlIGNvZGUgb2YgZmlsdGVycyBmb3IgeDg2LCBJQS02NCwgQVJNLCBBUk0tVGh1bWIgDQorICBhbmQgUG93ZXJQQyBjb2RlIHdhcyBpbmNsdWRlZCB0byBTREsNCistIFNvbWUgaW50ZXJuYWwgbWlub3IgY2hhbmdlcw0KKw0KKw0KKzQuMDQgICAgICAgICAgIDIwMDQtMDctMjgNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBNb3JlIGNvbXBhdGliaWxpdHkgd2l0aCBzb21lIEMrKyBjb21waWxlcnMNCisNCisNCis0LjAzICAgICAgICAgICAyMDA0LTA2LTE4DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy0gIkJlbmNobWFyayIgY29tbWFuZCB3YXMgYWRkZWQuIEl0IG1lYXN1cmVzIGNvbXByZXNzaW5nIA0KKyAgYW5kIGRlY29tcHJlc3Npbmcgc3BlZWQgYW5kIHNob3dzIHJhdGluZyB2YWx1ZXMuIA0KKyAgQWxzbyBpdCBjaGVja3MgaGFyZHdhcmUgZXJyb3JzLg0KKw0KKw0KKzQuMDIgICAgICAgICAgIDIwMDQtMDYtMTANCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBDKysgTFpNQSBFbmNvZGVyL0RlY29kZXIgY29kZSBub3cgaXMgbW9yZSBwb3J0YWJsZQ0KKyAgYW5kIGl0IGNhbiBiZSBjb21waWxlZCBieSBHQ0Mgb24gTGludXguDQorDQorDQorNC4wMSAgICAgICAgICAgMjAwNC0wMi0xNQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIFNvbWUgZGV0ZWN0aW9uIG9mIGRhdGEgY29ycnVwdGlvbiB3YXMgZW5hYmxlZC4NCisgICAgTHptYURlY29kZS5jIC8gUmFuZ2VEZWNvZGVyUmVhZEJ5dGUNCisgICAgLi4uLi4NCisgICAgew0KKyAgICAgIHJkLT5FeHRyYUJ5dGVzID0gMTsNCisgICAgICByZXR1cm4gMHhGRjsNCisgICAgfQ0KKw0KKw0KKzQuMDAgICAgICAgICAgIDIwMDQtMDItMTMNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBPcmlnaW5hbCB2ZXJzaW9uIG9mIExaTUEgU0RLDQorDQorDQorDQorSElTVE9SWSBvZiB0aGUgTFpNQQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0NCisgIDIwMDEtMjAwODogIEltcHJvdmVtZW50cyB0byBMWk1BIGNvbXByZXNzaW5nL2RlY29tcHJlc3NpbmcgY29kZSwgDQorICAgICAgICAgICAgICBrZWVwaW5nIGNvbXBhdGliaWxpdHkgd2l0aCBvcmlnaW5hbCBMWk1BIGZvcm1hdA0KKyAgMTk5Ni0yMDAxOiAgRGV2ZWxvcG1lbnQgb2YgTFpNQSBjb21wcmVzc2lvbiBmb3JtYXQNCisNCisgIFNvbWUgbWlsZXN0b25lczoNCisNCisgIDIwMDEtMDgtMzA6IExaTUEgY29tcHJlc3Npb24gd2FzIGFkZGVkIHRvIDctWmlwDQorICAxOTk5LTAxLTAyOiBGaXJzdCB2ZXJzaW9uIG9mIDctWmlwIHdhcyByZWxlYXNlZA0KKyAgDQorDQorRW5kIG9mIGRvY3VtZW50DQpkaWZmIC0tZ2l0IGEvbHptYS9ET0MvbHptYS1zZGsudHh0IGIvbHptYS9ET0MvbHptYS1zZGsudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTIzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0RPQy9sem1hLXNkay50eHQKQEAgLTAsMCArMSwzNTYgQEAKK0xaTUEgU0RLIDkuMzgNCistLS0tLS0tLS0tLS0tDQorDQorTFpNQSBTREsgcHJvdmlkZXMgdGhlIGRvY3VtZW50YXRpb24sIHNhbXBsZXMsIGhlYWRlciBmaWxlcywNCitsaWJyYXJpZXMsIGFuZCB0b29scyB5b3UgbmVlZCB0byBkZXZlbG9wIGFwcGxpY2F0aW9ucyB0aGF0IA0KK3VzZSA3eiAvIExaTUEgLyBMWk1BMiAvIFhaIGNvbXByZXNzaW9uLg0KKw0KK0xaTUEgaXMgYW4gaW1wcm92ZWQgdmVyc2lvbiBvZiBmYW1vdXMgTFo3NyBjb21wcmVzc2lvbiBhbGdvcml0aG0uIA0KK0l0IHdhcyBpbXByb3ZlZCBpbiB3YXkgb2YgbWF4aW11bSBpbmNyZWFzaW5nIG9mIGNvbXByZXNzaW9uIHJhdGlvLA0KK2tlZXBpbmcgaGlnaCBkZWNvbXByZXNzaW9uIHNwZWVkIGFuZCBsb3cgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgDQorZGVjb21wcmVzc2luZy4NCisNCitMWk1BMiBpcyBhIExaTUEgYmFzZWQgY29tcHJlc3Npb24gbWV0aG9kLiBMWk1BMiBwcm92aWRlcyBiZXR0ZXIgDQorbXVsdGl0aHJlYWRpbmcgc3VwcG9ydCBmb3IgY29tcHJlc3Npb24gdGhhbiBMWk1BIGFuZCBzb21lIG90aGVyIGltcHJvdmVtZW50cy4NCisNCis3eiBpcyBhIGZpbGUgZm9ybWF0IGZvciBkYXRhIGNvbXByZXNzaW9uIGFuZCBmaWxlIGFyY2hpdmluZy4NCis3eiBpcyBhIG1haW4gZmlsZSBmb3JtYXQgZm9yIDctWmlwIGNvbXByZXNzaW9uIHByb2dyYW0gKHd3dy43LXppcC5vcmcpLg0KKzd6IGZvcm1hdCBzdXBwb3J0cyBkaWZmZXJlbnQgY29tcHJlc3Npb24gbWV0aG9kczogTFpNQSwgTFpNQTIgYW5kIG90aGVycy4NCis3eiBhbHNvIHN1cHBvcnRzIEFFUy0yNTYgYmFzZWQgZW5jcnlwdGlvbi4NCisNCitYWiBpcyBhIGZpbGUgZm9ybWF0IGZvciBkYXRhIGNvbXByZXNzaW9uIHRoYXQgdXNlcyBMWk1BMiBjb21wcmVzc2lvbi4NCitYWiBmb3JtYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBmZWF0dXJlczogU0hBL0NSQyBjaGVjaywgZmlsdGVycyBmb3IgDQoraW1wcm92ZWQgY29tcHJlc3Npb24gcmF0aW8sIHNwbGl0dGluZyB0byBibG9ja3MgYW5kIHN0cmVhbXMsDQorDQorDQorDQorTElDRU5TRQ0KKy0tLS0tLS0NCisNCitMWk1BIFNESyBpcyB3cml0dGVuIGFuZCBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4gYnkgSWdvciBQYXZsb3YuDQorDQorU29tZSBjb2RlIGluIExaTUEgU0RLIGlzIGJhc2VkIG9uIHB1YmxpYyBkb21haW4gY29kZSBmcm9tIGFub3RoZXIgZGV2ZWxvcGVyczoNCisgIDEpIFBQTWQgdmFyLkggKDIwMDEpOiBEbWl0cnkgU2hrYXJpbg0KKyAgMikgU0hBLTI1NjogV2VpIERhaSAoQ3J5cHRvKysgbGlicmFyeSkNCisNCitZb3UgY2FuIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgcGVyZm9ybSBMWk1BIFNESyBjb2RlLCBldmVuIGZvciBjb21tZXJjaWFsIHB1cnBvc2VzLA0KK2FsbCB3aXRob3V0IGFza2luZyBwZXJtaXNzaW9uLg0KKw0KK0xaTUEgU0RLIGNvZGUgaXMgY29tcGF0aWJsZSB3aXRoIG9wZW4gc291cmNlIGxpY2Vuc2VzLCBmb3IgZXhhbXBsZSwgeW91IGNhbiANCitpbmNsdWRlIGl0IHRvIEdOVSBHUEwgb3IgR05VIExHUEwgY29kZS4NCisNCisNCitMWk1BIFNESyBDb250ZW50cw0KKy0tLS0tLS0tLS0tLS0tLS0tDQorDQorICBTb3VyY2UgY29kZToNCisNCisgICAgLSBDIC8gQysrIC8gQyMgLyBKYXZhICAgLSBMWk1BIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uDQorICAgIC0gQyAvIEMrKyAgICAgICAgICAgICAgIC0gTFpNQTIgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24NCisgICAgLSBDIC8gQysrICAgICAgICAgICAgICAgLSBYWiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbg0KKyAgICAtIEMgICAgICAgICAgICAgICAgICAgICAtIDd6IGRlY29tcHJlc3Npb24NCisgICAgLSAgICAgQysrICAgICAgICAgICAgICAgLSA3eiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbg0KKyAgICAtIEMgICAgICAgICAgICAgICAgICAgICAtIHNtYWxsIFNGWHMgZm9yIGluc3RhbGxlcnMgKDd6IGRlY29tcHJlc3Npb24pDQorICAgIC0gICAgIEMrKyAgICAgICAgICAgICAgIC0gU0ZYcyBhbmQgU0ZYcyBmb3IgaW5zdGFsbGVycyAoN3ogZGVjb21wcmVzc2lvbikNCisNCisgIFByZWNvbWlsZWQgYmluYXJpZXM6DQorDQorICAgIC0gY29uc29sZSBwcm9ncmFtcyBmb3IgbHptYSAvIDd6IC8geHogY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24NCisgICAgLSBTRlggbW9kdWxlcyBmb3IgaW5zdGFsbGVycy4NCisNCisNCitVTklYL0xpbnV4IHZlcnNpb24gDQorLS0tLS0tLS0tLS0tLS0tLS0tDQorVG8gY29tcGlsZSBDKysgdmVyc2lvbiBvZiBmaWxlLT5maWxlIExaTUEgZW5jb2RpbmcsIGdvIHRvIGRpcmVjdG9yeQ0KK0NQUC83emlwL0J1bmRsZXMvTHptYUNvbg0KK2FuZCBjYWxsIG1ha2UgdG8gcmVjb21waWxlIGl0Og0KKyAgbWFrZSAtZiBtYWtlZmlsZS5nY2MgY2xlYW4gYWxsDQorDQorSW4gc29tZSBVTklYL0xpbnV4IHZlcnNpb25zIHlvdSBtdXN0IGNvbXBpbGUgTFpNQSB3aXRoIHN0YXRpYyBsaWJyYXJpZXMuDQorVG8gY29tcGlsZSB3aXRoIHN0YXRpYyBsaWJyYXJpZXMsIHlvdSBjYW4gdXNlIA0KK0xJQiA9IC1sbSAtc3RhdGljDQorDQorQWxzbyB5b3UgY2FuIHVzZSBwN3ppcCAocG9ydCBvZiA3LVppcCBmb3IgUE9TSVggc3lzdGVtcyBsaWtlIFVuaXggb3IgTGludXgpOg0KKyAgDQorICBodHRwOi8vcDd6aXAuc291cmNlZm9yZ2UubmV0Lw0KKw0KKw0KK0ZpbGVzDQorLS0tLS0NCisNCitET0MvN3pDLnR4dCAgICAgICAgICAtIDd6IEFOU0ktQyBEZWNvZGVyIGRlc2NyaXB0aW9uDQorRE9DLzd6Rm9ybWF0LnR4dCAgICAgLSA3eiBGb3JtYXQgZGVzY3JpcHRpb24NCitET0MvaW5zdGFsbGVyLnR4dCAgICAtIGluZm9ybWF0aW9uIGFib3V0IDctWmlwIGZvciBpbnN0YWxsZXJzDQorRE9DL2x6bWEudHh0ICAgICAgICAgLSBMWk1BIGNvbXByZXNzaW9uIGRlc2NyaXB0aW9uDQorRE9DL2x6bWEtc2RrLnR4dCAgICAgLSBMWk1BIFNESyBkZXNjcmlwdGlvbiAodGhpcyBmaWxlKQ0KK0RPQy9sem1hLWhpc3RvcnkudHh0IC0gaGlzdG9yeSBvZiBMWk1BIFNESw0KK0RPQy9sem1hLXNwZWNpZmljYXRpb24udHh0IC0gU3BlY2lmaWNhdGlvbiBvZiBMWk1BDQorRE9DL01ldGhvZHMudHh0ICAgICAgLSBDb21wcmVzc2lvbiBtZXRob2QgSURzIGZvciAuN3oNCisNCitiaW4vaW5zdGFsbGVyLyAgIC0gZXhhbXBsZSBzY3JpcHQgdG8gY3JlYXRlIGluc3RhbGxlciB0aGF0IHVzZXMgU0ZYIG1vZHVsZSwNCisNCitiaW4vN3pkZWMuZXhlICAgIC0gc2ltcGxpZmllZCA3eiBhcmNoaXZlIGRlY29kZXINCitiaW4vN3pyLmV4ZSAgICAgIC0gNy1aaXAgY29uc29sZSBwcm9ncmFtIChyZWR1Y2VkIHZlcnNpb24pDQorYmluL3g2NC83enIuZXhlICAtIDctWmlwIGNvbnNvbGUgcHJvZ3JhbSAocmVkdWNlZCB2ZXJzaW9uKSAoeDY0IHZlcnNpb24pDQorYmluL2x6bWEuZXhlICAgICAtIGZpbGUtPmZpbGUgTFpNQSBlbmNvZGVyL2RlY29kZXIgZm9yIFdpbmRvd3MNCitiaW4vN3pTMi5zZnggICAgIC0gc21hbGwgU0ZYIG1vZHVsZSBmb3IgaW5zdGFsbGVycyAoR1VJIHZlcnNpb24pDQorYmluLzd6UzJjb24uc2Z4ICAtIHNtYWxsIFNGWCBtb2R1bGUgZm9yIGluc3RhbGxlcnMgKENvbnNvbGUgdmVyc2lvbikNCitiaW4vN3pTRC5zZnggICAgIC0gU0ZYIG1vZHVsZSBmb3IgaW5zdGFsbGVycy4NCisNCisNCis3ekRlYy5leGUNCistLS0tLS0tLS0NCis3ekRlYy5leGUgaXMgc2ltcGxpZmllZCA3eiBhcmNoaXZlIGRlY29kZXIuDQorSXQgc3VwcG9ydHMgb25seSBMWk1BLCBMWk1BMiwgYW5kIFBQTWQgbWV0aG9kcy4NCis3ekRlYyBkZWNvZGVzIHdob2xlIHNvbGlkIGJsb2NrIGZyb20gN3ogYXJjaGl2ZSB0byBSQU0uDQorVGhlIFJBTSBjb25zdW1wdGlvbiBjYW4gYmUgaGlnaC4NCisNCisNCisNCisNCitTb3VyY2UgY29kZSBzdHJ1Y3R1cmUNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisNCitBc20vIC0gYXNtIGZpbGVzIChvcHRpbWl6ZWQgY29kZSBmb3IgQ1JDIGNhbGN1bGF0aW9uIGFuZCBJbnRlbC1BRVMgZW5jcnlwdGlvbikNCisNCitDLyAgLSBDIGZpbGVzIChjb21wcmVzc2lvbiAvIGRlY29tcHJlc3Npb24gYW5kIG90aGVyKQ0KKyAgVXRpbC8NCisgICAgN3ogICAgICAgLSA3eiBkZWNvZGVyIHByb2dyYW0gKGRlY29kaW5nIDd6IGZpbGVzKQ0KKyAgICBMem1hICAgICAtIExaTUEgcHJvZ3JhbSAoZmlsZS0+ZmlsZSBMWk1BIGVuY29kZXIvZGVjb2RlcikuDQorICAgIEx6bWFMaWIgIC0gTFpNQSBsaWJyYXJ5ICguRExMIGZvciBXaW5kb3dzKQ0KKyAgICBTZnhTZXR1cCAtIHNtYWxsIFNGWCBtb2R1bGUgZm9yIGluc3RhbGxlcnMgDQorDQorQ1BQLyAtLSBDUFAgZmlsZXMNCisNCisgIENvbW1vbiAgLSBjb21tb24gZmlsZXMgZm9yIEMrKyBwcm9qZWN0cw0KKyAgV2luZG93cyAtIGNvbW1vbiBmaWxlcyBmb3IgV2luZG93cyByZWxhdGVkIGNvZGUNCisNCisgIDd6aXAgICAgLSBmaWxlcyByZWxhdGVkIHRvIDctWmlwDQorDQorICAgIEFyY2hpdmUgLSBmaWxlcyByZWxhdGVkIHRvIGFyY2hpdmluZw0KKw0KKyAgICAgIENvbW1vbiAgIC0gY29tbW9uIGZpbGVzIGZvciBhcmNoaXZlIGhhbmRsaW5nDQorICAgICAgN3ogICAgICAgLSA3eiBDKysgRW5jb2Rlci9EZWNvZGVyDQorDQorICAgIEJ1bmRsZXMgIC0gTW9kdWxlcyB0aGF0IGFyZSBidW5kbGVzIG9mIG90aGVyIG1vZHVsZXMgKGZpbGVzKQ0KKyAgDQorICAgICAgQWxvbmU3eiAgICAgICAtIDd6ci5leGU6IFN0YW5kYWxvbmUgNy1aaXAgY29uc29sZSBwcm9ncmFtIChyZWR1Y2VkIHZlcnNpb24pDQorICAgICAgRm9ybWF0N3pFeHRyYWN0UiAgLSA3enhyLmRsbDogUmVkdWNlZCB2ZXJzaW9uIG9mIDd6IERMTDogZXh0cmFjdGluZyBmcm9tIDd6L0xaTUEvQkNKL0JDSjIuDQorICAgICAgRm9ybWF0N3pSICAgICAgICAgLSA3enIuZGxsOiAgUmVkdWNlZCB2ZXJzaW9uIG9mIDd6IERMTDogZXh0cmFjdGluZy9jb21wcmVzc2luZyB0byA3ei9MWk1BL0JDSi9CQ0oyDQorICAgICAgTHptYUNvbiAgICAgICAtIGx6bWEuZXhlOiBMWk1BIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24NCisgICAgICBMem1hU3BlYyAgICAgIC0gZXhhbXBsZSBjb2RlIGZvciBMWk1BIFNwZWNpZmljYXRpb24NCisgICAgICBTRlhDb24gICAgICAgIC0gN3pDb24uc2Z4OiBDb25zb2xlIDd6IFNGWCBtb2R1bGUNCisgICAgICBTRlhTZXR1cCAgICAgIC0gN3pTLnNmeDogN3ogU0ZYIG1vZHVsZSBmb3IgaW5zdGFsbGVycw0KKyAgICAgIFNGWFdpbiAgICAgICAgLSA3ei5zZng6IEdVSSA3eiBTRlggbW9kdWxlDQorDQorICAgIENvbW1vbiAgIC0gY29tbW9uIGZpbGVzIGZvciA3LVppcA0KKw0KKyAgICBDb21wcmVzcyAtIGZpbGVzIGZvciBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uDQorDQorICAgIENyeXB0byAgIC0gZmlsZXMgZm9yIGVuY3J5cHRpb24gLyBkZWNvbXByZXNzaW9uDQorDQorICAgIFVJICAgICAgIC0gVXNlciBJbnRlcmZhY2UgZmlsZXMNCisgICAgICAgICANCisgICAgICBDbGllbnQ3eiAtIFRlc3QgYXBwbGljYXRpb24gZm9yIDd6YS5kbGwsIDd6ci5kbGwsIDd6eHIuZGxsDQorICAgICAgQ29tbW9uICAgLSBDb21tb24gVUkgZmlsZXMNCisgICAgICBDb25zb2xlICAtIENvZGUgZm9yIGNvbnNvbGUgcHJvZ3JhbSAoN3ouZXhlKQ0KKyAgICAgIEV4cGxvcmVyICAgIC0gU29tZSBjb2RlIGZyb20gNy1aaXAgU2hlbGwgZXh0ZW5zaW9uDQorICAgICAgRmlsZU1hbmFnZXIgLSBTb21lIEdVSSBjb2RlIGZyb20gNy1aaXAgRmlsZSBNYW5hZ2VyDQorICAgICAgR1VJICAgICAgICAgLSBTb21lIEdVSSBjb2RlIGZyb20gNy1aaXANCisNCisNCitDUy8gLSBDIyBmaWxlcw0KKyAgN3ppcA0KKyAgICBDb21tb24gICAtIHNvbWUgY29tbW9uIGZpbGVzIGZvciA3LVppcA0KKyAgICBDb21wcmVzcyAtIGZpbGVzIHJlbGF0ZWQgdG8gY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbg0KKyAgICAgIExaICAgICAtIGZpbGVzIHJlbGF0ZWQgdG8gTFogKExlbXBlbC1aaXYpIGNvbXByZXNzaW9uIGFsZ29yaXRobQ0KKyAgICAgIExaTUEgICAgICAgICAtIExaTUEgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbg0KKyAgICAgIEx6bWFBbG9uZSAgICAtIGZpbGUtPmZpbGUgTFpNQSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uDQorICAgICAgUmFuZ2VDb2RlciAgIC0gUmFuZ2UgQ29kZXIgKHNwZWNpYWwgY29kZSBvZiBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uKQ0KKw0KK0phdmEvICAtIEphdmEgZmlsZXMNCisgIFNldmVuWmlwDQorICAgIENvbXByZXNzaW9uICAgIC0gZmlsZXMgcmVsYXRlZCB0byBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uDQorICAgICAgTFogICAgICAgICAgIC0gZmlsZXMgcmVsYXRlZCB0byBMWiAoTGVtcGVsLVppdikgY29tcHJlc3Npb24gYWxnb3JpdGhtDQorICAgICAgTFpNQSAgICAgICAgIC0gTFpNQSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uDQorICAgICAgUmFuZ2VDb2RlciAgIC0gUmFuZ2UgQ29kZXIgKHNwZWNpYWwgY29kZSBvZiBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uKQ0KKw0KKw0KK05vdGU6IA0KKyAgQXNtIC8gQyAvIEMrKyBzb3VyY2UgY29kZSBvZiBMWk1BIFNESyBpcyBwYXJ0IG9mIDctWmlwJ3Mgc291cmNlIGNvZGUuDQorICA3LVppcCdzIHNvdXJjZSBjb2RlIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gNy1aaXAncyBTb3VyY2VGb3JnZSBwYWdlOg0KKw0KKyAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9zZXZlbnppcC8NCisNCisNCisNCitMWk1BIGZlYXR1cmVzDQorLS0tLS0tLS0tLS0tLQ0KKyAgLSBWYXJpYWJsZSBkaWN0aW9uYXJ5IHNpemUgKHVwIHRvIDEgR0IpDQorICAtIEVzdGltYXRlZCBjb21wcmVzc2luZyBzcGVlZDogYWJvdXQgMiBNQi9zIG9uIDIgR0h6IENQVQ0KKyAgLSBFc3RpbWF0ZWQgZGVjb21wcmVzc2luZyBzcGVlZDogDQorICAgICAgLSAyMC0zMCBNQi9zIG9uIG1vZGVybiAyIEdIeiBjcHUNCisgICAgICAtIDEtMiBNQi9zIG9uIDIwMCBNSHogc2ltcGxlIFJJU0MgY3B1OiAoQVJNLCBNSVBTLCBQb3dlclBDKQ0KKyAgLSBTbWFsbCBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWNvbXByZXNzaW5nICgxNiBLQiArIERpY3Rpb25hcnlTaXplKQ0KKyAgLSBTbWFsbCBjb2RlIHNpemUgZm9yIGRlY29tcHJlc3Npbmc6IDUtOCBLQg0KKw0KK0xaTUEgZGVjb2RlciB1c2VzIG9ubHkgaW50ZWdlciBvcGVyYXRpb25zIGFuZCBjYW4gYmUgDQoraW1wbGVtZW50ZWQgaW4gYW55IG1vZGVybiAzMi1iaXQgQ1BVIChvciBvbiAxNi1iaXQgQ1BVIHdpdGggc29tZSBjb25kaXRpb25zKS4NCisNCitTb21lIGNyaXRpY2FsIG9wZXJhdGlvbnMgdGhhdCBhZmZlY3QgdGhlIHNwZWVkIG9mIExaTUEgZGVjb21wcmVzc2lvbjoNCisgIDEpIDMyKjE2IGJpdCBpbnRlZ2VyIG11bHRpcGx5DQorICAyKSBNaXNwcmVkaWN0ZWQgYnJhbmNoZXMgKHBlbmFsdHkgbW9zdGx5IGRlcGVuZHMgZnJvbSBwaXBlbGluZSBsZW5ndGgpDQorICAzKSAzMi1iaXQgc2hpZnQgYW5kIGFyaXRobWV0aWMgb3BlcmF0aW9ucw0KKw0KK1RoZSBzcGVlZCBvZiBMWk1BIGRlY29tcHJlc3NpbmcgbW9zdGx5IGRlcGVuZHMgZnJvbSBDUFUgc3BlZWQuDQorTWVtb3J5IHNwZWVkIGhhcyBubyBiaWcgbWVhbmluZy4gQnV0IGlmIHlvdXIgQ1BVIGhhcyBzbWFsbCBkYXRhIGNhY2hlLCANCitvdmVyYWxsIHdlaWdodCBvZiBtZW1vcnkgc3BlZWQgd2lsbCBzbGlnaHRseSBpbmNyZWFzZS4NCisNCisNCitIb3cgVG8gVXNlDQorLS0tLS0tLS0tLQ0KKw0KK1VzaW5nIExaTUEgZW5jb2Rlci9kZWNvZGVyIGV4ZWN1dGFibGUNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1VzYWdlOiAgTFpNQSA8ZXxkPiBpbnB1dEZpbGUgb3V0cHV0RmlsZSBbPHN3aXRjaGVzPi4uLl0NCisNCisgIGU6IGVuY29kZSBmaWxlDQorDQorICBkOiBkZWNvZGUgZmlsZQ0KKw0KKyAgYjogQmVuY2htYXJrLiBUaGVyZSBhcmUgdHdvIHRlc3RzOiBjb21wcmVzc2luZyBhbmQgZGVjb21wcmVzc2luZyANCisgICAgIHdpdGggTFpNQSBtZXRob2QuIEJlbmNobWFyayBzaG93cyByYXRpbmcgaW4gTUlQUyAobWlsbGlvbiANCisgICAgIGluc3RydWN0aW9ucyBwZXIgc2Vjb25kKS4gUmF0aW5nIHZhbHVlIGlzIGNhbGN1bGF0ZWQgZnJvbSANCisgICAgIG1lYXN1cmVkIHNwZWVkIGFuZCBpdCBpcyBub3JtYWxpemVkIHdpdGggSW50ZWwncyBDb3JlIDIgcmVzdWx0cy4NCisgICAgIEFsc28gQmVuY2htYXJrIGNoZWNrcyBwb3NzaWJsZSBoYXJkd2FyZSBlcnJvcnMgKFJBTSANCisgICAgIGVycm9ycyBpbiBtb3N0IGNhc2VzKS4gQmVuY2htYXJrIHVzZXMgdGhlc2Ugc2V0dGluZ3M6DQorICAgICAoLWExLCAtZDIxLCAtZmIzMiwgLW1mYnQ0KS4gWW91IGNhbiBjaGFuZ2Ugb25seSAtZCBwYXJhbWV0ZXIuIA0KKyAgICAgQWxzbyB5b3UgY2FuIGNoYW5nZSB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIEV4YW1wbGUgZm9yIDMwIGl0ZXJhdGlvbnM6DQorICAgICAgIExaTUEgYiAzMA0KKyAgICAgRGVmYXVsdCBudW1iZXIgb2YgaXRlcmF0aW9ucyBpcyAxMC4NCisNCis8U3dpdGNoZXM+DQorICANCisNCisgIC1he059OiAgc2V0IGNvbXByZXNzaW9uIG1vZGUgMCA9IGZhc3QsIDEgPSBub3JtYWwNCisgICAgICAgICAgZGVmYXVsdDogMSAobm9ybWFsKQ0KKw0KKyAgZHtOfTogICBTZXRzIERpY3Rpb25hcnkgc2l6ZSAtIFswLCAzMF0sIGRlZmF1bHQ6IDIzICg4TUIpDQorICAgICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBkaWN0aW9uYXJ5IHNpemUgaXMgMSBHQiA9IDJeMzAgYnl0ZXMuDQorICAgICAgICAgIERpY3Rpb25hcnkgc2l6ZSBpcyBjYWxjdWxhdGVkIGFzIERpY3Rpb25hcnlTaXplID0gMl5OIGJ5dGVzLiANCisgICAgICAgICAgRm9yIGRlY29tcHJlc3NpbmcgZmlsZSBjb21wcmVzc2VkIGJ5IExaTUEgbWV0aG9kIHdpdGggZGljdGlvbmFyeSANCisgICAgICAgICAgc2l6ZSBEID0gMl5OIHlvdSBuZWVkIGFib3V0IEQgYnl0ZXMgb2YgbWVtb3J5IChSQU0pLg0KKw0KKyAgLWZie059OiBzZXQgbnVtYmVyIG9mIGZhc3QgYnl0ZXMgLSBbNSwgMjczXSwgZGVmYXVsdDogMTI4DQorICAgICAgICAgIFVzdWFsbHkgYmlnIG51bWJlciBnaXZlcyBhIGxpdHRsZSBiaXQgYmV0dGVyIGNvbXByZXNzaW9uIHJhdGlvIA0KKyAgICAgICAgICBhbmQgc2xvd2VyIGNvbXByZXNzaW9uIHByb2Nlc3MuDQorDQorICAtbGN7Tn06IHNldCBudW1iZXIgb2YgbGl0ZXJhbCBjb250ZXh0IGJpdHMgLSBbMCwgOF0sIGRlZmF1bHQ6IDMNCisgICAgICAgICAgU29tZXRpbWVzIGxjPTQgZ2l2ZXMgZ2FpbiBmb3IgYmlnIGZpbGVzLg0KKw0KKyAgLWxwe059OiBzZXQgbnVtYmVyIG9mIGxpdGVyYWwgcG9zIGJpdHMgLSBbMCwgNF0sIGRlZmF1bHQ6IDANCisgICAgICAgICAgbHAgc3dpdGNoIGlzIGludGVuZGVkIGZvciBwZXJpb2RpY2FsIGRhdGEgd2hlbiBwZXJpb2QgaXMgDQorICAgICAgICAgIGVxdWFsIDJeTi4gRm9yIGV4YW1wbGUsIGZvciAzMi1iaXQgKDQgYnl0ZXMpIA0KKyAgICAgICAgICBwZXJpb2RpY2FsIGRhdGEgeW91IGNhbiB1c2UgbHA9Mi4gT2Z0ZW4gaXQncyBiZXR0ZXIgdG8gc2V0IGxjMCwgDQorICAgICAgICAgIGlmIHlvdSBjaGFuZ2UgbHAgc3dpdGNoLg0KKw0KKyAgLXBie059OiBzZXQgbnVtYmVyIG9mIHBvcyBiaXRzIC0gWzAsIDRdLCBkZWZhdWx0OiAyDQorICAgICAgICAgIHBiIHN3aXRjaCBpcyBpbnRlbmRlZCBmb3IgcGVyaW9kaWNhbCBkYXRhIA0KKyAgICAgICAgICB3aGVuIHBlcmlvZCBpcyBlcXVhbCAyXk4uDQorDQorICAtbWZ7TUZfSUR9OiBzZXQgTWF0Y2ggRmluZGVyLiBEZWZhdWx0OiBidDQuIA0KKyAgICAgICAgICAgICAgQWxnb3JpdGhtcyBmcm9tIGhjKiBncm91cCBkb2Vzbid0IHByb3ZpZGUgZ29vZCBjb21wcmVzc2lvbiANCisgICAgICAgICAgICAgIHJhdGlvLCBidXQgdGhleSBvZnRlbiB3b3JrcyBwcmV0dHkgZmFzdCBpbiBjb21iaW5hdGlvbiB3aXRoIA0KKyAgICAgICAgICAgICAgZmFzdCBtb2RlICgtYTApLg0KKw0KKyAgICAgICAgICAgICAgTWVtb3J5IHJlcXVpcmVtZW50cyBkZXBlbmQgZnJvbSBkaWN0aW9uYXJ5IHNpemUgDQorICAgICAgICAgICAgICAocGFyYW1ldGVyICJkIiBpbiB0YWJsZSBiZWxvdykuIA0KKw0KKyAgICAgICAgICAgICAgIE1GX0lEICAgICBNZW1vcnkgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24NCisNCisgICAgICAgICAgICAgICAgYnQyICAgIGQgKiAgOS41ICsgNE1CICBCaW5hcnkgVHJlZSB3aXRoIDIgYnl0ZXMgaGFzaGluZy4NCisgICAgICAgICAgICAgICAgYnQzICAgIGQgKiAxMS41ICsgNE1CICBCaW5hcnkgVHJlZSB3aXRoIDMgYnl0ZXMgaGFzaGluZy4NCisgICAgICAgICAgICAgICAgYnQ0ICAgIGQgKiAxMS41ICsgNE1CICBCaW5hcnkgVHJlZSB3aXRoIDQgYnl0ZXMgaGFzaGluZy4NCisgICAgICAgICAgICAgICAgaGM0ICAgIGQgKiAgNy41ICsgNE1CICBIYXNoIENoYWluIHdpdGggNCBieXRlcyBoYXNoaW5nLg0KKw0KKyAgLWVvczogICB3cml0ZSBFbmQgT2YgU3RyZWFtIG1hcmtlci4gQnkgZGVmYXVsdCBMWk1BIGRvZXNuJ3Qgd3JpdGUgDQorICAgICAgICAgIGVvcyBtYXJrZXIsIHNpbmNlIExaTUEgZGVjb2RlciBrbm93cyB1bmNvbXByZXNzZWQgc2l6ZSANCisgICAgICAgICAgc3RvcmVkIGluIC5sem1hIGZpbGUgaGVhZGVyLg0KKw0KKyAgLXNpOiAgICBSZWFkIGRhdGEgZnJvbSBzdGRpbiAoaXQgd2lsbCB3cml0ZSBFbmQgT2YgU3RyZWFtIG1hcmtlcikuDQorICAtc286ICAgIFdyaXRlIGRhdGEgdG8gc3Rkb3V0DQorDQorDQorRXhhbXBsZXM6DQorDQorMSkgTFpNQSBlIGZpbGUuYmluIGZpbGUubHptYSAtZDE2IC1sYzAgDQorDQorY29tcHJlc3NlcyBmaWxlLmJpbiB0byBmaWxlLmx6bWEgd2l0aCA2NCBLQiBkaWN0aW9uYXJ5ICgyXjE2PTY0SykgIA0KK2FuZCAwIGxpdGVyYWwgY29udGV4dCBiaXRzLiAtbGMwIGFsbG93cyB0byByZWR1Y2UgbWVtb3J5IHJlcXVpcmVtZW50cyANCitmb3IgZGVjb21wcmVzc2lvbi4NCisNCisNCisyKSBMWk1BIGUgZmlsZS5iaW4gZmlsZS5sem1hIC1sYzAgLWxwMg0KKw0KK2NvbXByZXNzZXMgZmlsZS5iaW4gdG8gZmlsZS5sem1hIHdpdGggc2V0dGluZ3Mgc3VpdGFibGUgDQorZm9yIDMyLWJpdCBwZXJpb2RpY2FsIGRhdGEgKGZvciBleGFtcGxlLCBBUk0gb3IgTUlQUyBjb2RlKS4NCisNCiszKSBMWk1BIGQgZmlsZS5sem1hIGZpbGUuYmluDQorDQorZGVjb21wcmVzc2VzIGZpbGUubHptYSB0byBmaWxlLmJpbi4NCisNCisNCitDb21wcmVzc2lvbiByYXRpbyBoaW50cw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorUmVjb21tZW5kYXRpb25zDQorLS0tLS0tLS0tLS0tLS0tDQorDQorVG8gaW5jcmVhc2UgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGZvciBMWk1BIGNvbXByZXNzaW5nIGl0J3MgZGVzaXJhYmxlIA0KK3RvIGhhdmUgYWxpZ25lZCBkYXRhIChpZiBpdCdzIHBvc3NpYmxlKSBhbmQgYWxzbyBpdCdzIGRlc2lyYWJsZSB0byBsb2NhdGUNCitkYXRhIGluIHN1Y2ggb3JkZXIsIHdoZXJlIGNvZGUgaXMgZ3JvdXBlZCBpbiBvbmUgcGxhY2UgYW5kIGRhdGEgaXMgDQorZ3JvdXBlZCBpbiBvdGhlciBwbGFjZSAoaXQncyBiZXR0ZXIgdGhhbiBzdWNoIG1peGluZzogY29kZSwgZGF0YSwgY29kZSwNCitkYXRhLCAuLi4pLg0KKw0KKw0KK0ZpbHRlcnMNCistLS0tLS0tDQorWW91IGNhbiBpbmNyZWFzZSB0aGUgY29tcHJlc3Npb24gcmF0aW8gZm9yIHNvbWUgZGF0YSB0eXBlcywgdXNpbmcNCitzcGVjaWFsIGZpbHRlcnMgYmVmb3JlIGNvbXByZXNzaW5nLiBGb3IgZXhhbXBsZSwgaXQncyBwb3NzaWJsZSB0byANCitpbmNyZWFzZSB0aGUgY29tcHJlc3Npb24gcmF0aW8gb24gNS0xMCUgZm9yIGNvZGUgZm9yIHRob3NlIENQVSBJU0FzOiANCit4ODYsIElBLTY0LCBBUk0sIEFSTS1UaHVtYiwgUG93ZXJQQywgU1BBUkMuDQorDQorWW91IGNhbiBmaW5kIEMgc291cmNlIGNvZGUgb2Ygc3VjaCBmaWx0ZXJzIGluIEMvQnJhKi4qIGZpbGVzDQorDQorWW91IGNhbiBjaGVjayB0aGUgY29tcHJlc3Npb24gcmF0aW8gZ2FpbiBvZiB0aGVzZSBmaWx0ZXJzIHdpdGggc3VjaCANCis3LVppcCBjb21tYW5kcyAoZXhhbXBsZSBmb3IgQVJNIGNvZGUpOg0KK05vIGZpbHRlcjoNCisgIDd6IGEgYTEuN3ogYS5iaW4gLW0wPWx6bWENCisNCitXaXRoIGZpbHRlciBmb3IgbGl0dGxlLWVuZGlhbiBBUk0gY29kZToNCisgIDd6IGEgYTIuN3ogYS5iaW4gLW0wPWFybSAtbTE9bHptYSAgICAgICAgDQorDQorSXQgd29ya3MgaW4gc3VjaCBtYW5uZXI6DQorQ29tcHJlc3NpbmcgICAgPSBGaWx0ZXJfZW5jb2RpbmcgKyBMWk1BX2VuY29kaW5nDQorRGVjb21wcmVzc2luZyAgPSBMWk1BX2RlY29kaW5nICsgRmlsdGVyX2RlY29kaW5nDQorDQorQ29tcHJlc3NpbmcgYW5kIGRlY29tcHJlc3Npbmcgc3BlZWQgb2Ygc3VjaCBmaWx0ZXJzIGlzIHZlcnkgaGlnaCwNCitzbyBpdCB3aWxsIG5vdCBpbmNyZWFzZSBkZWNvbXByZXNzaW5nIHRpbWUgdG9vIG11Y2guDQorTW9yZW92ZXIsIGl0IHJlZHVjZXMgZGVjb21wcmVzc2lvbiB0aW1lIGZvciBMWk1BX2RlY29kaW5nLCANCitzaW5jZSBjb21wcmVzc2lvbiByYXRpbyB3aXRoIGZpbHRlcmluZyBpcyBoaWdoZXIuDQorDQorVGhlc2UgZmlsdGVycyBjb252ZXJ0IENBTEwgKGNhbGxpbmcgcHJvY2VkdXJlKSBpbnN0cnVjdGlvbnMgDQorZnJvbSByZWxhdGl2ZSBvZmZzZXRzIHRvIGFic29sdXRlIGFkZHJlc3Nlcywgc28gc3VjaCBkYXRhIGJlY29tZXMgbW9yZSANCitjb21wcmVzc2libGUuDQorDQorRm9yIHNvbWUgSVNBcyAoZm9yIGV4YW1wbGUsIGZvciBNSVBTKSBpdCdzIGltcG9zc2libGUgdG8gZ2V0IGdhaW4gZnJvbSBzdWNoIGZpbHRlci4NCisNCisNCisNCistLS0NCisNCitodHRwOi8vd3d3LjctemlwLm9yZw0KK2h0dHA6Ly93d3cuNy16aXAub3JnL3Nkay5odG1sDQoraHR0cDovL3d3dy43LXppcC5vcmcvc3VwcG9ydC5odG1sDQpkaWZmIC0tZ2l0IGEvbHptYS9ET0MvbHptYS1zcGVjaWZpY2F0aW9uLnR4dCBiL2x6bWEvRE9DL2x6bWEtc3BlY2lmaWNhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzYjg3NAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvRE9DL2x6bWEtc3BlY2lmaWNhdGlvbi50eHQKQEAgLTAsMCArMSwxMTc1IEBACitMWk1BIHNwZWNpZmljYXRpb24gKERSQUZUIHZlcnNpb24pDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK0F1dGhvcjogSWdvciBQYXZsb3YNCitEYXRlOiAyMDEzLTA3LTI4DQorDQorVGhpcyBzcGVjaWZpY2F0aW9uIGRlZmluZXMgdGhlIGZvcm1hdCBvZiBMWk1BIGNvbXByZXNzZWQgZGF0YSBhbmQgbHptYSBmaWxlIGZvcm1hdC4NCisNCitOb3RhdGlvbiANCistLS0tLS0tLQ0KKw0KK1dlIHVzZSB0aGUgc3ludGF4IG9mIEMrKyBwcm9ncmFtbWluZyBsYW5ndWFnZS4NCitXZSB1c2UgdGhlIGZvbGxvd2luZyB0eXBlcyBpbiBDKysgY29kZToNCisgIHVuc2lnbmVkIC0gdW5zaWduZWQgaW50ZWdlciwgYXQgbGVhc3QgMTYgYml0cyBpbiBzaXplDQorICBpbnQgICAgICAtIHNpZ25lZCBpbnRlZ2VyLCBhdCBsZWFzdCAxNiBiaXRzIGluIHNpemUNCisgIFVJbnQ2NCAgIC0gNjQtYml0IHVuc2lnbmVkIGludGVnZXINCisgIFVJbnQzMiAgIC0gMzItYml0IHVuc2lnbmVkIGludGVnZXINCisgIFVJbnQxNiAgIC0gMTYtYml0IHVuc2lnbmVkIGludGVnZXINCisgIEJ5dGUgICAgIC0gOC1iaXQgdW5zaWduZWQgaW50ZWdlcg0KKyAgYm9vbCAgICAgLSBib29sZWFuIHR5cGUgd2l0aCB0d28gcG9zc2libGUgdmFsdWVzOiBmYWxzZSwgdHJ1ZQ0KKw0KKw0KK2x6bWEgZmlsZSBmb3JtYXQNCis9PT09PT09PT09PT09PT09DQorDQorVGhlIGx6bWEgZmlsZSBjb250YWlucyB0aGUgcmF3IExaTUEgc3RyZWFtIGFuZCB0aGUgaGVhZGVyIHdpdGggcmVsYXRlZCBwcm9wZXJ0aWVzLg0KKw0KK1RoZSBmaWxlcyBpbiB0aGF0IGZvcm1hdCB1c2UgIi5sem1hIiBleHRlbnNpb24uDQorDQorVGhlIGx6bWEgZmlsZSBmb3JtYXQgbGF5b3V0Og0KKw0KK09mZnNldCBTaXplIERlc2NyaXB0aW9uDQorDQorICAwICAgICAxICAgTFpNQSBtb2RlbCBwcm9wZXJ0aWVzIChsYywgbHAsIHBiKSBpbiBlbmNvZGVkIGZvcm0NCisgIDEgICAgIDQgICBEaWN0aW9uYXJ5IHNpemUgKDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLCBsaXR0bGUtZW5kaWFuKQ0KKyAgNSAgICAgOCAgIFVuY29tcHJlc3NlZCBzaXplICg2NC1iaXQgdW5zaWduZWQgaW50ZWdlciwgbGl0dGxlLWVuZGlhbikNCisgMTMgICAgICAgICBDb21wcmVzc2VkIGRhdGEgKExaTUEgc3RyZWFtKQ0KKw0KK0xaTUEgcHJvcGVydGllczoNCisNCisgICAgbmFtZSAgUmFuZ2UgICAgICAgICAgRGVzY3JpcHRpb24NCisNCisgICAgICBsYyAgWzAsIDhdICAgICAgICAgdGhlIG51bWJlciBvZiAibGl0ZXJhbCBjb250ZXh0IiBiaXRzDQorICAgICAgbHAgIFswLCA0XSAgICAgICAgIHRoZSBudW1iZXIgb2YgImxpdGVyYWwgcG9zIiBiaXRzDQorICAgICAgcGIgIFswLCA0XSAgICAgICAgIHRoZSBudW1iZXIgb2YgInBvcyIgYml0cw0KK2RpY3RTaXplICBbMCwgMl4zMiAtIDFdICB0aGUgZGljdGlvbmFyeSBzaXplIA0KKw0KK1RoZSBmb2xsb3dpbmcgY29kZSBlbmNvZGVzIExaTUEgcHJvcGVydGllczoNCisNCit2b2lkIEVuY29kZVByb3BlcnRpZXMoQnl0ZSAqcHJvcGVydGllcykNCit7DQorICBwcm9wZXJ0aWVzWzBdID0gKEJ5dGUpKChwYiAqIDUgKyBscCkgKiA5ICsgbGMpOw0KKyAgU2V0X1VJbnQzMl9MaXR0bGVFbmRpYW4ocHJvcGVydGllcyArIDEsIGRpY3RTaXplKTsNCit9DQorDQorSWYgdGhlIHZhbHVlIG9mIGRpY3Rpb25hcnkgc2l6ZSBpbiBwcm9wZXJ0aWVzIGlzIHNtYWxsZXIgdGhhbiAoMSA8PCAxMiksDQordGhlIExaTUEgZGVjb2RlciBtdXN0IHNldCB0aGUgZGljdGlvbmFyeSBzaXplIHZhcmlhYmxlIHRvICgxIDw8IDEyKS4NCisNCisjZGVmaW5lIExaTUFfRElDX01JTiAoMSA8PCAxMikNCisNCisgIHVuc2lnbmVkIGxjLCBwYiwgbHA7DQorICBVSW50MzIgZGljdFNpemU7DQorICBVSW50MzIgZGljdFNpemVJblByb3BlcnRpZXM7DQorDQorICB2b2lkIERlY29kZVByb3BlcnRpZXMoY29uc3QgQnl0ZSAqcHJvcGVydGllcykNCisgIHsNCisgICAgdW5zaWduZWQgZCA9IHByb3BlcnRpZXNbMF07DQorICAgIGlmIChkID49ICg5ICogNSAqIDUpKQ0KKyAgICAgIHRocm93ICJJbmNvcnJlY3QgTFpNQSBwcm9wZXJ0aWVzIjsNCisgICAgbGMgPSBkICUgOTsNCisgICAgZCAvPSA5Ow0KKyAgICBwYiA9IGQgLyA1Ow0KKyAgICBscCA9IGQgJSA1Ow0KKyAgICBkaWN0U2l6ZUluUHJvcGVydGllcyA9IDA7DQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQ0KKyAgICAgIGRpY3RTaXplSW5Qcm9wZXJ0aWVzIHw9IChVSW50MzIpcHJvcGVydGllc1tpICsgMV0gPDwgKDggKiBpKTsNCisgICAgZGljdFNpemUgPSBkaWN0U2l6ZUluUHJvcGVydGllczsNCisgICAgaWYgKGRpY3RTaXplIDwgTFpNQV9ESUNfTUlOKQ0KKyAgICAgIGRpY3RTaXplID0gTFpNQV9ESUNfTUlOOw0KKyAgfQ0KKw0KK0lmICJVbmNvbXByZXNzZWQgc2l6ZSIgZmllbGQgY29udGFpbnMgb25lcyBpbiBhbGwgNjQgYml0cywgaXQgbWVhbnMgdGhhdA0KK3VuY29tcHJlc3NlZCBzaXplIGlzIHVua25vd24gYW5kIHRoZXJlIGlzIHRoZSAiZW5kIG1hcmtlciIgaW4gc3RyZWFtLA0KK3RoYXQgaW5kaWNhdGVzIHRoZSBlbmQgb2YgZGVjb2RpbmcgcG9pbnQuDQorSW4gb3Bwb3NpdGUgY2FzZSwgaWYgdGhlIHZhbHVlIGZyb20gIlVuY29tcHJlc3NlZCBzaXplIiBmaWVsZCBpcyBub3QNCitlcXVhbCB0byAoKDJeNjQpIC0gMSksIHRoZSBMWk1BIHN0cmVhbSBkZWNvZGluZyBtdXN0IGJlIGZpbmlzaGVkIGFmdGVyDQorc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyAoVW5jb21wcmVzc2VkIHNpemUpIGlzIGRlY29kZWQuIEFuZCBpZiB0aGVyZSANCitpcyB0aGUgImVuZCBtYXJrZXIiLCB0aGUgTFpNQSBkZWNvZGVyIG11c3QgcmVhZCB0aGF0IG1hcmtlciBhbHNvLg0KKw0KKw0KK1RoZSBuZXcgc2NoZW1lIHRvIGVuY29kZSBMWk1BIHByb3BlcnRpZXMNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorSWYgTFpNQSBjb21wcmVzc2lvbiBpcyB1c2VkIGZvciBzb21lIGFub3RoZXIgZm9ybWF0LCBpdCdzIHJlY29tbWVuZGVkIHRvDQordXNlIGEgbmV3IGltcHJvdmVkIHNjaGVtZSB0byBlbmNvZGUgTFpNQSBwcm9wZXJ0aWVzLiBUaGF0IG5ldyBzY2hlbWUgd2FzDQordXNlZCBpbiB4eiBmb3JtYXQgdGhhdCB1c2VzIHRoZSBMWk1BMiBjb21wcmVzc2lvbiBhbGdvcml0aG0uDQorVGhlIExaTUEyIGlzIGEgbmV3IGNvbXByZXNzaW9uIGFsZ29yaXRobSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBMWk1BIGFsZ29yaXRobS4NCisNCitUaGUgZGljdGlvbmFyeSBzaXplIGluIExaTUEyIGlzIGVuY29kZWQgd2l0aCBqdXN0IG9uZSBieXRlIGFuZCBMWk1BMiBzdXBwb3J0cw0KK29ubHkgcmVkdWNlZCBzZXQgb2YgZGljdGlvbmFyeSBzaXplczoNCisgICgyIDw8IDExKSwgKDMgPDwgMTEpLA0KKyAgKDIgPDwgMTIpLCAoMyA8PCAxMiksDQorICAuLi4NCisgICgyIDw8IDMwKSwgKDMgPDwgMzApLA0KKyAgKDIgPDwgMzEpIC0gMQ0KKw0KK1RoZSBkaWN0aW9uYXJ5IHNpemUgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGVuY29kZWQgdmFsdWUgd2l0aCB0aGUgZm9sbG93aW5nIGNvZGU6DQorDQorICBkaWN0U2l6ZSA9IChwID09IDQwKSA/IDB4RkZGRkZGRkYgOiAoKChVSW50MzIpMiB8ICgocCkgJiAxKSkgPDwgKChwKSAvIDIgKyAxMSkpOw0KKw0KK0Fsc28gdGhlcmUgaXMgYWRkaXRpb25hbCBsaW1pdGF0aW9uIChsYyArIGxwIDw9IDQpIGluIExaTUEyIGZvciB2YWx1ZXMgb2YgDQorImxjIiBhbmQgImxwIiBwcm9wZXJ0aWVzOg0KKw0KKyAgaWYgKGxjICsgbHAgPiA0KQ0KKyAgICB0aHJvdyAiVW5zdXBwb3J0ZWQgcHJvcGVydGllczogKGxjICsgbHApID4gNCI7DQorDQorVGhlcmUgYXJlIHNvbWUgYWR2YW50YWdlcyBmb3IgTFpNQSBkZWNvZGVyIHdpdGggc3VjaCAobGMgKyBscCkgdmFsdWUNCitsaW1pdGF0aW9uLiBJdCByZWR1Y2VzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGFibGVzIGFsbG9jYXRlZCBieSBkZWNvZGVyLg0KK0FuZCBpdCByZWR1Y2VzIHRoZSBjb21wbGV4aXR5IG9mIGluaXRpYWxpemF0aW9uIHByb2NlZHVyZSwgdGhhdCBjYW4gYmUgDQoraW1wb3J0YW50IHRvIGtlZXAgaGlnaCBzcGVlZCBvZiBkZWNvZGluZyBvZiBiaWcgbnVtYmVyIG9mIHNtYWxsIExaTUEgc3RyZWFtcy4NCisNCitJdCdzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGF0IGxpbWl0YXRpb24gKGxjICsgbHAgPD0gNCkgZm9yIGFueSBuZXcgZm9ybWF0DQordGhhdCB1c2VzIExaTUEgY29tcHJlc3Npb24uIE5vdGUgdGhhdCB0aGUgY29tYmluYXRpb25zIG9mICJsYyIgYW5kICJscCIgDQorcGFyYW1ldGVycywgd2hlcmUgKGxjICsgbHAgPiA0KSwgY2FuIHByb3ZpZGUgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnQgaW4gDQorY29tcHJlc3Npb24gcmF0aW8gb25seSBpbiBzb21lIHJhcmUgY2FzZXMuDQorDQorVGhlIExaTUEgcHJvcGVydGllcyBjYW4gYmUgZW5jb2RlZCBpbnRvIHR3byBieXRlcyBpbiBuZXcgc2NoZW1lOg0KKw0KK09mZnNldCBTaXplIERlc2NyaXB0aW9uDQorDQorICAwICAgICAxICAgVGhlIGRpY3Rpb25hcnkgc2l6ZSBlbmNvZGVkIHdpdGggTFpNQTIgc2NoZW1lDQorICAxICAgICAxICAgTFpNQSBtb2RlbCBwcm9wZXJ0aWVzIChsYywgbHAsIHBiKSBpbiBlbmNvZGVkIGZvcm0NCisNCisNCitUaGUgUkFNIHVzYWdlIA0KKz09PT09PT09PT09PT0NCisNCitUaGUgUkFNIHVzYWdlIGZvciBMWk1BIGRlY29kZXIgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZm9sbG93aW5nIHBhcnRzOg0KKw0KKzEpIFRoZSBTbGlkaW5nIFdpbmRvdyAoZnJvbSA0IEtpQiB0byA0IEdpQikuDQorMikgVGhlIHByb2JhYmlsaXR5IG1vZGVsIGNvdW50ZXIgYXJyYXlzIChhcnJheXMgb2YgMTYtYml0IHZhcmlhYmxlcykuDQorMykgU29tZSBhZGRpdGlvbmFsIHN0YXRlIHZhcmlhYmxlcyAoYWJvdXQgMTAgdmFyaWFibGVzIG9mIDMyLWJpdCBpbnRlZ2VycykuDQorDQorDQorVGhlIFJBTSB1c2FnZSBmb3IgU2xpZGluZyBXaW5kb3cNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1RoZXJlIGFyZSB0d28gbWFpbiBzY2VuYXJpb3Mgb2YgZGVjb2Rpbmc6DQorDQorMSkgVGhlIGRlY29kaW5nIG9mIGZ1bGwgc3RyZWFtIHRvIG9uZSBSQU0gYnVmZmVyLg0KKw0KKyAgSWYgd2UgZGVjb2RlIGZ1bGwgTFpNQSBzdHJlYW0gdG8gb25lIG91dHB1dCBidWZmZXIgaW4gUkFNLCB0aGUgZGVjb2RlciANCisgIGNhbiB1c2UgdGhhdCBvdXRwdXQgYnVmZmVyIGFzIHNsaWRpbmcgd2luZG93LiBTbyB0aGUgZGVjb2RlciBkb2Vzbid0IA0KKyAgbmVlZCBhZGRpdGlvbmFsIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIHNsaWRpbmcgd2luZG93Lg0KKw0KKzIpIFRoZSBkZWNvZGluZyB0byBzb21lIGV4dGVybmFsIHN0b3JhZ2UuDQorDQorICBJZiB3ZSBkZWNvZGUgTFpNQSBzdHJlYW0gdG8gZXh0ZXJuYWwgc3RvcmFnZSwgdGhlIGRlY29kZXIgbXVzdCBhbGxvY2F0ZQ0KKyAgdGhlIGJ1ZmZlciBmb3Igc2xpZGluZyB3aW5kb3cuIFRoZSBzaXplIG9mIHRoYXQgYnVmZmVyIG11c3QgYmUgZXF1YWwgDQorICBvciBsYXJnZXIgdGhhbiB0aGUgdmFsdWUgb2YgZGljdGlvbmFyeSBzaXplIGZyb20gcHJvcGVydGllcyBvZiBMWk1BIHN0cmVhbS4NCisNCitJbiB0aGlzIHNwZWNpZmljYXRpb24gd2UgZGVzY3JpYmUgdGhlIGNvZGUgZm9yIGRlY29kaW5nIHRvIHNvbWUgZXh0ZXJuYWwNCitzdG9yYWdlLiBUaGUgb3B0aW1pemVkIHZlcnNpb24gb2YgY29kZSBmb3IgZGVjb2Rpbmcgb2YgZnVsbCBzdHJlYW0gdG8gb25lDQorb3V0cHV0IFJBTSBidWZmZXIgY2FuIHJlcXVpcmUgc29tZSBtaW5vciBjaGFuZ2VzIGluIGNvZGUuDQorDQorDQorVGhlIFJBTSB1c2FnZSBmb3IgdGhlIHByb2JhYmlsaXR5IG1vZGVsIGNvdW50ZXJzDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorVGhlIHNpemUgb2YgdGhlIHByb2JhYmlsaXR5IG1vZGVsIGNvdW50ZXIgYXJyYXlzIGlzIGNhbGN1bGF0ZWQgd2l0aCB0aGUgDQorZm9sbG93aW5nIGZvcm11bGE6DQorDQorc2l6ZV9vZl9wcm9iX2FycmF5cyA9IDE4NDYgKyA3NjggKiAoMSA8PCAobHAgKyBsYykpDQorDQorRWFjaCBwcm9iYWJpbGl0eSBtb2RlbCBjb3VudGVyIGlzIDExLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLg0KK0lmIHdlIHVzZSAxNi1iaXQgaW50ZWdlciB2YXJpYWJsZXMgKDItYnl0ZSBpbnRlZ2VycykgZm9yIHRoZXNlIHByb2JhYmlsaXR5IA0KK21vZGVsIGNvdW50ZXJzLCB0aGUgUkFNIHVzYWdlIHJlcXVpcmVkIGJ5IHByb2JhYmlsaXR5IG1vZGVsIGNvdW50ZXIgYXJyYXlzIA0KK2NhbiBiZSBlc3RpbWF0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm11bGE6DQorDQorICBSQU0gPSA0IEtpQiArIDEuNSBLaUIgKiAoMSA8PCAobHAgKyBsYykpDQorDQorRm9yIGV4YW1wbGUsIGZvciBkZWZhdWx0IExaTUEgcGFyYW1ldGVycyAobHAgPSAwIGFuZCBsYyA9IDMpLCB0aGUgUkFNIHVzYWdlIGlzDQorDQorICBSQU1fbGMzX2xwMCA9IDQgS2lCICsgMS41IEtpQiAqIDggPSAxNiBLaUINCisNCitUaGUgbWF4aW11bSBSQU0gc3RhdGUgdXNhZ2UgaXMgcmVxdWlyZWQgZm9yIGRlY29kaW5nIHRoZSBzdHJlYW0gd2l0aCBscCA9IDQgDQorYW5kIGxjID0gODoNCisNCisgIFJBTV9sYzhfbHA0ID0gNCBLaUIgKyAxLjUgS2lCICogNDA5NiA9IDYxNDggS2lCDQorDQorSWYgdGhlIGRlY29kZXIgdXNlcyBMWk1BMidzIGxpbWl0ZWQgcHJvcGVydHkgY29uZGl0aW9uIA0KKyhsYyArIGxwIDw9IDQpLCB0aGUgUkFNIHVzYWdlIHdpbGwgYmUgbm90IGxhcmdlciB0aGFuDQorDQorICBSQU1fbGNfbHBfNCA9IDQgS2lCICsgMS41IEtpQiAqIDE2ID0gMjggS2lCDQorDQorDQorVGhlIFJBTSB1c2FnZSBmb3IgZW5jb2Rlcg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitUaGVyZSBhcmUgbWFueSB2YXJpYW50cyBmb3IgTFpNQSBlbmNvZGluZyBjb2RlLg0KK1RoZXNlIHZhcmlhbnRzIGhhdmUgZGlmZmVyZW50IHZhbHVlcyBmb3IgbWVtb3J5IGNvbnN1bXB0aW9uLg0KK05vdGUgdGhhdCBtZW1vcnkgY29uc3VtcHRpb24gZm9yIExaTUEgRW5jb2RlciBjYW4gbm90IGJlIA0KK3NtYWxsZXIgdGhhbiBtZW1vcnkgY29uc3VtcHRpb24gb2YgTFpNQSBEZWNvZGVyIGZvciBzYW1lIHN0cmVhbS4NCisNCitUaGUgUkFNIHVzYWdlIHJlcXVpcmVkIGJ5IG1vZGVybiBlZmZlY3RpdmUgaW1wbGVtZW50YXRpb24gb2YgDQorTFpNQSBFbmNvZGVyIGNhbiBiZSBlc3RpbWF0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm11bGE6DQorDQorICBFbmNvZGVyX1JBTV9Vc2FnZSA9IDQgTWlCICsgMTEgKiBkaWN0aW9uYXJ5U2l6ZS4NCisNCitCdXQgdGhlcmUgYXJlIHNvbWUgbW9kZXMgb2YgdGhlIGVuY29kZXIgdGhhdCByZXF1aXJlIGxlc3MgbWVtb3J5Lg0KKw0KKw0KK0xaTUEgRGVjb2RpbmcNCis9PT09PT09PT09PT09DQorDQorVGhlIExaTUEgY29tcHJlc3Npb24gYWxnb3JpdGhtIHVzZXMgTFotYmFzZWQgY29tcHJlc3Npb24gd2l0aCBTbGlkaW5nIFdpbmRvdw0KK2FuZCBSYW5nZSBFbmNvZGluZyBhcyBlbnRyb3B5IGNvZGluZyBtZXRob2QuDQorDQorDQorU2xpZGluZyBXaW5kb3cNCistLS0tLS0tLS0tLS0tLQ0KKw0KK0xaTUEgdXNlcyBTbGlkaW5nIFdpbmRvdyBjb21wcmVzc2lvbiBzaW1pbGFyIHRvIExaNzcgYWxnb3JpdGhtLg0KKw0KK0xaTUEgc3RyZWFtIG11c3QgYmUgZGVjb2RlZCB0byB0aGUgc2VxdWVuY2UgdGhhdCBjb25zaXN0cw0KK29mIE1BVENIRVMgYW5kIExJVEVSQUxTOg0KKyAgDQorICAtIGEgTElURVJBTCBpcyBhIDgtYml0IGNoYXJhY3RlciAob25lIGJ5dGUpLg0KKyAgICBUaGUgZGVjb2RlciBqdXN0IHB1dHMgdGhhdCBMSVRFUkFMIHRvIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLg0KKyAgDQorICAtIGEgTUFUQ0ggaXMgYSBwYWlyIG9mIHR3byBudW1iZXJzIChESVNUQU5DRS1MRU5HVEggcGFpcikuDQorICAgIFRoZSBkZWNvZGVyIHRha2VzIG9uZSBieXRlIGV4YWN0bHkgIkRJU1RBTkNFIiBjaGFyYWN0ZXJzIGJlaGluZA0KKyAgICBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtIGFuZCBwdXRzIGl0IHRvIA0KKyAgICB1bmNvbXByZXNzZWQgc3RyZWFtLiBUaGUgZGVjb2RlciBtdXN0IHJlcGVhdCBpdCAiTEVOR1RIIiB0aW1lcy4NCisNCitUaGUgIkRJU1RBTkNFIiBjYW4gbm90IGJlIGxhcmdlciB0aGFuIGRpY3Rpb25hcnkgc2l6ZS4NCitBbmQgdGhlICJESVNUQU5DRSIgY2FuIG5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluDQordGhlIHVuY29tcHJlc3NlZCBzdHJlYW0gdGhhdCB3ZXJlIGRlY29kZWQgYmVmb3JlIHRoYXQgbWF0Y2guDQorDQorSW4gdGhpcyBzcGVjaWZpY2F0aW9uIHdlIHVzZSBjeWNsaWMgYnVmZmVyIHRvIGltcGxlbWVudCBTbGlkaW5nIFdpbmRvdw0KK2ZvciBMWk1BIGRlY29kZXI6DQorDQorY2xhc3MgQ091dFdpbmRvdw0KK3sNCisgIEJ5dGUgKkJ1ZjsNCisgIFVJbnQzMiBQb3M7DQorICBVSW50MzIgU2l6ZTsNCisgIGJvb2wgSXNGdWxsOw0KKw0KK3B1YmxpYzoNCisgIHVuc2lnbmVkIFRvdGFsUG9zOw0KKyAgQ091dFN0cmVhbSBPdXRTdHJlYW07DQorDQorICBDT3V0V2luZG93KCk6IEJ1ZihOVUxMKSB7fQ0KKyAgfkNPdXRXaW5kb3coKSB7IGRlbGV0ZSBbXUJ1ZjsgfQ0KKyANCisgIHZvaWQgQ3JlYXRlKFVJbnQzMiBkaWN0U2l6ZSkNCisgIHsNCisgICAgQnVmID0gbmV3IEJ5dGVbZGljdFNpemVdOw0KKyAgICBQb3MgPSAwOw0KKyAgICBTaXplID0gZGljdFNpemU7DQorICAgIElzRnVsbCA9IGZhbHNlOw0KKyAgICBUb3RhbFBvcyA9IDA7DQorICB9DQorDQorICB2b2lkIFB1dEJ5dGUoQnl0ZSBiKQ0KKyAgew0KKyAgICBUb3RhbFBvcysrOw0KKyAgICBCdWZbUG9zKytdID0gYjsNCisgICAgaWYgKFBvcyA9PSBTaXplKQ0KKyAgICB7DQorICAgICAgUG9zID0gMDsNCisgICAgICBJc0Z1bGwgPSB0cnVlOw0KKyAgICB9DQorICAgIE91dFN0cmVhbS5Xcml0ZUJ5dGUoYik7DQorICB9DQorDQorICBCeXRlIEdldEJ5dGUoVUludDMyIGRpc3QpIGNvbnN0DQorICB7DQorICAgIHJldHVybiBCdWZbZGlzdCA8PSBQb3MgPyBQb3MgLSBkaXN0IDogU2l6ZSAtIGRpc3QgKyBQb3NdOw0KKyAgfQ0KKw0KKyAgdm9pZCBDb3B5TWF0Y2goVUludDMyIGRpc3QsIHVuc2lnbmVkIGxlbikNCisgIHsNCisgICAgZm9yICg7IGxlbiA+IDA7IGxlbi0tKQ0KKyAgICAgIFB1dEJ5dGUoR2V0Qnl0ZShkaXN0KSk7DQorICB9DQorDQorICBib29sIENoZWNrRGlzdGFuY2UoVUludDMyIGRpc3QpIGNvbnN0DQorICB7DQorICAgIHJldHVybiBkaXN0IDw9IFBvcyB8fCBJc0Z1bGw7DQorICB9DQorDQorICBib29sIElzRW1wdHkoKSBjb25zdA0KKyAgew0KKyAgICByZXR1cm4gUG9zID09IDAgJiYgIUlzRnVsbDsNCisgIH0NCit9Ow0KKw0KKw0KK0luIGFub3RoZXIgaW1wbGVtZW50YXRpb24gaXQncyBwb3NzaWJsZSB0byB1c2Ugb25lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIA0KK1NsaWRpbmcgV2luZG93IGFuZCB0aGUgd2hvbGUgZGF0YSBzdHJlYW0gYWZ0ZXIgdW5jb21wcmVzc2luZy4NCisNCisNCitSYW5nZSBEZWNvZGVyDQorLS0tLS0tLS0tLS0tLQ0KKw0KK0xaTUEgYWxnb3JpdGhtIHVzZXMgUmFuZ2UgRW5jb2RpbmcgKDEpIGFzIGVudHJvcHkgY29kaW5nIG1ldGhvZC4NCisNCitMWk1BIHN0cmVhbSBjb250YWlucyBqdXN0IG9uZSB2ZXJ5IGJpZyBudW1iZXIgaW4gYmlnLWVuZGlhbiBlbmNvZGluZy4NCitMWk1BIGRlY29kZXIgdXNlcyB0aGUgUmFuZ2UgRGVjb2RlciB0byBleHRyYWN0IGEgc2VxdWVuY2Ugb2YgYmluYXJ5DQorc3ltYm9scyBmcm9tIHRoYXQgYmlnIG51bWJlci4NCisNCitUaGUgc3RhdGUgb2YgdGhlIFJhbmdlIERlY29kZXI6DQorDQorc3RydWN0IENSYW5nZURlY29kZXINCit7DQorICBVSW50MzIgUmFuZ2U7IA0KKyAgVUludDMyIENvZGU7DQorICBJbnB1dFN0cmVhbSAqSW5TdHJlYW07DQorDQorICBib29sIENvcnJ1cHRlZDsNCit9DQorDQorVGhlIG5vdGVzIGFib3V0IFVJbnQzMiB0eXBlIGZvciB0aGUgIlJhbmdlIiBhbmQgIkNvZGUiIHZhcmlhYmxlczoNCisNCisgIEl0J3MgcG9zc2libGUgdG8gdXNlIDY0LWJpdCAodW5zaWduZWQgb3Igc2lnbmVkKSBpbnRlZ2VyIHR5cGUNCisgIGZvciB0aGUgIlJhbmdlIiBhbmQgdGhlICJDb2RlIiB2YXJpYWJsZXMgaW5zdGVhZCBvZiAzMi1iaXQgdW5zaWduZWQsDQorICBidXQgc29tZSBhZGRpdGlvbmFsIGNvZGUgbXVzdCBiZSB1c2VkIHRvIHRydW5jYXRlIHRoZSB2YWx1ZXMgdG8gDQorICBsb3cgMzItYml0cyBhZnRlciBzb21lIG9wZXJhdGlvbnMuDQorDQorICBJZiB0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgZG9lcyBub3Qgc3VwcG9ydCAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlIA0KKyAgKGxpa2UgaW4gY2FzZSBvZiBKQVZBIGxhbmd1YWdlKSwgaXQncyBwb3NzaWJsZSB0byB1c2UgMzItYml0IHNpZ25lZCBpbnRlZ2VyLCANCisgIGJ1dCBzb21lIGNvZGUgbXVzdCBiZSBjaGFuZ2VkLiBGb3IgZXhhbXBsZSwgaXQncyByZXF1aXJlZCB0byBjaGFuZ2UgdGhlIGNvZGUNCisgIHRoYXQgdXNlcyBjb21wYXJpc29uIG9wZXJhdGlvbnMgZm9yIFVJbnQzMiB2YXJpYWJsZXMgaW4gdGhpcyBzcGVjaWZpY2F0aW9uLg0KKw0KK1RoZSBSYW5nZSBEZWNvZGVyIGNhbiBiZSBpbiBzb21lIHN0YXRlcyB0aGF0IGNhbiBiZSB0cmVhdGVkIGFzIA0KKyJDb3JydXB0aW9uIiBpbiBMWk1BIHN0cmVhbS4gVGhlIFJhbmdlIERlY29kZXIgdXNlcyB0aGUgdmFyaWFibGUgIkNvcnJ1cHRlZCI6DQorDQorICAoQ29ycnVwdGVkID09IGZhbHNlKSwgaWYgdGhlIFJhbmdlIERlY29kZXIgaGFzIG5vdCBkZXRlY3RlZCBhbnkgY29ycnVwdGlvbi4NCisgIChDb3JydXB0ZWQgPT0gdHJ1ZSksIGlmIHRoZSBSYW5nZSBEZWNvZGVyIGhhcyBkZXRlY3RlZCBzb21lIGNvcnJ1cHRpb24uDQorDQorVGhlIHJlZmVyZW5jZSBMWk1BIERlY29kZXIgaWdub3JlcyB0aGUgdmFsdWUgb2YgdGhlICJDb3JydXB0ZWQiIHZhcmlhYmxlLg0KK1NvIGl0IGNvbnRpbnVlcyB0byBkZWNvZGUgdGhlIHN0cmVhbSwgZXZlbiBpZiB0aGUgY29ycnVwdGlvbiBjYW4gYmUgZGV0ZWN0ZWQNCitpbiB0aGUgUmFuZ2UgRGVjb2Rlci4gVG8gcHJvdmlkZSB0aGUgZnVsbCBjb21wYXRpYmlsaXR5IHdpdGggb3V0cHV0IG9mIHRoZSANCityZWZlcmVuY2UgTFpNQSBEZWNvZGVyLCBhbm90aGVyIExaTUEgRGVjb2RlciBpbXBsZW1lbnRhdGlvbnMgbXVzdCBhbHNvIA0KK2lnbm9yZSB0aGUgdmFsdWUgb2YgdGhlICJDb3JydXB0ZWQiIHZhcmlhYmxlLg0KKw0KK1RoZSBMWk1BIEVuY29kZXIgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIG9ubHkgc3VjaCBMWk1BIHN0cmVhbXMsIHRoYXQgd2lsbCBub3QgDQorbGVhZCB0aGUgUmFuZ2UgRGVjb2RlciB0byBzdGF0ZXMsIHdoZXJlIHRoZSAiQ29ycnVwdGVkIiB2YXJpYWJsZSBpcyBzZXQgdG8gdHJ1ZS4NCisNCitUaGUgUmFuZ2UgRGVjb2RlciByZWFkcyBmaXJzdCA1IGJ5dGVzIGZyb20gaW5wdXQgc3RyZWFtIHRvIGluaXRpYWxpemUNCit0aGUgc3RhdGU6DQorDQordm9pZCBDUmFuZ2VEZWNvZGVyOjpJbml0KCkNCit7DQorICBDb3JydXB0ZWQgPSBmYWxzZTsNCisgIA0KKyAgaWYgKEluU3RyZWFtLT5SZWFkQnl0ZSgpICE9IDApDQorICAgIENvcnJ1cHRlZCA9IHRydWU7DQorICANCisgIFJhbmdlID0gMHhGRkZGRkZGRjsNCisgIENvZGUgPSAwOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspDQorICAgIENvZGUgPSAoQ29kZSA8PCA4KSB8IEluU3RyZWFtLT5SZWFkQnl0ZSgpOw0KKyAgDQorICBpZiAoQ29kZSA9PSBSYW5nZSkNCisgICAgQ29ycnVwdGVkID0gdHJ1ZTsNCit9DQorDQorVGhlIExaTUEgRW5jb2RlciBhbHdheXMgd3JpdGVzIFpFUk8gaW4gaW5pdGlhbCBieXRlIG9mIGNvbXByZXNzZWQgc3RyZWFtLg0KK1RoYXQgc2NoZW1lIGFsbG93cyB0byBzaW1wbGlmeSB0aGUgY29kZSBvZiB0aGUgUmFuZ2UgRW5jb2RlciBpbiB0aGUgDQorTFpNQSBFbmNvZGVyLg0KKw0KK0FmdGVyIHRoZSBsYXN0IGJpdCBvZiBkYXRhIHdhcyBkZWNvZGVkIGJ5IFJhbmdlIERlY29kZXIsIHRoZSB2YWx1ZSBvZiB0aGUNCisiQ29kZSIgdmFyaWFibGUgbXVzdCBiZSBlcXVhbCB0byAwLiBUaGUgTFpNQSBEZWNvZGVyIG11c3QgY2hlY2sgaXQgYnkgDQorY2FsbGluZyB0aGUgSXNGaW5pc2hlZE9LKCkgZnVuY3Rpb246DQorDQorICBib29sIElzRmluaXNoZWRPSygpIGNvbnN0IHsgcmV0dXJuIENvZGUgPT0gMDsgfQ0KKw0KK0lmIHRoZXJlIGlzIGNvcnJ1cHRpb24gaW4gZGF0YSBzdHJlYW0sIHRoZXJlIGlzIGJpZyBwcm9iYWJpbGl0eSB0aGF0DQordGhlICJDb2RlIiB2YWx1ZSB3aWxsIGJlIG5vdCBlcXVhbCB0byAwIGluIHRoZSBGaW5pc2goKSBmdW5jdGlvbi4gU28gdGhhdA0KK2NoZWNrIGluIHRoZSBJc0ZpbmlzaGVkT0soKSBmdW5jdGlvbiBwcm92aWRlcyB2ZXJ5IGdvb2QgZmVhdHVyZSBmb3IgDQorY29ycnVwdGlvbiBkZXRlY3Rpb24uDQorDQorVGhlIHZhbHVlIG9mIHRoZSAiUmFuZ2UiIHZhcmlhYmxlIGJlZm9yZSBlYWNoIGJpdCBkZWNvZGluZyBjYW4gbm90IGJlIHNtYWxsZXIgDQordGhhbiAoKFVJbnQzMikxIDw8IDI0KS4gVGhlIE5vcm1hbGl6ZSgpIGZ1bmN0aW9uIGtlZXBzIHRoZSAiUmFuZ2UiIHZhbHVlIGluIA0KK2Rlc2NyaWJlZCByYW5nZS4NCisNCisjZGVmaW5lIGtUb3BWYWx1ZSAoKFVJbnQzMikxIDw8IDI0KQ0KKw0KK3ZvaWQgQ1JhbmdlRGVjb2Rlcjo6Tm9ybWFsaXplKCkNCit7DQorICBpZiAoUmFuZ2UgPCBrVG9wVmFsdWUpDQorICB7DQorICAgIFJhbmdlIDw8PSA4Ow0KKyAgICBDb2RlID0gKENvZGUgPDwgOCkgfCBJblN0cmVhbS0+UmVhZEJ5dGUoKTsNCisgIH0NCit9DQorDQorTm90ZXM6IGlmIHRoZSBzaXplIG9mIHRoZSAiQ29kZSIgdmFyaWFibGUgaXMgbGFyZ2VyIHRoYW4gMzIgYml0cywgaXQncw0KK3JlcXVpcmVkIHRvIGtlZXAgb25seSBsb3cgMzIgYml0cyBvZiB0aGUgIkNvZGUiIHZhcmlhYmxlIGFmdGVyIHRoZSBjaGFuZ2UNCitpbiBOb3JtYWxpemUoKSBmdW5jdGlvbi4NCisNCitJZiB0aGUgTFpNQSBTdHJlYW0gaXMgbm90IGNvcnJ1cHRlZCwgdGhlIHZhbHVlIG9mIHRoZSAiQ29kZSIgdmFyaWFibGUgaXMNCithbHdheXMgc21hbGxlciB0aGFuIHZhbHVlIG9mIHRoZSAiUmFuZ2UiIHZhcmlhYmxlLg0KK0J1dCB0aGUgUmFuZ2UgRGVjb2RlciBpZ25vcmVzIHNvbWUgdHlwZXMgb2YgY29ycnVwdGlvbnMsIHNvIHRoZSB2YWx1ZSBvZg0KK3RoZSAiQ29kZSIgdmFyaWFibGUgY2FuIGJlIGVxdWFsIG9yIGxhcmdlciB0aGFuIHZhbHVlIG9mIHRoZSAiUmFuZ2UiIHZhcmlhYmxlDQorZm9yIHNvbWUgIkNvcnJ1cHRlZCIgYXJjaGl2ZXMuDQorDQorDQorTFpNQSB1c2VzIFJhbmdlIEVuY29kaW5nIG9ubHkgd2l0aCBiaW5hcnkgc3ltYm9scyBvZiB0d28gdHlwZXM6DQorICAxKSBiaW5hcnkgc3ltYm9scyB3aXRoIGZpeGVkIGFuZCBlcXVhbCBwcm9iYWJpbGl0aWVzIChkaXJlY3QgYml0cykNCisgIDIpIGJpbmFyeSBzeW1ib2xzIHdpdGggcHJlZGljdGVkIHByb2JhYmlsaXRpZXMNCisNCitUaGUgRGVjb2RlRGlyZWN0Qml0cygpIGZ1bmN0aW9uIGRlY29kZXMgdGhlIHNlcXVlbmNlIG9mIGRpcmVjdCBiaXRzOg0KKw0KK1VJbnQzMiBDUmFuZ2VEZWNvZGVyOjpEZWNvZGVEaXJlY3RCaXRzKHVuc2lnbmVkIG51bUJpdHMpDQorew0KKyAgVUludDMyIHJlcyA9IDA7DQorICBkbw0KKyAgew0KKyAgICBSYW5nZSA+Pj0gMTsNCisgICAgQ29kZSAtPSBSYW5nZTsNCisgICAgVUludDMyIHQgPSAwIC0gKChVSW50MzIpQ29kZSA+PiAzMSk7DQorICAgIENvZGUgKz0gUmFuZ2UgJiB0Ow0KKyAgICANCisgICAgaWYgKENvZGUgPT0gUmFuZ2UpDQorICAgICAgQ29ycnVwdGVkID0gdHJ1ZTsNCisgICAgDQorICAgIE5vcm1hbGl6ZSgpOw0KKyAgICByZXMgPDw9IDE7DQorICAgIHJlcyArPSB0ICsgMTsNCisgIH0NCisgIHdoaWxlICgtLW51bUJpdHMpOw0KKyAgcmV0dXJuIHJlczsNCit9DQorDQorDQorVGhlIEJpdCBEZWNvZGluZyB3aXRoIFByb2JhYmlsaXR5IE1vZGVsDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorVGhlIHRhc2sgb2YgQml0IFByb2JhYmlsaXR5IE1vZGVsIGlzIHRvIGVzdGltYXRlIHByb2JhYmlsaXRpZXMgb2YgYmluYXJ5DQorc3ltYm9scy4gQW5kIHRoZW4gaXQgcHJvdmlkZXMgdGhlIFJhbmdlIERlY29kZXIgd2l0aCB0aGF0IGluZm9ybWF0aW9uLg0KK1RoZSBiZXR0ZXIgcHJlZGljdGlvbiBwcm92aWRlcyBiZXR0ZXIgY29tcHJlc3Npb24gcmF0aW8uDQorVGhlIEJpdCBQcm9iYWJpbGl0eSBNb2RlbCB1c2VzIHN0YXRpc3RpY2FsIGRhdGEgb2YgcHJldmlvdXMgZGVjb2RlZA0KK3N5bWJvbHMuDQorDQorVGhhdCBlc3RpbWF0ZWQgcHJvYmFiaWxpdHkgaXMgcHJlc2VudGVkIGFzIDExLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlDQordGhhdCByZXByZXNlbnRzIHRoZSBwcm9iYWJpbGl0eSBvZiBzeW1ib2wgIjAiLg0KKw0KKyNkZWZpbmUga051bUJpdE1vZGVsVG90YWxCaXRzIDExDQorDQorTWF0aGVtYXRpY2FsIHByb2JhYmlsaXRpZXMgY2FuIGJlIHByZXNlbnRlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybXVsYXM6DQorICAgICBwcm9iYWJpbGl0eShzeW1ib2xfMCkgPSBwcm9iIC8gMjA0OC4NCisgICAgIHByb2JhYmlsaXR5KHN5bWJvbF8xKSA9ICAxIC0gUHJvYmFiaWxpdHkoc3ltYm9sXzApID0gIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIDEgLSBwcm9iIC8gMjA0OCA9ICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAoMjA0OCAtIHByb2IpIC8gMjA0OA0KK3doZXJlIHRoZSAicHJvYiIgdmFyaWFibGUgY29udGFpbnMgMTEtYml0IGludGVnZXIgcHJvYmFiaWxpdHkgY291bnRlci4NCisNCitJdCdzIHJlY29tbWVuZGVkIHRvIHVzZSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlLCB0byBzdG9yZSB0aGVzZSAxMS1iaXQNCitwcm9iYWJpbGl0eSB2YWx1ZXM6DQorDQordHlwZWRlZiBVSW50MTYgQ1Byb2I7DQorDQorRWFjaCBwcm9iYWJpbGl0eSB2YWx1ZSBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggdmFsdWUgKCgxIDw8IDExKSAvIDIpLA0KK3RoYXQgcmVwcmVzZW50cyB0aGUgc3RhdGUsIHdoZXJlIHByb2JhYmlsaXRpZXMgb2Ygc3ltYm9scyAwIGFuZCAxIA0KK2FyZSBlcXVhbCB0byAwLjU6DQorDQorI2RlZmluZSBQUk9CX0lOSVRfVkFMICgoMSA8PCBrTnVtQml0TW9kZWxUb3RhbEJpdHMpIC8gMikNCisNCitUaGUgSU5JVF9QUk9CUyBtYWNybyBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGFycmF5IG9mIENQcm9iIHZhcmlhYmxlczoNCisNCisjZGVmaW5lIElOSVRfUFJPQlMocCkgXA0KKyB7IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YocCkgLyBzaXplb2YocFswXSk7IGkrKykgcFtpXSA9IFBST0JfSU5JVF9WQUw7IH0NCisNCisNCitUaGUgRGVjb2RlQml0KCkgZnVuY3Rpb24gZGVjb2RlcyBvbmUgYml0Lg0KK1RoZSBMWk1BIGRlY29kZXIgcHJvdmlkZXMgdGhlIHBvaW50ZXIgdG8gQ1Byb2IgdmFyaWFibGUgdGhhdCBjb250YWlucyANCitpbmZvcm1hdGlvbiBhYm91dCBlc3RpbWF0ZWQgcHJvYmFiaWxpdHkgZm9yIHN5bWJvbCAwIGFuZCB0aGUgUmFuZ2UgRGVjb2RlciANCit1cGRhdGVzIHRoYXQgQ1Byb2IgdmFyaWFibGUgYWZ0ZXIgZGVjb2RpbmcuIFRoZSBSYW5nZSBEZWNvZGVyIGluY3JlYXNlcyANCitlc3RpbWF0ZWQgcHJvYmFiaWxpdHkgb2YgdGhlIHN5bWJvbCB0aGF0IHdhcyBkZWNvZGVkOg0KKw0KKyNkZWZpbmUga051bU1vdmVCaXRzIDUNCisNCit1bnNpZ25lZCBDUmFuZ2VEZWNvZGVyOjpEZWNvZGVCaXQoQ1Byb2IgKnByb2IpDQorew0KKyAgdW5zaWduZWQgdiA9ICpwcm9iOw0KKyAgVUludDMyIGJvdW5kID0gKFJhbmdlID4+IGtOdW1CaXRNb2RlbFRvdGFsQml0cykgKiB2Ow0KKyAgdW5zaWduZWQgc3ltYm9sOw0KKyAgaWYgKENvZGUgPCBib3VuZCkNCisgIHsNCisgICAgdiArPSAoKDEgPDwga051bUJpdE1vZGVsVG90YWxCaXRzKSAtIHYpID4+IGtOdW1Nb3ZlQml0czsNCisgICAgUmFuZ2UgPSBib3VuZDsNCisgICAgc3ltYm9sID0gMDsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgdiAtPSB2ID4+IGtOdW1Nb3ZlQml0czsNCisgICAgQ29kZSAtPSBib3VuZDsNCisgICAgUmFuZ2UgLT0gYm91bmQ7DQorICAgIHN5bWJvbCA9IDE7DQorICB9DQorICAqcHJvYiA9IChDUHJvYil2Ow0KKyAgTm9ybWFsaXplKCk7DQorICByZXR1cm4gc3ltYm9sOw0KK30NCisNCisNCitUaGUgQmluYXJ5IFRyZWUgb2YgYml0IG1vZGVsIGNvdW50ZXJzDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK0xaTUEgdXNlcyBhIHRyZWUgb2YgQml0IG1vZGVsIHZhcmlhYmxlcyB0byBkZWNvZGUgc3ltYm9sIHRoYXQgbmVlZHMNCitzZXZlcmFsIGJpdHMgZm9yIHN0b3JpbmcuIFRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2Ygc3VjaCB0cmVlcyBpbiBMWk1BOg0KKyAgMSkgdGhlIHRyZWUgdGhhdCBkZWNvZGVzIGJpdHMgZnJvbSBoaWdoIGJpdCB0byBsb3cgYml0ICh0aGUgbm9ybWFsIHNjaGVtZSkuDQorICAyKSB0aGUgdHJlZSB0aGF0IGRlY29kZXMgYml0cyBmcm9tIGxvdyBiaXQgdG8gaGlnaCBiaXQgKHRoZSByZXZlcnNlIHNjaGVtZSkuDQorDQorRWFjaCBiaW5hcnkgdHJlZSBzdHJ1Y3R1cmUgc3VwcG9ydHMgZGlmZmVyZW50IHNpemUgb2YgZGVjb2RlZCBzeW1ib2wNCisodGhlIHNpemUgb2YgYmluYXJ5IHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdmFsdWUgb2Ygc3ltYm9sKS4NCitJZiB0aGF0IHNpemUgb2YgZGVjb2RlZCBzeW1ib2wgaXMgIk51bUJpdHMiIGJpdHMsIHRoZSB0cmVlIHN0cnVjdHVyZSANCit1c2VzIHRoZSBhcnJheSBvZiAoMiA8PCBOdW1CaXRzKSBjb3VudGVycyBvZiBDUHJvYiB0eXBlLiANCitCdXQgb25seSAoKDIgPDwgTnVtQml0cykgLSAxKSBpdGVtcyBhcmUgdXNlZCBieSBlbmNvZGVyIGFuZCBkZWNvZGVyLg0KK1RoZSBmaXJzdCBpdGVtICh0aGUgaXRlbSB3aXRoIGluZGV4IGVxdWFsIHRvIDApIGluIGFycmF5IGlzIHVudXNlZC4NCitUaGF0IHNjaGVtZSB3aXRoIHVudXNlZCBhcnJheSdzIGl0ZW0gYWxsb3dzIHRvIHNpbXBsaWZ5IHRoZSBjb2RlLg0KKw0KK3Vuc2lnbmVkIEJpdFRyZWVSZXZlcnNlRGVjb2RlKENQcm9iICpwcm9icywgdW5zaWduZWQgbnVtQml0cywgQ1JhbmdlRGVjb2RlciAqcmMpDQorew0KKyAgdW5zaWduZWQgbSA9IDE7DQorICB1bnNpZ25lZCBzeW1ib2wgPSAwOw0KKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUJpdHM7IGkrKykNCisgIHsNCisgICAgdW5zaWduZWQgYml0ID0gcmMtPkRlY29kZUJpdCgmcHJvYnNbbV0pOw0KKyAgICBtIDw8PSAxOw0KKyAgICBtICs9IGJpdDsNCisgICAgc3ltYm9sIHw9IChiaXQgPDwgaSk7DQorICB9DQorICByZXR1cm4gc3ltYm9sOw0KK30NCisNCit0ZW1wbGF0ZSA8dW5zaWduZWQgTnVtQml0cz4NCitjbGFzcyBDQml0VHJlZURlY29kZXINCit7DQorICBDUHJvYiBQcm9ic1sodW5zaWduZWQpMSA8PCBOdW1CaXRzXTsNCisNCitwdWJsaWM6DQorDQorICB2b2lkIEluaXQoKQ0KKyAgew0KKyAgICBJTklUX1BST0JTKFByb2JzKTsNCisgIH0NCisNCisgIHVuc2lnbmVkIERlY29kZShDUmFuZ2VEZWNvZGVyICpyYykNCisgIHsNCisgICAgdW5zaWduZWQgbSA9IDE7DQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1CaXRzOyBpKyspDQorICAgICAgbSA9IChtIDw8IDEpICsgcmMtPkRlY29kZUJpdCgmUHJvYnNbbV0pOw0KKyAgICByZXR1cm4gbSAtICgodW5zaWduZWQpMSA8PCBOdW1CaXRzKTsNCisgIH0NCisNCisgIHVuc2lnbmVkIFJldmVyc2VEZWNvZGUoQ1JhbmdlRGVjb2RlciAqcmMpDQorICB7DQorICAgIHJldHVybiBCaXRUcmVlUmV2ZXJzZURlY29kZShQcm9icywgTnVtQml0cywgcmMpOw0KKyAgfQ0KK307DQorDQorDQorTFogcGFydCBvZiBMWk1BIA0KKy0tLS0tLS0tLS0tLS0tLQ0KKw0KK0xaIHBhcnQgb2YgTFpNQSBkZXNjcmliZXMgZGV0YWlscyBhYm91dCB0aGUgZGVjb2Rpbmcgb2YgTUFUQ0hFUyBhbmQgTElURVJBTFMuDQorDQorDQorVGhlIExpdGVyYWwgRGVjb2RpbmcNCistLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1RoZSBMWk1BIERlY29kZXIgdXNlcyAoMSA8PCAobGMgKyBscCkpIHRhYmxlcyB3aXRoIENQcm9iIHZhbHVlcywgd2hlcmUgDQorZWFjaCB0YWJsZSBjb250YWlucyAweDMwMCBDUHJvYiB2YWx1ZXM6DQorDQorICBDUHJvYiAqTGl0UHJvYnM7DQorDQorICB2b2lkIENyZWF0ZUxpdGVyYWxzKCkNCisgIHsNCisgICAgTGl0UHJvYnMgPSBuZXcgQ1Byb2JbKFVJbnQzMikweDMwMCA8PCAobGMgKyBscCldOw0KKyAgfQ0KKyAgDQorICB2b2lkIEluaXRMaXRlcmFscygpDQorICB7DQorICAgIFVJbnQzMiBudW0gPSAoVUludDMyKTB4MzAwIDw8IChsYyArIGxwKTsNCisgICAgZm9yIChVSW50MzIgaSA9IDA7IGkgPCBudW07IGkrKykNCisgICAgICBMaXRQcm9ic1tpXSA9IFBST0JfSU5JVF9WQUw7DQorICB9DQorDQorVG8gc2VsZWN0IHRoZSB0YWJsZSBmb3IgZGVjb2RpbmcgaXQgdXNlcyB0aGUgY29udGV4dCB0aGF0IGNvbnNpc3RzIG9mDQorKGxjKSBoaWdoIGJpdHMgZnJvbSBwcmV2aW91cyBsaXRlcmFsIGFuZCAobHApIGxvdyBiaXRzIGZyb20gdmFsdWUgdGhhdA0KK3JlcHJlc2VudHMgY3VycmVudCBwb3NpdGlvbiBpbiBvdXRwdXRTdHJlYW0uDQorDQorSWYgKFN0YXRlID4gNyksIHRoZSBMaXRlcmFsIERlY29kZXIgYWxzbyB1c2VzICJtYXRjaEJ5dGUiIHRoYXQgcmVwcmVzZW50cyANCit0aGUgYnl0ZSBpbiBPdXRwdXRTdHJlYW0gYXQgcG9zaXRpb24gdGhlIGlzIHRoZSBESVNUQU5DRSBieXRlcyBiZWZvcmUgDQorY3VycmVudCBwb3NpdGlvbiwgd2hlcmUgdGhlIERJU1RBTkNFIGlzIHRoZSBkaXN0YW5jZSBpbiBESVNUQU5DRS1MRU5HVEggcGFpcg0KK29mIGxhdGVzdCBkZWNvZGVkIG1hdGNoLg0KKw0KK1RoZSBmb2xsb3dpbmcgY29kZSBkZWNvZGVzIG9uZSBsaXRlcmFsIGFuZCBwdXRzIGl0IHRvIFNsaWRpbmcgV2luZG93IGJ1ZmZlcjoNCisNCisgIHZvaWQgRGVjb2RlTGl0ZXJhbCh1bnNpZ25lZCBzdGF0ZSwgVUludDMyIHJlcDApDQorICB7DQorICAgIHVuc2lnbmVkIHByZXZCeXRlID0gMDsNCisgICAgaWYgKCFPdXRXaW5kb3cuSXNFbXB0eSgpKQ0KKyAgICAgIHByZXZCeXRlID0gT3V0V2luZG93LkdldEJ5dGUoMSk7DQorICAgIA0KKyAgICB1bnNpZ25lZCBzeW1ib2wgPSAxOw0KKyAgICB1bnNpZ25lZCBsaXRTdGF0ZSA9ICgoT3V0V2luZG93LlRvdGFsUG9zICYgKCgxIDw8IGxwKSAtIDEpKSA8PCBsYykgKyAocHJldkJ5dGUgPj4gKDggLSBsYykpOw0KKyAgICBDUHJvYiAqcHJvYnMgPSAmTGl0UHJvYnNbKFVJbnQzMikweDMwMCAqIGxpdFN0YXRlXTsNCisgICAgDQorICAgIGlmIChzdGF0ZSA+PSA3KQ0KKyAgICB7DQorICAgICAgdW5zaWduZWQgbWF0Y2hCeXRlID0gT3V0V2luZG93LkdldEJ5dGUocmVwMCArIDEpOw0KKyAgICAgIGRvDQorICAgICAgew0KKyAgICAgICAgdW5zaWduZWQgbWF0Y2hCaXQgPSAobWF0Y2hCeXRlID4+IDcpICYgMTsNCisgICAgICAgIG1hdGNoQnl0ZSA8PD0gMTsNCisgICAgICAgIHVuc2lnbmVkIGJpdCA9IFJhbmdlRGVjLkRlY29kZUJpdCgmcHJvYnNbKCgxICsgbWF0Y2hCaXQpIDw8IDgpICsgc3ltYm9sXSk7DQorICAgICAgICBzeW1ib2wgPSAoc3ltYm9sIDw8IDEpIHwgYml0Ow0KKyAgICAgICAgaWYgKG1hdGNoQml0ICE9IGJpdCkNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHdoaWxlIChzeW1ib2wgPCAweDEwMCk7DQorICAgIH0NCisgICAgd2hpbGUgKHN5bWJvbCA8IDB4MTAwKQ0KKyAgICAgIHN5bWJvbCA9IChzeW1ib2wgPDwgMSkgfCBSYW5nZURlYy5EZWNvZGVCaXQoJnByb2JzW3N5bWJvbF0pOw0KKyAgICBPdXRXaW5kb3cuUHV0Qnl0ZSgoQnl0ZSkoc3ltYm9sIC0gMHgxMDApKTsNCisgIH0NCisNCisNCitUaGUgbWF0Y2ggbGVuZ3RoIGRlY29kaW5nDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1RoZSBtYXRjaCBsZW5ndGggZGVjb2RlciByZXR1cm5zIG5vcm1hbGl6ZWQgKHplcm8tYmFzZWQgdmFsdWUpIA0KK2xlbmd0aCBvZiBtYXRjaC4gVGhhdCB2YWx1ZSBjYW4gYmUgY29udmVydGVkIHRvIHJlYWwgbGVuZ3RoIG9mIHRoZSBtYXRjaCANCit3aXRoIHRoZSBmb2xsb3dpbmcgY29kZToNCisNCisjZGVmaW5lIGtNYXRjaE1pbkxlbiAyDQorDQorICAgIG1hdGNoTGVuID0gbGVuICsga01hdGNoTWluTGVuOw0KKw0KK1RoZSBtYXRjaCBsZW5ndGggZGVjb2RlciBjYW4gcmV0dXJuIHRoZSB2YWx1ZXMgZnJvbSAwIHRvIDI3MS4NCitBbmQgdGhlIGNvcnJlc3BvbmRlZCByZWFsIG1hdGNoIGxlbmd0aCB2YWx1ZXMgY2FuIGJlIGluIHRoZSByYW5nZSANCitmcm9tIDIgdG8gMjczLg0KKw0KK1RoZSBmb2xsb3dpbmcgc2NoZW1lIGlzIHVzZWQgZm9yIHRoZSBtYXRjaCBsZW5ndGggZW5jb2Rpbmc6DQorDQorICBCaW5hcnkgZW5jb2RpbmcgICAgQmluYXJ5IFRyZWUgc3RydWN0dXJlICAgIFplcm8tYmFzZWQgbWF0Y2ggbGVuZ3RoIA0KKyAgc2VxdWVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmluYXJ5ICsgZGVjaW1hbCk6DQorDQorICAwIHh4eCAgICAgICAgICAgICAgTG93Q29kZXJbcG9zU3RhdGVdICAgICAgIHh4eA0KKyAgMSAwIHl5eSAgICAgICAgICAgIE1pZENvZGVyW3Bvc1N0YXRlXSAgICAgICB5eXkgKyA4DQorICAxIDEgenp6enp6enogICAgICAgSGlnaENvZGVyICAgICAgICAgICAgICAgIHp6enp6enp6ICsgMTYNCisNCitMWk1BIHVzZXMgYml0IG1vZGVsIHZhcmlhYmxlICJDaG9pY2UiIHRvIGRlY29kZSB0aGUgZmlyc3Qgc2VsZWN0aW9uIGJpdC4NCisNCitJZiB0aGUgZmlyc3Qgc2VsZWN0aW9uIGJpdCBpcyBlcXVhbCB0byAwLCB0aGUgZGVjb2RlciB1c2VzIGJpbmFyeSB0cmVlIA0KKyAgTG93Q29kZXJbcG9zU3RhdGVdIHRvIGRlY29kZSAzLWJpdCB6ZXJvLWJhc2VkIG1hdGNoIGxlbmd0aCAoeHh4KS4NCisNCitJZiB0aGUgZmlyc3Qgc2VsZWN0aW9uIGJpdCBpcyBlcXVhbCB0byAxLCB0aGUgZGVjb2RlciB1c2VzIGJpdCBtb2RlbCANCisgIHZhcmlhYmxlICJDaG9pY2UyIiB0byBkZWNvZGUgdGhlIHNlY29uZCBzZWxlY3Rpb24gYml0Lg0KKw0KKyAgSWYgdGhlIHNlY29uZCBzZWxlY3Rpb24gYml0IGlzIGVxdWFsIHRvIDAsIHRoZSBkZWNvZGVyIHVzZXMgYmluYXJ5IHRyZWUgDQorICAgIE1pZENvZGVyW3Bvc1N0YXRlXSB0byBkZWNvZGUgMy1iaXQgInl5eSIgdmFsdWUsIGFuZCB6ZXJvLWJhc2VkIG1hdGNoDQorICAgIGxlbmd0aCBpcyBlcXVhbCB0byAoeXl5ICsgOCkuDQorDQorICBJZiB0aGUgc2Vjb25kIHNlbGVjdGlvbiBiaXQgaXMgZXF1YWwgdG8gMSwgdGhlIGRlY29kZXIgdXNlcyBiaW5hcnkgdHJlZSANCisgICAgSGlnaENvZGVyIHRvIGRlY29kZSA4LWJpdCAienp6enp6enoiIHZhbHVlLCBhbmQgemVyby1iYXNlZCANCisgICAgbWF0Y2ggbGVuZ3RoIGlzIGVxdWFsIHRvICh6enp6enp6eiArIDE2KS4NCisNCitMWk1BIHVzZXMgInBvc1N0YXRlIiB2YWx1ZSBhcyBjb250ZXh0IHRvIHNlbGVjdCB0aGUgYmluYXJ5IHRyZWUgDQorZnJvbSBMb3dDb2RlciBhbmQgTWlkQ29kZXIgYmluYXJ5IHRyZWUgYXJyYXlzOg0KKw0KKyAgICB1bnNpZ25lZCBwb3NTdGF0ZSA9IE91dFdpbmRvdy5Ub3RhbFBvcyAmICgoMSA8PCBwYikgLSAxKTsNCisNCitUaGUgZnVsbCBjb2RlIG9mIHRoZSBsZW5ndGggZGVjb2RlcjoNCisNCitjbGFzcyBDTGVuRGVjb2Rlcg0KK3sNCisgIENQcm9iIENob2ljZTsNCisgIENQcm9iIENob2ljZTI7DQorICBDQml0VHJlZURlY29kZXI8Mz4gTG93Q29kZXJbMSA8PCBrTnVtUG9zQml0c01heF07DQorICBDQml0VHJlZURlY29kZXI8Mz4gTWlkQ29kZXJbMSA8PCBrTnVtUG9zQml0c01heF07DQorICBDQml0VHJlZURlY29kZXI8OD4gSGlnaENvZGVyOw0KKw0KK3B1YmxpYzoNCisNCisgIHZvaWQgSW5pdCgpDQorICB7DQorICAgIENob2ljZSA9IFBST0JfSU5JVF9WQUw7DQorICAgIENob2ljZTIgPSBQUk9CX0lOSVRfVkFMOw0KKyAgICBIaWdoQ29kZXIuSW5pdCgpOw0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgKDEgPDwga051bVBvc0JpdHNNYXgpOyBpKyspDQorICAgIHsNCisgICAgICBMb3dDb2RlcltpXS5Jbml0KCk7DQorICAgICAgTWlkQ29kZXJbaV0uSW5pdCgpOw0KKyAgICB9DQorICB9DQorDQorICB1bnNpZ25lZCBEZWNvZGUoQ1JhbmdlRGVjb2RlciAqcmMsIHVuc2lnbmVkIHBvc1N0YXRlKQ0KKyAgew0KKyAgICBpZiAocmMtPkRlY29kZUJpdCgmQ2hvaWNlKSA9PSAwKQ0KKyAgICAgIHJldHVybiBMb3dDb2Rlcltwb3NTdGF0ZV0uRGVjb2RlKHJjKTsNCisgICAgaWYgKHJjLT5EZWNvZGVCaXQoJkNob2ljZTIpID09IDApDQorICAgICAgcmV0dXJuIDggKyBNaWRDb2Rlcltwb3NTdGF0ZV0uRGVjb2RlKHJjKTsNCisgICAgcmV0dXJuIDE2ICsgSGlnaENvZGVyLkRlY29kZShyYyk7DQorICB9DQorfTsNCisNCitUaGUgTFpNQSBkZWNvZGVyIHVzZXMgdHdvIGluc3RhbmNlcyBvZiBDTGVuRGVjb2RlciBjbGFzcy4NCitUaGUgZmlyc3QgaW5zdGFuY2UgaXMgZm9yIHRoZSBtYXRjaGVzIG9mICJTaW1wbGUgTWF0Y2giIHR5cGUsDQorYW5kIHRoZSBzZWNvbmQgaW5zdGFuY2UgaXMgZm9yIHRoZSBtYXRjaGVzIG9mICJSZXAgTWF0Y2giIHR5cGU6DQorDQorICBDTGVuRGVjb2RlciBMZW5EZWNvZGVyOw0KKyAgQ0xlbkRlY29kZXIgUmVwTGVuRGVjb2RlcjsNCisNCisNCitUaGUgbWF0Y2ggZGlzdGFuY2UgZGVjb2RpbmcNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitMWk1BIHN1cHBvcnRzIGRpY3Rpb25hcnkgc2l6ZXMgdXAgdG8gNCBHaUIgbWludXMgMS4NCitUaGUgdmFsdWUgb2YgbWF0Y2ggZGlzdGFuY2UgKGRlY29kZWQgYnkgZGlzdGFuY2UgZGVjb2RlcikgY2FuIGJlIA0KK2Zyb20gMSB0byAyXjMyLiBCdXQgdGhlIGRpc3RhbmNlIHZhbHVlIHRoYXQgaXMgZXF1YWwgdG8gMl4zMiBpcyB1c2VkIHRvDQoraW5kaWNhdGUgdGhlICJFbmQgb2Ygc3RyZWFtIiBtYXJrZXIuIFNvIHJlYWwgbGFyZ2VzdCBtYXRjaCBkaXN0YW5jZSANCit0aGF0IGlzIHVzZWQgZm9yIExaLXdpbmRvdyBtYXRjaCBpcyAoMl4zMiAtIDEpLg0KKw0KK0xaTUEgdXNlcyBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoemVyby1iYXNlZCBsZW5ndGgpIA0KK3RvIGNhbGN1bGF0ZSB0aGUgY29udGV4dCBzdGF0ZSAibGVuU3RhdGUiIGRvIGRlY29kZSB0aGUgZGlzdGFuY2UgdmFsdWU6DQorDQorI2RlZmluZSBrTnVtTGVuVG9Qb3NTdGF0ZXMgNA0KKw0KKyAgICB1bnNpZ25lZCBsZW5TdGF0ZSA9IGxlbjsNCisgICAgaWYgKGxlblN0YXRlID4ga051bUxlblRvUG9zU3RhdGVzIC0gMSkNCisgICAgICBsZW5TdGF0ZSA9IGtOdW1MZW5Ub1Bvc1N0YXRlcyAtIDE7DQorDQorVGhlIGRpc3RhbmNlIGRlY29kZXIgcmV0dXJucyB0aGUgImRpc3QiIHZhbHVlIHRoYXQgaXMgemVyby1iYXNlZCB2YWx1ZSANCitvZiBtYXRjaCBkaXN0YW5jZS4gVGhlIHJlYWwgbWF0Y2ggZGlzdGFuY2UgY2FuIGJlIGNhbGN1bGF0ZWQgd2l0aCB0aGUNCitmb2xsb3dpbmcgY29kZToNCisgIA0KKyAgbWF0Y2hEaXN0YW5jZSA9IGRpc3QgKyAxOyANCisNCitUaGUgc3RhdGUgb2YgdGhlIGRpc3RhbmNlIGRlY29kZXIgYW5kIHRoZSBpbml0aWFsaXphdGlvbiBjb2RlOiANCisNCisgICNkZWZpbmUga0VuZFBvc01vZGVsSW5kZXggMTQNCisgICNkZWZpbmUga051bUZ1bGxEaXN0YW5jZXMgKDEgPDwgKGtFbmRQb3NNb2RlbEluZGV4ID4+IDEpKQ0KKyAgI2RlZmluZSBrTnVtQWxpZ25CaXRzIDQNCisNCisgIENCaXRUcmVlRGVjb2Rlcjw2PiBQb3NTbG90RGVjb2RlcltrTnVtTGVuVG9Qb3NTdGF0ZXNdOw0KKyAgQ1Byb2IgUG9zRGVjb2RlcnNbMSArIGtOdW1GdWxsRGlzdGFuY2VzIC0ga0VuZFBvc01vZGVsSW5kZXhdOw0KKyAgQ0JpdFRyZWVEZWNvZGVyPGtOdW1BbGlnbkJpdHM+IEFsaWduRGVjb2RlcjsNCisNCisgIHZvaWQgSW5pdERpc3QoKQ0KKyAgew0KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwga051bUxlblRvUG9zU3RhdGVzOyBpKyspDQorICAgICAgUG9zU2xvdERlY29kZXJbaV0uSW5pdCgpOw0KKyAgICBBbGlnbkRlY29kZXIuSW5pdCgpOw0KKyAgICBJTklUX1BST0JTKFBvc0RlY29kZXJzKTsNCisgIH0NCisNCitBdCBmaXJzdCBzdGFnZSB0aGUgZGlzdGFuY2UgZGVjb2RlciBkZWNvZGVzIDYtYml0ICJwb3NTbG90IiB2YWx1ZSB3aXRoIGJpdA0KK3RyZWUgZGVjb2RlciBmcm9tIFBvc1Nsb3REZWNvZGVyIGFycmF5LiBJdCdzIHBvc3NpYmxlIHRvIGdldCAyXjY9NjQgZGlmZmVyZW50IA0KKyJwb3NTbG90IiB2YWx1ZXMuDQorDQorICAgIHVuc2lnbmVkIHBvc1Nsb3QgPSBQb3NTbG90RGVjb2RlcltsZW5TdGF0ZV0uRGVjb2RlKCZSYW5nZURlYyk7DQorDQorVGhlIGVuY29kaW5nIHNjaGVtZSBmb3IgZGlzdGFuY2UgdmFsdWUgaXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZToNCisNCitwb3NTbG90IChkZWNpbWFsKSAvDQorICAgICAgemVyby1iYXNlZCBkaXN0YW5jZSAoYmluYXJ5KQ0KKyAwICAgIDANCisgMSAgICAxDQorIDIgICAgMTANCisgMyAgICAxMQ0KKw0KKyA0ICAgIDEwIHgNCisgNSAgICAxMSB4DQorIDYgICAgMTAgeHgNCisgNyAgICAxMSB4eA0KKyA4ICAgIDEwIHh4eA0KKyA5ICAgIDExIHh4eA0KKzEwICAgIDEwIHh4eHgNCisxMSAgICAxMSB4eHh4DQorMTIgICAgMTAgeHh4eHgNCisxMyAgICAxMSB4eHh4eA0KKw0KKzE0ICAgIDEwIHl5IHp6enoNCisxNSAgICAxMSB5eSB6enp6DQorMTYgICAgMTAgeXl5IHp6enoNCisxNyAgICAxMSB5eXkgenp6eg0KKy4uLg0KKzYyICAgIDEwIHl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5IHp6enoNCis2MyAgICAxMSB5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eSB6enp6DQorDQord2hlcmUgDQorICAieCAuLi4geCIgbWVhbnMgdGhlIHNlcXVlbmNlIG9mIGJpbmFyeSBzeW1ib2xzIGVuY29kZWQgd2l0aCBiaW5hcnkgdHJlZSBhbmQgDQorICAgICAgIlJldmVyc2UiIHNjaGVtZS4gSXQgdXNlcyBzZXBhcmF0ZWQgYmluYXJ5IHRyZWUgZm9yIGVhY2ggcG9zU2xvdCBmcm9tIDQgdG8gMTMuDQorICAieSIgbWVhbnMgZGlyZWN0IGJpdCBlbmNvZGVkIHdpdGggcmFuZ2UgY29kZXIuDQorICAienp6eiIgbWVhbnMgdGhlIHNlcXVlbmNlIG9mIGZvdXIgYmluYXJ5IHN5bWJvbHMgZW5jb2RlZCB3aXRoIGJpbmFyeQ0KKyAgICAgIHRyZWUgd2l0aCAiUmV2ZXJzZSIgc2NoZW1lLCB3aGVyZSBvbmUgY29tbW9uIGJpbmFyeSB0cmVlICJBbGlnbkRlY29kZXIiDQorICAgICAgaXMgdXNlZCBmb3IgYWxsIHBvc1Nsb3QgdmFsdWVzLg0KKw0KK0lmIChwb3NTbG90IDwgNCksIHRoZSAiZGlzdCIgdmFsdWUgaXMgZXF1YWwgdG8gcG9zU2xvdCB2YWx1ZS4NCisNCitJZiAocG9zU2xvdCA+PSA0KSwgdGhlIGRlY29kZXIgdXNlcyAicG9zU2xvdCIgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBvZg0KKyAgdGhlIGhpZ2ggYml0cyBvZiAiZGlzdCIgdmFsdWUgYW5kIHRoZSBudW1iZXIgb2YgdGhlIGxvdyBiaXRzLg0KKw0KKyAgSWYgKDQgPD0gcG9zU2xvdCA8IGtFbmRQb3NNb2RlbEluZGV4KSwgdGhlIGRlY29kZXIgdXNlcyBiaXQgdHJlZSBkZWNvZGVycy4NCisgICAgKG9uZSBzZXBhcmF0ZWQgYml0IHRyZWUgZGVjb2RlciBwZXIgb25lIHBvc1Nsb3QgdmFsdWUpIGFuZCAiUmV2ZXJzZSIgc2NoZW1lLg0KKyAgICBJbiB0aGlzIGltcGxlbWVudGF0aW9uIHdlIHVzZSBvbmUgQ1Byb2IgYXJyYXkgIlBvc0RlY29kZXJzIiB0aGF0IGNvbnRhaW5zIA0KKyAgICBhbGwgQ1Byb2IgdmFyaWFibGVzIGZvciBhbGwgdGhlc2UgYml0IGRlY29kZXJzLg0KKyAgDQorICBpZiAocG9zU2xvdCA+PSBrRW5kUG9zTW9kZWxJbmRleCksIHRoZSBtaWRkbGUgYml0cyBhcmUgZGVjb2RlZCBhcyBkaXJlY3QgDQorICAgIGJpdHMgZnJvbSBSYW5nZURlY29kZXIgYW5kIHRoZSBsb3cgNCBiaXRzIGFyZSBkZWNvZGVkIHdpdGggYSBiaXQgdHJlZSANCisgICAgZGVjb2RlciAiQWxpZ25EZWNvZGVyIiB3aXRoICJSZXZlcnNlIiBzY2hlbWUuDQorDQorVGhlIGNvZGUgdG8gZGVjb2RlIHplcm8tYmFzZWQgbWF0Y2ggZGlzdGFuY2U6DQorICANCisgIHVuc2lnbmVkIERlY29kZURpc3RhbmNlKHVuc2lnbmVkIGxlbikNCisgIHsNCisgICAgdW5zaWduZWQgbGVuU3RhdGUgPSBsZW47DQorICAgIGlmIChsZW5TdGF0ZSA+IGtOdW1MZW5Ub1Bvc1N0YXRlcyAtIDEpDQorICAgICAgbGVuU3RhdGUgPSBrTnVtTGVuVG9Qb3NTdGF0ZXMgLSAxOw0KKyAgICANCisgICAgdW5zaWduZWQgcG9zU2xvdCA9IFBvc1Nsb3REZWNvZGVyW2xlblN0YXRlXS5EZWNvZGUoJlJhbmdlRGVjKTsNCisgICAgaWYgKHBvc1Nsb3QgPCA0KQ0KKyAgICAgIHJldHVybiBwb3NTbG90Ow0KKyAgICANCisgICAgdW5zaWduZWQgbnVtRGlyZWN0Qml0cyA9ICh1bnNpZ25lZCkoKHBvc1Nsb3QgPj4gMSkgLSAxKTsNCisgICAgVUludDMyIGRpc3QgPSAoKDIgfCAocG9zU2xvdCAmIDEpKSA8PCBudW1EaXJlY3RCaXRzKTsNCisgICAgaWYgKHBvc1Nsb3QgPCBrRW5kUG9zTW9kZWxJbmRleCkNCisgICAgICBkaXN0ICs9IEJpdFRyZWVSZXZlcnNlRGVjb2RlKFBvc0RlY29kZXJzICsgZGlzdCAtIHBvc1Nsb3QsIG51bURpcmVjdEJpdHMsICZSYW5nZURlYyk7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgIGRpc3QgKz0gUmFuZ2VEZWMuRGVjb2RlRGlyZWN0Qml0cyhudW1EaXJlY3RCaXRzIC0ga051bUFsaWduQml0cykgPDwga051bUFsaWduQml0czsNCisgICAgICBkaXN0ICs9IEFsaWduRGVjb2Rlci5SZXZlcnNlRGVjb2RlKCZSYW5nZURlYyk7DQorICAgIH0NCisgICAgcmV0dXJuIGRpc3Q7DQorICB9DQorDQorDQorDQorTFpNQSBEZWNvZGluZyBtb2Rlcw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitUaGVyZSBhcmUgMiB0eXBlcyBvZiBMWk1BIHN0cmVhbXM6DQorDQorMSkgVGhlIHN0cmVhbSB3aXRoICJFbmQgb2Ygc3RyZWFtIiBtYXJrZXIuDQorMikgVGhlIHN0cmVhbSB3aXRob3V0ICJFbmQgb2Ygc3RyZWFtIiBtYXJrZXIuDQorDQorQW5kIHRoZSBMWk1BIERlY29kZXIgc3VwcG9ydHMgMyBtb2RlcyBvZiBkZWNvZGluZzoNCisNCisxKSBUaGUgdW5wYWNrIHNpemUgaXMgdW5kZWZpbmVkLiBUaGUgTFpNQSBkZWNvZGVyIHN0b3BzIGRlY29kaW5nIGFmdGVyIA0KKyAgIGdldHRpbmcgIkVuZCBvZiBzdHJlYW0iIG1hcmtlci4gDQorICAgVGhlIGlucHV0IHZhcmlhYmxlcyBmb3IgdGhhdCBjYXNlOg0KKyAgICANCisgICAgICBtYXJrZXJJc01hbmRhdG9yeSA9IHRydWUNCisgICAgICB1bnBhY2tTaXplRGVmaW5lZCA9IGZhbHNlDQorICAgICAgdW5wYWNrU2l6ZSBjb250YWlucyBhbnkgdmFsdWUNCisNCisyKSBUaGUgdW5wYWNrIHNpemUgaXMgZGVmaW5lZCBhbmQgTFpNQSBkZWNvZGVyIHN1cHBvcnRzIGJvdGggdmFyaWFudHMsIA0KKyAgIHdoZXJlIHRoZSBzdHJlYW0gY2FuIGNvbnRhaW4gIkVuZCBvZiBzdHJlYW0iIG1hcmtlciBvciB0aGUgc3RyZWFtIGlzDQorICAgZmluaXNoZWQgd2l0aG91dCAiRW5kIG9mIHN0cmVhbSIgbWFya2VyLiBUaGUgTFpNQSBkZWNvZGVyIG11c3QgZGV0ZWN0IA0KKyAgIGFueSBvZiB0aGVzZSBzaXR1YXRpb25zLg0KKyAgIFRoZSBpbnB1dCB2YXJpYWJsZXMgZm9yIHRoYXQgY2FzZToNCisgICAgDQorICAgICAgbWFya2VySXNNYW5kYXRvcnkgPSBmYWxzZQ0KKyAgICAgIHVucGFja1NpemVEZWZpbmVkID0gdHJ1ZQ0KKyAgICAgIHVucGFja1NpemUgY29udGFpbnMgdW5wYWNrIHNpemUNCisNCiszKSBUaGUgdW5wYWNrIHNpemUgaXMgZGVmaW5lZCBhbmQgdGhlIExaTUEgc3RyZWFtIG11c3QgY29udGFpbiANCisgICAiRW5kIG9mIHN0cmVhbSIgbWFya2VyDQorICAgVGhlIGlucHV0IHZhcmlhYmxlcyBmb3IgdGhhdCBjYXNlOg0KKyAgICANCisgICAgICBtYXJrZXJJc01hbmRhdG9yeSA9IHRydWUNCisgICAgICB1bnBhY2tTaXplRGVmaW5lZCA9IHRydWUNCisgICAgICB1bnBhY2tTaXplIGNvbnRhaW5zIHVucGFjayBzaXplDQorDQorDQorVGhlIG1haW4gbG9vcCBvZiBkZWNvZGVyDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorVGhlIG1haW4gbG9vcCBvZiBMWk1BIGRlY29kZXI6DQorDQorSW5pdGlhbGl6ZSB0aGUgTFpNQSBzdGF0ZS4NCitsb29wDQorew0KKyAgLy8gYmVnaW4gb2YgbG9vcA0KKyAgQ2hlY2sgImVuZCBvZiBzdHJlYW0iIGNvbmRpdGlvbnMuDQorICBEZWNvZGUgVHlwZSBvZiBNQVRDSCAvIExJVEVSQUwuIA0KKyAgICBJZiBpdCdzIExJVEVSQUwsIGRlY29kZSBMSVRFUkFMIHZhbHVlIGFuZCBwdXQgdGhlIExJVEVSQUwgdG8gV2luZG93Lg0KKyAgICBJZiBpdCdzIE1BVENILCBkZWNvZGUgdGhlIGxlbmd0aCBvZiBtYXRjaCBhbmQgdGhlIG1hdGNoIGRpc3RhbmNlLiANCisgICAgICAgIENoZWNrIGVycm9yIGNvbmRpdGlvbnMsIGNoZWNrIGVuZCBvZiBzdHJlYW0gY29uZGl0aW9ucyBhbmQgY29weQ0KKyAgICAgICAgdGhlIHNlcXVlbmNlIG9mIG1hdGNoIGJ5dGVzIGZyb20gc2xpZGluZyB3aW5kb3cgdG8gY3VycmVudCBwb3NpdGlvbg0KKyAgICAgICAgaW4gd2luZG93Lg0KKyAgR28gdG8gYmVnaW4gb2YgbG9vcA0KK30NCisNCitUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIExaTUEgZGVjb2RlciB1c2VzICJ1bnBhY2tTaXplIiB2YXJpYWJsZQ0KK3RvIGtlZXAgdGhlIG51bWJlciBvZiByZW1haW5pbmcgYnl0ZXMgaW4gb3V0cHV0IHN0cmVhbS4gU28gaXQgcmVkdWNlcyANCisidW5wYWNrU2l6ZSIgdmFsdWUgYWZ0ZXIgZWFjaCBkZWNvZGVkIExJVEVSQUwgb3IgTUFUQ0guDQorDQorVGhlIGZvbGxvd2luZyBjb2RlIGNvbnRhaW5zIHRoZSAiZW5kIG9mIHN0cmVhbSIgY29uZGl0aW9uIGNoZWNrIGF0IHRoZSBzdGFydA0KK29mIHRoZSBsb29wOg0KKw0KKyAgICBpZiAodW5wYWNrU2l6ZURlZmluZWQgJiYgdW5wYWNrU2l6ZSA9PSAwICYmICFtYXJrZXJJc01hbmRhdG9yeSkNCisgICAgICBpZiAoUmFuZ2VEZWMuSXNGaW5pc2hlZE9LKCkpDQorICAgICAgICByZXR1cm4gTFpNQV9SRVNfRklOSVNIRURfV0lUSE9VVF9NQVJLRVI7DQorDQorTFpNQSB1c2VzIHRocmVlIHR5cGVzIG9mIG1hdGNoZXM6DQorDQorMSkgIlNpbXBsZSBNYXRjaCIgLSAgICAgdGhlIG1hdGNoIHdpdGggZGlzdGFuY2UgdmFsdWUgZW5jb2RlZCB3aXRoIGJpdCBtb2RlbHMuDQorDQorMikgIlJlcCBNYXRjaCIgLSAgICAgICAgdGhlIG1hdGNoIHRoYXQgdXNlcyB0aGUgZGlzdGFuY2UgZnJvbSBkaXN0YW5jZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnkgdGFibGUuDQorDQorMykgIlNob3J0IFJlcCBNYXRjaCIgLSAgdGhlIG1hdGNoIG9mIHNpbmdsZSBieXRlIGxlbmd0aCwgdGhhdCB1c2VzIHRoZSBsYXRlc3QgDQorICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgZnJvbSBkaXN0YW5jZSBoaXN0b3J5IHRhYmxlLg0KKw0KK1RoZSBMWk1BIGRlY29kZXIga2VlcHMgdGhlIGhpc3Rvcnkgb2YgbGF0ZXN0IDQgbWF0Y2ggZGlzdGFuY2VzIHRoYXQgd2VyZSB1c2VkIA0KK2J5IGRlY29kZXIuIFRoYXQgc2V0IG9mIDQgdmFyaWFibGVzIGNvbnRhaW5zIHplcm8tYmFzZWQgbWF0Y2ggZGlzdGFuY2VzIGFuZCANCit0aGVzZSB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkIHdpdGggemVybyB2YWx1ZXM6DQorDQorICBVSW50MzIgcmVwMCA9IDAsIHJlcDEgPSAwLCByZXAyID0gMCwgcmVwMyA9IDA7DQorDQorVGhlIExaTUEgZGVjb2RlciB1c2VzIGJpbmFyeSBtb2RlbCB2YXJpYWJsZXMgdG8gc2VsZWN0IHR5cGUgb2YgTUFUQ0ggb3IgTElURVJBTDoNCisNCisjZGVmaW5lIGtOdW1TdGF0ZXMgMTINCisjZGVmaW5lIGtOdW1Qb3NCaXRzTWF4IDQNCisNCisgIENQcm9iIElzTWF0Y2hba051bVN0YXRlcyA8PCBrTnVtUG9zQml0c01heF07DQorICBDUHJvYiBJc1JlcFtrTnVtU3RhdGVzXTsNCisgIENQcm9iIElzUmVwRzBba051bVN0YXRlc107DQorICBDUHJvYiBJc1JlcEcxW2tOdW1TdGF0ZXNdOw0KKyAgQ1Byb2IgSXNSZXBHMltrTnVtU3RhdGVzXTsNCisgIENQcm9iIElzUmVwMExvbmdba051bVN0YXRlcyA8PCBrTnVtUG9zQml0c01heF07DQorDQorVGhlIGRlY29kZXIgdXNlcyAic3RhdGUiIHZhcmlhYmxlIHZhbHVlIHRvIHNlbGVjdCBleGFjdCB2YXJpYWJsZSANCitmcm9tICJJc1JlcCIsICJJc1JlcEcwIiwgIklzUmVwRzEiIGFuZCAiSXNSZXBHMiIgYXJyYXlzLg0KK1RoZSAic3RhdGUiIHZhcmlhYmxlIGNhbiBnZXQgdGhlIHZhbHVlIGZyb20gMCB0byAxMS4NCitJbml0aWFsIHZhbHVlIGZvciAic3RhdGUiIHZhcmlhYmxlIGlzIHplcm86DQorDQorICB1bnNpZ25lZCBzdGF0ZSA9IDA7DQorDQorVGhlICJzdGF0ZSIgdmFyaWFibGUgaXMgdXBkYXRlZCBhZnRlciBlYWNoIExJVEVSQUwgb3IgTUFUQ0ggd2l0aCBvbmUgb2YgdGhlDQorZm9sbG93aW5nIGZ1bmN0aW9uczoNCisNCit1bnNpZ25lZCBVcGRhdGVTdGF0ZV9MaXRlcmFsKHVuc2lnbmVkIHN0YXRlKQ0KK3sNCisgIGlmIChzdGF0ZSA8IDQpIHJldHVybiAwOw0KKyAgZWxzZSBpZiAoc3RhdGUgPCAxMCkgcmV0dXJuIHN0YXRlIC0gMzsNCisgIGVsc2UgcmV0dXJuIHN0YXRlIC0gNjsNCit9DQordW5zaWduZWQgVXBkYXRlU3RhdGVfTWF0Y2ggICAodW5zaWduZWQgc3RhdGUpIHsgcmV0dXJuIHN0YXRlIDwgNyA/IDcgOiAxMDsgfQ0KK3Vuc2lnbmVkIFVwZGF0ZVN0YXRlX1JlcCAgICAgKHVuc2lnbmVkIHN0YXRlKSB7IHJldHVybiBzdGF0ZSA8IDcgPyA4IDogMTE7IH0NCit1bnNpZ25lZCBVcGRhdGVTdGF0ZV9TaG9ydFJlcCh1bnNpZ25lZCBzdGF0ZSkgeyByZXR1cm4gc3RhdGUgPCA3ID8gOSA6IDExOyB9DQorDQorVGhlIGRlY29kZXIgY2FsY3VsYXRlcyAic3RhdGUyIiB2YXJpYWJsZSB2YWx1ZSB0byBzZWxlY3QgZXhhY3QgdmFyaWFibGUgZnJvbSANCisiSXNNYXRjaCIgYW5kICJJc1JlcDBMb25nIiBhcnJheXM6DQorDQordW5zaWduZWQgcG9zU3RhdGUgPSBPdXRXaW5kb3cuVG90YWxQb3MgJiAoKDEgPDwgcGIpIC0gMSk7DQordW5zaWduZWQgc3RhdGUyID0gKHN0YXRlIDw8IGtOdW1Qb3NCaXRzTWF4KSArIHBvc1N0YXRlOw0KKw0KK1RoZSBkZWNvZGVyIHVzZXMgdGhlIGZvbGxvd2luZyBjb2RlIGZsb3cgc2NoZW1lIHRvIHNlbGVjdCBleGFjdCANCit0eXBlIG9mIExJVEVSQUwgb3IgTUFUQ0g6DQorDQorSXNNYXRjaFtzdGF0ZTJdIGRlY29kZQ0KKyAgMCAtIHRoZSBMaXRlcmFsDQorICAxIC0gdGhlIE1hdGNoDQorICAgIElzUmVwW3N0YXRlXSBkZWNvZGUNCisgICAgICAwIC0gU2ltcGxlIE1hdGNoDQorICAgICAgMSAtIFJlcCBNYXRjaA0KKyAgICAgICAgSXNSZXBHMFtzdGF0ZV0gZGVjb2RlDQorICAgICAgICAgIDAgLSB0aGUgZGlzdGFuY2UgaXMgcmVwMA0KKyAgICAgICAgICAgIElzUmVwMExvbmdbc3RhdGUyXSBkZWNvZGUNCisgICAgICAgICAgICAgIDAgLSBTaG9ydCBSZXAgTWF0Y2gNCisgICAgICAgICAgICAgIDEgLSBSZXAgTWF0Y2ggMA0KKyAgICAgICAgICAxIC0gDQorICAgICAgICAgICAgSXNSZXBHMVtzdGF0ZV0gZGVjb2RlDQorICAgICAgICAgICAgICAwIC0gUmVwIE1hdGNoIDENCisgICAgICAgICAgICAgIDEgLSANCisgICAgICAgICAgICAgICAgSXNSZXBHMltzdGF0ZV0gZGVjb2RlDQorICAgICAgICAgICAgICAgICAgMCAtIFJlcCBNYXRjaCAyDQorICAgICAgICAgICAgICAgICAgMSAtIFJlcCBNYXRjaCAzDQorDQorDQorTElURVJBTCBzeW1ib2wNCistLS0tLS0tLS0tLS0tLQ0KK0lmIHRoZSB2YWx1ZSAiMCIgd2FzIGRlY29kZWQgd2l0aCBJc01hdGNoW3N0YXRlMl0gZGVjb2RpbmcsIHdlIGhhdmUgIkxJVEVSQUwiIHR5cGUuDQorDQorQXQgZmlyc3QgdGhlIExaTUEgZGVjb2RlciBtdXN0IGNoZWNrIHRoYXQgaXQgZG9lc24ndCBleGNlZWQgDQorc3BlY2lmaWVkIHVuY29tcHJlc3NlZCBzaXplOg0KKw0KKyAgICAgIGlmICh1bnBhY2tTaXplRGVmaW5lZCAmJiB1bnBhY2tTaXplID09IDApDQorICAgICAgICByZXR1cm4gTFpNQV9SRVNfRVJST1I7DQorDQorVGhlbiBpdCBkZWNvZGVzIGxpdGVyYWwgdmFsdWUgYW5kIHB1dHMgaXQgdG8gc2xpZGluZyB3aW5kb3c6DQorDQorICAgICAgRGVjb2RlTGl0ZXJhbChzdGF0ZSwgcmVwMCk7DQorDQorVGhlbiB0aGUgZGVjb2RlciBtdXN0IHVwZGF0ZSB0aGUgInN0YXRlIiB2YWx1ZSBhbmQgInVucGFja1NpemUiIHZhbHVlOw0KKw0KKyAgICAgIHN0YXRlID0gVXBkYXRlU3RhdGVfTGl0ZXJhbChzdGF0ZSk7DQorICAgICAgdW5wYWNrU2l6ZS0tOw0KKw0KK1RoZW4gdGhlIGRlY29kZXIgbXVzdCBnbyB0byB0aGUgYmVnaW4gb2YgbWFpbiBsb29wIHRvIGRlY29kZSBuZXh0IE1hdGNoIG9yIExpdGVyYWwuDQorDQorDQorU2ltcGxlIE1hdGNoDQorLS0tLS0tLS0tLS0tDQorDQorSWYgdGhlIHZhbHVlICIxIiB3YXMgZGVjb2RlZCB3aXRoIElzTWF0Y2hbc3RhdGUyXSBkZWNvZGluZywNCit3ZSBoYXZlIHRoZSAiU2ltcGxlIE1hdGNoIiB0eXBlLg0KKw0KK1RoZSBkaXN0YW5jZSBoaXN0b3J5IHRhYmxlIGlzIHVwZGF0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIHNjaGVtZToNCisgICAgDQorICAgICAgcmVwMyA9IHJlcDI7DQorICAgICAgcmVwMiA9IHJlcDE7DQorICAgICAgcmVwMSA9IHJlcDA7DQorDQorVGhlIHplcm8tYmFzZWQgbGVuZ3RoIGlzIGRlY29kZWQgd2l0aCAiTGVuRGVjb2RlciI6DQorDQorICAgICAgbGVuID0gTGVuRGVjb2Rlci5EZWNvZGUoJlJhbmdlRGVjLCBwb3NTdGF0ZSk7DQorDQorVGhlIHN0YXRlIGlzIHVwZGF0ZSB3aXRoIFVwZGF0ZVN0YXRlX01hdGNoIGZ1bmN0aW9uOg0KKw0KKyAgICAgIHN0YXRlID0gVXBkYXRlU3RhdGVfTWF0Y2goc3RhdGUpOw0KKw0KK2FuZCB0aGUgbmV3ICJyZXAwIiB2YWx1ZSBpcyBkZWNvZGVkIHdpdGggRGVjb2RlRGlzdGFuY2U6DQorDQorICAgICAgcmVwMCA9IERlY29kZURpc3RhbmNlKGxlbik7DQorDQorVGhhdCAicmVwMCIgd2lsbCBiZSB1c2VkIGFzIHplcm8tYmFzZWQgZGlzdGFuY2UgZm9yIGN1cnJlbnQgbWF0Y2guDQorDQorSWYgdGhlIHZhbHVlIG9mICJyZXAwIiBpcyBlcXVhbCB0byAweEZGRkZGRkZGLCBpdCBtZWFucyB0aGF0IHdlIGhhdmUgDQorIkVuZCBvZiBzdHJlYW0iIG1hcmtlciwgc28gd2UgY2FuIHN0b3AgZGVjb2RpbmcgYW5kIGNoZWNrIGZpbmlzaGluZyANCitjb25kaXRpb24gaW4gUmFuZ2UgRGVjb2RlcjoNCisNCisgICAgICBpZiAocmVwMCA9PSAweEZGRkZGRkZGKQ0KKyAgICAgICAgcmV0dXJuIFJhbmdlRGVjLklzRmluaXNoZWRPSygpID8NCisgICAgICAgICAgICBMWk1BX1JFU19GSU5JU0hFRF9XSVRIX01BUktFUiA6DQorICAgICAgICAgICAgTFpNQV9SRVNfRVJST1I7DQorDQorSWYgdW5jb21wcmVzc2VkIHNpemUgaXMgZGVmaW5lZCwgTFpNQSBkZWNvZGVyIG11c3QgY2hlY2sgdGhhdCBpdCBkb2Vzbid0IA0KK2V4Y2VlZCB0aGF0IHNwZWNpZmllZCB1bmNvbXByZXNzZWQgc2l6ZToNCisNCisgICAgICBpZiAodW5wYWNrU2l6ZURlZmluZWQgJiYgdW5wYWNrU2l6ZSA9PSAwKQ0KKyAgICAgICAgcmV0dXJuIExaTUFfUkVTX0VSUk9SOw0KKw0KK0Fsc28gdGhlIGRlY29kZXIgbXVzdCBjaGVjayB0aGF0ICJyZXAwIiB2YWx1ZSBpcyBub3QgbGFyZ2VyIHRoYW4gZGljdGlvbmFyeSBzaXplDQorYW5kIGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGFscmVhZHkgZGVjb2RlZCBieXRlczoNCisNCisgICAgICBpZiAocmVwMCA+PSBkaWN0U2l6ZSB8fCAhT3V0V2luZG93LkNoZWNrRGlzdGFuY2UocmVwMCkpDQorICAgICAgICByZXR1cm4gTFpNQV9SRVNfRVJST1I7DQorDQorVGhlbiB0aGUgZGVjb2RlciBtdXN0IGNvcHkgbWF0Y2ggYnl0ZXMgYXMgZGVzY3JpYmVkIGluIA0KKyJUaGUgbWF0Y2ggc3ltYm9scyBjb3B5aW5nIiBzZWN0aW9uLg0KKw0KKw0KK1JlcCBNYXRjaA0KKy0tLS0tLS0tLQ0KKw0KK0lmIHRoZSBMWk1BIGRlY29kZXIgaGFzIGRlY29kZWQgdGhlIHZhbHVlICIxIiB3aXRoIElzUmVwW3N0YXRlXSB2YXJpYWJsZSwNCit3ZSBoYXZlICJSZXAgTWF0Y2giIHR5cGUuDQorDQorQXQgZmlyc3QgdGhlIExaTUEgZGVjb2RlciBtdXN0IGNoZWNrIHRoYXQgaXQgZG9lc24ndCBleGNlZWQgDQorc3BlY2lmaWVkIHVuY29tcHJlc3NlZCBzaXplOg0KKw0KKyAgICAgIGlmICh1bnBhY2tTaXplRGVmaW5lZCAmJiB1bnBhY2tTaXplID09IDApDQorICAgICAgICByZXR1cm4gTFpNQV9SRVNfRVJST1I7DQorDQorQWxzbyB0aGUgZGVjb2RlciBtdXN0IHJldHVybiBlcnJvciwgaWYgdGhlIExaIHdpbmRvdyBpcyBlbXB0eToNCisNCisgICAgICBpZiAoT3V0V2luZG93LklzRW1wdHkoKSkNCisgICAgICAgIHJldHVybiBMWk1BX1JFU19FUlJPUjsNCisNCitJZiB0aGUgbWF0Y2ggdHlwZSBpcyAiUmVwIE1hdGNoIiwgdGhlIGRlY29kZXIgdXNlcyBvbmUgb2YgdGhlIDQgdmFyaWFibGVzIG9mDQorZGlzdGFuY2UgaGlzdG9yeSB0YWJsZSB0byBnZXQgdGhlIHZhbHVlIG9mIGRpc3RhbmNlIGZvciBjdXJyZW50IG1hdGNoLg0KK0FuZCB0aGVyZSBhcmUgNCBjb3JyZXNwb25kaW5nIHdheXMgb2YgZGVjb2RpbmcgZmxvdy4gDQorDQorVGhlIGRlY29kZXIgdXBkYXRlcyB0aGUgZGlzdGFuY2UgaGlzdG9yeSB3aXRoIHRoZSBmb2xsb3dpbmcgc2NoZW1lIA0KK2RlcGVuZGluZyBmcm9tIHR5cGUgb2YgbWF0Y2g6DQorDQorLSAiUmVwIE1hdGNoIDAiIG9yICJTaG9ydCBSZXAgTWF0Y2giOg0KKyAgICAgIDsgTFpNQSBkb2Vzbid0IHVwZGF0ZSB0aGUgZGlzdGFuY2UgaGlzdG9yeSAgICANCisNCistICJSZXAgTWF0Y2ggMSI6DQorICAgICAgVUludDMyIGRpc3QgPSByZXAxOw0KKyAgICAgIHJlcDEgPSByZXAwOw0KKyAgICAgIHJlcDAgPSBkaXN0Ow0KKw0KKy0gIlJlcCBNYXRjaCAyIjoNCisgICAgICBVSW50MzIgZGlzdCA9IHJlcDI7DQorICAgICAgcmVwMiA9IHJlcDE7DQorICAgICAgcmVwMSA9IHJlcDA7DQorICAgICAgcmVwMCA9IGRpc3Q7DQorDQorLSAiUmVwIE1hdGNoIDMiOg0KKyAgICAgIFVJbnQzMiBkaXN0ID0gcmVwMzsNCisgICAgICByZXAzID0gcmVwMjsNCisgICAgICByZXAyID0gcmVwMTsNCisgICAgICByZXAxID0gcmVwMDsNCisgICAgICByZXAwID0gZGlzdDsNCisNCitUaGVuIHRoZSBkZWNvZGVyIGRlY29kZXMgZXhhY3Qgc3VidHlwZSBvZiAiUmVwIE1hdGNoIiB1c2luZyAiSXNSZXBHMCIsICJJc1JlcDBMb25nIiwNCisiSXNSZXBHMSIsICJJc1JlcEcyIi4NCisNCitJZiB0aGUgc3VidHlwZSBpcyAiU2hvcnQgUmVwIE1hdGNoIiwgdGhlIGRlY29kZXIgdXBkYXRlcyB0aGUgc3RhdGUsIHB1dHMgDQordGhlIG9uZSBieXRlIGZyb20gd2luZG93IHRvIGN1cnJlbnQgcG9zaXRpb24gaW4gd2luZG93IGFuZCBnb2VzIHRvIG5leHQgDQorTUFUQ0gvTElURVJBTCBzeW1ib2wgKHRoZSBiZWdpbiBvZiBtYWluIGxvb3ApOg0KKw0KKyAgICAgICAgICBzdGF0ZSA9IFVwZGF0ZVN0YXRlX1Nob3J0UmVwKHN0YXRlKTsNCisgICAgICAgICAgT3V0V2luZG93LlB1dEJ5dGUoT3V0V2luZG93LkdldEJ5dGUocmVwMCArIDEpKTsNCisgICAgICAgICAgdW5wYWNrU2l6ZS0tOw0KKyAgICAgICAgICBjb250aW51ZTsNCisNCitJbiBvdGhlciBjYXNlcyAoUmVwIE1hdGNoIDAvMS8yLzMpLCBpdCBkZWNvZGVzIHRoZSB6ZXJvLWJhc2VkIA0KK2xlbmd0aCBvZiBtYXRjaCB3aXRoICJSZXBMZW5EZWNvZGVyIiBkZWNvZGVyOg0KKw0KKyAgICAgIGxlbiA9IFJlcExlbkRlY29kZXIuRGVjb2RlKCZSYW5nZURlYywgcG9zU3RhdGUpOw0KKw0KK1RoZW4gaXQgdXBkYXRlcyB0aGUgc3RhdGU6DQorDQorICAgICAgc3RhdGUgPSBVcGRhdGVTdGF0ZV9SZXAoc3RhdGUpOw0KKw0KK1RoZW4gdGhlIGRlY29kZXIgbXVzdCBjb3B5IG1hdGNoIGJ5dGVzIGFzIGRlc2NyaWJlZCBpbiANCisiVGhlIE1hdGNoIHN5bWJvbHMgY29weWluZyIgc2VjdGlvbi4NCisNCisNCitUaGUgbWF0Y2ggc3ltYm9scyBjb3B5aW5nDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK0lmIHdlIGhhdmUgdGhlIG1hdGNoIChTaW1wbGUgTWF0Y2ggb3IgUmVwIE1hdGNoIDAvMS8yLzMpLCB0aGUgZGVjb2RlciBtdXN0DQorY29weSB0aGUgc2VxdWVuY2Ugb2YgYnl0ZXMgd2l0aCBjYWxjdWxhdGVkIG1hdGNoIGRpc3RhbmNlIGFuZCBtYXRjaCBsZW5ndGguDQorSWYgdW5jb21wcmVzc2VkIHNpemUgaXMgZGVmaW5lZCwgTFpNQSBkZWNvZGVyIG11c3QgY2hlY2sgdGhhdCBpdCBkb2Vzbid0IA0KK2V4Y2VlZCB0aGF0IHNwZWNpZmllZCB1bmNvbXByZXNzZWQgc2l6ZToNCisNCisgICAgbGVuICs9IGtNYXRjaE1pbkxlbjsNCisgICAgYm9vbCBpc0Vycm9yID0gZmFsc2U7DQorICAgIGlmICh1bnBhY2tTaXplRGVmaW5lZCAmJiB1bnBhY2tTaXplIDwgbGVuKQ0KKyAgICB7DQorICAgICAgbGVuID0gKHVuc2lnbmVkKXVucGFja1NpemU7DQorICAgICAgaXNFcnJvciA9IHRydWU7DQorICAgIH0NCisgICAgT3V0V2luZG93LkNvcHlNYXRjaChyZXAwICsgMSwgbGVuKTsNCisgICAgdW5wYWNrU2l6ZSAtPSBsZW47DQorICAgIGlmIChpc0Vycm9yKQ0KKyAgICAgIHJldHVybiBMWk1BX1JFU19FUlJPUjsNCisNCitUaGVuIHRoZSBkZWNvZGVyIG11c3QgZ28gdG8gdGhlIGJlZ2luIG9mIG1haW4gbG9vcCB0byBkZWNvZGUgbmV4dCBNQVRDSCBvciBMSVRFUkFMLg0KKw0KKw0KKw0KK05PVEVTDQorLS0tLS0NCisNCitUaGlzIHNwZWNpZmljYXRpb24gZG9lc24ndCBkZXNjcmliZSB0aGUgdmFyaWFudCBvZiBkZWNvZGVyIGltcGxlbWVudGF0aW9uIA0KK3RoYXQgc3VwcG9ydHMgcGFydGlhbCBkZWNvZGluZy4gU3VjaCBwYXJ0aWFsIGRlY29kaW5nIGNhc2UgY2FuIHJlcXVpcmUgc29tZSANCitjaGFuZ2VzIGluICJlbmQgb2Ygc3RyZWFtIiBjb25kaXRpb24gY2hlY2tzIGNvZGUuIEFsc28gc3VjaCBjb2RlIA0KK2NhbiB1c2UgYWRkaXRpb25hbCBzdGF0dXMgY29kZXMsIHJldHVybmVkIGJ5IGRlY29kZXIuDQorDQorVGhpcyBzcGVjaWZpY2F0aW9uIHVzZXMgQysrIGNvZGUgd2l0aCB0ZW1wbGF0ZXMgdG8gc2ltcGxpZnkgZGVzY3JpYmluZy4NCitUaGUgb3B0aW1pemVkIHZlcnNpb24gb2YgTFpNQSBkZWNvZGVyIGRvZXNuJ3QgbmVlZCB0ZW1wbGF0ZXMuDQorU3VjaCBvcHRpbWl6ZWQgdmVyc2lvbiBjYW4gdXNlIGp1c3QgdHdvIGFycmF5cyBvZiBDUHJvYiB2YXJpYWJsZXM6DQorICAxKSBUaGUgZHluYW1pYyBhcnJheSBvZiBDUHJvYiB2YXJpYWJsZXMgYWxsb2NhdGVkIGZvciB0aGUgTGl0ZXJhbCBEZWNvZGVyLg0KKyAgMikgVGhlIG9uZSBjb21tb24gYXJyYXkgdGhhdCBjb250YWlucyBhbGwgb3RoZXIgQ1Byb2IgdmFyaWFibGVzLg0KKw0KKw0KK1JlZmVyZW5jZXM6ICAgICAgDQorDQorMS4gRy4gTi4gTi4gTWFydGluLCBSYW5nZSBlbmNvZGluZzogYW4gYWxnb3JpdGhtIGZvciByZW1vdmluZyByZWR1bmRhbmN5IA0KKyAgIGZyb20gYSBkaWdpdGl6ZWQgbWVzc2FnZSwgVmlkZW8gJiBEYXRhIFJlY29yZGluZyBDb25mZXJlbmNlLCANCisgICBTb3V0aGFtcHRvbiwgVUssIEp1bHkgMjQtMjcsIDE5NzkuDQpkaWZmIC0tZ2l0IGEvbHptYS9ET0MvbHptYS50eHQgYi9sem1hL0RPQy9sem1hLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWE4MGFlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9ET0MvbHptYS50eHQKQEAgLTAsMCArMSwzMjggQEAKK0xaTUEgY29tcHJlc3Npb24NCistLS0tLS0tLS0tLS0tLS0tDQorVmVyc2lvbjogOS4zNQ0KKw0KK1RoaXMgZmlsZSBkZXNjcmliZXMgTFpNQSBlbmNvZGluZyBhbmQgZGVjb2RpbmcgZnVuY3Rpb25zIHdyaXR0ZW4gaW4gQyBsYW5ndWFnZS4NCisNCitMWk1BIGlzIGFuIGltcHJvdmVkIHZlcnNpb24gb2YgZmFtb3VzIExaNzcgY29tcHJlc3Npb24gYWxnb3JpdGhtLiANCitJdCB3YXMgaW1wcm92ZWQgaW4gd2F5IG9mIG1heGltdW0gaW5jcmVhc2luZyBvZiBjb21wcmVzc2lvbiByYXRpbywNCitrZWVwaW5nIGhpZ2ggZGVjb21wcmVzc2lvbiBzcGVlZCBhbmQgbG93IG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIA0KK2RlY29tcHJlc3NpbmcuDQorDQorTm90ZTogeW91IGNhbiByZWFkIGFsc28gTFpNQSBTcGVjaWZpY2F0aW9uIChsem1hLXNwZWNpZmljYXRpb24udHh0IGZyb20gTFpNQSBTREspDQorDQorQWxzbyB5b3UgY2FuIGxvb2sgc291cmNlIGNvZGUgZm9yIExaTUEgZW5jb2RpbmcgYW5kIGRlY29kaW5nOg0KKyAgQy9VdGlsL0x6bWEvTHptYVV0aWwuYw0KKw0KKw0KK0xaTUEgY29tcHJlc3NlZCBmaWxlIGZvcm1hdA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK09mZnNldCBTaXplIERlc2NyaXB0aW9uDQorICAwICAgICAxICAgU3BlY2lhbCBMWk1BIHByb3BlcnRpZXMgKGxjLGxwLCBwYiBpbiBlbmNvZGVkIGZvcm0pDQorICAxICAgICA0ICAgRGljdGlvbmFyeSBzaXplIChsaXR0bGUgZW5kaWFuKQ0KKyAgNSAgICAgOCAgIFVuY29tcHJlc3NlZCBzaXplIChsaXR0bGUgZW5kaWFuKS4gLTEgbWVhbnMgdW5rbm93biBzaXplDQorIDEzICAgICAgICAgQ29tcHJlc3NlZCBkYXRhDQorDQorDQorDQorQU5TSS1DIExaTUEgRGVjb2Rlcg0KK35+fn5+fn5+fn5+fn5+fn5+fn4NCisNCitQbGVhc2Ugbm90ZSB0aGF0IGludGVyZmFjZXMgZm9yIEFOU0ktQyBjb2RlIHdlcmUgY2hhbmdlZCBpbiBMWk1BIFNESyA0LjU4Lg0KK0lmIHlvdSB3YW50IHRvIHVzZSBvbGQgaW50ZXJmYWNlcyB5b3UgY2FuIGRvd25sb2FkIHByZXZpb3VzIHZlcnNpb24gb2YgTFpNQSBTREsNCitmcm9tIHNvdXJjZWZvcmdlLm5ldCBzaXRlLg0KKw0KK1RvIHVzZSBBTlNJLUMgTFpNQSBEZWNvZGVyIHlvdSBuZWVkIHRoZSBmb2xsb3dpbmcgZmlsZXM6DQorMSkgTHptYURlYy5oICsgTHptYURlYy5jICsgVHlwZXMuaA0KKw0KK0xvb2sgZXhhbXBsZSBjb2RlOg0KKyAgQy9VdGlsL0x6bWEvTHptYVV0aWwuYw0KKw0KKw0KK01lbW9yeSByZXF1aXJlbWVudHMgZm9yIExaTUEgZGVjb2RpbmcNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorU3RhY2sgdXNhZ2Ugb2YgTFpNQSBkZWNvZGluZyBmdW5jdGlvbiBmb3IgbG9jYWwgdmFyaWFibGVzIGlzIG5vdCANCitsYXJnZXIgdGhhbiAyMDAtNDAwIGJ5dGVzLg0KKw0KK0xaTUEgRGVjb2RlciB1c2VzIGRpY3Rpb25hcnkgYnVmZmVyIGFuZCBpbnRlcm5hbCBzdGF0ZSBzdHJ1Y3R1cmUuDQorSW50ZXJuYWwgc3RhdGUgc3RydWN0dXJlIGNvbnN1bWVzDQorICBzdGF0ZV9zaXplID0gKDQgKyAoMS41IDw8IChsYyArIGxwKSkpIEtCDQorYnkgZGVmYXVsdCAobGM9MywgbHA9MCksIHN0YXRlX3NpemUgPSAxNiBLQi4NCisNCisNCitIb3cgVG8gZGVjb21wcmVzcyBkYXRhDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK0xaTUEgRGVjb2RlciAoQU5TSS1DIHZlcnNpb24pIG5vdyBzdXBwb3J0cyAyIGludGVyZmFjZXM6DQorMSkgU2luZ2xlLWNhbGwgRGVjb21wcmVzc2luZw0KKzIpIE11bHRpLWNhbGwgU3RhdGUgRGVjb21wcmVzc2luZyAoemxpYi1saWtlIGludGVyZmFjZSkNCisNCitZb3UgbXVzdCB1c2UgZXh0ZXJuYWwgYWxsb2NhdG9yOg0KK0V4YW1wbGU6DQordm9pZCAqU3pBbGxvYyh2b2lkICpwLCBzaXplX3Qgc2l6ZSkgeyBwID0gcDsgcmV0dXJuIG1hbGxvYyhzaXplKTsgfQ0KK3ZvaWQgU3pGcmVlKHZvaWQgKnAsIHZvaWQgKmFkZHJlc3MpIHsgcCA9IHA7IGZyZWUoYWRkcmVzcyk7IH0NCitJU3pBbGxvYyBhbGxvYyA9IHsgU3pBbGxvYywgU3pGcmVlIH07DQorDQorWW91IGNhbiB1c2UgcCA9IHA7IG9wZXJhdG9yIHRvIGRpc2FibGUgY29tcGlsZXIgd2FybmluZ3MuDQorDQorDQorU2luZ2xlLWNhbGwgRGVjb21wcmVzc2luZw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitXaGVuIHRvIHVzZTogUkFNLT5SQU0gZGVjb21wcmVzc2luZw0KK0NvbXBpbGUgZmlsZXM6IEx6bWFEZWMuaCArIEx6bWFEZWMuYyArIFR5cGVzLmgNCitDb21waWxlIGRlZmluZXM6IG5vIGRlZmluZXMNCitNZW1vcnkgUmVxdWlyZW1lbnRzOg0KKyAgLSBJbnB1dCBidWZmZXI6IGNvbXByZXNzZWQgc2l6ZQ0KKyAgLSBPdXRwdXQgYnVmZmVyOiB1bmNvbXByZXNzZWQgc2l6ZQ0KKyAgLSBMWk1BIEludGVybmFsIFN0cnVjdHVyZXM6IHN0YXRlX3NpemUgKDE2IEtCIGZvciBkZWZhdWx0IHNldHRpbmdzKSANCisNCitJbnRlcmZhY2U6DQorICBpbnQgTHptYURlY29kZShCeXRlICpkZXN0LCBTaXplVCAqZGVzdExlbiwgY29uc3QgQnl0ZSAqc3JjLCBTaXplVCAqc3JjTGVuLA0KKyAgICAgIGNvbnN0IEJ5dGUgKnByb3BEYXRhLCB1bnNpZ25lZCBwcm9wU2l6ZSwgRUx6bWFGaW5pc2hNb2RlIGZpbmlzaE1vZGUsIA0KKyAgICAgIEVMem1hU3RhdHVzICpzdGF0dXMsIElTekFsbG9jICphbGxvYyk7DQorICBJbjogDQorICAgIGRlc3QgICAgIC0gb3V0cHV0IGRhdGENCisgICAgZGVzdExlbiAgLSBvdXRwdXQgZGF0YSBzaXplDQorICAgIHNyYyAgICAgIC0gaW5wdXQgZGF0YQ0KKyAgICBzcmNMZW4gICAtIGlucHV0IGRhdGEgc2l6ZQ0KKyAgICBwcm9wRGF0YSAtIExaTUEgcHJvcGVydGllcyAgKDUgYnl0ZXMpDQorICAgIHByb3BTaXplIC0gc2l6ZSBvZiBwcm9wRGF0YSBidWZmZXIgKDUgYnl0ZXMpDQorICAgIGZpbmlzaE1vZGUgLSBJdCBoYXMgbWVhbmluZyBvbmx5IGlmIHRoZSBkZWNvZGluZyByZWFjaGVzIG91dHB1dCBsaW1pdCAoKmRlc3RMZW4pLg0KKyAgICAgICAgIExaTUFfRklOSVNIX0FOWSAtIERlY29kZSBqdXN0IGRlc3RMZW4gYnl0ZXMuDQorICAgICAgICAgTFpNQV9GSU5JU0hfRU5EIC0gU3RyZWFtIG11c3QgYmUgZmluaXNoZWQgYWZ0ZXIgKCpkZXN0TGVuKS4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSBMWk1BX0ZJTklTSF9FTkQsIHdoZW4geW91IGtub3cgdGhhdCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IG91dHB1dCBidWZmZXIgY292ZXJzIGxhc3QgYnl0ZXMgb2Ygc3RyZWFtLiANCisgICAgYWxsb2MgICAgLSBNZW1vcnkgYWxsb2NhdG9yLg0KKw0KKyAgT3V0OiANCisgICAgZGVzdExlbiAgLSBwcm9jZXNzZWQgb3V0cHV0IHNpemUgDQorICAgIHNyY0xlbiAgIC0gcHJvY2Vzc2VkIGlucHV0IHNpemUgDQorDQorICBPdXRwdXQ6DQorICAgIFNaX09LDQorICAgICAgc3RhdHVzOg0KKyAgICAgICAgTFpNQV9TVEFUVVNfRklOSVNIRURfV0lUSF9NQVJLDQorICAgICAgICBMWk1BX1NUQVRVU19OT1RfRklOSVNIRUQgDQorICAgICAgICBMWk1BX1NUQVRVU19NQVlCRV9GSU5JU0hFRF9XSVRIT1VUX01BUksNCisgICAgU1pfRVJST1JfREFUQSAtIERhdGEgZXJyb3INCisgICAgU1pfRVJST1JfTUVNICAtIE1lbW9yeSBhbGxvY2F0aW9uIGVycm9yDQorICAgIFNaX0VSUk9SX1VOU1VQUE9SVEVEIC0gVW5zdXBwb3J0ZWQgcHJvcGVydGllcw0KKyAgICBTWl9FUlJPUl9JTlBVVF9FT0YgLSBJdCBuZWVkcyBtb3JlIGJ5dGVzIGluIGlucHV0IGJ1ZmZlciAoc3JjKS4NCisNCisgIElmIExaTUEgZGVjb2RlciBzZWVzIGVuZF9tYXJrZXIgYmVmb3JlIHJlYWNoaW5nIG91dHB1dCBsaW1pdCwgaXQgcmV0dXJucyBPSyByZXN1bHQsDQorICBhbmQgb3V0cHV0IHZhbHVlIG9mIGRlc3RMZW4gd2lsbCBiZSBsZXNzIHRoYW4gb3V0cHV0IGJ1ZmZlciBzaXplIGxpbWl0Lg0KKw0KKyAgWW91IGNhbiB1c2UgbXVsdGlwbGUgY2hlY2tzIHRvIHRlc3QgZGF0YSBpbnRlZ3JpdHkgYWZ0ZXIgZnVsbCBkZWNvbXByZXNzaW9uOg0KKyAgICAxKSBDaGVjayBSZXN1bHQgYW5kICJzdGF0dXMiIHZhcmlhYmxlLg0KKyAgICAyKSBDaGVjayB0aGF0IG91dHB1dChkZXN0TGVuKSA9IHVuY29tcHJlc3NlZFNpemUsIGlmIHlvdSBrbm93IHJlYWwgdW5jb21wcmVzc2VkU2l6ZS4NCisgICAgMykgQ2hlY2sgdGhhdCBvdXRwdXQoc3JjTGVuKSA9IGNvbXByZXNzZWRTaXplLCBpZiB5b3Uga25vdyByZWFsIGNvbXByZXNzZWRTaXplLiANCisgICAgICAgWW91IG11c3QgdXNlIGNvcnJlY3QgZmluaXNoIG1vZGUgaW4gdGhhdCBjYXNlLiAqLyANCisNCisNCitNdWx0aS1jYWxsIFN0YXRlIERlY29tcHJlc3NpbmcgKHpsaWItbGlrZSBpbnRlcmZhY2UpDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1doZW4gdG8gdXNlOiBmaWxlLT5maWxlIGRlY29tcHJlc3NpbmcgDQorQ29tcGlsZSBmaWxlczogTHptYURlYy5oICsgTHptYURlYy5jICsgVHlwZXMuaA0KKw0KK01lbW9yeSBSZXF1aXJlbWVudHM6DQorIC0gQnVmZmVyIGZvciBpbnB1dCBzdHJlYW06IGFueSBzaXplIChmb3IgZXhhbXBsZSwgMTYgS0IpDQorIC0gQnVmZmVyIGZvciBvdXRwdXQgc3RyZWFtOiBhbnkgc2l6ZSAoZm9yIGV4YW1wbGUsIDE2IEtCKQ0KKyAtIExaTUEgSW50ZXJuYWwgU3RydWN0dXJlczogc3RhdGVfc2l6ZSAoMTYgS0IgZm9yIGRlZmF1bHQgc2V0dGluZ3MpIA0KKyAtIExaTUEgZGljdGlvbmFyeSAoZGljdGlvbmFyeSBzaXplIGlzIGVuY29kZWQgaW4gTFpNQSBwcm9wZXJ0aWVzIGhlYWRlcikNCisNCisxKSByZWFkIExaTUEgcHJvcGVydGllcyAoNSBieXRlcykgYW5kIHVuY29tcHJlc3NlZCBzaXplICg4IGJ5dGVzLCBsaXR0bGUtZW5kaWFuKSB0byBoZWFkZXI6DQorICAgdW5zaWduZWQgY2hhciBoZWFkZXJbTFpNQV9QUk9QU19TSVpFICsgOF07DQorICAgUmVhZEZpbGUoaW5GaWxlLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpDQorDQorMikgQWxsb2NhdGUgQ0x6bWFEZWMgc3RydWN0dXJlcyAoc3RhdGUgKyBkaWN0aW9uYXJ5KSB1c2luZyBMWk1BIHByb3BlcnRpZXMNCisNCisgIENMem1hRGVjIHN0YXRlOw0KKyAgTHptYURlY19Db25zdHIoJnN0YXRlKTsNCisgIHJlcyA9IEx6bWFEZWNfQWxsb2NhdGUoJnN0YXRlLCBoZWFkZXIsIExaTUFfUFJPUFNfU0laRSwgJmdfQWxsb2MpOw0KKyAgaWYgKHJlcyAhPSBTWl9PSykNCisgICAgcmV0dXJuIHJlczsNCisNCiszKSBJbml0IEx6bWFEZWMgc3RydWN0dXJlIGJlZm9yZSBhbnkgbmV3IExaTUEgc3RyZWFtLiBBbmQgY2FsbCBMem1hRGVjX0RlY29kZVRvQnVmIGluIGxvb3ANCisNCisgIEx6bWFEZWNfSW5pdCgmc3RhdGUpOw0KKyAgZm9yICg7OykNCisgIHsNCisgICAgLi4uIA0KKyAgICBpbnQgcmVzID0gTHptYURlY19EZWNvZGVUb0J1ZihDTHptYURlYyAqcCwgQnl0ZSAqZGVzdCwgU2l6ZVQgKmRlc3RMZW4sIA0KKyAgICAgICAgY29uc3QgQnl0ZSAqc3JjLCBTaXplVCAqc3JjTGVuLCBFTHptYUZpbmlzaE1vZGUgZmluaXNoTW9kZSk7DQorICAgIC4uLg0KKyAgfQ0KKw0KKw0KKzQpIEZyZWUgYWxsIGFsbG9jYXRlZCBzdHJ1Y3R1cmVzDQorICBMem1hRGVjX0ZyZWUoJnN0YXRlLCAmZ19BbGxvYyk7DQorDQorTG9vayBleGFtcGxlIGNvZGU6DQorICBDL1V0aWwvTHptYS9Mem1hVXRpbC5jDQorDQorDQorSG93IFRvIGNvbXByZXNzIGRhdGENCistLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK0NvbXBpbGUgZmlsZXM6IA0KKyAgVHlwZXMuaA0KKyAgVGhyZWFkcy5oCQ0KKyAgTHptYUVuYy5oDQorICBMem1hRW5jLmMNCisgIEx6RmluZC5oDQorICBMekZpbmQuYw0KKyAgTHpGaW5kTXQuaA0KKyAgTHpGaW5kTXQuYw0KKyAgTHpIYXNoLmgNCisNCitNZW1vcnkgUmVxdWlyZW1lbnRzOg0KKyAgLSAoZGljdFNpemUgKiAxMS41ICsgNiBNQikgKyBzdGF0ZV9zaXplDQorDQorTHptYSBFbmNvZGVyIGNhbiB1c2UgdHdvIG1lbW9yeSBhbGxvY2F0b3JzOg0KKzEpIGFsbG9jIC0gZm9yIHNtYWxsIGFycmF5cy4NCisyKSBhbGxvY0JpZyAtIGZvciBiaWcgYXJyYXlzLg0KKw0KK0ZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSBMYXJnZSBSQU0gUGFnZXMgKDIgTUIpIGluIGFsbG9jQmlnIGFsbG9jYXRvciBmb3IgDQorYmV0dGVyIGNvbXByZXNzaW9uIHNwZWVkLiBOb3RlIHRoYXQgV2luZG93cyBoYXMgYmFkIGltcGxlbWVudGF0aW9uIGZvciANCitMYXJnZSBSQU0gUGFnZXMuIA0KK0l0J3MgT0sgdG8gdXNlIHNhbWUgYWxsb2NhdG9yIGZvciBhbGxvYyBhbmQgYWxsb2NCaWcuDQorDQorDQorU2luZ2xlLWNhbGwgQ29tcHJlc3Npb24gd2l0aCBjYWxsYmFja3MNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK0xvb2sgZXhhbXBsZSBjb2RlOg0KKyAgQy9VdGlsL0x6bWEvTHptYVV0aWwuYw0KKw0KK1doZW4gdG8gdXNlOiBmaWxlLT5maWxlIGNvbXByZXNzaW5nIA0KKw0KKzEpIHlvdSBtdXN0IGltcGxlbWVudCBjYWxsYmFjayBzdHJ1Y3R1cmVzIGZvciBpbnRlcmZhY2VzOg0KK0lTZXFJblN0cmVhbQ0KK0lTZXFPdXRTdHJlYW0NCitJQ29tcHJlc3NQcm9ncmVzcw0KK0lTekFsbG9jDQorDQorc3RhdGljIHZvaWQgKlN6QWxsb2Modm9pZCAqcCwgc2l6ZV90IHNpemUpIHsgcCA9IHA7IHJldHVybiBNeUFsbG9jKHNpemUpOyB9DQorc3RhdGljIHZvaWQgU3pGcmVlKHZvaWQgKnAsIHZvaWQgKmFkZHJlc3MpIHsgIHAgPSBwOyBNeUZyZWUoYWRkcmVzcyk7IH0NCitzdGF0aWMgSVN6QWxsb2MgZ19BbGxvYyA9IHsgU3pBbGxvYywgU3pGcmVlIH07DQorDQorICBDRmlsZVNlcUluU3RyZWFtIGluU3RyZWFtOw0KKyAgQ0ZpbGVTZXFPdXRTdHJlYW0gb3V0U3RyZWFtOw0KKw0KKyAgaW5TdHJlYW0uZnVuY1RhYmxlLlJlYWQgPSBNeVJlYWQ7DQorICBpblN0cmVhbS5maWxlID0gaW5GaWxlOw0KKyAgb3V0U3RyZWFtLmZ1bmNUYWJsZS5Xcml0ZSA9IE15V3JpdGU7DQorICBvdXRTdHJlYW0uZmlsZSA9IG91dEZpbGU7DQorDQorDQorMikgQ3JlYXRlIENMem1hRW5jSGFuZGxlIG9iamVjdDsNCisNCisgIENMem1hRW5jSGFuZGxlIGVuYzsNCisNCisgIGVuYyA9IEx6bWFFbmNfQ3JlYXRlKCZnX0FsbG9jKTsNCisgIGlmIChlbmMgPT0gMCkNCisgICAgcmV0dXJuIFNaX0VSUk9SX01FTTsNCisNCisNCiszKSBpbml0aWFsaXplIENMem1hRW5jUHJvcHMgcHJvcGVydGllczsNCisNCisgIEx6bWFFbmNQcm9wc19Jbml0KCZwcm9wcyk7DQorDQorICBUaGVuIHlvdSBjYW4gY2hhbmdlIHNvbWUgcHJvcGVydGllcyBpbiB0aGF0IHN0cnVjdHVyZS4NCisNCis0KSBTZW5kIExaTUEgcHJvcGVydGllcyB0byBMWk1BIEVuY29kZXINCisNCisgIHJlcyA9IEx6bWFFbmNfU2V0UHJvcHMoZW5jLCAmcHJvcHMpOw0KKw0KKzUpIFdyaXRlIGVuY29kZWQgcHJvcGVydGllcyB0byBoZWFkZXINCisNCisgICAgQnl0ZSBoZWFkZXJbTFpNQV9QUk9QU19TSVpFICsgOF07DQorICAgIHNpemVfdCBoZWFkZXJTaXplID0gTFpNQV9QUk9QU19TSVpFOw0KKyAgICBVSW50NjQgZmlsZVNpemU7DQorICAgIGludCBpOw0KKw0KKyAgICByZXMgPSBMem1hRW5jX1dyaXRlUHJvcGVydGllcyhlbmMsIGhlYWRlciwgJmhlYWRlclNpemUpOw0KKyAgICBmaWxlU2l6ZSA9IE15R2V0RmlsZUxlbmd0aChpbkZpbGUpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQ0KKyAgICAgIGhlYWRlcltoZWFkZXJTaXplKytdID0gKEJ5dGUpKGZpbGVTaXplID4+ICg4ICogaSkpOw0KKyAgICBNeVdyaXRlRmlsZUFuZENoZWNrKG91dEZpbGUsIGhlYWRlciwgaGVhZGVyU2l6ZSkNCisNCis2KSBDYWxsIGVuY29kaW5nIGZ1bmN0aW9uOg0KKyAgICAgIHJlcyA9IEx6bWFFbmNfRW5jb2RlKGVuYywgJm91dFN0cmVhbS5mdW5jVGFibGUsICZpblN0cmVhbS5mdW5jVGFibGUsIA0KKyAgICAgICAgTlVMTCwgJmdfQWxsb2MsICZnX0FsbG9jKTsNCisNCis3KSBEZXN0cm95IExaTUEgRW5jb2RlciBPYmplY3QNCisgIEx6bWFFbmNfRGVzdHJveShlbmMsICZnX0FsbG9jLCAmZ19BbGxvYyk7DQorDQorDQorSWYgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJuIHNvbWUgZXJyb3IgY29kZSwgTHptYUVuY19FbmNvZGUgYWxzbyByZXR1cm5zIHRoYXQgY29kZQ0KK29yIGl0IGNhbiByZXR1cm4gdGhlIGNvZGUgbGlrZSBTWl9FUlJPUl9SRUFELCBTWl9FUlJPUl9XUklURSBvciBTWl9FUlJPUl9QUk9HUkVTUy4NCisNCisNCitTaW5nbGUtY2FsbCBSQU0tPlJBTSBDb21wcmVzc2lvbg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorU2luZ2xlLWNhbGwgUkFNLT5SQU0gQ29tcHJlc3Npb24gaXMgc2ltaWxhciB0byBDb21wcmVzc2lvbiB3aXRoIGNhbGxiYWNrcywNCitidXQgeW91IHByb3ZpZGUgcG9pbnRlcnMgdG8gYnVmZmVycyBpbnN0ZWFkIG9mIHBvaW50ZXJzIHRvIHN0cmVhbSBjYWxsYmFja3M6DQorDQorU1JlcyBMem1hRW5jb2RlKEJ5dGUgKmRlc3QsIFNpemVUICpkZXN0TGVuLCBjb25zdCBCeXRlICpzcmMsIFNpemVUIHNyY0xlbiwNCisgICAgY29uc3QgQ0x6bWFFbmNQcm9wcyAqcHJvcHMsIEJ5dGUgKnByb3BzRW5jb2RlZCwgU2l6ZVQgKnByb3BzU2l6ZSwgaW50IHdyaXRlRW5kTWFyaywgDQorICAgIElDb21wcmVzc1Byb2dyZXNzICpwcm9ncmVzcywgSVN6QWxsb2MgKmFsbG9jLCBJU3pBbGxvYyAqYWxsb2NCaWcpOw0KKw0KK1JldHVybiBjb2RlOg0KKyAgU1pfT0sgICAgICAgICAgICAgICAtIE9LDQorICBTWl9FUlJPUl9NRU0gICAgICAgIC0gTWVtb3J5IGFsbG9jYXRpb24gZXJyb3IgDQorICBTWl9FUlJPUl9QQVJBTSAgICAgIC0gSW5jb3JyZWN0IHBhcmFtYXRlcg0KKyAgU1pfRVJST1JfT1VUUFVUX0VPRiAtIG91dHB1dCBidWZmZXIgb3ZlcmZsb3cNCisgIFNaX0VSUk9SX1RIUkVBRCAgICAgLSBlcnJvcnMgaW4gbXVsdGl0aHJlYWRpbmcgZnVuY3Rpb25zIChvbmx5IGZvciBNdCB2ZXJzaW9uKQ0KKw0KKw0KKw0KK0RlZmluZXMNCistLS0tLS0tDQorDQorX0xaTUFfU0laRV9PUFQgLSBFbmFibGUgc29tZSBvcHRpbWl6YXRpb25zIGluIExaTUEgRGVjb2RlciB0byBnZXQgc21hbGxlciBleGVjdXRhYmxlIGNvZGUuDQorDQorX0xaTUFfUFJPQjMyICAgLSBJdCBjYW4gaW5jcmVhc2UgdGhlIHNwZWVkIG9uIHNvbWUgMzItYml0IENQVXMsIGJ1dCBtZW1vcnkgdXNhZ2UgZm9yIA0KKyAgICAgICAgICAgICAgICAgc29tZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZG91YmxlZCBpbiB0aGF0IGNhc2UuDQorDQorX0xaTUFfVUlOVDMyX0lTX1VMT05HICAtIERlZmluZSBpdCBpZiBpbnQgaXMgMTYtYml0IG9uIHlvdXIgY29tcGlsZXIgYW5kIGxvbmcgaXMgMzItYml0Lg0KKw0KK19MWk1BX05PX1NZU1RFTV9TSVpFX1QgIC0gRGVmaW5lIGl0IGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBzaXplX3QgdHlwZS4NCisNCisNCitfN1pJUF9QUE1EX1NVUFBQT1JUIC0gRGVmaW5lIGl0IGlmIHlvdSBkb24ndCB3YW50IHRvIHN1cHBvcnQgUFBNRCBtZXRob2QgaW4gQU1TSS1DIC43eiBkZWNvZGVyLg0KKw0KKw0KK0MrKyBMWk1BIEVuY29kZXIvRGVjb2RlciANCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCitDKysgTFpNQSBjb2RlIHVzZSBDT00tbGlrZSBpbnRlcmZhY2VzLiBTbyBpZiB5b3Ugd2FudCB0byB1c2UgaXQsIA0KK3lvdSBjYW4gc3R1ZHkgYmFzaWNzIG9mIENPTS9PTEUuDQorQysrIExaTUEgY29kZSBpcyBqdXN0IHdyYXBwZXIgb3ZlciBBTlNJLUMgY29kZS4NCisNCisNCitDKysgTm90ZXMNCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCitJZiB5b3UgdXNlIHNvbWUgQysrIGNvZGUgZm9sZGVycyBpbiA3LVppcCAoZm9yIGV4YW1wbGUsIEMrKyBjb2RlIGZvciAuN3ogaGFuZGxpbmcpLA0KK3lvdSBtdXN0IGNoZWNrIHRoYXQgeW91IGNvcnJlY3RseSB3b3JrIHdpdGggIm5ldyIgb3BlcmF0b3IuDQorNy1aaXAgY2FuIGJlIGNvbXBpbGVkIHdpdGggTVNWQyA2LjAgdGhhdCBkb2Vzbid0IHRocm93ICJleGNlcHRpb24iIGZyb20gIm5ldyIgb3BlcmF0b3IuDQorU28gNy1aaXAgdXNlcyAiQ1BQXENvbW1vblxOZXdIYW5kbGVyLmNwcCIgdGhhdCByZWRlZmluZXMgIm5ldyIgb3BlcmF0b3I6DQorb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplKQ0KK3sNCisgIHZvaWQgKnAgPSA6Om1hbGxvYyhzaXplKTsNCisgIGlmIChwID09IDApDQorICAgIHRocm93IENOZXdFeGNlcHRpb24oKTsNCisgIHJldHVybiBwOw0KK30NCitJZiB5b3UgdXNlIE1TQ1YgdGhhdCB0aHJvd3MgZXhjZXB0aW9uIGZvciAibmV3IiBvcGVyYXRvciwgeW91IGNhbiBjb21waWxlIHdpdGhvdXQgDQorIk5ld0hhbmRsZXIuY3BwIi4gU28gc3RhbmRhcmQgZXhjZXB0aW9uIHdpbGwgYmUgdXNlZC4gQWN0dWFsbHkgc29tZSBjb2RlIG9mIA0KKzctWmlwIGNhdGNoZXMgYW55IGV4Y2VwdGlvbiBpbiBpbnRlcm5hbCBjb2RlIGFuZCBjb252ZXJ0cyBpdCB0byBIUkVTVUxUIGNvZGUuDQorU28geW91IGRvbid0IG5lZWQgdG8gY2F0Y2ggQ05ld0V4Y2VwdGlvbiwgaWYgeW91IGNhbGwgQ09NIGludGVyZmFjZXMgb2YgNy1aaXAuDQorDQorLS0tDQorDQoraHR0cDovL3d3dy43LXppcC5vcmcNCitodHRwOi8vd3d3LjctemlwLm9yZy9zZGsuaHRtbA0KK2h0dHA6Ly93d3cuNy16aXAub3JnL3N1cHBvcnQuaHRtbA0KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9TZXZlblppcC9DUkMuamF2YSBiL2x6bWEvSmF2YS9TZXZlblppcC9DUkMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmY3OTFmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1NldmVuWmlwL0NSQy5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8vIFNldmVuWmlwL0NSQy5qYXZhDQorDQorcGFja2FnZSBTZXZlblppcDsNCisNCitwdWJsaWMgY2xhc3MgQ1JDDQorew0KKwlzdGF0aWMgcHVibGljIGludFtdIFRhYmxlID0gbmV3IGludFsyNTZdOw0KKwkNCisJc3RhdGljDQorCXsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspDQorCQl7DQorCQkJaW50IHIgPSBpOw0KKwkJCWZvciAoaW50IGogPSAwOyBqIDwgODsgaisrKQ0KKwkJCQlpZiAoKHIgJiAxKSAhPSAwKQ0KKwkJCQkJciA9IChyID4+PiAxKSBeIDB4RURCODgzMjA7DQorCQkJCWVsc2UNCisJCQkJCXIgPj4+PSAxOw0KKwkJCVRhYmxlW2ldID0gcjsNCisJCX0NCisJfQ0KKwkNCisJaW50IF92YWx1ZSA9IC0xOw0KKwkNCisJcHVibGljIHZvaWQgSW5pdCgpDQorCXsNCisJCV92YWx1ZSA9IC0xOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBzaXplKQ0KKwl7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykNCisJCQlfdmFsdWUgPSBUYWJsZVsoX3ZhbHVlIF4gZGF0YVtvZmZzZXQgKyBpXSkgJiAweEZGXSBeIChfdmFsdWUgPj4+IDgpOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEpDQorCXsNCisJCWludCBzaXplID0gZGF0YS5sZW5ndGg7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykNCisJCQlfdmFsdWUgPSBUYWJsZVsoX3ZhbHVlIF4gZGF0YVtpXSkgJiAweEZGXSBeIChfdmFsdWUgPj4+IDgpOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBVcGRhdGVCeXRlKGludCBiKQ0KKwl7DQorCQlfdmFsdWUgPSBUYWJsZVsoX3ZhbHVlIF4gYikgJiAweEZGXSBeIChfdmFsdWUgPj4+IDgpOw0KKwl9DQorCQ0KKwlwdWJsaWMgaW50IEdldERpZ2VzdCgpDQorCXsNCisJCXJldHVybiBfdmFsdWUgXiAoLTEpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9TZXZlblppcC9Db21wcmVzc2lvbi9MWi9CaW5UcmVlLmphdmEgYi9sem1hL0phdmEvU2V2ZW5aaXAvQ29tcHJlc3Npb24vTFovQmluVHJlZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZDU4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvU2V2ZW5aaXAvQ29tcHJlc3Npb24vTFovQmluVHJlZS5qYXZhCkBAIC0wLDAgKzEsMzgyIEBACisvLyBMWi5CaW5UcmVlDQorDQorcGFja2FnZSBTZXZlblppcC5Db21wcmVzc2lvbi5MWjsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCisNCisNCitwdWJsaWMgY2xhc3MgQmluVHJlZSBleHRlbmRzIEluV2luZG93DQorew0KKwlpbnQgX2N5Y2xpY0J1ZmZlclBvczsNCisJaW50IF9jeWNsaWNCdWZmZXJTaXplID0gMDsNCisJaW50IF9tYXRjaE1heExlbjsNCisJDQorCWludFtdIF9zb247DQorCWludFtdIF9oYXNoOw0KKwkNCisJaW50IF9jdXRWYWx1ZSA9IDB4RkY7DQorCWludCBfaGFzaE1hc2s7DQorCWludCBfaGFzaFNpemVTdW0gPSAwOw0KKwkNCisJYm9vbGVhbiBIQVNIX0FSUkFZID0gdHJ1ZTsNCisNCisJc3RhdGljIGZpbmFsIGludCBrSGFzaDJTaXplID0gMSA8PCAxMDsNCisJc3RhdGljIGZpbmFsIGludCBrSGFzaDNTaXplID0gMSA8PCAxNjsNCisJc3RhdGljIGZpbmFsIGludCBrQlQySGFzaFNpemUgPSAxIDw8IDE2Ow0KKwlzdGF0aWMgZmluYWwgaW50IGtTdGFydE1heExlbiA9IDE7DQorCXN0YXRpYyBmaW5hbCBpbnQga0hhc2gzT2Zmc2V0ID0ga0hhc2gyU2l6ZTsNCisJc3RhdGljIGZpbmFsIGludCBrRW1wdHlIYXNoVmFsdWUgPSAwOw0KKwlzdGF0aWMgZmluYWwgaW50IGtNYXhWYWxGb3JOb3JtYWxpemUgPSAoMSA8PCAzMCkgLSAxOw0KKwkNCisJaW50IGtOdW1IYXNoRGlyZWN0Qnl0ZXMgPSAwOw0KKwlpbnQga01pbk1hdGNoQ2hlY2sgPSA0Ow0KKwlpbnQga0ZpeEhhc2hTaXplID0ga0hhc2gyU2l6ZSArIGtIYXNoM1NpemU7DQorDQorCXB1YmxpYyB2b2lkIFNldFR5cGUoaW50IG51bUhhc2hCeXRlcykNCisJew0KKwkJSEFTSF9BUlJBWSA9IChudW1IYXNoQnl0ZXMgPiAyKTsNCisJCWlmIChIQVNIX0FSUkFZKQ0KKwkJew0KKwkJCWtOdW1IYXNoRGlyZWN0Qnl0ZXMgPSAwOw0KKwkJCWtNaW5NYXRjaENoZWNrID0gNDsNCisJCQlrRml4SGFzaFNpemUgPSBrSGFzaDJTaXplICsga0hhc2gzU2l6ZTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlrTnVtSGFzaERpcmVjdEJ5dGVzID0gMjsNCisJCQlrTWluTWF0Y2hDaGVjayA9IDIgKyAxOw0KKwkJCWtGaXhIYXNoU2l6ZSA9IDA7DQorCQl9DQorCX0NCisJDQorDQorCQ0KKw0KKwlwdWJsaWMgdm9pZCBJbml0KCkgdGhyb3dzIElPRXhjZXB0aW9uDQorCXsNCisJCXN1cGVyLkluaXQoKTsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgX2hhc2hTaXplU3VtOyBpKyspDQorCQkJX2hhc2hbaV0gPSBrRW1wdHlIYXNoVmFsdWU7DQorCQlfY3ljbGljQnVmZmVyUG9zID0gMDsNCisJCVJlZHVjZU9mZnNldHMoLTEpOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBNb3ZlUG9zKCkgdGhyb3dzIElPRXhjZXB0aW9uDQorCXsNCisJCWlmICgrK19jeWNsaWNCdWZmZXJQb3MgPj0gX2N5Y2xpY0J1ZmZlclNpemUpDQorCQkJX2N5Y2xpY0J1ZmZlclBvcyA9IDA7DQorCQlzdXBlci5Nb3ZlUG9zKCk7DQorCQlpZiAoX3BvcyA9PSBrTWF4VmFsRm9yTm9ybWFsaXplKQ0KKwkJCU5vcm1hbGl6ZSgpOw0KKwl9DQorCQ0KKw0KKwkNCisJDQorCQ0KKwkNCisJDQorCQ0KKwlwdWJsaWMgYm9vbGVhbiBDcmVhdGUoaW50IGhpc3RvcnlTaXplLCBpbnQga2VlcEFkZEJ1ZmZlckJlZm9yZSwNCisJCQlpbnQgbWF0Y2hNYXhMZW4sIGludCBrZWVwQWRkQnVmZmVyQWZ0ZXIpDQorCXsNCisJCWlmIChoaXN0b3J5U2l6ZSA+IGtNYXhWYWxGb3JOb3JtYWxpemUgLSAyNTYpDQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJX2N1dFZhbHVlID0gMTYgKyAobWF0Y2hNYXhMZW4gPj4gMSk7DQorDQorCQlpbnQgd2luZG93UmVzZXJ2U2l6ZSA9IChoaXN0b3J5U2l6ZSArIGtlZXBBZGRCdWZmZXJCZWZvcmUgKw0KKwkJCQltYXRjaE1heExlbiArIGtlZXBBZGRCdWZmZXJBZnRlcikgLyAyICsgMjU2Ow0KKwkJDQorCQlzdXBlci5DcmVhdGUoaGlzdG9yeVNpemUgKyBrZWVwQWRkQnVmZmVyQmVmb3JlLCBtYXRjaE1heExlbiArIGtlZXBBZGRCdWZmZXJBZnRlciwgd2luZG93UmVzZXJ2U2l6ZSk7DQorCQkNCisJCV9tYXRjaE1heExlbiA9IG1hdGNoTWF4TGVuOw0KKw0KKwkJaW50IGN5Y2xpY0J1ZmZlclNpemUgPSBoaXN0b3J5U2l6ZSArIDE7DQorCQlpZiAoX2N5Y2xpY0J1ZmZlclNpemUgIT0gY3ljbGljQnVmZmVyU2l6ZSkNCisJCQlfc29uID0gbmV3IGludFsoX2N5Y2xpY0J1ZmZlclNpemUgPSBjeWNsaWNCdWZmZXJTaXplKSAqIDJdOw0KKw0KKwkJaW50IGhzID0ga0JUMkhhc2hTaXplOw0KKw0KKwkJaWYgKEhBU0hfQVJSQVkpDQorCQl7DQorCQkJaHMgPSBoaXN0b3J5U2l6ZSAtIDE7DQorCQkJaHMgfD0gKGhzID4+IDEpOw0KKwkJCWhzIHw9IChocyA+PiAyKTsNCisJCQlocyB8PSAoaHMgPj4gNCk7DQorCQkJaHMgfD0gKGhzID4+IDgpOw0KKwkJCWhzID4+PSAxOw0KKwkJCWhzIHw9IDB4RkZGRjsNCisJCQlpZiAoaHMgPiAoMSA8PCAyNCkpDQorCQkJCWhzID4+PSAxOw0KKwkJCV9oYXNoTWFzayA9IGhzOw0KKwkJCWhzKys7DQorCQkJaHMgKz0ga0ZpeEhhc2hTaXplOw0KKwkJfQ0KKwkJaWYgKGhzICE9IF9oYXNoU2l6ZVN1bSkNCisJCQlfaGFzaCA9IG5ldyBpbnQgW19oYXNoU2l6ZVN1bSA9IGhzXTsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorCXB1YmxpYyBpbnQgR2V0TWF0Y2hlcyhpbnRbXSBkaXN0YW5jZXMpIHRocm93cyBJT0V4Y2VwdGlvbg0KKwl7DQorCQlpbnQgbGVuTGltaXQ7DQorCQlpZiAoX3BvcyArIF9tYXRjaE1heExlbiA8PSBfc3RyZWFtUG9zKQ0KKwkJCWxlbkxpbWl0ID0gX21hdGNoTWF4TGVuOw0KKwkJZWxzZQ0KKwkJew0KKwkJCWxlbkxpbWl0ID0gX3N0cmVhbVBvcyAtIF9wb3M7DQorCQkJaWYgKGxlbkxpbWl0IDwga01pbk1hdGNoQ2hlY2spDQorCQkJew0KKwkJCQlNb3ZlUG9zKCk7DQorCQkJCXJldHVybiAwOw0KKwkJCX0NCisJCX0NCisNCisJCWludCBvZmZzZXQgPSAwOw0KKwkJaW50IG1hdGNoTWluUG9zID0gKF9wb3MgPiBfY3ljbGljQnVmZmVyU2l6ZSkgPyAoX3BvcyAtIF9jeWNsaWNCdWZmZXJTaXplKSA6IDA7DQorCQlpbnQgY3VyID0gX2J1ZmZlck9mZnNldCArIF9wb3M7DQorCQlpbnQgbWF4TGVuID0ga1N0YXJ0TWF4TGVuOyAvLyB0byBhdm9pZCBpdGVtcyBmb3IgbGVuIDwgaGFzaFNpemU7DQorCQlpbnQgaGFzaFZhbHVlLCBoYXNoMlZhbHVlID0gMCwgaGFzaDNWYWx1ZSA9IDA7DQorCQkNCisJCWlmIChIQVNIX0FSUkFZKQ0KKwkJew0KKwkJCWludCB0ZW1wID0gQ3JjVGFibGVbX2J1ZmZlckJhc2VbY3VyXSAmIDB4RkZdIF4gKF9idWZmZXJCYXNlW2N1ciArIDFdICYgMHhGRik7DQorCQkJaGFzaDJWYWx1ZSA9IHRlbXAgJiAoa0hhc2gyU2l6ZSAtIDEpOw0KKwkJCXRlbXAgXj0gKChpbnQpKF9idWZmZXJCYXNlW2N1ciArIDJdICYgMHhGRikgPDwgOCk7DQorCQkJaGFzaDNWYWx1ZSA9IHRlbXAgJiAoa0hhc2gzU2l6ZSAtIDEpOw0KKwkJCWhhc2hWYWx1ZSA9ICh0ZW1wIF4gKENyY1RhYmxlW19idWZmZXJCYXNlW2N1ciArIDNdICYgMHhGRl0gPDwgNSkpICYgX2hhc2hNYXNrOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJCWhhc2hWYWx1ZSA9ICgoX2J1ZmZlckJhc2VbY3VyXSAmIDB4RkYpIF4gKChpbnQpKF9idWZmZXJCYXNlW2N1ciArIDFdICYgMHhGRikgPDwgOCkpOw0KKw0KKwkJaW50IGN1ck1hdGNoID0gX2hhc2hba0ZpeEhhc2hTaXplICsgaGFzaFZhbHVlXTsNCisJCWlmIChIQVNIX0FSUkFZKQ0KKwkJew0KKwkJCWludCBjdXJNYXRjaDIgPSBfaGFzaFtoYXNoMlZhbHVlXTsNCisJCQlpbnQgY3VyTWF0Y2gzID0gX2hhc2hba0hhc2gzT2Zmc2V0ICsgaGFzaDNWYWx1ZV07DQorCQkJX2hhc2hbaGFzaDJWYWx1ZV0gPSBfcG9zOw0KKwkJCV9oYXNoW2tIYXNoM09mZnNldCArIGhhc2gzVmFsdWVdID0gX3BvczsNCisJCQlpZiAoY3VyTWF0Y2gyID4gbWF0Y2hNaW5Qb3MpDQorCQkJCWlmIChfYnVmZmVyQmFzZVtfYnVmZmVyT2Zmc2V0ICsgY3VyTWF0Y2gyXSA9PSBfYnVmZmVyQmFzZVtjdXJdKQ0KKwkJCQl7DQorCQkJCQlkaXN0YW5jZXNbb2Zmc2V0KytdID0gbWF4TGVuID0gMjsNCisJCQkJCWRpc3RhbmNlc1tvZmZzZXQrK10gPSBfcG9zIC0gY3VyTWF0Y2gyIC0gMTsNCisJCQkJfQ0KKwkJCWlmIChjdXJNYXRjaDMgPiBtYXRjaE1pblBvcykNCisJCQkJaWYgKF9idWZmZXJCYXNlW19idWZmZXJPZmZzZXQgKyBjdXJNYXRjaDNdID09IF9idWZmZXJCYXNlW2N1cl0pDQorCQkJCXsNCisJCQkJCWlmIChjdXJNYXRjaDMgPT0gY3VyTWF0Y2gyKQ0KKwkJCQkJCW9mZnNldCAtPSAyOw0KKwkJCQkJZGlzdGFuY2VzW29mZnNldCsrXSA9IG1heExlbiA9IDM7DQorCQkJCQlkaXN0YW5jZXNbb2Zmc2V0KytdID0gX3BvcyAtIGN1ck1hdGNoMyAtIDE7DQorCQkJCQljdXJNYXRjaDIgPSBjdXJNYXRjaDM7DQorCQkJCX0NCisJCQlpZiAob2Zmc2V0ICE9IDAgJiYgY3VyTWF0Y2gyID09IGN1ck1hdGNoKQ0KKwkJCXsNCisJCQkJb2Zmc2V0IC09IDI7DQorCQkJCW1heExlbiA9IGtTdGFydE1heExlbjsNCisJCQl9DQorCQl9DQorDQorCQlfaGFzaFtrRml4SGFzaFNpemUgKyBoYXNoVmFsdWVdID0gX3BvczsNCisNCisJCWludCBwdHIwID0gKF9jeWNsaWNCdWZmZXJQb3MgPDwgMSkgKyAxOw0KKwkJaW50IHB0cjEgPSAoX2N5Y2xpY0J1ZmZlclBvcyA8PCAxKTsNCisNCisJCWludCBsZW4wLCBsZW4xOw0KKwkJbGVuMCA9IGxlbjEgPSBrTnVtSGFzaERpcmVjdEJ5dGVzOw0KKw0KKwkJaWYgKGtOdW1IYXNoRGlyZWN0Qnl0ZXMgIT0gMCkNCisJCXsNCisJCQlpZiAoY3VyTWF0Y2ggPiBtYXRjaE1pblBvcykNCisJCQl7DQorCQkJCWlmIChfYnVmZmVyQmFzZVtfYnVmZmVyT2Zmc2V0ICsgY3VyTWF0Y2ggKyBrTnVtSGFzaERpcmVjdEJ5dGVzXSAhPQ0KKwkJCQkJCV9idWZmZXJCYXNlW2N1ciArIGtOdW1IYXNoRGlyZWN0Qnl0ZXNdKQ0KKwkJCQl7DQorCQkJCQlkaXN0YW5jZXNbb2Zmc2V0KytdID0gbWF4TGVuID0ga051bUhhc2hEaXJlY3RCeXRlczsNCisJCQkJCWRpc3RhbmNlc1tvZmZzZXQrK10gPSBfcG9zIC0gY3VyTWF0Y2ggLSAxOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKw0KKwkJaW50IGNvdW50ID0gX2N1dFZhbHVlOw0KKw0KKwkJd2hpbGUgKHRydWUpDQorCQl7DQorCQkJaWYgKGN1ck1hdGNoIDw9IG1hdGNoTWluUG9zIHx8IGNvdW50LS0gPT0gMCkNCisJCQl7DQorCQkJCV9zb25bcHRyMF0gPSBfc29uW3B0cjFdID0ga0VtcHR5SGFzaFZhbHVlOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQkJaW50IGRlbHRhID0gX3BvcyAtIGN1ck1hdGNoOw0KKwkJCWludCBjeWNsaWNQb3MgPSAoKGRlbHRhIDw9IF9jeWNsaWNCdWZmZXJQb3MpID8NCisJCQkJKF9jeWNsaWNCdWZmZXJQb3MgLSBkZWx0YSkgOg0KKwkJCQkoX2N5Y2xpY0J1ZmZlclBvcyAtIGRlbHRhICsgX2N5Y2xpY0J1ZmZlclNpemUpKSA8PCAxOw0KKw0KKwkJCWludCBwYnkxID0gX2J1ZmZlck9mZnNldCArIGN1ck1hdGNoOw0KKwkJCWludCBsZW4gPSBNYXRoLm1pbihsZW4wLCBsZW4xKTsNCisJCQlpZiAoX2J1ZmZlckJhc2VbcGJ5MSArIGxlbl0gPT0gX2J1ZmZlckJhc2VbY3VyICsgbGVuXSkNCisJCQl7DQorCQkJCXdoaWxlKCsrbGVuICE9IGxlbkxpbWl0KQ0KKwkJCQkJaWYgKF9idWZmZXJCYXNlW3BieTEgKyBsZW5dICE9IF9idWZmZXJCYXNlW2N1ciArIGxlbl0pDQorCQkJCQkJYnJlYWs7DQorCQkJCWlmIChtYXhMZW4gPCBsZW4pDQorCQkJCXsNCisJCQkJCWRpc3RhbmNlc1tvZmZzZXQrK10gPSBtYXhMZW4gPSBsZW47DQorCQkJCQlkaXN0YW5jZXNbb2Zmc2V0KytdID0gZGVsdGEgLSAxOw0KKwkJCQkJaWYgKGxlbiA9PSBsZW5MaW1pdCkNCisJCQkJCXsNCisJCQkJCQlfc29uW3B0cjFdID0gX3NvbltjeWNsaWNQb3NdOw0KKwkJCQkJCV9zb25bcHRyMF0gPSBfc29uW2N5Y2xpY1BvcyArIDFdOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmICgoX2J1ZmZlckJhc2VbcGJ5MSArIGxlbl0gJiAweEZGKSA8IChfYnVmZmVyQmFzZVtjdXIgKyBsZW5dICYgMHhGRikpDQorCQkJew0KKwkJCQlfc29uW3B0cjFdID0gY3VyTWF0Y2g7DQorCQkJCXB0cjEgPSBjeWNsaWNQb3MgKyAxOw0KKwkJCQljdXJNYXRjaCA9IF9zb25bcHRyMV07DQorCQkJCWxlbjEgPSBsZW47DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCV9zb25bcHRyMF0gPSBjdXJNYXRjaDsNCisJCQkJcHRyMCA9IGN5Y2xpY1BvczsNCisJCQkJY3VyTWF0Y2ggPSBfc29uW3B0cjBdOw0KKwkJCQlsZW4wID0gbGVuOw0KKwkJCX0NCisJCX0NCisJCU1vdmVQb3MoKTsNCisJCXJldHVybiBvZmZzZXQ7DQorCX0NCisNCisJcHVibGljIHZvaWQgU2tpcChpbnQgbnVtKSB0aHJvd3MgSU9FeGNlcHRpb24NCisJew0KKwkJZG8NCisJCXsNCisJCQlpbnQgbGVuTGltaXQ7DQorCQkJaWYgKF9wb3MgKyBfbWF0Y2hNYXhMZW4gPD0gX3N0cmVhbVBvcykNCisJCQlsZW5MaW1pdCA9IF9tYXRjaE1heExlbjsNCisJCQllbHNlDQorCQkJew0KKwkJCQlsZW5MaW1pdCA9IF9zdHJlYW1Qb3MgLSBfcG9zOw0KKwkJCQlpZiAobGVuTGltaXQgPCBrTWluTWF0Y2hDaGVjaykNCisJCQkJew0KKwkJCQkJTW92ZVBvcygpOw0KKwkJCQkJY29udGludWU7DQorCQkJCX0NCisJCQl9DQorDQorCQkJaW50IG1hdGNoTWluUG9zID0gKF9wb3MgPiBfY3ljbGljQnVmZmVyU2l6ZSkgPyAoX3BvcyAtIF9jeWNsaWNCdWZmZXJTaXplKSA6IDA7DQorCQkJaW50IGN1ciA9IF9idWZmZXJPZmZzZXQgKyBfcG9zOw0KKwkJCQ0KKwkJCWludCBoYXNoVmFsdWU7DQorDQorCQkJaWYgKEhBU0hfQVJSQVkpDQorCQkJew0KKwkJCQlpbnQgdGVtcCA9IENyY1RhYmxlW19idWZmZXJCYXNlW2N1cl0gJiAweEZGXSBeIChfYnVmZmVyQmFzZVtjdXIgKyAxXSAmIDB4RkYpOw0KKwkJCQlpbnQgaGFzaDJWYWx1ZSA9IHRlbXAgJiAoa0hhc2gyU2l6ZSAtIDEpOw0KKwkJCQlfaGFzaFtoYXNoMlZhbHVlXSA9IF9wb3M7DQorCQkJCXRlbXAgXj0gKChpbnQpKF9idWZmZXJCYXNlW2N1ciArIDJdICYgMHhGRikgPDwgOCk7DQorCQkJCWludCBoYXNoM1ZhbHVlID0gdGVtcCAmIChrSGFzaDNTaXplIC0gMSk7DQorCQkJCV9oYXNoW2tIYXNoM09mZnNldCArIGhhc2gzVmFsdWVdID0gX3BvczsNCisJCQkJaGFzaFZhbHVlID0gKHRlbXAgXiAoQ3JjVGFibGVbX2J1ZmZlckJhc2VbY3VyICsgM10gJiAweEZGXSA8PCA1KSkgJiBfaGFzaE1hc2s7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQkJaGFzaFZhbHVlID0gKChfYnVmZmVyQmFzZVtjdXJdICYgMHhGRikgXiAoKGludCkoX2J1ZmZlckJhc2VbY3VyICsgMV0gJiAweEZGKSA8PCA4KSk7DQorDQorCQkJaW50IGN1ck1hdGNoID0gX2hhc2hba0ZpeEhhc2hTaXplICsgaGFzaFZhbHVlXTsNCisJCQlfaGFzaFtrRml4SGFzaFNpemUgKyBoYXNoVmFsdWVdID0gX3BvczsNCisNCisJCQlpbnQgcHRyMCA9IChfY3ljbGljQnVmZmVyUG9zIDw8IDEpICsgMTsNCisJCQlpbnQgcHRyMSA9IChfY3ljbGljQnVmZmVyUG9zIDw8IDEpOw0KKw0KKwkJCWludCBsZW4wLCBsZW4xOw0KKwkJCWxlbjAgPSBsZW4xID0ga051bUhhc2hEaXJlY3RCeXRlczsNCisNCisJCQlpbnQgY291bnQgPSBfY3V0VmFsdWU7DQorCQkJd2hpbGUgKHRydWUpDQorCQkJew0KKwkJCQlpZiAoY3VyTWF0Y2ggPD0gbWF0Y2hNaW5Qb3MgfHwgY291bnQtLSA9PSAwKQ0KKwkJCQl7DQorCQkJCQlfc29uW3B0cjBdID0gX3NvbltwdHIxXSA9IGtFbXB0eUhhc2hWYWx1ZTsNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorDQorCQkJCWludCBkZWx0YSA9IF9wb3MgLSBjdXJNYXRjaDsNCisJCQkJaW50IGN5Y2xpY1BvcyA9ICgoZGVsdGEgPD0gX2N5Y2xpY0J1ZmZlclBvcykgPw0KKwkJCQkJKF9jeWNsaWNCdWZmZXJQb3MgLSBkZWx0YSkgOg0KKwkJCQkJKF9jeWNsaWNCdWZmZXJQb3MgLSBkZWx0YSArIF9jeWNsaWNCdWZmZXJTaXplKSkgPDwgMTsNCisNCisJCQkJaW50IHBieTEgPSBfYnVmZmVyT2Zmc2V0ICsgY3VyTWF0Y2g7DQorCQkJCWludCBsZW4gPSBNYXRoLm1pbihsZW4wLCBsZW4xKTsNCisJCQkJaWYgKF9idWZmZXJCYXNlW3BieTEgKyBsZW5dID09IF9idWZmZXJCYXNlW2N1ciArIGxlbl0pDQorCQkJCXsNCisJCQkJCXdoaWxlICgrK2xlbiAhPSBsZW5MaW1pdCkNCisJCQkJCQlpZiAoX2J1ZmZlckJhc2VbcGJ5MSArIGxlbl0gIT0gX2J1ZmZlckJhc2VbY3VyICsgbGVuXSkNCisJCQkJCQkJYnJlYWs7DQorCQkJCQlpZiAobGVuID09IGxlbkxpbWl0KQ0KKwkJCQkJew0KKwkJCQkJCV9zb25bcHRyMV0gPSBfc29uW2N5Y2xpY1Bvc107DQorCQkJCQkJX3NvbltwdHIwXSA9IF9zb25bY3ljbGljUG9zICsgMV07DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJaWYgKChfYnVmZmVyQmFzZVtwYnkxICsgbGVuXSAmIDB4RkYpIDwgKF9idWZmZXJCYXNlW2N1ciArIGxlbl0gJiAweEZGKSkNCisJCQkJew0KKwkJCQkJX3NvbltwdHIxXSA9IGN1ck1hdGNoOw0KKwkJCQkJcHRyMSA9IGN5Y2xpY1BvcyArIDE7DQorCQkJCQljdXJNYXRjaCA9IF9zb25bcHRyMV07DQorCQkJCQlsZW4xID0gbGVuOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJX3NvbltwdHIwXSA9IGN1ck1hdGNoOw0KKwkJCQkJcHRyMCA9IGN5Y2xpY1BvczsNCisJCQkJCWN1ck1hdGNoID0gX3NvbltwdHIwXTsNCisJCQkJCWxlbjAgPSBsZW47DQorCQkJCX0NCisJCQl9DQorCQkJTW92ZVBvcygpOw0KKwkJfQ0KKwkJd2hpbGUgKC0tbnVtICE9IDApOw0KKwl9DQorCQ0KKwl2b2lkIE5vcm1hbGl6ZUxpbmtzKGludFtdIGl0ZW1zLCBpbnQgbnVtSXRlbXMsIGludCBzdWJWYWx1ZSkNCisJew0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKQ0KKwkJew0KKwkJCWludCB2YWx1ZSA9IGl0ZW1zW2ldOw0KKwkJCWlmICh2YWx1ZSA8PSBzdWJWYWx1ZSkNCisJCQkJdmFsdWUgPSBrRW1wdHlIYXNoVmFsdWU7DQorCQkJZWxzZQ0KKwkJCQl2YWx1ZSAtPSBzdWJWYWx1ZTsNCisJCQlpdGVtc1tpXSA9IHZhbHVlOw0KKwkJfQ0KKwl9DQorCQ0KKwl2b2lkIE5vcm1hbGl6ZSgpDQorCXsNCisJCWludCBzdWJWYWx1ZSA9IF9wb3MgLSBfY3ljbGljQnVmZmVyU2l6ZTsNCisJCU5vcm1hbGl6ZUxpbmtzKF9zb24sIF9jeWNsaWNCdWZmZXJTaXplICogMiwgc3ViVmFsdWUpOw0KKwkJTm9ybWFsaXplTGlua3MoX2hhc2gsIF9oYXNoU2l6ZVN1bSwgc3ViVmFsdWUpOw0KKwkJUmVkdWNlT2Zmc2V0cyhzdWJWYWx1ZSk7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIFNldEN1dFZhbHVlKGludCBjdXRWYWx1ZSkgeyBfY3V0VmFsdWUgPSBjdXRWYWx1ZTsgfQ0KKw0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDcmNUYWJsZSA9IG5ldyBpbnRbMjU2XTsNCisNCisJc3RhdGljDQorCXsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspDQorCQl7DQorCQkJaW50IHIgPSBpOw0KKwkJCWZvciAoaW50IGogPSAwOyBqIDwgODsgaisrKQ0KKwkJCQlpZiAoKHIgJiAxKSAhPSAwKQ0KKwkJCQkJciA9IChyID4+PiAxKSBeIDB4RURCODgzMjA7DQorCQkJCWVsc2UNCisJCQkJCXIgPj4+PSAxOw0KKwkJCUNyY1RhYmxlW2ldID0gcjsNCisJCX0NCisJfQ0KK30NCmRpZmYgLS1naXQgYS9sem1hL0phdmEvU2V2ZW5aaXAvQ29tcHJlc3Npb24vTFovSW5XaW5kb3cuamF2YSBiL2x6bWEvSmF2YS9TZXZlblppcC9Db21wcmVzc2lvbi9MWi9JbldpbmRvdy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmM2YwYjQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvU2V2ZW5aaXAvQ29tcHJlc3Npb24vTFovSW5XaW5kb3cuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLy8gTFouSW5XaW5kb3cNCisNCitwYWNrYWdlIFNldmVuWmlwLkNvbXByZXNzaW9uLkxaOw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KKw0KK3B1YmxpYyBjbGFzcyBJbldpbmRvdw0KK3sNCisJcHVibGljIGJ5dGVbXSBfYnVmZmVyQmFzZTsgLy8gcG9pbnRlciB0byBidWZmZXIgd2l0aCBkYXRhDQorCWphdmEuaW8uSW5wdXRTdHJlYW0gX3N0cmVhbTsNCisJaW50IF9wb3NMaW1pdDsgIC8vIG9mZnNldCAoZnJvbSBfYnVmZmVyKSBvZiBmaXJzdCBieXRlIHdoZW4gbmV3IGJsb2NrIHJlYWRpbmcgbXVzdCBiZSBkb25lDQorCWJvb2xlYW4gX3N0cmVhbUVuZFdhc1JlYWNoZWQ7IC8vIGlmICh0cnVlKSB0aGVuIF9zdHJlYW1Qb3Mgc2hvd3MgcmVhbCBlbmQgb2Ygc3RyZWFtDQorCQ0KKwlpbnQgX3BvaW50ZXJUb0xhc3RTYWZlUG9zaXRpb247DQorCQ0KKwlwdWJsaWMgaW50IF9idWZmZXJPZmZzZXQ7DQorCQ0KKwlwdWJsaWMgaW50IF9ibG9ja1NpemU7ICAvLyBTaXplIG9mIEFsbG9jYXRlZCBtZW1vcnkgYmxvY2sNCisJcHVibGljIGludCBfcG9zOyAgICAgICAgICAgICAvLyBvZmZzZXQgKGZyb20gX2J1ZmZlcikgb2YgY3VyZW50IGJ5dGUNCisJaW50IF9rZWVwU2l6ZUJlZm9yZTsgIC8vIGhvdyBtYW55IEJZVEVzIG11c3QgYmUga2VwdCBpbiBidWZmZXIgYmVmb3JlIF9wb3MNCisJaW50IF9rZWVwU2l6ZUFmdGVyOyAgIC8vIGhvdyBtYW55IEJZVEVzIG11c3QgYmUga2VwdCBidWZmZXIgYWZ0ZXIgX3Bvcw0KKwlwdWJsaWMgaW50IF9zdHJlYW1Qb3M7ICAgLy8gb2Zmc2V0IChmcm9tIF9idWZmZXIpIG9mIGZpcnN0IG5vdCByZWFkIGJ5dGUgZnJvbSBTdHJlYW0NCisJDQorCXB1YmxpYyB2b2lkIE1vdmVCbG9jaygpDQorCXsNCisJCWludCBvZmZzZXQgPSBfYnVmZmVyT2Zmc2V0ICsgX3BvcyAtIF9rZWVwU2l6ZUJlZm9yZTsNCisJCS8vIHdlIG5lZWQgb25lIGFkZGl0aW9uYWwgYnl0ZSwgc2luY2UgTW92ZVBvcyBtb3ZlcyBvbiAxIGJ5dGUuDQorCQlpZiAob2Zmc2V0ID4gMCkNCisJCQlvZmZzZXQtLTsNCisNCisJCWludCBudW1CeXRlcyA9IF9idWZmZXJPZmZzZXQgKyBfc3RyZWFtUG9zIC0gb2Zmc2V0Ow0KKwkJDQorCQkvLyBjaGVjayBuZWdhdGl2ZSBvZmZzZXQgPz8/Pw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CeXRlczsgaSsrKQ0KKwkJCV9idWZmZXJCYXNlW2ldID0gX2J1ZmZlckJhc2Vbb2Zmc2V0ICsgaV07DQorCQlfYnVmZmVyT2Zmc2V0IC09IG9mZnNldDsNCisJfQ0KKwkNCisJcHVibGljIHZvaWQgUmVhZEJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uDQorCXsNCisJCWlmIChfc3RyZWFtRW5kV2FzUmVhY2hlZCkNCisJCQlyZXR1cm47DQorCQl3aGlsZSAodHJ1ZSkNCisJCXsNCisJCQlpbnQgc2l6ZSA9ICgwIC0gX2J1ZmZlck9mZnNldCkgKyBfYmxvY2tTaXplIC0gX3N0cmVhbVBvczsNCisJCQlpZiAoc2l6ZSA9PSAwKQ0KKwkJCQlyZXR1cm47DQorCQkJaW50IG51bVJlYWRCeXRlcyA9IF9zdHJlYW0ucmVhZChfYnVmZmVyQmFzZSwgX2J1ZmZlck9mZnNldCArIF9zdHJlYW1Qb3MsIHNpemUpOw0KKwkJCWlmIChudW1SZWFkQnl0ZXMgPT0gLTEpDQorCQkJew0KKwkJCQlfcG9zTGltaXQgPSBfc3RyZWFtUG9zOw0KKwkJCQlpbnQgcG9pbnRlclRvUG9zdGlvbiA9IF9idWZmZXJPZmZzZXQgKyBfcG9zTGltaXQ7DQorCQkJCWlmIChwb2ludGVyVG9Qb3N0aW9uID4gX3BvaW50ZXJUb0xhc3RTYWZlUG9zaXRpb24pDQorCQkJCQlfcG9zTGltaXQgPSBfcG9pbnRlclRvTGFzdFNhZmVQb3NpdGlvbiAtIF9idWZmZXJPZmZzZXQ7DQorCQkJCQ0KKwkJCQlfc3RyZWFtRW5kV2FzUmVhY2hlZCA9IHRydWU7DQorCQkJCXJldHVybjsNCisJCQl9DQorCQkJX3N0cmVhbVBvcyArPSBudW1SZWFkQnl0ZXM7DQorCQkJaWYgKF9zdHJlYW1Qb3MgPj0gX3BvcyArIF9rZWVwU2l6ZUFmdGVyKQ0KKwkJCQlfcG9zTGltaXQgPSBfc3RyZWFtUG9zIC0gX2tlZXBTaXplQWZ0ZXI7DQorCQl9DQorCX0NCisJDQorCXZvaWQgRnJlZSgpIHsgX2J1ZmZlckJhc2UgPSBudWxsOyB9DQorCQ0KKwlwdWJsaWMgdm9pZCBDcmVhdGUoaW50IGtlZXBTaXplQmVmb3JlLCBpbnQga2VlcFNpemVBZnRlciwgaW50IGtlZXBTaXplUmVzZXJ2KQ0KKwl7DQorCQlfa2VlcFNpemVCZWZvcmUgPSBrZWVwU2l6ZUJlZm9yZTsNCisJCV9rZWVwU2l6ZUFmdGVyID0ga2VlcFNpemVBZnRlcjsNCisJCWludCBibG9ja1NpemUgPSBrZWVwU2l6ZUJlZm9yZSArIGtlZXBTaXplQWZ0ZXIgKyBrZWVwU2l6ZVJlc2VydjsNCisJCWlmIChfYnVmZmVyQmFzZSA9PSBudWxsIHx8IF9ibG9ja1NpemUgIT0gYmxvY2tTaXplKQ0KKwkJew0KKwkJCUZyZWUoKTsNCisJCQlfYmxvY2tTaXplID0gYmxvY2tTaXplOw0KKwkJCV9idWZmZXJCYXNlID0gbmV3IGJ5dGVbX2Jsb2NrU2l6ZV07DQorCQl9DQorCQlfcG9pbnRlclRvTGFzdFNhZmVQb3NpdGlvbiA9IF9ibG9ja1NpemUgLSBrZWVwU2l6ZUFmdGVyOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBTZXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0pIHsgX3N0cmVhbSA9IHN0cmVhbTsgCX0NCisJcHVibGljIHZvaWQgUmVsZWFzZVN0cmVhbSgpIHsgX3N0cmVhbSA9IG51bGw7IH0NCisNCisJcHVibGljIHZvaWQgSW5pdCgpIHRocm93cyBJT0V4Y2VwdGlvbg0KKwl7DQorCQlfYnVmZmVyT2Zmc2V0ID0gMDsNCisJCV9wb3MgPSAwOw0KKwkJX3N0cmVhbVBvcyA9IDA7DQorCQlfc3RyZWFtRW5kV2FzUmVhY2hlZCA9IGZhbHNlOw0KKwkJUmVhZEJsb2NrKCk7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIE1vdmVQb3MoKSB0aHJvd3MgSU9FeGNlcHRpb24NCisJew0KKwkJX3BvcysrOw0KKwkJaWYgKF9wb3MgPiBfcG9zTGltaXQpDQorCQl7DQorCQkJaW50IHBvaW50ZXJUb1Bvc3Rpb24gPSBfYnVmZmVyT2Zmc2V0ICsgX3BvczsNCisJCQlpZiAocG9pbnRlclRvUG9zdGlvbiA+IF9wb2ludGVyVG9MYXN0U2FmZVBvc2l0aW9uKQ0KKwkJCQlNb3ZlQmxvY2soKTsNCisJCQlSZWFkQmxvY2soKTsNCisJCX0NCisJfQ0KKwkNCisJcHVibGljIGJ5dGUgR2V0SW5kZXhCeXRlKGludCBpbmRleCkJeyByZXR1cm4gX2J1ZmZlckJhc2VbX2J1ZmZlck9mZnNldCArIF9wb3MgKyBpbmRleF07IH0NCisJDQorCS8vIGluZGV4ICsgbGltaXQgaGF2ZSBub3QgdG8gZXhjZWVkIF9rZWVwU2l6ZUFmdGVyOw0KKwlwdWJsaWMgaW50IEdldE1hdGNoTGVuKGludCBpbmRleCwgaW50IGRpc3RhbmNlLCBpbnQgbGltaXQpDQorCXsNCisJCWlmIChfc3RyZWFtRW5kV2FzUmVhY2hlZCkNCisJCQlpZiAoKF9wb3MgKyBpbmRleCkgKyBsaW1pdCA+IF9zdHJlYW1Qb3MpDQorCQkJCWxpbWl0ID0gX3N0cmVhbVBvcyAtIChfcG9zICsgaW5kZXgpOw0KKwkJZGlzdGFuY2UrKzsNCisJCS8vIEJ5dGUgKnBieSA9IF9idWZmZXIgKyAoc2l6ZV90KV9wb3MgKyBpbmRleDsNCisJCWludCBwYnkgPSBfYnVmZmVyT2Zmc2V0ICsgX3BvcyArIGluZGV4Ow0KKwkJDQorCQlpbnQgaTsNCisJCWZvciAoaSA9IDA7IGkgPCBsaW1pdCAmJiBfYnVmZmVyQmFzZVtwYnkgKyBpXSA9PSBfYnVmZmVyQmFzZVtwYnkgKyBpIC0gZGlzdGFuY2VdOyBpKyspOw0KKwkJcmV0dXJuIGk7DQorCX0NCisJDQorCXB1YmxpYyBpbnQgR2V0TnVtQXZhaWxhYmxlQnl0ZXMoKQl7IHJldHVybiBfc3RyZWFtUG9zIC0gX3BvczsgfQ0KKwkNCisJcHVibGljIHZvaWQgUmVkdWNlT2Zmc2V0cyhpbnQgc3ViVmFsdWUpDQorCXsNCisJCV9idWZmZXJPZmZzZXQgKz0gc3ViVmFsdWU7DQorCQlfcG9zTGltaXQgLT0gc3ViVmFsdWU7DQorCQlfcG9zIC09IHN1YlZhbHVlOw0KKwkJX3N0cmVhbVBvcyAtPSBzdWJWYWx1ZTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9sem1hL0phdmEvU2V2ZW5aaXAvQ29tcHJlc3Npb24vTFovT3V0V2luZG93LmphdmEgYi9sem1hL0phdmEvU2V2ZW5aaXAvQ29tcHJlc3Npb24vTFovT3V0V2luZG93LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwY2I0MQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9TZXZlblppcC9Db21wcmVzc2lvbi9MWi9PdXRXaW5kb3cuamF2YQpAQCAtMCwwICsxLDg1IEBACisvLyBMWi5PdXRXaW5kb3cNCisNCitwYWNrYWdlIFNldmVuWmlwLkNvbXByZXNzaW9uLkxaOw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KKw0KK3B1YmxpYyBjbGFzcyBPdXRXaW5kb3cNCit7DQorCWJ5dGVbXSBfYnVmZmVyOw0KKwlpbnQgX3BvczsNCisJaW50IF93aW5kb3dTaXplID0gMDsNCisJaW50IF9zdHJlYW1Qb3M7DQorCWphdmEuaW8uT3V0cHV0U3RyZWFtIF9zdHJlYW07DQorCQ0KKwlwdWJsaWMgdm9pZCBDcmVhdGUoaW50IHdpbmRvd1NpemUpDQorCXsNCisJCWlmIChfYnVmZmVyID09IG51bGwgfHwgX3dpbmRvd1NpemUgIT0gd2luZG93U2l6ZSkNCisJCQlfYnVmZmVyID0gbmV3IGJ5dGVbd2luZG93U2l6ZV07DQorCQlfd2luZG93U2l6ZSA9IHdpbmRvd1NpemU7DQorCQlfcG9zID0gMDsNCisJCV9zdHJlYW1Qb3MgPSAwOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBTZXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24NCisJew0KKwkJUmVsZWFzZVN0cmVhbSgpOw0KKwkJX3N0cmVhbSA9IHN0cmVhbTsNCisJfQ0KKwkNCisJcHVibGljIHZvaWQgUmVsZWFzZVN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbg0KKwl7DQorCQlGbHVzaCgpOw0KKwkJX3N0cmVhbSA9IG51bGw7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIEluaXQoYm9vbGVhbiBzb2xpZCkNCisJew0KKwkJaWYgKCFzb2xpZCkNCisJCXsNCisJCQlfc3RyZWFtUG9zID0gMDsNCisJCQlfcG9zID0gMDsNCisJCX0NCisJfQ0KKwkNCisJcHVibGljIHZvaWQgRmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24NCisJew0KKwkJaW50IHNpemUgPSBfcG9zIC0gX3N0cmVhbVBvczsNCisJCWlmIChzaXplID09IDApDQorCQkJcmV0dXJuOw0KKwkJX3N0cmVhbS53cml0ZShfYnVmZmVyLCBfc3RyZWFtUG9zLCBzaXplKTsNCisJCWlmIChfcG9zID49IF93aW5kb3dTaXplKQ0KKwkJCV9wb3MgPSAwOw0KKwkJX3N0cmVhbVBvcyA9IF9wb3M7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIENvcHlCbG9jayhpbnQgZGlzdGFuY2UsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbg0KKwl7DQorCQlpbnQgcG9zID0gX3BvcyAtIGRpc3RhbmNlIC0gMTsNCisJCWlmIChwb3MgPCAwKQ0KKwkJCXBvcyArPSBfd2luZG93U2l6ZTsNCisJCWZvciAoOyBsZW4gIT0gMDsgbGVuLS0pDQorCQl7DQorCQkJaWYgKHBvcyA+PSBfd2luZG93U2l6ZSkNCisJCQkJcG9zID0gMDsNCisJCQlfYnVmZmVyW19wb3MrK10gPSBfYnVmZmVyW3BvcysrXTsNCisJCQlpZiAoX3BvcyA+PSBfd2luZG93U2l6ZSkNCisJCQkJRmx1c2goKTsNCisJCX0NCisJfQ0KKwkNCisJcHVibGljIHZvaWQgUHV0Qnl0ZShieXRlIGIpIHRocm93cyBJT0V4Y2VwdGlvbg0KKwl7DQorCQlfYnVmZmVyW19wb3MrK10gPSBiOw0KKwkJaWYgKF9wb3MgPj0gX3dpbmRvd1NpemUpDQorCQkJRmx1c2goKTsNCisJfQ0KKwkNCisJcHVibGljIGJ5dGUgR2V0Qnl0ZShpbnQgZGlzdGFuY2UpDQorCXsNCisJCWludCBwb3MgPSBfcG9zIC0gZGlzdGFuY2UgLSAxOw0KKwkJaWYgKHBvcyA8IDApDQorCQkJcG9zICs9IF93aW5kb3dTaXplOw0KKwkJcmV0dXJuIF9idWZmZXJbcG9zXTsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9sem1hL0phdmEvU2V2ZW5aaXAvQ29tcHJlc3Npb24vTFpNQS9CYXNlLmphdmEgYi9sem1hL0phdmEvU2V2ZW5aaXAvQ29tcHJlc3Npb24vTFpNQS9CYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkZWVkOQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9TZXZlblppcC9Db21wcmVzc2lvbi9MWk1BL0Jhc2UuamF2YQpAQCAtMCwwICsxLDg4IEBACisvLyBCYXNlLmphdmENCisNCitwYWNrYWdlIFNldmVuWmlwLkNvbXByZXNzaW9uLkxaTUE7DQorDQorcHVibGljIGNsYXNzIEJhc2UNCit7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtOdW1SZXBEaXN0YW5jZXMgPSA0Ow0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrTnVtU3RhdGVzID0gMTI7DQorCQ0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTdGF0ZUluaXQoKQ0KKwl7DQorCQlyZXR1cm4gMDsNCisJfQ0KKwkNCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU3RhdGVVcGRhdGVDaGFyKGludCBpbmRleCkNCisJew0KKwkJaWYgKGluZGV4IDwgNCkgDQorCQkJcmV0dXJuIDA7DQorCQlpZiAoaW5kZXggPCAxMCkgDQorCQkJcmV0dXJuIGluZGV4IC0gMzsNCisJCXJldHVybiBpbmRleCAtIDY7DQorCX0NCisJDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFN0YXRlVXBkYXRlTWF0Y2goaW50IGluZGV4KQ0KKwl7DQorCQlyZXR1cm4gKGluZGV4IDwgNyA/IDcgOiAxMCk7IA0KKwl9DQorDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFN0YXRlVXBkYXRlUmVwKGludCBpbmRleCkNCisJeyANCisJCXJldHVybiAoaW5kZXggPCA3ID8gOCA6IDExKTsgDQorCX0NCisJDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFN0YXRlVXBkYXRlU2hvcnRSZXAoaW50IGluZGV4KQ0KKwl7IA0KKwkJcmV0dXJuIChpbmRleCA8IDcgPyA5IDogMTEpOyANCisJfQ0KKw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gU3RhdGVJc0NoYXJTdGF0ZShpbnQgaW5kZXgpDQorCXsgDQorCQlyZXR1cm4gaW5kZXggPCA3OyANCisJfQ0KKwkNCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga051bVBvc1Nsb3RCaXRzID0gNjsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga0RpY0xvZ1NpemVNaW4gPSAwOw0KKwkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrRGljTG9nU2l6ZU1heCA9IDI4Ow0KKwkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrRGlzdFRhYmxlU2l6ZU1heCA9IGtEaWNMb2dTaXplTWF4ICogMjsNCisJDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtOdW1MZW5Ub1Bvc1N0YXRlc0JpdHMgPSAyOyAvLyBpdCdzIGZvciBzcGVlZCBvcHRpbWl6YXRpb24NCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga051bUxlblRvUG9zU3RhdGVzID0gMSA8PCBrTnVtTGVuVG9Qb3NTdGF0ZXNCaXRzOw0KKwkNCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga01hdGNoTWluTGVuID0gMjsNCisJDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdldExlblRvUG9zU3RhdGUoaW50IGxlbikNCisJew0KKwkJbGVuIC09IGtNYXRjaE1pbkxlbjsNCisJCWlmIChsZW4gPCBrTnVtTGVuVG9Qb3NTdGF0ZXMpDQorCQkJcmV0dXJuIGxlbjsNCisJCXJldHVybiAoaW50KShrTnVtTGVuVG9Qb3NTdGF0ZXMgLSAxKTsNCisJfQ0KKwkNCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga051bUFsaWduQml0cyA9IDQ7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtBbGlnblRhYmxlU2l6ZSA9IDEgPDwga051bUFsaWduQml0czsNCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga0FsaWduTWFzayA9IChrQWxpZ25UYWJsZVNpemUgLSAxKTsNCisJDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtTdGFydFBvc01vZGVsSW5kZXggPSA0Ow0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrRW5kUG9zTW9kZWxJbmRleCA9IDE0Ow0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrTnVtUG9zTW9kZWxzID0ga0VuZFBvc01vZGVsSW5kZXggLSBrU3RhcnRQb3NNb2RlbEluZGV4Ow0KKwkNCisJcHVibGljIHN0YXRpYyBmaW5hbCAgaW50IGtOdW1GdWxsRGlzdGFuY2VzID0gMSA8PCAoa0VuZFBvc01vZGVsSW5kZXggLyAyKTsNCisJDQorCXB1YmxpYyBzdGF0aWMgZmluYWwgIGludCBrTnVtTGl0UG9zU3RhdGVzQml0c0VuY29kaW5nTWF4ID0gNDsNCisJcHVibGljIHN0YXRpYyBmaW5hbCAgaW50IGtOdW1MaXRDb250ZXh0Qml0c01heCA9IDg7DQorCQ0KKwlwdWJsaWMgc3RhdGljIGZpbmFsICBpbnQga051bVBvc1N0YXRlc0JpdHNNYXggPSA0Ow0KKwlwdWJsaWMgc3RhdGljIGZpbmFsICBpbnQga051bVBvc1N0YXRlc01heCA9ICgxIDw8IGtOdW1Qb3NTdGF0ZXNCaXRzTWF4KTsNCisJcHVibGljIHN0YXRpYyBmaW5hbCAgaW50IGtOdW1Qb3NTdGF0ZXNCaXRzRW5jb2RpbmdNYXggPSA0Ow0KKwlwdWJsaWMgc3RhdGljIGZpbmFsICBpbnQga051bVBvc1N0YXRlc0VuY29kaW5nTWF4ID0gKDEgPDwga051bVBvc1N0YXRlc0JpdHNFbmNvZGluZ01heCk7DQorCQ0KKwlwdWJsaWMgc3RhdGljIGZpbmFsICBpbnQga051bUxvd0xlbkJpdHMgPSAzOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsICBpbnQga051bU1pZExlbkJpdHMgPSAzOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsICBpbnQga051bUhpZ2hMZW5CaXRzID0gODsNCisJcHVibGljIHN0YXRpYyBmaW5hbCAgaW50IGtOdW1Mb3dMZW5TeW1ib2xzID0gMSA8PCBrTnVtTG93TGVuQml0czsNCisJcHVibGljIHN0YXRpYyBmaW5hbCAgaW50IGtOdW1NaWRMZW5TeW1ib2xzID0gMSA8PCBrTnVtTWlkTGVuQml0czsNCisJcHVibGljIHN0YXRpYyBmaW5hbCAgaW50IGtOdW1MZW5TeW1ib2xzID0ga051bUxvd0xlblN5bWJvbHMgKyBrTnVtTWlkTGVuU3ltYm9scyArDQorCQkJKDEgPDwga051bUhpZ2hMZW5CaXRzKTsNCisJcHVibGljIHN0YXRpYyBmaW5hbCAgaW50IGtNYXRjaE1heExlbiA9IGtNYXRjaE1pbkxlbiArIGtOdW1MZW5TeW1ib2xzIC0gMTsNCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1NldmVuWmlwL0NvbXByZXNzaW9uL0xaTUEvRGVjb2Rlci5qYXZhIGIvbHptYS9KYXZhL1NldmVuWmlwL0NvbXByZXNzaW9uL0xaTUEvRGVjb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYmQ1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvU2V2ZW5aaXAvQ29tcHJlc3Npb24vTFpNQS9EZWNvZGVyLmphdmEKQEAgLTAsMCArMSwzMjkgQEAKK3BhY2thZ2UgU2V2ZW5aaXAuQ29tcHJlc3Npb24uTFpNQTsNCisNCitpbXBvcnQgU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5CaXRUcmVlRGVjb2RlcjsNCitpbXBvcnQgU2V2ZW5aaXAuQ29tcHJlc3Npb24uTFpNQS5CYXNlOw0KK2ltcG9ydCBTZXZlblppcC5Db21wcmVzc2lvbi5MWi5PdXRXaW5kb3c7DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQorDQorcHVibGljIGNsYXNzIERlY29kZXINCit7DQorCWNsYXNzIExlbkRlY29kZXINCisJew0KKwkJc2hvcnRbXSBtX0Nob2ljZSA9IG5ldyBzaG9ydFsyXTsNCisJCUJpdFRyZWVEZWNvZGVyW10gbV9Mb3dDb2RlciA9IG5ldyBCaXRUcmVlRGVjb2RlcltCYXNlLmtOdW1Qb3NTdGF0ZXNNYXhdOw0KKwkJQml0VHJlZURlY29kZXJbXSBtX01pZENvZGVyID0gbmV3IEJpdFRyZWVEZWNvZGVyW0Jhc2Uua051bVBvc1N0YXRlc01heF07DQorCQlCaXRUcmVlRGVjb2RlciBtX0hpZ2hDb2RlciA9IG5ldyBCaXRUcmVlRGVjb2RlcihCYXNlLmtOdW1IaWdoTGVuQml0cyk7DQorCQlpbnQgbV9OdW1Qb3NTdGF0ZXMgPSAwOw0KKwkJDQorCQlwdWJsaWMgdm9pZCBDcmVhdGUoaW50IG51bVBvc1N0YXRlcykNCisJCXsNCisJCQlmb3IgKDsgbV9OdW1Qb3NTdGF0ZXMgPCBudW1Qb3NTdGF0ZXM7IG1fTnVtUG9zU3RhdGVzKyspDQorCQkJew0KKwkJCQltX0xvd0NvZGVyW21fTnVtUG9zU3RhdGVzXSA9IG5ldyBCaXRUcmVlRGVjb2RlcihCYXNlLmtOdW1Mb3dMZW5CaXRzKTsNCisJCQkJbV9NaWRDb2RlclttX051bVBvc1N0YXRlc10gPSBuZXcgQml0VHJlZURlY29kZXIoQmFzZS5rTnVtTWlkTGVuQml0cyk7DQorCQkJfQ0KKwkJfQ0KKwkJDQorCQlwdWJsaWMgdm9pZCBJbml0KCkNCisJCXsNCisJCQlTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkRlY29kZXIuSW5pdEJpdE1vZGVscyhtX0Nob2ljZSk7DQorCQkJZm9yIChpbnQgcG9zU3RhdGUgPSAwOyBwb3NTdGF0ZSA8IG1fTnVtUG9zU3RhdGVzOyBwb3NTdGF0ZSsrKQ0KKwkJCXsNCisJCQkJbV9Mb3dDb2Rlcltwb3NTdGF0ZV0uSW5pdCgpOw0KKwkJCQltX01pZENvZGVyW3Bvc1N0YXRlXS5Jbml0KCk7DQorCQkJfQ0KKwkJCW1fSGlnaENvZGVyLkluaXQoKTsNCisJCX0NCisJCQ0KKwkJcHVibGljIGludCBEZWNvZGUoU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5EZWNvZGVyIHJhbmdlRGVjb2RlciwgaW50IHBvc1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24NCisJCXsNCisJCQlpZiAocmFuZ2VEZWNvZGVyLkRlY29kZUJpdChtX0Nob2ljZSwgMCkgPT0gMCkNCisJCQkJcmV0dXJuIG1fTG93Q29kZXJbcG9zU3RhdGVdLkRlY29kZShyYW5nZURlY29kZXIpOw0KKwkJCWludCBzeW1ib2wgPSBCYXNlLmtOdW1Mb3dMZW5TeW1ib2xzOw0KKwkJCWlmIChyYW5nZURlY29kZXIuRGVjb2RlQml0KG1fQ2hvaWNlLCAxKSA9PSAwKQ0KKwkJCQlzeW1ib2wgKz0gbV9NaWRDb2Rlcltwb3NTdGF0ZV0uRGVjb2RlKHJhbmdlRGVjb2Rlcik7DQorCQkJZWxzZQ0KKwkJCQlzeW1ib2wgKz0gQmFzZS5rTnVtTWlkTGVuU3ltYm9scyArIG1fSGlnaENvZGVyLkRlY29kZShyYW5nZURlY29kZXIpOw0KKwkJCXJldHVybiBzeW1ib2w7DQorCQl9DQorCX0NCisJDQorCWNsYXNzIExpdGVyYWxEZWNvZGVyDQorCXsNCisJCWNsYXNzIERlY29kZXIyDQorCQl7DQorCQkJc2hvcnRbXSBtX0RlY29kZXJzID0gbmV3IHNob3J0WzB4MzAwXTsNCisJCQkNCisJCQlwdWJsaWMgdm9pZCBJbml0KCkNCisJCQl7DQorCQkJCVNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRGVjb2Rlci5Jbml0Qml0TW9kZWxzKG1fRGVjb2RlcnMpOw0KKwkJCX0NCisJCQkNCisJCQlwdWJsaWMgYnl0ZSBEZWNvZGVOb3JtYWwoU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5EZWNvZGVyIHJhbmdlRGVjb2RlcikgdGhyb3dzIElPRXhjZXB0aW9uDQorCQkJew0KKwkJCQlpbnQgc3ltYm9sID0gMTsNCisJCQkJZG8NCisJCQkJCXN5bWJvbCA9IChzeW1ib2wgPDwgMSkgfCByYW5nZURlY29kZXIuRGVjb2RlQml0KG1fRGVjb2RlcnMsIHN5bWJvbCk7DQorCQkJCXdoaWxlIChzeW1ib2wgPCAweDEwMCk7DQorCQkJCXJldHVybiAoYnl0ZSlzeW1ib2w7DQorCQkJfQ0KKwkJCQ0KKwkJCXB1YmxpYyBieXRlIERlY29kZVdpdGhNYXRjaEJ5dGUoU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5EZWNvZGVyIHJhbmdlRGVjb2RlciwgYnl0ZSBtYXRjaEJ5dGUpIHRocm93cyBJT0V4Y2VwdGlvbg0KKwkJCXsNCisJCQkJaW50IHN5bWJvbCA9IDE7DQorCQkJCWRvDQorCQkJCXsNCisJCQkJCWludCBtYXRjaEJpdCA9IChtYXRjaEJ5dGUgPj4gNykgJiAxOw0KKwkJCQkJbWF0Y2hCeXRlIDw8PSAxOw0KKwkJCQkJaW50IGJpdCA9IHJhbmdlRGVjb2Rlci5EZWNvZGVCaXQobV9EZWNvZGVycywgKCgxICsgbWF0Y2hCaXQpIDw8IDgpICsgc3ltYm9sKTsNCisJCQkJCXN5bWJvbCA9IChzeW1ib2wgPDwgMSkgfCBiaXQ7DQorCQkJCQlpZiAobWF0Y2hCaXQgIT0gYml0KQ0KKwkJCQkJew0KKwkJCQkJCXdoaWxlIChzeW1ib2wgPCAweDEwMCkNCisJCQkJCQkJc3ltYm9sID0gKHN5bWJvbCA8PCAxKSB8IHJhbmdlRGVjb2Rlci5EZWNvZGVCaXQobV9EZWNvZGVycywgc3ltYm9sKTsNCisJCQkJCQlicmVhazsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQl3aGlsZSAoc3ltYm9sIDwgMHgxMDApOw0KKwkJCQlyZXR1cm4gKGJ5dGUpc3ltYm9sOw0KKwkJCX0NCisJCX0NCisJCQ0KKwkJRGVjb2RlcjJbXSBtX0NvZGVyczsNCisJCWludCBtX051bVByZXZCaXRzOw0KKwkJaW50IG1fTnVtUG9zQml0czsNCisJCWludCBtX1Bvc01hc2s7DQorCQkNCisJCXB1YmxpYyB2b2lkIENyZWF0ZShpbnQgbnVtUG9zQml0cywgaW50IG51bVByZXZCaXRzKQ0KKwkJew0KKwkJCWlmIChtX0NvZGVycyAhPSBudWxsICYmIG1fTnVtUHJldkJpdHMgPT0gbnVtUHJldkJpdHMgJiYgbV9OdW1Qb3NCaXRzID09IG51bVBvc0JpdHMpDQorCQkJCXJldHVybjsNCisJCQltX051bVBvc0JpdHMgPSBudW1Qb3NCaXRzOw0KKwkJCW1fUG9zTWFzayA9ICgxIDw8IG51bVBvc0JpdHMpIC0gMTsNCisJCQltX051bVByZXZCaXRzID0gbnVtUHJldkJpdHM7DQorCQkJaW50IG51bVN0YXRlcyA9IDEgPDwgKG1fTnVtUHJldkJpdHMgKyBtX051bVBvc0JpdHMpOw0KKwkJCW1fQ29kZXJzID0gbmV3IERlY29kZXIyW251bVN0YXRlc107DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TdGF0ZXM7IGkrKykNCisJCQkJbV9Db2RlcnNbaV0gPSBuZXcgRGVjb2RlcjIoKTsNCisJCX0NCisJCQ0KKwkJcHVibGljIHZvaWQgSW5pdCgpDQorCQl7DQorCQkJaW50IG51bVN0YXRlcyA9IDEgPDwgKG1fTnVtUHJldkJpdHMgKyBtX051bVBvc0JpdHMpOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtU3RhdGVzOyBpKyspDQorCQkJCW1fQ29kZXJzW2ldLkluaXQoKTsNCisJCX0NCisJCQ0KKwkJRGVjb2RlcjIgR2V0RGVjb2RlcihpbnQgcG9zLCBieXRlIHByZXZCeXRlKQ0KKwkJew0KKwkJCXJldHVybiBtX0NvZGVyc1soKHBvcyAmIG1fUG9zTWFzaykgPDwgbV9OdW1QcmV2Qml0cykgKyAoKHByZXZCeXRlICYgMHhGRikgPj4+ICg4IC0gbV9OdW1QcmV2Qml0cykpXTsNCisJCX0NCisJfQ0KKwkNCisJT3V0V2luZG93IG1fT3V0V2luZG93ID0gbmV3IE91dFdpbmRvdygpOw0KKwlTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkRlY29kZXIgbV9SYW5nZURlY29kZXIgPSBuZXcgU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5EZWNvZGVyKCk7DQorCQ0KKwlzaG9ydFtdIG1fSXNNYXRjaERlY29kZXJzID0gbmV3IHNob3J0W0Jhc2Uua051bVN0YXRlcyA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4XTsNCisJc2hvcnRbXSBtX0lzUmVwRGVjb2RlcnMgPSBuZXcgc2hvcnRbQmFzZS5rTnVtU3RhdGVzXTsNCisJc2hvcnRbXSBtX0lzUmVwRzBEZWNvZGVycyA9IG5ldyBzaG9ydFtCYXNlLmtOdW1TdGF0ZXNdOw0KKwlzaG9ydFtdIG1fSXNSZXBHMURlY29kZXJzID0gbmV3IHNob3J0W0Jhc2Uua051bVN0YXRlc107DQorCXNob3J0W10gbV9Jc1JlcEcyRGVjb2RlcnMgPSBuZXcgc2hvcnRbQmFzZS5rTnVtU3RhdGVzXTsNCisJc2hvcnRbXSBtX0lzUmVwMExvbmdEZWNvZGVycyA9IG5ldyBzaG9ydFtCYXNlLmtOdW1TdGF0ZXMgPDwgQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heF07DQorCQ0KKwlCaXRUcmVlRGVjb2RlcltdIG1fUG9zU2xvdERlY29kZXIgPSBuZXcgQml0VHJlZURlY29kZXJbQmFzZS5rTnVtTGVuVG9Qb3NTdGF0ZXNdOw0KKwlzaG9ydFtdIG1fUG9zRGVjb2RlcnMgPSBuZXcgc2hvcnRbQmFzZS5rTnVtRnVsbERpc3RhbmNlcyAtIEJhc2Uua0VuZFBvc01vZGVsSW5kZXhdOw0KKwkNCisJQml0VHJlZURlY29kZXIgbV9Qb3NBbGlnbkRlY29kZXIgPSBuZXcgQml0VHJlZURlY29kZXIoQmFzZS5rTnVtQWxpZ25CaXRzKTsNCisJDQorCUxlbkRlY29kZXIgbV9MZW5EZWNvZGVyID0gbmV3IExlbkRlY29kZXIoKTsNCisJTGVuRGVjb2RlciBtX1JlcExlbkRlY29kZXIgPSBuZXcgTGVuRGVjb2RlcigpOw0KKwkNCisJTGl0ZXJhbERlY29kZXIgbV9MaXRlcmFsRGVjb2RlciA9IG5ldyBMaXRlcmFsRGVjb2RlcigpOw0KKwkNCisJaW50IG1fRGljdGlvbmFyeVNpemUgPSAtMTsNCisJaW50IG1fRGljdGlvbmFyeVNpemVDaGVjayA9ICAtMTsNCisJDQorCWludCBtX1Bvc1N0YXRlTWFzazsNCisJDQorCXB1YmxpYyBEZWNvZGVyKCkNCisJew0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBCYXNlLmtOdW1MZW5Ub1Bvc1N0YXRlczsgaSsrKQ0KKwkJCW1fUG9zU2xvdERlY29kZXJbaV0gPSBuZXcgQml0VHJlZURlY29kZXIoQmFzZS5rTnVtUG9zU2xvdEJpdHMpOw0KKwl9DQorCQ0KKwlib29sZWFuIFNldERpY3Rpb25hcnlTaXplKGludCBkaWN0aW9uYXJ5U2l6ZSkNCisJew0KKwkJaWYgKGRpY3Rpb25hcnlTaXplIDwgMCkNCisJCQlyZXR1cm4gZmFsc2U7DQorCQlpZiAobV9EaWN0aW9uYXJ5U2l6ZSAhPSBkaWN0aW9uYXJ5U2l6ZSkNCisJCXsNCisJCQltX0RpY3Rpb25hcnlTaXplID0gZGljdGlvbmFyeVNpemU7DQorCQkJbV9EaWN0aW9uYXJ5U2l6ZUNoZWNrID0gTWF0aC5tYXgobV9EaWN0aW9uYXJ5U2l6ZSwgMSk7DQorCQkJbV9PdXRXaW5kb3cuQ3JlYXRlKE1hdGgubWF4KG1fRGljdGlvbmFyeVNpemVDaGVjaywgKDEgPDwgMTIpKSk7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKwkNCisJYm9vbGVhbiBTZXRMY0xwUGIoaW50IGxjLCBpbnQgbHAsIGludCBwYikNCisJew0KKwkJaWYgKGxjID4gQmFzZS5rTnVtTGl0Q29udGV4dEJpdHNNYXggfHwgbHAgPiA0IHx8IHBiID4gQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heCkNCisJCQlyZXR1cm4gZmFsc2U7DQorCQltX0xpdGVyYWxEZWNvZGVyLkNyZWF0ZShscCwgbGMpOw0KKwkJaW50IG51bVBvc1N0YXRlcyA9IDEgPDwgcGI7DQorCQltX0xlbkRlY29kZXIuQ3JlYXRlKG51bVBvc1N0YXRlcyk7DQorCQltX1JlcExlbkRlY29kZXIuQ3JlYXRlKG51bVBvc1N0YXRlcyk7DQorCQltX1Bvc1N0YXRlTWFzayA9IG51bVBvc1N0YXRlcyAtIDE7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKwkNCisJdm9pZCBJbml0KCkgdGhyb3dzIElPRXhjZXB0aW9uDQorCXsNCisJCW1fT3V0V2luZG93LkluaXQoZmFsc2UpOw0KKwkJDQorCQlTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkRlY29kZXIuSW5pdEJpdE1vZGVscyhtX0lzTWF0Y2hEZWNvZGVycyk7DQorCQlTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkRlY29kZXIuSW5pdEJpdE1vZGVscyhtX0lzUmVwMExvbmdEZWNvZGVycyk7DQorCQlTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkRlY29kZXIuSW5pdEJpdE1vZGVscyhtX0lzUmVwRGVjb2RlcnMpOw0KKwkJU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5EZWNvZGVyLkluaXRCaXRNb2RlbHMobV9Jc1JlcEcwRGVjb2RlcnMpOw0KKwkJU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5EZWNvZGVyLkluaXRCaXRNb2RlbHMobV9Jc1JlcEcxRGVjb2RlcnMpOw0KKwkJU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5EZWNvZGVyLkluaXRCaXRNb2RlbHMobV9Jc1JlcEcyRGVjb2RlcnMpOw0KKwkJU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5EZWNvZGVyLkluaXRCaXRNb2RlbHMobV9Qb3NEZWNvZGVycyk7DQorCQkNCisJCW1fTGl0ZXJhbERlY29kZXIuSW5pdCgpOw0KKwkJaW50IGk7DQorCQlmb3IgKGkgPSAwOyBpIDwgQmFzZS5rTnVtTGVuVG9Qb3NTdGF0ZXM7IGkrKykNCisJCQltX1Bvc1Nsb3REZWNvZGVyW2ldLkluaXQoKTsNCisJCW1fTGVuRGVjb2Rlci5Jbml0KCk7DQorCQltX1JlcExlbkRlY29kZXIuSW5pdCgpOw0KKwkJbV9Qb3NBbGlnbkRlY29kZXIuSW5pdCgpOw0KKwkJbV9SYW5nZURlY29kZXIuSW5pdCgpOw0KKwl9DQorCQ0KKwlwdWJsaWMgYm9vbGVhbiBDb2RlKGphdmEuaW8uSW5wdXRTdHJlYW0gaW5TdHJlYW0sIGphdmEuaW8uT3V0cHV0U3RyZWFtIG91dFN0cmVhbSwNCisJCQlsb25nIG91dFNpemUpIHRocm93cyBJT0V4Y2VwdGlvbg0KKwl7DQorCQltX1JhbmdlRGVjb2Rlci5TZXRTdHJlYW0oaW5TdHJlYW0pOw0KKwkJbV9PdXRXaW5kb3cuU2V0U3RyZWFtKG91dFN0cmVhbSk7DQorCQlJbml0KCk7DQorCQkNCisJCWludCBzdGF0ZSA9IEJhc2UuU3RhdGVJbml0KCk7DQorCQlpbnQgcmVwMCA9IDAsIHJlcDEgPSAwLCByZXAyID0gMCwgcmVwMyA9IDA7DQorCQkNCisJCWxvbmcgbm93UG9zNjQgPSAwOw0KKwkJYnl0ZSBwcmV2Qnl0ZSA9IDA7DQorCQl3aGlsZSAob3V0U2l6ZSA8IDAgfHwgbm93UG9zNjQgPCBvdXRTaXplKQ0KKwkJew0KKwkJCWludCBwb3NTdGF0ZSA9IChpbnQpbm93UG9zNjQgJiBtX1Bvc1N0YXRlTWFzazsNCisJCQlpZiAobV9SYW5nZURlY29kZXIuRGVjb2RlQml0KG1fSXNNYXRjaERlY29kZXJzLCAoc3RhdGUgPDwgQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heCkgKyBwb3NTdGF0ZSkgPT0gMCkNCisJCQl7DQorCQkJCUxpdGVyYWxEZWNvZGVyLkRlY29kZXIyIGRlY29kZXIyID0gbV9MaXRlcmFsRGVjb2Rlci5HZXREZWNvZGVyKChpbnQpbm93UG9zNjQsIHByZXZCeXRlKTsNCisJCQkJaWYgKCFCYXNlLlN0YXRlSXNDaGFyU3RhdGUoc3RhdGUpKQ0KKwkJCQkJcHJldkJ5dGUgPSBkZWNvZGVyMi5EZWNvZGVXaXRoTWF0Y2hCeXRlKG1fUmFuZ2VEZWNvZGVyLCBtX091dFdpbmRvdy5HZXRCeXRlKHJlcDApKTsNCisJCQkJZWxzZQ0KKwkJCQkJcHJldkJ5dGUgPSBkZWNvZGVyMi5EZWNvZGVOb3JtYWwobV9SYW5nZURlY29kZXIpOw0KKwkJCQltX091dFdpbmRvdy5QdXRCeXRlKHByZXZCeXRlKTsNCisJCQkJc3RhdGUgPSBCYXNlLlN0YXRlVXBkYXRlQ2hhcihzdGF0ZSk7DQorCQkJCW5vd1BvczY0Kys7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCWludCBsZW47DQorCQkJCWlmIChtX1JhbmdlRGVjb2Rlci5EZWNvZGVCaXQobV9Jc1JlcERlY29kZXJzLCBzdGF0ZSkgPT0gMSkNCisJCQkJew0KKwkJCQkJbGVuID0gMDsNCisJCQkJCWlmIChtX1JhbmdlRGVjb2Rlci5EZWNvZGVCaXQobV9Jc1JlcEcwRGVjb2RlcnMsIHN0YXRlKSA9PSAwKQ0KKwkJCQkJew0KKwkJCQkJCWlmIChtX1JhbmdlRGVjb2Rlci5EZWNvZGVCaXQobV9Jc1JlcDBMb25nRGVjb2RlcnMsIChzdGF0ZSA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlKSA9PSAwKQ0KKwkJCQkJCXsNCisJCQkJCQkJc3RhdGUgPSBCYXNlLlN0YXRlVXBkYXRlU2hvcnRSZXAoc3RhdGUpOw0KKwkJCQkJCQlsZW4gPSAxOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQlpbnQgZGlzdGFuY2U7DQorCQkJCQkJaWYgKG1fUmFuZ2VEZWNvZGVyLkRlY29kZUJpdChtX0lzUmVwRzFEZWNvZGVycywgc3RhdGUpID09IDApDQorCQkJCQkJCWRpc3RhbmNlID0gcmVwMTsNCisJCQkJCQllbHNlDQorCQkJCQkJew0KKwkJCQkJCQlpZiAobV9SYW5nZURlY29kZXIuRGVjb2RlQml0KG1fSXNSZXBHMkRlY29kZXJzLCBzdGF0ZSkgPT0gMCkNCisJCQkJCQkJCWRpc3RhbmNlID0gcmVwMjsNCisJCQkJCQkJZWxzZQ0KKwkJCQkJCQl7DQorCQkJCQkJCQlkaXN0YW5jZSA9IHJlcDM7DQorCQkJCQkJCQlyZXAzID0gcmVwMjsNCisJCQkJCQkJfQ0KKwkJCQkJCQlyZXAyID0gcmVwMTsNCisJCQkJCQl9DQorCQkJCQkJcmVwMSA9IHJlcDA7DQorCQkJCQkJcmVwMCA9IGRpc3RhbmNlOw0KKwkJCQkJfQ0KKwkJCQkJaWYgKGxlbiA9PSAwKQ0KKwkJCQkJew0KKwkJCQkJCWxlbiA9IG1fUmVwTGVuRGVjb2Rlci5EZWNvZGUobV9SYW5nZURlY29kZXIsIHBvc1N0YXRlKSArIEJhc2Uua01hdGNoTWluTGVuOw0KKwkJCQkJCXN0YXRlID0gQmFzZS5TdGF0ZVVwZGF0ZVJlcChzdGF0ZSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlyZXAzID0gcmVwMjsNCisJCQkJCXJlcDIgPSByZXAxOw0KKwkJCQkJcmVwMSA9IHJlcDA7DQorCQkJCQlsZW4gPSBCYXNlLmtNYXRjaE1pbkxlbiArIG1fTGVuRGVjb2Rlci5EZWNvZGUobV9SYW5nZURlY29kZXIsIHBvc1N0YXRlKTsNCisJCQkJCXN0YXRlID0gQmFzZS5TdGF0ZVVwZGF0ZU1hdGNoKHN0YXRlKTsNCisJCQkJCWludCBwb3NTbG90ID0gbV9Qb3NTbG90RGVjb2RlcltCYXNlLkdldExlblRvUG9zU3RhdGUobGVuKV0uRGVjb2RlKG1fUmFuZ2VEZWNvZGVyKTsNCisJCQkJCWlmIChwb3NTbG90ID49IEJhc2Uua1N0YXJ0UG9zTW9kZWxJbmRleCkNCisJCQkJCXsNCisJCQkJCQlpbnQgbnVtRGlyZWN0Qml0cyA9IChwb3NTbG90ID4+IDEpIC0gMTsNCisJCQkJCQlyZXAwID0gKCgyIHwgKHBvc1Nsb3QgJiAxKSkgPDwgbnVtRGlyZWN0Qml0cyk7DQorCQkJCQkJaWYgKHBvc1Nsb3QgPCBCYXNlLmtFbmRQb3NNb2RlbEluZGV4KQ0KKwkJCQkJCQlyZXAwICs9IEJpdFRyZWVEZWNvZGVyLlJldmVyc2VEZWNvZGUobV9Qb3NEZWNvZGVycywNCisJCQkJCQkJCQlyZXAwIC0gcG9zU2xvdCAtIDEsIG1fUmFuZ2VEZWNvZGVyLCBudW1EaXJlY3RCaXRzKTsNCisJCQkJCQllbHNlDQorCQkJCQkJew0KKwkJCQkJCQlyZXAwICs9IChtX1JhbmdlRGVjb2Rlci5EZWNvZGVEaXJlY3RCaXRzKA0KKwkJCQkJCQkJCW51bURpcmVjdEJpdHMgLSBCYXNlLmtOdW1BbGlnbkJpdHMpIDw8IEJhc2Uua051bUFsaWduQml0cyk7DQorCQkJCQkJCXJlcDAgKz0gbV9Qb3NBbGlnbkRlY29kZXIuUmV2ZXJzZURlY29kZShtX1JhbmdlRGVjb2Rlcik7DQorCQkJCQkJCWlmIChyZXAwIDwgMCkNCisJCQkJCQkJew0KKwkJCQkJCQkJaWYgKHJlcDAgPT0gLTEpDQorCQkJCQkJCQkJYnJlYWs7DQorCQkJCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCQkJCX0NCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCQllbHNlDQorCQkJCQkJcmVwMCA9IHBvc1Nsb3Q7DQorCQkJCX0NCisJCQkJaWYgKHJlcDAgPj0gbm93UG9zNjQgfHwgcmVwMCA+PSBtX0RpY3Rpb25hcnlTaXplQ2hlY2spDQorCQkJCXsNCisJCQkJCS8vIG1fT3V0V2luZG93LkZsdXNoKCk7DQorCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCX0NCisJCQkJbV9PdXRXaW5kb3cuQ29weUJsb2NrKHJlcDAsIGxlbik7DQorCQkJCW5vd1BvczY0ICs9IGxlbjsNCisJCQkJcHJldkJ5dGUgPSBtX091dFdpbmRvdy5HZXRCeXRlKDApOw0KKwkJCX0NCisJCX0NCisJCW1fT3V0V2luZG93LkZsdXNoKCk7DQorCQltX091dFdpbmRvdy5SZWxlYXNlU3RyZWFtKCk7DQorCQltX1JhbmdlRGVjb2Rlci5SZWxlYXNlU3RyZWFtKCk7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKwkNCisJcHVibGljIGJvb2xlYW4gU2V0RGVjb2RlclByb3BlcnRpZXMoYnl0ZVtdIHByb3BlcnRpZXMpDQorCXsNCisJCWlmIChwcm9wZXJ0aWVzLmxlbmd0aCA8IDUpDQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJaW50IHZhbCA9IHByb3BlcnRpZXNbMF0gJiAweEZGOw0KKwkJaW50IGxjID0gdmFsICUgOTsNCisJCWludCByZW1haW5kZXIgPSB2YWwgLyA5Ow0KKwkJaW50IGxwID0gcmVtYWluZGVyICUgNTsNCisJCWludCBwYiA9IHJlbWFpbmRlciAvIDU7DQorCQlpbnQgZGljdGlvbmFyeVNpemUgPSAwOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspDQorCQkJZGljdGlvbmFyeVNpemUgKz0gKChpbnQpKHByb3BlcnRpZXNbMSArIGldKSAmIDB4RkYpIDw8IChpICogOCk7DQorCQlpZiAoIVNldExjTHBQYihsYywgbHAsIHBiKSkNCisJCQlyZXR1cm4gZmFsc2U7DQorCQlyZXR1cm4gU2V0RGljdGlvbmFyeVNpemUoZGljdGlvbmFyeVNpemUpOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9TZXZlblppcC9Db21wcmVzc2lvbi9MWk1BL0VuY29kZXIuamF2YSBiL2x6bWEvSmF2YS9TZXZlblppcC9Db21wcmVzc2lvbi9MWk1BL0VuY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzFmYjIxCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1NldmVuWmlwL0NvbXByZXNzaW9uL0xaTUEvRW5jb2Rlci5qYXZhCkBAIC0wLDAgKzEsMTQxNiBAQAorcGFja2FnZSBTZXZlblppcC5Db21wcmVzc2lvbi5MWk1BOw0KKw0KK2ltcG9ydCBTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkJpdFRyZWVFbmNvZGVyOw0KK2ltcG9ydCBTZXZlblppcC5Db21wcmVzc2lvbi5MWk1BLkJhc2U7DQoraW1wb3J0IFNldmVuWmlwLkNvbXByZXNzaW9uLkxaLkJpblRyZWU7DQoraW1wb3J0IFNldmVuWmlwLklDb2RlUHJvZ3Jlc3M7DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQorDQorcHVibGljIGNsYXNzIEVuY29kZXINCit7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVNYXRjaEZpbmRlclR5cGVCVDIgPSAwOw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTWF0Y2hGaW5kZXJUeXBlQlQ0ID0gMTsNCisNCisNCisNCisNCisJc3RhdGljIGZpbmFsIGludCBrSWZpbml0eVByaWNlID0gMHhGRkZGRkZGOw0KKw0KKwlzdGF0aWMgYnl0ZVtdIGdfRmFzdFBvcyA9IG5ldyBieXRlWzEgPDwgMTFdOw0KKw0KKwlzdGF0aWMNCisJew0KKwkJaW50IGtGYXN0U2xvdHMgPSAyMjsNCisJCWludCBjID0gMjsNCisJCWdfRmFzdFBvc1swXSA9IDA7DQorCQlnX0Zhc3RQb3NbMV0gPSAxOw0KKwkJZm9yIChpbnQgc2xvdEZhc3QgPSAyOyBzbG90RmFzdCA8IGtGYXN0U2xvdHM7IHNsb3RGYXN0KyspDQorCQl7DQorCQkJaW50IGsgPSAoMSA8PCAoKHNsb3RGYXN0ID4+IDEpIC0gMSkpOw0KKwkJCWZvciAoaW50IGogPSAwOyBqIDwgazsgaisrLCBjKyspDQorCQkJCWdfRmFzdFBvc1tjXSA9IChieXRlKXNsb3RGYXN0Ow0KKwkJfQ0KKwl9DQorDQorCXN0YXRpYyBpbnQgR2V0UG9zU2xvdChpbnQgcG9zKQ0KKwl7DQorCQlpZiAocG9zIDwgKDEgPDwgMTEpKQ0KKwkJCXJldHVybiBnX0Zhc3RQb3NbcG9zXTsNCisJCWlmIChwb3MgPCAoMSA8PCAyMSkpDQorCQkJcmV0dXJuIChnX0Zhc3RQb3NbcG9zID4+IDEwXSArIDIwKTsNCisJCXJldHVybiAoZ19GYXN0UG9zW3BvcyA+PiAyMF0gKyA0MCk7DQorCX0NCisNCisJc3RhdGljIGludCBHZXRQb3NTbG90MihpbnQgcG9zKQ0KKwl7DQorCQlpZiAocG9zIDwgKDEgPDwgMTcpKQ0KKwkJCXJldHVybiAoZ19GYXN0UG9zW3BvcyA+PiA2XSArIDEyKTsNCisJCWlmIChwb3MgPCAoMSA8PCAyNykpDQorCQkJcmV0dXJuIChnX0Zhc3RQb3NbcG9zID4+IDE2XSArIDMyKTsNCisJCXJldHVybiAoZ19GYXN0UG9zW3BvcyA+PiAyNl0gKyA1Mik7DQorCX0NCisNCisJaW50IF9zdGF0ZSA9IEJhc2UuU3RhdGVJbml0KCk7DQorCWJ5dGUgX3ByZXZpb3VzQnl0ZTsNCisJaW50W10gX3JlcERpc3RhbmNlcyA9IG5ldyBpbnRbQmFzZS5rTnVtUmVwRGlzdGFuY2VzXTsNCisNCisJdm9pZCBCYXNlSW5pdCgpDQorCXsNCisJCV9zdGF0ZSA9IEJhc2UuU3RhdGVJbml0KCk7DQorCQlfcHJldmlvdXNCeXRlID0gMDsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgQmFzZS5rTnVtUmVwRGlzdGFuY2VzOyBpKyspDQorCQkJX3JlcERpc3RhbmNlc1tpXSA9IDA7DQorCX0NCisNCisJc3RhdGljIGZpbmFsIGludCBrRGVmYXVsdERpY3Rpb25hcnlMb2dTaXplID0gMjI7DQorCXN0YXRpYyBmaW5hbCBpbnQga051bUZhc3RCeXRlc0RlZmF1bHQgPSAweDIwOw0KKw0KKwljbGFzcyBMaXRlcmFsRW5jb2Rlcg0KKwl7DQorCQljbGFzcyBFbmNvZGVyMg0KKwkJew0KKwkJCXNob3J0W10gbV9FbmNvZGVycyA9IG5ldyBzaG9ydFsweDMwMF07DQorDQorCQkJcHVibGljIHZvaWQgSW5pdCgpIHsgU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkluaXRCaXRNb2RlbHMobV9FbmNvZGVycyk7IH0NCisNCisNCisNCisJCQlwdWJsaWMgdm9pZCBFbmNvZGUoU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyIHJhbmdlRW5jb2RlciwgYnl0ZSBzeW1ib2wpIHRocm93cyBJT0V4Y2VwdGlvbg0KKwkJCXsNCisJCQkJaW50IGNvbnRleHQgPSAxOw0KKwkJCQlmb3IgKGludCBpID0gNzsgaSA+PSAwOyBpLS0pDQorCQkJCXsNCisJCQkJCWludCBiaXQgPSAoKHN5bWJvbCA+PiBpKSAmIDEpOw0KKwkJCQkJcmFuZ2VFbmNvZGVyLkVuY29kZShtX0VuY29kZXJzLCBjb250ZXh0LCBiaXQpOw0KKwkJCQkJY29udGV4dCA9IChjb250ZXh0IDw8IDEpIHwgYml0Ow0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCXB1YmxpYyB2b2lkIEVuY29kZU1hdGNoZWQoU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyIHJhbmdlRW5jb2RlciwgYnl0ZSBtYXRjaEJ5dGUsIGJ5dGUgc3ltYm9sKSB0aHJvd3MgSU9FeGNlcHRpb24NCisJCQl7DQorCQkJCWludCBjb250ZXh0ID0gMTsNCisJCQkJYm9vbGVhbiBzYW1lID0gdHJ1ZTsNCisJCQkJZm9yIChpbnQgaSA9IDc7IGkgPj0gMDsgaS0tKQ0KKwkJCQl7DQorCQkJCQlpbnQgYml0ID0gKChzeW1ib2wgPj4gaSkgJiAxKTsNCisJCQkJCWludCBzdGF0ZSA9IGNvbnRleHQ7DQorCQkJCQlpZiAoc2FtZSkNCisJCQkJCXsNCisJCQkJCQlpbnQgbWF0Y2hCaXQgPSAoKG1hdGNoQnl0ZSA+PiBpKSAmIDEpOw0KKwkJCQkJCXN0YXRlICs9ICgoMSArIG1hdGNoQml0KSA8PCA4KTsNCisJCQkJCQlzYW1lID0gKG1hdGNoQml0ID09IGJpdCk7DQorCQkJCQl9DQorCQkJCQlyYW5nZUVuY29kZXIuRW5jb2RlKG1fRW5jb2RlcnMsIHN0YXRlLCBiaXQpOw0KKwkJCQkJY29udGV4dCA9IChjb250ZXh0IDw8IDEpIHwgYml0Ow0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCXB1YmxpYyBpbnQgR2V0UHJpY2UoYm9vbGVhbiBtYXRjaE1vZGUsIGJ5dGUgbWF0Y2hCeXRlLCBieXRlIHN5bWJvbCkNCisJCQl7DQorCQkJCWludCBwcmljZSA9IDA7DQorCQkJCWludCBjb250ZXh0ID0gMTsNCisJCQkJaW50IGkgPSA3Ow0KKwkJCQlpZiAobWF0Y2hNb2RlKQ0KKwkJCQl7DQorCQkJCQlmb3IgKDsgaSA+PSAwOyBpLS0pDQorCQkJCQl7DQorCQkJCQkJaW50IG1hdGNoQml0ID0gKG1hdGNoQnl0ZSA+PiBpKSAmIDE7DQorCQkJCQkJaW50IGJpdCA9IChzeW1ib2wgPj4gaSkgJiAxOw0KKwkJCQkJCXByaWNlICs9IFNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZShtX0VuY29kZXJzWygoMSArIG1hdGNoQml0KSA8PCA4KSArIGNvbnRleHRdLCBiaXQpOw0KKwkJCQkJCWNvbnRleHQgPSAoY29udGV4dCA8PCAxKSB8IGJpdDsNCisJCQkJCQlpZiAobWF0Y2hCaXQgIT0gYml0KQ0KKwkJCQkJCXsNCisJCQkJCQkJaS0tOw0KKwkJCQkJCQlicmVhazsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZm9yICg7IGkgPj0gMDsgaS0tKQ0KKwkJCQl7DQorCQkJCQlpbnQgYml0ID0gKHN5bWJvbCA+PiBpKSAmIDE7DQorCQkJCQlwcmljZSArPSBTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkVuY29kZXIuR2V0UHJpY2UobV9FbmNvZGVyc1tjb250ZXh0XSwgYml0KTsNCisJCQkJCWNvbnRleHQgPSAoY29udGV4dCA8PCAxKSB8IGJpdDsNCisJCQkJfQ0KKwkJCQlyZXR1cm4gcHJpY2U7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJRW5jb2RlcjJbXSBtX0NvZGVyczsNCisJCWludCBtX051bVByZXZCaXRzOw0KKwkJaW50IG1fTnVtUG9zQml0czsNCisJCWludCBtX1Bvc01hc2s7DQorDQorCQlwdWJsaWMgdm9pZCBDcmVhdGUoaW50IG51bVBvc0JpdHMsIGludCBudW1QcmV2Qml0cykNCisJCXsNCisJCQlpZiAobV9Db2RlcnMgIT0gbnVsbCAmJiBtX051bVByZXZCaXRzID09IG51bVByZXZCaXRzICYmIG1fTnVtUG9zQml0cyA9PSBudW1Qb3NCaXRzKQ0KKwkJCQlyZXR1cm47DQorCQkJbV9OdW1Qb3NCaXRzID0gbnVtUG9zQml0czsNCisJCQltX1Bvc01hc2sgPSAoMSA8PCBudW1Qb3NCaXRzKSAtIDE7DQorCQkJbV9OdW1QcmV2Qml0cyA9IG51bVByZXZCaXRzOw0KKwkJCWludCBudW1TdGF0ZXMgPSAxIDw8IChtX051bVByZXZCaXRzICsgbV9OdW1Qb3NCaXRzKTsNCisJCQltX0NvZGVycyA9IG5ldyBFbmNvZGVyMltudW1TdGF0ZXNdOw0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtU3RhdGVzOyBpKyspDQorCQkJCW1fQ29kZXJzW2ldID0gbmV3IEVuY29kZXIyKCk7DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBJbml0KCkNCisJCXsNCisJCQlpbnQgbnVtU3RhdGVzID0gMSA8PCAobV9OdW1QcmV2Qml0cyArIG1fTnVtUG9zQml0cyk7DQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TdGF0ZXM7IGkrKykNCisJCQkJbV9Db2RlcnNbaV0uSW5pdCgpOw0KKwkJfQ0KKw0KKwkJcHVibGljIEVuY29kZXIyIEdldFN1YkNvZGVyKGludCBwb3MsIGJ5dGUgcHJldkJ5dGUpDQorCQl7IHJldHVybiBtX0NvZGVyc1soKHBvcyAmIG1fUG9zTWFzaykgPDwgbV9OdW1QcmV2Qml0cykgKyAoKHByZXZCeXRlICYgMHhGRikgPj4+ICg4IC0gbV9OdW1QcmV2Qml0cykpXTsgfQ0KKwl9DQorDQorCWNsYXNzIExlbkVuY29kZXINCisJew0KKwkJc2hvcnRbXSBfY2hvaWNlID0gbmV3IHNob3J0WzJdOw0KKwkJQml0VHJlZUVuY29kZXJbXSBfbG93Q29kZXIgPSBuZXcgQml0VHJlZUVuY29kZXJbQmFzZS5rTnVtUG9zU3RhdGVzRW5jb2RpbmdNYXhdOw0KKwkJQml0VHJlZUVuY29kZXJbXSBfbWlkQ29kZXIgPSBuZXcgQml0VHJlZUVuY29kZXJbQmFzZS5rTnVtUG9zU3RhdGVzRW5jb2RpbmdNYXhdOw0KKwkJQml0VHJlZUVuY29kZXIgX2hpZ2hDb2RlciA9IG5ldyBCaXRUcmVlRW5jb2RlcihCYXNlLmtOdW1IaWdoTGVuQml0cyk7DQorDQorDQorCQlwdWJsaWMgTGVuRW5jb2RlcigpDQorCQl7DQorCQkJZm9yIChpbnQgcG9zU3RhdGUgPSAwOyBwb3NTdGF0ZSA8IEJhc2Uua051bVBvc1N0YXRlc0VuY29kaW5nTWF4OyBwb3NTdGF0ZSsrKQ0KKwkJCXsNCisJCQkJX2xvd0NvZGVyW3Bvc1N0YXRlXSA9IG5ldyBCaXRUcmVlRW5jb2RlcihCYXNlLmtOdW1Mb3dMZW5CaXRzKTsNCisJCQkJX21pZENvZGVyW3Bvc1N0YXRlXSA9IG5ldyBCaXRUcmVlRW5jb2RlcihCYXNlLmtOdW1NaWRMZW5CaXRzKTsNCisJCQl9DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBJbml0KGludCBudW1Qb3NTdGF0ZXMpDQorCQl7DQorCQkJU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkluaXRCaXRNb2RlbHMoX2Nob2ljZSk7DQorDQorCQkJZm9yIChpbnQgcG9zU3RhdGUgPSAwOyBwb3NTdGF0ZSA8IG51bVBvc1N0YXRlczsgcG9zU3RhdGUrKykNCisJCQl7DQorCQkJCV9sb3dDb2Rlcltwb3NTdGF0ZV0uSW5pdCgpOw0KKwkJCQlfbWlkQ29kZXJbcG9zU3RhdGVdLkluaXQoKTsNCisJCQl9DQorCQkJX2hpZ2hDb2Rlci5Jbml0KCk7DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBFbmNvZGUoU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyIHJhbmdlRW5jb2RlciwgaW50IHN5bWJvbCwgaW50IHBvc1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24NCisJCXsNCisJCQlpZiAoc3ltYm9sIDwgQmFzZS5rTnVtTG93TGVuU3ltYm9scykNCisJCQl7DQorCQkJCXJhbmdlRW5jb2Rlci5FbmNvZGUoX2Nob2ljZSwgMCwgMCk7DQorCQkJCV9sb3dDb2Rlcltwb3NTdGF0ZV0uRW5jb2RlKHJhbmdlRW5jb2Rlciwgc3ltYm9sKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJc3ltYm9sIC09IEJhc2Uua051bUxvd0xlblN5bWJvbHM7DQorCQkJCXJhbmdlRW5jb2Rlci5FbmNvZGUoX2Nob2ljZSwgMCwgMSk7DQorCQkJCWlmIChzeW1ib2wgPCBCYXNlLmtOdW1NaWRMZW5TeW1ib2xzKQ0KKwkJCQl7DQorCQkJCQlyYW5nZUVuY29kZXIuRW5jb2RlKF9jaG9pY2UsIDEsIDApOw0KKwkJCQkJX21pZENvZGVyW3Bvc1N0YXRlXS5FbmNvZGUocmFuZ2VFbmNvZGVyLCBzeW1ib2wpOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJcmFuZ2VFbmNvZGVyLkVuY29kZShfY2hvaWNlLCAxLCAxKTsNCisJCQkJCV9oaWdoQ29kZXIuRW5jb2RlKHJhbmdlRW5jb2Rlciwgc3ltYm9sIC0gQmFzZS5rTnVtTWlkTGVuU3ltYm9scyk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBTZXRQcmljZXMoaW50IHBvc1N0YXRlLCBpbnQgbnVtU3ltYm9scywgaW50W10gcHJpY2VzLCBpbnQgc3QpDQorCQl7DQorCQkJaW50IGEwID0gU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkdldFByaWNlMChfY2hvaWNlWzBdKTsNCisJCQlpbnQgYTEgPSBTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkVuY29kZXIuR2V0UHJpY2UxKF9jaG9pY2VbMF0pOw0KKwkJCWludCBiMCA9IGExICsgU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkdldFByaWNlMChfY2hvaWNlWzFdKTsNCisJCQlpbnQgYjEgPSBhMSArIFNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZTEoX2Nob2ljZVsxXSk7DQorCQkJaW50IGkgPSAwOw0KKwkJCWZvciAoaSA9IDA7IGkgPCBCYXNlLmtOdW1Mb3dMZW5TeW1ib2xzOyBpKyspDQorCQkJew0KKwkJCQlpZiAoaSA+PSBudW1TeW1ib2xzKQ0KKwkJCQkJcmV0dXJuOw0KKwkJCQlwcmljZXNbc3QgKyBpXSA9IGEwICsgX2xvd0NvZGVyW3Bvc1N0YXRlXS5HZXRQcmljZShpKTsNCisJCQl9DQorCQkJZm9yICg7IGkgPCBCYXNlLmtOdW1Mb3dMZW5TeW1ib2xzICsgQmFzZS5rTnVtTWlkTGVuU3ltYm9sczsgaSsrKQ0KKwkJCXsNCisJCQkJaWYgKGkgPj0gbnVtU3ltYm9scykNCisJCQkJCXJldHVybjsNCisJCQkJcHJpY2VzW3N0ICsgaV0gPSBiMCArIF9taWRDb2Rlcltwb3NTdGF0ZV0uR2V0UHJpY2UoaSAtIEJhc2Uua051bUxvd0xlblN5bWJvbHMpOw0KKwkJCX0NCisJCQlmb3IgKDsgaSA8IG51bVN5bWJvbHM7IGkrKykNCisJCQkJcHJpY2VzW3N0ICsgaV0gPSBiMSArIF9oaWdoQ29kZXIuR2V0UHJpY2UoaSAtIEJhc2Uua051bUxvd0xlblN5bWJvbHMgLSBCYXNlLmtOdW1NaWRMZW5TeW1ib2xzKTsNCisJCX0NCisJfTsNCisNCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga051bUxlblNwZWNTeW1ib2xzID0gQmFzZS5rTnVtTG93TGVuU3ltYm9scyArIEJhc2Uua051bU1pZExlblN5bWJvbHM7DQorDQorCWNsYXNzIExlblByaWNlVGFibGVFbmNvZGVyIGV4dGVuZHMgTGVuRW5jb2Rlcg0KKwl7DQorCQlpbnRbXSBfcHJpY2VzID0gbmV3IGludFtCYXNlLmtOdW1MZW5TeW1ib2xzPDxCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzRW5jb2RpbmdNYXhdOw0KKwkJaW50IF90YWJsZVNpemU7DQorCQlpbnRbXSBfY291bnRlcnMgPSBuZXcgaW50W0Jhc2Uua051bVBvc1N0YXRlc0VuY29kaW5nTWF4XTsNCisNCisJCXB1YmxpYyB2b2lkIFNldFRhYmxlU2l6ZShpbnQgdGFibGVTaXplKSB7IF90YWJsZVNpemUgPSB0YWJsZVNpemU7IH0NCisNCisJCXB1YmxpYyBpbnQgR2V0UHJpY2UoaW50IHN5bWJvbCwgaW50IHBvc1N0YXRlKQ0KKwkJew0KKwkJCXJldHVybiBfcHJpY2VzW3Bvc1N0YXRlICogQmFzZS5rTnVtTGVuU3ltYm9scyArIHN5bWJvbF07DQorCQl9DQorDQorCQl2b2lkIFVwZGF0ZVRhYmxlKGludCBwb3NTdGF0ZSkNCisJCXsNCisJCQlTZXRQcmljZXMocG9zU3RhdGUsIF90YWJsZVNpemUsIF9wcmljZXMsIHBvc1N0YXRlICogQmFzZS5rTnVtTGVuU3ltYm9scyk7DQorCQkJX2NvdW50ZXJzW3Bvc1N0YXRlXSA9IF90YWJsZVNpemU7DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBVcGRhdGVUYWJsZXMoaW50IG51bVBvc1N0YXRlcykNCisJCXsNCisJCQlmb3IgKGludCBwb3NTdGF0ZSA9IDA7IHBvc1N0YXRlIDwgbnVtUG9zU3RhdGVzOyBwb3NTdGF0ZSsrKQ0KKwkJCQlVcGRhdGVUYWJsZShwb3NTdGF0ZSk7DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBFbmNvZGUoU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyIHJhbmdlRW5jb2RlciwgaW50IHN5bWJvbCwgaW50IHBvc1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24NCisJCXsNCisJCQlzdXBlci5FbmNvZGUocmFuZ2VFbmNvZGVyLCBzeW1ib2wsIHBvc1N0YXRlKTsNCisJCQlpZiAoLS1fY291bnRlcnNbcG9zU3RhdGVdID09IDApDQorCQkJCVVwZGF0ZVRhYmxlKHBvc1N0YXRlKTsNCisJCX0NCisJfQ0KKw0KKwlzdGF0aWMgZmluYWwgaW50IGtOdW1PcHRzID0gMSA8PCAxMjsNCisJY2xhc3MgT3B0aW1hbA0KKwl7DQorCQlwdWJsaWMgaW50IFN0YXRlOw0KKw0KKwkJcHVibGljIGJvb2xlYW4gUHJldjFJc0NoYXI7DQorCQlwdWJsaWMgYm9vbGVhbiBQcmV2MjsNCisNCisJCXB1YmxpYyBpbnQgUG9zUHJldjI7DQorCQlwdWJsaWMgaW50IEJhY2tQcmV2MjsNCisNCisJCXB1YmxpYyBpbnQgUHJpY2U7DQorCQlwdWJsaWMgaW50IFBvc1ByZXY7DQorCQlwdWJsaWMgaW50IEJhY2tQcmV2Ow0KKw0KKwkJcHVibGljIGludCBCYWNrczA7DQorCQlwdWJsaWMgaW50IEJhY2tzMTsNCisJCXB1YmxpYyBpbnQgQmFja3MyOw0KKwkJcHVibGljIGludCBCYWNrczM7DQorDQorCQlwdWJsaWMgdm9pZCBNYWtlQXNDaGFyKCkgeyBCYWNrUHJldiA9IC0xOyBQcmV2MUlzQ2hhciA9IGZhbHNlOyB9DQorCQlwdWJsaWMgdm9pZCBNYWtlQXNTaG9ydFJlcCgpIHsgQmFja1ByZXYgPSAwOyA7IFByZXYxSXNDaGFyID0gZmFsc2U7IH0NCisJCXB1YmxpYyBib29sZWFuIElzU2hvcnRSZXAoKSB7IHJldHVybiAoQmFja1ByZXYgPT0gMCk7IH0NCisJfTsNCisJT3B0aW1hbFtdIF9vcHRpbXVtID0gbmV3IE9wdGltYWxba051bU9wdHNdOw0KKwlTZXZlblppcC5Db21wcmVzc2lvbi5MWi5CaW5UcmVlIF9tYXRjaEZpbmRlciA9IG51bGw7DQorCVNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2RlciBfcmFuZ2VFbmNvZGVyID0gbmV3IFNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2RlcigpOw0KKw0KKwlzaG9ydFtdIF9pc01hdGNoID0gbmV3IHNob3J0W0Jhc2Uua051bVN0YXRlczw8QmFzZS5rTnVtUG9zU3RhdGVzQml0c01heF07DQorCXNob3J0W10gX2lzUmVwID0gbmV3IHNob3J0W0Jhc2Uua051bVN0YXRlc107DQorCXNob3J0W10gX2lzUmVwRzAgPSBuZXcgc2hvcnRbQmFzZS5rTnVtU3RhdGVzXTsNCisJc2hvcnRbXSBfaXNSZXBHMSA9IG5ldyBzaG9ydFtCYXNlLmtOdW1TdGF0ZXNdOw0KKwlzaG9ydFtdIF9pc1JlcEcyID0gbmV3IHNob3J0W0Jhc2Uua051bVN0YXRlc107DQorCXNob3J0W10gX2lzUmVwMExvbmcgPSBuZXcgc2hvcnRbQmFzZS5rTnVtU3RhdGVzPDxCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4XTsNCisNCisJQml0VHJlZUVuY29kZXJbXSBfcG9zU2xvdEVuY29kZXIgPSBuZXcgQml0VHJlZUVuY29kZXJbQmFzZS5rTnVtTGVuVG9Qb3NTdGF0ZXNdOyAvLyBrTnVtUG9zU2xvdEJpdHMNCisNCisJc2hvcnRbXSBfcG9zRW5jb2RlcnMgPSBuZXcgc2hvcnRbQmFzZS5rTnVtRnVsbERpc3RhbmNlcy1CYXNlLmtFbmRQb3NNb2RlbEluZGV4XTsNCisJQml0VHJlZUVuY29kZXIgX3Bvc0FsaWduRW5jb2RlciA9IG5ldyBCaXRUcmVlRW5jb2RlcihCYXNlLmtOdW1BbGlnbkJpdHMpOw0KKw0KKwlMZW5QcmljZVRhYmxlRW5jb2RlciBfbGVuRW5jb2RlciA9IG5ldyBMZW5QcmljZVRhYmxlRW5jb2RlcigpOw0KKwlMZW5QcmljZVRhYmxlRW5jb2RlciBfcmVwTWF0Y2hMZW5FbmNvZGVyID0gbmV3IExlblByaWNlVGFibGVFbmNvZGVyKCk7DQorDQorCUxpdGVyYWxFbmNvZGVyIF9saXRlcmFsRW5jb2RlciA9IG5ldyBMaXRlcmFsRW5jb2RlcigpOw0KKw0KKwlpbnRbXSBfbWF0Y2hEaXN0YW5jZXMgPSBuZXcgaW50W0Jhc2Uua01hdGNoTWF4TGVuKjIrMl07DQorDQorCWludCBfbnVtRmFzdEJ5dGVzID0ga051bUZhc3RCeXRlc0RlZmF1bHQ7DQorCWludCBfbG9uZ2VzdE1hdGNoTGVuZ3RoOw0KKwlpbnQgX251bURpc3RhbmNlUGFpcnM7DQorDQorCWludCBfYWRkaXRpb25hbE9mZnNldDsNCisNCisJaW50IF9vcHRpbXVtRW5kSW5kZXg7DQorCWludCBfb3B0aW11bUN1cnJlbnRJbmRleDsNCisNCisJYm9vbGVhbiBfbG9uZ2VzdE1hdGNoV2FzRm91bmQ7DQorDQorCWludFtdIF9wb3NTbG90UHJpY2VzID0gbmV3IGludFsxPDwoQmFzZS5rTnVtUG9zU2xvdEJpdHMrQmFzZS5rTnVtTGVuVG9Qb3NTdGF0ZXNCaXRzKV07DQorCWludFtdIF9kaXN0YW5jZXNQcmljZXMgPSBuZXcgaW50W0Jhc2Uua051bUZ1bGxEaXN0YW5jZXM8PEJhc2Uua051bUxlblRvUG9zU3RhdGVzQml0c107DQorCWludFtdIF9hbGlnblByaWNlcyA9IG5ldyBpbnRbQmFzZS5rQWxpZ25UYWJsZVNpemVdOw0KKwlpbnQgX2FsaWduUHJpY2VDb3VudDsNCisNCisJaW50IF9kaXN0VGFibGVTaXplID0gKGtEZWZhdWx0RGljdGlvbmFyeUxvZ1NpemUgKiAyKTsNCisNCisJaW50IF9wb3NTdGF0ZUJpdHMgPSAyOw0KKwlpbnQgX3Bvc1N0YXRlTWFzayA9ICg0IC0gMSk7DQorCWludCBfbnVtTGl0ZXJhbFBvc1N0YXRlQml0cyA9IDA7DQorCWludCBfbnVtTGl0ZXJhbENvbnRleHRCaXRzID0gMzsNCisNCisJaW50IF9kaWN0aW9uYXJ5U2l6ZSA9ICgxIDw8IGtEZWZhdWx0RGljdGlvbmFyeUxvZ1NpemUpOw0KKwlpbnQgX2RpY3Rpb25hcnlTaXplUHJldiA9IC0xOw0KKwlpbnQgX251bUZhc3RCeXRlc1ByZXYgPSAtMTsNCisNCisJbG9uZyBub3dQb3M2NDsNCisJYm9vbGVhbiBfZmluaXNoZWQ7DQorCWphdmEuaW8uSW5wdXRTdHJlYW0gX2luU3RyZWFtOw0KKw0KKwlpbnQgX21hdGNoRmluZGVyVHlwZSA9IEVNYXRjaEZpbmRlclR5cGVCVDQ7DQorCWJvb2xlYW4gX3dyaXRlRW5kTWFyayA9IGZhbHNlOw0KKw0KKwlib29sZWFuIF9uZWVkUmVsZWFzZU1GU3RyZWFtID0gZmFsc2U7DQorDQorCXZvaWQgQ3JlYXRlKCkNCisJew0KKwkJaWYgKF9tYXRjaEZpbmRlciA9PSBudWxsKQ0KKwkJew0KKwkJCVNldmVuWmlwLkNvbXByZXNzaW9uLkxaLkJpblRyZWUgYnQgPSBuZXcgU2V2ZW5aaXAuQ29tcHJlc3Npb24uTFouQmluVHJlZSgpOw0KKwkJCWludCBudW1IYXNoQnl0ZXMgPSA0Ow0KKwkJCWlmIChfbWF0Y2hGaW5kZXJUeXBlID09IEVNYXRjaEZpbmRlclR5cGVCVDIpDQorCQkJCW51bUhhc2hCeXRlcyA9IDI7DQorCQkJYnQuU2V0VHlwZShudW1IYXNoQnl0ZXMpOw0KKwkJCV9tYXRjaEZpbmRlciA9IGJ0Ow0KKwkJfQ0KKwkJX2xpdGVyYWxFbmNvZGVyLkNyZWF0ZShfbnVtTGl0ZXJhbFBvc1N0YXRlQml0cywgX251bUxpdGVyYWxDb250ZXh0Qml0cyk7DQorDQorCQlpZiAoX2RpY3Rpb25hcnlTaXplID09IF9kaWN0aW9uYXJ5U2l6ZVByZXYgJiYgX251bUZhc3RCeXRlc1ByZXYgPT0gX251bUZhc3RCeXRlcykNCisJCQlyZXR1cm47DQorCQlfbWF0Y2hGaW5kZXIuQ3JlYXRlKF9kaWN0aW9uYXJ5U2l6ZSwga051bU9wdHMsIF9udW1GYXN0Qnl0ZXMsIEJhc2Uua01hdGNoTWF4TGVuICsgMSk7DQorCQlfZGljdGlvbmFyeVNpemVQcmV2ID0gX2RpY3Rpb25hcnlTaXplOw0KKwkJX251bUZhc3RCeXRlc1ByZXYgPSBfbnVtRmFzdEJ5dGVzOw0KKwl9DQorDQorCXB1YmxpYyBFbmNvZGVyKCkNCisJew0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtT3B0czsgaSsrKQ0KKwkJCV9vcHRpbXVtW2ldID0gbmV3IE9wdGltYWwoKTsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgQmFzZS5rTnVtTGVuVG9Qb3NTdGF0ZXM7IGkrKykNCisJCQlfcG9zU2xvdEVuY29kZXJbaV0gPSBuZXcgQml0VHJlZUVuY29kZXIoQmFzZS5rTnVtUG9zU2xvdEJpdHMpOw0KKwl9DQorDQorCXZvaWQgU2V0V3JpdGVFbmRNYXJrZXJNb2RlKGJvb2xlYW4gd3JpdGVFbmRNYXJrZXIpDQorCXsNCisJCV93cml0ZUVuZE1hcmsgPSB3cml0ZUVuZE1hcmtlcjsNCisJfQ0KKw0KKwl2b2lkIEluaXQoKQ0KKwl7DQorCQlCYXNlSW5pdCgpOw0KKwkJX3JhbmdlRW5jb2Rlci5Jbml0KCk7DQorDQorCQlTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkVuY29kZXIuSW5pdEJpdE1vZGVscyhfaXNNYXRjaCk7DQorCQlTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkVuY29kZXIuSW5pdEJpdE1vZGVscyhfaXNSZXAwTG9uZyk7DQorCQlTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkVuY29kZXIuSW5pdEJpdE1vZGVscyhfaXNSZXApOw0KKwkJU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkluaXRCaXRNb2RlbHMoX2lzUmVwRzApOw0KKwkJU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkluaXRCaXRNb2RlbHMoX2lzUmVwRzEpOw0KKwkJU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkluaXRCaXRNb2RlbHMoX2lzUmVwRzIpOw0KKwkJU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkluaXRCaXRNb2RlbHMoX3Bvc0VuY29kZXJzKTsNCisNCisNCisNCisNCisNCisNCisNCisJCV9saXRlcmFsRW5jb2Rlci5Jbml0KCk7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IEJhc2Uua051bUxlblRvUG9zU3RhdGVzOyBpKyspDQorCQkJX3Bvc1Nsb3RFbmNvZGVyW2ldLkluaXQoKTsNCisNCisNCisNCisJCV9sZW5FbmNvZGVyLkluaXQoMSA8PCBfcG9zU3RhdGVCaXRzKTsNCisJCV9yZXBNYXRjaExlbkVuY29kZXIuSW5pdCgxIDw8IF9wb3NTdGF0ZUJpdHMpOw0KKw0KKwkJX3Bvc0FsaWduRW5jb2Rlci5Jbml0KCk7DQorDQorCQlfbG9uZ2VzdE1hdGNoV2FzRm91bmQgPSBmYWxzZTsNCisJCV9vcHRpbXVtRW5kSW5kZXggPSAwOw0KKwkJX29wdGltdW1DdXJyZW50SW5kZXggPSAwOw0KKwkJX2FkZGl0aW9uYWxPZmZzZXQgPSAwOw0KKwl9DQorDQorCWludCBSZWFkTWF0Y2hEaXN0YW5jZXMoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbg0KKwl7DQorCQlpbnQgbGVuUmVzID0gMDsNCisJCV9udW1EaXN0YW5jZVBhaXJzID0gX21hdGNoRmluZGVyLkdldE1hdGNoZXMoX21hdGNoRGlzdGFuY2VzKTsNCisJCWlmIChfbnVtRGlzdGFuY2VQYWlycyA+IDApDQorCQl7DQorCQkJbGVuUmVzID0gX21hdGNoRGlzdGFuY2VzW19udW1EaXN0YW5jZVBhaXJzIC0gMl07DQorCQkJaWYgKGxlblJlcyA9PSBfbnVtRmFzdEJ5dGVzKQ0KKwkJCQlsZW5SZXMgKz0gX21hdGNoRmluZGVyLkdldE1hdGNoTGVuKChpbnQpbGVuUmVzIC0gMSwgX21hdGNoRGlzdGFuY2VzW19udW1EaXN0YW5jZVBhaXJzIC0gMV0sDQorCQkJCQlCYXNlLmtNYXRjaE1heExlbiAtIGxlblJlcyk7DQorCQl9DQorCQlfYWRkaXRpb25hbE9mZnNldCsrOw0KKwkJcmV0dXJuIGxlblJlczsNCisJfQ0KKw0KKwl2b2lkIE1vdmVQb3MoaW50IG51bSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24NCisJew0KKwkJaWYgKG51bSA+IDApDQorCQl7DQorCQkJX21hdGNoRmluZGVyLlNraXAobnVtKTsNCisJCQlfYWRkaXRpb25hbE9mZnNldCArPSBudW07DQorCQl9DQorCX0NCisNCisJaW50IEdldFJlcExlbjFQcmljZShpbnQgc3RhdGUsIGludCBwb3NTdGF0ZSkNCisJew0KKwkJcmV0dXJuIFNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZTAoX2lzUmVwRzBbc3RhdGVdKSArDQorCQkJCVNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZTAoX2lzUmVwMExvbmdbKHN0YXRlIDw8IEJhc2Uua051bVBvc1N0YXRlc0JpdHNNYXgpICsgcG9zU3RhdGVdKTsNCisJfQ0KKw0KKwlpbnQgR2V0UHVyZVJlcFByaWNlKGludCByZXBJbmRleCwgaW50IHN0YXRlLCBpbnQgcG9zU3RhdGUpDQorCXsNCisJCWludCBwcmljZTsNCisJCWlmIChyZXBJbmRleCA9PSAwKQ0KKwkJew0KKwkJCXByaWNlID0gU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkdldFByaWNlMChfaXNSZXBHMFtzdGF0ZV0pOw0KKwkJCXByaWNlICs9IFNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZTEoX2lzUmVwMExvbmdbKHN0YXRlIDw8IEJhc2Uua051bVBvc1N0YXRlc0JpdHNNYXgpICsgcG9zU3RhdGVdKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlwcmljZSA9IFNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZTEoX2lzUmVwRzBbc3RhdGVdKTsNCisJCQlpZiAocmVwSW5kZXggPT0gMSkNCisJCQkJcHJpY2UgKz0gU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkdldFByaWNlMChfaXNSZXBHMVtzdGF0ZV0pOw0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXByaWNlICs9IFNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZTEoX2lzUmVwRzFbc3RhdGVdKTsNCisJCQkJcHJpY2UgKz0gU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkdldFByaWNlKF9pc1JlcEcyW3N0YXRlXSwgcmVwSW5kZXggLSAyKTsNCisJCQl9DQorCQl9DQorCQlyZXR1cm4gcHJpY2U7DQorCX0NCisNCisJaW50IEdldFJlcFByaWNlKGludCByZXBJbmRleCwgaW50IGxlbiwgaW50IHN0YXRlLCBpbnQgcG9zU3RhdGUpDQorCXsNCisJCWludCBwcmljZSA9IF9yZXBNYXRjaExlbkVuY29kZXIuR2V0UHJpY2UobGVuIC0gQmFzZS5rTWF0Y2hNaW5MZW4sIHBvc1N0YXRlKTsNCisJCXJldHVybiBwcmljZSArIEdldFB1cmVSZXBQcmljZShyZXBJbmRleCwgc3RhdGUsIHBvc1N0YXRlKTsNCisJfQ0KKw0KKwlpbnQgR2V0UG9zTGVuUHJpY2UoaW50IHBvcywgaW50IGxlbiwgaW50IHBvc1N0YXRlKQ0KKwl7DQorCQlpbnQgcHJpY2U7DQorCQlpbnQgbGVuVG9Qb3NTdGF0ZSA9IEJhc2UuR2V0TGVuVG9Qb3NTdGF0ZShsZW4pOw0KKwkJaWYgKHBvcyA8IEJhc2Uua051bUZ1bGxEaXN0YW5jZXMpDQorCQkJcHJpY2UgPSBfZGlzdGFuY2VzUHJpY2VzWyhsZW5Ub1Bvc1N0YXRlICogQmFzZS5rTnVtRnVsbERpc3RhbmNlcykgKyBwb3NdOw0KKwkJZWxzZQ0KKwkJCXByaWNlID0gX3Bvc1Nsb3RQcmljZXNbKGxlblRvUG9zU3RhdGUgPDwgQmFzZS5rTnVtUG9zU2xvdEJpdHMpICsgR2V0UG9zU2xvdDIocG9zKV0gKw0KKwkJCQlfYWxpZ25QcmljZXNbcG9zICYgQmFzZS5rQWxpZ25NYXNrXTsNCisJCXJldHVybiBwcmljZSArIF9sZW5FbmNvZGVyLkdldFByaWNlKGxlbiAtIEJhc2Uua01hdGNoTWluTGVuLCBwb3NTdGF0ZSk7DQorCX0NCisNCisJaW50IEJhY2t3YXJkKGludCBjdXIpDQorCXsNCisJCV9vcHRpbXVtRW5kSW5kZXggPSBjdXI7DQorCQlpbnQgcG9zTWVtID0gX29wdGltdW1bY3VyXS5Qb3NQcmV2Ow0KKwkJaW50IGJhY2tNZW0gPSBfb3B0aW11bVtjdXJdLkJhY2tQcmV2Ow0KKwkJZG8NCisJCXsNCisJCQlpZiAoX29wdGltdW1bY3VyXS5QcmV2MUlzQ2hhcikNCisJCQl7DQorCQkJCV9vcHRpbXVtW3Bvc01lbV0uTWFrZUFzQ2hhcigpOw0KKwkJCQlfb3B0aW11bVtwb3NNZW1dLlBvc1ByZXYgPSBwb3NNZW0gLSAxOw0KKwkJCQlpZiAoX29wdGltdW1bY3VyXS5QcmV2MikNCisJCQkJew0KKwkJCQkJX29wdGltdW1bcG9zTWVtIC0gMV0uUHJldjFJc0NoYXIgPSBmYWxzZTsNCisJCQkJCV9vcHRpbXVtW3Bvc01lbSAtIDFdLlBvc1ByZXYgPSBfb3B0aW11bVtjdXJdLlBvc1ByZXYyOw0KKwkJCQkJX29wdGltdW1bcG9zTWVtIC0gMV0uQmFja1ByZXYgPSBfb3B0aW11bVtjdXJdLkJhY2tQcmV2MjsNCisJCQkJfQ0KKwkJCX0NCisJCQlpbnQgcG9zUHJldiA9IHBvc01lbTsNCisJCQlpbnQgYmFja0N1ciA9IGJhY2tNZW07DQorDQorCQkJYmFja01lbSA9IF9vcHRpbXVtW3Bvc1ByZXZdLkJhY2tQcmV2Ow0KKwkJCXBvc01lbSA9IF9vcHRpbXVtW3Bvc1ByZXZdLlBvc1ByZXY7DQorDQorCQkJX29wdGltdW1bcG9zUHJldl0uQmFja1ByZXYgPSBiYWNrQ3VyOw0KKwkJCV9vcHRpbXVtW3Bvc1ByZXZdLlBvc1ByZXYgPSBjdXI7DQorCQkJY3VyID0gcG9zUHJldjsNCisJCX0NCisJCXdoaWxlIChjdXIgPiAwKTsNCisJCWJhY2tSZXMgPSBfb3B0aW11bVswXS5CYWNrUHJldjsNCisJCV9vcHRpbXVtQ3VycmVudEluZGV4ID0gX29wdGltdW1bMF0uUG9zUHJldjsNCisJCXJldHVybiBfb3B0aW11bUN1cnJlbnRJbmRleDsNCisJfQ0KKw0KKwlpbnRbXSByZXBzID0gbmV3IGludFtCYXNlLmtOdW1SZXBEaXN0YW5jZXNdOw0KKwlpbnRbXSByZXBMZW5zID0gbmV3IGludFtCYXNlLmtOdW1SZXBEaXN0YW5jZXNdOw0KKwlpbnQgYmFja1JlczsNCisNCisJaW50IEdldE9wdGltdW0oaW50IHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24NCisJew0KKwkJaWYgKF9vcHRpbXVtRW5kSW5kZXggIT0gX29wdGltdW1DdXJyZW50SW5kZXgpDQorCQl7DQorCQkJaW50IGxlblJlcyA9IF9vcHRpbXVtW19vcHRpbXVtQ3VycmVudEluZGV4XS5Qb3NQcmV2IC0gX29wdGltdW1DdXJyZW50SW5kZXg7DQorCQkJYmFja1JlcyA9IF9vcHRpbXVtW19vcHRpbXVtQ3VycmVudEluZGV4XS5CYWNrUHJldjsNCisJCQlfb3B0aW11bUN1cnJlbnRJbmRleCA9IF9vcHRpbXVtW19vcHRpbXVtQ3VycmVudEluZGV4XS5Qb3NQcmV2Ow0KKwkJCXJldHVybiBsZW5SZXM7DQorCQl9DQorCQlfb3B0aW11bUN1cnJlbnRJbmRleCA9IF9vcHRpbXVtRW5kSW5kZXggPSAwOw0KKw0KKwkJaW50IGxlbk1haW4sIG51bURpc3RhbmNlUGFpcnM7DQorCQlpZiAoIV9sb25nZXN0TWF0Y2hXYXNGb3VuZCkNCisJCXsNCisJCQlsZW5NYWluID0gUmVhZE1hdGNoRGlzdGFuY2VzKCk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJbGVuTWFpbiA9IF9sb25nZXN0TWF0Y2hMZW5ndGg7DQorCQkJX2xvbmdlc3RNYXRjaFdhc0ZvdW5kID0gZmFsc2U7DQorCQl9DQorCQludW1EaXN0YW5jZVBhaXJzID0gX251bURpc3RhbmNlUGFpcnM7DQorDQorCQlpbnQgbnVtQXZhaWxhYmxlQnl0ZXMgPSBfbWF0Y2hGaW5kZXIuR2V0TnVtQXZhaWxhYmxlQnl0ZXMoKSArIDE7DQorCQlpZiAobnVtQXZhaWxhYmxlQnl0ZXMgPCAyKQ0KKwkJew0KKwkJCWJhY2tSZXMgPSAtMTsNCisJCQlyZXR1cm4gMTsNCisJCX0NCisJCWlmIChudW1BdmFpbGFibGVCeXRlcyA+IEJhc2Uua01hdGNoTWF4TGVuKQ0KKwkJCW51bUF2YWlsYWJsZUJ5dGVzID0gQmFzZS5rTWF0Y2hNYXhMZW47DQorDQorCQlpbnQgcmVwTWF4SW5kZXggPSAwOw0KKwkJaW50IGk7DQorCQlmb3IgKGkgPSAwOyBpIDwgQmFzZS5rTnVtUmVwRGlzdGFuY2VzOyBpKyspDQorCQl7DQorCQkJcmVwc1tpXSA9IF9yZXBEaXN0YW5jZXNbaV07DQorCQkJcmVwTGVuc1tpXSA9IF9tYXRjaEZpbmRlci5HZXRNYXRjaExlbigwIC0gMSwgcmVwc1tpXSwgQmFzZS5rTWF0Y2hNYXhMZW4pOw0KKwkJCWlmIChyZXBMZW5zW2ldID4gcmVwTGVuc1tyZXBNYXhJbmRleF0pDQorCQkJCXJlcE1heEluZGV4ID0gaTsNCisJCX0NCisJCWlmIChyZXBMZW5zW3JlcE1heEluZGV4XSA+PSBfbnVtRmFzdEJ5dGVzKQ0KKwkJew0KKwkJCWJhY2tSZXMgPSByZXBNYXhJbmRleDsNCisJCQlpbnQgbGVuUmVzID0gcmVwTGVuc1tyZXBNYXhJbmRleF07DQorCQkJTW92ZVBvcyhsZW5SZXMgLSAxKTsNCisJCQlyZXR1cm4gbGVuUmVzOw0KKwkJfQ0KKw0KKwkJaWYgKGxlbk1haW4gPj0gX251bUZhc3RCeXRlcykNCisJCXsNCisJCQliYWNrUmVzID0gX21hdGNoRGlzdGFuY2VzW251bURpc3RhbmNlUGFpcnMgLSAxXSArIEJhc2Uua051bVJlcERpc3RhbmNlczsNCisJCQlNb3ZlUG9zKGxlbk1haW4gLSAxKTsNCisJCQlyZXR1cm4gbGVuTWFpbjsNCisJCX0NCisNCisJCWJ5dGUgY3VycmVudEJ5dGUgPSBfbWF0Y2hGaW5kZXIuR2V0SW5kZXhCeXRlKDAgLSAxKTsNCisJCWJ5dGUgbWF0Y2hCeXRlID0gX21hdGNoRmluZGVyLkdldEluZGV4Qnl0ZSgwIC0gX3JlcERpc3RhbmNlc1swXSAtIDEgLSAxKTsNCisNCisJCWlmIChsZW5NYWluIDwgMiAmJiBjdXJyZW50Qnl0ZSAhPSBtYXRjaEJ5dGUgJiYgcmVwTGVuc1tyZXBNYXhJbmRleF0gPCAyKQ0KKwkJew0KKwkJCWJhY2tSZXMgPSAtMTsNCisJCQlyZXR1cm4gMTsNCisJCX0NCisNCisJCV9vcHRpbXVtWzBdLlN0YXRlID0gX3N0YXRlOw0KKw0KKwkJaW50IHBvc1N0YXRlID0gKHBvc2l0aW9uICYgX3Bvc1N0YXRlTWFzayk7DQorDQorCQlfb3B0aW11bVsxXS5QcmljZSA9IFNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZTAoX2lzTWF0Y2hbKF9zdGF0ZSA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlXSkgKw0KKwkJCQlfbGl0ZXJhbEVuY29kZXIuR2V0U3ViQ29kZXIocG9zaXRpb24sIF9wcmV2aW91c0J5dGUpLkdldFByaWNlKCFCYXNlLlN0YXRlSXNDaGFyU3RhdGUoX3N0YXRlKSwgbWF0Y2hCeXRlLCBjdXJyZW50Qnl0ZSk7DQorCQlfb3B0aW11bVsxXS5NYWtlQXNDaGFyKCk7DQorDQorCQlpbnQgbWF0Y2hQcmljZSA9IFNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZTEoX2lzTWF0Y2hbKF9zdGF0ZSA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlXSk7DQorCQlpbnQgcmVwTWF0Y2hQcmljZSA9IG1hdGNoUHJpY2UgKyBTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkVuY29kZXIuR2V0UHJpY2UxKF9pc1JlcFtfc3RhdGVdKTsNCisNCisJCWlmIChtYXRjaEJ5dGUgPT0gY3VycmVudEJ5dGUpDQorCQl7DQorCQkJaW50IHNob3J0UmVwUHJpY2UgPSByZXBNYXRjaFByaWNlICsgR2V0UmVwTGVuMVByaWNlKF9zdGF0ZSwgcG9zU3RhdGUpOw0KKwkJCWlmIChzaG9ydFJlcFByaWNlIDwgX29wdGltdW1bMV0uUHJpY2UpDQorCQkJew0KKwkJCQlfb3B0aW11bVsxXS5QcmljZSA9IHNob3J0UmVwUHJpY2U7DQorCQkJCV9vcHRpbXVtWzFdLk1ha2VBc1Nob3J0UmVwKCk7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJaW50IGxlbkVuZCA9ICgobGVuTWFpbiA+PSByZXBMZW5zW3JlcE1heEluZGV4XSkgPyBsZW5NYWluIDogcmVwTGVuc1tyZXBNYXhJbmRleF0pOw0KKw0KKwkJaWYgKGxlbkVuZCA8IDIpDQorCQl7DQorCQkJYmFja1JlcyA9IF9vcHRpbXVtWzFdLkJhY2tQcmV2Ow0KKwkJCXJldHVybiAxOw0KKwkJfQ0KKw0KKwkJX29wdGltdW1bMV0uUG9zUHJldiA9IDA7DQorDQorCQlfb3B0aW11bVswXS5CYWNrczAgPSByZXBzWzBdOw0KKwkJX29wdGltdW1bMF0uQmFja3MxID0gcmVwc1sxXTsNCisJCV9vcHRpbXVtWzBdLkJhY2tzMiA9IHJlcHNbMl07DQorCQlfb3B0aW11bVswXS5CYWNrczMgPSByZXBzWzNdOw0KKw0KKwkJaW50IGxlbiA9IGxlbkVuZDsNCisJCWRvDQorCQkJX29wdGltdW1bbGVuLS1dLlByaWNlID0ga0lmaW5pdHlQcmljZTsNCisJCXdoaWxlIChsZW4gPj0gMik7DQorDQorCQlmb3IgKGkgPSAwOyBpIDwgQmFzZS5rTnVtUmVwRGlzdGFuY2VzOyBpKyspDQorCQl7DQorCQkJaW50IHJlcExlbiA9IHJlcExlbnNbaV07DQorCQkJaWYgKHJlcExlbiA8IDIpDQorCQkJCWNvbnRpbnVlOw0KKwkJCWludCBwcmljZSA9IHJlcE1hdGNoUHJpY2UgKyBHZXRQdXJlUmVwUHJpY2UoaSwgX3N0YXRlLCBwb3NTdGF0ZSk7DQorCQkJZG8NCisJCQl7DQorCQkJCWludCBjdXJBbmRMZW5QcmljZSA9IHByaWNlICsgX3JlcE1hdGNoTGVuRW5jb2Rlci5HZXRQcmljZShyZXBMZW4gLSAyLCBwb3NTdGF0ZSk7DQorCQkJCU9wdGltYWwgb3B0aW11bSA9IF9vcHRpbXVtW3JlcExlbl07DQorCQkJCWlmIChjdXJBbmRMZW5QcmljZSA8IG9wdGltdW0uUHJpY2UpDQorCQkJCXsNCisJCQkJCW9wdGltdW0uUHJpY2UgPSBjdXJBbmRMZW5QcmljZTsNCisJCQkJCW9wdGltdW0uUG9zUHJldiA9IDA7DQorCQkJCQlvcHRpbXVtLkJhY2tQcmV2ID0gaTsNCisJCQkJCW9wdGltdW0uUHJldjFJc0NoYXIgPSBmYWxzZTsNCisJCQkJfQ0KKwkJCX0NCisJCQl3aGlsZSAoLS1yZXBMZW4gPj0gMik7DQorCQl9DQorDQorCQlpbnQgbm9ybWFsTWF0Y2hQcmljZSA9IG1hdGNoUHJpY2UgKyBTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkVuY29kZXIuR2V0UHJpY2UwKF9pc1JlcFtfc3RhdGVdKTsNCisNCisJCWxlbiA9ICgocmVwTGVuc1swXSA+PSAyKSA/IHJlcExlbnNbMF0gKyAxIDogMik7DQorCQlpZiAobGVuIDw9IGxlbk1haW4pDQorCQl7DQorCQkJaW50IG9mZnMgPSAwOw0KKwkJCXdoaWxlIChsZW4gPiBfbWF0Y2hEaXN0YW5jZXNbb2Zmc10pDQorCQkJCW9mZnMgKz0gMjsNCisJCQlmb3IgKDsgOyBsZW4rKykNCisJCQl7DQorCQkJCWludCBkaXN0YW5jZSA9IF9tYXRjaERpc3RhbmNlc1tvZmZzICsgMV07DQorCQkJCWludCBjdXJBbmRMZW5QcmljZSA9IG5vcm1hbE1hdGNoUHJpY2UgKyBHZXRQb3NMZW5QcmljZShkaXN0YW5jZSwgbGVuLCBwb3NTdGF0ZSk7DQorCQkJCU9wdGltYWwgb3B0aW11bSA9IF9vcHRpbXVtW2xlbl07DQorCQkJCWlmIChjdXJBbmRMZW5QcmljZSA8IG9wdGltdW0uUHJpY2UpDQorCQkJCXsNCisJCQkJCW9wdGltdW0uUHJpY2UgPSBjdXJBbmRMZW5QcmljZTsNCisJCQkJCW9wdGltdW0uUG9zUHJldiA9IDA7DQorCQkJCQlvcHRpbXVtLkJhY2tQcmV2ID0gZGlzdGFuY2UgKyBCYXNlLmtOdW1SZXBEaXN0YW5jZXM7DQorCQkJCQlvcHRpbXVtLlByZXYxSXNDaGFyID0gZmFsc2U7DQorCQkJCX0NCisJCQkJaWYgKGxlbiA9PSBfbWF0Y2hEaXN0YW5jZXNbb2Zmc10pDQorCQkJCXsNCisJCQkJCW9mZnMgKz0gMjsNCisJCQkJCWlmIChvZmZzID09IG51bURpc3RhbmNlUGFpcnMpDQorCQkJCQkJYnJlYWs7DQorCQkJCX0NCisJCQl9DQorCQl9DQorDQorCQlpbnQgY3VyID0gMDsNCisNCisJCXdoaWxlICh0cnVlKQ0KKwkJew0KKwkJCWN1cisrOw0KKwkJCWlmIChjdXIgPT0gbGVuRW5kKQ0KKwkJCQlyZXR1cm4gQmFja3dhcmQoY3VyKTsNCisJCQlpbnQgbmV3TGVuID0gUmVhZE1hdGNoRGlzdGFuY2VzKCk7DQorCQkJbnVtRGlzdGFuY2VQYWlycyA9IF9udW1EaXN0YW5jZVBhaXJzOw0KKwkJCWlmIChuZXdMZW4gPj0gX251bUZhc3RCeXRlcykNCisJCQl7DQorDQorCQkJCV9sb25nZXN0TWF0Y2hMZW5ndGggPSBuZXdMZW47DQorCQkJCV9sb25nZXN0TWF0Y2hXYXNGb3VuZCA9IHRydWU7DQorCQkJCXJldHVybiBCYWNrd2FyZChjdXIpOw0KKwkJCX0NCisJCQlwb3NpdGlvbisrOw0KKwkJCWludCBwb3NQcmV2ID0gX29wdGltdW1bY3VyXS5Qb3NQcmV2Ow0KKwkJCWludCBzdGF0ZTsNCisJCQlpZiAoX29wdGltdW1bY3VyXS5QcmV2MUlzQ2hhcikNCisJCQl7DQorCQkJCXBvc1ByZXYtLTsNCisJCQkJaWYgKF9vcHRpbXVtW2N1cl0uUHJldjIpDQorCQkJCXsNCisJCQkJCXN0YXRlID0gX29wdGltdW1bX29wdGltdW1bY3VyXS5Qb3NQcmV2Ml0uU3RhdGU7DQorCQkJCQlpZiAoX29wdGltdW1bY3VyXS5CYWNrUHJldjIgPCBCYXNlLmtOdW1SZXBEaXN0YW5jZXMpDQorCQkJCQkJc3RhdGUgPSBCYXNlLlN0YXRlVXBkYXRlUmVwKHN0YXRlKTsNCisJCQkJCWVsc2UNCisJCQkJCQlzdGF0ZSA9IEJhc2UuU3RhdGVVcGRhdGVNYXRjaChzdGF0ZSk7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQkJc3RhdGUgPSBfb3B0aW11bVtwb3NQcmV2XS5TdGF0ZTsNCisJCQkJc3RhdGUgPSBCYXNlLlN0YXRlVXBkYXRlQ2hhcihzdGF0ZSk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQkJc3RhdGUgPSBfb3B0aW11bVtwb3NQcmV2XS5TdGF0ZTsNCisJCQlpZiAocG9zUHJldiA9PSBjdXIgLSAxKQ0KKwkJCXsNCisJCQkJaWYgKF9vcHRpbXVtW2N1cl0uSXNTaG9ydFJlcCgpKQ0KKwkJCQkJc3RhdGUgPSBCYXNlLlN0YXRlVXBkYXRlU2hvcnRSZXAoc3RhdGUpOw0KKwkJCQllbHNlDQorCQkJCQlzdGF0ZSA9IEJhc2UuU3RhdGVVcGRhdGVDaGFyKHN0YXRlKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJaW50IHBvczsNCisJCQkJaWYgKF9vcHRpbXVtW2N1cl0uUHJldjFJc0NoYXIgJiYgX29wdGltdW1bY3VyXS5QcmV2MikNCisJCQkJew0KKwkJCQkJcG9zUHJldiA9IF9vcHRpbXVtW2N1cl0uUG9zUHJldjI7DQorCQkJCQlwb3MgPSBfb3B0aW11bVtjdXJdLkJhY2tQcmV2MjsNCisJCQkJCXN0YXRlID0gQmFzZS5TdGF0ZVVwZGF0ZVJlcChzdGF0ZSk7DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlwb3MgPSBfb3B0aW11bVtjdXJdLkJhY2tQcmV2Ow0KKwkJCQkJaWYgKHBvcyA8IEJhc2Uua051bVJlcERpc3RhbmNlcykNCisJCQkJCQlzdGF0ZSA9IEJhc2UuU3RhdGVVcGRhdGVSZXAoc3RhdGUpOw0KKwkJCQkJZWxzZQ0KKwkJCQkJCXN0YXRlID0gQmFzZS5TdGF0ZVVwZGF0ZU1hdGNoKHN0YXRlKTsNCisJCQkJfQ0KKwkJCQlPcHRpbWFsIG9wdCA9IF9vcHRpbXVtW3Bvc1ByZXZdOw0KKwkJCQlpZiAocG9zIDwgQmFzZS5rTnVtUmVwRGlzdGFuY2VzKQ0KKwkJCQl7DQorCQkJCQlpZiAocG9zID09IDApDQorCQkJCQl7DQorCQkJCQkJcmVwc1swXSA9IG9wdC5CYWNrczA7DQorCQkJCQkJcmVwc1sxXSA9IG9wdC5CYWNrczE7DQorCQkJCQkJcmVwc1syXSA9IG9wdC5CYWNrczI7DQorCQkJCQkJcmVwc1szXSA9IG9wdC5CYWNrczM7DQorCQkJCQl9DQorCQkJCQllbHNlIGlmIChwb3MgPT0gMSkNCisJCQkJCXsNCisJCQkJCQlyZXBzWzBdID0gb3B0LkJhY2tzMTsNCisJCQkJCQlyZXBzWzFdID0gb3B0LkJhY2tzMDsNCisJCQkJCQlyZXBzWzJdID0gb3B0LkJhY2tzMjsNCisJCQkJCQlyZXBzWzNdID0gb3B0LkJhY2tzMzsNCisJCQkJCX0NCisJCQkJCWVsc2UgaWYgKHBvcyA9PSAyKQ0KKwkJCQkJew0KKwkJCQkJCXJlcHNbMF0gPSBvcHQuQmFja3MyOw0KKwkJCQkJCXJlcHNbMV0gPSBvcHQuQmFja3MwOw0KKwkJCQkJCXJlcHNbMl0gPSBvcHQuQmFja3MxOw0KKwkJCQkJCXJlcHNbM10gPSBvcHQuQmFja3MzOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCXJlcHNbMF0gPSBvcHQuQmFja3MzOw0KKwkJCQkJCXJlcHNbMV0gPSBvcHQuQmFja3MwOw0KKwkJCQkJCXJlcHNbMl0gPSBvcHQuQmFja3MxOw0KKwkJCQkJCXJlcHNbM10gPSBvcHQuQmFja3MyOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJcmVwc1swXSA9IChwb3MgLSBCYXNlLmtOdW1SZXBEaXN0YW5jZXMpOw0KKwkJCQkJcmVwc1sxXSA9IG9wdC5CYWNrczA7DQorCQkJCQlyZXBzWzJdID0gb3B0LkJhY2tzMTsNCisJCQkJCXJlcHNbM10gPSBvcHQuQmFja3MyOw0KKwkJCQl9DQorCQkJfQ0KKwkJCV9vcHRpbXVtW2N1cl0uU3RhdGUgPSBzdGF0ZTsNCisJCQlfb3B0aW11bVtjdXJdLkJhY2tzMCA9IHJlcHNbMF07DQorCQkJX29wdGltdW1bY3VyXS5CYWNrczEgPSByZXBzWzFdOw0KKwkJCV9vcHRpbXVtW2N1cl0uQmFja3MyID0gcmVwc1syXTsNCisJCQlfb3B0aW11bVtjdXJdLkJhY2tzMyA9IHJlcHNbM107DQorCQkJaW50IGN1clByaWNlID0gX29wdGltdW1bY3VyXS5QcmljZTsNCisNCisJCQljdXJyZW50Qnl0ZSA9IF9tYXRjaEZpbmRlci5HZXRJbmRleEJ5dGUoMCAtIDEpOw0KKwkJCW1hdGNoQnl0ZSA9IF9tYXRjaEZpbmRlci5HZXRJbmRleEJ5dGUoMCAtIHJlcHNbMF0gLSAxIC0gMSk7DQorDQorCQkJcG9zU3RhdGUgPSAocG9zaXRpb24gJiBfcG9zU3RhdGVNYXNrKTsNCisNCisJCQlpbnQgY3VyQW5kMVByaWNlID0gY3VyUHJpY2UgKw0KKwkJCQlTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkVuY29kZXIuR2V0UHJpY2UwKF9pc01hdGNoWyhzdGF0ZSA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlXSkgKw0KKwkJCQlfbGl0ZXJhbEVuY29kZXIuR2V0U3ViQ29kZXIocG9zaXRpb24sIF9tYXRjaEZpbmRlci5HZXRJbmRleEJ5dGUoMCAtIDIpKS4NCisJCQkJR2V0UHJpY2UoIUJhc2UuU3RhdGVJc0NoYXJTdGF0ZShzdGF0ZSksIG1hdGNoQnl0ZSwgY3VycmVudEJ5dGUpOw0KKw0KKwkJCU9wdGltYWwgbmV4dE9wdGltdW0gPSBfb3B0aW11bVtjdXIgKyAxXTsNCisNCisJCQlib29sZWFuIG5leHRJc0NoYXIgPSBmYWxzZTsNCisJCQlpZiAoY3VyQW5kMVByaWNlIDwgbmV4dE9wdGltdW0uUHJpY2UpDQorCQkJew0KKwkJCQluZXh0T3B0aW11bS5QcmljZSA9IGN1ckFuZDFQcmljZTsNCisJCQkJbmV4dE9wdGltdW0uUG9zUHJldiA9IGN1cjsNCisJCQkJbmV4dE9wdGltdW0uTWFrZUFzQ2hhcigpOw0KKwkJCQluZXh0SXNDaGFyID0gdHJ1ZTsNCisJCQl9DQorDQorCQkJbWF0Y2hQcmljZSA9IGN1clByaWNlICsgU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkdldFByaWNlMShfaXNNYXRjaFsoc3RhdGUgPDwgQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heCkgKyBwb3NTdGF0ZV0pOw0KKwkJCXJlcE1hdGNoUHJpY2UgPSBtYXRjaFByaWNlICsgU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkdldFByaWNlMShfaXNSZXBbc3RhdGVdKTsNCisNCisJCQlpZiAobWF0Y2hCeXRlID09IGN1cnJlbnRCeXRlICYmDQorCQkJCSEobmV4dE9wdGltdW0uUG9zUHJldiA8IGN1ciAmJiBuZXh0T3B0aW11bS5CYWNrUHJldiA9PSAwKSkNCisJCQl7DQorCQkJCWludCBzaG9ydFJlcFByaWNlID0gcmVwTWF0Y2hQcmljZSArIEdldFJlcExlbjFQcmljZShzdGF0ZSwgcG9zU3RhdGUpOw0KKwkJCQlpZiAoc2hvcnRSZXBQcmljZSA8PSBuZXh0T3B0aW11bS5QcmljZSkNCisJCQkJew0KKwkJCQkJbmV4dE9wdGltdW0uUHJpY2UgPSBzaG9ydFJlcFByaWNlOw0KKwkJCQkJbmV4dE9wdGltdW0uUG9zUHJldiA9IGN1cjsNCisJCQkJCW5leHRPcHRpbXVtLk1ha2VBc1Nob3J0UmVwKCk7DQorCQkJCQluZXh0SXNDaGFyID0gdHJ1ZTsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlpbnQgbnVtQXZhaWxhYmxlQnl0ZXNGdWxsID0gX21hdGNoRmluZGVyLkdldE51bUF2YWlsYWJsZUJ5dGVzKCkgKyAxOw0KKwkJCW51bUF2YWlsYWJsZUJ5dGVzRnVsbCA9IE1hdGgubWluKGtOdW1PcHRzIC0gMSAtIGN1ciwgbnVtQXZhaWxhYmxlQnl0ZXNGdWxsKTsNCisJCQludW1BdmFpbGFibGVCeXRlcyA9IG51bUF2YWlsYWJsZUJ5dGVzRnVsbDsNCisNCisJCQlpZiAobnVtQXZhaWxhYmxlQnl0ZXMgPCAyKQ0KKwkJCQljb250aW51ZTsNCisJCQlpZiAobnVtQXZhaWxhYmxlQnl0ZXMgPiBfbnVtRmFzdEJ5dGVzKQ0KKwkJCQludW1BdmFpbGFibGVCeXRlcyA9IF9udW1GYXN0Qnl0ZXM7DQorCQkJaWYgKCFuZXh0SXNDaGFyICYmIG1hdGNoQnl0ZSAhPSBjdXJyZW50Qnl0ZSkNCisJCQl7DQorCQkJCS8vIHRyeSBMaXRlcmFsICsgcmVwMA0KKwkJCQlpbnQgdCA9IE1hdGgubWluKG51bUF2YWlsYWJsZUJ5dGVzRnVsbCAtIDEsIF9udW1GYXN0Qnl0ZXMpOw0KKwkJCQlpbnQgbGVuVGVzdDIgPSBfbWF0Y2hGaW5kZXIuR2V0TWF0Y2hMZW4oMCwgcmVwc1swXSwgdCk7DQorCQkJCWlmIChsZW5UZXN0MiA+PSAyKQ0KKwkJCQl7DQorCQkJCQlpbnQgc3RhdGUyID0gQmFzZS5TdGF0ZVVwZGF0ZUNoYXIoc3RhdGUpOw0KKw0KKwkJCQkJaW50IHBvc1N0YXRlTmV4dCA9IChwb3NpdGlvbiArIDEpICYgX3Bvc1N0YXRlTWFzazsNCisJCQkJCWludCBuZXh0UmVwTWF0Y2hQcmljZSA9IGN1ckFuZDFQcmljZSArDQorCQkJCQkJU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkdldFByaWNlMShfaXNNYXRjaFsoc3RhdGUyIDw8IEJhc2Uua051bVBvc1N0YXRlc0JpdHNNYXgpICsgcG9zU3RhdGVOZXh0XSkgKw0KKwkJCQkJCVNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZTEoX2lzUmVwW3N0YXRlMl0pOw0KKwkJCQkJew0KKwkJCQkJCWludCBvZmZzZXQgPSBjdXIgKyAxICsgbGVuVGVzdDI7DQorCQkJCQkJd2hpbGUgKGxlbkVuZCA8IG9mZnNldCkNCisJCQkJCQkJX29wdGltdW1bKytsZW5FbmRdLlByaWNlID0ga0lmaW5pdHlQcmljZTsNCisJCQkJCQlpbnQgY3VyQW5kTGVuUHJpY2UgPSBuZXh0UmVwTWF0Y2hQcmljZSArIEdldFJlcFByaWNlKA0KKwkJCQkJCQkJMCwgbGVuVGVzdDIsIHN0YXRlMiwgcG9zU3RhdGVOZXh0KTsNCisJCQkJCQlPcHRpbWFsIG9wdGltdW0gPSBfb3B0aW11bVtvZmZzZXRdOw0KKwkJCQkJCWlmIChjdXJBbmRMZW5QcmljZSA8IG9wdGltdW0uUHJpY2UpDQorCQkJCQkJew0KKwkJCQkJCQlvcHRpbXVtLlByaWNlID0gY3VyQW5kTGVuUHJpY2U7DQorCQkJCQkJCW9wdGltdW0uUG9zUHJldiA9IGN1ciArIDE7DQorCQkJCQkJCW9wdGltdW0uQmFja1ByZXYgPSAwOw0KKwkJCQkJCQlvcHRpbXVtLlByZXYxSXNDaGFyID0gdHJ1ZTsNCisJCQkJCQkJb3B0aW11bS5QcmV2MiA9IGZhbHNlOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisNCisJCQlpbnQgc3RhcnRMZW4gPSAyOyAvLyBzcGVlZCBvcHRpbWl6YXRpb24gDQorDQorCQkJZm9yIChpbnQgcmVwSW5kZXggPSAwOyByZXBJbmRleCA8IEJhc2Uua051bVJlcERpc3RhbmNlczsgcmVwSW5kZXgrKykNCisJCQl7DQorCQkJCWludCBsZW5UZXN0ID0gX21hdGNoRmluZGVyLkdldE1hdGNoTGVuKDAgLSAxLCByZXBzW3JlcEluZGV4XSwgbnVtQXZhaWxhYmxlQnl0ZXMpOw0KKwkJCQlpZiAobGVuVGVzdCA8IDIpDQorCQkJCQljb250aW51ZTsNCisJCQkJaW50IGxlblRlc3RUZW1wID0gbGVuVGVzdDsNCisJCQkJZG8NCisJCQkJew0KKwkJCQkJd2hpbGUgKGxlbkVuZCA8IGN1ciArIGxlblRlc3QpDQorCQkJCQkJX29wdGltdW1bKytsZW5FbmRdLlByaWNlID0ga0lmaW5pdHlQcmljZTsNCisJCQkJCWludCBjdXJBbmRMZW5QcmljZSA9IHJlcE1hdGNoUHJpY2UgKyBHZXRSZXBQcmljZShyZXBJbmRleCwgbGVuVGVzdCwgc3RhdGUsIHBvc1N0YXRlKTsNCisJCQkJCU9wdGltYWwgb3B0aW11bSA9IF9vcHRpbXVtW2N1ciArIGxlblRlc3RdOw0KKwkJCQkJaWYgKGN1ckFuZExlblByaWNlIDwgb3B0aW11bS5QcmljZSkNCisJCQkJCXsNCisJCQkJCQlvcHRpbXVtLlByaWNlID0gY3VyQW5kTGVuUHJpY2U7DQorCQkJCQkJb3B0aW11bS5Qb3NQcmV2ID0gY3VyOw0KKwkJCQkJCW9wdGltdW0uQmFja1ByZXYgPSByZXBJbmRleDsNCisJCQkJCQlvcHRpbXVtLlByZXYxSXNDaGFyID0gZmFsc2U7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJd2hpbGUgKC0tbGVuVGVzdCA+PSAyKTsNCisJCQkJbGVuVGVzdCA9IGxlblRlc3RUZW1wOw0KKw0KKwkJCQlpZiAocmVwSW5kZXggPT0gMCkNCisJCQkJCXN0YXJ0TGVuID0gbGVuVGVzdCArIDE7DQorDQorCQkJCS8vIGlmIChfbWF4TW9kZSkNCisJCQkJaWYgKGxlblRlc3QgPCBudW1BdmFpbGFibGVCeXRlc0Z1bGwpDQorCQkJCXsNCisJCQkJCWludCB0ID0gTWF0aC5taW4obnVtQXZhaWxhYmxlQnl0ZXNGdWxsIC0gMSAtIGxlblRlc3QsIF9udW1GYXN0Qnl0ZXMpOw0KKwkJCQkJaW50IGxlblRlc3QyID0gX21hdGNoRmluZGVyLkdldE1hdGNoTGVuKGxlblRlc3QsIHJlcHNbcmVwSW5kZXhdLCB0KTsNCisJCQkJCWlmIChsZW5UZXN0MiA+PSAyKQ0KKwkJCQkJew0KKwkJCQkJCWludCBzdGF0ZTIgPSBCYXNlLlN0YXRlVXBkYXRlUmVwKHN0YXRlKTsNCisNCisJCQkJCQlpbnQgcG9zU3RhdGVOZXh0ID0gKHBvc2l0aW9uICsgbGVuVGVzdCkgJiBfcG9zU3RhdGVNYXNrOw0KKwkJCQkJCWludCBjdXJBbmRMZW5DaGFyUHJpY2UgPQ0KKwkJCQkJCQkJcmVwTWF0Y2hQcmljZSArIEdldFJlcFByaWNlKHJlcEluZGV4LCBsZW5UZXN0LCBzdGF0ZSwgcG9zU3RhdGUpICsNCisJCQkJCQkJCVNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZTAoX2lzTWF0Y2hbKHN0YXRlMiA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlTmV4dF0pICsNCisJCQkJCQkJCV9saXRlcmFsRW5jb2Rlci5HZXRTdWJDb2Rlcihwb3NpdGlvbiArIGxlblRlc3QsDQorCQkJCQkJCQlfbWF0Y2hGaW5kZXIuR2V0SW5kZXhCeXRlKGxlblRlc3QgLSAxIC0gMSkpLkdldFByaWNlKHRydWUsDQorCQkJCQkJCQlfbWF0Y2hGaW5kZXIuR2V0SW5kZXhCeXRlKGxlblRlc3QgLSAxIC0gKHJlcHNbcmVwSW5kZXhdICsgMSkpLA0KKwkJCQkJCQkJX21hdGNoRmluZGVyLkdldEluZGV4Qnl0ZShsZW5UZXN0IC0gMSkpOw0KKwkJCQkJCXN0YXRlMiA9IEJhc2UuU3RhdGVVcGRhdGVDaGFyKHN0YXRlMik7DQorCQkJCQkJcG9zU3RhdGVOZXh0ID0gKHBvc2l0aW9uICsgbGVuVGVzdCArIDEpICYgX3Bvc1N0YXRlTWFzazsNCisJCQkJCQlpbnQgbmV4dE1hdGNoUHJpY2UgPSBjdXJBbmRMZW5DaGFyUHJpY2UgKyBTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkVuY29kZXIuR2V0UHJpY2UxKF9pc01hdGNoWyhzdGF0ZTIgPDwgQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heCkgKyBwb3NTdGF0ZU5leHRdKTsNCisJCQkJCQlpbnQgbmV4dFJlcE1hdGNoUHJpY2UgPSBuZXh0TWF0Y2hQcmljZSArIFNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZTEoX2lzUmVwW3N0YXRlMl0pOw0KKw0KKwkJCQkJCS8vIGZvcig7IGxlblRlc3QyID49IDI7IGxlblRlc3QyLS0pDQorCQkJCQkJew0KKwkJCQkJCQlpbnQgb2Zmc2V0ID0gbGVuVGVzdCArIDEgKyBsZW5UZXN0MjsNCisJCQkJCQkJd2hpbGUgKGxlbkVuZCA8IGN1ciArIG9mZnNldCkNCisJCQkJCQkJCV9vcHRpbXVtWysrbGVuRW5kXS5QcmljZSA9IGtJZmluaXR5UHJpY2U7DQorCQkJCQkJCWludCBjdXJBbmRMZW5QcmljZSA9IG5leHRSZXBNYXRjaFByaWNlICsgR2V0UmVwUHJpY2UoMCwgbGVuVGVzdDIsIHN0YXRlMiwgcG9zU3RhdGVOZXh0KTsNCisJCQkJCQkJT3B0aW1hbCBvcHRpbXVtID0gX29wdGltdW1bY3VyICsgb2Zmc2V0XTsNCisJCQkJCQkJaWYgKGN1ckFuZExlblByaWNlIDwgb3B0aW11bS5QcmljZSkNCisJCQkJCQkJew0KKwkJCQkJCQkJb3B0aW11bS5QcmljZSA9IGN1ckFuZExlblByaWNlOw0KKwkJCQkJCQkJb3B0aW11bS5Qb3NQcmV2ID0gY3VyICsgbGVuVGVzdCArIDE7DQorCQkJCQkJCQlvcHRpbXVtLkJhY2tQcmV2ID0gMDsNCisJCQkJCQkJCW9wdGltdW0uUHJldjFJc0NoYXIgPSB0cnVlOw0KKwkJCQkJCQkJb3B0aW11bS5QcmV2MiA9IHRydWU7DQorCQkJCQkJCQlvcHRpbXVtLlBvc1ByZXYyID0gY3VyOw0KKwkJCQkJCQkJb3B0aW11bS5CYWNrUHJldjIgPSByZXBJbmRleDsNCisJCQkJCQkJfQ0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJfQ0KKwkJCX0NCisNCisJCQlpZiAobmV3TGVuID4gbnVtQXZhaWxhYmxlQnl0ZXMpDQorCQkJew0KKwkJCQluZXdMZW4gPSBudW1BdmFpbGFibGVCeXRlczsNCisJCQkJZm9yIChudW1EaXN0YW5jZVBhaXJzID0gMDsgbmV3TGVuID4gX21hdGNoRGlzdGFuY2VzW251bURpc3RhbmNlUGFpcnNdOyBudW1EaXN0YW5jZVBhaXJzICs9IDIpIDsNCisJCQkJX21hdGNoRGlzdGFuY2VzW251bURpc3RhbmNlUGFpcnNdID0gbmV3TGVuOw0KKwkJCQludW1EaXN0YW5jZVBhaXJzICs9IDI7DQorCQkJfQ0KKwkJCWlmIChuZXdMZW4gPj0gc3RhcnRMZW4pDQorCQkJew0KKwkJCQlub3JtYWxNYXRjaFByaWNlID0gbWF0Y2hQcmljZSArIFNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZTAoX2lzUmVwW3N0YXRlXSk7DQorCQkJCXdoaWxlIChsZW5FbmQgPCBjdXIgKyBuZXdMZW4pDQorCQkJCQlfb3B0aW11bVsrK2xlbkVuZF0uUHJpY2UgPSBrSWZpbml0eVByaWNlOw0KKw0KKwkJCQlpbnQgb2ZmcyA9IDA7DQorCQkJCXdoaWxlIChzdGFydExlbiA+IF9tYXRjaERpc3RhbmNlc1tvZmZzXSkNCisJCQkJCW9mZnMgKz0gMjsNCisNCisJCQkJZm9yIChpbnQgbGVuVGVzdCA9IHN0YXJ0TGVuOyA7IGxlblRlc3QrKykNCisJCQkJew0KKwkJCQkJaW50IGN1ckJhY2sgPSBfbWF0Y2hEaXN0YW5jZXNbb2ZmcyArIDFdOw0KKwkJCQkJaW50IGN1ckFuZExlblByaWNlID0gbm9ybWFsTWF0Y2hQcmljZSArIEdldFBvc0xlblByaWNlKGN1ckJhY2ssIGxlblRlc3QsIHBvc1N0YXRlKTsNCisJCQkJCU9wdGltYWwgb3B0aW11bSA9IF9vcHRpbXVtW2N1ciArIGxlblRlc3RdOw0KKwkJCQkJaWYgKGN1ckFuZExlblByaWNlIDwgb3B0aW11bS5QcmljZSkNCisJCQkJCXsNCisJCQkJCQlvcHRpbXVtLlByaWNlID0gY3VyQW5kTGVuUHJpY2U7DQorCQkJCQkJb3B0aW11bS5Qb3NQcmV2ID0gY3VyOw0KKwkJCQkJCW9wdGltdW0uQmFja1ByZXYgPSBjdXJCYWNrICsgQmFzZS5rTnVtUmVwRGlzdGFuY2VzOw0KKwkJCQkJCW9wdGltdW0uUHJldjFJc0NoYXIgPSBmYWxzZTsNCisJCQkJCX0NCisNCisJCQkJCWlmIChsZW5UZXN0ID09IF9tYXRjaERpc3RhbmNlc1tvZmZzXSkNCisJCQkJCXsNCisJCQkJCQlpZiAobGVuVGVzdCA8IG51bUF2YWlsYWJsZUJ5dGVzRnVsbCkNCisJCQkJCQl7DQorCQkJCQkJCWludCB0ID0gTWF0aC5taW4obnVtQXZhaWxhYmxlQnl0ZXNGdWxsIC0gMSAtIGxlblRlc3QsIF9udW1GYXN0Qnl0ZXMpOw0KKwkJCQkJCQlpbnQgbGVuVGVzdDIgPSBfbWF0Y2hGaW5kZXIuR2V0TWF0Y2hMZW4obGVuVGVzdCwgY3VyQmFjaywgdCk7DQorCQkJCQkJCWlmIChsZW5UZXN0MiA+PSAyKQ0KKwkJCQkJCQl7DQorCQkJCQkJCQlpbnQgc3RhdGUyID0gQmFzZS5TdGF0ZVVwZGF0ZU1hdGNoKHN0YXRlKTsNCisNCisJCQkJCQkJCWludCBwb3NTdGF0ZU5leHQgPSAocG9zaXRpb24gKyBsZW5UZXN0KSAmIF9wb3NTdGF0ZU1hc2s7DQorCQkJCQkJCQlpbnQgY3VyQW5kTGVuQ2hhclByaWNlID0gY3VyQW5kTGVuUHJpY2UgKw0KKwkJCQkJCQkJCVNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5HZXRQcmljZTAoX2lzTWF0Y2hbKHN0YXRlMiA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlTmV4dF0pICsNCisJCQkJCQkJCQlfbGl0ZXJhbEVuY29kZXIuR2V0U3ViQ29kZXIocG9zaXRpb24gKyBsZW5UZXN0LA0KKwkJCQkJCQkJCV9tYXRjaEZpbmRlci5HZXRJbmRleEJ5dGUobGVuVGVzdCAtIDEgLSAxKSkuDQorCQkJCQkJCQkJR2V0UHJpY2UodHJ1ZSwNCisJCQkJCQkJCQlfbWF0Y2hGaW5kZXIuR2V0SW5kZXhCeXRlKGxlblRlc3QgLSAoY3VyQmFjayArIDEpIC0gMSksDQorCQkJCQkJCQkJX21hdGNoRmluZGVyLkdldEluZGV4Qnl0ZShsZW5UZXN0IC0gMSkpOw0KKwkJCQkJCQkJc3RhdGUyID0gQmFzZS5TdGF0ZVVwZGF0ZUNoYXIoc3RhdGUyKTsNCisJCQkJCQkJCXBvc1N0YXRlTmV4dCA9IChwb3NpdGlvbiArIGxlblRlc3QgKyAxKSAmIF9wb3NTdGF0ZU1hc2s7DQorCQkJCQkJCQlpbnQgbmV4dE1hdGNoUHJpY2UgPSBjdXJBbmRMZW5DaGFyUHJpY2UgKyBTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyLkVuY29kZXIuR2V0UHJpY2UxKF9pc01hdGNoWyhzdGF0ZTIgPDwgQmFzZS5rTnVtUG9zU3RhdGVzQml0c01heCkgKyBwb3NTdGF0ZU5leHRdKTsNCisJCQkJCQkJCWludCBuZXh0UmVwTWF0Y2hQcmljZSA9IG5leHRNYXRjaFByaWNlICsgU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2Rlci5FbmNvZGVyLkdldFByaWNlMShfaXNSZXBbc3RhdGUyXSk7DQorDQorCQkJCQkJCQlpbnQgb2Zmc2V0ID0gbGVuVGVzdCArIDEgKyBsZW5UZXN0MjsNCisJCQkJCQkJCXdoaWxlIChsZW5FbmQgPCBjdXIgKyBvZmZzZXQpDQorCQkJCQkJCQkJX29wdGltdW1bKytsZW5FbmRdLlByaWNlID0ga0lmaW5pdHlQcmljZTsNCisJCQkJCQkJCWN1ckFuZExlblByaWNlID0gbmV4dFJlcE1hdGNoUHJpY2UgKyBHZXRSZXBQcmljZSgwLCBsZW5UZXN0Miwgc3RhdGUyLCBwb3NTdGF0ZU5leHQpOw0KKwkJCQkJCQkJb3B0aW11bSA9IF9vcHRpbXVtW2N1ciArIG9mZnNldF07DQorCQkJCQkJCQlpZiAoY3VyQW5kTGVuUHJpY2UgPCBvcHRpbXVtLlByaWNlKQ0KKwkJCQkJCQkJew0KKwkJCQkJCQkJCW9wdGltdW0uUHJpY2UgPSBjdXJBbmRMZW5QcmljZTsNCisJCQkJCQkJCQlvcHRpbXVtLlBvc1ByZXYgPSBjdXIgKyBsZW5UZXN0ICsgMTsNCisJCQkJCQkJCQlvcHRpbXVtLkJhY2tQcmV2ID0gMDsNCisJCQkJCQkJCQlvcHRpbXVtLlByZXYxSXNDaGFyID0gdHJ1ZTsNCisJCQkJCQkJCQlvcHRpbXVtLlByZXYyID0gdHJ1ZTsNCisJCQkJCQkJCQlvcHRpbXVtLlBvc1ByZXYyID0gY3VyOw0KKwkJCQkJCQkJCW9wdGltdW0uQmFja1ByZXYyID0gY3VyQmFjayArIEJhc2Uua051bVJlcERpc3RhbmNlczsNCisJCQkJCQkJCX0NCisJCQkJCQkJfQ0KKwkJCQkJCX0NCisJCQkJCQlvZmZzICs9IDI7DQorCQkJCQkJaWYgKG9mZnMgPT0gbnVtRGlzdGFuY2VQYWlycykNCisJCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0NCisNCisJYm9vbGVhbiBDaGFuZ2VQYWlyKGludCBzbWFsbERpc3QsIGludCBiaWdEaXN0KQ0KKwl7DQorCQlpbnQga0RpZiA9IDc7DQorCQlyZXR1cm4gKHNtYWxsRGlzdCA8ICgxIDw8ICgzMiAtIGtEaWYpKSAmJiBiaWdEaXN0ID49IChzbWFsbERpc3QgPDwga0RpZikpOw0KKwl9DQorDQorCXZvaWQgV3JpdGVFbmRNYXJrZXIoaW50IHBvc1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24NCisJew0KKwkJaWYgKCFfd3JpdGVFbmRNYXJrKQ0KKwkJCXJldHVybjsNCisNCisJCV9yYW5nZUVuY29kZXIuRW5jb2RlKF9pc01hdGNoLCAoX3N0YXRlIDw8IEJhc2Uua051bVBvc1N0YXRlc0JpdHNNYXgpICsgcG9zU3RhdGUsIDEpOw0KKwkJX3JhbmdlRW5jb2Rlci5FbmNvZGUoX2lzUmVwLCBfc3RhdGUsIDApOw0KKwkJX3N0YXRlID0gQmFzZS5TdGF0ZVVwZGF0ZU1hdGNoKF9zdGF0ZSk7DQorCQlpbnQgbGVuID0gQmFzZS5rTWF0Y2hNaW5MZW47DQorCQlfbGVuRW5jb2Rlci5FbmNvZGUoX3JhbmdlRW5jb2RlciwgbGVuIC0gQmFzZS5rTWF0Y2hNaW5MZW4sIHBvc1N0YXRlKTsNCisJCWludCBwb3NTbG90ID0gKDEgPDwgQmFzZS5rTnVtUG9zU2xvdEJpdHMpIC0gMTsNCisJCWludCBsZW5Ub1Bvc1N0YXRlID0gQmFzZS5HZXRMZW5Ub1Bvc1N0YXRlKGxlbik7DQorCQlfcG9zU2xvdEVuY29kZXJbbGVuVG9Qb3NTdGF0ZV0uRW5jb2RlKF9yYW5nZUVuY29kZXIsIHBvc1Nsb3QpOw0KKwkJaW50IGZvb3RlckJpdHMgPSAzMDsNCisJCWludCBwb3NSZWR1Y2VkID0gKDEgPDwgZm9vdGVyQml0cykgLSAxOw0KKwkJX3JhbmdlRW5jb2Rlci5FbmNvZGVEaXJlY3RCaXRzKHBvc1JlZHVjZWQgPj4gQmFzZS5rTnVtQWxpZ25CaXRzLCBmb290ZXJCaXRzIC0gQmFzZS5rTnVtQWxpZ25CaXRzKTsNCisJCV9wb3NBbGlnbkVuY29kZXIuUmV2ZXJzZUVuY29kZShfcmFuZ2VFbmNvZGVyLCBwb3NSZWR1Y2VkICYgQmFzZS5rQWxpZ25NYXNrKTsNCisJfQ0KKw0KKwl2b2lkIEZsdXNoKGludCBub3dQb3MpIHRocm93cyBJT0V4Y2VwdGlvbg0KKwl7DQorCQlSZWxlYXNlTUZTdHJlYW0oKTsNCisJCVdyaXRlRW5kTWFya2VyKG5vd1BvcyAmIF9wb3NTdGF0ZU1hc2spOw0KKwkJX3JhbmdlRW5jb2Rlci5GbHVzaERhdGEoKTsNCisJCV9yYW5nZUVuY29kZXIuRmx1c2hTdHJlYW0oKTsNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCBDb2RlT25lQmxvY2sobG9uZ1tdIGluU2l6ZSwgbG9uZ1tdIG91dFNpemUsIGJvb2xlYW5bXSBmaW5pc2hlZCkgdGhyb3dzIElPRXhjZXB0aW9uDQorCXsNCisJCWluU2l6ZVswXSA9IDA7DQorCQlvdXRTaXplWzBdID0gMDsNCisJCWZpbmlzaGVkWzBdID0gdHJ1ZTsNCisNCisJCWlmIChfaW5TdHJlYW0gIT0gbnVsbCkNCisJCXsNCisJCQlfbWF0Y2hGaW5kZXIuU2V0U3RyZWFtKF9pblN0cmVhbSk7DQorCQkJX21hdGNoRmluZGVyLkluaXQoKTsNCisJCQlfbmVlZFJlbGVhc2VNRlN0cmVhbSA9IHRydWU7DQorCQkJX2luU3RyZWFtID0gbnVsbDsNCisJCX0NCisNCisJCWlmIChfZmluaXNoZWQpDQorCQkJcmV0dXJuOw0KKwkJX2ZpbmlzaGVkID0gdHJ1ZTsNCisNCisNCisJCWxvbmcgcHJvZ3Jlc3NQb3NWYWx1ZVByZXYgPSBub3dQb3M2NDsNCisJCWlmIChub3dQb3M2NCA9PSAwKQ0KKwkJew0KKwkJCWlmIChfbWF0Y2hGaW5kZXIuR2V0TnVtQXZhaWxhYmxlQnl0ZXMoKSA9PSAwKQ0KKwkJCXsNCisJCQkJRmx1c2goKGludClub3dQb3M2NCk7DQorCQkJCXJldHVybjsNCisJCQl9DQorDQorCQkJUmVhZE1hdGNoRGlzdGFuY2VzKCk7DQorCQkJaW50IHBvc1N0YXRlID0gKGludCkobm93UG9zNjQpICYgX3Bvc1N0YXRlTWFzazsNCisJCQlfcmFuZ2VFbmNvZGVyLkVuY29kZShfaXNNYXRjaCwgKF9zdGF0ZSA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlLCAwKTsNCisJCQlfc3RhdGUgPSBCYXNlLlN0YXRlVXBkYXRlQ2hhcihfc3RhdGUpOw0KKwkJCWJ5dGUgY3VyQnl0ZSA9IF9tYXRjaEZpbmRlci5HZXRJbmRleEJ5dGUoMCAtIF9hZGRpdGlvbmFsT2Zmc2V0KTsNCisJCQlfbGl0ZXJhbEVuY29kZXIuR2V0U3ViQ29kZXIoKGludCkobm93UG9zNjQpLCBfcHJldmlvdXNCeXRlKS5FbmNvZGUoX3JhbmdlRW5jb2RlciwgY3VyQnl0ZSk7DQorCQkJX3ByZXZpb3VzQnl0ZSA9IGN1ckJ5dGU7DQorCQkJX2FkZGl0aW9uYWxPZmZzZXQtLTsNCisJCQlub3dQb3M2NCsrOw0KKwkJfQ0KKwkJaWYgKF9tYXRjaEZpbmRlci5HZXROdW1BdmFpbGFibGVCeXRlcygpID09IDApDQorCQl7DQorCQkJRmx1c2goKGludClub3dQb3M2NCk7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwkJd2hpbGUgKHRydWUpDQorCQl7DQorDQorCQkJaW50IGxlbiA9IEdldE9wdGltdW0oKGludClub3dQb3M2NCk7DQorCQkJaW50IHBvcyA9IGJhY2tSZXM7DQorCQkJaW50IHBvc1N0YXRlID0gKChpbnQpbm93UG9zNjQpICYgX3Bvc1N0YXRlTWFzazsNCisJCQlpbnQgY29tcGxleFN0YXRlID0gKF9zdGF0ZSA8PCBCYXNlLmtOdW1Qb3NTdGF0ZXNCaXRzTWF4KSArIHBvc1N0YXRlOw0KKwkJCWlmIChsZW4gPT0gMSAmJiBwb3MgPT0gLTEpDQorCQkJew0KKwkJCQlfcmFuZ2VFbmNvZGVyLkVuY29kZShfaXNNYXRjaCwgY29tcGxleFN0YXRlLCAwKTsNCisJCQkJYnl0ZSBjdXJCeXRlID0gX21hdGNoRmluZGVyLkdldEluZGV4Qnl0ZSgoaW50KSgwIC0gX2FkZGl0aW9uYWxPZmZzZXQpKTsNCisJCQkJTGl0ZXJhbEVuY29kZXIuRW5jb2RlcjIgc3ViQ29kZXIgPSBfbGl0ZXJhbEVuY29kZXIuR2V0U3ViQ29kZXIoKGludClub3dQb3M2NCwgX3ByZXZpb3VzQnl0ZSk7DQorCQkJCWlmICghQmFzZS5TdGF0ZUlzQ2hhclN0YXRlKF9zdGF0ZSkpDQorCQkJCXsNCisJCQkJCWJ5dGUgbWF0Y2hCeXRlID0gX21hdGNoRmluZGVyLkdldEluZGV4Qnl0ZSgoaW50KSgwIC0gX3JlcERpc3RhbmNlc1swXSAtIDEgLSBfYWRkaXRpb25hbE9mZnNldCkpOw0KKwkJCQkJc3ViQ29kZXIuRW5jb2RlTWF0Y2hlZChfcmFuZ2VFbmNvZGVyLCBtYXRjaEJ5dGUsIGN1ckJ5dGUpOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJCXN1YkNvZGVyLkVuY29kZShfcmFuZ2VFbmNvZGVyLCBjdXJCeXRlKTsNCisJCQkJX3ByZXZpb3VzQnl0ZSA9IGN1ckJ5dGU7DQorCQkJCV9zdGF0ZSA9IEJhc2UuU3RhdGVVcGRhdGVDaGFyKF9zdGF0ZSk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCV9yYW5nZUVuY29kZXIuRW5jb2RlKF9pc01hdGNoLCBjb21wbGV4U3RhdGUsIDEpOw0KKwkJCQlpZiAocG9zIDwgQmFzZS5rTnVtUmVwRGlzdGFuY2VzKQ0KKwkJCQl7DQorCQkJCQlfcmFuZ2VFbmNvZGVyLkVuY29kZShfaXNSZXAsIF9zdGF0ZSwgMSk7DQorCQkJCQlpZiAocG9zID09IDApDQorCQkJCQl7DQorCQkJCQkJX3JhbmdlRW5jb2Rlci5FbmNvZGUoX2lzUmVwRzAsIF9zdGF0ZSwgMCk7DQorCQkJCQkJaWYgKGxlbiA9PSAxKQ0KKwkJCQkJCQlfcmFuZ2VFbmNvZGVyLkVuY29kZShfaXNSZXAwTG9uZywgY29tcGxleFN0YXRlLCAwKTsNCisJCQkJCQllbHNlDQorCQkJCQkJCV9yYW5nZUVuY29kZXIuRW5jb2RlKF9pc1JlcDBMb25nLCBjb21wbGV4U3RhdGUsIDEpOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCV9yYW5nZUVuY29kZXIuRW5jb2RlKF9pc1JlcEcwLCBfc3RhdGUsIDEpOw0KKwkJCQkJCWlmIChwb3MgPT0gMSkNCisJCQkJCQkJX3JhbmdlRW5jb2Rlci5FbmNvZGUoX2lzUmVwRzEsIF9zdGF0ZSwgMCk7DQorCQkJCQkJZWxzZQ0KKwkJCQkJCXsNCisJCQkJCQkJX3JhbmdlRW5jb2Rlci5FbmNvZGUoX2lzUmVwRzEsIF9zdGF0ZSwgMSk7DQorCQkJCQkJCV9yYW5nZUVuY29kZXIuRW5jb2RlKF9pc1JlcEcyLCBfc3RhdGUsIHBvcyAtIDIpOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJCWlmIChsZW4gPT0gMSkNCisJCQkJCQlfc3RhdGUgPSBCYXNlLlN0YXRlVXBkYXRlU2hvcnRSZXAoX3N0YXRlKTsNCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQlfcmVwTWF0Y2hMZW5FbmNvZGVyLkVuY29kZShfcmFuZ2VFbmNvZGVyLCBsZW4gLSBCYXNlLmtNYXRjaE1pbkxlbiwgcG9zU3RhdGUpOw0KKwkJCQkJCV9zdGF0ZSA9IEJhc2UuU3RhdGVVcGRhdGVSZXAoX3N0YXRlKTsNCisJCQkJCX0NCisJCQkJCWludCBkaXN0YW5jZSA9IF9yZXBEaXN0YW5jZXNbcG9zXTsNCisJCQkJCWlmIChwb3MgIT0gMCkNCisJCQkJCXsNCisJCQkJCQlmb3IgKGludCBpID0gcG9zOyBpID49IDE7IGktLSkNCisJCQkJCQkJX3JlcERpc3RhbmNlc1tpXSA9IF9yZXBEaXN0YW5jZXNbaSAtIDFdOw0KKwkJCQkJCV9yZXBEaXN0YW5jZXNbMF0gPSBkaXN0YW5jZTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCV9yYW5nZUVuY29kZXIuRW5jb2RlKF9pc1JlcCwgX3N0YXRlLCAwKTsNCisJCQkJCV9zdGF0ZSA9IEJhc2UuU3RhdGVVcGRhdGVNYXRjaChfc3RhdGUpOw0KKwkJCQkJX2xlbkVuY29kZXIuRW5jb2RlKF9yYW5nZUVuY29kZXIsIGxlbiAtIEJhc2Uua01hdGNoTWluTGVuLCBwb3NTdGF0ZSk7DQorCQkJCQlwb3MgLT0gQmFzZS5rTnVtUmVwRGlzdGFuY2VzOw0KKwkJCQkJaW50IHBvc1Nsb3QgPSBHZXRQb3NTbG90KHBvcyk7DQorCQkJCQlpbnQgbGVuVG9Qb3NTdGF0ZSA9IEJhc2UuR2V0TGVuVG9Qb3NTdGF0ZShsZW4pOw0KKwkJCQkJX3Bvc1Nsb3RFbmNvZGVyW2xlblRvUG9zU3RhdGVdLkVuY29kZShfcmFuZ2VFbmNvZGVyLCBwb3NTbG90KTsNCisNCisJCQkJCWlmIChwb3NTbG90ID49IEJhc2Uua1N0YXJ0UG9zTW9kZWxJbmRleCkNCisJCQkJCXsNCisJCQkJCQlpbnQgZm9vdGVyQml0cyA9IChpbnQpKChwb3NTbG90ID4+IDEpIC0gMSk7DQorCQkJCQkJaW50IGJhc2VWYWwgPSAoKDIgfCAocG9zU2xvdCAmIDEpKSA8PCBmb290ZXJCaXRzKTsNCisJCQkJCQlpbnQgcG9zUmVkdWNlZCA9IHBvcyAtIGJhc2VWYWw7DQorDQorCQkJCQkJaWYgKHBvc1Nsb3QgPCBCYXNlLmtFbmRQb3NNb2RlbEluZGV4KQ0KKwkJCQkJCQlCaXRUcmVlRW5jb2Rlci5SZXZlcnNlRW5jb2RlKF9wb3NFbmNvZGVycywNCisJCQkJCQkJCQliYXNlVmFsIC0gcG9zU2xvdCAtIDEsIF9yYW5nZUVuY29kZXIsIGZvb3RlckJpdHMsIHBvc1JlZHVjZWQpOw0KKwkJCQkJCWVsc2UNCisJCQkJCQl7DQorCQkJCQkJCV9yYW5nZUVuY29kZXIuRW5jb2RlRGlyZWN0Qml0cyhwb3NSZWR1Y2VkID4+IEJhc2Uua051bUFsaWduQml0cywgZm9vdGVyQml0cyAtIEJhc2Uua051bUFsaWduQml0cyk7DQorCQkJCQkJCV9wb3NBbGlnbkVuY29kZXIuUmV2ZXJzZUVuY29kZShfcmFuZ2VFbmNvZGVyLCBwb3NSZWR1Y2VkICYgQmFzZS5rQWxpZ25NYXNrKTsNCisJCQkJCQkJX2FsaWduUHJpY2VDb3VudCsrOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJCWludCBkaXN0YW5jZSA9IHBvczsNCisJCQkJCWZvciAoaW50IGkgPSBCYXNlLmtOdW1SZXBEaXN0YW5jZXMgLSAxOyBpID49IDE7IGktLSkNCisJCQkJCQlfcmVwRGlzdGFuY2VzW2ldID0gX3JlcERpc3RhbmNlc1tpIC0gMV07DQorCQkJCQlfcmVwRGlzdGFuY2VzWzBdID0gZGlzdGFuY2U7DQorCQkJCQlfbWF0Y2hQcmljZUNvdW50Kys7DQorCQkJCX0NCisJCQkJX3ByZXZpb3VzQnl0ZSA9IF9tYXRjaEZpbmRlci5HZXRJbmRleEJ5dGUobGVuIC0gMSAtIF9hZGRpdGlvbmFsT2Zmc2V0KTsNCisJCQl9DQorCQkJX2FkZGl0aW9uYWxPZmZzZXQgLT0gbGVuOw0KKwkJCW5vd1BvczY0ICs9IGxlbjsNCisJCQlpZiAoX2FkZGl0aW9uYWxPZmZzZXQgPT0gMCkNCisJCQl7DQorCQkJCS8vIGlmICghX2Zhc3RNb2RlKQ0KKwkJCQlpZiAoX21hdGNoUHJpY2VDb3VudCA+PSAoMSA8PCA3KSkNCisJCQkJCUZpbGxEaXN0YW5jZXNQcmljZXMoKTsNCisJCQkJaWYgKF9hbGlnblByaWNlQ291bnQgPj0gQmFzZS5rQWxpZ25UYWJsZVNpemUpDQorCQkJCQlGaWxsQWxpZ25QcmljZXMoKTsNCisJCQkJaW5TaXplWzBdID0gbm93UG9zNjQ7DQorCQkJCW91dFNpemVbMF0gPSBfcmFuZ2VFbmNvZGVyLkdldFByb2Nlc3NlZFNpemVBZGQoKTsNCisJCQkJaWYgKF9tYXRjaEZpbmRlci5HZXROdW1BdmFpbGFibGVCeXRlcygpID09IDApDQorCQkJCXsNCisJCQkJCUZsdXNoKChpbnQpbm93UG9zNjQpOw0KKwkJCQkJcmV0dXJuOw0KKwkJCQl9DQorDQorCQkJCWlmIChub3dQb3M2NCAtIHByb2dyZXNzUG9zVmFsdWVQcmV2ID49ICgxIDw8IDEyKSkNCisJCQkJew0KKwkJCQkJX2ZpbmlzaGVkID0gZmFsc2U7DQorCQkJCQlmaW5pc2hlZFswXSA9IGZhbHNlOw0KKwkJCQkJcmV0dXJuOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXZvaWQgUmVsZWFzZU1GU3RyZWFtKCkNCisJew0KKwkJaWYgKF9tYXRjaEZpbmRlciAhPSBudWxsICYmIF9uZWVkUmVsZWFzZU1GU3RyZWFtKQ0KKwkJew0KKwkJCV9tYXRjaEZpbmRlci5SZWxlYXNlU3RyZWFtKCk7DQorCQkJX25lZWRSZWxlYXNlTUZTdHJlYW0gPSBmYWxzZTsNCisJCX0NCisJfQ0KKw0KKwl2b2lkIFNldE91dFN0cmVhbShqYXZhLmlvLk91dHB1dFN0cmVhbSBvdXRTdHJlYW0pDQorCXsgX3JhbmdlRW5jb2Rlci5TZXRTdHJlYW0ob3V0U3RyZWFtKTsgfQ0KKwl2b2lkIFJlbGVhc2VPdXRTdHJlYW0oKQ0KKwl7IF9yYW5nZUVuY29kZXIuUmVsZWFzZVN0cmVhbSgpOyB9DQorDQorCXZvaWQgUmVsZWFzZVN0cmVhbXMoKQ0KKwl7DQorCQlSZWxlYXNlTUZTdHJlYW0oKTsNCisJCVJlbGVhc2VPdXRTdHJlYW0oKTsNCisJfQ0KKw0KKwl2b2lkIFNldFN0cmVhbXMoamF2YS5pby5JbnB1dFN0cmVhbSBpblN0cmVhbSwgamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0U3RyZWFtLA0KKwkJCWxvbmcgaW5TaXplLCBsb25nIG91dFNpemUpDQorCXsNCisJCV9pblN0cmVhbSA9IGluU3RyZWFtOw0KKwkJX2ZpbmlzaGVkID0gZmFsc2U7DQorCQlDcmVhdGUoKTsNCisJCVNldE91dFN0cmVhbShvdXRTdHJlYW0pOw0KKwkJSW5pdCgpOw0KKw0KKwkJLy8gaWYgKCFfZmFzdE1vZGUpDQorCQl7DQorCQkJRmlsbERpc3RhbmNlc1ByaWNlcygpOw0KKwkJCUZpbGxBbGlnblByaWNlcygpOw0KKwkJfQ0KKw0KKwkJX2xlbkVuY29kZXIuU2V0VGFibGVTaXplKF9udW1GYXN0Qnl0ZXMgKyAxIC0gQmFzZS5rTWF0Y2hNaW5MZW4pOw0KKwkJX2xlbkVuY29kZXIuVXBkYXRlVGFibGVzKDEgPDwgX3Bvc1N0YXRlQml0cyk7DQorCQlfcmVwTWF0Y2hMZW5FbmNvZGVyLlNldFRhYmxlU2l6ZShfbnVtRmFzdEJ5dGVzICsgMSAtIEJhc2Uua01hdGNoTWluTGVuKTsNCisJCV9yZXBNYXRjaExlbkVuY29kZXIuVXBkYXRlVGFibGVzKDEgPDwgX3Bvc1N0YXRlQml0cyk7DQorDQorCQlub3dQb3M2NCA9IDA7DQorCX0NCisNCisJbG9uZ1tdIHByb2Nlc3NlZEluU2l6ZSA9IG5ldyBsb25nWzFdOyBsb25nW10gcHJvY2Vzc2VkT3V0U2l6ZSA9IG5ldyBsb25nWzFdOyBib29sZWFuW10gZmluaXNoZWQgPSBuZXcgYm9vbGVhblsxXTsNCisJcHVibGljIHZvaWQgQ29kZShqYXZhLmlvLklucHV0U3RyZWFtIGluU3RyZWFtLCBqYXZhLmlvLk91dHB1dFN0cmVhbSBvdXRTdHJlYW0sDQorCQkJbG9uZyBpblNpemUsIGxvbmcgb3V0U2l6ZSwgSUNvZGVQcm9ncmVzcyBwcm9ncmVzcykgdGhyb3dzIElPRXhjZXB0aW9uDQorCXsNCisJCV9uZWVkUmVsZWFzZU1GU3RyZWFtID0gZmFsc2U7DQorCQl0cnkNCisJCXsNCisJCQlTZXRTdHJlYW1zKGluU3RyZWFtLCBvdXRTdHJlYW0sIGluU2l6ZSwgb3V0U2l6ZSk7DQorCQkJd2hpbGUgKHRydWUpDQorCQkJew0KKw0KKw0KKw0KKwkJCQlDb2RlT25lQmxvY2socHJvY2Vzc2VkSW5TaXplLCBwcm9jZXNzZWRPdXRTaXplLCBmaW5pc2hlZCk7DQorCQkJCWlmIChmaW5pc2hlZFswXSkNCisJCQkJCXJldHVybjsNCisJCQkJaWYgKHByb2dyZXNzICE9IG51bGwpDQorCQkJCXsNCisJCQkJCXByb2dyZXNzLlNldFByb2dyZXNzKHByb2Nlc3NlZEluU2l6ZVswXSwgcHJvY2Vzc2VkT3V0U2l6ZVswXSk7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQlmaW5hbGx5DQorCQl7DQorCQkJUmVsZWFzZVN0cmVhbXMoKTsNCisJCX0NCisJfQ0KKw0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrUHJvcFNpemUgPSA1Ow0KKwlieXRlW10gcHJvcGVydGllcyA9IG5ldyBieXRlW2tQcm9wU2l6ZV07DQorDQorCXB1YmxpYyB2b2lkIFdyaXRlQ29kZXJQcm9wZXJ0aWVzKGphdmEuaW8uT3V0cHV0U3RyZWFtIG91dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uDQorCXsNCisJCXByb3BlcnRpZXNbMF0gPSAoYnl0ZSkoKF9wb3NTdGF0ZUJpdHMgKiA1ICsgX251bUxpdGVyYWxQb3NTdGF0ZUJpdHMpICogOSArIF9udW1MaXRlcmFsQ29udGV4dEJpdHMpOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspDQorCQkJcHJvcGVydGllc1sxICsgaV0gPSAoYnl0ZSkoX2RpY3Rpb25hcnlTaXplID4+ICg4ICogaSkpOw0KKwkJb3V0U3RyZWFtLndyaXRlKHByb3BlcnRpZXMsIDAsIGtQcm9wU2l6ZSk7DQorCX0NCisNCisJaW50W10gdGVtcFByaWNlcyA9IG5ldyBpbnRbQmFzZS5rTnVtRnVsbERpc3RhbmNlc107DQorCWludCBfbWF0Y2hQcmljZUNvdW50Ow0KKw0KKwl2b2lkIEZpbGxEaXN0YW5jZXNQcmljZXMoKQ0KKwl7DQorCQlmb3IgKGludCBpID0gQmFzZS5rU3RhcnRQb3NNb2RlbEluZGV4OyBpIDwgQmFzZS5rTnVtRnVsbERpc3RhbmNlczsgaSsrKQ0KKwkJew0KKwkJCWludCBwb3NTbG90ID0gR2V0UG9zU2xvdChpKTsNCisJCQlpbnQgZm9vdGVyQml0cyA9IChpbnQpKChwb3NTbG90ID4+IDEpIC0gMSk7DQorCQkJaW50IGJhc2VWYWwgPSAoKDIgfCAocG9zU2xvdCAmIDEpKSA8PCBmb290ZXJCaXRzKTsNCisJCQl0ZW1wUHJpY2VzW2ldID0gQml0VHJlZUVuY29kZXIuUmV2ZXJzZUdldFByaWNlKF9wb3NFbmNvZGVycywNCisJCQkJYmFzZVZhbCAtIHBvc1Nsb3QgLSAxLCBmb290ZXJCaXRzLCBpIC0gYmFzZVZhbCk7DQorCQl9DQorDQorCQlmb3IgKGludCBsZW5Ub1Bvc1N0YXRlID0gMDsgbGVuVG9Qb3NTdGF0ZSA8IEJhc2Uua051bUxlblRvUG9zU3RhdGVzOyBsZW5Ub1Bvc1N0YXRlKyspDQorCQl7DQorCQkJaW50IHBvc1Nsb3Q7DQorCQkJQml0VHJlZUVuY29kZXIgZW5jb2RlciA9IF9wb3NTbG90RW5jb2RlcltsZW5Ub1Bvc1N0YXRlXTsNCisNCisJCQlpbnQgc3QgPSAobGVuVG9Qb3NTdGF0ZSA8PCBCYXNlLmtOdW1Qb3NTbG90Qml0cyk7DQorCQkJZm9yIChwb3NTbG90ID0gMDsgcG9zU2xvdCA8IF9kaXN0VGFibGVTaXplOyBwb3NTbG90KyspDQorCQkJCV9wb3NTbG90UHJpY2VzW3N0ICsgcG9zU2xvdF0gPSBlbmNvZGVyLkdldFByaWNlKHBvc1Nsb3QpOw0KKwkJCWZvciAocG9zU2xvdCA9IEJhc2Uua0VuZFBvc01vZGVsSW5kZXg7IHBvc1Nsb3QgPCBfZGlzdFRhYmxlU2l6ZTsgcG9zU2xvdCsrKQ0KKwkJCQlfcG9zU2xvdFByaWNlc1tzdCArIHBvc1Nsb3RdICs9ICgoKChwb3NTbG90ID4+IDEpIC0gMSkgLSBCYXNlLmtOdW1BbGlnbkJpdHMpIDw8IFNldmVuWmlwLkNvbXByZXNzaW9uLlJhbmdlQ29kZXIuRW5jb2Rlci5rTnVtQml0UHJpY2VTaGlmdEJpdHMpOw0KKw0KKwkJCWludCBzdDIgPSBsZW5Ub1Bvc1N0YXRlICogQmFzZS5rTnVtRnVsbERpc3RhbmNlczsNCisJCQlpbnQgaTsNCisJCQlmb3IgKGkgPSAwOyBpIDwgQmFzZS5rU3RhcnRQb3NNb2RlbEluZGV4OyBpKyspDQorCQkJCV9kaXN0YW5jZXNQcmljZXNbc3QyICsgaV0gPSBfcG9zU2xvdFByaWNlc1tzdCArIGldOw0KKwkJCWZvciAoOyBpIDwgQmFzZS5rTnVtRnVsbERpc3RhbmNlczsgaSsrKQ0KKwkJCQlfZGlzdGFuY2VzUHJpY2VzW3N0MiArIGldID0gX3Bvc1Nsb3RQcmljZXNbc3QgKyBHZXRQb3NTbG90KGkpXSArIHRlbXBQcmljZXNbaV07DQorCQl9DQorCQlfbWF0Y2hQcmljZUNvdW50ID0gMDsNCisJfQ0KKw0KKwl2b2lkIEZpbGxBbGlnblByaWNlcygpDQorCXsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgQmFzZS5rQWxpZ25UYWJsZVNpemU7IGkrKykNCisJCQlfYWxpZ25QcmljZXNbaV0gPSBfcG9zQWxpZ25FbmNvZGVyLlJldmVyc2VHZXRQcmljZShpKTsNCisJCV9hbGlnblByaWNlQ291bnQgPSAwOw0KKwl9DQorDQorDQorCXB1YmxpYyBib29sZWFuIFNldEFsZ29yaXRobShpbnQgYWxnb3JpdGhtKQ0KKwl7DQorCQkvKg0KKwkJX2Zhc3RNb2RlID0gKGFsZ29yaXRobSA9PSAwKTsNCisJCV9tYXhNb2RlID0gKGFsZ29yaXRobSA+PSAyKTsNCisJCSovDQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwlwdWJsaWMgYm9vbGVhbiBTZXREaWN0aW9uYXJ5U2l6ZShpbnQgZGljdGlvbmFyeVNpemUpDQorCXsNCisJCWludCBrRGljTG9nU2l6ZU1heENvbXByZXNzID0gMjk7DQorCQlpZiAoZGljdGlvbmFyeVNpemUgPCAoMSA8PCBCYXNlLmtEaWNMb2dTaXplTWluKSB8fCBkaWN0aW9uYXJ5U2l6ZSA+ICgxIDw8IGtEaWNMb2dTaXplTWF4Q29tcHJlc3MpKQ0KKwkJCXJldHVybiBmYWxzZTsNCisJCV9kaWN0aW9uYXJ5U2l6ZSA9IGRpY3Rpb25hcnlTaXplOw0KKwkJaW50IGRpY0xvZ1NpemU7DQorCQlmb3IgKGRpY0xvZ1NpemUgPSAwOyBkaWN0aW9uYXJ5U2l6ZSA+ICgxIDw8IGRpY0xvZ1NpemUpOyBkaWNMb2dTaXplKyspIDsNCisJCV9kaXN0VGFibGVTaXplID0gZGljTG9nU2l6ZSAqIDI7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwlwdWJsaWMgYm9vbGVhbiBTZXROdW1GYXN0Qnl0ZXMoaW50IG51bUZhc3RCeXRlcykNCisJew0KKwkJaWYgKG51bUZhc3RCeXRlcyA8IDUgfHwgbnVtRmFzdEJ5dGVzID4gQmFzZS5rTWF0Y2hNYXhMZW4pDQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJX251bUZhc3RCeXRlcyA9IG51bUZhc3RCeXRlczsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCXB1YmxpYyBib29sZWFuIFNldE1hdGNoRmluZGVyKGludCBtYXRjaEZpbmRlckluZGV4KQ0KKwl7DQorCQlpZiAobWF0Y2hGaW5kZXJJbmRleCA8IDAgfHwgbWF0Y2hGaW5kZXJJbmRleCA+IDIpDQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJaW50IG1hdGNoRmluZGVySW5kZXhQcmV2ID0gX21hdGNoRmluZGVyVHlwZTsNCisJCV9tYXRjaEZpbmRlclR5cGUgPSBtYXRjaEZpbmRlckluZGV4Ow0KKwkJaWYgKF9tYXRjaEZpbmRlciAhPSBudWxsICYmIG1hdGNoRmluZGVySW5kZXhQcmV2ICE9IF9tYXRjaEZpbmRlclR5cGUpDQorCQl7DQorCQkJX2RpY3Rpb25hcnlTaXplUHJldiA9IC0xOw0KKwkJCV9tYXRjaEZpbmRlciA9IG51bGw7DQorCQl9DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwlwdWJsaWMgYm9vbGVhbiBTZXRMY0xwUGIoaW50IGxjLCBpbnQgbHAsIGludCBwYikNCisJew0KKwkJaWYgKA0KKwkJCQlscCA8IDAgfHwgbHAgPiBCYXNlLmtOdW1MaXRQb3NTdGF0ZXNCaXRzRW5jb2RpbmdNYXggfHwNCisJCQkJbGMgPCAwIHx8IGxjID4gQmFzZS5rTnVtTGl0Q29udGV4dEJpdHNNYXggfHwNCisJCQkJcGIgPCAwIHx8IHBiID4gQmFzZS5rTnVtUG9zU3RhdGVzQml0c0VuY29kaW5nTWF4KQ0KKwkJCXJldHVybiBmYWxzZTsNCisJCV9udW1MaXRlcmFsUG9zU3RhdGVCaXRzID0gbHA7DQorCQlfbnVtTGl0ZXJhbENvbnRleHRCaXRzID0gbGM7DQorCQlfcG9zU3RhdGVCaXRzID0gcGI7DQorCQlfcG9zU3RhdGVNYXNrID0gKCgxKSA8PCBfcG9zU3RhdGVCaXRzKSAtIDE7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCBTZXRFbmRNYXJrZXJNb2RlKGJvb2xlYW4gZW5kTWFya2VyTW9kZSkNCisJew0KKwkJX3dyaXRlRW5kTWFyayA9IGVuZE1hcmtlck1vZGU7DQorCX0NCit9DQorDQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1NldmVuWmlwL0NvbXByZXNzaW9uL1JhbmdlQ29kZXIvQml0VHJlZURlY29kZXIuamF2YSBiL2x6bWEvSmF2YS9TZXZlblppcC9Db21wcmVzc2lvbi9SYW5nZUNvZGVyL0JpdFRyZWVEZWNvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2NGM2OQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9TZXZlblppcC9Db21wcmVzc2lvbi9SYW5nZUNvZGVyL0JpdFRyZWVEZWNvZGVyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyOw0KKw0KK3B1YmxpYyBjbGFzcyBCaXRUcmVlRGVjb2Rlcg0KK3sNCisJc2hvcnRbXSBNb2RlbHM7DQorCWludCBOdW1CaXRMZXZlbHM7DQorCQ0KKwlwdWJsaWMgQml0VHJlZURlY29kZXIoaW50IG51bUJpdExldmVscykNCisJew0KKwkJTnVtQml0TGV2ZWxzID0gbnVtQml0TGV2ZWxzOw0KKwkJTW9kZWxzID0gbmV3IHNob3J0WzEgPDwgbnVtQml0TGV2ZWxzXTsNCisJfQ0KKwkNCisJcHVibGljIHZvaWQgSW5pdCgpDQorCXsNCisJCURlY29kZXIuSW5pdEJpdE1vZGVscyhNb2RlbHMpOw0KKwl9DQorCQ0KKwlwdWJsaWMgaW50IERlY29kZShEZWNvZGVyIHJhbmdlRGVjb2RlcikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24NCisJew0KKwkJaW50IG0gPSAxOw0KKwkJZm9yIChpbnQgYml0SW5kZXggPSBOdW1CaXRMZXZlbHM7IGJpdEluZGV4ICE9IDA7IGJpdEluZGV4LS0pDQorCQkJbSA9IChtIDw8IDEpICsgcmFuZ2VEZWNvZGVyLkRlY29kZUJpdChNb2RlbHMsIG0pOw0KKwkJcmV0dXJuIG0gLSAoMSA8PCBOdW1CaXRMZXZlbHMpOw0KKwl9DQorCQ0KKwlwdWJsaWMgaW50IFJldmVyc2VEZWNvZGUoRGVjb2RlciByYW5nZURlY29kZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uDQorCXsNCisJCWludCBtID0gMTsNCisJCWludCBzeW1ib2wgPSAwOw0KKwkJZm9yIChpbnQgYml0SW5kZXggPSAwOyBiaXRJbmRleCA8IE51bUJpdExldmVsczsgYml0SW5kZXgrKykNCisJCXsNCisJCQlpbnQgYml0ID0gcmFuZ2VEZWNvZGVyLkRlY29kZUJpdChNb2RlbHMsIG0pOw0KKwkJCW0gPDw9IDE7DQorCQkJbSArPSBiaXQ7DQorCQkJc3ltYm9sIHw9IChiaXQgPDwgYml0SW5kZXgpOw0KKwkJfQ0KKwkJcmV0dXJuIHN5bWJvbDsNCisJfQ0KKwkNCisJcHVibGljIHN0YXRpYyBpbnQgUmV2ZXJzZURlY29kZShzaG9ydFtdIE1vZGVscywgaW50IHN0YXJ0SW5kZXgsDQorCQkJRGVjb2RlciByYW5nZURlY29kZXIsIGludCBOdW1CaXRMZXZlbHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uDQorCXsNCisJCWludCBtID0gMTsNCisJCWludCBzeW1ib2wgPSAwOw0KKwkJZm9yIChpbnQgYml0SW5kZXggPSAwOyBiaXRJbmRleCA8IE51bUJpdExldmVsczsgYml0SW5kZXgrKykNCisJCXsNCisJCQlpbnQgYml0ID0gcmFuZ2VEZWNvZGVyLkRlY29kZUJpdChNb2RlbHMsIHN0YXJ0SW5kZXggKyBtKTsNCisJCQltIDw8PSAxOw0KKwkJCW0gKz0gYml0Ow0KKwkJCXN5bWJvbCB8PSAoYml0IDw8IGJpdEluZGV4KTsNCisJCX0NCisJCXJldHVybiBzeW1ib2w7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1NldmVuWmlwL0NvbXByZXNzaW9uL1JhbmdlQ29kZXIvQml0VHJlZUVuY29kZXIuamF2YSBiL2x6bWEvSmF2YS9TZXZlblppcC9Db21wcmVzc2lvbi9SYW5nZUNvZGVyL0JpdFRyZWVFbmNvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjMGEwNwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9TZXZlblppcC9Db21wcmVzc2lvbi9SYW5nZUNvZGVyL0JpdFRyZWVFbmNvZGVyLmphdmEKQEAgLTAsMCArMSw5OSBAQAorcGFja2FnZSBTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KKw0KK3B1YmxpYyBjbGFzcyBCaXRUcmVlRW5jb2Rlcg0KK3sNCisJc2hvcnRbXSBNb2RlbHM7DQorCWludCBOdW1CaXRMZXZlbHM7DQorCQ0KKwlwdWJsaWMgQml0VHJlZUVuY29kZXIoaW50IG51bUJpdExldmVscykNCisJew0KKwkJTnVtQml0TGV2ZWxzID0gbnVtQml0TGV2ZWxzOw0KKwkJTW9kZWxzID0gbmV3IHNob3J0WzEgPDwgbnVtQml0TGV2ZWxzXTsNCisJfQ0KKwkNCisJcHVibGljIHZvaWQgSW5pdCgpDQorCXsNCisJCURlY29kZXIuSW5pdEJpdE1vZGVscyhNb2RlbHMpOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBFbmNvZGUoRW5jb2RlciByYW5nZUVuY29kZXIsIGludCBzeW1ib2wpIHRocm93cyBJT0V4Y2VwdGlvbg0KKwl7DQorCQlpbnQgbSA9IDE7DQorCQlmb3IgKGludCBiaXRJbmRleCA9IE51bUJpdExldmVsczsgYml0SW5kZXggIT0gMDsgKQ0KKwkJew0KKwkJCWJpdEluZGV4LS07DQorCQkJaW50IGJpdCA9IChzeW1ib2wgPj4+IGJpdEluZGV4KSAmIDE7DQorCQkJcmFuZ2VFbmNvZGVyLkVuY29kZShNb2RlbHMsIG0sIGJpdCk7DQorCQkJbSA9IChtIDw8IDEpIHwgYml0Ow0KKwkJfQ0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBSZXZlcnNlRW5jb2RlKEVuY29kZXIgcmFuZ2VFbmNvZGVyLCBpbnQgc3ltYm9sKSB0aHJvd3MgSU9FeGNlcHRpb24NCisJew0KKwkJaW50IG0gPSAxOw0KKwkJZm9yIChpbnQgIGkgPSAwOyBpIDwgTnVtQml0TGV2ZWxzOyBpKyspDQorCQl7DQorCQkJaW50IGJpdCA9IHN5bWJvbCAmIDE7DQorCQkJcmFuZ2VFbmNvZGVyLkVuY29kZShNb2RlbHMsIG0sIGJpdCk7DQorCQkJbSA9IChtIDw8IDEpIHwgYml0Ow0KKwkJCXN5bWJvbCA+Pj0gMTsNCisJCX0NCisJfQ0KKwkNCisJcHVibGljIGludCBHZXRQcmljZShpbnQgc3ltYm9sKQ0KKwl7DQorCQlpbnQgcHJpY2UgPSAwOw0KKwkJaW50IG0gPSAxOw0KKwkJZm9yIChpbnQgYml0SW5kZXggPSBOdW1CaXRMZXZlbHM7IGJpdEluZGV4ICE9IDA7ICkNCisJCXsNCisJCQliaXRJbmRleC0tOw0KKwkJCWludCBiaXQgPSAoc3ltYm9sID4+PiBiaXRJbmRleCkgJiAxOw0KKwkJCXByaWNlICs9IEVuY29kZXIuR2V0UHJpY2UoTW9kZWxzW21dLCBiaXQpOw0KKwkJCW0gPSAobSA8PCAxKSArIGJpdDsNCisJCX0NCisJCXJldHVybiBwcmljZTsNCisJfQ0KKwkNCisJcHVibGljIGludCBSZXZlcnNlR2V0UHJpY2UoaW50IHN5bWJvbCkNCisJew0KKwkJaW50IHByaWNlID0gMDsNCisJCWludCBtID0gMTsNCisJCWZvciAoaW50IGkgPSBOdW1CaXRMZXZlbHM7IGkgIT0gMDsgaS0tKQ0KKwkJew0KKwkJCWludCBiaXQgPSBzeW1ib2wgJiAxOw0KKwkJCXN5bWJvbCA+Pj49IDE7DQorCQkJcHJpY2UgKz0gRW5jb2Rlci5HZXRQcmljZShNb2RlbHNbbV0sIGJpdCk7DQorCQkJbSA9IChtIDw8IDEpIHwgYml0Ow0KKwkJfQ0KKwkJcmV0dXJuIHByaWNlOw0KKwl9DQorCQ0KKwlwdWJsaWMgc3RhdGljIGludCBSZXZlcnNlR2V0UHJpY2Uoc2hvcnRbXSBNb2RlbHMsIGludCBzdGFydEluZGV4LA0KKwkJCWludCBOdW1CaXRMZXZlbHMsIGludCBzeW1ib2wpDQorCXsNCisJCWludCBwcmljZSA9IDA7DQorCQlpbnQgbSA9IDE7DQorCQlmb3IgKGludCBpID0gTnVtQml0TGV2ZWxzOyBpICE9IDA7IGktLSkNCisJCXsNCisJCQlpbnQgYml0ID0gc3ltYm9sICYgMTsNCisJCQlzeW1ib2wgPj4+PSAxOw0KKwkJCXByaWNlICs9IEVuY29kZXIuR2V0UHJpY2UoTW9kZWxzW3N0YXJ0SW5kZXggKyBtXSwgYml0KTsNCisJCQltID0gKG0gPDwgMSkgfCBiaXQ7DQorCQl9DQorCQlyZXR1cm4gcHJpY2U7DQorCX0NCisJDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBSZXZlcnNlRW5jb2RlKHNob3J0W10gTW9kZWxzLCBpbnQgc3RhcnRJbmRleCwNCisJCQlFbmNvZGVyIHJhbmdlRW5jb2RlciwgaW50IE51bUJpdExldmVscywgaW50IHN5bWJvbCkgdGhyb3dzIElPRXhjZXB0aW9uDQorCXsNCisJCWludCBtID0gMTsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgTnVtQml0TGV2ZWxzOyBpKyspDQorCQl7DQorCQkJaW50IGJpdCA9IHN5bWJvbCAmIDE7DQorCQkJcmFuZ2VFbmNvZGVyLkVuY29kZShNb2RlbHMsIHN0YXJ0SW5kZXggKyBtLCBiaXQpOw0KKwkJCW0gPSAobSA8PCAxKSB8IGJpdDsNCisJCQlzeW1ib2wgPj49IDE7DQorCQl9DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1NldmVuWmlwL0NvbXByZXNzaW9uL1JhbmdlQ29kZXIvRGVjb2Rlci5qYXZhIGIvbHptYS9KYXZhL1NldmVuWmlwL0NvbXByZXNzaW9uL1JhbmdlQ29kZXIvRGVjb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NTMzODMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvU2V2ZW5aaXAvQ29tcHJlc3Npb24vUmFuZ2VDb2Rlci9EZWNvZGVyLmphdmEKQEAgLTAsMCArMSw4OCBAQAorcGFja2FnZSBTZXZlblppcC5Db21wcmVzc2lvbi5SYW5nZUNvZGVyOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KKw0KK3B1YmxpYyBjbGFzcyBEZWNvZGVyDQorew0KKwlzdGF0aWMgZmluYWwgaW50IGtUb3BNYXNrID0gfigoMSA8PCAyNCkgLSAxKTsNCisJDQorCXN0YXRpYyBmaW5hbCBpbnQga051bUJpdE1vZGVsVG90YWxCaXRzID0gMTE7DQorCXN0YXRpYyBmaW5hbCBpbnQga0JpdE1vZGVsVG90YWwgPSAoMSA8PCBrTnVtQml0TW9kZWxUb3RhbEJpdHMpOw0KKwlzdGF0aWMgZmluYWwgaW50IGtOdW1Nb3ZlQml0cyA9IDU7DQorCQ0KKwlpbnQgUmFuZ2U7DQorCWludCBDb2RlOw0KKw0KKwlqYXZhLmlvLklucHV0U3RyZWFtIFN0cmVhbTsNCisJDQorCXB1YmxpYyBmaW5hbCB2b2lkIFNldFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSkNCisJeyANCisJCVN0cmVhbSA9IHN0cmVhbTsgDQorCX0NCisJDQorCXB1YmxpYyBmaW5hbCB2b2lkIFJlbGVhc2VTdHJlYW0oKQ0KKwl7IA0KKwkJU3RyZWFtID0gbnVsbDsgDQorCX0NCisJDQorCXB1YmxpYyBmaW5hbCB2b2lkIEluaXQoKSB0aHJvd3MgSU9FeGNlcHRpb24NCisJew0KKwkJQ29kZSA9IDA7DQorCQlSYW5nZSA9IC0xOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspDQorCQkJQ29kZSA9IChDb2RlIDw8IDgpIHwgU3RyZWFtLnJlYWQoKTsNCisJfQ0KKwkNCisJcHVibGljIGZpbmFsIGludCBEZWNvZGVEaXJlY3RCaXRzKGludCBudW1Ub3RhbEJpdHMpIHRocm93cyBJT0V4Y2VwdGlvbg0KKwl7DQorCQlpbnQgcmVzdWx0ID0gMDsNCisJCWZvciAoaW50IGkgPSBudW1Ub3RhbEJpdHM7IGkgIT0gMDsgaS0tKQ0KKwkJew0KKwkJCVJhbmdlID4+Pj0gMTsNCisJCQlpbnQgdCA9ICgoQ29kZSAtIFJhbmdlKSA+Pj4gMzEpOw0KKwkJCUNvZGUgLT0gUmFuZ2UgJiAodCAtIDEpOw0KKwkJCXJlc3VsdCA9IChyZXN1bHQgPDwgMSkgfCAoMSAtIHQpOw0KKwkJCQ0KKwkJCWlmICgoUmFuZ2UgJiBrVG9wTWFzaykgPT0gMCkNCisJCQl7DQorCQkJCUNvZGUgPSAoQ29kZSA8PCA4KSB8IFN0cmVhbS5yZWFkKCk7DQorCQkJCVJhbmdlIDw8PSA4Ow0KKwkJCX0NCisJCX0NCisJCXJldHVybiByZXN1bHQ7DQorCX0NCisJDQorCXB1YmxpYyBpbnQgRGVjb2RlQml0KHNob3J0IFtdcHJvYnMsIGludCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uDQorCXsNCisJCWludCBwcm9iID0gcHJvYnNbaW5kZXhdOw0KKwkJaW50IG5ld0JvdW5kID0gKFJhbmdlID4+PiBrTnVtQml0TW9kZWxUb3RhbEJpdHMpICogcHJvYjsNCisJCWlmICgoQ29kZSBeIDB4ODAwMDAwMDApIDwgKG5ld0JvdW5kIF4gMHg4MDAwMDAwMCkpDQorCQl7DQorCQkJUmFuZ2UgPSBuZXdCb3VuZDsNCisJCQlwcm9ic1tpbmRleF0gPSAoc2hvcnQpKHByb2IgKyAoKGtCaXRNb2RlbFRvdGFsIC0gcHJvYikgPj4+IGtOdW1Nb3ZlQml0cykpOw0KKwkJCWlmICgoUmFuZ2UgJiBrVG9wTWFzaykgPT0gMCkNCisJCQl7DQorCQkJCUNvZGUgPSAoQ29kZSA8PCA4KSB8IFN0cmVhbS5yZWFkKCk7DQorCQkJCVJhbmdlIDw8PSA4Ow0KKwkJCX0NCisJCQlyZXR1cm4gMDsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlSYW5nZSAtPSBuZXdCb3VuZDsNCisJCQlDb2RlIC09IG5ld0JvdW5kOw0KKwkJCXByb2JzW2luZGV4XSA9IChzaG9ydCkocHJvYiAtICgocHJvYikgPj4+IGtOdW1Nb3ZlQml0cykpOw0KKwkJCWlmICgoUmFuZ2UgJiBrVG9wTWFzaykgPT0gMCkNCisJCQl7DQorCQkJCUNvZGUgPSAoQ29kZSA8PCA4KSB8IFN0cmVhbS5yZWFkKCk7DQorCQkJCVJhbmdlIDw8PSA4Ow0KKwkJCX0NCisJCQlyZXR1cm4gMTsNCisJCX0NCisJfQ0KKwkNCisJcHVibGljIHN0YXRpYyB2b2lkIEluaXRCaXRNb2RlbHMoc2hvcnQgW11wcm9icykNCisJew0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9icy5sZW5ndGg7IGkrKykNCisJCQlwcm9ic1tpXSA9IChrQml0TW9kZWxUb3RhbCA+Pj4gMSk7DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1NldmVuWmlwL0NvbXByZXNzaW9uL1JhbmdlQ29kZXIvRW5jb2Rlci5qYXZhIGIvbHptYS9KYXZhL1NldmVuWmlwL0NvbXByZXNzaW9uL1JhbmdlQ29kZXIvRW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzNlOTIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvU2V2ZW5aaXAvQ29tcHJlc3Npb24vUmFuZ2VDb2Rlci9FbmNvZGVyLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKK3BhY2thZ2UgU2V2ZW5aaXAuQ29tcHJlc3Npb24uUmFuZ2VDb2RlcjsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCisNCitwdWJsaWMgY2xhc3MgRW5jb2Rlcg0KK3sNCisJc3RhdGljIGZpbmFsIGludCBrVG9wTWFzayA9IH4oKDEgPDwgMjQpIC0gMSk7DQorCQ0KKwlzdGF0aWMgZmluYWwgaW50IGtOdW1CaXRNb2RlbFRvdGFsQml0cyA9IDExOw0KKwlzdGF0aWMgZmluYWwgaW50IGtCaXRNb2RlbFRvdGFsID0gKDEgPDwga051bUJpdE1vZGVsVG90YWxCaXRzKTsNCisJc3RhdGljIGZpbmFsIGludCBrTnVtTW92ZUJpdHMgPSA1Ow0KKwkNCisJamF2YS5pby5PdXRwdXRTdHJlYW0gU3RyZWFtOw0KKw0KKwlsb25nIExvdzsNCisJaW50IFJhbmdlOw0KKwlpbnQgX2NhY2hlU2l6ZTsNCisJaW50IF9jYWNoZTsNCisJDQorCWxvbmcgX3Bvc2l0aW9uOw0KKwkNCisJcHVibGljIHZvaWQgU2V0U3RyZWFtKGphdmEuaW8uT3V0cHV0U3RyZWFtIHN0cmVhbSkNCisJew0KKwkJU3RyZWFtID0gc3RyZWFtOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBSZWxlYXNlU3RyZWFtKCkNCisJew0KKwkJU3RyZWFtID0gbnVsbDsNCisJfQ0KKwkNCisJcHVibGljIHZvaWQgSW5pdCgpDQorCXsNCisJCV9wb3NpdGlvbiA9IDA7DQorCQlMb3cgPSAwOw0KKwkJUmFuZ2UgPSAtMTsNCisJCV9jYWNoZVNpemUgPSAxOw0KKwkJX2NhY2hlID0gMDsNCisJfQ0KKwkNCisJcHVibGljIHZvaWQgRmx1c2hEYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uDQorCXsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQ0KKwkJCVNoaWZ0TG93KCk7DQorCX0NCisJDQorCXB1YmxpYyB2b2lkIEZsdXNoU3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uDQorCXsNCisJCVN0cmVhbS5mbHVzaCgpOw0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBTaGlmdExvdygpIHRocm93cyBJT0V4Y2VwdGlvbg0KKwl7DQorCQlpbnQgTG93SGkgPSAoaW50KShMb3cgPj4+IDMyKTsNCisJCWlmIChMb3dIaSAhPSAwIHx8IExvdyA8IDB4RkYwMDAwMDBMKQ0KKwkJew0KKwkJCV9wb3NpdGlvbiArPSBfY2FjaGVTaXplOw0KKwkJCWludCB0ZW1wID0gX2NhY2hlOw0KKwkJCWRvDQorCQkJew0KKwkJCQlTdHJlYW0ud3JpdGUodGVtcCArIExvd0hpKTsNCisJCQkJdGVtcCA9IDB4RkY7DQorCQkJfQ0KKwkJCXdoaWxlKC0tX2NhY2hlU2l6ZSAhPSAwKTsNCisJCQlfY2FjaGUgPSAoKChpbnQpTG93KSA+Pj4gMjQpOw0KKwkJfQ0KKwkJX2NhY2hlU2l6ZSsrOw0KKwkJTG93ID0gKExvdyAmIDB4RkZGRkZGKSA8PCA4Ow0KKwl9DQorCQ0KKwlwdWJsaWMgdm9pZCBFbmNvZGVEaXJlY3RCaXRzKGludCB2LCBpbnQgbnVtVG90YWxCaXRzKSB0aHJvd3MgSU9FeGNlcHRpb24NCisJew0KKwkJZm9yIChpbnQgaSA9IG51bVRvdGFsQml0cyAtIDE7IGkgPj0gMDsgaS0tKQ0KKwkJew0KKwkJCVJhbmdlID4+Pj0gMTsNCisJCQlpZiAoKCh2ID4+PiBpKSAmIDEpID09IDEpDQorCQkJCUxvdyArPSBSYW5nZTsNCisJCQlpZiAoKFJhbmdlICYgRW5jb2Rlci5rVG9wTWFzaykgPT0gMCkNCisJCQl7DQorCQkJCVJhbmdlIDw8PSA4Ow0KKwkJCQlTaGlmdExvdygpOw0KKwkJCX0NCisJCX0NCisJfQ0KKwkNCisJDQorCXB1YmxpYyBsb25nIEdldFByb2Nlc3NlZFNpemVBZGQoKQ0KKwl7DQorCQlyZXR1cm4gX2NhY2hlU2l6ZSArIF9wb3NpdGlvbiArIDQ7DQorCX0NCisJDQorCQ0KKwkNCisJc3RhdGljIGZpbmFsIGludCBrTnVtTW92ZVJlZHVjaW5nQml0cyA9IDI7DQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtOdW1CaXRQcmljZVNoaWZ0Qml0cyA9IDY7DQorCQ0KKwlwdWJsaWMgc3RhdGljIHZvaWQgSW5pdEJpdE1vZGVscyhzaG9ydCBbXXByb2JzKQ0KKwl7DQorCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2JzLmxlbmd0aDsgaSsrKQ0KKwkJCXByb2JzW2ldID0gKGtCaXRNb2RlbFRvdGFsID4+PiAxKTsNCisJfQ0KKwkNCisJcHVibGljIHZvaWQgRW5jb2RlKHNob3J0IFtdcHJvYnMsIGludCBpbmRleCwgaW50IHN5bWJvbCkgdGhyb3dzIElPRXhjZXB0aW9uDQorCXsNCisJCWludCBwcm9iID0gcHJvYnNbaW5kZXhdOw0KKwkJaW50IG5ld0JvdW5kID0gKFJhbmdlID4+PiBrTnVtQml0TW9kZWxUb3RhbEJpdHMpICogcHJvYjsNCisJCWlmIChzeW1ib2wgPT0gMCkNCisJCXsNCisJCQlSYW5nZSA9IG5ld0JvdW5kOw0KKwkJCXByb2JzW2luZGV4XSA9IChzaG9ydCkocHJvYiArICgoa0JpdE1vZGVsVG90YWwgLSBwcm9iKSA+Pj4ga051bU1vdmVCaXRzKSk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJTG93ICs9IChuZXdCb3VuZCAmIDB4RkZGRkZGRkZMKTsNCisJCQlSYW5nZSAtPSBuZXdCb3VuZDsNCisJCQlwcm9ic1tpbmRleF0gPSAoc2hvcnQpKHByb2IgLSAoKHByb2IpID4+PiBrTnVtTW92ZUJpdHMpKTsNCisJCX0NCisJCWlmICgoUmFuZ2UgJiBrVG9wTWFzaykgPT0gMCkNCisJCXsNCisJCQlSYW5nZSA8PD0gODsNCisJCQlTaGlmdExvdygpOw0KKwkJfQ0KKwl9DQorCQ0KKwlwcml2YXRlIHN0YXRpYyBpbnRbXSBQcm9iUHJpY2VzID0gbmV3IGludFtrQml0TW9kZWxUb3RhbCA+Pj4ga051bU1vdmVSZWR1Y2luZ0JpdHNdOw0KKwkNCisJc3RhdGljDQorCXsNCisJCWludCBrTnVtQml0cyA9IChrTnVtQml0TW9kZWxUb3RhbEJpdHMgLSBrTnVtTW92ZVJlZHVjaW5nQml0cyk7DQorCQlmb3IgKGludCBpID0ga051bUJpdHMgLSAxOyBpID49IDA7IGktLSkNCisJCXsNCisJCQlpbnQgc3RhcnQgPSAxIDw8IChrTnVtQml0cyAtIGkgLSAxKTsNCisJCQlpbnQgZW5kID0gMSA8PCAoa051bUJpdHMgLSBpKTsNCisJCQlmb3IgKGludCBqID0gc3RhcnQ7IGogPCBlbmQ7IGorKykNCisJCQkJUHJvYlByaWNlc1tqXSA9IChpIDw8IGtOdW1CaXRQcmljZVNoaWZ0Qml0cykgKw0KKwkJCQkJCSgoKGVuZCAtIGopIDw8IGtOdW1CaXRQcmljZVNoaWZ0Qml0cykgPj4+IChrTnVtQml0cyAtIGkgLSAxKSk7DQorCQl9DQorCX0NCisJDQorCXN0YXRpYyBwdWJsaWMgaW50IEdldFByaWNlKGludCBQcm9iLCBpbnQgc3ltYm9sKQ0KKwl7DQorCQlyZXR1cm4gUHJvYlByaWNlc1soKChQcm9iIC0gc3ltYm9sKSBeICgoLXN5bWJvbCkpKSAmIChrQml0TW9kZWxUb3RhbCAtIDEpKSA+Pj4ga051bU1vdmVSZWR1Y2luZ0JpdHNdOw0KKwl9DQorCXN0YXRpYyBwdWJsaWMgaW50IEdldFByaWNlMChpbnQgUHJvYikNCisJeyANCisJCXJldHVybiBQcm9iUHJpY2VzW1Byb2IgPj4+IGtOdW1Nb3ZlUmVkdWNpbmdCaXRzXTsgDQorCX0NCisJc3RhdGljIHB1YmxpYyBpbnQgR2V0UHJpY2UxKGludCBQcm9iKQ0KKwl7IA0KKwkJcmV0dXJuIFByb2JQcmljZXNbKGtCaXRNb2RlbFRvdGFsIC0gUHJvYikgPj4+IGtOdW1Nb3ZlUmVkdWNpbmdCaXRzXTsgDQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1NldmVuWmlwL0lDb2RlUHJvZ3Jlc3MuamF2YSBiL2x6bWEvSmF2YS9TZXZlblppcC9JQ29kZVByb2dyZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwYmQyZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9TZXZlblppcC9JQ29kZVByb2dyZXNzLmphdmEKQEAgLTAsMCArMSw2IEBACitwYWNrYWdlIFNldmVuWmlwOw0KKw0KK3B1YmxpYyBpbnRlcmZhY2UgSUNvZGVQcm9ncmVzcw0KK3sNCisJcHVibGljIHZvaWQgU2V0UHJvZ3Jlc3MobG9uZyBpblNpemUsIGxvbmcgb3V0U2l6ZSk7DQorfQ0KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9TZXZlblppcC9Mem1hQWxvbmUuamF2YSBiL2x6bWEvSmF2YS9TZXZlblppcC9Mem1hQWxvbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTM5YTIyCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1NldmVuWmlwL0x6bWFBbG9uZS5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACitwYWNrYWdlIFNldmVuWmlwOw0KKw0KK3B1YmxpYyBjbGFzcyBMem1hQWxvbmUNCit7DQorCXN0YXRpYyBwdWJsaWMgY2xhc3MgQ29tbWFuZExpbmUNCisJew0KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQga0VuY29kZSA9IDA7DQorCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBrRGVjb2RlID0gMTsNCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGtCZW5jaG1hayA9IDI7DQorCQkNCisJCXB1YmxpYyBpbnQgQ29tbWFuZCA9IC0xOw0KKwkJcHVibGljIGludCBOdW1CZW5jaG1hcmtQYXNzZXMgPSAxMDsNCisJCQ0KKwkJcHVibGljIGludCBEaWN0aW9uYXJ5U2l6ZSA9IDEgPDwgMjM7DQorCQlwdWJsaWMgYm9vbGVhbiBEaWN0aW9uYXJ5U2l6ZUlzRGVmaW5lZCA9IGZhbHNlOw0KKwkJDQorCQlwdWJsaWMgaW50IExjID0gMzsNCisJCXB1YmxpYyBpbnQgTHAgPSAwOw0KKwkJcHVibGljIGludCBQYiA9IDI7DQorCQkNCisJCXB1YmxpYyBpbnQgRmIgPSAxMjg7DQorCQlwdWJsaWMgYm9vbGVhbiBGYklzRGVmaW5lZCA9IGZhbHNlOw0KKwkJDQorCQlwdWJsaWMgYm9vbGVhbiBFb3MgPSBmYWxzZTsNCisJCQ0KKwkJcHVibGljIGludCBBbGdvcml0aG0gPSAyOw0KKwkJcHVibGljIGludCBNYXRjaEZpbmRlciA9IDE7DQorCQkNCisJCXB1YmxpYyBTdHJpbmcgSW5GaWxlOw0KKwkJcHVibGljIFN0cmluZyBPdXRGaWxlOw0KKwkJDQorCQlib29sZWFuIFBhcnNlU3dpdGNoKFN0cmluZyBzKQ0KKwkJew0KKwkJCWlmIChzLnN0YXJ0c1dpdGgoImQiKSkNCisJCQl7DQorCQkJCURpY3Rpb25hcnlTaXplID0gMSA8PCBJbnRlZ2VyLnBhcnNlSW50KHMuc3Vic3RyaW5nKDEpKTsNCisJCQkJRGljdGlvbmFyeVNpemVJc0RlZmluZWQgPSB0cnVlOw0KKwkJCX0NCisJCQllbHNlIGlmIChzLnN0YXJ0c1dpdGgoImZiIikpDQorCQkJew0KKwkJCQlGYiA9IEludGVnZXIucGFyc2VJbnQocy5zdWJzdHJpbmcoMikpOw0KKwkJCQlGYklzRGVmaW5lZCA9IHRydWU7DQorCQkJfQ0KKwkJCWVsc2UgaWYgKHMuc3RhcnRzV2l0aCgiYSIpKQ0KKwkJCQlBbGdvcml0aG0gPSBJbnRlZ2VyLnBhcnNlSW50KHMuc3Vic3RyaW5nKDEpKTsNCisJCQllbHNlIGlmIChzLnN0YXJ0c1dpdGgoImxjIikpDQorCQkJCUxjID0gSW50ZWdlci5wYXJzZUludChzLnN1YnN0cmluZygyKSk7DQorCQkJZWxzZSBpZiAocy5zdGFydHNXaXRoKCJscCIpKQ0KKwkJCQlMcCA9IEludGVnZXIucGFyc2VJbnQocy5zdWJzdHJpbmcoMikpOw0KKwkJCWVsc2UgaWYgKHMuc3RhcnRzV2l0aCgicGIiKSkNCisJCQkJUGIgPSBJbnRlZ2VyLnBhcnNlSW50KHMuc3Vic3RyaW5nKDIpKTsNCisJCQllbHNlIGlmIChzLnN0YXJ0c1dpdGgoImVvcyIpKQ0KKwkJCQlFb3MgPSB0cnVlOw0KKwkJCWVsc2UgaWYgKHMuc3RhcnRzV2l0aCgibWYiKSkNCisJCQl7DQorCQkJCVN0cmluZyBtZnMgPSBzLnN1YnN0cmluZygyKTsNCisJCQkJaWYgKG1mcy5lcXVhbHMoImJ0MiIpKQ0KKwkJCQkJTWF0Y2hGaW5kZXIgPSAwOw0KKwkJCQllbHNlIGlmIChtZnMuZXF1YWxzKCJidDQiKSkNCisJCQkJCU1hdGNoRmluZGVyID0gMTsNCisJCQkJZWxzZSBpZiAobWZzLmVxdWFscygiYnQ0YiIpKQ0KKwkJCQkJTWF0Y2hGaW5kZXIgPSAyOw0KKwkJCQllbHNlDQorCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwkJDQorCQlwdWJsaWMgYm9vbGVhbiBQYXJzZShTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uDQorCQl7DQorCQkJaW50IHBvcyA9IDA7DQorCQkJYm9vbGVhbiBzd2l0Y2hNb2RlID0gdHJ1ZTsNCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspDQorCQkJew0KKwkJCQlTdHJpbmcgcyA9IGFyZ3NbaV07DQorCQkJCWlmIChzLmxlbmd0aCgpID09IDApDQorCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCWlmIChzd2l0Y2hNb2RlKQ0KKwkJCQl7DQorCQkJCQlpZiAocy5jb21wYXJlVG8oIi0tIikgPT0gMCkNCisJCQkJCXsNCisJCQkJCQlzd2l0Y2hNb2RlID0gZmFsc2U7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQlpZiAocy5jaGFyQXQoMCkgPT0gJy0nKQ0KKwkJCQkJew0KKwkJCQkJCVN0cmluZyBzdyA9IHMuc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCk7DQorCQkJCQkJaWYgKHN3Lmxlbmd0aCgpID09IDApDQorCQkJCQkJCXJldHVybiBmYWxzZTsNCisJCQkJCQl0cnkNCisJCQkJCQl7DQorCQkJCQkJCWlmICghUGFyc2VTd2l0Y2goc3cpKQ0KKwkJCQkJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQkJCX0NCisJCQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpDQorCQkJCQkJew0KKwkJCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCQkJfQ0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWlmIChwb3MgPT0gMCkNCisJCQkJew0KKwkJCQkJaWYgKHMuZXF1YWxzSWdub3JlQ2FzZSgiZSIpKQ0KKwkJCQkJCUNvbW1hbmQgPSBrRW5jb2RlOw0KKwkJCQkJZWxzZSBpZiAocy5lcXVhbHNJZ25vcmVDYXNlKCJkIikpDQorCQkJCQkJQ29tbWFuZCA9IGtEZWNvZGU7DQorCQkJCQllbHNlIGlmIChzLmVxdWFsc0lnbm9yZUNhc2UoImIiKSkNCisJCQkJCQlDb21tYW5kID0ga0JlbmNobWFrOw0KKwkJCQkJZWxzZQ0KKwkJCQkJCXJldHVybiBmYWxzZTsNCisJCQkJfQ0KKwkJCQllbHNlIGlmKHBvcyA9PSAxKQ0KKwkJCQl7DQorCQkJCQlpZiAoQ29tbWFuZCA9PSBrQmVuY2htYWspDQorCQkJCQl7DQorCQkJCQkJdHJ5DQorCQkJCQkJew0KKwkJCQkJCQlOdW1CZW5jaG1hcmtQYXNzZXMgPSBJbnRlZ2VyLnBhcnNlSW50KHMpOw0KKwkJCQkJCQlpZiAoTnVtQmVuY2htYXJrUGFzc2VzIDwgMSkNCisJCQkJCQkJCXJldHVybiBmYWxzZTsNCisJCQkJCQl9DQorCQkJCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQ0KKwkJCQkJCXsNCisJCQkJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQkJCX0NCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCQlJbkZpbGUgPSBzOw0KKwkJCQl9DQorCQkJCWVsc2UgaWYocG9zID09IDIpDQorCQkJCQlPdXRGaWxlID0gczsNCisJCQkJZWxzZQ0KKwkJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQlwb3MrKzsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCXJldHVybiB0cnVlOw0KKwkJfQ0KKwl9DQorCQ0KKwkNCisJc3RhdGljIHZvaWQgUHJpbnRIZWxwKCkNCisJew0KKwkJU3lzdGVtLm91dC5wcmludGxuKA0KKwkJCQkiXG5Vc2FnZTogIExaTUEgPGV8ZD4gWzxzd2l0Y2hlcz4uLi5dIGlucHV0RmlsZSBvdXRwdXRGaWxlXG4iICsNCisJCQkJIiAgZTogZW5jb2RlIGZpbGVcbiIgKw0KKwkJCQkiICBkOiBkZWNvZGUgZmlsZVxuIiArDQorCQkJCSIgIGI6IEJlbmNobWFya1xuIiArDQorCQkJCSI8U3dpdGNoZXM+XG4iICsNCisJCQkJLy8gIiAgLWF7Tn06ICBzZXQgY29tcHJlc3Npb24gbW9kZSAtIFswLCAxXSwgZGVmYXVsdDogMSAobWF4KVxuIiArDQorCQkJCSIgIC1ke059OiAgc2V0IGRpY3Rpb25hcnkgLSBbMCwyOF0sIGRlZmF1bHQ6IDIzICg4TUIpXG4iICsNCisJCQkJIiAgLWZie059OiBzZXQgbnVtYmVyIG9mIGZhc3QgYnl0ZXMgLSBbNSwgMjczXSwgZGVmYXVsdDogMTI4XG4iICsNCisJCQkJIiAgLWxje059OiBzZXQgbnVtYmVyIG9mIGxpdGVyYWwgY29udGV4dCBiaXRzIC0gWzAsIDhdLCBkZWZhdWx0OiAzXG4iICsNCisJCQkJIiAgLWxwe059OiBzZXQgbnVtYmVyIG9mIGxpdGVyYWwgcG9zIGJpdHMgLSBbMCwgNF0sIGRlZmF1bHQ6IDBcbiIgKw0KKwkJCQkiICAtcGJ7Tn06IHNldCBudW1iZXIgb2YgcG9zIGJpdHMgLSBbMCwgNF0sIGRlZmF1bHQ6IDJcbiIgKw0KKwkJCQkiICAtbWZ7TUZfSUR9OiBzZXQgTWF0Y2ggRmluZGVyOiBbYnQyLCBidDRdLCBkZWZhdWx0OiBidDRcbiIgKw0KKwkJCQkiICAtZW9zOiAgIHdyaXRlIEVuZCBPZiBTdHJlYW0gbWFya2VyXG4iDQorCQkJCSk7DQorCX0NCisJDQorCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24NCisJew0KKwkJU3lzdGVtLm91dC5wcmludGxuKCJcbkxaTUEgKEphdmEpIDQuNjEgIDIwMDgtMTEtMjNcbiIpOw0KKwkJDQorCQlpZiAoYXJncy5sZW5ndGggPCAxKQ0KKwkJew0KKwkJCVByaW50SGVscCgpOw0KKwkJCXJldHVybjsNCisJCX0NCisJCQ0KKwkJQ29tbWFuZExpbmUgcGFyYW1zID0gbmV3IENvbW1hbmRMaW5lKCk7DQorCQlpZiAoIXBhcmFtcy5QYXJzZShhcmdzKSkNCisJCXsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuSW5jb3JyZWN0IGNvbW1hbmQiKTsNCisJCQlyZXR1cm47DQorCQl9DQorCQkNCisJCWlmIChwYXJhbXMuQ29tbWFuZCA9PSBDb21tYW5kTGluZS5rQmVuY2htYWspDQorCQl7DQorCQkJaW50IGRpY3Rpb25hcnkgPSAoMSA8PCAyMSk7DQorCQkJaWYgKHBhcmFtcy5EaWN0aW9uYXJ5U2l6ZUlzRGVmaW5lZCkNCisJCQkJZGljdGlvbmFyeSA9IHBhcmFtcy5EaWN0aW9uYXJ5U2l6ZTsNCisJCQlpZiAocGFyYW1zLk1hdGNoRmluZGVyID4gMSkNCisJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgbWF0Y2ggZmluZGVyIik7DQorCQkJU2V2ZW5aaXAuTHptYUJlbmNoLkx6bWFCZW5jaG1hcmsocGFyYW1zLk51bUJlbmNobWFya1Bhc3NlcywgZGljdGlvbmFyeSk7DQorCQl9DQorCQllbHNlIGlmIChwYXJhbXMuQ29tbWFuZCA9PSBDb21tYW5kTGluZS5rRW5jb2RlIHx8IHBhcmFtcy5Db21tYW5kID09IENvbW1hbmRMaW5lLmtEZWNvZGUpDQorCQl7DQorCQkJamF2YS5pby5GaWxlIGluRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocGFyYW1zLkluRmlsZSk7DQorCQkJamF2YS5pby5GaWxlIG91dEZpbGUgPSBuZXcgamF2YS5pby5GaWxlKHBhcmFtcy5PdXRGaWxlKTsNCisJCQkNCisJCQlqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW5TdHJlYW0gID0gbmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oaW5GaWxlKSk7DQorCQkJamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpKTsNCisJCQkNCisJCQlib29sZWFuIGVvcyA9IGZhbHNlOw0KKwkJCWlmIChwYXJhbXMuRW9zKQ0KKwkJCQllb3MgPSB0cnVlOw0KKwkJCWlmIChwYXJhbXMuQ29tbWFuZCA9PSBDb21tYW5kTGluZS5rRW5jb2RlKQ0KKwkJCXsNCisJCQkJU2V2ZW5aaXAuQ29tcHJlc3Npb24uTFpNQS5FbmNvZGVyIGVuY29kZXIgPSBuZXcgU2V2ZW5aaXAuQ29tcHJlc3Npb24uTFpNQS5FbmNvZGVyKCk7DQorCQkJCWlmICghZW5jb2Rlci5TZXRBbGdvcml0aG0ocGFyYW1zLkFsZ29yaXRobSkpDQorCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbmNvcnJlY3QgY29tcHJlc3Npb24gbW9kZSIpOw0KKwkJCQlpZiAoIWVuY29kZXIuU2V0RGljdGlvbmFyeVNpemUocGFyYW1zLkRpY3Rpb25hcnlTaXplKSkNCisJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkluY29ycmVjdCBkaWN0aW9uYXJ5IHNpemUiKTsNCisJCQkJaWYgKCFlbmNvZGVyLlNldE51bUZhc3RCeXRlcyhwYXJhbXMuRmIpKQ0KKwkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW5jb3JyZWN0IC1mYiB2YWx1ZSIpOw0KKwkJCQlpZiAoIWVuY29kZXIuU2V0TWF0Y2hGaW5kZXIocGFyYW1zLk1hdGNoRmluZGVyKSkNCisJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkluY29ycmVjdCAtbWYgdmFsdWUiKTsNCisJCQkJaWYgKCFlbmNvZGVyLlNldExjTHBQYihwYXJhbXMuTGMsIHBhcmFtcy5McCwgcGFyYW1zLlBiKSkNCisJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkluY29ycmVjdCAtbGMgb3IgLWxwIG9yIC1wYiB2YWx1ZSIpOw0KKwkJCQllbmNvZGVyLlNldEVuZE1hcmtlck1vZGUoZW9zKTsNCisJCQkJZW5jb2Rlci5Xcml0ZUNvZGVyUHJvcGVydGllcyhvdXRTdHJlYW0pOw0KKwkJCQlsb25nIGZpbGVTaXplOw0KKwkJCQlpZiAoZW9zKQ0KKwkJCQkJZmlsZVNpemUgPSAtMTsNCisJCQkJZWxzZQ0KKwkJCQkJZmlsZVNpemUgPSBpbkZpbGUubGVuZ3RoKCk7DQorCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKQ0KKwkJCQkJb3V0U3RyZWFtLndyaXRlKChpbnQpKGZpbGVTaXplID4+PiAoOCAqIGkpKSAmIDB4RkYpOw0KKwkJCQllbmNvZGVyLkNvZGUoaW5TdHJlYW0sIG91dFN0cmVhbSwgLTEsIC0xLCBudWxsKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJaW50IHByb3BlcnRpZXNTaXplID0gNTsNCisJCQkJYnl0ZVtdIHByb3BlcnRpZXMgPSBuZXcgYnl0ZVtwcm9wZXJ0aWVzU2l6ZV07DQorCQkJCWlmIChpblN0cmVhbS5yZWFkKHByb3BlcnRpZXMsIDAsIHByb3BlcnRpZXNTaXplKSAhPSBwcm9wZXJ0aWVzU2l6ZSkNCisJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oImlucHV0IC5sem1hIGZpbGUgaXMgdG9vIHNob3J0Iik7DQorCQkJCVNldmVuWmlwLkNvbXByZXNzaW9uLkxaTUEuRGVjb2RlciBkZWNvZGVyID0gbmV3IFNldmVuWmlwLkNvbXByZXNzaW9uLkxaTUEuRGVjb2RlcigpOw0KKwkJCQlpZiAoIWRlY29kZXIuU2V0RGVjb2RlclByb3BlcnRpZXMocHJvcGVydGllcykpDQorCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbmNvcnJlY3Qgc3RyZWFtIHByb3BlcnRpZXMiKTsNCisJCQkJbG9uZyBvdXRTaXplID0gMDsNCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspDQorCQkJCXsNCisJCQkJCWludCB2ID0gaW5TdHJlYW0ucmVhZCgpOw0KKwkJCQkJaWYgKHYgPCAwKQ0KKwkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNhbid0IHJlYWQgc3RyZWFtIHNpemUiKTsNCisJCQkJCW91dFNpemUgfD0gKChsb25nKXYpIDw8ICg4ICogaSk7DQorCQkJCX0NCisJCQkJaWYgKCFkZWNvZGVyLkNvZGUoaW5TdHJlYW0sIG91dFN0cmVhbSwgb3V0U2l6ZSkpDQorCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJFcnJvciBpbiBkYXRhIHN0cmVhbSIpOw0KKwkJCX0NCisJCQlvdXRTdHJlYW0uZmx1c2goKTsNCisJCQlvdXRTdHJlYW0uY2xvc2UoKTsNCisJCQlpblN0cmVhbS5jbG9zZSgpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJCXRocm93IG5ldyBFeGNlcHRpb24oIkluY29ycmVjdCBjb21tYW5kIik7DQorCQlyZXR1cm47DQorCX0NCit9DQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1NldmVuWmlwL0x6bWFCZW5jaC5qYXZhIGIvbHptYS9KYXZhL1NldmVuWmlwL0x6bWFCZW5jaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZWRhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvU2V2ZW5aaXAvTHptYUJlbmNoLmphdmEKQEAgLTAsMCArMSwzOTIgQEAKK3BhY2thZ2UgU2V2ZW5aaXA7DQorDQoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KKw0KK3B1YmxpYyBjbGFzcyBMem1hQmVuY2gNCit7DQorCXN0YXRpYyBmaW5hbCBpbnQga0FkZGl0aW9uYWxTaXplID0gKDEgPDwgMjEpOw0KKwlzdGF0aWMgZmluYWwgaW50IGtDb21wcmVzc2VkQWRkaXRpb25hbFNpemUgPSAoMSA8PCAxMCk7DQorCQ0KKwlzdGF0aWMgY2xhc3MgQ1JhbmRvbUdlbmVyYXRvcg0KKwl7DQorCQlpbnQgQTE7DQorCQlpbnQgQTI7DQorCQlwdWJsaWMgQ1JhbmRvbUdlbmVyYXRvcigpIHsgSW5pdCgpOyB9DQorCQlwdWJsaWMgdm9pZCBJbml0KCkgeyBBMSA9IDM2MjQzNjA2OTsgQTIgPSA1MjEyODg2Mjk7IH0NCisJCXB1YmxpYyBpbnQgR2V0Um5kKCkNCisJCXsNCisJCQlyZXR1cm4NCisJCQkJKChBMSA9IDM2OTY5ICogKEExICYgMHhmZmZmKSArIChBMSA+Pj4gMTYpKSA8PCAxNikgXg0KKwkJCQkoKEEyID0gMTgwMDAgKiAoQTIgJiAweGZmZmYpICsgKEEyID4+PiAxNikpKTsNCisJCX0NCisJfTsNCisJDQorCXN0YXRpYyBjbGFzcyBDQml0UmFuZG9tR2VuZXJhdG9yDQorCXsNCisJCUNSYW5kb21HZW5lcmF0b3IgUkcgPSBuZXcgQ1JhbmRvbUdlbmVyYXRvcigpOw0KKwkJaW50IFZhbHVlOw0KKwkJaW50IE51bUJpdHM7DQorCQlwdWJsaWMgdm9pZCBJbml0KCkNCisJCXsNCisJCQlWYWx1ZSA9IDA7DQorCQkJTnVtQml0cyA9IDA7DQorCQl9DQorCQlwdWJsaWMgaW50IEdldFJuZChpbnQgbnVtQml0cykNCisJCXsNCisJCQlpbnQgcmVzdWx0Ow0KKwkJCWlmIChOdW1CaXRzID4gbnVtQml0cykNCisJCQl7DQorCQkJCXJlc3VsdCA9IFZhbHVlICYgKCgxIDw8IG51bUJpdHMpIC0gMSk7DQorCQkJCVZhbHVlID4+Pj0gbnVtQml0czsNCisJCQkJTnVtQml0cyAtPSBudW1CaXRzOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0NCisJCQludW1CaXRzIC09IE51bUJpdHM7DQorCQkJcmVzdWx0ID0gKFZhbHVlIDw8IG51bUJpdHMpOw0KKwkJCVZhbHVlID0gUkcuR2V0Um5kKCk7DQorCQkJcmVzdWx0IHw9IFZhbHVlICYgKCgoaW50KTEgPDwgbnVtQml0cykgLSAxKTsNCisJCQlWYWx1ZSA+Pj49IG51bUJpdHM7DQorCQkJTnVtQml0cyA9IDMyIC0gbnVtQml0czsNCisJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJfQ0KKwl9Ow0KKwkNCisJc3RhdGljIGNsYXNzIENCZW5jaFJhbmRvbUdlbmVyYXRvcg0KKwl7DQorCQlDQml0UmFuZG9tR2VuZXJhdG9yIFJHID0gbmV3IENCaXRSYW5kb21HZW5lcmF0b3IoKTsNCisJCWludCBQb3M7DQorCQlpbnQgUmVwMDsNCisNCisJCXB1YmxpYyBpbnQgQnVmZmVyU2l6ZTsNCisJCXB1YmxpYyBieXRlW10gQnVmZmVyID0gbnVsbDsNCisNCisJCXB1YmxpYyBDQmVuY2hSYW5kb21HZW5lcmF0b3IoKSB7IH0NCisJCXB1YmxpYyB2b2lkIFNldChpbnQgYnVmZmVyU2l6ZSkNCisJCXsNCisJCQlCdWZmZXIgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsNCisJCQlQb3MgPSAwOw0KKwkJCUJ1ZmZlclNpemUgPSBidWZmZXJTaXplOw0KKwkJfQ0KKwkJaW50IEdldFJuZEJpdCgpIHsgcmV0dXJuIFJHLkdldFJuZCgxKTsgfQ0KKwkJaW50IEdldExvZ1JhbmRCaXRzKGludCBudW1CaXRzKQ0KKwkJew0KKwkJCWludCBsZW4gPSBSRy5HZXRSbmQobnVtQml0cyk7DQorCQkJcmV0dXJuIFJHLkdldFJuZCgoaW50KWxlbik7DQorCQl9DQorCQlpbnQgR2V0T2Zmc2V0KCkNCisJCXsNCisJCQlpZiAoR2V0Um5kQml0KCkgPT0gMCkNCisJCQkJcmV0dXJuIEdldExvZ1JhbmRCaXRzKDQpOw0KKwkJCXJldHVybiAoR2V0TG9nUmFuZEJpdHMoNCkgPDwgMTApIHwgUkcuR2V0Um5kKDEwKTsNCisJCX0NCisJCWludCBHZXRMZW4xKCkgeyByZXR1cm4gUkcuR2V0Um5kKDEgKyAoaW50KVJHLkdldFJuZCgyKSk7IH0NCisJCWludCBHZXRMZW4yKCkgeyByZXR1cm4gUkcuR2V0Um5kKDIgKyAoaW50KVJHLkdldFJuZCgyKSk7IH0NCisJCXB1YmxpYyB2b2lkIEdlbmVyYXRlKCkNCisJCXsNCisJCQlSRy5Jbml0KCk7DQorCQkJUmVwMCA9IDE7DQorCQkJd2hpbGUgKFBvcyA8IEJ1ZmZlclNpemUpDQorCQkJew0KKwkJCQlpZiAoR2V0Um5kQml0KCkgPT0gMCB8fCBQb3MgPCAxKQ0KKwkJCQkJQnVmZmVyW1BvcysrXSA9IChieXRlKShSRy5HZXRSbmQoOCkpOw0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCWludCBsZW47DQorCQkJCQlpZiAoUkcuR2V0Um5kKDMpID09IDApDQorCQkJCQkJbGVuID0gMSArIEdldExlbjEoKTsNCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQlkbw0KKwkJCQkJCQlSZXAwID0gR2V0T2Zmc2V0KCk7DQorCQkJCQkJd2hpbGUgKFJlcDAgPj0gUG9zKTsNCisJCQkJCQlSZXAwKys7DQorCQkJCQkJbGVuID0gMiArIEdldExlbjIoKTsNCisJCQkJCX0NCisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuICYmIFBvcyA8IEJ1ZmZlclNpemU7IGkrKywgUG9zKyspDQorCQkJCQkJQnVmZmVyW1Bvc10gPSBCdWZmZXJbUG9zIC0gUmVwMF07DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX07DQorCQ0KKwlzdGF0aWMgY2xhc3MgQ3JjT3V0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0NCisJew0KKwkJcHVibGljIENSQyBDUkMgPSBuZXcgQ1JDKCk7DQorCQkNCisJCXB1YmxpYyB2b2lkIEluaXQoKQ0KKwkJeyANCisJCQlDUkMuSW5pdCgpOyANCisJCX0NCisJCXB1YmxpYyBpbnQgR2V0RGlnZXN0KCkNCisJCXsgDQorCQkJcmV0dXJuIENSQy5HZXREaWdlc3QoKTsgDQorCQl9DQorCQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikNCisJCXsNCisJCQlDUkMuVXBkYXRlKGIpOw0KKwkJfQ0KKwkJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pDQorCQl7DQorCQkJQ1JDLlVwZGF0ZShiLCBvZmYsIGxlbik7DQorCQl9DQorCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikNCisJCXsNCisJCQlDUkMuVXBkYXRlQnl0ZShiKTsNCisJCX0NCisJfTsNCisNCisJc3RhdGljIGNsYXNzIE15T3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5PdXRwdXRTdHJlYW0NCisJew0KKwkJYnl0ZVtdIF9idWZmZXI7DQorCQlpbnQgX3NpemU7DQorCQlpbnQgX3BvczsNCisJCQ0KKwkJcHVibGljIE15T3V0cHV0U3RyZWFtKGJ5dGVbXSBidWZmZXIpDQorCQl7DQorCQkJX2J1ZmZlciA9IGJ1ZmZlcjsNCisJCQlfc2l6ZSA9IF9idWZmZXIubGVuZ3RoOw0KKwkJfQ0KKwkJDQorCQlwdWJsaWMgdm9pZCByZXNldCgpDQorCQl7IA0KKwkJCV9wb3MgPSAwOyANCisJCX0NCisJCQ0KKwkJcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbg0KKwkJew0KKwkJCWlmIChfcG9zID49IF9zaXplKQ0KKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVycm9yIik7DQorCQkJX2J1ZmZlcltfcG9zKytdID0gKGJ5dGUpYjsNCisJCX0NCisJCQ0KKwkJcHVibGljIGludCBzaXplKCkNCisJCXsNCisJCQlyZXR1cm4gX3BvczsNCisJCX0NCisJfTsNCisNCisJc3RhdGljIGNsYXNzIE15SW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLklucHV0U3RyZWFtDQorCXsNCisJCWJ5dGVbXSBfYnVmZmVyOw0KKwkJaW50IF9zaXplOw0KKwkJaW50IF9wb3M7DQorCQkNCisJCXB1YmxpYyBNeUlucHV0U3RyZWFtKGJ5dGVbXSBidWZmZXIsIGludCBzaXplKQ0KKwkJew0KKwkJCV9idWZmZXIgPSBidWZmZXI7DQorCQkJX3NpemUgPSBzaXplOw0KKwkJfQ0KKwkJDQorCQlwdWJsaWMgdm9pZCByZXNldCgpDQorCQl7IA0KKwkJCV9wb3MgPSAwOyANCisJCX0NCisJCQ0KKwkJcHVibGljIGludCByZWFkKCkNCisJCXsNCisJCQlpZiAoX3BvcyA+PSBfc2l6ZSkNCisJCQkJcmV0dXJuIC0xOw0KKwkJCXJldHVybiBfYnVmZmVyW19wb3MrK10gJiAweEZGOw0KKwkJfQ0KKwl9Ow0KKwkNCisJc3RhdGljIGNsYXNzIENQcm9ncmVzc0luZm8gaW1wbGVtZW50cyBJQ29kZVByb2dyZXNzDQorCXsNCisJCXB1YmxpYyBsb25nIEFwcHJvdmVkU3RhcnQ7DQorCQlwdWJsaWMgbG9uZyBJblNpemU7DQorCQlwdWJsaWMgbG9uZyBUaW1lOw0KKwkJcHVibGljIHZvaWQgSW5pdCgpDQorCQl7IEluU2l6ZSA9IDA7IH0NCisJCXB1YmxpYyB2b2lkIFNldFByb2dyZXNzKGxvbmcgaW5TaXplLCBsb25nIG91dFNpemUpDQorCQl7DQorCQkJaWYgKGluU2l6ZSA+PSBBcHByb3ZlZFN0YXJ0ICYmIEluU2l6ZSA9PSAwKQ0KKwkJCXsNCisJCQkJVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KKwkJCQlJblNpemUgPSBpblNpemU7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCXN0YXRpYyBmaW5hbCBpbnQga1N1YkJpdHMgPSA4Ow0KKwkNCisJc3RhdGljIGludCBHZXRMb2dTaXplKGludCBzaXplKQ0KKwl7DQorCQlmb3IgKGludCBpID0ga1N1YkJpdHM7IGkgPCAzMjsgaSsrKQ0KKwkJCWZvciAoaW50IGogPSAwOyBqIDwgKDEgPDwga1N1YkJpdHMpOyBqKyspDQorCQkJCWlmIChzaXplIDw9ICgoMSkgPDwgaSkgKyAoaiA8PCAoaSAtIGtTdWJCaXRzKSkpDQorCQkJCQlyZXR1cm4gKGkgPDwga1N1YkJpdHMpICsgajsNCisJCXJldHVybiAoMzIgPDwga1N1YkJpdHMpOw0KKwl9DQorCQ0KKwlzdGF0aWMgbG9uZyBNeU11bHREaXY2NChsb25nIHZhbHVlLCBsb25nIGVsYXBzZWRUaW1lKQ0KKwl7DQorCQlsb25nIGZyZXEgPSAxMDAwOyAvLyBtcw0KKwkJbG9uZyBlbFRpbWUgPSBlbGFwc2VkVGltZTsNCisJCXdoaWxlIChmcmVxID4gMTAwMDAwMCkNCisJCXsNCisJCQlmcmVxID4+Pj0gMTsNCisJCQllbFRpbWUgPj4+PSAxOw0KKwkJfQ0KKwkJaWYgKGVsVGltZSA9PSAwKQ0KKwkJCWVsVGltZSA9IDE7DQorCQlyZXR1cm4gdmFsdWUgKiBmcmVxIC8gZWxUaW1lOw0KKwl9DQorCQ0KKwlzdGF0aWMgbG9uZyBHZXRDb21wcmVzc1JhdGluZyhpbnQgZGljdGlvbmFyeVNpemUsIGxvbmcgZWxhcHNlZFRpbWUsIGxvbmcgc2l6ZSkNCisJew0KKwkJbG9uZyB0ID0gR2V0TG9nU2l6ZShkaWN0aW9uYXJ5U2l6ZSkgLSAoMTggPDwga1N1YkJpdHMpOw0KKwkJbG9uZyBudW1Db21tYW5kc0Zvck9uZSA9IDEwNjAgKyAoKHQgKiB0ICogMTApID4+ICgyICoga1N1YkJpdHMpKTsNCisJCWxvbmcgbnVtQ29tbWFuZHMgPSAobG9uZykoc2l6ZSkgKiBudW1Db21tYW5kc0Zvck9uZTsNCisJCXJldHVybiBNeU11bHREaXY2NChudW1Db21tYW5kcywgZWxhcHNlZFRpbWUpOw0KKwl9DQorCQ0KKwlzdGF0aWMgbG9uZyBHZXREZWNvbXByZXNzUmF0aW5nKGxvbmcgZWxhcHNlZFRpbWUsIGxvbmcgb3V0U2l6ZSwgbG9uZyBpblNpemUpDQorCXsNCisJCWxvbmcgbnVtQ29tbWFuZHMgPSBpblNpemUgKiAyMjAgKyBvdXRTaXplICogMjA7DQorCQlyZXR1cm4gTXlNdWx0RGl2NjQobnVtQ29tbWFuZHMsIGVsYXBzZWRUaW1lKTsNCisJfQ0KKwkNCisJc3RhdGljIGxvbmcgR2V0VG90YWxSYXRpbmcoDQorCQkJaW50IGRpY3Rpb25hcnlTaXplLA0KKwkJCWxvbmcgZWxhcHNlZFRpbWVFbiwgbG9uZyBzaXplRW4sDQorCQkJbG9uZyBlbGFwc2VkVGltZURlLA0KKwkJCWxvbmcgaW5TaXplRGUsIGxvbmcgb3V0U2l6ZURlKQ0KKwl7DQorCQlyZXR1cm4gKEdldENvbXByZXNzUmF0aW5nKGRpY3Rpb25hcnlTaXplLCBlbGFwc2VkVGltZUVuLCBzaXplRW4pICsNCisJCQkJR2V0RGVjb21wcmVzc1JhdGluZyhlbGFwc2VkVGltZURlLCBpblNpemVEZSwgb3V0U2l6ZURlKSkgLyAyOw0KKwl9DQorCQ0KKwlzdGF0aWMgdm9pZCBQcmludFZhbHVlKGxvbmcgdikNCisJew0KKwkJU3RyaW5nIHMgPSAiIjsNCisJCXMgKz0gdjsNCisJCWZvciAoaW50IGkgPSAwOyBpICsgcy5sZW5ndGgoKSA8IDY7IGkrKykNCisJCQlTeXN0ZW0ub3V0LnByaW50KCIgIik7DQorCQlTeXN0ZW0ub3V0LnByaW50KHMpOw0KKwl9DQorCQ0KKwlzdGF0aWMgdm9pZCBQcmludFJhdGluZyhsb25nIHJhdGluZykNCisJew0KKwkJUHJpbnRWYWx1ZShyYXRpbmcgLyAxMDAwMDAwKTsNCisJCVN5c3RlbS5vdXQucHJpbnQoIiBNSVBTIik7DQorCX0NCisJDQorCXN0YXRpYyB2b2lkIFByaW50UmVzdWx0cygNCisJCQlpbnQgZGljdGlvbmFyeVNpemUsDQorCQkJbG9uZyBlbGFwc2VkVGltZSwNCisJCQlsb25nIHNpemUsDQorCQkJYm9vbGVhbiBkZWNvbXByZXNzTW9kZSwgbG9uZyBzZWNvbmRTaXplKQ0KKwl7DQorCQlsb25nIHNwZWVkID0gTXlNdWx0RGl2NjQoc2l6ZSwgZWxhcHNlZFRpbWUpOw0KKwkJUHJpbnRWYWx1ZShzcGVlZCAvIDEwMjQpOw0KKwkJU3lzdGVtLm91dC5wcmludCgiIEtCL3MgICIpOw0KKwkJbG9uZyByYXRpbmc7DQorCQlpZiAoZGVjb21wcmVzc01vZGUpDQorCQkJcmF0aW5nID0gR2V0RGVjb21wcmVzc1JhdGluZyhlbGFwc2VkVGltZSwgc2l6ZSwgc2Vjb25kU2l6ZSk7DQorCQllbHNlDQorCQkJcmF0aW5nID0gR2V0Q29tcHJlc3NSYXRpbmcoZGljdGlvbmFyeVNpemUsIGVsYXBzZWRUaW1lLCBzaXplKTsNCisJCVByaW50UmF0aW5nKHJhdGluZyk7DQorCX0NCisJDQorCXN0YXRpYyBwdWJsaWMgaW50IEx6bWFCZW5jaG1hcmsoaW50IG51bUl0ZXJhdGlvbnMsIGludCBkaWN0aW9uYXJ5U2l6ZSkgdGhyb3dzIEV4Y2VwdGlvbg0KKwl7DQorCQlpZiAobnVtSXRlcmF0aW9ucyA8PSAwKQ0KKwkJCXJldHVybiAwOw0KKwkJaWYgKGRpY3Rpb25hcnlTaXplIDwgKDEgPDwgMTgpKQ0KKwkJew0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5FcnJvcjogZGljdGlvbmFyeSBzaXplIGZvciBiZW5jaG1hcmsgbXVzdCBiZSA+PSAxOCAoMjU2IEtCKSIpOw0KKwkJCXJldHVybiAxOw0KKwkJfQ0KKwkJU3lzdGVtLm91dC5wcmludCgiXG4gICAgICAgQ29tcHJlc3NpbmcgICAgICAgICAgICAgICAgRGVjb21wcmVzc2luZ1xuXG4iKTsNCisJCQ0KKwkJU2V2ZW5aaXAuQ29tcHJlc3Npb24uTFpNQS5FbmNvZGVyIGVuY29kZXIgPSBuZXcgU2V2ZW5aaXAuQ29tcHJlc3Npb24uTFpNQS5FbmNvZGVyKCk7DQorCQlTZXZlblppcC5Db21wcmVzc2lvbi5MWk1BLkRlY29kZXIgZGVjb2RlciA9IG5ldyBTZXZlblppcC5Db21wcmVzc2lvbi5MWk1BLkRlY29kZXIoKTsNCisJCQ0KKwkJaWYgKCFlbmNvZGVyLlNldERpY3Rpb25hcnlTaXplKGRpY3Rpb25hcnlTaXplKSkNCisJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbmNvcnJlY3QgZGljdGlvbmFyeSBzaXplIik7DQorCQkNCisJCWludCBrQnVmZmVyU2l6ZSA9IGRpY3Rpb25hcnlTaXplICsga0FkZGl0aW9uYWxTaXplOw0KKwkJaW50IGtDb21wcmVzc2VkQnVmZmVyU2l6ZSA9IChrQnVmZmVyU2l6ZSAvIDIpICsga0NvbXByZXNzZWRBZGRpdGlvbmFsU2l6ZTsNCisJCQ0KKwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHByb3BTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorCQllbmNvZGVyLldyaXRlQ29kZXJQcm9wZXJ0aWVzKHByb3BTdHJlYW0pOw0KKwkJYnl0ZVtdIHByb3BBcnJheSA9IHByb3BTdHJlYW0udG9CeXRlQXJyYXkoKTsNCisJCWRlY29kZXIuU2V0RGVjb2RlclByb3BlcnRpZXMocHJvcEFycmF5KTsNCisJCQ0KKwkJQ0JlbmNoUmFuZG9tR2VuZXJhdG9yIHJnID0gbmV3IENCZW5jaFJhbmRvbUdlbmVyYXRvcigpOw0KKw0KKwkJcmcuU2V0KGtCdWZmZXJTaXplKTsNCisJCXJnLkdlbmVyYXRlKCk7DQorCQlDUkMgY3JjID0gbmV3IENSQygpOw0KKwkJY3JjLkluaXQoKTsNCisJCWNyYy5VcGRhdGUocmcuQnVmZmVyLCAwLCByZy5CdWZmZXJTaXplKTsNCisJCQ0KKwkJQ1Byb2dyZXNzSW5mbyBwcm9ncmVzc0luZm8gPSBuZXcgQ1Byb2dyZXNzSW5mbygpOw0KKwkJcHJvZ3Jlc3NJbmZvLkFwcHJvdmVkU3RhcnQgPSBkaWN0aW9uYXJ5U2l6ZTsNCisJCQ0KKwkJbG9uZyB0b3RhbEJlbmNoU2l6ZSA9IDA7DQorCQlsb25nIHRvdGFsRW5jb2RlVGltZSA9IDA7DQorCQlsb25nIHRvdGFsRGVjb2RlVGltZSA9IDA7DQorCQlsb25nIHRvdGFsQ29tcHJlc3NlZFNpemUgPSAwOw0KKwkJDQorCQlNeUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IE15SW5wdXRTdHJlYW0ocmcuQnVmZmVyLCByZy5CdWZmZXJTaXplKTsNCisNCisJCWJ5dGVbXSBjb21wcmVzc2VkQnVmZmVyID0gbmV3IGJ5dGVba0NvbXByZXNzZWRCdWZmZXJTaXplXTsNCisJCU15T3V0cHV0U3RyZWFtIGNvbXByZXNzZWRTdHJlYW0gPSBuZXcgTXlPdXRwdXRTdHJlYW0oY29tcHJlc3NlZEJ1ZmZlcik7DQorCQlDcmNPdXRTdHJlYW0gY3JjT3V0U3RyZWFtID0gbmV3IENyY091dFN0cmVhbSgpOw0KKwkJTXlJbnB1dFN0cmVhbSBpbnB1dENvbXByZXNzZWRTdHJlYW0gPSBudWxsOw0KKwkJaW50IGNvbXByZXNzZWRTaXplID0gMDsNCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtSXRlcmF0aW9uczsgaSsrKQ0KKwkJew0KKwkJCXByb2dyZXNzSW5mby5Jbml0KCk7DQorCQkJaW5TdHJlYW0ucmVzZXQoKTsNCisJCQljb21wcmVzc2VkU3RyZWFtLnJlc2V0KCk7DQorCQkJZW5jb2Rlci5Db2RlKGluU3RyZWFtLCBjb21wcmVzc2VkU3RyZWFtLCAtMSwgLTEsIHByb2dyZXNzSW5mbyk7DQorCQkJbG9uZyBlbmNvZGVUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBwcm9ncmVzc0luZm8uVGltZTsNCisJCQkNCisJCQlpZiAoaSA9PSAwKQ0KKwkJCXsNCisJCQkJY29tcHJlc3NlZFNpemUgPSBjb21wcmVzc2VkU3RyZWFtLnNpemUoKTsNCisJCQkJaW5wdXRDb21wcmVzc2VkU3RyZWFtID0gbmV3IE15SW5wdXRTdHJlYW0oY29tcHJlc3NlZEJ1ZmZlciwgY29tcHJlc3NlZFNpemUpOw0KKwkJCX0NCisJCQllbHNlIGlmIChjb21wcmVzc2VkU2l6ZSAhPSBjb21wcmVzc2VkU3RyZWFtLnNpemUoKSkNCisJCQkJdGhyb3cgKG5ldyBFeGNlcHRpb24oIkVuY29kaW5nIGVycm9yIikpOw0KKwkJCQkNCisJCQlpZiAocHJvZ3Jlc3NJbmZvLkluU2l6ZSA9PSAwKQ0KKwkJCQl0aHJvdyAobmV3IEV4Y2VwdGlvbigiSW50ZXJuYWwgRVJST1IgMTI4MiIpKTsNCisNCisJCQlsb25nIGRlY29kZVRpbWUgPSAwOw0KKwkJCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKQ0KKwkJCXsNCisJCQkJaW5wdXRDb21wcmVzc2VkU3RyZWFtLnJlc2V0KCk7DQorCQkJCWNyY091dFN0cmVhbS5Jbml0KCk7DQorCQkJCQ0KKwkJCQlsb25nIG91dFNpemUgPSBrQnVmZmVyU2l6ZTsNCisJCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsNCisJCQkJaWYgKCFkZWNvZGVyLkNvZGUoaW5wdXRDb21wcmVzc2VkU3RyZWFtLCBjcmNPdXRTdHJlYW0sIG91dFNpemUpKQ0KKwkJCQkJdGhyb3cgKG5ldyBFeGNlcHRpb24oIkRlY29kaW5nIEVycm9yIikpOzsNCisJCQkJZGVjb2RlVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOw0KKwkJCQlpZiAoY3JjT3V0U3RyZWFtLkdldERpZ2VzdCgpICE9IGNyYy5HZXREaWdlc3QoKSkNCisJCQkJCXRocm93IChuZXcgRXhjZXB0aW9uKCJDUkMgRXJyb3IiKSk7DQorCQkJfQ0KKwkJCWxvbmcgYmVuY2hTaXplID0ga0J1ZmZlclNpemUgLSAobG9uZylwcm9ncmVzc0luZm8uSW5TaXplOw0KKwkJCVByaW50UmVzdWx0cyhkaWN0aW9uYXJ5U2l6ZSwgZW5jb2RlVGltZSwgYmVuY2hTaXplLCBmYWxzZSwgMCk7DQorCQkJU3lzdGVtLm91dC5wcmludCgiICAgICAiKTsNCisJCQlQcmludFJlc3VsdHMoZGljdGlvbmFyeVNpemUsIGRlY29kZVRpbWUsIGtCdWZmZXJTaXplLCB0cnVlLCBjb21wcmVzc2VkU2l6ZSk7DQorCQkJU3lzdGVtLm91dC5wcmludGxuKCk7DQorCQkJDQorCQkJdG90YWxCZW5jaFNpemUgKz0gYmVuY2hTaXplOw0KKwkJCXRvdGFsRW5jb2RlVGltZSArPSBlbmNvZGVUaW1lOw0KKwkJCXRvdGFsRGVjb2RlVGltZSArPSBkZWNvZGVUaW1lOw0KKwkJCXRvdGFsQ29tcHJlc3NlZFNpemUgKz0gY29tcHJlc3NlZFNpemU7DQorCQl9DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KKwkJUHJpbnRSZXN1bHRzKGRpY3Rpb25hcnlTaXplLCB0b3RhbEVuY29kZVRpbWUsIHRvdGFsQmVuY2hTaXplLCBmYWxzZSwgMCk7DQorCQlTeXN0ZW0ub3V0LnByaW50KCIgICAgICIpOw0KKwkJUHJpbnRSZXN1bHRzKGRpY3Rpb25hcnlTaXplLCB0b3RhbERlY29kZVRpbWUsDQorCQkJCWtCdWZmZXJTaXplICogKGxvbmcpbnVtSXRlcmF0aW9ucywgdHJ1ZSwgdG90YWxDb21wcmVzc2VkU2l6ZSk7DQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBBdmVyYWdlIik7DQorCQlyZXR1cm4gMDsNCisJfQ0KK30NCmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9BbmRyb2lkLm1rIGIvbHptYS9KYXZhL1R1a2FhbmkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDA4ODJlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2FhbmkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9TREtfVkVSU0lPTiA9IGN1cnJlbnQKKworTE9DQUxfTU9EVUxFIDo9IHh6LWphdmEKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9IHNyYworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19KQVZBX0xJQlJBUlkpCisKZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL0NPUFlJTkcgYi9sem1hL0phdmEvVHVrYWFuaS9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZDQwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9DT1BZSU5HCkBAIC0wLDAgKzEsMTAgQEAKKworTGljZW5zaW5nIG9mIFhaIGZvciBKYXZhCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEFsbCB0aGUgZmlsZXMgaW4gdGhpcyBwYWNrYWdlIGhhdmUgYmVlbiB3cml0dGVuIGJ5IExhc3NlIENvbGxpbgorICAgIGFuZC9vciBJZ29yIFBhdmxvdi4gQWxsIHRoZXNlIGZpbGVzIGhhdmUgYmVlbiBwdXQgaW50byB0aGUKKyAgICBwdWJsaWMgZG9tYWluLiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhlc2UgZmlsZXMuCisKKyAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIsIHdpdGhvdXQgYW55IHdhcnJhbnR5LgorCmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9ORVdTIGIvbHptYS9KYXZhL1R1a2FhbmkvTkVXUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGVjZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2FhbmkvTkVXUwpAQCAtMCwwICsxLDU2IEBACisKK1haIGZvciBKYXZhIHJlbGVhc2Ugbm90ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworMS41ICgyMDE0LTAzLTA4KQorCisgICAgKiBGaXggYSB3cm9uZyBhc3NlcnRpb24gaW4gQkNKIGRlY29kZXJzLgorCisgICAgKiBVc2UgYSBmaWVsZCBpbnN0ZWFkIG9mIHJlYWxsb2NhdGluZyBhIHRlbXBvcmFyeSBvbmUtYnl0ZSBidWZmZXIKKyAgICAgIGluIHJlYWQoKSBhbmQgd3JpdGUoKSBpbXBsZW1lbnRhdGlvbnMgaW4gc2V2ZXJhbCBjbGFzc2VzLgorCisxLjQgKDIwMTMtMDktMjIpCisKKyAgICAqIEFkZCBMWk1BSW5wdXRTdHJlYW0gZm9yIGRlY29kaW5nIC5sem1hIGZpbGVzIGFuZCByYXcgTFpNQSBzdHJlYW1zLgorCisxLjMgKDIwMTMtMDUtMTIpCisKKyAgICAqIEZpeCBhIGRhdGEgY29ycnVwdGlvbiBidWcgd2hlbiBmbHVzaGluZyB0aGUgTFpNQTIgZW5jb2RlciBvcgorICAgICAgd2hlbiB1c2luZyBhIHByZXNldCBkaWN0aW9uYXJ5LgorCisgICAgKiBNYWtlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYWiBCbG9jayBwb3NpdGlvbnMgYW5kIHNpemVzIGF2YWlsYWJsZQorICAgICAgaW4gU2Vla2FibGVYWklucHV0U3RyZWFtIGJ5IGFkZGluZyB0aGUgZm9sbG93aW5nIHB1YmxpYyBmdW5jdGlvbnM6CisgICAgICAgIC0gaW50IGdldFN0cmVhbUNvdW50KCkKKyAgICAgICAgLSBpbnQgZ2V0QmxvY2tDb3VudCgpCisgICAgICAgIC0gbG9uZyBnZXRCbG9ja1BvcyhpbnQgYmxvY2tOdW1iZXIpCisgICAgICAgIC0gbG9uZyBnZXRCbG9ja1NpemUoaW50IGJsb2NrTnVtYmVyKQorICAgICAgICAtIGxvbmcgZ2V0QmxvY2tDb21wUG9zKGludCBibG9ja051bWJlcikKKyAgICAgICAgLSBsb25nIGdldEJsb2NrQ29tcFNpemUoaW50IGJsb2NrTnVtYmVyKQorICAgICAgICAtIGludCBnZXRCbG9ja0NoZWNrVHlwZShpbnQgYmxvY2tOdW1iZXIpCisgICAgICAgIC0gaW50IGdldEJsb2NrTnVtYmVyKGxvbmcgcG9zKQorICAgICAgICAtIHZvaWQgc2Vla1RvQmxvY2soaW50IGJsb2NrTnVtYmVyKQorCisgICAgKiBNaW5vciBpbXByb3ZlbWVudHMgdG8gamF2YWRvYyBjb21tZW50cyB3ZXJlIG1hZGUuCisKKzEuMiAoMjAxMy0wMS0yOSkKKworICAgICogVXNlIGZpZWxkcyBpbnN0ZWFkIG9mIHJlYWxsb2NhdGluZyBmcmVxdWVudGx5LW5lZWRlZCB0ZW1wb3JhcnkKKyAgICAgIG9iamVjdHMgaW4gdGhlIExaTUEgZW5jb2Rlci4KKworICAgICogRml4IHRoZSBjb250ZW50cyBvZiB4ei0ke3ZlcnNpb259LXNvdXJjZXMuamFyLgorCisgICAgKiBBZGQgT1NHaSBhdHRyaWJ1dGVzIHRvIHh6Lmphci4KKworMS4xICgyMDEyLTA3LTA1KQorCisgICAgKiBUaGUgZGVwdGhMaW1pdCBhcmd1bWVudCBpbiB0aGUgTFpNQTJPcHRpb25zIGNvbnN0cnVjdG9yIGlzCisgICAgICBubyBsb25nZXIgaWdub3JlZC4KKworICAgICogTFpNQTJPcHRpb25zKCkgY2FuIG5vIGxvbmdlciB0aHJvdyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24uCisKKyAgICAqIEZpeCBidWdzIGluIHRoZSBwcmVzZXQgZGljdGlvbmFyeSBzdXBwb3J0IGluIHRoZSBMWk1BMiBlbmNvZGVyLgorCisxLjAgKDIwMTEtMTAtMjIpCisKKyAgICAqIFRoZSBmaXJzdCBzdGFibGUgcmVsZWFzZQorCmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9SRUFETUUgYi9sem1hL0phdmEvVHVrYWFuaS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzMDI5OQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL1JFQURNRQpAQCAtMCwwICsxLDUwIEBACisKK1haIGZvciBKYXZhCis9PT09PT09PT09PQorCitJbnRyb2R1Y3Rpb24KKworICAgIFRoaXMgYWltcyB0byBiZSBhIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIFhaIGRhdGEgY29tcHJlc3Npb24KKyAgICBpbiBwdXJlIEphdmEuIEZlYXR1cmVzOgorICAgICAgLSBGdWxsIHN1cHBvcnQgZm9yIHRoZSAueHogZmlsZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMC40CisgICAgICAtIFNpbmdsZS10aHJlYWRlZCBzdHJlYW1lZCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorICAgICAgLSBTaW5nbGUtdGhyZWFkZWQgZGVjb21wcmVzc2lvbiB3aXRoIGxpbWl0ZWQgcmFuZG9tIGFjY2VzcyBzdXBwb3J0CisgICAgICAtIFJhdyBzdHJlYW1zIChubyAueHogaGVhZGVycykgZm9yIGFkdmFuY2VkIHVzZXJzLCBpbmNsdWRpbmcgTFpNQTIKKyAgICAgICAgd2l0aCBwcmVzZXQgZGljdGlvbmFyeQorCisgICAgVGhyZWFkaW5nIGlzIHBsYW5uZWQgYnV0IGl0IGlzIHVua25vd24gd2hlbiBpdCB3aWxsIGJlIGltcGxlbWVudGVkLgorCisgICAgRm9yIHRoZSBsYXRlc3Qgc291cmNlIGNvZGUsIHNlZSB0aGUgcHJvamVjdCBob21lIHBhZ2U6CisKKyAgICAgICAgaHR0cDovL3R1a2Fhbmkub3JnL3h6L2phdmEuaHRtbAorCisgICAgVGhlIHNvdXJjZSBjb2RlIGlzIGNvbXBhdGlibGUgd2l0aCBKYXZhIDEuNCBhbmQgbGF0ZXIuCisKK0J1aWxkaW5nCisKKyAgICBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgQXBhY2hlIEFudC4gVHlwZSAiYW50IiB0byBjb21waWxlIHRoZQorICAgIGNsYXNzZXMgYW5kIGNyZWF0ZSB0aGUgLmphciBmaWxlcy4gVHlwZSAiYW50IGRvYyIgdG8gYnVpbGQgdGhlCisgICAgamF2YWRvYyBIVE1MIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCBidWlsZGluZyB0aGUgZG9jdW1lbnRhdGlvbgorICAgIHdpbGwgZG93bmxvYWQgYSBzbWFsbCBmaWxlIG5hbWVkICJwYWNrYWdlLWxpc3QiIGZyb20gT3JhY2xlIHRvCisgICAgZW5hYmxlIGxpbmtpbmcgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIHN0YW5kYXJkIEphdmEgY2xhc3Nlcy4KKworICAgIElmIHlvdSBjYW5ub3Qgb3IgZG9uJ3Qgd2FudCB0byB1c2UgQW50LCBqdXN0IGNvbXBpbGUgYWxsIC5qYXZhCisgICAgZmlsZXMgdW5kZXIgdGhlICJzcmMiIGRpcmVjdG9yeS4KKworRGVtbyBwcm9ncmFtcworCisgICAgWW91IGNhbiB0ZXN0IGNvbXByZXNzaW9uIHdpdGggWFpFbmNEZW1vLCB3aGljaCBjb21wcmVzc2VzIGZyb20KKyAgICBzdGFuZGFyZCBpbnB1dCB0byBzdGFuZGFyZCBvdXRwdXQ6CisKKyAgICAgICAgamF2YSAtamFyIGJ1aWxkL2phci9YWkVuY0RlbW8uamFyIDwgZm9vLnR4dCA+IGZvby50eHQueHoKKworICAgIFlvdSBjYW4gdGVzdCBkZWNvbXByZXNzaW9uIHdpdGggWFpEZWNEZW1vLCB3aGljaCBkZWNvbXByZXNzZXMgdG8KKyAgICBzdGFuZGFyZCBvdXRwdXQ6CisKKyAgICAgICAgamF2YSAtamFyIGJ1aWxkL2phci9YWkRlY0RlbW8uamFyIGZvby50eHQueHoKKworUmVwb3J0aW5nIGJ1Z3MKKworICAgIFJlcG9ydCBidWdzIHRvIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+IG9yIHZpc2l0IHRoZSBJUkMgY2hhbm5lbAorICAgICN0dWthYW5pIG9uIEZyZWVub2RlIGFuZCB0YWxrIHRvIExhcmh6dS4KKwpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2FhbmkvVEhBTktTIGIvbHptYS9KYXZhL1R1a2FhbmkvVEhBTktTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDUwNjkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9USEFOS1MKQEAgLTAsMCArMSwxNiBAQAorCitUaGFua3MKKz09PT09PQorCitQZW9wbGUgKGluIGFscGhhYmV0aWNhbCBvcmRlcik6CisgIC0gU3RlZmFuIEJvZGV3aWcKKyAgLSBDYXJsIEhhc3NlbHNrb2cKKyAgLSBBcnVuZXNoIE1hdGh1cgorICAtIEppbSBNZXllcmluZworICAtIEJlbm9pdCBOYWRlYXUKKyAgLSBDaHJpc3RpYW4gU2NobGljaHRoZXJsZQorICAtIEFseW9zaGEgVmFzaWxpZXZhCisKK0NvbXBhbmllczoKKyAgLSBSZWQgSGF0CisKZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL2J1aWxkLnByb3BlcnRpZXMgYi9sem1hL0phdmEvVHVrYWFuaS9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Y2VhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgYnVpbGQucHJvcGVydGllcworIworIyBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorIworIyBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisjIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisjCisKK3RpdGxlID0gWFogZGF0YSBjb21wcmVzc2lvbgoraG9tZXBhZ2UgPSBodHRwOi8vdHVrYWFuaS5vcmcveHovamF2YS5odG1sCit2ZXJzaW9uID0gMS41CisKK2RlYnVnID0gZmFsc2UKK3NvdXJjZXZlciA9IDEuNAorc3JjX2RpciA9IHNyYworCitidWlsZF9kaXIgPSBidWlsZAorZGlzdF9kaXIgPSAke2J1aWxkX2Rpcn0vZGlzdAorZGlzdF9maWxlID0gJHtkaXN0X2Rpcn0veHotamF2YS0ke3ZlcnNpb259LnppcAorY2xhc3Nlc19kaXIgPSAke2J1aWxkX2Rpcn0vY2xhc3NlcworamFyX2RpciA9ICR7YnVpbGRfZGlyfS9qYXIKK2RvY19kaXIgPSAke2J1aWxkX2Rpcn0vZG9jCisKK2V4dGRvY191cmwgPSBodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvYXBpCitleHRkb2NfZGlyID0gZXh0ZG9jCisKK3BvbV90ZW1wbGF0ZSA9IG1hdmVuL3BvbV90ZW1wbGF0ZS54bWwKK21hdmVuX2RpciA9ICR7YnVpbGRfZGlyfS9tYXZlbgpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2FhbmkvYnVpbGQueG1sIGIvbHptYS9KYXZhL1R1a2FhbmkvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMmU2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9idWlsZC54bWwKQEAgLTAsMCArMSwxNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CisKKzwhLS0KKyAgICBidWlsZC54bWwKKworICAgIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisKKyAgICBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgICAgWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJYWiIgZGVmYXVsdD0iamFyIj4KKworICAgIDxwcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkRlbGV0ZXMgZ2VuZXJhdGVkIGZpbGVzIGV4Y2VwdCAnZXh0ZG9jL3BhY2thZ2UtbGlzdCciPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZF9kaXJ9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRpc3RjbGVhbiIgZGVwZW5kcz0iY2xlYW4iCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRGVsZXRlcyBhbGwgZ2VuZXJhdGVkIGZpbGVzIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9ImV4dGRvYyIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXNjcmlwdGlvbj0iQ3JlYXRlcyBhIHNvdXJjZSBwYWNrYWdlICguemlwKSI+CisgICAgICAgIDxta2RpciBkaXI9IiR7ZGlzdF9kaXJ9Ii8+CisgICAgICAgIDx6aXAgZGVzdGZpbGU9IiR7ZGlzdF9maWxlfSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzZmlsZT0iZmlsZXNldC1taXNjLnR4dCIvPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlc2ZpbGU9ImZpbGVzZXQtc3JjLnR4dCIvPgorICAgICAgICA8L3ppcD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZG9jIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkdlbmVyYXRlcyBIVE1MIGRvY3VtZW50YXRpb24gd2l0aCBqYXZhZG9jIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtkb2NfZGlyfSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2V4dGRvY19kaXJ9Ii8+CisgICAgICAgIDxnZXQgc3JjPSIke2V4dGRvY191cmx9L3BhY2thZ2UtbGlzdCIKKyAgICAgICAgICAgICBkZXN0PSIke2V4dGRvY19kaXJ9L3BhY2thZ2UtbGlzdCIgc2tpcGV4aXN0aW5nPSJ0cnVlIi8+CisgICAgICAgIDxqYXZhZG9jIHNvdXJjZXBhdGg9IiR7c3JjX2Rpcn0iIGRlc3RkaXI9IiR7ZG9jX2Rpcn0iCisgICAgICAgICAgICAgICAgIHNvdXJjZT0iJHtzb3VyY2V2ZXJ9IiBwYWNrYWdlbmFtZXM9Im9yZy50dWthYW5pLnh6IgorICAgICAgICAgICAgICAgICB3aW5kb3d0aXRsZT0iWFogZGF0YSBjb21wcmVzc2lvbiIKKyAgICAgICAgICAgICAgICAgbGlua29mZmxpbmU9IiR7ZXh0ZG9jX3VybH0gJHtleHRkb2NfZGlyfSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXNjcmlwdGlvbj0iQ29tcGlsZXMgdGhlIGNsYXNzZXMiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNfZGlyfSIvPgorICAgICAgICA8amF2YWMgc3JjZGlyPSIuIiBzb3VyY2VwYXRoPSIke3NyY19kaXJ9IiBkZXN0ZGlyPSIke2NsYXNzZXNfZGlyfSIKKyAgICAgICAgICAgICAgIGluY2x1ZGVBbnRSdW50aW1lPSJmYWxzZSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgICAgICAgc291cmNlPSIke3NvdXJjZXZlcn0iIGluY2x1ZGVzZmlsZT0iZmlsZXNldC1zcmMudHh0IgorICAgICAgICAgICAgICAgZXhjbHVkZXM9IioqL3BhY2thZ2UtaW5mby5qYXZhIj4KKyAgICAgICAgICAgIDxjb21waWxlcmFyZyBjb21waWxlcj0ibW9kZXJuIiB2YWx1ZT0iLVhsaW50Ii8+CisgICAgICAgIDwvamF2YWM+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGVzIEpBUiBwYWNrYWdlcyI+CisgICAgICAgIDxta2RpciBkaXI9IiR7amFyX2Rpcn0iLz4KKworICAgICAgICA8amFyIGRlc3RmaWxlPSIke2phcl9kaXJ9L3h6LmphciIgYmFzZWRpcj0iJHtjbGFzc2VzX2Rpcn0iCisgICAgICAgICAgICAgaW5jbHVkZXM9Im9yZy90dWthYW5pL3h6LyoqIj4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVRpdGxlIiB2YWx1ZT0iJHt0aXRsZX0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1VUkwiIHZhbHVlPSIke2hvbWVwYWdlfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iU2VhbGVkIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgICAgIDwhLS0gQXR0cmlidXRlcyByZXF1aXJlZCBmb3IgT1NHaSBidW5kbGVzLiAtLT4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iIHZhbHVlPSIyIi8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtU3ltYm9saWNOYW1lIiB2YWx1ZT0ib3JnLnR1a2FhbmkueHoiLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1WZXJzaW9uIiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iRXhwb3J0LVBhY2thZ2UiIHZhbHVlPSJvcmcudHVrYWFuaS54eiIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQnVuZGxlLU5hbWUiIHZhbHVlPSIke3RpdGxlfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQnVuZGxlLURvY1VSTCIgdmFsdWU9IiR7aG9tZXBhZ2V9Ii8+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICA8L2phcj4KKworICAgICAgICA8amFyIGRlc3RmaWxlPSIke2phcl9kaXJ9L1haRW5jRGVtby5qYXIiIGJhc2VkaXI9IiR7Y2xhc3Nlc19kaXJ9IgorICAgICAgICAgICAgIGluY2x1ZGVzPSJYWkVuY0RlbW8uY2xhc3MiPgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTWFpbi1DbGFzcyIgdmFsdWU9IlhaRW5jRGVtbyIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQ2xhc3MtUGF0aCIgdmFsdWU9Inh6LmphciIvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgPC9qYXI+CisKKyAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtqYXJfZGlyfS9YWkRlY0RlbW8uamFyIiBiYXNlZGlyPSIke2NsYXNzZXNfZGlyfSIKKyAgICAgICAgICAgICBpbmNsdWRlcz0iWFpEZWNEZW1vLmNsYXNzIj4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Ik1haW4tQ2xhc3MiIHZhbHVlPSJYWkRlY0RlbW8iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkNsYXNzLVBhdGgiIHZhbHVlPSJ4ei5qYXIiLz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgIDwvamFyPgorCisgICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7amFyX2Rpcn0vWFpTZWVrRW5jRGVtby5qYXIiIGJhc2VkaXI9IiR7Y2xhc3Nlc19kaXJ9IgorICAgICAgICAgICAgIGluY2x1ZGVzPSJYWlNlZWtFbmNEZW1vLmNsYXNzIj4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Ik1haW4tQ2xhc3MiIHZhbHVlPSJYWlNlZWtFbmNEZW1vIi8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDbGFzcy1QYXRoIiB2YWx1ZT0ieHouamFyIi8+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICA8L2phcj4KKworICAgICAgICA8amFyIGRlc3RmaWxlPSIke2phcl9kaXJ9L1haU2Vla0RlY0RlbW8uamFyIiBiYXNlZGlyPSIke2NsYXNzZXNfZGlyfSIKKyAgICAgICAgICAgICBpbmNsdWRlcz0iWFpTZWVrRGVjRGVtby5jbGFzcyI+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJNYWluLUNsYXNzIiB2YWx1ZT0iWFpTZWVrRGVjRGVtbyIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQ2xhc3MtUGF0aCIgdmFsdWU9Inh6LmphciIvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgPC9qYXI+CisKKyAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtqYXJfZGlyfS9MWk1BRGVjRGVtby5qYXIiIGJhc2VkaXI9IiR7Y2xhc3Nlc19kaXJ9IgorICAgICAgICAgICAgIGluY2x1ZGVzPSJMWk1BRGVjRGVtby5jbGFzcyI+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJNYWluLUNsYXNzIiB2YWx1ZT0iTFpNQURlY0RlbW8iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkNsYXNzLVBhdGgiIHZhbHVlPSJ4ei5qYXIiLz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgIDwvamFyPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBJdCdzIGFuIHVnbHkgcXVpY2sgaGFjay4gTWF5YmUgc29tZSBkYXkgdGhlcmUgd2lsbCBiZSBhIGNsZWFuZXIKKyAgICAgICAgIHZlcnNpb24gKGUuZy4gYnkgdXNpbmcgTWF2ZW4pLiAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9Im1hdmVuIiBkZXBlbmRzPSJkaXN0LCBkb2MsIGphciIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGVzIHRoZSBmaWxlcyBmb3IgYSBNYXZlbiByZXBvc2l0b3J5Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHttYXZlbl9kaXJ9Ii8+CisKKyAgICAgICAgPGNvcHkgZmlsZT0iJHtwb21fdGVtcGxhdGV9IiB0b2ZpbGU9IiR7bWF2ZW5fZGlyfS94ei0ke3ZlcnNpb259LnBvbSIKKyAgICAgICAgICAgICAgb3ZlcndyaXRlPSJ0cnVlIj4KKyAgICAgICAgICAgIDxmaWx0ZXJzZXQ+CisgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iVkVSU0lPTiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJUSVRMRSIgdmFsdWU9IiR7dGl0bGV9Ii8+CisgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iSE9NRVBBR0UiIHZhbHVlPSIke2hvbWVwYWdlfSIvPgorICAgICAgICAgICAgPC9maWx0ZXJzZXQ+CisgICAgICAgIDwvY29weT4KKworICAgICAgICA8Y29weSBmaWxlPSIke2phcl9kaXJ9L3h6LmphciIgdG9maWxlPSIke21hdmVuX2Rpcn0veHotJHt2ZXJzaW9ufS5qYXIiCisgICAgICAgICAgICAgIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIiBvdmVyd3JpdGU9InRydWUiLz4KKworICAgICAgICA8amFyIGRlc3RmaWxlPSIke21hdmVuX2Rpcn0veHotJHt2ZXJzaW9ufS1qYXZhZG9jLmphciIKKyAgICAgICAgICAgICBiYXNlZGlyPSIke2RvY19kaXJ9Ii8+CisKKyAgICAgICAgPGphciBkZXN0ZmlsZT0iJHttYXZlbl9kaXJ9L3h6LSR7dmVyc2lvbn0tc291cmNlcy5qYXIiCisgICAgICAgICAgICAgYmFzZWRpcj0iJHtzcmNfZGlyfSIgaW5jbHVkZXM9Im9yZy90dWthYW5pL3h6LyoqIi8+CisgICAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL2ZpbGVzZXQtbWlzYy50eHQgYi9sem1hL0phdmEvVHVrYWFuaS9maWxlc2V0LW1pc2MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTYzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9maWxlc2V0LW1pc2MudHh0CkBAIC0wLDAgKzEsMTEgQEAKK1JFQURNRQorTkVXUworQ09QWUlORworVEhBTktTCitidWlsZC54bWwKK2J1aWxkLnByb3BlcnRpZXMKK2ZpbGVzZXQtc3JjLnR4dAorZmlsZXNldC1taXNjLnR4dAorLmdpdGlnbm9yZQorbWF2ZW4vUkVBRE1FCittYXZlbi9wb21fdGVtcGxhdGUueG1sCmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9maWxlc2V0LXNyYy50eHQgYi9sem1hL0phdmEvVHVrYWFuaS9maWxlc2V0LXNyYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxODFmYgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL2ZpbGVzZXQtc3JjLnR4dApAQCAtMCwwICsxLDEwMCBAQAorc3JjL0xaTUFEZWNEZW1vLmphdmEKK3NyYy9YWkRlY0RlbW8uamF2YQorc3JjL1haRW5jRGVtby5qYXZhCitzcmMvWFpTZWVrRGVjRGVtby5qYXZhCitzcmMvWFpTZWVrRW5jRGVtby5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovQVJNT3B0aW9ucy5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovQVJNVGh1bWJPcHRpb25zLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9CQ0pDb2Rlci5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovQkNKRGVjb2Rlci5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovQkNKRW5jb2Rlci5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovQkNKT3B0aW9ucy5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovQmxvY2tJbnB1dFN0cmVhbS5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovQmxvY2tPdXRwdXRTdHJlYW0uamF2YQorc3JjL29yZy90dWthYW5pL3h6L0NvcnJ1cHRlZElucHV0RXhjZXB0aW9uLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9Db3VudGluZ0lucHV0U3RyZWFtLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9Db3VudGluZ091dHB1dFN0cmVhbS5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovRGVsdGFDb2Rlci5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovRGVsdGFEZWNvZGVyLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9EZWx0YUVuY29kZXIuamF2YQorc3JjL29yZy90dWthYW5pL3h6L0RlbHRhSW5wdXRTdHJlYW0uamF2YQorc3JjL29yZy90dWthYW5pL3h6L0RlbHRhT3B0aW9ucy5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovRGVsdGFPdXRwdXRTdHJlYW0uamF2YQorc3JjL29yZy90dWthYW5pL3h6L0ZpbHRlckNvZGVyLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9GaWx0ZXJEZWNvZGVyLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9GaWx0ZXJFbmNvZGVyLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9GaWx0ZXJPcHRpb25zLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9GaW5pc2hhYmxlT3V0cHV0U3RyZWFtLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9GaW5pc2hhYmxlV3JhcHBlck91dHB1dFN0cmVhbS5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovSUE2NE9wdGlvbnMuamF2YQorc3JjL29yZy90dWthYW5pL3h6L0luZGV4SW5kaWNhdG9yRXhjZXB0aW9uLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9MWk1BMkNvZGVyLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9MWk1BMkRlY29kZXIuamF2YQorc3JjL29yZy90dWthYW5pL3h6L0xaTUEyRW5jb2Rlci5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovTFpNQTJJbnB1dFN0cmVhbS5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovTFpNQTJPcHRpb25zLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9MWk1BMk91dHB1dFN0cmVhbS5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovTFpNQUlucHV0U3RyZWFtLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9NZW1vcnlMaW1pdEV4Y2VwdGlvbi5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovUG93ZXJQQ09wdGlvbnMuamF2YQorc3JjL29yZy90dWthYW5pL3h6L1Jhd0NvZGVyLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9TUEFSQ09wdGlvbnMuamF2YQorc3JjL29yZy90dWthYW5pL3h6L1NlZWthYmxlRmlsZUlucHV0U3RyZWFtLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9TZWVrYWJsZUlucHV0U3RyZWFtLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9TZWVrYWJsZVhaSW5wdXRTdHJlYW0uamF2YQorc3JjL29yZy90dWthYW5pL3h6L1NpbXBsZUlucHV0U3RyZWFtLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9TaW1wbGVPdXRwdXRTdHJlYW0uamF2YQorc3JjL29yZy90dWthYW5pL3h6L1NpbmdsZVhaSW5wdXRTdHJlYW0uamF2YQorc3JjL29yZy90dWthYW5pL3h6L1VuY29tcHJlc3NlZExaTUEyT3V0cHV0U3RyZWFtLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9VbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24uamF2YQorc3JjL29yZy90dWthYW5pL3h6L1g4Nk9wdGlvbnMuamF2YQorc3JjL29yZy90dWthYW5pL3h6L1haLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9YWkZvcm1hdEV4Y2VwdGlvbi5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovWFpJT0V4Y2VwdGlvbi5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovWFpJbnB1dFN0cmVhbS5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovWFpPdXRwdXRTdHJlYW0uamF2YQorc3JjL29yZy90dWthYW5pL3h6L2NoZWNrL0NSQzMyLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9jaGVjay9DUkM2NC5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovY2hlY2svQ2hlY2suamF2YQorc3JjL29yZy90dWthYW5pL3h6L2NoZWNrL05vbmUuamF2YQorc3JjL29yZy90dWthYW5pL3h6L2NoZWNrL1NIQTI1Ni5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovY29tbW9uL0RlY29kZXJVdGlsLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9jb21tb24vRW5jb2RlclV0aWwuamF2YQorc3JjL29yZy90dWthYW5pL3h6L2NvbW1vbi9TdHJlYW1GbGFncy5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovY29tbW9uL1V0aWwuamF2YQorc3JjL29yZy90dWthYW5pL3h6L2RlbHRhL0RlbHRhQ29kZXIuamF2YQorc3JjL29yZy90dWthYW5pL3h6L2RlbHRhL0RlbHRhRGVjb2Rlci5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovZGVsdGEvRGVsdGFFbmNvZGVyLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9pbmRleC9CbG9ja0luZm8uamF2YQorc3JjL29yZy90dWthYW5pL3h6L2luZGV4L0luZGV4QmFzZS5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovaW5kZXgvSW5kZXhEZWNvZGVyLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9pbmRleC9JbmRleEVuY29kZXIuamF2YQorc3JjL29yZy90dWthYW5pL3h6L2luZGV4L0luZGV4SGFzaC5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovaW5kZXgvSW5kZXhSZWNvcmQuamF2YQorc3JjL29yZy90dWthYW5pL3h6L2x6L0JUNC5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovbHovQ1JDMzJIYXNoLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9sei9IQzQuamF2YQorc3JjL29yZy90dWthYW5pL3h6L2x6L0hhc2gyMzQuamF2YQorc3JjL29yZy90dWthYW5pL3h6L2x6L0xaRGVjb2Rlci5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovbHovTFpFbmNvZGVyLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9sei9NYXRjaGVzLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9sem1hL0xaTUFDb2Rlci5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovbHptYS9MWk1BRGVjb2Rlci5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovbHptYS9MWk1BRW5jb2Rlci5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovbHptYS9MWk1BRW5jb2RlckZhc3QuamF2YQorc3JjL29yZy90dWthYW5pL3h6L2x6bWEvTFpNQUVuY29kZXJOb3JtYWwuamF2YQorc3JjL29yZy90dWthYW5pL3h6L2x6bWEvT3B0aW11bS5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovbHptYS9TdGF0ZS5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovcGFja2FnZS1pbmZvLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9yYW5nZWNvZGVyL1JhbmdlQ29kZXIuamF2YQorc3JjL29yZy90dWthYW5pL3h6L3JhbmdlY29kZXIvUmFuZ2VEZWNvZGVyLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9yYW5nZWNvZGVyL1JhbmdlRGVjb2RlckZyb21CdWZmZXIuamF2YQorc3JjL29yZy90dWthYW5pL3h6L3JhbmdlY29kZXIvUmFuZ2VEZWNvZGVyRnJvbVN0cmVhbS5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovcmFuZ2Vjb2Rlci9SYW5nZUVuY29kZXIuamF2YQorc3JjL29yZy90dWthYW5pL3h6L3NpbXBsZS9BUk0uamF2YQorc3JjL29yZy90dWthYW5pL3h6L3NpbXBsZS9BUk1UaHVtYi5qYXZhCitzcmMvb3JnL3R1a2FhbmkveHovc2ltcGxlL0lBNjQuamF2YQorc3JjL29yZy90dWthYW5pL3h6L3NpbXBsZS9Qb3dlclBDLmphdmEKK3NyYy9vcmcvdHVrYWFuaS94ei9zaW1wbGUvU1BBUkMuamF2YQorc3JjL29yZy90dWthYW5pL3h6L3NpbXBsZS9TaW1wbGVGaWx0ZXIuamF2YQorc3JjL29yZy90dWthYW5pL3h6L3NpbXBsZS9YODYuamF2YQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2FhbmkvbWF2ZW4vUkVBRE1FIGIvbHptYS9KYXZhL1R1a2FhbmkvbWF2ZW4vUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OTJhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9tYXZlbi9SRUFETUUKQEAgLTAsMCArMSwyIEBACitUaGUgcG9tX3RlbXBsYXRlLnhtbCBpcyBmb3IgYSBNYXZlbiByZXBvc2l0b3J5IGJ1dCBpdCdzIG5vdCBtZWFudAorZm9yIGJ1aWxkaW5nIHRoZSBwcm9qZWN0LiBOb3RlIHRoYXQgYnVpbGQueG1sIHdpbGwgcmVwbGFjZSBAZm9vQCB0YWdzLgpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2FhbmkvbWF2ZW4vcG9tX3RlbXBsYXRlLnhtbCBiL2x6bWEvSmF2YS9UdWthYW5pL21hdmVuL3BvbV90ZW1wbGF0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkZWVjZQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL21hdmVuL3BvbV90ZW1wbGF0ZS54bWwKQEAgLTAsMCArMSw1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCisNCis8IS0tDQorICAgIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+DQorDQorICAgIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4NCisgICAgWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4NCistLT4NCisNCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPg0KKw0KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQorDQorICAgIDxncm91cElkPm9yZy50dWthYW5pPC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD54ejwvYXJ0aWZhY3RJZD4NCisgICAgPHZlcnNpb24+QFZFUlNJT05APC92ZXJzaW9uPg0KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KKw0KKyAgICA8bmFtZT5YWiBmb3IgSmF2YTwvbmFtZT4NCisgICAgPGRlc2NyaXB0aW9uPkBUSVRMRUA8L2Rlc2NyaXB0aW9uPg0KKyAgICA8dXJsPkBIT01FUEFHRUA8L3VybD4NCisNCisgICAgPGxpY2Vuc2VzPg0KKyAgICAgICAgPGxpY2Vuc2U+DQorICAgICAgICAgICAgPG5hbWU+UHVibGljIERvbWFpbjwvbmFtZT4NCisgICAgICAgICAgICA8Y29tbWVudHM+WW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgcGFja2FnZS48L2NvbW1lbnRzPg0KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPg0KKyAgICAgICAgPC9saWNlbnNlPg0KKyAgICA8L2xpY2Vuc2VzPg0KKw0KKyAgICA8c2NtPg0KKyAgICAgICAgPHVybD5odHRwOi8vZ2l0LnR1a2Fhbmkub3JnLz9wPXh6LWphdmEuZ2l0PC91cmw+DQorICAgICAgICA8Y29ubmVjdGlvbj5zY206Z2l0Omh0dHA6Ly9naXQudHVrYWFuaS5vcmcveHotamF2YS5naXQ8L2Nvbm5lY3Rpb24+DQorICAgIDwvc2NtPg0KKw0KKyAgICA8ZGV2ZWxvcGVycz4NCisgICAgICAgIDxkZXZlbG9wZXI+DQorICAgICAgICAgICAgPG5hbWU+TGFzc2UgQ29sbGluPC9uYW1lPg0KKyAgICAgICAgICAgIDxlbWFpbD5sYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc8L2VtYWlsPg0KKyAgICAgICAgPC9kZXZlbG9wZXI+DQorICAgIDwvZGV2ZWxvcGVycz4NCisNCisgICAgPGNvbnRyaWJ1dG9ycz4NCisgICAgICAgIDxjb250cmlidXRvcj4NCisgICAgICAgICAgICA8IS0tIEFjY29yZGluZyB0byBNYXZlbiBkb2NzLCBpdCdzIGdvb2QgdG8gb25seSBsaXN0IHRob3NlIHBlb3BsZQ0KKyAgICAgICAgICAgICAgICAgYXMgPGRldmVsb3BlcnM+IHRoYXQgc2hvdWxkIGJlIGNvbnRhY3RlZCBpZiBzb21lb25lIHdhbnRzDQorICAgICAgICAgICAgICAgICB0byB0YWxrIHdpdGggYW4gdXBzdHJlYW0gZGV2ZWxvcGVyLiBUaHVzLCBJZ29yIFBhdmxvdiBpcw0KKyAgICAgICAgICAgICAgICAgbWFya2VkIGFzIGEgPGNvbnRyaWJ1dG9yPiBldmVuIHRob3VnaCBYWiBmb3IgSmF2YSBzaW1wbHkNCisgICAgICAgICAgICAgICAgIGNvdWxkbid0IGV4aXN0IHdpdGhvdXQgSWdvciBQYXZsb3YncyBjb2RlLiAtLT4NCisgICAgICAgICAgICA8bmFtZT5JZ29yIFBhdmxvdjwvbmFtZT4NCisgICAgICAgICAgICA8dXJsPmh0dHA6Ly83LXppcC5vcmcvPC91cmw+DQorICAgICAgICA8L2NvbnRyaWJ1dG9yPg0KKyAgICA8L2NvbnRyaWJ1dG9ycz4NCisNCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL0xaTUFEZWNEZW1vLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvTFpNQURlY0RlbW8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDk4NzI1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL0xaTUFEZWNEZW1vLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExaTUFEZWNEZW1vCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouKjsKKworLyoqCisgKiBEZWNvbXByZXNzZXMgLmx6bWEgZmlsZXMgdG8gc3RhbmRhcmQgb3V0cHV0LiBJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLAorICogcmVhZHMgZnJvbSBzdGFuZGFyZCBpbnB1dC4KKyAqCisgKiBOT1RFOiBGb3IgbW9zdCBwdXJwb3NlcywgLmx6bWEgaXMgYSBsZWdhY3kgZm9ybWF0IGFuZCB1c3VhbGx5IHlvdSBzaG91bGQKKyAqIHVzZSAueHogaW5zdGVhZC4KKyAqLworY2xhc3MgTFpNQURlY0RlbW8geworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzgxOTJdOworICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9ICJzdGFuZGFyZCBpbnB1dCI7CisKKyAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHVzZSBCdWZmZXJlZElucHV0U3RyZWFtIHdpdGggU3lzdGVtLmluIHdoaWNoCisgICAgICAgICAgICAgICAgLy8gc2VlbXMgdG8gYmUgZmFzdCB3aXRoIG9uZS1ieXRlIHJlYWRzLgorICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IExaTUFJbnB1dFN0cmVhbShTeXN0ZW0uaW4pOworCisgICAgICAgICAgICAgICAgaW50IHNpemU7CisgICAgICAgICAgICAgICAgd2hpbGUgKChzaXplID0gaW4ucmVhZChidWYpKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC53cml0ZShidWYsIDAsIHNpemUpOworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFJlYWQgZnJvbSBmaWxlcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gYXJnc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5hbWUpOworCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjb250cmFzdCB0byBvdGhlciBjbGFzc2VzIGluIG9yZy50dWthYW5pLnh6LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTFpNQUlucHV0U3RyZWFtIGRvZXNuJ3QgZG8gYnVmZmVyaW5nIGludGVybmFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZWFkcyBvbmUgYnl0ZSBhdCBhIHRpbWUuIEJ1ZmZlcmVkSW5wdXRTdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmVzIGEgaHVnZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBoZXJlIGJ1dCBldmVuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIGl0J3Mgc2xvd2VyIHRoYW4gdGhlIG90aGVyIGlucHV0IHN0cmVhbXMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JnLnR1a2FhbmkueHouCisgICAgICAgICAgICAgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluID0gbmV3IExaTUFJbnB1dFN0cmVhbShpbik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChzaXplID0gaW4ucmVhZChidWYpKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LndyaXRlKGJ1ZiwgMCwgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIEZpbGVJbnB1dFN0cmVhbSAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmlhIExaTUFJbnB1dFN0cmVhbSwgaXQgZG9lc24ndCBtYXR0ZXIpLgorICAgICAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTFpNQURlY0RlbW86IENhbm5vdCBvcGVuICIgKyBuYW1lICsgIjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisKKyAgICAgICAgfSBjYXRjaCAoRU9GRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTFpNQURlY0RlbW86IFVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IG9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJMWk1BRGVjRGVtbzogRXJyb3IgZGVjb21wcmVzc2luZyBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvWFpEZWNEZW1vLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvWFpEZWNEZW1vLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3NmVlYQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9YWkRlY0RlbW8uamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogWFpEZWNEZW1vCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouKjsKKworLyoqCisgKiBEZWNvbXByZXNzZXMgLnh6IGZpbGVzIHRvIHN0YW5kYXJkIG91dHB1dC4gSWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwKKyAqIHJlYWRzIGZyb20gc3RhbmRhcmQgaW5wdXQuCisgKi8KK2NsYXNzIFhaRGVjRGVtbyB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbODE5Ml07CisgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gInN0YW5kYXJkIGlucHV0IjsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBYWklucHV0U3RyZWFtKFN5c3RlbS5pbik7CisKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHNpemUgPSBpbi5yZWFkKGJ1ZikpICE9IC0xKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LndyaXRlKGJ1ZiwgMCwgc2l6ZSk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gUmVhZCBmcm9tIGZpbGVzIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhcmdzW2ldOworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIFhaSW5wdXRTdHJlYW0gZG9lcyBzb21lIGJ1ZmZlcmluZyBpbnRlcm5hbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnl3YXksIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gZG9lc24ndCBzZWVtIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkZWQgaGVyZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbiA9IG5ldyBYWklucHV0U3RyZWFtKGluKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHNpemUgPSBpbi5yZWFkKGJ1ZikpICE9IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQud3JpdGUoYnVmLCAwLCBzaXplKTsKKworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgRmlsZUlucHV0U3RyZWFtIChkaXJlY3RseSBvciBpbmRpcmVjdGx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB2aWEgWFpJbnB1dFN0cmVhbSwgaXQgZG9lc24ndCBtYXR0ZXIpLgorICAgICAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiWFpEZWNEZW1vOiBDYW5ub3Qgb3BlbiAiICsgbmFtZSArICI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworCisgICAgICAgIH0gY2F0Y2ggKEVPRkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlhaRGVjRGVtbzogVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlhaRGVjRGVtbzogRXJyb3IgZGVjb21wcmVzc2luZyBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvWFpFbmNEZW1vLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvWFpFbmNEZW1vLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhZTM4YQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9YWkVuY0RlbW8uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogWFpFbmNEZW1vCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouKjsKKworLyoqCisgKiBDb21wcmVzc2VzIGEgc2luZ2xlIGZpbGUgZnJvbSBzdGFuZGFyZCBpbnB1dCB0byBzdGFuZGFyZCBvdXB1dCBpbnRvCisgKiB0aGUgLnh6IGZpbGUgZm9ybWF0LgorICogPHA+CisgKiBPbmUgb3B0aW9uYWwgYXJndW1lbnQgaXMgc3VwcG9ydGVkOiBMWk1BMiBwcmVzZXQgbGV2ZWwgd2hpY2ggaXMgYW4gaW50ZWdlcgorICogaW4gdGhlIHJhbmdlIFswLCA5XS4gVGhlIGRlZmF1bHQgaXMgNi4KKyAqLworY2xhc3MgWFpFbmNEZW1vIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTFpNQTJPcHRpb25zIG9wdGlvbnMgPSBuZXcgTFpNQTJPcHRpb25zKCk7CisKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID49IDEpCisgICAgICAgICAgICBvcHRpb25zLnNldFByZXNldChJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMF0pKTsKKworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVuY29kZXIgbWVtb3J5IHVzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9wdGlvbnMuZ2V0RW5jb2Rlck1lbW9yeVVzYWdlKCkgKyAiIEtpQiIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkRlY29kZXIgbWVtb3J5IHVzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9wdGlvbnMuZ2V0RGVjb2Rlck1lbW9yeVVzYWdlKCkgKyAiIEtpQiIpOworCisgICAgICAgIFhaT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBYWk91dHB1dFN0cmVhbShTeXN0ZW0ub3V0LCBvcHRpb25zKTsKKworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbODE5Ml07CisgICAgICAgIGludCBzaXplOworICAgICAgICB3aGlsZSAoKHNpemUgPSBTeXN0ZW0uaW4ucmVhZChidWYpKSAhPSAtMSkKKyAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIHNpemUpOworCisgICAgICAgIG91dC5maW5pc2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvWFpTZWVrRGVjRGVtby5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL1haU2Vla0RlY0RlbW8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzU0YTg3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL1haU2Vla0RlY0RlbW8uamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogWFpTZWVrRGVjRGVtbworICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IG9yZy50dWthYW5pLnh6Lio7CisKKy8qKgorICogRGVjb21wcmVzc2VzIGEgLnh6IGZpbGUgaW4gcmFuZG9tIGFjY2VzcyBtb2RlIHRvIHN0YW5kYXJkIG91dHB1dC4KKyAqIDxwPgorICogQXJndW1lbnRzOiBmaWxlbmFtZSBbb2Zmc2V0MSBsZW5ndGgxXSBbb2Zmc2V0MiBsZW5ndGgyXSAuLi4KKyAqIDxwPgorICogSWYgb25seSB0aGUgZmlsZW5hbWUgaXMgZ2l2ZW4sIHRoZSB3aG9sZSBmaWxlIGlzIGRlY29tcHJlc3NlZC4gVGhlIG9ubHkKKyAqIGRpZmZlcmVuY2UgdG8gWFpEZWNEZW1vIGlzIHRoYXQgdGhpcyB3aWxsIHN0aWxsIHVzZSB0aGUgcmFuZG9tIGFjY2VzcyBjb2RlLgorICogPHA+CisgKiBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgb2Zmc2V0LWxlbmd0aCBwYWlycyBhcmUgZ2l2ZW4sCisgKiBmb3IgZWFjaCBwYWlyLCA8Y29kZT5sZW5ndGg8L2NvZGU+IG51bWJlciBvZiBieXRlcyBhcmUKKyAqIGRlY29tcHJlc3NlZCBmcm9tIDxjb2RlPm9mZnNldDwvY29kZT4uCisgKi8KK2NsYXNzIFhaU2Vla0RlY0RlbW8geworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTZWVrYWJsZUZpbGVJbnB1dFN0cmVhbSBmaWxlID0gbmV3IFNlZWthYmxlRmlsZUlucHV0U3RyZWFtKGFyZ3NbMF0pOworICAgICAgICBTZWVrYWJsZVhaSW5wdXRTdHJlYW0gaW4gPSBuZXcgU2Vla2FibGVYWklucHV0U3RyZWFtKGZpbGUpOworCisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTnVtYmVyIG9mIFhaIFN0cmVhbXM6ICIgKyBpbi5nZXRTdHJlYW1Db3VudCgpKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJOdW1iZXIgb2YgWFogQmxvY2tzOiAiICsgaW4uZ2V0QmxvY2tDb3VudCgpKTsKKworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVuY29tcHJlc3NlZCBzaXplOiAiICsgaW4ubGVuZ3RoKCkgKyAiIEIiKTsKKworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkxhcmdlc3QgWFogQmxvY2sgc2l6ZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbi5nZXRMYXJnZXN0QmxvY2tTaXplKCkgKyAiIEIiKTsKKworICAgICAgICBTeXN0ZW0uZXJyLnByaW50KCJMaXN0IG9mIENoZWNrIElEczoiKTsKKyAgICAgICAgaW50IGNoZWNrVHlwZXMgPSBpbi5nZXRDaGVja1R5cGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkKKyAgICAgICAgICAgIGlmICgoY2hlY2tUeXBlcyAmICgxIDw8IGkpKSAhPSAwKQorICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoIiAiICsgaSk7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigpOworCisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSW5kZXggbWVtb3J5IHVzYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluLmdldEluZGV4TWVtb3J5VXNhZ2UoKSArICIgS2lCIik7CisKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzgxOTJdOworICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgaW50IHNpemU7CisgICAgICAgICAgICB3aGlsZSAoKHNpemUgPSBpbi5yZWFkKGJ1ZikpICE9IC0xKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQud3JpdGUoYnVmLCAwLCBzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgICAgIGludCBwb3MgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIGludCBsZW4gPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaSArIDFdKTsKKworICAgICAgICAgICAgICAgIGluLnNlZWsocG9zKTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gTWF0aC5taW4obGVuLCBidWYubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGluLnJlYWQoYnVmLCAwLCBzaXplKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogRW5kIG9mIGZpbGUgcmVhY2hlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LndyaXRlKGJ1ZiwgMCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBzaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9YWlNlZWtFbmNEZW1vLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvWFpTZWVrRW5jRGVtby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1N2U3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvWFpTZWVrRW5jRGVtby5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBYWlNlZWtFbmNEZW1vCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouKjsKKworLyoqCisgKiBDb21wcmVzc2VzIGEgc2luZ2xlIGZpbGUgZnJvbSBzdGFuZGFyZCBpbnB1dCB0byBzdGFuZGFyZCBvdXB1dCBpbnRvCisgKiBhIHJhbmRvbS1hY2Nlc3NpYmxlIC54eiBmaWxlLgorICogPHA+CisgKiBBcmd1bWVudHM6IFtwcmVzZXQgW2Jsb2NrIHNpemVdXQorICogPHA+CisgKiBQcmVzZXQgaXMgYW4gTFpNQTIgcHJlc2V0IGxldmVsIHdoaWNoIGlzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIFswLCA5XS4KKyAqIFRoZSBkZWZhdWx0IGlzIDYuCisgKiA8cD4KKyAqIEJsb2NrIHNpemUgc3BlY2lmaWVzIHRoZSBhbW91bnQgb2YgdW5jb21wcmVzc2VkIGRhdGEgdG8gc3RvcmUgcGVyCisgKiBYWiBCbG9jay4gVGhlIGRlZmF1bHQgaXMgMSBNaUIgKDEwNDg1NzYgYnl0ZXMpLiBCaWdnZXIgbWVhbnMgYmV0dGVyCisgKiBjb21wcmVzc2lvbiByYXRpby4gU21hbGxlciBtZWFucyBmYXN0ZXIgcmFuZG9tIGFjY2Vzcy4KKyAqLworY2xhc3MgWFpTZWVrRW5jRGVtbyB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExaTUEyT3B0aW9ucyBvcHRpb25zID0gbmV3IExaTUEyT3B0aW9ucygpOworCisgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+PSAxKQorICAgICAgICAgICAgb3B0aW9ucy5zZXRQcmVzZXQoSW50ZWdlci5wYXJzZUludChhcmdzWzBdKSk7CisKKyAgICAgICAgaW50IGJsb2NrU2l6ZSA9IDEwMjQgKiAxMDI0OworICAgICAgICBpZiAoYXJncy5sZW5ndGggPj0gMikKKyAgICAgICAgICAgIGJsb2NrU2l6ZSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1sxXSk7CisKKyAgICAgICAgb3B0aW9ucy5zZXREaWN0U2l6ZShNYXRoLm1pbihvcHRpb25zLmdldERpY3RTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoTFpNQTJPcHRpb25zLkRJQ1RfU0laRV9NSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTaXplKSkpOworCisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRW5jb2RlciBtZW1vcnkgdXNhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3B0aW9ucy5nZXRFbmNvZGVyTWVtb3J5VXNhZ2UoKSArICIgS2lCIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGVjb2RlciBtZW1vcnkgdXNhZ2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3B0aW9ucy5nZXREZWNvZGVyTWVtb3J5VXNhZ2UoKSArICIgS2lCIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQmxvY2sgc2l6ZTogICAgICAgICAgICIgKyBibG9ja1NpemUgKyAiIEIiKTsKKworICAgICAgICBYWk91dHB1dFN0cmVhbSBvdXQgPSBuZXcgWFpPdXRwdXRTdHJlYW0oU3lzdGVtLm91dCwgb3B0aW9ucyk7CisKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzgxOTJdOworICAgICAgICBpbnQgbGVmdCA9IGJsb2NrU2l6ZTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IHNpemUgPSBTeXN0ZW0uaW4ucmVhZChidWYsIDAsIE1hdGgubWluKGJ1Zi5sZW5ndGgsIGxlZnQpKTsKKyAgICAgICAgICAgIGlmIChzaXplID09IC0xKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBzaXplKTsKKyAgICAgICAgICAgIGxlZnQgLT0gc2l6ZTsKKworICAgICAgICAgICAgaWYgKGxlZnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG91dC5lbmRCbG9jaygpOworICAgICAgICAgICAgICAgIGxlZnQgPSBibG9ja1NpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXQuZmluaXNoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0FSTU9wdGlvbnMuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9BUk1PcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3NzEwMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9BUk1PcHRpb25zLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIEFSTU9wdGlvbnMKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLnR1a2FhbmkueHouc2ltcGxlLkFSTTsKKworLyoqCisgKiBCQ0ogZmlsdGVyIGZvciBsaXR0bGUgZW5kaWFuIEFSTSBpbnN0cnVjdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBBUk1PcHRpb25zIGV4dGVuZHMgQkNKT3B0aW9ucyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMSUdOTUVOVCA9IDQ7CisKKyAgICBwdWJsaWMgQVJNT3B0aW9ucygpIHsKKyAgICAgICAgc3VwZXIoQUxJR05NRU5UKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmluaXNoYWJsZU91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oRmluaXNoYWJsZU91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVPdXRwdXRTdHJlYW0ob3V0LCBuZXcgQVJNKHRydWUsIHN0YXJ0T2Zmc2V0KSk7CisgICAgfQorCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB7CisgICAgICAgIHJldHVybiBuZXcgU2ltcGxlSW5wdXRTdHJlYW0oaW4sIG5ldyBBUk0oZmFsc2UsIHN0YXJ0T2Zmc2V0KSk7CisgICAgfQorCisgICAgRmlsdGVyRW5jb2RlciBnZXRGaWx0ZXJFbmNvZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IEJDSkVuY29kZXIodGhpcywgQkNKQ29kZXIuQVJNX0ZJTFRFUl9JRCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0FSTVRodW1iT3B0aW9ucy5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0FSTVRodW1iT3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZWI2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovQVJNVGh1bWJPcHRpb25zLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIEFSTVRodW1iT3B0aW9ucworICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5zaW1wbGUuQVJNVGh1bWI7CisKKy8qKgorICogQkNKIGZpbHRlciBmb3IgbGl0dGxlIGVuZGlhbiBBUk0tVGh1bWIgaW5zdHJ1Y3Rpb25zLgorICovCitwdWJsaWMgY2xhc3MgQVJNVGh1bWJPcHRpb25zIGV4dGVuZHMgQkNKT3B0aW9ucyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMSUdOTUVOVCA9IDI7CisKKyAgICBwdWJsaWMgQVJNVGh1bWJPcHRpb25zKCkgeworICAgICAgICBzdXBlcihBTElHTk1FTlQpOworICAgIH0KKworICAgIHB1YmxpYyBGaW5pc2hhYmxlT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShGaW5pc2hhYmxlT3V0cHV0U3RyZWFtIG91dCkgeworICAgICAgICByZXR1cm4gbmV3IFNpbXBsZU91dHB1dFN0cmVhbShvdXQsIG5ldyBBUk1UaHVtYih0cnVlLCBzdGFydE9mZnNldCkpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbikgeworICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUlucHV0U3RyZWFtKGluLCBuZXcgQVJNVGh1bWIoZmFsc2UsIHN0YXJ0T2Zmc2V0KSk7CisgICAgfQorCisgICAgRmlsdGVyRW5jb2RlciBnZXRGaWx0ZXJFbmNvZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IEJDSkVuY29kZXIodGhpcywgQkNKQ29kZXIuQVJNVEhVTUJfRklMVEVSX0lEKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovQkNKQ29kZXIuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9CQ0pDb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxODYyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovQkNKQ29kZXIuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQkNKQ29kZXIKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKKworYWJzdHJhY3QgY2xhc3MgQkNKQ29kZXIgaW1wbGVtZW50cyBGaWx0ZXJDb2RlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFg4Nl9GSUxURVJfSUQgPSAweDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQT1dFUlBDX0ZJTFRFUl9JRCA9IDB4MDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIElBNjRfRklMVEVSX0lEID0gMHgwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQVJNX0ZJTFRFUl9JRCA9IDB4MDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFSTVRIVU1CX0ZJTFRFUl9JRCA9IDB4MDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFNQQVJDX0ZJTFRFUl9JRCA9IDB4MDk7CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCQ0pGaWx0ZXJJRChsb25nIGZpbHRlcklEKSB7CisgICAgICAgIHJldHVybiBmaWx0ZXJJRCA+PSAweDA0ICYmIGZpbHRlcklEIDw9IDB4MDk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY2hhbmdlc1NpemUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBub25MYXN0T0soKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGxhc3RPSygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9CQ0pEZWNvZGVyLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovQkNKRGVjb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YTZhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovQkNKRGVjb2Rlci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBCQ0pEZWNvZGVyCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IG9yZy50dWthYW5pLnh6LnNpbXBsZS4qOworCitjbGFzcyBCQ0pEZWNvZGVyIGV4dGVuZHMgQkNKQ29kZXIgaW1wbGVtZW50cyBGaWx0ZXJEZWNvZGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgZmlsdGVySUQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc3RhcnRPZmZzZXQ7CisKKyAgICBCQ0pEZWNvZGVyKGxvbmcgZmlsdGVySUQsIGJ5dGVbXSBwcm9wcykKKyAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24geworICAgICAgICBhc3NlcnQgaXNCQ0pGaWx0ZXJJRChmaWx0ZXJJRCk7CisgICAgICAgIHRoaXMuZmlsdGVySUQgPSBmaWx0ZXJJRDsKKworICAgICAgICBpZiAocHJvcHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5sZW5ndGggPT0gNCkgeworICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICAgICAgbiB8PSAocHJvcHNbaV0gJiAweEZGKSA8PCAoaSAqIDgpOworCisgICAgICAgICAgICBzdGFydE9mZnNldCA9IG47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgQkNKIGZpbHRlciBwcm9wZXJ0aWVzIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1lbW9yeVVzYWdlKCkgeworICAgICAgICByZXR1cm4gU2ltcGxlSW5wdXRTdHJlYW0uZ2V0TWVtb3J5VXNhZ2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgICAgU2ltcGxlRmlsdGVyIHNpbXBsZUZpbHRlciA9IG51bGw7CisKKyAgICAgICAgaWYgKGZpbHRlcklEID09IFg4Nl9GSUxURVJfSUQpCisgICAgICAgICAgICBzaW1wbGVGaWx0ZXIgPSBuZXcgWDg2KGZhbHNlLCBzdGFydE9mZnNldCk7CisgICAgICAgIGVsc2UgaWYgKGZpbHRlcklEID09IFBPV0VSUENfRklMVEVSX0lEKQorICAgICAgICAgICAgc2ltcGxlRmlsdGVyID0gbmV3IFBvd2VyUEMoZmFsc2UsIHN0YXJ0T2Zmc2V0KTsKKyAgICAgICAgZWxzZSBpZiAoZmlsdGVySUQgPT0gSUE2NF9GSUxURVJfSUQpCisgICAgICAgICAgICBzaW1wbGVGaWx0ZXIgPSBuZXcgSUE2NChmYWxzZSwgc3RhcnRPZmZzZXQpOworICAgICAgICBlbHNlIGlmIChmaWx0ZXJJRCA9PSBBUk1fRklMVEVSX0lEKQorICAgICAgICAgICAgc2ltcGxlRmlsdGVyID0gbmV3IEFSTShmYWxzZSwgc3RhcnRPZmZzZXQpOworICAgICAgICBlbHNlIGlmIChmaWx0ZXJJRCA9PSBBUk1USFVNQl9GSUxURVJfSUQpCisgICAgICAgICAgICBzaW1wbGVGaWx0ZXIgPSBuZXcgQVJNVGh1bWIoZmFsc2UsIHN0YXJ0T2Zmc2V0KTsKKyAgICAgICAgZWxzZSBpZiAoZmlsdGVySUQgPT0gU1BBUkNfRklMVEVSX0lEKQorICAgICAgICAgICAgc2ltcGxlRmlsdGVyID0gbmV3IFNQQVJDKGZhbHNlLCBzdGFydE9mZnNldCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKworICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUlucHV0U3RyZWFtKGluLCBzaW1wbGVGaWx0ZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9CQ0pFbmNvZGVyLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovQkNKRW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNmJiYjcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovQkNKRW5jb2Rlci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBCQ0pFbmNvZGVyCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKK2NsYXNzIEJDSkVuY29kZXIgZXh0ZW5kcyBCQ0pDb2RlciBpbXBsZW1lbnRzIEZpbHRlckVuY29kZXIgeworICAgIHByaXZhdGUgZmluYWwgQkNKT3B0aW9ucyBvcHRpb25zOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBmaWx0ZXJJRDsKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBwcm9wczsKKworICAgIEJDSkVuY29kZXIoQkNKT3B0aW9ucyBvcHRpb25zLCBsb25nIGZpbHRlcklEKSB7CisgICAgICAgIGFzc2VydCBpc0JDSkZpbHRlcklEKGZpbHRlcklEKTsKKyAgICAgICAgaW50IHN0YXJ0T2Zmc2V0ID0gb3B0aW9ucy5nZXRTdGFydE9mZnNldCgpOworCisgICAgICAgIGlmIChzdGFydE9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBwcm9wcyA9IG5ldyBieXRlWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJvcHMgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKQorICAgICAgICAgICAgICAgIHByb3BzW2ldID0gKGJ5dGUpKHN0YXJ0T2Zmc2V0ID4+PiAoaSAqIDgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZmlsdGVySUQgPSBmaWx0ZXJJRDsKKyAgICAgICAgdGhpcy5vcHRpb25zID0gKEJDSk9wdGlvbnMpb3B0aW9ucy5jbG9uZSgpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEZpbHRlcklEKCkgeworICAgICAgICByZXR1cm4gZmlsdGVySUQ7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRGaWx0ZXJQcm9wcygpIHsKKyAgICAgICAgcmV0dXJuIHByb3BzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRmx1c2hpbmcoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmluaXNoYWJsZU91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oRmluaXNoYWJsZU91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0T3V0cHV0U3RyZWFtKG91dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0JDSk9wdGlvbnMuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9CQ0pPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1YTJjMAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9CQ0pPcHRpb25zLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIEJDSk9wdGlvbnMKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKKworYWJzdHJhY3QgY2xhc3MgQkNKT3B0aW9ucyBleHRlbmRzIEZpbHRlck9wdGlvbnMgeworICAgIHByaXZhdGUgZmluYWwgaW50IGFsaWdubWVudDsKKyAgICBpbnQgc3RhcnRPZmZzZXQgPSAwOworCisgICAgQkNKT3B0aW9ucyhpbnQgYWxpZ25tZW50KSB7CisgICAgICAgIHRoaXMuYWxpZ25tZW50ID0gYWxpZ25tZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHN0YXJ0IG9mZnNldCBmb3IgdGhlIGFkZHJlc3MgY29udmVyc2lvbnMuCisgICAgICogTm9ybWFsbHkgdGhpcyBpcyB1c2VsZXNzIHNvIHlvdSBzaG91bGRuJ3QgdXNlIHRoaXMgZnVuY3Rpb24uCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+MDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHN0YXJ0T2Zmc2V0KQorICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICgoc3RhcnRPZmZzZXQgJiAoYWxpZ25tZW50IC0gMSkpICE9IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiU3RhcnQgb2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAiICsgYWxpZ25tZW50KTsKKworICAgICAgICB0aGlzLnN0YXJ0T2Zmc2V0ID0gc3RhcnRPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc3RhcnQgb2Zmc2V0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBzdGFydE9mZnNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEVuY29kZXJNZW1vcnlVc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIFNpbXBsZU91dHB1dFN0cmVhbS5nZXRNZW1vcnlVc2FnZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RGVjb2Rlck1lbW9yeVVzYWdlKCkgeworICAgICAgICByZXR1cm4gU2ltcGxlSW5wdXRTdHJlYW0uZ2V0TWVtb3J5VXNhZ2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CisgICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovQmxvY2tJbnB1dFN0cmVhbS5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0Jsb2NrSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWU3MmFmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0Jsb2NrSW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIEJsb2NrSW5wdXRTdHJlYW0KKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouY29tbW9uLkRlY29kZXJVdGlsOworaW1wb3J0IG9yZy50dWthYW5pLnh6LmNoZWNrLkNoZWNrOworCitjbGFzcyBCbG9ja0lucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworICAgIHByaXZhdGUgZmluYWwgRGF0YUlucHV0U3RyZWFtIGluRGF0YTsKKyAgICBwcml2YXRlIGZpbmFsIENvdW50aW5nSW5wdXRTdHJlYW0gaW5Db3VudGVkOworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZmlsdGVyQ2hhaW47CisgICAgcHJpdmF0ZSBmaW5hbCBDaGVjayBjaGVjazsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdmVyaWZ5Q2hlY2s7CisKKyAgICBwcml2YXRlIGxvbmcgdW5jb21wcmVzc2VkU2l6ZUluSGVhZGVyID0gLTE7CisgICAgcHJpdmF0ZSBsb25nIGNvbXByZXNzZWRTaXplSW5IZWFkZXIgPSAtMTsKKyAgICBwcml2YXRlIGxvbmcgY29tcHJlc3NlZFNpemVMaW1pdDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBoZWFkZXJTaXplOworICAgIHByaXZhdGUgbG9uZyB1bmNvbXByZXNzZWRTaXplID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZW5kUmVhY2hlZCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gdGVtcEJ1ZiA9IG5ldyBieXRlWzFdOworCisgICAgcHVibGljIEJsb2NrSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgY2hlY2ssIGJvb2xlYW4gdmVyaWZ5Q2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lbW9yeUxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdW5wYWRkZWRTaXplSW5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHVuY29tcHJlc3NlZFNpemVJbkluZGV4KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbmRleEluZGljYXRvckV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuY2hlY2sgPSBjaGVjazsKKyAgICAgICAgdGhpcy52ZXJpZnlDaGVjayA9IHZlcmlmeUNoZWNrOworICAgICAgICBpbkRhdGEgPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluKTsKKworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbRGVjb2RlclV0aWwuQkxPQ0tfSEVBREVSX1NJWkVfTUFYXTsKKworICAgICAgICAvLyBCbG9jayBIZWFkZXIgU2l6ZSBvciBJbmRleCBJbmRpY2F0b3IKKyAgICAgICAgaW5EYXRhLnJlYWRGdWxseShidWYsIDAsIDEpOworCisgICAgICAgIC8vIFNlZSBpZiB0aGlzIGJlZ2lucyB0aGUgSW5kZXggZmllbGQuCisgICAgICAgIGlmIChidWZbMF0gPT0gMHgwMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleEluZGljYXRvckV4Y2VwdGlvbigpOworCisgICAgICAgIC8vIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIEJsb2NrIEhlYWRlci4KKyAgICAgICAgaGVhZGVyU2l6ZSA9IDQgKiAoKGJ1ZlswXSAmIDB4RkYpICsgMSk7CisgICAgICAgIGluRGF0YS5yZWFkRnVsbHkoYnVmLCAxLCBoZWFkZXJTaXplIC0gMSk7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIENSQzMyLgorICAgICAgICBpZiAoIURlY29kZXJVdGlsLmlzQ1JDMzJWYWxpZChidWYsIDAsIGhlYWRlclNpemUgLSA0LCBoZWFkZXJTaXplIC0gNCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oIlhaIEJsb2NrIEhlYWRlciBpcyBjb3JydXB0Iik7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHJlc2VydmVkIGJpdHMgaW4gQmxvY2sgRmxhZ3MuCisgICAgICAgIGlmICgoYnVmWzFdICYgMHgzQykgIT0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBvcHRpb25zIGluIFhaIEJsb2NrIEhlYWRlciIpOworCisgICAgICAgIC8vIE1lbW9yeSBmb3IgdGhlIEZpbHRlciBGbGFncyBmaWVsZAorICAgICAgICBpbnQgZmlsdGVyQ291bnQgPSAoYnVmWzFdICYgMHgwMykgKyAxOworICAgICAgICBsb25nW10gZmlsdGVySURzID0gbmV3IGxvbmdbZmlsdGVyQ291bnRdOworICAgICAgICBieXRlW11bXSBmaWx0ZXJQcm9wcyA9IG5ldyBieXRlW2ZpbHRlckNvdW50XVtdOworCisgICAgICAgIC8vIFVzZSBhIHN0cmVhbSB0byBwYXJzZSB0aGUgZmllbGRzIGFmdGVyIHRoZSBCbG9jayBGbGFncyBmaWVsZC4KKyAgICAgICAgLy8gRXhjbHVkZSB0aGUgQ1JDMzIgZmllbGQgYXQgdGhlIGVuZC4KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYnVmU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIGJ1ZiwgMiwgaGVhZGVyU2l6ZSAtIDYpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTZXQgdGhlIG1heGltdW0gdmFsaWQgY29tcHJlc3NlZCBzaXplLiBUaGlzIGlzIG92ZXJyaWRlbgorICAgICAgICAgICAgLy8gYnkgdGhlIHZhbHVlIGZyb20gdGhlIENvbXByZXNzZWQgU2l6ZSBmaWVsZCBpZiBpdCBpcyBwcmVzZW50LgorICAgICAgICAgICAgY29tcHJlc3NlZFNpemVMaW1pdCA9IChEZWNvZGVyVXRpbC5WTElfTUFYICYgfjMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBoZWFkZXJTaXplIC0gY2hlY2suZ2V0U2l6ZSgpOworCisgICAgICAgICAgICAvLyBEZWNvZGUgYW5kIHZhbGlkYXRlIENvbXByZXNzZWQgU2l6ZSBpZiB0aGUgcmVsZXZhbnQgZmxhZworICAgICAgICAgICAgLy8gaXMgc2V0IGluIEJsb2NrIEZsYWdzLgorICAgICAgICAgICAgaWYgKChidWZbMV0gJiAweDQwKSAhPSAweDAwKSB7CisgICAgICAgICAgICAgICAgY29tcHJlc3NlZFNpemVJbkhlYWRlciA9IERlY29kZXJVdGlsLmRlY29kZVZMSShidWZTdHJlYW0pOworCisgICAgICAgICAgICAgICAgaWYgKGNvbXByZXNzZWRTaXplSW5IZWFkZXIgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29tcHJlc3NlZFNpemVJbkhlYWRlciA+IGNvbXByZXNzZWRTaXplTGltaXQpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICAgICAgY29tcHJlc3NlZFNpemVMaW1pdCA9IGNvbXByZXNzZWRTaXplSW5IZWFkZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERlY29kZSBVbmNvbXByZXNzZWQgU2l6ZSBpZiB0aGUgcmVsZXZhbnQgZmxhZyBpcyBzZXQKKyAgICAgICAgICAgIC8vIGluIEJsb2NrIEZsYWdzLgorICAgICAgICAgICAgaWYgKChidWZbMV0gJiAweDgwKSAhPSAweDAwKQorICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZFNpemVJbkhlYWRlciA9IERlY29kZXJVdGlsLmRlY29kZVZMSShidWZTdHJlYW0pOworCisgICAgICAgICAgICAvLyBEZWNvZGUgRmlsdGVyIEZsYWdzLgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgZmlsdGVySURzW2ldID0gRGVjb2RlclV0aWwuZGVjb2RlVkxJKGJ1ZlN0cmVhbSk7CisKKyAgICAgICAgICAgICAgICBsb25nIGZpbHRlclByb3BzU2l6ZSA9IERlY29kZXJVdGlsLmRlY29kZVZMSShidWZTdHJlYW0pOworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJQcm9wc1NpemUgPiBidWZTdHJlYW0uYXZhaWxhYmxlKCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICAgICAgZmlsdGVyUHJvcHNbaV0gPSBuZXcgYnl0ZVsoaW50KWZpbHRlclByb3BzU2l6ZV07CisgICAgICAgICAgICAgICAgYnVmU3RyZWFtLnJlYWQoZmlsdGVyUHJvcHNbaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigiWFogQmxvY2sgSGVhZGVyIGlzIGNvcnJ1cHQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHJlbWFpbmluZyBieXRlcyBhcmUgemVyby4KKyAgICAgICAgZm9yIChpbnQgaSA9IGJ1ZlN0cmVhbS5hdmFpbGFibGUoKTsgaSA+IDA7IC0taSkKKyAgICAgICAgICAgIGlmIChidWZTdHJlYW0ucmVhZCgpICE9IDB4MDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBvcHRpb25zIGluIFhaIEJsb2NrIEhlYWRlciIpOworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBCbGNvayBIZWFkZXIgYWdhaW5zdCB0aGUgSW5kZXggd2hlbiBkb2luZworICAgICAgICAvLyByYW5kb20gYWNjZXNzIHJlYWRpbmcuCisgICAgICAgIGlmICh1bnBhZGRlZFNpemVJbkluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICAvLyBDb21wcmVzc2VkIERhdGEgbXVzdCBiZSBhdCBsZWFzdCBvbmUgYnl0ZSwgc28gaWYgQmxvY2sgSGVhZGVyCisgICAgICAgICAgICAvLyBhbmQgQ2hlY2sgYWxvbmUgdGFrZSBhcyBtdWNoIG9yIG1vcmUgc3BhY2UgdGhhbiB0aGUgc2l6ZQorICAgICAgICAgICAgLy8gc3RvcmVkIGluIHRoZSBJbmRleCwgdGhlIGZpbGUgaXMgY29ycnVwdC4KKyAgICAgICAgICAgIGludCBoZWFkZXJBbmRDaGVja1NpemUgPSBoZWFkZXJTaXplICsgY2hlY2suZ2V0U2l6ZSgpOworICAgICAgICAgICAgaWYgKGhlYWRlckFuZENoZWNrU2l6ZSA+PSB1bnBhZGRlZFNpemVJbkluZGV4KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJYWiBJbmRleCBkb2VzIG5vdCBtYXRjaCBhIEJsb2NrIEhlYWRlciIpOworCisgICAgICAgICAgICAvLyBUaGUgY29tcHJlc3NlZCBzaXplIGNhbGN1bGF0ZWQgZnJvbSBVbnBhZGRlZCBTaXplIG11c3QKKyAgICAgICAgICAgIC8vIG1hdGNoIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIENvbXByZXNzZWQgU2l6ZSBmaWVsZCBpbgorICAgICAgICAgICAgLy8gdGhlIEJsb2NrIEhlYWRlci4KKyAgICAgICAgICAgIGxvbmcgY29tcHJlc3NlZFNpemVGcm9tSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgPSB1bnBhZGRlZFNpemVJbkluZGV4IC0gaGVhZGVyQW5kQ2hlY2tTaXplOworICAgICAgICAgICAgaWYgKGNvbXByZXNzZWRTaXplRnJvbUluZGV4ID4gY29tcHJlc3NlZFNpemVMaW1pdAorICAgICAgICAgICAgICAgICAgICB8fCAoY29tcHJlc3NlZFNpemVJbkhlYWRlciAhPSAtMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29tcHJlc3NlZFNpemVJbkhlYWRlciAhPSBjb21wcmVzc2VkU2l6ZUZyb21JbmRleCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlhaIEluZGV4IGRvZXMgbm90IG1hdGNoIGEgQmxvY2sgSGVhZGVyIik7CisKKyAgICAgICAgICAgIC8vIFRoZSB1bmNvbXByZXNzZWQgc2l6ZSBzdG9yZWQgaW4gdGhlIEluZGV4IG11c3QgbWF0Y2gKKyAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIFVuY29tcHJlc3NlZCBTaXplIGZpZWxkIGluCisgICAgICAgICAgICAvLyB0aGUgQmxvY2sgSGVhZGVyLgorICAgICAgICAgICAgaWYgKHVuY29tcHJlc3NlZFNpemVJbkhlYWRlciAhPSAtMQorICAgICAgICAgICAgICAgICAgICAmJiB1bmNvbXByZXNzZWRTaXplSW5IZWFkZXIgIT0gdW5jb21wcmVzc2VkU2l6ZUluSW5kZXgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlhaIEluZGV4IGRvZXMgbm90IG1hdGNoIGEgQmxvY2sgSGVhZGVyIik7CisKKyAgICAgICAgICAgIC8vIEZvciBmdXJ0aGVyIHZhbGlkYXRpb24sIHByZXRlbmQgdGhhdCB0aGUgdmFsdWVzIGZyb20gdGhlIEluZGV4CisgICAgICAgICAgICAvLyB3ZXJlIHN0b3JlZCBpbiB0aGUgQmxvY2sgSGVhZGVyLgorICAgICAgICAgICAgY29tcHJlc3NlZFNpemVMaW1pdCA9IGNvbXByZXNzZWRTaXplRnJvbUluZGV4OworICAgICAgICAgICAgY29tcHJlc3NlZFNpemVJbkhlYWRlciA9IGNvbXByZXNzZWRTaXplRnJvbUluZGV4OworICAgICAgICAgICAgdW5jb21wcmVzc2VkU2l6ZUluSGVhZGVyID0gdW5jb21wcmVzc2VkU2l6ZUluSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgRmlsdGVyIElEcyBhcmUgc3VwcG9ydGVkLCBkZWNvZGUKKyAgICAgICAgLy8gdGhlIEZpbHRlciBQcm9wZXJ0aWVzLCBhbmQgY2hlY2sgdGhhdCB0aGV5IGFyZQorICAgICAgICAvLyBzdXBwb3J0ZWQgYnkgdGhpcyBkZWNvZGVyIGltcGxlbWVudGF0aW9uLgorICAgICAgICBGaWx0ZXJEZWNvZGVyW10gZmlsdGVycyA9IG5ldyBGaWx0ZXJEZWNvZGVyW2ZpbHRlcklEcy5sZW5ndGhdOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKGZpbHRlcklEc1tpXSA9PSBMWk1BMkNvZGVyLkZJTFRFUl9JRCkKKyAgICAgICAgICAgICAgICBmaWx0ZXJzW2ldID0gbmV3IExaTUEyRGVjb2RlcihmaWx0ZXJQcm9wc1tpXSk7CisKKyAgICAgICAgICAgIGVsc2UgaWYgKGZpbHRlcklEc1tpXSA9PSBEZWx0YUNvZGVyLkZJTFRFUl9JRCkKKyAgICAgICAgICAgICAgICBmaWx0ZXJzW2ldID0gbmV3IERlbHRhRGVjb2RlcihmaWx0ZXJQcm9wc1tpXSk7CisKKyAgICAgICAgICAgIGVsc2UgaWYgKEJDSkRlY29kZXIuaXNCQ0pGaWx0ZXJJRChmaWx0ZXJJRHNbaV0pKQorICAgICAgICAgICAgICAgIGZpbHRlcnNbaV0gPSBuZXcgQkNKRGVjb2RlcihmaWx0ZXJJRHNbaV0sIGZpbHRlclByb3BzW2ldKTsKKworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBGaWx0ZXIgSUQgIiArIGZpbHRlcklEc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICBSYXdDb2Rlci52YWxpZGF0ZShmaWx0ZXJzKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgbWVtb3J5IHVzYWdlIGxpbWl0LgorICAgICAgICBpZiAobWVtb3J5TGltaXQgPj0gMCkgeworICAgICAgICAgICAgaW50IG1lbW9yeU5lZWRlZCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgbWVtb3J5TmVlZGVkICs9IGZpbHRlcnNbaV0uZ2V0TWVtb3J5VXNhZ2UoKTsKKworICAgICAgICAgICAgaWYgKG1lbW9yeU5lZWRlZCA+IG1lbW9yeUxpbWl0KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZW1vcnlMaW1pdEV4Y2VwdGlvbihtZW1vcnlOZWVkZWQsIG1lbW9yeUxpbWl0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVzZSBhbiBpbnB1dCBzaXplIGNvdW50ZXIgdG8gY2FsY3VsYXRlCisgICAgICAgIC8vIHRoZSBzaXplIG9mIHRoZSBDb21wcmVzc2VkIERhdGEgZmllbGQuCisgICAgICAgIGluQ291bnRlZCA9IG5ldyBDb3VudGluZ0lucHV0U3RyZWFtKGluKTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBmaWx0ZXIgY2hhaW4uCisgICAgICAgIGZpbHRlckNoYWluID0gaW5Db3VudGVkOworICAgICAgICBmb3IgKGludCBpID0gZmlsdGVycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkKKyAgICAgICAgICAgIGZpbHRlckNoYWluID0gZmlsdGVyc1tpXS5nZXRJbnB1dFN0cmVhbShmaWx0ZXJDaGFpbik7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWQodGVtcEJ1ZiwgMCwgMSkgPT0gLTEgPyAtMSA6ICh0ZW1wQnVmWzBdICYgMHhGRik7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChlbmRSZWFjaGVkKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGludCByZXQgPSBmaWx0ZXJDaGFpbi5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworCisgICAgICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICBpZiAodmVyaWZ5Q2hlY2spCisgICAgICAgICAgICAgICAgY2hlY2sudXBkYXRlKGJ1Ziwgb2ZmLCByZXQpOworCisgICAgICAgICAgICB1bmNvbXByZXNzZWRTaXplICs9IHJldDsKKworICAgICAgICAgICAgLy8gQ2F0Y2ggaW52YWxpZCB2YWx1ZXMuCisgICAgICAgICAgICBsb25nIGNvbXByZXNzZWRTaXplID0gaW5Db3VudGVkLmdldFNpemUoKTsKKyAgICAgICAgICAgIGlmIChjb21wcmVzc2VkU2l6ZSA8IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgY29tcHJlc3NlZFNpemUgPiBjb21wcmVzc2VkU2l6ZUxpbWl0CisgICAgICAgICAgICAgICAgICAgIHx8IHVuY29tcHJlc3NlZFNpemUgPCAwCisgICAgICAgICAgICAgICAgICAgIHx8ICh1bmNvbXByZXNzZWRTaXplSW5IZWFkZXIgIT0gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHVuY29tcHJlc3NlZFNpemUgPiB1bmNvbXByZXNzZWRTaXplSW5IZWFkZXIpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICAvLyBDaGVjayB0aGUgQmxvY2sgaW50ZWdyaXR5IGFzIHNvb24gYXMgcG9zc2libGU6CisgICAgICAgICAgICAvLyAgIC0gVGhlIGZpbHRlciBjaGFpbiBzaG91bGRuJ3QgcmV0dXJuIGxlc3MgdGhhbiByZXF1ZXN0ZWQKKyAgICAgICAgICAgIC8vICAgICB1bmxlc3MgaXQgaGl0IHRoZSBlbmQgb2YgdGhlIGlucHV0LgorICAgICAgICAgICAgLy8gICAtIElmIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSBpcyBrbm93biwgd2Uga25vdyB3aGVuIHRoZXJlCisgICAgICAgICAgICAvLyAgICAgc2hvdWxkbid0IGJlIG1vcmUgZGF0YSBjb21pbmcuIFdlIHN0aWxsIG5lZWQgdG8gcmVhZAorICAgICAgICAgICAgLy8gICAgIG9uZSBieXRlIHRvIGxldCB0aGUgZmlsdGVyIGNoYWluIGNhdGNoIGVycm9ycyBhbmQgdG8KKyAgICAgICAgICAgIC8vICAgICBsZXQgaXQgcmVhZCBlbmQgb2YgcGF5bG9hZCBtYXJrZXIocykuCisgICAgICAgICAgICBpZiAocmV0IDwgbGVuIHx8IHVuY29tcHJlc3NlZFNpemUgPT0gdW5jb21wcmVzc2VkU2l6ZUluSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbHRlckNoYWluLnJlYWQoKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIGVuZFJlYWNoZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSAtMSkgeworICAgICAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgICAgIGVuZFJlYWNoZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsb25nIGNvbXByZXNzZWRTaXplID0gaW5Db3VudGVkLmdldFNpemUoKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSBDb21wcmVzc2VkIFNpemUgYW5kIFVuY29tcHJlc3NlZCBTaXplIGlmIHRoZXkgd2VyZQorICAgICAgICAvLyBwcmVzZW50IGluIEJsb2NrIEhlYWRlci4KKyAgICAgICAgaWYgKChjb21wcmVzc2VkU2l6ZUluSGVhZGVyICE9IC0xCisgICAgICAgICAgICAgICAgICAgICYmIGNvbXByZXNzZWRTaXplSW5IZWFkZXIgIT0gY29tcHJlc3NlZFNpemUpCisgICAgICAgICAgICAgICAgfHwgKHVuY29tcHJlc3NlZFNpemVJbkhlYWRlciAhPSAtMQorICAgICAgICAgICAgICAgICAgICAmJiB1bmNvbXByZXNzZWRTaXplSW5IZWFkZXIgIT0gdW5jb21wcmVzc2VkU2l6ZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oKTsKKworICAgICAgICAvLyBCbG9jayBQYWRkaW5nIGJ5dGVzIG11c3QgYmUgemVyb3MuCisgICAgICAgIHdoaWxlICgoY29tcHJlc3NlZFNpemUrKyAmIDMpICE9IDApCisgICAgICAgICAgICBpZiAoaW5EYXRhLnJlYWRVbnNpZ25lZEJ5dGUoKSAhPSAweDAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigpOworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBpbnRlZ3JpdHkgY2hlY2sgaWYgdmVyaWZ5Q2hlY2sgaXMgdHJ1ZS4KKyAgICAgICAgYnl0ZVtdIHN0b3JlZENoZWNrID0gbmV3IGJ5dGVbY2hlY2suZ2V0U2l6ZSgpXTsKKyAgICAgICAgaW5EYXRhLnJlYWRGdWxseShzdG9yZWRDaGVjayk7CisgICAgICAgIGlmICh2ZXJpZnlDaGVjayAmJiAhQXJyYXlzLmVxdWFscyhjaGVjay5maW5pc2goKSwgc3RvcmVkQ2hlY2spKQorICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCJJbnRlZ3JpdHkgY2hlY2sgKCIKKyAgICAgICAgICAgICAgICAgICAgKyBjaGVjay5nZXROYW1lKCkgKyAiKSBkb2VzIG5vdCBtYXRjaCIpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlckNoYWluLmF2YWlsYWJsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFVucGFkZGVkU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGhlYWRlclNpemUgKyBpbkNvdW50ZWQuZ2V0U2l6ZSgpICsgY2hlY2suZ2V0U2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFVuY29tcHJlc3NlZFNpemUoKSB7CisgICAgICAgIHJldHVybiB1bmNvbXByZXNzZWRTaXplOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9CbG9ja091dHB1dFN0cmVhbS5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0Jsb2NrT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNmZDBhOQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9CbG9ja091dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQmxvY2tPdXRwdXRTdHJlYW0KKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLnR1a2FhbmkueHouY29tbW9uLkVuY29kZXJVdGlsOworaW1wb3J0IG9yZy50dWthYW5pLnh6LmNoZWNrLkNoZWNrOworCitjbGFzcyBCbG9ja091dHB1dFN0cmVhbSBleHRlbmRzIEZpbmlzaGFibGVPdXRwdXRTdHJlYW0geworICAgIHByaXZhdGUgZmluYWwgT3V0cHV0U3RyZWFtIG91dDsKKyAgICBwcml2YXRlIGZpbmFsIENvdW50aW5nT3V0cHV0U3RyZWFtIG91dENvdW50ZWQ7CisgICAgcHJpdmF0ZSBGaW5pc2hhYmxlT3V0cHV0U3RyZWFtIGZpbHRlckNoYWluOworICAgIHByaXZhdGUgZmluYWwgQ2hlY2sgY2hlY2s7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBoZWFkZXJTaXplOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBjb21wcmVzc2VkU2l6ZUxpbWl0OworICAgIHByaXZhdGUgbG9uZyB1bmNvbXByZXNzZWRTaXplID0gMDsKKworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHRlbXBCdWYgPSBuZXcgYnl0ZVsxXTsKKworICAgIHB1YmxpYyBCbG9ja091dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0LCBGaWx0ZXJFbmNvZGVyW10gZmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgY2hlY2spIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgICAgICB0aGlzLmNoZWNrID0gY2hlY2s7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZmlsdGVyIGNoYWluLgorICAgICAgICBvdXRDb3VudGVkID0gbmV3IENvdW50aW5nT3V0cHV0U3RyZWFtKG91dCk7CisgICAgICAgIGZpbHRlckNoYWluID0gb3V0Q291bnRlZDsKKyAgICAgICAgZm9yIChpbnQgaSA9IGZpbHRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpCisgICAgICAgICAgICBmaWx0ZXJDaGFpbiA9IGZpbHRlcnNbaV0uZ2V0T3V0cHV0U3RyZWFtKGZpbHRlckNoYWluKTsKKworICAgICAgICAvLyBQcmVwYXJlIHRvIGVuY29kZSB0aGUgQmxvY2sgSGVhZGVyIGZpZWxkLgorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmU3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgICAgIC8vIFdyaXRlIGEgZHVtbXkgQmxvY2sgSGVhZGVyIFNpemUgZmllbGQuIFRoZSByZWFsIHZhbHVlIGlzIHdyaXR0ZW4KKyAgICAgICAgLy8gb25jZSBldmVyeXRoaW5nIGVsc2UgZXhjZXB0IENSQzMyIGhhcyBiZWVuIHdyaXR0ZW4uCisgICAgICAgIGJ1ZlN0cmVhbS53cml0ZSgweDAwKTsKKworICAgICAgICAvLyBXcml0ZSBCbG9jayBGbGFncy4gU3RvcmluZyBDb21wcmVzc2VkIFNpemUgb3IgVW5jb21wcmVzc2VkIFNpemUKKyAgICAgICAgLy8gaXNuJ3Qgc3VwcG9ydGVkIGZvciBub3cuCisgICAgICAgIGJ1ZlN0cmVhbS53cml0ZShmaWx0ZXJzLmxlbmd0aCAtIDEpOworCisgICAgICAgIC8vIExpc3Qgb2YgRmlsdGVyIEZsYWdzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgRW5jb2RlclV0aWwuZW5jb2RlVkxJKGJ1ZlN0cmVhbSwgZmlsdGVyc1tpXS5nZXRGaWx0ZXJJRCgpKTsKKyAgICAgICAgICAgIGJ5dGVbXSBmaWx0ZXJQcm9wcyA9IGZpbHRlcnNbaV0uZ2V0RmlsdGVyUHJvcHMoKTsKKyAgICAgICAgICAgIEVuY29kZXJVdGlsLmVuY29kZVZMSShidWZTdHJlYW0sIGZpbHRlclByb3BzLmxlbmd0aCk7CisgICAgICAgICAgICBidWZTdHJlYW0ud3JpdGUoZmlsdGVyUHJvcHMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSGVhZGVyIFBhZGRpbmcKKyAgICAgICAgd2hpbGUgKChidWZTdHJlYW0uc2l6ZSgpICYgMykgIT0gMCkKKyAgICAgICAgICAgIGJ1ZlN0cmVhbS53cml0ZSgweDAwKTsKKworICAgICAgICBieXRlW10gYnVmID0gYnVmU3RyZWFtLnRvQnl0ZUFycmF5KCk7CisKKyAgICAgICAgLy8gVG90YWwgc2l6ZSBvZiB0aGUgQmxvY2sgSGVhZGVyOiBUYWtlIHRoZSBzaXplIG9mIHRoZSBDUkMzMiBmaWVsZAorICAgICAgICAvLyBpbnRvIGFjY291bnQuCisgICAgICAgIGhlYWRlclNpemUgPSBidWYubGVuZ3RoICsgNDsKKworICAgICAgICAvLyBUaGlzIGlzIGp1c3QgYSBzYW5pdHkgY2hlY2suCisgICAgICAgIGlmIChoZWFkZXJTaXplID4gRW5jb2RlclV0aWwuQkxPQ0tfSEVBREVSX1NJWkVfTUFYKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbigpOworCisgICAgICAgIC8vIEJsb2NrIEhlYWRlciBTaXplCisgICAgICAgIGJ1ZlswXSA9IChieXRlKShidWYubGVuZ3RoIC8gNCk7CisKKyAgICAgICAgLy8gV3JpdGUgdGhlIEJsb2NrIEhlYWRlciBmaWVsZCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgICAgb3V0LndyaXRlKGJ1Zik7CisgICAgICAgIEVuY29kZXJVdGlsLndyaXRlQ1JDMzIob3V0LCBidWYpOworCisgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBhbGxvd2VkIHNpemUgb2YgdGhlIENvbXByZXNzZWQgRGF0YSBmaWVsZC4KKyAgICAgICAgLy8gSXQgaXMgaGFyZCB0byBleGNlZWQgaXQgc28gdGhpcyBpcyBtb3N0bHkgdG8gYmUgcGVkYW50aWMuCisgICAgICAgIGNvbXByZXNzZWRTaXplTGltaXQgPSAoRW5jb2RlclV0aWwuVkxJX01BWCAmIH4zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBoZWFkZXJTaXplIC0gY2hlY2suZ2V0U2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZW1wQnVmWzBdID0gKGJ5dGUpYjsKKyAgICAgICAgd3JpdGUodGVtcEJ1ZiwgMCwgMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmlsdGVyQ2hhaW4ud3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIGNoZWNrLnVwZGF0ZShidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgdW5jb21wcmVzc2VkU2l6ZSArPSBsZW47CisgICAgICAgIHZhbGlkYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaWx0ZXJDaGFpbi5mbHVzaCgpOworICAgICAgICB2YWxpZGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEZpbmlzaCB0aGUgQ29tcHJlc3NlZCBEYXRhIGZpZWxkLgorICAgICAgICBmaWx0ZXJDaGFpbi5maW5pc2goKTsKKyAgICAgICAgdmFsaWRhdGUoKTsKKworICAgICAgICAvLyBCbG9jayBQYWRkaW5nCisgICAgICAgIGZvciAobG9uZyBpID0gb3V0Q291bnRlZC5nZXRTaXplKCk7IChpICYgMykgIT0gMDsgKytpKQorICAgICAgICAgICAgb3V0LndyaXRlKDB4MDApOworCisgICAgICAgIC8vIENoZWNrCisgICAgICAgIG91dC53cml0ZShjaGVjay5maW5pc2goKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBjb21wcmVzc2VkU2l6ZSA9IG91dENvdW50ZWQuZ2V0U2l6ZSgpOworCisgICAgICAgIC8vIEl0IGlzIHZlcnkgaGFyZCB0byB0cmlnZ2VyIHRoaXMgZXhjZXB0aW9uLgorICAgICAgICAvLyBUaGlzIGlzIGp1c3QgdG8gYmUgcGVkYW50aWMuCisgICAgICAgIGlmIChjb21wcmVzc2VkU2l6ZSA8IDAgfHwgY29tcHJlc3NlZFNpemUgPiBjb21wcmVzc2VkU2l6ZUxpbWl0CisgICAgICAgICAgICAgICAgfHwgdW5jb21wcmVzc2VkU2l6ZSA8IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgWFpJT0V4Y2VwdGlvbigiWFogU3RyZWFtIGhhcyBncm93biB0b28gYmlnIik7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0VW5wYWRkZWRTaXplKCkgeworICAgICAgICByZXR1cm4gaGVhZGVyU2l6ZSArIG91dENvdW50ZWQuZ2V0U2l6ZSgpICsgY2hlY2suZ2V0U2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFVuY29tcHJlc3NlZFNpemUoKSB7CisgICAgICAgIHJldHVybiB1bmNvbXByZXNzZWRTaXplOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9Db3JydXB0ZWRJbnB1dEV4Y2VwdGlvbi5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0NvcnJ1cHRlZElucHV0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkOTUyMAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9Db3JydXB0ZWRJbnB1dEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCisvKioKKyAqIFRocm93biB3aGVuIHRoZSBjb21wcmVzc2VkIGlucHV0IGRhdGEgaXMgY29ycnVwdC4KKyAqIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZSBvciBhbGwgb2YgdGhlIGRhdGEKKyAqIGFscmVhZHkgcmVhZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gd2FzIGNvcnJ1cHQgdG9vLgorICovCitwdWJsaWMgY2xhc3MgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24gZXh0ZW5kcyBYWklPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzTDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24gd2l0aAorICAgICAqIHRoZSBkZWZhdWx0IGVycm9yIGRldGFpbCBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoIkNvbXByZXNzZWQgZGF0YSBpcyBjb3JydXB0Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbiB3aXRoCisgICAgICogdGhlIHNwZWNpZmllZCBlcnJvciBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBzICAgICAgICAgICBlcnJvciBkZXRhaWwgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbihTdHJpbmcgcykgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovQ291bnRpbmdJbnB1dFN0cmVhbS5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0NvdW50aW5nSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTA5MzVhCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0NvdW50aW5nSW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ291bnRpbmdJbnB1dFN0cmVhbQorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQ291bnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIGFuIGlucHV0IHN0cmVhbS4KKyAqLworY2xhc3MgQ291bnRpbmdJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKKyAgICBwcml2YXRlIGxvbmcgc2l6ZSA9IDA7CisKKyAgICBwdWJsaWMgQ291bnRpbmdJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHJldCA9IGluLnJlYWQoKTsKKyAgICAgICAgaWYgKHJldCAhPSAtMSAmJiBzaXplID49IDApCisgICAgICAgICAgICArK3NpemU7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCByZXQgPSBpbi5yZWFkKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgaWYgKHJldCA+IDAgJiYgc2l6ZSA+PSAwKQorICAgICAgICAgICAgc2l6ZSArPSByZXQ7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovQ291bnRpbmdPdXRwdXRTdHJlYW0uamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9Db3VudGluZ091dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliM2VlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovQ291bnRpbmdPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ291bnRpbmdPdXRwdXRTdHJlYW0KKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQ291bnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBhbiBvdXRwdXQgc3RyZWFtLgorICogPHA+CisgKiBUaGUgPGNvZGU+ZmluaXNoPC9jb2RlPiBtZXRob2QgZG9lcyBub3RoaW5nLgorICogVGhpcyBpcyA8Y29kZT5GaW5pc2hhYmxlT3V0cHV0U3RyZWFtPC9jb2RlPiBpbnN0ZWFkCisgKiBvZiA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+IHNvbGVseSBiZWNhdXNlIGl0IGFsbG93cworICogdXNpbmcgdGhpcyBhcyB0aGUgb3V0cHV0IHN0cmVhbSBmb3IgYSBjaGFpbiBvZiByYXcgZmlsdGVycy4KKyAqLworY2xhc3MgQ291bnRpbmdPdXRwdXRTdHJlYW0gZXh0ZW5kcyBGaW5pc2hhYmxlT3V0cHV0U3RyZWFtIHsKKyAgICBwcml2YXRlIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQ7CisgICAgcHJpdmF0ZSBsb25nIHNpemUgPSAwOworCisgICAgcHVibGljIENvdW50aW5nT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZShiKTsKKyAgICAgICAgaWYgKHNpemUgPj0gMCkKKyAgICAgICAgICAgICsrc2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgaWYgKHNpemUgPj0gMCkKKyAgICAgICAgICAgIHNpemUgKz0gbGVuOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovRGVsdGFDb2Rlci5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0RlbHRhQ29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDg4MzRjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0RlbHRhQ29kZXIuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKgorICogRGVsdGFDb2RlcgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCithYnN0cmFjdCBjbGFzcyBEZWx0YUNvZGVyIGltcGxlbWVudHMgRmlsdGVyQ29kZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBGSUxURVJfSUQgPSAweDAzOworCisgICAgcHVibGljIGJvb2xlYW4gY2hhbmdlc1NpemUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBub25MYXN0T0soKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGxhc3RPSygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9EZWx0YURlY29kZXIuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9EZWx0YURlY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDVkMTc4Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0RlbHRhRGVjb2Rlci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBEZWx0YURlY29kZXIKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2NsYXNzIERlbHRhRGVjb2RlciBleHRlbmRzIERlbHRhQ29kZXIgaW1wbGVtZW50cyBGaWx0ZXJEZWNvZGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIGludCBkaXN0YW5jZTsKKworICAgIERlbHRhRGVjb2RlcihieXRlW10gcHJvcHMpIHRocm93cyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24geworICAgICAgICBpZiAocHJvcHMubGVuZ3RoICE9IDEpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgRGVsdGEgZmlsdGVyIHByb3BlcnRpZXMiKTsKKworICAgICAgICBkaXN0YW5jZSA9IChwcm9wc1swXSAmIDB4RkYpICsgMTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1lbW9yeVVzYWdlKCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEZWx0YUlucHV0U3RyZWFtKGluLCBkaXN0YW5jZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0RlbHRhRW5jb2Rlci5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0RlbHRhRW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NGFmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovRGVsdGFFbmNvZGVyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIERlbHRhRW5jb2RlcgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitjbGFzcyBEZWx0YUVuY29kZXIgZXh0ZW5kcyBEZWx0YUNvZGVyIGltcGxlbWVudHMgRmlsdGVyRW5jb2RlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBEZWx0YU9wdGlvbnMgb3B0aW9uczsKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBwcm9wcyA9IG5ldyBieXRlWzFdOworCisgICAgRGVsdGFFbmNvZGVyKERlbHRhT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgIHByb3BzWzBdID0gKGJ5dGUpKG9wdGlvbnMuZ2V0RGlzdGFuY2UoKSAtIDEpOworICAgICAgICB0aGlzLm9wdGlvbnMgPSAoRGVsdGFPcHRpb25zKW9wdGlvbnMuY2xvbmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRGaWx0ZXJJRCgpIHsKKyAgICAgICAgcmV0dXJuIEZJTFRFUl9JRDsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEZpbHRlclByb3BzKCkgeworICAgICAgICByZXR1cm4gcHJvcHM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNGbHVzaGluZygpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIHJldHVybiBvcHRpb25zLmdldE91dHB1dFN0cmVhbShvdXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9EZWx0YUlucHV0U3RyZWFtLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovRGVsdGFJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NDc4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovRGVsdGFJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogRGVsdGFJbnB1dFN0cmVhbQorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy50dWthYW5pLnh6LmRlbHRhLkRlbHRhRGVjb2RlcjsKKworLyoqCisgKiBEZWNvZGVzIHJhdyBEZWx0YS1maWx0ZXJlZCBkYXRhIChubyBYWiBoZWFkZXJzKS4KKyAqIDxwPgorICogVGhlIGRlbHRhIGZpbHRlciBkb2Vzbid0IGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBhbmQgdGh1cyBpdAorICogY2Fubm90IGhhdmUgYW4gZW5kLW9mLXBheWxvYWQgbWFya2VyLiBJdCB3aWxsIHNpbXBseSBkZWNvZGUgdW50aWwKKyAqIGl0cyBpbnB1dCBzdHJlYW0gaW5kaWNhdGVzIGVuZCBvZiBpbnB1dC4KKyAqLworcHVibGljIGNsYXNzIERlbHRhSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisgICAgLyoqCisgICAgICogU21hbGxlc3Qgc3VwcG9ydGVkIGRlbHRhIGNhbGN1bGF0aW9uIGRpc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1RBTkNFX01JTiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBMYXJnZXN0IHN1cHBvcnRlZCBkZWx0YSBjYWxjdWxhdGlvbiBkaXN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNUQU5DRV9NQVggPSAyNTY7CisKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGluOworICAgIHByaXZhdGUgZmluYWwgRGVsdGFEZWNvZGVyIGRlbHRhOworCisgICAgcHJpdmF0ZSBJT0V4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworCisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gdGVtcEJ1ZiA9IG5ldyBieXRlWzFdOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBEZWx0YSBkZWNvZGVyIHdpdGggdGhlIGdpdmVuIGRlbHRhIGNhbGN1bGF0aW9uIGRpc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGluICAgICAgICAgIGlucHV0IHN0cmVhbSBmcm9tIHdoaWNoIERlbHRhIGZpbHRlcmVkIGRhdGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmVhZAorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGRpc3RhbmNlICAgIGRlbHRhIGNhbGN1bGF0aW9uIGRpc3RhbmNlLCBtdXN0IGJlIGluIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSBbPGNvZGU+RElTVEFOQ0VfTUlOPC9jb2RlPiwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+RElTVEFOQ0VfTUFYPC9jb2RlPl0KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsdGFJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgaW50IGRpc3RhbmNlKSB7CisgICAgICAgIC8vIENoZWNrIGZvciBudWxsIGJlY2F1c2Ugb3RoZXJ3aXNlIG51bGwgaXNuJ3QgZGV0ZWN0CisgICAgICAgIC8vIGluIHRoaXMgY29uc3RydWN0b3IuCisgICAgICAgIGlmIChpbiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisKKyAgICAgICAgdGhpcy5pbiA9IGluOworICAgICAgICB0aGlzLmRlbHRhID0gbmV3IERlbHRhRGVjb2RlcihkaXN0YW5jZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlIHRoZSBuZXh0IGJ5dGUgZnJvbSB0aGlzIGlucHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBkZWNvZGVkIGJ5dGUsIG9yIDxjb2RlPi0xPC9jb2RlPiB0byBpbmRpY2F0ZQorICAgICAqICAgICAgICAgICAgICB0aGUgZW5kIG9mIGlucHV0IG9uIHRoZSBpbnB1dCBzdHJlYW0gPGNvZGU+aW48L2NvZGU+CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBieSA8Y29kZT5pbjwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZCh0ZW1wQnVmLCAwLCAxKSA9PSAtMSA/IC0xIDogKHRlbXBCdWZbMF0gJiAweEZGKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGUgaW50byBhbiBhcnJheSBvZiBieXRlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGNhbGxzIDxjb2RlPmluLnJlYWQoYnVmLCBvZmYsIGxlbik8L2NvZGU+IGFuZCBkZWZpbHRlcnMgdGhlCisgICAgICogcmV0dXJuZWQgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBidWYgICAgICAgICB0YXJnZXQgYnVmZmVyIGZvciBkZWNvZGVkIGRhdGEKKyAgICAgKiBAcGFyYW0gICAgICAgb2ZmICAgICAgICAgc3RhcnQgb2Zmc2V0IGluIDxjb2RlPmJ1ZjwvY29kZT4KKyAgICAgKiBAcGFyYW0gICAgICAgbGVuICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICAgICAqCisgICAgICogQHJldHVybiAgICAgIG51bWJlciBvZiBieXRlcyByZWFkLCBvciA8Y29kZT4tMTwvY29kZT4gdG8gaW5kaWNhdGUKKyAgICAgKiAgICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyZWFtIDxjb2RlPmluPC9jb2RlPgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFhaSU9FeGNlcHRpb24gaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IHVuZGVybGF5aW5nIGlucHV0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8Y29kZT5pbjwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKGluID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgWFpJT0V4Y2VwdGlvbigiU3RyZWFtIGNsb3NlZCIpOworCisgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNpemUgPSBpbi5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGRlbHRhLmRlY29kZShidWYsIG9mZiwgc2l6ZSk7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIDxjb2RlPmluLmF2YWlsYWJsZSgpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgICB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPGNvZGU+aW4uYXZhaWxhYmxlKCk8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYWklPRXhjZXB0aW9uKCJTdHJlYW0gY2xvc2VkIik7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworCisgICAgICAgIHJldHVybiBpbi5hdmFpbGFibGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHN0cmVhbSBhbmQgY2FsbHMgPGNvZGU+aW4uY2xvc2UoKTwvY29kZT4uCisgICAgICogSWYgdGhlIHN0cmVhbSB3YXMgYWxyZWFkeSBjbG9zZWQsIHRoaXMgZG9lcyBub3RoaW5nLgorICAgICAqCisgICAgICogQHRocm93cyAgSU9FeGNlcHRpb24gaWYgdGhyb3duIGJ5IDxjb2RlPmluLmNsb3NlKCk8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovRGVsdGFPcHRpb25zLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovRGVsdGFPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1MTMwYgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9EZWx0YU9wdGlvbnMuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIERlbHRhT3B0aW9ucworICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBEZWx0YSBmaWx0ZXIgb3B0aW9ucy4gVGhlIERlbHRhIGZpbHRlciBjYW4gYmUgdXNlZCBvbmx5IGFzIGEgbm9uLWxhc3QKKyAqIGZpbHRlciBpbiB0aGUgY2hhaW4sIGZvciBleGFtcGxlIERlbHRhICsgTFpNQTIuCisgKiA8cD4KKyAqIEN1cnJlbnRseSBvbmx5IHNpbXBsZSBieXRlLXdpc2UgZGVsdGEgaXMgc3VwcG9ydGVkLiBUaGUgb25seSBvcHRpb24KKyAqIGlzIHRoZSBkZWx0YSBkaXN0YW5jZSwgd2hpY2ggeW91IHNob3VsZCBzZXQgdG8gbWF0Y2ggeW91ciBkYXRhLgorICogSXQncyBub3QgcG9zc2libGUgdG8gcHJvdmlkZSBhIGdlbmVyaWMgZGVmYXVsdCB2YWx1ZSBmb3IgaXQuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlLCB3aXRoIGRpc3RhbmNlID0gMiBhbmQgZWlnaHQtYnl0ZSBpbnB1dAorICogQTEgQjEgQTIgQjMgQTMgQjUgQTQgQjcsIHRoZSBvdXRwdXQgd2lsbCBiZSBBMSBCMSAwMSAwMiAwMSAwMiAwMSAwMi4KKyAqIDxwPgorICogVGhlIERlbHRhIGZpbHRlciBjYW4gYmUgZ29vZCB3aXRoIHVuY29tcHJlc3NlZCBiaXRtYXAgaW1hZ2VzLiBJdCBjYW4KKyAqIGFsc28gaGVscCB3aXRoIFBDTSBhdWRpbywgYWx0aG91Z2ggc3BlY2lhbC1wdXJwb3NlIGNvbXByZXNzb3JzIGxpa2UKKyAqIEZMQUMgd2lsbCBnaXZlIG11Y2ggc21hbGxlciByZXN1bHQgYXQgbXVjaCBiZXR0ZXIgY29tcHJlc3Npb24gc3BlZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBEZWx0YU9wdGlvbnMgZXh0ZW5kcyBGaWx0ZXJPcHRpb25zIHsKKyAgICAvKioKKyAgICAgKiBTbWFsbGVzdCBzdXBwb3J0ZWQgZGVsdGEgY2FsY3VsYXRpb24gZGlzdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTVEFOQ0VfTUlOID0gMTsKKworICAgIC8qKgorICAgICAqIExhcmdlc3Qgc3VwcG9ydGVkIGRlbHRhIGNhbGN1bGF0aW9uIGRpc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1RBTkNFX01BWCA9IDI1NjsKKworICAgIHByaXZhdGUgaW50IGRpc3RhbmNlID0gRElTVEFOQ0VfTUlOOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgRGVsdGEgb3B0aW9ucyBhbmQgc2V0cyB0aGUgZGVsdGEgZGlzdGFuY2UgdG8gMSBieXRlLgorICAgICAqLworICAgIHB1YmxpYyBEZWx0YU9wdGlvbnMoKSB7fQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgRGVsdGEgb3B0aW9ucyBhbmQgc2V0cyB0aGUgZGlzdGFuY2UgdG8gdGhlIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBEZWx0YU9wdGlvbnMoaW50IGRpc3RhbmNlKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uIHsKKyAgICAgICAgc2V0RGlzdGFuY2UoZGlzdGFuY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlbHRhIGRpc3RhbmNlIGluIGJ5dGVzLiBUaGUgbmV3IGRpc3RhbmNlIG11c3QgYmUgaW4KKyAgICAgKiB0aGUgcmFuZ2UgW0RJU1RBTkNFX01JTiwgRElTVEFOQ0VfTUFYXS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXN0YW5jZShpbnQgZGlzdGFuY2UpIHRocm93cyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24geworICAgICAgICBpZiAoZGlzdGFuY2UgPCBESVNUQU5DRV9NSU4gfHwgZGlzdGFuY2UgPiBESVNUQU5DRV9NQVgpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRGVsdGEgZGlzdGFuY2UgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWyIgKyBESVNUQU5DRV9NSU4KKyAgICAgICAgICAgICAgICAgICAgKyAiLCAiICsgRElTVEFOQ0VfTUFYICsgIl06ICIgKyBkaXN0YW5jZSk7CisKKyAgICAgICAgdGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGRlbHRhIGRpc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGlzdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBkaXN0YW5jZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEVuY29kZXJNZW1vcnlVc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIERlbHRhT3V0cHV0U3RyZWFtLmdldE1lbW9yeVVzYWdlKCk7CisgICAgfQorCisgICAgcHVibGljIEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIHJldHVybiBuZXcgRGVsdGFPdXRwdXRTdHJlYW0ob3V0LCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERlY29kZXJNZW1vcnlVc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB7CisgICAgICAgIHJldHVybiBuZXcgRGVsdGFJbnB1dFN0cmVhbShpbiwgZGlzdGFuY2UpOworICAgIH0KKworICAgIEZpbHRlckVuY29kZXIgZ2V0RmlsdGVyRW5jb2RlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEZWx0YUVuY29kZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5jbG9uZSgpOworICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0RlbHRhT3V0cHV0U3RyZWFtLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovRGVsdGFPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDg4MGRiCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0RlbHRhT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBEZWx0YU91dHB1dFN0cmVhbQorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5kZWx0YS5EZWx0YUVuY29kZXI7CisKK2NsYXNzIERlbHRhT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmluaXNoYWJsZU91dHB1dFN0cmVhbSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9CVUZfU0laRSA9IDQwOTY7CisKKyAgICBwcml2YXRlIEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gb3V0OworICAgIHByaXZhdGUgZmluYWwgRGVsdGFFbmNvZGVyIGRlbHRhOworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGZpbHRlckJ1ZiA9IG5ldyBieXRlW0ZJTFRFUl9CVUZfU0laRV07CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZmluaXNoZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSB0ZW1wQnVmID0gbmV3IGJ5dGVbMV07CisKKyAgICBzdGF0aWMgaW50IGdldE1lbW9yeVVzYWdlKCkgeworICAgICAgICByZXR1cm4gMSArIEZJTFRFUl9CVUZfU0laRSAvIDEwMjQ7CisgICAgfQorCisgICAgRGVsdGFPdXRwdXRTdHJlYW0oRmluaXNoYWJsZU91dHB1dFN0cmVhbSBvdXQsIERlbHRhT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgICAgICBkZWx0YSA9IG5ldyBEZWx0YUVuY29kZXIob3B0aW9ucy5nZXREaXN0YW5jZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVtcEJ1ZlswXSA9IChieXRlKWI7CisgICAgICAgIHdyaXRlKHRlbXBCdWYsIDAsIDEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvZmYgPCAwIHx8IGxlbiA8IDAgfHwgb2ZmICsgbGVuIDwgMCB8fCBvZmYgKyBsZW4gPiBidWYubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisKKyAgICAgICAgaWYgKGZpbmlzaGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IFhaSU9FeGNlcHRpb24oIlN0cmVhbSBmaW5pc2hlZCIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAobGVuID4gRklMVEVSX0JVRl9TSVpFKSB7CisgICAgICAgICAgICAgICAgZGVsdGEuZW5jb2RlKGJ1Ziwgb2ZmLCBGSUxURVJfQlVGX1NJWkUsIGZpbHRlckJ1Zik7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGZpbHRlckJ1Zik7CisgICAgICAgICAgICAgICAgb2ZmICs9IEZJTFRFUl9CVUZfU0laRTsKKyAgICAgICAgICAgICAgICBsZW4gLT0gRklMVEVSX0JVRl9TSVpFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWx0YS5lbmNvZGUoYnVmLCBvZmYsIGxlbiwgZmlsdGVyQnVmKTsKKyAgICAgICAgICAgIG91dC53cml0ZShmaWx0ZXJCdWYsIDAsIGxlbik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisKKyAgICAgICAgaWYgKGZpbmlzaGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IFhaSU9FeGNlcHRpb24oIlN0cmVhbSBmaW5pc2hlZCBvciBjbG9zZWQiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFmaW5pc2hlZCkgeworICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQuZmluaXNoKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0ZpbHRlckNvZGVyLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovRmlsdGVyQ29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTk1ZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0ZpbHRlckNvZGVyLmphdmEKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIEZpbHRlckNvZGVyCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKK2ludGVyZmFjZSBGaWx0ZXJDb2RlciB7CisgICAgYm9vbGVhbiBjaGFuZ2VzU2l6ZSgpOworICAgIGJvb2xlYW4gbm9uTGFzdE9LKCk7CisgICAgYm9vbGVhbiBsYXN0T0soKTsKK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9GaWx0ZXJEZWNvZGVyLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovRmlsdGVyRGVjb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMmQwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovRmlsdGVyRGVjb2Rlci5qYXZhCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBGaWx0ZXJEZWNvZGVyCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbnRlcmZhY2UgRmlsdGVyRGVjb2RlciBleHRlbmRzIEZpbHRlckNvZGVyIHsKKyAgICBpbnQgZ2V0TWVtb3J5VXNhZ2UoKTsKKyAgICBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbik7Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovRmlsdGVyRW5jb2Rlci5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0ZpbHRlckVuY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTU4YWFkCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0ZpbHRlckVuY29kZXIuamF2YQpAQCAtMCwwICsxLDE3IEBACisvKgorICogRmlsdGVyRW5jb2RlcgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbnRlcmZhY2UgRmlsdGVyRW5jb2RlciBleHRlbmRzIEZpbHRlckNvZGVyIHsKKyAgICBsb25nIGdldEZpbHRlcklEKCk7CisgICAgYnl0ZVtdIGdldEZpbHRlclByb3BzKCk7CisgICAgYm9vbGVhbiBzdXBwb3J0c0ZsdXNoaW5nKCk7CisgICAgRmluaXNoYWJsZU91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oRmluaXNoYWJsZU91dHB1dFN0cmVhbSBvdXQpOworfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0ZpbHRlck9wdGlvbnMuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9GaWx0ZXJPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzOThiNAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9GaWx0ZXJPcHRpb25zLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIEZpbHRlck9wdGlvbnMKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgZmlsdGVyLXNwZWNpZmljIG9wdGlvbnMgY2xhc3Nlcy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbHRlck9wdGlvbnMgaW1wbGVtZW50cyBDbG9uZWFibGUgeworICAgIC8qKgorICAgICAqIEdldHMgaG93IG11Y2ggbWVtb3J5IHRoZSBlbmNvZGVyIHdpbGwgbmVlZCB3aXRoCisgICAgICogdGhlIGdpdmVuIGZpbHRlciBjaGFpbi4gVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMKKyAgICAgKiA8Y29kZT5nZXRFbmNvZGVyTWVtb3J5VXNhZ2UoKTwvY29kZT4gZm9yIGV2ZXJ5IGZpbHRlcgorICAgICAqIGluIHRoZSBhcnJheSBhbmQgcmV0dXJucyB0aGUgc3VtIG9mIHRoZSByZXR1cm5lZCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RW5jb2Rlck1lbW9yeVVzYWdlKEZpbHRlck9wdGlvbnNbXSBvcHRpb25zKSB7CisgICAgICAgIGludCBtID0gMDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wdGlvbnMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBtICs9IG9wdGlvbnNbaV0uZ2V0RW5jb2Rlck1lbW9yeVVzYWdlKCk7CisKKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBob3cgbXVjaCBtZW1vcnkgdGhlIGRlY29kZXIgd2lsbCBuZWVkIHdpdGgKKyAgICAgKiB0aGUgZ2l2ZW4gZmlsdGVyIGNoYWluLiBUaGlzIGZ1bmN0aW9uIHNpbXBseSBjYWxscworICAgICAqIDxjb2RlPmdldERlY29kZXJNZW1vcnlVc2FnZSgpPC9jb2RlPiBmb3IgZXZlcnkgZmlsdGVyCisgICAgICogaW4gdGhlIGFycmF5IGFuZCByZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHJldHVybmVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXREZWNvZGVyTWVtb3J5VXNhZ2UoRmlsdGVyT3B0aW9uc1tdIG9wdGlvbnMpIHsKKyAgICAgICAgaW50IG0gPSAwOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIG0gKz0gb3B0aW9uc1tpXS5nZXREZWNvZGVyTWVtb3J5VXNhZ2UoKTsKKworICAgICAgICByZXR1cm4gbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGhvdyBtdWNoIG1lbW9yeSB0aGUgZW5jb2RlciB3aWxsIG5lZWQgd2l0aCB0aGVzZSBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RW5jb2Rlck1lbW9yeVVzYWdlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgcmF3IChubyBYWiBoZWFkZXJzKSBlbmNvZGVyIG91dHB1dCBzdHJlYW0gdXNpbmcgdGhlc2Ugb3B0aW9ucy4KKyAgICAgKiBSYXcgc3RyZWFtcyBhcmUgYW4gYWR2YW5jZWQgZmVhdHVyZS4gSW4gbW9zdCBjYXNlcyB5b3Ugd2FudCB0byBzdG9yZQorICAgICAqIHRoZSBjb21wcmVzc2VkIGRhdGEgaW4gdGhlIC54eiBjb250YWluZXIgZm9ybWF0IGluc3RlYWQgb2YgdXNpbmcKKyAgICAgKiBhIHJhdyBzdHJlYW0uIFRvIHVzZSB0aGlzIGZpbHRlciBpbiBhIC54eiBmaWxlLCBwYXNzIHRoaXMgb2JqZWN0CisgICAgICogdG8gWFpPdXRwdXRTdHJlYW0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgRmluaXNoYWJsZU91dHB1dFN0cmVhbSBvdXQpOworCisgICAgLyoqCisgICAgICogR2V0cyBob3cgbXVjaCBtZW1vcnkgdGhlIGRlY29kZXIgd2lsbCBuZWVkIHRvIGRlY29tcHJlc3MgdGhlIGRhdGEKKyAgICAgKiB0aGF0IHdhcyBlbmNvZGVkIHdpdGggdGhlc2Ugb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldERlY29kZXJNZW1vcnlVc2FnZSgpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIHJhdyAobm8gWFogaGVhZGVycykgZGVjb2RlciBpbnB1dCBzdHJlYW0gdXNpbmcgdGhlc2Ugb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBhYnN0cmFjdCBGaWx0ZXJFbmNvZGVyIGdldEZpbHRlckVuY29kZXIoKTsKKworICAgIEZpbHRlck9wdGlvbnMoKSB7fQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0ZpbmlzaGFibGVPdXRwdXRTdHJlYW0uamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9GaW5pc2hhYmxlT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2MDYyOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9GaW5pc2hhYmxlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIEZpbmlzaGFibGVPdXRwdXRTdHJlYW0KKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogT3V0cHV0IHN0cmVhbSB0aGF0IHN1cHBvcnRzIGZpbmlzaGluZyB3aXRob3V0IGNsb3NpbmcKKyAqIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworICAgIC8qKgorICAgICAqIEZpbmlzaCB0aGUgc3RyZWFtIHdpdGhvdXQgY2xvc2luZyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogTm8gbW9yZSBkYXRhIG1heSBiZSB3cml0dGVuIHRvIHRoZSBzdHJlYW0gYWZ0ZXIgZmluaXNoaW5nLgorICAgICAqIDxwPgorICAgICAqIFRoZSA8Y29kZT5maW5pc2g8L2NvZGU+IG1ldGhvZCBvZiA8Y29kZT5GaW5pc2hhYmxlT3V0cHV0U3RyZWFtPC9jb2RlPgorICAgICAqIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaXQgaWYgdGhleSBuZWVkIGZpbmlzaGluZworICAgICAqIHN1cHBvcnQsIHdoaWNoIGlzIHRoZSBjYXNlLCBmb3IgZXhhbXBsZSwgd2l0aCBjb21wcmVzc29ycy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7fTsKK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9GaW5pc2hhYmxlV3JhcHBlck91dHB1dFN0cmVhbS5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0ZpbmlzaGFibGVXcmFwcGVyT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwYWM5OQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9GaW5pc2hhYmxlV3JhcHBlck91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBGaW5pc2hhYmxlV3JhcHBlck91dHB1dFN0cmVhbQorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBXcmFwcyBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgZmluaXNoYWJsZSBvdXRwdXQgc3RyZWFtIGZvciB1c2Ugd2l0aAorICogcmF3IGVuY29kZXJzLiBUaGlzIGlzIG5vdCBuZWVkZWQgZm9yIFhaIGNvbXByZXNzaW9uIGFuZCB0aHVzIG1vc3QKKyAqIHBlb3BsZSB3aWxsIG5ldmVyIG5lZWQgdGhpcy4KKyAqLworcHVibGljIGNsYXNzIEZpbmlzaGFibGVXcmFwcGVyT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmluaXNoYWJsZU91dHB1dFN0cmVhbSB7CisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBqYXZhLmlvLk91dHB1dFN0cmVhbSBPdXRwdXRTdHJlYW19IHRoYXQgaGFzIGJlZW4KKyAgICAgKiB3cmFwcGVkIGludG8gYSBGaW5pc2hhYmxlV3JhcHBlck91dHB1dFN0cmVhbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG91dDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgb3V0cHV0IHN0cmVhbSB3aGljaCBzdXBwb3J0IGZpbmlzaGluZy4KKyAgICAgKiBUaGUgPGNvZGU+ZmluaXNoKCk8L2NvZGU+IG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuCisgICAgICovCisgICAgcHVibGljIEZpbmlzaGFibGVXcmFwcGVyT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbHMge0BsaW5rIGphdmEuaW8uT3V0cHV0U3RyZWFtI3dyaXRlKGludCkgb3V0LndyaXRlKGIpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlKGIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayBqYXZhLmlvLk91dHB1dFN0cmVhbSN3cml0ZShieXRlW10pIG91dC53cml0ZShidWYpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGUoYnVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgamF2YS5pby5PdXRwdXRTdHJlYW0jd3JpdGUoYnl0ZVtdLGludCxpbnQpCisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYsIG9mZiwgbGVuKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayBqYXZhLmlvLk91dHB1dFN0cmVhbSNmbHVzaCgpIG91dC5mbHVzaCgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC5mbHVzaCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayBqYXZhLmlvLk91dHB1dFN0cmVhbSNjbG9zZSgpIG91dC5jbG9zZSgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9JQTY0T3B0aW9ucy5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0lBNjRPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1Nzg3MAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9JQTY0T3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBJQTY0T3B0aW9ucworICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5zaW1wbGUuSUE2NDsKKworLyoqCisgKiBCQ0ogZmlsdGVyIGZvciBJdGFuaXVtIChJQS02NCkgaW5zdHJ1Y3Rpb25zLgorICovCitwdWJsaWMgY2xhc3MgSUE2NE9wdGlvbnMgZXh0ZW5kcyBCQ0pPcHRpb25zIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxJR05NRU5UID0gMTY7CisKKyAgICBwdWJsaWMgSUE2NE9wdGlvbnMoKSB7CisgICAgICAgIHN1cGVyKEFMSUdOTUVOVCk7CisgICAgfQorCisgICAgcHVibGljIEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIHJldHVybiBuZXcgU2ltcGxlT3V0cHV0U3RyZWFtKG91dCwgbmV3IElBNjQodHJ1ZSwgc3RhcnRPZmZzZXQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVJbnB1dFN0cmVhbShpbiwgbmV3IElBNjQoZmFsc2UsIHN0YXJ0T2Zmc2V0KSk7CisgICAgfQorCisgICAgRmlsdGVyRW5jb2RlciBnZXRGaWx0ZXJFbmNvZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IEJDSkVuY29kZXIodGhpcywgQkNKQ29kZXIuSUE2NF9GSUxURVJfSUQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9JbmRleEluZGljYXRvckV4Y2VwdGlvbi5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0luZGV4SW5kaWNhdG9yRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM2YmMwMwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9JbmRleEluZGljYXRvckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBJbmRleEluZGljYXRvckV4Y2VwdGlvbgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitjbGFzcyBJbmRleEluZGljYXRvckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovTFpNQTJDb2Rlci5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0xaTUEyQ29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDk2M2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0xaTUEyQ29kZXIuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKgorICogTFpNQTJDb2RlcgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCithYnN0cmFjdCBjbGFzcyBMWk1BMkNvZGVyIGltcGxlbWVudHMgRmlsdGVyQ29kZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBGSUxURVJfSUQgPSAweDIxOworCisgICAgcHVibGljIGJvb2xlYW4gY2hhbmdlc1NpemUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG5vbkxhc3RPSygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGxhc3RPSygpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0xaTUEyRGVjb2Rlci5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0xaTUEyRGVjb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMDc1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovTFpNQTJEZWNvZGVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExaTUEyRGVjb2RlcgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworY2xhc3MgTFpNQTJEZWNvZGVyIGV4dGVuZHMgTFpNQTJDb2RlciBpbXBsZW1lbnRzIEZpbHRlckRlY29kZXIgeworICAgIHByaXZhdGUgaW50IGRpY3RTaXplOworCisgICAgTFpNQTJEZWNvZGVyKGJ5dGVbXSBwcm9wcykgdGhyb3dzIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFVwIHRvIDEuNSBHaUIgZGljdGlvbmFyeSBpcyBzdXBwb3J0ZWQuIFRoZSBiaWdnZXIgb25lcworICAgICAgICAvLyBhcmUgdG9vIGJpZyBmb3IgaW50LgorICAgICAgICBpZiAocHJvcHMubGVuZ3RoICE9IDEgfHwgKHByb3BzWzBdICYgMHhGRikgPiAzNykKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBMWk1BMiBwcm9wZXJ0aWVzIik7CisKKyAgICAgICAgZGljdFNpemUgPSAyIHwgKHByb3BzWzBdICYgMSk7CisgICAgICAgIGRpY3RTaXplIDw8PSAocHJvcHNbMF0gPj4+IDEpICsgMTE7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNZW1vcnlVc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIExaTUEySW5wdXRTdHJlYW0uZ2V0TWVtb3J5VXNhZ2UoZGljdFNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbikgeworICAgICAgICByZXR1cm4gbmV3IExaTUEySW5wdXRTdHJlYW0oaW4sIGRpY3RTaXplKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovTFpNQTJFbmNvZGVyLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovTFpNQTJFbmNvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ZmFjYwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9MWk1BMkVuY29kZXIuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTFpNQTJFbmNvZGVyCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5sem1hLkxaTUFFbmNvZGVyOworCitjbGFzcyBMWk1BMkVuY29kZXIgZXh0ZW5kcyBMWk1BMkNvZGVyIGltcGxlbWVudHMgRmlsdGVyRW5jb2RlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBMWk1BMk9wdGlvbnMgb3B0aW9uczsKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBwcm9wcyA9IG5ldyBieXRlWzFdOworCisgICAgTFpNQTJFbmNvZGVyKExaTUEyT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgIGlmIChvcHRpb25zLmdldFByZXNldERpY3QoKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlhaIGRvZXNuJ3Qgc3VwcG9ydCBhIHByZXNldCBkaWN0aW9uYXJ5IGZvciBub3ciKTsKKworICAgICAgICBpZiAob3B0aW9ucy5nZXRNb2RlKCkgPT0gTFpNQTJPcHRpb25zLk1PREVfVU5DT01QUkVTU0VEKSB7CisgICAgICAgICAgICBwcm9wc1swXSA9IChieXRlKTA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgZCA9IE1hdGgubWF4KG9wdGlvbnMuZ2V0RGljdFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFpNQTJPcHRpb25zLkRJQ1RfU0laRV9NSU4pOworICAgICAgICAgICAgcHJvcHNbMF0gPSAoYnl0ZSkoTFpNQUVuY29kZXIuZ2V0RGlzdFNsb3QoZCAtIDEpIC0gMjMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBhIHByaXZhdGUgY29weSBzbyB0aGF0IHRoZSBjYWxsZXIgaXMgZnJlZSB0byBjaGFuZ2UgaXRzIGNvcHkuCisgICAgICAgIHRoaXMub3B0aW9ucyA9IChMWk1BMk9wdGlvbnMpb3B0aW9ucy5jbG9uZSgpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEZpbHRlcklEKCkgeworICAgICAgICByZXR1cm4gRklMVEVSX0lEOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0RmlsdGVyUHJvcHMoKSB7CisgICAgICAgIHJldHVybiBwcm9wczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0ZsdXNoaW5nKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmluaXNoYWJsZU91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oRmluaXNoYWJsZU91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0T3V0cHV0U3RyZWFtKG91dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0xaTUEySW5wdXRTdHJlYW0uamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9MWk1BMklucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4NjVjNgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9MWk1BMklucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBMWk1BMklucHV0U3RyZWFtCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy50dWthYW5pLnh6Lmx6LkxaRGVjb2RlcjsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5yYW5nZWNvZGVyLlJhbmdlRGVjb2RlckZyb21CdWZmZXI7CitpbXBvcnQgb3JnLnR1a2FhbmkueHoubHptYS5MWk1BRGVjb2RlcjsKKworLyoqCisgKiBEZWNvbXByZXNzZXMgYSByYXcgTFpNQTIgc3RyZWFtIChubyBYWiBoZWFkZXJzKS4KKyAqLworcHVibGljIGNsYXNzIExaTUEySW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisgICAgLyoqCisgICAgICogU21hbGxlc3QgdmFsaWQgTFpNQTIgZGljdGlvbmFyeSBzaXplLgorICAgICAqIDxwPgorICAgICAqIFZlcnkgdGlueSBkaWN0aW9uYXJpZXMgd291bGQgYmUgYSBwZXJmb3JtYW5jZSBwcm9ibGVtLCBzbworICAgICAqIHRoZSBtaW5pbXVtIGlzIDQgS2lCLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJQ1RfU0laRV9NSU4gPSA0MDk2OworCisgICAgLyoqCisgICAgICogTGFyZ2VzdCBkaWN0aW9uYXJ5IHNpemUgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICogPHA+CisgICAgICogVGhlIExaTUEyIGFsZ29yaXRobSBhbGxvd3MgZGljdGlvbmFyaWVzIHVwIHRvIG9uZSBieXRlIGxlc3MgdGhhbiA0IEdpQi4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgMTYgYnl0ZXMgbGVzcyB0aGFuIDIgR2lCIGZvciByYXcKKyAgICAgKiBMWk1BMiBzdHJlYW1zLCBhbmQgZm9yIC54eiBmaWxlcyB0aGUgbWF4aW11bSBpcyAxLjUgR2lCLiBUaGlzCisgICAgICogbGltaXRhdGlvbiBpcyBkdWUgdG8gSmF2YSB1c2luZyBzaWduZWQgMzItYml0IGludGVnZXJzIGZvciBhcnJheQorICAgICAqIGluZGV4aW5nLiBUaGUgbGltaXRhdGlvbiBzaG91bGRuJ3QgbWF0dGVyIG11Y2ggaW4gcHJhY3RpY2Ugc2luY2Ugc28KKyAgICAgKiBodWdlIGRpY3Rpb25hcmllcyBhcmUgbm90IG5vcm1hbGx5IHVzZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElDVF9TSVpFX01BWCA9IEludGVnZXIuTUFYX1ZBTFVFICYgfjE1OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTVBSRVNTRURfU0laRV9NQVggPSAxIDw8IDE2OworCisgICAgcHJpdmF0ZSBEYXRhSW5wdXRTdHJlYW0gaW47CisKKyAgICBwcml2YXRlIGZpbmFsIExaRGVjb2RlciBsejsKKyAgICBwcml2YXRlIGZpbmFsIFJhbmdlRGVjb2RlckZyb21CdWZmZXIgcmMKKyAgICAgICAgICAgID0gbmV3IFJhbmdlRGVjb2RlckZyb21CdWZmZXIoQ09NUFJFU1NFRF9TSVpFX01BWCk7CisgICAgcHJpdmF0ZSBMWk1BRGVjb2RlciBsem1hOworCisgICAgcHJpdmF0ZSBpbnQgdW5jb21wcmVzc2VkU2l6ZSA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzTFpNQUNodW5rOworCisgICAgcHJpdmF0ZSBib29sZWFuIG5lZWREaWN0UmVzZXQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkUHJvcHMgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBlbmRSZWFjaGVkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSB0ZW1wQnVmID0gbmV3IGJ5dGVbMV07CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFwcHJveGltYXRlIGRlY29tcHJlc3NvciBtZW1vcnkgcmVxdWlyZW1lbnRzIGFzIGtpYmlieXRlcyBmb3IKKyAgICAgKiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBzaXplLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGRpY3RTaXplICAgIExaTUEyIGRpY3Rpb25hcnkgc2l6ZSBhcyBieXRlcywgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzxjb2RlPkRJQ1RfU0laRV9NSU48L2NvZGU+LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5ESUNUX1NJWkVfTUFYPC9jb2RlPl0KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgICBhcHByb3hpbWF0ZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFzIGtpYmlieXRlcyAoS2lCKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE1lbW9yeVVzYWdlKGludCBkaWN0U2l6ZSkgeworICAgICAgICAvLyBUaGUgYmFzZSBzdGF0ZSBpcyBhcm91bmQgMzAtNDAgS2lCIChwcm9iYWJpbGl0aWVzIGV0Yy4pLAorICAgICAgICAvLyByYW5nZSBkZWNvZGVyIG5lZWRzIENPTVBSRVNTRURfU0laRV9NQVggYnl0ZXMgZm9yIGJ1ZmZlcmluZywKKyAgICAgICAgLy8gYW5kIExaIGRlY29kZXIgbmVlZHMgYSBkaWN0aW9uYXJ5IGJ1ZmZlci4KKyAgICAgICAgcmV0dXJuIDQwICsgQ09NUFJFU1NFRF9TSVpFX01BWCAvIDEwMjQgKyBnZXREaWN0U2l6ZShkaWN0U2l6ZSkgLyAxMDI0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXREaWN0U2l6ZShpbnQgZGljdFNpemUpIHsKKyAgICAgICAgaWYgKGRpY3RTaXplIDwgRElDVF9TSVpFX01JTiB8fCBkaWN0U2l6ZSA+IERJQ1RfU0laRV9NQVgpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgZGljdGlvbmFyeSBzaXplICIgKyBkaWN0U2l6ZSk7CisKKyAgICAgICAgLy8gUm91bmQgZGljdGlvbmFyeSBzaXplIHVwd2FyZCB0byBhIG11bHRpcGxlIG9mIDE2LiBUaGlzIHdheSBMWk1BCisgICAgICAgIC8vIGNhbiB1c2UgTFpEZWNvZGVyLmdldFBvcygpIGZvciBjYWxjdWxhdGluZyBMWk1BJ3MgcG9zTWFzay4KKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgY2hlY2sgaXMgbmVlZGVkIG9ubHkgZm9yIHJhdyBMWk1BMiBzdHJlYW1zOyBpdCBpcworICAgICAgICAvLyByZWR1bmRhbnQgd2l0aCAueHouCisgICAgICAgIHJldHVybiAoZGljdFNpemUgKyAxNSkgJiB+MTU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnB1dCBzdHJlYW0gdGhhdCBkZWNvbXByZXNzZXMgcmF3IExaTUEyIGRhdGEKKyAgICAgKiBmcm9tIDxjb2RlPmluPC9jb2RlPi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGtub3cgdGhlIGRpY3Rpb25hcnkgc2l6ZSB1c2VkIHdoZW4gY29tcHJlc3Npbmc7CisgICAgICogdGhlIGRpY3Rpb25hcnkgc2l6ZSBpc24ndCBzdG9yZWQgYXMgcGFydCBvZiBhIHJhdyBMWk1BMiBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogU3BlY2lmeWluZyBhIHRvbyBzbWFsbCBkaWN0aW9uYXJ5IHNpemUgd2lsbCBwcmV2ZW50IGRlY29tcHJlc3NpbmcKKyAgICAgKiB0aGUgc3RyZWFtLiBTcGVjaWZ5aW5nIGEgdG9vIGJpZyBkaWN0aW9uYXJ5IGlzIHdhc3RlIG9mIG1lbW9yeSBidXQKKyAgICAgKiBkZWNvbXByZXNzaW9uIHdpbGwgd29yay4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGVyZSBpcyBubyBuZWVkIHRvIHNwZWNpZnkgYSBkaWN0aW9uYXJ5IGJpZ2dlciB0aGFuCisgICAgICogdGhlIHVuY29tcHJlc3NlZCBzaXplIG9mIHRoZSBkYXRhIGV2ZW4gaWYgYSBiaWdnZXIgZGljdGlvbmFyeQorICAgICAqIHdhcyB1c2VkIHdoZW4gY29tcHJlc3NpbmcuIElmIHlvdSBrbm93IHRoZSB1bmNvbXByZXNzZWQgc2l6ZQorICAgICAqIG9mIHRoZSBkYXRhLCB0aGlzIG1pZ2h0IGFsbG93IHNhdmluZyBzb21lIG1lbW9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBpbiAgICAgICAgICBpbnB1dCBzdHJlYW0gZnJvbSB3aGljaCBMWk1BMi1jb21wcmVzc2VkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgcmVhZAorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGRpY3RTaXplICAgIExaTUEyIGRpY3Rpb25hcnkgc2l6ZSBhcyBieXRlcywgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzxjb2RlPkRJQ1RfU0laRV9NSU48L2NvZGU+LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5ESUNUX1NJWkVfTUFYPC9jb2RlPl0KKyAgICAgKi8KKyAgICBwdWJsaWMgTFpNQTJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgaW50IGRpY3RTaXplKSB7CisgICAgICAgIHRoaXMoaW4sIGRpY3RTaXplLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IExaTUEyIGRlY29tcHJlc3NvciB1c2luZyBhIHByZXNldCBkaWN0aW9uYXJ5LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgbGlrZSA8Y29kZT5MWk1BMklucHV0U3RyZWFtKElucHV0U3RyZWFtLCBpbnQpPC9jb2RlPiBleGNlcHQKKyAgICAgKiB0aGF0IHRoZSBkaWN0aW9uYXJ5IG1heSBiZSBpbml0aWFsaXplZCB1c2luZyBhIHByZXNldCBkaWN0aW9uYXJ5LgorICAgICAqIElmIGEgcHJlc2V0IGRpY3Rpb25hcnkgd2FzIHVzZWQgd2hlbiBjb21wcmVzc2luZyB0aGUgZGF0YSwgdGhlCisgICAgICogc2FtZSBwcmVzZXQgZGljdGlvbmFyeSBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gZGVjb21wcmVzc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBpbiAgICAgICAgICBpbnB1dCBzdHJlYW0gZnJvbSB3aGljaCBMWk1BMi1jb21wcmVzc2VkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgcmVhZAorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGRpY3RTaXplICAgIExaTUEyIGRpY3Rpb25hcnkgc2l6ZSBhcyBieXRlcywgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzxjb2RlPkRJQ1RfU0laRV9NSU48L2NvZGU+LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5ESUNUX1NJWkVfTUFYPC9jb2RlPl0KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBwcmVzZXREaWN0ICBwcmVzZXQgZGljdGlvbmFyeSBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0byB1c2Ugbm8gcHJlc2V0IGRpY3Rpb25hcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgTFpNQTJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgaW50IGRpY3RTaXplLCBieXRlW10gcHJlc2V0RGljdCkgeworICAgICAgICAvLyBDaGVjayBmb3IgbnVsbCBiZWNhdXNlIG90aGVyd2lzZSBudWxsIGlzbid0IGRldGVjdAorICAgICAgICAvLyBpbiB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAgICBpZiAoaW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCisgICAgICAgIHRoaXMuaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluKTsKKyAgICAgICAgdGhpcy5seiA9IG5ldyBMWkRlY29kZXIoZ2V0RGljdFNpemUoZGljdFNpemUpLCBwcmVzZXREaWN0KTsKKworICAgICAgICBpZiAocHJlc2V0RGljdCAhPSBudWxsICYmIHByZXNldERpY3QubGVuZ3RoID4gMCkKKyAgICAgICAgICAgIG5lZWREaWN0UmVzZXQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvbXByZXNzZXMgdGhlIG5leHQgYnl0ZSBmcm9tIHRoaXMgaW5wdXQgc3RyZWFtLgorICAgICAqIDxwPgorICAgICAqIFJlYWRpbmcgbG90cyBvZiBkYXRhIHdpdGggPGNvZGU+cmVhZCgpPC9jb2RlPiBmcm9tIHRoaXMgaW5wdXQgc3RyZWFtCisgICAgICogbWF5IGJlIGluZWZmaWNpZW50LiBXcmFwIGl0IGluIDxjb2RlPmphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTwvY29kZT4KKyAgICAgKiBpZiB5b3UgbmVlZCB0byByZWFkIGxvdHMgb2YgZGF0YSBvbmUgYnl0ZSBhdCBhIHRpbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgZGVjb21wcmVzc2VkIGJ5dGUsIG9yIDxjb2RlPi0xPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIHN0cmVhbQorICAgICAqCisgICAgICogQHRocm93cyAgICAgIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpJT0V4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkIGlucHV0IGlzIHRydW5jYXRlZCBvciBjb3JydXB0CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBieSA8Y29kZT5pbjwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZCh0ZW1wQnVmLCAwLCAxKSA9PSAtMSA/IC0xIDogKHRlbXBCdWZbMF0gJiAweEZGKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvbXByZXNzZXMgaW50byBhbiBhcnJheSBvZiBieXRlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiA8Y29kZT5sZW48L2NvZGU+IGlzIHplcm8sIG5vIGJ5dGVzIGFyZSByZWFkIGFuZCA8Y29kZT4wPC9jb2RlPgorICAgICAqIGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhpcyB3aWxsIGJsb2NrIHVudGlsIDxjb2RlPmxlbjwvY29kZT4KKyAgICAgKiBieXRlcyBoYXZlIGJlZW4gZGVjb21wcmVzc2VkLCB0aGUgZW5kIG9mIHRoZSBMWk1BMiBzdHJlYW0gaXMgcmVhY2hlZCwKKyAgICAgKiBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGJ1ZiAgICAgICAgIHRhcmdldCBidWZmZXIgZm9yIHVuY29tcHJlc3NlZCBkYXRhCisgICAgICogQHBhcmFtICAgICAgIG9mZiAgICAgICAgIHN0YXJ0IG9mZnNldCBpbiA8Y29kZT5idWY8L2NvZGU+CisgICAgICogQHBhcmFtICAgICAgIGxlbiAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyB0byByZWFkCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIDxjb2RlPi0xPC9jb2RlPiB0byBpbmRpY2F0ZQorICAgICAqICAgICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIHN0cmVhbQorICAgICAqCisgICAgICogQHRocm93cyAgICAgIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpJT0V4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkIGlucHV0IGlzIHRydW5jYXRlZCBvciBjb3JydXB0CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBieSA8Y29kZT5pbjwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG9mZiA8IDAgfHwgbGVuIDwgMCB8fCBvZmYgKyBsZW4gPCAwIHx8IG9mZiArIGxlbiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCisgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmIChpbiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFhaSU9FeGNlcHRpb24oIlN0cmVhbSBjbG9zZWQiKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisKKyAgICAgICAgaWYgKGVuZFJlYWNoZWQpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBzaXplID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAodW5jb21wcmVzc2VkU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZUNodW5rSGVhZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmRSZWFjaGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemUgPT0gMCA/IC0xIDogc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgY29weVNpemVNYXggPSBNYXRoLm1pbih1bmNvbXByZXNzZWRTaXplLCBsZW4pOworCisgICAgICAgICAgICAgICAgaWYgKCFpc0xaTUFDaHVuaykgeworICAgICAgICAgICAgICAgICAgICBsei5jb3B5VW5jb21wcmVzc2VkKGluLCBjb3B5U2l6ZU1heCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbHouc2V0TGltaXQoY29weVNpemVNYXgpOworICAgICAgICAgICAgICAgICAgICBsem1hLmRlY29kZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXJjLmlzSW5CdWZmZXJPSygpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IGNvcGllZFNpemUgPSBsei5mbHVzaChidWYsIG9mZik7CisgICAgICAgICAgICAgICAgb2ZmICs9IGNvcGllZFNpemU7CisgICAgICAgICAgICAgICAgbGVuIC09IGNvcGllZFNpemU7CisgICAgICAgICAgICAgICAgc2l6ZSArPSBjb3BpZWRTaXplOworICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZFNpemUgLT0gY29waWVkU2l6ZTsKKworICAgICAgICAgICAgICAgIGlmICh1bmNvbXByZXNzZWRTaXplID09IDApCisgICAgICAgICAgICAgICAgICAgIGlmICghcmMuaXNGaW5pc2hlZCgpIHx8IGx6Lmhhc1BlbmRpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWNvZGVDaHVua0hlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBjb250cm9sID0gaW4ucmVhZFVuc2lnbmVkQnl0ZSgpOworCisgICAgICAgIGlmIChjb250cm9sID09IDB4MDApIHsKKyAgICAgICAgICAgIGVuZFJlYWNoZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRyb2wgPj0gMHhFMCB8fCBjb250cm9sID09IDB4MDEpIHsKKyAgICAgICAgICAgIG5lZWRQcm9wcyA9IHRydWU7CisgICAgICAgICAgICBuZWVkRGljdFJlc2V0ID0gZmFsc2U7CisgICAgICAgICAgICBsei5yZXNldCgpOworICAgICAgICB9IGVsc2UgaWYgKG5lZWREaWN0UmVzZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRyb2wgPj0gMHg4MCkgeworICAgICAgICAgICAgaXNMWk1BQ2h1bmsgPSB0cnVlOworCisgICAgICAgICAgICB1bmNvbXByZXNzZWRTaXplID0gKGNvbnRyb2wgJiAweDFGKSA8PCAxNjsKKyAgICAgICAgICAgIHVuY29tcHJlc3NlZFNpemUgKz0gaW4ucmVhZFVuc2lnbmVkU2hvcnQoKSArIDE7CisKKyAgICAgICAgICAgIGludCBjb21wcmVzc2VkU2l6ZSA9IGluLnJlYWRVbnNpZ25lZFNob3J0KCkgKyAxOworCisgICAgICAgICAgICBpZiAoY29udHJvbCA+PSAweEMwKSB7CisgICAgICAgICAgICAgICAgbmVlZFByb3BzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZGVjb2RlUHJvcHMoKTsKKworICAgICAgICAgICAgfSBlbHNlIGlmIChuZWVkUHJvcHMpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgfSBlbHNlIGlmIChjb250cm9sID49IDB4QTApIHsKKyAgICAgICAgICAgICAgICBsem1hLnJlc2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjLnByZXBhcmVJbnB1dEJ1ZmZlcihpbiwgY29tcHJlc3NlZFNpemUpOworCisgICAgICAgIH0gZWxzZSBpZiAoY29udHJvbCA+IDB4MDIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpc0xaTUFDaHVuayA9IGZhbHNlOworICAgICAgICAgICAgdW5jb21wcmVzc2VkU2l6ZSA9IGluLnJlYWRVbnNpZ25lZFNob3J0KCkgKyAxOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlY29kZVByb3BzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHByb3BzID0gaW4ucmVhZFVuc2lnbmVkQnl0ZSgpOworCisgICAgICAgIGlmIChwcm9wcyA+ICg0ICogNSArIDQpICogOSArIDgpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oKTsKKworICAgICAgICBpbnQgcGIgPSBwcm9wcyAvICg5ICogNSk7CisgICAgICAgIHByb3BzIC09IHBiICogOSAqIDU7CisgICAgICAgIGludCBscCA9IHByb3BzIC8gOTsKKyAgICAgICAgaW50IGxjID0gcHJvcHMgLSBscCAqIDk7CisKKyAgICAgICAgaWYgKGxjICsgbHAgPiA0KQorICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCk7CisKKyAgICAgICAgbHptYSA9IG5ldyBMWk1BRGVjb2RlcihseiwgcmMsIGxjLCBscCwgcGIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZAorICAgICAqIHdpdGhvdXQgYmxvY2tpbmcuIFRoZSB2YWx1ZSBpcyByZXR1cm5lZCB3aXRoIGFuIGFzc3VtcHRpb24KKyAgICAgKiB0aGF0IHRoZSBjb21wcmVzc2VkIGlucHV0IGRhdGEgd2lsbCBiZSB2YWxpZC4gSWYgdGhlIGNvbXByZXNzZWQKKyAgICAgKiBkYXRhIGlzIGNvcnJ1cHQsIDxjb2RlPkNvcnJ1cHRlZElucHV0RXhjZXB0aW9uPC9jb2RlPiBtYXkgZ2V0CisgICAgICogdGhyb3duIGJlZm9yZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNsYWltZWQgdG8gYmUgYXZhaWxhYmxlIGhhdmUKKyAgICAgKiBiZWVuIHJlYWQgZnJvbSB0aGlzIGlucHV0IHN0cmVhbS4KKyAgICAgKiA8cD4KKyAgICAgKiBJbiBMWk1BMklucHV0U3RyZWFtLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgbm9uLXplcm8gd2hlbiB0aGUKKyAgICAgKiBkZWNvbXByZXNzb3IgaXMgaW4gdGhlIG1pZGRsZSBvZiBhbiBMWk1BMiBjaHVuay4gVGhlIHJldHVybiB2YWx1ZQorICAgICAqIHdpbGwgdGhlbiBiZSB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyByZW1haW5pbmcgZnJvbSB0aGF0CisgICAgICogY2h1bmsuCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZAorICAgICAqICAgICAgICAgICAgICB3aXRob3V0IGJsb2NraW5nCisgICAgICovCisgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYWklPRXhjZXB0aW9uKCJTdHJlYW0gY2xvc2VkIik7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworCisgICAgICAgIHJldHVybiB1bmNvbXByZXNzZWRTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3RyZWFtIGFuZCBjYWxscyA8Y29kZT5pbi5jbG9zZSgpPC9jb2RlPi4KKyAgICAgKiBJZiB0aGUgc3RyZWFtIHdhcyBhbHJlYWR5IGNsb3NlZCwgdGhpcyBkb2VzIG5vdGhpbmcuCisgICAgICoKKyAgICAgKiBAdGhyb3dzICBJT0V4Y2VwdGlvbiBpZiB0aHJvd24gYnkgPGNvZGU+aW4uY2xvc2UoKTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGluID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9MWk1BMk9wdGlvbnMuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9MWk1BMk9wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjc3N2YwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0xaTUEyT3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNTgxIEBACisvKgorICogTFpNQTJPcHRpb25zCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLnR1a2FhbmkueHoubHouTFpFbmNvZGVyOworaW1wb3J0IG9yZy50dWthYW5pLnh6Lmx6bWEuTFpNQUVuY29kZXI7CisKKy8qKgorICogTFpNQTIgY29tcHJlc3Npb24gb3B0aW9ucy4KKyAqIDxwPgorICogV2hpbGUgdGhpcyBhbGxvd3Mgc2V0dGluZyB0aGUgTFpNQTIgY29tcHJlc3Npb24gb3B0aW9ucyBpbiBkZXRhaWwsCisgKiBvZnRlbiB5b3Ugb25seSBuZWVkIDxjb2RlPkxaTUEyT3B0aW9ucygpPC9jb2RlPiBvcgorICogPGNvZGU+TFpNQTJPcHRpb25zKGludCk8L2NvZGU+LgorICovCitwdWJsaWMgY2xhc3MgTFpNQTJPcHRpb25zIGV4dGVuZHMgRmlsdGVyT3B0aW9ucyB7CisgICAgLyoqCisgICAgICogTWluaW11bSB2YWxpZCBjb21wcmVzc2lvbiBwcmVzZXQgbGV2ZWwgaXMgMC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRVRfTUlOID0gMDsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gdmFsaWQgY29tcHJlc3Npb24gcHJlc2V0IGxldmVsIGlzIDkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VUX01BWCA9IDk7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbXByZXNzaW9uIHByZXNldCBsZXZlbCBpcyA2LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVNFVF9ERUZBVUxUID0gNjsKKworICAgIC8qKgorICAgICAqIE1pbmltdW0gZGljdGlvbmFyeSBzaXplIGlzIDQgS2lCLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJQ1RfU0laRV9NSU4gPSA0MDk2OworCisgICAgLyoqCisgICAgICogTWF4aW11bSBkaWN0aW9uYXJ5IHNpemUgZm9yIGNvbXByZXNzaW9uIGlzIDc2OCBNaUIuCisgICAgICogPHA+CisgICAgICogVGhlIGRlY29tcHJlc3NvciBzdXBwb3J0cyBiaWdnZXIgZGljdGlvbmFyaWVzLCB1cCB0byBhbG1vc3QgMiBHaUIuCisgICAgICogV2l0aCBIQzQgdGhlIGVuY29kZXIgd291bGQgc3VwcG9ydCBkaWN0aW9uYXJpZXMgYmlnZ2VyIHRoYW4gNzY4IE1pQi4KKyAgICAgKiBUaGUgNzY4IE1pQiBsaW1pdCBjb21lcyBmcm9tIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIEJUNCB3aGVyZQorICAgICAqIHdlIHdvdWxkIG90aGVyd2lzZSBoaXQgdGhlIGxpbWl0cyBvZiBzaWduZWQgaW50cyBpbiBhcnJheSBpbmRleGluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB5b3UgcmVhbGx5IG5lZWQgYmlnZ2VyIGRpY3Rpb25hcnkgZm9yIGRlY29tcHJlc3Npb24sCisgICAgICogdXNlIHtAbGluayBMWk1BMklucHV0U3RyZWFtfSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUNUX1NJWkVfTUFYID0gNzY4IDw8IDIwOworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgZGljdGlvbmFyeSBzaXplIGlzIDggTWlCLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJQ1RfU0laRV9ERUZBVUxUID0gOCA8PCAyMDsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gdmFsdWUgZm9yIGxjICsgbHAgaXMgNC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQ19MUF9NQVggPSA0OworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGxpdGVyYWwgY29udGV4dCBiaXRzIGlzIDMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTENfREVGQVVMVCA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgbGl0ZXJhbCBwb3NpdGlvbiBiaXRzIGlzIDAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTFBfREVGQVVMVCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIHZhbHVlIGZvciBwYiBpcyA0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBCX01BWCA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgcG9zaXRpb24gYml0cyBpcyAyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBCX0RFRkFVTFQgPSAyOworCisgICAgLyoqCisgICAgICogQ29tcHJlc3Npb24gbW9kZTogdW5jb21wcmVzc2VkLgorICAgICAqIFRoZSBkYXRhIGlzIHdyYXBwZWQgaW50byBhIExaTUEyIHN0cmVhbSB3aXRob3V0IGNvbXByZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfVU5DT01QUkVTU0VEID0gMDsKKworICAgIC8qKgorICAgICAqIENvbXByZXNzaW9uIG1vZGU6IGZhc3QuCisgICAgICogVGhpcyBpcyB1c3VhbGx5IGNvbWJpbmVkIHdpdGggYSBoYXNoIGNoYWluIG1hdGNoIGZpbmRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0ZBU1QgPSBMWk1BRW5jb2Rlci5NT0RFX0ZBU1Q7CisKKyAgICAvKioKKyAgICAgKiBDb21wcmVzc2lvbiBtb2RlOiBub3JtYWwuCisgICAgICogVGhpcyBpcyB1c3VhbGx5IGNvbWJpbmVkIHdpdGggYSBiaW5hcnkgdHJlZSBtYXRjaCBmaW5kZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9OT1JNQUwgPSBMWk1BRW5jb2Rlci5NT0RFX05PUk1BTDsKKworICAgIC8qKgorICAgICAqIE1pbmltdW0gdmFsdWUgZm9yIDxjb2RlPm5pY2VMZW48L2NvZGU+IGlzIDguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTklDRV9MRU5fTUlOID0gODsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gdmFsdWUgZm9yIDxjb2RlPm5pY2VMZW48L2NvZGU+IGlzIDI3My4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOSUNFX0xFTl9NQVggPSAyNzM7CisKKyAgICAvKioKKyAgICAgKiBNYXRjaCBmaW5kZXI6IEhhc2ggQ2hhaW4gMi0zLTQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRl9IQzQgPSBMWkVuY29kZXIuTUZfSEM0OworCisgICAgLyoqCisgICAgICogTWF0Y2ggZmluZGVyOiBCaW5hcnkgdHJlZSAyLTMtNAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1GX0JUNCA9IExaRW5jb2Rlci5NRl9CVDQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBwcmVzZXRUb0RpY3RTaXplID0geworICAgICAgICAgICAgMSA8PCAxOCwgMSA8PCAyMCwgMSA8PCAyMSwgMSA8PCAyMiwgMSA8PCAyMiwKKyAgICAgICAgICAgIDEgPDwgMjMsIDEgPDwgMjMsIDEgPDwgMjQsIDEgPDwgMjUsIDEgPDwgMjYgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHByZXNldFRvRGVwdGhMaW1pdCA9IHsgNCwgOCwgMjQsIDQ4IH07CisKKyAgICBwcml2YXRlIGludCBkaWN0U2l6ZTsKKyAgICBwcml2YXRlIGJ5dGVbXSBwcmVzZXREaWN0ID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBsYzsKKyAgICBwcml2YXRlIGludCBscDsKKyAgICBwcml2YXRlIGludCBwYjsKKyAgICBwcml2YXRlIGludCBtb2RlOworICAgIHByaXZhdGUgaW50IG5pY2VMZW47CisgICAgcHJpdmF0ZSBpbnQgbWY7CisgICAgcHJpdmF0ZSBpbnQgZGVwdGhMaW1pdDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IExaTUEyIG9wdGlvbnMgYW5kIHNldHMgdGhlbSB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuCisgICAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPkxaTUEyT3B0aW9ucyhQUkVTRVRfREVGQVVMVCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBMWk1BMk9wdGlvbnMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXRQcmVzZXQoUFJFU0VUX0RFRkFVTFQpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IExaTUEyIG9wdGlvbnMgYW5kIHNldHMgdGhlbSB0byB0aGUgZ2l2ZW4gcHJlc2V0LgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5wcmVzZXQ8L2NvZGU+IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTFpNQTJPcHRpb25zKGludCBwcmVzZXQpIHRocm93cyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24geworICAgICAgICBzZXRQcmVzZXQocHJlc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBMWk1BMiBvcHRpb25zIGFuZCBzZXRzIHRoZW0gdG8gdGhlIGdpdmVuIGN1c3RvbSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkIG9wdGlvbnMgd2VyZSBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTFpNQTJPcHRpb25zKGludCBkaWN0U2l6ZSwgaW50IGxjLCBpbnQgbHAsIGludCBwYiwgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmljZUxlbiwgaW50IG1mLCBpbnQgZGVwdGhMaW1pdCkKKyAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24geworICAgICAgICBzZXREaWN0U2l6ZShkaWN0U2l6ZSk7CisgICAgICAgIHNldExjTHAobGMsIGxwKTsKKyAgICAgICAgc2V0UGIocGIpOworICAgICAgICBzZXRNb2RlKG1vZGUpOworICAgICAgICBzZXROaWNlTGVuKG5pY2VMZW4pOworICAgICAgICBzZXRNYXRjaEZpbmRlcihtZik7CisgICAgICAgIHNldERlcHRoTGltaXQoZGVwdGhMaW1pdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29tcHJlc3Npb24gb3B0aW9ucyB0byB0aGUgZ2l2ZW4gcHJlc2V0LgorICAgICAqIDxwPgorICAgICAqIFRoZSBwcmVzZXRzIDAtMyBhcmUgZmFzdCBwcmVzZXRzIHdpdGggbWVkaXVtIGNvbXByZXNzaW9uLgorICAgICAqIFRoZSBwcmVzZXRzIDQtNiBhcmUgZmFpcmx5IHNsb3cgcHJlc2V0cyB3aXRoIGhpZ2ggY29tcHJlc3Npb24uCisgICAgICogVGhlIGRlZmF1bHQgcHJlc2V0ICg8Y29kZT5QUkVTRVRfREVGQVVMVDwvY29kZT4pIGlzIDYuCisgICAgICogPHA+CisgICAgICogVGhlIHByZXNldHMgNy05IGFyZSBsaWtlIHRoZSBwcmVzZXQgNiBidXQgdXNlIGJpZ2dlciBkaWN0aW9uYXJpZXMKKyAgICAgKiBhbmQgaGF2ZSBoaWdoZXIgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG1lbW9yeSByZXF1aXJlbWVudHMuCisgICAgICogVW5sZXNzIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgZmlsZSBleGNlZWRzIDgmbmJzcDtNaUIsCisgICAgICogMTYmbmJzcDtNaUIsIG9yIDMyJm5ic3A7TWlCLCBpdCBpcyB3YXN0ZSBvZiBtZW1vcnkgdG8gdXNlIHRoZQorICAgICAqIHByZXNldHMgNywgOCwgb3IgOSwgcmVzcGVjdGl2ZWx5LgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5wcmVzZXQ8L2NvZGU+IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVzZXQoaW50IHByZXNldCkgdGhyb3dzIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwcmVzZXQgPCAwIHx8IHByZXNldCA+IDkpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgcHJlc2V0OiAiICsgcHJlc2V0KTsKKworICAgICAgICBsYyA9IExDX0RFRkFVTFQ7CisgICAgICAgIGxwID0gTFBfREVGQVVMVDsKKyAgICAgICAgcGIgPSBQQl9ERUZBVUxUOworICAgICAgICBkaWN0U2l6ZSA9IHByZXNldFRvRGljdFNpemVbcHJlc2V0XTsKKworICAgICAgICBpZiAocHJlc2V0IDw9IDMpIHsKKyAgICAgICAgICAgIG1vZGUgPSBNT0RFX0ZBU1Q7CisgICAgICAgICAgICBtZiA9IE1GX0hDNDsKKyAgICAgICAgICAgIG5pY2VMZW4gPSBwcmVzZXQgPD0gMSA/IDEyOCA6IE5JQ0VfTEVOX01BWDsKKyAgICAgICAgICAgIGRlcHRoTGltaXQgPSBwcmVzZXRUb0RlcHRoTGltaXRbcHJlc2V0XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1vZGUgPSBNT0RFX05PUk1BTDsKKyAgICAgICAgICAgIG1mID0gTUZfQlQ0OworICAgICAgICAgICAgbmljZUxlbiA9IChwcmVzZXQgPT0gNCkgPyAxNiA6IChwcmVzZXQgPT0gNSkgPyAzMiA6IDY0OworICAgICAgICAgICAgZGVwdGhMaW1pdCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkaWN0aW9uYXJ5IHNpemUgaW4gYnl0ZXMuCisgICAgICogPHA+CisgICAgICogVGhlIGRpY3Rpb25hcnkgKG9yIGhpc3RvcnkgYnVmZmVyKSBob2xkcyB0aGUgbW9zdCByZWNlbnRseSBzZWVuCisgICAgICogdW5jb21wcmVzc2VkIGRhdGEuIEJpZ2dlciBkaWN0aW9uYXJ5IHVzdWFsbHkgbWVhbnMgYmV0dGVyIGNvbXByZXNzaW9uLgorICAgICAqIEhvd2V2ZXIsIHVzaW5nIGEgZGljdGlvYW5hcnkgYmlnZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZAorICAgICAqIGRhdGEgaXMgd2FzdGUgb2YgbWVtb3J5LgorICAgICAqIDxwPgorICAgICAqIEFueSB2YWx1ZSBpbiB0aGUgcmFuZ2UgW0RJQ1RfU0laRV9NSU4sIERJQ1RfU0laRV9NQVhdIGlzIHZhbGlkLAorICAgICAqIGJ1dCBzaXplcyBvZiAyXm4gYW5kIDJebiZuYnNwOysmbmJzcDsyXihuLTEpIGJ5dGVzIGFyZSBzb21ld2hhdAorICAgICAqIHJlY29tbWVuZGVkLgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5kaWN0U2l6ZTwvY29kZT4gaXMgbm90IHN1cHBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpY3RTaXplKGludCBkaWN0U2l6ZSkgdGhyb3dzIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkaWN0U2l6ZSA8IERJQ1RfU0laRV9NSU4pCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTFpNQTIgZGljdGlvbmFyeSBzaXplIG11c3QgYmUgYXQgbGVhc3QgNCBLaUI6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBkaWN0U2l6ZSArICIgQiIpOworCisgICAgICAgIGlmIChkaWN0U2l6ZSA+IERJQ1RfU0laRV9NQVgpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTFpNQTIgZGljdGlvbmFyeSBzaXplIG11c3Qgbm90IGV4Y2VlZCAiCisgICAgICAgICAgICAgICAgICAgICsgKERJQ1RfU0laRV9NQVggPj4gMjApICsgIiBNaUI6ICIgKyBkaWN0U2l6ZSArICIgQiIpOworCisgICAgICAgIHRoaXMuZGljdFNpemUgPSBkaWN0U2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkaWN0aW9uYXJ5IHNpemUgaW4gYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXREaWN0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGRpY3RTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBwcmVzZXQgZGljdGlvbmFyeS4gVXNlIG51bGwgdG8gZGlzYWJsZSB0aGUgdXNlIG9mCisgICAgICogYSBwcmVzZXQgZGljdGlvbmFyeS4gQnkgZGVmYXVsdCB0aGVyZSBpcyBubyBwcmVzZXQgZGljdGlvbmFyeS4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5UaGUgLnh6IGZvcm1hdCBkb2Vzbid0IHN1cHBvcnQgYSBwcmVzZXQgZGljdGlvbmFyeSBmb3Igbm93LgorICAgICAqIERvIG5vdCBzZXQgYSBwcmVzZXQgZGljdGlvbmFyeSB1bmxlc3MgeW91IHVzZSByYXcgTFpNQTIuPC9iPgorICAgICAqIDxwPgorICAgICAqIFByZXNldCBkaWN0aW9uYXJ5IGNhbiBiZSB1c2VmdWwgd2hlbiBjb21wcmVzc2luZyBtYW55IHNpbWlsYXIsCisgICAgICogcmVsYXRpdmVseSBzbWFsbCBjaHVua3Mgb2YgZGF0YSBpbmRlcGVuZGVudGx5IGZyb20gZWFjaCBvdGhlci4KKyAgICAgKiBBIHByZXNldCBkaWN0aW9uYXJ5IHNob3VsZCBjb250YWluIHR5cGljYWwgc3RyaW5ncyB0aGF0IG9jY3VyIGluCisgICAgICogdGhlIGZpbGVzIGJlaW5nIGNvbXByZXNzZWQuIFRoZSBtb3N0IHByb2JhYmxlIHN0cmluZ3Mgc2hvdWxkIGJlCisgICAgICogbmVhciB0aGUgZW5kIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeS4gVGhlIHByZXNldCBkaWN0aW9uYXJ5IHVzZWQKKyAgICAgKiBmb3IgY29tcHJlc3Npb24gaXMgYWxzbyBuZWVkZWQgZm9yIGRlY29tcHJlc3Npb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlc2V0RGljdChieXRlW10gcHJlc2V0RGljdCkgeworICAgICAgICB0aGlzLnByZXNldERpY3QgPSBwcmVzZXREaWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHByZXNldCBkaWN0aW9uYXJ5LgorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0UHJlc2V0RGljdCgpIHsKKyAgICAgICAgcmV0dXJuIHByZXNldERpY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGxpdGVyYWwgY29udGV4dCBiaXRzIGFuZCBsaXRlcmFsIHBvc2l0aW9uIGJpdHMuCisgICAgICogPHA+CisgICAgICogVGhlIHN1bSBvZiA8Y29kZT5sYzwvY29kZT4gYW5kIDxjb2RlPmxwPC9jb2RlPiBpcyBsaW1pdGVkIHRvIDQuCisgICAgICogVHJ5aW5nIHRvIGV4Y2VlZCBpdCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4gVGhpcyBmdW5jdGlvbiBsZXRzCisgICAgICogeW91IGNoYW5nZSBib3RoIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmxjPC9jb2RlPiBhbmQgPGNvZGU+bHA8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbnZhbGlkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGNMcChpbnQgbGMsIGludCBscCkgdGhyb3dzIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsYyA8IDAgfHwgbHAgPCAwIHx8IGxjID4gTENfTFBfTUFYIHx8IGxwID4gTENfTFBfTUFYCisgICAgICAgICAgICAgICAgfHwgbGMgKyBscCA+IExDX0xQX01BWCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJsYyArIGxwIG11c3Qgbm90IGV4Y2VlZCAiICsgTENfTFBfTUFYICsgIjogIgorICAgICAgICAgICAgICAgICAgICArIGxjICsgIiArICIgKyBscCk7CisKKyAgICAgICAgdGhpcy5sYyA9IGxjOworICAgICAgICB0aGlzLmxwID0gbHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGxpdGVyYWwgY29udGV4dCBiaXRzLgorICAgICAqIDxwPgorICAgICAqIEFsbCBieXRlcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIG1hdGNoZXMgYXJlIGVuY29kZWQgYXMgbGl0ZXJhbHMuCisgICAgICogVGhhdCBpcywgbGl0ZXJhbHMgYXJlIHNpbXBseSA4LWJpdCBieXRlcyB0aGF0IGFyZSBlbmNvZGVkIG9uZSBhdAorICAgICAqIGEgdGltZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbGl0ZXJhbCBjb2RpbmcgbWFrZXMgYW4gYXNzdW1wdGlvbiB0aGF0IHRoZSBoaWdoZXN0IDxjb2RlPmxjPC9jb2RlPgorICAgICAqIGJpdHMgb2YgdGhlIHByZXZpb3VzIHVuY29tcHJlc3NlZCBieXRlIGNvcnJlbGF0ZSB3aXRoIHRoZSBuZXh0IGJ5dGUuCisgICAgICogRm9yIGV4YW1wbGUsIGluIHR5cGljYWwgRW5nbGlzaCB0ZXh0LCBhbiB1cHBlci1jYXNlIGxldHRlciBpcyBvZnRlbgorICAgICAqIGZvbGxvd2VkIGJ5IGEgbG93ZXItY2FzZSBsZXR0ZXIsIGFuZCBhIGxvd2VyLWNhc2UgbGV0dGVyIGlzIHVzdWFsbHkKKyAgICAgKiBmb2xsb3dlZCBieSBhbm90aGVyIGxvd2VyLWNhc2UgbGV0dGVyLiBJbiB0aGUgVVMtQVNDSUkgY2hhcmFjdGVyIHNldCwKKyAgICAgKiB0aGUgaGlnaGVzdCB0aHJlZSBiaXRzIGFyZSAwMTAgZm9yIHVwcGVyLWNhc2UgbGV0dGVycyBhbmQgMDExIGZvcgorICAgICAqIGxvd2VyLWNhc2UgbGV0dGVycy4gV2hlbiA8Y29kZT5sYzwvY29kZT4gaXMgYXQgbGVhc3QgMywgdGhlIGxpdGVyYWwKKyAgICAgKiBjb2RpbmcgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoaXMgcHJvcGVydHkgaW4gdGhlICB1bmNvbXByZXNzZWQgZGF0YS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSAoMykgaXMgdXN1YWxseSBnb29kLiBJZiB5b3Ugd2FudCBtYXhpbXVtIGNvbXByZXNzaW9uLAorICAgICAqIHRyeSA8Y29kZT5zZXRMYyg0KTwvY29kZT4uIFNvbWV0aW1lcyBpdCBoZWxwcyBhIGxpdHRsZSwgYW5kIHNvbWV0aW1lcyBpdAorICAgICAqIG1ha2VzIGNvbXByZXNzaW9uIHdvcnNlLiBJZiBpdCBtYWtlcyBpdCB3b3JzZSwgdGVzdCBmb3IgZXhhbXBsZQorICAgICAqIDxjb2RlPnNldExjKDIpPC9jb2RlPiB0b28uCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmxjPC9jb2RlPiBpcyBpbnZhbGlkLCBvciB0aGUgc3VtCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIDxjb2RlPmxjPC9jb2RlPiBhbmQgPGNvZGU+bHA8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VlZCBMQ19MUF9NQVgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYyhpbnQgbGMpIHRocm93cyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24geworICAgICAgICBzZXRMY0xwKGxjLCBscCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGxpdGVyYWwgcG9zaXRpb24gYml0cy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFmZmV0cyB3aGF0IGtpbmQgb2YgYWxpZ25tZW50IGluIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBpcworICAgICAqIGFzc3VtZWQgd2hlbiBlbmNvZGluZyBsaXRlcmFscy4gU2VlIHtAbGluayAjc2V0UGIoaW50KSBzZXRQYn0gZm9yCisgICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhbGlnbm1lbnQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmxwPC9jb2RlPiBpcyBpbnZhbGlkLCBvciB0aGUgc3VtCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIDxjb2RlPmxjPC9jb2RlPiBhbmQgPGNvZGU+bHA8L2NvZGU+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VlZCBMQ19MUF9NQVgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMcChpbnQgbHApIHRocm93cyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24geworICAgICAgICBzZXRMY0xwKGxjLCBscCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGxpdGVyYWwgY29udGV4dCBiaXRzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TGMoKSB7CisgICAgICAgIHJldHVybiBsYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgbGl0ZXJhbCBwb3NpdGlvbiBiaXRzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0THAoKSB7CisgICAgICAgIHJldHVybiBscDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgcG9zaXRpb24gYml0cy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFmZmVjdHMgd2hhdCBraW5kIG9mIGFsaWdubWVudCBpbiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgaXMKKyAgICAgKiBhc3N1bWVkIGluIGdlbmVyYWwuIFRoZSBkZWZhdWx0ICgyKSBtZWFucyBmb3VyLWJ5dGUgYWxpZ25tZW50CisgICAgICogKDJePGNvZGU+cGI8L2NvZGU+ID0gMl4yID0gNCksIHdoaWNoIGlzIG9mdGVuIGEgZ29vZCBjaG9pY2Ugd2hlbgorICAgICAqIHRoZXJlJ3Mgbm8gYmV0dGVyIGd1ZXNzLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIGFsaWdubWVudCBpcyBrbm93biwgc2V0dGluZyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uIGJpdHMKKyAgICAgKiBhY2NvcmRpbmdseSBtYXkgcmVkdWNlIHRoZSBmaWxlIHNpemUgYSBsaXR0bGUuIEZvciBleGFtcGxlIHdpdGggdGV4dAorICAgICAqIGZpbGVzIGhhdmluZyBvbmUtYnl0ZSBhbGlnbm1lbnQgKFVTLUFTQ0lJLCBJU08tODg1OS0qLCBVVEYtOCksIHVzaW5nCisgICAgICogPGNvZGU+c2V0UGIoMCk8L2NvZGU+IGNhbiBpbXByb3ZlIGNvbXByZXNzaW9uIHNsaWdodGx5LiBGb3IgVVRGLTE2CisgICAgICogdGV4dCwgPGNvZGU+c2V0UGIoMSk8L2NvZGU+IGlzIGEgZ29vZCBjaG9pY2UuIElmIHRoZSBhbGlnbm1lbnQgaXMKKyAgICAgKiBhbiBvZGQgbnVtYmVyIGxpa2UgMyBieXRlcywgPGNvZGU+c2V0UGIoMCk8L2NvZGU+IG1pZ2h0IGJlIHRoZSBiZXN0CisgICAgICogY2hvaWNlLgorICAgICAqIDxwPgorICAgICAqIEV2ZW4gdGhvdWdoIHRoZSBhc3N1bWVkIGFsaWdubWVudCBjYW4gYmUgYWRqdXN0ZWQgd2l0aAorICAgICAqIDxjb2RlPnNldFBiPC9jb2RlPiBhbmQgPGNvZGU+c2V0THA8L2NvZGU+LCBMWk1BMiBzdGlsbCBzbGlnaHRseSBmYXZvcnMKKyAgICAgKiAxNi1ieXRlIGFsaWdubWVudC4gSXQgbWlnaHQgYmUgd29ydGggdGFraW5nIGludG8gYWNjb3VudCB3aGVuIGRlc2lnbmluZworICAgICAqIGZpbGUgZm9ybWF0cyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgb2Z0ZW4gY29tcHJlc3NlZCB3aXRoIExaTUEyLgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5wYjwvY29kZT4gaXMgaW52YWxpZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBiKGludCBwYikgdGhyb3dzIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwYiA8IDAgfHwgcGIgPiBQQl9NQVgpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAicGIgbXVzdCBub3QgZXhjZWVkICIgKyBQQl9NQVggKyAiOiAiICsgcGIpOworCisgICAgICAgIHRoaXMucGIgPSBwYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgcG9zaXRpb24gYml0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBiKCkgeworICAgICAgICByZXR1cm4gcGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29tcHJlc3Npb24gbW9kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHNwZWNpZmllcyB0aGUgbWV0aG9kIHRvIGFuYWx5emUgdGhlIGRhdGEgcHJvZHVjZWQgYnkKKyAgICAgKiBhIG1hdGNoIGZpbmRlci4gVGhlIGRlZmF1bHQgaXMgPGNvZGU+TU9ERV9GQVNUPC9jb2RlPiBmb3IgcHJlc2V0cworICAgICAqIDAtMyBhbmQgPGNvZGU+TU9ERV9OT1JNQUw8L2NvZGU+IGZvciBwcmVzZXRzIDQtOS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc3VhbGx5IDxjb2RlPk1PREVfRkFTVDwvY29kZT4gaXMgdXNlZCB3aXRoIEhhc2ggQ2hhaW4gbWF0Y2ggZmluZGVycworICAgICAqIGFuZCA8Y29kZT5NT0RFX05PUk1BTDwvY29kZT4gd2l0aCBCaW5hcnkgVHJlZSBtYXRjaCBmaW5kZXJzLiBUaGlzIGlzCisgICAgICogYWxzbyB3aGF0IHRoZSBwcmVzZXRzIGRvLgorICAgICAqIDxwPgorICAgICAqIFRoZSBzcGVjaWFsIG1vZGUgPGNvZGU+TU9ERV9VTkNPTVBSRVNTRUQ8L2NvZGU+IGRvZXNuJ3QgdHJ5IHRvCisgICAgICogY29tcHJlc3MgdGhlIGRhdGEgYXQgYWxsIChhbmQgZG9lc24ndCB1c2UgYSBtYXRjaCBmaW5kZXIpIGFuZCB3aWxsCisgICAgICogc2ltcGx5IHdyYXAgaXQgaW4gdW5jb21wcmVzc2VkIExaTUEyIGNodW5rcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+bW9kZTwvY29kZT4gaXMgbm90IHN1cHBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1vZGUoaW50IG1vZGUpIHRocm93cyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24geworICAgICAgICBpZiAobW9kZSA8IE1PREVfVU5DT01QUkVTU0VEIHx8IG1vZGUgPiBNT0RFX05PUk1BTCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBjb21wcmVzc2lvbiBtb2RlOiAiICsgbW9kZSk7CisKKyAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjb21wcmVzc2lvbiBtb2RlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmljZSBsZW5ndGggb2YgbWF0Y2hlcy4KKyAgICAgKiBPbmNlIGEgbWF0Y2ggb2YgYXQgbGVhc3QgPGNvZGU+bmljZUxlbjwvY29kZT4gYnl0ZXMgaXMgZm91bmQsCisgICAgICogdGhlIGFsZ29yaXRobSBzdG9wcyBsb29raW5nIGZvciBiZXR0ZXIgbWF0Y2hlcy4gSGlnaGVyIHZhbHVlcyB0ZW5kCisgICAgICogdG8gZ2l2ZSBiZXR0ZXIgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2Ygc3BlZWQuIFRoZSBkZWZhdWx0CisgICAgICogZGVwZW5kcyBvbiB0aGUgcHJlc2V0LgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5uaWNlTGVuPC9jb2RlPiBpcyBpbnZhbGlkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmljZUxlbihpbnQgbmljZUxlbikgdGhyb3dzIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuaWNlTGVuIDwgTklDRV9MRU5fTUlOKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk1pbmltdW0gbmljZSBsZW5ndGggb2YgbWF0Y2hlcyBpcyAiCisgICAgICAgICAgICAgICAgICAgICsgTklDRV9MRU5fTUlOICsgIiBieXRlczogIiArIG5pY2VMZW4pOworCisgICAgICAgIGlmIChuaWNlTGVuID4gTklDRV9MRU5fTUFYKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk1heGltdW0gbmljZSBsZW5ndGggb2YgbWF0Y2hlcyBpcyAiICsgTklDRV9MRU5fTUFYCisgICAgICAgICAgICAgICAgICAgICsgIjogIiArIG5pY2VMZW4pOworCisgICAgICAgIHRoaXMubmljZUxlbiA9IG5pY2VMZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmljZSBsZW5ndGggb2YgbWF0Y2hlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE5pY2VMZW4oKSB7CisgICAgICAgIHJldHVybiBuaWNlTGVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1hdGNoIGZpbmRlciB0eXBlLgorICAgICAqIDxwPgorICAgICAqIE1hdGNoIGZpbmRlciBoYXMgYSBtYWpvciBlZmZlY3Qgb24gY29tcHJlc3Npb24gc3BlZWQsIG1lbW9yeSB1c2FnZSwKKyAgICAgKiBhbmQgY29tcHJlc3Npb24gcmF0aW8uIFVzdWFsbHkgSGFzaCBDaGFpbiBtYXRjaCBmaW5kZXJzIGFyZSBmYXN0ZXIKKyAgICAgKiB0aGFuIEJpbmFyeSBUcmVlIG1hdGNoIGZpbmRlcnMuIFRoZSBkZWZhdWx0IGRlcGVuZHMgb24gdGhlIHByZXNldDoKKyAgICAgKiAwLTMgdXNlIDxjb2RlPk1GX0hDNDwvY29kZT4gYW5kIDQtOSB1c2UgPGNvZGU+TUZfQlQ0PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+bWY8L2NvZGU+IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXRjaEZpbmRlcihpbnQgbWYpIHRocm93cyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24geworICAgICAgICBpZiAobWYgIT0gTUZfSEM0ICYmIG1mICE9IE1GX0JUNCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBtYXRjaCBmaW5kZXI6ICIgKyBtZik7CisKKyAgICAgICAgdGhpcy5tZiA9IG1mOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1hdGNoIGZpbmRlciB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF0Y2hGaW5kZXIoKSB7CisgICAgICAgIHJldHVybiBtZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXRjaCBmaW5kZXIgc2VhcmNoIGRlcHRoIGxpbWl0LgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGlzIGEgc3BlY2lhbCB2YWx1ZSBvZiA8Y29kZT4wPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdAorICAgICAqIHRoZSBkZXB0aCBsaW1pdCBzaG91bGQgYmUgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGJ5IHRoZSBzZWxlY3RlZAorICAgICAqIG1hdGNoIGZpbmRlciBmcm9tIHRoZSBuaWNlIGxlbmd0aCBvZiBtYXRjaGVzLgorICAgICAqIDxwPgorICAgICAqIFJlYXNvbmFibGUgZGVwdGggbGltaXQgZm9yIEhhc2ggQ2hhaW4gbWF0Y2ggZmluZGVycyBpcyA0LTEwMCBhbmQKKyAgICAgKiAxNi0xMDAwIGZvciBCaW5hcnkgVHJlZSBtYXRjaCBmaW5kZXJzLiBVc2luZyB2ZXJ5IGhpZ2ggdmFsdWVzIGNhbgorICAgICAqIG1ha2UgdGhlIGNvbXByZXNzb3IgZXh0cmVtZWx5IHNsb3cgd2l0aCBzb21lIGZpbGVzLiBBdm9pZCBzZXR0aW5ncworICAgICAqIGhpZ2hlciB0aGFuIDEwMDAgdW5sZXNzIHlvdSBhcmUgcHJlcGFyZWQgdG8gaW50ZXJydXB0IHRoZSBjb21wcmVzc2lvbgorICAgICAqIGluIGNhc2UgaXQgaXMgdGFraW5nIGZhciB0b28gbG9uZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+ZGVwdGhMaW1pdDwvY29kZT4gaXMgaW52YWxpZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlcHRoTGltaXQoaW50IGRlcHRoTGltaXQpCisgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRlcHRoTGltaXQgPCAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkRlcHRoIGxpbWl0IGNhbm5vdCBiZSBuZWdhdGl2ZTogIiArIGRlcHRoTGltaXQpOworCisgICAgICAgIHRoaXMuZGVwdGhMaW1pdCA9IGRlcHRoTGltaXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWF0Y2ggZmluZGVyIHNlYXJjaCBkZXB0aCBsaW1pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERlcHRoTGltaXQoKSB7CisgICAgICAgIHJldHVybiBkZXB0aExpbWl0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RW5jb2Rlck1lbW9yeVVzYWdlKCkgeworICAgICAgICByZXR1cm4gKG1vZGUgPT0gTU9ERV9VTkNPTVBSRVNTRUQpCisgICAgICAgICAgICAgICA/IFVuY29tcHJlc3NlZExaTUEyT3V0cHV0U3RyZWFtLmdldE1lbW9yeVVzYWdlKCkKKyAgICAgICAgICAgICAgIDogTFpNQTJPdXRwdXRTdHJlYW0uZ2V0TWVtb3J5VXNhZ2UodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIGlmIChtb2RlID09IE1PREVfVU5DT01QUkVTU0VEKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBVbmNvbXByZXNzZWRMWk1BMk91dHB1dFN0cmVhbShvdXQpOworCisgICAgICAgIHJldHVybiBuZXcgTFpNQTJPdXRwdXRTdHJlYW0ob3V0LCB0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGhvdyBtdWNoIG1lbW9yeSB0aGUgTFpNQTIgZGVjb2RlciB3aWxsIG5lZWQgdG8gZGVjb21wcmVzcyB0aGUgZGF0YQorICAgICAqIHRoYXQgd2FzIGVuY29kZWQgd2l0aCB0aGVzZSBvcHRpb25zIGFuZCBzdG9yZWQgaW4gYSAueHogZmlsZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbWF5IGJpZ2dlciB0aGFuIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBhIGRpcmVjdCBjYWxsCisgICAgICogdG8ge0BsaW5rIExaTUEySW5wdXRTdHJlYW0jZ2V0TWVtb3J5VXNhZ2UoaW50KX0gaWYgdGhlIGRpY3Rpb25hcnkgc2l6ZQorICAgICAqIGlzIG5vdCAyXm4gb3IgMl5uJm5ic3A7KyZuYnNwOzJeKG4tMSkgYnl0ZXMuIFRoaXMgaXMgYmVjYXVzZSB0aGUgLnh6CisgICAgICogaGVhZGVycyBzdG9yZSB0aGUgZGljdGlvbmFyeSBzaXplIGluIHN1Y2ggYSBmb3JtYXQgYW5kIG90aGVyIHZhbHVlcworICAgICAqIGFyZSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IHN1Y2ggdmFsdWUuIFN1Y2ggcm91bmRpbmcgaXMgaGFybWVzcyBleGNlcHQKKyAgICAgKiBpdCBtaWdodCB3YXN0ZSBzb21lIG1lbW9yeSBpZiBhbiB1bnN1YWwgZGljdGlvbmFyeSBzaXplIGlzIHVzZWQuCisgICAgICogPHA+CisgICAgICogSWYgeW91IHVzZSByYXcgTFpNQTIgc3RyZWFtcyBhbmQgdW51c3VhbCBkaWN0aW9hbmFyeSBzaXplLCBjYWxsCisgICAgICoge0BsaW5rIExaTUEySW5wdXRTdHJlYW0jZ2V0TWVtb3J5VXNhZ2V9IGRpcmVjdGx5IHRvIGdldCByYXcgZGVjb2RlcgorICAgICAqIG1lbW9yeSByZXF1aXJlbWVudHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXREZWNvZGVyTWVtb3J5VXNhZ2UoKSB7CisgICAgICAgIC8vIFJvdW5kIHRoZSBkaWN0aW9uYXJ5IHNpemUgdXAgdG8gdGhlIG5leHQgMl5uIG9yIDJebiArIDJeKG4tMSkuCisgICAgICAgIGludCBkID0gZGljdFNpemUgLSAxOworICAgICAgICBkIHw9IGQgPj4+IDI7CisgICAgICAgIGQgfD0gZCA+Pj4gMzsKKyAgICAgICAgZCB8PSBkID4+PiA0OworICAgICAgICBkIHw9IGQgPj4+IDg7CisgICAgICAgIGQgfD0gZCA+Pj4gMTY7CisgICAgICAgIHJldHVybiBMWk1BMklucHV0U3RyZWFtLmdldE1lbW9yeVVzYWdlKGQgKyAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgTFpNQTJJbnB1dFN0cmVhbShpbiwgZGljdFNpemUpOworICAgIH0KKworICAgIEZpbHRlckVuY29kZXIgZ2V0RmlsdGVyRW5jb2RlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMWk1BMkVuY29kZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5jbG9uZSgpOworICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0xaTUEyT3V0cHV0U3RyZWFtLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovTFpNQTJPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzI0ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0xaTUEyT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBMWk1BMk91dHB1dFN0cmVhbQorICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKKworaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy50dWthYW5pLnh6Lmx6LkxaRW5jb2RlcjsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5yYW5nZWNvZGVyLlJhbmdlRW5jb2RlcjsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5sem1hLkxaTUFFbmNvZGVyOworCitjbGFzcyBMWk1BMk91dHB1dFN0cmVhbSBleHRlbmRzIEZpbmlzaGFibGVPdXRwdXRTdHJlYW0geworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09NUFJFU1NFRF9TSVpFX01BWCA9IDY0IDw8IDEwOworCisgICAgcHJpdmF0ZSBGaW5pc2hhYmxlT3V0cHV0U3RyZWFtIG91dDsKKyAgICBwcml2YXRlIGZpbmFsIERhdGFPdXRwdXRTdHJlYW0gb3V0RGF0YTsKKworICAgIHByaXZhdGUgZmluYWwgTFpFbmNvZGVyIGx6OworICAgIHByaXZhdGUgZmluYWwgUmFuZ2VFbmNvZGVyIHJjOworICAgIHByaXZhdGUgZmluYWwgTFpNQUVuY29kZXIgbHptYTsKKworICAgIHByaXZhdGUgZmluYWwgaW50IHByb3BzOyAvLyBDYW5ub3QgY2hhbmdlIHByb3BzIG9uIHRoZSBmbHkgZm9yIG5vdy4KKyAgICBwcml2YXRlIGJvb2xlYW4gZGljdFJlc2V0TmVlZGVkID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhdGVSZXNldE5lZWRlZCA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIHByb3BzTmVlZGVkID0gdHJ1ZTsKKworICAgIHByaXZhdGUgaW50IHBlbmRpbmdTaXplID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmluaXNoZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSB0ZW1wQnVmID0gbmV3IGJ5dGVbMV07CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RXh0cmFTaXplQmVmb3JlKGludCBkaWN0U2l6ZSkgeworICAgICAgICByZXR1cm4gQ09NUFJFU1NFRF9TSVpFX01BWCA+IGRpY3RTaXplCisgICAgICAgICAgICAgICA/IENPTVBSRVNTRURfU0laRV9NQVggLSBkaWN0U2l6ZSA6IDA7CisgICAgfQorCisgICAgc3RhdGljIGludCBnZXRNZW1vcnlVc2FnZShMWk1BMk9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAvLyA2NCBLaUIgYnVmZmVyIGZvciB0aGUgcmFuZ2UgZW5jb2RlciArIGEgbGl0dGxlIGV4dHJhICsgTFpNQUVuY29kZXIKKyAgICAgICAgaW50IGRpY3RTaXplID0gb3B0aW9ucy5nZXREaWN0U2l6ZSgpOworICAgICAgICBpbnQgZXh0cmFTaXplQmVmb3JlID0gZ2V0RXh0cmFTaXplQmVmb3JlKGRpY3RTaXplKTsKKyAgICAgICAgcmV0dXJuIDcwICsgTFpNQUVuY29kZXIuZ2V0TWVtb3J5VXNhZ2Uob3B0aW9ucy5nZXRNb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RTaXplLCBleHRyYVNpemVCZWZvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0TWF0Y2hGaW5kZXIoKSk7CisgICAgfQorCisgICAgTFpNQTJPdXRwdXRTdHJlYW0oRmluaXNoYWJsZU91dHB1dFN0cmVhbSBvdXQsIExaTUEyT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgIGlmIChvdXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgICAgICBvdXREYXRhID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKKyAgICAgICAgcmMgPSBuZXcgUmFuZ2VFbmNvZGVyKENPTVBSRVNTRURfU0laRV9NQVgpOworCisgICAgICAgIGludCBkaWN0U2l6ZSA9IG9wdGlvbnMuZ2V0RGljdFNpemUoKTsKKyAgICAgICAgaW50IGV4dHJhU2l6ZUJlZm9yZSA9IGdldEV4dHJhU2l6ZUJlZm9yZShkaWN0U2l6ZSk7CisgICAgICAgIGx6bWEgPSBMWk1BRW5jb2Rlci5nZXRJbnN0YW5jZShyYywKKyAgICAgICAgICAgICAgICBvcHRpb25zLmdldExjKCksIG9wdGlvbnMuZ2V0THAoKSwgb3B0aW9ucy5nZXRQYigpLAorICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0TW9kZSgpLAorICAgICAgICAgICAgICAgIGRpY3RTaXplLCBleHRyYVNpemVCZWZvcmUsIG9wdGlvbnMuZ2V0TmljZUxlbigpLAorICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0TWF0Y2hGaW5kZXIoKSwgb3B0aW9ucy5nZXREZXB0aExpbWl0KCkpOworCisgICAgICAgIGx6ID0gbHptYS5nZXRMWkVuY29kZXIoKTsKKworICAgICAgICBieXRlW10gcHJlc2V0RGljdCA9IG9wdGlvbnMuZ2V0UHJlc2V0RGljdCgpOworICAgICAgICBpZiAocHJlc2V0RGljdCAhPSBudWxsICYmIHByZXNldERpY3QubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgbHouc2V0UHJlc2V0RGljdChkaWN0U2l6ZSwgcHJlc2V0RGljdCk7CisgICAgICAgICAgICBkaWN0UmVzZXROZWVkZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3BzID0gKG9wdGlvbnMuZ2V0UGIoKSAqIDUgKyBvcHRpb25zLmdldExwKCkpICogOSArIG9wdGlvbnMuZ2V0TGMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVtcEJ1ZlswXSA9IChieXRlKWI7CisgICAgICAgIHdyaXRlKHRlbXBCdWYsIDAsIDEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvZmYgPCAwIHx8IGxlbiA8IDAgfHwgb2ZmICsgbGVuIDwgMCB8fCBvZmYgKyBsZW4gPiBidWYubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisKKyAgICAgICAgaWYgKGZpbmlzaGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IFhaSU9FeGNlcHRpb24oIlN0cmVhbSBmaW5pc2hlZCBvciBjbG9zZWQiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgdXNlZCA9IGx6LmZpbGxXaW5kb3coYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICAgICAgb2ZmICs9IHVzZWQ7CisgICAgICAgICAgICAgICAgbGVuIC09IHVzZWQ7CisgICAgICAgICAgICAgICAgcGVuZGluZ1NpemUgKz0gdXNlZDsKKworICAgICAgICAgICAgICAgIGlmIChsem1hLmVuY29kZUZvckxaTUEyKCkpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlQ2h1bmsoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVDaHVuaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBjb21wcmVzc2VkU2l6ZSA9IHJjLmZpbmlzaCgpOworICAgICAgICBpbnQgdW5jb21wcmVzc2VkU2l6ZSA9IGx6bWEuZ2V0VW5jb21wcmVzc2VkU2l6ZSgpOworCisgICAgICAgIGFzc2VydCBjb21wcmVzc2VkU2l6ZSA+IDAgOiBjb21wcmVzc2VkU2l6ZTsKKyAgICAgICAgYXNzZXJ0IHVuY29tcHJlc3NlZFNpemUgPiAwIDogdW5jb21wcmVzc2VkU2l6ZTsKKworICAgICAgICAvLyArMiBiZWNhdXNlIHRoZSBoZWFkZXIgb2YgYSBjb21wcmVzc2VkIGNodW5rIGlzIDIgYnl0ZXMKKyAgICAgICAgLy8gYmlnZ2VyIHRoYW4gdGhlIGhlYWRlciBvZiBhbiB1bmNvbXByZXNzZWQgY2h1bmsuCisgICAgICAgIGlmIChjb21wcmVzc2VkU2l6ZSArIDIgPCB1bmNvbXByZXNzZWRTaXplKSB7CisgICAgICAgICAgICB3cml0ZUxaTUEodW5jb21wcmVzc2VkU2l6ZSwgY29tcHJlc3NlZFNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbHptYS5yZXNldCgpOworICAgICAgICAgICAgdW5jb21wcmVzc2VkU2l6ZSA9IGx6bWEuZ2V0VW5jb21wcmVzc2VkU2l6ZSgpOworICAgICAgICAgICAgYXNzZXJ0IHVuY29tcHJlc3NlZFNpemUgPiAwIDogdW5jb21wcmVzc2VkU2l6ZTsKKyAgICAgICAgICAgIHdyaXRlVW5jb21wcmVzc2VkKHVuY29tcHJlc3NlZFNpemUpOworICAgICAgICB9CisKKyAgICAgICAgcGVuZGluZ1NpemUgLT0gdW5jb21wcmVzc2VkU2l6ZTsKKyAgICAgICAgbHptYS5yZXNldFVuY29tcHJlc3NlZFNpemUoKTsKKyAgICAgICAgcmMucmVzZXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVMWk1BKGludCB1bmNvbXByZXNzZWRTaXplLCBpbnQgY29tcHJlc3NlZFNpemUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgY29udHJvbDsKKworICAgICAgICBpZiAocHJvcHNOZWVkZWQpIHsKKyAgICAgICAgICAgIGlmIChkaWN0UmVzZXROZWVkZWQpCisgICAgICAgICAgICAgICAgY29udHJvbCA9IDB4ODAgKyAoMyA8PCA1KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb250cm9sID0gMHg4MCArICgyIDw8IDUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHN0YXRlUmVzZXROZWVkZWQpCisgICAgICAgICAgICAgICAgY29udHJvbCA9IDB4ODAgKyAoMSA8PCA1KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjb250cm9sID0gMHg4MDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRyb2wgfD0gKHVuY29tcHJlc3NlZFNpemUgLSAxKSA+Pj4gMTY7CisgICAgICAgIG91dERhdGEud3JpdGVCeXRlKGNvbnRyb2wpOworCisgICAgICAgIG91dERhdGEud3JpdGVTaG9ydCh1bmNvbXByZXNzZWRTaXplIC0gMSk7CisgICAgICAgIG91dERhdGEud3JpdGVTaG9ydChjb21wcmVzc2VkU2l6ZSAtIDEpOworCisgICAgICAgIGlmIChwcm9wc05lZWRlZCkKKyAgICAgICAgICAgIG91dERhdGEud3JpdGVCeXRlKHByb3BzKTsKKworICAgICAgICByYy53cml0ZShvdXQpOworCisgICAgICAgIHByb3BzTmVlZGVkID0gZmFsc2U7CisgICAgICAgIHN0YXRlUmVzZXROZWVkZWQgPSBmYWxzZTsKKyAgICAgICAgZGljdFJlc2V0TmVlZGVkID0gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlVW5jb21wcmVzc2VkKGludCB1bmNvbXByZXNzZWRTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3aGlsZSAodW5jb21wcmVzc2VkU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGludCBjaHVua1NpemUgPSBNYXRoLm1pbih1bmNvbXByZXNzZWRTaXplLCBDT01QUkVTU0VEX1NJWkVfTUFYKTsKKyAgICAgICAgICAgIG91dERhdGEud3JpdGVCeXRlKGRpY3RSZXNldE5lZWRlZCA/IDB4MDEgOiAweDAyKTsKKyAgICAgICAgICAgIG91dERhdGEud3JpdGVTaG9ydChjaHVua1NpemUgLSAxKTsKKyAgICAgICAgICAgIGx6LmNvcHlVbmNvbXByZXNzZWQob3V0LCB1bmNvbXByZXNzZWRTaXplLCBjaHVua1NpemUpOworICAgICAgICAgICAgdW5jb21wcmVzc2VkU2l6ZSAtPSBjaHVua1NpemU7CisgICAgICAgICAgICBkaWN0UmVzZXROZWVkZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlUmVzZXROZWVkZWQgPSB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZUVuZE1hcmtlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydCAhZmluaXNoZWQ7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworCisgICAgICAgIGx6LnNldEZpbmlzaGluZygpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAocGVuZGluZ1NpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgbHptYS5lbmNvZGVGb3JMWk1BMigpOworICAgICAgICAgICAgICAgIHdyaXRlQ2h1bmsoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LndyaXRlKDB4MDApOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKworICAgICAgICBpZiAoZmluaXNoZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgWFpJT0V4Y2VwdGlvbigiU3RyZWFtIGZpbmlzaGVkIG9yIGNsb3NlZCIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsei5zZXRGbHVzaGluZygpOworCisgICAgICAgICAgICB3aGlsZSAocGVuZGluZ1NpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgbHptYS5lbmNvZGVGb3JMWk1BMigpOworICAgICAgICAgICAgICAgIHdyaXRlQ2h1bmsoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFmaW5pc2hlZCkgeworICAgICAgICAgICAgd3JpdGVFbmRNYXJrZXIoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQuZmluaXNoKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFmaW5pc2hlZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlRW5kTWFya2VyKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0xaTUFJbnB1dFN0cmVhbS5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L0xaTUFJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYmQyNjEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovTFpNQUlucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw1NjkgQEAKKy8qCisgKiBMWk1BSW5wdXRTdHJlYW0KKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLnR1a2FhbmkueHoubHouTFpEZWNvZGVyOworaW1wb3J0IG9yZy50dWthYW5pLnh6LnJhbmdlY29kZXIuUmFuZ2VEZWNvZGVyRnJvbVN0cmVhbTsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5sem1hLkxaTUFEZWNvZGVyOworCisvKioKKyAqIERlY29tcHJlc3NlcyBsZWdhY3kgLmx6bWEgZmlsZXMgYW5kIHJhdyBMWk1BIHN0cmVhbXMgKG5vIC5sem1hIGhlYWRlcikuCisgKiA8cD4KKyAqIDxiPklNUE9SVEFOVDo8L2I+IEluIGNvbnRyYXN0IHRvIG90aGVyIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlLCB0aGlzIGNsYXNzCisgKiByZWFkcyBkYXRhIGZyb20gaXRzIGlucHV0IHN0cmVhbSBvbmUgYnl0ZSBhdCBhIHRpbWUuIElmIHRoZSBpbnB1dCBzdHJlYW0KKyAqIGlzIGZvciBleGFtcGxlIHtAbGluayBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbX0sIHdyYXBwaW5nIGl0IGludG8KKyAqIHtAbGluayBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW19IHRlbmRzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYSBsb3QuCisgKiBUaGlzIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGRvbmUgYnkgdGhpcyBjbGFzcyBiZWNhdXNlIHRoZXJlIG1heSBiZSB1c2UKKyAqIGNhc2VzIHdoZXJlIGl0IGlzIGRlc2lyZWQgdGhhdCB0aGlzIGNsYXNzIHdvbid0IHJlYWQgYW55IGJ5dGVzIHBhc3QKKyAqIHRoZSBlbmQgb2YgdGhlIExaTUEgc3RyZWFtLgorICogPHA+CisgKiBFdmVuIHdoZW4gdXNpbmcgPGNvZGU+QnVmZmVyZWRJbnB1dFN0cmVhbTwvY29kZT4sIHRoZSBwZXJmb3JtYW5jZSB0ZW5kcworICogdG8gYmUgd29yc2UgKG1heWJlIDEwLTIwJm5ic3A7JSBzbG93ZXIpIHRoYW4gd2l0aCB7QGxpbmsgTFpNQTJJbnB1dFN0cmVhbX0KKyAqIG9yIHtAbGluayBYWklucHV0U3RyZWFtfSAod2hlbiB0aGUgLnh6IGZpbGUgY29udGFpbnMgTFpNQTItY29tcHJlc3NlZCBkYXRhKS4KKyAqCisgKiBAc2luY2UgMS40CisgKi8KK3B1YmxpYyBjbGFzcyBMWk1BSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisgICAgLyoqCisgICAgICogTGFyZ2VzdCBkaWN0aW9uYXJ5IHNpemUgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICogPHA+CisgICAgICogTFpNQSBhbGxvd3MgZGljdGlvbmFyaWVzIHVwIHRvIG9uZSBieXRlIGxlc3MgdGhhbiA0IEdpQi4gVGhpcworICAgICAqIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgMTYgYnl0ZXMgbGVzcyB0aGFuIDIgR2lCLiBUaGlzCisgICAgICogbGltaXRhdGlvbiBpcyBkdWUgdG8gSmF2YSB1c2luZyBzaWduZWQgMzItYml0IGludGVnZXJzIGZvciBhcnJheQorICAgICAqIGluZGV4aW5nLiBUaGUgbGltaXRhdGlvbiBzaG91bGRuJ3QgbWF0dGVyIG11Y2ggaW4gcHJhY3RpY2Ugc2luY2Ugc28KKyAgICAgKiBodWdlIGRpY3Rpb25hcmllcyBhcmUgbm90IG5vcm1hbGx5IHVzZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElDVF9TSVpFX01BWCA9IEludGVnZXIuTUFYX1ZBTFVFICYgfjE1OworCisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbjsKKyAgICBwcml2YXRlIExaRGVjb2RlciBsejsKKyAgICBwcml2YXRlIFJhbmdlRGVjb2RlckZyb21TdHJlYW0gcmM7CisgICAgcHJpdmF0ZSBMWk1BRGVjb2RlciBsem1hOworCisgICAgcHJpdmF0ZSBib29sZWFuIGVuZFJlYWNoZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHRlbXBCdWYgPSBuZXcgYnl0ZVsxXTsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgbGVmdCB0byBiZSBkZWNvbXByZXNzZWQsIG9yIC0xIGlmCisgICAgICogdGhlIGVuZCBtYXJrZXIgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgcmVtYWluaW5nU2l6ZTsKKworICAgIHByaXZhdGUgSU9FeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEdldHMgYXBwcm94aW1hdGUgZGVjb21wcmVzc29yIG1lbW9yeSByZXF1aXJlbWVudHMgYXMga2liaWJ5dGVzIGZvcgorICAgICAqIHRoZSBnaXZlbiBkaWN0aW9uYXJ5IHNpemUgYW5kIExaTUEgcHJvcGVydGllcyBieXRlIChsYywgbHAsIGFuZCBwYikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgZGljdFNpemUgICAgTFpNQSBkaWN0aW9uYXJ5IHNpemUgYXMgYnl0ZXMsIHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzxjb2RlPjA8L2NvZGU+LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5ESUNUX1NJWkVfTUFYPC9jb2RlPl0KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBwcm9wc0J5dGUgICBMWk1BIHByb3BlcnRpZXMgYnl0ZSB0aGF0IGVuY29kZXMgdGhlIHZhbHVlcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBsYywgbHAsIGFuZCBwYgorICAgICAqCisgICAgICogQHJldHVybiAgICAgIGFwcHJveGltYXRlIG1lbW9yeSByZXF1aXJlbWVudHMgYXMga2liaWJ5dGVzIChLaUIpCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIDxjb2RlPmRpY3RTaXplPC9jb2RlPiBpcyBvdXRzaWRlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByYW5nZSBbPGNvZGU+MDwvY29kZT4sCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkRJQ1RfU0laRV9NQVg8L2NvZGU+XQorICAgICAqCisgICAgICogQHRocm93cyAgICAgIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIDxjb2RlPnByb3BzQnl0ZTwvY29kZT4gaXMgaW52YWxpZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE1lbW9yeVVzYWdlKGludCBkaWN0U2l6ZSwgYnl0ZSBwcm9wc0J5dGUpCisgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uLCBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkaWN0U2l6ZSA8IDAgfHwgZGljdFNpemUgPiBESUNUX1NJWkVfTUFYKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkxaTUEgZGljdGlvbmFyeSBpcyB0b28gYmlnIGZvciB0aGlzIGltcGxlbWVudGF0aW9uIik7CisKKyAgICAgICAgaW50IHByb3BzID0gcHJvcHNCeXRlICYgMHhGRjsKKyAgICAgICAgaWYgKHByb3BzID4gKDQgKiA1ICsgNCkgKiA5ICsgOCkKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigiSW52YWxpZCBMWk1BIHByb3BlcnRpZXMgYnl0ZSIpOworCisgICAgICAgIHByb3BzICU9IDkgKiA1OworICAgICAgICBpbnQgbHAgPSBwcm9wcyAvIDk7CisgICAgICAgIGludCBsYyA9IHByb3BzIC0gbHAgKiA5OworCisgICAgICAgIHJldHVybiBnZXRNZW1vcnlVc2FnZShkaWN0U2l6ZSwgbGMsIGxwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFwcHJveGltYXRlIGRlY29tcHJlc3NvciBtZW1vcnkgcmVxdWlyZW1lbnRzIGFzIGtpYmlieXRlcyBmb3IKKyAgICAgKiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBzaXplLCBsYywgYW5kIGxwLiBOb3RlIHRoYXQgcGIgaXNuJ3QgbmVlZGVkLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGRpY3RTaXplICAgIExaTUEgZGljdGlvbmFyeSBzaXplIGFzIGJ5dGVzLCBtdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByYW5nZSBbPGNvZGU+MDwvY29kZT4sCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkRJQ1RfU0laRV9NQVg8L2NvZGU+XQorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGxjICAgICAgICAgIG51bWJlciBvZiBsaXRlcmFsIGNvbnRleHQgYml0cywgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsIDhdCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgbHAgICAgICAgICAgbnVtYmVyIG9mIGxpdGVyYWwgcG9zaXRpb24gYml0cywgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsIDRdCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgYXBwcm94aW1hdGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhcyBraWJpYnl0ZXMgKEtpQikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRNZW1vcnlVc2FnZShpbnQgZGljdFNpemUsIGludCBsYywgaW50IGxwKSB7CisgICAgICAgIGlmIChsYyA8IDAgfHwgbGMgPiA4IHx8IGxwIDwgMCB8fCBscCA+IDQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGxjIG9yIGxwIik7CisKKyAgICAgICAgLy8gUHJvYmFiaWxpdHkgdmFyaWFibGVzIGhhdmUgdGhlIHR5cGUgInNob3J0Ii4gVGhlcmUgYXJlCisgICAgICAgIC8vIDB4MzAwICg3NjgpIHByb2JhYmlsaXR5IHZhcmlhYmxlcyBpbiBlYWNoIGxpdGVyYWwgc3ViY29kZXIuCisgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgbGl0ZXJhbCBzdWJjb2RlcnMgaXMgMl4obGMgKyBscCkuCisgICAgICAgIC8vCisgICAgICAgIC8vIFJvdWdobHkgMTAgS2lCIGZvciB0aGUgYmFzZSBzdGF0ZSArIExaIGRlY29kZXIncyBkaWN0aW9uYXJ5IGJ1ZmZlcgorICAgICAgICAvLyArIHNpemVvZihzaG9ydCkgKiBudW1iZXIgcHJvYmFiaWxpdHkgdmFyaWFibGVzIHBlciBsaXRlcmFsIHN1YmNvZGVyCisgICAgICAgIC8vICAgKiBudW1iZXIgb2YgbGl0ZXJhbCBzdWJjb2RlcnMKKyAgICAgICAgcmV0dXJuIDEwICsgZ2V0RGljdFNpemUoZGljdFNpemUpIC8gMTAyNAorICAgICAgICAgICAgICAgKyAoKDIgKiAweDMwMCkgPDwgKGxjICsgbHApKSAvIDEwMjQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldERpY3RTaXplKGludCBkaWN0U2l6ZSkgeworICAgICAgICBpZiAoZGljdFNpemUgPCAwIHx8IGRpY3RTaXplID4gRElDVF9TSVpFX01BWCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJMWk1BIGRpY3Rpb25hcnkgaXMgdG9vIGJpZyBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiIpOworCisgICAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB1c2UgYSA0IEtpQiBkaWN0aW9uYXJ5IGlmIHNvbWV0aGluZworICAgICAgICAvLyBzbWFsbGVyIHdhcyByZXF1ZXN0ZWQuIEl0J3MgYSByYXJlIHNpdHVhdGlvbiBhbmQgdGhlIHBlcmZvcm1hbmNlCisgICAgICAgIC8vIGRpZmZlcmVuY2UgaXNuJ3QgaHVnZSwgYW5kIGl0IHN0YXJ0cyB0byBtYXR0ZXIgbW9zdGx5IHdoZW4gdGhlCisgICAgICAgIC8vIGRpY3Rpb25hcnkgaXMganVzdCBhIGZldyBieXRlcy4gQnV0IHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBzcGVjaWFsCisgICAgICAgIC8vIGNhc2Ugb2YgZGljdFNpemUgPT0gMCBhbnl3YXksIHdoaWNoIGlzIGFuIGFsbG93ZWQgdmFsdWUgYnV0IGluCisgICAgICAgIC8vIHByYWN0aWNlIG1lYW5zIG9uZS1ieXRlIGRpY3Rpb25hcnkuCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGUgdGhhdCB1c2luZyBhIGRpY3Rpb25hcnkgYmlnZ2VyIHRoYW4gc3BlY2lmaWVkIGluIHRoZSBoZWFkZXJzCisgICAgICAgIC8vIGNhbiBoaWRlIGVycm9ycyBpZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byBkYXRhIGJleW9uZCB0aGUgb3JpZ2luYWwKKyAgICAgICAgLy8gZGljdGlvbmFyeSBzaXplIGJ1dCBpcyBzdGlsbCB3aXRoaW4gNCBLaUIuCisgICAgICAgIGlmIChkaWN0U2l6ZSA8IDQwOTYpCisgICAgICAgICAgICBkaWN0U2l6ZSA9IDQwOTY7CisKKyAgICAgICAgLy8gUm91bmQgZGljdGlvbmFyeSBzaXplIHVwd2FyZCB0byBhIG11bHRpcGxlIG9mIDE2LiBUaGlzIHdheSBMWk1BCisgICAgICAgIC8vIGNhbiB1c2UgTFpEZWNvZGVyLmdldFBvcygpIGZvciBjYWxjdWxhdGluZyBMWk1BJ3MgcG9zTWFzay4KKyAgICAgICAgcmV0dXJuIChkaWN0U2l6ZSArIDE1KSAmIH4xNTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IC5sem1hIGZpbGUgZm9ybWF0IGRlY29tcHJlc3NvciB3aXRob3V0CisgICAgICogYSBtZW1vcnkgdXNhZ2UgbGltaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgaW4gICAgICAgICAgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggLmx6bWEgZGF0YSBpcyByZWFkOworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBtaWdodCBiZSBhIGdvb2QgaWRlYSB0byB3cmFwIGl0IGluCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkJ1ZmZlcmVkSW5wdXRTdHJlYW08L2NvZGU+LCBzZWUgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgYXQgdGhlIHRvcCBvZiB0aGlzIHBhZ2UKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGlzIGNvcnJ1cHQgb3IgcGVyaGFwcyBub3QgaW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIC5sem1hIGZvcm1hdCBhdCBhbGwKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeSBzaXplIG9yIHVuY29tcHJlc3NlZCBzaXplIGlzIHRvbworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBpcyB0cnVuY2F0ZWQgb3IgcGVyaGFwcyBub3QgaW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIC5sem1hIGZvcm1hdCBhdCBhbGwKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IDxjb2RlPmluPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBMWk1BSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoaW4sIC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IC5sem1hIGZpbGUgZm9ybWF0IGRlY29tcHJlc3NvciB3aXRoIGFuIG9wdGlvbmFsCisgICAgICogbWVtb3J5IHVzYWdlIGxpbWl0LgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGluICAgICAgICAgIGlucHV0IHN0cmVhbSBmcm9tIHdoaWNoIC5sem1hIGRhdGEgaXMgcmVhZDsKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgbWlnaHQgYmUgYSBnb29kIGlkZWEgdG8gd3JhcCBpdCBpbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5CdWZmZXJlZElucHV0U3RyZWFtPC9jb2RlPiwgc2VlIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIGF0IHRoZSB0b3Agb2YgdGhpcyBwYWdlCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgbWVtb3J5TGltaXQgbWVtb3J5IHVzYWdlIGxpbWl0IGluIGtpYmlieXRlcyAoS2lCKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciA8Y29kZT4tMTwvY29kZT4gdG8gaW1wb3NlIG5vCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSB1c2FnZSBsaW1pdAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgaXMgY29ycnVwdCBvciBwZXJoYXBzIG5vdCBpbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgLmx6bWEgZm9ybWF0IGF0IGFsbAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5IHNpemUgb3IgdW5jb21wcmVzc2VkIHNpemUgaXMgdG9vCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpZyBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIE1lbW9yeUxpbWl0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSB1c2FnZSBsaW1pdCB3YXMgZXhjZWVkZWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBpcyB0cnVuY2F0ZWQgb3IgcGVyaGFwcyBub3QgaW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIC5sem1hIGZvcm1hdCBhdCBhbGwKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IDxjb2RlPmluPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBMWk1BSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGludCBtZW1vcnlMaW1pdCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbSBpbkRhdGEgPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluKTsKKworICAgICAgICAvLyBQcm9wZXJ0aWVzIGJ5dGUgKGxjLCBscCwgYW5kIHBiKQorICAgICAgICBieXRlIHByb3BzQnl0ZSA9IGluRGF0YS5yZWFkQnl0ZSgpOworCisgICAgICAgIC8vIERpY3Rpb25hcnkgc2l6ZSBpcyBhbiB1bnNpZ25lZCAzMi1iaXQgbGl0dGxlIGVuZGlhbiBpbnRlZ2VyLgorICAgICAgICBpbnQgZGljdFNpemUgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkKKyAgICAgICAgICAgIGRpY3RTaXplIHw9IGluRGF0YS5yZWFkVW5zaWduZWRCeXRlKCkgPDwgKDggKiBpKTsKKworICAgICAgICAvLyBVbmNvbXByZXNzZWQgc2l6ZSBpcyBhbiB1bnNpZ25lZCA2NC1iaXQgbGl0dGxlIGVuZGlhbiBpbnRlZ2VyLgorICAgICAgICAvLyBUaGUgbWF4aW11bSA2NC1iaXQgdmFsdWUgaXMgYSBzcGVjaWFsIGNhc2UgKGJlY29tZXMgLTEgaGVyZSkKKyAgICAgICAgLy8gd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGVuZCBtYXJrZXIgaXMgdXNlZCBpbnN0ZWFkIG9mIGtub3dpbmcKKyAgICAgICAgLy8gdGhlIHVuY29tcHJlc3NlZCBzaXplIGJlZm9yZWhhbmQuCisgICAgICAgIGxvbmcgdW5jb21wU2l6ZSA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgKytpKQorICAgICAgICAgICAgdW5jb21wU2l6ZSB8PSAobG9uZylpbkRhdGEucmVhZFVuc2lnbmVkQnl0ZSgpIDw8ICg4ICogaSk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIG1lbW9yeSB1c2FnZSBsaW1pdC4KKyAgICAgICAgaW50IG1lbW9yeU5lZWRlZCA9IGdldE1lbW9yeVVzYWdlKGRpY3RTaXplLCBwcm9wc0J5dGUpOworICAgICAgICBpZiAobWVtb3J5TGltaXQgIT0gLTEgJiYgbWVtb3J5TmVlZGVkID4gbWVtb3J5TGltaXQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWVtb3J5TGltaXRFeGNlcHRpb24obWVtb3J5TmVlZGVkLCBtZW1vcnlMaW1pdCk7CisKKyAgICAgICAgaW5pdGlhbGl6ZShpbiwgdW5jb21wU2l6ZSwgcHJvcHNCeXRlLCBkaWN0U2l6ZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnB1dCBzdHJlYW0gdGhhdCBkZWNvbXByZXNzZXMgcmF3IExaTUEgZGF0YSAobm8gLmx6bWEKKyAgICAgKiBoZWFkZXIpIGZyb20gPGNvZGU+aW48L2NvZGU+LgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsZXIgbmVlZHMgdG8ga25vdyBpZiB0aGUgImVuZCBvZiBwYXlsb2FkIG1hcmtlciAoRU9QTSkiIGFsaWFzCisgICAgICogImVuZCBvZiBzdHJlYW0gbWFya2VyIChFT1MgbWFya2VyKSIgYWxpYXMgImVuZCBtYXJrZXIiIHByZXNlbnQuCisgICAgICogSWYgdGhlIGVuZCBtYXJrZXIgaXNuJ3QgdXNlZCwgdGhlIGNhbGxlciBtdXN0IGtub3cgdGhlIGV4YWN0CisgICAgICogdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIHN0cmVhbS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGVyIGFsc28gbmVlZHMgdG8gcHJvdmlkZSB0aGUgTFpNQSBwcm9wZXJ0aWVzIGJ5dGUgdGhhdCBlbmNvZGVzCisgICAgICogdGhlIG51bWJlciBvZiBsaXRlcmFsIGNvbnRleHQgYml0cyAobGMpLCBsaXRlcmFsIHBvc2l0aW9uIGJpdHMgKGxwKSwKKyAgICAgKiBhbmQgcG9zaXRpb24gYml0cyAocGIpLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkaWN0aW9uYXJ5IHNpemUgdXNlZCB3aGVuIGNvbXByZXNzaW5nIGlzIGFsc28gbmVlZGVkLiBTcGVjaWZ5aW5nCisgICAgICogYSB0b28gc21hbGwgZGljdGlvbmFyeSBzaXplIHdpbGwgcHJldmVudCBkZWNvbXByZXNzaW5nIHRoZSBzdHJlYW0uCisgICAgICogU3BlY2lmeWluZyBhIHRvbyBiaWcgZGljdGlvbmFyeSBpcyB3YXN0ZSBvZiBtZW1vcnkgYnV0IGRlY29tcHJlc3Npb24KKyAgICAgKiB3aWxsIHdvcmsuCisgICAgICogPHA+CisgICAgICogVGhlcmUgaXMgbm8gbmVlZCB0byBzcGVjaWZ5IGEgZGljdGlvbmFyeSBiaWdnZXIgdGhhbgorICAgICAqIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgZGF0YSBldmVuIGlmIGEgYmlnZ2VyIGRpY3Rpb25hcnkKKyAgICAgKiB3YXMgdXNlZCB3aGVuIGNvbXByZXNzaW5nLiBJZiB5b3Uga25vdyB0aGUgdW5jb21wcmVzc2VkIHNpemUKKyAgICAgKiBvZiB0aGUgZGF0YSwgdGhpcyBtaWdodCBhbGxvdyBzYXZpbmcgc29tZSBtZW1vcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgaW4gICAgICAgICAgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggY29tcHJlc3NlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIHJlYWQKKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICB1bmNvbXBTaXplICB1bmNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgTFpNQSBzdHJlYW0gb3IgLTEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGVuZCBtYXJrZXIgaXMgdXNlZCBpbiB0aGUgTFpNQSBzdHJlYW0KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBwcm9wc0J5dGUgICBMWk1BIHByb3BlcnRpZXMgYnl0ZSB0aGF0IGhhcyB0aGUgZW5jb2RlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgZm9yIGxpdGVyYWwgY29udGV4dCBiaXRzIChsYyksIGxpdGVyYWwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYml0cyAobHApLCBhbmQgcG9zaXRpb24gYml0cyAocGIpCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgZGljdFNpemUgICAgZGljdGlvbmFyeSBzaXplIGFzIGJ5dGVzLCBtdXN0IGJlIGluIHRoZSByYW5nZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBbPGNvZGU+MDwvY29kZT4sIDxjb2RlPkRJQ1RfU0laRV9NQVg8L2NvZGU+XQorICAgICAqCisgICAgICogQHRocm93cyAgICAgIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIDxjb2RlPnByb3BzQnl0ZTwvY29kZT4gaXMgaW52YWxpZCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlyc3QgaW5wdXQgYnl0ZSBpcyBub3QgMHgwMAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5IHNpemUgb3IgdW5jb21wcmVzc2VkIHNpemUgaXMgdG9vCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpZyBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTFpNQUlucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBsb25nIHVuY29tcFNpemUsIGJ5dGUgcHJvcHNCeXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpY3RTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbml0aWFsaXplKGluLCB1bmNvbXBTaXplLCBwcm9wc0J5dGUsIGRpY3RTaXplLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGlucHV0IHN0cmVhbSB0aGF0IGRlY29tcHJlc3NlcyByYXcgTFpNQSBkYXRhIChubyAubHptYQorICAgICAqIGhlYWRlcikgZnJvbSA8Y29kZT5pbjwvY29kZT4gb3B0aW9uYWxseSB3aXRoIGEgcHJlc2V0IGRpY3Rpb25hcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgaW4gICAgICAgICAgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggTFpNQS1jb21wcmVzc2VkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgcmVhZAorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIHVuY29tcFNpemUgIHVuY29tcHJlc3NlZCBzaXplIG9mIHRoZSBMWk1BIHN0cmVhbSBvciAtMQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgZW5kIG1hcmtlciBpcyB1c2VkIGluIHRoZSBMWk1BIHN0cmVhbQorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIHByb3BzQnl0ZSAgIExaTUEgcHJvcGVydGllcyBieXRlIHRoYXQgaGFzIHRoZSBlbmNvZGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBmb3IgbGl0ZXJhbCBjb250ZXh0IGJpdHMgKGxjKSwgbGl0ZXJhbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBiaXRzIChscCksIGFuZCBwb3NpdGlvbiBiaXRzIChwYikKKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBkaWN0U2l6ZSAgICBkaWN0aW9uYXJ5IHNpemUgYXMgYnl0ZXMsIG11c3QgYmUgaW4gdGhlIHJhbmdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFs8Y29kZT4wPC9jb2RlPiwgPGNvZGU+RElDVF9TSVpFX01BWDwvY29kZT5dCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgcHJlc2V0RGljdCAgcHJlc2V0IGRpY3Rpb25hcnkgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdXNlIG5vIHByZXNldCBkaWN0aW9uYXJ5CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgPGNvZGU+cHJvcHNCeXRlPC9jb2RlPiBpcyBpbnZhbGlkIG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBpbnB1dCBieXRlIGlzIG5vdCAweDAwCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnkgc2l6ZSBvciB1bmNvbXByZXNzZWQgc2l6ZSBpcyB0b28KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnIGZvciB0aGlzIGltcGxlbWVudGF0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgRU9GRXhjZXB0aW9uIGZpbGUgaXMgdHJ1bmNhdGVkIG9yIGNvcnJ1cHQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IDxjb2RlPmluPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBMWk1BSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGxvbmcgdW5jb21wU2l6ZSwgYnl0ZSBwcm9wc0J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGljdFNpemUsIGJ5dGVbXSBwcmVzZXREaWN0KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhbGl6ZShpbiwgdW5jb21wU2l6ZSwgcHJvcHNCeXRlLCBkaWN0U2l6ZSwgcHJlc2V0RGljdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnB1dCBzdHJlYW0gdGhhdCBkZWNvbXByZXNzZXMgcmF3IExaTUEgZGF0YSAobm8gLmx6bWEKKyAgICAgKiBoZWFkZXIpIGZyb20gPGNvZGU+aW48L2NvZGU+IG9wdGlvbmFsbHkgd2l0aCBhIHByZXNldCBkaWN0aW9uYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGluICAgICAgICAgIGlucHV0IHN0cmVhbSBmcm9tIHdoaWNoIExaTUEtY29tcHJlc3NlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIHJlYWQKKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICB1bmNvbXBTaXplICB1bmNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgTFpNQSBzdHJlYW0gb3IgLTEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGVuZCBtYXJrZXIgaXMgdXNlZCBpbiB0aGUgTFpNQSBzdHJlYW0KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBsYyAgICAgICAgICBudW1iZXIgb2YgbGl0ZXJhbCBjb250ZXh0IGJpdHMsIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJhbmdlIFswLCA4XQorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGxwICAgICAgICAgIG51bWJlciBvZiBsaXRlcmFsIHBvc2l0aW9uIGJpdHMsIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJhbmdlIFswLCA0XQorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIHBiICAgICAgICAgIG51bWJlciBwb3NpdGlvbiBiaXRzLCBtdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByYW5nZSBbMCwgNF0KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBkaWN0U2l6ZSAgICBkaWN0aW9uYXJ5IHNpemUgYXMgYnl0ZXMsIG11c3QgYmUgaW4gdGhlIHJhbmdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFs8Y29kZT4wPC9jb2RlPiwgPGNvZGU+RElDVF9TSVpFX01BWDwvY29kZT5dCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgcHJlc2V0RGljdCAgcHJlc2V0IGRpY3Rpb25hcnkgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdXNlIG5vIHByZXNldCBkaWN0aW9uYXJ5CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGZpcnN0IGlucHV0IGJ5dGUgaXMgbm90IDB4MDAKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBFT0ZFeGNlcHRpb24gZmlsZSBpcyB0cnVuY2F0ZWQgb3IgY29ycnVwdAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYnkgPGNvZGU+aW48L2NvZGU+CisgICAgICovCisgICAgcHVibGljIExaTUFJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgbG9uZyB1bmNvbXBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxjLCBpbnQgbHAsIGludCBwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaWN0U2l6ZSwgYnl0ZVtdIHByZXNldERpY3QpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbml0aWFsaXplKGluLCB1bmNvbXBTaXplLCBsYywgbHAsIHBiLCBkaWN0U2l6ZSwgcHJlc2V0RGljdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoSW5wdXRTdHJlYW0gaW4sIGxvbmcgdW5jb21wU2l6ZSwgYnl0ZSBwcm9wc0J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpY3RTaXplLCBieXRlW10gcHJlc2V0RGljdCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSBzaW5jZSB0aGUgb3RoZXIgImluaXRpYWxpemUiIHRocm93cworICAgICAgICAvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdW5jb21wU2l6ZSA8IC0xLgorICAgICAgICBpZiAodW5jb21wU2l6ZSA8IC0xKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuY29tcHJlc3NlZCBzaXplIGlzIHRvbyBiaWciKTsKKworICAgICAgICAvLyBEZWNvZGUgdGhlIHByb3BlcnRpZXMgYnl0ZS4gSW4gY29udHJhc3QgdG8gTFpNQTIsIHRoZXJlIGlzIG5vCisgICAgICAgIC8vIGxpbWl0IG9mIGxjICsgbHAgPD0gNC4KKyAgICAgICAgaW50IHByb3BzID0gcHJvcHNCeXRlICYgMHhGRjsKKyAgICAgICAgaWYgKHByb3BzID4gKDQgKiA1ICsgNCkgKiA5ICsgOCkKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigiSW52YWxpZCBMWk1BIHByb3BlcnRpZXMgYnl0ZSIpOworCisgICAgICAgIGludCBwYiA9IHByb3BzIC8gKDkgKiA1KTsKKyAgICAgICAgcHJvcHMgLT0gcGIgKiA5ICogNTsKKyAgICAgICAgaW50IGxwID0gcHJvcHMgLyA5OworICAgICAgICBpbnQgbGMgPSBwcm9wcyAtIGxwICogOTsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZGljdGlvbmFyeSBzaXplIHNpbmNlIHRoZSBvdGhlciAiaW5pdGlhbGl6ZSIgdGhyb3dzCisgICAgICAgIC8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBkaWN0U2l6ZSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAgICBpZiAoZGljdFNpemUgPCAwIHx8IGRpY3RTaXplID4gRElDVF9TSVpFX01BWCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJMWk1BIGRpY3Rpb25hcnkgaXMgdG9vIGJpZyBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiIpOworCisgICAgICAgIGluaXRpYWxpemUoaW4sIHVuY29tcFNpemUsIGxjLCBscCwgcGIsIGRpY3RTaXplLCBwcmVzZXREaWN0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShJbnB1dFN0cmVhbSBpbiwgbG9uZyB1bmNvbXBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYywgaW50IGxwLCBpbnQgcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpY3RTaXplLCBieXRlW10gcHJlc2V0RGljdCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIGdldERpY3RTaXplIHZhbGlkYXRlcyBkaWN0U2l6ZSBhbmQgZ2l2ZXMgYSBtZXNzYWdlIGluCisgICAgICAgIC8vIHRoZSBleGNlcHRpb24gdG9vLCBzbyBza2lwIHZhbGlkYXRpbmcgZGljdFNpemUgaGVyZS4KKyAgICAgICAgaWYgKHVuY29tcFNpemUgPCAtMSB8fCBsYyA8IDAgfHwgbGMgPiA4IHx8IGxwIDwgMCB8fCBscCA+IDQKKyAgICAgICAgICAgICAgICB8fCBwYiA8IDAgfHwgcGIgPiA0KQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIHRoaXMuaW4gPSBpbjsKKworICAgICAgICAvLyBJZiB1bmNvbXByZXNzZWQgc2l6ZSBpcyBrbm93biwgdXNlIGl0IHRvIGF2b2lkIHdhc3RpbmcgbWVtb3J5IGZvcgorICAgICAgICAvLyBhIHVzZWxlc3NseSBsYXJnZSBkaWN0aW9uYXJ5IGJ1ZmZlci4KKyAgICAgICAgZGljdFNpemUgPSBnZXREaWN0U2l6ZShkaWN0U2l6ZSk7CisgICAgICAgIGlmICh1bmNvbXBTaXplID49IDAgJiYgZGljdFNpemUgPiB1bmNvbXBTaXplKQorICAgICAgICAgICAgZGljdFNpemUgPSBnZXREaWN0U2l6ZSgoaW50KXVuY29tcFNpemUpOworCisgICAgICAgIGx6ID0gbmV3IExaRGVjb2RlcihnZXREaWN0U2l6ZShkaWN0U2l6ZSksIHByZXNldERpY3QpOworICAgICAgICByYyA9IG5ldyBSYW5nZURlY29kZXJGcm9tU3RyZWFtKGluKTsKKyAgICAgICAgbHptYSA9IG5ldyBMWk1BRGVjb2RlcihseiwgcmMsIGxjLCBscCwgcGIpOworICAgICAgICByZW1haW5pbmdTaXplID0gdW5jb21wU2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvbXByZXNzZXMgdGhlIG5leHQgYnl0ZSBmcm9tIHRoaXMgaW5wdXQgc3RyZWFtLgorICAgICAqIDxwPgorICAgICAqIFJlYWRpbmcgbG90cyBvZiBkYXRhIHdpdGggPGNvZGU+cmVhZCgpPC9jb2RlPiBmcm9tIHRoaXMgaW5wdXQgc3RyZWFtCisgICAgICogbWF5IGJlIGluZWZmaWNpZW50LiBXcmFwIGl0IGluIDxjb2RlPmphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTwvY29kZT4KKyAgICAgKiBpZiB5b3UgbmVlZCB0byByZWFkIGxvdHMgb2YgZGF0YSBvbmUgYnl0ZSBhdCBhIHRpbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgZGVjb21wcmVzc2VkIGJ5dGUsIG9yIDxjb2RlPi0xPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIHN0cmVhbQorICAgICAqCisgICAgICogQHRocm93cyAgICAgIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpJT0V4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkIGlucHV0IGlzIHRydW5jYXRlZCBvciBjb3JydXB0CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBieSA8Y29kZT5pbjwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZCh0ZW1wQnVmLCAwLCAxKSA9PSAtMSA/IC0xIDogKHRlbXBCdWZbMF0gJiAweEZGKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvbXByZXNzZXMgaW50byBhbiBhcnJheSBvZiBieXRlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiA8Y29kZT5sZW48L2NvZGU+IGlzIHplcm8sIG5vIGJ5dGVzIGFyZSByZWFkIGFuZCA8Y29kZT4wPC9jb2RlPgorICAgICAqIGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhpcyB3aWxsIGJsb2NrIHVudGlsIDxjb2RlPmxlbjwvY29kZT4KKyAgICAgKiBieXRlcyBoYXZlIGJlZW4gZGVjb21wcmVzc2VkLCB0aGUgZW5kIG9mIHRoZSBMWk1BIHN0cmVhbSBpcyByZWFjaGVkLAorICAgICAqIG9yIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgYnVmICAgICAgICAgdGFyZ2V0IGJ1ZmZlciBmb3IgdW5jb21wcmVzc2VkIGRhdGEKKyAgICAgKiBAcGFyYW0gICAgICAgb2ZmICAgICAgICAgc3RhcnQgb2Zmc2V0IGluIDxjb2RlPmJ1ZjwvY29kZT4KKyAgICAgKiBAcGFyYW0gICAgICAgbGVuICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIHRvIHJlYWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgICBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgPGNvZGU+LTE8L2NvZGU+IHRvIGluZGljYXRlCisgICAgICogICAgICAgICAgICAgIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgc3RyZWFtCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24KKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBYWklPRXhjZXB0aW9uIGlmIHRoZSBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgRU9GRXhjZXB0aW9uIGNvbXByZXNzZWQgaW5wdXQgaXMgdHJ1bmNhdGVkIG9yIGNvcnJ1cHQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IDxjb2RlPmluPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAob2ZmIDwgMCB8fCBsZW4gPCAwIHx8IG9mZiArIGxlbiA8IDAgfHwgb2ZmICsgbGVuID4gYnVmLmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisKKyAgICAgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKGluID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgWFpJT0V4Y2VwdGlvbigiU3RyZWFtIGNsb3NlZCIpOworCisgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKworICAgICAgICBpZiAoZW5kUmVhY2hlZCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IHNpemUgPSAwOworCisgICAgICAgICAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIHVuY29tcHJlc3NlZCBzaXplIGlzIGtub3duIGFuZCB0aHVzIG5vIGVuZCBtYXJrZXIgd2lsbAorICAgICAgICAgICAgICAgIC8vIGJlIHByZXNlbnQsIHNldCB0aGUgbGltaXQgc28gdGhhdCB0aGUgdW5jb21wcmVzc2VkIHNpemUKKyAgICAgICAgICAgICAgICAvLyB3b24ndCBiZSBleGNlZWRlZC4KKyAgICAgICAgICAgICAgICBpbnQgY29weVNpemVNYXggPSBsZW47CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1NpemUgPj0gMCAmJiByZW1haW5pbmdTaXplIDwgbGVuKQorICAgICAgICAgICAgICAgICAgICBjb3B5U2l6ZU1heCA9IChpbnQpcmVtYWluaW5nU2l6ZTsKKworICAgICAgICAgICAgICAgIGx6LnNldExpbWl0KGNvcHlTaXplTWF4KTsKKworICAgICAgICAgICAgICAgIC8vIERlY29kZSBpbnRvIHRoZSBkaWN0aW9uYXJ5IGJ1ZmZlci4KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBsem1hLmRlY29kZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcnJ1cHRlZElucHV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGVuZCBtYXJrZXIgaXMgZW5jb2RlZCB3aXRoIGEgTFpNQSBzeW1ib2wgdGhhdAorICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgbWF4aW11bSBtYXRjaCBkaXN0YW5jZS4gVGhpcyBpcyBsYXJnZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiBhbnkgc3VwcG9ydGVkIGRpY3Rpb25hcnkgYW5kIHRodXMgY2F1c2VzCisgICAgICAgICAgICAgICAgICAgIC8vIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uIGZyb20gTFpEZWNvZGVyLnJlcGVhdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1NpemUgIT0gLTEgfHwgIWx6bWEuZW5kTWFya2VyRGV0ZWN0ZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisKKyAgICAgICAgICAgICAgICAgICAgZW5kUmVhY2hlZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGV4Y2VwdGlvbiBtYWtlcyBsem1hLmRlY29kZSgpIG1pc3MgdGhlIGxhc3QgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVjb2RlciBub3JtYWxpemF0aW9uLCBzbyBkbyBpdCBoZXJlLiBUaGlzIG1pZ2h0CisgICAgICAgICAgICAgICAgICAgIC8vIGNhdXNlIGFuIElPRXhjZXB0aW9uIGlmIGl0IG5lZWRzIHRvIHJlYWQgYSBieXRlCisgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgcmMubm9ybWFsaXplKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ29weSBmcm9tIHRoZSBkaWN0aW9uYXJ5IHRvIGJ1Zi4KKyAgICAgICAgICAgICAgICBpbnQgY29waWVkU2l6ZSA9IGx6LmZsdXNoKGJ1Ziwgb2ZmKTsKKyAgICAgICAgICAgICAgICBvZmYgKz0gY29waWVkU2l6ZTsKKyAgICAgICAgICAgICAgICBsZW4gLT0gY29waWVkU2l6ZTsKKyAgICAgICAgICAgICAgICBzaXplICs9IGNvcGllZFNpemU7CisKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nU2l6ZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgdG8gYmUgZGVjb21wcmVzc2VkLgorICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdTaXplIC09IGNvcGllZFNpemU7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCByZW1haW5pbmdTaXplID49IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ1NpemUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZFJlYWNoZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlbmRSZWFjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNraW5nIHRoZXNlIGhlbHBzIGEgbG90IHdoZW4gY2F0Y2hpbmcgY29ycnVwdAorICAgICAgICAgICAgICAgICAgICAvLyBvciB0cnVuY2F0ZWQgLmx6bWEgZmlsZXMuIExaTUEgVXRpbHMgZG9lc24ndCBkbworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmlyc3QgY2hlY2sgYW5kIHRodXMgaXQgYWNjZXB0cyBtYW55IGludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgLy8gZmlsZXMgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGFuZCBYWiBVdGlscyBkb24ndC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyYy5pc0ZpbmlzaGVkKCkgfHwgbHouaGFzUGVuZGluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemUgPT0gMCA/IC0xIDogc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzaXplOworCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzdHJlYW0gYW5kIGNhbGxzIDxjb2RlPmluLmNsb3NlKCk8L2NvZGU+LgorICAgICAqIElmIHRoZSBzdHJlYW0gd2FzIGFscmVhZHkgY2xvc2VkLCB0aGlzIGRvZXMgbm90aGluZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uIGlmIHRocm93biBieSA8Y29kZT5pbi5jbG9zZSgpPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaW4gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L01lbW9yeUxpbWl0RXhjZXB0aW9uLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovTWVtb3J5TGltaXRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDc2NmJkCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L01lbW9yeUxpbWl0RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIE1lbW9yeUxpbWl0RXhjZXB0aW9uCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKKy8qKgorICogVGhyb3duIHdoZW4gdGhlIG1lbW9yeSB1c2FnZSBsaW1pdCBnaXZlbiB0byB0aGUgWFogZGVjb21wcmVzc29yCisgKiB3b3VsZCBiZSBleGNlZWRlZC4KKyAqIDxwPgorICogVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgYW5kIHRoZSBtZW1vcnkgdXNhZ2UgbGltaXQgYXJlCisgKiBpbmNsdWRlZCBpbiB0aGUgZXJyb3IgZGV0YWlsIG1lc3NhZ2UgaW4gaHVtYW4gcmVhZGFibGUgZm9ybWF0LgorICovCitwdWJsaWMgY2xhc3MgTWVtb3J5TGltaXRFeGNlcHRpb24gZXh0ZW5kcyBYWklPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzTDsKKworICAgIHByaXZhdGUgZmluYWwgaW50IG1lbW9yeU5lZWRlZDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtZW1vcnlMaW1pdDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgTWVtb3J5TGltaXRFeGNlcHRpb24uCisgICAgICogPHA+CisgICAgICogVGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIGFuZCB0aGUgbWVtb3J5IHVzYWdlIGxpbWl0IGFyZQorICAgICAqIGluY2x1ZGVkIGluIHRoZSBlcnJvciBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgIG1lbW9yeU5lZWRlZCAgICBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCBhcyBraWJpYnl0ZXMgKEtpQikKKyAgICAgKiBAcGFyYW0gICBtZW1vcnlMaW1pdCAgICAgc3BlY2lmaWVkIG1lbW9yeSB1c2FnZSBsaW1pdCBhcyBraWJpYnl0ZXMgKEtpQikKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtb3J5TGltaXRFeGNlcHRpb24oaW50IG1lbW9yeU5lZWRlZCwgaW50IG1lbW9yeUxpbWl0KSB7CisgICAgICAgIHN1cGVyKCIiICsgbWVtb3J5TmVlZGVkICsgIiBLaUIgb2YgbWVtb3J5IHdvdWxkIGJlIG5lZWRlZDsgbGltaXQgd2FzICIKKyAgICAgICAgICAgICAgKyBtZW1vcnlMaW1pdCArICIgS2lCIik7CisKKyAgICAgICAgdGhpcy5tZW1vcnlOZWVkZWQgPSBtZW1vcnlOZWVkZWQ7CisgICAgICAgIHRoaXMubWVtb3J5TGltaXQgPSBtZW1vcnlMaW1pdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGhvdyBtdWNoIG1lbW9yeSBpcyByZXF1aXJlZCB0byBkZWNvbXByZXNzIHRoZSBkYXRhLgorICAgICAqCisgICAgICogQHJldHVybiAgICAgIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIGFzIGtpYmlieXRlcyAoS2lCKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWVtb3J5TmVlZGVkKCkgeworICAgICAgICByZXR1cm4gbWVtb3J5TmVlZGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hhdCB0aGUgbWVtb3J5IHVzYWdlIGxpbWl0IHdhcyBhdCB0aGUgdGltZSB0aGUgZXhjZXB0aW9uCisgICAgICogd2FzIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgbWVtb3J5IHVzYWdlIGxpbWl0IGFzIGtpYmlieXRlcyAoS2lCKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWVtb3J5TGltaXQoKSB7CisgICAgICAgIHJldHVybiBtZW1vcnlMaW1pdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovUG93ZXJQQ09wdGlvbnMuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9Qb3dlclBDT3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNmQzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovUG93ZXJQQ09wdGlvbnMuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogUG93ZXJQQ09wdGlvbnMKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLnR1a2FhbmkueHouc2ltcGxlLlBvd2VyUEM7CisKKy8qKgorICogQkNKIGZpbHRlciBmb3IgYmlnIGVuZGlhbiBQb3dlclBDIGluc3RydWN0aW9ucy4KKyAqLworcHVibGljIGNsYXNzIFBvd2VyUENPcHRpb25zIGV4dGVuZHMgQkNKT3B0aW9ucyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMSUdOTUVOVCA9IDQ7CisKKyAgICBwdWJsaWMgUG93ZXJQQ09wdGlvbnMoKSB7CisgICAgICAgIHN1cGVyKEFMSUdOTUVOVCk7CisgICAgfQorCisgICAgcHVibGljIEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIHJldHVybiBuZXcgU2ltcGxlT3V0cHV0U3RyZWFtKG91dCwgbmV3IFBvd2VyUEModHJ1ZSwgc3RhcnRPZmZzZXQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVJbnB1dFN0cmVhbShpbiwgbmV3IFBvd2VyUEMoZmFsc2UsIHN0YXJ0T2Zmc2V0KSk7CisgICAgfQorCisgICAgRmlsdGVyRW5jb2RlciBnZXRGaWx0ZXJFbmNvZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IEJDSkVuY29kZXIodGhpcywgQkNKQ29kZXIuUE9XRVJQQ19GSUxURVJfSUQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9SYXdDb2Rlci5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1Jhd0NvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjN2RhOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9SYXdDb2Rlci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBSYXdDb2RlcgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitjbGFzcyBSYXdDb2RlciB7CisgICAgc3RhdGljIHZvaWQgdmFsaWRhdGUoRmlsdGVyQ29kZXJbXSBmaWx0ZXJzKQorICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGggLSAxOyArK2kpCisgICAgICAgICAgICBpZiAoIWZpbHRlcnNbaV0ubm9uTGFzdE9LKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBYWiBmaWx0ZXIgY2hhaW4iKTsKKworICAgICAgICBpZiAoIWZpbHRlcnNbZmlsdGVycy5sZW5ndGggLSAxXS5sYXN0T0soKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBYWiBmaWx0ZXIgY2hhaW4iKTsKKworICAgICAgICBpbnQgY2hhbmdlc1NpemVDb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIGlmIChmaWx0ZXJzW2ldLmNoYW5nZXNTaXplKCkpCisgICAgICAgICAgICAgICAgKytjaGFuZ2VzU2l6ZUNvdW50OworCisgICAgICAgIGlmIChjaGFuZ2VzU2l6ZUNvdW50ID4gMykKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBYWiBmaWx0ZXIgY2hhaW4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovU1BBUkNPcHRpb25zLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovU1BBUkNPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyMDY3NwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9TUEFSQ09wdGlvbnMuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogU1BBUkNPcHRpb25zCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IG9yZy50dWthYW5pLnh6LnNpbXBsZS5TUEFSQzsKKworLyoqCisgKiBCQ0ogZmlsdGVyIGZvciBTUEFSQy4KKyAqLworcHVibGljIGNsYXNzIFNQQVJDT3B0aW9ucyBleHRlbmRzIEJDSk9wdGlvbnMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTElHTk1FTlQgPSA0OworCisgICAgcHVibGljIFNQQVJDT3B0aW9ucygpIHsKKyAgICAgICAgc3VwZXIoQUxJR05NRU5UKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmluaXNoYWJsZU91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oRmluaXNoYWJsZU91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVPdXRwdXRTdHJlYW0ob3V0LCBuZXcgU1BBUkModHJ1ZSwgc3RhcnRPZmZzZXQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVJbnB1dFN0cmVhbShpbiwgbmV3IFNQQVJDKGZhbHNlLCBzdGFydE9mZnNldCkpOworICAgIH0KKworICAgIEZpbHRlckVuY29kZXIgZ2V0RmlsdGVyRW5jb2RlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCQ0pFbmNvZGVyKHRoaXMsIEJDSkNvZGVyLlNQQVJDX0ZJTFRFUl9JRCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1NlZWthYmxlRmlsZUlucHV0U3RyZWFtLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovU2Vla2FibGVGaWxlSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTJkNjg1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1NlZWthYmxlRmlsZUlucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBTZWVrYWJsZUZpbGVJbnB1dFN0cmVhbQorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworCisvKioKKyAqIFdyYXBzIGEge0BsaW5rIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSBSYW5kb21BY2Nlc3NGaWxlfQorICogaW4gYSBTZWVrYWJsZUlucHV0U3RyZWFtLgorICovCitwdWJsaWMgY2xhc3MgU2Vla2FibGVGaWxlSW5wdXRTdHJlYW0gZXh0ZW5kcyBTZWVrYWJsZUlucHV0U3RyZWFtIHsKKyAgICAvKioKKyAgICAgKiBUaGUgUmFuZG9tQWNjZXNzRmlsZSB0aGF0IGhhcyBiZWVuIHdyYXBwZWQKKyAgICAgKiBpbnRvIGEgU2Vla2FibGVGaWxlSW5wdXRTdHJlYW0uCisgICAgICovCisgICAgcHJvdGVjdGVkIFJhbmRvbUFjY2Vzc0ZpbGUgcmFuZG9tQWNjZXNzRmlsZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgc2Vla2FibGUgaW5wdXQgc3RyZWFtIHRoYXQgcmVhZHMgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUuCisgICAgICovCisgICAgcHVibGljIFNlZWthYmxlRmlsZUlucHV0U3RyZWFtKEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHJhbmRvbUFjY2Vzc0ZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmaWxlLCAiciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgc2Vla2FibGUgaW5wdXQgc3RyZWFtIHRoYXQgcmVhZHMgZnJvbSBhIGZpbGUgd2l0aAorICAgICAqIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vla2FibGVGaWxlSW5wdXRTdHJlYW0oU3RyaW5nIG5hbWUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICByYW5kb21BY2Nlc3NGaWxlID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUobmFtZSwgInIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHNlZWthYmxlIGlucHV0IHN0cmVhbSBmcm9tIGFuIGV4aXN0aW5nCisgICAgICogPGNvZGU+UmFuZG9tQWNjZXNzRmlsZTwvY29kZT4gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTZWVrYWJsZUZpbGVJbnB1dFN0cmVhbShSYW5kb21BY2Nlc3NGaWxlIHJhbmRvbUFjY2Vzc0ZpbGUpIHsKKyAgICAgICAgdGhpcy5yYW5kb21BY2Nlc3NGaWxlID0gcmFuZG9tQWNjZXNzRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgUmFuZG9tQWNjZXNzRmlsZSNyZWFkKCkgcmFuZG9tQWNjZXNzRmlsZS5yZWFkKCl9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByYW5kb21BY2Nlc3NGaWxlLnJlYWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgUmFuZG9tQWNjZXNzRmlsZSNyZWFkKGJ5dGVbXSkgcmFuZG9tQWNjZXNzRmlsZS5yZWFkKGJ1Zil9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmFuZG9tQWNjZXNzRmlsZS5yZWFkKGJ1Zik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbHMKKyAgICAgKiB7QGxpbmsgUmFuZG9tQWNjZXNzRmlsZSNyZWFkKGJ5dGVbXSxpbnQsaW50KQorICAgICAqICAgICAgICByYW5kb21BY2Nlc3NGaWxlLnJlYWQoYnVmLCBvZmYsIGxlbil9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmFuZG9tQWNjZXNzRmlsZS5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayBSYW5kb21BY2Nlc3NGaWxlI2Nsb3NlKCkgcmFuZG9tQWNjZXNzRmlsZS5jbG9zZSgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJhbmRvbUFjY2Vzc0ZpbGUuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgUmFuZG9tQWNjZXNzRmlsZSNsZW5ndGgoKSByYW5kb21BY2Nlc3NGaWxlLmxlbmd0aCgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBsZW5ndGgoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmFuZG9tQWNjZXNzRmlsZS5sZW5ndGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgUmFuZG9tQWNjZXNzRmlsZSNnZXRGaWxlUG9pbnRlcigpCisgICAgICAgICAgICAgICAgICAgIHJhbmRvbUFjY2Vzc0ZpbGUuZ2V0RmlsZVBvaW50ZXIoKX0uCisgICAgICovCisgICAgcHVibGljIGxvbmcgcG9zaXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmFuZG9tQWNjZXNzRmlsZS5nZXRGaWxlUG9pbnRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayBSYW5kb21BY2Nlc3NGaWxlI3NlZWsobG9uZykgcmFuZG9tQWNjZXNzRmlsZS5zZWVrKGxvbmcpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByYW5kb21BY2Nlc3NGaWxlLnNlZWsocG9zKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovU2Vla2FibGVJbnB1dFN0cmVhbS5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1NlZWthYmxlSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmY5MDhhCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1NlZWthYmxlSW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogU2Vla2FibGVJbnB1dFN0cmVhbQorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIElucHV0IHN0cmVhbSB3aXRoIHJhbmRvbSBhY2Nlc3Mgc3VwcG9ydC4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNlZWthYmxlSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisgICAgLyoqCisgICAgICogU2Vla3MgPGNvZGU+bjwvY29kZT4gYnl0ZXMgZm9yd2FyZCBpbiB0aGlzIHN0cmVhbS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHdpbGwgbm90IHNlZWsgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBJZiB0aGUgY3VycmVudCBwb3NpdGlvbgorICAgICAqIGlzIGFscmVhZHkgYXQgb3IgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCB0aGlzIGRvZXNuJ3Qgc2VlayBhdCBhbGwKKyAgICAgKiBhbmQgcmV0dXJucyA8Y29kZT4wPC9jb2RlPi4gT3RoZXJ3aXNlLCBpZiBza2lwcGluZyA8Y29kZT5uPC9jb2RlPiBieXRlcworICAgICAqIHdvdWxkIGNhdXNlIHRoZSBwb3NpdGlvbiB0byBleGNlZWQgdGhlIHN0cmVhbSBzaXplLCB0aGlzIHdpbGwgZG8KKyAgICAgKiBlcXVpdmFsZW50IG9mIDxjb2RlPnNlZWsobGVuZ3RoKCkpPC9jb2RlPiBhbmQgdGhlIHJldHVybiB2YWx1ZSB3aWxsCisgICAgICogYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuCisgICAgICogPHA+CisgICAgICogSWYgPGNvZGU+bjwvY29kZT4gaXMgbmVnYXRpdmUsIHRoZSBwb3NpdGlvbiBpc24ndCBjaGFuZ2VkIGFuZAorICAgICAqIHRoZSByZXR1cm4gdmFsdWUgaXMgPGNvZGU+MDwvY29kZT4uIEl0IGRvZXNuJ3Qgc2VlayBiYWNrd2FyZAorICAgICAqIGJlY2F1c2UgaXQgd291bGQgY29uZmxpY3Qgd2l0aCB0aGUgc3BlY2lmaWNhdGlvbiBvZgorICAgICAqIHtAbGluayBqYXZhLmlvLklucHV0U3RyZWFtI3NraXAobG9uZykgSW5wdXRTdHJlYW0uc2tpcH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgPGNvZGU+MDwvY29kZT4gaWYgPGNvZGU+bjwvY29kZT4gaXMgbmVnYXRpdmUsCisgICAgICogICAgICAgICAgICAgIGxlc3MgdGhhbiA8Y29kZT5uPC9jb2RlPiBpZiBza2lwcGluZyA8Y29kZT5uPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICBieXRlcyB3b3VsZCBzZWVrIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZSwKKyAgICAgKiAgICAgICAgICAgICAgPGNvZGU+bjwvY29kZT4gb3RoZXJ3aXNlCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gbWlnaHQgYmUgdGhyb3duIGJ5IHtAbGluayAjc2Vlayhsb25nKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG4gPD0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGxvbmcgc2l6ZSA9IGxlbmd0aCgpOworICAgICAgICBsb25nIHBvcyA9IHBvc2l0aW9uKCk7CisgICAgICAgIGlmIChwb3MgPj0gc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmIChzaXplIC0gcG9zIDwgbikKKyAgICAgICAgICAgIG4gPSBzaXplIC0gcG9zOworCisgICAgICAgIHNlZWsocG9zICsgbik7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBsZW5ndGgoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgcG9zaXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZWVrcyB0byB0aGUgc3BlY2lmaWVkIGFic29sdXRlIHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogU2Vla2luZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUgc2hvdWxkIGJlIHN1cHBvcnRlZCBieSB0aGUgc3ViY2xhc3NlcworICAgICAqIHVubGVzcyB0aGVyZSBpcyBhIGdvb2QgcmVhc29uIHRvIGRvIG90aGVyd2lzZS4gSWYgb25lIGhhcyBzZWVrZWQKKyAgICAgKiBwYXN0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgPGNvZGU+cmVhZDwvY29kZT4gd2lsbCByZXR1cm4KKyAgICAgKiA8Y29kZT4tMTwvY29kZT4gdG8gaW5kaWNhdGUgZW5kIG9mIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBwb3MgICAgICAgICBuZXcgcmVhZCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gaWYgPGNvZGU+cG9zPC9jb2RlPiBpcyBuZWdhdGl2ZSBvciBpZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhIHN0cmVhbS1zcGVjaWZpYyBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2Vlayhsb25nIHBvcykgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1NlZWthYmxlWFpJbnB1dFN0cmVhbS5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1NlZWthYmxlWFpJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjlkNDAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovU2Vla2FibGVYWklucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw5NjQgQEAKKy8qCisgKiBTZWVrYWJsZVhaSW5wdXRTdHJlYW0KKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IG9yZy50dWthYW5pLnh6LmNvbW1vbi5EZWNvZGVyVXRpbDsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5jb21tb24uU3RyZWFtRmxhZ3M7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouY2hlY2suQ2hlY2s7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouaW5kZXguSW5kZXhEZWNvZGVyOworaW1wb3J0IG9yZy50dWthYW5pLnh6LmluZGV4LkJsb2NrSW5mbzsKKworLyoqCisgKiBEZWNvbXByZXNzZXMgYSAueHogZmlsZSBpbiByYW5kb20gYWNjZXNzIG1vZGUuCisgKiBUaGlzIHN1cHBvcnRzIGRlY29tcHJlc3NpbmcgY29uY2F0ZW5hdGVkIC54eiBmaWxlcy4KKyAqIDxwPgorICogRWFjaCAueHogZmlsZSBjb25zaXN0IG9mIG9uZSBvciBtb3JlIFN0cmVhbXMuIEVhY2ggU3RyZWFtIGNvbnNpc3Qgb2YgemVybworICogb3IgbW9yZSBCbG9ja3MuIEVhY2ggU3RyZWFtIGNvbnRhaW5zIGFuIEluZGV4IG9mIFN0cmVhbXMnIEJsb2Nrcy4KKyAqIFRoZSBJbmRleGVzIGZyb20gYWxsIFN0cmVhbXMgYXJlIGxvYWRlZCBpbiBSQU0gYnkgYSBjb25zdHJ1Y3RvciBvZiB0aGlzCisgKiBjbGFzcy4gQSB0eXBpY2FsIC54eiBmaWxlIGhhcyBvbmx5IG9uZSBTdHJlYW0sIGFuZCBwYXJzaW5nIGl0cyBJbmRleCB3aWxsCisgKiBuZWVkIG9ubHkgdGhyZWUgb3IgZm91ciBzZWVrcy4KKyAqIDxwPgorICogVG8gbWFrZSByYW5kb20gYWNjZXNzIHBvc3NpYmxlLCB0aGUgZGF0YSBpbiBhIC54eiBmaWxlIG11c3QgYmUgc3BsaXR0ZWQKKyAqIGludG8gbXVsdGlwbGUgQmxvY2tzIG9mIHJlYXNvbmFibGUgc2l6ZS4gRGVjb21wcmVzc2lvbiBjYW4gb25seSBzdGFydCBhdAorICogYSBCbG9jayBib3VuZGFyeS4gV2hlbiBzZWVraW5nIHRvIGFuIHVuY29tcHJlc3NlZCBwb3NpdGlvbiB0aGF0IGlzIG5vdCBhdAorICogYSBCbG9jayBib3VuZGFyeSwgZGVjb21wcmVzc2lvbiBzdGFydHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgQmxvY2sgYW5kCisgKiB0aHJvd3MgYXdheSBkYXRhIHVudGlsIHRoZSB0YXJnZXQgcG9zaXRpb24gaXMgcmVhY2hlZC4gVGh1cywgc21hbGxlciBCbG9ja3MKKyAqIG1lYW4gZmFzdGVyIHNlZWtzIHRvIGFyYml0cmFyeSB1bmNvbXByZXNzZWQgcG9zaXRpb25zLiBPbiB0aGUgb3RoZXIgaGFuZCwKKyAqIHNtYWxsZXIgQmxvY2tzIG1lYW4gd29yc2UgY29tcHJlc3Npb24uIFNvIG9uZSBoYXMgdG8gbWFrZSBhIGNvbXByb21pc2UKKyAqIGJldHdlZW4gcmFuZG9tIGFjY2VzcyBzcGVlZCBhbmQgY29tcHJlc3Npb24gcmF0aW8uCisgKiA8cD4KKyAqIEltcGxlbWVudGF0aW9uIG5vdGU6IFRoaXMgY2xhc3MgdXNlcyBsaW5lYXIgc2VhcmNoIHRvIGxvY2F0ZSB0aGUgY29ycmVjdAorICogU3RyZWFtIGZyb20gdGhlIGRhdGEgc3RydWN0dXJlcyBpbiBSQU0uIEl0IHdhcyB0aGUgc2ltcGxlc3QgdG8gaW1wbGVtZW50CisgKiBhbmQgc2hvdWxkIGJlIGZpbmUgYXMgbG9uZyBhcyB0aGVyZSBhcmVuJ3QgdG9vIG1hbnkgU3RyZWFtcy4gVGhlIGNvcnJlY3QKKyAqIEJsb2NrIGluc2lkZSBhIFN0cmVhbSBpcyBsb2NhdGVkIHVzaW5nIGJpbmFyeSBzZWFyY2ggYW5kIHRodXMgaXMgZmFzdAorICogZXZlbiB3aXRoIGEgaHVnZSBudW1iZXIgb2YgQmxvY2tzLgorICoKKyAqIDxoND5NZW1vcnkgdXNhZ2U8L2g0PgorICogPHA+CisgKiBUaGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgZm9yIHRoZSBJbmRleGVzIGlzIHRha2VuIGludG8gYWNjb3VudCB3aGVuCisgKiBjaGVja2luZyB0aGUgbWVtb3J5IHVzYWdlIGxpbWl0LiBFYWNoIFN0cmVhbSBpcyBjYWxjdWxhdGVkIHRvIG5lZWQgYXQKKyAqIGxlYXN0IDEmbmJzcDtLaUIgb2YgbWVtb3J5IGFuZCBlYWNoIEJsb2NrIDE2IGJ5dGVzIG9mIG1lbW9yeSwgcm91bmRlZCB1cAorICogdG8gdGhlIG5leHQga2liaWJ5dGUuIFNvIHVubGVzcyB0aGUgZmlsZSBoYXMgYSBodWdlIG51bWJlciBvZiBTdHJlYW1zIG9yCisgKiBCbG9ja3MsIHRoZXNlIGRvbid0IHRha2Ugc2lnbmlmaWNhbnQgYW1vdW50IG9mIG1lbW9yeS4KKyAqCisgKiA8aDQ+Q3JlYXRpbmcgcmFuZG9tLWFjY2Vzc2libGUgLnh6IGZpbGVzPC9oND4KKyAqIDxwPgorICogV2hlbiB1c2luZyB7QGxpbmsgWFpPdXRwdXRTdHJlYW19LCBhIG5ldyBCbG9jayBjYW4gYmUgc3RhcnRlZCBieSBjYWxsaW5nCisgKiBpdHMge0BsaW5rIFhaT3V0cHV0U3RyZWFtI2VuZEJsb2NrKCkgZW5kQmxvY2t9IG1ldGhvZC4gSWYgeW91IGtub3cKKyAqIHRoYXQgdGhlIGRlY29tcHJlc3NvciB3aWxsIG9ubHkgbmVlZCB0byBzZWVrIHRvIGNlcnRhaW4gdW5jb21wcmVzc2VkCisgKiBwb3NpdGlvbnMsIGl0IGNhbiBiZSBhIGdvb2QgaWRlYSB0byBzdGFydCBhIG5ldyBCbG9jayBhdCAoc29tZSBvZikgdGhlc2UKKyAqIHBvc2l0aW9ucyAoYW5kIG9ubHkgYXQgdGhlc2UgcG9zaXRpb25zIHRvIGdldCBiZXR0ZXIgY29tcHJlc3Npb24gcmF0aW8pLgorICogPHA+CisgKiBsaWJsem1hIGluIFhaIFV0aWxzIHN1cHBvcnRzIHN0YXJ0aW5nIGEgbmV3IEJsb2NrIHdpdGgKKyAqIDxjb2RlPkxaTUFfRlVMTF9GTFVTSDwvY29kZT4uIFhaIFV0aWxzIDUuMS4xYWxwaGEgYWRkZWQgdGhyZWFkZWQKKyAqIGNvbXByZXNzaW9uIHdoaWNoIGNyZWF0ZXMgbXVsdGktQmxvY2sgLnh6IGZpbGVzLiBYWiBVdGlscyA1LjEuMWFscGhhCisgKiBhbHNvIGFkZGVkIHRoZSBvcHRpb24gPGNvZGU+LS1ibG9jay1zaXplPVNJWkU8L2NvZGU+IHRvIHRoZSB4eiBjb21tYW5kCisgKiBsaW5lIHRvb2wuIFhaIFV0aWxzIDUuMS4yYWxwaGEgYWRkZWQgYSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mCisgKiA8Y29kZT4tLWJsb2NrLWxpc3Q9U0laRVM8L2NvZGU+IHdoaWNoIGFsbG93cyBzcGVjaWZ5aW5nIHNpemVzIG9mCisgKiBpbmRpdmlkdWFsIEJsb2Nrcy4KKyAqCisgKiBAc2VlIFNlZWthYmxlRmlsZUlucHV0U3RyZWFtCisgKiBAc2VlIFhaSW5wdXRTdHJlYW0KKyAqIEBzZWUgWFpPdXRwdXRTdHJlYW0KKyAqLworcHVibGljIGNsYXNzIFNlZWthYmxlWFpJbnB1dFN0cmVhbSBleHRlbmRzIFNlZWthYmxlSW5wdXRTdHJlYW0geworICAgIC8qKgorICAgICAqIFRoZSBpbnB1dCBzdHJlYW0gY29udGFpbmluZyBYWiBjb21wcmVzc2VkIGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSBTZWVrYWJsZUlucHV0U3RyZWFtIGluOworCisgICAgLyoqCisgICAgICogTWVtb3J5IHVzYWdlIGxpbWl0IGFmdGVyIHRoZSBtZW1vcnkgdXNhZ2Ugb2YgdGhlIEluZGV4RGVjb2RlcnMgaGF2ZQorICAgICAqIGJlZW4gc3Vic3RyYWN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWVtb3J5TGltaXQ7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgdXNhZ2Ugb2YgdGhlIEluZGV4RGVjb2RlcnMuCisgICAgICogPGNvZGU+bWVtb3J5TGltaXQgKyBpbmRleE1lbW9yeVVzYWdlPC9jb2RlPiBlcXVhbHMgdGhlIG9yaWdpbmFsCisgICAgICogbWVtb3J5IHVzYWdlIGxpbWl0IHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgaW5kZXhNZW1vcnlVc2FnZSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIEluZGV4RGVjb2RlcnMsIG9uZSBmb3IgZWFjaCBTdHJlYW0gaW4gdGhlIGZpbGUuCisgICAgICogVGhlIGxpc3QgaXMgaW4gcmV2ZXJzZSBvcmRlcjogVGhlIGZpcnN0IGVsZW1lbnQgaXMKKyAgICAgKiB0aGUgbGFzdCBTdHJlYW0gaW4gdGhlIGZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Qgc3RyZWFtcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIC8qKgorICAgICAqIEJpdG1hc2sgb2YgYWxsIENoZWNrIElEcyBzZWVuLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGNoZWNrVHlwZXMgPSAwOworCisgICAgLyoqCisgICAgICogVW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIGZpbGUgKGFsbCBTdHJlYW1zKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgdW5jb21wcmVzc2VkU2l6ZSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBVbmNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBYWiBCbG9jayBpbiB0aGUgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbGFyZ2VzdEJsb2NrU2l6ZSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgWFogQmxvY2tzIGluIHRoZSBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGJsb2NrQ291bnQgPSAwOworCisgICAgLyoqCisgICAgICogU2l6ZSBhbmQgcG9zaXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgQmxvY2suCisgICAgICogSWYgdGhlcmUgYXJlIG5vIEJsb2NrcywgYWxsIHZhbHVlcyB3aWxsIGJlIDxjb2RlPi0xPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEJsb2NrSW5mbyBjdXJCbG9ja0luZm87CisKKyAgICAvKioKKyAgICAgKiBUZW1wb3JhcnkgKGFuZCBjYWNoZWQpIGluZm9ybWF0aW9uIGFib3V0IHRoZSBCbG9jayB3aG9zZSBpbmZvcm1hdGlvbgorICAgICAqIGlzIHF1ZXJpZWQgdmlhIDxjb2RlPmdldEJsb2NrUG9zPC9jb2RlPiBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBCbG9ja0luZm8gcXVlcmllZEJsb2NrSW5mbzsKKworICAgIC8qKgorICAgICAqIEludGVncml0eSBDaGVjayBpbiB0aGUgY3VycmVudCBYWiBTdHJlYW0uIFRoZSBjb25zdHJ1Y3RvciBsZWF2ZXMKKyAgICAgKiB0aGlzIHRvIHBvaW50IHRvIHRoZSBDaGVjayBvZiB0aGUgZmlyc3QgU3RyZWFtLgorICAgICAqLworICAgIHByaXZhdGUgQ2hlY2sgY2hlY2s7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGluZGljYXRpbmcgaWYgdGhlIGludGVncml0eSBjaGVja3Mgd2lsbCBiZSB2ZXJpZmllZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdmVyaWZ5Q2hlY2s7CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGVyIG9mIHRoZSBjdXJyZW50IFhaIEJsb2NrLCBpZiBhbnkuCisgICAgICovCisgICAgcHJpdmF0ZSBCbG9ja0lucHV0U3RyZWFtIGJsb2NrRGVjb2RlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IHVuY29tcHJlc3NlZCBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgY3VyUG9zID0gMDsKKworICAgIC8qKgorICAgICAqIFRhcmdldCBwb3NpdGlvbiBmb3Igc2Vla2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgc2Vla1BvczsKKworICAgIC8qKgorICAgICAqIFRydWUgd2hlbiA8Y29kZT5zZWVrKGxvbmcpPC9jb2RlPiBoYXMgYmVlbiBjYWxsZWQgYnV0IHRoZSBhY3R1YWwKKyAgICAgKiBzZWVraW5nIGhhc24ndCBiZWVuIGRvbmUgeWV0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzZWVrTmVlZGVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIHdoZW4gZW5kIG9mIHRoZSBmaWxlIHdhcyByZWFjaGVkLiBUaGlzIGNhbiBiZSBjbGVhcmVkIGJ5CisgICAgICogY2FsbGluZyA8Y29kZT5zZWVrKGxvbmcpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZW5kUmVhY2hlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogUGVuZGluZyBleGNlcHRpb24gZnJvbSBhbiBlYXJsaWVyIGVycm9yLgorICAgICAqLworICAgIHByaXZhdGUgSU9FeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRlbXBvcmFyeSBidWZmZXIgZm9yIHJlYWQoKS4gVGhpcyBhdm9pZHMgcmVhbGxvY2F0aW5nIG1lbW9yeQorICAgICAqIG9uIGV2ZXJ5IHJlYWQoKSBjYWxsLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHRlbXBCdWYgPSBuZXcgYnl0ZVsxXTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgc2Vla2FibGUgWFogZGVjb21wcmVzc29yIHdpdGhvdXQgYSBtZW1vcnkgdXNhZ2UgbGltaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgaW4gICAgICAgICAgc2Vla2FibGUgaW5wdXQgc3RyZWFtIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWFogU3RyZWFtczsgdGhlIHdob2xlIGlucHV0IHN0cmVhbSBpcyB1c2VkCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgaXMgbm90IGluIHRoZSBYWiBmb3JtYXQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWiBkYXRhIGlzIGNvcnJ1cHQgb3IgdHJ1bmNhdGVkCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFhaIGhlYWRlcnMgc2VlbSB2YWxpZCBidXQgdGhleSBzcGVjaWZ5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgRU9GRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiA2IGJ5dGVzIG9mIGlucHV0IHdhcyBhdmFpbGFibGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA8Y29kZT5pbjwvY29kZT4sIG9yICh1bmxpa2VseSkgdGhlIHNpemUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGdvdCBzbWFsbGVyIHdoaWxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgd2FzIHJlYWRpbmcgZnJvbSBpdAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYnkgPGNvZGU+aW48L2NvZGU+CisgICAgICovCisgICAgcHVibGljIFNlZWthYmxlWFpJbnB1dFN0cmVhbShTZWVrYWJsZUlucHV0U3RyZWFtIGluKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhpbiwgLTEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgc2Vla2FibGUgWFogZGVjb21wb3Jlc3NvciB3aXRoIGFuIG9wdGlvbmFsCisgICAgICogbWVtb3J5IHVzYWdlIGxpbWl0LgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGluICAgICAgICAgIHNlZWthYmxlIGlucHV0IHN0cmVhbSBjb250YWluaW5nIG9uZSBvciBtb3JlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFhaIFN0cmVhbXM7IHRoZSB3aG9sZSBpbnB1dCBzdHJlYW0gaXMgdXNlZAorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIG1lbW9yeUxpbWl0IG1lbW9yeSB1c2FnZSBsaW1pdCBpbiBraWJpYnl0ZXMgKEtpQikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgPGNvZGU+LTE8L2NvZGU+IHRvIGltcG9zZSBubworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgdXNhZ2UgbGltaXQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBYWkZvcm1hdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBpcyBub3QgaW4gdGhlIFhaIGZvcm1hdAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFhaIGRhdGEgaXMgY29ycnVwdCBvciB0cnVuY2F0ZWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWFogaGVhZGVycyBzZWVtIHZhbGlkIGJ1dCB0aGV5IHNwZWNpZnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBNZW1vcnlMaW1pdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkIFhaIEluZGV4ZXMgd291bGQgbmVlZCBtb3JlIG1lbW9yeQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIGFsbG93ZWQgYnkgdGhlIG1lbW9yeSB1c2FnZSBsaW1pdAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gNiBieXRlcyBvZiBpbnB1dCB3YXMgYXZhaWxhYmxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPGNvZGU+aW48L2NvZGU+LCBvciAodW5saWtlbHkpIHRoZSBzaXplCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBnb3Qgc21hbGxlciB3aGlsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHdhcyByZWFkaW5nIGZyb20gaXQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IDxjb2RlPmluPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBTZWVrYWJsZVhaSW5wdXRTdHJlYW0oU2Vla2FibGVJbnB1dFN0cmVhbSBpbiwgaW50IG1lbW9yeUxpbWl0KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhpbiwgbWVtb3J5TGltaXQsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgc2Vla2FibGUgWFogZGVjb21wb3Jlc3NvciB3aXRoIGFuIG9wdGlvbmFsCisgICAgICogbWVtb3J5IHVzYWdlIGxpbWl0IGFuZCBhYmlsaXR5IHRvIGRpc2FibGUgdmVyaWZpY2F0aW9uCisgICAgICogb2YgaW50ZWdyaXR5IGNoZWNrcy4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgaW50ZWdyaXR5IGNoZWNrIHZlcmlmaWNhdGlvbiBzaG91bGQgYWxtb3N0IG5ldmVyIGJlIGRpc2FibGVkLgorICAgICAqIFBvc3NpYmxlIHJlYXNvbnMgdG8gZGlzYWJsZSBpbnRlZ3JpdHkgY2hlY2sgdmVyaWZpY2F0aW9uOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5UcnlpbmcgdG8gcmVjb3ZlciBkYXRhIGZyb20gYSBjb3JydXB0IC54eiBmaWxlLjwvbGk+CisgICAgICogICA8bGk+U3BlZWRpbmcgdXAgZGVjb21wcmVzc2lvbi4gVGhpcyBtYXR0ZXJzIG1vc3RseSB3aXRoIFNIQS0yNTYKKyAgICAgKiAgIG9yIHdpdGggZmlsZXMgdGhhdCBoYXZlIGNvbXByZXNzZWQgZXh0cmVtZWx5IHdlbGwuIEl0J3MgcmVjb21tZW5kZWQKKyAgICAgKiAgIHRoYXQgaW50ZWdyaXR5IGNoZWNraW5nIGlzbid0IGRpc2FibGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zCisgICAgICogICB1bmxlc3MgdGhlIGZpbGUgaW50ZWdyaXR5IGlzIHZlcmlmaWVkIGV4dGVybmFsbHkgaW4gc29tZSBvdGhlcgorICAgICAqICAgd2F5LjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiA8Y29kZT52ZXJpZnlDaGVjazwvY29kZT4gb25seSBhZmZlY3RzIHRoZSBpbnRlZ3JpdHkgY2hlY2sgb2YKKyAgICAgKiB0aGUgYWN0dWFsIGNvbXByZXNzZWQgZGF0YS4gVGhlIENSQzMyIGZpZWxkcyBpbiB0aGUgaGVhZGVycworICAgICAqIGFyZSBhbHdheXMgdmVyaWZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgaW4gICAgICAgICAgc2Vla2FibGUgaW5wdXQgc3RyZWFtIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWFogU3RyZWFtczsgdGhlIHdob2xlIGlucHV0IHN0cmVhbSBpcyB1c2VkCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgbWVtb3J5TGltaXQgbWVtb3J5IHVzYWdlIGxpbWl0IGluIGtpYmlieXRlcyAoS2lCKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciA8Y29kZT4tMTwvY29kZT4gdG8gaW1wb3NlIG5vCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSB1c2FnZSBsaW1pdAorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIHZlcmlmeUNoZWNrIGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgaW50ZWdyaXR5IGNoZWNrcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHZlcmlmaWVkOyB0aGlzIHNob3VsZCBhbG1vc3QgbmV2ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFhaRm9ybWF0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGlzIG5vdCBpbiB0aGUgWFogZm9ybWF0CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWFogZGF0YSBpcyBjb3JydXB0IG9yIHRydW5jYXRlZAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWiBoZWFkZXJzIHNlZW0gdmFsaWQgYnV0IHRoZXkgc3BlY2lmeQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIE1lbW9yeUxpbWl0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgWFogSW5kZXhlcyB3b3VsZCBuZWVkIG1vcmUgbWVtb3J5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gYWxsb3dlZCBieSB0aGUgbWVtb3J5IHVzYWdlIGxpbWl0CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgRU9GRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiA2IGJ5dGVzIG9mIGlucHV0IHdhcyBhdmFpbGFibGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA8Y29kZT5pbjwvY29kZT4sIG9yICh1bmxpa2VseSkgdGhlIHNpemUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGdvdCBzbWFsbGVyIHdoaWxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgd2FzIHJlYWRpbmcgZnJvbSBpdAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYnkgPGNvZGU+aW48L2NvZGU+CisgICAgICoKKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIFNlZWthYmxlWFpJbnB1dFN0cmVhbShTZWVrYWJsZUlucHV0U3RyZWFtIGluLCBpbnQgbWVtb3J5TGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHZlcmlmeUNoZWNrKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy52ZXJpZnlDaGVjayA9IHZlcmlmeUNoZWNrOworICAgICAgICB0aGlzLmluID0gaW47CisgICAgICAgIERhdGFJbnB1dFN0cmVhbSBpbkRhdGEgPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgbWFnaWMgYnl0ZXMgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAgICAgICAgeworICAgICAgICAgICAgaW4uc2VlaygwKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtYWi5IRUFERVJfTUFHSUMubGVuZ3RoXTsKKyAgICAgICAgICAgIGluRGF0YS5yZWFkRnVsbHkoYnVmKTsKKyAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhidWYsIFhaLkhFQURFUl9NQUdJQykpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhaRm9ybWF0RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXQgdGhlIGZpbGUgc2l6ZSBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzLgorICAgICAgICBsb25nIHBvcyA9IGluLmxlbmd0aCgpOworICAgICAgICBpZiAoKHBvcyAmIDMpICE9IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJYWiBmaWxlIHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCBieXRlcyIpOworCisgICAgICAgIC8vIFBhcnNlIHRoZSBoZWFkZXJzIHN0YXJ0aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0RlY29kZXJVdGlsLlNUUkVBTV9IRUFERVJfU0laRV07CisgICAgICAgIGxvbmcgc3RyZWFtUGFkZGluZyA9IDA7CisKKyAgICAgICAgd2hpbGUgKHBvcyA+IDApIHsKKyAgICAgICAgICAgIGlmIChwb3MgPCBEZWNvZGVyVXRpbC5TVFJFQU1fSEVBREVSX1NJWkUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIFJlYWQgdGhlIHBvdGVudGlhbCBTdHJlYW0gRm9vdGVyLgorICAgICAgICAgICAgaW4uc2Vlayhwb3MgLSBEZWNvZGVyVXRpbC5TVFJFQU1fSEVBREVSX1NJWkUpOworICAgICAgICAgICAgaW5EYXRhLnJlYWRGdWxseShidWYpOworCisgICAgICAgICAgICAvLyBTa2lwIFN0cmVhbSBQYWRkaW5nIGZvdXIgYnl0ZXMgYXQgYSB0aW1lLgorICAgICAgICAgICAgLy8gU2tpcHBpbmcgbW9yZSBhdCBvbmNlIHdvdWxkIGJlIGZhc3RlciwKKyAgICAgICAgICAgIC8vIGJ1dCB1c3VhbGx5IHRoZXJlIGlzbid0IG11Y2ggU3RyZWFtIFBhZGRpbmcuCisgICAgICAgICAgICBpZiAoYnVmWzhdID09IDB4MDAgJiYgYnVmWzldID09IDB4MDAgJiYgYnVmWzEwXSA9PSAweDAwCisgICAgICAgICAgICAgICAgICAgICYmIGJ1ZlsxMV0gPT0gMHgwMCkgeworICAgICAgICAgICAgICAgIHN0cmVhbVBhZGRpbmcgKz0gNDsKKyAgICAgICAgICAgICAgICBwb3MgLT0gNDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSXQncyBub3QgU3RyZWFtIFBhZGRpbmcuIFVwZGF0ZSBwb3MuCisgICAgICAgICAgICBwb3MgLT0gRGVjb2RlclV0aWwuU1RSRUFNX0hFQURFUl9TSVpFOworCisgICAgICAgICAgICAvLyBEZWNvZGUgdGhlIFN0cmVhbSBGb290ZXIgYW5kIGNoZWNrIGlmIEJhY2t3YXJkIFNpemUKKyAgICAgICAgICAgIC8vIGxvb2tzIHJlYXNvbmFibGUuCisgICAgICAgICAgICBTdHJlYW1GbGFncyBzdHJlYW1Gb290ZXIgPSBEZWNvZGVyVXRpbC5kZWNvZGVTdHJlYW1Gb290ZXIoYnVmKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW1Gb290ZXIuYmFja3dhcmRTaXplID49IHBvcykKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQmFja3dhcmQgU2l6ZSBpbiBYWiBTdHJlYW0gRm9vdGVyIGlzIHRvbyBiaWciKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgQ2hlY2sgSUQgaXMgc3VwcG9ydGVkLiBTdG9yZSBpdCBpbiBjYXNlIHRoaXMKKyAgICAgICAgICAgIC8vIGlzIHRoZSBmaXJzdCBTdHJlYW0gaW4gdGhlIGZpbGUuCisgICAgICAgICAgICBjaGVjayA9IENoZWNrLmdldEluc3RhbmNlKHN0cmVhbUZvb3Rlci5jaGVja1R5cGUpOworCisgICAgICAgICAgICAvLyBSZW1lbWJlciB3aGljaCBDaGVjayBJRHMgaGF2ZSBiZWVuIHNlZW4uCisgICAgICAgICAgICBjaGVja1R5cGVzIHw9IDEgPDwgc3RyZWFtRm9vdGVyLmNoZWNrVHlwZTsKKworICAgICAgICAgICAgLy8gU2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBJbmRleC4KKyAgICAgICAgICAgIGluLnNlZWsocG9zIC0gc3RyZWFtRm9vdGVyLmJhY2t3YXJkU2l6ZSk7CisKKyAgICAgICAgICAgIC8vIERlY29kZSB0aGUgSW5kZXggZmllbGQuCisgICAgICAgICAgICBJbmRleERlY29kZXIgaW5kZXg7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gbmV3IEluZGV4RGVjb2Rlcihpbiwgc3RyZWFtRm9vdGVyLCBzdHJlYW1QYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlMaW1pdCk7CisgICAgICAgICAgICB9IGNhdGNoIChNZW1vcnlMaW1pdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSW5kZXhEZWNvZGVyIGRvZXNuJ3Qga25vdyBob3cgbXVjaCBtZW1vcnkgd2UgaGFkCisgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBuZWVkZWQgc28gd2UgbmVlZCB0byByZWNyZWF0ZSB0aGUgZXhjZXB0aW9uLgorICAgICAgICAgICAgICAgIGFzc2VydCBtZW1vcnlMaW1pdCA+PSAwOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZW1vcnlMaW1pdEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVtb3J5TmVlZGVkKCkgKyBpbmRleE1lbW9yeVVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5TGltaXQgKyBpbmRleE1lbW9yeVVzYWdlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBtZW1vcnkgdXNhZ2UgYW5kIGxpbWl0IGNvdW50ZXJzLgorICAgICAgICAgICAgaW5kZXhNZW1vcnlVc2FnZSArPSBpbmRleC5nZXRNZW1vcnlVc2FnZSgpOworICAgICAgICAgICAgaWYgKG1lbW9yeUxpbWl0ID49IDApIHsKKyAgICAgICAgICAgICAgICBtZW1vcnlMaW1pdCAtPSBpbmRleC5nZXRNZW1vcnlVc2FnZSgpOworICAgICAgICAgICAgICAgIGFzc2VydCBtZW1vcnlMaW1pdCA+PSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIGxhcmdlc3QgQmxvY2suCisgICAgICAgICAgICBpZiAobGFyZ2VzdEJsb2NrU2l6ZSA8IGluZGV4LmdldExhcmdlc3RCbG9ja1NpemUoKSkKKyAgICAgICAgICAgICAgICBsYXJnZXN0QmxvY2tTaXplID0gaW5kZXguZ2V0TGFyZ2VzdEJsb2NrU2l6ZSgpOworCisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgWFogU3RyZWFtIGFuZAorICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBpdCBsb29rcyBzYW5lLgorICAgICAgICAgICAgbG9uZyBvZmYgPSBpbmRleC5nZXRTdHJlYW1TaXplKCkgLSBEZWNvZGVyVXRpbC5TVFJFQU1fSEVBREVSX1NJWkU7CisgICAgICAgICAgICBpZiAocG9zIDwgb2ZmKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigiWFogSW5kZXggaW5kaWNhdGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInRvbyBiaWcgY29tcHJlc3NlZCBzaXplIGZvciB0aGUgWFogU3RyZWFtIik7CisKKyAgICAgICAgICAgIC8vIFNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIFN0cmVhbS4KKyAgICAgICAgICAgIHBvcyAtPSBvZmY7CisgICAgICAgICAgICBpbi5zZWVrKHBvcyk7CisKKyAgICAgICAgICAgIC8vIERlY29kZSB0aGUgU3RyZWFtIEhlYWRlci4KKyAgICAgICAgICAgIGluRGF0YS5yZWFkRnVsbHkoYnVmKTsKKyAgICAgICAgICAgIFN0cmVhbUZsYWdzIHN0cmVhbUhlYWRlciA9IERlY29kZXJVdGlsLmRlY29kZVN0cmVhbUhlYWRlcihidWYpOworCisgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgU3RyZWFtIEhlYWRlciBtYXRjaGVzIHRoZSBTdHJlYW0gRm9vdGVyLgorICAgICAgICAgICAgaWYgKCFEZWNvZGVyVXRpbC5hcmVTdHJlYW1GbGFnc0VxdWFsKHN0cmVhbUhlYWRlciwgc3RyZWFtRm9vdGVyKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiWFogU3RyZWFtIEZvb3RlciBkb2VzIG5vdCBtYXRjaCBTdHJlYW0gSGVhZGVyIik7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdG90YWwgdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIGZpbGUgYW5kIGNoZWNrIHRoYXQKKyAgICAgICAgICAgIC8vIGl0IGRvZXNuJ3Qgb3ZlcmZsb3cuCisgICAgICAgICAgICB1bmNvbXByZXNzZWRTaXplICs9IGluZGV4LmdldFVuY29tcHJlc3NlZFNpemUoKTsKKyAgICAgICAgICAgIGlmICh1bmNvbXByZXNzZWRTaXplIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uKCJYWiBmaWxlIGlzIHRvbyBiaWciKTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBCbG9jayBjb3VudCBhbmQgY2hlY2sgdGhhdCBpdCBmaXRzIGludG8gYW4gaW50LgorICAgICAgICAgICAgYmxvY2tDb3VudCArPSBpbmRleC5nZXRSZWNvcmRDb3VudCgpOworICAgICAgICAgICAgaWYgKGJsb2NrQ291bnQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiWFogZmlsZSBoYXMgb3ZlciAiICsgSW50ZWdlci5NQVhfVkFMVUUgKyAiIEJsb2NrcyIpOworCisgICAgICAgICAgICAvLyBBZGQgdGhpcyBTdHJlYW0gdG8gdGhlIGxpc3Qgb2YgU3RyZWFtcy4KKyAgICAgICAgICAgIHN0cmVhbXMuYWRkKGluZGV4KTsKKworICAgICAgICAgICAgLy8gUmVzZXQgdG8gYmUgcmVhZHkgdG8gcGFyc2UgdGhlIG5leHQgU3RyZWFtLgorICAgICAgICAgICAgc3RyZWFtUGFkZGluZyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgcG9zID09IDA7CisKKyAgICAgICAgLy8gU2F2ZSBpdCBub3cgdGhhdCBpbmRleE1lbW9yeVVzYWdlIGhhcyBiZWVuIHN1YnN0cmFjdGVkIGZyb20gaXQuCisgICAgICAgIHRoaXMubWVtb3J5TGltaXQgPSBtZW1vcnlMaW1pdDsKKworICAgICAgICAvLyBTdG9yZSB0aGUgcmVsYXRpdmUgb2Zmc2V0cyBvZiB0aGUgU3RyZWFtcy4gVGhpcyB3YXkgd2UgZG9uJ3QKKyAgICAgICAgLy8gbmVlZCB0byByZWNhbGN1bGF0ZSB0aGVtIGluIHRoaXMgY2xhc3Mgd2hlbiBzZWVraW5nOyB0aGUKKyAgICAgICAgLy8gSW5kZXhEZWNvZGVyIGluc3RhbmNlcyB3aWxsIGhhbmRsZSB0aGVtLgorICAgICAgICBJbmRleERlY29kZXIgcHJldiA9IChJbmRleERlY29kZXIpc3RyZWFtcy5nZXQoc3RyZWFtcy5zaXplKCkgLSAxKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0cmVhbXMuc2l6ZSgpIC0gMjsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgIEluZGV4RGVjb2RlciBjdXIgPSAoSW5kZXhEZWNvZGVyKXN0cmVhbXMuZ2V0KGkpOworICAgICAgICAgICAgY3VyLnNldE9mZnNldHMocHJldik7CisgICAgICAgICAgICBwcmV2ID0gY3VyOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBjdXJCbG9ja0luZm8gdG8gcG9pbnQgdG8gdGhlIGZpcnN0IFN0cmVhbS4KKyAgICAgICAgLy8gVGhlIGJsb2NrTnVtYmVyIHdpbGwgYmUgbGVmdCB0byAtMSBzbyB0aGF0IC5oYXNOZXh0KCkKKyAgICAgICAgLy8gYW5kIC5zZXROZXh0KCkgd29yayB0byBnZXQgdGhlIGZpcnN0IEJsb2NrIHdoZW4gc3RhcnRpbmcKKyAgICAgICAgLy8gdG8gZGVjb21wcmVzcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgICAgICAgIEluZGV4RGVjb2RlciBmaXJzdCA9IChJbmRleERlY29kZXIpc3RyZWFtcy5nZXQoc3RyZWFtcy5zaXplKCkgLSAxKTsKKyAgICAgICAgY3VyQmxvY2tJbmZvID0gbmV3IEJsb2NrSW5mbyhmaXJzdCk7CisKKyAgICAgICAgLy8gcXVlcmllZEJsb2NrSW5mbyBuZWVkcyB0byBiZSBhbGxvY2F0ZWQgdG9vLiBUaGUgU3RyZWFtIHVzZWQgZm9yCisgICAgICAgIC8vIGluaXRpYWxpemF0aW9uIGRvZXNuJ3QgbWF0dGVyIHRob3VnaC4KKyAgICAgICAgcXVlcmllZEJsb2NrSW5mbyA9IG5ldyBCbG9ja0luZm8oZmlyc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHR5cGVzIG9mIGludGVncml0eSBjaGVja3MgdXNlZCBpbiB0aGUgLnh6IGZpbGUuCisgICAgICogTXVsdGlwbGUgY2hlY2tzIGFyZSBwb3NzaWJsZSBvbmx5IGlmIHRoZXJlIGFyZSBtdWx0aXBsZQorICAgICAqIGNvbmNhdGVuYXRlZCBYWiBTdHJlYW1zLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBoYXMgYSBiaXQgc2V0IGZvciBldmVyeSBjaGVjayB0eXBlIHRoYXQgaXMgcHJlc2VudC4KKyAgICAgKiBGb3IgZXhhbXBsZSwgaWYgQ1JDNjQgYW5kIFNIQS0yNTYgd2VyZSB1c2VkLCB0aGUgcmV0dXJuIHZhbHVlIGlzCisgICAgICogPGNvZGU+KDEmbmJzcDsmbHQ7Jmx0OyZuYnNwO1haLkNIRUNLX0NSQzY0KQorICAgICAqIHwgKDEmbmJzcDsmbHQ7Jmx0OyZuYnNwO1haLkNIRUNLX1NIQTI1Nik8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2hlY2tUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIGNoZWNrVHlwZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYW1vdW50IG9mIG1lbW9yeSBpbiBraWJpYnl0ZXMgKEtpQikgdXNlZCBieQorICAgICAqIHRoZSBkYXRhIHN0cnVjdHVyZXMgbmVlZGVkIHRvIGxvY2F0ZSB0aGUgWFogQmxvY2tzLgorICAgICAqIFRoaXMgaXMgdXN1YWxseSB1c2VsZXNzIGluZm9ybWF0aW9uIGJ1dCBzaW5jZSBpdCBpcyBjYWxjdWxhdGVkCisgICAgICogZm9yIG1lbW9yeSB1c2FnZSBsaW1pdCBhbnl3YXksIGl0IGlzIG5pY2UgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gdG9vLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXhNZW1vcnlVc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIGluZGV4TWVtb3J5VXNhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIGxhcmdlc3QgWFogQmxvY2sgaW4gYnl0ZXMuCisgICAgICogVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNoZWNrIHRoYXQgdGhlIGZpbGUgZG9lc24ndAorICAgICAqIGhhdmUgaHVnZSBYWiBCbG9ja3Mgd2hpY2ggY291bGQgbWFrZSBzZWVraW5nIHRvIGFyYml0cmFyeSBvZmZzZXRzCisgICAgICogdmVyeSBzbG93LiBOb3RlIHRoYXQgaHVnZSBCbG9ja3MgZG9uJ3QgYXV0b21hdGljYWxseSBtZWFuIHRoYXQKKyAgICAgKiBzZWVraW5nIHdvdWxkIGJlIHNsb3csIGZvciBleGFtcGxlLCBzZWVraW5nIHRvIHRoZSBiZWdpbm5pbmcgb2YKKyAgICAgKiBhbnkgQmxvY2sgaXMgYWx3YXlzIGZhc3QuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGFyZ2VzdEJsb2NrU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGxhcmdlc3RCbG9ja1NpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIFN0cmVhbXMgaW4gdGhlIC54eiBmaWxlLgorICAgICAqCisgICAgICogQHNpbmNlIDEuMworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U3RyZWFtQ291bnQoKSB7CisgICAgICAgIHJldHVybiBzdHJlYW1zLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgQmxvY2tzIGluIHRoZSAueHogZmlsZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEJsb2NrQ291bnQoKSB7CisgICAgICAgIHJldHVybiBibG9ja0NvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVuY29tcHJlc3NlZCBzdGFydCBwb3NpdGlvbiBvZiB0aGUgZ2l2ZW4gQmxvY2suCisgICAgICoKKyAgICAgKiBAdGhyb3dzICBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmCisgICAgICogICAgICAgICAgPGNvZGU+YmxvY2tOdW1iZXImbmJzcDsmbHQ7Jm5ic3A7MDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICA8Y29kZT5ibG9ja051bWJlciZuYnNwOyZndDs9Jm5ic3A7Z2V0QmxvY2tDb3VudCgpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRCbG9ja1BvcyhpbnQgYmxvY2tOdW1iZXIpIHsKKyAgICAgICAgbG9jYXRlQmxvY2tCeU51bWJlcihxdWVyaWVkQmxvY2tJbmZvLCBibG9ja051bWJlcik7CisgICAgICAgIHJldHVybiBxdWVyaWVkQmxvY2tJbmZvLnVuY29tcHJlc3NlZE9mZnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgZ2l2ZW4gQmxvY2suCisgICAgICoKKyAgICAgKiBAdGhyb3dzICBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmCisgICAgICogICAgICAgICAgPGNvZGU+YmxvY2tOdW1iZXImbmJzcDsmbHQ7Jm5ic3A7MDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICA8Y29kZT5ibG9ja051bWJlciZuYnNwOyZndDs9Jm5ic3A7Z2V0QmxvY2tDb3VudCgpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRCbG9ja1NpemUoaW50IGJsb2NrTnVtYmVyKSB7CisgICAgICAgIGxvY2F0ZUJsb2NrQnlOdW1iZXIocXVlcmllZEJsb2NrSW5mbywgYmxvY2tOdW1iZXIpOworICAgICAgICByZXR1cm4gcXVlcmllZEJsb2NrSW5mby51bmNvbXByZXNzZWRTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBnaXZlbiBjb21wcmVzc2VkIEJsb2NrIHN0YXJ0cyBpbgorICAgICAqIHRoZSB1bmRlcmx5aW5nIC54eiBmaWxlLgorICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgcmFyZWx5IHVzZWZ1bCB0byB0aGUgdXNlcnMgb2YgdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYKKyAgICAgKiAgICAgICAgICA8Y29kZT5ibG9ja051bWJlciZuYnNwOyZsdDsmbmJzcDswPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgIDxjb2RlPmJsb2NrTnVtYmVyJm5ic3A7Jmd0Oz0mbmJzcDtnZXRCbG9ja0NvdW50KCk8L2NvZGU+LgorICAgICAqCisgICAgICogQHNpbmNlIDEuMworICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEJsb2NrQ29tcFBvcyhpbnQgYmxvY2tOdW1iZXIpIHsKKyAgICAgICAgbG9jYXRlQmxvY2tCeU51bWJlcihxdWVyaWVkQmxvY2tJbmZvLCBibG9ja051bWJlcik7CisgICAgICAgIHJldHVybiBxdWVyaWVkQmxvY2tJbmZvLmNvbXByZXNzZWRPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29tcHJlc3NlZCBzaXplIG9mIHRoZSBnaXZlbiBCbG9jay4KKyAgICAgKiBUaGlzIHRvZ2V0aGVyIHdpdGggdGhlIHVuY29tcHJlc3NlZCBzaXplIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZQorICAgICAqIHRoZSBjb21wcmVzc2lvbiByYXRpbyBvZiB0aGUgc3BlY2lmaWMgQmxvY2suCisgICAgICoKKyAgICAgKiBAdGhyb3dzICBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmCisgICAgICogICAgICAgICAgPGNvZGU+YmxvY2tOdW1iZXImbmJzcDsmbHQ7Jm5ic3A7MDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICA8Y29kZT5ibG9ja051bWJlciZuYnNwOyZndDs9Jm5ic3A7Z2V0QmxvY2tDb3VudCgpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRCbG9ja0NvbXBTaXplKGludCBibG9ja051bWJlcikgeworICAgICAgICBsb2NhdGVCbG9ja0J5TnVtYmVyKHF1ZXJpZWRCbG9ja0luZm8sIGJsb2NrTnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIChxdWVyaWVkQmxvY2tJbmZvLnVucGFkZGVkU2l6ZSArIDMpICYgfjM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBpbnRlZ3JpdHkgY2hlY2sgdHlwZSAoQ2hlY2sgSUQpIG9mIHRoZSBnaXZlbiBCbG9jay4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYKKyAgICAgKiAgICAgICAgICA8Y29kZT5ibG9ja051bWJlciZuYnNwOyZsdDsmbmJzcDswPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgIDxjb2RlPmJsb2NrTnVtYmVyJm5ic3A7Jmd0Oz0mbmJzcDtnZXRCbG9ja0NvdW50KCk8L2NvZGU+LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Q2hlY2tUeXBlcygpCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4zCisgICAgICovCisgICAgcHVibGljIGludCBnZXRCbG9ja0NoZWNrVHlwZShpbnQgYmxvY2tOdW1iZXIpIHsKKyAgICAgICAgbG9jYXRlQmxvY2tCeU51bWJlcihxdWVyaWVkQmxvY2tJbmZvLCBibG9ja051bWJlcik7CisgICAgICAgIHJldHVybiBxdWVyaWVkQmxvY2tJbmZvLmdldENoZWNrVHlwZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiB0aGUgQmxvY2sgdGhhdCBjb250YWlucyB0aGUgYnl0ZSBhdCB0aGUgZ2l2ZW4KKyAgICAgKiB1bmNvbXByZXNzZWQgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzICBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmCisgICAgICogICAgICAgICAgPGNvZGU+cG9zJm5ic3A7Jmx0OyZuYnNwOzA8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgPGNvZGU+cG9zJm5ic3A7Jmd0Oz0mbmJzcDtsZW5ndGgoKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4zCisgICAgICovCisgICAgcHVibGljIGludCBnZXRCbG9ja051bWJlcihsb25nIHBvcykgeworICAgICAgICBsb2NhdGVCbG9ja0J5UG9zKHF1ZXJpZWRCbG9ja0luZm8sIHBvcyk7CisgICAgICAgIHJldHVybiBxdWVyaWVkQmxvY2tJbmZvLmJsb2NrTnVtYmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29tcHJlc3NlcyB0aGUgbmV4dCBieXRlIGZyb20gdGhpcyBpbnB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgZGVjb21wcmVzc2VkIGJ5dGUsIG9yIDxjb2RlPi0xPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIHN0cmVhbQorICAgICAqCisgICAgICogQHRocm93cyAgICAgIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgICAgICBNZW1vcnlMaW1pdEV4Y2VwdGlvbgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFhaSU9FeGNlcHRpb24gaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IDxjb2RlPmluPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkKHRlbXBCdWYsIDAsIDEpID09IC0xID8gLTEgOiAodGVtcEJ1ZlswXSAmIDB4RkYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29tcHJlc3NlcyBpbnRvIGFuIGFycmF5IG9mIGJ5dGVzLgorICAgICAqIDxwPgorICAgICAqIElmIDxjb2RlPmxlbjwvY29kZT4gaXMgemVybywgbm8gYnl0ZXMgYXJlIHJlYWQgYW5kIDxjb2RlPjA8L2NvZGU+CisgICAgICogaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGlzIHdpbGwgdHJ5IHRvIGRlY29tcHJlc3MgPGNvZGU+bGVuPC9jb2RlPgorICAgICAqIGJ5dGVzIG9mIHVuY29tcHJlc3NlZCBkYXRhLiBMZXNzIHRoYW4gPGNvZGU+bGVuPC9jb2RlPiBieXRlcyBtYXkKKyAgICAgKiBiZSByZWFkIG9ubHkgaW4gdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5UaGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgd2FzIHJlYWNoZWQgc3VjY2Vzc2Z1bGx5LjwvbGk+CisgICAgICogICA8bGk+QW4gZXJyb3IgaXMgZGV0ZWN0ZWQgYWZ0ZXIgYXQgbGVhc3Qgb25lIGJ1dCBsZXNzIHRoYW4KKyAgICAgKiAgICAgICA8Y29kZT5sZW48L2NvZGU+IGJ5dGVzIGhhdmUgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseQorICAgICAqICAgICAgIGRlY29tcHJlc3NlZC4gVGhlIG5leHQgY2FsbCB3aXRoIG5vbi16ZXJvIDxjb2RlPmxlbjwvY29kZT4KKyAgICAgKiAgICAgICB3aWxsIGltbWVkaWF0ZWx5IHRocm93IHRoZSBwZW5kaW5nIGV4Y2VwdGlvbi48L2xpPgorICAgICAqICAgPGxpPkFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGJ1ZiAgICAgICAgIHRhcmdldCBidWZmZXIgZm9yIHVuY29tcHJlc3NlZCBkYXRhCisgICAgICogQHBhcmFtICAgICAgIG9mZiAgICAgICAgIHN0YXJ0IG9mZnNldCBpbiA8Y29kZT5idWY8L2NvZGU+CisgICAgICogQHBhcmFtICAgICAgIGxlbiAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyB0byByZWFkCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIDxjb2RlPi0xPC9jb2RlPiB0byBpbmRpY2F0ZQorICAgICAqICAgICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIHN0cmVhbQorICAgICAqCisgICAgICogQHRocm93cyAgICAgIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgICAgICBNZW1vcnlMaW1pdEV4Y2VwdGlvbgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFhaSU9FeGNlcHRpb24gaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IDxjb2RlPmluPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAob2ZmIDwgMCB8fCBsZW4gPCAwIHx8IG9mZiArIGxlbiA8IDAgfHwgb2ZmICsgbGVuID4gYnVmLmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisKKyAgICAgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKGluID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgWFpJT0V4Y2VwdGlvbigiU3RyZWFtIGNsb3NlZCIpOworCisgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKworICAgICAgICBpbnQgc2l6ZSA9IDA7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzZWVrTmVlZGVkKQorICAgICAgICAgICAgICAgIHNlZWsoKTsKKworICAgICAgICAgICAgaWYgKGVuZFJlYWNoZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChibG9ja0RlY29kZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZWVrKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmRSZWFjaGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IHJldCA9IGJsb2NrRGVjb2Rlci5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworCisgICAgICAgICAgICAgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyUG9zICs9IHJldDsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSByZXQ7CisgICAgICAgICAgICAgICAgICAgIG9mZiArPSByZXQ7CisgICAgICAgICAgICAgICAgICAgIGxlbiAtPSByZXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tEZWNvZGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgZmlsZSBpc24ndCBzaW1wbHkgdHJ1bmNhdGVkIGJlY2F1c2Ugd2UgY291bGQKKyAgICAgICAgICAgIC8vIHBhcnNlIHRoZSBJbmRleGVzIGluIHRoZSBjb25zdHJ1Y3Rvci4gU28gY29udmVydCBFT0ZFeGNlcHRpb24KKyAgICAgICAgICAgIC8vIHRvIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uLgorICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFT0ZFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgZSA9IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyB0aGF0IGNhbiBiZSByZWFkCisgICAgICogd2l0aG91dCBibG9ja2luZy4gVGhlIHZhbHVlIGlzIHJldHVybmVkIHdpdGggYW4gYXNzdW1wdGlvbgorICAgICAqIHRoYXQgdGhlIGNvbXByZXNzZWQgaW5wdXQgZGF0YSB3aWxsIGJlIHZhbGlkLiBJZiB0aGUgY29tcHJlc3NlZAorICAgICAqIGRhdGEgaXMgY29ycnVwdCwgPGNvZGU+Q29ycnVwdGVkSW5wdXRFeGNlcHRpb248L2NvZGU+IG1heSBnZXQKKyAgICAgKiB0aHJvd24gYmVmb3JlIHRoZSBudW1iZXIgb2YgYnl0ZXMgY2xhaW1lZCB0byBiZSBhdmFpbGFibGUgaGF2ZQorICAgICAqIGJlZW4gcmVhZCBmcm9tIHRoaXMgaW5wdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiAgICAgIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQKKyAgICAgKiAgICAgICAgICAgICAgd2l0aG91dCBibG9ja2luZworICAgICAqLworICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgWFpJT0V4Y2VwdGlvbigiU3RyZWFtIGNsb3NlZCIpOworCisgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKworICAgICAgICBpZiAoZW5kUmVhY2hlZCB8fCBzZWVrTmVlZGVkIHx8IGJsb2NrRGVjb2RlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgcmV0dXJuIGJsb2NrRGVjb2Rlci5hdmFpbGFibGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHN0cmVhbSBhbmQgY2FsbHMgPGNvZGU+aW4uY2xvc2UoKTwvY29kZT4uCisgICAgICogSWYgdGhlIHN0cmVhbSB3YXMgYWxyZWFkeSBjbG9zZWQsIHRoaXMgZG9lcyBub3RoaW5nLgorICAgICAqCisgICAgICogQHRocm93cyAgSU9FeGNlcHRpb24gaWYgdGhyb3duIGJ5IDxjb2RlPmluLmNsb3NlKCk8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSBvZiB0aGlzIGlucHV0IHN0cmVhbS4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCisgICAgICogWFogU3RyZWFtcywgdGhlIHRvdGFsIHVuY29tcHJlc3NlZCBzaXplIG9mIGFsbCBYWiBTdHJlYW1zIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIHVuY29tcHJlc3NlZFNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCB1bmNvbXByZXNzZWQgcG9zaXRpb24gaW4gdGhpcyBpbnB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpJT0V4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZAorICAgICAqLworICAgIHB1YmxpYyBsb25nIHBvc2l0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgWFpJT0V4Y2VwdGlvbigiU3RyZWFtIGNsb3NlZCIpOworCisgICAgICAgIHJldHVybiBzZWVrTmVlZGVkID8gc2Vla1BvcyA6IGN1clBvczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWVrcyB0byB0aGUgc3BlY2lmaWVkIGFic29sdXRlIHVuY29tcHJlc3NlZCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLgorICAgICAqIFRoaXMgb25seSBzdG9yZXMgdGhlIG5ldyBwb3NpdGlvbiwgc28gdGhpcyBmdW5jdGlvbiBpdHNlbGYgaXMgYWx3YXlzCisgICAgICogdmVyeSBmYXN0LiBUaGUgYWN0dWFsIHNlZWsgaXMgZG9uZSB3aGVuIDxjb2RlPnJlYWQ8L2NvZGU+IGlzIGNhbGxlZAorICAgICAqIHRvIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUuCisgICAgICogPHA+CisgICAgICogU2Vla2luZyBwYXN0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyBwb3NzaWJsZS4gSW4gdGhhdCBjYXNlCisgICAgICogPGNvZGU+cmVhZDwvY29kZT4gd2lsbCByZXR1cm4gPGNvZGU+LTE8L2NvZGU+IHRvIGluZGljYXRlCisgICAgICogdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIHBvcyAgICAgICAgIG5ldyB1bmNvbXByZXNzZWQgcmVhZCBwb3NpdGlvbgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFhaSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgPGNvZGU+cG9zPC9jb2RlPiBpcyBuZWdhdGl2ZSwgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlZWsobG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFhaSU9FeGNlcHRpb24oIlN0cmVhbSBjbG9zZWQiKTsKKworICAgICAgICBpZiAocG9zIDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYWklPRXhjZXB0aW9uKCJOZWdhdGl2ZSBzZWVrIHBvc2l0aW9uOiAiICsgcG9zKTsKKworICAgICAgICBzZWVrUG9zID0gcG9zOworICAgICAgICBzZWVrTmVlZGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWVrcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnaXZlbiBYWiBCbG9jay4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBYWklPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgIGlmIDxjb2RlPmJsb2NrTnVtYmVyJm5ic3A7Jmx0OyZuYnNwOzA8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgIDxjb2RlPmJsb2NrTnVtYmVyJm5ic3A7Jmd0Oz0mbmJzcDtnZXRCbG9ja0NvdW50KCk8L2NvZGU+LAorICAgICAqICAgICAgICAgICAgICBvciBpZiBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkCisgICAgICoKKyAgICAgKiBAc2luY2UgMS4zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2Vla1RvQmxvY2soaW50IGJsb2NrTnVtYmVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYWklPRXhjZXB0aW9uKCJTdHJlYW0gY2xvc2VkIik7CisKKyAgICAgICAgaWYgKGJsb2NrTnVtYmVyIDwgMCB8fCBibG9ja051bWJlciA+PSBibG9ja0NvdW50KQorICAgICAgICAgICAgdGhyb3cgbmV3IFhaSU9FeGNlcHRpb24oIkludmFsaWQgWFogQmxvY2sgbnVtYmVyOiAiICsgYmxvY2tOdW1iZXIpOworCisgICAgICAgIC8vIFRoaXMgaXMgYSBiaXQgc2lsbHkgaW1wbGVtZW50YXRpb24uIEhlcmUgd2UgbG9jYXRlIHRoZSB1bmNvbXByZXNzZWQKKyAgICAgICAgLy8gb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgQmxvY2ssIHRoZW4gd2hlbiBkb2luZyB0aGUgYWN0dWFsIHNlZWsgaW4KKyAgICAgICAgLy8gc2VlaygpLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIEJsb2NrIG51bWJlciBiYXNlZCBvbiBzZWVrUG9zLgorICAgICAgICBzZWVrUG9zID0gZ2V0QmxvY2tQb3MoYmxvY2tOdW1iZXIpOworICAgICAgICBzZWVrTmVlZGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoZSBhY3R1YWwgc2Vla2luZy4gVGhpcyBpcyBhbHNvIGNhbGxlZCB3aGVuIDxjb2RlPnJlYWQ8L2NvZGU+CisgICAgICogbmVlZHMgYSBuZXcgQmxvY2sgdG8gZGVjb2RlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZWVrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gSWYgc2Vlayhsb25nKSB3YXNuJ3QgY2FsbGVkLCB3ZSBzaW1wbHkgbmVlZCB0byBnZXQgdGhlIG5leHQgQmxvY2sKKyAgICAgICAgLy8gZnJvbSB0aGUgc2FtZSBTdHJlYW0uIElmIHRoZXJlIGFyZSBubyBtb3JlIEJsb2NrcyBpbiB0aGlzIFN0cmVhbSwKKyAgICAgICAgLy8gdGhlbiB3ZSBiZWhhdmUgYXMgaWYgc2Vlayhsb25nKSBoYWQgYmVlbiBjYWxsZWQuCisgICAgICAgIGlmICghc2Vla05lZWRlZCkgeworICAgICAgICAgICAgaWYgKGN1ckJsb2NrSW5mby5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBjdXJCbG9ja0luZm8uc2V0TmV4dCgpOworICAgICAgICAgICAgICAgIGluaXRCbG9ja0RlY29kZXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlZWtQb3MgPSBjdXJQb3M7CisgICAgICAgIH0KKworICAgICAgICBzZWVrTmVlZGVkID0gZmFsc2U7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIHNlZWtpbmcgdG8gb3IgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICAgICAgICBpZiAoc2Vla1BvcyA+PSB1bmNvbXByZXNzZWRTaXplKSB7CisgICAgICAgICAgICBjdXJQb3MgPSBzZWVrUG9zOworICAgICAgICAgICAgYmxvY2tEZWNvZGVyID0gbnVsbDsKKyAgICAgICAgICAgIGVuZFJlYWNoZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZW5kUmVhY2hlZCA9IGZhbHNlOworCisgICAgICAgIC8vIExvY2F0ZSB0aGUgQmxvY2sgdGhhdCBjb250YWlucyB0aGUgdW5jb21wcmVzc2VkIHRhcmdldCBwb3NpdGlvbi4KKyAgICAgICAgbG9jYXRlQmxvY2tCeVBvcyhjdXJCbG9ja0luZm8sIHNlZWtQb3MpOworCisgICAgICAgIC8vIFNlZWsgaW4gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGFuZCBjcmVhdGUgYSBuZXcgQmxvY2sgZGVjb2RlcgorICAgICAgICAvLyBvbmx5IGlmIHJlYWxseSBuZWVkZWQuIFdlIGNhbiBza2lwIGl0IGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uCisgICAgICAgIC8vIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgQmxvY2sgYW5kIHRoZSB0YXJnZXQgcG9zaXRpb24gaGFzbid0CisgICAgICAgIC8vIGJlZW4gZGVjb21wcmVzc2VkIHlldC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTk9URTogSWYgY3VyUG9zIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgQmxvY2ssIGl0J3MKKyAgICAgICAgLy8gYmVjYXVzZSBpdCB3YXMgbGVmdCB0aGVyZSBhZnRlciBkZWNvbXByZXNzaW5nIGFuIGVhcmxpZXIgQmxvY2suCisgICAgICAgIC8vIEluIHRoYXQgY2FzZSwgZGVjb2Rpbmcgb2YgdGhlIGN1cnJlbnQgQmxvY2sgaGFzbid0IGJlZW4gc3RhcnRlZAorICAgICAgICAvLyB5ZXQuIChEZWNvZGluZyBvZiBhIEJsb2NrIHdvbid0IGJlIHN0YXJ0ZWQgdW50aWwgYXQgbGVhc3Qgb25lCisgICAgICAgIC8vIGJ5dGUgd2lsbCBhbHNvIGJlIHJlYWQgZnJvbSBpdC4pCisgICAgICAgIGlmICghKGN1clBvcyA+IGN1ckJsb2NrSW5mby51bmNvbXByZXNzZWRPZmZzZXQgJiYgY3VyUG9zIDw9IHNlZWtQb3MpKSB7CisgICAgICAgICAgICAvLyBTZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIEJsb2NrLgorICAgICAgICAgICAgaW4uc2VlayhjdXJCbG9ja0luZm8uY29tcHJlc3NlZE9mZnNldCk7CisKKyAgICAgICAgICAgIC8vIFNpbmNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhpcyBCbG9jayBpcyBmcm9tIGEgZGlmZmVyZW50CisgICAgICAgICAgICAvLyBTdHJlYW0gdGhhbiB0aGUgcHJldmlvdXMgQmxvY2ssIGluaXRpYWxpemUgYSBuZXcgQ2hlY2suCisgICAgICAgICAgICBjaGVjayA9IENoZWNrLmdldEluc3RhbmNlKGN1ckJsb2NrSW5mby5nZXRDaGVja1R5cGUoKSk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBCbG9jayBkZWNvZGVyLgorICAgICAgICAgICAgaW5pdEJsb2NrRGVjb2RlcigpOworICAgICAgICAgICAgY3VyUG9zID0gY3VyQmxvY2tJbmZvLnVuY29tcHJlc3NlZE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSB0YXJnZXQgd2Fzbid0IGF0IGEgQmxvY2sgYm91bmRhcnksIGRlY29tcHJlc3MgYW5kIHRocm93CisgICAgICAgIC8vIGF3YXkgZGF0YSB0byByZWFjaCB0aGUgdGFyZ2V0IHBvc2l0aW9uLgorICAgICAgICBpZiAoc2Vla1BvcyA+IGN1clBvcykgeworICAgICAgICAgICAgLy8gTk9URTogVGhlICJpZiIgYmVsb3cgaXMgdGhlcmUganVzdCBpbiBjYXNlLiBJbiB0aGlzIHNpdHVhdGlvbiwKKyAgICAgICAgICAgIC8vIGJsb2NrRGVjb2Rlci5za2lwIHdpbGwgYWx3YXlzIHNraXAgdGhlIHJlcXVlc3RlZCBhbW91bnQKKyAgICAgICAgICAgIC8vIG9yIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIGxvbmcgc2tpcEFtb3VudCA9IHNlZWtQb3MgLSBjdXJQb3M7CisgICAgICAgICAgICBpZiAoYmxvY2tEZWNvZGVyLnNraXAoc2tpcEFtb3VudCkgIT0gc2tpcEFtb3VudCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgY3VyUG9zID0gc2Vla1BvczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExvY2F0ZXMgdGhlIEJsb2NrIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIHVuY29tcHJlc3NlZCBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9jYXRlQmxvY2tCeVBvcyhCbG9ja0luZm8gaW5mbywgbG9uZyBwb3MpIHsKKyAgICAgICAgaWYgKHBvcyA8IDAgfHwgcG9zID49IHVuY29tcHJlc3NlZFNpemUpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdW5jb21wcmVzc2VkIHBvc2l0aW9uOiAiICsgcG9zKTsKKworICAgICAgICAvLyBMb2NhdGUgdGhlIFN0cmVhbSB0aGF0IGNvbnRhaW5zIHRoZSB0YXJnZXQgcG9zaXRpb24uCisgICAgICAgIEluZGV4RGVjb2RlciBpbmRleDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IDsgKytpKSB7CisgICAgICAgICAgICBpbmRleCA9IChJbmRleERlY29kZXIpc3RyZWFtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaW5kZXguaGFzVW5jb21wcmVzc2VkT2Zmc2V0KHBvcykpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2NhdGUgdGhlIEJsb2NrIGZyb20gdGhlIFN0cmVhbSB0aGF0IGNvbnRhaW5zIHRoZSB0YXJnZXQgcG9zaXRpb24uCisgICAgICAgIGluZGV4LmxvY2F0ZUJsb2NrKGluZm8sIHBvcyk7CisKKyAgICAgICAgYXNzZXJ0IChpbmZvLmNvbXByZXNzZWRPZmZzZXQgJiAzKSA9PSAwOworICAgICAgICBhc3NlcnQgaW5mby51bmNvbXByZXNzZWRTaXplID4gMDsKKyAgICAgICAgYXNzZXJ0IHBvcyA+PSBpbmZvLnVuY29tcHJlc3NlZE9mZnNldDsKKyAgICAgICAgYXNzZXJ0IHBvcyA8IGluZm8udW5jb21wcmVzc2VkT2Zmc2V0ICsgaW5mby51bmNvbXByZXNzZWRTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvY2F0ZXMgdGhlIGdpdmVuIEJsb2NrIGFuZCBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgaXQKKyAgICAgKiB0byA8Y29kZT5pbmZvPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9jYXRlQmxvY2tCeU51bWJlcihCbG9ja0luZm8gaW5mbywgaW50IGJsb2NrTnVtYmVyKSB7CisgICAgICAgIC8vIFZhbGlkYXRlLgorICAgICAgICBpZiAoYmxvY2tOdW1iZXIgPCAwIHx8IGJsb2NrTnVtYmVyID49IGJsb2NrQ291bnQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgWFogQmxvY2sgbnVtYmVyOiAiICsgYmxvY2tOdW1iZXIpOworCisgICAgICAgIC8vIFNraXAgdGhlIHNlYXJjaCBpZiBpbmZvIGFscmVhZHkgcG9pbnRzIHRvIHRoZSBjb3JyZWN0IEJsb2NrLgorICAgICAgICBpZiAoaW5mby5ibG9ja051bWJlciA9PSBibG9ja051bWJlcikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBTZWFyY2ggdGhlIFN0cmVhbSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBCbG9jayBhbmQgdGhlbgorICAgICAgICAvLyBzZWFyY2ggdGhlIEJsb2NrIGZyb20gdGhhdCBTdHJlYW0uCisgICAgICAgIGZvciAoaW50IGkgPSAwOyA7ICsraSkgeworICAgICAgICAgICAgSW5kZXhEZWNvZGVyIGluZGV4ID0gKEluZGV4RGVjb2RlcilzdHJlYW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpbmRleC5oYXNSZWNvcmQoYmxvY2tOdW1iZXIpKSB7CisgICAgICAgICAgICAgICAgaW5kZXguc2V0QmxvY2tJbmZvKGluZm8sIGJsb2NrTnVtYmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIG5ldyBCbG9ja0lucHV0U3RyZWFtLiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvcgorICAgICAqIDxjb2RlPnNlZWsoKTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRCbG9ja0RlY29kZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gU2V0IGl0IHRvIG51bGwgZmlyc3Qgc28gdGhhdCBHQyBjYW4gY29sbGVjdCBpdCBpZiBtZW1vcnkKKyAgICAgICAgICAgIC8vIHJ1bnMgdGlnaHQgd2hlbiBpbml0aWFsaXppbmcgYSBuZXcgQmxvY2tJbnB1dFN0cmVhbS4KKyAgICAgICAgICAgIGJsb2NrRGVjb2RlciA9IG51bGw7CisgICAgICAgICAgICBibG9ja0RlY29kZXIgPSBuZXcgQmxvY2tJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgaW4sIGNoZWNrLCB2ZXJpZnlDaGVjaywgbWVtb3J5TGltaXQsCisgICAgICAgICAgICAgICAgICAgIGN1ckJsb2NrSW5mby51bnBhZGRlZFNpemUsIGN1ckJsb2NrSW5mby51bmNvbXByZXNzZWRTaXplKTsKKyAgICAgICAgfSBjYXRjaCAoTWVtb3J5TGltaXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gQmxvY2tJbnB1dFN0cmVhbSBkb2Vzbid0IGtub3cgaG93IG11Y2ggbWVtb3J5IHdlIGhhZAorICAgICAgICAgICAgLy8gYWxyZWFkeSBuZWVkZWQgc28gd2UgbmVlZCB0byByZWNyZWF0ZSB0aGUgZXhjZXB0aW9uLgorICAgICAgICAgICAgYXNzZXJ0IG1lbW9yeUxpbWl0ID49IDA7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWVtb3J5TGltaXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVtb3J5TmVlZGVkKCkgKyBpbmRleE1lbW9yeVVzYWdlLAorICAgICAgICAgICAgICAgICAgICBtZW1vcnlMaW1pdCArIGluZGV4TWVtb3J5VXNhZ2UpOworICAgICAgICB9IGNhdGNoIChJbmRleEluZGljYXRvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJdCBjYW5ub3QgYmUgSW5kZXggc28gdGhlIGZpbGUgbXVzdCBiZSBjb3JydXB0LgorICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovU2ltcGxlSW5wdXRTdHJlYW0uamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9TaW1wbGVJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDQwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovU2ltcGxlSW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIFNpbXBsZUlucHV0U3RyZWFtCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLnR1a2FhbmkueHouc2ltcGxlLlNpbXBsZUZpbHRlcjsKKworY2xhc3MgU2ltcGxlSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9CVUZfU0laRSA9IDQwOTY7CisKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGluOworICAgIHByaXZhdGUgZmluYWwgU2ltcGxlRmlsdGVyIHNpbXBsZUZpbHRlcjsKKworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGZpbHRlckJ1ZiA9IG5ldyBieXRlW0ZJTFRFUl9CVUZfU0laRV07CisgICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKKyAgICBwcml2YXRlIGludCBmaWx0ZXJlZCA9IDA7CisgICAgcHJpdmF0ZSBpbnQgdW5maWx0ZXJlZCA9IDA7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZW5kUmVhY2hlZCA9IGZhbHNlOworICAgIHByaXZhdGUgSU9FeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHRlbXBCdWYgPSBuZXcgYnl0ZVsxXTsKKworICAgIHN0YXRpYyBpbnQgZ2V0TWVtb3J5VXNhZ2UoKSB7CisgICAgICAgIHJldHVybiAxICsgRklMVEVSX0JVRl9TSVpFIC8gMTAyNDsKKyAgICB9CisKKyAgICBTaW1wbGVJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgU2ltcGxlRmlsdGVyIHNpbXBsZUZpbHRlcikgeworICAgICAgICAvLyBDaGVjayBmb3IgbnVsbCBiZWNhdXNlIG90aGVyd2lzZSBudWxsIGlzbid0IGRldGVjdAorICAgICAgICAvLyBpbiB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAgICBpZiAoaW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCisgICAgICAgIC8vIFRoZSBzaW1wbGVGaWx0ZXIgYXJndW1lbnQgY29tZXMgZnJvbSB0aGlzIHBhY2thZ2UKKyAgICAgICAgLy8gc28gaXQgaXMga25vd24gdG8gYmUgbm9uLW51bGwgYWxyZWFkeS4KKyAgICAgICAgYXNzZXJ0IHNpbXBsZUZpbHRlciAhPSBudWxsOworCisgICAgICAgIHRoaXMuaW4gPSBpbjsKKyAgICAgICAgdGhpcy5zaW1wbGVGaWx0ZXIgPSBzaW1wbGVGaWx0ZXI7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWQodGVtcEJ1ZiwgMCwgMSkgPT0gLTEgPyAtMSA6ICh0ZW1wQnVmWzBdICYgMHhGRik7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvZmYgPCAwIHx8IGxlbiA8IDAgfHwgb2ZmICsgbGVuIDwgMCB8fCBvZmYgKyBsZW4gPiBidWYubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKworICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoaW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYWklPRXhjZXB0aW9uKCJTdHJlYW0gY2xvc2VkIik7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgLy8gQ29weSBmaWx0ZXJlZCBkYXRhIGludG8gdGhlIGNhbGxlci1wcm92aWRlZCBidWZmZXIuCisgICAgICAgICAgICAgICAgaW50IGNvcHlTaXplID0gTWF0aC5taW4oZmlsdGVyZWQsIGxlbik7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmaWx0ZXJCdWYsIHBvcywgYnVmLCBvZmYsIGNvcHlTaXplKTsKKyAgICAgICAgICAgICAgICBwb3MgKz0gY29weVNpemU7CisgICAgICAgICAgICAgICAgZmlsdGVyZWQgLT0gY29weVNpemU7CisgICAgICAgICAgICAgICAgb2ZmICs9IGNvcHlTaXplOworICAgICAgICAgICAgICAgIGxlbiAtPSBjb3B5U2l6ZTsKKyAgICAgICAgICAgICAgICBzaXplICs9IGNvcHlTaXplOworCisgICAgICAgICAgICAgICAgLy8gSWYgZW5kIG9mIGZpbHRlckJ1ZiB3YXMgcmVhY2hlZCwgbW92ZSB0aGUgcGVuZGluZyBkYXRhIHRvCisgICAgICAgICAgICAgICAgLy8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNvIHRoYXQgbW9yZSBkYXRhIGNhbiBiZQorICAgICAgICAgICAgICAgIC8vIGNvcGllZCBpbnRvIGZpbHRlckJ1ZiBvbiB0aGUgbmV4dCBsb29wIGl0ZXJhdGlvbi4KKyAgICAgICAgICAgICAgICBpZiAocG9zICsgZmlsdGVyZWQgKyB1bmZpbHRlcmVkID09IEZJTFRFUl9CVUZfU0laRSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZpbHRlckJ1ZiwgcG9zLCBmaWx0ZXJCdWYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQgKyB1bmZpbHRlcmVkKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuID09IDAgfHwgZW5kUmVhY2hlZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemUgPiAwID8gc2l6ZSA6IC0xOworCisgICAgICAgICAgICAgICAgYXNzZXJ0IGZpbHRlcmVkID09IDA7CisKKyAgICAgICAgICAgICAgICAvLyBHZXQgbW9yZSBkYXRhIGludG8gdGhlIHRlbXBvcmFyeSBidWZmZXIuCisgICAgICAgICAgICAgICAgaW50IGluU2l6ZSA9IEZJTFRFUl9CVUZfU0laRSAtIChwb3MgKyBmaWx0ZXJlZCArIHVuZmlsdGVyZWQpOworICAgICAgICAgICAgICAgIGluU2l6ZSA9IGluLnJlYWQoZmlsdGVyQnVmLCBwb3MgKyBmaWx0ZXJlZCArIHVuZmlsdGVyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNpemUpOworCisgICAgICAgICAgICAgICAgaWYgKGluU2l6ZSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoZSByZW1haW5pbmcgdW5maWx0ZXJlZCBieXRlcyB0byBiZSByZWFkeQorICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSBjb3BpZWQgb3V0LgorICAgICAgICAgICAgICAgICAgICBlbmRSZWFjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQgPSB1bmZpbHRlcmVkOworICAgICAgICAgICAgICAgICAgICB1bmZpbHRlcmVkID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgdGhlIGRhdGEgaW4gZmlsdGVyQnVmLgorICAgICAgICAgICAgICAgICAgICB1bmZpbHRlcmVkICs9IGluU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQgPSBzaW1wbGVGaWx0ZXIuY29kZShmaWx0ZXJCdWYsIHBvcywgdW5maWx0ZXJlZCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmaWx0ZXJlZCA8PSB1bmZpbHRlcmVkOworICAgICAgICAgICAgICAgICAgICB1bmZpbHRlcmVkIC09IGZpbHRlcmVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFhaSU9FeGNlcHRpb24oIlN0cmVhbSBjbG9zZWQiKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisKKyAgICAgICAgcmV0dXJuIGZpbHRlcmVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaW4gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1NpbXBsZU91dHB1dFN0cmVhbS5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1NpbXBsZU91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MWIxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovU2ltcGxlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBTaW1wbGVPdXRwdXRTdHJlYW0KKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLnR1a2FhbmkueHouc2ltcGxlLlNpbXBsZUZpbHRlcjsKKworY2xhc3MgU2ltcGxlT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmluaXNoYWJsZU91dHB1dFN0cmVhbSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9CVUZfU0laRSA9IDQwOTY7CisKKyAgICBwcml2YXRlIEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gb3V0OworICAgIHByaXZhdGUgZmluYWwgU2ltcGxlRmlsdGVyIHNpbXBsZUZpbHRlcjsKKworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGZpbHRlckJ1ZiA9IG5ldyBieXRlW0ZJTFRFUl9CVUZfU0laRV07CisgICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKKyAgICBwcml2YXRlIGludCB1bmZpbHRlcmVkID0gMDsKKworICAgIHByaXZhdGUgSU9FeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmluaXNoZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHRlbXBCdWYgPSBuZXcgYnl0ZVsxXTsKKworICAgIHN0YXRpYyBpbnQgZ2V0TWVtb3J5VXNhZ2UoKSB7CisgICAgICAgIHJldHVybiAxICsgRklMVEVSX0JVRl9TSVpFIC8gMTAyNDsKKyAgICB9CisKKyAgICBTaW1wbGVPdXRwdXRTdHJlYW0oRmluaXNoYWJsZU91dHB1dFN0cmVhbSBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZUZpbHRlciBzaW1wbGVGaWx0ZXIpIHsKKyAgICAgICAgaWYgKG91dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisKKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgICAgIHRoaXMuc2ltcGxlRmlsdGVyID0gc2ltcGxlRmlsdGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZW1wQnVmWzBdID0gKGJ5dGUpYjsKKyAgICAgICAgd3JpdGUodGVtcEJ1ZiwgMCwgMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG9mZiA8IDAgfHwgbGVuIDwgMCB8fCBvZmYgKyBsZW4gPCAwIHx8IG9mZiArIGxlbiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCisgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKworICAgICAgICBpZiAoZmluaXNoZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgWFpJT0V4Y2VwdGlvbigiU3RyZWFtIGZpbmlzaGVkIG9yIGNsb3NlZCIpOworCisgICAgICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgICAgICAvLyBDb3B5IG1vcmUgdW5maWx0ZXJlZCBkYXRhIGludG8gZmlsdGVyQnVmLgorICAgICAgICAgICAgaW50IGNvcHlTaXplID0gTWF0aC5taW4obGVuLCBGSUxURVJfQlVGX1NJWkUgLSAocG9zICsgdW5maWx0ZXJlZCkpOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIG9mZiwgZmlsdGVyQnVmLCBwb3MgKyB1bmZpbHRlcmVkLCBjb3B5U2l6ZSk7CisgICAgICAgICAgICBvZmYgKz0gY29weVNpemU7CisgICAgICAgICAgICBsZW4gLT0gY29weVNpemU7CisgICAgICAgICAgICB1bmZpbHRlcmVkICs9IGNvcHlTaXplOworCisgICAgICAgICAgICAvLyBGaWx0ZXIgdGhlIGRhdGEgaW4gZmlsdGVyQnVmLgorICAgICAgICAgICAgaW50IGZpbHRlcmVkID0gc2ltcGxlRmlsdGVyLmNvZGUoZmlsdGVyQnVmLCBwb3MsIHVuZmlsdGVyZWQpOworICAgICAgICAgICAgYXNzZXJ0IGZpbHRlcmVkIDw9IHVuZmlsdGVyZWQ7CisgICAgICAgICAgICB1bmZpbHRlcmVkIC09IGZpbHRlcmVkOworCisgICAgICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIGZpbHRlcmVkIGRhdGEuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG91dC53cml0ZShmaWx0ZXJCdWYsIHBvcywgZmlsdGVyZWQpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9zICs9IGZpbHRlcmVkOworCisgICAgICAgICAgICAvLyBJZiBlbmQgb2YgZmlsdGVyQnVmIHdhcyByZWFjaGVkLCBtb3ZlIHRoZSBwZW5kaW5nIHVuZmlsdGVyZWQKKyAgICAgICAgICAgIC8vIGRhdGEgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNvIHRoYXQgbW9yZSBkYXRhIGNhbgorICAgICAgICAgICAgLy8gYmUgY29waWVkIGludG8gZmlsdGVyQnVmIG9uIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uLgorICAgICAgICAgICAgaWYgKHBvcyArIHVuZmlsdGVyZWQgPT0gRklMVEVSX0JVRl9TSVpFKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmaWx0ZXJCdWYsIHBvcywgZmlsdGVyQnVmLCAwLCB1bmZpbHRlcmVkKTsKKyAgICAgICAgICAgICAgICBwb3MgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUGVuZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydCAhZmluaXNoZWQ7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQud3JpdGUoZmlsdGVyQnVmLCBwb3MsIHVuZmlsdGVyZWQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oIkZsdXNoaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWZpbmlzaGVkKSB7CisgICAgICAgICAgICAvLyBJZiBpdCBmYWlscywgZG9uJ3QgY2FsbCBvdXQuZmluaXNoKCkuCisgICAgICAgICAgICB3cml0ZVBlbmRpbmcoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQuZmluaXNoKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghZmluaXNoZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBvdXQuY2xvc2UoKSBtdXN0IGJlIGNhbGxlZCBldmVuIGlmIHdyaXRlUGVuZGluZygpIGZhaWxzLgorICAgICAgICAgICAgICAgIC8vIHdyaXRlUGVuZGluZygpIHNhdmVzIHRoZSBwb3NzaWJsZSBleGNlcHRpb24gc28gd2UgY2FuCisgICAgICAgICAgICAgICAgLy8gaWdub3JlIGV4Y2VwdGlvbnMgaGVyZS4KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZVBlbmRpbmcoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGVhcmxpZXIgZXhjZXB0aW9uLCB0aGUgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgLy8gZnJvbSBvdXQuY2xvc2UoKSBpcyBsb3N0LgorICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovU2luZ2xlWFpJbnB1dFN0cmVhbS5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1NpbmdsZVhaSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM1YTE2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1NpbmdsZVhaSW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDM3NSBAQAorLyoKKyAqIFNpbmdsZVhaSW5wdXRTdHJlYW0KKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5jb21tb24uRGVjb2RlclV0aWw7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouY29tbW9uLlN0cmVhbUZsYWdzOworaW1wb3J0IG9yZy50dWthYW5pLnh6LmluZGV4LkluZGV4SGFzaDsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5jaGVjay5DaGVjazsKKworLyoqCisgKiBEZWNvbXByZXNzZXMgZXhhY3RseSBvbmUgWFogU3RyZWFtIGluIHN0cmVhbWVkIG1vZGUgKG5vIHNlZWtpbmcpLgorICogVGhlIGRlY29tcHJlc3Npb24gc3RvcHMgYWZ0ZXIgdGhlIGZpcnN0IFhaIFN0cmVhbSBoYXMgYmVlbiBkZWNvbXByZXNzZWQsCisgKiBhbmQgdGhlIHJlYWQgcG9zaXRpb24gaW4gdGhlIGlucHV0IHN0cmVhbSBpcyBsZWZ0IGF0IHRoZSBmaXJzdCBieXRlCisgKiBhZnRlciB0aGUgZW5kIG9mIHRoZSBYWiBTdHJlYW0uIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIFhaIGRhdGEgaGFzCisgKiBiZWVuIHN0b3JlZCBpbnNpZGUgc29tZSBvdGhlciBmaWxlIGZvcm1hdCBvciBwcm90b2NvbC4KKyAqIDxwPgorICogVW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZywgZG9uJ3QgdXNlIHRoaXMgY2xhc3MgdG8gZGVjb21wcmVzcworICogc3RhbmRhbG9uZSAueHogZmlsZXMuIEZvciB0aGF0IHB1cnBvc2UsIHVzZSA8Y29kZT5YWklucHV0U3RyZWFtPC9jb2RlPi4KKyAqCisgKiA8aDQ+V2hlbiB1bmNvbXByZXNzZWQgc2l6ZSBpcyBrbm93biBiZWZvcmVoYW5kPC9oND4KKyAqIDxwPgorICogSWYgeW91IGFyZSBkZWNvbXByZXNzaW5nIGNvbXBsZXRlIFhaIHN0cmVhbXMgYW5kIHlvdXIgYXBwbGljYXRpb24ga25vd3MKKyAqIGV4YWN0bHkgaG93IG11Y2ggdW5jb21wcmVzc2VkIGRhdGEgdGhlcmUgc2hvdWxkIGJlLCBpdCBpcyBnb29kIHRvIHRyeQorICogcmVhZGluZyBvbmUgbW9yZSBieXRlIGJ5IGNhbGxpbmcgPGNvZGU+cmVhZCgpPC9jb2RlPiBhbmQgY2hlY2tpbmcKKyAqIHRoYXQgaXQgcmV0dXJucyA8Y29kZT4tMTwvY29kZT4uIFRoaXMgd2F5IHRoZSBkZWNvbXByZXNzb3Igd2lsbCBwYXJzZSB0aGUKKyAqIGZpbGUgZm9vdGVycyBhbmQgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgY2hlY2tzLCBnaXZpbmcgdGhlIGNhbGxlciBtb3JlCisgKiBjb25maWRlbmNlIHRoYXQgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGlzIHZhbGlkLgorICoKKyAqIEBzZWUgWFpJbnB1dFN0cmVhbQorICovCitwdWJsaWMgY2xhc3MgU2luZ2xlWFpJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGluOworICAgIHByaXZhdGUgZmluYWwgaW50IG1lbW9yeUxpbWl0OworICAgIHByaXZhdGUgZmluYWwgU3RyZWFtRmxhZ3Mgc3RyZWFtSGVhZGVyRmxhZ3M7CisgICAgcHJpdmF0ZSBmaW5hbCBDaGVjayBjaGVjazsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdmVyaWZ5Q2hlY2s7CisgICAgcHJpdmF0ZSBCbG9ja0lucHV0U3RyZWFtIGJsb2NrRGVjb2RlciA9IG51bGw7CisgICAgcHJpdmF0ZSBmaW5hbCBJbmRleEhhc2ggaW5kZXhIYXNoID0gbmV3IEluZGV4SGFzaCgpOworICAgIHByaXZhdGUgYm9vbGVhbiBlbmRSZWFjaGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBJT0V4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworCisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gdGVtcEJ1ZiA9IG5ldyBieXRlWzFdOworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIFN0cmVhbSBIZWFkZXIgaW50byBhIGJ1ZmZlci4KKyAgICAgKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgY29uc3RydWN0b3JzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSByZWFkU3RyZWFtSGVhZGVyKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gc3RyZWFtSGVhZGVyID0gbmV3IGJ5dGVbRGVjb2RlclV0aWwuU1RSRUFNX0hFQURFUl9TSVpFXTsKKyAgICAgICAgbmV3IERhdGFJbnB1dFN0cmVhbShpbikucmVhZEZ1bGx5KHN0cmVhbUhlYWRlcik7CisgICAgICAgIHJldHVybiBzdHJlYW1IZWFkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBYWiBkZWNvbXByZXNzb3IgdGhhdCBkZWNvbXByZXNzZXMgZXhhY3RseSBvbmUKKyAgICAgKiBYWiBTdHJlYW0gZnJvbSA8Y29kZT5pbjwvY29kZT4gd2l0aG91dCBhIG1lbW9yeSB1c2FnZSBsaW1pdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIHJlYWRzIGFuZCBwYXJzZXMgdGhlIFhaIFN0cmVhbSBIZWFkZXIgKDEyIGJ5dGVzKQorICAgICAqIGZyb20gPGNvZGU+aW48L2NvZGU+LiBUaGUgaGVhZGVyIG9mIHRoZSBmaXJzdCBCbG9jayBpcyBub3QgcmVhZAorICAgICAqIHVudGlsIDxjb2RlPnJlYWQ8L2NvZGU+IGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBpbiAgICAgICAgICBpbnB1dCBzdHJlYW0gZnJvbSB3aGljaCBYWi1jb21wcmVzc2VkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgcmVhZAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFhaRm9ybWF0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGlzIG5vdCBpbiB0aGUgWFogZm9ybWF0CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWFogaGVhZGVyIENSQzMyIGRvZXNuJ3QgbWF0Y2gKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWFogaGVhZGVyIGlzIHZhbGlkIGJ1dCBzcGVjaWZpZXMgb3B0aW9ucworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIDEyIGJ5dGVzIG9mIGlucHV0IHdhcyBhdmFpbGFibGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA8Y29kZT5pbjwvY29kZT4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IDxjb2RlPmluPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBTaW5nbGVYWklucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKGluLCAtMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBYWiBkZWNvbXByZXNzb3IgdGhhdCBkZWNvbXByZXNzZXMgZXhhY3RseSBvbmUKKyAgICAgKiBYWiBTdHJlYW0gZnJvbSA8Y29kZT5pbjwvY29kZT4gd2l0aCBhbiBvcHRpb25hbCBtZW1vcnkgdXNhZ2UgbGltaXQuCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyBpZGVudGljYWwgdG8gPGNvZGU+U2luZ2xlWFpJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSk8L2NvZGU+CisgICAgICogZXhjZXB0IHRoYXQgdGhpcyB0YWtlcyBhbHNvIHRoZSA8Y29kZT5tZW1vcnlMaW1pdDwvY29kZT4gYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgaW4gICAgICAgICAgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggWFotY29tcHJlc3NlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIHJlYWQKKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBtZW1vcnlMaW1pdCBtZW1vcnkgdXNhZ2UgbGltaXQgaW4ga2liaWJ5dGVzIChLaUIpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIDxjb2RlPi0xPC9jb2RlPiB0byBpbXBvc2Ugbm8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IHVzYWdlIGxpbWl0CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgaXMgbm90IGluIHRoZSBYWiBmb3JtYXQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWiBoZWFkZXIgQ1JDMzIgZG9lc24ndCBtYXRjaAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWiBoZWFkZXIgaXMgdmFsaWQgYnV0IHNwZWNpZmllcyBvcHRpb25zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gMTIgYnl0ZXMgb2YgaW5wdXQgd2FzIGF2YWlsYWJsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIDxjb2RlPmluPC9jb2RlPgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYnkgPGNvZGU+aW48L2NvZGU+CisgICAgICovCisgICAgcHVibGljIFNpbmdsZVhaSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGludCBtZW1vcnlMaW1pdCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoaW4sIG1lbW9yeUxpbWl0LCB0cnVlLCByZWFkU3RyZWFtSGVhZGVyKGluKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBYWiBkZWNvbXByZXNzb3IgdGhhdCBkZWNvbXByZXNzZXMgZXhhY3RseSBvbmUKKyAgICAgKiBYWiBTdHJlYW0gZnJvbSA8Y29kZT5pbjwvY29kZT4gd2l0aCBhbiBvcHRpb25hbCBtZW1vcnkgdXNhZ2UgbGltaXQKKyAgICAgKiBhbmQgYWJpbGl0eSB0byBkaXNhYmxlIHZlcmlmaWNhdGlvbiBvZiBpbnRlZ3JpdHkgY2hlY2tzLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgaWRlbnRpY2FsIHRvIDxjb2RlPlNpbmdsZVhaSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0saW50KTwvY29kZT4KKyAgICAgKiBleGNlcHQgdGhhdCB0aGlzIHRha2VzIGFsc28gdGhlIDxjb2RlPnZlcmlmeUNoZWNrPC9jb2RlPiBhcmd1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgaW50ZWdyaXR5IGNoZWNrIHZlcmlmaWNhdGlvbiBzaG91bGQgYWxtb3N0IG5ldmVyIGJlIGRpc2FibGVkLgorICAgICAqIFBvc3NpYmxlIHJlYXNvbnMgdG8gZGlzYWJsZSBpbnRlZ3JpdHkgY2hlY2sgdmVyaWZpY2F0aW9uOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5UcnlpbmcgdG8gcmVjb3ZlciBkYXRhIGZyb20gYSBjb3JydXB0IC54eiBmaWxlLjwvbGk+CisgICAgICogICA8bGk+U3BlZWRpbmcgdXAgZGVjb21wcmVzc2lvbi4gVGhpcyBtYXR0ZXJzIG1vc3RseSB3aXRoIFNIQS0yNTYKKyAgICAgKiAgIG9yIHdpdGggZmlsZXMgdGhhdCBoYXZlIGNvbXByZXNzZWQgZXh0cmVtZWx5IHdlbGwuIEl0J3MgcmVjb21tZW5kZWQKKyAgICAgKiAgIHRoYXQgaW50ZWdyaXR5IGNoZWNraW5nIGlzbid0IGRpc2FibGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zCisgICAgICogICB1bmxlc3MgdGhlIGZpbGUgaW50ZWdyaXR5IGlzIHZlcmlmaWVkIGV4dGVybmFsbHkgaW4gc29tZSBvdGhlcgorICAgICAqICAgd2F5LjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiA8Y29kZT52ZXJpZnlDaGVjazwvY29kZT4gb25seSBhZmZlY3RzIHRoZSBpbnRlZ3JpdHkgY2hlY2sgb2YKKyAgICAgKiB0aGUgYWN0dWFsIGNvbXByZXNzZWQgZGF0YS4gVGhlIENSQzMyIGZpZWxkcyBpbiB0aGUgaGVhZGVycworICAgICAqIGFyZSBhbHdheXMgdmVyaWZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgaW4gICAgICAgICAgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggWFotY29tcHJlc3NlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIHJlYWQKKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBtZW1vcnlMaW1pdCBtZW1vcnkgdXNhZ2UgbGltaXQgaW4ga2liaWJ5dGVzIChLaUIpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIDxjb2RlPi0xPC9jb2RlPiB0byBpbXBvc2Ugbm8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IHVzYWdlIGxpbWl0CisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgdmVyaWZ5Q2hlY2sgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBpbnRlZ3JpdHkgY2hlY2tzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdmVyaWZpZWQ7IHRoaXMgc2hvdWxkIGFsbW9zdCBuZXZlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgaXMgbm90IGluIHRoZSBYWiBmb3JtYXQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWiBoZWFkZXIgQ1JDMzIgZG9lc24ndCBtYXRjaAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWiBoZWFkZXIgaXMgdmFsaWQgYnV0IHNwZWNpZmllcyBvcHRpb25zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gMTIgYnl0ZXMgb2YgaW5wdXQgd2FzIGF2YWlsYWJsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIDxjb2RlPmluPC9jb2RlPgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYnkgPGNvZGU+aW48L2NvZGU+CisgICAgICoKKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIFNpbmdsZVhaSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGludCBtZW1vcnlMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHZlcmlmeUNoZWNrKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKGluLCBtZW1vcnlMaW1pdCwgdmVyaWZ5Q2hlY2ssIHJlYWRTdHJlYW1IZWFkZXIoaW4pKTsKKyAgICB9CisKKyAgICBTaW5nbGVYWklucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBpbnQgbWVtb3J5TGltaXQsIGJvb2xlYW4gdmVyaWZ5Q2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gc3RyZWFtSGVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLmluID0gaW47CisgICAgICAgIHRoaXMubWVtb3J5TGltaXQgPSBtZW1vcnlMaW1pdDsKKyAgICAgICAgdGhpcy52ZXJpZnlDaGVjayA9IHZlcmlmeUNoZWNrOworICAgICAgICBzdHJlYW1IZWFkZXJGbGFncyA9IERlY29kZXJVdGlsLmRlY29kZVN0cmVhbUhlYWRlcihzdHJlYW1IZWFkZXIpOworICAgICAgICBjaGVjayA9IENoZWNrLmdldEluc3RhbmNlKHN0cmVhbUhlYWRlckZsYWdzLmNoZWNrVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgSUQgb2YgdGhlIGludGVncml0eSBjaGVjayB1c2VkIGluIHRoaXMgWFogU3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiAgICAgIHRoZSBDaGVjayBJRCBzcGVjaWZpZWQgaW4gdGhlIFhaIFN0cmVhbSBIZWFkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENoZWNrVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0cmVhbUhlYWRlckZsYWdzLmNoZWNrVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBpbnRlZ3JpdHkgY2hlY2sgdXNlZCBpbiB0aGlzIFhaIFN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgICB0aGUgbmFtZSBvZiB0aGUgY2hlY2sgc3BlY2lmaWVkIGluIHRoZSBYWiBTdHJlYW0gSGVhZGVyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDaGVja05hbWUoKSB7CisgICAgICAgIHJldHVybiBjaGVjay5nZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb21wcmVzc2VzIHRoZSBuZXh0IGJ5dGUgZnJvbSB0aGlzIGlucHV0IHN0cmVhbS4KKyAgICAgKiA8cD4KKyAgICAgKiBSZWFkaW5nIGxvdHMgb2YgZGF0YSB3aXRoIDxjb2RlPnJlYWQoKTwvY29kZT4gZnJvbSB0aGlzIGlucHV0IHN0cmVhbQorICAgICAqIG1heSBiZSBpbmVmZmljaWVudC4gV3JhcCBpdCBpbiB7QGxpbmsgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtfQorICAgICAqIGlmIHlvdSBuZWVkIHRvIHJlYWQgbG90cyBvZiBkYXRhIG9uZSBieXRlIGF0IGEgdGltZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBkZWNvbXByZXNzZWQgYnl0ZSwgb3IgPGNvZGU+LTE8L2NvZGU+CisgICAgICogICAgICAgICAgICAgIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgc3RyZWFtCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzICAgICAgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uCisgICAgICogQHRocm93cyAgICAgIE1lbW9yeUxpbWl0RXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpJT0V4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkIGlucHV0IGlzIHRydW5jYXRlZCBvciBjb3JydXB0CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBieSA8Y29kZT5pbjwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZCh0ZW1wQnVmLCAwLCAxKSA9PSAtMSA/IC0xIDogKHRlbXBCdWZbMF0gJiAweEZGKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvbXByZXNzZXMgaW50byBhbiBhcnJheSBvZiBieXRlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiA8Y29kZT5sZW48L2NvZGU+IGlzIHplcm8sIG5vIGJ5dGVzIGFyZSByZWFkIGFuZCA8Y29kZT4wPC9jb2RlPgorICAgICAqIGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhpcyB3aWxsIHRyeSB0byBkZWNvbXByZXNzIDxjb2RlPmxlbjwvY29kZT4KKyAgICAgKiBieXRlcyBvZiB1bmNvbXByZXNzZWQgZGF0YS4gTGVzcyB0aGFuIDxjb2RlPmxlbjwvY29kZT4gYnl0ZXMgbWF5CisgICAgICogYmUgcmVhZCBvbmx5IGluIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uczoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+VGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIHdhcyByZWFjaGVkIHN1Y2Nlc3NmdWxseS48L2xpPgorICAgICAqICAgPGxpPkFuIGVycm9yIGlzIGRldGVjdGVkIGFmdGVyIGF0IGxlYXN0IG9uZSBidXQgbGVzcyA8Y29kZT5sZW48L2NvZGU+CisgICAgICogICAgICAgYnl0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29tcHJlc3NlZC4KKyAgICAgKiAgICAgICBUaGUgbmV4dCBjYWxsIHdpdGggbm9uLXplcm8gPGNvZGU+bGVuPC9jb2RlPiB3aWxsIGltbWVkaWF0ZWx5CisgICAgICogICAgICAgdGhyb3cgdGhlIHBlbmRpbmcgZXhjZXB0aW9uLjwvbGk+CisgICAgICogICA8bGk+QW4gZXhjZXB0aW9uIGlzIHRocm93bi48L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgYnVmICAgICAgICAgdGFyZ2V0IGJ1ZmZlciBmb3IgdW5jb21wcmVzc2VkIGRhdGEKKyAgICAgKiBAcGFyYW0gICAgICAgb2ZmICAgICAgICAgc3RhcnQgb2Zmc2V0IGluIDxjb2RlPmJ1ZjwvY29kZT4KKyAgICAgKiBAcGFyYW0gICAgICAgbGVuICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIHRvIHJlYWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgICBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgPGNvZGU+LTE8L2NvZGU+IHRvIGluZGljYXRlCisgICAgICogICAgICAgICAgICAgIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgc3RyZWFtCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzICAgICAgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uCisgICAgICogQHRocm93cyAgICAgIE1lbW9yeUxpbWl0RXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpJT0V4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkIGlucHV0IGlzIHRydW5jYXRlZCBvciBjb3JydXB0CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBieSA8Y29kZT5pbjwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG9mZiA8IDAgfHwgbGVuIDwgMCB8fCBvZmYgKyBsZW4gPCAwIHx8IG9mZiArIGxlbiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCisgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmIChpbiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFhaSU9FeGNlcHRpb24oIlN0cmVhbSBjbG9zZWQiKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisKKyAgICAgICAgaWYgKGVuZFJlYWNoZWQpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgaW50IHNpemUgPSAwOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChibG9ja0RlY29kZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tEZWNvZGVyID0gbmV3IEJsb2NrSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLCBjaGVjaywgdmVyaWZ5Q2hlY2ssIG1lbW9yeUxpbWl0LCAtMSwgLTEpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbmRleEluZGljYXRvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEhhc2gudmFsaWRhdGUoaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVTdHJlYW1Gb290ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZFJlYWNoZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemUgPiAwID8gc2l6ZSA6IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IHJldCA9IGJsb2NrRGVjb2Rlci5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworCisgICAgICAgICAgICAgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSByZXQ7CisgICAgICAgICAgICAgICAgICAgIG9mZiArPSByZXQ7CisgICAgICAgICAgICAgICAgICAgIGxlbiAtPSByZXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXhIYXNoLmFkZChibG9ja0RlY29kZXIuZ2V0VW5wYWRkZWRTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tEZWNvZGVyLmdldFVuY29tcHJlc3NlZFNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrRGVjb2RlciA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU3RyZWFtRm9vdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0RlY29kZXJVdGlsLlNUUkVBTV9IRUFERVJfU0laRV07CisgICAgICAgIG5ldyBEYXRhSW5wdXRTdHJlYW0oaW4pLnJlYWRGdWxseShidWYpOworICAgICAgICBTdHJlYW1GbGFncyBzdHJlYW1Gb290ZXJGbGFncyA9IERlY29kZXJVdGlsLmRlY29kZVN0cmVhbUZvb3RlcihidWYpOworCisgICAgICAgIGlmICghRGVjb2RlclV0aWwuYXJlU3RyZWFtRmxhZ3NFcXVhbChzdHJlYW1IZWFkZXJGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUZvb3RlckZsYWdzKQorICAgICAgICAgICAgICAgIHx8IGluZGV4SGFzaC5nZXRJbmRleFNpemUoKSAhPSBzdHJlYW1Gb290ZXJGbGFncy5iYWNrd2FyZFNpemUpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJYWiBTdHJlYW0gRm9vdGVyIGRvZXMgbm90IG1hdGNoIFN0cmVhbSBIZWFkZXIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQKKyAgICAgKiB3aXRob3V0IGJsb2NraW5nLiBUaGUgdmFsdWUgaXMgcmV0dXJuZWQgd2l0aCBhbiBhc3N1bXB0aW9uCisgICAgICogdGhhdCB0aGUgY29tcHJlc3NlZCBpbnB1dCBkYXRhIHdpbGwgYmUgdmFsaWQuIElmIHRoZSBjb21wcmVzc2VkCisgICAgICogZGF0YSBpcyBjb3JydXB0LCA8Y29kZT5Db3JydXB0ZWRJbnB1dEV4Y2VwdGlvbjwvY29kZT4gbWF5IGdldAorICAgICAqIHRocm93biBiZWZvcmUgdGhlIG51bWJlciBvZiBieXRlcyBjbGFpbWVkIHRvIGJlIGF2YWlsYWJsZSBoYXZlCisgICAgICogYmVlbiByZWFkIGZyb20gdGhpcyBpbnB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZAorICAgICAqICAgICAgICAgICAgICB3aXRob3V0IGJsb2NraW5nCisgICAgICovCisgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYWklPRXhjZXB0aW9uKCJTdHJlYW0gY2xvc2VkIik7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworCisgICAgICAgIHJldHVybiBibG9ja0RlY29kZXIgPT0gbnVsbCA/IDAgOiBibG9ja0RlY29kZXIuYXZhaWxhYmxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzdHJlYW0gYW5kIGNhbGxzIDxjb2RlPmluLmNsb3NlKCk8L2NvZGU+LgorICAgICAqIElmIHRoZSBzdHJlYW0gd2FzIGFscmVhZHkgY2xvc2VkLCB0aGlzIGRvZXMgbm90aGluZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgIElPRXhjZXB0aW9uIGlmIHRocm93biBieSA8Y29kZT5pbi5jbG9zZSgpPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaW4gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1VuY29tcHJlc3NlZExaTUEyT3V0cHV0U3RyZWFtLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovVW5jb21wcmVzc2VkTFpNQTJPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY5Njc1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1VuY29tcHJlc3NlZExaTUEyT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBVbmNvbXByZXNzZWRMWk1BMk91dHB1dFN0cmVhbQorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2NsYXNzIFVuY29tcHJlc3NlZExaTUEyT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmluaXNoYWJsZU91dHB1dFN0cmVhbSB7CisgICAgcHJpdmF0ZSBGaW5pc2hhYmxlT3V0cHV0U3RyZWFtIG91dDsKKyAgICBwcml2YXRlIGZpbmFsIERhdGFPdXRwdXRTdHJlYW0gb3V0RGF0YTsKKworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHVuY29tcEJ1ZgorICAgICAgICAgICAgPSBuZXcgYnl0ZVtMWk1BMk91dHB1dFN0cmVhbS5DT01QUkVTU0VEX1NJWkVfTUFYXTsKKyAgICBwcml2YXRlIGludCB1bmNvbXBQb3MgPSAwOworICAgIHByaXZhdGUgYm9vbGVhbiBkaWN0UmVzZXROZWVkZWQgPSB0cnVlOworCisgICAgcHJpdmF0ZSBib29sZWFuIGZpbmlzaGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBJT0V4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworCisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gdGVtcEJ1ZiA9IG5ldyBieXRlWzFdOworCisgICAgc3RhdGljIGludCBnZXRNZW1vcnlVc2FnZSgpIHsKKyAgICAgICAgLy8gdW5jb21wQnVmICsgYSBsaXR0bGUgZXh0cmEKKyAgICAgICAgcmV0dXJuIDcwOworICAgIH0KKworICAgIFVuY29tcHJlc3NlZExaTUEyT3V0cHV0U3RyZWFtKEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIGlmIChvdXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgICAgICBvdXREYXRhID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVtcEJ1ZlswXSA9IChieXRlKWI7CisgICAgICAgIHdyaXRlKHRlbXBCdWYsIDAsIDEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvZmYgPCAwIHx8IGxlbiA8IDAgfHwgb2ZmICsgbGVuIDwgMCB8fCBvZmYgKyBsZW4gPiBidWYubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisKKyAgICAgICAgaWYgKGZpbmlzaGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IFhaSU9FeGNlcHRpb24oIlN0cmVhbSBmaW5pc2hlZCBvciBjbG9zZWQiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgY29weVNpemUgPSBNYXRoLm1pbih1bmNvbXBCdWYubGVuZ3RoIC0gdW5jb21wUG9zLCBsZW4pOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCBvZmYsIHVuY29tcEJ1ZiwgdW5jb21wUG9zLCBjb3B5U2l6ZSk7CisgICAgICAgICAgICAgICAgbGVuIC09IGNvcHlTaXplOworICAgICAgICAgICAgICAgIHVuY29tcFBvcyArPSBjb3B5U2l6ZTsKKworICAgICAgICAgICAgICAgIGlmICh1bmNvbXBQb3MgPT0gdW5jb21wQnVmLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVDaHVuaygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZUNodW5rKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0RGF0YS53cml0ZUJ5dGUoZGljdFJlc2V0TmVlZGVkID8gMHgwMSA6IDB4MDIpOworICAgICAgICBvdXREYXRhLndyaXRlU2hvcnQodW5jb21wUG9zIC0gMSk7CisgICAgICAgIG91dERhdGEud3JpdGUodW5jb21wQnVmLCAwLCB1bmNvbXBQb3MpOworICAgICAgICB1bmNvbXBQb3MgPSAwOworICAgICAgICBkaWN0UmVzZXROZWVkZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVFbmRNYXJrZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisKKyAgICAgICAgaWYgKGZpbmlzaGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IFhaSU9FeGNlcHRpb24oIlN0cmVhbSBmaW5pc2hlZCBvciBjbG9zZWQiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHVuY29tcFBvcyA+IDApCisgICAgICAgICAgICAgICAgd3JpdGVDaHVuaygpOworCisgICAgICAgICAgICBvdXQud3JpdGUoMHgwMCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisKKyAgICAgICAgaWYgKGZpbmlzaGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IFhaSU9FeGNlcHRpb24oIlN0cmVhbSBmaW5pc2hlZCBvciBjbG9zZWQiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHVuY29tcFBvcyA+IDApCisgICAgICAgICAgICAgICAgd3JpdGVDaHVuaygpOworCisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWZpbmlzaGVkKSB7CisgICAgICAgICAgICB3cml0ZUVuZE1hcmtlcigpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG91dC5maW5pc2goKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWZpbmlzaGVkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVFbmRNYXJrZXIoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhMTZlOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9VbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKKy8qKgorICogVGhyb3duIHdoZW4gY29tcHJlc3Npb24gb3B0aW9ucyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKyAqIGFyZSBkZXRlY3RlZC4gU29tZSBvdGhlciBpbXBsZW1lbnRhdGlvbiBtaWdodCBzdXBwb3J0IHRob3NlIG9wdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24gZXh0ZW5kcyBYWklPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzTDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uIHdpdGggbnVsbAorICAgICAqIGFzIGl0cyBlcnJvciBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uKCkge30KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuCisgICAgICogZXJyb3IgZGV0YWlsIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgcyAgICAgICAgICAgZXJyb3IgZGV0YWlsIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uKFN0cmluZyBzKSB7CisgICAgICAgIHN1cGVyKHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9YODZPcHRpb25zLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovWDg2T3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZDI0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovWDg2T3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBYODZPcHRpb25zCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IG9yZy50dWthYW5pLnh6LnNpbXBsZS5YODY7CisKKy8qKgorICogQkNKIGZpbHRlciBmb3IgeDg2ICgzMi1iaXQgYW5kIDY0LWJpdCkgaW5zdHJ1Y3Rpb25zLgorICovCitwdWJsaWMgY2xhc3MgWDg2T3B0aW9ucyBleHRlbmRzIEJDSk9wdGlvbnMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTElHTk1FTlQgPSAxOworCisgICAgcHVibGljIFg4Nk9wdGlvbnMoKSB7CisgICAgICAgIHN1cGVyKEFMSUdOTUVOVCk7CisgICAgfQorCisgICAgcHVibGljIEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKEZpbmlzaGFibGVPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIHJldHVybiBuZXcgU2ltcGxlT3V0cHV0U3RyZWFtKG91dCwgbmV3IFg4Nih0cnVlLCBzdGFydE9mZnNldCkpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbikgeworICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUlucHV0U3RyZWFtKGluLCBuZXcgWDg2KGZhbHNlLCBzdGFydE9mZnNldCkpOworICAgIH0KKworICAgIEZpbHRlckVuY29kZXIgZ2V0RmlsdGVyRW5jb2RlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCQ0pFbmNvZGVyKHRoaXMsIEJDSkNvZGVyLlg4Nl9GSUxURVJfSUQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9YWi5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1haLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwODU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9YWi5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBYWgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCisvKioKKyAqIFhaIGNvbnN0YW50cy4KKyAqLworcHVibGljIGNsYXNzIFhaIHsKKyAgICAvKioKKyAgICAgKiBYWiBIZWFkZXIgTWFnaWMgQnl0ZXMgYmVnaW4gYSBYWiBmaWxlLgorICAgICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCB0byBkZXRlY3QgWFogY29tcHJlc3NlZCBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIEhFQURFUl9NQUdJQyA9IHsKKyAgICAgICAgICAgIChieXRlKTB4RkQsICc3JywgJ3onLCAnWCcsICdaJywgJ1wwJyB9OworCisgICAgLyoqCisgICAgICogWFogRm9vdGVyIE1hZ2ljIEJ5dGVzIGFyZSB0aGUgbGFzdCBieXRlcyBvZiBhIFhaIFN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBGT09URVJfTUFHSUMgPSB7ICdZJywgJ1onIH07CisKKyAgICAvKioKKyAgICAgKiBJbnRlZ3JpdHkgY2hlY2sgSUQgaW5kaWNhdGluZyB0aGF0IG5vIGludGVncml0eSBjaGVjayBpcyBjYWxjdWxhdGVkLgorICAgICAqIDxwPgorICAgICAqIE9taXR0aW5nIHRoZSBpbnRlZ3JpdHkgY2hlY2sgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQgZXhjZXB0IHdoZW4KKyAgICAgKiB0aGUgaW50ZWdyaXR5IG9mIHRoZSBkYXRhIHdpbGwgYmUgdmVyaWZpZWQgYnkgb3RoZXIgbWVhbnMgYW55d2F5LAorICAgICAqIGFuZCBjYWxjdWxhdGluZyB0aGUgY2hlY2sgdHdpY2Ugd291bGQgYmUgdXNlbGVzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEVDS19OT05FID0gMDsKKworICAgIC8qKgorICAgICAqIEludGVncml0eSBjaGVjayBJRCBmb3IgQ1JDMzIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tfQ1JDMzIgPSAxOworCisgICAgLyoqCisgICAgICogSW50ZWdyaXR5IGNoZWNrIElEIGZvciBDUkM2NC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEVDS19DUkM2NCA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBJbnRlZ3JpdHkgY2hlY2sgSUQgZm9yIFNIQS0yNTYuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tfU0hBMjU2ID0gMTA7CisKKyAgICBwcml2YXRlIFhaKCkge30KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9YWkZvcm1hdEV4Y2VwdGlvbi5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1haRm9ybWF0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2MzAyMAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9YWkZvcm1hdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBYWkZvcm1hdEV4Y2VwdGlvbgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCisvKioKKyAqIFRocm93biB3aGVuIHRoZSBpbnB1dCBkYXRhIGlzIG5vdCBpbiB0aGUgWFogZm9ybWF0LgorICovCitwdWJsaWMgY2xhc3MgWFpGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBYWklPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzTDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGRlZmF1bHQgZXJyb3IgZGV0YWlsIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIFhaRm9ybWF0RXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigiSW5wdXQgaXMgbm90IGluIHRoZSBYWiBmb3JtYXQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovWFpJT0V4Y2VwdGlvbi5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1haSU9FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDY3NWY1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L1haSU9FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogWFpJT0V4Y2VwdGlvbgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCisvKioKKyAqIEdlbmVyaWMge0BsaW5rIGphdmEuaW8uSU9FeGNlcHRpb24gSU9FeGNlcHRpb259IHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZS4KKyAqIFRoZSBvdGhlciBJT0V4Y2VwdGlvbnMgaW4gdGhpcyBwYWNrYWdlIGV4dGVuZAorICogZnJvbSA8Y29kZT5YWklPRXhjZXB0aW9uPC9jb2RlPi4KKyAqLworcHVibGljIGNsYXNzIFhaSU9FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzTDsKKworICAgIHB1YmxpYyBYWklPRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHB1YmxpYyBYWklPRXhjZXB0aW9uKFN0cmluZyBzKSB7CisgICAgICAgIHN1cGVyKHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9YWklucHV0U3RyZWFtLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovWFpJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNDYwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovWFpJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMzcxIEBACisvKgorICogWFpJbnB1dFN0cmVhbQorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6OworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IG9yZy50dWthYW5pLnh6LmNvbW1vbi5EZWNvZGVyVXRpbDsKKworLyoqCisgKiBEZWNvbXByZXNzZXMgYSAueHogZmlsZSBpbiBzdHJlYW1lZCBtb2RlIChubyBzZWVraW5nKS4KKyAqIDxwPgorICogVXNlIHRoaXMgdG8gZGVjb21wcmVzcyByZWd1bGFyIHN0YW5kYWxvbmUgLnh6IGZpbGVzLiBUaGlzIHJlYWRzIGZyb20KKyAqIGl0cyBpbnB1dCBzdHJlYW0gdW50aWwgdGhlIGVuZCBvZiB0aGUgaW5wdXQgb3IgdW50aWwgYW4gZXJyb3Igb2NjdXJzLgorICogVGhpcyBzdXBwb3J0cyBkZWNvbXByZXNzaW5nIGNvbmNhdGVuYXRlZCAueHogZmlsZXMuCisgKgorICogPGg0PlR5cGljYWwgdXNlIGNhc2VzPC9oND4KKyAqIDxwPgorICogR2V0dGluZyBhbiBpbnB1dCBzdHJlYW0gdG8gZGVjb21wcmVzcyBhIC54eiBmaWxlOgorICogPHA+PGJsb2NrcXVvdGU+PHByZT4KKyAqIElucHV0U3RyZWFtIGluZmlsZSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oImZvby54eiIpOworICogWFpJbnB1dFN0cmVhbSBpbnh6ID0gbmV3IFhaSW5wdXRTdHJlYW0oaW5maWxlKTsKKyAqIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAqIDxwPgorICogSXQncyBpbXBvcnRhbnQgdG8ga2VlcCBpbiBtaW5kIHRoYXQgZGVjb21wcmVzc29yIG1lbW9yeSB1c2FnZSBkZXBlbmRzCisgKiBvbiB0aGUgc2V0dGluZ3MgdXNlZCB0byBjb21wcmVzcyB0aGUgZmlsZS4gVGhlIHdvcnN0LWNhc2UgbWVtb3J5IHVzYWdlCisgKiBvZiBYWklucHV0U3RyZWFtIGlzIGN1cnJlbnRseSAxLjUmbmJzcDtHaUIuIFN0aWxsLCB2ZXJ5IGZldyBmaWxlcyB3aWxsCisgKiByZXF1aXJlIG1vcmUgdGhhbiBhYm91dCA2NSZuYnNwO01pQiBiZWNhdXNlIHRoYXQncyBob3cgbXVjaCBkZWNvbXByZXNzaW5nCisgKiBhIGZpbGUgY3JlYXRlZCB3aXRoIHRoZSBoaWdoZXN0IHByZXNldCBsZXZlbCB3aWxsIG5lZWQsIGFuZCBvbmx5IGEgZmV3CisgKiBwZW9wbGUgdXNlIHNldHRpbmdzIG90aGVyIHRoYW4gdGhlIHByZWRlZmluZWQgcHJlc2V0cy4KKyAqIDxwPgorICogSXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBhIG1lbW9yeSB1c2FnZSBsaW1pdCBmb3IKKyAqIDxjb2RlPlhaSW5wdXRTdHJlYW08L2NvZGU+LiBJZiBkZWNvbXByZXNzaW9uIHJlcXVpcmVzIG1vcmUgbWVtb3J5IHRoYW4KKyAqIHRoZSBzcGVjaWZpZWQgbGltaXQsIE1lbW9yeUxpbWl0RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIHdoZW4gcmVhZGluZworICogZnJvbSB0aGUgc3RyZWFtLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzZXRzIHRoZSBtZW1vcnkgdXNhZ2UgbGltaXQKKyAqIHRvIDEwMCZuYnNwO01pQjoKKyAqIDxwPjxibG9ja3F1b3RlPjxwcmU+CisgKiBJbnB1dFN0cmVhbSBpbmZpbGUgPSBuZXcgRmlsZUlucHV0U3RyZWFtKCJmb28ueHoiKTsKKyAqIFhaSW5wdXRTdHJlYW0gaW54eiA9IG5ldyBYWklucHV0U3RyZWFtKGluZmlsZSwgMTAwICogMTAyNCk7CisgKiA8L3ByZT48L2Jsb2NrcXVvdGU+CisgKgorICogPGg0PldoZW4gdW5jb21wcmVzc2VkIHNpemUgaXMga25vd24gYmVmb3JlaGFuZDwvaDQ+CisgKiA8cD4KKyAqIElmIHlvdSBhcmUgZGVjb21wcmVzc2luZyBjb21wbGV0ZSBmaWxlcyBhbmQgeW91ciBhcHBsaWNhdGlvbiBrbm93cworICogZXhhY3RseSBob3cgbXVjaCB1bmNvbXByZXNzZWQgZGF0YSB0aGVyZSBzaG91bGQgYmUsIGl0IGlzIGdvb2QgdG8gdHJ5CisgKiByZWFkaW5nIG9uZSBtb3JlIGJ5dGUgYnkgY2FsbGluZyA8Y29kZT5yZWFkKCk8L2NvZGU+IGFuZCBjaGVja2luZworICogdGhhdCBpdCByZXR1cm5zIDxjb2RlPi0xPC9jb2RlPi4gVGhpcyB3YXkgdGhlIGRlY29tcHJlc3NvciB3aWxsIHBhcnNlIHRoZQorICogZmlsZSBmb290ZXJzIGFuZCB2ZXJpZnkgdGhlIGludGVncml0eSBjaGVja3MsIGdpdmluZyB0aGUgY2FsbGVyIG1vcmUKKyAqIGNvbmZpZGVuY2UgdGhhdCB0aGUgdW5jb21wcmVzc2VkIGRhdGEgaXMgdmFsaWQuIChUaGlzIGFkdmljZSBzZWVtcyB0bworICogYXBwbHkgdG8KKyAqIHtAbGluayBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbSBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbX0gdG9vLikKKyAqCisgKiBAc2VlIFNpbmdsZVhaSW5wdXRTdHJlYW0KKyAqLworcHVibGljIGNsYXNzIFhaSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWVtb3J5TGltaXQ7CisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbjsKKyAgICBwcml2YXRlIFNpbmdsZVhaSW5wdXRTdHJlYW0geHpJbjsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdmVyaWZ5Q2hlY2s7CisgICAgcHJpdmF0ZSBib29sZWFuIGVuZFJlYWNoZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSB0ZW1wQnVmID0gbmV3IGJ5dGVbMV07CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFhaIGRlY29tcHJlc3NvciB3aXRob3V0IGEgbWVtb3J5IHVzYWdlIGxpbWl0LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgcmVhZHMgYW5kIHBhcnNlcyB0aGUgWFogU3RyZWFtIEhlYWRlciAoMTIgYnl0ZXMpCisgICAgICogZnJvbSA8Y29kZT5pbjwvY29kZT4uIFRoZSBoZWFkZXIgb2YgdGhlIGZpcnN0IEJsb2NrIGlzIG5vdCByZWFkCisgICAgICogdW50aWwgPGNvZGU+cmVhZDwvY29kZT4gaXMgY2FsbGVkLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGluICAgICAgICAgIGlucHV0IHN0cmVhbSBmcm9tIHdoaWNoIFhaLWNvbXByZXNzZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyByZWFkCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgaXMgbm90IGluIHRoZSBYWiBmb3JtYXQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWiBoZWFkZXIgQ1JDMzIgZG9lc24ndCBtYXRjaAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWiBoZWFkZXIgaXMgdmFsaWQgYnV0IHNwZWNpZmllcyBvcHRpb25zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gMTIgYnl0ZXMgb2YgaW5wdXQgd2FzIGF2YWlsYWJsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIDxjb2RlPmluPC9jb2RlPgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYnkgPGNvZGU+aW48L2NvZGU+CisgICAgICovCisgICAgcHVibGljIFhaSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoaW4sIC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFhaIGRlY29tcHJlc3NvciB3aXRoIGFuIG9wdGlvbmFsIG1lbW9yeSB1c2FnZSBsaW1pdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIGlkZW50aWNhbCB0byA8Y29kZT5YWklucHV0U3RyZWFtKElucHV0U3RyZWFtKTwvY29kZT4gZXhjZXB0CisgICAgICogdGhhdCB0aGlzIHRha2VzIGFsc28gdGhlIDxjb2RlPm1lbW9yeUxpbWl0PC9jb2RlPiBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBpbiAgICAgICAgICBpbnB1dCBzdHJlYW0gZnJvbSB3aGljaCBYWi1jb21wcmVzc2VkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgcmVhZAorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIG1lbW9yeUxpbWl0IG1lbW9yeSB1c2FnZSBsaW1pdCBpbiBraWJpYnl0ZXMgKEtpQikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgPGNvZGU+LTE8L2NvZGU+IHRvIGltcG9zZSBubworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgdXNhZ2UgbGltaXQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBYWkZvcm1hdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBpcyBub3QgaW4gdGhlIFhaIGZvcm1hdAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFhaIGhlYWRlciBDUkMzMiBkb2Vzbid0IG1hdGNoCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFhaIGhlYWRlciBpcyB2YWxpZCBidXQgc3BlY2lmaWVzIG9wdGlvbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgRU9GRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGhhbiAxMiBieXRlcyBvZiBpbnB1dCB3YXMgYXZhaWxhYmxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPGNvZGU+aW48L2NvZGU+CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBieSA8Y29kZT5pbjwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgWFpJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgaW50IG1lbW9yeUxpbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKGluLCBtZW1vcnlMaW1pdCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBYWiBkZWNvbXByZXNzb3Igd2l0aCBhbiBvcHRpb25hbCBtZW1vcnkgdXNhZ2UgbGltaXQKKyAgICAgKiBhbmQgYWJpbGl0eSB0byBkaXNhYmxlIHZlcmlmaWNhdGlvbiBvZiBpbnRlZ3JpdHkgY2hlY2tzLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgaWRlbnRpY2FsIHRvIDxjb2RlPlhaSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0saW50KTwvY29kZT4gZXhjZXB0CisgICAgICogdGhhdCB0aGlzIHRha2VzIGFsc28gdGhlIDxjb2RlPnZlcmlmeUNoZWNrPC9jb2RlPiBhcmd1bWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgaW50ZWdyaXR5IGNoZWNrIHZlcmlmaWNhdGlvbiBzaG91bGQgYWxtb3N0IG5ldmVyIGJlIGRpc2FibGVkLgorICAgICAqIFBvc3NpYmxlIHJlYXNvbnMgdG8gZGlzYWJsZSBpbnRlZ3JpdHkgY2hlY2sgdmVyaWZpY2F0aW9uOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5UcnlpbmcgdG8gcmVjb3ZlciBkYXRhIGZyb20gYSBjb3JydXB0IC54eiBmaWxlLjwvbGk+CisgICAgICogICA8bGk+U3BlZWRpbmcgdXAgZGVjb21wcmVzc2lvbi4gVGhpcyBtYXR0ZXJzIG1vc3RseSB3aXRoIFNIQS0yNTYKKyAgICAgKiAgIG9yIHdpdGggZmlsZXMgdGhhdCBoYXZlIGNvbXByZXNzZWQgZXh0cmVtZWx5IHdlbGwuIEl0J3MgcmVjb21tZW5kZWQKKyAgICAgKiAgIHRoYXQgaW50ZWdyaXR5IGNoZWNraW5nIGlzbid0IGRpc2FibGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zCisgICAgICogICB1bmxlc3MgdGhlIGZpbGUgaW50ZWdyaXR5IGlzIHZlcmlmaWVkIGV4dGVybmFsbHkgaW4gc29tZSBvdGhlcgorICAgICAqICAgd2F5LjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiA8Y29kZT52ZXJpZnlDaGVjazwvY29kZT4gb25seSBhZmZlY3RzIHRoZSBpbnRlZ3JpdHkgY2hlY2sgb2YKKyAgICAgKiB0aGUgYWN0dWFsIGNvbXByZXNzZWQgZGF0YS4gVGhlIENSQzMyIGZpZWxkcyBpbiB0aGUgaGVhZGVycworICAgICAqIGFyZSBhbHdheXMgdmVyaWZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgaW4gICAgICAgICAgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggWFotY29tcHJlc3NlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIHJlYWQKKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBtZW1vcnlMaW1pdCBtZW1vcnkgdXNhZ2UgbGltaXQgaW4ga2liaWJ5dGVzIChLaUIpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIDxjb2RlPi0xPC9jb2RlPiB0byBpbXBvc2Ugbm8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IHVzYWdlIGxpbWl0CisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgdmVyaWZ5Q2hlY2sgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBpbnRlZ3JpdHkgY2hlY2tzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdmVyaWZpZWQ7IHRoaXMgc2hvdWxkIGFsbW9zdCBuZXZlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpGb3JtYXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgaXMgbm90IGluIHRoZSBYWiBmb3JtYXQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWiBoZWFkZXIgQ1JDMzIgZG9lc24ndCBtYXRjaAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWiBoZWFkZXIgaXMgdmFsaWQgYnV0IHNwZWNpZmllcyBvcHRpb25zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIEVPRkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzIHRoYW4gMTIgYnl0ZXMgb2YgaW5wdXQgd2FzIGF2YWlsYWJsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIDxjb2RlPmluPC9jb2RlPgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYnkgPGNvZGU+aW48L2NvZGU+CisgICAgICoKKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgcHVibGljIFhaSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGludCBtZW1vcnlMaW1pdCwgYm9vbGVhbiB2ZXJpZnlDaGVjaykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuaW4gPSBpbjsKKyAgICAgICAgdGhpcy5tZW1vcnlMaW1pdCA9IG1lbW9yeUxpbWl0OworICAgICAgICB0aGlzLnZlcmlmeUNoZWNrID0gdmVyaWZ5Q2hlY2s7CisgICAgICAgIHRoaXMueHpJbiA9IG5ldyBTaW5nbGVYWklucHV0U3RyZWFtKGluLCBtZW1vcnlMaW1pdCwgdmVyaWZ5Q2hlY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29tcHJlc3NlcyB0aGUgbmV4dCBieXRlIGZyb20gdGhpcyBpbnB1dCBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogUmVhZGluZyBsb3RzIG9mIGRhdGEgd2l0aCA8Y29kZT5yZWFkKCk8L2NvZGU+IGZyb20gdGhpcyBpbnB1dCBzdHJlYW0KKyAgICAgKiBtYXkgYmUgaW5lZmZpY2llbnQuIFdyYXAgaXQgaW4ge0BsaW5rIGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbX0KKyAgICAgKiBpZiB5b3UgbmVlZCB0byByZWFkIGxvdHMgb2YgZGF0YSBvbmUgYnl0ZSBhdCBhIHRpbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgZGVjb21wcmVzc2VkIGJ5dGUsIG9yIDxjb2RlPi0xPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIHN0cmVhbQorICAgICAqCisgICAgICogQHRocm93cyAgICAgIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgICAgICBNZW1vcnlMaW1pdEV4Y2VwdGlvbgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFhaSU9FeGNlcHRpb24gaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZCBpbnB1dCBpcyB0cnVuY2F0ZWQgb3IgY29ycnVwdAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYnkgPGNvZGU+aW48L2NvZGU+CisgICAgICovCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWQodGVtcEJ1ZiwgMCwgMSkgPT0gLTEgPyAtMSA6ICh0ZW1wQnVmWzBdICYgMHhGRik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb21wcmVzc2VzIGludG8gYW4gYXJyYXkgb2YgYnl0ZXMuCisgICAgICogPHA+CisgICAgICogSWYgPGNvZGU+bGVuPC9jb2RlPiBpcyB6ZXJvLCBubyBieXRlcyBhcmUgcmVhZCBhbmQgPGNvZGU+MDwvY29kZT4KKyAgICAgKiBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoaXMgd2lsbCB0cnkgdG8gZGVjb21wcmVzcyA8Y29kZT5sZW48L2NvZGU+CisgICAgICogYnl0ZXMgb2YgdW5jb21wcmVzc2VkIGRhdGEuIExlc3MgdGhhbiA8Y29kZT5sZW48L2NvZGU+IGJ5dGVzIG1heQorICAgICAqIGJlIHJlYWQgb25seSBpbiB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbnM6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPlRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSB3YXMgcmVhY2hlZCBzdWNjZXNzZnVsbHkuPC9saT4KKyAgICAgKiAgIDxsaT5BbiBlcnJvciBpcyBkZXRlY3RlZCBhZnRlciBhdCBsZWFzdCBvbmUgYnV0IGxlc3MgPGNvZGU+bGVuPC9jb2RlPgorICAgICAqICAgICAgIGJ5dGVzIGhhdmUgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvbXByZXNzZWQuCisgICAgICogICAgICAgVGhlIG5leHQgY2FsbCB3aXRoIG5vbi16ZXJvIDxjb2RlPmxlbjwvY29kZT4gd2lsbCBpbW1lZGlhdGVseQorICAgICAqICAgICAgIHRocm93IHRoZSBwZW5kaW5nIGV4Y2VwdGlvbi48L2xpPgorICAgICAqICAgPGxpPkFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGJ1ZiAgICAgICAgIHRhcmdldCBidWZmZXIgZm9yIHVuY29tcHJlc3NlZCBkYXRhCisgICAgICogQHBhcmFtICAgICAgIG9mZiAgICAgICAgIHN0YXJ0IG9mZnNldCBpbiA8Y29kZT5idWY8L2NvZGU+CisgICAgICogQHBhcmFtICAgICAgIGxlbiAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyB0byByZWFkCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIDxjb2RlPi0xPC9jb2RlPiB0byBpbmRpY2F0ZQorICAgICAqICAgICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIHN0cmVhbQorICAgICAqCisgICAgICogQHRocm93cyAgICAgIENvcnJ1cHRlZElucHV0RXhjZXB0aW9uCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgICAgICBNZW1vcnlMaW1pdEV4Y2VwdGlvbgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFhaSU9FeGNlcHRpb24gaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBFT0ZFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZCBpbnB1dCBpcyB0cnVuY2F0ZWQgb3IgY29ycnVwdAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYnkgPGNvZGU+aW48L2NvZGU+CisgICAgICovCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvZmYgPCAwIHx8IGxlbiA8IDAgfHwgb2ZmICsgbGVuIDwgMCB8fCBvZmYgKyBsZW4gPiBidWYubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKworICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoaW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYWklPRXhjZXB0aW9uKCJTdHJlYW0gY2xvc2VkIik7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworCisgICAgICAgIGlmIChlbmRSZWFjaGVkKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGludCBzaXplID0gMDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeHpJbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVOZXh0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmRSZWFjaGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemUgPT0gMCA/IC0xIDogc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0geHpJbi5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworCisgICAgICAgICAgICAgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSByZXQ7CisgICAgICAgICAgICAgICAgICAgIG9mZiArPSByZXQ7CisgICAgICAgICAgICAgICAgICAgIGxlbiAtPSByZXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgeHpJbiA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVOZXh0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRGF0YUlucHV0U3RyZWFtIGluRGF0YSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW4pOworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbRGVjb2RlclV0aWwuU1RSRUFNX0hFQURFUl9TSVpFXTsKKworICAgICAgICAvLyBUaGUgc2l6ZSBvZiBTdHJlYW0gUGFkZGluZyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgZm91ciBieXRlcywKKyAgICAgICAgLy8gYWxsIGJ5dGVzIHplcm8uCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IHRyeSB0byByZWFkIG9uZSBieXRlIHRvIHNlZSBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZAorICAgICAgICAgICAgLy8gb2YgdGhlIGZpbGUuCisgICAgICAgICAgICBpbnQgcmV0ID0gaW5EYXRhLnJlYWQoYnVmLCAwLCAxKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBlbmRSZWFjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNpbmNlIHdlIGdvdCBvbmUgYnl0ZSBvZiBpbnB1dCwgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdAorICAgICAgICAgICAgLy8gdGhyZWUgbW9yZSBhdmFpbGFibGUgaW4gYSB2YWxpZCBmaWxlLgorICAgICAgICAgICAgaW5EYXRhLnJlYWRGdWxseShidWYsIDEsIDMpOworCisgICAgICAgIH0gd2hpbGUgKGJ1ZlswXSA9PSAwICYmIGJ1ZlsxXSA9PSAwICYmIGJ1ZlsyXSA9PSAwICYmIGJ1ZlszXSA9PSAwKTsKKworICAgICAgICAvLyBOb3QgYWxsIGJ5dGVzIGFyZSB6ZXJvLiBJbiBhIHZhbGlkIFN0cmVhbSBpdCBpbmRpY2F0ZXMgdGhlCisgICAgICAgIC8vIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBTdHJlYW0uIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIFN0cmVhbSBIZWFkZXIKKyAgICAgICAgLy8gYW5kIGluaXRpYWxpemUgdGhlIFhaIGRlY29kZXIuCisgICAgICAgIGluRGF0YS5yZWFkRnVsbHkoYnVmLCA0LCBEZWNvZGVyVXRpbC5TVFJFQU1fSEVBREVSX1NJWkUgLSA0KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgeHpJbiA9IG5ldyBTaW5nbGVYWklucHV0U3RyZWFtKGluLCBtZW1vcnlMaW1pdCwgdmVyaWZ5Q2hlY2ssIGJ1Zik7CisgICAgICAgIH0gY2F0Y2ggKFhaRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgaXNuJ3QgdGhlIGZpcnN0IC54eiBTdHJlYW0sIGl0IGlzIG1vcmUKKyAgICAgICAgICAgIC8vIGxvZ2ljYWwgdG8gdGVsbCB0aGF0IHRoZSBkYXRhIGlzIGNvcnJ1cHQuCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJHYXJiYWdlIGFmdGVyIGEgdmFsaWQgWFogU3RyZWFtIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQKKyAgICAgKiB3aXRob3V0IGJsb2NraW5nLiBUaGUgdmFsdWUgaXMgcmV0dXJuZWQgd2l0aCBhbiBhc3N1bXB0aW9uCisgICAgICogdGhhdCB0aGUgY29tcHJlc3NlZCBpbnB1dCBkYXRhIHdpbGwgYmUgdmFsaWQuIElmIHRoZSBjb21wcmVzc2VkCisgICAgICogZGF0YSBpcyBjb3JydXB0LCA8Y29kZT5Db3JydXB0ZWRJbnB1dEV4Y2VwdGlvbjwvY29kZT4gbWF5IGdldAorICAgICAqIHRocm93biBiZWZvcmUgdGhlIG51bWJlciBvZiBieXRlcyBjbGFpbWVkIHRvIGJlIGF2YWlsYWJsZSBoYXZlCisgICAgICogYmVlbiByZWFkIGZyb20gdGhpcyBpbnB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZAorICAgICAqICAgICAgICAgICAgICB3aXRob3V0IGJsb2NraW5nCisgICAgICovCisgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYWklPRXhjZXB0aW9uKCJTdHJlYW0gY2xvc2VkIik7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworCisgICAgICAgIHJldHVybiB4ekluID09IG51bGwgPyAwIDogeHpJbi5hdmFpbGFibGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHN0cmVhbSBhbmQgY2FsbHMgPGNvZGU+aW4uY2xvc2UoKTwvY29kZT4uCisgICAgICogSWYgdGhlIHN0cmVhbSB3YXMgYWxyZWFkeSBjbG9zZWQsIHRoaXMgZG9lcyBub3RoaW5nLgorICAgICAqCisgICAgICogQHRocm93cyAgSU9FeGNlcHRpb24gaWYgdGhyb3duIGJ5IDxjb2RlPmluLmNsb3NlKCk8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovWFpPdXRwdXRTdHJlYW0uamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9YWk91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMzdmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovWFpPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDQ4OCBAQAorLyoKKyAqIFhaT3V0cHV0U3RyZWFtCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHo7CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy50dWthYW5pLnh6LmNvbW1vbi5FbmNvZGVyVXRpbDsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5jb21tb24uU3RyZWFtRmxhZ3M7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouY2hlY2suQ2hlY2s7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouaW5kZXguSW5kZXhFbmNvZGVyOworCisvKioKKyAqIENvbXByZXNzZXMgaW50byB0aGUgLnh6IGZpbGUgZm9ybWF0LgorICoKKyAqIDxoND5FeGFtcGxlczwvaDQ+CisgKiA8cD4KKyAqIEdldHRpbmcgYW4gb3V0cHV0IHN0cmVhbSB0byBjb21wcmVzcyB3aXRoIExaTUEyIHVzaW5nIHRoZSBkZWZhdWx0CisgKiBzZXR0aW5ncyBhbmQgdGhlIGRlZmF1bHQgaW50ZWdyaXR5IGNoZWNrIHR5cGUgKENSQzY0KToKKyAqIDxwPjxibG9ja3F1b3RlPjxwcmU+CisgKiBGaWxlT3V0cHV0U3RyZWFtIG91dGZpbGUgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgiZm9vLnh6Iik7CisgKiBYWk91dHB1dFN0cmVhbSBvdXR4eiA9IG5ldyBYWk91dHB1dFN0cmVhbShvdXRmaWxlLCBuZXcgTFpNQTJPcHRpb25zKCkpOworICogPC9wcmU+PC9ibG9ja3F1b3RlPgorICogPHA+CisgKiBVc2luZyB0aGUgcHJlc2V0IGxldmVsIDxjb2RlPjg8L2NvZGU+IGZvciBMWk1BMiAodGhlIGRlZmF1bHQKKyAqIGlzIDxjb2RlPjY8L2NvZGU+KSBhbmQgU0hBLTI1NiBpbnN0ZWFkIG9mIENSQzY0IGZvciBpbnRlZ3JpdHkgY2hlY2tpbmc6CisgKiA8cD48YmxvY2txdW90ZT48cHJlPgorICogWFpPdXRwdXRTdHJlYW0gb3V0eHogPSBuZXcgWFpPdXRwdXRTdHJlYW0ob3V0ZmlsZSwgbmV3IExaTUEyT3B0aW9ucyg4KSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhaLkNIRUNLX1NIQTI1Nik7CisgKiA8L3ByZT48L2Jsb2NrcXVvdGU+CisgKiA8cD4KKyAqIFVzaW5nIHRoZSB4ODYgQkNKIGZpbHRlciB0b2dldGhlciB3aXRoIExaTUEyIHRvIGNvbXByZXNzIHg4NiBleGVjdXRhYmxlcworICogYW5kIHByaW50aW5nIHRoZSBtZW1vcnkgdXNhZ2UgaW5mb3JtYXRpb24gYmVmb3JlIGNyZWF0aW5nIHRoZQorICogWFpPdXRwdXRTdHJlYW06CisgKiA8cD48YmxvY2txdW90ZT48cHJlPgorICogWDg2T3B0aW9ucyB4ODYgPSBuZXcgWDg2T3B0aW9ucygpOworICogTFpNQTJPcHRpb25zIGx6bWEyID0gbmV3IExaTUEyT3B0aW9ucygpOworICogRmlsdGVyT3B0aW9uc1tdIG9wdGlvbnMgPSB7IHg4NiwgbHptYTIgfTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiRW5jb2RlciBtZW1vcnkgdXNhZ2U6ICIKKyAqICAgICAgICAgICAgICAgICAgICArIEZpbHRlck9wdGlvbnMuZ2V0RW5jb2Rlck1lbW9yeVVzYWdlKG9wdGlvbnMpCisgKiAgICAgICAgICAgICAgICAgICAgKyAiIEtpQiIpOworICogU3lzdGVtLm91dC5wcmludGxuKCJEZWNvZGVyIG1lbW9yeSB1c2FnZTogIgorICogICAgICAgICAgICAgICAgICAgICsgRmlsdGVyT3B0aW9ucy5nZXREZWNvZGVyTWVtb3J5VXNhZ2Uob3B0aW9ucykKKyAqICAgICAgICAgICAgICAgICAgICArICIgS2lCIik7CisgKiBYWk91dHB1dFN0cmVhbSBvdXR4eiA9IG5ldyBYWk91dHB1dFN0cmVhbShvdXRmaWxlLCBvcHRpb25zKTsKKyAqIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAqLworcHVibGljIGNsYXNzIFhaT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmluaXNoYWJsZU91dHB1dFN0cmVhbSB7CisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0OworICAgIHByaXZhdGUgZmluYWwgU3RyZWFtRmxhZ3Mgc3RyZWFtRmxhZ3MgPSBuZXcgU3RyZWFtRmxhZ3MoKTsKKyAgICBwcml2YXRlIGZpbmFsIENoZWNrIGNoZWNrOworICAgIHByaXZhdGUgZmluYWwgSW5kZXhFbmNvZGVyIGluZGV4ID0gbmV3IEluZGV4RW5jb2RlcigpOworCisgICAgcHJpdmF0ZSBCbG9ja091dHB1dFN0cmVhbSBibG9ja0VuY29kZXIgPSBudWxsOworICAgIHByaXZhdGUgRmlsdGVyRW5jb2RlcltdIGZpbHRlcnM7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSBjdXJyZW50IGZpbHRlciBjaGFpbiBzdXBwb3J0cyBmbHVzaGluZy4KKyAgICAgKiBJZiBpdCBkb2Vzbid0IHN1cHBvcnQgZmx1c2hpbmcsIDxjb2RlPmZsdXNoKCk8L2NvZGU+CisgICAgICogd2lsbCB1c2UgPGNvZGU+ZW5kQmxvY2soKTwvY29kZT4gYXMgYSBmYWxsYmFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZmlsdGVyc1N1cHBvcnRGbHVzaGluZzsKKworICAgIHByaXZhdGUgSU9FeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmluaXNoZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHRlbXBCdWYgPSBuZXcgYnl0ZVsxXTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgWFogY29tcHJlc3NvciB1c2luZyBvbmUgZmlsdGVyIGFuZCBDUkM2NCBhcworICAgICAqIHRoZSBpbnRlZ3JpdHkgY2hlY2suIFRoaXMgY29uc3RydWN0b3IgaXMgZXF1aXZhbGVudCB0byBwYXNzaW5nCisgICAgICogYSBzaW5nbGUtbWVtYmVyIEZpbHRlck9wdGlvbnMgYXJyYXkgdG8KKyAgICAgKiA8Y29kZT5YWk91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0sIEZpbHRlck9wdGlvbnNbXSk8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIG91dCAgICAgICAgIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdGhlIGNvbXByZXNzZWQgZGF0YQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHdyaXR0ZW4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBmaWx0ZXJPcHRpb25zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciBvcHRpb25zIHRvIHVzZQorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkIGZpbHRlciBjaGFpbgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gZnJvbSA8Y29kZT5vdXQ8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIFhaT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQsIEZpbHRlck9wdGlvbnMgZmlsdGVyT3B0aW9ucykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMob3V0LCBmaWx0ZXJPcHRpb25zLCBYWi5DSEVDS19DUkM2NCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBYWiBjb21wcmVzc29yIHVzaW5nIG9uZSBmaWx0ZXIgYW5kIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBpbnRlZ3JpdHkgY2hlY2sgdHlwZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyBlcXVpdmFsZW50IHRvCisgICAgICogcGFzc2luZyBhIHNpbmdsZS1tZW1iZXIgRmlsdGVyT3B0aW9ucyBhcnJheSB0bworICAgICAqIDxjb2RlPlhaT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSwgRmlsdGVyT3B0aW9uc1tdLCBpbnQpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBvdXQgICAgICAgICBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRoZSBjb21wcmVzc2VkIGRhdGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB3cml0dGVuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgZmlsdGVyT3B0aW9ucworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgb3B0aW9ucyB0byB1c2UKKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBjaGVja1R5cGUgICB0eXBlIG9mIHRoZSBpbnRlZ3JpdHkgY2hlY2ssCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBleGFtcGxlIFhaLkNIRUNLX0NSQzMyCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQgZmlsdGVyIGNoYWluCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBmcm9tIDxjb2RlPm91dDwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgWFpPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCwgRmlsdGVyT3B0aW9ucyBmaWx0ZXJPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hlY2tUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKG91dCwgbmV3IEZpbHRlck9wdGlvbnNbXSB7IGZpbHRlck9wdGlvbnMgfSwgY2hlY2tUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFhaIGNvbXByZXNzb3IgdXNpbmcgMS00IGZpbHRlcnMgYW5kIENSQzY0IGFzCisgICAgICogdGhlIGludGVncml0eSBjaGVjay4gVGhpcyBjb25zdHJ1Y3RvciBpcyBlcXVpdmFsZW50CisgICAgICogPGNvZGU+WFpPdXRwdXRTdHJlYW0ob3V0LCBmaWx0ZXJPcHRpb25zLCBYWi5DSEVDS19DUkM2NCk8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIG91dCAgICAgICAgIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdGhlIGNvbXByZXNzZWQgZGF0YQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHdyaXR0ZW4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBmaWx0ZXJPcHRpb25zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IG9mIGZpbHRlciBvcHRpb25zIHRvIHVzZQorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkIGZpbHRlciBjaGFpbgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gZnJvbSA8Y29kZT5vdXQ8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIFhaT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQsIEZpbHRlck9wdGlvbnNbXSBmaWx0ZXJPcHRpb25zKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhvdXQsIGZpbHRlck9wdGlvbnMsIFhaLkNIRUNLX0NSQzY0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFhaIGNvbXByZXNzb3IgdXNpbmcgMS00IGZpbHRlcnMgYW5kIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBpbnRlZ3JpdHkgY2hlY2sgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBvdXQgICAgICAgICBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRoZSBjb21wcmVzc2VkIGRhdGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB3cml0dGVuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgZmlsdGVyT3B0aW9ucworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSBvZiBmaWx0ZXIgb3B0aW9ucyB0byB1c2UKKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBjaGVja1R5cGUgICB0eXBlIG9mIHRoZSBpbnRlZ3JpdHkgY2hlY2ssCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBleGFtcGxlIFhaLkNIRUNLX0NSQzMyCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQgZmlsdGVyIGNoYWluCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBmcm9tIDxjb2RlPm91dDwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgWFpPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCwgRmlsdGVyT3B0aW9uc1tdIGZpbHRlck9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGVja1R5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgICAgICB1cGRhdGVGaWx0ZXJzKGZpbHRlck9wdGlvbnMpOworCisgICAgICAgIHN0cmVhbUZsYWdzLmNoZWNrVHlwZSA9IGNoZWNrVHlwZTsKKyAgICAgICAgY2hlY2sgPSBDaGVjay5nZXRJbnN0YW5jZShjaGVja1R5cGUpOworCisgICAgICAgIGVuY29kZVN0cmVhbUhlYWRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIGZpbHRlciBjaGFpbiB3aXRoIGEgc2luZ2xlIGZpbHRlci4KKyAgICAgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gcGFzc2luZyBhIHNpbmdsZS1tZW1iZXIgRmlsdGVyT3B0aW9ucyBhcnJheQorICAgICAqIHRvIDxjb2RlPnVwZGF0ZUZpbHRlcnMoRmlsdGVyT3B0aW9uc1tdKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgZmlsdGVyT3B0aW9ucworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZmlsdGVyIHRvIHVzZQorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZCBmaWx0ZXIgY2hhaW4sIG9yIHRyeWluZyB0byBjaGFuZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbHRlciBjaGFpbiBpbiB0aGUgbWlkZGxlIG9mIGEgQmxvY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVGaWx0ZXJzKEZpbHRlck9wdGlvbnMgZmlsdGVyT3B0aW9ucykKKyAgICAgICAgICAgIHRocm93cyBYWklPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsdGVyT3B0aW9uc1tdIG9wdHMgPSBuZXcgRmlsdGVyT3B0aW9uc1sxXTsKKyAgICAgICAgb3B0c1swXSA9IGZpbHRlck9wdGlvbnM7CisgICAgICAgIHVwZGF0ZUZpbHRlcnMob3B0cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgZmlsdGVyIGNoYWluIHdpdGggMS00IGZpbHRlcnMuCisgICAgICogPHA+CisgICAgICogQ3VycmVudGx5IHRoaXMgY2Fubm90IGJlIHVzZWQgdG8gdXBkYXRlIGUuZy4gTFpNQTIgb3B0aW9ucyBpbiB0aGUKKyAgICAgKiBtaWRkbGUgb2YgYSBYWiBCbG9jay4gVXNlIDxjb2RlPmVuZEJsb2NrKCk8L2NvZGU+IHRvIGZpbmlzaCB0aGUKKyAgICAgKiBjdXJyZW50IFhaIEJsb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIFRoZSBuZXcgZmlsdGVyIGNoYWluCisgICAgICogd2lsbCB0aGVuIGJlIHVzZWQgZm9yIHRoZSBuZXh0IFhaIEJsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIGZpbHRlck9wdGlvbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGZpbHRlciBjaGFpbiB0byB1c2UKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQgZmlsdGVyIGNoYWluLCBvciB0cnlpbmcgdG8gY2hhbmdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWx0ZXIgY2hhaW4gaW4gdGhlIG1pZGRsZSBvZiBhIEJsb2NrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlRmlsdGVycyhGaWx0ZXJPcHRpb25zW10gZmlsdGVyT3B0aW9ucykKKyAgICAgICAgICAgIHRocm93cyBYWklPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGJsb2NrRW5jb2RlciAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbigiQ2hhbmdpbmcgZmlsdGVyIG9wdGlvbnMgIgorICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgbWlkZGxlIG9mIGEgWFogQmxvY2sgbm90IGltcGxlbWVudGVkIik7CisKKyAgICAgICAgaWYgKGZpbHRlck9wdGlvbnMubGVuZ3RoIDwgMSB8fCBmaWx0ZXJPcHRpb25zLmxlbmd0aCA+IDQpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlhaIGZpbHRlciBjaGFpbiBtdXN0IGJlIDEtNCBmaWx0ZXJzIik7CisKKyAgICAgICAgZmlsdGVyc1N1cHBvcnRGbHVzaGluZyA9IHRydWU7CisgICAgICAgIEZpbHRlckVuY29kZXJbXSBuZXdGaWx0ZXJzID0gbmV3IEZpbHRlckVuY29kZXJbZmlsdGVyT3B0aW9ucy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlck9wdGlvbnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIG5ld0ZpbHRlcnNbaV0gPSBmaWx0ZXJPcHRpb25zW2ldLmdldEZpbHRlckVuY29kZXIoKTsKKyAgICAgICAgICAgIGZpbHRlcnNTdXBwb3J0Rmx1c2hpbmcgJj0gbmV3RmlsdGVyc1tpXS5zdXBwb3J0c0ZsdXNoaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBSYXdDb2Rlci52YWxpZGF0ZShuZXdGaWx0ZXJzKTsKKyAgICAgICAgZmlsdGVycyA9IG5ld0ZpbHRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIG9uZSBieXRlIHRvIGJlIGNvbXByZXNzZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWiBTdHJlYW0gaGFzIGdyb3duIHRvbyBiaWcKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBYWklPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmZpbmlzaCgpPC9jb2RlPiBvciA8Y29kZT5jbG9zZSgpPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgYWxyZWFkeSBjYWxsZWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVtcEJ1ZlswXSA9IChieXRlKWI7CisgICAgICAgIHdyaXRlKHRlbXBCdWYsIDAsIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhbiBhcnJheSBvZiBieXRlcyB0byBiZSBjb21wcmVzc2VkLgorICAgICAqIFRoZSBjb21wcmVzc29ycyB0ZW5kIHRvIGRvIGludGVybmFsIGJ1ZmZlcmluZyBhbmQgdGh1cyB0aGUgd3JpdHRlbgorICAgICAqIGRhdGEgd29uJ3QgYmUgcmVhZGFibGUgZnJvbSB0aGUgY29tcHJlc3NlZCBvdXRwdXQgaW1tZWRpYXRlbHkuCisgICAgICogVXNlIDxjb2RlPmZsdXNoKCk8L2NvZGU+IHRvIGZvcmNlIGV2ZXJ5dGhpbmcgd3JpdHRlbiBzbyBmYXIgdG8KKyAgICAgKiBiZSB3cml0dGVuIHRvIHRoZSB1bmRlcmxheWluZyBvdXRwdXQgc3RyZWFtLCBidXQgYmUgYXdhcmUgdGhhdAorICAgICAqIGZsdXNoaW5nIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgYnVmICAgICAgICAgYnVmZmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiBAcGFyYW0gICAgICAgb2ZmICAgICAgICAgc3RhcnQgb2Zmc2V0IGluIDxjb2RlPmJ1ZjwvY29kZT4KKyAgICAgKiBAcGFyYW0gICAgICAgbGVuICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWiBTdHJlYW0gaGFzIGdyb3duIHRvbyBiaWc6IHRvdGFsIGZpbGUgc2l6ZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhYm91dCA4Jm5ic3A7RWlCIG9yIHRoZSBJbmRleCBmaWVsZCBleGNlZWRzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIDE2Jm5ic3A7R2lCOyB5b3Ugc2hvdWxkbid0IHJlYWNoIHRoZXNlIHNpemVzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHByYWN0aWNlCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5maW5pc2goKTwvY29kZT4gb3IgPGNvZGU+Y2xvc2UoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIGFscmVhZHkgY2FsbGVkIGFuZCBsZW4gJmd0OyAwCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBieSB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG9mZiA8IDAgfHwgbGVuIDwgMCB8fCBvZmYgKyBsZW4gPCAwIHx8IG9mZiArIGxlbiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCisgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKworICAgICAgICBpZiAoZmluaXNoZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgWFpJT0V4Y2VwdGlvbigiU3RyZWFtIGZpbmlzaGVkIG9yIGNsb3NlZCIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoYmxvY2tFbmNvZGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgYmxvY2tFbmNvZGVyID0gbmV3IEJsb2NrT3V0cHV0U3RyZWFtKG91dCwgZmlsdGVycywgY2hlY2spOworCisgICAgICAgICAgICBibG9ja0VuY29kZXIud3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluaXNoZXMgdGhlIGN1cnJlbnQgWFogQmxvY2sgKGJ1dCBub3QgdGhlIHdob2xlIFhaIFN0cmVhbSkuCisgICAgICogVGhpcyBkb2Vzbid0IGZsdXNoIHRoZSBzdHJlYW0gc28gaXQncyBwb3NzaWJsZSB0aGF0IG5vdCBhbGwgZGF0YSB3aWxsCisgICAgICogYmUgZGVjb21wcmVzc2libGUgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbSB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAgICAgKiBDYWxsIGFsc28gPGNvZGU+Zmx1c2goKTwvY29kZT4gaWYgZmx1c2hpbmcgaXMgd2FudGVkIGluIGFkZGl0aW9uIHRvCisgICAgICogZmluaXNoaW5nIHRoZSBjdXJyZW50IFhaIEJsb2NrLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZXJlIGlzIG5vIHVuZmluaXNoZWQgQmxvY2sgb3BlbiwgdGhpcyBmdW5jdGlvbiB3aWxsIGRvIG5vdGhpbmcuCisgICAgICogKE5vIGVtcHR5IFhaIEJsb2NrIHdpbGwgYmUgY3JlYXRlZC4pCisgICAgICogPHA+CisgICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsLCBmb3IgZXhhbXBsZSwgdG8gY3JlYXRlCisgICAgICogcmFuZG9tLWFjY2Vzc2libGUgLnh6IGZpbGVzLgorICAgICAqIDxwPgorICAgICAqIFN0YXJ0aW5nIGEgbmV3IFhaIEJsb2NrIG1lYW5zIHRoYXQgdGhlIGVuY29kZXIgc3RhdGUgaXMgcmVzZXQuCisgICAgICogRG9pbmcgdGhpcyB2ZXJ5IG9mdGVuIHdpbGwgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQKKyAgICAgKiBmaWxlIGEgbG90IChtb3JlIHRoYW4gcGxhaW4gPGNvZGU+Zmx1c2goKTwvY29kZT4gd291bGQgZG8pLgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFhaSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWFogU3RyZWFtIGhhcyBncm93biB0b28gYmlnCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gZmluaXNoZWQgb3IgY2xvc2VkCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBieSB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kQmxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisKKyAgICAgICAgaWYgKGZpbmlzaGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IFhaSU9FeGNlcHRpb24oIlN0cmVhbSBmaW5pc2hlZCBvciBjbG9zZWQiKTsKKworICAgICAgICAvLyBOT1RFOiBPbmNlIHRoZXJlIGlzIHRocmVhZGluZyB3aXRoIG11bHRpcGxlIEJsb2NrcywgaXQncyBwb3NzaWJsZQorICAgICAgICAvLyB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBtb3JlIGxpa2UgYSBiYXJyaWVyIHRoYXQgcmV0dXJucworICAgICAgICAvLyBiZWZvcmUgdGhlIGxhc3QgQmxvY2sgaGFzIGJlZW4gZmluaXNoZWQuCisgICAgICAgIGlmIChibG9ja0VuY29kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBibG9ja0VuY29kZXIuZmluaXNoKCk7CisgICAgICAgICAgICAgICAgaW5kZXguYWRkKGJsb2NrRW5jb2Rlci5nZXRVbnBhZGRlZFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tFbmNvZGVyLmdldFVuY29tcHJlc3NlZFNpemUoKSk7CisgICAgICAgICAgICAgICAgYmxvY2tFbmNvZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaGVzIHRoZSBlbmNvZGVyIGFuZCBjYWxscyA8Y29kZT5vdXQuZmx1c2goKTwvY29kZT4uCisgICAgICogQWxsIGJ1ZmZlcmVkIHBlbmRpbmcgZGF0YSB3aWxsIHRoZW4gYmUgZGVjb21wcmVzc2libGUgZnJvbQorICAgICAqIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIDxwPgorICAgICAqIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB2ZXJ5IG9mdGVuIG1heSBpbmNyZWFzZSB0aGUgY29tcHJlc3NlZAorICAgICAqIGZpbGUgc2l6ZSBhIGxvdC4gVGhlIGZpbHRlciBjaGFpbiBvcHRpb25zIG1heSBhZmZlY3QgdGhlIHNpemUKKyAgICAgKiBpbmNyZWFzZSB0b28uIEZvciBleGFtcGxlLCB3aXRoIExaTUEyIHRoZSBIQzQgbWF0Y2ggZmluZGVyIGhhcworICAgICAqIHNtYWxsZXIgcGVuYWx0eSB3aXRoIGZsdXNoaW5nIHRoYW4gQlQ0LgorICAgICAqIDxwPgorICAgICAqIFNvbWUgZmlsdGVycyBkb24ndCBzdXBwb3J0IGZsdXNoaW5nLiBJZiB0aGUgZmlsdGVyIGNoYWluIGhhcworICAgICAqIHN1Y2ggYSBmaWx0ZXIsIDxjb2RlPmZsdXNoKCk8L2NvZGU+IHdpbGwgY2FsbCA8Y29kZT5lbmRCbG9jaygpPC9jb2RlPgorICAgICAqIGJlZm9yZSBmbHVzaGluZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBYWklPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFhaIFN0cmVhbSBoYXMgZ3Jvd24gdG9vIGJpZworICAgICAqCisgICAgICogQHRocm93cyAgICAgIFhaSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGZpbmlzaGVkIG9yIGNsb3NlZAorICAgICAqCisgICAgICogQHRocm93cyAgICAgIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYnkgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworCisgICAgICAgIGlmIChmaW5pc2hlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYWklPRXhjZXB0aW9uKCJTdHJlYW0gZmluaXNoZWQgb3IgY2xvc2VkIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChibG9ja0VuY29kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJzU3VwcG9ydEZsdXNoaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBldmVudHVhbGx5IGNhbGwgb3V0LmZsdXNoKCkgc28KKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBkbyBpdCBoZXJlIGFnYWluLgorICAgICAgICAgICAgICAgICAgICBibG9ja0VuY29kZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbmRCbG9jaygpOworICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmlzaGVzIGNvbXByZXNzaW9uIHdpdGhvdXQgY2xvc2luZyB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICogTm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuIHRvIHRoaXMgc3RyZWFtIGFmdGVyIGZpbmlzaGluZworICAgICAqIChjYWxsaW5nIDxjb2RlPndyaXRlPC9jb2RlPiB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBpcyBPSykuCisgICAgICogPHA+CisgICAgICogUmVwZWF0ZWQgY2FsbHMgdG8gPGNvZGU+ZmluaXNoKCk8L2NvZGU+IGRvIG5vdGhpbmcgdW5sZXNzCisgICAgICogYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgdGhpcyBzdHJlYW0gZWFybGllci4gSW4gdGhhdCBjYXNlCisgICAgICogdGhlIHNhbWUgZXhjZXB0aW9uIGlzIHRocm93biBhZ2Fpbi4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciBmaW5pc2hpbmcsIHRoZSBzdHJlYW0gbWF5IGJlIGNsb3NlZCBub3JtYWxseSB3aXRoCisgICAgICogPGNvZGU+Y2xvc2UoKTwvY29kZT4uIElmIHRoZSBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgYW55d2F5LCB0aGVyZQorICAgICAqIHVzdWFsbHkgaXMgbm8gbmVlZCB0byBjYWxsIDxjb2RlPmZpbmlzaCgpPC9jb2RlPiBzZXBhcmF0ZWx5LgorICAgICAqCisgICAgICogQHRocm93cyAgICAgIFhaSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWFogU3RyZWFtIGhhcyBncm93biB0b28gYmlnCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBieSB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFmaW5pc2hlZCkgeworICAgICAgICAgICAgLy8gVGhpcyBjaGVja3MgZm9yIHBlbmRpbmcgZXhjZXB0aW9ucyBzbyB3ZSBkb24ndCBuZWVkIHRvCisgICAgICAgICAgICAvLyB3b3JyeSBhYm91dCBpdCBoZXJlLgorICAgICAgICAgICAgZW5kQmxvY2soKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbmRleC5lbmNvZGUob3V0KTsKKyAgICAgICAgICAgICAgICBlbmNvZGVTdHJlYW1Gb290ZXIoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNldCBpdCB0byB0cnVlIG9ubHkgaWYgZXZlcnl0aGluZyBnb2VzIGZpbmUuIFNldHRpbmcgaXQgZWFybGllcgorICAgICAgICAgICAgLy8gd291bGQgY2F1c2UgcmVwZWF0ZWQgY2FsbHMgdG8gZmluaXNoKCkgZG8gbm90aGluZyBpbnN0ZWFkIG9mCisgICAgICAgICAgICAvLyB0aHJvd2luZyBhbiBleGNlcHRpb24gdG8gaW5kaWNhdGUgYW4gZWFybGllciBlcnJvci4KKyAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmlzaGVzIGNvbXByZXNzaW9uIGFuZCBjbG9zZXMgdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqIFRoZSB1bmRlcmx5aW5nIHN0cmVhbSA8Y29kZT5vdXQ8L2NvZGU+IGlzIGNsb3NlZCBldmVuIGlmIGZpbmlzaGluZworICAgICAqIGZhaWxzLiBJZiBib3RoIGZpbmlzaGluZyBhbmQgY2xvc2luZyBmYWlsLCB0aGUgZXhjZXB0aW9uIHRocm93bgorICAgICAqIGJ5IDxjb2RlPmZpbmlzaCgpPC9jb2RlPiBpcyB0aHJvd24gYW5kIHRoZSBleGNlcHRpb24gZnJvbSB0aGUgZmFpbGVkCisgICAgICogPGNvZGU+b3V0LmNsb3NlKCk8L2NvZGU+IGlzIGxvc3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzICAgICAgWFpJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWiBTdHJlYW0gaGFzIGdyb3duIHRvbyBiaWcKKyAgICAgKgorICAgICAqIEB0aHJvd3MgICAgICBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSWYgZmluaXNoKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgaXQgc3RvcmVzIHRoZSBleGNlcHRpb24gdG8KKyAgICAgICAgICAgIC8vIHRoZSB2YXJpYWJsZSAiZXhjZXB0aW9uIi4gU28gd2UgY2FuIGlnbm9yZSB0aGUgcG9zc2libGUKKyAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiBoZXJlLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhlIGV4Y2VwdGlvbiBidXQgb25seSBpZiB0aGVyZSBpcyBubyBwcmV2aW91cworICAgICAgICAgICAgICAgIC8vIHBlbmRpbmcgZXhjZXB0aW9uLgorICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5jb2RlU3RyZWFtRmxhZ3MoYnl0ZVtdIGJ1ZiwgaW50IG9mZikgeworICAgICAgICBidWZbb2ZmXSA9IDB4MDA7CisgICAgICAgIGJ1ZltvZmYgKyAxXSA9IChieXRlKXN0cmVhbUZsYWdzLmNoZWNrVHlwZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5jb2RlU3RyZWFtSGVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlKFhaLkhFQURFUl9NQUdJQyk7CisKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzJdOworICAgICAgICBlbmNvZGVTdHJlYW1GbGFncyhidWYsIDApOworICAgICAgICBvdXQud3JpdGUoYnVmKTsKKworICAgICAgICBFbmNvZGVyVXRpbC53cml0ZUNSQzMyKG91dCwgYnVmKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5jb2RlU3RyZWFtRm9vdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzZdOworICAgICAgICBsb25nIGJhY2t3YXJkU2l6ZSA9IGluZGV4LmdldEluZGV4U2l6ZSgpIC8gNCAtIDE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKQorICAgICAgICAgICAgYnVmW2ldID0gKGJ5dGUpKGJhY2t3YXJkU2l6ZSA+Pj4gKGkgKiA4KSk7CisKKyAgICAgICAgZW5jb2RlU3RyZWFtRmxhZ3MoYnVmLCA0KTsKKworICAgICAgICBFbmNvZGVyVXRpbC53cml0ZUNSQzMyKG91dCwgYnVmKTsKKyAgICAgICAgb3V0LndyaXRlKGJ1Zik7CisgICAgICAgIG91dC53cml0ZShYWi5GT09URVJfTUFHSUMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9jaGVjay9DUkMzMi5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2NoZWNrL0NSQzMyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4Mjg5OAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9jaGVjay9DUkMzMi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDUkMzMgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6LmNoZWNrOworCitwdWJsaWMgY2xhc3MgQ1JDMzIgZXh0ZW5kcyBDaGVjayB7CisgICAgcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwuemlwLkNSQzMyIHN0YXRlID0gbmV3IGphdmEudXRpbC56aXAuQ1JDMzIoKTsKKworICAgIHB1YmxpYyBDUkMzMigpIHsKKyAgICAgICAgc2l6ZSA9IDQ7CisgICAgICAgIG5hbWUgPSAiQ1JDMzIiOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgIHN0YXRlLnVwZGF0ZShidWYsIG9mZiwgbGVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGZpbmlzaCgpIHsKKyAgICAgICAgbG9uZyB2YWx1ZSA9IHN0YXRlLmdldFZhbHVlKCk7CisgICAgICAgIGJ5dGVbXSBidWYgPSB7IChieXRlKSh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSh2YWx1ZSA+Pj4gOCksCisgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSh2YWx1ZSA+Pj4gMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkodmFsdWUgPj4+IDI0KSB9OworICAgICAgICBzdGF0ZS5yZXNldCgpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9jaGVjay9DUkM2NC5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2NoZWNrL0NSQzY0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiMTViNwotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9jaGVjay9DUkM2NC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDUkM2NAorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6LmNoZWNrOworCitwdWJsaWMgY2xhc3MgQ1JDNjQgZXh0ZW5kcyBDaGVjayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBwb2x5ID0gMHhDOTZDNTc5NUQ3ODcwRjQyTDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gY3JjVGFibGUgPSBuZXcgbG9uZ1syNTZdOworCisgICAgcHJpdmF0ZSBsb25nIGNyYyA9IC0xOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBjcmNUYWJsZS5sZW5ndGg7ICsrYikgeworICAgICAgICAgICAgICAgIGxvbmcgciA9IGI7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgociAmIDEpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAociA+Pj4gMSkgXiBwb2x5OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID4+Pj0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjcmNUYWJsZVtiXSA9IHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ1JDNjQoKSB7CisgICAgICAgIHNpemUgPSA4OworICAgICAgICBuYW1lID0gIkNSQzY0IjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBpbnQgZW5kID0gb2ZmICsgbGVuOworCisgICAgICAgIHdoaWxlIChvZmYgPCBlbmQpCisgICAgICAgICAgICBjcmMgPSBjcmNUYWJsZVsoYnVmW29mZisrXSBeIChpbnQpY3JjKSAmIDB4RkZdIF4gKGNyYyA+Pj4gOCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBmaW5pc2goKSB7CisgICAgICAgIGxvbmcgdmFsdWUgPSB+Y3JjOworICAgICAgICBjcmMgPSAtMTsKKworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbOF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgYnVmW2ldID0gKGJ5dGUpKHZhbHVlID4+IChpICogOCkpOworCisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2NoZWNrL0NoZWNrLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovY2hlY2svQ2hlY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmMwMTFlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2NoZWNrL0NoZWNrLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENoZWNrCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHouY2hlY2s7CisKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5YWjsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5VbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb247CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaGVjayB7CisgICAgaW50IHNpemU7CisgICAgU3RyaW5nIG5hbWU7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbik7CisgICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBmaW5pc2goKTsKKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShieXRlW10gYnVmKSB7CisgICAgICAgIHVwZGF0ZShidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIENoZWNrIGdldEluc3RhbmNlKGludCBjaGVja1R5cGUpCisgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uIHsKKyAgICAgICAgc3dpdGNoIChjaGVja1R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgWFouQ0hFQ0tfTk9ORToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5vbmUoKTsKKworICAgICAgICAgICAgY2FzZSBYWi5DSEVDS19DUkMzMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENSQzMyKCk7CisKKyAgICAgICAgICAgIGNhc2UgWFouQ0hFQ0tfQ1JDNjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDUkM2NCgpOworCisgICAgICAgICAgICBjYXNlIFhaLkNIRUNLX1NIQTI1NjoKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNIQTI1NigpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHt9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIENoZWNrIElEICIgKyBjaGVja1R5cGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9jaGVjay9Ob25lLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovY2hlY2svTm9uZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwN2M4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovY2hlY2svTm9uZS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBOb25lCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHouY2hlY2s7CisKK3B1YmxpYyBjbGFzcyBOb25lIGV4dGVuZHMgQ2hlY2sgeworICAgIHB1YmxpYyBOb25lKCkgeworICAgICAgICBzaXplID0gMDsKKyAgICAgICAgbmFtZSA9ICJOb25lIjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikge30KKworICAgIHB1YmxpYyBieXRlW10gZmluaXNoKCkgeworICAgICAgICBieXRlW10gZW1wdHkgPSBuZXcgYnl0ZVswXTsKKyAgICAgICAgcmV0dXJuIGVtcHR5OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9jaGVjay9TSEEyNTYuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9jaGVjay9TSEEyNTYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjUwM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2NoZWNrL1NIQTI1Ni5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBTSEEyNTYKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5jaGVjazsKKworcHVibGljIGNsYXNzIFNIQTI1NiBleHRlbmRzIENoZWNrIHsKKyAgICBwcml2YXRlIGZpbmFsIGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdCBzaGEyNTY7CisKKyAgICBwdWJsaWMgU0hBMjU2KCkgdGhyb3dzIGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKKyAgICAgICAgc2l6ZSA9IDMyOworICAgICAgICBuYW1lID0gIlNIQS0yNTYiOworICAgICAgICBzaGEyNTYgPSBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQS0yNTYiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBzaGEyNTYudXBkYXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZmluaXNoKCkgeworICAgICAgICBieXRlW10gYnVmID0gc2hhMjU2LmRpZ2VzdCgpOworICAgICAgICBzaGEyNTYucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovY29tbW9uL0RlY29kZXJVdGlsLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovY29tbW9uL0RlY29kZXJVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdiYTQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9jb21tb24vRGVjb2RlclV0aWwuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIERlY29kZXJVdGlsCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHouY29tbW9uOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouWFo7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouWFpGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgb3JnLnR1a2FhbmkueHouQ29ycnVwdGVkSW5wdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLnR1a2FhbmkueHouVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgRGVjb2RlclV0aWwgZXh0ZW5kcyBVdGlsIHsKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDUkMzMlZhbGlkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVmX29mZikgeworICAgICAgICBDUkMzMiBjcmMzMiA9IG5ldyBDUkMzMigpOworICAgICAgICBjcmMzMi51cGRhdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIGxvbmcgdmFsdWUgPSBjcmMzMi5nZXRWYWx1ZSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKQorICAgICAgICAgICAgaWYgKChieXRlKSh2YWx1ZSA+Pj4gKGkgKiA4KSkgIT0gYnVmW3JlZl9vZmYgKyBpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJlYW1GbGFncyBkZWNvZGVTdHJlYW1IZWFkZXIoYnl0ZVtdIGJ1ZikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgWFouSEVBREVSX01BR0lDLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgaWYgKGJ1ZltpXSAhPSBYWi5IRUFERVJfTUFHSUNbaV0pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhaRm9ybWF0RXhjZXB0aW9uKCk7CisKKyAgICAgICAgaWYgKCFpc0NSQzMyVmFsaWQoYnVmLCBYWi5IRUFERVJfTUFHSUMubGVuZ3RoLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYWi5IRUFERVJfTUFHSUMubGVuZ3RoICsgMikpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oIlhaIFN0cmVhbSBIZWFkZXIgaXMgY29ycnVwdCIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZGVjb2RlU3RyZWFtRmxhZ3MoYnVmLCBYWi5IRUFERVJfTUFHSUMubGVuZ3RoKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBvcHRpb25zIGluIFhaIFN0cmVhbSBIZWFkZXIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyZWFtRmxhZ3MgZGVjb2RlU3RyZWFtRm9vdGVyKGJ5dGVbXSBidWYpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoYnVmWzEwXSAhPSBYWi5GT09URVJfTUFHSUNbMF0gfHwgYnVmWzExXSAhPSBYWi5GT09URVJfTUFHSUNbMV0pIHsKKyAgICAgICAgICAgIC8vIE5PVEU6IFRoZSBleGNlcHRpb24gY291bGQgYmUgWFpGb3JtYXRFeGNlcHRpb24gdG9vLgorICAgICAgICAgICAgLy8gSXQgZGVwZW5kcyBvbiB0aGUgc2l0dWF0aW9uIHdoaWNoIG9uZSBpcyBiZXR0ZXIuCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oIlhaIFN0cmVhbSBGb290ZXIgaXMgY29ycnVwdCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc0NSQzMyVmFsaWQoYnVmLCA0LCA2LCAwKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigiWFogU3RyZWFtIEZvb3RlciBpcyBjb3JydXB0Iik7CisKKyAgICAgICAgU3RyZWFtRmxhZ3Mgc3RyZWFtRmxhZ3M7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdHJlYW1GbGFncyA9IGRlY29kZVN0cmVhbUZsYWdzKGJ1ZiwgOCk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcHRpb25zRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgb3B0aW9ucyBpbiBYWiBTdHJlYW0gRm9vdGVyIik7CisgICAgICAgIH0KKworICAgICAgICBzdHJlYW1GbGFncy5iYWNrd2FyZFNpemUgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkKKyAgICAgICAgICAgIHN0cmVhbUZsYWdzLmJhY2t3YXJkU2l6ZSB8PSAoYnVmW2kgKyA0XSAmIDB4RkYpIDw8IChpICogOCk7CisKKyAgICAgICAgc3RyZWFtRmxhZ3MuYmFja3dhcmRTaXplID0gKHN0cmVhbUZsYWdzLmJhY2t3YXJkU2l6ZSArIDEpICogNDsKKworICAgICAgICByZXR1cm4gc3RyZWFtRmxhZ3M7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyZWFtRmxhZ3MgZGVjb2RlU3RyZWFtRmxhZ3MoYnl0ZVtdIGJ1ZiwgaW50IG9mZikKKyAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24geworICAgICAgICBpZiAoYnVmW29mZl0gIT0gMHgwMCB8fCAoYnVmW29mZiArIDFdICYgMHhGRikgPj0gMHgxMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oKTsKKworICAgICAgICBTdHJlYW1GbGFncyBzdHJlYW1GbGFncyA9IG5ldyBTdHJlYW1GbGFncygpOworICAgICAgICBzdHJlYW1GbGFncy5jaGVja1R5cGUgPSBidWZbb2ZmICsgMV07CisKKyAgICAgICAgcmV0dXJuIHN0cmVhbUZsYWdzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVTdHJlYW1GbGFnc0VxdWFsKFN0cmVhbUZsYWdzIGEsIFN0cmVhbUZsYWdzIGIpIHsKKyAgICAgICAgLy8gYmFja3dhcmRTaXplIGlzIGludGVudGlvbmFsbHkgbm90IGNvbXBhcmVkLgorICAgICAgICByZXR1cm4gYS5jaGVja1R5cGUgPT0gYi5jaGVja1R5cGU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIGRlY29kZVZMSShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGIgPSBpbi5yZWFkKCk7CisgICAgICAgIGlmIChiID09IC0xKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigpOworCisgICAgICAgIGxvbmcgbnVtID0gYiAmIDB4N0Y7CisgICAgICAgIGludCBpID0gMDsKKworICAgICAgICB3aGlsZSAoKGIgJiAweDgwKSAhPSAweDAwKSB7CisgICAgICAgICAgICBpZiAoKytpID49IFZMSV9TSVpFX01BWCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgYiA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChiID09IC0xKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgaWYgKGIgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgbnVtIHw9IChsb25nKShiICYgMHg3RikgPDwgKGkgKiA3KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudW07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2NvbW1vbi9FbmNvZGVyVXRpbC5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2NvbW1vbi9FbmNvZGVyVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjY4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovY29tbW9uL0VuY29kZXJVdGlsLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIEVuY29kZXJVdGlsCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHouY29tbW9uOworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOworCitwdWJsaWMgY2xhc3MgRW5jb2RlclV0aWwgZXh0ZW5kcyBVdGlsIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVDUkMzMihPdXRwdXRTdHJlYW0gb3V0LCBieXRlW10gYnVmKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ1JDMzIgY3JjMzIgPSBuZXcgQ1JDMzIoKTsKKyAgICAgICAgY3JjMzIudXBkYXRlKGJ1Zik7CisgICAgICAgIGxvbmcgdmFsdWUgPSBjcmMzMi5nZXRWYWx1ZSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKQorICAgICAgICAgICAgb3V0LndyaXRlKChieXRlKSh2YWx1ZSA+Pj4gKGkgKiA4KSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbmNvZGVWTEkoT3V0cHV0U3RyZWFtIG91dCwgbG9uZyBudW0pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3aGlsZSAobnVtID49IDB4ODApIHsKKyAgICAgICAgICAgIG91dC53cml0ZSgoYnl0ZSkobnVtIHwgMHg4MCkpOworICAgICAgICAgICAgbnVtID4+Pj0gNzsKKyAgICAgICAgfQorCisgICAgICAgIG91dC53cml0ZSgoYnl0ZSludW0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9jb21tb24vU3RyZWFtRmxhZ3MuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9jb21tb24vU3RyZWFtRmxhZ3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzA2OTg3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2NvbW1vbi9TdHJlYW1GbGFncy5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBTdHJlYW1GbGFncworICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6LmNvbW1vbjsKKworcHVibGljIGNsYXNzIFN0cmVhbUZsYWdzIHsKKyAgICBwdWJsaWMgaW50IGNoZWNrVHlwZSA9IC0xOworICAgIHB1YmxpYyBsb25nIGJhY2t3YXJkU2l6ZSA9IC0xOworfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2NvbW1vbi9VdGlsLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovY29tbW9uL1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDMyNGNlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2NvbW1vbi9VdGlsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIFV0aWwKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5jb21tb247CisKK3B1YmxpYyBjbGFzcyBVdGlsIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJFQU1fSEVBREVSX1NJWkUgPSAxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQkFDS1dBUkRfU0laRV9NQVggPSAxTCA8PCAzNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTE9DS19IRUFERVJfU0laRV9NQVggPSAxMDI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBWTElfTUFYID0gTG9uZy5NQVhfVkFMVUU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkxJX1NJWkVfTUFYID0gOTsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFZMSVNpemUobG9uZyBudW0pIHsKKyAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICArK3NpemU7CisgICAgICAgICAgICBudW0gPj49IDc7CisgICAgICAgIH0gd2hpbGUgKG51bSAhPSAwKTsKKworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovZGVsdGEvRGVsdGFDb2Rlci5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2RlbHRhL0RlbHRhQ29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTRlYjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2RlbHRhL0RlbHRhQ29kZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogRGVsdGFDb2RlcgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6LmRlbHRhOworCithYnN0cmFjdCBjbGFzcyBEZWx0YUNvZGVyIHsKKyAgICBzdGF0aWMgZmluYWwgaW50IERJU1RBTkNFX01JTiA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBESVNUQU5DRV9NQVggPSAyNTY7CisgICAgc3RhdGljIGZpbmFsIGludCBESVNUQU5DRV9NQVNLID0gRElTVEFOQ0VfTUFYIC0gMTsKKworICAgIGZpbmFsIGludCBkaXN0YW5jZTsKKyAgICBmaW5hbCBieXRlW10gaGlzdG9yeSA9IG5ldyBieXRlW0RJU1RBTkNFX01BWF07CisgICAgaW50IHBvcyA9IDA7CisKKyAgICBEZWx0YUNvZGVyKGludCBkaXN0YW5jZSkgeworICAgICAgICBpZiAoZGlzdGFuY2UgPCBESVNUQU5DRV9NSU4gfHwgZGlzdGFuY2UgPiBESVNUQU5DRV9NQVgpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgdGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9kZWx0YS9EZWx0YURlY29kZXIuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9kZWx0YS9EZWx0YURlY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTRjYmYzCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2RlbHRhL0RlbHRhRGVjb2Rlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBEZWx0YURlY29kZXIKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5kZWx0YTsKKworcHVibGljIGNsYXNzIERlbHRhRGVjb2RlciBleHRlbmRzIERlbHRhQ29kZXIgeworICAgIHB1YmxpYyBEZWx0YURlY29kZXIoaW50IGRpc3RhbmNlKSB7CisgICAgICAgIHN1cGVyKGRpc3RhbmNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWNvZGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBpbnQgZW5kID0gb2ZmICsgbGVuOworICAgICAgICBmb3IgKGludCBpID0gb2ZmOyBpIDwgZW5kOyArK2kpIHsKKyAgICAgICAgICAgIGJ1ZltpXSArPSBoaXN0b3J5WyhkaXN0YW5jZSArIHBvcykgJiBESVNUQU5DRV9NQVNLXTsKKyAgICAgICAgICAgIGhpc3RvcnlbcG9zLS0gJiBESVNUQU5DRV9NQVNLXSA9IGJ1ZltpXTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9kZWx0YS9EZWx0YUVuY29kZXIuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9kZWx0YS9EZWx0YUVuY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2FjY2NlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2RlbHRhL0RlbHRhRW5jb2Rlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBEZWx0YUVuY29kZXIKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5kZWx0YTsKKworcHVibGljIGNsYXNzIERlbHRhRW5jb2RlciBleHRlbmRzIERlbHRhQ29kZXIgeworICAgIHB1YmxpYyBEZWx0YUVuY29kZXIoaW50IGRpc3RhbmNlKSB7CisgICAgICAgIHN1cGVyKGRpc3RhbmNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmNvZGUoYnl0ZVtdIGluLCBpbnQgaW5fb2ZmLCBpbnQgbGVuLCBieXRlW10gb3V0KSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgIGJ5dGUgdG1wID0gaGlzdG9yeVsoZGlzdGFuY2UgKyBwb3MpICYgRElTVEFOQ0VfTUFTS107CisgICAgICAgICAgICBoaXN0b3J5W3Bvcy0tICYgRElTVEFOQ0VfTUFTS10gPSBpbltpbl9vZmYgKyBpXTsKKyAgICAgICAgICAgIG91dFtpXSA9IChieXRlKShpbltpbl9vZmYgKyBpXSAtIHRtcCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovaW5kZXgvQmxvY2tJbmZvLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovaW5kZXgvQmxvY2tJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiYWU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9pbmRleC9CbG9ja0luZm8uamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQmxvY2tJbmZvCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHouaW5kZXg7CisKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5jb21tb24uU3RyZWFtRmxhZ3M7CisKK3B1YmxpYyBjbGFzcyBCbG9ja0luZm8geworICAgIHB1YmxpYyBpbnQgYmxvY2tOdW1iZXIgPSAtMTsKKyAgICBwdWJsaWMgbG9uZyBjb21wcmVzc2VkT2Zmc2V0ID0gLTE7CisgICAgcHVibGljIGxvbmcgdW5jb21wcmVzc2VkT2Zmc2V0ID0gLTE7CisgICAgcHVibGljIGxvbmcgdW5wYWRkZWRTaXplID0gLTE7CisgICAgcHVibGljIGxvbmcgdW5jb21wcmVzc2VkU2l6ZSA9IC0xOworCisgICAgSW5kZXhEZWNvZGVyIGluZGV4OworCisgICAgcHVibGljIEJsb2NrSW5mbyhJbmRleERlY29kZXIgaW5kZXhPZkZpcnN0U3RyZWFtKSB7CisgICAgICAgIGluZGV4ID0gaW5kZXhPZkZpcnN0U3RyZWFtOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q2hlY2tUeXBlKCkgeworICAgICAgICByZXR1cm4gaW5kZXguZ2V0U3RyZWFtRmxhZ3MoKS5jaGVja1R5cGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGluZGV4Lmhhc1JlY29yZChibG9ja051bWJlciArIDEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5leHQoKSB7CisgICAgICAgIGluZGV4LnNldEJsb2NrSW5mbyh0aGlzLCBibG9ja051bWJlciArIDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9pbmRleC9JbmRleEJhc2UuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9pbmRleC9JbmRleEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTU2MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2luZGV4L0luZGV4QmFzZS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBJbmRleEJhc2UKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5pbmRleDsKKworaW1wb3J0IG9yZy50dWthYW5pLnh6LmNvbW1vbi5VdGlsOworaW1wb3J0IG9yZy50dWthYW5pLnh6LlhaSU9FeGNlcHRpb247CisKK2Fic3RyYWN0IGNsYXNzIEluZGV4QmFzZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBYWklPRXhjZXB0aW9uIGludmFsaWRJbmRleEV4Y2VwdGlvbjsKKyAgICBsb25nIGJsb2Nrc1N1bSA9IDA7CisgICAgbG9uZyB1bmNvbXByZXNzZWRTdW0gPSAwOworICAgIGxvbmcgaW5kZXhMaXN0U2l6ZSA9IDA7CisgICAgbG9uZyByZWNvcmRDb3VudCA9IDA7CisKKyAgICBJbmRleEJhc2UoWFpJT0V4Y2VwdGlvbiBpbnZhbGlkSW5kZXhFeGNlcHRpb24pIHsKKyAgICAgICAgdGhpcy5pbnZhbGlkSW5kZXhFeGNlcHRpb24gPSBpbnZhbGlkSW5kZXhFeGNlcHRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGdldFVucGFkZGVkSW5kZXhTaXplKCkgeworICAgICAgICAvLyBJbmRleCBJbmRpY2F0b3IgKyBOdW1iZXIgb2YgUmVjb3JkcyArIExpc3Qgb2YgUmVjb3JkcyArIENSQzMyCisgICAgICAgIHJldHVybiAxICsgVXRpbC5nZXRWTElTaXplKHJlY29yZENvdW50KSArIGluZGV4TGlzdFNpemUgKyA0OworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEluZGV4U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIChnZXRVbnBhZGRlZEluZGV4U2l6ZSgpICsgMykgJiB+MzsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTdHJlYW1TaXplKCkgeworICAgICAgICByZXR1cm4gVXRpbC5TVFJFQU1fSEVBREVSX1NJWkUgKyBibG9ja3NTdW0gKyBnZXRJbmRleFNpemUoKQorICAgICAgICAgICAgICAgICsgVXRpbC5TVFJFQU1fSEVBREVSX1NJWkU7CisgICAgfQorCisgICAgaW50IGdldEluZGV4UGFkZGluZ1NpemUoKSB7CisgICAgICAgIHJldHVybiAoaW50KSgoNCAtIGdldFVucGFkZGVkSW5kZXhTaXplKCkpICYgMyk7CisgICAgfQorCisgICAgdm9pZCBhZGQobG9uZyB1bnBhZGRlZFNpemUsIGxvbmcgdW5jb21wcmVzc2VkU2l6ZSkgdGhyb3dzIFhaSU9FeGNlcHRpb24geworICAgICAgICBibG9ja3NTdW0gKz0gKHVucGFkZGVkU2l6ZSArIDMpICYgfjM7CisgICAgICAgIHVuY29tcHJlc3NlZFN1bSArPSB1bmNvbXByZXNzZWRTaXplOworICAgICAgICBpbmRleExpc3RTaXplICs9IFV0aWwuZ2V0VkxJU2l6ZSh1bnBhZGRlZFNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBVdGlsLmdldFZMSVNpemUodW5jb21wcmVzc2VkU2l6ZSk7CisgICAgICAgICsrcmVjb3JkQ291bnQ7CisKKyAgICAgICAgaWYgKGJsb2Nrc1N1bSA8IDAgfHwgdW5jb21wcmVzc2VkU3VtIDwgMAorICAgICAgICAgICAgICAgIHx8IGdldEluZGV4U2l6ZSgpID4gVXRpbC5CQUNLV0FSRF9TSVpFX01BWAorICAgICAgICAgICAgICAgIHx8IGdldFN0cmVhbVNpemUoKSA8IDApCisgICAgICAgICAgICB0aHJvdyBpbnZhbGlkSW5kZXhFeGNlcHRpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2luZGV4L0luZGV4RGVjb2Rlci5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2luZGV4L0luZGV4RGVjb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYWU5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovaW5kZXgvSW5kZXhEZWNvZGVyLmphdmEKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBJbmRleERlY29kZXIKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5pbmRleDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnppcC5DaGVja2VkSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLnR1a2FhbmkueHouY29tbW9uLkRlY29kZXJVdGlsOworaW1wb3J0IG9yZy50dWthYW5pLnh6LmNvbW1vbi5TdHJlYW1GbGFnczsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5TZWVrYWJsZUlucHV0U3RyZWFtOworaW1wb3J0IG9yZy50dWthYW5pLnh6LkNvcnJ1cHRlZElucHV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy50dWthYW5pLnh6Lk1lbW9yeUxpbWl0RXhjZXB0aW9uOworaW1wb3J0IG9yZy50dWthYW5pLnh6LlVuc3VwcG9ydGVkT3B0aW9uc0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEluZGV4RGVjb2RlciBleHRlbmRzIEluZGV4QmFzZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJlYW1GbGFncyBzdHJlYW1GbGFnczsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgc3RyZWFtUGFkZGluZzsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtZW1vcnlVc2FnZTsKKworICAgIC8vIFVucGFkZGVkIFNpemUgYW5kIFVuY29tcHJlc3NlZCBTaXplIGZpZWxkcworICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIHVucGFkZGVkOworICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIHVuY29tcHJlc3NlZDsKKworICAgIC8vIFVuY29tcHJlc3NlZCBzaXplIG9mIHRoZSBsYXJnZXN0IEJsb2NrLiBJdCBpcyB1c2VkIGJ5CisgICAgLy8gU2Vla2FibGVYWklucHV0U3RyZWFtIHRvIGZpbmQgb3V0IHRoZSBsYXJnZXN0IEJsb2NrIG9mIHRoZSAueHogZmlsZS4KKyAgICBwcml2YXRlIGxvbmcgbGFyZ2VzdEJsb2NrU2l6ZSA9IDA7CisKKyAgICAvLyBPZmZzZXRzIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIC54eiBmaWxlLiBUaGVzZSBhcmUgYWxsIHplcm8KKyAgICAvLyBmb3IgdGhlIGZpcnN0IFN0cmVhbSBpbiB0aGUgZmlsZS4KKyAgICBwcml2YXRlIGludCByZWNvcmRPZmZzZXQgPSAwOworICAgIHByaXZhdGUgbG9uZyBjb21wcmVzc2VkT2Zmc2V0ID0gMDsKKyAgICBwcml2YXRlIGxvbmcgdW5jb21wcmVzc2VkT2Zmc2V0ID0gMDsKKworICAgIHB1YmxpYyBJbmRleERlY29kZXIoU2Vla2FibGVJbnB1dFN0cmVhbSBpbiwgU3RyZWFtRmxhZ3Mgc3RyZWFtRm9vdGVyRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHN0cmVhbVBhZGRpbmcsIGludCBtZW1vcnlMaW1pdCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigiWFogSW5kZXggaXMgY29ycnVwdCIpKTsKKyAgICAgICAgdGhpcy5zdHJlYW1GbGFncyA9IHN0cmVhbUZvb3RlckZsYWdzOworICAgICAgICB0aGlzLnN0cmVhbVBhZGRpbmcgPSBzdHJlYW1QYWRkaW5nOworCisgICAgICAgIC8vIElmIGVuZFBvcyBpcyBleGNlZWRlZCBiZWZvcmUgdGhlIENSQzMyIGZpZWxkIGhhcyBiZWVuIGRlY29kZWQsCisgICAgICAgIC8vIHRoZSBJbmRleCBpcyBjb3JydXB0LgorICAgICAgICBsb25nIGVuZFBvcyA9IGluLnBvc2l0aW9uKCkgKyBzdHJlYW1Gb290ZXJGbGFncy5iYWNrd2FyZFNpemUgLSA0OworCisgICAgICAgIGphdmEudXRpbC56aXAuQ1JDMzIgY3JjMzIgPSBuZXcgamF2YS51dGlsLnppcC5DUkMzMigpOworICAgICAgICBDaGVja2VkSW5wdXRTdHJlYW0gaW5DaGVja2VkID0gbmV3IENoZWNrZWRJbnB1dFN0cmVhbShpbiwgY3JjMzIpOworCisgICAgICAgIC8vIEluZGV4IEluZGljYXRvcgorICAgICAgICBpZiAoaW5DaGVja2VkLnJlYWQoKSAhPSAweDAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCJYWiBJbmRleCBpcyBjb3JydXB0Iik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIE51bWJlciBvZiBSZWNvcmRzCisgICAgICAgICAgICBsb25nIGNvdW50ID0gRGVjb2RlclV0aWwuZGVjb2RlVkxJKGluQ2hlY2tlZCk7CisKKyAgICAgICAgICAgIC8vIENhdGNoIFJlY29yZCBjb3VudHMgdGhhdCBvYnZpb3VzbHkgdG9vIGhpZ2ggdG8gYmUgdmFsaWQuCisgICAgICAgICAgICAvLyBUaGlzIHRlc3QgaXNuJ3QgZXhhY3QgYmVjYXVzZSBpdCBpZ25vcmVzIEluZGV4IEluZGljYXRvciwKKyAgICAgICAgICAgIC8vIE51bWJlciBvZiBSZWNvcmRzLCBhbmQgQ1JDMzIgZmllbGRzLCBidXQgdGhpcyBpcyBnb29kIGVub3VnaAorICAgICAgICAgICAgLy8gdG8gY2F0Y2ggdGhlIG1vc3Qgb2J2aW91cyBwcm9ibGVtcy4KKyAgICAgICAgICAgIGlmIChjb3VudCA+PSBzdHJlYW1Gb290ZXJGbGFncy5iYWNrd2FyZFNpemUgLyAyKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigiWFogSW5kZXggaXMgY29ycnVwdCIpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgUmVjb3JkIGNvdW50IGRvZXNuJ3QgZml0IGludG8gYW4gaW50LCB3ZSBjYW5ub3QKKyAgICAgICAgICAgIC8vIGFsbG9jYXRlIHRoZSBhcnJheXMgdG8gaG9sZCB0aGUgUmVjb3Jkcy4KKyAgICAgICAgICAgIGlmIChjb3VudCA+IEludGVnZXIuTUFYX1ZBTFVFKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wdGlvbnNFeGNlcHRpb24oIlhaIEluZGV4IGhhcyBvdmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci5NQVhfVkFMVUUgKyAiIFJlY29yZHMiKTsKKworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGFwcHJveGltYXRlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIGNoZWNrIHRoZQorICAgICAgICAgICAgLy8gbWVtb3J5IHVzYWdlIGxpbWl0LgorICAgICAgICAgICAgbWVtb3J5VXNhZ2UgPSAxICsgKGludCkoKDE2TCAqIGNvdW50ICsgMTAyMykgLyAxMDI0KTsKKyAgICAgICAgICAgIGlmIChtZW1vcnlMaW1pdCA+PSAwICYmIG1lbW9yeVVzYWdlID4gbWVtb3J5TGltaXQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1lbW9yeUxpbWl0RXhjZXB0aW9uKG1lbW9yeVVzYWdlLCBtZW1vcnlMaW1pdCk7CisKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBhcnJheXMgZm9yIHRoZSBSZWNvcmRzLgorICAgICAgICAgICAgdW5wYWRkZWQgPSBuZXcgbG9uZ1soaW50KWNvdW50XTsKKyAgICAgICAgICAgIHVuY29tcHJlc3NlZCA9IG5ldyBsb25nWyhpbnQpY291bnRdOworICAgICAgICAgICAgaW50IHJlY29yZCA9IDA7CisKKyAgICAgICAgICAgIC8vIERlY29kZSB0aGUgUmVjb3Jkcy4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAoaW50KWNvdW50OyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IFJlY29yZC4KKyAgICAgICAgICAgICAgICBsb25nIHVucGFkZGVkU2l6ZSA9IERlY29kZXJVdGlsLmRlY29kZVZMSShpbkNoZWNrZWQpOworICAgICAgICAgICAgICAgIGxvbmcgdW5jb21wcmVzc2VkU2l6ZSA9IERlY29kZXJVdGlsLmRlY29kZVZMSShpbkNoZWNrZWQpOworCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgaW5wdXQgcG9zaXRpb24gc3RheXMgc2FuZS4gU2luY2UgdGhpcyBpcworICAgICAgICAgICAgICAgIC8vIGNoZWNrZWQgb25seSBvbmNlIHBlciBsb29wIGl0ZXJhdGlvbiBpbnN0ZWFkIG9mIGZvcgorICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IGlucHV0IGJ5dGUgcmVhZCwgaXQncyBzdGlsbCBwb3NzaWJsZSB0aGF0CisgICAgICAgICAgICAgICAgLy8gRU9GRXhjZXB0aW9uIGdldHMgdGhyb3duIHdpdGggY29ycnVwdCBpbnB1dC4KKyAgICAgICAgICAgICAgICBpZiAoaW4ucG9zaXRpb24oKSA+IGVuZFBvcykKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCJYWiBJbmRleCBpcyBjb3JydXB0Iik7CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBSZWNvcmQuCisgICAgICAgICAgICAgICAgdW5wYWRkZWRbcmVjb3JkXSA9IGJsb2Nrc1N1bSArIHVucGFkZGVkU2l6ZTsKKyAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWRbcmVjb3JkXSA9IHVuY29tcHJlc3NlZFN1bSArIHVuY29tcHJlc3NlZFNpemU7CisgICAgICAgICAgICAgICAgKytyZWNvcmQ7CisgICAgICAgICAgICAgICAgc3VwZXIuYWRkKHVucGFkZGVkU2l6ZSwgdW5jb21wcmVzc2VkU2l6ZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHJlY29yZCA9PSByZWNvcmRDb3VudDsKKworICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBCbG9jay4KKyAgICAgICAgICAgICAgICBpZiAobGFyZ2VzdEJsb2NrU2l6ZSA8IHVuY29tcHJlc3NlZFNpemUpCisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RCbG9ja1NpemUgPSB1bmNvbXByZXNzZWRTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRU9GRXhjZXB0aW9uIGlzIGNhdWdodCBqdXN0IGluIGNhc2UgYSBjb3JydXB0IGlucHV0IGNhdXNlcworICAgICAgICAgICAgLy8gRGVjb2RlclV0aWwuZGVjb2RlVkxJIHRvIHJlYWQgdG9vIG11Y2ggYXQgb25jZS4KKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigiWFogSW5kZXggaXMgY29ycnVwdCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgSW5kZXggZmllbGQgbWF0Y2hlcworICAgICAgICAvLyBCYWNrd2FyZCBTaXplLgorICAgICAgICBpbnQgaW5kZXhQYWRkaW5nU2l6ZSA9IGdldEluZGV4UGFkZGluZ1NpemUoKTsKKyAgICAgICAgaWYgKGluLnBvc2l0aW9uKCkgKyBpbmRleFBhZGRpbmdTaXplICE9IGVuZFBvcykKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigiWFogSW5kZXggaXMgY29ycnVwdCIpOworCisgICAgICAgIC8vIEluZGV4IFBhZGRpbmcKKyAgICAgICAgd2hpbGUgKGluZGV4UGFkZGluZ1NpemUtLSA+IDApCisgICAgICAgICAgICBpZiAoaW5DaGVja2VkLnJlYWQoKSAhPSAweDAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigiWFogSW5kZXggaXMgY29ycnVwdCIpOworCisgICAgICAgIC8vIENSQzMyCisgICAgICAgIGxvbmcgdmFsdWUgPSBjcmMzMi5nZXRWYWx1ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkKKyAgICAgICAgICAgIGlmICgoKHZhbHVlID4+PiAoaSAqIDgpKSAmIDB4RkYpICE9IGluLnJlYWQoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oIlhaIEluZGV4IGlzIGNvcnJ1cHQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPZmZzZXRzKEluZGV4RGVjb2RlciBwcmV2KSB7CisgICAgICAgIC8vIE5PVEU6IFNlZWthYmxlWFpJbnB1dFN0cmVhbSBjaGVja3MgdGhhdCB0aGUgdG90YWwgbnVtYmVyIG9mIEJsb2NrcworICAgICAgICAvLyBpbiBjb25jYXRlbmF0ZWQgU3RyZWFtcyBmaXRzIGludG8gYW4gaW50LgorICAgICAgICByZWNvcmRPZmZzZXQgPSBwcmV2LnJlY29yZE9mZnNldCArIChpbnQpcHJldi5yZWNvcmRDb3VudDsKKyAgICAgICAgY29tcHJlc3NlZE9mZnNldCA9IHByZXYuY29tcHJlc3NlZE9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcmV2LmdldFN0cmVhbVNpemUoKSArIHByZXYuc3RyZWFtUGFkZGluZzsKKyAgICAgICAgYXNzZXJ0IChjb21wcmVzc2VkT2Zmc2V0ICYgMykgPT0gMDsKKyAgICAgICAgdW5jb21wcmVzc2VkT2Zmc2V0ID0gcHJldi51bmNvbXByZXNzZWRPZmZzZXQgKyBwcmV2LnVuY29tcHJlc3NlZFN1bTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1lbW9yeVVzYWdlKCkgeworICAgICAgICByZXR1cm4gbWVtb3J5VXNhZ2U7CisgICAgfQorCisgICAgcHVibGljIFN0cmVhbUZsYWdzIGdldFN0cmVhbUZsYWdzKCkgeworICAgICAgICByZXR1cm4gc3RyZWFtRmxhZ3M7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZWNvcmRDb3VudCgpIHsKKyAgICAgICAgLy8gSXQgd2FzIGFscmVhZHkgY2hlY2tlZCBpbiB0aGUgY29uc3RydWN0b3IgdGhhdCBpdCBmaXRzIGludG8gYW4gaW50LgorICAgICAgICAvLyBPdGhlcndpc2Ugd2UgY291bGRuJ3QgaGF2ZSBhbGxvY2F0ZWQgdGhlIGFycmF5cy4KKyAgICAgICAgcmV0dXJuIChpbnQpcmVjb3JkQ291bnQ7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0VW5jb21wcmVzc2VkU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHVuY29tcHJlc3NlZFN1bTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRMYXJnZXN0QmxvY2tTaXplKCkgeworICAgICAgICByZXR1cm4gbGFyZ2VzdEJsb2NrU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNVbmNvbXByZXNzZWRPZmZzZXQobG9uZyBwb3MpIHsKKyAgICAgICAgcmV0dXJuIHBvcyA+PSB1bmNvbXByZXNzZWRPZmZzZXQKKyAgICAgICAgICAgICAgICYmIHBvcyA8IHVuY29tcHJlc3NlZE9mZnNldCArIHVuY29tcHJlc3NlZFN1bTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZWNvcmQoaW50IGJsb2NrTnVtYmVyKSB7CisgICAgICAgIHJldHVybiBibG9ja051bWJlciA+PSByZWNvcmRPZmZzZXQKKyAgICAgICAgICAgICAgICYmIGJsb2NrTnVtYmVyIDwgcmVjb3JkT2Zmc2V0ICsgcmVjb3JkQ291bnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9jYXRlQmxvY2soQmxvY2tJbmZvIGluZm8sIGxvbmcgdGFyZ2V0KSB7CisgICAgICAgIGFzc2VydCB0YXJnZXQgPj0gdW5jb21wcmVzc2VkT2Zmc2V0OworICAgICAgICB0YXJnZXQgLT0gdW5jb21wcmVzc2VkT2Zmc2V0OworICAgICAgICBhc3NlcnQgdGFyZ2V0IDwgdW5jb21wcmVzc2VkU3VtOworCisgICAgICAgIGludCBsZWZ0ID0gMDsKKyAgICAgICAgaW50IHJpZ2h0ID0gdW5wYWRkZWQubGVuZ3RoIC0gMTsKKworICAgICAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7CisgICAgICAgICAgICBpbnQgaSA9IGxlZnQgKyAocmlnaHQgLSBsZWZ0KSAvIDI7CisKKyAgICAgICAgICAgIGlmICh1bmNvbXByZXNzZWRbaV0gPD0gdGFyZ2V0KQorICAgICAgICAgICAgICAgIGxlZnQgPSBpICsgMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByaWdodCA9IGk7CisgICAgICAgIH0KKworICAgICAgICBzZXRCbG9ja0luZm8oaW5mbywgcmVjb3JkT2Zmc2V0ICsgbGVmdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmxvY2tJbmZvKEJsb2NrSW5mbyBpbmZvLCBpbnQgYmxvY2tOdW1iZXIpIHsKKyAgICAgICAgLy8gVGhlIGNhbGxlciBoYXMgY2hlY2tlZCB0aGF0IHRoZSBnaXZlbiBCbG9jayBudW1iZXIgaXMgaW5zaWRlCisgICAgICAgIC8vIHRoaXMgSW5kZXguCisgICAgICAgIGFzc2VydCBibG9ja051bWJlciA+PSByZWNvcmRPZmZzZXQ7CisgICAgICAgIGFzc2VydCBibG9ja051bWJlciAtIHJlY29yZE9mZnNldCA8IHJlY29yZENvdW50OworCisgICAgICAgIGluZm8uaW5kZXggPSB0aGlzOworICAgICAgICBpbmZvLmJsb2NrTnVtYmVyID0gYmxvY2tOdW1iZXI7CisKKyAgICAgICAgaW50IHBvcyA9IGJsb2NrTnVtYmVyIC0gcmVjb3JkT2Zmc2V0OworCisgICAgICAgIGlmIChwb3MgPT0gMCkgeworICAgICAgICAgICAgaW5mby5jb21wcmVzc2VkT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGluZm8udW5jb21wcmVzc2VkT2Zmc2V0ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluZm8uY29tcHJlc3NlZE9mZnNldCA9ICh1bnBhZGRlZFtwb3MgLSAxXSArIDMpICYgfjM7CisgICAgICAgICAgICBpbmZvLnVuY29tcHJlc3NlZE9mZnNldCA9IHVuY29tcHJlc3NlZFtwb3MgLSAxXTsKKyAgICAgICAgfQorCisgICAgICAgIGluZm8udW5wYWRkZWRTaXplID0gdW5wYWRkZWRbcG9zXSAtIGluZm8uY29tcHJlc3NlZE9mZnNldDsKKyAgICAgICAgaW5mby51bmNvbXByZXNzZWRTaXplID0gdW5jb21wcmVzc2VkW3Bvc10gLSBpbmZvLnVuY29tcHJlc3NlZE9mZnNldDsKKworICAgICAgICBpbmZvLmNvbXByZXNzZWRPZmZzZXQgKz0gY29tcHJlc3NlZE9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBEZWNvZGVyVXRpbC5TVFJFQU1fSEVBREVSX1NJWkU7CisgICAgICAgIGluZm8udW5jb21wcmVzc2VkT2Zmc2V0ICs9IHVuY29tcHJlc3NlZE9mZnNldDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovaW5kZXgvSW5kZXhFbmNvZGVyLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovaW5kZXgvSW5kZXhFbmNvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiNDBkMQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9pbmRleC9JbmRleEVuY29kZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogSW5kZXhFbmNvZGVyCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHouaW5kZXg7CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC56aXAuQ2hlY2tlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5jb21tb24uRW5jb2RlclV0aWw7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouWFpJT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEluZGV4RW5jb2RlciBleHRlbmRzIEluZGV4QmFzZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3QgcmVjb3JkcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIHB1YmxpYyBJbmRleEVuY29kZXIoKSB7CisgICAgICAgIHN1cGVyKG5ldyBYWklPRXhjZXB0aW9uKCJYWiBTdHJlYW0gb3IgaXRzIEluZGV4IGhhcyBncm93biB0b28gYmlnIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZChsb25nIHVucGFkZGVkU2l6ZSwgbG9uZyB1bmNvbXByZXNzZWRTaXplKQorICAgICAgICAgICAgdGhyb3dzIFhaSU9FeGNlcHRpb24geworICAgICAgICBzdXBlci5hZGQodW5wYWRkZWRTaXplLCB1bmNvbXByZXNzZWRTaXplKTsKKyAgICAgICAgcmVjb3Jkcy5hZGQobmV3IEluZGV4UmVjb3JkKHVucGFkZGVkU2l6ZSwgdW5jb21wcmVzc2VkU2l6ZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuY29kZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBqYXZhLnV0aWwuemlwLkNSQzMyIGNyYzMyID0gbmV3IGphdmEudXRpbC56aXAuQ1JDMzIoKTsKKyAgICAgICAgQ2hlY2tlZE91dHB1dFN0cmVhbSBvdXRDaGVja2VkID0gbmV3IENoZWNrZWRPdXRwdXRTdHJlYW0ob3V0LCBjcmMzMik7CisKKyAgICAgICAgLy8gSW5kZXggSW5kaWNhdG9yCisgICAgICAgIG91dENoZWNrZWQud3JpdGUoMHgwMCk7CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIFJlY29yZHMKKyAgICAgICAgRW5jb2RlclV0aWwuZW5jb2RlVkxJKG91dENoZWNrZWQsIHJlY29yZENvdW50KTsKKworICAgICAgICAvLyBMaXN0IG9mIFJlY29yZHMKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcmVjb3Jkcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBJbmRleFJlY29yZCByZWNvcmQgPSAoSW5kZXhSZWNvcmQpaS5uZXh0KCk7CisgICAgICAgICAgICBFbmNvZGVyVXRpbC5lbmNvZGVWTEkob3V0Q2hlY2tlZCwgcmVjb3JkLnVucGFkZGVkKTsKKyAgICAgICAgICAgIEVuY29kZXJVdGlsLmVuY29kZVZMSShvdXRDaGVja2VkLCByZWNvcmQudW5jb21wcmVzc2VkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluZGV4IFBhZGRpbmcKKyAgICAgICAgZm9yIChpbnQgaSA9IGdldEluZGV4UGFkZGluZ1NpemUoKTsgaSA+IDA7IC0taSkKKyAgICAgICAgICAgIG91dENoZWNrZWQud3JpdGUoMHgwMCk7CisKKyAgICAgICAgLy8gQ1JDMzIKKyAgICAgICAgbG9uZyB2YWx1ZSA9IGNyYzMyLmdldFZhbHVlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKQorICAgICAgICAgICAgb3V0LndyaXRlKChieXRlKSh2YWx1ZSA+Pj4gKGkgKiA4KSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9pbmRleC9JbmRleEhhc2guamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9pbmRleC9JbmRleEhhc2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjE2OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2luZGV4L0luZGV4SGFzaC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBJbmRleEhhc2gKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5pbmRleDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLnppcC5DaGVja2VkSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLnR1a2FhbmkueHouY29tbW9uLkRlY29kZXJVdGlsOworaW1wb3J0IG9yZy50dWthYW5pLnh6LlhaSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLnR1a2FhbmkueHouQ29ycnVwdGVkSW5wdXRFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBJbmRleEhhc2ggZXh0ZW5kcyBJbmRleEJhc2UgeworICAgIHByaXZhdGUgb3JnLnR1a2FhbmkueHouY2hlY2suQ2hlY2sgaGFzaDsKKworICAgIHB1YmxpYyBJbmRleEhhc2goKSB7CisgICAgICAgIHN1cGVyKG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaGFzaCA9IG5ldyBvcmcudHVrYWFuaS54ei5jaGVjay5TSEEyNTYoKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFzaCA9IG5ldyBvcmcudHVrYWFuaS54ei5jaGVjay5DUkMzMigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkKGxvbmcgdW5wYWRkZWRTaXplLCBsb25nIHVuY29tcHJlc3NlZFNpemUpCisgICAgICAgICAgICB0aHJvd3MgWFpJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmFkZCh1bnBhZGRlZFNpemUsIHVuY29tcHJlc3NlZFNpemUpOworCisgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgyICogOCk7CisgICAgICAgIGJ1Zi5wdXRMb25nKHVucGFkZGVkU2l6ZSk7CisgICAgICAgIGJ1Zi5wdXRMb25nKHVuY29tcHJlc3NlZFNpemUpOworICAgICAgICBoYXNoLnVwZGF0ZShidWYuYXJyYXkoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEluZGV4IEluZGljYXRvciAoMHgwMCkgaGFzIGFscmVhZHkgYmVlbiByZWFkIGJ5IEJsb2NrSW5wdXRTdHJlYW0KKyAgICAgICAgLy8gc28gYWRkIDB4MDAgdG8gdGhlIENSQzMyIGhlcmUuCisgICAgICAgIGphdmEudXRpbC56aXAuQ1JDMzIgY3JjMzIgPSBuZXcgamF2YS51dGlsLnppcC5DUkMzMigpOworICAgICAgICBjcmMzMi51cGRhdGUoJ1wwJyk7CisgICAgICAgIENoZWNrZWRJbnB1dFN0cmVhbSBpbkNoZWNrZWQgPSBuZXcgQ2hlY2tlZElucHV0U3RyZWFtKGluLCBjcmMzMik7CisKKyAgICAgICAgLy8gR2V0IGFuZCB2YWxpZGF0ZSB0aGUgTnVtYmVyIG9mIFJlY29yZHMgZmllbGQuCisgICAgICAgIGxvbmcgc3RvcmVkUmVjb3JkQ291bnQgPSBEZWNvZGVyVXRpbC5kZWNvZGVWTEkoaW5DaGVja2VkKTsKKyAgICAgICAgaWYgKHN0b3JlZFJlY29yZENvdW50ICE9IHJlY29yZENvdW50KQorICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCJYWiBJbmRleCBpcyBjb3JydXB0Iik7CisKKyAgICAgICAgLy8gRGVjb2RlIGFuZCBoYXNoIHRoZSBJbmRleCBmaWVsZCBhbmQgY29tcGFyZSBpdCB0bworICAgICAgICAvLyB0aGUgaGFzaCB2YWx1ZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRlY29kZWQgQmxvY2tzLgorICAgICAgICBJbmRleEhhc2ggc3RvcmVkID0gbmV3IEluZGV4SGFzaCgpOworICAgICAgICBmb3IgKGxvbmcgaSA9IDA7IGkgPCByZWNvcmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBsb25nIHVucGFkZGVkU2l6ZSA9IERlY29kZXJVdGlsLmRlY29kZVZMSShpbkNoZWNrZWQpOworICAgICAgICAgICAgbG9uZyB1bmNvbXByZXNzZWRTaXplID0gRGVjb2RlclV0aWwuZGVjb2RlVkxJKGluQ2hlY2tlZCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RvcmVkLmFkZCh1bnBhZGRlZFNpemUsIHVuY29tcHJlc3NlZFNpemUpOworICAgICAgICAgICAgfSBjYXRjaCAoWFpJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCJYWiBJbmRleCBpcyBjb3JydXB0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdG9yZWQuYmxvY2tzU3VtID4gYmxvY2tzU3VtCisgICAgICAgICAgICAgICAgICAgIHx8IHN0b3JlZC51bmNvbXByZXNzZWRTdW0gPiB1bmNvbXByZXNzZWRTdW0KKyAgICAgICAgICAgICAgICAgICAgfHwgc3RvcmVkLmluZGV4TGlzdFNpemUgPiBpbmRleExpc3RTaXplKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigiWFogSW5kZXggaXMgY29ycnVwdCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0b3JlZC5ibG9ja3NTdW0gIT0gYmxvY2tzU3VtCisgICAgICAgICAgICAgICAgfHwgc3RvcmVkLnVuY29tcHJlc3NlZFN1bSAhPSB1bmNvbXByZXNzZWRTdW0KKyAgICAgICAgICAgICAgICB8fCBzdG9yZWQuaW5kZXhMaXN0U2l6ZSAhPSBpbmRleExpc3RTaXplCisgICAgICAgICAgICAgICAgfHwgIUFycmF5cy5lcXVhbHMoc3RvcmVkLmhhc2guZmluaXNoKCksIGhhc2guZmluaXNoKCkpKQorICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCJYWiBJbmRleCBpcyBjb3JydXB0Iik7CisKKyAgICAgICAgLy8gSW5kZXggUGFkZGluZworICAgICAgICBEYXRhSW5wdXRTdHJlYW0gaW5EYXRhID0gbmV3IERhdGFJbnB1dFN0cmVhbShpbkNoZWNrZWQpOworICAgICAgICBmb3IgKGludCBpID0gZ2V0SW5kZXhQYWRkaW5nU2l6ZSgpOyBpID4gMDsgLS1pKQorICAgICAgICAgICAgaWYgKGluRGF0YS5yZWFkVW5zaWduZWRCeXRlKCkgIT0gMHgwMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oIlhaIEluZGV4IGlzIGNvcnJ1cHQiKTsKKworICAgICAgICAvLyBDUkMzMgorICAgICAgICBsb25nIHZhbHVlID0gY3JjMzIuZ2V0VmFsdWUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICBpZiAoKCh2YWx1ZSA+Pj4gKGkgKiA4KSkgJiAweEZGKSAhPSBpbkRhdGEucmVhZFVuc2lnbmVkQnl0ZSgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbigiWFogSW5kZXggaXMgY29ycnVwdCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9pbmRleC9JbmRleFJlY29yZC5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2luZGV4L0luZGV4UmVjb3JkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2YmEwZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9pbmRleC9JbmRleFJlY29yZC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBJbmRleFJlY29yZAorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6LmluZGV4OworCitjbGFzcyBJbmRleFJlY29yZCB7CisgICAgZmluYWwgbG9uZyB1bnBhZGRlZDsKKyAgICBmaW5hbCBsb25nIHVuY29tcHJlc3NlZDsKKworICAgIEluZGV4UmVjb3JkKGxvbmcgdW5wYWRkZWQsIGxvbmcgdW5jb21wcmVzc2VkKSB7CisgICAgICAgIHRoaXMudW5wYWRkZWQgPSB1bnBhZGRlZDsKKyAgICAgICAgdGhpcy51bmNvbXByZXNzZWQgPSB1bmNvbXByZXNzZWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6L0JUNC5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6L0JUNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3M2I2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovbHovQlQ0LmphdmEKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBCaW5hcnkgVHJlZSBtYXRjaCBmaW5kZXIgd2l0aCAyLSwgMy0sIGFuZCA0LWJ5dGUgaGFzaGluZworICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5sejsKKworZmluYWwgY2xhc3MgQlQ0IGV4dGVuZHMgTFpFbmNvZGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2gyMzQgaGFzaDsKKyAgICBwcml2YXRlIGZpbmFsIGludFtdIHRyZWU7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXRjaGVzIG1hdGNoZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZGVwdGhMaW1pdDsKKworICAgIHByaXZhdGUgZmluYWwgaW50IGN5Y2xpY1NpemU7CisgICAgcHJpdmF0ZSBpbnQgY3ljbGljUG9zID0gLTE7CisgICAgcHJpdmF0ZSBpbnQgbHpQb3M7CisKKyAgICBzdGF0aWMgaW50IGdldE1lbW9yeVVzYWdlKGludCBkaWN0U2l6ZSkgeworICAgICAgICByZXR1cm4gSGFzaDIzNC5nZXRNZW1vcnlVc2FnZShkaWN0U2l6ZSkgKyBkaWN0U2l6ZSAvICgxMDI0IC8gOCkgKyAxMDsKKyAgICB9CisKKyAgICBCVDQoaW50IGRpY3RTaXplLCBpbnQgYmVmb3JlU2l6ZU1pbiwgaW50IHJlYWRBaGVhZE1heCwKKyAgICAgICAgICAgIGludCBuaWNlTGVuLCBpbnQgbWF0Y2hMZW5NYXgsIGludCBkZXB0aExpbWl0KSB7CisgICAgICAgIHN1cGVyKGRpY3RTaXplLCBiZWZvcmVTaXplTWluLCByZWFkQWhlYWRNYXgsIG5pY2VMZW4sIG1hdGNoTGVuTWF4KTsKKworICAgICAgICBjeWNsaWNTaXplID0gZGljdFNpemUgKyAxOworICAgICAgICBselBvcyA9IGN5Y2xpY1NpemU7CisKKyAgICAgICAgaGFzaCA9IG5ldyBIYXNoMjM0KGRpY3RTaXplKTsKKyAgICAgICAgdHJlZSA9IG5ldyBpbnRbY3ljbGljU2l6ZSAqIDJdOworCisgICAgICAgIC8vIFN1YnN0cmFjdGluZyAxIGJlY2F1c2UgdGhlIHNob3J0ZXN0IG1hdGNoIHRoYXQgdGhpcyBtYXRjaAorICAgICAgICAvLyBmaW5kZXIgY2FuIGZpbmQgaXMgMiBieXRlcywgc28gdGhlcmUncyBubyBuZWVkIHRvIHJlc2VydmUKKyAgICAgICAgLy8gc3BhY2UgZm9yIG9uZS1ieXRlIG1hdGNoZXMuCisgICAgICAgIG1hdGNoZXMgPSBuZXcgTWF0Y2hlcyhuaWNlTGVuIC0gMSk7CisKKyAgICAgICAgdGhpcy5kZXB0aExpbWl0ID0gZGVwdGhMaW1pdCA+IDAgPyBkZXB0aExpbWl0IDogMTYgKyBuaWNlTGVuIC8gMjsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtb3ZlUG9zKCkgeworICAgICAgICBpbnQgYXZhaWwgPSBtb3ZlUG9zKG5pY2VMZW4sIDQpOworCisgICAgICAgIGlmIChhdmFpbCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKytselBvcyA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgICAgIGludCBub3JtYWxpemF0aW9uT2Zmc2V0ID0gSW50ZWdlci5NQVhfVkFMVUUgLSBjeWNsaWNTaXplOworICAgICAgICAgICAgICAgIGhhc2gubm9ybWFsaXplKG5vcm1hbGl6YXRpb25PZmZzZXQpOworICAgICAgICAgICAgICAgIG5vcm1hbGl6ZSh0cmVlLCBub3JtYWxpemF0aW9uT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBselBvcyAtPSBub3JtYWxpemF0aW9uT2Zmc2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKytjeWNsaWNQb3MgPT0gY3ljbGljU2l6ZSkKKyAgICAgICAgICAgICAgICBjeWNsaWNQb3MgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGF2YWlsOworICAgIH0KKworICAgIHB1YmxpYyBNYXRjaGVzIGdldE1hdGNoZXMoKSB7CisgICAgICAgIG1hdGNoZXMuY291bnQgPSAwOworCisgICAgICAgIGludCBtYXRjaExlbkxpbWl0ID0gbWF0Y2hMZW5NYXg7CisgICAgICAgIGludCBuaWNlTGVuTGltaXQgPSBuaWNlTGVuOworICAgICAgICBpbnQgYXZhaWwgPSBtb3ZlUG9zKCk7CisKKyAgICAgICAgaWYgKGF2YWlsIDwgbWF0Y2hMZW5MaW1pdCkgeworICAgICAgICAgICAgaWYgKGF2YWlsID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXM7CisKKyAgICAgICAgICAgIG1hdGNoTGVuTGltaXQgPSBhdmFpbDsKKyAgICAgICAgICAgIGlmIChuaWNlTGVuTGltaXQgPiBhdmFpbCkKKyAgICAgICAgICAgICAgICBuaWNlTGVuTGltaXQgPSBhdmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGhhc2guY2FsY0hhc2hlcyhidWYsIHJlYWRQb3MpOworICAgICAgICBpbnQgZGVsdGEyID0gbHpQb3MgLSBoYXNoLmdldEhhc2gyUG9zKCk7CisgICAgICAgIGludCBkZWx0YTMgPSBselBvcyAtIGhhc2guZ2V0SGFzaDNQb3MoKTsKKyAgICAgICAgaW50IGN1cnJlbnRNYXRjaCA9IGhhc2guZ2V0SGFzaDRQb3MoKTsKKyAgICAgICAgaGFzaC51cGRhdGVUYWJsZXMobHpQb3MpOworCisgICAgICAgIGludCBsZW5CZXN0ID0gMDsKKworICAgICAgICAvLyBTZWUgaWYgdGhlIGhhc2ggZnJvbSB0aGUgZmlyc3QgdHdvIGJ5dGVzIGZvdW5kIGEgbWF0Y2guCisgICAgICAgIC8vIFRoZSBoYXNoaW5nIGFsZ29yaXRobSBndWFyYW50ZWVzIHRoYXQgaWYgdGhlIGZpcnN0IGJ5dGUKKyAgICAgICAgLy8gbWF0Y2hlcywgYWxzbyB0aGUgc2Vjb25kIGJ5dGUgZG9lcywgc28gdGhlcmUncyBubyBuZWVkIHRvCisgICAgICAgIC8vIHRlc3QgdGhlIHNlY29uZCBieXRlLgorICAgICAgICBpZiAoZGVsdGEyIDwgY3ljbGljU2l6ZSAmJiBidWZbcmVhZFBvcyAtIGRlbHRhMl0gPT0gYnVmW3JlYWRQb3NdKSB7CisgICAgICAgICAgICBsZW5CZXN0ID0gMjsKKyAgICAgICAgICAgIG1hdGNoZXMubGVuWzBdID0gMjsKKyAgICAgICAgICAgIG1hdGNoZXMuZGlzdFswXSA9IGRlbHRhMiAtIDE7CisgICAgICAgICAgICBtYXRjaGVzLmNvdW50ID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlZSBpZiB0aGUgaGFzaCBmcm9tIHRoZSBmaXJzdCB0aHJlZSBieXRlcyBmb3VuZCBhIG1hdGNoIHRoYXQKKyAgICAgICAgLy8gaXMgZGlmZmVyZW50IGZyb20gdGhlIG1hdGNoIHBvc3NpYmx5IGZvdW5kIGJ5IHRoZSB0d28tYnl0ZSBoYXNoLgorICAgICAgICAvLyBBbHNvIGhlcmUgdGhlIGhhc2hpbmcgYWxnb3JpdGhtIGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUgZmlyc3QgYnl0ZQorICAgICAgICAvLyBtYXRjaGVzLCBhbHNvIHRoZSBuZXh0IHR3byBieXRlcyBkby4KKyAgICAgICAgaWYgKGRlbHRhMiAhPSBkZWx0YTMgJiYgZGVsdGEzIDwgY3ljbGljU2l6ZQorICAgICAgICAgICAgICAgICYmIGJ1ZltyZWFkUG9zIC0gZGVsdGEzXSA9PSBidWZbcmVhZFBvc10pIHsKKyAgICAgICAgICAgIGxlbkJlc3QgPSAzOworICAgICAgICAgICAgbWF0Y2hlcy5kaXN0W21hdGNoZXMuY291bnQrK10gPSBkZWx0YTMgLSAxOworICAgICAgICAgICAgZGVsdGEyID0gZGVsdGEzOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgYSBtYXRjaCB3YXMgZm91bmQsIHNlZSBob3cgbG9uZyBpdCBpcy4KKyAgICAgICAgaWYgKG1hdGNoZXMuY291bnQgPiAwKSB7CisgICAgICAgICAgICB3aGlsZSAobGVuQmVzdCA8IG1hdGNoTGVuTGltaXQgJiYgYnVmW3JlYWRQb3MgKyBsZW5CZXN0IC0gZGVsdGEyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IGJ1ZltyZWFkUG9zICsgbGVuQmVzdF0pCisgICAgICAgICAgICAgICAgKytsZW5CZXN0OworCisgICAgICAgICAgICBtYXRjaGVzLmxlblttYXRjaGVzLmNvdW50IC0gMV0gPSBsZW5CZXN0OworCisgICAgICAgICAgICAvLyBSZXR1cm4gaWYgaXQgaXMgbG9uZyBlbm91Z2ggKG5pY2VMZW4gb3IgcmVhY2hlZCB0aGUgZW5kIG9mCisgICAgICAgICAgICAvLyB0aGUgZGljdGlvbmFyeSkuCisgICAgICAgICAgICBpZiAobGVuQmVzdCA+PSBuaWNlTGVuTGltaXQpIHsKKyAgICAgICAgICAgICAgICBza2lwKG5pY2VMZW5MaW1pdCwgY3VycmVudE1hdGNoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIExvbmcgZW5vdWdoIG1hdGNoIHdhc24ndCBmb3VuZCBzbyBlYXNpbHkuIExvb2sgZm9yIGJldHRlciBtYXRjaGVzCisgICAgICAgIC8vIGZyb20gdGhlIGJpbmFyeSB0cmVlLgorICAgICAgICBpZiAobGVuQmVzdCA8IDMpCisgICAgICAgICAgICBsZW5CZXN0ID0gMzsKKworICAgICAgICBpbnQgZGVwdGggPSBkZXB0aExpbWl0OworCisgICAgICAgIGludCBwdHIwID0gKGN5Y2xpY1BvcyA8PCAxKSArIDE7CisgICAgICAgIGludCBwdHIxID0gY3ljbGljUG9zIDw8IDE7CisgICAgICAgIGludCBsZW4wID0gMDsKKyAgICAgICAgaW50IGxlbjEgPSAwOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgZGVsdGEgPSBselBvcyAtIGN1cnJlbnRNYXRjaDsKKworICAgICAgICAgICAgLy8gUmV0dXJuIGlmIHRoZSBzZWFyY2ggZGVwdGggbGltaXQgaGFzIGJlZW4gcmVhY2hlZCBvcgorICAgICAgICAgICAgLy8gaWYgdGhlIGRpc3RhbmNlIG9mIHRoZSBwb3RlbnRpYWwgbWF0Y2ggZXhjZWVkcyB0aGUKKyAgICAgICAgICAgIC8vIGRpY3Rpb25hcnkgc2l6ZS4KKyAgICAgICAgICAgIGlmIChkZXB0aC0tID09IDAgfHwgZGVsdGEgPj0gY3ljbGljU2l6ZSkgeworICAgICAgICAgICAgICAgIHRyZWVbcHRyMF0gPSAwOworICAgICAgICAgICAgICAgIHRyZWVbcHRyMV0gPSAwOworICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgcGFpciA9IChjeWNsaWNQb3MgLSBkZWx0YQorICAgICAgICAgICAgICAgICAgICAgICAgKyAoZGVsdGEgPiBjeWNsaWNQb3MgPyBjeWNsaWNTaXplIDogMCkpIDw8IDE7CisgICAgICAgICAgICBpbnQgbGVuID0gTWF0aC5taW4obGVuMCwgbGVuMSk7CisKKyAgICAgICAgICAgIGlmIChidWZbcmVhZFBvcyArIGxlbiAtIGRlbHRhXSA9PSBidWZbcmVhZFBvcyArIGxlbl0pIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKytsZW4gPCBtYXRjaExlbkxpbWl0KQorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmW3JlYWRQb3MgKyBsZW4gLSBkZWx0YV0gIT0gYnVmW3JlYWRQb3MgKyBsZW5dKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpZiAobGVuID4gbGVuQmVzdCkgeworICAgICAgICAgICAgICAgICAgICBsZW5CZXN0ID0gbGVuOworICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLmxlblttYXRjaGVzLmNvdW50XSA9IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5kaXN0W21hdGNoZXMuY291bnRdID0gZGVsdGEgLSAxOworICAgICAgICAgICAgICAgICAgICArK21hdGNoZXMuY291bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+PSBuaWNlTGVuTGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVbcHRyMV0gPSB0cmVlW3BhaXJdOworICAgICAgICAgICAgICAgICAgICAgICAgdHJlZVtwdHIwXSA9IHRyZWVbcGFpciArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoYnVmW3JlYWRQb3MgKyBsZW4gLSBkZWx0YV0gJiAweEZGKQorICAgICAgICAgICAgICAgICAgICA8IChidWZbcmVhZFBvcyArIGxlbl0gJiAweEZGKSkgeworICAgICAgICAgICAgICAgIHRyZWVbcHRyMV0gPSBjdXJyZW50TWF0Y2g7CisgICAgICAgICAgICAgICAgcHRyMSA9IHBhaXIgKyAxOworICAgICAgICAgICAgICAgIGN1cnJlbnRNYXRjaCA9IHRyZWVbcHRyMV07CisgICAgICAgICAgICAgICAgbGVuMSA9IGxlbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJlZVtwdHIwXSA9IGN1cnJlbnRNYXRjaDsKKyAgICAgICAgICAgICAgICBwdHIwID0gcGFpcjsKKyAgICAgICAgICAgICAgICBjdXJyZW50TWF0Y2ggPSB0cmVlW3B0cjBdOworICAgICAgICAgICAgICAgIGxlbjAgPSBsZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2tpcChpbnQgbmljZUxlbkxpbWl0LCBpbnQgY3VycmVudE1hdGNoKSB7CisgICAgICAgIGludCBkZXB0aCA9IGRlcHRoTGltaXQ7CisKKyAgICAgICAgaW50IHB0cjAgPSAoY3ljbGljUG9zIDw8IDEpICsgMTsKKyAgICAgICAgaW50IHB0cjEgPSBjeWNsaWNQb3MgPDwgMTsKKyAgICAgICAgaW50IGxlbjAgPSAwOworICAgICAgICBpbnQgbGVuMSA9IDA7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBkZWx0YSA9IGx6UG9zIC0gY3VycmVudE1hdGNoOworCisgICAgICAgICAgICBpZiAoZGVwdGgtLSA9PSAwIHx8IGRlbHRhID49IGN5Y2xpY1NpemUpIHsKKyAgICAgICAgICAgICAgICB0cmVlW3B0cjBdID0gMDsKKyAgICAgICAgICAgICAgICB0cmVlW3B0cjFdID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBwYWlyID0gKGN5Y2xpY1BvcyAtIGRlbHRhCisgICAgICAgICAgICAgICAgICAgICAgICArIChkZWx0YSA+IGN5Y2xpY1BvcyA/IGN5Y2xpY1NpemUgOiAwKSkgPDwgMTsKKyAgICAgICAgICAgIGludCBsZW4gPSBNYXRoLm1pbihsZW4wLCBsZW4xKTsKKworICAgICAgICAgICAgaWYgKGJ1ZltyZWFkUG9zICsgbGVuIC0gZGVsdGFdID09IGJ1ZltyZWFkUG9zICsgbGVuXSkgeworICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gbG9vayBmb3IgbG9uZ2VyIG1hdGNoZXMgdGhhbiBuaWNlTGVuTGltaXQKKyAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHdlIG9ubHkgYXJlIHVwZGF0aW5nIHRoZSB0cmVlLCBub3QgcmV0dXJuaW5nCisgICAgICAgICAgICAgICAgLy8gbWF0Y2hlcyBmb3VuZCB0byB0aGUgY2FsbGVyLgorICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCsrbGVuID09IG5pY2VMZW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJlZVtwdHIxXSA9IHRyZWVbcGFpcl07CisgICAgICAgICAgICAgICAgICAgICAgICB0cmVlW3B0cjBdID0gdHJlZVtwYWlyICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChidWZbcmVhZFBvcyArIGxlbiAtIGRlbHRhXSA9PSBidWZbcmVhZFBvcyArIGxlbl0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGJ1ZltyZWFkUG9zICsgbGVuIC0gZGVsdGFdICYgMHhGRikKKyAgICAgICAgICAgICAgICAgICAgPCAoYnVmW3JlYWRQb3MgKyBsZW5dICYgMHhGRikpIHsKKyAgICAgICAgICAgICAgICB0cmVlW3B0cjFdID0gY3VycmVudE1hdGNoOworICAgICAgICAgICAgICAgIHB0cjEgPSBwYWlyICsgMTsKKyAgICAgICAgICAgICAgICBjdXJyZW50TWF0Y2ggPSB0cmVlW3B0cjFdOworICAgICAgICAgICAgICAgIGxlbjEgPSBsZW47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyZWVbcHRyMF0gPSBjdXJyZW50TWF0Y2g7CisgICAgICAgICAgICAgICAgcHRyMCA9IHBhaXI7CisgICAgICAgICAgICAgICAgY3VycmVudE1hdGNoID0gdHJlZVtwdHIwXTsKKyAgICAgICAgICAgICAgICBsZW4wID0gbGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2tpcChpbnQgbGVuKSB7CisgICAgICAgIHdoaWxlIChsZW4tLSA+IDApIHsKKyAgICAgICAgICAgIGludCBuaWNlTGVuTGltaXQgPSBuaWNlTGVuOworICAgICAgICAgICAgaW50IGF2YWlsID0gbW92ZVBvcygpOworCisgICAgICAgICAgICBpZiAoYXZhaWwgPCBuaWNlTGVuTGltaXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXZhaWwgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBuaWNlTGVuTGltaXQgPSBhdmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFzaC5jYWxjSGFzaGVzKGJ1ZiwgcmVhZFBvcyk7CisgICAgICAgICAgICBpbnQgY3VycmVudE1hdGNoID0gaGFzaC5nZXRIYXNoNFBvcygpOworICAgICAgICAgICAgaGFzaC51cGRhdGVUYWJsZXMobHpQb3MpOworCisgICAgICAgICAgICBza2lwKG5pY2VMZW5MaW1pdCwgY3VycmVudE1hdGNoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9sei9DUkMzMkhhc2guamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9sei9DUkMzMkhhc2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWRmZGJmCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6L0NSQzMySGFzaC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDUkMzMkhhc2gKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHoubHo7CisKKy8qKgorICogUHJvdmlkZXMgYSBDUkMzMiB0YWJsZSB1c2luZyB0aGUgcG9seW5vbWlhbCBmcm9tIElFRUUgODAyLjMuCisgKi8KK2NsYXNzIENSQzMySGFzaCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENSQzMyX1BPTFkgPSAweEVEQjg4MzIwOworCisgICAgc3RhdGljIGZpbmFsIGludFtdIGNyY1RhYmxlID0gbmV3IGludFsyNTZdOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgICAgICAgaW50IHIgPSBpOworCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDg7ICsraikgeworICAgICAgICAgICAgICAgIGlmICgociAmIDEpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHIgPSAociA+Pj4gMSkgXiBDUkMzMl9QT0xZOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgciA+Pj49IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNyY1RhYmxlW2ldID0gcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9sei9IQzQuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9sei9IQzQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQ5ZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6L0hDNC5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogSGFzaCBDaGFpbiBtYXRjaCBmaW5kZXIgd2l0aCAyLSwgMy0sIGFuZCA0LWJ5dGUgaGFzaGluZworICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5sejsKKworZmluYWwgY2xhc3MgSEM0IGV4dGVuZHMgTFpFbmNvZGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2gyMzQgaGFzaDsKKyAgICBwcml2YXRlIGZpbmFsIGludFtdIGNoYWluOworICAgIHByaXZhdGUgZmluYWwgTWF0Y2hlcyBtYXRjaGVzOworICAgIHByaXZhdGUgZmluYWwgaW50IGRlcHRoTGltaXQ7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBjeWNsaWNTaXplOworICAgIHByaXZhdGUgaW50IGN5Y2xpY1BvcyA9IC0xOworICAgIHByaXZhdGUgaW50IGx6UG9zOworCisgICAgLyoqCisgICAgICogR2V0cyBhcHByb3hpbWF0ZSBtZW1vcnkgdXNhZ2Ugb2YgdGhlIG1hdGNoIGZpbmRlciBhcyBraWJpYnl0ZXMuCisgICAgICovCisgICAgc3RhdGljIGludCBnZXRNZW1vcnlVc2FnZShpbnQgZGljdFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEhhc2gyMzQuZ2V0TWVtb3J5VXNhZ2UoZGljdFNpemUpICsgZGljdFNpemUgLyAoMTAyNCAvIDQpICsgMTA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBMWkVuY29kZXIgd2l0aCB0aGUgSEM0IG1hdGNoIGZpbmRlci4KKyAgICAgKiBTZWUgPGNvZGU+TFpFbmNvZGVyLmdldEluc3RhbmNlPC9jb2RlPiBmb3IgcGFyYW1ldGVyIGRlc2NyaXB0aW9ucy4KKyAgICAgKi8KKyAgICBIQzQoaW50IGRpY3RTaXplLCBpbnQgYmVmb3JlU2l6ZU1pbiwgaW50IHJlYWRBaGVhZE1heCwKKyAgICAgICAgICAgIGludCBuaWNlTGVuLCBpbnQgbWF0Y2hMZW5NYXgsIGludCBkZXB0aExpbWl0KSB7CisgICAgICAgIHN1cGVyKGRpY3RTaXplLCBiZWZvcmVTaXplTWluLCByZWFkQWhlYWRNYXgsIG5pY2VMZW4sIG1hdGNoTGVuTWF4KTsKKworICAgICAgICBoYXNoID0gbmV3IEhhc2gyMzQoZGljdFNpemUpOworCisgICAgICAgIC8vICsxIGJlY2F1c2Ugd2UgbmVlZCBkaWN0U2l6ZSBieXRlcyBvZiBoaXN0b3J5ICsgdGhlIGN1cnJlbnQgYnl0ZS4KKyAgICAgICAgY3ljbGljU2l6ZSA9IGRpY3RTaXplICsgMTsKKyAgICAgICAgY2hhaW4gPSBuZXcgaW50W2N5Y2xpY1NpemVdOworICAgICAgICBselBvcyA9IGN5Y2xpY1NpemU7CisKKyAgICAgICAgLy8gU3Vic3RyYWN0aW5nIDEgYmVjYXVzZSB0aGUgc2hvcnRlc3QgbWF0Y2ggdGhhdCB0aGlzIG1hdGNoCisgICAgICAgIC8vIGZpbmRlciBjYW4gZmluZCBpcyAyIGJ5dGVzLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gcmVzZXJ2ZQorICAgICAgICAvLyBzcGFjZSBmb3Igb25lLWJ5dGUgbWF0Y2hlcy4KKyAgICAgICAgbWF0Y2hlcyA9IG5ldyBNYXRjaGVzKG5pY2VMZW4gLSAxKTsKKworICAgICAgICAvLyBVc2UgYSBkZWZhdWx0IGRlcHRoIGxpbWl0IGlmIG5vIG90aGVyIHZhbHVlIHdhcyBzcGVjaWZpZWQuCisgICAgICAgIC8vIFRoZSBkZWZhdWx0IGlzIGp1c3Qgc29tZXRoaW5nIGJhc2VkIG9uIGV4cGVyaW1lbnRhdGlvbjsKKyAgICAgICAgLy8gaXQncyBub3RoaW5nIG1hZ2ljLgorICAgICAgICB0aGlzLmRlcHRoTGltaXQgPSAoZGVwdGhMaW1pdCA+IDApID8gZGVwdGhMaW1pdCA6IDQgKyBuaWNlTGVuIC8gNDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0byB0aGUgbmV4dCBieXRlLCBjaGVja3MgdGhhdCB0aGVyZSBpcyBlbm91Z2ggYXZhaWxhYmxlIHNwYWNlLAorICAgICAqIGFuZCBwb3NzaWJseSBub3JtYWxpemVzIHRoZSBoYXNoIHRhYmxlcyBhbmQgdGhlIGhhc2ggY2hhaW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSwgaW5jbHVkaW5nIHRoZSBjdXJyZW50IGJ5dGUKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtb3ZlUG9zKCkgeworICAgICAgICBpbnQgYXZhaWwgPSBtb3ZlUG9zKDQsIDQpOworCisgICAgICAgIGlmIChhdmFpbCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKytselBvcyA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgICAgIGludCBub3JtYWxpemF0aW9uT2Zmc2V0ID0gSW50ZWdlci5NQVhfVkFMVUUgLSBjeWNsaWNTaXplOworICAgICAgICAgICAgICAgIGhhc2gubm9ybWFsaXplKG5vcm1hbGl6YXRpb25PZmZzZXQpOworICAgICAgICAgICAgICAgIG5vcm1hbGl6ZShjaGFpbiwgbm9ybWFsaXphdGlvbk9mZnNldCk7CisgICAgICAgICAgICAgICAgbHpQb3MgLT0gbm9ybWFsaXphdGlvbk9mZnNldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCsrY3ljbGljUG9zID09IGN5Y2xpY1NpemUpCisgICAgICAgICAgICAgICAgY3ljbGljUG9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhdmFpbDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWF0Y2hlcyBnZXRNYXRjaGVzKCkgeworICAgICAgICBtYXRjaGVzLmNvdW50ID0gMDsKKyAgICAgICAgaW50IG1hdGNoTGVuTGltaXQgPSBtYXRjaExlbk1heDsKKyAgICAgICAgaW50IG5pY2VMZW5MaW1pdCA9IG5pY2VMZW47CisgICAgICAgIGludCBhdmFpbCA9IG1vdmVQb3MoKTsKKworICAgICAgICBpZiAoYXZhaWwgPCBtYXRjaExlbkxpbWl0KSB7CisgICAgICAgICAgICBpZiAoYXZhaWwgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlczsKKworICAgICAgICAgICAgbWF0Y2hMZW5MaW1pdCA9IGF2YWlsOworICAgICAgICAgICAgaWYgKG5pY2VMZW5MaW1pdCA+IGF2YWlsKQorICAgICAgICAgICAgICAgIG5pY2VMZW5MaW1pdCA9IGF2YWlsOworICAgICAgICB9CisKKyAgICAgICAgaGFzaC5jYWxjSGFzaGVzKGJ1ZiwgcmVhZFBvcyk7CisgICAgICAgIGludCBkZWx0YTIgPSBselBvcyAtIGhhc2guZ2V0SGFzaDJQb3MoKTsKKyAgICAgICAgaW50IGRlbHRhMyA9IGx6UG9zIC0gaGFzaC5nZXRIYXNoM1BvcygpOworICAgICAgICBpbnQgY3VycmVudE1hdGNoID0gaGFzaC5nZXRIYXNoNFBvcygpOworICAgICAgICBoYXNoLnVwZGF0ZVRhYmxlcyhselBvcyk7CisKKyAgICAgICAgY2hhaW5bY3ljbGljUG9zXSA9IGN1cnJlbnRNYXRjaDsKKworICAgICAgICBpbnQgbGVuQmVzdCA9IDA7CisKKyAgICAgICAgLy8gU2VlIGlmIHRoZSBoYXNoIGZyb20gdGhlIGZpcnN0IHR3byBieXRlcyBmb3VuZCBhIG1hdGNoLgorICAgICAgICAvLyBUaGUgaGFzaGluZyBhbGdvcml0aG0gZ3VhcmFudGVlcyB0aGF0IGlmIHRoZSBmaXJzdCBieXRlCisgICAgICAgIC8vIG1hdGNoZXMsIGFsc28gdGhlIHNlY29uZCBieXRlIGRvZXMsIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0bworICAgICAgICAvLyB0ZXN0IHRoZSBzZWNvbmQgYnl0ZS4KKyAgICAgICAgaWYgKGRlbHRhMiA8IGN5Y2xpY1NpemUgJiYgYnVmW3JlYWRQb3MgLSBkZWx0YTJdID09IGJ1ZltyZWFkUG9zXSkgeworICAgICAgICAgICAgbGVuQmVzdCA9IDI7CisgICAgICAgICAgICBtYXRjaGVzLmxlblswXSA9IDI7CisgICAgICAgICAgICBtYXRjaGVzLmRpc3RbMF0gPSBkZWx0YTIgLSAxOworICAgICAgICAgICAgbWF0Y2hlcy5jb3VudCA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZWUgaWYgdGhlIGhhc2ggZnJvbSB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgZm91bmQgYSBtYXRjaCB0aGF0CisgICAgICAgIC8vIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBtYXRjaCBwb3NzaWJseSBmb3VuZCBieSB0aGUgdHdvLWJ5dGUgaGFzaC4KKyAgICAgICAgLy8gQWxzbyBoZXJlIHRoZSBoYXNoaW5nIGFsZ29yaXRobSBndWFyYW50ZWVzIHRoYXQgaWYgdGhlIGZpcnN0IGJ5dGUKKyAgICAgICAgLy8gbWF0Y2hlcywgYWxzbyB0aGUgbmV4dCB0d28gYnl0ZXMgZG8uCisgICAgICAgIGlmIChkZWx0YTIgIT0gZGVsdGEzICYmIGRlbHRhMyA8IGN5Y2xpY1NpemUKKyAgICAgICAgICAgICAgICAmJiBidWZbcmVhZFBvcyAtIGRlbHRhM10gPT0gYnVmW3JlYWRQb3NdKSB7CisgICAgICAgICAgICBsZW5CZXN0ID0gMzsKKyAgICAgICAgICAgIG1hdGNoZXMuZGlzdFttYXRjaGVzLmNvdW50KytdID0gZGVsdGEzIC0gMTsKKyAgICAgICAgICAgIGRlbHRhMiA9IGRlbHRhMzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIGEgbWF0Y2ggd2FzIGZvdW5kLCBzZWUgaG93IGxvbmcgaXQgaXMuCisgICAgICAgIGlmIChtYXRjaGVzLmNvdW50ID4gMCkgeworICAgICAgICAgICAgd2hpbGUgKGxlbkJlc3QgPCBtYXRjaExlbkxpbWl0ICYmIGJ1ZltyZWFkUG9zICsgbGVuQmVzdCAtIGRlbHRhMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBidWZbcmVhZFBvcyArIGxlbkJlc3RdKQorICAgICAgICAgICAgICAgICsrbGVuQmVzdDsKKworICAgICAgICAgICAgbWF0Y2hlcy5sZW5bbWF0Y2hlcy5jb3VudCAtIDFdID0gbGVuQmVzdDsKKworICAgICAgICAgICAgLy8gUmV0dXJuIGlmIGl0IGlzIGxvbmcgZW5vdWdoIChuaWNlTGVuIG9yIHJlYWNoZWQgdGhlIGVuZCBvZgorICAgICAgICAgICAgLy8gdGhlIGRpY3Rpb25hcnkpLgorICAgICAgICAgICAgaWYgKGxlbkJlc3QgPj0gbmljZUxlbkxpbWl0KQorICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9uZyBlbm91Z2ggbWF0Y2ggd2Fzbid0IGZvdW5kIHNvIGVhc2lseS4gTG9vayBmb3IgYmV0dGVyIG1hdGNoZXMKKyAgICAgICAgLy8gZnJvbSB0aGUgaGFzaCBjaGFpbi4KKyAgICAgICAgaWYgKGxlbkJlc3QgPCAzKQorICAgICAgICAgICAgbGVuQmVzdCA9IDM7CisKKyAgICAgICAgaW50IGRlcHRoID0gZGVwdGhMaW1pdDsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGRlbHRhID0gbHpQb3MgLSBjdXJyZW50TWF0Y2g7CisKKyAgICAgICAgICAgIC8vIFJldHVybiBpZiB0aGUgc2VhcmNoIGRlcHRoIGxpbWl0IGhhcyBiZWVuIHJlYWNoZWQgb3IKKyAgICAgICAgICAgIC8vIGlmIHRoZSBkaXN0YW5jZSBvZiB0aGUgcG90ZW50aWFsIG1hdGNoIGV4Y2VlZHMgdGhlCisgICAgICAgICAgICAvLyBkaWN0aW9uYXJ5IHNpemUuCisgICAgICAgICAgICBpZiAoZGVwdGgtLSA9PSAwIHx8IGRlbHRhID49IGN5Y2xpY1NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXM7CisKKyAgICAgICAgICAgIGN1cnJlbnRNYXRjaCA9IGNoYWluW2N5Y2xpY1BvcyAtIGRlbHRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChkZWx0YSA+IGN5Y2xpY1BvcyA/IGN5Y2xpY1NpemUgOiAwKV07CisKKyAgICAgICAgICAgIC8vIFRlc3QgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBmaXJzdCBuZXcgYnl0ZSB0aGF0IHdvdWxkIGdpdmUgdXMKKyAgICAgICAgICAgIC8vIGEgbWF0Y2ggdGhhdCBpcyBhdCBsZWFzdCBvbmUgYnl0ZSBsb25nZXIgdGhhbiBsZW5CZXN0LiBUaGlzCisgICAgICAgICAgICAvLyB0b28gc2hvcnQgbWF0Y2hlcyBnZXQgcXVpY2tseSBza2lwcGVkLgorICAgICAgICAgICAgaWYgKGJ1ZltyZWFkUG9zICsgbGVuQmVzdCAtIGRlbHRhXSA9PSBidWZbcmVhZFBvcyArIGxlbkJlc3RdCisgICAgICAgICAgICAgICAgICAgICYmIGJ1ZltyZWFkUG9zIC0gZGVsdGFdID09IGJ1ZltyZWFkUG9zXSkgeworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaC4KKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKytsZW4gPCBtYXRjaExlbkxpbWl0KQorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmW3JlYWRQb3MgKyBsZW4gLSBkZWx0YV0gIT0gYnVmW3JlYWRQb3MgKyBsZW5dKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIG1hdGNoIGlmIGFuZCBvbmx5IGlmIGl0IGlzIGJldHRlciB0aGFuIHRoZSBsb25nZXN0CisgICAgICAgICAgICAgICAgLy8gbWF0Y2ggZm91bmQgc28gZmFyLgorICAgICAgICAgICAgICAgIGlmIChsZW4gPiBsZW5CZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIGxlbkJlc3QgPSBsZW47CisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMubGVuW21hdGNoZXMuY291bnRdID0gbGVuOworICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLmRpc3RbbWF0Y2hlcy5jb3VudF0gPSBkZWx0YSAtIDE7CisgICAgICAgICAgICAgICAgICAgICsrbWF0Y2hlcy5jb3VudDsKKworICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gaWYgaXQgaXMgbG9uZyBlbm91Z2ggKG5pY2VMZW4gb3IgcmVhY2hlZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSBkaWN0aW9uYXJ5KS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+PSBuaWNlTGVuTGltaXQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBza2lwKGludCBsZW4pIHsKKyAgICAgICAgYXNzZXJ0IGxlbiA+PSAwOworCisgICAgICAgIHdoaWxlIChsZW4tLSA+IDApIHsKKyAgICAgICAgICAgIGlmIChtb3ZlUG9zKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaGFzaCBjaGFpbiBhbmQgaGFzaCB0YWJsZXMuCisgICAgICAgICAgICAgICAgaGFzaC5jYWxjSGFzaGVzKGJ1ZiwgcmVhZFBvcyk7CisgICAgICAgICAgICAgICAgY2hhaW5bY3ljbGljUG9zXSA9IGhhc2guZ2V0SGFzaDRQb3MoKTsKKyAgICAgICAgICAgICAgICBoYXNoLnVwZGF0ZVRhYmxlcyhselBvcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovbHovSGFzaDIzNC5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6L0hhc2gyMzQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjUzYmMwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6L0hhc2gyMzQuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogMi0sIDMtLCBhbmQgNC1ieXRlIGhhc2hpbmcKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHoubHo7CisKK2ZpbmFsIGNsYXNzIEhhc2gyMzQgZXh0ZW5kcyBDUkMzMkhhc2ggeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIXzJfU0laRSA9IDEgPDwgMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU0hfMl9NQVNLID0gSEFTSF8yX1NJWkUgLSAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhBU0hfM19TSVpFID0gMSA8PCAxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEFTSF8zX01BU0sgPSBIQVNIXzNfU0laRSAtIDE7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBoYXNoNE1hc2s7CisKKyAgICBwcml2YXRlIGZpbmFsIGludFtdIGhhc2gyVGFibGUgPSBuZXcgaW50W0hBU0hfMl9TSVpFXTsKKyAgICBwcml2YXRlIGZpbmFsIGludFtdIGhhc2gzVGFibGUgPSBuZXcgaW50W0hBU0hfM19TSVpFXTsKKyAgICBwcml2YXRlIGZpbmFsIGludFtdIGhhc2g0VGFibGU7CisKKyAgICBwcml2YXRlIGludCBoYXNoMlZhbHVlID0gMDsKKyAgICBwcml2YXRlIGludCBoYXNoM1ZhbHVlID0gMDsKKyAgICBwcml2YXRlIGludCBoYXNoNFZhbHVlID0gMDsKKworICAgIHN0YXRpYyBpbnQgZ2V0SGFzaDRTaXplKGludCBkaWN0U2l6ZSkgeworICAgICAgICBpbnQgaCA9IGRpY3RTaXplIC0gMTsKKyAgICAgICAgaCB8PSBoID4+PiAxOworICAgICAgICBoIHw9IGggPj4+IDI7CisgICAgICAgIGggfD0gaCA+Pj4gNDsKKyAgICAgICAgaCB8PSBoID4+PiA4OworICAgICAgICBoID4+Pj0gMTsKKyAgICAgICAgaCB8PSAweEZGRkY7CisgICAgICAgIGlmIChoID4gKDEgPDwgMjQpKQorICAgICAgICAgICAgaCA+Pj49IDE7CisKKyAgICAgICAgcmV0dXJuIGggKyAxOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZ2V0TWVtb3J5VXNhZ2UoaW50IGRpY3RTaXplKSB7CisgICAgICAgIC8vIFNpemVzIG9mIHRoZSBoYXNoIGFycmF5cyArIGEgbGl0dGxlIGV4dHJhCisgICAgICAgIHJldHVybiAoSEFTSF8yX1NJWkUgKyBIQVNIXzNfU0laRSArIGdldEhhc2g0U2l6ZShkaWN0U2l6ZSkpCisgICAgICAgICAgICAgICAvICgxMDI0IC8gNCkgKyA0OworICAgIH0KKworICAgIEhhc2gyMzQoaW50IGRpY3RTaXplKSB7CisgICAgICAgIGhhc2g0VGFibGUgPSBuZXcgaW50W2dldEhhc2g0U2l6ZShkaWN0U2l6ZSldOworICAgICAgICBoYXNoNE1hc2sgPSBoYXNoNFRhYmxlLmxlbmd0aCAtIDE7CisgICAgfQorCisgICAgdm9pZCBjYWxjSGFzaGVzKGJ5dGVbXSBidWYsIGludCBvZmYpIHsKKyAgICAgICAgaW50IHRlbXAgPSBjcmNUYWJsZVtidWZbb2ZmXSAmIDB4RkZdIF4gKGJ1ZltvZmYgKyAxXSAmIDB4RkYpOworICAgICAgICBoYXNoMlZhbHVlID0gdGVtcCAmIEhBU0hfMl9NQVNLOworCisgICAgICAgIHRlbXAgXj0gKGJ1ZltvZmYgKyAyXSAmIDB4RkYpIDw8IDg7CisgICAgICAgIGhhc2gzVmFsdWUgPSB0ZW1wICYgSEFTSF8zX01BU0s7CisKKyAgICAgICAgdGVtcCBePSBjcmNUYWJsZVtidWZbb2ZmICsgM10gJiAweEZGXSA8PCA1OworICAgICAgICBoYXNoNFZhbHVlID0gdGVtcCAmIGhhc2g0TWFzazsKKyAgICB9CisKKyAgICBpbnQgZ2V0SGFzaDJQb3MoKSB7CisgICAgICAgIHJldHVybiBoYXNoMlRhYmxlW2hhc2gyVmFsdWVdOworICAgIH0KKworICAgIGludCBnZXRIYXNoM1BvcygpIHsKKyAgICAgICAgcmV0dXJuIGhhc2gzVGFibGVbaGFzaDNWYWx1ZV07CisgICAgfQorCisgICAgaW50IGdldEhhc2g0UG9zKCkgeworICAgICAgICByZXR1cm4gaGFzaDRUYWJsZVtoYXNoNFZhbHVlXTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZVRhYmxlcyhpbnQgcG9zKSB7CisgICAgICAgIGhhc2gyVGFibGVbaGFzaDJWYWx1ZV0gPSBwb3M7CisgICAgICAgIGhhc2gzVGFibGVbaGFzaDNWYWx1ZV0gPSBwb3M7CisgICAgICAgIGhhc2g0VGFibGVbaGFzaDRWYWx1ZV0gPSBwb3M7CisgICAgfQorCisgICAgdm9pZCBub3JtYWxpemUoaW50IG5vcm1hbGl6ZU9mZnNldCkgeworICAgICAgICBMWkVuY29kZXIubm9ybWFsaXplKGhhc2gyVGFibGUsIG5vcm1hbGl6ZU9mZnNldCk7CisgICAgICAgIExaRW5jb2Rlci5ub3JtYWxpemUoaGFzaDNUYWJsZSwgbm9ybWFsaXplT2Zmc2V0KTsKKyAgICAgICAgTFpFbmNvZGVyLm5vcm1hbGl6ZShoYXNoNFRhYmxlLCBub3JtYWxpemVPZmZzZXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9sei9MWkRlY29kZXIuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9sei9MWkRlY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODBmZWMxCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6L0xaRGVjb2Rlci5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogTFpEZWNvZGVyCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6Lmx6OworCitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5Db3JydXB0ZWRJbnB1dEV4Y2VwdGlvbjsKKworcHVibGljIGZpbmFsIGNsYXNzIExaRGVjb2RlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYnVmOworICAgIHByaXZhdGUgaW50IHN0YXJ0ID0gMDsKKyAgICBwcml2YXRlIGludCBwb3MgPSAwOworICAgIHByaXZhdGUgaW50IGZ1bGwgPSAwOworICAgIHByaXZhdGUgaW50IGxpbWl0ID0gMDsKKyAgICBwcml2YXRlIGludCBwZW5kaW5nTGVuID0gMDsKKyAgICBwcml2YXRlIGludCBwZW5kaW5nRGlzdCA9IDA7CisKKyAgICBwdWJsaWMgTFpEZWNvZGVyKGludCBkaWN0U2l6ZSwgYnl0ZVtdIHByZXNldERpY3QpIHsKKyAgICAgICAgYnVmID0gbmV3IGJ5dGVbZGljdFNpemVdOworCisgICAgICAgIGlmIChwcmVzZXREaWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKHByZXNldERpY3QubGVuZ3RoLCBkaWN0U2l6ZSk7CisgICAgICAgICAgICBmdWxsID0gcG9zOworICAgICAgICAgICAgc3RhcnQgPSBwb3M7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHByZXNldERpY3QsIHByZXNldERpY3QubGVuZ3RoIC0gcG9zLCBidWYsIDAsIHBvcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgc3RhcnQgPSAwOworICAgICAgICBwb3MgPSAwOworICAgICAgICBmdWxsID0gMDsKKyAgICAgICAgbGltaXQgPSAwOworICAgICAgICBidWZbYnVmLmxlbmd0aCAtIDFdID0gMHgwMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMaW1pdChpbnQgb3V0TWF4KSB7CisgICAgICAgIGlmIChidWYubGVuZ3RoIC0gcG9zIDw9IG91dE1heCkKKyAgICAgICAgICAgIGxpbWl0ID0gYnVmLmxlbmd0aDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGltaXQgPSBwb3MgKyBvdXRNYXg7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzU3BhY2UoKSB7CisgICAgICAgIHJldHVybiBwb3MgPCBsaW1pdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQZW5kaW5nKCkgeworICAgICAgICByZXR1cm4gcGVuZGluZ0xlbiA+IDA7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQb3MoKSB7CisgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRCeXRlKGludCBkaXN0KSB7CisgICAgICAgIGludCBvZmZzZXQgPSBwb3MgLSBkaXN0IC0gMTsKKyAgICAgICAgaWYgKGRpc3QgPj0gcG9zKQorICAgICAgICAgICAgb2Zmc2V0ICs9IGJ1Zi5sZW5ndGg7CisKKyAgICAgICAgcmV0dXJuIGJ1ZltvZmZzZXRdICYgMHhGRjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXRCeXRlKGJ5dGUgYikgeworICAgICAgICBidWZbcG9zKytdID0gYjsKKworICAgICAgICBpZiAoZnVsbCA8IHBvcykKKyAgICAgICAgICAgIGZ1bGwgPSBwb3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVwZWF0KGludCBkaXN0LCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZGlzdCA8IDAgfHwgZGlzdCA+PSBmdWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCk7CisKKyAgICAgICAgaW50IGxlZnQgPSBNYXRoLm1pbihsaW1pdCAtIHBvcywgbGVuKTsKKyAgICAgICAgcGVuZGluZ0xlbiA9IGxlbiAtIGxlZnQ7CisgICAgICAgIHBlbmRpbmdEaXN0ID0gZGlzdDsKKworICAgICAgICBpbnQgYmFjayA9IHBvcyAtIGRpc3QgLSAxOworICAgICAgICBpZiAoZGlzdCA+PSBwb3MpCisgICAgICAgICAgICBiYWNrICs9IGJ1Zi5sZW5ndGg7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgYnVmW3BvcysrXSA9IGJ1ZltiYWNrKytdOworICAgICAgICAgICAgaWYgKGJhY2sgPT0gYnVmLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBiYWNrID0gMDsKKyAgICAgICAgfSB3aGlsZSAoLS1sZWZ0ID4gMCk7CisKKyAgICAgICAgaWYgKGZ1bGwgPCBwb3MpCisgICAgICAgICAgICBmdWxsID0gcG9zOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlcGVhdFBlbmRpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocGVuZGluZ0xlbiA+IDApCisgICAgICAgICAgICByZXBlYXQocGVuZGluZ0Rpc3QsIHBlbmRpbmdMZW4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvcHlVbmNvbXByZXNzZWQoRGF0YUlucHV0U3RyZWFtIGluRGF0YSwgaW50IGxlbikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBjb3B5U2l6ZSA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBwb3MsIGxlbik7CisgICAgICAgIGluRGF0YS5yZWFkRnVsbHkoYnVmLCBwb3MsIGNvcHlTaXplKTsKKyAgICAgICAgcG9zICs9IGNvcHlTaXplOworCisgICAgICAgIGlmIChmdWxsIDwgcG9zKQorICAgICAgICAgICAgZnVsbCA9IHBvczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGZsdXNoKGJ5dGVbXSBvdXQsIGludCBvdXRPZmYpIHsKKyAgICAgICAgaW50IGNvcHlTaXplID0gcG9zIC0gc3RhcnQ7CisgICAgICAgIGlmIChwb3MgPT0gYnVmLmxlbmd0aCkKKyAgICAgICAgICAgIHBvcyA9IDA7CisKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIHN0YXJ0LCBvdXQsIG91dE9mZiwgY29weVNpemUpOworICAgICAgICBzdGFydCA9IHBvczsKKworICAgICAgICByZXR1cm4gY29weVNpemU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6L0xaRW5jb2Rlci5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6L0xaRW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2N2Q3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovbHovTFpFbmNvZGVyLmphdmEKQEAgLTAsMCArMSw0MTkgQEAKKy8qCisgKiBMWkVuY29kZXIKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHoubHo7CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTFpFbmNvZGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRl9IQzQgPSAweDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1GX0JUNCA9IDB4MTQ7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgYnl0ZXMgdG8ga2VlcCBhdmFpbGFibGUgYmVmb3JlIHRoZSBjdXJyZW50IGJ5dGUKKyAgICAgKiB3aGVuIG1vdmluZyB0aGUgTFogd2luZG93LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IGtlZXBTaXplQmVmb3JlOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSBhdmFpbGFibGUsIHRoZSBjdXJyZW50IGJ5dGUgaW5jbHVkZWQsCisgICAgICogdG8gbWFrZSBoYXNFbm91Z2hEYXRhIHJldHVybiB0cnVlLiBGbHVzaGluZyBhbmQgZmluaXNoaW5nIGFyZQorICAgICAqIG5hdHVyYWxseSBleGNlcHRpb25zIHRvIHRoaXMgc2luY2UgdGhlcmUgY2Fubm90IGJlIGFueSBkYXRhIGFmdGVyCisgICAgICogdGhlIGVuZCBvZiB0aGUgdW5jb21wcmVzc2VkIGlucHV0LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IGtlZXBTaXplQWZ0ZXI7CisKKyAgICBmaW5hbCBpbnQgbWF0Y2hMZW5NYXg7CisgICAgZmluYWwgaW50IG5pY2VMZW47CisKKyAgICBmaW5hbCBieXRlW10gYnVmOworCisgICAgaW50IHJlYWRQb3MgPSAtMTsKKyAgICBwcml2YXRlIGludCByZWFkTGltaXQgPSAtMTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmluaXNoaW5nID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgd3JpdGVQb3MgPSAwOworICAgIHByaXZhdGUgaW50IHBlbmRpbmdTaXplID0gMDsKKworICAgIHN0YXRpYyB2b2lkIG5vcm1hbGl6ZShpbnRbXSBwb3NpdGlvbnMsIGludCBub3JtYWxpemF0aW9uT2Zmc2V0KSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAocG9zaXRpb25zW2ldIDw9IG5vcm1hbGl6YXRpb25PZmZzZXQpCisgICAgICAgICAgICAgICAgcG9zaXRpb25zW2ldID0gMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwb3NpdGlvbnNbaV0gLT0gbm9ybWFsaXphdGlvbk9mZnNldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIExaIHdpbmRvdyBidWZmZXIgdGhhdCBuZWVkcyB0byBiZSBhbGxvY2F0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEJ1ZlNpemUoCisgICAgICAgICAgICBpbnQgZGljdFNpemUsIGludCBleHRyYVNpemVCZWZvcmUsIGludCBleHRyYVNpemVBZnRlciwKKyAgICAgICAgICAgIGludCBtYXRjaExlbk1heCkgeworICAgICAgICBpbnQga2VlcFNpemVCZWZvcmUgPSBleHRyYVNpemVCZWZvcmUgKyBkaWN0U2l6ZTsKKyAgICAgICAgaW50IGtlZXBTaXplQWZ0ZXIgPSBleHRyYVNpemVBZnRlciArIG1hdGNoTGVuTWF4OworICAgICAgICBpbnQgcmVzZXJ2ZVNpemUgPSBNYXRoLm1pbihkaWN0U2l6ZSAvIDIgKyAoMjU2IDw8IDEwKSwgNTEyIDw8IDIwKTsKKyAgICAgICAgcmV0dXJuIGtlZXBTaXplQmVmb3JlICsga2VlcFNpemVBZnRlciArIHJlc2VydmVTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYXBwcm94aW1hdGUgbWVtb3J5IHVzYWdlIG9mIHRoZSBMWkVuY29kZXIgYmFzZSBzdHJ1Y3R1cmUgYW5kCisgICAgICogdGhlIG1hdGNoIGZpbmRlciBhcyBraWJpYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWVtb3J5VXNhZ2UoCisgICAgICAgICAgICBpbnQgZGljdFNpemUsIGludCBleHRyYVNpemVCZWZvcmUsIGludCBleHRyYVNpemVBZnRlciwKKyAgICAgICAgICAgIGludCBtYXRjaExlbk1heCwgaW50IG1mKSB7CisgICAgICAgIC8vIEJ1ZmZlciBzaXplICsgYSBsaXR0bGUgZXh0cmEKKyAgICAgICAgaW50IG0gPSBnZXRCdWZTaXplKGRpY3RTaXplLCBleHRyYVNpemVCZWZvcmUsIGV4dHJhU2l6ZUFmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hMZW5NYXgpIC8gMTAyNCArIDEwOworCisgICAgICAgIHN3aXRjaCAobWYpIHsKKyAgICAgICAgICAgIGNhc2UgTUZfSEM0OgorICAgICAgICAgICAgICAgIG0gKz0gSEM0LmdldE1lbW9yeVVzYWdlKGRpY3RTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBNRl9CVDQ6CisgICAgICAgICAgICAgICAgbSArPSBCVDQuZ2V0TWVtb3J5VXNhZ2UoZGljdFNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgTFpFbmNvZGVyLgorICAgICAqIDxwPgorICAgICAqIEBwYXJhbSAgICAgICBkaWN0U2l6ZSAgICBkaWN0aW9uYXJ5IHNpemUKKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBleHRyYVNpemVCZWZvcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGtlZXAgYXZhaWxhYmxlIGluIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5IGluIGFkZGl0aW9uIHRvIGRpY3RTaXplCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgZXh0cmFTaXplQWZ0ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSBhdmFpbGFibGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgY3VycmVudCBwb3NpdGlvbiArIG1hdGNoTGVuTWF4CisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgbmljZUxlbiAgICAgaWYgYSBtYXRjaCBvZiBhdCBsZWFzdCA8Y29kZT5uaWNlTGVuPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyBpcyBmb3VuZCwgYmUgaGFwcHkgd2l0aCBpdCBhbmQgZG9uJ3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCBsb29raW5nIGZvciBsb25nZXIgbWF0Y2hlcworICAgICAqCisgICAgICogQHBhcmFtICAgICAgIG1hdGNoTGVuTWF4IGRvbid0IHRlc3QgZm9yIG1hdGNoZXMgbG9uZ2VyIHRoYW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+bWF0Y2hMZW5NYXg8L2NvZGU+IGJ5dGVzCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgbWYgICAgICAgICAgbWF0Y2ggZmluZGVyIElECisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgZGVwdGhMaW1pdCAgbWF0Y2ggZmluZGVyIHNlYXJjaCBkZXB0aCBsaW1pdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTFpFbmNvZGVyIGdldEluc3RhbmNlKAorICAgICAgICAgICAgaW50IGRpY3RTaXplLCBpbnQgZXh0cmFTaXplQmVmb3JlLCBpbnQgZXh0cmFTaXplQWZ0ZXIsCisgICAgICAgICAgICBpbnQgbmljZUxlbiwgaW50IG1hdGNoTGVuTWF4LCBpbnQgbWYsIGludCBkZXB0aExpbWl0KSB7CisgICAgICAgIHN3aXRjaCAobWYpIHsKKyAgICAgICAgICAgIGNhc2UgTUZfSEM0OgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSEM0KGRpY3RTaXplLCBleHRyYVNpemVCZWZvcmUsIGV4dHJhU2l6ZUFmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pY2VMZW4sIG1hdGNoTGVuTWF4LCBkZXB0aExpbWl0KTsKKworICAgICAgICAgICAgY2FzZSBNRl9CVDQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCVDQoZGljdFNpemUsIGV4dHJhU2l6ZUJlZm9yZSwgZXh0cmFTaXplQWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmljZUxlbiwgbWF0Y2hMZW5NYXgsIGRlcHRoTGltaXQpOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgTFpFbmNvZGVyLiBTZWUgPGNvZGU+Z2V0SW5zdGFuY2U8L2NvZGU+LgorICAgICAqLworICAgIExaRW5jb2RlcihpbnQgZGljdFNpemUsIGludCBleHRyYVNpemVCZWZvcmUsIGludCBleHRyYVNpemVBZnRlciwKKyAgICAgICAgICAgICAgaW50IG5pY2VMZW4sIGludCBtYXRjaExlbk1heCkgeworICAgICAgICBidWYgPSBuZXcgYnl0ZVtnZXRCdWZTaXplKGRpY3RTaXplLCBleHRyYVNpemVCZWZvcmUsIGV4dHJhU2l6ZUFmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTGVuTWF4KV07CisKKyAgICAgICAga2VlcFNpemVCZWZvcmUgPSBleHRyYVNpemVCZWZvcmUgKyBkaWN0U2l6ZTsKKyAgICAgICAga2VlcFNpemVBZnRlciA9IGV4dHJhU2l6ZUFmdGVyICsgbWF0Y2hMZW5NYXg7CisKKyAgICAgICAgdGhpcy5tYXRjaExlbk1heCA9IG1hdGNoTGVuTWF4OworICAgICAgICB0aGlzLm5pY2VMZW4gPSBuaWNlTGVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBwcmVzZXQgZGljdGlvbmFyeS4gSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyB3YW50ZWQsIHRoaXMKKyAgICAgKiBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBjcmVhdGluZyB0aGUgTFpFbmNvZGVyCisgICAgICogYmVmb3JlIGFueSBkYXRhIGhhcyBiZWVuIGVuY29kZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlc2V0RGljdChpbnQgZGljdFNpemUsIGJ5dGVbXSBwcmVzZXREaWN0KSB7CisgICAgICAgIGFzc2VydCAhaXNTdGFydGVkKCk7CisgICAgICAgIGFzc2VydCB3cml0ZVBvcyA9PSAwOworCisgICAgICAgIGlmIChwcmVzZXREaWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBwcmVzZXQgZGljdGlvbmFyeSBidWZmZXIgaXMgYmlnZ2VyIHRoYW4gdGhlIGRpY3Rpb25hcnkKKyAgICAgICAgICAgIC8vIHNpemUsIGNvcHkgb25seSB0aGUgdGFpbCBvZiB0aGUgcHJlc2V0IGRpY3Rpb25hcnkuCisgICAgICAgICAgICBpbnQgY29weVNpemUgPSBNYXRoLm1pbihwcmVzZXREaWN0Lmxlbmd0aCwgZGljdFNpemUpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IHByZXNldERpY3QubGVuZ3RoIC0gY29weVNpemU7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHByZXNldERpY3QsIG9mZnNldCwgYnVmLCAwLCBjb3B5U2l6ZSk7CisgICAgICAgICAgICB3cml0ZVBvcyArPSBjb3B5U2l6ZTsKKyAgICAgICAgICAgIHNraXAoY29weVNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTW92ZXMgZGF0YSBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB0byB0aGUgYmVnaW5uaW5nLCBkaXNjYXJkaW5nCisgICAgICogb2xkIGRhdGEgYW5kIG1ha2luZyBzcGFjZSBmb3IgbmV3IGlucHV0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBtb3ZlV2luZG93KCkgeworICAgICAgICAvLyBBbGlnbiB0aGUgbW92ZSB0byBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzLiBMWk1BMiBuZWVkcyB0aGlzCisgICAgICAgIC8vIGJlY2F1c2UgaXQgdXNlcyB0aGUgbG93ZXN0IGJpdHMgZnJvbSByZWFkUG9zIHRvIGdldCB0aGUKKyAgICAgICAgLy8gYWxpZ25tZW50IG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4KKyAgICAgICAgaW50IG1vdmVPZmZzZXQgPSAocmVhZFBvcyArIDEgLSBrZWVwU2l6ZUJlZm9yZSkgJiB+MTU7CisgICAgICAgIGludCBtb3ZlU2l6ZSA9IHdyaXRlUG9zIC0gbW92ZU9mZnNldDsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIG1vdmVPZmZzZXQsIGJ1ZiwgMCwgbW92ZVNpemUpOworCisgICAgICAgIHJlYWRQb3MgLT0gbW92ZU9mZnNldDsKKyAgICAgICAgcmVhZExpbWl0IC09IG1vdmVPZmZzZXQ7CisgICAgICAgIHdyaXRlUG9zIC09IG1vdmVPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIG5ldyBkYXRhIGludG8gdGhlIExaRW5jb2RlcidzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGZpbGxXaW5kb3coYnl0ZVtdIGluLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgIGFzc2VydCAhZmluaXNoaW5nOworCisgICAgICAgIC8vIE1vdmUgdGhlIHNsaWRpbmcgd2luZG93IGlmIG5lZWRlZC4KKyAgICAgICAgaWYgKHJlYWRQb3MgPj0gYnVmLmxlbmd0aCAtIGtlZXBTaXplQWZ0ZXIpCisgICAgICAgICAgICBtb3ZlV2luZG93KCk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGZpbGwgdGhlIGRpY3Rpb25hcnkgYnVmZmVyLiBJZiBpdCBiZWNvbWVzIGZ1bGwsCisgICAgICAgIC8vIHNvbWUgb2YgdGhlIGlucHV0IGJ5dGVzIG1heSBiZSBsZWZ0IHVudXNlZC4KKyAgICAgICAgaWYgKGxlbiA+IGJ1Zi5sZW5ndGggLSB3cml0ZVBvcykKKyAgICAgICAgICAgIGxlbiA9IGJ1Zi5sZW5ndGggLSB3cml0ZVBvczsKKworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGluLCBvZmYsIGJ1Ziwgd3JpdGVQb3MsIGxlbik7CisgICAgICAgIHdyaXRlUG9zICs9IGxlbjsKKworICAgICAgICAvLyBTZXQgdGhlIG5ldyByZWFkTGltaXQgYnV0IG9ubHkgaWYgdGhlcmUncyBlbm91Z2ggZGF0YSB0byBhbGxvdworICAgICAgICAvLyBlbmNvZGluZyBvZiBhdCBsZWFzdCBvbmUgbW9yZSBieXRlLgorICAgICAgICBpZiAod3JpdGVQb3MgPj0ga2VlcFNpemVBZnRlcikKKyAgICAgICAgICAgIHJlYWRMaW1pdCA9IHdyaXRlUG9zIC0ga2VlcFNpemVBZnRlcjsKKworICAgICAgICBwcm9jZXNzUGVuZGluZ0J5dGVzKCk7CisKKyAgICAgICAgLy8gVGVsbCB0aGUgY2FsbGVyIGhvdyBtdWNoIGlucHV0IHdlIGFjdHVhbGx5IGNvcGllZCBpbnRvCisgICAgICAgIC8vIHRoZSBkaWN0aW9uYXJ5LgorICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgcGVuZGluZyBieXRlcyByZW1haW5pbmcgZnJvbSBwcmVzZXQgZGljdGlvbmFyeSBpbml0aWFsaXphdGlvbgorICAgICAqIG9yIGVuY29kZXIgZmx1c2ggb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUGVuZGluZ0J5dGVzKCkgeworICAgICAgICAvLyBBZnRlciBmbHVzaGluZyBvciBzZXR0aW5nIGEgcHJlc2V0IGRpY3Rpb25hcnkgdGhlcmUgd2lsbCBiZQorICAgICAgICAvLyBwZW5kaW5nIGRhdGEgdGhhdCBoYXNuJ3QgYmVlbiByYW4gdGhyb3VnaCB0aGUgbWF0Y2ggZmluZGVyIHlldC4KKyAgICAgICAgLy8gUnVuIGl0IHRocm91Z2ggdGhlIG1hdGNoIGZpbmRlciBub3cgaWYgdGhlcmUgaXMgZW5vdWdoIG5ldyBkYXRhCisgICAgICAgIC8vIGF2YWlsYWJsZSAocmVhZFBvcyA8IHJlYWRMaW1pdCkgdGhhdCB0aGUgZW5jb2RlciBtYXkgZW5jb2RlIGF0CisgICAgICAgIC8vIGxlYXN0IG9uZSBtb3JlIGlucHV0IGJ5dGUuIFRoaXMgd2F5IHdlIGRvbid0IHdhc3RlIGFueSB0aW1lCisgICAgICAgIC8vIGxvb3BpbmcgaW4gdGhlIG1hdGNoIGZpbmRlciAoYW5kIG1hcmtpbmcgdGhlIHNhbWUgYnl0ZXMgYXMKKyAgICAgICAgLy8gcGVuZGluZyBhZ2FpbikgaWYgdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGVzIHZlcnkgbGl0dGxlIG5ldyBkYXRhCisgICAgICAgIC8vIHBlciB3cml0ZSBjYWxsLgorICAgICAgICBpZiAocGVuZGluZ1NpemUgPiAwICYmIHJlYWRQb3MgPCByZWFkTGltaXQpIHsKKyAgICAgICAgICAgIHJlYWRQb3MgLT0gcGVuZGluZ1NpemU7CisgICAgICAgICAgICBpbnQgb2xkUGVuZGluZ1NpemUgPSBwZW5kaW5nU2l6ZTsKKyAgICAgICAgICAgIHBlbmRpbmdTaXplID0gMDsKKyAgICAgICAgICAgIHNraXAob2xkUGVuZGluZ1NpemUpOworICAgICAgICAgICAgYXNzZXJ0IHBlbmRpbmdTaXplIDwgb2xkUGVuZGluZ1NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIGJ5dGUgaGFzIGFscmVhZHkgYmVlbiBydW4gdGhyb3VnaAorICAgICAqIHRoZSBtYXRjaCBmaW5kZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGFydGVkKCkgeworICAgICAgICByZXR1cm4gcmVhZFBvcyAhPSAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGF0IGFsbCB0aGUgaW5wdXQgbmVlZHMgdG8gYmUgbWFkZSBhdmFpbGFibGUgaW4KKyAgICAgKiB0aGUgZW5jb2RlZCBvdXRwdXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rmx1c2hpbmcoKSB7CisgICAgICAgIHJlYWRMaW1pdCA9IHdyaXRlUG9zIC0gMTsKKyAgICAgICAgcHJvY2Vzc1BlbmRpbmdCeXRlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmtzIHRoYXQgdGhlcmUgaXMgbm8gbW9yZSBpbnB1dCByZW1haW5pbmcuIFRoZSByZWFkIHBvc2l0aW9uCisgICAgICogY2FuIGJlIGFkdmFuY2VkIHVudGlsIHRoZSBlbmQgb2YgdGhlIGRhdGEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmluaXNoaW5nKCkgeworICAgICAgICByZWFkTGltaXQgPSB3cml0ZVBvcyAtIDE7CisgICAgICAgIGZpbmlzaGluZyA9IHRydWU7CisgICAgICAgIHByb2Nlc3NQZW5kaW5nQnl0ZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpZiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgYXZhaWxhYmxlIHRvIGxldCB0aGUgY2FsbGVyIGVuY29kZQorICAgICAqIGF0IGxlYXN0IG9uZSBtb3JlIGJ5dGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRW5vdWdoRGF0YShpbnQgYWxyZWFkeVJlYWRMZW4pIHsKKyAgICAgICAgcmV0dXJuIHJlYWRQb3MgLSBhbHJlYWR5UmVhZExlbiA8IHJlYWRMaW1pdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb3B5VW5jb21wcmVzc2VkKE91dHB1dFN0cmVhbSBvdXQsIGludCBiYWNrd2FyZCwgaW50IGxlbikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZShidWYsIHJlYWRQb3MgKyAxIC0gYmFja3dhcmQsIGxlbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgYnl0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgPGNvZGU+Z2V0TWF0Y2hlczwvY29kZT4gb3IKKyAgICAgKiA8Y29kZT5za2lwPC9jb2RlPiBoYXNuJ3QgYmVlbiBjYWxsZWQgeWV0IGFuZCBubyBwcmVzZXQgZGljdGlvbmFyeQorICAgICAqIGlzIGJlaW5nIHVzZWQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRBdmFpbCgpIHsKKyAgICAgICAgYXNzZXJ0IGlzU3RhcnRlZCgpOworICAgICAgICByZXR1cm4gd3JpdGVQb3MgLSByZWFkUG9zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxvd2VzdCBmb3VyIGJpdHMgb2YgdGhlIGFic29sdXRlIG9mZnNldCBvZiB0aGUgY3VycmVudCBieXRlLgorICAgICAqIEJpdHMgb3RoZXIgdGhhbiB0aGUgbG93ZXN0IGZvdXIgYXJlIHVuZGVmaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBvcygpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRQb3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYnl0ZSBmcm9tIHRoZSBnaXZlbiBiYWNrd2FyZCBvZmZzZXQuCisgICAgICogPHA+CisgICAgICogVGhlIGN1cnJlbnQgYnl0ZSBpcyBhdCA8Y29kZT4wPC9jb2RlPiwgdGhlIHByZXZpb3VzIGJ5dGUKKyAgICAgKiBhdCA8Y29kZT4xPC9jb2RlPiBldGMuIFRvIGdldCBhIGJ5dGUgYXQgemVyby1iYXNlZCBkaXN0YW5jZSwKKyAgICAgKiB1c2UgPGNvZGU+Z2V0Qnl0ZShkaXN0ICsgMSk8Y29kZT4uCisgICAgICogPHA+CisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPmdldEJ5dGUoMCwgYmFja3dhcmQpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEJ5dGUoaW50IGJhY2t3YXJkKSB7CisgICAgICAgIHJldHVybiBidWZbcmVhZFBvcyAtIGJhY2t3YXJkXSAmIDB4RkY7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYnl0ZSBmcm9tIHRoZSBnaXZlbiBmb3J3YXJkIG1pbnVzIGJhY2t3YXJkIG9mZnNldC4KKyAgICAgKiBUaGUgZm9yd2FyZCBvZmZzZXQgaXMgYWRkZWQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uIFRoaXMgbGV0cworICAgICAqIG9uZSByZWFkIGJ5dGVzIGFoZWFkIG9mIHRoZSBjdXJyZW50IGJ5dGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRCeXRlKGludCBmb3J3YXJkLCBpbnQgYmFja3dhcmQpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZltyZWFkUG9zICsgZm9yd2FyZCAtIGJhY2t3YXJkXSAmIDB4RkY7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsZW5ndGggb2YgYSBtYXRjaCBhdCB0aGUgZ2l2ZW4gZGlzdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgZGlzdCAgICAgICAgemVyby1iYXNlZCBkaXN0YW5jZSBvZiB0aGUgbWF0Y2ggdG8gdGVzdAorICAgICAqIEBwYXJhbSAgICAgICBsZW5MaW1pdCAgICBkb24ndCB0ZXN0IGZvciBhIG1hdGNoIGxvbmdlciB0aGFuIHRoaXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgICBsZW5ndGggb2YgdGhlIG1hdGNoOyBpdCBpcyBpbiB0aGUgcmFuZ2UgWzAsIGxlbkxpbWl0XQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF0Y2hMZW4oaW50IGRpc3QsIGludCBsZW5MaW1pdCkgeworICAgICAgICBpbnQgYmFja1BvcyA9IHJlYWRQb3MgLSBkaXN0IC0gMTsKKyAgICAgICAgaW50IGxlbiA9IDA7CisKKyAgICAgICAgd2hpbGUgKGxlbiA8IGxlbkxpbWl0ICYmIGJ1ZltyZWFkUG9zICsgbGVuXSA9PSBidWZbYmFja1BvcyArIGxlbl0pCisgICAgICAgICAgICArK2xlbjsKKworICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGVuZ3RoIG9mIGEgbWF0Y2ggYXQgdGhlIGdpdmVuIGRpc3RhbmNlIGFuZCBmb3J3YXJkIG9mZnNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgICBmb3J3YXJkICAgICBmb3J3YXJkIG9mZnNldAorICAgICAqIEBwYXJhbSAgICAgICBkaXN0ICAgICAgICB6ZXJvLWJhc2VkIGRpc3RhbmNlIG9mIHRoZSBtYXRjaCB0byB0ZXN0CisgICAgICogQHBhcmFtICAgICAgIGxlbkxpbWl0ICAgIGRvbid0IHRlc3QgZm9yIGEgbWF0Y2ggbG9uZ2VyIHRoYW4gdGhpcworICAgICAqCisgICAgICogQHJldHVybiAgICAgIGxlbmd0aCBvZiB0aGUgbWF0Y2g7IGl0IGlzIGluIHRoZSByYW5nZSBbMCwgbGVuTGltaXRdCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXRjaExlbihpbnQgZm9yd2FyZCwgaW50IGRpc3QsIGludCBsZW5MaW1pdCkgeworICAgICAgICBpbnQgY3VyUG9zID0gcmVhZFBvcyArIGZvcndhcmQ7CisgICAgICAgIGludCBiYWNrUG9zID0gY3VyUG9zIC0gZGlzdCAtIDE7CisgICAgICAgIGludCBsZW4gPSAwOworCisgICAgICAgIHdoaWxlIChsZW4gPCBsZW5MaW1pdCAmJiBidWZbY3VyUG9zICsgbGVuXSA9PSBidWZbYmFja1BvcyArIGxlbl0pCisgICAgICAgICAgICArK2xlbjsKKworICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlIG1hdGNoZXMgcmV0dXJuZWQgYnkgdGhlIG1hdGNoIGZpbmRlciBhcmUgdmFsaWQuCisgICAgICogVGhpcyBpcyBtZWFudCB0byBiZSB1c2VkIGluIGFuIGFzc2VydCBzdGF0ZW1lbnQuIFRoaXMgaXMgdG90YWxseQorICAgICAqIHVzZWxlc3MgZm9yIGFjdHVhbCBlbmNvZGluZyBzaW5jZSBtYXRjaCBmaW5kZXIncyByZXN1bHRzIHNob3VsZAorICAgICAqIG5hdHVyYWxseSBhbHdheXMgYmUgdmFsaWQgaWYgaXQgaXNuJ3QgYnJva2VuLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgIG1hdGNoZXMgICAgIHJldHVybiB2YWx1ZSBmcm9tIDxjb2RlPmdldE1hdGNoZXM8L2NvZGU+CisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgdHJ1ZSBpZiBtYXRjaGVzIGFyZSB2YWxpZCwgZmFsc2UgaWYgbWF0Y2ggZmluZGVyIGlzIGJyb2tlbgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeU1hdGNoZXMoTWF0Y2hlcyBtYXRjaGVzKSB7CisgICAgICAgIGludCBsZW5MaW1pdCA9IE1hdGgubWluKGdldEF2YWlsKCksIG1hdGNoTGVuTWF4KTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hdGNoZXMuY291bnQ7ICsraSkKKyAgICAgICAgICAgIGlmIChnZXRNYXRjaExlbihtYXRjaGVzLmRpc3RbaV0sIGxlbkxpbWl0KSAhPSBtYXRjaGVzLmxlbltpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTW92ZXMgdG8gdGhlIG5leHQgYnl0ZSwgY2hlY2tzIGlmIHRoZXJlIGlzIGVub3VnaCBpbnB1dCBhdmFpbGFibGUsCisgICAgICogYW5kIHJldHVybnMgdGhlIGFtb3VudCBvZiBpbnB1dCBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICAgcmVxdWlyZWRGb3JGbHVzaGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtIG51bWJlciBvZiBhdmFpbGFibGUgYnl0ZXMgd2hlbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaGluZzsgZW5jb2RpbmcgbWF5IGJlIGNvbnRpbnVlZCB3aXRoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnB1dCBhZnRlciBmbHVzaGluZworICAgICAqIEBwYXJhbSAgICAgICByZXF1aXJlZEZvckZpbmlzaGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtIG51bWJlciBvZiBhdmFpbGFibGUgYnl0ZXMgd2hlbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hpbmc7IGVuY29kaW5nIG11c3Qgbm90IGJlIGNvbnRpbnVlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBmaW5pc2hpbmcgb3IgdGhlIG1hdGNoIGZpbmRlciBzdGF0ZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgY29ycnVwdAorICAgICAqCisgICAgICogQHJldHVybiAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIG9yIHplcm8gaWYgdGhlcmUKKyAgICAgKiAgICAgICAgICAgICAgaXMgbm90IGVub3VnaCBpbnB1dCBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBpbnQgbW92ZVBvcyhpbnQgcmVxdWlyZWRGb3JGbHVzaGluZywgaW50IHJlcXVpcmVkRm9yRmluaXNoaW5nKSB7CisgICAgICAgIGFzc2VydCByZXF1aXJlZEZvckZsdXNoaW5nID49IHJlcXVpcmVkRm9yRmluaXNoaW5nOworCisgICAgICAgICsrcmVhZFBvczsKKyAgICAgICAgaW50IGF2YWlsID0gd3JpdGVQb3MgLSByZWFkUG9zOworCisgICAgICAgIGlmIChhdmFpbCA8IHJlcXVpcmVkRm9yRmx1c2hpbmcpIHsKKyAgICAgICAgICAgIGlmIChhdmFpbCA8IHJlcXVpcmVkRm9yRmluaXNoaW5nIHx8ICFmaW5pc2hpbmcpIHsKKyAgICAgICAgICAgICAgICArK3BlbmRpbmdTaXplOworICAgICAgICAgICAgICAgIGF2YWlsID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhdmFpbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIG1hdGNoIGZpbmRlciBmb3IgdGhlIG5leHQgYnl0ZSBhbmQgcmV0dXJucyB0aGUgbWF0Y2hlcyBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgTWF0Y2hlcyBnZXRNYXRjaGVzKCk7CisKKyAgICAvKioKKyAgICAgKiBTa2lwcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBtYXRjaCBmaW5kZXIuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2tpcChpbnQgbGVuKTsKK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9sei9NYXRjaGVzLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovbHovTWF0Y2hlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYmVlMTEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovbHovTWF0Y2hlcy5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBNYXRjaGVzCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6Lmx6OworCitwdWJsaWMgZmluYWwgY2xhc3MgTWF0Y2hlcyB7CisgICAgcHVibGljIGZpbmFsIGludFtdIGxlbjsKKyAgICBwdWJsaWMgZmluYWwgaW50W10gZGlzdDsKKyAgICBwdWJsaWMgaW50IGNvdW50ID0gMDsKKworICAgIE1hdGNoZXMoaW50IGNvdW50TWF4KSB7CisgICAgICAgIGxlbiA9IG5ldyBpbnRbY291bnRNYXhdOworICAgICAgICBkaXN0ID0gbmV3IGludFtjb3VudE1heF07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6bWEvTFpNQUNvZGVyLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovbHptYS9MWk1BQ29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzFjOWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6bWEvTFpNQUNvZGVyLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBMWk1BQ29kZXIKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHoubHptYTsKKworaW1wb3J0IG9yZy50dWthYW5pLnh6LnJhbmdlY29kZXIuUmFuZ2VDb2RlcjsKKworYWJzdHJhY3QgY2xhc3MgTFpNQUNvZGVyIHsKKyAgICBzdGF0aWMgZmluYWwgaW50IFBPU19TVEFURVNfTUFYID0gMSA8PCA0OworCisgICAgc3RhdGljIGZpbmFsIGludCBNQVRDSF9MRU5fTUlOID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1BVENIX0xFTl9NQVggPSBNQVRDSF9MRU5fTUlOICsgTGVuZ3RoQ29kZXIuTE9XX1NZTUJPTFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIExlbmd0aENvZGVyLk1JRF9TWU1CT0xTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBMZW5ndGhDb2Rlci5ISUdIX1NZTUJPTFMgLSAxOworCisgICAgc3RhdGljIGZpbmFsIGludCBESVNUX1NUQVRFUyA9IDQ7CisgICAgc3RhdGljIGZpbmFsIGludCBESVNUX1NMT1RTID0gMSA8PCA2OworICAgIHN0YXRpYyBmaW5hbCBpbnQgRElTVF9NT0RFTF9TVEFSVCA9IDQ7CisgICAgc3RhdGljIGZpbmFsIGludCBESVNUX01PREVMX0VORCA9IDE0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgRlVMTF9ESVNUQU5DRVMgPSAxIDw8IChESVNUX01PREVMX0VORCAvIDIpOworCisgICAgc3RhdGljIGZpbmFsIGludCBBTElHTl9CSVRTID0gNDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEFMSUdOX1NJWkUgPSAxIDw8IEFMSUdOX0JJVFM7CisgICAgc3RhdGljIGZpbmFsIGludCBBTElHTl9NQVNLID0gQUxJR05fU0laRSAtIDE7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IFJFUFMgPSA0OworCisgICAgZmluYWwgaW50IHBvc01hc2s7CisKKyAgICBmaW5hbCBpbnRbXSByZXBzID0gbmV3IGludFtSRVBTXTsKKyAgICBmaW5hbCBTdGF0ZSBzdGF0ZSA9IG5ldyBTdGF0ZSgpOworCisgICAgZmluYWwgc2hvcnRbXVtdIGlzTWF0Y2ggPSBuZXcgc2hvcnRbU3RhdGUuU1RBVEVTXVtQT1NfU1RBVEVTX01BWF07CisgICAgZmluYWwgc2hvcnRbXSBpc1JlcCA9IG5ldyBzaG9ydFtTdGF0ZS5TVEFURVNdOworICAgIGZpbmFsIHNob3J0W10gaXNSZXAwID0gbmV3IHNob3J0W1N0YXRlLlNUQVRFU107CisgICAgZmluYWwgc2hvcnRbXSBpc1JlcDEgPSBuZXcgc2hvcnRbU3RhdGUuU1RBVEVTXTsKKyAgICBmaW5hbCBzaG9ydFtdIGlzUmVwMiA9IG5ldyBzaG9ydFtTdGF0ZS5TVEFURVNdOworICAgIGZpbmFsIHNob3J0W11bXSBpc1JlcDBMb25nID0gbmV3IHNob3J0W1N0YXRlLlNUQVRFU11bUE9TX1NUQVRFU19NQVhdOworICAgIGZpbmFsIHNob3J0W11bXSBkaXN0U2xvdHMgPSBuZXcgc2hvcnRbRElTVF9TVEFURVNdW0RJU1RfU0xPVFNdOworICAgIGZpbmFsIHNob3J0W11bXSBkaXN0U3BlY2lhbCA9IHsgbmV3IHNob3J0WzJdLCBuZXcgc2hvcnRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgc2hvcnRbNF0sIG5ldyBzaG9ydFs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBzaG9ydFs4XSwgbmV3IHNob3J0WzhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHNob3J0WzE2XSwgbmV3IHNob3J0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBzaG9ydFszMl0sIG5ldyBzaG9ydFszMl0gfTsKKyAgICBmaW5hbCBzaG9ydFtdIGRpc3RBbGlnbiA9IG5ldyBzaG9ydFtBTElHTl9TSVpFXTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgZ2V0RGlzdFN0YXRlKGludCBsZW4pIHsKKyAgICAgICAgcmV0dXJuIGxlbiA8IERJU1RfU1RBVEVTICsgTUFUQ0hfTEVOX01JTgorICAgICAgICAgICAgICAgPyBsZW4gLSBNQVRDSF9MRU5fTUlOCisgICAgICAgICAgICAgICA6IERJU1RfU1RBVEVTIC0gMTsKKyAgICB9CisKKyAgICBMWk1BQ29kZXIoaW50IHBiKSB7CisgICAgICAgIHBvc01hc2sgPSAoMSA8PCBwYikgLSAxOworICAgIH0KKworICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHJlcHNbMF0gPSAwOworICAgICAgICByZXBzWzFdID0gMDsKKyAgICAgICAgcmVwc1syXSA9IDA7CisgICAgICAgIHJlcHNbM10gPSAwOworICAgICAgICBzdGF0ZS5yZXNldCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXNNYXRjaC5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIFJhbmdlQ29kZXIuaW5pdFByb2JzKGlzTWF0Y2hbaV0pOworCisgICAgICAgIFJhbmdlQ29kZXIuaW5pdFByb2JzKGlzUmVwKTsKKyAgICAgICAgUmFuZ2VDb2Rlci5pbml0UHJvYnMoaXNSZXAwKTsKKyAgICAgICAgUmFuZ2VDb2Rlci5pbml0UHJvYnMoaXNSZXAxKTsKKyAgICAgICAgUmFuZ2VDb2Rlci5pbml0UHJvYnMoaXNSZXAyKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlzUmVwMExvbmcubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBSYW5nZUNvZGVyLmluaXRQcm9icyhpc1JlcDBMb25nW2ldKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpc3RTbG90cy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIFJhbmdlQ29kZXIuaW5pdFByb2JzKGRpc3RTbG90c1tpXSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXN0U3BlY2lhbC5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIFJhbmdlQ29kZXIuaW5pdFByb2JzKGRpc3RTcGVjaWFsW2ldKTsKKworICAgICAgICBSYW5nZUNvZGVyLmluaXRQcm9icyhkaXN0QWxpZ24pOworICAgIH0KKworCisgICAgYWJzdHJhY3QgY2xhc3MgTGl0ZXJhbENvZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGM7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGxpdGVyYWxQb3NNYXNrOworCisgICAgICAgIExpdGVyYWxDb2RlcihpbnQgbGMsIGludCBscCkgeworICAgICAgICAgICAgdGhpcy5sYyA9IGxjOworICAgICAgICAgICAgdGhpcy5saXRlcmFsUG9zTWFzayA9ICgxIDw8IGxwKSAtIDE7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgZ2V0U3ViY29kZXJJbmRleChpbnQgcHJldkJ5dGUsIGludCBwb3MpIHsKKyAgICAgICAgICAgIGludCBsb3cgPSBwcmV2Qnl0ZSA+PiAoOCAtIGxjKTsKKyAgICAgICAgICAgIGludCBoaWdoID0gKHBvcyAmIGxpdGVyYWxQb3NNYXNrKSA8PCBsYzsKKyAgICAgICAgICAgIHJldHVybiBsb3cgKyBoaWdoOworICAgICAgICB9CisKKworICAgICAgICBhYnN0cmFjdCBjbGFzcyBMaXRlcmFsU3ViY29kZXIgeworICAgICAgICAgICAgZmluYWwgc2hvcnRbXSBwcm9icyA9IG5ldyBzaG9ydFsweDMwMF07CisKKyAgICAgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICAgICAgUmFuZ2VDb2Rlci5pbml0UHJvYnMocHJvYnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBhYnN0cmFjdCBjbGFzcyBMZW5ndGhDb2RlciB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9XX1NZTUJPTFMgPSAxIDw8IDM7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgTUlEX1NZTUJPTFMgPSAxIDw8IDM7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgSElHSF9TWU1CT0xTID0gMSA8PCA4OworCisgICAgICAgIGZpbmFsIHNob3J0W10gY2hvaWNlID0gbmV3IHNob3J0WzJdOworICAgICAgICBmaW5hbCBzaG9ydFtdW10gbG93ID0gbmV3IHNob3J0W1BPU19TVEFURVNfTUFYXVtMT1dfU1lNQk9MU107CisgICAgICAgIGZpbmFsIHNob3J0W11bXSBtaWQgPSBuZXcgc2hvcnRbUE9TX1NUQVRFU19NQVhdW01JRF9TWU1CT0xTXTsKKyAgICAgICAgZmluYWwgc2hvcnRbXSBoaWdoID0gbmV3IHNob3J0W0hJR0hfU1lNQk9MU107CisKKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIFJhbmdlQ29kZXIuaW5pdFByb2JzKGNob2ljZSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG93Lmxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgIFJhbmdlQ29kZXIuaW5pdFByb2JzKGxvd1tpXSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG93Lmxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgIFJhbmdlQ29kZXIuaW5pdFByb2JzKG1pZFtpXSk7CisKKyAgICAgICAgICAgIFJhbmdlQ29kZXIuaW5pdFByb2JzKGhpZ2gpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6bWEvTFpNQURlY29kZXIuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9sem1hL0xaTUFEZWNvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NmMTk2MAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9sem1hL0xaTUFEZWNvZGVyLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBMWk1BRGVjb2RlcgorICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5sem1hOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5sei5MWkRlY29kZXI7CitpbXBvcnQgb3JnLnR1a2FhbmkueHoucmFuZ2Vjb2Rlci5SYW5nZURlY29kZXI7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBMWk1BRGVjb2RlciBleHRlbmRzIExaTUFDb2RlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBMWkRlY29kZXIgbHo7CisgICAgcHJpdmF0ZSBmaW5hbCBSYW5nZURlY29kZXIgcmM7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXRlcmFsRGVjb2RlciBsaXRlcmFsRGVjb2RlcjsKKyAgICBwcml2YXRlIGZpbmFsIExlbmd0aERlY29kZXIgbWF0Y2hMZW5EZWNvZGVyID0gbmV3IExlbmd0aERlY29kZXIoKTsKKyAgICBwcml2YXRlIGZpbmFsIExlbmd0aERlY29kZXIgcmVwTGVuRGVjb2RlciA9IG5ldyBMZW5ndGhEZWNvZGVyKCk7CisKKyAgICBwdWJsaWMgTFpNQURlY29kZXIoTFpEZWNvZGVyIGx6LCBSYW5nZURlY29kZXIgcmMsIGludCBsYywgaW50IGxwLCBpbnQgcGIpIHsKKyAgICAgICAgc3VwZXIocGIpOworICAgICAgICB0aGlzLmx6ID0gbHo7CisgICAgICAgIHRoaXMucmMgPSByYzsKKyAgICAgICAgdGhpcy5saXRlcmFsRGVjb2RlciA9IG5ldyBMaXRlcmFsRGVjb2RlcihsYywgbHApOworICAgICAgICByZXNldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBzdXBlci5yZXNldCgpOworICAgICAgICBsaXRlcmFsRGVjb2Rlci5yZXNldCgpOworICAgICAgICBtYXRjaExlbkRlY29kZXIucmVzZXQoKTsKKyAgICAgICAgcmVwTGVuRGVjb2Rlci5yZXNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBMWk1BIGVuZCBtYXJrZXIgd2FzIGRldGVjdGVkLiBJdCBpcyBlbmNvZGVkIGFzCisgICAgICogdGhlIG1heGltdW0gbWF0Y2ggZGlzdGFuY2Ugd2hpY2ggd2l0aCBzaWduZWQgaW50cyBiZWNvbWVzIC0xLiBUaGlzCisgICAgICogZnVuY3Rpb24gaXMgbmVlZGVkIG9ubHkgZm9yIExaTUExLiBMWk1BMiBkb2Vzbid0IHVzZSB0aGUgZW5kIG1hcmtlcgorICAgICAqIGluIHRoZSBMWk1BIGxheWVyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVuZE1hcmtlckRldGVjdGVkKCkgeworICAgICAgICByZXR1cm4gcmVwc1swXSA9PSAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWNvZGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsei5yZXBlYXRQZW5kaW5nKCk7CisKKyAgICAgICAgd2hpbGUgKGx6Lmhhc1NwYWNlKCkpIHsKKyAgICAgICAgICAgIGludCBwb3NTdGF0ZSA9IGx6LmdldFBvcygpICYgcG9zTWFzazsKKworICAgICAgICAgICAgaWYgKHJjLmRlY29kZUJpdChpc01hdGNoW3N0YXRlLmdldCgpXSwgcG9zU3RhdGUpID09IDApIHsKKyAgICAgICAgICAgICAgICBsaXRlcmFsRGVjb2Rlci5kZWNvZGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IHJjLmRlY29kZUJpdChpc1JlcCwgc3RhdGUuZ2V0KCkpID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZWNvZGVNYXRjaChwb3NTdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZWNvZGVSZXBNYXRjaChwb3NTdGF0ZSk7CisKKyAgICAgICAgICAgICAgICAvLyBOT1RFOiBXaXRoIExaTUExIHN0cmVhbXMgdGhhdCBoYXZlIHRoZSBlbmQgbWFya2VyLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCB0aHJvdyBDb3JydXB0ZWRJbnB1dEV4Y2VwdGlvbi4gTFpNQUlucHV0U3RyZWFtCisgICAgICAgICAgICAgICAgLy8gaGFuZGxlcyBpdCBzcGVjaWFsbHkuCisgICAgICAgICAgICAgICAgbHoucmVwZWF0KHJlcHNbMF0sIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByYy5ub3JtYWxpemUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBkZWNvZGVNYXRjaChpbnQgcG9zU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN0YXRlLnVwZGF0ZU1hdGNoKCk7CisKKyAgICAgICAgcmVwc1szXSA9IHJlcHNbMl07CisgICAgICAgIHJlcHNbMl0gPSByZXBzWzFdOworICAgICAgICByZXBzWzFdID0gcmVwc1swXTsKKworICAgICAgICBpbnQgbGVuID0gbWF0Y2hMZW5EZWNvZGVyLmRlY29kZShwb3NTdGF0ZSk7CisgICAgICAgIGludCBkaXN0U2xvdCA9IHJjLmRlY29kZUJpdFRyZWUoZGlzdFNsb3RzW2dldERpc3RTdGF0ZShsZW4pXSk7CisKKyAgICAgICAgaWYgKGRpc3RTbG90IDwgRElTVF9NT0RFTF9TVEFSVCkgeworICAgICAgICAgICAgcmVwc1swXSA9IGRpc3RTbG90OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGxpbWl0ID0gKGRpc3RTbG90ID4+IDEpIC0gMTsKKyAgICAgICAgICAgIHJlcHNbMF0gPSAoMiB8IChkaXN0U2xvdCAmIDEpKSA8PCBsaW1pdDsKKworICAgICAgICAgICAgaWYgKGRpc3RTbG90IDwgRElTVF9NT0RFTF9FTkQpIHsKKyAgICAgICAgICAgICAgICByZXBzWzBdIHw9IHJjLmRlY29kZVJldmVyc2VCaXRUcmVlKAorICAgICAgICAgICAgICAgICAgICAgICAgZGlzdFNwZWNpYWxbZGlzdFNsb3QgLSBESVNUX01PREVMX1NUQVJUXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcHNbMF0gfD0gcmMuZGVjb2RlRGlyZWN0Qml0cyhsaW1pdCAtIEFMSUdOX0JJVFMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBBTElHTl9CSVRTOworICAgICAgICAgICAgICAgIHJlcHNbMF0gfD0gcmMuZGVjb2RlUmV2ZXJzZUJpdFRyZWUoZGlzdEFsaWduKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZGVjb2RlUmVwTWF0Y2goaW50IHBvc1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocmMuZGVjb2RlQml0KGlzUmVwMCwgc3RhdGUuZ2V0KCkpID09IDApIHsKKyAgICAgICAgICAgIGlmIChyYy5kZWNvZGVCaXQoaXNSZXAwTG9uZ1tzdGF0ZS5nZXQoKV0sIHBvc1N0YXRlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RhdGUudXBkYXRlU2hvcnRSZXAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCB0bXA7CisKKyAgICAgICAgICAgIGlmIChyYy5kZWNvZGVCaXQoaXNSZXAxLCBzdGF0ZS5nZXQoKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRtcCA9IHJlcHNbMV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChyYy5kZWNvZGVCaXQoaXNSZXAyLCBzdGF0ZS5nZXQoKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSByZXBzWzJdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHJlcHNbM107CisgICAgICAgICAgICAgICAgICAgIHJlcHNbM10gPSByZXBzWzJdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlcHNbMl0gPSByZXBzWzFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXBzWzFdID0gcmVwc1swXTsKKyAgICAgICAgICAgIHJlcHNbMF0gPSB0bXA7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZS51cGRhdGVMb25nUmVwKCk7CisKKyAgICAgICAgcmV0dXJuIHJlcExlbkRlY29kZXIuZGVjb2RlKHBvc1N0YXRlKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgY2xhc3MgTGl0ZXJhbERlY29kZXIgZXh0ZW5kcyBMaXRlcmFsQ29kZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIExpdGVyYWxTdWJkZWNvZGVyW10gc3ViZGVjb2RlcnM7CisKKyAgICAgICAgTGl0ZXJhbERlY29kZXIoaW50IGxjLCBpbnQgbHApIHsKKyAgICAgICAgICAgIHN1cGVyKGxjLCBscCk7CisKKyAgICAgICAgICAgIHN1YmRlY29kZXJzID0gbmV3IExpdGVyYWxTdWJkZWNvZGVyWzEgPDwgKGxjICsgbHApXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ViZGVjb2RlcnMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgc3ViZGVjb2RlcnNbaV0gPSBuZXcgTGl0ZXJhbFN1YmRlY29kZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YmRlY29kZXJzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgIHN1YmRlY29kZXJzW2ldLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGRlY29kZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgaSA9IGdldFN1YmNvZGVySW5kZXgobHouZ2V0Qnl0ZSgwKSwgbHouZ2V0UG9zKCkpOworICAgICAgICAgICAgc3ViZGVjb2RlcnNbaV0uZGVjb2RlKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgY2xhc3MgTGl0ZXJhbFN1YmRlY29kZXIgZXh0ZW5kcyBMaXRlcmFsU3ViY29kZXIgeworICAgICAgICAgICAgdm9pZCBkZWNvZGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGludCBzeW1ib2wgPSAxOworCisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmlzTGl0ZXJhbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCA9IChzeW1ib2wgPDwgMSkgfCByYy5kZWNvZGVCaXQocHJvYnMsIHN5bWJvbCk7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHN5bWJvbCA8IDB4MTAwKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXRjaEJ5dGUgPSBsei5nZXRCeXRlKHJlcHNbMF0pOworICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMHgxMDA7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXRjaEJpdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJpdDsKKworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEJ5dGUgPDw9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEJpdCA9IG1hdGNoQnl0ZSAmIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdCA9IHJjLmRlY29kZUJpdChwcm9icywgb2Zmc2V0ICsgbWF0Y2hCaXQgKyBzeW1ib2wpOworICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sID0gKHN5bWJvbCA8PCAxKSB8IGJpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAmPSAoMCAtIGJpdCkgXiB+bWF0Y2hCaXQ7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHN5bWJvbCA8IDB4MTAwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsei5wdXRCeXRlKChieXRlKXN5bWJvbCk7CisgICAgICAgICAgICAgICAgc3RhdGUudXBkYXRlTGl0ZXJhbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIGNsYXNzIExlbmd0aERlY29kZXIgZXh0ZW5kcyBMZW5ndGhDb2RlciB7CisgICAgICAgIGludCBkZWNvZGUoaW50IHBvc1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHJjLmRlY29kZUJpdChjaG9pY2UsIDApID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJjLmRlY29kZUJpdFRyZWUobG93W3Bvc1N0YXRlXSkgKyBNQVRDSF9MRU5fTUlOOworCisgICAgICAgICAgICBpZiAocmMuZGVjb2RlQml0KGNob2ljZSwgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmMuZGVjb2RlQml0VHJlZShtaWRbcG9zU3RhdGVdKQorICAgICAgICAgICAgICAgICAgICAgICArIE1BVENIX0xFTl9NSU4gKyBMT1dfU1lNQk9MUzsKKworICAgICAgICAgICAgcmV0dXJuIHJjLmRlY29kZUJpdFRyZWUoaGlnaCkKKyAgICAgICAgICAgICAgICAgICArIE1BVENIX0xFTl9NSU4gKyBMT1dfU1lNQk9MUyArIE1JRF9TWU1CT0xTOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6bWEvTFpNQUVuY29kZXIuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9sem1hL0xaTUFFbmNvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkYzE5OAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9sem1hL0xaTUFFbmNvZGVyLmphdmEKQEAgLTAsMCArMSw3MTEgQEAKKy8qCisgKiBMWk1BRW5jb2RlcgorICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5sem1hOworCitpbXBvcnQgb3JnLnR1a2FhbmkueHoubHouTFpFbmNvZGVyOworaW1wb3J0IG9yZy50dWthYW5pLnh6Lmx6Lk1hdGNoZXM7CitpbXBvcnQgb3JnLnR1a2FhbmkueHoucmFuZ2Vjb2Rlci5SYW5nZUVuY29kZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMWk1BRW5jb2RlciBleHRlbmRzIExaTUFDb2RlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9GQVNUID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX05PUk1BTCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBMWk1BMiBjaHVuayBpcyBjb25zaWRlcmVkIGZ1bGwgd2hlbiBpdHMgdW5jb21wcmVzc2VkIHNpemUgZXhjZWVkcworICAgICAqIDxjb2RlPkxaTUEyX1VOQ09NUFJFU1NFRF9MSU1JVDwvY29kZT4uCisgICAgICogPHA+CisgICAgICogQSBjb21wcmVzc2VkIExaTUEyIGNodW5rIGNhbiBob2xkIDIgTWlCIG9mIHVuY29tcHJlc3NlZCBkYXRhLgorICAgICAqIEEgc2luZ2xlIExaTUEgc3ltYm9sIG1heSBpbmRpY2F0ZSB1cCB0byBNQVRDSF9MRU5fTUFYIGJ5dGVzCisgICAgICogb2YgZGF0YSwgc28gdGhlIExaTUEyIGNodW5rIGlzIGNvbnNpZGVyZWQgZnVsbCB3aGVuIHRoZXJlIGlzCisgICAgICogbGVzcyBzcGFjZSB0aGFuIE1BVENIX0xFTl9NQVggYnl0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExaTUEyX1VOQ09NUFJFU1NFRF9MSU1JVAorICAgICAgICAgICAgPSAoMiA8PCAyMCkgLSBNQVRDSF9MRU5fTUFYOworCisgICAgLyoqCisgICAgICogTFpNQTIgY2h1bmsgaXMgY29uc2lkZXJlZCBmdWxsIHdoZW4gaXRzIGNvbXByZXNzZWQgc2l6ZSBleGNlZWRzCisgICAgICogPGNvZGU+TFpNQTJfQ09NUFJFU1NFRF9MSU1JVDwvY29kZT4uCisgICAgICogPHA+CisgICAgICogVGhlIG1heGltdW0gY29tcHJlc3NlZCBzaXplIG9mIGEgTFpNQTIgY2h1bmsgaXMgNjQgS2lCLgorICAgICAqIEEgc2luZ2xlIExaTUEgc3ltYm9sIG1pZ2h0IHVzZSAyMCBieXRlcyBvZiBzcGFjZSBldmVuIHRob3VnaAorICAgICAqIGl0IHVzdWFsbHkgdGFrZXMganVzdCBvbmUgYnl0ZSBvciBzby4gVHdvIG1vcmUgYnl0ZXMgYXJlIG5lZWRlZAorICAgICAqIGZvciBMWk1BMiB1bmNvbXByZXNzZWQgY2h1bmtzIChzZWUgTFpNQTJPdXRwdXRTdHJlYW0ud3JpdGVDaHVuaykuCisgICAgICogTGVhdmUgYSBsaXR0bGUgc2FmZXR5IG1hcmdpbiBhbmQgdXNlIDI2IGJ5dGVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMWk1BMl9DT01QUkVTU0VEX0xJTUlUID0gKDY0IDw8IDEwKSAtIDI2OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU1RfUFJJQ0VfVVBEQVRFX0lOVEVSVkFMID0gRlVMTF9ESVNUQU5DRVM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMSUdOX1BSSUNFX1VQREFURV9JTlRFUlZBTCA9IEFMSUdOX1NJWkU7CisKKyAgICBwcml2YXRlIGZpbmFsIFJhbmdlRW5jb2RlciByYzsKKyAgICBmaW5hbCBMWkVuY29kZXIgbHo7CisgICAgZmluYWwgTGl0ZXJhbEVuY29kZXIgbGl0ZXJhbEVuY29kZXI7CisgICAgZmluYWwgTGVuZ3RoRW5jb2RlciBtYXRjaExlbkVuY29kZXI7CisgICAgZmluYWwgTGVuZ3RoRW5jb2RlciByZXBMZW5FbmNvZGVyOworICAgIGZpbmFsIGludCBuaWNlTGVuOworCisgICAgcHJpdmF0ZSBpbnQgZGlzdFByaWNlQ291bnQgPSAwOworICAgIHByaXZhdGUgaW50IGFsaWduUHJpY2VDb3VudCA9IDA7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBkaXN0U2xvdFByaWNlc1NpemU7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnRbXVtdIGRpc3RTbG90UHJpY2VzOworICAgIHByaXZhdGUgZmluYWwgaW50W11bXSBmdWxsRGlzdFByaWNlcworICAgICAgICAgICAgPSBuZXcgaW50W0RJU1RfU1RBVEVTXVtGVUxMX0RJU1RBTkNFU107CisgICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBhbGlnblByaWNlcyA9IG5ldyBpbnRbQUxJR05fU0laRV07CisKKyAgICBpbnQgYmFjayA9IDA7CisgICAgaW50IHJlYWRBaGVhZCA9IC0xOworICAgIHByaXZhdGUgaW50IHVuY29tcHJlc3NlZFNpemUgPSAwOworCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWVtb3J5VXNhZ2UoaW50IG1vZGUsIGludCBkaWN0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0cmFTaXplQmVmb3JlLCBpbnQgbWYpIHsKKyAgICAgICAgaW50IG0gPSA4MDsKKworICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTU9ERV9GQVNUOgorICAgICAgICAgICAgICAgIG0gKz0gTFpNQUVuY29kZXJGYXN0LmdldE1lbW9yeVVzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgZGljdFNpemUsIGV4dHJhU2l6ZUJlZm9yZSwgbWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE1PREVfTk9STUFMOgorICAgICAgICAgICAgICAgIG0gKz0gTFpNQUVuY29kZXJOb3JtYWwuZ2V0TWVtb3J5VXNhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICBkaWN0U2l6ZSwgZXh0cmFTaXplQmVmb3JlLCBtZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMWk1BRW5jb2RlciBnZXRJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBSYW5nZUVuY29kZXIgcmMsIGludCBsYywgaW50IGxwLCBpbnQgcGIsIGludCBtb2RlLAorICAgICAgICAgICAgICAgIGludCBkaWN0U2l6ZSwgaW50IGV4dHJhU2l6ZUJlZm9yZSwKKyAgICAgICAgICAgICAgICBpbnQgbmljZUxlbiwgaW50IG1mLCBpbnQgZGVwdGhMaW1pdCkgeworICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTU9ERV9GQVNUOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTFpNQUVuY29kZXJGYXN0KHJjLCBsYywgbHAsIHBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RTaXplLCBleHRyYVNpemVCZWZvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmljZUxlbiwgbWYsIGRlcHRoTGltaXQpOworCisgICAgICAgICAgICBjYXNlIE1PREVfTk9STUFMOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTFpNQUVuY29kZXJOb3JtYWwocmMsIGxjLCBscCwgcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0U2l6ZSwgZXh0cmFTaXplQmVmb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmljZUxlbiwgbWYsIGRlcHRoTGltaXQpOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYW4gaW50ZWdlciBbMCwgNjNdIG1hdGNoaW5nIHRoZSBoaWdoZXN0IHR3byBiaXRzIG9mIGFuIGludGVnZXIuCisgICAgICogVGhpcyBpcyBsaWtlIGJpdCBzY2FuIHJldmVyc2UgKEJTUikgb24geDg2IGV4Y2VwdCB0aGF0IHRoaXMgYWxzbworICAgICAqIGNhcmVzIGFib3V0IHRoZSBzZWNvbmQgaGlnaGVzdCBiaXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlzdFNsb3QoaW50IGRpc3QpIHsKKyAgICAgICAgaWYgKGRpc3QgPD0gRElTVF9NT0RFTF9TVEFSVCkKKyAgICAgICAgICAgIHJldHVybiBkaXN0OworCisgICAgICAgIGludCBuID0gZGlzdDsKKyAgICAgICAgaW50IGkgPSAzMTsKKworICAgICAgICBpZiAoKG4gJiAweEZGRkYwMDAwKSA9PSAwKSB7CisgICAgICAgICAgICBuIDw8PSAxNjsKKyAgICAgICAgICAgIGkgPSAxNTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobiAmIDB4RkYwMDAwMDApID09IDApIHsKKyAgICAgICAgICAgIG4gPDw9IDg7CisgICAgICAgICAgICBpIC09IDg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG4gJiAweEYwMDAwMDAwKSA9PSAwKSB7CisgICAgICAgICAgICBuIDw8PSA0OworICAgICAgICAgICAgaSAtPSA0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKChuICYgMHhDMDAwMDAwMCkgPT0gMCkgeworICAgICAgICAgICAgbiA8PD0gMjsKKyAgICAgICAgICAgIGkgLT0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobiAmIDB4ODAwMDAwMDApID09IDApCisgICAgICAgICAgICAtLWk7CisKKyAgICAgICAgcmV0dXJuIChpIDw8IDEpICsgKChkaXN0ID4+PiAoaSAtIDEpKSAmIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5leHQgTFpNQSBzeW1ib2wuCisgICAgICogPHA+CisgICAgICogVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIHN5bWJvbHM6IGxpdGVyYWwgKGEgc2luZ2xlIGJ5dGUpLAorICAgICAqIHJlcGVhdGVkIG1hdGNoLCBhbmQgbm9ybWFsIG1hdGNoLiBUaGUgc3ltYm9sIGlzIGluZGljYXRlZAorICAgICAqIGJ5IHRoZSByZXR1cm4gdmFsdWUgYW5kIGJ5IHRoZSB2YXJpYWJsZSA8Y29kZT5iYWNrPC9jb2RlPi4KKyAgICAgKiA8cD4KKyAgICAgKiBMaXRlcmFsOiA8Y29kZT5iYWNrID09IC0xPC9jb2RlPiBhbmQgcmV0dXJuIHZhbHVlIGlzIDxjb2RlPjE8L2NvZGU+LgorICAgICAqIFRoZSBsaXRlcmFsIGl0c2VsZiBuZWVkcyB0byBiZSByZWFkIGZyb20gPGNvZGU+bHo8L2NvZGU+IHNlcGFyYXRlbHkuCisgICAgICogPHA+CisgICAgICogUmVwZWF0ZWQgbWF0Y2g6IDxjb2RlPmJhY2s8L2NvZGU+IGlzIGluIHRoZSByYW5nZSBbMCwgM10gYW5kCisgICAgICogdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSByZXBlYXRlZCBtYXRjaC4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3JtYWwgbWF0Y2g6IDxjb2RlPmJhY2sgLSBSRVBTPGNvZGU+ICg8Y29kZT5iYWNrIC0gNDwvY29kZT4pCisgICAgICogaXMgdGhlIGRpc3RhbmNlIG9mIHRoZSBtYXRjaCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbGVuZ3RoCisgICAgICogb2YgdGhlIG1hdGNoLgorICAgICAqLworICAgIGFic3RyYWN0IGludCBnZXROZXh0U3ltYm9sKCk7CisKKyAgICBMWk1BRW5jb2RlcihSYW5nZUVuY29kZXIgcmMsIExaRW5jb2RlciBseiwKKyAgICAgICAgICAgICAgICBpbnQgbGMsIGludCBscCwgaW50IHBiLCBpbnQgZGljdFNpemUsIGludCBuaWNlTGVuKSB7CisgICAgICAgIHN1cGVyKHBiKTsKKyAgICAgICAgdGhpcy5yYyA9IHJjOworICAgICAgICB0aGlzLmx6ID0gbHo7CisgICAgICAgIHRoaXMubmljZUxlbiA9IG5pY2VMZW47CisKKyAgICAgICAgbGl0ZXJhbEVuY29kZXIgPSBuZXcgTGl0ZXJhbEVuY29kZXIobGMsIGxwKTsKKyAgICAgICAgbWF0Y2hMZW5FbmNvZGVyID0gbmV3IExlbmd0aEVuY29kZXIocGIsIG5pY2VMZW4pOworICAgICAgICByZXBMZW5FbmNvZGVyID0gbmV3IExlbmd0aEVuY29kZXIocGIsIG5pY2VMZW4pOworCisgICAgICAgIGRpc3RTbG90UHJpY2VzU2l6ZSA9IGdldERpc3RTbG90KGRpY3RTaXplIC0gMSkgKyAxOworICAgICAgICBkaXN0U2xvdFByaWNlcyA9IG5ldyBpbnRbRElTVF9TVEFURVNdW2Rpc3RTbG90UHJpY2VzU2l6ZV07CisKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTFpFbmNvZGVyIGdldExaRW5jb2RlcigpIHsKKyAgICAgICAgcmV0dXJuIGx6OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBzdXBlci5yZXNldCgpOworICAgICAgICBsaXRlcmFsRW5jb2Rlci5yZXNldCgpOworICAgICAgICBtYXRjaExlbkVuY29kZXIucmVzZXQoKTsKKyAgICAgICAgcmVwTGVuRW5jb2Rlci5yZXNldCgpOworICAgICAgICBkaXN0UHJpY2VDb3VudCA9IDA7CisgICAgICAgIGFsaWduUHJpY2VDb3VudCA9IDA7CisKKyAgICAgICAgdW5jb21wcmVzc2VkU2l6ZSArPSByZWFkQWhlYWQgKyAxOworICAgICAgICByZWFkQWhlYWQgPSAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFVuY29tcHJlc3NlZFNpemUoKSB7CisgICAgICAgIHJldHVybiB1bmNvbXByZXNzZWRTaXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0VW5jb21wcmVzc2VkU2l6ZSgpIHsKKyAgICAgICAgdW5jb21wcmVzc2VkU2l6ZSA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcHJlc3NlcyBmb3IgTFpNQTIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICAgdHJ1ZSBpZiB0aGUgTFpNQTIgY2h1bmsgYmVjYW1lIGZ1bGwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVuY29kZUZvckxaTUEyKCkgeworICAgICAgICBpZiAoIWx6LmlzU3RhcnRlZCgpICYmICFlbmNvZGVJbml0KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgd2hpbGUgKHVuY29tcHJlc3NlZFNpemUgPD0gTFpNQTJfVU5DT01QUkVTU0VEX0xJTUlUCisgICAgICAgICAgICAgICAgJiYgcmMuZ2V0UGVuZGluZ1NpemUoKSA8PSBMWk1BMl9DT01QUkVTU0VEX0xJTUlUKQorICAgICAgICAgICAgaWYgKCFlbmNvZGVTeW1ib2woKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZUluaXQoKSB7CisgICAgICAgIGFzc2VydCByZWFkQWhlYWQgPT0gLTE7CisgICAgICAgIGlmICghbHouaGFzRW5vdWdoRGF0YSgwKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBUaGUgZmlyc3Qgc3ltYm9sIG11c3QgYmUgYSBsaXRlcmFsIHVubGVzcyB1c2luZworICAgICAgICAvLyBhIHByZXNldCBkaWN0aW9uYXJ5LiBUaGlzIGNvZGUgaXNuJ3QgcnVuIGlmIHVzaW5nCisgICAgICAgIC8vIGEgcHJlc2V0IGRpY3Rpb25hcnkuCisgICAgICAgIHNraXAoMSk7CisgICAgICAgIHJjLmVuY29kZUJpdChpc01hdGNoW3N0YXRlLmdldCgpXSwgMCwgMCk7CisgICAgICAgIGxpdGVyYWxFbmNvZGVyLmVuY29kZUluaXQoKTsKKworICAgICAgICAtLXJlYWRBaGVhZDsKKyAgICAgICAgYXNzZXJ0IHJlYWRBaGVhZCA9PSAtMTsKKworICAgICAgICArK3VuY29tcHJlc3NlZFNpemU7CisgICAgICAgIGFzc2VydCB1bmNvbXByZXNzZWRTaXplID09IDE7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGVuY29kZVN5bWJvbCgpIHsKKyAgICAgICAgaWYgKCFsei5oYXNFbm91Z2hEYXRhKHJlYWRBaGVhZCArIDEpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGludCBsZW4gPSBnZXROZXh0U3ltYm9sKCk7CisKKyAgICAgICAgYXNzZXJ0IHJlYWRBaGVhZCA+PSAwOworICAgICAgICBpbnQgcG9zU3RhdGUgPSAobHouZ2V0UG9zKCkgLSByZWFkQWhlYWQpICYgcG9zTWFzazsKKworICAgICAgICBpZiAoYmFjayA9PSAtMSkgeworICAgICAgICAgICAgLy8gTGl0ZXJhbCBpLmUuIGVpZ2h0LWJpdCBieXRlCisgICAgICAgICAgICBhc3NlcnQgbGVuID09IDE7CisgICAgICAgICAgICByYy5lbmNvZGVCaXQoaXNNYXRjaFtzdGF0ZS5nZXQoKV0sIHBvc1N0YXRlLCAwKTsKKyAgICAgICAgICAgIGxpdGVyYWxFbmNvZGVyLmVuY29kZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU29tZSB0eXBlIG9mIG1hdGNoCisgICAgICAgICAgICByYy5lbmNvZGVCaXQoaXNNYXRjaFtzdGF0ZS5nZXQoKV0sIHBvc1N0YXRlLCAxKTsKKyAgICAgICAgICAgIGlmIChiYWNrIDwgUkVQUykgeworICAgICAgICAgICAgICAgIC8vIFJlcGVhdGVkIG1hdGNoIGkuZS4gdGhlIHNhbWUgZGlzdGFuY2UKKyAgICAgICAgICAgICAgICAvLyBoYXMgYmVlbiB1c2VkIGVhcmxpZXIuCisgICAgICAgICAgICAgICAgYXNzZXJ0IGx6LmdldE1hdGNoTGVuKC1yZWFkQWhlYWQsIHJlcHNbYmFja10sIGxlbikgPT0gbGVuOworICAgICAgICAgICAgICAgIHJjLmVuY29kZUJpdChpc1JlcCwgc3RhdGUuZ2V0KCksIDEpOworICAgICAgICAgICAgICAgIGVuY29kZVJlcE1hdGNoKGJhY2ssIGxlbiwgcG9zU3RhdGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBOb3JtYWwgbWF0Y2gKKyAgICAgICAgICAgICAgICBhc3NlcnQgbHouZ2V0TWF0Y2hMZW4oLXJlYWRBaGVhZCwgYmFjayAtIFJFUFMsIGxlbikgPT0gbGVuOworICAgICAgICAgICAgICAgIHJjLmVuY29kZUJpdChpc1JlcCwgc3RhdGUuZ2V0KCksIDApOworICAgICAgICAgICAgICAgIGVuY29kZU1hdGNoKGJhY2sgLSBSRVBTLCBsZW4sIHBvc1N0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlYWRBaGVhZCAtPSBsZW47CisgICAgICAgIHVuY29tcHJlc3NlZFNpemUgKz0gbGVuOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbmNvZGVNYXRjaChpbnQgZGlzdCwgaW50IGxlbiwgaW50IHBvc1N0YXRlKSB7CisgICAgICAgIHN0YXRlLnVwZGF0ZU1hdGNoKCk7CisgICAgICAgIG1hdGNoTGVuRW5jb2Rlci5lbmNvZGUobGVuLCBwb3NTdGF0ZSk7CisKKyAgICAgICAgaW50IGRpc3RTbG90ID0gZ2V0RGlzdFNsb3QoZGlzdCk7CisgICAgICAgIHJjLmVuY29kZUJpdFRyZWUoZGlzdFNsb3RzW2dldERpc3RTdGF0ZShsZW4pXSwgZGlzdFNsb3QpOworCisgICAgICAgIGlmIChkaXN0U2xvdCA+PSBESVNUX01PREVMX1NUQVJUKSB7CisgICAgICAgICAgICBpbnQgZm9vdGVyQml0cyA9IChkaXN0U2xvdCA+Pj4gMSkgLSAxOworICAgICAgICAgICAgaW50IGJhc2UgPSAoMiB8IChkaXN0U2xvdCAmIDEpKSA8PCBmb290ZXJCaXRzOworICAgICAgICAgICAgaW50IGRpc3RSZWR1Y2VkID0gZGlzdCAtIGJhc2U7CisKKyAgICAgICAgICAgIGlmIChkaXN0U2xvdCA8IERJU1RfTU9ERUxfRU5EKSB7CisgICAgICAgICAgICAgICAgcmMuZW5jb2RlUmV2ZXJzZUJpdFRyZWUoCisgICAgICAgICAgICAgICAgICAgICAgICBkaXN0U3BlY2lhbFtkaXN0U2xvdCAtIERJU1RfTU9ERUxfU1RBUlRdLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlzdFJlZHVjZWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByYy5lbmNvZGVEaXJlY3RCaXRzKGRpc3RSZWR1Y2VkID4+PiBBTElHTl9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vdGVyQml0cyAtIEFMSUdOX0JJVFMpOworICAgICAgICAgICAgICAgIHJjLmVuY29kZVJldmVyc2VCaXRUcmVlKGRpc3RBbGlnbiwgZGlzdFJlZHVjZWQgJiBBTElHTl9NQVNLKTsKKyAgICAgICAgICAgICAgICAtLWFsaWduUHJpY2VDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlcHNbM10gPSByZXBzWzJdOworICAgICAgICByZXBzWzJdID0gcmVwc1sxXTsKKyAgICAgICAgcmVwc1sxXSA9IHJlcHNbMF07CisgICAgICAgIHJlcHNbMF0gPSBkaXN0OworCisgICAgICAgIC0tZGlzdFByaWNlQ291bnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuY29kZVJlcE1hdGNoKGludCByZXAsIGludCBsZW4sIGludCBwb3NTdGF0ZSkgeworICAgICAgICBpZiAocmVwID09IDApIHsKKyAgICAgICAgICAgIHJjLmVuY29kZUJpdChpc1JlcDAsIHN0YXRlLmdldCgpLCAwKTsKKyAgICAgICAgICAgIHJjLmVuY29kZUJpdChpc1JlcDBMb25nW3N0YXRlLmdldCgpXSwgcG9zU3RhdGUsIGxlbiA9PSAxID8gMCA6IDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGRpc3QgPSByZXBzW3JlcF07CisgICAgICAgICAgICByYy5lbmNvZGVCaXQoaXNSZXAwLCBzdGF0ZS5nZXQoKSwgMSk7CisKKyAgICAgICAgICAgIGlmIChyZXAgPT0gMSkgeworICAgICAgICAgICAgICAgIHJjLmVuY29kZUJpdChpc1JlcDEsIHN0YXRlLmdldCgpLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmMuZW5jb2RlQml0KGlzUmVwMSwgc3RhdGUuZ2V0KCksIDEpOworICAgICAgICAgICAgICAgIHJjLmVuY29kZUJpdChpc1JlcDIsIHN0YXRlLmdldCgpLCByZXAgLSAyKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXAgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgcmVwc1szXSA9IHJlcHNbMl07CisKKyAgICAgICAgICAgICAgICByZXBzWzJdID0gcmVwc1sxXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVwc1sxXSA9IHJlcHNbMF07CisgICAgICAgICAgICByZXBzWzBdID0gZGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW4gPT0gMSkgeworICAgICAgICAgICAgc3RhdGUudXBkYXRlU2hvcnRSZXAoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcExlbkVuY29kZXIuZW5jb2RlKGxlbiwgcG9zU3RhdGUpOworICAgICAgICAgICAgc3RhdGUudXBkYXRlTG9uZ1JlcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgTWF0Y2hlcyBnZXRNYXRjaGVzKCkgeworICAgICAgICArK3JlYWRBaGVhZDsKKyAgICAgICAgTWF0Y2hlcyBtYXRjaGVzID0gbHouZ2V0TWF0Y2hlcygpOworICAgICAgICBhc3NlcnQgbHoudmVyaWZ5TWF0Y2hlcyhtYXRjaGVzKTsKKyAgICAgICAgcmV0dXJuIG1hdGNoZXM7CisgICAgfQorCisgICAgdm9pZCBza2lwKGludCBsZW4pIHsKKyAgICAgICAgcmVhZEFoZWFkICs9IGxlbjsKKyAgICAgICAgbHouc2tpcChsZW4pOworICAgIH0KKworICAgIGludCBnZXRBbnlNYXRjaFByaWNlKFN0YXRlIHN0YXRlLCBpbnQgcG9zU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIFJhbmdlRW5jb2Rlci5nZXRCaXRQcmljZShpc01hdGNoW3N0YXRlLmdldCgpXVtwb3NTdGF0ZV0sIDEpOworICAgIH0KKworICAgIGludCBnZXROb3JtYWxNYXRjaFByaWNlKGludCBhbnlNYXRjaFByaWNlLCBTdGF0ZSBzdGF0ZSkgeworICAgICAgICByZXR1cm4gYW55TWF0Y2hQcmljZQorICAgICAgICAgICAgICAgKyBSYW5nZUVuY29kZXIuZ2V0Qml0UHJpY2UoaXNSZXBbc3RhdGUuZ2V0KCldLCAwKTsKKyAgICB9CisKKyAgICBpbnQgZ2V0QW55UmVwUHJpY2UoaW50IGFueU1hdGNoUHJpY2UsIFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHJldHVybiBhbnlNYXRjaFByaWNlCisgICAgICAgICAgICAgICArIFJhbmdlRW5jb2Rlci5nZXRCaXRQcmljZShpc1JlcFtzdGF0ZS5nZXQoKV0sIDEpOworICAgIH0KKworICAgIGludCBnZXRTaG9ydFJlcFByaWNlKGludCBhbnlSZXBQcmljZSwgU3RhdGUgc3RhdGUsIGludCBwb3NTdGF0ZSkgeworICAgICAgICByZXR1cm4gYW55UmVwUHJpY2UKKyAgICAgICAgICAgICAgICsgUmFuZ2VFbmNvZGVyLmdldEJpdFByaWNlKGlzUmVwMFtzdGF0ZS5nZXQoKV0sIDApCisgICAgICAgICAgICAgICArIFJhbmdlRW5jb2Rlci5nZXRCaXRQcmljZShpc1JlcDBMb25nW3N0YXRlLmdldCgpXVtwb3NTdGF0ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICB9CisKKyAgICBpbnQgZ2V0TG9uZ1JlcFByaWNlKGludCBhbnlSZXBQcmljZSwgaW50IHJlcCwgU3RhdGUgc3RhdGUsIGludCBwb3NTdGF0ZSkgeworICAgICAgICBpbnQgcHJpY2UgPSBhbnlSZXBQcmljZTsKKworICAgICAgICBpZiAocmVwID09IDApIHsKKyAgICAgICAgICAgIHByaWNlICs9IFJhbmdlRW5jb2Rlci5nZXRCaXRQcmljZShpc1JlcDBbc3RhdGUuZ2V0KCldLCAwKQorICAgICAgICAgICAgICAgICAgICAgKyBSYW5nZUVuY29kZXIuZ2V0Qml0UHJpY2UoCisgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwMExvbmdbc3RhdGUuZ2V0KCldW3Bvc1N0YXRlXSwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmljZSArPSBSYW5nZUVuY29kZXIuZ2V0Qml0UHJpY2UoaXNSZXAwW3N0YXRlLmdldCgpXSwgMSk7CisKKyAgICAgICAgICAgIGlmIChyZXAgPT0gMSkKKyAgICAgICAgICAgICAgICBwcmljZSArPSBSYW5nZUVuY29kZXIuZ2V0Qml0UHJpY2UoaXNSZXAxW3N0YXRlLmdldCgpXSwgMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpY2UgKz0gUmFuZ2VFbmNvZGVyLmdldEJpdFByaWNlKGlzUmVwMVtzdGF0ZS5nZXQoKV0sIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBSYW5nZUVuY29kZXIuZ2V0Qml0UHJpY2UoaXNSZXAyW3N0YXRlLmdldCgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAgLSAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcmljZTsKKyAgICB9CisKKyAgICBpbnQgZ2V0TG9uZ1JlcEFuZExlblByaWNlKGludCByZXAsIGludCBsZW4sIFN0YXRlIHN0YXRlLCBpbnQgcG9zU3RhdGUpIHsKKyAgICAgICAgaW50IGFueU1hdGNoUHJpY2UgPSBnZXRBbnlNYXRjaFByaWNlKHN0YXRlLCBwb3NTdGF0ZSk7CisgICAgICAgIGludCBhbnlSZXBQcmljZSA9IGdldEFueVJlcFByaWNlKGFueU1hdGNoUHJpY2UsIHN0YXRlKTsKKyAgICAgICAgaW50IGxvbmdSZXBQcmljZSA9IGdldExvbmdSZXBQcmljZShhbnlSZXBQcmljZSwgcmVwLCBzdGF0ZSwgcG9zU3RhdGUpOworICAgICAgICByZXR1cm4gbG9uZ1JlcFByaWNlICsgcmVwTGVuRW5jb2Rlci5nZXRQcmljZShsZW4sIHBvc1N0YXRlKTsKKyAgICB9CisKKyAgICBpbnQgZ2V0TWF0Y2hBbmRMZW5QcmljZShpbnQgbm9ybWFsTWF0Y2hQcmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdCwgaW50IGxlbiwgaW50IHBvc1N0YXRlKSB7CisgICAgICAgIGludCBwcmljZSA9IG5vcm1hbE1hdGNoUHJpY2UKKyAgICAgICAgICAgICAgICAgICAgKyBtYXRjaExlbkVuY29kZXIuZ2V0UHJpY2UobGVuLCBwb3NTdGF0ZSk7CisgICAgICAgIGludCBkaXN0U3RhdGUgPSBnZXREaXN0U3RhdGUobGVuKTsKKworICAgICAgICBpZiAoZGlzdCA8IEZVTExfRElTVEFOQ0VTKSB7CisgICAgICAgICAgICBwcmljZSArPSBmdWxsRGlzdFByaWNlc1tkaXN0U3RhdGVdW2Rpc3RdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGRpc3RTbG90UHJpY2VzIGluY2x1ZGVzIGFsc28KKyAgICAgICAgICAgIC8vIHRoZSBwcmljZSBvZiBkaXJlY3QgYml0cy4KKyAgICAgICAgICAgIGludCBkaXN0U2xvdCA9IGdldERpc3RTbG90KGRpc3QpOworICAgICAgICAgICAgcHJpY2UgKz0gZGlzdFNsb3RQcmljZXNbZGlzdFN0YXRlXVtkaXN0U2xvdF0KKyAgICAgICAgICAgICAgICAgICAgICsgYWxpZ25QcmljZXNbZGlzdCAmIEFMSUdOX01BU0tdOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByaWNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEaXN0UHJpY2VzKCkgeworICAgICAgICBkaXN0UHJpY2VDb3VudCA9IERJU1RfUFJJQ0VfVVBEQVRFX0lOVEVSVkFMOworCisgICAgICAgIGZvciAoaW50IGRpc3RTdGF0ZSA9IDA7IGRpc3RTdGF0ZSA8IERJU1RfU1RBVEVTOyArK2Rpc3RTdGF0ZSkgeworICAgICAgICAgICAgZm9yIChpbnQgZGlzdFNsb3QgPSAwOyBkaXN0U2xvdCA8IGRpc3RTbG90UHJpY2VzU2l6ZTsgKytkaXN0U2xvdCkKKyAgICAgICAgICAgICAgICBkaXN0U2xvdFByaWNlc1tkaXN0U3RhdGVdW2Rpc3RTbG90XQorICAgICAgICAgICAgICAgICAgICAgICAgPSBSYW5nZUVuY29kZXIuZ2V0Qml0VHJlZVByaWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0U2xvdHNbZGlzdFN0YXRlXSwgZGlzdFNsb3QpOworCisgICAgICAgICAgICBmb3IgKGludCBkaXN0U2xvdCA9IERJU1RfTU9ERUxfRU5EOyBkaXN0U2xvdCA8IGRpc3RTbG90UHJpY2VzU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgKytkaXN0U2xvdCkgeworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IChkaXN0U2xvdCA+Pj4gMSkgLSAxIC0gQUxJR05fQklUUzsKKyAgICAgICAgICAgICAgICBkaXN0U2xvdFByaWNlc1tkaXN0U3RhdGVdW2Rpc3RTbG90XQorICAgICAgICAgICAgICAgICAgICAgICAgKz0gUmFuZ2VFbmNvZGVyLmdldERpcmVjdEJpdHNQcmljZShjb3VudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaW50IGRpc3QgPSAwOyBkaXN0IDwgRElTVF9NT0RFTF9TVEFSVDsgKytkaXN0KQorICAgICAgICAgICAgICAgIGZ1bGxEaXN0UHJpY2VzW2Rpc3RTdGF0ZV1bZGlzdF0KKyAgICAgICAgICAgICAgICAgICAgICAgID0gZGlzdFNsb3RQcmljZXNbZGlzdFN0YXRlXVtkaXN0XTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBkaXN0ID0gRElTVF9NT0RFTF9TVEFSVDsKKyAgICAgICAgZm9yIChpbnQgZGlzdFNsb3QgPSBESVNUX01PREVMX1NUQVJUOyBkaXN0U2xvdCA8IERJU1RfTU9ERUxfRU5EOworICAgICAgICAgICAgICAgICsrZGlzdFNsb3QpIHsKKyAgICAgICAgICAgIGludCBmb290ZXJCaXRzID0gKGRpc3RTbG90ID4+PiAxKSAtIDE7CisgICAgICAgICAgICBpbnQgYmFzZSA9ICgyIHwgKGRpc3RTbG90ICYgMSkpIDw8IGZvb3RlckJpdHM7CisKKyAgICAgICAgICAgIGludCBsaW1pdCA9IGRpc3RTcGVjaWFsW2Rpc3RTbG90IC0gRElTVF9NT0RFTF9TVEFSVF0ubGVuZ3RoOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW1pdDsgKytpKSB7CisgICAgICAgICAgICAgICAgaW50IGRpc3RSZWR1Y2VkID0gZGlzdCAtIGJhc2U7CisgICAgICAgICAgICAgICAgaW50IHByaWNlID0gUmFuZ2VFbmNvZGVyLmdldFJldmVyc2VCaXRUcmVlUHJpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBkaXN0U3BlY2lhbFtkaXN0U2xvdCAtIERJU1RfTU9ERUxfU1RBUlRdLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlzdFJlZHVjZWQpOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgZGlzdFN0YXRlID0gMDsgZGlzdFN0YXRlIDwgRElTVF9TVEFURVM7ICsrZGlzdFN0YXRlKQorICAgICAgICAgICAgICAgICAgICBmdWxsRGlzdFByaWNlc1tkaXN0U3RhdGVdW2Rpc3RdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBkaXN0U2xvdFByaWNlc1tkaXN0U3RhdGVdW2Rpc3RTbG90XSArIHByaWNlOworCisgICAgICAgICAgICAgICAgKytkaXN0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IGRpc3QgPT0gRlVMTF9ESVNUQU5DRVM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUFsaWduUHJpY2VzKCkgeworICAgICAgICBhbGlnblByaWNlQ291bnQgPSBBTElHTl9QUklDRV9VUERBVEVfSU5URVJWQUw7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBTElHTl9TSVpFOyArK2kpCisgICAgICAgICAgICBhbGlnblByaWNlc1tpXSA9IFJhbmdlRW5jb2Rlci5nZXRSZXZlcnNlQml0VHJlZVByaWNlKGRpc3RBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgbG9va3VwIHRhYmxlcyB1c2VkIGZvciBjYWxjdWxhdGluZyBtYXRjaCBkaXN0YW5jZQorICAgICAqIGFuZCBsZW5ndGggcHJpY2VzLiBUaGUgdXBkYXRpbmcgaXMgc2tpcHBlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucworICAgICAqIGlmIHRoZSB0YWJsZXMgaGF2ZW4ndCBjaGFuZ2VkIG11Y2ggc2luY2UgdGhlIHByZXZpb3VzIHVwZGF0ZS4KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZVByaWNlcygpIHsKKyAgICAgICAgaWYgKGRpc3RQcmljZUNvdW50IDw9IDApCisgICAgICAgICAgICB1cGRhdGVEaXN0UHJpY2VzKCk7CisKKyAgICAgICAgaWYgKGFsaWduUHJpY2VDb3VudCA8PSAwKQorICAgICAgICAgICAgdXBkYXRlQWxpZ25QcmljZXMoKTsKKworICAgICAgICBtYXRjaExlbkVuY29kZXIudXBkYXRlUHJpY2VzKCk7CisgICAgICAgIHJlcExlbkVuY29kZXIudXBkYXRlUHJpY2VzKCk7CisgICAgfQorCisKKyAgICBjbGFzcyBMaXRlcmFsRW5jb2RlciBleHRlbmRzIExpdGVyYWxDb2RlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGl0ZXJhbFN1YmVuY29kZXJbXSBzdWJlbmNvZGVyczsKKworICAgICAgICBMaXRlcmFsRW5jb2RlcihpbnQgbGMsIGludCBscCkgeworICAgICAgICAgICAgc3VwZXIobGMsIGxwKTsKKworICAgICAgICAgICAgc3ViZW5jb2RlcnMgPSBuZXcgTGl0ZXJhbFN1YmVuY29kZXJbMSA8PCAobGMgKyBscCldOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJlbmNvZGVycy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICBzdWJlbmNvZGVyc1tpXSA9IG5ldyBMaXRlcmFsU3ViZW5jb2RlcigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ViZW5jb2RlcnMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgc3ViZW5jb2RlcnNbaV0ucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZW5jb2RlSW5pdCgpIHsKKyAgICAgICAgICAgIC8vIFdoZW4gZW5jb2RpbmcgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHN0cmVhbSwgdGhlcmUgaXMKKyAgICAgICAgICAgIC8vIG5vIHByZXZpb3VzIGJ5dGUgaW4gdGhlIGRpY3Rpb25hcnkgc28gdGhlIGVuY29kZSBmdW5jdGlvbgorICAgICAgICAgICAgLy8gd291bGRuJ3Qgd29yay4KKyAgICAgICAgICAgIGFzc2VydCByZWFkQWhlYWQgPj0gMDsKKyAgICAgICAgICAgIHN1YmVuY29kZXJzWzBdLmVuY29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBlbmNvZGUoKSB7CisgICAgICAgICAgICBhc3NlcnQgcmVhZEFoZWFkID49IDA7CisgICAgICAgICAgICBpbnQgaSA9IGdldFN1YmNvZGVySW5kZXgobHouZ2V0Qnl0ZSgxICsgcmVhZEFoZWFkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsei5nZXRQb3MoKSAtIHJlYWRBaGVhZCk7CisgICAgICAgICAgICBzdWJlbmNvZGVyc1tpXS5lbmNvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRQcmljZShpbnQgY3VyQnl0ZSwgaW50IG1hdGNoQnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBwcmV2Qnl0ZSwgaW50IHBvcywgU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgICAgIGludCBwcmljZSA9IFJhbmdlRW5jb2Rlci5nZXRCaXRQcmljZSgKKyAgICAgICAgICAgICAgICAgICAgaXNNYXRjaFtzdGF0ZS5nZXQoKV1bcG9zICYgcG9zTWFza10sIDApOworCisgICAgICAgICAgICBpbnQgaSA9IGdldFN1YmNvZGVySW5kZXgocHJldkJ5dGUsIHBvcyk7CisgICAgICAgICAgICBwcmljZSArPSBzdGF0ZS5pc0xpdGVyYWwoKQorICAgICAgICAgICAgICAgICAgID8gc3ViZW5jb2RlcnNbaV0uZ2V0Tm9ybWFsUHJpY2UoY3VyQnl0ZSkKKyAgICAgICAgICAgICAgICAgICA6IHN1YmVuY29kZXJzW2ldLmdldE1hdGNoZWRQcmljZShjdXJCeXRlLCBtYXRjaEJ5dGUpOworCisgICAgICAgICAgICByZXR1cm4gcHJpY2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIExpdGVyYWxTdWJlbmNvZGVyIGV4dGVuZHMgTGl0ZXJhbFN1YmNvZGVyIHsKKyAgICAgICAgICAgIHZvaWQgZW5jb2RlKCkgeworICAgICAgICAgICAgICAgIGludCBzeW1ib2wgPSBsei5nZXRCeXRlKHJlYWRBaGVhZCkgfCAweDEwMDsKKworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5pc0xpdGVyYWwoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc3ViZW5jb2RlckluZGV4OworICAgICAgICAgICAgICAgICAgICBpbnQgYml0OworCisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YmVuY29kZXJJbmRleCA9IHN5bWJvbCA+Pj4gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdCA9IChzeW1ib2wgPj4+IDcpICYgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjLmVuY29kZUJpdChwcm9icywgc3ViZW5jb2RlckluZGV4LCBiaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sIDw8PSAxOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChzeW1ib2wgPCAweDEwMDAwKTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXRjaEJ5dGUgPSBsei5nZXRCeXRlKHJlcHNbMF0gKyAxICsgcmVhZEFoZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICBpbnQgc3ViZW5jb2RlckluZGV4OworICAgICAgICAgICAgICAgICAgICBpbnQgbWF0Y2hCaXQ7CisgICAgICAgICAgICAgICAgICAgIGludCBiaXQ7CisKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hCeXRlIDw8PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hCaXQgPSBtYXRjaEJ5dGUgJiBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJlbmNvZGVySW5kZXggPSBvZmZzZXQgKyBtYXRjaEJpdCArIChzeW1ib2wgPj4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgYml0ID0gKHN5bWJvbCA+Pj4gNykgJiAxOworICAgICAgICAgICAgICAgICAgICAgICAgcmMuZW5jb2RlQml0KHByb2JzLCBzdWJlbmNvZGVySW5kZXgsIGJpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPDw9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgJj0gfihtYXRjaEJ5dGUgXiBzeW1ib2wpOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChzeW1ib2wgPCAweDEwMDAwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0ZS51cGRhdGVMaXRlcmFsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBnZXROb3JtYWxQcmljZShpbnQgc3ltYm9sKSB7CisgICAgICAgICAgICAgICAgaW50IHByaWNlID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgc3ViZW5jb2RlckluZGV4OworICAgICAgICAgICAgICAgIGludCBiaXQ7CisKKyAgICAgICAgICAgICAgICBzeW1ib2wgfD0gMHgxMDA7CisKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHN1YmVuY29kZXJJbmRleCA9IHN5bWJvbCA+Pj4gODsKKyAgICAgICAgICAgICAgICAgICAgYml0ID0gKHN5bWJvbCA+Pj4gNykgJiAxOworICAgICAgICAgICAgICAgICAgICBwcmljZSArPSBSYW5nZUVuY29kZXIuZ2V0Qml0UHJpY2UocHJvYnNbc3ViZW5jb2RlckluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCk7CisgICAgICAgICAgICAgICAgICAgIHN5bWJvbCA8PD0gMTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChzeW1ib2wgPCAoMHgxMDAgPDwgOCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHByaWNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgZ2V0TWF0Y2hlZFByaWNlKGludCBzeW1ib2wsIGludCBtYXRjaEJ5dGUpIHsKKyAgICAgICAgICAgICAgICBpbnQgcHJpY2UgPSAwOworICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAweDEwMDsKKyAgICAgICAgICAgICAgICBpbnQgc3ViZW5jb2RlckluZGV4OworICAgICAgICAgICAgICAgIGludCBtYXRjaEJpdDsKKyAgICAgICAgICAgICAgICBpbnQgYml0OworCisgICAgICAgICAgICAgICAgc3ltYm9sIHw9IDB4MTAwOworCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBtYXRjaEJ5dGUgPDw9IDE7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoQml0ID0gbWF0Y2hCeXRlICYgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBzdWJlbmNvZGVySW5kZXggPSBvZmZzZXQgKyBtYXRjaEJpdCArIChzeW1ib2wgPj4+IDgpOworICAgICAgICAgICAgICAgICAgICBiaXQgPSAoc3ltYm9sID4+PiA3KSAmIDE7CisgICAgICAgICAgICAgICAgICAgIHByaWNlICs9IFJhbmdlRW5jb2Rlci5nZXRCaXRQcmljZShwcm9ic1tzdWJlbmNvZGVySW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0KTsKKyAgICAgICAgICAgICAgICAgICAgc3ltYm9sIDw8PSAxOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgJj0gfihtYXRjaEJ5dGUgXiBzeW1ib2wpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKHN5bWJvbCA8ICgweDEwMCA8PCA4KSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJpY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGNsYXNzIExlbmd0aEVuY29kZXIgZXh0ZW5kcyBMZW5ndGhDb2RlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcHJpY2VzIGFyZSB1cGRhdGVkIGFmdGVyIGF0IGxlYXN0CisgICAgICAgICAqIDxjb2RlPlBSSUNFX1VQREFURV9JTlRFUlZBTDwvY29kZT4gbWFueSBsZW5ndGhzCisgICAgICAgICAqIGhhdmUgYmVlbiBlbmNvZGVkIHdpdGggdGhlIHNhbWUgcG9zU3RhdGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJJQ0VfVVBEQVRFX0lOVEVSVkFMID0gMzI7IC8vIEZJWE1FPworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50W10gY291bnRlcnM7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50W11bXSBwcmljZXM7CisKKyAgICAgICAgTGVuZ3RoRW5jb2RlcihpbnQgcGIsIGludCBuaWNlTGVuKSB7CisgICAgICAgICAgICBpbnQgcG9zU3RhdGVzID0gMSA8PCBwYjsKKyAgICAgICAgICAgIGNvdW50ZXJzID0gbmV3IGludFtwb3NTdGF0ZXNdOworCisgICAgICAgICAgICAvLyBBbHdheXMgYWxsb2NhdGUgYXQgbGVhc3QgTE9XX1NZTUJPTFMgKyBNSURfU1lNQk9MUyBiZWNhdXNlCisgICAgICAgICAgICAvLyBpdCBtYWtlcyB1cGRhdGVQcmljZXMgc2xpZ2h0bHkgc2ltcGxlci4gVGhlIHByaWNlcyBhcmVuJ3QKKyAgICAgICAgICAgIC8vIHVzdWFsbHkgbmVlZGVkIGFueXdheSBpZiBuaWNlTGVuIDwgMTguCisgICAgICAgICAgICBpbnQgbGVuU3ltYm9scyA9IE1hdGgubWF4KG5pY2VMZW4gLSBNQVRDSF9MRU5fTUlOICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9XX1NZTUJPTFMgKyBNSURfU1lNQk9MUyk7CisgICAgICAgICAgICBwcmljZXMgPSBuZXcgaW50W3Bvc1N0YXRlc11bbGVuU3ltYm9sc107CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgc3VwZXIucmVzZXQoKTsKKworICAgICAgICAgICAgLy8gUmVzZXQgY291bnRlcnMgdG8gemVybyB0byBmb3JjZSBwcmljZSB1cGRhdGUgYmVmb3JlCisgICAgICAgICAgICAvLyB0aGUgcHJpY2VzIGFyZSBuZWVkZWQuCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50ZXJzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgIGNvdW50ZXJzW2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZW5jb2RlKGludCBsZW4sIGludCBwb3NTdGF0ZSkgeworICAgICAgICAgICAgbGVuIC09IE1BVENIX0xFTl9NSU47CisKKyAgICAgICAgICAgIGlmIChsZW4gPCBMT1dfU1lNQk9MUykgeworICAgICAgICAgICAgICAgIHJjLmVuY29kZUJpdChjaG9pY2UsIDAsIDApOworICAgICAgICAgICAgICAgIHJjLmVuY29kZUJpdFRyZWUobG93W3Bvc1N0YXRlXSwgbGVuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmMuZW5jb2RlQml0KGNob2ljZSwgMCwgMSk7CisgICAgICAgICAgICAgICAgbGVuIC09IExPV19TWU1CT0xTOworCisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IE1JRF9TWU1CT0xTKSB7CisgICAgICAgICAgICAgICAgICAgIHJjLmVuY29kZUJpdChjaG9pY2UsIDEsIDApOworICAgICAgICAgICAgICAgICAgICByYy5lbmNvZGVCaXRUcmVlKG1pZFtwb3NTdGF0ZV0sIGxlbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmMuZW5jb2RlQml0KGNob2ljZSwgMSwgMSk7CisgICAgICAgICAgICAgICAgICAgIHJjLmVuY29kZUJpdFRyZWUoaGlnaCwgbGVuIC0gTUlEX1NZTUJPTFMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLS1jb3VudGVyc1twb3NTdGF0ZV07CisgICAgICAgIH0KKworICAgICAgICBpbnQgZ2V0UHJpY2UoaW50IGxlbiwgaW50IHBvc1N0YXRlKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpY2VzW3Bvc1N0YXRlXVtsZW4gLSBNQVRDSF9MRU5fTUlOXTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdXBkYXRlUHJpY2VzKCkgeworICAgICAgICAgICAgZm9yIChpbnQgcG9zU3RhdGUgPSAwOyBwb3NTdGF0ZSA8IGNvdW50ZXJzLmxlbmd0aDsgKytwb3NTdGF0ZSkgeworICAgICAgICAgICAgICAgIGlmIChjb3VudGVyc1twb3NTdGF0ZV0gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudGVyc1twb3NTdGF0ZV0gPSBQUklDRV9VUERBVEVfSU5URVJWQUw7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByaWNlcyhwb3NTdGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByaWNlcyhpbnQgcG9zU3RhdGUpIHsKKyAgICAgICAgICAgIGludCBjaG9pY2UwUHJpY2UgPSBSYW5nZUVuY29kZXIuZ2V0Qml0UHJpY2UoY2hvaWNlWzBdLCAwKTsKKworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgZm9yICg7IGkgPCBMT1dfU1lNQk9MUzsgKytpKQorICAgICAgICAgICAgICAgIHByaWNlc1twb3NTdGF0ZV1baV0gPSBjaG9pY2UwUHJpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICsgUmFuZ2VFbmNvZGVyLmdldEJpdFRyZWVQcmljZShsb3dbcG9zU3RhdGVdLCBpKTsKKworICAgICAgICAgICAgY2hvaWNlMFByaWNlID0gUmFuZ2VFbmNvZGVyLmdldEJpdFByaWNlKGNob2ljZVswXSwgMSk7CisgICAgICAgICAgICBpbnQgY2hvaWNlMVByaWNlID0gUmFuZ2VFbmNvZGVyLmdldEJpdFByaWNlKGNob2ljZVsxXSwgMCk7CisKKyAgICAgICAgICAgIGZvciAoOyBpIDwgTE9XX1NZTUJPTFMgKyBNSURfU1lNQk9MUzsgKytpKQorICAgICAgICAgICAgICAgIHByaWNlc1twb3NTdGF0ZV1baV0gPSBjaG9pY2UwUHJpY2UgKyBjaG9pY2UxUHJpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICArIFJhbmdlRW5jb2Rlci5nZXRCaXRUcmVlUHJpY2UobWlkW3Bvc1N0YXRlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAtIExPV19TWU1CT0xTKTsKKworICAgICAgICAgICAgY2hvaWNlMVByaWNlID0gUmFuZ2VFbmNvZGVyLmdldEJpdFByaWNlKGNob2ljZVsxXSwgMSk7CisKKyAgICAgICAgICAgIGZvciAoOyBpIDwgcHJpY2VzW3Bvc1N0YXRlXS5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICBwcmljZXNbcG9zU3RhdGVdW2ldID0gY2hvaWNlMFByaWNlICsgY2hvaWNlMVByaWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBSYW5nZUVuY29kZXIuZ2V0Qml0VHJlZVByaWNlKGhpZ2gsIGkgLSBMT1dfU1lNQk9MUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIE1JRF9TWU1CT0xTKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9sem1hL0xaTUFFbmNvZGVyRmFzdC5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6bWEvTFpNQUVuY29kZXJGYXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyZGQwOQotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9sem1hL0xaTUFFbmNvZGVyRmFzdC5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogTFpNQUVuY29kZXJGYXN0CisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6Lmx6bWE7CisKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5sei5MWkVuY29kZXI7CitpbXBvcnQgb3JnLnR1a2FhbmkueHoubHouTWF0Y2hlczsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5yYW5nZWNvZGVyLlJhbmdlRW5jb2RlcjsKKworZmluYWwgY2xhc3MgTFpNQUVuY29kZXJGYXN0IGV4dGVuZHMgTFpNQUVuY29kZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFRSQV9TSVpFX0JFRk9SRSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYVFJBX1NJWkVfQUZURVIgPSBNQVRDSF9MRU5fTUFYIC0gMTsKKworICAgIHByaXZhdGUgTWF0Y2hlcyBtYXRjaGVzID0gbnVsbDsKKworICAgIHN0YXRpYyBpbnQgZ2V0TWVtb3J5VXNhZ2UoaW50IGRpY3RTaXplLCBpbnQgZXh0cmFTaXplQmVmb3JlLCBpbnQgbWYpIHsKKyAgICAgICAgcmV0dXJuIExaRW5jb2Rlci5nZXRNZW1vcnlVc2FnZSgKKyAgICAgICAgICAgICAgICBkaWN0U2l6ZSwgTWF0aC5tYXgoZXh0cmFTaXplQmVmb3JlLCBFWFRSQV9TSVpFX0JFRk9SRSksCisgICAgICAgICAgICAgICAgRVhUUkFfU0laRV9BRlRFUiwgTUFUQ0hfTEVOX01BWCwgbWYpOworICAgIH0KKworICAgIExaTUFFbmNvZGVyRmFzdChSYW5nZUVuY29kZXIgcmMsIGludCBsYywgaW50IGxwLCBpbnQgcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGljdFNpemUsIGludCBleHRyYVNpemVCZWZvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmljZUxlbiwgaW50IG1mLCBpbnQgZGVwdGhMaW1pdCkgeworICAgICAgICBzdXBlcihyYywgTFpFbmNvZGVyLmdldEluc3RhbmNlKGRpY3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KGV4dHJhU2l6ZUJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQV9TSVpFX0JFRk9SRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFfU0laRV9BRlRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWNlTGVuLCBNQVRDSF9MRU5fTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1mLCBkZXB0aExpbWl0KSwKKyAgICAgICAgICAgICAgbGMsIGxwLCBwYiwgZGljdFNpemUsIG5pY2VMZW4pOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjaGFuZ2VQYWlyKGludCBzbWFsbERpc3QsIGludCBiaWdEaXN0KSB7CisgICAgICAgIHJldHVybiBzbWFsbERpc3QgPCAoYmlnRGlzdCA+Pj4gNyk7CisgICAgfQorCisgICAgaW50IGdldE5leHRTeW1ib2woKSB7CisgICAgICAgIC8vIEdldCB0aGUgbWF0Y2hlcyBmb3IgdGhlIG5leHQgYnl0ZSB1bmxlc3MgcmVhZEFoZWFkIGluZGljYXRlcworICAgICAgICAvLyB0aGF0IHdlIGFscmVhZHkgZ290IHRoZSBuZXcgbWF0Y2hlcyBkdXJpbmcgdGhlIHByZXZpb3VzIGNhbGwKKyAgICAgICAgLy8gdG8gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgaWYgKHJlYWRBaGVhZCA9PSAtMSkKKyAgICAgICAgICAgIG1hdGNoZXMgPSBnZXRNYXRjaGVzKCk7CisKKyAgICAgICAgYmFjayA9IC0xOworCisgICAgICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgZGljdGlvbmFyeSwgYnV0CisgICAgICAgIC8vIG5vdCBtb3JlIHRoYW4gdGhlIG1heGltdW0gbWF0Y2ggbGVuZ3RoLiBJZiB0aGVyZSBhcmVuJ3QKKyAgICAgICAgLy8gZW5vdWdoIGJ5dGVzIHJlbWFpbmluZyB0byBlbmNvZGUgYSBtYXRjaCBhdCBhbGwsIHJldHVybgorICAgICAgICAvLyBpbW1lZGlhdGVseSB0byBlbmNvZGUgdGhpcyBieXRlIGFzIGEgbGl0ZXJhbC4KKyAgICAgICAgaW50IGF2YWlsID0gTWF0aC5taW4obHouZ2V0QXZhaWwoKSwgTUFUQ0hfTEVOX01BWCk7CisgICAgICAgIGlmIChhdmFpbCA8IE1BVENIX0xFTl9NSU4pCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAvLyBMb29rIGZvciBhIG1hdGNoIGZyb20gdGhlIHByZXZpb3VzIGZvdXIgbWF0Y2ggZGlzdGFuY2VzLgorICAgICAgICBpbnQgYmVzdFJlcExlbiA9IDA7CisgICAgICAgIGludCBiZXN0UmVwSW5kZXggPSAwOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCBSRVBTOyArK3JlcCkgeworICAgICAgICAgICAgaW50IGxlbiA9IGx6LmdldE1hdGNoTGVuKHJlcHNbcmVwXSwgYXZhaWwpOworICAgICAgICAgICAgaWYgKGxlbiA8IE1BVENIX0xFTl9NSU4pCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIElmIGl0IGlzIGxvbmcgZW5vdWdoLCByZXR1cm4gaXQuCisgICAgICAgICAgICBpZiAobGVuID49IG5pY2VMZW4pIHsKKyAgICAgICAgICAgICAgICBiYWNrID0gcmVwOworICAgICAgICAgICAgICAgIHNraXAobGVuIC0gMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhlIGluZGV4IGFuZCBsZW5ndGggb2YgdGhlIGJlc3QgcmVwZWF0ZWQgbWF0Y2guCisgICAgICAgICAgICBpZiAobGVuID4gYmVzdFJlcExlbikgeworICAgICAgICAgICAgICAgIGJlc3RSZXBJbmRleCA9IHJlcDsKKyAgICAgICAgICAgICAgICBiZXN0UmVwTGVuID0gbGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IG1haW5MZW4gPSAwOworICAgICAgICBpbnQgbWFpbkRpc3QgPSAwOworCisgICAgICAgIGlmIChtYXRjaGVzLmNvdW50ID4gMCkgeworICAgICAgICAgICAgbWFpbkxlbiA9IG1hdGNoZXMubGVuW21hdGNoZXMuY291bnQgLSAxXTsKKyAgICAgICAgICAgIG1haW5EaXN0ID0gbWF0Y2hlcy5kaXN0W21hdGNoZXMuY291bnQgLSAxXTsKKworICAgICAgICAgICAgaWYgKG1haW5MZW4gPj0gbmljZUxlbikgeworICAgICAgICAgICAgICAgIGJhY2sgPSBtYWluRGlzdCArIFJFUFM7CisgICAgICAgICAgICAgICAgc2tpcChtYWluTGVuIC0gMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1haW5MZW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChtYXRjaGVzLmNvdW50ID4gMQorICAgICAgICAgICAgICAgICAgICAmJiBtYWluTGVuID09IG1hdGNoZXMubGVuW21hdGNoZXMuY291bnQgLSAyXSArIDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZVBhaXIobWF0Y2hlcy5kaXN0W21hdGNoZXMuY291bnQgLSAyXSwgbWFpbkRpc3QpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC0tbWF0Y2hlcy5jb3VudDsKKyAgICAgICAgICAgICAgICBtYWluTGVuID0gbWF0Y2hlcy5sZW5bbWF0Y2hlcy5jb3VudCAtIDFdOworICAgICAgICAgICAgICAgIG1haW5EaXN0ID0gbWF0Y2hlcy5kaXN0W21hdGNoZXMuY291bnQgLSAxXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1haW5MZW4gPT0gTUFUQ0hfTEVOX01JTiAmJiBtYWluRGlzdCA+PSAweDgwKQorICAgICAgICAgICAgICAgIG1haW5MZW4gPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJlc3RSZXBMZW4gPj0gTUFUQ0hfTEVOX01JTikgeworICAgICAgICAgICAgaWYgKGJlc3RSZXBMZW4gKyAxID49IG1haW5MZW4KKyAgICAgICAgICAgICAgICAgICAgfHwgKGJlc3RSZXBMZW4gKyAyID49IG1haW5MZW4gJiYgbWFpbkRpc3QgPj0gKDEgPDwgOSkpCisgICAgICAgICAgICAgICAgICAgIHx8IChiZXN0UmVwTGVuICsgMyA+PSBtYWluTGVuICYmIG1haW5EaXN0ID49ICgxIDw8IDE1KSkpIHsKKyAgICAgICAgICAgICAgICBiYWNrID0gYmVzdFJlcEluZGV4OworICAgICAgICAgICAgICAgIHNraXAoYmVzdFJlcExlbiAtIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBiZXN0UmVwTGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1haW5MZW4gPCBNQVRDSF9MRU5fTUlOIHx8IGF2YWlsIDw9IE1BVENIX0xFTl9NSU4pCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAvLyBHZXQgdGhlIG5leHQgbWF0Y2guIFRlc3QgaWYgaXQgaXMgYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQgbWF0Y2guCisgICAgICAgIC8vIElmIHNvLCBlbmNvZGUgdGhlIGN1cnJlbnQgYnl0ZSBhcyBhIGxpdGVyYWwuCisgICAgICAgIG1hdGNoZXMgPSBnZXRNYXRjaGVzKCk7CisKKyAgICAgICAgaWYgKG1hdGNoZXMuY291bnQgPiAwKSB7CisgICAgICAgICAgICBpbnQgbmV3TGVuID0gbWF0Y2hlcy5sZW5bbWF0Y2hlcy5jb3VudCAtIDFdOworICAgICAgICAgICAgaW50IG5ld0Rpc3QgPSBtYXRjaGVzLmRpc3RbbWF0Y2hlcy5jb3VudCAtIDFdOworCisgICAgICAgICAgICBpZiAoKG5ld0xlbiA+PSBtYWluTGVuICYmIG5ld0Rpc3QgPCBtYWluRGlzdCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKG5ld0xlbiA9PSBtYWluTGVuICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWNoYW5nZVBhaXIobWFpbkRpc3QsIG5ld0Rpc3QpKQorICAgICAgICAgICAgICAgICAgICB8fCBuZXdMZW4gPiBtYWluTGVuICsgMQorICAgICAgICAgICAgICAgICAgICB8fCAobmV3TGVuICsgMSA+PSBtYWluTGVuCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYWluTGVuID49IE1BVENIX0xFTl9NSU4gKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBjaGFuZ2VQYWlyKG5ld0Rpc3QsIG1haW5EaXN0KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbGltaXQgPSBNYXRoLm1heChtYWluTGVuIC0gMSwgTUFUQ0hfTEVOX01JTik7CisgICAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IFJFUFM7ICsrcmVwKQorICAgICAgICAgICAgaWYgKGx6LmdldE1hdGNoTGVuKHJlcHNbcmVwXSwgbGltaXQpID09IGxpbWl0KQorICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIGJhY2sgPSBtYWluRGlzdCArIFJFUFM7CisgICAgICAgIHNraXAobWFpbkxlbiAtIDIpOworICAgICAgICByZXR1cm4gbWFpbkxlbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovbHptYS9MWk1BRW5jb2Rlck5vcm1hbC5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6bWEvTFpNQUVuY29kZXJOb3JtYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDRhZmUzCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6bWEvTFpNQUVuY29kZXJOb3JtYWwuamF2YQpAQCAtMCwwICsxLDU2NiBAQAorLyoKKyAqIExaTUFFbmNvZGVyTm9ybWFsCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6Lmx6bWE7CisKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5sei5MWkVuY29kZXI7CitpbXBvcnQgb3JnLnR1a2FhbmkueHoubHouTWF0Y2hlczsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5yYW5nZWNvZGVyLlJhbmdlRW5jb2RlcjsKKworZmluYWwgY2xhc3MgTFpNQUVuY29kZXJOb3JtYWwgZXh0ZW5kcyBMWk1BRW5jb2RlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9QVFMgPSA0MDk2OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYVFJBX1NJWkVfQkVGT1JFID0gT1BUUzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhUUkFfU0laRV9BRlRFUiA9IE9QVFM7CisKKyAgICBwcml2YXRlIGZpbmFsIE9wdGltdW1bXSBvcHRzID0gbmV3IE9wdGltdW1bT1BUU107CisgICAgcHJpdmF0ZSBpbnQgb3B0Q3VyID0gMDsKKyAgICBwcml2YXRlIGludCBvcHRFbmQgPSAwOworCisgICAgcHJpdmF0ZSBNYXRjaGVzIG1hdGNoZXM7CisKKyAgICAvLyBUaGVzZSBhcmUgZmllbGRzIHNvbGVseSB0byBhdm9pZCBhbGxvY2F0aW5nIHRoZSBvYmplY3RzIGFnYWluIGFuZAorICAgIC8vIGFnYWluIG9uIGVhY2ggZnVuY3Rpb24gY2FsbC4KKyAgICBwcml2YXRlIGZpbmFsIGludFtdIHJlcExlbnMgPSBuZXcgaW50W1JFUFNdOworICAgIHByaXZhdGUgZmluYWwgU3RhdGUgbmV4dFN0YXRlID0gbmV3IFN0YXRlKCk7CisKKyAgICBzdGF0aWMgaW50IGdldE1lbW9yeVVzYWdlKGludCBkaWN0U2l6ZSwgaW50IGV4dHJhU2l6ZUJlZm9yZSwgaW50IG1mKSB7CisgICAgICAgIHJldHVybiBMWkVuY29kZXIuZ2V0TWVtb3J5VXNhZ2UoZGljdFNpemUsCisgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoZXh0cmFTaXplQmVmb3JlLCBFWFRSQV9TSVpFX0JFRk9SRSksCisgICAgICAgICAgICAgICAgICAgRVhUUkFfU0laRV9BRlRFUiwgTUFUQ0hfTEVOX01BWCwgbWYpCisgICAgICAgICAgICAgICArIE9QVFMgKiA2NCAvIDEwMjQ7CisgICAgfQorCisgICAgTFpNQUVuY29kZXJOb3JtYWwoUmFuZ2VFbmNvZGVyIHJjLCBpbnQgbGMsIGludCBscCwgaW50IHBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGljdFNpemUsIGludCBleHRyYVNpemVCZWZvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuaWNlTGVuLCBpbnQgbWYsIGludCBkZXB0aExpbWl0KSB7CisgICAgICAgIHN1cGVyKHJjLCBMWkVuY29kZXIuZ2V0SW5zdGFuY2UoZGljdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoZXh0cmFTaXplQmVmb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBX1NJWkVfQkVGT1JFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQV9TSVpFX0FGVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pY2VMZW4sIE1BVENIX0xFTl9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWYsIGRlcHRoTGltaXQpLAorICAgICAgICAgICAgICBsYywgbHAsIHBiLCBkaWN0U2l6ZSwgbmljZUxlbik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPUFRTOyArK2kpCisgICAgICAgICAgICBvcHRzW2ldID0gbmV3IE9wdGltdW0oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgb3B0Q3VyID0gMDsKKyAgICAgICAgb3B0RW5kID0gMDsKKyAgICAgICAgc3VwZXIucmVzZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGUgb3B0cyBhcnJheSBmcm9tIGJhY2t3YXJkIGluZGV4ZXMgdG8gZm9yd2FyZCBpbmRleGVzLgorICAgICAqIFRoZW4gaXQgd2lsbCBiZSBzaW1wbGUgdG8gZ2V0IHRoZSBuZXh0IHN5bWJvbCBmcm9tIHRoZSBhcnJheQorICAgICAqIGluIGxhdGVyIGNhbGxzIHRvIDxjb2RlPmdldE5leHRTeW1ib2woKTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY29udmVydE9wdHMoKSB7CisgICAgICAgIG9wdEVuZCA9IG9wdEN1cjsKKworICAgICAgICBpbnQgb3B0UHJldiA9IG9wdHNbb3B0Q3VyXS5vcHRQcmV2OworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE9wdGltdW0gb3B0ID0gb3B0c1tvcHRDdXJdOworCisgICAgICAgICAgICBpZiAob3B0LnByZXYxSXNMaXRlcmFsKSB7CisgICAgICAgICAgICAgICAgb3B0c1tvcHRQcmV2XS5vcHRQcmV2ID0gb3B0Q3VyOworICAgICAgICAgICAgICAgIG9wdHNbb3B0UHJldl0uYmFja1ByZXYgPSAtMTsKKyAgICAgICAgICAgICAgICBvcHRDdXIgPSBvcHRQcmV2LS07CisKKyAgICAgICAgICAgICAgICBpZiAob3B0Lmhhc1ByZXYyKSB7CisgICAgICAgICAgICAgICAgICAgIG9wdHNbb3B0UHJldl0ub3B0UHJldiA9IG9wdFByZXYgKyAxOworICAgICAgICAgICAgICAgICAgICBvcHRzW29wdFByZXZdLmJhY2tQcmV2ID0gb3B0LmJhY2tQcmV2MjsKKyAgICAgICAgICAgICAgICAgICAgb3B0Q3VyID0gb3B0UHJldjsKKyAgICAgICAgICAgICAgICAgICAgb3B0UHJldiA9IG9wdC5vcHRQcmV2MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCB0ZW1wID0gb3B0c1tvcHRQcmV2XS5vcHRQcmV2OworICAgICAgICAgICAgb3B0c1tvcHRQcmV2XS5vcHRQcmV2ID0gb3B0Q3VyOworICAgICAgICAgICAgb3B0Q3VyID0gb3B0UHJldjsKKyAgICAgICAgICAgIG9wdFByZXYgPSB0ZW1wOworICAgICAgICB9IHdoaWxlIChvcHRDdXIgPiAwKTsKKworICAgICAgICBvcHRDdXIgPSBvcHRzWzBdLm9wdFByZXY7CisgICAgICAgIGJhY2sgPSBvcHRzW29wdEN1cl0uYmFja1ByZXY7CisgICAgICAgIHJldHVybiBvcHRDdXI7CisgICAgfQorCisgICAgaW50IGdldE5leHRTeW1ib2woKSB7CisgICAgICAgIC8vIElmIHRoZXJlIGFyZSBwZW5kaW5nIHN5bWJvbHMgZnJvbSBhbiBlYXJsaWVyIGNhbGwgdG8gdGhpcworICAgICAgICAvLyBmdW5jdGlvbiwgcmV0dXJuIHRob3NlIHN5bWJvbHMgZmlyc3QuCisgICAgICAgIGlmIChvcHRDdXIgPCBvcHRFbmQpIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBvcHRzW29wdEN1cl0ub3B0UHJldiAtIG9wdEN1cjsKKyAgICAgICAgICAgIG9wdEN1ciA9IG9wdHNbb3B0Q3VyXS5vcHRQcmV2OworICAgICAgICAgICAgYmFjayA9IG9wdHNbb3B0Q3VyXS5iYWNrUHJldjsKKyAgICAgICAgICAgIHJldHVybiBsZW47CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgb3B0Q3VyID09IG9wdEVuZDsKKyAgICAgICAgb3B0Q3VyID0gMDsKKyAgICAgICAgb3B0RW5kID0gMDsKKyAgICAgICAgYmFjayA9IC0xOworCisgICAgICAgIGlmIChyZWFkQWhlYWQgPT0gLTEpCisgICAgICAgICAgICBtYXRjaGVzID0gZ2V0TWF0Y2hlcygpOworCisgICAgICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgZGljdGlvbmFyeSwgYnV0CisgICAgICAgIC8vIG5vdCBtb3JlIHRoYW4gdGhlIG1heGltdW0gbWF0Y2ggbGVuZ3RoLiBJZiB0aGVyZSBhcmVuJ3QKKyAgICAgICAgLy8gZW5vdWdoIGJ5dGVzIHJlbWFpbmluZyB0byBlbmNvZGUgYSBtYXRjaCBhdCBhbGwsIHJldHVybgorICAgICAgICAvLyBpbW1lZGlhdGVseSB0byBlbmNvZGUgdGhpcyBieXRlIGFzIGEgbGl0ZXJhbC4KKyAgICAgICAgaW50IGF2YWlsID0gTWF0aC5taW4obHouZ2V0QXZhaWwoKSwgTUFUQ0hfTEVOX01BWCk7CisgICAgICAgIGlmIChhdmFpbCA8IE1BVENIX0xFTl9NSU4pCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAvLyBHZXQgdGhlIGxlbmd0aHMgb2YgcmVwZWF0ZWQgbWF0Y2hlcy4KKyAgICAgICAgaW50IHJlcEJlc3QgPSAwOworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCBSRVBTOyArK3JlcCkgeworICAgICAgICAgICAgcmVwTGVuc1tyZXBdID0gbHouZ2V0TWF0Y2hMZW4ocmVwc1tyZXBdLCBhdmFpbCk7CisKKyAgICAgICAgICAgIGlmIChyZXBMZW5zW3JlcF0gPCBNQVRDSF9MRU5fTUlOKSB7CisgICAgICAgICAgICAgICAgcmVwTGVuc1tyZXBdID0gMDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlcExlbnNbcmVwXSA+IHJlcExlbnNbcmVwQmVzdF0pCisgICAgICAgICAgICAgICAgcmVwQmVzdCA9IHJlcDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiBpZiB0aGUgYmVzdCByZXBlYXRlZCBtYXRjaCBpcyBhdCBsZWFzdCBuaWNlTGVuIGJ5dGVzIGxvbmcuCisgICAgICAgIGlmIChyZXBMZW5zW3JlcEJlc3RdID49IG5pY2VMZW4pIHsKKyAgICAgICAgICAgIGJhY2sgPSByZXBCZXN0OworICAgICAgICAgICAgc2tpcChyZXBMZW5zW3JlcEJlc3RdIC0gMSk7CisgICAgICAgICAgICByZXR1cm4gcmVwTGVuc1tyZXBCZXN0XTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluaXRpYWxpemUgbWFpbkxlbiBhbmQgbWFpbkRpc3QgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggZm91bmQKKyAgICAgICAgLy8gYnkgdGhlIG1hdGNoIGZpbmRlci4KKyAgICAgICAgaW50IG1haW5MZW4gPSAwOworICAgICAgICBpbnQgbWFpbkRpc3QgPSAwOworICAgICAgICBpZiAobWF0Y2hlcy5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1haW5MZW4gPSBtYXRjaGVzLmxlblttYXRjaGVzLmNvdW50IC0gMV07CisgICAgICAgICAgICBtYWluRGlzdCA9IG1hdGNoZXMuZGlzdFttYXRjaGVzLmNvdW50IC0gMV07CisKKyAgICAgICAgICAgIC8vIFJldHVybiBpZiBpdCBpcyBhdCBsZWFzdCBuaWNlTGVuIGJ5dGVzIGxvbmcuCisgICAgICAgICAgICBpZiAobWFpbkxlbiA+PSBuaWNlTGVuKSB7CisgICAgICAgICAgICAgICAgYmFjayA9IG1haW5EaXN0ICsgUkVQUzsKKyAgICAgICAgICAgICAgICBza2lwKG1haW5MZW4gLSAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFpbkxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBjdXJCeXRlID0gbHouZ2V0Qnl0ZSgwKTsKKyAgICAgICAgaW50IG1hdGNoQnl0ZSA9IGx6LmdldEJ5dGUocmVwc1swXSArIDEpOworCisgICAgICAgIC8vIElmIHRoZSBtYXRjaCBmaW5kZXIgZm91bmQgbm8gbWF0Y2hlcyBhbmQgdGhpcyBieXRlIGNhbm5vdCBiZQorICAgICAgICAvLyBlbmNvZGVkIGFzIGEgcmVwZWF0ZWQgbWF0Y2ggKHNob3J0IG9yIGxvbmcpLCB3ZSBtdXN0IGJlIHJldHVybgorICAgICAgICAvLyB0byBoYXZlIHRoZSBieXRlIGVuY29kZWQgYXMgYSBsaXRlcmFsLgorICAgICAgICBpZiAobWFpbkxlbiA8IE1BVENIX0xFTl9NSU4gJiYgY3VyQnl0ZSAhPSBtYXRjaEJ5dGUKKyAgICAgICAgICAgICAgICAmJiByZXBMZW5zW3JlcEJlc3RdIDwgTUFUQ0hfTEVOX01JTikKKyAgICAgICAgICAgIHJldHVybiAxOworCisKKyAgICAgICAgaW50IHBvcyA9IGx6LmdldFBvcygpOworICAgICAgICBpbnQgcG9zU3RhdGUgPSBwb3MgJiBwb3NNYXNrOworCisgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgcHJpY2Ugb2YgZW5jb2RpbmcgdGhlIGN1cnJlbnQgYnl0ZSBhcyBhIGxpdGVyYWwuCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwcmV2Qnl0ZSA9IGx6LmdldEJ5dGUoMSk7CisgICAgICAgICAgICBpbnQgbGl0ZXJhbFByaWNlID0gbGl0ZXJhbEVuY29kZXIuZ2V0UHJpY2UoY3VyQnl0ZSwgbWF0Y2hCeXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZCeXRlLCBwb3MsIHN0YXRlKTsKKyAgICAgICAgICAgIG9wdHNbMV0uc2V0MShsaXRlcmFsUHJpY2UsIDAsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBhbnlNYXRjaFByaWNlID0gZ2V0QW55TWF0Y2hQcmljZShzdGF0ZSwgcG9zU3RhdGUpOworICAgICAgICBpbnQgYW55UmVwUHJpY2UgPSBnZXRBbnlSZXBQcmljZShhbnlNYXRjaFByaWNlLCBzdGF0ZSk7CisKKyAgICAgICAgLy8gSWYgaXQgaXMgcG9zc2libGUgdG8gZW5jb2RlIHRoaXMgYnl0ZSBhcyBhIHNob3J0IHJlcCwgc2VlIGlmCisgICAgICAgIC8vIGl0IGlzIGNoZWFwZXIgdGhhbiBlbmNvZGluZyBpdCBhcyBhIGxpdGVyYWwuCisgICAgICAgIGlmIChtYXRjaEJ5dGUgPT0gY3VyQnl0ZSkgeworICAgICAgICAgICAgaW50IHNob3J0UmVwUHJpY2UgPSBnZXRTaG9ydFJlcFByaWNlKGFueVJlcFByaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCBwb3NTdGF0ZSk7CisgICAgICAgICAgICBpZiAoc2hvcnRSZXBQcmljZSA8IG9wdHNbMV0ucHJpY2UpCisgICAgICAgICAgICAgICAgb3B0c1sxXS5zZXQxKHNob3J0UmVwUHJpY2UsIDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIGlmIHRoZXJlIGlzIG5laXRoZXIgbm9ybWFsIG5vciBsb25nIHJlcGVhdGVkIG1hdGNoLiBVc2UKKyAgICAgICAgLy8gYSBzaG9ydCBtYXRjaCBpbnN0ZWFkIG9mIGEgbGl0ZXJhbCBpZiBpcyBpcyBwb3NzaWJsZSBhbmQgY2hlYXBlci4KKyAgICAgICAgb3B0RW5kID0gTWF0aC5tYXgobWFpbkxlbiwgcmVwTGVuc1tyZXBCZXN0XSk7CisgICAgICAgIGlmIChvcHRFbmQgPCBNQVRDSF9MRU5fTUlOKSB7CisgICAgICAgICAgICBhc3NlcnQgb3B0RW5kID09IDAgOiBvcHRFbmQ7CisgICAgICAgICAgICBiYWNrID0gb3B0c1sxXS5iYWNrUHJldjsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKworICAgICAgICAvLyBVcGRhdGUgdGhlIGxvb2t1cCB0YWJsZXMgZm9yIGRpc3RhbmNlcyBhbmQgbGVuZ3RocyBiZWZvcmUgdXNpbmcKKyAgICAgICAgLy8gdGhvc2UgcHJpY2UgY2FsY3VsYXRpb24gZnVuY3Rpb25zLiAoVGhlIHByaWNlIGZ1bmN0aW9uIGFib3ZlCisgICAgICAgIC8vIGRvbid0IG5lZWQgdGhlc2UgdGFibGVzLikKKyAgICAgICAgdXBkYXRlUHJpY2VzKCk7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RhdGUgYW5kIHJlcHMgb2YgdGhpcyBwb3NpdGlvbiBpbiBvcHRzW10uCisgICAgICAgIC8vIHVwZGF0ZU9wdFN0YXRlQW5kUmVwcygpIHdpbGwgbmVlZCB0aGVzZSB0byBnZXQgdGhlIG5ldworICAgICAgICAvLyBzdGF0ZSBhbmQgcmVwcyBmb3IgdGhlIG5leHQgYnl0ZS4KKyAgICAgICAgb3B0c1swXS5zdGF0ZS5zZXQoc3RhdGUpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlcHMsIDAsIG9wdHNbMF0ucmVwcywgMCwgUkVQUyk7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcHJpY2VzIGZvciBsYXR0ZXIgb3B0cyB0aGF0IHdpbGwgYmUgdXNlZCBiZWxvdy4KKyAgICAgICAgZm9yIChpbnQgaSA9IG9wdEVuZDsgaSA+PSBNQVRDSF9MRU5fTUlOOyAtLWkpCisgICAgICAgICAgICBvcHRzW2ldLnJlc2V0KCk7CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBwcmljZXMgb2YgcmVwZWF0ZWQgbWF0Y2hlcyBvZiBhbGwgbGVuZ3Rocy4KKyAgICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgUkVQUzsgKytyZXApIHsKKyAgICAgICAgICAgIGludCByZXBMZW4gPSByZXBMZW5zW3JlcF07CisgICAgICAgICAgICBpZiAocmVwTGVuIDwgTUFUQ0hfTEVOX01JTikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaW50IGxvbmdSZXBQcmljZSA9IGdldExvbmdSZXBQcmljZShhbnlSZXBQcmljZSwgcmVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgcG9zU3RhdGUpOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBwcmljZSA9IGxvbmdSZXBQcmljZSArIHJlcExlbkVuY29kZXIuZ2V0UHJpY2UocmVwTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zU3RhdGUpOworICAgICAgICAgICAgICAgIGlmIChwcmljZSA8IG9wdHNbcmVwTGVuXS5wcmljZSkKKyAgICAgICAgICAgICAgICAgICAgb3B0c1tyZXBMZW5dLnNldDEocHJpY2UsIDAsIHJlcCk7CisgICAgICAgICAgICB9IHdoaWxlICgtLXJlcExlbiA+PSBNQVRDSF9MRU5fTUlOKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgcHJpY2VzIG9mIG5vcm1hbCBtYXRjaGVzIHRoYXQgYXJlIGxvbmdlciB0aGFuIHJlcDAuCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBNYXRoLm1heChyZXBMZW5zWzBdICsgMSwgTUFUQ0hfTEVOX01JTik7CisgICAgICAgICAgICBpZiAobGVuIDw9IG1haW5MZW4pIHsKKyAgICAgICAgICAgICAgICBpbnQgbm9ybWFsTWF0Y2hQcmljZSA9IGdldE5vcm1hbE1hdGNoUHJpY2UoYW55TWF0Y2hQcmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOworCisgICAgICAgICAgICAgICAgLy8gU2V0IGkgdG8gdGhlIGluZGV4IG9mIHRoZSBzaG9ydGVzdCBtYXRjaCB0aGF0IGlzCisgICAgICAgICAgICAgICAgLy8gYXQgbGVhc3QgbGVuIGJ5dGVzIGxvbmcuCisgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChsZW4gPiBtYXRjaGVzLmxlbltpXSkKKyAgICAgICAgICAgICAgICAgICAgKytpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpc3QgPSBtYXRjaGVzLmRpc3RbaV07CisgICAgICAgICAgICAgICAgICAgIGludCBwcmljZSA9IGdldE1hdGNoQW5kTGVuUHJpY2Uobm9ybWFsTWF0Y2hQcmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0LCBsZW4sIHBvc1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByaWNlIDwgb3B0c1tsZW5dLnByaWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0c1tsZW5dLnNldDEocHJpY2UsIDAsIGRpc3QgKyBSRVBTKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobGVuID09IG1hdGNoZXMubGVuW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsraSA9PSBtYXRjaGVzLmNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICsrbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgYXZhaWwgPSBNYXRoLm1pbihsei5nZXRBdmFpbCgpLCBPUFRTIC0gMSk7CisKKyAgICAgICAgLy8gR2V0IG1hdGNoZXMgZm9yIGxhdGVyIGJ5dGVzIGFuZCBvcHRpbWl6ZSB0aGUgdXNlIG9mIExaTUEgc3ltYm9scworICAgICAgICAvLyBieSBjYWxjdWxhdGluZyB0aGUgcHJpY2VzIGFuZCBwaWNraW5nIHRoZSBjaGVhcGVzdCBzeW1ib2wKKyAgICAgICAgLy8gY29tYmluYXRpb25zLgorICAgICAgICB3aGlsZSAoKytvcHRDdXIgPCBvcHRFbmQpIHsKKyAgICAgICAgICAgIG1hdGNoZXMgPSBnZXRNYXRjaGVzKCk7CisgICAgICAgICAgICBpZiAobWF0Y2hlcy5jb3VudCA+IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgbWF0Y2hlcy5sZW5bbWF0Y2hlcy5jb3VudCAtIDFdID49IG5pY2VMZW4pCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC0tYXZhaWw7CisgICAgICAgICAgICArK3BvczsKKyAgICAgICAgICAgIHBvc1N0YXRlID0gcG9zICYgcG9zTWFzazsKKworICAgICAgICAgICAgdXBkYXRlT3B0U3RhdGVBbmRSZXBzKCk7CisgICAgICAgICAgICBhbnlNYXRjaFByaWNlID0gb3B0c1tvcHRDdXJdLnByaWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRBbnlNYXRjaFByaWNlKG9wdHNbb3B0Q3VyXS5zdGF0ZSwgcG9zU3RhdGUpOworICAgICAgICAgICAgYW55UmVwUHJpY2UgPSBnZXRBbnlSZXBQcmljZShhbnlNYXRjaFByaWNlLCBvcHRzW29wdEN1cl0uc3RhdGUpOworCisgICAgICAgICAgICBjYWxjMUJ5dGVQcmljZXMocG9zLCBwb3NTdGF0ZSwgYXZhaWwsIGFueVJlcFByaWNlKTsKKworICAgICAgICAgICAgaWYgKGF2YWlsID49IE1BVENIX0xFTl9NSU4pIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRMZW4gPSBjYWxjTG9uZ1JlcFByaWNlcyhwb3MsIHBvc1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsLCBhbnlSZXBQcmljZSk7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMuY291bnQgPiAwKQorICAgICAgICAgICAgICAgICAgICBjYWxjTm9ybWFsTWF0Y2hQcmljZXMocG9zLCBwb3NTdGF0ZSwgYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnlNYXRjaFByaWNlLCBzdGFydExlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY29udmVydE9wdHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSBzdGF0ZSBhbmQgcmVwcyBmb3IgdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgb3B0cyBhcnJheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlT3B0U3RhdGVBbmRSZXBzKCkgeworICAgICAgICBpbnQgb3B0UHJldiA9IG9wdHNbb3B0Q3VyXS5vcHRQcmV2OworICAgICAgICBhc3NlcnQgb3B0UHJldiA8IG9wdEN1cjsKKworICAgICAgICBpZiAob3B0c1tvcHRDdXJdLnByZXYxSXNMaXRlcmFsKSB7CisgICAgICAgICAgICAtLW9wdFByZXY7CisKKyAgICAgICAgICAgIGlmIChvcHRzW29wdEN1cl0uaGFzUHJldjIpIHsKKyAgICAgICAgICAgICAgICBvcHRzW29wdEN1cl0uc3RhdGUuc2V0KG9wdHNbb3B0c1tvcHRDdXJdLm9wdFByZXYyXS5zdGF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKG9wdHNbb3B0Q3VyXS5iYWNrUHJldjIgPCBSRVBTKQorICAgICAgICAgICAgICAgICAgICBvcHRzW29wdEN1cl0uc3RhdGUudXBkYXRlTG9uZ1JlcCgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb3B0c1tvcHRDdXJdLnN0YXRlLnVwZGF0ZU1hdGNoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9wdHNbb3B0Q3VyXS5zdGF0ZS5zZXQob3B0c1tvcHRQcmV2XS5zdGF0ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9wdHNbb3B0Q3VyXS5zdGF0ZS51cGRhdGVMaXRlcmFsKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcHRzW29wdEN1cl0uc3RhdGUuc2V0KG9wdHNbb3B0UHJldl0uc3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdFByZXYgPT0gb3B0Q3VyIC0gMSkgeworICAgICAgICAgICAgLy8gTXVzdCBiZSBlaXRoZXIgYSBzaG9ydCByZXAgb3IgYSBsaXRlcmFsLgorICAgICAgICAgICAgYXNzZXJ0IG9wdHNbb3B0Q3VyXS5iYWNrUHJldiA9PSAwIHx8IG9wdHNbb3B0Q3VyXS5iYWNrUHJldiA9PSAtMTsKKworICAgICAgICAgICAgaWYgKG9wdHNbb3B0Q3VyXS5iYWNrUHJldiA9PSAwKQorICAgICAgICAgICAgICAgIG9wdHNbb3B0Q3VyXS5zdGF0ZS51cGRhdGVTaG9ydFJlcCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9wdHNbb3B0Q3VyXS5zdGF0ZS51cGRhdGVMaXRlcmFsKCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3B0c1tvcHRQcmV2XS5yZXBzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzW29wdEN1cl0ucmVwcywgMCwgUkVQUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgYmFjazsKKyAgICAgICAgICAgIGlmIChvcHRzW29wdEN1cl0ucHJldjFJc0xpdGVyYWwgJiYgb3B0c1tvcHRDdXJdLmhhc1ByZXYyKSB7CisgICAgICAgICAgICAgICAgb3B0UHJldiA9IG9wdHNbb3B0Q3VyXS5vcHRQcmV2MjsKKyAgICAgICAgICAgICAgICBiYWNrID0gb3B0c1tvcHRDdXJdLmJhY2tQcmV2MjsKKyAgICAgICAgICAgICAgICBvcHRzW29wdEN1cl0uc3RhdGUudXBkYXRlTG9uZ1JlcCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiYWNrID0gb3B0c1tvcHRDdXJdLmJhY2tQcmV2OworICAgICAgICAgICAgICAgIGlmIChiYWNrIDwgUkVQUykKKyAgICAgICAgICAgICAgICAgICAgb3B0c1tvcHRDdXJdLnN0YXRlLnVwZGF0ZUxvbmdSZXAoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG9wdHNbb3B0Q3VyXS5zdGF0ZS51cGRhdGVNYXRjaCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYmFjayA8IFJFUFMpIHsKKyAgICAgICAgICAgICAgICBvcHRzW29wdEN1cl0ucmVwc1swXSA9IG9wdHNbb3B0UHJldl0ucmVwc1tiYWNrXTsKKworICAgICAgICAgICAgICAgIGludCByZXA7CisgICAgICAgICAgICAgICAgZm9yIChyZXAgPSAxOyByZXAgPD0gYmFjazsgKytyZXApCisgICAgICAgICAgICAgICAgICAgIG9wdHNbb3B0Q3VyXS5yZXBzW3JlcF0gPSBvcHRzW29wdFByZXZdLnJlcHNbcmVwIC0gMV07CisKKyAgICAgICAgICAgICAgICBmb3IgKDsgcmVwIDwgUkVQUzsgKytyZXApCisgICAgICAgICAgICAgICAgICAgIG9wdHNbb3B0Q3VyXS5yZXBzW3JlcF0gPSBvcHRzW29wdFByZXZdLnJlcHNbcmVwXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3B0c1tvcHRDdXJdLnJlcHNbMF0gPSBiYWNrIC0gUkVQUzsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9wdHNbb3B0UHJldl0ucmVwcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHNbb3B0Q3VyXS5yZXBzLCAxLCBSRVBTIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGVzIHByaWNlcyBvZiBhIGxpdGVyYWwsIGEgc2hvcnQgcmVwLCBhbmQgbGl0ZXJhbCArIHJlcDAuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNhbGMxQnl0ZVByaWNlcyhpbnQgcG9zLCBpbnQgcG9zU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXZhaWwsIGludCBhbnlSZXBQcmljZSkgeworICAgICAgICAvLyBUaGlzIHdpbGwgYmUgc2V0IHRvIHRydWUgaWYgdXNpbmcgYSBsaXRlcmFsIG9yIGEgc2hvcnQgcmVwLgorICAgICAgICBib29sZWFuIG5leHRJc0J5dGUgPSBmYWxzZTsKKworICAgICAgICBpbnQgY3VyQnl0ZSA9IGx6LmdldEJ5dGUoMCk7CisgICAgICAgIGludCBtYXRjaEJ5dGUgPSBsei5nZXRCeXRlKG9wdHNbb3B0Q3VyXS5yZXBzWzBdICsgMSk7CisKKyAgICAgICAgLy8gVHJ5IGEgbGl0ZXJhbC4KKyAgICAgICAgaW50IGxpdGVyYWxQcmljZSA9IG9wdHNbb3B0Q3VyXS5wcmljZQorICAgICAgICAgICAgICAgICsgbGl0ZXJhbEVuY29kZXIuZ2V0UHJpY2UoY3VyQnl0ZSwgbWF0Y2hCeXRlLCBsei5nZXRCeXRlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLCBvcHRzW29wdEN1cl0uc3RhdGUpOworICAgICAgICBpZiAobGl0ZXJhbFByaWNlIDwgb3B0c1tvcHRDdXIgKyAxXS5wcmljZSkgeworICAgICAgICAgICAgb3B0c1tvcHRDdXIgKyAxXS5zZXQxKGxpdGVyYWxQcmljZSwgb3B0Q3VyLCAtMSk7CisgICAgICAgICAgICBuZXh0SXNCeXRlID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyeSBhIHNob3J0IHJlcC4KKyAgICAgICAgaWYgKG1hdGNoQnl0ZSA9PSBjdXJCeXRlICYmIChvcHRzW29wdEN1ciArIDFdLm9wdFByZXYgPT0gb3B0Q3VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9wdHNbb3B0Q3VyICsgMV0uYmFja1ByZXYgIT0gMCkpIHsKKyAgICAgICAgICAgIGludCBzaG9ydFJlcFByaWNlID0gZ2V0U2hvcnRSZXBQcmljZShhbnlSZXBQcmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzW29wdEN1cl0uc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zU3RhdGUpOworICAgICAgICAgICAgaWYgKHNob3J0UmVwUHJpY2UgPD0gb3B0c1tvcHRDdXIgKyAxXS5wcmljZSkgeworICAgICAgICAgICAgICAgIG9wdHNbb3B0Q3VyICsgMV0uc2V0MShzaG9ydFJlcFByaWNlLCBvcHRDdXIsIDApOworICAgICAgICAgICAgICAgIG5leHRJc0J5dGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgbmVpdGhlciBhIGxpdGVyYWwgbm9yIGEgc2hvcnQgcmVwIHdhcyB0aGUgY2hlYXBlc3QgY2hvaWNlLAorICAgICAgICAvLyB0cnkgbGl0ZXJhbCArIGxvbmcgcmVwMC4KKyAgICAgICAgaWYgKCFuZXh0SXNCeXRlICYmIG1hdGNoQnl0ZSAhPSBjdXJCeXRlICYmIGF2YWlsID4gTUFUQ0hfTEVOX01JTikgeworICAgICAgICAgICAgaW50IGxlbkxpbWl0ID0gTWF0aC5taW4obmljZUxlbiwgYXZhaWwgLSAxKTsKKyAgICAgICAgICAgIGludCBsZW4gPSBsei5nZXRNYXRjaExlbigxLCBvcHRzW29wdEN1cl0ucmVwc1swXSwgbGVuTGltaXQpOworCisgICAgICAgICAgICBpZiAobGVuID49IE1BVENIX0xFTl9NSU4pIHsKKyAgICAgICAgICAgICAgICBuZXh0U3RhdGUuc2V0KG9wdHNbb3B0Q3VyXS5zdGF0ZSk7CisgICAgICAgICAgICAgICAgbmV4dFN0YXRlLnVwZGF0ZUxpdGVyYWwoKTsKKyAgICAgICAgICAgICAgICBpbnQgbmV4dFBvc1N0YXRlID0gKHBvcyArIDEpICYgcG9zTWFzazsKKyAgICAgICAgICAgICAgICBpbnQgcHJpY2UgPSBsaXRlcmFsUHJpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldExvbmdSZXBBbmRMZW5QcmljZSgwLCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlLCBuZXh0UG9zU3RhdGUpOworCisgICAgICAgICAgICAgICAgaW50IGkgPSBvcHRDdXIgKyAxICsgbGVuOworICAgICAgICAgICAgICAgIHdoaWxlIChvcHRFbmQgPCBpKQorICAgICAgICAgICAgICAgICAgICBvcHRzWysrb3B0RW5kXS5yZXNldCgpOworCisgICAgICAgICAgICAgICAgaWYgKHByaWNlIDwgb3B0c1tpXS5wcmljZSkKKyAgICAgICAgICAgICAgICAgICAgb3B0c1tpXS5zZXQyKHByaWNlLCBvcHRDdXIsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlcyBwcmljZXMgb2YgbG9uZyByZXAgYW5kIGxvbmcgcmVwICsgbGl0ZXJhbCArIHJlcDAuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY2FsY0xvbmdSZXBQcmljZXMoaW50IHBvcywgaW50IHBvc1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdmFpbCwgaW50IGFueVJlcFByaWNlKSB7CisgICAgICAgIGludCBzdGFydExlbiA9IE1BVENIX0xFTl9NSU47CisgICAgICAgIGludCBsZW5MaW1pdCA9IE1hdGgubWluKGF2YWlsLCBuaWNlTGVuKTsKKworICAgICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCBSRVBTOyArK3JlcCkgeworICAgICAgICAgICAgaW50IGxlbiA9IGx6LmdldE1hdGNoTGVuKG9wdHNbb3B0Q3VyXS5yZXBzW3JlcF0sIGxlbkxpbWl0KTsKKyAgICAgICAgICAgIGlmIChsZW4gPCBNQVRDSF9MRU5fTUlOKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICB3aGlsZSAob3B0RW5kIDwgb3B0Q3VyICsgbGVuKQorICAgICAgICAgICAgICAgIG9wdHNbKytvcHRFbmRdLnJlc2V0KCk7CisKKyAgICAgICAgICAgIGludCBsb25nUmVwUHJpY2UgPSBnZXRMb25nUmVwUHJpY2UoYW55UmVwUHJpY2UsIHJlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0c1tvcHRDdXJdLnN0YXRlLCBwb3NTdGF0ZSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBsZW47IGkgPj0gTUFUQ0hfTEVOX01JTjsgLS1pKSB7CisgICAgICAgICAgICAgICAgaW50IHByaWNlID0gbG9uZ1JlcFByaWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXBMZW5FbmNvZGVyLmdldFByaWNlKGksIHBvc1N0YXRlKTsKKyAgICAgICAgICAgICAgICBpZiAocHJpY2UgPCBvcHRzW29wdEN1ciArIGldLnByaWNlKQorICAgICAgICAgICAgICAgICAgICBvcHRzW29wdEN1ciArIGldLnNldDEocHJpY2UsIG9wdEN1ciwgcmVwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlcCA9PSAwKQorICAgICAgICAgICAgICAgIHN0YXJ0TGVuID0gbGVuICsgMTsKKworICAgICAgICAgICAgaW50IGxlbjJMaW1pdCA9IE1hdGgubWluKG5pY2VMZW4sIGF2YWlsIC0gbGVuIC0gMSk7CisgICAgICAgICAgICBpbnQgbGVuMiA9IGx6LmdldE1hdGNoTGVuKGxlbiArIDEsIG9wdHNbb3B0Q3VyXS5yZXBzW3JlcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjJMaW1pdCk7CisKKyAgICAgICAgICAgIGlmIChsZW4yID49IE1BVENIX0xFTl9NSU4pIHsKKyAgICAgICAgICAgICAgICAvLyBSZXAKKyAgICAgICAgICAgICAgICBpbnQgcHJpY2UgPSBsb25nUmVwUHJpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlcExlbkVuY29kZXIuZ2V0UHJpY2UobGVuLCBwb3NTdGF0ZSk7CisgICAgICAgICAgICAgICAgbmV4dFN0YXRlLnNldChvcHRzW29wdEN1cl0uc3RhdGUpOworICAgICAgICAgICAgICAgIG5leHRTdGF0ZS51cGRhdGVMb25nUmVwKCk7CisKKyAgICAgICAgICAgICAgICAvLyBMaXRlcmFsCisgICAgICAgICAgICAgICAgaW50IGN1ckJ5dGUgPSBsei5nZXRCeXRlKGxlbiwgMCk7CisgICAgICAgICAgICAgICAgaW50IG1hdGNoQnl0ZSA9IGx6LmdldEJ5dGUoMCk7IC8vIGx6LmdldEJ5dGUobGVuLCBsZW4pCisgICAgICAgICAgICAgICAgaW50IHByZXZCeXRlID0gbHouZ2V0Qnl0ZShsZW4sIDEpOworICAgICAgICAgICAgICAgIHByaWNlICs9IGxpdGVyYWxFbmNvZGVyLmdldFByaWNlKGN1ckJ5dGUsIG1hdGNoQnl0ZSwgcHJldkJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICsgbGVuLCBuZXh0U3RhdGUpOworICAgICAgICAgICAgICAgIG5leHRTdGF0ZS51cGRhdGVMaXRlcmFsKCk7CisKKyAgICAgICAgICAgICAgICAvLyBSZXAwCisgICAgICAgICAgICAgICAgaW50IG5leHRQb3NTdGF0ZSA9IChwb3MgKyBsZW4gKyAxKSAmIHBvc01hc2s7CisgICAgICAgICAgICAgICAgcHJpY2UgKz0gZ2V0TG9uZ1JlcEFuZExlblByaWNlKDAsIGxlbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZSwgbmV4dFBvc1N0YXRlKTsKKworICAgICAgICAgICAgICAgIGludCBpID0gb3B0Q3VyICsgbGVuICsgMSArIGxlbjI7CisgICAgICAgICAgICAgICAgd2hpbGUgKG9wdEVuZCA8IGkpCisgICAgICAgICAgICAgICAgICAgIG9wdHNbKytvcHRFbmRdLnJlc2V0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAocHJpY2UgPCBvcHRzW2ldLnByaWNlKQorICAgICAgICAgICAgICAgICAgICBvcHRzW2ldLnNldDMocHJpY2UsIG9wdEN1ciwgcmVwLCBsZW4sIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0YXJ0TGVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZXMgcHJpY2VzIG9mIGEgbm9ybWFsIG1hdGNoIGFuZCBub3JtYWwgbWF0Y2ggKyBsaXRlcmFsICsgcmVwMC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2FsY05vcm1hbE1hdGNoUHJpY2VzKGludCBwb3MsIGludCBwb3NTdGF0ZSwgaW50IGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFueU1hdGNoUHJpY2UsIGludCBzdGFydExlbikgeworICAgICAgICAvLyBJZiB0aGUgbG9uZ2VzdCBtYXRjaCBpcyBzbyBsb25nIHRoYXQgaXQgd291bGQgbm90IGZpdCBpbnRvCisgICAgICAgIC8vIHRoZSBvcHRzIGFycmF5LCBzaG9ydGVuIHRoZSBtYXRjaGVzLgorICAgICAgICBpZiAobWF0Y2hlcy5sZW5bbWF0Y2hlcy5jb3VudCAtIDFdID4gYXZhaWwpIHsKKyAgICAgICAgICAgIG1hdGNoZXMuY291bnQgPSAwOworICAgICAgICAgICAgd2hpbGUgKG1hdGNoZXMubGVuW21hdGNoZXMuY291bnRdIDwgYXZhaWwpCisgICAgICAgICAgICAgICAgKyttYXRjaGVzLmNvdW50OworCisgICAgICAgICAgICBtYXRjaGVzLmxlblttYXRjaGVzLmNvdW50KytdID0gYXZhaWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF0Y2hlcy5sZW5bbWF0Y2hlcy5jb3VudCAtIDFdIDwgc3RhcnRMZW4pCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgd2hpbGUgKG9wdEVuZCA8IG9wdEN1ciArIG1hdGNoZXMubGVuW21hdGNoZXMuY291bnQgLSAxXSkKKyAgICAgICAgICAgIG9wdHNbKytvcHRFbmRdLnJlc2V0KCk7CisKKyAgICAgICAgaW50IG5vcm1hbE1hdGNoUHJpY2UgPSBnZXROb3JtYWxNYXRjaFByaWNlKGFueU1hdGNoUHJpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzW29wdEN1cl0uc3RhdGUpOworCisgICAgICAgIGludCBtYXRjaCA9IDA7CisgICAgICAgIHdoaWxlIChzdGFydExlbiA+IG1hdGNoZXMubGVuW21hdGNoXSkKKyAgICAgICAgICAgICsrbWF0Y2g7CisKKyAgICAgICAgZm9yIChpbnQgbGVuID0gc3RhcnRMZW47IDsgKytsZW4pIHsKKyAgICAgICAgICAgIGludCBkaXN0ID0gbWF0Y2hlcy5kaXN0W21hdGNoXTsKKworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBwcmljZSBvZiBhIG1hdGNoIG9mIGxlbiBieXRlcyBmcm9tIHRoZSBuZWFyZXN0CisgICAgICAgICAgICAvLyBwb3NzaWJsZSBkaXN0YW5jZS4KKyAgICAgICAgICAgIGludCBtYXRjaEFuZExlblByaWNlID0gZ2V0TWF0Y2hBbmRMZW5QcmljZShub3JtYWxNYXRjaFByaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QsIGxlbiwgcG9zU3RhdGUpOworICAgICAgICAgICAgaWYgKG1hdGNoQW5kTGVuUHJpY2UgPCBvcHRzW29wdEN1ciArIGxlbl0ucHJpY2UpCisgICAgICAgICAgICAgICAgb3B0c1tvcHRDdXIgKyBsZW5dLnNldDEobWF0Y2hBbmRMZW5QcmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRDdXIsIGRpc3QgKyBSRVBTKTsKKworICAgICAgICAgICAgaWYgKGxlbiAhPSBtYXRjaGVzLmxlblttYXRjaF0pCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIFRyeSBtYXRjaCArIGxpdGVyYWwgKyByZXAwLiBGaXJzdCBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgcmVwMC4KKyAgICAgICAgICAgIGludCBsZW4yTGltaXQgPSBNYXRoLm1pbihuaWNlTGVuLCBhdmFpbCAtIGxlbiAtIDEpOworICAgICAgICAgICAgaW50IGxlbjIgPSBsei5nZXRNYXRjaExlbihsZW4gKyAxLCBkaXN0LCBsZW4yTGltaXQpOworCisgICAgICAgICAgICBpZiAobGVuMiA+PSBNQVRDSF9MRU5fTUlOKSB7CisgICAgICAgICAgICAgICAgbmV4dFN0YXRlLnNldChvcHRzW29wdEN1cl0uc3RhdGUpOworICAgICAgICAgICAgICAgIG5leHRTdGF0ZS51cGRhdGVNYXRjaCgpOworCisgICAgICAgICAgICAgICAgLy8gTGl0ZXJhbAorICAgICAgICAgICAgICAgIGludCBjdXJCeXRlID0gbHouZ2V0Qnl0ZShsZW4sIDApOworICAgICAgICAgICAgICAgIGludCBtYXRjaEJ5dGUgPSBsei5nZXRCeXRlKDApOyAvLyBsei5nZXRCeXRlKGxlbiwgbGVuKQorICAgICAgICAgICAgICAgIGludCBwcmV2Qnl0ZSA9IGx6LmdldEJ5dGUobGVuLCAxKTsKKyAgICAgICAgICAgICAgICBpbnQgcHJpY2UgPSBtYXRjaEFuZExlblByaWNlCisgICAgICAgICAgICAgICAgICAgICAgICArIGxpdGVyYWxFbmNvZGVyLmdldFByaWNlKGN1ckJ5dGUsIG1hdGNoQnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkJ5dGUsIHBvcyArIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlKTsKKyAgICAgICAgICAgICAgICBuZXh0U3RhdGUudXBkYXRlTGl0ZXJhbCgpOworCisgICAgICAgICAgICAgICAgLy8gUmVwMAorICAgICAgICAgICAgICAgIGludCBuZXh0UG9zU3RhdGUgPSAocG9zICsgbGVuICsgMSkgJiBwb3NNYXNrOworICAgICAgICAgICAgICAgIHByaWNlICs9IGdldExvbmdSZXBBbmRMZW5QcmljZSgwLCBsZW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RhdGUsIG5leHRQb3NTdGF0ZSk7CisKKyAgICAgICAgICAgICAgICBpbnQgaSA9IG9wdEN1ciArIGxlbiArIDEgKyBsZW4yOworICAgICAgICAgICAgICAgIHdoaWxlIChvcHRFbmQgPCBpKQorICAgICAgICAgICAgICAgICAgICBvcHRzWysrb3B0RW5kXS5yZXNldCgpOworCisgICAgICAgICAgICAgICAgaWYgKHByaWNlIDwgb3B0c1tpXS5wcmljZSkKKyAgICAgICAgICAgICAgICAgICAgb3B0c1tpXS5zZXQzKHByaWNlLCBvcHRDdXIsIGRpc3QgKyBSRVBTLCBsZW4sIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKyttYXRjaCA9PSBtYXRjaGVzLmNvdW50KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6bWEvT3B0aW11bS5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6bWEvT3B0aW11bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NWFjOTcKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovbHptYS9PcHRpbXVtLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIE9wdGltdW0KKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHoubHptYTsKKworZmluYWwgY2xhc3MgT3B0aW11bSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElORklOSVRZX1BSSUNFID0gMSA8PCAzMDsKKworICAgIGZpbmFsIFN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCk7CisgICAgZmluYWwgaW50W10gcmVwcyA9IG5ldyBpbnRbTFpNQUNvZGVyLlJFUFNdOworCisgICAgLyoqCisgICAgICogQ3VtdWxhdGl2ZSBwcmljZSBvZiBhcnJpdmluZyB0byB0aGlzIGJ5dGUuCisgICAgICovCisgICAgaW50IHByaWNlOworCisgICAgaW50IG9wdFByZXY7CisgICAgaW50IGJhY2tQcmV2OworICAgIGJvb2xlYW4gcHJldjFJc0xpdGVyYWw7CisKKyAgICBib29sZWFuIGhhc1ByZXYyOworICAgIGludCBvcHRQcmV2MjsKKyAgICBpbnQgYmFja1ByZXYyOworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBwcmljZS4KKyAgICAgKi8KKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBwcmljZSA9IElORklOSVRZX1BSSUNFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdG8gaW5kaWNhdGUgb25lIExaTUEgc3ltYm9sIChsaXRlcmFsLCByZXAsIG9yIG1hdGNoKS4KKyAgICAgKi8KKyAgICB2b2lkIHNldDEoaW50IG5ld1ByaWNlLCBpbnQgb3B0Q3VyLCBpbnQgYmFjaykgeworICAgICAgICBwcmljZSA9IG5ld1ByaWNlOworICAgICAgICBvcHRQcmV2ID0gb3B0Q3VyOworICAgICAgICBiYWNrUHJldiA9IGJhY2s7CisgICAgICAgIHByZXYxSXNMaXRlcmFsID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0byBpbmRpY2F0ZSB0d28gTFpNQSBzeW1ib2xzIG9mIHdoaWNoIHRoZSBmaXJzdCBvbmUgaXMgYSBsaXRlcmFsLgorICAgICAqLworICAgIHZvaWQgc2V0MihpbnQgbmV3UHJpY2UsIGludCBvcHRDdXIsIGludCBiYWNrKSB7CisgICAgICAgIHByaWNlID0gbmV3UHJpY2U7CisgICAgICAgIG9wdFByZXYgPSBvcHRDdXIgKyAxOworICAgICAgICBiYWNrUHJldiA9IGJhY2s7CisgICAgICAgIHByZXYxSXNMaXRlcmFsID0gdHJ1ZTsKKyAgICAgICAgaGFzUHJldjIgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRvIGluZGljYXRlIHRocmVlIExaTUEgc3ltYm9scyBvZiB3aGljaCB0aGUgc2Vjb25kIG9uZQorICAgICAqIGlzIGEgbGl0ZXJhbC4KKyAgICAgKi8KKyAgICB2b2lkIHNldDMoaW50IG5ld1ByaWNlLCBpbnQgb3B0Q3VyLCBpbnQgYmFjazIsIGludCBsZW4yLCBpbnQgYmFjaykgeworICAgICAgICBwcmljZSA9IG5ld1ByaWNlOworICAgICAgICBvcHRQcmV2ID0gb3B0Q3VyICsgbGVuMiArIDE7CisgICAgICAgIGJhY2tQcmV2ID0gYmFjazsKKyAgICAgICAgcHJldjFJc0xpdGVyYWwgPSB0cnVlOworICAgICAgICBoYXNQcmV2MiA9IHRydWU7CisgICAgICAgIG9wdFByZXYyID0gb3B0Q3VyOworICAgICAgICBiYWNrUHJldjIgPSBiYWNrMjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovbHptYS9TdGF0ZS5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6bWEvU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWNlODYwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L2x6bWEvU3RhdGUuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogU3RhdGUKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHoubHptYTsKKworZmluYWwgY2xhc3MgU3RhdGUgeworICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVTID0gMTI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElUX1NUQVRFUyA9IDc7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElUX0xJVCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BVENIX0xJVF9MSVQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVBfTElUX0xJVCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIT1JUUkVQX0xJVF9MSVQgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVRDSF9MSVQgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVBfTElUID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlRSRVBfTElUID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElUX01BVENIID0gNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElUX0xPTkdSRVAgPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSVRfU0hPUlRSRVAgPSA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT05MSVRfTUFUQ0ggPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9OTElUX1JFUCA9IDExOworCisgICAgcHJpdmF0ZSBpbnQgc3RhdGU7CisKKyAgICBTdGF0ZSgpIHt9CisKKyAgICBTdGF0ZShTdGF0ZSBvdGhlcikgeworICAgICAgICBzdGF0ZSA9IG90aGVyLnN0YXRlOworICAgIH0KKworICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHN0YXRlID0gTElUX0xJVDsKKyAgICB9CisKKyAgICBpbnQgZ2V0KCkgeworICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgfQorCisgICAgdm9pZCBzZXQoU3RhdGUgb3RoZXIpIHsKKyAgICAgICAgc3RhdGUgPSBvdGhlci5zdGF0ZTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUxpdGVyYWwoKSB7CisgICAgICAgIGlmIChzdGF0ZSA8PSBTSE9SVFJFUF9MSVRfTElUKQorICAgICAgICAgICAgc3RhdGUgPSBMSVRfTElUOworICAgICAgICBlbHNlIGlmIChzdGF0ZSA8PSBMSVRfU0hPUlRSRVApCisgICAgICAgICAgICBzdGF0ZSAtPSAzOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGF0ZSAtPSA2OworICAgIH0KKworICAgIHZvaWQgdXBkYXRlTWF0Y2goKSB7CisgICAgICAgIHN0YXRlID0gc3RhdGUgPCBMSVRfU1RBVEVTID8gTElUX01BVENIIDogTk9OTElUX01BVENIOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlTG9uZ1JlcCgpIHsKKyAgICAgICAgc3RhdGUgPSBzdGF0ZSA8IExJVF9TVEFURVMgPyBMSVRfTE9OR1JFUCA6IE5PTkxJVF9SRVA7CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVTaG9ydFJlcCgpIHsKKyAgICAgICAgc3RhdGUgPSBzdGF0ZSA8IExJVF9TVEFURVMgPyBMSVRfU0hPUlRSRVAgOiBOT05MSVRfUkVQOworICAgIH0KKworICAgIGJvb2xlYW4gaXNMaXRlcmFsKCkgeworICAgICAgICByZXR1cm4gc3RhdGUgPCBMSVRfU1RBVEVTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9wYWNrYWdlLWluZm8uamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDdjMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKgorICogWFogZGF0YSBjb21wcmVzc2lvbiBzdXBwb3J0LgorICoKKyAqIDxoND5JbnRyb2R1Y3Rpb248L2g0PgorICogPHA+CisgKiBUaGlzIGFpbXMgdG8gYmUgYSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBYWiBkYXRhIGNvbXByZXNzaW9uCisgKiBpbiBwdXJlIEphdmEuIEZlYXR1cmVzOgorICogPHVsPgorICogPGxpPkZ1bGwgc3VwcG9ydCBmb3IgdGhlIC54eiBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4wLjQ8L2xpPgorICogPGxpPlNpbmdsZS10aHJlYWRlZCBzdHJlYW1lZCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbjwvbGk+CisgKiA8bGk+U2luZ2xlLXRocmVhZGVkIGRlY29tcHJlc3Npb24gd2l0aCBsaW1pdGVkIHJhbmRvbSBhY2Nlc3Mgc3VwcG9ydDwvbGk+CisgKiA8bGk+UmF3IHN0cmVhbXMgKG5vIC54eiBoZWFkZXJzKSBmb3IgYWR2YW5jZWQgdXNlcnMsIGluY2x1ZGluZyBMWk1BMgorICogICAgIHdpdGggcHJlc2V0IGRpY3Rpb25hcnk8L2xpPgorICogPC91bD4KKyAqIDxwPgorICogVGhyZWFkaW5nIGlzIHBsYW5uZWQgYnV0IGl0IGlzIHVua25vd24gd2hlbiBpdCB3aWxsIGJlIGltcGxlbWVudGVkLgorICogPHA+CisgKiBGb3IgdGhlIGxhdGVzdCBzb3VyY2UgY29kZSwgc2VlIHRoZQorICogPGEgaHJlZj0iaHR0cDovL3R1a2Fhbmkub3JnL3h6L2phdmEuaHRtbCI+aG9tZSBwYWdlIG9mIFhaIGZvciBKYXZhPC9hPi4KKyAqCisgKiA8aDQ+R2V0dGluZyBzdGFydGVkPC9oND4KKyAqIDxwPgorICogU3RhcnQgYnkgcmVhZGluZyB0aGUgZG9jdW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLnR1a2FhbmkueHouWFpPdXRwdXRTdHJlYW19CisgKiBhbmQge0BsaW5rIG9yZy50dWthYW5pLnh6LlhaSW5wdXRTdHJlYW19LgorICogSWYgeW91IHVzZSBYWiBpbnNpZGUgYW5vdGhlciBmaWxlIGZvcm1hdCBvciBwcm90b2NvbCwKKyAqIHNlZSBhbHNvIHtAbGluayBvcmcudHVrYWFuaS54ei5TaW5nbGVYWklucHV0U3RyZWFtfS4KKyAqCisgKiA8aDQ+TGljZW5zaW5nPC9oND4KKyAqIDxwPgorICogWFogZm9yIEphdmEgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4sIHRodXMgeW91IGNhbiBkbworICogd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCBpdC4gQWxsIHRoZSBmaWxlcyBpbiB0aGUgcGFja2FnZSBoYXZlIGJlZW4KKyAqIHdyaXR0ZW4gYnkgTGFzc2UgQ29sbGluIGFuZC9vciBJZ29yIFBhdmxvdi4KKyAqIDxwPgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiLCB3aXRob3V0IGFueSB3YXJyYW50eS4KKyAqLworcGFja2FnZSBvcmcudHVrYWFuaS54ejsKZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9yYW5nZWNvZGVyL1JhbmdlQ29kZXIuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9yYW5nZWNvZGVyL1JhbmdlQ29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjliMGM0Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L3JhbmdlY29kZXIvUmFuZ2VDb2Rlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBSYW5nZUNvZGVyCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6LnJhbmdlY29kZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmFuZ2VDb2RlciB7CisgICAgc3RhdGljIGZpbmFsIGludCBTSElGVF9CSVRTID0gODsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRPUF9NQVNLID0gMHhGRjAwMDAwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEJJVF9NT0RFTF9UT1RBTF9CSVRTID0gMTE7CisgICAgc3RhdGljIGZpbmFsIGludCBCSVRfTU9ERUxfVE9UQUwgPSAxIDw8IEJJVF9NT0RFTF9UT1RBTF9CSVRTOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBQUk9CX0lOSVQgPSAoc2hvcnQpKEJJVF9NT0RFTF9UT1RBTCAvIDIpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTU9WRV9CSVRTID0gNTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBpbml0UHJvYnMoc2hvcnRbXSBwcm9icykgeworICAgICAgICBBcnJheXMuZmlsbChwcm9icywgUFJPQl9JTklUKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovcmFuZ2Vjb2Rlci9SYW5nZURlY29kZXIuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9yYW5nZWNvZGVyL1JhbmdlRGVjb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MzUzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovcmFuZ2Vjb2Rlci9SYW5nZURlY29kZXIuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogUmFuZ2VEZWNvZGVyCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6LnJhbmdlY29kZXI7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmFuZ2VEZWNvZGVyIGV4dGVuZHMgUmFuZ2VDb2RlciB7CisgICAgaW50IHJhbmdlID0gMDsKKyAgICBpbnQgY29kZSA9IDA7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3JtYWxpemUoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwdWJsaWMgaW50IGRlY29kZUJpdChzaG9ydFtdIHByb2JzLCBpbnQgaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG5vcm1hbGl6ZSgpOworCisgICAgICAgIGludCBwcm9iID0gcHJvYnNbaW5kZXhdOworICAgICAgICBpbnQgYm91bmQgPSAocmFuZ2UgPj4+IEJJVF9NT0RFTF9UT1RBTF9CSVRTKSAqIHByb2I7CisgICAgICAgIGludCBiaXQ7CisKKyAgICAgICAgLy8gQ29tcGFyZSBjb2RlIGFuZCBib3VuZCBhcyBpZiB0aGV5IHdlcmUgdW5zaWduZWQgMzItYml0IGludGVnZXJzLgorICAgICAgICBpZiAoKGNvZGUgXiAweDgwMDAwMDAwKSA8IChib3VuZCBeIDB4ODAwMDAwMDApKSB7CisgICAgICAgICAgICByYW5nZSA9IGJvdW5kOworICAgICAgICAgICAgcHJvYnNbaW5kZXhdID0gKHNob3J0KSgKKyAgICAgICAgICAgICAgICAgICAgcHJvYiArICgoQklUX01PREVMX1RPVEFMIC0gcHJvYikgPj4+IE1PVkVfQklUUykpOworICAgICAgICAgICAgYml0ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJhbmdlIC09IGJvdW5kOworICAgICAgICAgICAgY29kZSAtPSBib3VuZDsKKyAgICAgICAgICAgIHByb2JzW2luZGV4XSA9IChzaG9ydCkocHJvYiAtIChwcm9iID4+PiBNT1ZFX0JJVFMpKTsKKyAgICAgICAgICAgIGJpdCA9IDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYml0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZGVjb2RlQml0VHJlZShzaG9ydFtdIHByb2JzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgc3ltYm9sID0gMTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBzeW1ib2wgPSAoc3ltYm9sIDw8IDEpIHwgZGVjb2RlQml0KHByb2JzLCBzeW1ib2wpOworICAgICAgICB9IHdoaWxlIChzeW1ib2wgPCBwcm9icy5sZW5ndGgpOworCisgICAgICAgIHJldHVybiBzeW1ib2wgLSBwcm9icy5sZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIGludCBkZWNvZGVSZXZlcnNlQml0VHJlZShzaG9ydFtdIHByb2JzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgc3ltYm9sID0gMTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQgYml0ID0gZGVjb2RlQml0KHByb2JzLCBzeW1ib2wpOworICAgICAgICAgICAgc3ltYm9sID0gKHN5bWJvbCA8PCAxKSB8IGJpdDsKKyAgICAgICAgICAgIHJlc3VsdCB8PSBiaXQgPDwgaSsrOworICAgICAgICB9IHdoaWxlIChzeW1ib2wgPCBwcm9icy5sZW5ndGgpOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGludCBkZWNvZGVEaXJlY3RCaXRzKGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgbm9ybWFsaXplKCk7CisKKyAgICAgICAgICAgIHJhbmdlID4+Pj0gMTsKKyAgICAgICAgICAgIGludCB0ID0gKGNvZGUgLSByYW5nZSkgPj4+IDMxOworICAgICAgICAgICAgY29kZSAtPSByYW5nZSAmICh0IC0gMSk7CisgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDEpIHwgKDEgLSB0KTsKKyAgICAgICAgfSB3aGlsZSAoLS1jb3VudCAhPSAwKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9yYW5nZWNvZGVyL1JhbmdlRGVjb2RlckZyb21CdWZmZXIuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9yYW5nZWNvZGVyL1JhbmdlRGVjb2RlckZyb21CdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWM3YTdlCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L3JhbmdlY29kZXIvUmFuZ2VEZWNvZGVyRnJvbUJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBSYW5nZURlY29kZXJGcm9tQnVmZmVyCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6LnJhbmdlY29kZXI7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy50dWthYW5pLnh6LkNvcnJ1cHRlZElucHV0RXhjZXB0aW9uOworCitwdWJsaWMgZmluYWwgY2xhc3MgUmFuZ2VEZWNvZGVyRnJvbUJ1ZmZlciBleHRlbmRzIFJhbmdlRGVjb2RlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRfU0laRSA9IDU7CisKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBidWY7CisgICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKKyAgICBwcml2YXRlIGludCBlbmQgPSAwOworCisgICAgcHVibGljIFJhbmdlRGVjb2RlckZyb21CdWZmZXIoaW50IGlucHV0U2l6ZU1heCkgeworICAgICAgICBidWYgPSBuZXcgYnl0ZVtpbnB1dFNpemVNYXggLSBJTklUX1NJWkVdOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByZXBhcmVJbnB1dEJ1ZmZlcihEYXRhSW5wdXRTdHJlYW0gaW4sIGludCBsZW4pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobGVuIDwgSU5JVF9TSVpFKQorICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCk7CisKKyAgICAgICAgaWYgKGluLnJlYWRVbnNpZ25lZEJ5dGUoKSAhPSAweDAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCk7CisKKyAgICAgICAgY29kZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgcmFuZ2UgPSAweEZGRkZGRkZGOworCisgICAgICAgIHBvcyA9IDA7CisgICAgICAgIGVuZCA9IGxlbiAtIElOSVRfU0laRTsKKyAgICAgICAgaW4ucmVhZEZ1bGx5KGJ1ZiwgMCwgZW5kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luQnVmZmVyT0soKSB7CisgICAgICAgIHJldHVybiBwb3MgPD0gZW5kOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoZWQoKSB7CisgICAgICAgIHJldHVybiBwb3MgPT0gZW5kICYmIGNvZGUgPT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3JtYWxpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoKHJhbmdlICYgVE9QX01BU0spID09IDApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGNvcnJ1cHQsIHRoaXMgbWlnaHQgdGhyb3cKKyAgICAgICAgICAgICAgICAvLyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uCisgICAgICAgICAgICAgICAgY29kZSA9IChjb2RlIDw8IFNISUZUX0JJVFMpIHwgKGJ1Zltwb3MrK10gJiAweEZGKTsKKyAgICAgICAgICAgICAgICByYW5nZSA8PD0gU0hJRlRfQklUUzsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZElucHV0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovcmFuZ2Vjb2Rlci9SYW5nZURlY29kZXJGcm9tU3RyZWFtLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovcmFuZ2Vjb2Rlci9SYW5nZURlY29kZXJGcm9tU3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyYjUxOAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9yYW5nZWNvZGVyL1JhbmdlRGVjb2RlckZyb21TdHJlYW0uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogUmFuZ2VEZWNvZGVyRnJvbVN0cmVhbQorICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5yYW5nZWNvZGVyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy50dWthYW5pLnh6LkNvcnJ1cHRlZElucHV0RXhjZXB0aW9uOworCitwdWJsaWMgZmluYWwgY2xhc3MgUmFuZ2VEZWNvZGVyRnJvbVN0cmVhbSBleHRlbmRzIFJhbmdlRGVjb2RlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhSW5wdXRTdHJlYW0gaW5EYXRhOworCisgICAgcHVibGljIFJhbmdlRGVjb2RlckZyb21TdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGluRGF0YSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW4pOworCisgICAgICAgIGlmIChpbkRhdGEucmVhZFVuc2lnbmVkQnl0ZSgpICE9IDB4MDApCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdGVkSW5wdXRFeGNlcHRpb24oKTsKKworICAgICAgICBjb2RlID0gaW5EYXRhLnJlYWRJbnQoKTsKKyAgICAgICAgcmFuZ2UgPSAweEZGRkZGRkZGOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoZWQoKSB7CisgICAgICAgIHJldHVybiBjb2RlID09IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm9ybWFsaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKChyYW5nZSAmIFRPUF9NQVNLKSA9PSAwKSB7CisgICAgICAgICAgICBjb2RlID0gKGNvZGUgPDwgU0hJRlRfQklUUykgfCBpbkRhdGEucmVhZFVuc2lnbmVkQnl0ZSgpOworICAgICAgICAgICAgcmFuZ2UgPDw9IFNISUZUX0JJVFM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovcmFuZ2Vjb2Rlci9SYW5nZUVuY29kZXIuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9yYW5nZWNvZGVyL1JhbmdlRW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNmZkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovcmFuZ2Vjb2Rlci9SYW5nZUVuY29kZXIuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIFJhbmdlRW5jb2RlcgorICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5yYW5nZWNvZGVyOworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGZpbmFsIGNsYXNzIFJhbmdlRW5jb2RlciBleHRlbmRzIFJhbmdlQ29kZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1ZFX1JFRFVDSU5HX0JJVFMgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSVRfUFJJQ0VfU0hJRlRfQklUUyA9IDQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBwcmljZXMKKyAgICAgICAgICAgID0gbmV3IGludFtCSVRfTU9ERUxfVE9UQUwgPj4+IE1PVkVfUkVEVUNJTkdfQklUU107CisKKyAgICBwcml2YXRlIGxvbmcgbG93OworICAgIHByaXZhdGUgaW50IHJhbmdlOworCisgICAgLy8gTk9URTogaW50IGlzIE9LIGZvciBMWk1BMiBiZWNhdXNlIGEgY29tcHJlc3NlZCBjaHVuaworICAgIC8vIGlzIG5vdCBtb3JlIHRoYW4gNjQgS2lCLCBidXQgd2l0aCBMWk1BMSB0aGVyZSBpcyBubyBjaHVua2luZworICAgIC8vIHNvIGluIHRoZW9yeSBjYWNoZVNpemUgY2FuIGdyb3cgdmVyeSBiaWcuIFRvIGJlIHZlcnkgc2FmZSwKKyAgICAvLyB1c2UgbG9uZyBpbnN0ZWFkIG9mIGludCBpZiB5b3UgYWRhcHQgdGhpcyBjb2RlIGZvciBMWk1BMS4KKyAgICBwcml2YXRlIGludCBjYWNoZVNpemU7CisgICAgcHJpdmF0ZSBieXRlIGNhY2hlOworCisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYnVmOworICAgIHByaXZhdGUgaW50IGJ1ZlBvczsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGZvciAoaW50IGkgPSAoMSA8PCBNT1ZFX1JFRFVDSU5HX0JJVFMpIC8gMjsgaSA8IEJJVF9NT0RFTF9UT1RBTDsKKyAgICAgICAgICAgICAgICBpICs9ICgxIDw8IE1PVkVfUkVEVUNJTkdfQklUUykpIHsKKyAgICAgICAgICAgIGludCB3ID0gaTsKKyAgICAgICAgICAgIGludCBiaXRDb3VudCA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgQklUX1BSSUNFX1NISUZUX0JJVFM7ICsraikgeworICAgICAgICAgICAgICAgIHcgKj0gdzsKKyAgICAgICAgICAgICAgICBiaXRDb3VudCA8PD0gMTsKKworICAgICAgICAgICAgICAgIHdoaWxlICgodyAmIDB4RkZGRjAwMDApICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdyA+Pj49IDE7CisgICAgICAgICAgICAgICAgICAgICsrYml0Q291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmljZXNbaSA+PiBNT1ZFX1JFRFVDSU5HX0JJVFNdCisgICAgICAgICAgICAgICAgICAgID0gKEJJVF9NT0RFTF9UT1RBTF9CSVRTIDw8IEJJVF9QUklDRV9TSElGVF9CSVRTKQorICAgICAgICAgICAgICAgICAgICAgIC0gMTUgLSBiaXRDb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBSYW5nZUVuY29kZXIoaW50IGJ1ZlNpemUpIHsKKyAgICAgICAgYnVmID0gbmV3IGJ5dGVbYnVmU2l6ZV07CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIGxvdyA9IDA7CisgICAgICAgIHJhbmdlID0gMHhGRkZGRkZGRjsKKyAgICAgICAgY2FjaGUgPSAweDAwOworICAgICAgICBjYWNoZVNpemUgPSAxOworICAgICAgICBidWZQb3MgPSAwOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGVuZGluZ1NpemUoKSB7CisgICAgICAgIHJldHVybiBidWZQb3MgKyBjYWNoZVNpemUgKyA1IC0gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGZpbmlzaCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpCisgICAgICAgICAgICBzaGlmdExvdygpOworCisgICAgICAgIHJldHVybiBidWZQb3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgYnVmUG9zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2hpZnRMb3coKSB7CisgICAgICAgIGludCBsb3dIaSA9IChpbnQpKGxvdyA+Pj4gMzIpOworCisgICAgICAgIGlmIChsb3dIaSAhPSAwIHx8IGxvdyA8IDB4RkYwMDAwMDBMKSB7CisgICAgICAgICAgICBpbnQgdGVtcCA9IGNhY2hlOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgYnVmW2J1ZlBvcysrXSA9IChieXRlKSh0ZW1wICsgbG93SGkpOworICAgICAgICAgICAgICAgIHRlbXAgPSAweEZGOworICAgICAgICAgICAgfSB3aGlsZSAoLS1jYWNoZVNpemUgIT0gMCk7CisKKyAgICAgICAgICAgIGNhY2hlID0gKGJ5dGUpKGxvdyA+Pj4gMjQpOworICAgICAgICB9CisKKyAgICAgICAgKytjYWNoZVNpemU7CisgICAgICAgIGxvdyA9IChsb3cgJiAweDAwRkZGRkZGKSA8PCA4OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuY29kZUJpdChzaG9ydFtdIHByb2JzLCBpbnQgaW5kZXgsIGludCBiaXQpIHsKKyAgICAgICAgaW50IHByb2IgPSBwcm9ic1tpbmRleF07CisgICAgICAgIGludCBib3VuZCA9IChyYW5nZSA+Pj4gQklUX01PREVMX1RPVEFMX0JJVFMpICogcHJvYjsKKworICAgICAgICAvLyBOT1RFOiBBbnkgbm9uLXplcm8gdmFsdWUgZm9yIGJpdCBpcyB0YWtlbiBhcyAxLgorICAgICAgICBpZiAoYml0ID09IDApIHsKKyAgICAgICAgICAgIHJhbmdlID0gYm91bmQ7CisgICAgICAgICAgICBwcm9ic1tpbmRleF0gPSAoc2hvcnQpKAorICAgICAgICAgICAgICAgICAgICBwcm9iICsgKChCSVRfTU9ERUxfVE9UQUwgLSBwcm9iKSA+Pj4gTU9WRV9CSVRTKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb3cgKz0gYm91bmQgJiAweEZGRkZGRkZGTDsKKyAgICAgICAgICAgIHJhbmdlIC09IGJvdW5kOworICAgICAgICAgICAgcHJvYnNbaW5kZXhdID0gKHNob3J0KShwcm9iIC0gKHByb2IgPj4+IE1PVkVfQklUUykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyYW5nZSAmIFRPUF9NQVNLKSA9PSAwKSB7CisgICAgICAgICAgICByYW5nZSA8PD0gU0hJRlRfQklUUzsKKyAgICAgICAgICAgIHNoaWZ0TG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRCaXRQcmljZShpbnQgcHJvYiwgaW50IGJpdCkgeworICAgICAgICAvLyBOT1RFOiBVbmxpa2UgaW4gZW5jb2RlQml0KCksIGhlcmUgYml0IG11c3QgYmUgMCBvciAxLgorICAgICAgICBhc3NlcnQgYml0ID09IDAgfHwgYml0ID09IDE7CisgICAgICAgIHJldHVybiBwcmljZXNbKHByb2IgXiAoKC1iaXQpICYgKEJJVF9NT0RFTF9UT1RBTCAtIDEpKSkKKyAgICAgICAgICAgICAgICAgICAgICA+Pj4gTU9WRV9SRURVQ0lOR19CSVRTXTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmNvZGVCaXRUcmVlKHNob3J0W10gcHJvYnMsIGludCBzeW1ib2wpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMTsKKyAgICAgICAgaW50IG1hc2sgPSBwcm9icy5sZW5ndGg7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgbWFzayA+Pj49IDE7CisgICAgICAgICAgICBpbnQgYml0ID0gc3ltYm9sICYgbWFzazsKKyAgICAgICAgICAgIGVuY29kZUJpdChwcm9icywgaW5kZXgsIGJpdCk7CisKKyAgICAgICAgICAgIGluZGV4IDw8PSAxOworICAgICAgICAgICAgaWYgKGJpdCAhPSAwKQorICAgICAgICAgICAgICAgIGluZGV4IHw9IDE7CisKKyAgICAgICAgfSB3aGlsZSAobWFzayAhPSAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRCaXRUcmVlUHJpY2Uoc2hvcnRbXSBwcm9icywgaW50IHN5bWJvbCkgeworICAgICAgICBpbnQgcHJpY2UgPSAwOworICAgICAgICBzeW1ib2wgfD0gcHJvYnMubGVuZ3RoOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCBiaXQgPSBzeW1ib2wgJiAxOworICAgICAgICAgICAgc3ltYm9sID4+Pj0gMTsKKyAgICAgICAgICAgIHByaWNlICs9IGdldEJpdFByaWNlKHByb2JzW3N5bWJvbF0sIGJpdCk7CisgICAgICAgIH0gd2hpbGUgKHN5bWJvbCAhPSAxKTsKKworICAgICAgICByZXR1cm4gcHJpY2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5jb2RlUmV2ZXJzZUJpdFRyZWUoc2hvcnRbXSBwcm9icywgaW50IHN5bWJvbCkgeworICAgICAgICBpbnQgaW5kZXggPSAxOworICAgICAgICBzeW1ib2wgfD0gcHJvYnMubGVuZ3RoOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCBiaXQgPSBzeW1ib2wgJiAxOworICAgICAgICAgICAgc3ltYm9sID4+Pj0gMTsKKyAgICAgICAgICAgIGVuY29kZUJpdChwcm9icywgaW5kZXgsIGJpdCk7CisgICAgICAgICAgICBpbmRleCA9IChpbmRleCA8PCAxKSB8IGJpdDsKKyAgICAgICAgfSB3aGlsZSAoc3ltYm9sICE9IDEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFJldmVyc2VCaXRUcmVlUHJpY2Uoc2hvcnRbXSBwcm9icywgaW50IHN5bWJvbCkgeworICAgICAgICBpbnQgcHJpY2UgPSAwOworICAgICAgICBpbnQgaW5kZXggPSAxOworICAgICAgICBzeW1ib2wgfD0gcHJvYnMubGVuZ3RoOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCBiaXQgPSBzeW1ib2wgJiAxOworICAgICAgICAgICAgc3ltYm9sID4+Pj0gMTsKKyAgICAgICAgICAgIHByaWNlICs9IGdldEJpdFByaWNlKHByb2JzW2luZGV4XSwgYml0KTsKKyAgICAgICAgICAgIGluZGV4ID0gKGluZGV4IDw8IDEpIHwgYml0OworICAgICAgICB9IHdoaWxlIChzeW1ib2wgIT0gMSk7CisKKyAgICAgICAgcmV0dXJuIHByaWNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuY29kZURpcmVjdEJpdHMoaW50IHZhbHVlLCBpbnQgY291bnQpIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcmFuZ2UgPj4+PSAxOworICAgICAgICAgICAgbG93ICs9IHJhbmdlICYgKDAgLSAoKHZhbHVlID4+PiAtLWNvdW50KSAmIDEpKTsKKworICAgICAgICAgICAgaWYgKChyYW5nZSAmIFRPUF9NQVNLKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmFuZ2UgPDw9IFNISUZUX0JJVFM7CisgICAgICAgICAgICAgICAgc2hpZnRMb3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoY291bnQgIT0gMCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlyZWN0Qml0c1ByaWNlKGludCBjb3VudCkgeworICAgICAgICByZXR1cm4gY291bnQgPDwgQklUX1BSSUNFX1NISUZUX0JJVFM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L3NpbXBsZS9BUk0uamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9zaW1wbGUvQVJNLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZlYmY3OAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9zaW1wbGUvQVJNLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIEJDSiBmaWx0ZXIgZm9yIGxpdHRsZSBlbmRpYW4gQVJNIGluc3RydWN0aW9ucworICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5zaW1wbGU7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBUk0gaW1wbGVtZW50cyBTaW1wbGVGaWx0ZXIgeworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0VuY29kZXI7CisgICAgcHJpdmF0ZSBpbnQgcG9zOworCisgICAgcHVibGljIEFSTShib29sZWFuIGlzRW5jb2RlciwgaW50IHN0YXJ0UG9zKSB7CisgICAgICAgIHRoaXMuaXNFbmNvZGVyID0gaXNFbmNvZGVyOworICAgICAgICBwb3MgPSBzdGFydFBvcyArIDg7CisgICAgfQorCisgICAgcHVibGljIGludCBjb2RlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgICAgaW50IGVuZCA9IG9mZiArIGxlbiAtIDQ7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IG9mZjsgaSA8PSBlbmQ7IGkgKz0gNCkgeworICAgICAgICAgICAgaWYgKChidWZbaSArIDNdICYgMHhGRikgPT0gMHhFQikgeworICAgICAgICAgICAgICAgIGludCBzcmMgPSAoKGJ1ZltpICsgMl0gJiAweEZGKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGJ1ZltpICsgMV0gJiAweEZGKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICB8IChidWZbaV0gJiAweEZGKTsKKyAgICAgICAgICAgICAgICBzcmMgPDw9IDI7CisKKyAgICAgICAgICAgICAgICBpbnQgZGVzdDsKKyAgICAgICAgICAgICAgICBpZiAoaXNFbmNvZGVyKQorICAgICAgICAgICAgICAgICAgICBkZXN0ID0gc3JjICsgKHBvcyArIGkgLSBvZmYpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGVzdCA9IHNyYyAtIChwb3MgKyBpIC0gb2ZmKTsKKworICAgICAgICAgICAgICAgIGRlc3QgPj4+PSAyOworICAgICAgICAgICAgICAgIGJ1ZltpICsgMl0gPSAoYnl0ZSkoZGVzdCA+Pj4gMTYpOworICAgICAgICAgICAgICAgIGJ1ZltpICsgMV0gPSAoYnl0ZSkoZGVzdCA+Pj4gOCk7CisgICAgICAgICAgICAgICAgYnVmW2ldID0gKGJ5dGUpZGVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGkgLT0gb2ZmOworICAgICAgICBwb3MgKz0gaTsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L3NpbXBsZS9BUk1UaHVtYi5qYXZhIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L3NpbXBsZS9BUk1UaHVtYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTdjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovc2ltcGxlL0FSTVRodW1iLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIEJDSiBmaWx0ZXIgZm9yIGxpdHRsZSBlbmRpYW4gQVJNLVRodW1iIGluc3RydWN0aW9ucworICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5zaW1wbGU7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBUk1UaHVtYiBpbXBsZW1lbnRzIFNpbXBsZUZpbHRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzRW5jb2RlcjsKKyAgICBwcml2YXRlIGludCBwb3M7CisKKyAgICBwdWJsaWMgQVJNVGh1bWIoYm9vbGVhbiBpc0VuY29kZXIsIGludCBzdGFydFBvcykgeworICAgICAgICB0aGlzLmlzRW5jb2RlciA9IGlzRW5jb2RlcjsKKyAgICAgICAgcG9zID0gc3RhcnRQb3MgKyA0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29kZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgIGludCBlbmQgPSBvZmYgKyBsZW4gLSA0OworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSBvZmY7IGkgPD0gZW5kOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGlmICgoYnVmW2kgKyAxXSAmIDB4RjgpID09IDB4RjAgJiYgKGJ1ZltpICsgM10gJiAweEY4KSA9PSAweEY4KSB7CisgICAgICAgICAgICAgICAgaW50IHNyYyA9ICgoYnVmW2kgKyAxXSAmIDB4MDcpIDw8IDE5KQorICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoYnVmW2ldICYgMHhGRikgPDwgMTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChidWZbaSArIDNdICYgMHgwNykgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoYnVmW2kgKyAyXSAmIDB4RkYpOworICAgICAgICAgICAgICAgIHNyYyA8PD0gMTsKKworICAgICAgICAgICAgICAgIGludCBkZXN0OworICAgICAgICAgICAgICAgIGlmIChpc0VuY29kZXIpCisgICAgICAgICAgICAgICAgICAgIGRlc3QgPSBzcmMgKyAocG9zICsgaSAtIG9mZik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkZXN0ID0gc3JjIC0gKHBvcyArIGkgLSBvZmYpOworCisgICAgICAgICAgICAgICAgZGVzdCA+Pj49IDE7CisgICAgICAgICAgICAgICAgYnVmW2kgKyAxXSA9IChieXRlKSgweEYwIHwgKChkZXN0ID4+PiAxOSkgJiAweDA3KSk7CisgICAgICAgICAgICAgICAgYnVmW2ldID0gKGJ5dGUpKGRlc3QgPj4+IDExKTsKKyAgICAgICAgICAgICAgICBidWZbaSArIDNdID0gKGJ5dGUpKDB4RjggfCAoKGRlc3QgPj4+IDgpICYgMHgwNykpOworICAgICAgICAgICAgICAgIGJ1ZltpICsgMl0gPSAoYnl0ZSlkZXN0OworICAgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGkgLT0gb2ZmOworICAgICAgICBwb3MgKz0gaTsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L3NpbXBsZS9JQTY0LmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovc2ltcGxlL0lBNjQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzZhMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L3NpbXBsZS9JQTY0LmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIEJDSiBmaWx0ZXIgZm9yIEl0YW5pdW0gKElBLTY0KSBpbnN0cnVjdGlvbnMKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHouc2ltcGxlOworCitwdWJsaWMgZmluYWwgY2xhc3MgSUE2NCBpbXBsZW1lbnRzIFNpbXBsZUZpbHRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQlJBTkNIX1RBQkxFID0geworICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICA0LCA0LCA2LCA2LCAwLCAwLCA3LCA3LAorICAgICAgICAgICAgNCwgNCwgMCwgMCwgNCwgNCwgMCwgMCB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzRW5jb2RlcjsKKyAgICBwcml2YXRlIGludCBwb3M7CisKKyAgICBwdWJsaWMgSUE2NChib29sZWFuIGlzRW5jb2RlciwgaW50IHN0YXJ0UG9zKSB7CisgICAgICAgIHRoaXMuaXNFbmNvZGVyID0gaXNFbmNvZGVyOworICAgICAgICBwb3MgPSBzdGFydFBvczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGNvZGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBpbnQgZW5kID0gb2ZmICsgbGVuIC0gMTY7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IG9mZjsgaSA8PSBlbmQ7IGkgKz0gMTYpIHsKKyAgICAgICAgICAgIGludCBpbnN0clRlbXBsYXRlID0gYnVmW2ldICYgMHgxRjsKKyAgICAgICAgICAgIGludCBtYXNrID0gQlJBTkNIX1RBQkxFW2luc3RyVGVtcGxhdGVdOworCisgICAgICAgICAgICBmb3IgKGludCBzbG90ID0gMCwgYml0UG9zID0gNTsgc2xvdCA8IDM7ICsrc2xvdCwgYml0UG9zICs9IDQxKSB7CisgICAgICAgICAgICAgICAgaWYgKCgobWFzayA+Pj4gc2xvdCkgJiAxKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGludCBieXRlUG9zID0gYml0UG9zID4+PiAzOworICAgICAgICAgICAgICAgIGludCBiaXRSZXMgPSBiaXRQb3MgJiA3OworCisgICAgICAgICAgICAgICAgbG9uZyBpbnN0ciA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA2OyArK2opCisgICAgICAgICAgICAgICAgICAgIGluc3RyIHw9IChidWZbaSArIGJ5dGVQb3MgKyBqXSAmIDB4RkZMKSA8PCAoOCAqIGopOworCisgICAgICAgICAgICAgICAgbG9uZyBpbnN0ck5vcm0gPSBpbnN0ciA+Pj4gYml0UmVzOworCisgICAgICAgICAgICAgICAgaWYgKCgoaW5zdHJOb3JtID4+PiAzNykgJiAweDBGKSAhPSAweDA1CisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGluc3RyTm9ybSA+Pj4gOSkgJiAweDA3KSAhPSAweDAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGludCBzcmMgPSAoaW50KSgoaW5zdHJOb3JtID4+PiAxMykgJiAweDBGRkZGRik7CisgICAgICAgICAgICAgICAgc3JjIHw9ICgoaW50KShpbnN0ck5vcm0gPj4+IDM2KSAmIDEpIDw8IDIwOworICAgICAgICAgICAgICAgIHNyYyA8PD0gNDsKKworICAgICAgICAgICAgICAgIGludCBkZXN0OworICAgICAgICAgICAgICAgIGlmIChpc0VuY29kZXIpCisgICAgICAgICAgICAgICAgICAgIGRlc3QgPSBzcmMgKyAocG9zICsgaSAtIG9mZik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkZXN0ID0gc3JjIC0gKHBvcyArIGkgLSBvZmYpOworCisgICAgICAgICAgICAgICAgZGVzdCA+Pj49IDQ7CisKKyAgICAgICAgICAgICAgICBpbnN0ck5vcm0gJj0gfigweDhGRkZGRkwgPDwgMTMpOworICAgICAgICAgICAgICAgIGluc3RyTm9ybSB8PSAoZGVzdCAmIDB4MEZGRkZGTCkgPDwgMTM7CisgICAgICAgICAgICAgICAgaW5zdHJOb3JtIHw9IChkZXN0ICYgMHgxMDAwMDBMKSA8PCAoMzYgLSAyMCk7CisKKyAgICAgICAgICAgICAgICBpbnN0ciAmPSAoMSA8PCBiaXRSZXMpIC0gMTsKKyAgICAgICAgICAgICAgICBpbnN0ciB8PSBpbnN0ck5vcm0gPDwgYml0UmVzOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA2OyArK2opCisgICAgICAgICAgICAgICAgICAgIGJ1ZltpICsgYnl0ZVBvcyArIGpdID0gKGJ5dGUpKGluc3RyID4+PiAoOCAqIGopKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGkgLT0gb2ZmOworICAgICAgICBwb3MgKz0gaTsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L3NpbXBsZS9Qb3dlclBDLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovc2ltcGxlL1Bvd2VyUEMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzQwMGFiCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L3NpbXBsZS9Qb3dlclBDLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIEJDSiBmaWx0ZXIgZm9yIGJpZyBlbmRpYW4gUG93ZXJQQyBpbnN0cnVjdGlvbnMKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHouc2ltcGxlOworCitwdWJsaWMgZmluYWwgY2xhc3MgUG93ZXJQQyBpbXBsZW1lbnRzIFNpbXBsZUZpbHRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzRW5jb2RlcjsKKyAgICBwcml2YXRlIGludCBwb3M7CisKKyAgICBwdWJsaWMgUG93ZXJQQyhib29sZWFuIGlzRW5jb2RlciwgaW50IHN0YXJ0UG9zKSB7CisgICAgICAgIHRoaXMuaXNFbmNvZGVyID0gaXNFbmNvZGVyOworICAgICAgICBwb3MgPSBzdGFydFBvczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGNvZGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBpbnQgZW5kID0gb2ZmICsgbGVuIC0gNDsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gb2ZmOyBpIDw9IGVuZDsgaSArPSA0KSB7CisgICAgICAgICAgICBpZiAoKGJ1ZltpXSAmIDB4RkMpID09IDB4NDggJiYgKGJ1ZltpICsgM10gJiAweDAzKSA9PSAweDAxKSB7CisgICAgICAgICAgICAgICAgaW50IHNyYyA9ICgoYnVmW2ldICYgMHgwMykgPDwgMjQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChidWZbaSArIDFdICYgMHhGRikgPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChidWZbaSArIDJdICYgMHhGRikgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoYnVmW2kgKyAzXSAmIDB4RkMpOworCisgICAgICAgICAgICAgICAgaW50IGRlc3Q7CisgICAgICAgICAgICAgICAgaWYgKGlzRW5jb2RlcikKKyAgICAgICAgICAgICAgICAgICAgZGVzdCA9IHNyYyArIChwb3MgKyBpIC0gb2ZmKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRlc3QgPSBzcmMgLSAocG9zICsgaSAtIG9mZik7CisKKyAgICAgICAgICAgICAgICBidWZbaV0gPSAoYnl0ZSkoMHg0OCB8ICgoZGVzdCA+Pj4gMjQpICYgMHgwMykpOworICAgICAgICAgICAgICAgIGJ1ZltpICsgMV0gPSAoYnl0ZSkoZGVzdCA+Pj4gMTYpOworICAgICAgICAgICAgICAgIGJ1ZltpICsgMl0gPSAoYnl0ZSkoZGVzdCA+Pj4gOCk7CisgICAgICAgICAgICAgICAgYnVmW2kgKyAzXSA9IChieXRlKSgoYnVmW2kgKyAzXSAmIDB4MDMpIHwgZGVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpIC09IG9mZjsKKyAgICAgICAgcG9zICs9IGk7CisgICAgICAgIHJldHVybiBpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9zaW1wbGUvU1BBUkMuamF2YSBiL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9zaW1wbGUvU1BBUkMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTNjOGFjCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS9KYXZhL1R1a2Fhbmkvc3JjL29yZy90dWthYW5pL3h6L3NpbXBsZS9TUEFSQy5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBCQ0ogZmlsdGVyIGZvciBTUEFSQyBpbnN0cnVjdGlvbnMKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKK3BhY2thZ2Ugb3JnLnR1a2FhbmkueHouc2ltcGxlOworCitwdWJsaWMgZmluYWwgY2xhc3MgU1BBUkMgaW1wbGVtZW50cyBTaW1wbGVGaWx0ZXIgeworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0VuY29kZXI7CisgICAgcHJpdmF0ZSBpbnQgcG9zOworCisgICAgcHVibGljIFNQQVJDKGJvb2xlYW4gaXNFbmNvZGVyLCBpbnQgc3RhcnRQb3MpIHsKKyAgICAgICAgdGhpcy5pc0VuY29kZXIgPSBpc0VuY29kZXI7CisgICAgICAgIHBvcyA9IHN0YXJ0UG9zOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29kZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgIGludCBlbmQgPSBvZmYgKyBsZW4gLSA0OworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSBvZmY7IGkgPD0gZW5kOyBpICs9IDQpIHsKKyAgICAgICAgICAgIGlmICgoYnVmW2ldID09IDB4NDAgJiYgKGJ1ZltpICsgMV0gJiAweEMwKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICB8fCAoYnVmW2ldID09IDB4N0YgJiYgKGJ1ZltpICsgMV0gJiAweEMwKSA9PSAweEMwKSkgeworICAgICAgICAgICAgICAgIGludCBzcmMgPSAoKGJ1ZltpXSAmIDB4RkYpIDw8IDI0KQorICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoYnVmW2kgKyAxXSAmIDB4RkYpIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoYnVmW2kgKyAyXSAmIDB4RkYpIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKGJ1ZltpICsgM10gJiAweEZGKTsKKyAgICAgICAgICAgICAgICBzcmMgPDw9IDI7CisKKyAgICAgICAgICAgICAgICBpbnQgZGVzdDsKKyAgICAgICAgICAgICAgICBpZiAoaXNFbmNvZGVyKQorICAgICAgICAgICAgICAgICAgICBkZXN0ID0gc3JjICsgKHBvcyArIGkgLSBvZmYpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGVzdCA9IHNyYyAtIChwb3MgKyBpIC0gb2ZmKTsKKworICAgICAgICAgICAgICAgIGRlc3QgPj4+PSAyOworICAgICAgICAgICAgICAgIGRlc3QgPSAoKCgwIC0gKChkZXN0ID4+PiAyMikgJiAxKSkgPDwgMjIpICYgMHgzRkZGRkZGRikKKyAgICAgICAgICAgICAgICAgICAgICAgfCAoZGVzdCAmIDB4M0ZGRkZGKSB8IDB4NDAwMDAwMDA7CisKKyAgICAgICAgICAgICAgICBidWZbaV0gPSAoYnl0ZSkoZGVzdCA+Pj4gMjQpOworICAgICAgICAgICAgICAgIGJ1ZltpICsgMV0gPSAoYnl0ZSkoZGVzdCA+Pj4gMTYpOworICAgICAgICAgICAgICAgIGJ1ZltpICsgMl0gPSAoYnl0ZSkoZGVzdCA+Pj4gOCk7CisgICAgICAgICAgICAgICAgYnVmW2kgKyAzXSA9IChieXRlKWRlc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpIC09IG9mZjsKKyAgICAgICAgcG9zICs9IGk7CisgICAgICAgIHJldHVybiBpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9zaW1wbGUvU2ltcGxlRmlsdGVyLmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovc2ltcGxlL1NpbXBsZUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNzI5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovc2ltcGxlL1NpbXBsZUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBCQ0ogZmlsdGVyIGZvciBsaXR0bGUgZW5kaWFuIEFSTSBpbnN0cnVjdGlvbnMKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworcGFja2FnZSBvcmcudHVrYWFuaS54ei5zaW1wbGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgU2ltcGxlRmlsdGVyIHsKKyAgICBpbnQgY29kZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKTsKK30KZGlmZiAtLWdpdCBhL2x6bWEvSmF2YS9UdWthYW5pL3NyYy9vcmcvdHVrYWFuaS94ei9zaW1wbGUvWDg2LmphdmEgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovc2ltcGxlL1g4Ni5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNWUwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL0phdmEvVHVrYWFuaS9zcmMvb3JnL3R1a2FhbmkveHovc2ltcGxlL1g4Ni5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBCQ0ogZmlsdGVyIGZvciB4ODYgaW5zdHJ1Y3Rpb25zCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCitwYWNrYWdlIG9yZy50dWthYW5pLnh6LnNpbXBsZTsKKworcHVibGljIGZpbmFsIGNsYXNzIFg4NiBpbXBsZW1lbnRzIFNpbXBsZUZpbHRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbltdIE1BU0tfVE9fQUxMT1dFRF9TVEFUVVMKKyAgICAgICAgICAgID0ge3RydWUsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIE1BU0tfVE9fQklUX05VTUJFUiA9IHswLCAxLCAyLCAyLCAzLCAzLCAzLCAzfTsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0VuY29kZXI7CisgICAgcHJpdmF0ZSBpbnQgcG9zOworICAgIHByaXZhdGUgaW50IHByZXZNYXNrID0gMDsKKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdGVzdDg2TVNCeXRlKGJ5dGUgYikgeworICAgICAgICBpbnQgaSA9IGIgJiAweEZGOworICAgICAgICByZXR1cm4gaSA9PSAweDAwIHx8IGkgPT0gMHhGRjsKKyAgICB9CisKKyAgICBwdWJsaWMgWDg2KGJvb2xlYW4gaXNFbmNvZGVyLCBpbnQgc3RhcnRQb3MpIHsKKyAgICAgICAgdGhpcy5pc0VuY29kZXIgPSBpc0VuY29kZXI7CisgICAgICAgIHBvcyA9IHN0YXJ0UG9zICsgNTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGNvZGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBpbnQgcHJldlBvcyA9IG9mZiAtIDE7CisgICAgICAgIGludCBlbmQgPSBvZmYgKyBsZW4gLSA1OworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSBvZmY7IGkgPD0gZW5kOyArK2kpIHsKKyAgICAgICAgICAgIGlmICgoYnVmW2ldICYgMHhGRSkgIT0gMHhFOCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgcHJldlBvcyA9IGkgLSBwcmV2UG9zOworICAgICAgICAgICAgaWYgKChwcmV2UG9zICYgfjMpICE9IDApIHsgLy8gKHVuc2lnbmVkKXByZXZQb3MgPiAzCisgICAgICAgICAgICAgICAgcHJldk1hc2sgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmV2TWFzayA9IChwcmV2TWFzayA8PCAocHJldlBvcyAtIDEpKSAmIDc7CisgICAgICAgICAgICAgICAgaWYgKHByZXZNYXNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFNQVNLX1RPX0FMTE9XRURfU1RBVFVTW3ByZXZNYXNrXSB8fCB0ZXN0ODZNU0J5dGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2kgKyA0IC0gTUFTS19UT19CSVRfTlVNQkVSW3ByZXZNYXNrXV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2UG9zID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZNYXNrID0gKHByZXZNYXNrIDw8IDEpIHwgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmV2UG9zID0gaTsKKworICAgICAgICAgICAgaWYgKHRlc3Q4Nk1TQnl0ZShidWZbaSArIDRdKSkgeworICAgICAgICAgICAgICAgIGludCBzcmMgPSAoYnVmW2kgKyAxXSAmIDB4RkYpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChidWZbaSArIDJdICYgMHhGRikgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGJ1ZltpICsgM10gJiAweEZGKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGJ1ZltpICsgNF0gJiAweEZGKSA8PCAyNCk7CisgICAgICAgICAgICAgICAgaW50IGRlc3Q7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW5jb2RlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSBzcmMgKyAocG9zICsgaSAtIG9mZik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSBzcmMgLSAocG9zICsgaSAtIG9mZik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZNYXNrID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBNQVNLX1RPX0JJVF9OVU1CRVJbcHJldk1hc2tdICogODsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXN0ODZNU0J5dGUoKGJ5dGUpKGRlc3QgPj4+ICgyNCAtIGluZGV4KSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgc3JjID0gZGVzdCBeICgoMSA8PCAoMzIgLSBpbmRleCkpIC0gMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVmW2kgKyAxXSA9IChieXRlKWRlc3Q7CisgICAgICAgICAgICAgICAgYnVmW2kgKyAyXSA9IChieXRlKShkZXN0ID4+PiA4KTsKKyAgICAgICAgICAgICAgICBidWZbaSArIDNdID0gKGJ5dGUpKGRlc3QgPj4+IDE2KTsKKyAgICAgICAgICAgICAgICBidWZbaSArIDRdID0gKGJ5dGUpKH4oKChkZXN0ID4+PiAyNCkgJiAxKSAtIDEpKTsKKyAgICAgICAgICAgICAgICBpICs9IDQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByZXZNYXNrID0gKHByZXZNYXNrIDw8IDEpIHwgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByZXZQb3MgPSBpIC0gcHJldlBvczsKKyAgICAgICAgcHJldk1hc2sgPSAoKHByZXZQb3MgJiB+MykgIT0gMCkgPyAwIDogcHJldk1hc2sgPDwgKHByZXZQb3MgLSAxKTsKKworICAgICAgICBpIC09IG9mZjsKKyAgICAgICAgcG9zICs9IGk7CisgICAgICAgIHJldHVybiBpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2x6bWEvTU9EVUxFX0xJQ0VOU0VfUFVCTElDX0RPTUFJTiBiL2x6bWEvTU9EVUxFX0xJQ0VOU0VfUFVCTElDX0RPTUFJTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS9NT0RVTEVfTElDRU5TRV9QVUJMSUNfRE9NQUlOCmRpZmYgLS1naXQgYS9sem1hL05PVElDRSBiL2x6bWEvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NzdiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL05PVElDRQpAQCAtMCwwICsxLDExIEBACitMWk1BIFNESyBpcyB3cml0dGVuIGFuZCBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4gYnkgSWdvciBQYXZsb3YuCisKK1NvbWUgY29kZSBpbiBMWk1BIFNESyBpcyBiYXNlZCBvbiBwdWJsaWMgZG9tYWluIGNvZGUgZnJvbSBhbm90aGVyIGRldmVsb3BlcnM6CisgIDEpIFBQTWQgdmFyLkggKDIwMDEpOiBEbWl0cnkgU2hrYXJpbgorICAyKSBTSEEtMjU2OiBXZWkgRGFpIChDcnlwdG8rKyBsaWJyYXJ5KQorCitZb3UgY2FuIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgcGVyZm9ybSBMWk1BIFNESyBjb2RlLCBldmVuIGZvciBjb21tZXJjaWFsIHB1cnBvc2VzLAorYWxsIHdpdGhvdXQgYXNraW5nIHBlcm1pc3Npb24uCisKK0xaTUEgU0RLIGNvZGUgaXMgY29tcGF0aWJsZSB3aXRoIG9wZW4gc291cmNlIGxpY2Vuc2VzLCBmb3IgZXhhbXBsZSwgeW91IGNhbgoraW5jbHVkZSBpdCB0byBHTlUgR1BMIG9yIEdOVSBMR1BMIGNvZGUuCmRpZmYgLS1naXQgYS9sem1hL3h6LWVtYmVkZGVkL0FuZHJvaWQubWsgYi9sem1hL3h6LWVtYmVkZGVkL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkZDg4ZgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEveHotZW1iZWRkZWQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACisjIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworeHpfZW1iZWRkZWRfc291cmNlcyA6PSBcCisgICAgeHpfY3JjMzIuYyBcCisgICAgeHpfZGVjX2Jjai5jIFwKKyAgICB4el9kZWNfbHptYTIuYyBcCisgICAgeHpfZGVjX3N0cmVhbS5jCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGxpYnh6CitMT0NBTF9TUkNfRklMRVMgOj0gJCh4el9lbWJlZGRlZF9zb3VyY2VzKQorTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbGlieHotaG9zdAorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoeHpfZW1iZWRkZWRfc291cmNlcykKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpCitpbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2x6bWEveHotZW1iZWRkZWQveHouaCBiL2x6bWEveHotZW1iZWRkZWQveHouaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTRiMzhkCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS94ei1lbWJlZGRlZC94ei5oCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogWFogZGVjb21wcmVzc29yCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaWZuZGVmIFhaX0gKKyNkZWZpbmUgWFpfSAorCisjaWZkZWYgX19LRVJORUxfXworIwlpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyMJaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNlbHNlCisjCWluY2x1ZGUgPHN0ZGRlZi5oPgorIwlpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluIExpbnV4LCB0aGlzIGlzIHVzZWQgdG8gbWFrZSBleHRlcm4gZnVuY3Rpb25zIHN0YXRpYyB3aGVuIG5lZWRlZC4gKi8KKyNpZm5kZWYgWFpfRVhURVJOCisjCWRlZmluZSBYWl9FWFRFUk4gZXh0ZXJuCisjZW5kaWYKKworLyoqCisgKiBlbnVtIHh6X21vZGUgLSBPcGVyYXRpb24gbW9kZQorICoKKyAqIEBYWl9TSU5HTEU6ICAgICAgICAgICAgICBTaW5nbGUtY2FsbCBtb2RlLiBUaGlzIHVzZXMgbGVzcyBSQU0gdGhhbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gbXVsdGktY2FsbCBtb2RlcywgYmVjYXVzZSB0aGUgTFpNQTIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5IGRvZXNuJ3QgbmVlZCB0byBiZSBhbGxvY2F0ZWQgYXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0IG9mIHRoZSBkZWNvZGVyIHN0YXRlLiBBbGwgcmVxdWlyZWQgZGF0YQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCBhdCBpbml0aWFsaXphdGlvbiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB4el9kZWNfcnVuKCkgY2Fubm90IHJldHVybiBYWl9NRU1fRVJST1IuCisgKiBAWFpfUFJFQUxMT0M6ICAgICAgICAgICAgTXVsdGktY2FsbCBtb2RlIHdpdGggcHJlYWxsb2NhdGVkIExaTUEyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeSBidWZmZXIuIEFsbCBkYXRhIHN0cnVjdHVyZXMgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGF0IGluaXRpYWxpemF0aW9uLCBzbyB4el9kZWNfcnVuKCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5ub3QgcmV0dXJuIFhaX01FTV9FUlJPUi4KKyAqIEBYWl9EWU5BTExPQzogICAgICAgICAgICBNdWx0aS1jYWxsIG1vZGUuIFRoZSBMWk1BMiBkaWN0aW9uYXJ5IGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIG9uY2UgdGhlIHJlcXVpcmVkIHNpemUgaGFzIGJlZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgZnJvbSB0aGUgc3RyZWFtIGhlYWRlcnMuIElmIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gZmFpbHMsIHh6X2RlY19ydW4oKSB3aWxsIHJldHVybgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFhaX01FTV9FUlJPUi4KKyAqCisgKiBJdCBpcyBwb3NzaWJsZSB0byBlbmFibGUgc3VwcG9ydCBvbmx5IGZvciBhIHN1YnNldCBvZiB0aGUgYWJvdmUKKyAqIG1vZGVzIGF0IGNvbXBpbGUgdGltZSBieSBkZWZpbmluZyBYWl9ERUNfU0lOR0xFLCBYWl9ERUNfUFJFQUxMT0MsCisgKiBvciBYWl9ERUNfRFlOQUxMT0MuIFRoZSB4el9kZWMga2VybmVsIG1vZHVsZSBpcyBhbHdheXMgY29tcGlsZWQKKyAqIHdpdGggc3VwcG9ydCBmb3IgYWxsIG9wZXJhdGlvbiBtb2RlcywgYnV0IHRoZSBwcmVib290IGNvZGUgbWF5CisgKiBiZSBidWlsdCB3aXRoIGZld2VyIGZlYXR1cmVzIHRvIG1pbmltaXplIGNvZGUgc2l6ZS4KKyAqLworZW51bSB4el9tb2RlIHsKKwlYWl9TSU5HTEUsCisJWFpfUFJFQUxMT0MsCisJWFpfRFlOQUxMT0MKK307CisKKy8qKgorICogZW51bSB4el9yZXQgLSBSZXR1cm4gY29kZXMKKyAqIEBYWl9PSzogICAgICAgICAgICAgICAgICBFdmVyeXRoaW5nIGlzIE9LIHNvIGZhci4gTW9yZSBpbnB1dCBvciBtb3JlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHNwYWNlIGlzIHJlcXVpcmVkIHRvIGNvbnRpbnVlLiBUaGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUgaXMgcG9zc2libGUgb25seSBpbiBtdWx0aS1jYWxsIG1vZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAoWFpfUFJFQUxMT0Mgb3IgWFpfRFlOQUxMT0MpLgorICogQFhaX1NUUkVBTV9FTkQ6ICAgICAgICAgIE9wZXJhdGlvbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHkuCisgKiBAWFpfVU5TVVBQT1JURURfQ0hFQ0s6ICAgSW50ZWdyaXR5IGNoZWNrIHR5cGUgaXMgbm90IHN1cHBvcnRlZC4gRGVjb2RpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzdGlsbCBwb3NzaWJsZSBpbiBtdWx0aS1jYWxsIG1vZGUgYnkgc2ltcGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZyB4el9kZWNfcnVuKCkgYWdhaW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgcmV0dXJuIHZhbHVlIGlzIHVzZWQgb25seSBpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFhaX0RFQ19BTllfQ0hFQ0sgd2FzIGRlZmluZWQgYXQgYnVpbGQgdGltZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBpcyBub3QgdXNlZCBpbiB0aGUga2VybmVsLiBVbnN1cHBvcnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrIHR5cGVzIHJldHVybiBYWl9PUFRJT05TX0VSUk9SIGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgWFpfREVDX0FOWV9DSEVDSyB3YXMgbm90IGRlZmluZWQgYXQgYnVpbGQgdGltZS4KKyAqIEBYWl9NRU1fRVJST1I6ICAgICAgICAgICBBbGxvY2F0aW5nIG1lbW9yeSBmYWlsZWQuIFRoaXMgcmV0dXJuIGNvZGUgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBvbmx5IGlmIHRoZSBkZWNvZGVyIHdhcyBpbml0aWFsaXplZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggWFpfRFlOQUxMT0MuIFRoZSBhbW91bnQgb2YgbWVtb3J5IHRoYXQgd2FzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZWQgdG8gYmUgYWxsb2NhdGVkIHdhcyBubyBtb3JlIHRoYW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdF9tYXggYXJndW1lbnQgZ2l2ZW4gdG8geHpfZGVjX2luaXQoKS4KKyAqIEBYWl9NRU1MSU1JVF9FUlJPUjogICAgICBBIGJpZ2dlciBMWk1BMiBkaWN0aW9uYXJ5IHdvdWxkIGJlIG5lZWRlZCB0aGFuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCBieSB0aGUgZGljdF9tYXggYXJndW1lbnQgZ2l2ZW4gdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB4el9kZWNfaW5pdCgpLiBUaGlzIHJldHVybiB2YWx1ZSBpcyBwb3NzaWJsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgaW4gbXVsdGktY2FsbCBtb2RlIChYWl9QUkVBTExPQyBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFhaX0RZTkFMTE9DKTsgdGhlIHNpbmdsZS1jYWxsIG1vZGUgKFhaX1NJTkdMRSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVzIHRoZSBkaWN0X21heCBhcmd1bWVudC4KKyAqIEBYWl9GT1JNQVRfRVJST1I6ICAgICAgICBGaWxlIGZvcm1hdCB3YXMgbm90IHJlY29nbml6ZWQgKHdyb25nIG1hZ2ljCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMpLgorICogQFhaX09QVElPTlNfRVJST1I6ICAgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbiBvcHRpb25zLiBJbiB0aGUgZGVjb2RlciB0aGlzIG1lYW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgaGVhZGVyIENSQzMyIG1hdGNoZXMsIGJ1dCB0aGUgaGVhZGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmIHNwZWNpZmllcyBzb21ldGhpbmcgdGhhdCB3ZSBkb24ndCBzdXBwb3J0LgorICogQFhaX0RBVEFfRVJST1I6ICAgICAgICAgIENvbXByZXNzZWQgZGF0YSBpcyBjb3JydXB0LgorICogQFhaX0JVRl9FUlJPUjogICAgICAgICAgIENhbm5vdCBtYWtlIGFueSBwcm9ncmVzcy4gRGV0YWlscyBhcmUgc2xpZ2h0bHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgYmV0d2VlbiBtdWx0aS1jYWxsIGFuZCBzaW5nbGUtY2FsbAorICogICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU7IG1vcmUgaW5mb3JtYXRpb24gYmVsb3cuCisgKgorICogSW4gbXVsdGktY2FsbCBtb2RlLCBYWl9CVUZfRVJST1IgaXMgcmV0dXJuZWQgd2hlbiB0d28gY29uc2VjdXRpdmUgY2FsbHMKKyAqIHRvIFhaIGNvZGUgY2Fubm90IGNvbnN1bWUgYW55IGlucHV0IGFuZCBjYW5ub3QgcHJvZHVjZSBhbnkgbmV3IG91dHB1dC4KKyAqIFRoaXMgaGFwcGVucyB3aGVuIHRoZXJlIGlzIG5vIG5ldyBpbnB1dCBhdmFpbGFibGUsIG9yIHRoZSBvdXRwdXQgYnVmZmVyCisgKiBpcyBmdWxsIHdoaWxlIGF0IGxlYXN0IG9uZSBvdXRwdXQgYnl0ZSBpcyBzdGlsbCBwZW5kaW5nLiBBc3N1bWluZyB5b3VyCisgKiBjb2RlIGlzIG5vdCBidWdneSwgeW91IGNhbiBnZXQgdGhpcyBlcnJvciBvbmx5IHdoZW4gZGVjb2RpbmcgYSBjb21wcmVzc2VkCisgKiBzdHJlYW0gdGhhdCBpcyB0cnVuY2F0ZWQgb3Igb3RoZXJ3aXNlIGNvcnJ1cHQuCisgKgorICogSW4gc2luZ2xlLWNhbGwgbW9kZSwgWFpfQlVGX0VSUk9SIGlzIHJldHVybmVkIG9ubHkgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlcgorICogaXMgdG9vIHNtYWxsIG9yIHRoZSBjb21wcmVzc2VkIGlucHV0IGlzIGNvcnJ1cHQgaW4gYSB3YXkgdGhhdCBtYWtlcyB0aGUKKyAqIGRlY29kZXIgcHJvZHVjZSBtb3JlIG91dHB1dCB0aGFuIHRoZSBjYWxsZXIgZXhwZWN0ZWQuIFdoZW4gaXQgaXMKKyAqIChyZWxhdGl2ZWx5KSBjbGVhciB0aGF0IHRoZSBjb21wcmVzc2VkIGlucHV0IGlzIHRydW5jYXRlZCwgWFpfREFUQV9FUlJPUgorICogaXMgdXNlZCBpbnN0ZWFkIG9mIFhaX0JVRl9FUlJPUi4KKyAqLworZW51bSB4el9yZXQgeworCVhaX09LLAorCVhaX1NUUkVBTV9FTkQsCisJWFpfVU5TVVBQT1JURURfQ0hFQ0ssCisJWFpfTUVNX0VSUk9SLAorCVhaX01FTUxJTUlUX0VSUk9SLAorCVhaX0ZPUk1BVF9FUlJPUiwKKwlYWl9PUFRJT05TX0VSUk9SLAorCVhaX0RBVEFfRVJST1IsCisJWFpfQlVGX0VSUk9SCit9OworCisvKioKKyAqIHN0cnVjdCB4el9idWYgLSBQYXNzaW5nIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyB0byBYWiBjb2RlCisgKiBAaW46ICAgICAgICAgQmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBidWZmZXIuIFRoaXMgbWF5IGJlIE5VTEwgaWYgYW5kIG9ubHkKKyAqICAgICAgICAgICAgICBpZiBpbl9wb3MgaXMgZXF1YWwgdG8gaW5fc2l6ZS4KKyAqIEBpbl9wb3M6ICAgICBDdXJyZW50IHBvc2l0aW9uIGluIHRoZSBpbnB1dCBidWZmZXIuIFRoaXMgbXVzdCBub3QgZXhjZWVkCisgKiAgICAgICAgICAgICAgaW5fc2l6ZS4KKyAqIEBpbl9zaXplOiAgICBTaXplIG9mIHRoZSBpbnB1dCBidWZmZXIKKyAqIEBvdXQ6ICAgICAgICBCZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBidWZmZXIuIFRoaXMgbWF5IGJlIE5VTEwgaWYgYW5kIG9ubHkKKyAqICAgICAgICAgICAgICBpZiBvdXRfcG9zIGlzIGVxdWFsIHRvIG91dF9zaXplLgorICogQG91dF9wb3M6ICAgIEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIG91dHB1dCBidWZmZXIuIFRoaXMgbXVzdCBub3QgZXhjZWVkCisgKiAgICAgICAgICAgICAgb3V0X3NpemUuCisgKiBAb3V0X3NpemU6ICAgU2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgorICoKKyAqIE9ubHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgYnVmZmVyIGZyb20gb3V0W291dF9wb3NdIG9ud2FyZCwgYW5kCisgKiB0aGUgdmFyaWFibGVzIGluX3BvcyBhbmQgb3V0X3BvcyBhcmUgbW9kaWZpZWQgYnkgdGhlIFhaIGNvZGUuCisgKi8KK3N0cnVjdCB4el9idWYgeworCWNvbnN0IHVpbnQ4X3QgKmluOworCXNpemVfdCBpbl9wb3M7CisJc2l6ZV90IGluX3NpemU7CisKKwl1aW50OF90ICpvdXQ7CisJc2l6ZV90IG91dF9wb3M7CisJc2l6ZV90IG91dF9zaXplOworfTsKKworLyoqCisgKiBzdHJ1Y3QgeHpfZGVjIC0gT3BhcXVlIHR5cGUgdG8gaG9sZCB0aGUgWFogZGVjb2RlciBzdGF0ZQorICovCitzdHJ1Y3QgeHpfZGVjOworCisvKioKKyAqIHh6X2RlY19pbml0KCkgLSBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIFhaIGRlY29kZXIgc3RhdGUKKyAqIEBtb2RlOiAgICAgICBPcGVyYXRpb24gbW9kZQorICogQGRpY3RfbWF4OiAgIE1heGltdW0gc2l6ZSBvZiB0aGUgTFpNQTIgZGljdGlvbmFyeSAoaGlzdG9yeSBidWZmZXIpIGZvcgorICogICAgICAgICAgICAgIG11bHRpLWNhbGwgZGVjb2RpbmcuIFRoaXMgaXMgaWdub3JlZCBpbiBzaW5nbGUtY2FsbCBtb2RlCisgKiAgICAgICAgICAgICAgKG1vZGUgPT0gWFpfU0lOR0xFKS4gTFpNQTIgZGljdGlvbmFyeSBpcyBhbHdheXMgMl5uIGJ5dGVzCisgKiAgICAgICAgICAgICAgb3IgMl5uICsgMl4obi0xKSBieXRlcyAodGhlIGxhdHRlciBzaXplcyBhcmUgbGVzcyBjb21tb24KKyAqICAgICAgICAgICAgICBpbiBwcmFjdGljZSksIHNvIG90aGVyIHZhbHVlcyBmb3IgZGljdF9tYXggZG9uJ3QgbWFrZSBzZW5zZS4KKyAqICAgICAgICAgICAgICBJbiB0aGUga2VybmVsLCBkaWN0aW9uYXJ5IHNpemVzIG9mIDY0IEtpQiwgMTI4IEtpQiwgMjU2IEtpQiwKKyAqICAgICAgICAgICAgICA1MTIgS2lCLCBhbmQgMSBNaUIgYXJlIHByb2JhYmx5IHRoZSBvbmx5IHJlYXNvbmFibGUgdmFsdWVzLAorICogICAgICAgICAgICAgIGV4Y2VwdCBmb3Iga2VybmVsIGFuZCBpbml0cmFtZnMgaW1hZ2VzIHdoZXJlIGEgYmlnZ2VyCisgKiAgICAgICAgICAgICAgZGljdGlvbmFyeSBjYW4gYmUgZmluZSBhbmQgdXNlZnVsLgorICoKKyAqIFNpbmdsZS1jYWxsIG1vZGUgKFhaX1NJTkdMRSk6IHh6X2RlY19ydW4oKSBkZWNvZGVzIHRoZSB3aG9sZSBzdHJlYW0gYXQKKyAqIG9uY2UuIFRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgdGhlIGRlY29kaW5nIHdpbGwKKyAqIGZhaWwuIFRoZSBvdXRwdXQgc3BhY2UgaXMgdXNlZCBhcyB0aGUgZGljdGlvbmFyeSBidWZmZXIsIHdoaWNoIGlzIHdoeQorICogdGhlcmUgaXMgbm8gbmVlZCB0byBhbGxvY2F0ZSB0aGUgZGljdGlvbmFyeSBhcyBwYXJ0IG9mIHRoZSBkZWNvZGVyJ3MKKyAqIGludGVybmFsIHN0YXRlLgorICoKKyAqIEJlY2F1c2UgdGhlIG91dHB1dCBidWZmZXIgaXMgdXNlZCBhcyB0aGUgd29ya3NwYWNlLCBzdHJlYW1zIGVuY29kZWQgdXNpbmcKKyAqIGEgYmlnIGRpY3Rpb25hcnkgYXJlIG5vdCBhIHByb2JsZW0gaW4gc2luZ2xlLWNhbGwgbW9kZS4gSXQgaXMgZW5vdWdoIHRoYXQKKyAqIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgYWN0dWFsIHVuY29tcHJlc3NlZCBkYXRhOyBpdAorICogY2FuIGJlIHNtYWxsZXIgdGhhbiB0aGUgZGljdGlvbmFyeSBzaXplIHN0b3JlZCBpbiB0aGUgc3RyZWFtIGhlYWRlcnMuCisgKgorICogTXVsdGktY2FsbCBtb2RlIHdpdGggcHJlYWxsb2NhdGVkIGRpY3Rpb25hcnkgKFhaX1BSRUFMTE9DKTogZGljdF9tYXggYnl0ZXMKKyAqIG9mIG1lbW9yeSBpcyBwcmVhbGxvY2F0ZWQgZm9yIHRoZSBMWk1BMiBkaWN0aW9uYXJ5LiBUaGlzIHdheSB0aGVyZSBpcyBubworICogcmlzayB0aGF0IHh6X2RlY19ydW4oKSBjb3VsZCBydW4gb3V0IG9mIG1lbW9yeSwgc2luY2UgeHpfZGVjX3J1bigpIHdpbGwKKyAqIG5ldmVyIGFsbG9jYXRlIGFueSBtZW1vcnkuIEluc3RlYWQsIGlmIHRoZSBwcmVhbGxvY2F0ZWQgZGljdGlvbmFyeSBpcyB0b28KKyAqIHNtYWxsIGZvciBkZWNvZGluZyB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtLCB4el9kZWNfcnVuKCkgd2lsbCByZXR1cm4KKyAqIFhaX01FTUxJTUlUX0VSUk9SLiBUaHVzLCBpdCBpcyBpbXBvcnRhbnQgdG8ga25vdyB3aGF0IGtpbmQgb2YgZGF0YSB3aWxsIGJlCisgKiBkZWNvZGVkIHRvIGF2b2lkIGFsbG9jYXRpbmcgZXhjZXNzaXZlIGFtb3VudCBvZiBtZW1vcnkgZm9yIHRoZSBkaWN0aW9uYXJ5LgorICoKKyAqIE11bHRpLWNhbGwgbW9kZSB3aXRoIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkaWN0aW9uYXJ5IChYWl9EWU5BTExPQyk6CisgKiBkaWN0X21heCBzcGVjaWZpZXMgdGhlIG1heGltdW0gYWxsb3dlZCBkaWN0aW9uYXJ5IHNpemUgdGhhdCB4el9kZWNfcnVuKCkKKyAqIG1heSBhbGxvY2F0ZSBvbmNlIGl0IGhhcyBwYXJzZWQgdGhlIGRpY3Rpb25hcnkgc2l6ZSBmcm9tIHRoZSBzdHJlYW0KKyAqIGhlYWRlcnMuIFRoaXMgd2F5IGV4Y2Vzc2l2ZSBhbGxvY2F0aW9ucyBjYW4gYmUgYXZvaWRlZCB3aGlsZSBzdGlsbAorICogbGltaXRpbmcgdGhlIG1heGltdW0gbWVtb3J5IHVzYWdlIHRvIGEgc2FuZSB2YWx1ZSB0byBwcmV2ZW50IHJ1bm5pbmcgdGhlCisgKiBzeXN0ZW0gb3V0IG9mIG1lbW9yeSB3aGVuIGRlY29tcHJlc3Npbmcgc3RyZWFtcyBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHh6X2RlY19pbml0KCkgcmV0dXJucyBhIHBvaW50ZXIgdG8gc3RydWN0IHh6X2RlYywgd2hpY2ggaXMKKyAqIHJlYWR5IHRvIGJlIHVzZWQgd2l0aCB4el9kZWNfcnVuKCkuIElmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLAorICogeHpfZGVjX2luaXQoKSByZXR1cm5zIE5VTEwuCisgKi8KK1haX0VYVEVSTiBzdHJ1Y3QgeHpfZGVjICp4el9kZWNfaW5pdChlbnVtIHh6X21vZGUgbW9kZSwgdWludDMyX3QgZGljdF9tYXgpOworCisvKioKKyAqIHh6X2RlY19ydW4oKSAtIFJ1biB0aGUgWFogZGVjb2RlcgorICogQHM6ICAgICAgICAgIERlY29kZXIgc3RhdGUgYWxsb2NhdGVkIHVzaW5nIHh6X2RlY19pbml0KCkKKyAqIEBiOiAgICAgICAgICBJbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKKyAqCisgKiBUaGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcyBkZXBlbmQgb24gYnVpbGQgb3B0aW9ucyBhbmQgb3BlcmF0aW9uIG1vZGUuCisgKiBTZWUgZW51bSB4el9yZXQgZm9yIGRldGFpbHMuCisgKgorICogTm90ZSB0aGF0IGlmIGFuIGVycm9yIG9jY3VycyBpbiBzaW5nbGUtY2FsbCBtb2RlIChyZXR1cm4gdmFsdWUgaXMgbm90CisgKiBYWl9TVFJFQU1fRU5EKSwgYi0+aW5fcG9zIGFuZCBiLT5vdXRfcG9zIGFyZSBub3QgbW9kaWZpZWQgYW5kIHRoZQorICogY29udGVudHMgb2YgdGhlIG91dHB1dCBidWZmZXIgZnJvbSBiLT5vdXRbYi0+b3V0X3Bvc10gb253YXJkIGFyZQorICogdW5kZWZpbmVkLiBUaGlzIGlzIHRydWUgZXZlbiBhZnRlciBYWl9CVUZfRVJST1IsIGJlY2F1c2Ugd2l0aCBzb21lIGZpbHRlcgorICogY2hhaW5zLCB0aGVyZSBtYXkgYmUgYSBzZWNvbmQgcGFzcyBvdmVyIHRoZSBvdXRwdXQgYnVmZmVyLCBhbmQgdGhpcyBwYXNzCisgKiBjYW5ub3QgYmUgcHJvcGVybHkgZG9uZSBpZiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyB0cnVuY2F0ZWQuIFRodXMsIHlvdQorICogY2Fubm90IGdpdmUgdGhlIHNpbmdsZS1jYWxsIGRlY29kZXIgYSB0b28gc21hbGwgYnVmZmVyIGFuZCB0aGVuIGV4cGVjdCB0bworICogZ2V0IHRoYXQgYW1vdW50IHZhbGlkIGRhdGEgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uIFlvdSBtdXN0IHVzZQorICogdGhlIG11bHRpLWNhbGwgZGVjb2RlciBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1bmNvbXByZXNzIHRoZSB3aG9sZSBzdHJlYW0uCisgKi8KK1haX0VYVEVSTiBlbnVtIHh6X3JldCB4el9kZWNfcnVuKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpOworCisvKioKKyAqIHh6X2RlY19yZXNldCgpIC0gUmVzZXQgYW4gYWxyZWFkeSBhbGxvY2F0ZWQgZGVjb2RlciBzdGF0ZQorICogQHM6ICAgICAgICAgIERlY29kZXIgc3RhdGUgYWxsb2NhdGVkIHVzaW5nIHh6X2RlY19pbml0KCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc2V0IHRoZSBtdWx0aS1jYWxsIGRlY29kZXIgc3RhdGUgd2l0aG91dAorICogZnJlZWluZyBhbmQgcmVhbGxvY2F0aW5nIG1lbW9yeSB3aXRoIHh6X2RlY19lbmQoKSBhbmQgeHpfZGVjX2luaXQoKS4KKyAqCisgKiBJbiBzaW5nbGUtY2FsbCBtb2RlLCB4el9kZWNfcmVzZXQoKSBpcyBhbHdheXMgY2FsbGVkIGluIHRoZSBiZWdpbm5pbmcgb2YKKyAqIHh6X2RlY19ydW4oKS4gVGh1cywgZXhwbGljaXQgY2FsbCB0byB4el9kZWNfcmVzZXQoKSBpcyB1c2VmdWwgb25seSBpbgorICogbXVsdGktY2FsbCBtb2RlLgorICovCitYWl9FWFRFUk4gdm9pZCB4el9kZWNfcmVzZXQoc3RydWN0IHh6X2RlYyAqcyk7CisKKy8qKgorICogeHpfZGVjX2VuZCgpIC0gRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGRlY29kZXIgc3RhdGUKKyAqIEBzOiAgICAgICAgICBEZWNvZGVyIHN0YXRlIGFsbG9jYXRlZCB1c2luZyB4el9kZWNfaW5pdCgpLiBJZiBzIGlzIE5VTEwsCisgKiAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuCisgKi8KK1haX0VYVEVSTiB2b2lkIHh6X2RlY19lbmQoc3RydWN0IHh6X2RlYyAqcyk7CisKKy8qCisgKiBTdGFuZGFsb25lIGJ1aWxkICh1c2Vyc3BhY2UgYnVpbGQgb3IgaW4ta2VybmVsIGJ1aWxkIGZvciBib290IHRpbWUgdXNlKQorICogbmVlZHMgYSBDUkMzMiBpbXBsZW1lbnRhdGlvbi4gRm9yIG5vcm1hbCBpbi1rZXJuZWwgdXNlLCBrZXJuZWwncyBvd24KKyAqIENSQzMyIG1vZHVsZSBpcyB1c2VkIGluc3RlYWQsIGFuZCB1c2VycyBvZiB0aGlzIG1vZHVsZSBkb24ndCBuZWVkIHRvCisgKiBjYXJlIGFib3V0IHRoZSBmdW5jdGlvbnMgYmVsb3cuCisgKi8KKyNpZm5kZWYgWFpfSU5URVJOQUxfQ1JDMzIKKyMJaWZkZWYgX19LRVJORUxfXworIwkJZGVmaW5lIFhaX0lOVEVSTkFMX0NSQzMyIDAKKyMJZWxzZQorIwkJZGVmaW5lIFhaX0lOVEVSTkFMX0NSQzMyIDEKKyMJZW5kaWYKKyNlbmRpZgorCisvKgorICogSWYgQ1JDNjQgc3VwcG9ydCBoYXMgYmVlbiBlbmFibGVkIHdpdGggWFpfVVNFX0NSQzY0LCBhIENSQzY0CisgKiBpbXBsZW1lbnRhdGlvbiBpcyBuZWVkZWQgdG9vLgorICovCisjaWZuZGVmIFhaX1VTRV9DUkM2NAorIwl1bmRlZiBYWl9JTlRFUk5BTF9DUkM2NAorIwlkZWZpbmUgWFpfSU5URVJOQUxfQ1JDNjQgMAorI2VuZGlmCisjaWZuZGVmIFhaX0lOVEVSTkFMX0NSQzY0CisjCWlmZGVmIF9fS0VSTkVMX18KKyMJCWVycm9yIFVzaW5nIENSQzY0IGluIHRoZSBrZXJuZWwgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLgorIwllbHNlCisjCQlkZWZpbmUgWFpfSU5URVJOQUxfQ1JDNjQgMQorIwllbmRpZgorI2VuZGlmCisKKyNpZiBYWl9JTlRFUk5BTF9DUkMzMgorLyoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciB4el8qIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUKKyAqIHRoZSBDUkMzMiBsb29rdXAgdGFibGUuCisgKi8KK1haX0VYVEVSTiB2b2lkIHh6X2NyYzMyX2luaXQodm9pZCk7CisKKy8qCisgKiBVcGRhdGUgQ1JDMzIgdmFsdWUgdXNpbmcgdGhlIHBvbHlub21pYWwgZnJvbSBJRUVFLTgwMi4zLiBUbyBzdGFydCBhIG5ldworICogY2FsY3VsYXRpb24sIHRoZSB0aGlyZCBhcmd1bWVudCBtdXN0IGJlIHplcm8uIFRvIGNvbnRpbnVlIHRoZSBjYWxjdWxhdGlvbiwKKyAqIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIHZhbHVlIGlzIHBhc3NlZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQuCisgKi8KK1haX0VYVEVSTiB1aW50MzJfdCB4el9jcmMzMihjb25zdCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplLCB1aW50MzJfdCBjcmMpOworI2VuZGlmCisKKyNpZiBYWl9JTlRFUk5BTF9DUkM2NAorLyoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciB4el8qIGZ1bmN0aW9uIChleGNlcHQgeHpfY3JjMzJfaW5pdCgpKQorICogdG8gaW5pdGlhbGl6ZSB0aGUgQ1JDNjQgbG9va3VwIHRhYmxlLgorICovCitYWl9FWFRFUk4gdm9pZCB4el9jcmM2NF9pbml0KHZvaWQpOworCisvKgorICogVXBkYXRlIENSQzY0IHZhbHVlIHVzaW5nIHRoZSBwb2x5bm9taWFsIGZyb20gRUNNQS0xODIuIFRvIHN0YXJ0IGEgbmV3CisgKiBjYWxjdWxhdGlvbiwgdGhlIHRoaXJkIGFyZ3VtZW50IG11c3QgYmUgemVyby4gVG8gY29udGludWUgdGhlIGNhbGN1bGF0aW9uLAorICogdGhlIHByZXZpb3VzbHkgcmV0dXJuZWQgdmFsdWUgaXMgcGFzc2VkIGFzIHRoZSB0aGlyZCBhcmd1bWVudC4KKyAqLworWFpfRVhURVJOIHVpbnQ2NF90IHh6X2NyYzY0KGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUsIHVpbnQ2NF90IGNyYyk7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sem1hL3h6LWVtYmVkZGVkL3h6X2NvbmZpZy5oIGIvbHptYS94ei1lbWJlZGRlZC94el9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjg4YzUyCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS94ei1lbWJlZGRlZC94el9jb25maWcuaApAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIFByaXZhdGUgaW5jbHVkZXMgYW5kIGRlZmluaXRpb25zIGZvciB1c2Vyc3BhY2UgdXNlIG9mIFhaIEVtYmVkZGVkCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfQ09ORklHX0gKKyNkZWZpbmUgWFpfQ09ORklHX0gKKworLyogVW5jb21tZW50IHRvIGVuYWJsZSBDUkM2NCBzdXBwb3J0LiAqLworLyogI2RlZmluZSBYWl9VU0VfQ1JDNjQgKi8KKworLyogVW5jb21tZW50IGFzIG5lZWRlZCB0byBlbmFibGUgQkNKIGZpbHRlciBkZWNvZGVycy4gKi8KKyNkZWZpbmUgWFpfREVDX1g4NgorLyogI2RlZmluZSBYWl9ERUNfUE9XRVJQQyAqLworLyogI2RlZmluZSBYWl9ERUNfSUE2NCAqLworI2RlZmluZSBYWl9ERUNfQVJNCisjZGVmaW5lIFhaX0RFQ19BUk1USFVNQgorLyogI2RlZmluZSBYWl9ERUNfU1BBUkMgKi8KKworLyoKKyAqIE1TVkMgZG9lc24ndCBzdXBwb3J0IG1vZGVybiBDIGJ1dCBYWiBFbWJlZGRlZCBpcyBtb3N0bHkgQzg5CisgKiBzbyB0aGVzZSBhcmUgZW5vdWdoLgorICovCisjaWZkZWYgX01TQ19WRVIKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBib29sOworIwlkZWZpbmUgdHJ1ZSAxCisjCWRlZmluZSBmYWxzZSAwCisjCWRlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbHNlCisjCWluY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ4ei5oIgorCisjZGVmaW5lIGttYWxsb2Moc2l6ZSwgZmxhZ3MpIG1hbGxvYyhzaXplKQorI2RlZmluZSBrZnJlZShwdHIpIGZyZWUocHRyKQorI2RlZmluZSB2bWFsbG9jKHNpemUpIG1hbGxvYyhzaXplKQorI2RlZmluZSB2ZnJlZShwdHIpIGZyZWUocHRyKQorCisjZGVmaW5lIG1lbWVxKGEsIGIsIHNpemUpIChtZW1jbXAoYSwgYiwgc2l6ZSkgPT0gMCkKKyNkZWZpbmUgbWVtemVybyhidWYsIHNpemUpIG1lbXNldChidWYsIDAsIHNpemUpCisKKyNpZm5kZWYgbWluCisjCWRlZmluZSBtaW4oeCwgeSkgKCh4KSA8ICh5KSA/ICh4KSA6ICh5KSkKKyNlbmRpZgorI2RlZmluZSBtaW5fdCh0eXBlLCB4LCB5KSBtaW4oeCwgeSkKKworLyoKKyAqIFNvbWUgZnVuY3Rpb25zIGhhdmUgYmVlbiBtYXJrZWQgd2l0aCBfX2Fsd2F5c19pbmxpbmUgdG8ga2VlcCB0aGUKKyAqIHBlcmZvcm1hbmNlIHJlYXNvbmFibGUgZXZlbiB3aGVuIHRoZSBjb21waWxlciBpcyBvcHRpbWl6aW5nIGZvcgorICogc21hbGwgY29kZSBzaXplLiBZb3UgbWF5IGJlIGFibGUgdG8gc2F2ZSBhIGZldyBieXRlcyBieSAjZGVmaW5pbmcKKyAqIF9fYWx3YXlzX2lubGluZSB0byBwbGFpbiBpbmxpbmUsIGJ1dCBkb24ndCBjb21wbGFpbiBpZiB0aGUgY29kZQorICogYmVjb21lcyBzbG93LgorICoKKyAqIE5PVEU6IFN5c3RlbSBoZWFkZXJzIG9uIEdOVS9MaW51eCBtYXkgI2RlZmluZSB0aGlzIG1hY3JvIGFscmVhZHksCisgKiBzbyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgaXQsIHlvdSBuZWVkIHRvICN1bmRlZiBpdCBmaXJzdC4KKyAqLworI2lmbmRlZiBfX2Fsd2F5c19pbmxpbmUKKyMJaWZkZWYgX19HTlVDX18KKyMJCWRlZmluZSBfX2Fsd2F5c19pbmxpbmUgXAorCQkJaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKKyMJZWxzZQorIwkJZGVmaW5lIF9fYWx3YXlzX2lubGluZSBpbmxpbmUKKyMJZW5kaWYKKyNlbmRpZgorCisvKiBJbmxpbmUgZnVuY3Rpb25zIHRvIGFjY2VzcyB1bmFsaWduZWQgdW5zaWduZWQgMzItYml0IGludGVnZXJzICovCisjaWZuZGVmIGdldF91bmFsaWduZWRfbGUzMgorc3RhdGljIGlubGluZSB1aW50MzJfdCBnZXRfdW5hbGlnbmVkX2xlMzIoY29uc3QgdWludDhfdCAqYnVmKQoreworCXJldHVybiAodWludDMyX3QpYnVmWzBdCisJCQl8ICgodWludDMyX3QpYnVmWzFdIDw8IDgpCisJCQl8ICgodWludDMyX3QpYnVmWzJdIDw8IDE2KQorCQkJfCAoKHVpbnQzMl90KWJ1ZlszXSA8PCAyNCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBnZXRfdW5hbGlnbmVkX2JlMzIKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZ2V0X3VuYWxpZ25lZF9iZTMyKGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3sKKwlyZXR1cm4gKHVpbnQzMl90KShidWZbMF0gPDwgMjQpCisJCQl8ICgodWludDMyX3QpYnVmWzFdIDw8IDE2KQorCQkJfCAoKHVpbnQzMl90KWJ1ZlsyXSA8PCA4KQorCQkJfCAodWludDMyX3QpYnVmWzNdOworfQorI2VuZGlmCisKKyNpZm5kZWYgcHV0X3VuYWxpZ25lZF9sZTMyCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3VuYWxpZ25lZF9sZTMyKHVpbnQzMl90IHZhbCwgdWludDhfdCAqYnVmKQoreworCWJ1ZlswXSA9ICh1aW50OF90KXZhbDsKKwlidWZbMV0gPSAodWludDhfdCkodmFsID4+IDgpOworCWJ1ZlsyXSA9ICh1aW50OF90KSh2YWwgPj4gMTYpOworCWJ1ZlszXSA9ICh1aW50OF90KSh2YWwgPj4gMjQpOworfQorI2VuZGlmCisKKyNpZm5kZWYgcHV0X3VuYWxpZ25lZF9iZTMyCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3VuYWxpZ25lZF9iZTMyKHVpbnQzMl90IHZhbCwgdWludDhfdCAqYnVmKQoreworCWJ1ZlswXSA9ICh1aW50OF90KSh2YWwgPj4gMjQpOworCWJ1ZlsxXSA9ICh1aW50OF90KSh2YWwgPj4gMTYpOworCWJ1ZlsyXSA9ICh1aW50OF90KSh2YWwgPj4gOCk7CisJYnVmWzNdID0gKHVpbnQ4X3QpdmFsOworfQorI2VuZGlmCisKKy8qCisgKiBVc2UgZ2V0X3VuYWxpZ25lZF9sZTMyKCkgYWxzbyBmb3IgYWxpZ25lZCBhY2Nlc3MgZm9yIHNpbXBsaWNpdHkuIE9uCisgKiBsaXR0bGUgZW5kaWFuIHN5c3RlbXMsICNkZWZpbmUgZ2V0X2xlMzIocHRyKSAoKihjb25zdCB1aW50MzJfdCAqKShwdHIpKQorICogY291bGQgc2F2ZSBhIGZldyBieXRlcyBpbiBjb2RlIHNpemUuCisgKi8KKyNpZm5kZWYgZ2V0X2xlMzIKKyMJZGVmaW5lIGdldF9sZTMyIGdldF91bmFsaWduZWRfbGUzMgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbHptYS94ei1lbWJlZGRlZC94el9jcmMzMi5jIGIvbHptYS94ei1lbWJlZGRlZC94el9jcmMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTMyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL3h6LWVtYmVkZGVkL3h6X2NyYzMyLmMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENSQzMyIHVzaW5nIHRoZSBwb2x5bm9taWFsIGZyb20gSUVFRS04MDIuMworICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworLyoKKyAqIFRoaXMgaXMgbm90IHRoZSBmYXN0ZXN0IGltcGxlbWVudGF0aW9uLCBidXQgaXQgaXMgcHJldHR5IGNvbXBhY3QuCisgKiBUaGUgZmFzdGVzdCB2ZXJzaW9ucyBvZiB4el9jcmMzMigpIG9uIG1vZGVybiBDUFVzIHdpdGhvdXQgaGFyZHdhcmUKKyAqIGFjY2VsZXJhdGVkIENSQyBpbnN0cnVjdGlvbiBhcmUgMy01IHRpbWVzIGFzIGZhc3QgYXMgdGhpcyB2ZXJzaW9uLAorICogYnV0IHRoZXkgYXJlIGJpZ2dlciBhbmQgdXNlIG1vcmUgbWVtb3J5IGZvciB0aGUgbG9va3VwIHRhYmxlLgorICovCisKKyNpbmNsdWRlICJ4el9wcml2YXRlLmgiCisKKy8qCisgKiBTVEFUSUNfUldfREFUQSBpcyB1c2VkIGluIHRoZSBwcmUtYm9vdCBlbnZpcm9ubWVudCBvbiBzb21lIGFyY2hpdGVjdHVyZXMuCisgKiBTZWUgPGxpbnV4L2RlY29tcHJlc3MvbW0uaD4gZm9yIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgU1RBVElDX1JXX0RBVEEKKyMJZGVmaW5lIFNUQVRJQ19SV19EQVRBIHN0YXRpYworI2VuZGlmCisKK1NUQVRJQ19SV19EQVRBIHVpbnQzMl90IHh6X2NyYzMyX3RhYmxlWzI1Nl07CisKK1haX0VYVEVSTiB2b2lkIHh6X2NyYzMyX2luaXQodm9pZCkKK3sKKwljb25zdCB1aW50MzJfdCBwb2x5ID0gMHhFREI4ODMyMDsKKworCXVpbnQzMl90IGk7CisJdWludDMyX3QgajsKKwl1aW50MzJfdCByOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CisJCXIgPSBpOworCQlmb3IgKGogPSAwOyBqIDwgODsgKytqKQorCQkJciA9IChyID4+IDEpIF4gKHBvbHkgJiB+KChyICYgMSkgLSAxKSk7CisKKwkJeHpfY3JjMzJfdGFibGVbaV0gPSByOworCX0KKworCXJldHVybjsKK30KKworWFpfRVhURVJOIHVpbnQzMl90IHh6X2NyYzMyKGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUsIHVpbnQzMl90IGNyYykKK3sKKwljcmMgPSB+Y3JjOworCisJd2hpbGUgKHNpemUgIT0gMCkgeworCQljcmMgPSB4el9jcmMzMl90YWJsZVsqYnVmKysgXiAoY3JjICYgMHhGRildIF4gKGNyYyA+PiA4KTsKKwkJLS1zaXplOworCX0KKworCXJldHVybiB+Y3JjOworfQpkaWZmIC0tZ2l0IGEvbHptYS94ei1lbWJlZGRlZC94el9jcmM2NC5jIGIvbHptYS94ei1lbWJlZGRlZC94el9jcmM2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMWNhZWUKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL3h6LWVtYmVkZGVkL3h6X2NyYzY0LmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENSQzY0IHVzaW5nIHRoZSBwb2x5bm9taWFsIGZyb20gRUNNQS0xODIKKyAqCisgKiBUaGlzIGZpbGUgaXMgc2ltaWxhciB0byB4el9jcmMzMi5jLiBTZWUgdGhlIGNvbW1lbnRzIHRoZXJlLgorICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworI2luY2x1ZGUgInh6X3ByaXZhdGUuaCIKKworI2lmbmRlZiBTVEFUSUNfUldfREFUQQorIwlkZWZpbmUgU1RBVElDX1JXX0RBVEEgc3RhdGljCisjZW5kaWYKKworU1RBVElDX1JXX0RBVEEgdWludDY0X3QgeHpfY3JjNjRfdGFibGVbMjU2XTsKKworWFpfRVhURVJOIHZvaWQgeHpfY3JjNjRfaW5pdCh2b2lkKQoreworCWNvbnN0IHVpbnQ2NF90IHBvbHkgPSAweEM5NkM1Nzk1RDc4NzBGNDI7CisKKwl1aW50MzJfdCBpOworCXVpbnQzMl90IGo7CisJdWludDY0X3QgcjsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworCQlyID0gaTsKKwkJZm9yIChqID0gMDsgaiA8IDg7ICsraikKKwkJCXIgPSAociA+PiAxKSBeIChwb2x5ICYgfigociAmIDEpIC0gMSkpOworCisJCXh6X2NyYzY0X3RhYmxlW2ldID0gcjsKKwl9CisKKwlyZXR1cm47Cit9CisKK1haX0VYVEVSTiB1aW50NjRfdCB4el9jcmM2NChjb25zdCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplLCB1aW50NjRfdCBjcmMpCit7CisJY3JjID0gfmNyYzsKKworCXdoaWxlIChzaXplICE9IDApIHsKKwkJY3JjID0geHpfY3JjNjRfdGFibGVbKmJ1ZisrIF4gKGNyYyAmIDB4RkYpXSBeIChjcmMgPj4gOCk7CisJCS0tc2l6ZTsKKwl9CisKKwlyZXR1cm4gfmNyYzsKK30KZGlmZiAtLWdpdCBhL2x6bWEveHotZW1iZWRkZWQveHpfZGVjX2Jjai5jIGIvbHptYS94ei1lbWJlZGRlZC94el9kZWNfYmNqLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2OGU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEveHotZW1iZWRkZWQveHpfZGVjX2Jjai5jCkBAIC0wLDAgKzEsNTc0IEBACisvKgorICogQnJhbmNoL0NhbGwvSnVtcCAoQkNKKSBmaWx0ZXIgZGVjb2RlcnMKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpbmNsdWRlICJ4el9wcml2YXRlLmgiCisKKy8qCisgKiBUaGUgcmVzdCBvZiB0aGUgZmlsZSBpcyBpbnNpZGUgdGhpcyBpZmRlZi4gSXQgbWFrZXMgdGhpbmdzIGEgbGl0dGxlIG1vcmUKKyAqIGNvbnZlbmllbnQgd2hlbiBidWlsZGluZyB3aXRob3V0IHN1cHBvcnQgZm9yIGFueSBCQ0ogZmlsdGVycy4KKyAqLworI2lmZGVmIFhaX0RFQ19CQ0oKKworc3RydWN0IHh6X2RlY19iY2ogeworCS8qIFR5cGUgb2YgdGhlIEJDSiBmaWx0ZXIgYmVpbmcgdXNlZCAqLworCWVudW0geworCQlCQ0pfWDg2ID0gNCwgICAgICAgIC8qIHg4NiBvciB4ODYtNjQgKi8KKwkJQkNKX1BPV0VSUEMgPSA1LCAgICAvKiBCaWcgZW5kaWFuIG9ubHkgKi8KKwkJQkNKX0lBNjQgPSA2LCAgICAgICAvKiBCaWcgb3IgbGl0dGxlIGVuZGlhbiAqLworCQlCQ0pfQVJNID0gNywgICAgICAgIC8qIExpdHRsZSBlbmRpYW4gb25seSAqLworCQlCQ0pfQVJNVEhVTUIgPSA4LCAgIC8qIExpdHRsZSBlbmRpYW4gb25seSAqLworCQlCQ0pfU1BBUkMgPSA5ICAgICAgIC8qIEJpZyBvciBsaXR0bGUgZW5kaWFuICovCisJfSB0eXBlOworCisJLyoKKwkgKiBSZXR1cm4gdmFsdWUgb2YgdGhlIG5leHQgZmlsdGVyIGluIHRoZSBjaGFpbi4gV2UgbmVlZCB0byBwcmVzZXJ2ZQorCSAqIHRoaXMgaW5mb3JtYXRpb24gYWNyb3NzIGNhbGxzLCBiZWNhdXNlIHdlIG11c3Qgbm90IGNhbGwgdGhlIG5leHQKKwkgKiBmaWx0ZXIgYW55bW9yZSBvbmNlIGl0IGhhcyByZXR1cm5lZCBYWl9TVFJFQU1fRU5ELgorCSAqLworCWVudW0geHpfcmV0IHJldDsKKworCS8qIFRydWUgaWYgd2UgYXJlIG9wZXJhdGluZyBpbiBzaW5nbGUtY2FsbCBtb2RlLiAqLworCWJvb2wgc2luZ2xlX2NhbGw7CisKKwkvKgorCSAqIEFic29sdXRlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZAorCSAqIGRhdGEgKGluIGEgc2luZ2xlIC54eiBCbG9jaykuIFdlIGNhcmUgb25seSBhYm91dCB0aGUgbG93ZXN0IDMyCisJICogYml0cyBzbyB0aGlzIGRvZXNuJ3QgbmVlZCB0byBiZSB1aW50NjRfdCBldmVuIHdpdGggYmlnIGZpbGVzLgorCSAqLworCXVpbnQzMl90IHBvczsKKworCS8qIHg4NiBmaWx0ZXIgc3RhdGUgKi8KKwl1aW50MzJfdCB4ODZfcHJldl9tYXNrOworCisJLyogVGVtcG9yYXJ5IHNwYWNlIHRvIGhvbGQgdGhlIHZhcmlhYmxlcyBmcm9tIHN0cnVjdCB4el9idWYgKi8KKwl1aW50OF90ICpvdXQ7CisJc2l6ZV90IG91dF9wb3M7CisJc2l6ZV90IG91dF9zaXplOworCisJc3RydWN0IHsKKwkJLyogQW1vdW50IG9mIGFscmVhZHkgZmlsdGVyZWQgZGF0YSBpbiB0aGUgYmVnaW5uaW5nIG9mIGJ1ZiAqLworCQlzaXplX3QgZmlsdGVyZWQ7CisKKwkJLyogVG90YWwgYW1vdW50IG9mIGRhdGEgY3VycmVudGx5IHN0b3JlZCBpbiBidWYgICovCisJCXNpemVfdCBzaXplOworCisJCS8qCisJCSAqIEJ1ZmZlciB0byBob2xkIGEgbWl4IG9mIGZpbHRlcmVkIGFuZCB1bmZpbHRlcmVkIGRhdGEuIFRoaXMKKwkJICogbmVlZHMgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIEFsaWdubWVudCArIDIgKiBMb29rLWFoZWFkOgorCQkgKgorCQkgKiBUeXBlICAgICAgICAgQWxpZ25tZW50ICAgTG9vay1haGVhZAorCQkgKiB4ODYgICAgICAgICAgICAgIDEgICAgICAgICAgIDQKKwkJICogUG93ZXJQQyAgICAgICAgICA0ICAgICAgICAgICAwCisJCSAqIElBLTY0ICAgICAgICAgICAxNiAgICAgICAgICAgMAorCQkgKiBBUk0gICAgICAgICAgICAgIDQgICAgICAgICAgIDAKKwkJICogQVJNLVRodW1iICAgICAgICAyICAgICAgICAgICAyCisJCSAqIFNQQVJDICAgICAgICAgICAgNCAgICAgICAgICAgMAorCQkgKi8KKwkJdWludDhfdCBidWZbMTZdOworCX0gdGVtcDsKK307CisKKyNpZmRlZiBYWl9ERUNfWDg2CisvKgorICogVGhpcyBpcyB1c2VkIHRvIHRlc3QgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiBhIG1lbW9yeSBhZGRyZXNzCisgKiBpbiBhbiB4ODYgaW5zdHJ1Y3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJjal94ODZfdGVzdF9tc2J5dGUodWludDhfdCBiKQoreworCXJldHVybiBiID09IDB4MDAgfHwgYiA9PSAweEZGOworfQorCitzdGF0aWMgc2l6ZV90IGJjal94ODYoc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RhdGljIGNvbnN0IGJvb2wgbWFza190b19hbGxvd2VkX3N0YXR1c1s4XQorCQk9IHsgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UgfTsKKworCXN0YXRpYyBjb25zdCB1aW50OF90IG1hc2tfdG9fYml0X251bVs4XSA9IHsgMCwgMSwgMiwgMiwgMywgMywgMywgMyB9OworCisJc2l6ZV90IGk7CisJc2l6ZV90IHByZXZfcG9zID0gKHNpemVfdCktMTsKKwl1aW50MzJfdCBwcmV2X21hc2sgPSBzLT54ODZfcHJldl9tYXNrOworCXVpbnQzMl90IHNyYzsKKwl1aW50MzJfdCBkZXN0OworCXVpbnQzMl90IGo7CisJdWludDhfdCBiOworCisJaWYgKHNpemUgPD0gNCkKKwkJcmV0dXJuIDA7CisKKwlzaXplIC09IDQ7CisJZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgeworCQlpZiAoKGJ1ZltpXSAmIDB4RkUpICE9IDB4RTgpCisJCQljb250aW51ZTsKKworCQlwcmV2X3BvcyA9IGkgLSBwcmV2X3BvczsKKwkJaWYgKHByZXZfcG9zID4gMykgeworCQkJcHJldl9tYXNrID0gMDsKKwkJfSBlbHNlIHsKKwkJCXByZXZfbWFzayA9IChwcmV2X21hc2sgPDwgKHByZXZfcG9zIC0gMSkpICYgNzsKKwkJCWlmIChwcmV2X21hc2sgIT0gMCkgeworCQkJCWIgPSBidWZbaSArIDQgLSBtYXNrX3RvX2JpdF9udW1bcHJldl9tYXNrXV07CisJCQkJaWYgKCFtYXNrX3RvX2FsbG93ZWRfc3RhdHVzW3ByZXZfbWFza10KKwkJCQkJCXx8IGJjal94ODZfdGVzdF9tc2J5dGUoYikpIHsKKwkJCQkJcHJldl9wb3MgPSBpOworCQkJCQlwcmV2X21hc2sgPSAocHJldl9tYXNrIDw8IDEpIHwgMTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcHJldl9wb3MgPSBpOworCisJCWlmIChiY2pfeDg2X3Rlc3RfbXNieXRlKGJ1ZltpICsgNF0pKSB7CisJCQlzcmMgPSBnZXRfdW5hbGlnbmVkX2xlMzIoYnVmICsgaSArIDEpOworCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlkZXN0ID0gc3JjIC0gKHMtPnBvcyArICh1aW50MzJfdClpICsgNSk7CisJCQkJaWYgKHByZXZfbWFzayA9PSAwKQorCQkJCQlicmVhazsKKworCQkJCWogPSBtYXNrX3RvX2JpdF9udW1bcHJldl9tYXNrXSAqIDg7CisJCQkJYiA9ICh1aW50OF90KShkZXN0ID4+ICgyNCAtIGopKTsKKwkJCQlpZiAoIWJjal94ODZfdGVzdF9tc2J5dGUoYikpCisJCQkJCWJyZWFrOworCisJCQkJc3JjID0gZGVzdCBeICgoKHVpbnQzMl90KTEgPDwgKDMyIC0gaikpIC0gMSk7CisJCQl9CisKKwkJCWRlc3QgJj0gMHgwMUZGRkZGRjsKKwkJCWRlc3QgfD0gKHVpbnQzMl90KTAgLSAoZGVzdCAmIDB4MDEwMDAwMDApOworCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGRlc3QsIGJ1ZiArIGkgKyAxKTsKKwkJCWkgKz0gNDsKKwkJfSBlbHNlIHsKKwkJCXByZXZfbWFzayA9IChwcmV2X21hc2sgPDwgMSkgfCAxOworCQl9CisJfQorCisJcHJldl9wb3MgPSBpIC0gcHJldl9wb3M7CisJcy0+eDg2X3ByZXZfbWFzayA9IHByZXZfcG9zID4gMyA/IDAgOiBwcmV2X21hc2sgPDwgKHByZXZfcG9zIC0gMSk7CisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19QT1dFUlBDCitzdGF0aWMgc2l6ZV90IGJjal9wb3dlcnBjKHN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworCXNpemVfdCBpOworCXVpbnQzMl90IGluc3RyOworCisJZm9yIChpID0gMDsgaSArIDQgPD0gc2l6ZTsgaSArPSA0KSB7CisJCWluc3RyID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGJ1ZiArIGkpOworCQlpZiAoKGluc3RyICYgMHhGQzAwMDAwMykgPT0gMHg0ODAwMDAwMSkgeworCQkJaW5zdHIgJj0gMHgwM0ZGRkZGQzsKKwkJCWluc3RyIC09IHMtPnBvcyArICh1aW50MzJfdClpOworCQkJaW5zdHIgJj0gMHgwM0ZGRkZGQzsKKwkJCWluc3RyIHw9IDB4NDgwMDAwMDE7CisJCQlwdXRfdW5hbGlnbmVkX2JlMzIoaW5zdHIsIGJ1ZiArIGkpOworCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19JQTY0CitzdGF0aWMgc2l6ZV90IGJjal9pYTY0KHN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworCXN0YXRpYyBjb25zdCB1aW50OF90IGJyYW5jaF90YWJsZVszMl0gPSB7CisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCTQsIDQsIDYsIDYsIDAsIDAsIDcsIDcsCisJCTQsIDQsIDAsIDAsIDQsIDQsIDAsIDAKKwl9OworCisJLyoKKwkgKiBUaGUgbG9jYWwgdmFyaWFibGVzIHRha2UgYSBsaXR0bGUgYml0IHN0YWNrIHNwYWNlLCBidXQgaXQncyBsZXNzCisJICogdGhhbiB3aGF0IExaTUEyIGRlY29kZXIgdGFrZXMsIHNvIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZWR1Y2UKKwkgKiBzdGFjayB1c2FnZSBoZXJlIHdpdGhvdXQgZG9pbmcgdGhhdCBmb3IgdGhlIExaTUEyIGRlY29kZXIgdG9vLgorCSAqLworCisJLyogTG9vcCBjb3VudGVycyAqLworCXNpemVfdCBpOworCXNpemVfdCBqOworCisJLyogSW5zdHJ1Y3Rpb24gc2xvdCAoMCwgMSwgb3IgMikgaW4gdGhlIDEyOC1iaXQgaW5zdHJ1Y3Rpb24gd29yZCAqLworCXVpbnQzMl90IHNsb3Q7CisKKwkvKiBCaXR3aXNlIG9mZnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb24gaW5kaWNhdGVkIGJ5IHNsb3QgKi8KKwl1aW50MzJfdCBiaXRfcG9zOworCisJLyogYml0X3BvcyBzcGxpdCBpbnRvIGJ5dGUgYW5kIGJpdCBwYXJ0cyAqLworCXVpbnQzMl90IGJ5dGVfcG9zOworCXVpbnQzMl90IGJpdF9yZXM7CisKKwkvKiBBZGRyZXNzIHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24gKi8KKwl1aW50MzJfdCBhZGRyOworCisJLyogTWFzayB1c2VkIHRvIGRldGVjdCB3aGljaCBpbnN0cnVjdGlvbnMgdG8gY29udmVydCAqLworCXVpbnQzMl90IG1hc2s7CisKKwkvKiA0MS1iaXQgaW5zdHJ1Y3Rpb24gc3RvcmVkIHNvbWV3aGVyZSBpbiB0aGUgbG93ZXN0IDQ4IGJpdHMgKi8KKwl1aW50NjRfdCBpbnN0cjsKKworCS8qIEluc3RydWN0aW9uIG5vcm1hbGl6ZWQgd2l0aCBiaXRfcmVzIGZvciBlYXNpZXIgbWFuaXB1bGF0aW9uICovCisJdWludDY0X3Qgbm9ybTsKKworCWZvciAoaSA9IDA7IGkgKyAxNiA8PSBzaXplOyBpICs9IDE2KSB7CisJCW1hc2sgPSBicmFuY2hfdGFibGVbYnVmW2ldICYgMHgxRl07CisJCWZvciAoc2xvdCA9IDAsIGJpdF9wb3MgPSA1OyBzbG90IDwgMzsgKytzbG90LCBiaXRfcG9zICs9IDQxKSB7CisJCQlpZiAoKChtYXNrID4+IHNsb3QpICYgMSkgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJYnl0ZV9wb3MgPSBiaXRfcG9zID4+IDM7CisJCQliaXRfcmVzID0gYml0X3BvcyAmIDc7CisJCQlpbnN0ciA9IDA7CisJCQlmb3IgKGogPSAwOyBqIDwgNjsgKytqKQorCQkJCWluc3RyIHw9ICh1aW50NjRfdCkoYnVmW2kgKyBqICsgYnl0ZV9wb3NdKQorCQkJCQkJPDwgKDggKiBqKTsKKworCQkJbm9ybSA9IGluc3RyID4+IGJpdF9yZXM7CisKKwkJCWlmICgoKG5vcm0gPj4gMzcpICYgMHgwRikgPT0gMHgwNQorCQkJCQkmJiAoKG5vcm0gPj4gOSkgJiAweDA3KSA9PSAwKSB7CisJCQkJYWRkciA9IChub3JtID4+IDEzKSAmIDB4MEZGRkZGOworCQkJCWFkZHIgfD0gKCh1aW50MzJfdCkobm9ybSA+PiAzNikgJiAxKSA8PCAyMDsKKwkJCQlhZGRyIDw8PSA0OworCQkJCWFkZHIgLT0gcy0+cG9zICsgKHVpbnQzMl90KWk7CisJCQkJYWRkciA+Pj0gNDsKKworCQkJCW5vcm0gJj0gfigodWludDY0X3QpMHg4RkZGRkYgPDwgMTMpOworCQkJCW5vcm0gfD0gKHVpbnQ2NF90KShhZGRyICYgMHgwRkZGRkYpIDw8IDEzOworCQkJCW5vcm0gfD0gKHVpbnQ2NF90KShhZGRyICYgMHgxMDAwMDApCisJCQkJCQk8PCAoMzYgLSAyMCk7CisKKwkJCQlpbnN0ciAmPSAoMSA8PCBiaXRfcmVzKSAtIDE7CisJCQkJaW5zdHIgfD0gbm9ybSA8PCBiaXRfcmVzOworCisJCQkJZm9yIChqID0gMDsgaiA8IDY7IGorKykKKwkJCQkJYnVmW2kgKyBqICsgYnl0ZV9wb3NdCisJCQkJCQk9ICh1aW50OF90KShpbnN0ciA+PiAoOCAqIGopKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBpOworfQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfQVJNCitzdGF0aWMgc2l6ZV90IGJjal9hcm0oc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGk7CisJdWludDMyX3QgYWRkcjsKKworCWZvciAoaSA9IDA7IGkgKyA0IDw9IHNpemU7IGkgKz0gNCkgeworCQlpZiAoYnVmW2kgKyAzXSA9PSAweEVCKSB7CisJCQlhZGRyID0gKHVpbnQzMl90KWJ1ZltpXSB8ICgodWludDMyX3QpYnVmW2kgKyAxXSA8PCA4KQorCQkJCQl8ICgodWludDMyX3QpYnVmW2kgKyAyXSA8PCAxNik7CisJCQlhZGRyIDw8PSAyOworCQkJYWRkciAtPSBzLT5wb3MgKyAodWludDMyX3QpaSArIDg7CisJCQlhZGRyID4+PSAyOworCQkJYnVmW2ldID0gKHVpbnQ4X3QpYWRkcjsKKwkJCWJ1ZltpICsgMV0gPSAodWludDhfdCkoYWRkciA+PiA4KTsKKwkJCWJ1ZltpICsgMl0gPSAodWludDhfdCkoYWRkciA+PiAxNik7CisJCX0KKwl9CisKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX0FSTVRIVU1CCitzdGF0aWMgc2l6ZV90IGJjal9hcm10aHVtYihzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgaTsKKwl1aW50MzJfdCBhZGRyOworCisJZm9yIChpID0gMDsgaSArIDQgPD0gc2l6ZTsgaSArPSAyKSB7CisJCWlmICgoYnVmW2kgKyAxXSAmIDB4RjgpID09IDB4RjAKKwkJCQkmJiAoYnVmW2kgKyAzXSAmIDB4RjgpID09IDB4RjgpIHsKKwkJCWFkZHIgPSAoKCh1aW50MzJfdClidWZbaSArIDFdICYgMHgwNykgPDwgMTkpCisJCQkJCXwgKCh1aW50MzJfdClidWZbaV0gPDwgMTEpCisJCQkJCXwgKCgodWludDMyX3QpYnVmW2kgKyAzXSAmIDB4MDcpIDw8IDgpCisJCQkJCXwgKHVpbnQzMl90KWJ1ZltpICsgMl07CisJCQlhZGRyIDw8PSAxOworCQkJYWRkciAtPSBzLT5wb3MgKyAodWludDMyX3QpaSArIDQ7CisJCQlhZGRyID4+PSAxOworCQkJYnVmW2kgKyAxXSA9ICh1aW50OF90KSgweEYwIHwgKChhZGRyID4+IDE5KSAmIDB4MDcpKTsKKwkJCWJ1ZltpXSA9ICh1aW50OF90KShhZGRyID4+IDExKTsKKwkJCWJ1ZltpICsgM10gPSAodWludDhfdCkoMHhGOCB8ICgoYWRkciA+PiA4KSAmIDB4MDcpKTsKKwkJCWJ1ZltpICsgMl0gPSAodWludDhfdClhZGRyOworCQkJaSArPSAyOworCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19TUEFSQworc3RhdGljIHNpemVfdCBiY2pfc3BhcmMoc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGk7CisJdWludDMyX3QgaW5zdHI7CisKKwlmb3IgKGkgPSAwOyBpICsgNCA8PSBzaXplOyBpICs9IDQpIHsKKwkJaW5zdHIgPSBnZXRfdW5hbGlnbmVkX2JlMzIoYnVmICsgaSk7CisJCWlmICgoaW5zdHIgPj4gMjIpID09IDB4MTAwIHx8IChpbnN0ciA+PiAyMikgPT0gMHgxRkYpIHsKKwkJCWluc3RyIDw8PSAyOworCQkJaW5zdHIgLT0gcy0+cG9zICsgKHVpbnQzMl90KWk7CisJCQlpbnN0ciA+Pj0gMjsKKwkJCWluc3RyID0gKCh1aW50MzJfdCkweDQwMDAwMDAwIC0gKGluc3RyICYgMHg0MDAwMDApKQorCQkJCQl8IDB4NDAwMDAwMDAgfCAoaW5zdHIgJiAweDNGRkZGRik7CisJCQlwdXRfdW5hbGlnbmVkX2JlMzIoaW5zdHIsIGJ1ZiArIGkpOworCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworLyoKKyAqIEFwcGx5IHRoZSBzZWxlY3RlZCBCQ0ogZmlsdGVyLiBVcGRhdGUgKnBvcyBhbmQgcy0+cG9zIHRvIG1hdGNoIHRoZSBhbW91bnQKKyAqIG9mIGRhdGEgdGhhdCBnb3QgZmlsdGVyZWQuCisgKgorICogTk9URTogVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHN3aXRjaCBzdGF0ZW1lbnQgdG8gYXZvaWQgdXNpbmcgZnVuY3Rpb24KKyAqIHBvaW50ZXJzLCB3aGljaCBjb3VsZCBiZSBwcm9ibGVtYXRpYyBpbiB0aGUga2VybmVsIGJvb3QgY29kZSwgd2hpY2ggbXVzdAorICogYXZvaWQgcG9pbnRlcnMgdG8gc3RhdGljIGRhdGEgKGF0IGxlYXN0IG9uIHg4NikuCisgKi8KK3N0YXRpYyB2b2lkIGJjal9hcHBseShzdHJ1Y3QgeHpfZGVjX2JjaiAqcywKKwkJICAgICAgdWludDhfdCAqYnVmLCBzaXplX3QgKnBvcywgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGZpbHRlcmVkOworCisJYnVmICs9ICpwb3M7CisJc2l6ZSAtPSAqcG9zOworCisJc3dpdGNoIChzLT50eXBlKSB7CisjaWZkZWYgWFpfREVDX1g4NgorCWNhc2UgQkNKX1g4NjoKKwkJZmlsdGVyZWQgPSBiY2pfeDg2KHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX1BPV0VSUEMKKwljYXNlIEJDSl9QT1dFUlBDOgorCQlmaWx0ZXJlZCA9IGJjal9wb3dlcnBjKHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX0lBNjQKKwljYXNlIEJDSl9JQTY0OgorCQlmaWx0ZXJlZCA9IGJjal9pYTY0KHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX0FSTQorCWNhc2UgQkNKX0FSTToKKwkJZmlsdGVyZWQgPSBiY2pfYXJtKHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX0FSTVRIVU1CCisJY2FzZSBCQ0pfQVJNVEhVTUI6CisJCWZpbHRlcmVkID0gYmNqX2FybXRodW1iKHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX1NQQVJDCisJY2FzZSBCQ0pfU1BBUkM6CisJCWZpbHRlcmVkID0gYmNqX3NwYXJjKHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJLyogTmV2ZXIgcmVhY2hlZCBidXQgc2lsZW5jZSBjb21waWxlciB3YXJuaW5ncy4gKi8KKwkJZmlsdGVyZWQgPSAwOworCQlicmVhazsKKwl9CisKKwkqcG9zICs9IGZpbHRlcmVkOworCXMtPnBvcyArPSBmaWx0ZXJlZDsKK30KKworLyoKKyAqIEZsdXNoIHBlbmRpbmcgZmlsdGVyZWQgZGF0YSBmcm9tIHRlbXAgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgKiBNb3ZlIHRoZSByZW1haW5pbmcgbWl4dHVyZSBvZiBwb3NzaWJseSBmaWx0ZXJlZCBhbmQgdW5maWx0ZXJlZAorICogZGF0YSB0byB0aGUgYmVnaW5uaW5nIG9mIHRlbXAuCisgKi8KK3N0YXRpYyB2b2lkIGJjal9mbHVzaChzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgY29weV9zaXplOworCisJY29weV9zaXplID0gbWluX3Qoc2l6ZV90LCBzLT50ZW1wLmZpbHRlcmVkLCBiLT5vdXRfc2l6ZSAtIGItPm91dF9wb3MpOworCW1lbWNweShiLT5vdXQgKyBiLT5vdXRfcG9zLCBzLT50ZW1wLmJ1ZiwgY29weV9zaXplKTsKKwliLT5vdXRfcG9zICs9IGNvcHlfc2l6ZTsKKworCXMtPnRlbXAuZmlsdGVyZWQgLT0gY29weV9zaXplOworCXMtPnRlbXAuc2l6ZSAtPSBjb3B5X3NpemU7CisJbWVtbW92ZShzLT50ZW1wLmJ1Ziwgcy0+dGVtcC5idWYgKyBjb3B5X3NpemUsIHMtPnRlbXAuc2l6ZSk7Cit9CisKKy8qCisgKiBUaGUgQkNKIGZpbHRlciBmdW5jdGlvbnMgYXJlIHByaW1pdGl2ZSBpbiBzZW5zZSB0aGF0IHRoZXkgcHJvY2VzcyB0aGUKKyAqIGRhdGEgaW4gY2h1bmtzIG9mIDEtMTYgYnl0ZXMuIFRvIGhpZGUgdGhpcyBpc3N1ZSwgdGhpcyBmdW5jdGlvbiBkb2VzCisgKiBzb21lIGJ1ZmZlcmluZy4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IHh6X2RlY19iY2pfcnVuKHN0cnVjdCB4el9kZWNfYmNqICpzLAorCQkJCSAgICAgc3RydWN0IHh6X2RlY19sem1hMiAqbHptYTIsCisJCQkJICAgICBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBvdXRfc3RhcnQ7CisKKwkvKgorCSAqIEZsdXNoIHBlbmRpbmcgYWxyZWFkeSBmaWx0ZXJlZCBkYXRhIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiBSZXR1cm4KKwkgKiBpbW1lZGlhdGVsbHkgaWYgd2UgY291bGRuJ3QgZmx1c2ggZXZlcnl0aGluZywgb3IgaWYgdGhlIG5leHQKKwkgKiBmaWx0ZXIgaW4gdGhlIGNoYWluIGhhZCBhbHJlYWR5IHJldHVybmVkIFhaX1NUUkVBTV9FTkQuCisJICovCisJaWYgKHMtPnRlbXAuZmlsdGVyZWQgPiAwKSB7CisJCWJjal9mbHVzaChzLCBiKTsKKwkJaWYgKHMtPnRlbXAuZmlsdGVyZWQgPiAwKQorCQkJcmV0dXJuIFhaX09LOworCisJCWlmIChzLT5yZXQgPT0gWFpfU1RSRUFNX0VORCkKKwkJCXJldHVybiBYWl9TVFJFQU1fRU5EOworCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBtb3JlIG91dHB1dCBzcGFjZSB0aGFuIHdoYXQgaXMgY3VycmVudGx5IHBlbmRpbmcgaW4KKwkgKiB0ZW1wLCBjb3B5IHRoZSB1bmZpbHRlcmVkIGRhdGEgZnJvbSB0ZW1wIHRvIHRoZSBvdXRwdXQgYnVmZmVyCisJICogYW5kIHRyeSB0byBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyIGJ5IGRlY29kaW5nIG1vcmUgZGF0YSBmcm9tIHRoZQorCSAqIG5leHQgZmlsdGVyIGluIHRoZSBjaGFpbi4gQXBwbHkgdGhlIEJDSiBmaWx0ZXIgb24gdGhlIG5ldyBkYXRhCisJICogaW4gdGhlIG91dHB1dCBidWZmZXIuIElmIGV2ZXJ5dGhpbmcgY2Fubm90IGJlIGZpbHRlcmVkLCBjb3B5IGl0CisJICogdG8gdGVtcCBhbmQgcmV3aW5kIHRoZSBvdXRwdXQgYnVmZmVyIHBvc2l0aW9uIGFjY29yZGluZ2x5LgorCSAqCisJICogVGhpcyBuZWVkcyB0byBiZSBhbHdheXMgcnVuIHdoZW4gdGVtcC5zaXplID09IDAgdG8gaGFuZGxlIGEgc3BlY2lhbAorCSAqIGNhc2Ugd2hlcmUgdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCBhbmQgdGhlIG5leHQgZmlsdGVyIGhhcyBubworCSAqIG1vcmUgb3V0cHV0IGNvbWluZyBidXQgaGFzbid0IHJldHVybmVkIFhaX1NUUkVBTV9FTkQgeWV0LgorCSAqLworCWlmIChzLT50ZW1wLnNpemUgPCBiLT5vdXRfc2l6ZSAtIGItPm91dF9wb3MgfHwgcy0+dGVtcC5zaXplID09IDApIHsKKwkJb3V0X3N0YXJ0ID0gYi0+b3V0X3BvczsKKwkJbWVtY3B5KGItPm91dCArIGItPm91dF9wb3MsIHMtPnRlbXAuYnVmLCBzLT50ZW1wLnNpemUpOworCQliLT5vdXRfcG9zICs9IHMtPnRlbXAuc2l6ZTsKKworCQlzLT5yZXQgPSB4el9kZWNfbHptYTJfcnVuKGx6bWEyLCBiKTsKKwkJaWYgKHMtPnJldCAhPSBYWl9TVFJFQU1fRU5ECisJCQkJJiYgKHMtPnJldCAhPSBYWl9PSyB8fCBzLT5zaW5nbGVfY2FsbCkpCisJCQlyZXR1cm4gcy0+cmV0OworCisJCWJjal9hcHBseShzLCBiLT5vdXQsICZvdXRfc3RhcnQsIGItPm91dF9wb3MpOworCisJCS8qCisJCSAqIEFzIGFuIGV4Y2VwdGlvbiwgaWYgdGhlIG5leHQgZmlsdGVyIHJldHVybmVkIFhaX1NUUkVBTV9FTkQsCisJCSAqIHdlIGNhbiBkbyB0aGF0IHRvbywgc2luY2UgdGhlIGxhc3QgZmV3IGJ5dGVzIHRoYXQgcmVtYWluCisJCSAqIHVuZmlsdGVyZWQgYXJlIG1lYW50IHRvIHJlbWFpbiB1bmZpbHRlcmVkLgorCQkgKi8KKwkJaWYgKHMtPnJldCA9PSBYWl9TVFJFQU1fRU5EKQorCQkJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7CisKKwkJcy0+dGVtcC5zaXplID0gYi0+b3V0X3BvcyAtIG91dF9zdGFydDsKKwkJYi0+b3V0X3BvcyAtPSBzLT50ZW1wLnNpemU7CisJCW1lbWNweShzLT50ZW1wLmJ1ZiwgYi0+b3V0ICsgYi0+b3V0X3Bvcywgcy0+dGVtcC5zaXplKTsKKworCQkvKgorCQkgKiBJZiB0aGVyZSB3YXNuJ3QgZW5vdWdoIGlucHV0IHRvIHRoZSBuZXh0IGZpbHRlciB0byBmaWxsCisJCSAqIHRoZSBvdXRwdXQgYnVmZmVyIHdpdGggdW5maWx0ZXJlZCBkYXRhLCB0aGVyZSdzIG5vIHBvaW50CisJCSAqIHRvIHRyeSBkZWNvZGluZyBtb3JlIGRhdGEgdG8gdGVtcC4KKwkJICovCisJCWlmIChiLT5vdXRfcG9zICsgcy0+dGVtcC5zaXplIDwgYi0+b3V0X3NpemUpCisJCQlyZXR1cm4gWFpfT0s7CisJfQorCisJLyoKKwkgKiBXZSBoYXZlIHVuZmlsdGVyZWQgZGF0YSBpbiB0ZW1wLiBJZiB0aGUgb3V0cHV0IGJ1ZmZlciBpc24ndCBmdWxsCisJICogeWV0LCB0cnkgdG8gZmlsbCB0aGUgdGVtcCBidWZmZXIgYnkgZGVjb2RpbmcgbW9yZSBkYXRhIGZyb20gdGhlCisJICogbmV4dCBmaWx0ZXIuIEFwcGx5IHRoZSBCQ0ogZmlsdGVyIG9uIHRlbXAuIFRoZW4gd2UgaG9wZWZ1bGx5IGNhbgorCSAqIGZpbGwgdGhlIGFjdHVhbCBvdXRwdXQgYnVmZmVyIGJ5IGNvcHlpbmcgZmlsdGVyZWQgZGF0YSBmcm9tIHRlbXAuCisJICogQSBtaXggb2YgZmlsdGVyZWQgYW5kIHVuZmlsdGVyZWQgZGF0YSBtYXkgYmUgbGVmdCBpbiB0ZW1wOyBpdCB3aWxsCisJICogYmUgdGFrZW4gY2FyZSBvbiB0aGUgbmV4dCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uCisJICovCisJaWYgKGItPm91dF9wb3MgPCBiLT5vdXRfc2l6ZSkgeworCQkvKiBNYWtlIGItPm91dHssX3Bvcyxfc2l6ZX0gdGVtcG9yYXJpbHkgcG9pbnQgdG8gcy0+dGVtcC4gKi8KKwkJcy0+b3V0ID0gYi0+b3V0OworCQlzLT5vdXRfcG9zID0gYi0+b3V0X3BvczsKKwkJcy0+b3V0X3NpemUgPSBiLT5vdXRfc2l6ZTsKKwkJYi0+b3V0ID0gcy0+dGVtcC5idWY7CisJCWItPm91dF9wb3MgPSBzLT50ZW1wLnNpemU7CisJCWItPm91dF9zaXplID0gc2l6ZW9mKHMtPnRlbXAuYnVmKTsKKworCQlzLT5yZXQgPSB4el9kZWNfbHptYTJfcnVuKGx6bWEyLCBiKTsKKworCQlzLT50ZW1wLnNpemUgPSBiLT5vdXRfcG9zOworCQliLT5vdXQgPSBzLT5vdXQ7CisJCWItPm91dF9wb3MgPSBzLT5vdXRfcG9zOworCQliLT5vdXRfc2l6ZSA9IHMtPm91dF9zaXplOworCisJCWlmIChzLT5yZXQgIT0gWFpfT0sgJiYgcy0+cmV0ICE9IFhaX1NUUkVBTV9FTkQpCisJCQlyZXR1cm4gcy0+cmV0OworCisJCWJjal9hcHBseShzLCBzLT50ZW1wLmJ1ZiwgJnMtPnRlbXAuZmlsdGVyZWQsIHMtPnRlbXAuc2l6ZSk7CisKKwkJLyoKKwkJICogSWYgdGhlIG5leHQgZmlsdGVyIHJldHVybmVkIFhaX1NUUkVBTV9FTkQsIHdlIG1hcmsgdGhhdAorCQkgKiBldmVyeXRoaW5nIGlzIGZpbHRlcmVkLCBzaW5jZSB0aGUgbGFzdCB1bmZpbHRlcmVkIGJ5dGVzCisJCSAqIG9mIHRoZSBzdHJlYW0gYXJlIG1lYW50IHRvIGJlIGxlZnQgYXMgaXMuCisJCSAqLworCQlpZiAocy0+cmV0ID09IFhaX1NUUkVBTV9FTkQpCisJCQlzLT50ZW1wLmZpbHRlcmVkID0gcy0+dGVtcC5zaXplOworCisJCWJjal9mbHVzaChzLCBiKTsKKwkJaWYgKHMtPnRlbXAuZmlsdGVyZWQgPiAwKQorCQkJcmV0dXJuIFhaX09LOworCX0KKworCXJldHVybiBzLT5yZXQ7Cit9CisKK1haX0VYVEVSTiBzdHJ1Y3QgeHpfZGVjX2JjaiAqeHpfZGVjX2Jjal9jcmVhdGUoYm9vbCBzaW5nbGVfY2FsbCkKK3sKKwlzdHJ1Y3QgeHpfZGVjX2JjaiAqcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHMgIT0gTlVMTCkKKwkJcy0+c2luZ2xlX2NhbGwgPSBzaW5nbGVfY2FsbDsKKworCXJldHVybiBzOworfQorCitYWl9FWFRFUk4gZW51bSB4el9yZXQgeHpfZGVjX2Jjal9yZXNldChzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCBpZCkKK3sKKwlzd2l0Y2ggKGlkKSB7CisjaWZkZWYgWFpfREVDX1g4NgorCWNhc2UgQkNKX1g4NjoKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19QT1dFUlBDCisJY2FzZSBCQ0pfUE9XRVJQQzoKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19JQTY0CisJY2FzZSBCQ0pfSUE2NDoKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19BUk0KKwljYXNlIEJDSl9BUk06CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfQVJNVEhVTUIKKwljYXNlIEJDSl9BUk1USFVNQjoKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19TUEFSQworCWNhc2UgQkNKX1NQQVJDOgorI2VuZGlmCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogVW5zdXBwb3J0ZWQgRmlsdGVyIElEICovCisJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCX0KKworCXMtPnR5cGUgPSBpZDsKKwlzLT5yZXQgPSBYWl9PSzsKKwlzLT5wb3MgPSAwOworCXMtPng4Nl9wcmV2X21hc2sgPSAwOworCXMtPnRlbXAuZmlsdGVyZWQgPSAwOworCXMtPnRlbXAuc2l6ZSA9IDA7CisKKwlyZXR1cm4gWFpfT0s7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbHptYS94ei1lbWJlZGRlZC94el9kZWNfbHptYTIuYyBiL2x6bWEveHotZW1iZWRkZWQveHpfZGVjX2x6bWEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjZGM5NgotLS0gL2Rldi9udWxsCisrKyBiL2x6bWEveHotZW1iZWRkZWQveHpfZGVjX2x6bWEyLmMKQEAgLTAsMCArMSwxMTcxIEBACisvKgorICogTFpNQTIgZGVjb2RlcgorICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworI2luY2x1ZGUgInh6X3ByaXZhdGUuaCIKKyNpbmNsdWRlICJ4el9sem1hMi5oIgorCisvKgorICogUmFuZ2UgZGVjb2RlciBpbml0aWFsaXphdGlvbiBlYXRzIHRoZSBmaXJzdCBmaXZlIGJ5dGVzIG9mIGVhY2ggTFpNQSBjaHVuay4KKyAqLworI2RlZmluZSBSQ19JTklUX0JZVEVTIDUKKworLyoKKyAqIE1pbmltdW0gbnVtYmVyIG9mIHVzYWJsZSBpbnB1dCBidWZmZXIgdG8gc2FmZWx5IGRlY29kZSBvbmUgTFpNQSBzeW1ib2wuCisgKiBUaGUgd29yc3QgY2FzZSBpcyB0aGF0IHdlIGRlY29kZSAyMiBiaXRzIHVzaW5nIHByb2JhYmlsaXRpZXMgYW5kIDI2CisgKiBkaXJlY3QgYml0cy4gVGhpcyBtYXkgZGVjb2RlIGF0IG1heGltdW0gb2YgMjAgYnl0ZXMgb2YgaW5wdXQuIEhvd2V2ZXIsCisgKiBsem1hX21haW4oKSBkb2VzIGFuIGV4dHJhIG5vcm1hbGl6YXRpb24gYmVmb3JlIHJldHVybmluZywgdGh1cyB3ZQorICogbmVlZCB0byBwdXQgMjEgaGVyZS4KKyAqLworI2RlZmluZSBMWk1BX0lOX1JFUVVJUkVEIDIxCisKKy8qCisgKiBEaWN0aW9uYXJ5IChoaXN0b3J5IGJ1ZmZlcikKKyAqCisgKiBUaGVzZSBhcmUgYWx3YXlzIHRydWU6CisgKiAgICBzdGFydCA8PSBwb3MgPD0gZnVsbCA8PSBlbmQKKyAqICAgIHBvcyA8PSBsaW1pdCA8PSBlbmQKKyAqCisgKiBJbiBtdWx0aS1jYWxsIG1vZGUsIGFsc28gdGhlc2UgYXJlIHRydWU6CisgKiAgICBlbmQgPT0gc2l6ZQorICogICAgc2l6ZSA8PSBzaXplX21heAorICogICAgYWxsb2NhdGVkIDw9IHNpemUKKyAqCisgKiBNb3N0IG9mIHRoZXNlIHZhcmlhYmxlcyBhcmUgc2l6ZV90IHRvIHN1cHBvcnQgc2luZ2xlLWNhbGwgbW9kZSwKKyAqIGluIHdoaWNoIHRoZSBkaWN0aW9uYXJ5IHZhcmlhYmxlcyBhZGRyZXNzIHRoZSBhY3R1YWwgb3V0cHV0CisgKiBidWZmZXIgZGlyZWN0bHkuCisgKi8KK3N0cnVjdCBkaWN0aW9uYXJ5IHsKKwkvKiBCZWdpbm5pbmcgb2YgdGhlIGhpc3RvcnkgYnVmZmVyICovCisJdWludDhfdCAqYnVmOworCisJLyogT2xkIHBvc2l0aW9uIGluIGJ1ZiAoYmVmb3JlIGRlY29kaW5nIG1vcmUgZGF0YSkgKi8KKwlzaXplX3Qgc3RhcnQ7CisKKwkvKiBQb3NpdGlvbiBpbiBidWYgKi8KKwlzaXplX3QgcG9zOworCisJLyoKKwkgKiBIb3cgZnVsbCBkaWN0aW9uYXJ5IGlzLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZWN0IGNvcnJ1cHQgaW5wdXQgdGhhdAorCSAqIHdvdWxkIHJlYWQgYmV5b25kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0uCisJICovCisJc2l6ZV90IGZ1bGw7CisKKwkvKiBXcml0ZSBsaW1pdDsgd2UgZG9uJ3Qgd3JpdGUgdG8gYnVmW2xpbWl0XSBvciBsYXRlciBieXRlcy4gKi8KKwlzaXplX3QgbGltaXQ7CisKKwkvKgorCSAqIEVuZCBvZiB0aGUgZGljdGlvbmFyeSBidWZmZXIuIEluIG11bHRpLWNhbGwgbW9kZSwgdGhpcyBpcworCSAqIHRoZSBzYW1lIGFzIHRoZSBkaWN0aW9uYXJ5IHNpemUuIEluIHNpbmdsZS1jYWxsIG1vZGUsIHRoaXMKKwkgKiBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuCisJICovCisJc2l6ZV90IGVuZDsKKworCS8qCisJICogU2l6ZSBvZiB0aGUgZGljdGlvbmFyeSBhcyBzcGVjaWZpZWQgaW4gQmxvY2sgSGVhZGVyLiBUaGlzIGlzIHVzZWQKKwkgKiB0b2dldGhlciB3aXRoICJmdWxsIiB0byBkZXRlY3QgY29ycnVwdCBpbnB1dCB0aGF0IHdvdWxkIG1ha2UgdXMKKwkgKiByZWFkIGJleW9uZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLgorCSAqLworCXVpbnQzMl90IHNpemU7CisKKwkvKgorCSAqIE1heGltdW0gYWxsb3dlZCBkaWN0aW9uYXJ5IHNpemUgaW4gbXVsdGktY2FsbCBtb2RlLgorCSAqIFRoaXMgaXMgaWdub3JlZCBpbiBzaW5nbGUtY2FsbCBtb2RlLgorCSAqLworCXVpbnQzMl90IHNpemVfbWF4OworCisJLyoKKwkgKiBBbW91bnQgb2YgbWVtb3J5IGN1cnJlbnRseSBhbGxvY2F0ZWQgZm9yIHRoZSBkaWN0aW9uYXJ5LgorCSAqIFRoaXMgaXMgdXNlZCBvbmx5IHdpdGggWFpfRFlOQUxMT0MuIChXaXRoIFhaX1BSRUFMTE9DLAorCSAqIHNpemVfbWF4IGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgYWxsb2NhdGVkIHNpemUuKQorCSAqLworCXVpbnQzMl90IGFsbG9jYXRlZDsKKworCS8qIE9wZXJhdGlvbiBtb2RlICovCisJZW51bSB4el9tb2RlIG1vZGU7Cit9OworCisvKiBSYW5nZSBkZWNvZGVyICovCitzdHJ1Y3QgcmNfZGVjIHsKKwl1aW50MzJfdCByYW5nZTsKKwl1aW50MzJfdCBjb2RlOworCisJLyoKKwkgKiBOdW1iZXIgb2YgaW5pdGlhbGl6aW5nIGJ5dGVzIHJlbWFpbmluZyB0byBiZSByZWFkCisJICogYnkgcmNfcmVhZF9pbml0KCkuCisJICovCisJdWludDMyX3QgaW5pdF9ieXRlc19sZWZ0OworCisJLyoKKwkgKiBCdWZmZXIgZnJvbSB3aGljaCB3ZSByZWFkIG91ciBpbnB1dC4gSXQgY2FuIGJlIGVpdGhlcgorCSAqIHRlbXAuYnVmIG9yIHRoZSBjYWxsZXItcHJvdmlkZWQgaW5wdXQgYnVmZmVyLgorCSAqLworCWNvbnN0IHVpbnQ4X3QgKmluOworCXNpemVfdCBpbl9wb3M7CisJc2l6ZV90IGluX2xpbWl0OworfTsKKworLyogUHJvYmFiaWxpdGllcyBmb3IgYSBsZW5ndGggZGVjb2Rlci4gKi8KK3N0cnVjdCBsem1hX2xlbl9kZWMgeworCS8qIFByb2JhYmlsaXR5IG9mIG1hdGNoIGxlbmd0aCBiZWluZyBhdCBsZWFzdCAxMCAqLworCXVpbnQxNl90IGNob2ljZTsKKworCS8qIFByb2JhYmlsaXR5IG9mIG1hdGNoIGxlbmd0aCBiZWluZyBhdCBsZWFzdCAxOCAqLworCXVpbnQxNl90IGNob2ljZTI7CisKKwkvKiBQcm9iYWJpbGl0aWVzIGZvciBtYXRjaCBsZW5ndGhzIDItOSAqLworCXVpbnQxNl90IGxvd1tQT1NfU1RBVEVTX01BWF1bTEVOX0xPV19TWU1CT0xTXTsKKworCS8qIFByb2JhYmlsaXRpZXMgZm9yIG1hdGNoIGxlbmd0aHMgMTAtMTcgKi8KKwl1aW50MTZfdCBtaWRbUE9TX1NUQVRFU19NQVhdW0xFTl9NSURfU1lNQk9MU107CisKKwkvKiBQcm9iYWJpbGl0aWVzIGZvciBtYXRjaCBsZW5ndGhzIDE4LTI3MyAqLworCXVpbnQxNl90IGhpZ2hbTEVOX0hJR0hfU1lNQk9MU107Cit9OworCitzdHJ1Y3QgbHptYV9kZWMgeworCS8qIERpc3RhbmNlcyBvZiBsYXRlc3QgZm91ciBtYXRjaGVzICovCisJdWludDMyX3QgcmVwMDsKKwl1aW50MzJfdCByZXAxOworCXVpbnQzMl90IHJlcDI7CisJdWludDMyX3QgcmVwMzsKKworCS8qIFR5cGVzIG9mIHRoZSBtb3N0IHJlY2VudGx5IHNlZW4gTFpNQSBzeW1ib2xzICovCisJZW51bSBsem1hX3N0YXRlIHN0YXRlOworCisJLyoKKwkgKiBMZW5ndGggb2YgYSBtYXRjaC4gVGhpcyBpcyB1cGRhdGVkIHNvIHRoYXQgZGljdF9yZXBlYXQgY2FuCisJICogYmUgY2FsbGVkIGFnYWluIHRvIGZpbmlzaCByZXBlYXRpbmcgdGhlIHdob2xlIG1hdGNoLgorCSAqLworCXVpbnQzMl90IGxlbjsKKworCS8qCisJICogTFpNQSBwcm9wZXJ0aWVzIG9yIHJlbGF0ZWQgYml0IG1hc2tzIChudW1iZXIgb2YgbGl0ZXJhbAorCSAqIGNvbnRleHQgYml0cywgYSBtYXNrIGRlcnZpZWQgZnJvbSB0aGUgbnVtYmVyIG9mIGxpdGVyYWwKKwkgKiBwb3NpdGlvbiBiaXRzLCBhbmQgYSBtYXNrIGRlcnZpZWQgZnJvbSB0aGUgbnVtYmVyCisJICogcG9zaXRpb24gYml0cykKKwkgKi8KKwl1aW50MzJfdCBsYzsKKwl1aW50MzJfdCBsaXRlcmFsX3Bvc19tYXNrOyAvKiAoMSA8PCBscCkgLSAxICovCisJdWludDMyX3QgcG9zX21hc2s7ICAgICAgICAgLyogKDEgPDwgcGIpIC0gMSAqLworCisJLyogSWYgMSwgaXQncyBhIG1hdGNoLiBPdGhlcndpc2UgaXQncyBhIHNpbmdsZSA4LWJpdCBsaXRlcmFsLiAqLworCXVpbnQxNl90IGlzX21hdGNoW1NUQVRFU11bUE9TX1NUQVRFU19NQVhdOworCisJLyogSWYgMSwgaXQncyBhIHJlcGVhdGVkIG1hdGNoLiBUaGUgZGlzdGFuY2UgaXMgb25lIG9mIHJlcDAgLi4gcmVwMy4gKi8KKwl1aW50MTZfdCBpc19yZXBbU1RBVEVTXTsKKworCS8qCisJICogSWYgMCwgZGlzdGFuY2Ugb2YgYSByZXBlYXRlZCBtYXRjaCBpcyByZXAwLgorCSAqIE90aGVyd2lzZSBjaGVjayBpc19yZXAxLgorCSAqLworCXVpbnQxNl90IGlzX3JlcDBbU1RBVEVTXTsKKworCS8qCisJICogSWYgMCwgZGlzdGFuY2Ugb2YgYSByZXBlYXRlZCBtYXRjaCBpcyByZXAxLgorCSAqIE90aGVyd2lzZSBjaGVjayBpc19yZXAyLgorCSAqLworCXVpbnQxNl90IGlzX3JlcDFbU1RBVEVTXTsKKworCS8qIElmIDAsIGRpc3RhbmNlIG9mIGEgcmVwZWF0ZWQgbWF0Y2ggaXMgcmVwMi4gT3RoZXJ3aXNlIGl0IGlzIHJlcDMuICovCisJdWludDE2X3QgaXNfcmVwMltTVEFURVNdOworCisJLyoKKwkgKiBJZiAxLCB0aGUgcmVwZWF0ZWQgbWF0Y2ggaGFzIGxlbmd0aCBvZiBvbmUgYnl0ZS4gT3RoZXJ3aXNlCisJICogdGhlIGxlbmd0aCBpcyBkZWNvZGVkIGZyb20gcmVwX2xlbl9kZWNvZGVyLgorCSAqLworCXVpbnQxNl90IGlzX3JlcDBfbG9uZ1tTVEFURVNdW1BPU19TVEFURVNfTUFYXTsKKworCS8qCisJICogUHJvYmFiaWxpdHkgdHJlZSBmb3IgdGhlIGhpZ2hlc3QgdHdvIGJpdHMgb2YgdGhlIG1hdGNoCisJICogZGlzdGFuY2UuIFRoZXJlIGlzIGEgc2VwYXJhdGUgcHJvYmFiaWxpdHkgdHJlZSBmb3IgbWF0Y2gKKwkgKiBsZW5ndGhzIG9mIDIgKGkuZS4gTUFUQ0hfTEVOX01JTiksIDMsIDQsIGFuZCBbNSwgMjczXS4KKwkgKi8KKwl1aW50MTZfdCBkaXN0X3Nsb3RbRElTVF9TVEFURVNdW0RJU1RfU0xPVFNdOworCisJLyoKKwkgKiBQcm9iaWxpdHkgdHJlZXMgZm9yIGFkZGl0aW9uYWwgYml0cyBmb3IgbWF0Y2ggZGlzdGFuY2UKKwkgKiB3aGVuIHRoZSBkaXN0YW5jZSBpcyBpbiB0aGUgcmFuZ2UgWzQsIDEyN10uCisJICovCisJdWludDE2X3QgZGlzdF9zcGVjaWFsW0ZVTExfRElTVEFOQ0VTIC0gRElTVF9NT0RFTF9FTkRdOworCisJLyoKKwkgKiBQcm9iYWJpbGl0eSB0cmVlIGZvciB0aGUgbG93ZXN0IGZvdXIgYml0cyBvZiBhIG1hdGNoCisJICogZGlzdGFuY2UgdGhhdCBpcyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gMTI4LgorCSAqLworCXVpbnQxNl90IGRpc3RfYWxpZ25bQUxJR05fU0laRV07CisKKwkvKiBMZW5ndGggb2YgYSBub3JtYWwgbWF0Y2ggKi8KKwlzdHJ1Y3QgbHptYV9sZW5fZGVjIG1hdGNoX2xlbl9kZWM7CisKKwkvKiBMZW5ndGggb2YgYSByZXBlYXRlZCBtYXRjaCAqLworCXN0cnVjdCBsem1hX2xlbl9kZWMgcmVwX2xlbl9kZWM7CisKKwkvKiBQcm9iYWJpbGl0aWVzIG9mIGxpdGVyYWxzICovCisJdWludDE2X3QgbGl0ZXJhbFtMSVRFUkFMX0NPREVSU19NQVhdW0xJVEVSQUxfQ09ERVJfU0laRV07Cit9OworCitzdHJ1Y3QgbHptYTJfZGVjIHsKKwkvKiBQb3NpdGlvbiBpbiB4el9kZWNfbHptYTJfcnVuKCkuICovCisJZW51bSBsem1hMl9zZXEgeworCQlTRVFfQ09OVFJPTCwKKwkJU0VRX1VOQ09NUFJFU1NFRF8xLAorCQlTRVFfVU5DT01QUkVTU0VEXzIsCisJCVNFUV9DT01QUkVTU0VEXzAsCisJCVNFUV9DT01QUkVTU0VEXzEsCisJCVNFUV9QUk9QRVJUSUVTLAorCQlTRVFfTFpNQV9QUkVQQVJFLAorCQlTRVFfTFpNQV9SVU4sCisJCVNFUV9DT1BZCisJfSBzZXF1ZW5jZTsKKworCS8qIE5leHQgcG9zaXRpb24gYWZ0ZXIgZGVjb2RpbmcgdGhlIGNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgY2h1bmsuICovCisJZW51bSBsem1hMl9zZXEgbmV4dF9zZXF1ZW5jZTsKKworCS8qIFVuY29tcHJlc3NlZCBzaXplIG9mIExaTUEgY2h1bmsgKDIgTWlCIGF0IG1heGltdW0pICovCisJdWludDMyX3QgdW5jb21wcmVzc2VkOworCisJLyoKKwkgKiBDb21wcmVzc2VkIHNpemUgb2YgTFpNQSBjaHVuayBvciBjb21wcmVzc2VkL3VuY29tcHJlc3NlZAorCSAqIHNpemUgb2YgdW5jb21wcmVzc2VkIGNodW5rICg2NCBLaUIgYXQgbWF4aW11bSkKKwkgKi8KKwl1aW50MzJfdCBjb21wcmVzc2VkOworCisJLyoKKwkgKiBUcnVlIGlmIGRpY3Rpb25hcnkgcmVzZXQgaXMgbmVlZGVkLiBUaGlzIGlzIGZhbHNlIGJlZm9yZQorCSAqIHRoZSBmaXJzdCBjaHVuayAoTFpNQSBvciB1bmNvbXByZXNzZWQpLgorCSAqLworCWJvb2wgbmVlZF9kaWN0X3Jlc2V0OworCisJLyoKKwkgKiBUcnVlIGlmIG5ldyBMWk1BIHByb3BlcnRpZXMgYXJlIG5lZWRlZC4gVGhpcyBpcyBmYWxzZQorCSAqIGJlZm9yZSB0aGUgZmlyc3QgTFpNQSBjaHVuay4KKwkgKi8KKwlib29sIG5lZWRfcHJvcHM7Cit9OworCitzdHJ1Y3QgeHpfZGVjX2x6bWEyIHsKKwkvKgorCSAqIFRoZSBvcmRlciBiZWxvdyBpcyBpbXBvcnRhbnQgb24geDg2IHRvIHJlZHVjZSBjb2RlIHNpemUgYW5kCisJICogaXQgc2hvdWxkbid0IGh1cnQgb24gb3RoZXIgcGxhdGZvcm1zLiBFdmVyeXRoaW5nIHVwIHRvIGFuZAorCSAqIGluY2x1ZGluZyBsem1hLnBvc19tYXNrIGFyZSBpbiB0aGUgZmlyc3QgMTI4IGJ5dGVzIG9uIHg4Ni0zMiwKKwkgKiB3aGljaCBhbGxvd3MgdXNpbmcgc21hbGxlciBpbnN0cnVjdGlvbnMgdG8gYWNjZXNzIHRob3NlCisJICogdmFyaWFibGVzLiBPbiB4ODYtNjQsIGZld2VyIHZhcmlhYmxlcyBmaXQgaW50byB0aGUgZmlyc3QgMTI4CisJICogYnl0ZXMsIGJ1dCB0aGlzIGlzIHN0aWxsIHRoZSBiZXN0IG9yZGVyIHdpdGhvdXQgc2FjcmlmaWNpbmcKKwkgKiB0aGUgcmVhZGFiaWxpdHkgYnkgc3BsaXR0aW5nIHRoZSBzdHJ1Y3R1cmVzLgorCSAqLworCXN0cnVjdCByY19kZWMgcmM7CisJc3RydWN0IGRpY3Rpb25hcnkgZGljdDsKKwlzdHJ1Y3QgbHptYTJfZGVjIGx6bWEyOworCXN0cnVjdCBsem1hX2RlYyBsem1hOworCisJLyoKKwkgKiBUZW1wb3JhcnkgYnVmZmVyIHdoaWNoIGhvbGRzIHNtYWxsIG51bWJlciBvZiBpbnB1dCBieXRlcyBiZXR3ZWVuCisJICogZGVjb2RlciBjYWxscy4gU2VlIGx6bWEyX2x6bWEoKSBmb3IgZGV0YWlscy4KKwkgKi8KKwlzdHJ1Y3QgeworCQl1aW50MzJfdCBzaXplOworCQl1aW50OF90IGJ1ZlszICogTFpNQV9JTl9SRVFVSVJFRF07CisJfSB0ZW1wOworfTsKKworLyoqKioqKioqKioqKioqCisgKiBEaWN0aW9uYXJ5ICoKKyAqKioqKioqKioqKioqKi8KKworLyoKKyAqIFJlc2V0IHRoZSBkaWN0aW9uYXJ5IHN0YXRlLiBXaGVuIGluIHNpbmdsZS1jYWxsIG1vZGUsIHNldCB1cCB0aGUgYmVnaW5uaW5nCisgKiBvZiB0aGUgZGljdGlvbmFyeSB0byBwb2ludCB0byB0aGUgYWN0dWFsIG91dHB1dCBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIGRpY3RfcmVzZXQoc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHN0cnVjdCB4el9idWYgKmIpCit7CisJaWYgKERFQ19JU19TSU5HTEUoZGljdC0+bW9kZSkpIHsKKwkJZGljdC0+YnVmID0gYi0+b3V0ICsgYi0+b3V0X3BvczsKKwkJZGljdC0+ZW5kID0gYi0+b3V0X3NpemUgLSBiLT5vdXRfcG9zOworCX0KKworCWRpY3QtPnN0YXJ0ID0gMDsKKwlkaWN0LT5wb3MgPSAwOworCWRpY3QtPmxpbWl0ID0gMDsKKwlkaWN0LT5mdWxsID0gMDsKK30KKworLyogU2V0IGRpY3Rpb25hcnkgd3JpdGUgbGltaXQgKi8KK3N0YXRpYyB2b2lkIGRpY3RfbGltaXQoc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHNpemVfdCBvdXRfbWF4KQoreworCWlmIChkaWN0LT5lbmQgLSBkaWN0LT5wb3MgPD0gb3V0X21heCkKKwkJZGljdC0+bGltaXQgPSBkaWN0LT5lbmQ7CisJZWxzZQorCQlkaWN0LT5saW1pdCA9IGRpY3QtPnBvcyArIG91dF9tYXg7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBieXRlIGNhbiBiZSB3cml0dGVuIGludG8gdGhlIGRpY3Rpb25hcnkuICovCitzdGF0aWMgaW5saW5lIGJvb2wgZGljdF9oYXNfc3BhY2UoY29uc3Qgc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QpCit7CisJcmV0dXJuIGRpY3QtPnBvcyA8IGRpY3QtPmxpbWl0OworfQorCisvKgorICogR2V0IGEgYnl0ZSBmcm9tIHRoZSBkaWN0aW9uYXJ5IGF0IHRoZSBnaXZlbiBkaXN0YW5jZS4gVGhlIGRpc3RhbmNlIGlzCisgKiBhc3N1bWVkIHRvIHZhbGlkLCBvciBhcyBhIHNwZWNpYWwgY2FzZSwgemVybyB3aGVuIHRoZSBkaWN0aW9uYXJ5IGlzCisgKiBzdGlsbCBlbXB0eS4gVGhpcyBzcGVjaWFsIGNhc2UgaXMgbmVlZGVkIGZvciBzaW5nbGUtY2FsbCBkZWNvZGluZyB0bworICogYXZvaWQgd3JpdGluZyBhICdcMCcgdG8gdGhlIGVuZCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGRpY3RfZ2V0KGNvbnN0IHN0cnVjdCBkaWN0aW9uYXJ5ICpkaWN0LCB1aW50MzJfdCBkaXN0KQoreworCXNpemVfdCBvZmZzZXQgPSBkaWN0LT5wb3MgLSBkaXN0IC0gMTsKKworCWlmIChkaXN0ID49IGRpY3QtPnBvcykKKwkJb2Zmc2V0ICs9IGRpY3QtPmVuZDsKKworCXJldHVybiBkaWN0LT5mdWxsID4gMCA/IGRpY3QtPmJ1ZltvZmZzZXRdIDogMDsKK30KKworLyoKKyAqIFB1dCBvbmUgYnl0ZSBpbnRvIHRoZSBkaWN0aW9uYXJ5LiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlcmUgaXMgc3BhY2UgZm9yIGl0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGljdF9wdXQoc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHVpbnQ4X3QgYnl0ZSkKK3sKKwlkaWN0LT5idWZbZGljdC0+cG9zKytdID0gYnl0ZTsKKworCWlmIChkaWN0LT5mdWxsIDwgZGljdC0+cG9zKQorCQlkaWN0LT5mdWxsID0gZGljdC0+cG9zOworfQorCisvKgorICogUmVwZWF0IGdpdmVuIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBnaXZlbiBkaXN0YW5jZS4gSWYgdGhlIGRpc3RhbmNlIGlzCisgKiBpbnZhbGlkLCBmYWxzZSBpcyByZXR1cm5lZC4gT24gc3VjY2VzcywgdHJ1ZSBpcyByZXR1cm5lZCBhbmQgKmxlbiBpcworICogdXBkYXRlZCB0byBpbmRpY2F0ZSBob3cgbWFueSBieXRlcyB3ZXJlIGxlZnQgdG8gYmUgcmVwZWF0ZWQuCisgKi8KK3N0YXRpYyBib29sIGRpY3RfcmVwZWF0KHN0cnVjdCBkaWN0aW9uYXJ5ICpkaWN0LCB1aW50MzJfdCAqbGVuLCB1aW50MzJfdCBkaXN0KQoreworCXNpemVfdCBiYWNrOworCXVpbnQzMl90IGxlZnQ7CisKKwlpZiAoZGlzdCA+PSBkaWN0LT5mdWxsIHx8IGRpc3QgPj0gZGljdC0+c2l6ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJbGVmdCA9IG1pbl90KHNpemVfdCwgZGljdC0+bGltaXQgLSBkaWN0LT5wb3MsICpsZW4pOworCSpsZW4gLT0gbGVmdDsKKworCWJhY2sgPSBkaWN0LT5wb3MgLSBkaXN0IC0gMTsKKwlpZiAoZGlzdCA+PSBkaWN0LT5wb3MpCisJCWJhY2sgKz0gZGljdC0+ZW5kOworCisJZG8geworCQlkaWN0LT5idWZbZGljdC0+cG9zKytdID0gZGljdC0+YnVmW2JhY2srK107CisJCWlmIChiYWNrID09IGRpY3QtPmVuZCkKKwkJCWJhY2sgPSAwOworCX0gd2hpbGUgKC0tbGVmdCA+IDApOworCisJaWYgKGRpY3QtPmZ1bGwgPCBkaWN0LT5wb3MpCisJCWRpY3QtPmZ1bGwgPSBkaWN0LT5wb3M7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogQ29weSB1bmNvbXByZXNzZWQgZGF0YSBhcyBpcyBmcm9tIGlucHV0IHRvIGRpY3Rpb25hcnkgYW5kIG91dHB1dCBidWZmZXJzLiAqLworc3RhdGljIHZvaWQgZGljdF91bmNvbXByZXNzZWQoc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHN0cnVjdCB4el9idWYgKmIsCisJCQkgICAgICB1aW50MzJfdCAqbGVmdCkKK3sKKwlzaXplX3QgY29weV9zaXplOworCisJd2hpbGUgKCpsZWZ0ID4gMCAmJiBiLT5pbl9wb3MgPCBiLT5pbl9zaXplCisJCQkmJiBiLT5vdXRfcG9zIDwgYi0+b3V0X3NpemUpIHsKKwkJY29weV9zaXplID0gbWluKGItPmluX3NpemUgLSBiLT5pbl9wb3MsCisJCQkJYi0+b3V0X3NpemUgLSBiLT5vdXRfcG9zKTsKKwkJaWYgKGNvcHlfc2l6ZSA+IGRpY3QtPmVuZCAtIGRpY3QtPnBvcykKKwkJCWNvcHlfc2l6ZSA9IGRpY3QtPmVuZCAtIGRpY3QtPnBvczsKKwkJaWYgKGNvcHlfc2l6ZSA+ICpsZWZ0KQorCQkJY29weV9zaXplID0gKmxlZnQ7CisKKwkJKmxlZnQgLT0gY29weV9zaXplOworCisJCW1lbWNweShkaWN0LT5idWYgKyBkaWN0LT5wb3MsIGItPmluICsgYi0+aW5fcG9zLCBjb3B5X3NpemUpOworCQlkaWN0LT5wb3MgKz0gY29weV9zaXplOworCisJCWlmIChkaWN0LT5mdWxsIDwgZGljdC0+cG9zKQorCQkJZGljdC0+ZnVsbCA9IGRpY3QtPnBvczsKKworCQlpZiAoREVDX0lTX01VTFRJKGRpY3QtPm1vZGUpKSB7CisJCQlpZiAoZGljdC0+cG9zID09IGRpY3QtPmVuZCkKKwkJCQlkaWN0LT5wb3MgPSAwOworCisJCQltZW1jcHkoYi0+b3V0ICsgYi0+b3V0X3BvcywgYi0+aW4gKyBiLT5pbl9wb3MsCisJCQkJCWNvcHlfc2l6ZSk7CisJCX0KKworCQlkaWN0LT5zdGFydCA9IGRpY3QtPnBvczsKKworCQliLT5vdXRfcG9zICs9IGNvcHlfc2l6ZTsKKwkJYi0+aW5fcG9zICs9IGNvcHlfc2l6ZTsKKwl9Cit9CisKKy8qCisgKiBGbHVzaCBwZW5kaW5nIGRhdGEgZnJvbSBkaWN0aW9uYXJ5IHRvIGItPm91dC4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZXJlIGlzCisgKiBlbm91Z2ggc3BhY2UgaW4gYi0+b3V0LiBUaGlzIGlzIGd1YXJhbnRlZWQgYmVjYXVzZSBjYWxsZXIgdXNlcyBkaWN0X2xpbWl0KCkKKyAqIGJlZm9yZSBkZWNvZGluZyBkYXRhIGludG8gdGhlIGRpY3Rpb25hcnkuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBkaWN0X2ZsdXNoKHN0cnVjdCBkaWN0aW9uYXJ5ICpkaWN0LCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBjb3B5X3NpemUgPSBkaWN0LT5wb3MgLSBkaWN0LT5zdGFydDsKKworCWlmIChERUNfSVNfTVVMVEkoZGljdC0+bW9kZSkpIHsKKwkJaWYgKGRpY3QtPnBvcyA9PSBkaWN0LT5lbmQpCisJCQlkaWN0LT5wb3MgPSAwOworCisJCW1lbWNweShiLT5vdXQgKyBiLT5vdXRfcG9zLCBkaWN0LT5idWYgKyBkaWN0LT5zdGFydCwKKwkJCQljb3B5X3NpemUpOworCX0KKworCWRpY3QtPnN0YXJ0ID0gZGljdC0+cG9zOworCWItPm91dF9wb3MgKz0gY29weV9zaXplOworCXJldHVybiBjb3B5X3NpemU7Cit9CisKKy8qKioqKioqKioqKioqKioqKgorICogUmFuZ2UgZGVjb2RlciAqCisgKioqKioqKioqKioqKioqKiovCisKKy8qIFJlc2V0IHRoZSByYW5nZSBkZWNvZGVyLiAqLworc3RhdGljIHZvaWQgcmNfcmVzZXQoc3RydWN0IHJjX2RlYyAqcmMpCit7CisJcmMtPnJhbmdlID0gKHVpbnQzMl90KS0xOworCXJjLT5jb2RlID0gMDsKKwlyYy0+aW5pdF9ieXRlc19sZWZ0ID0gUkNfSU5JVF9CWVRFUzsKK30KKworLyoKKyAqIFJlYWQgdGhlIGZpcnN0IGZpdmUgaW5pdGlhbCBieXRlcyBpbnRvIHJjLT5jb2RlIGlmIHRoZXkgaGF2ZW4ndCBiZWVuCisgKiByZWFkIGFscmVhZHkuIChZZXMsIHRoZSBmaXJzdCBieXRlIGdldHMgY29tcGxldGVseSBpZ25vcmVkLikKKyAqLworc3RhdGljIGJvb2wgcmNfcmVhZF9pbml0KHN0cnVjdCByY19kZWMgKnJjLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXdoaWxlIChyYy0+aW5pdF9ieXRlc19sZWZ0ID4gMCkgeworCQlpZiAoYi0+aW5fcG9zID09IGItPmluX3NpemUpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJcmMtPmNvZGUgPSAocmMtPmNvZGUgPDwgOCkgKyBiLT5pbltiLT5pbl9wb3MrK107CisJCS0tcmMtPmluaXRfYnl0ZXNfbGVmdDsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogUmV0dXJuIHRydWUgaWYgdGhlcmUgbWF5IG5vdCBiZSBlbm91Z2ggaW5wdXQgZm9yIHRoZSBuZXh0IGRlY29kaW5nIGxvb3AuICovCitzdGF0aWMgaW5saW5lIGJvb2wgcmNfbGltaXRfZXhjZWVkZWQoY29uc3Qgc3RydWN0IHJjX2RlYyAqcmMpCit7CisJcmV0dXJuIHJjLT5pbl9wb3MgPiByYy0+aW5fbGltaXQ7Cit9CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSAoZnJvbSBwb2ludCBvZiB2aWV3IG9mIHJhbmdlIGRlY29kZXIpIHRoYXQKKyAqIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBMWk1BIGNodW5rLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgcmNfaXNfZmluaXNoZWQoY29uc3Qgc3RydWN0IHJjX2RlYyAqcmMpCit7CisJcmV0dXJuIHJjLT5jb2RlID09IDA7Cit9CisKKy8qIFJlYWQgdGhlIG5leHQgaW5wdXQgYnl0ZSBpZiBuZWVkZWQuICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgcmNfbm9ybWFsaXplKHN0cnVjdCByY19kZWMgKnJjKQoreworCWlmIChyYy0+cmFuZ2UgPCBSQ19UT1BfVkFMVUUpIHsKKwkJcmMtPnJhbmdlIDw8PSBSQ19TSElGVF9CSVRTOworCQlyYy0+Y29kZSA9IChyYy0+Y29kZSA8PCBSQ19TSElGVF9CSVRTKSArIHJjLT5pbltyYy0+aW5fcG9zKytdOworCX0KK30KKworLyoKKyAqIERlY29kZSBvbmUgYml0LiBJbiBzb21lIHZlcnNpb25zLCB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHNwbGl0dGVkIGluIHRocmVlCisgKiBmdW5jdGlvbnMgc28gdGhhdCB0aGUgY29tcGlsZXIgaXMgc3VwcG9zZWQgdG8gYmUgYWJsZSB0byBtb3JlIGVhc2lseSBhdm9pZAorICogYW4gZXh0cmEgYnJhbmNoLiBJbiB0aGlzIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiB0aGUgTFpNQSBkZWNvZGVyLCB0aGlzCisgKiBkb2Vzbid0IHNlZW0gdG8gYmUgYSBnb29kIGlkZWEgKHRlc3RlZCB3aXRoIEdDQyAzLjMuNiwgMy40LjYsIGFuZCA0LjMuMworICogb24geDg2KS4gVXNpbmcgYSBub24tc3BsaXR0ZWQgdmVyc2lvbiByZXN1bHRzIGluIG5pY2VyIGxvb2tpbmcgY29kZSB0b28uCisgKgorICogTk9URTogVGhpcyBtdXN0IHJldHVybiBhbiBpbnQuIERvIG5vdCBtYWtlIGl0IHJldHVybiBhIGJvb2wgb3IgdGhlIHNwZWVkCisgKiBvZiB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgR0NDIDMueCBkZWNyZWFzZXMgMTAtMTUgJS4gKEdDQyA0LjMgZG9lc24ndCBjYXJlLAorICogYW5kIGl0IGdlbmVyYXRlcyAxMC0yMCAlIGZhc3RlciBjb2RlIHRoYW4gR0NDIDMueCBmcm9tIHRoaXMgZmlsZSBhbnl3YXkuKQorICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCByY19iaXQoc3RydWN0IHJjX2RlYyAqcmMsIHVpbnQxNl90ICpwcm9iKQoreworCXVpbnQzMl90IGJvdW5kOworCWludCBiaXQ7CisKKwlyY19ub3JtYWxpemUocmMpOworCWJvdW5kID0gKHJjLT5yYW5nZSA+PiBSQ19CSVRfTU9ERUxfVE9UQUxfQklUUykgKiAqcHJvYjsKKwlpZiAocmMtPmNvZGUgPCBib3VuZCkgeworCQlyYy0+cmFuZ2UgPSBib3VuZDsKKwkJKnByb2IgKz0gKFJDX0JJVF9NT0RFTF9UT1RBTCAtICpwcm9iKSA+PiBSQ19NT1ZFX0JJVFM7CisJCWJpdCA9IDA7CisJfSBlbHNlIHsKKwkJcmMtPnJhbmdlIC09IGJvdW5kOworCQlyYy0+Y29kZSAtPSBib3VuZDsKKwkJKnByb2IgLT0gKnByb2IgPj4gUkNfTU9WRV9CSVRTOworCQliaXQgPSAxOworCX0KKworCXJldHVybiBiaXQ7Cit9CisKKy8qIERlY29kZSBhIGJpdHRyZWUgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVpbnQzMl90IHJjX2JpdHRyZWUoc3RydWN0IHJjX2RlYyAqcmMsCisJCQkJCSAgIHVpbnQxNl90ICpwcm9icywgdWludDMyX3QgbGltaXQpCit7CisJdWludDMyX3Qgc3ltYm9sID0gMTsKKworCWRvIHsKKwkJaWYgKHJjX2JpdChyYywgJnByb2JzW3N5bWJvbF0pKQorCQkJc3ltYm9sID0gKHN5bWJvbCA8PCAxKSArIDE7CisJCWVsc2UKKwkJCXN5bWJvbCA8PD0gMTsKKwl9IHdoaWxlIChzeW1ib2wgPCBsaW1pdCk7CisKKwlyZXR1cm4gc3ltYm9sOworfQorCisvKiBEZWNvZGUgYSBiaXR0cmVlIHN0YXJ0aW5nIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCByY19iaXR0cmVlX3JldmVyc2Uoc3RydWN0IHJjX2RlYyAqcmMsCisJCQkJCSAgICAgICB1aW50MTZfdCAqcHJvYnMsCisJCQkJCSAgICAgICB1aW50MzJfdCAqZGVzdCwgdWludDMyX3QgbGltaXQpCit7CisJdWludDMyX3Qgc3ltYm9sID0gMTsKKwl1aW50MzJfdCBpID0gMDsKKworCWRvIHsKKwkJaWYgKHJjX2JpdChyYywgJnByb2JzW3N5bWJvbF0pKSB7CisJCQlzeW1ib2wgPSAoc3ltYm9sIDw8IDEpICsgMTsKKwkJCSpkZXN0ICs9IDEgPDwgaTsKKwkJfSBlbHNlIHsKKwkJCXN5bWJvbCA8PD0gMTsKKwkJfQorCX0gd2hpbGUgKCsraSA8IGxpbWl0KTsKK30KKworLyogRGVjb2RlIGRpcmVjdCBiaXRzIChmaXhlZCBmaWZ0eS1maWZ0eSBwcm9iYWJpbGl0eSkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByY19kaXJlY3Qoc3RydWN0IHJjX2RlYyAqcmMsIHVpbnQzMl90ICpkZXN0LCB1aW50MzJfdCBsaW1pdCkKK3sKKwl1aW50MzJfdCBtYXNrOworCisJZG8geworCQlyY19ub3JtYWxpemUocmMpOworCQlyYy0+cmFuZ2UgPj49IDE7CisJCXJjLT5jb2RlIC09IHJjLT5yYW5nZTsKKwkJbWFzayA9ICh1aW50MzJfdCkwIC0gKHJjLT5jb2RlID4+IDMxKTsKKwkJcmMtPmNvZGUgKz0gcmMtPnJhbmdlICYgbWFzazsKKwkJKmRlc3QgPSAoKmRlc3QgPDwgMSkgKyAobWFzayArIDEpOworCX0gd2hpbGUgKC0tbGltaXQgPiAwKTsKK30KKworLyoqKioqKioqCisgKiBMWk1BICoKKyAqKioqKioqKi8KKworLyogR2V0IHBvaW50ZXIgdG8gbGl0ZXJhbCBjb2RlciBwcm9iYWJpbGl0eSBhcnJheS4gKi8KK3N0YXRpYyB1aW50MTZfdCAqbHptYV9saXRlcmFsX3Byb2JzKHN0cnVjdCB4el9kZWNfbHptYTIgKnMpCit7CisJdWludDMyX3QgcHJldl9ieXRlID0gZGljdF9nZXQoJnMtPmRpY3QsIDApOworCXVpbnQzMl90IGxvdyA9IHByZXZfYnl0ZSA+PiAoOCAtIHMtPmx6bWEubGMpOworCXVpbnQzMl90IGhpZ2ggPSAocy0+ZGljdC5wb3MgJiBzLT5sem1hLmxpdGVyYWxfcG9zX21hc2spIDw8IHMtPmx6bWEubGM7CisJcmV0dXJuIHMtPmx6bWEubGl0ZXJhbFtsb3cgKyBoaWdoXTsKK30KKworLyogRGVjb2RlIGEgbGl0ZXJhbCAob25lIDgtYml0IGJ5dGUpICovCitzdGF0aWMgdm9pZCBsem1hX2xpdGVyYWwoc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJdWludDMyX3Qgc3ltYm9sOworCXVpbnQzMl90IG1hdGNoX2J5dGU7CisJdWludDMyX3QgbWF0Y2hfYml0OworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBpOworCisJcHJvYnMgPSBsem1hX2xpdGVyYWxfcHJvYnMocyk7CisKKwlpZiAobHptYV9zdGF0ZV9pc19saXRlcmFsKHMtPmx6bWEuc3RhdGUpKSB7CisJCXN5bWJvbCA9IHJjX2JpdHRyZWUoJnMtPnJjLCBwcm9icywgMHgxMDApOworCX0gZWxzZSB7CisJCXN5bWJvbCA9IDE7CisJCW1hdGNoX2J5dGUgPSBkaWN0X2dldCgmcy0+ZGljdCwgcy0+bHptYS5yZXAwKSA8PCAxOworCQlvZmZzZXQgPSAweDEwMDsKKworCQlkbyB7CisJCQltYXRjaF9iaXQgPSBtYXRjaF9ieXRlICYgb2Zmc2V0OworCQkJbWF0Y2hfYnl0ZSA8PD0gMTsKKwkJCWkgPSBvZmZzZXQgKyBtYXRjaF9iaXQgKyBzeW1ib2w7CisKKwkJCWlmIChyY19iaXQoJnMtPnJjLCAmcHJvYnNbaV0pKSB7CisJCQkJc3ltYm9sID0gKHN5bWJvbCA8PCAxKSArIDE7CisJCQkJb2Zmc2V0ICY9IG1hdGNoX2JpdDsKKwkJCX0gZWxzZSB7CisJCQkJc3ltYm9sIDw8PSAxOworCQkJCW9mZnNldCAmPSB+bWF0Y2hfYml0OworCQkJfQorCQl9IHdoaWxlIChzeW1ib2wgPCAweDEwMCk7CisJfQorCisJZGljdF9wdXQoJnMtPmRpY3QsICh1aW50OF90KXN5bWJvbCk7CisJbHptYV9zdGF0ZV9saXRlcmFsKCZzLT5sem1hLnN0YXRlKTsKK30KKworLyogRGVjb2RlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGludG8gcy0+bHptYS5sZW4uICovCitzdGF0aWMgdm9pZCBsem1hX2xlbihzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCBzdHJ1Y3QgbHptYV9sZW5fZGVjICpsLAorCQkgICAgIHVpbnQzMl90IHBvc19zdGF0ZSkKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJdWludDMyX3QgbGltaXQ7CisKKwlpZiAoIXJjX2JpdCgmcy0+cmMsICZsLT5jaG9pY2UpKSB7CisJCXByb2JzID0gbC0+bG93W3Bvc19zdGF0ZV07CisJCWxpbWl0ID0gTEVOX0xPV19TWU1CT0xTOworCQlzLT5sem1hLmxlbiA9IE1BVENIX0xFTl9NSU47CisJfSBlbHNlIHsKKwkJaWYgKCFyY19iaXQoJnMtPnJjLCAmbC0+Y2hvaWNlMikpIHsKKwkJCXByb2JzID0gbC0+bWlkW3Bvc19zdGF0ZV07CisJCQlsaW1pdCA9IExFTl9NSURfU1lNQk9MUzsKKwkJCXMtPmx6bWEubGVuID0gTUFUQ0hfTEVOX01JTiArIExFTl9MT1dfU1lNQk9MUzsKKwkJfSBlbHNlIHsKKwkJCXByb2JzID0gbC0+aGlnaDsKKwkJCWxpbWl0ID0gTEVOX0hJR0hfU1lNQk9MUzsKKwkJCXMtPmx6bWEubGVuID0gTUFUQ0hfTEVOX01JTiArIExFTl9MT1dfU1lNQk9MUworCQkJCQkrIExFTl9NSURfU1lNQk9MUzsKKwkJfQorCX0KKworCXMtPmx6bWEubGVuICs9IHJjX2JpdHRyZWUoJnMtPnJjLCBwcm9icywgbGltaXQpIC0gbGltaXQ7Cit9CisKKy8qIERlY29kZSBhIG1hdGNoLiBUaGUgZGlzdGFuY2Ugd2lsbCBiZSBzdG9yZWQgaW4gcy0+bHptYS5yZXAwLiAqLworc3RhdGljIHZvaWQgbHptYV9tYXRjaChzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCB1aW50MzJfdCBwb3Nfc3RhdGUpCit7CisJdWludDE2X3QgKnByb2JzOworCXVpbnQzMl90IGRpc3Rfc2xvdDsKKwl1aW50MzJfdCBsaW1pdDsKKworCWx6bWFfc3RhdGVfbWF0Y2goJnMtPmx6bWEuc3RhdGUpOworCisJcy0+bHptYS5yZXAzID0gcy0+bHptYS5yZXAyOworCXMtPmx6bWEucmVwMiA9IHMtPmx6bWEucmVwMTsKKwlzLT5sem1hLnJlcDEgPSBzLT5sem1hLnJlcDA7CisKKwlsem1hX2xlbihzLCAmcy0+bHptYS5tYXRjaF9sZW5fZGVjLCBwb3Nfc3RhdGUpOworCisJcHJvYnMgPSBzLT5sem1hLmRpc3Rfc2xvdFtsem1hX2dldF9kaXN0X3N0YXRlKHMtPmx6bWEubGVuKV07CisJZGlzdF9zbG90ID0gcmNfYml0dHJlZSgmcy0+cmMsIHByb2JzLCBESVNUX1NMT1RTKSAtIERJU1RfU0xPVFM7CisKKwlpZiAoZGlzdF9zbG90IDwgRElTVF9NT0RFTF9TVEFSVCkgeworCQlzLT5sem1hLnJlcDAgPSBkaXN0X3Nsb3Q7CisJfSBlbHNlIHsKKwkJbGltaXQgPSAoZGlzdF9zbG90ID4+IDEpIC0gMTsKKwkJcy0+bHptYS5yZXAwID0gMiArIChkaXN0X3Nsb3QgJiAxKTsKKworCQlpZiAoZGlzdF9zbG90IDwgRElTVF9NT0RFTF9FTkQpIHsKKwkJCXMtPmx6bWEucmVwMCA8PD0gbGltaXQ7CisJCQlwcm9icyA9IHMtPmx6bWEuZGlzdF9zcGVjaWFsICsgcy0+bHptYS5yZXAwCisJCQkJCS0gZGlzdF9zbG90IC0gMTsKKwkJCXJjX2JpdHRyZWVfcmV2ZXJzZSgmcy0+cmMsIHByb2JzLAorCQkJCQkmcy0+bHptYS5yZXAwLCBsaW1pdCk7CisJCX0gZWxzZSB7CisJCQlyY19kaXJlY3QoJnMtPnJjLCAmcy0+bHptYS5yZXAwLCBsaW1pdCAtIEFMSUdOX0JJVFMpOworCQkJcy0+bHptYS5yZXAwIDw8PSBBTElHTl9CSVRTOworCQkJcmNfYml0dHJlZV9yZXZlcnNlKCZzLT5yYywgcy0+bHptYS5kaXN0X2FsaWduLAorCQkJCQkmcy0+bHptYS5yZXAwLCBBTElHTl9CSVRTKTsKKwkJfQorCX0KK30KKworLyoKKyAqIERlY29kZSBhIHJlcGVhdGVkIG1hdGNoLiBUaGUgZGlzdGFuY2UgaXMgb25lIG9mIHRoZSBmb3VyIG1vc3QgcmVjZW50bHkKKyAqIHNlZW4gbWF0Y2hlcy4gVGhlIGRpc3RhbmNlIHdpbGwgYmUgc3RvcmVkIGluIHMtPmx6bWEucmVwMC4KKyAqLworc3RhdGljIHZvaWQgbHptYV9yZXBfbWF0Y2goc3RydWN0IHh6X2RlY19sem1hMiAqcywgdWludDMyX3QgcG9zX3N0YXRlKQoreworCXVpbnQzMl90IHRtcDsKKworCWlmICghcmNfYml0KCZzLT5yYywgJnMtPmx6bWEuaXNfcmVwMFtzLT5sem1hLnN0YXRlXSkpIHsKKwkJaWYgKCFyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXAwX2xvbmdbCisJCQkJcy0+bHptYS5zdGF0ZV1bcG9zX3N0YXRlXSkpIHsKKwkJCWx6bWFfc3RhdGVfc2hvcnRfcmVwKCZzLT5sem1hLnN0YXRlKTsKKwkJCXMtPmx6bWEubGVuID0gMTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghcmNfYml0KCZzLT5yYywgJnMtPmx6bWEuaXNfcmVwMVtzLT5sem1hLnN0YXRlXSkpIHsKKwkJCXRtcCA9IHMtPmx6bWEucmVwMTsKKwkJfSBlbHNlIHsKKwkJCWlmICghcmNfYml0KCZzLT5yYywgJnMtPmx6bWEuaXNfcmVwMltzLT5sem1hLnN0YXRlXSkpIHsKKwkJCQl0bXAgPSBzLT5sem1hLnJlcDI7CisJCQl9IGVsc2UgeworCQkJCXRtcCA9IHMtPmx6bWEucmVwMzsKKwkJCQlzLT5sem1hLnJlcDMgPSBzLT5sem1hLnJlcDI7CisJCQl9CisKKwkJCXMtPmx6bWEucmVwMiA9IHMtPmx6bWEucmVwMTsKKwkJfQorCisJCXMtPmx6bWEucmVwMSA9IHMtPmx6bWEucmVwMDsKKwkJcy0+bHptYS5yZXAwID0gdG1wOworCX0KKworCWx6bWFfc3RhdGVfbG9uZ19yZXAoJnMtPmx6bWEuc3RhdGUpOworCWx6bWFfbGVuKHMsICZzLT5sem1hLnJlcF9sZW5fZGVjLCBwb3Nfc3RhdGUpOworfQorCisvKiBMWk1BIGRlY29kZXIgY29yZSAqLworc3RhdGljIGJvb2wgbHptYV9tYWluKHN0cnVjdCB4el9kZWNfbHptYTIgKnMpCit7CisJdWludDMyX3QgcG9zX3N0YXRlOworCisJLyoKKwkgKiBJZiB0aGUgZGljdGlvbmFyeSB3YXMgcmVhY2hlZCBkdXJpbmcgdGhlIHByZXZpb3VzIGNhbGwsIHRyeSB0bworCSAqIGZpbmlzaCB0aGUgcG9zc2libHkgcGVuZGluZyByZXBlYXQgaW4gdGhlIGRpY3Rpb25hcnkuCisJICovCisJaWYgKGRpY3RfaGFzX3NwYWNlKCZzLT5kaWN0KSAmJiBzLT5sem1hLmxlbiA+IDApCisJCWRpY3RfcmVwZWF0KCZzLT5kaWN0LCAmcy0+bHptYS5sZW4sIHMtPmx6bWEucmVwMCk7CisKKwkvKgorCSAqIERlY29kZSBtb3JlIExaTUEgc3ltYm9scy4gT25lIGl0ZXJhdGlvbiBtYXkgY29uc3VtZSB1cCB0bworCSAqIExaTUFfSU5fUkVRVUlSRUQgLSAxIGJ5dGVzLgorCSAqLworCXdoaWxlIChkaWN0X2hhc19zcGFjZSgmcy0+ZGljdCkgJiYgIXJjX2xpbWl0X2V4Y2VlZGVkKCZzLT5yYykpIHsKKwkJcG9zX3N0YXRlID0gcy0+ZGljdC5wb3MgJiBzLT5sem1hLnBvc19tYXNrOworCisJCWlmICghcmNfYml0KCZzLT5yYywgJnMtPmx6bWEuaXNfbWF0Y2hbCisJCQkJcy0+bHptYS5zdGF0ZV1bcG9zX3N0YXRlXSkpIHsKKwkJCWx6bWFfbGl0ZXJhbChzKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXBbcy0+bHptYS5zdGF0ZV0pKQorCQkJCWx6bWFfcmVwX21hdGNoKHMsIHBvc19zdGF0ZSk7CisJCQllbHNlCisJCQkJbHptYV9tYXRjaChzLCBwb3Nfc3RhdGUpOworCisJCQlpZiAoIWRpY3RfcmVwZWF0KCZzLT5kaWN0LCAmcy0+bHptYS5sZW4sIHMtPmx6bWEucmVwMCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJLyoKKwkgKiBIYXZpbmcgdGhlIHJhbmdlIGRlY29kZXIgYWx3YXlzIG5vcm1hbGl6ZWQgd2hlbiB3ZSBhcmUgb3V0c2lkZQorCSAqIHRoaXMgZnVuY3Rpb24gbWFrZXMgaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBoYW5kbGUgZW5kIG9mIHRoZSBjaHVuay4KKwkgKi8KKwlyY19ub3JtYWxpemUoJnMtPnJjKTsKKworCXJldHVybiB0cnVlOworfQorCisvKgorICogUmVzZXQgdGhlIExaTUEgZGVjb2RlciBhbmQgcmFuZ2UgZGVjb2RlciBzdGF0ZS4gRGljdGlvbmFyeSBpcyBub3JlIHJlc2V0CisgKiBoZXJlLCBiZWNhdXNlIExaTUEgc3RhdGUgbWF5IGJlIHJlc2V0IHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBkaWN0aW9uYXJ5LgorICovCitzdGF0aWMgdm9pZCBsem1hX3Jlc2V0KHN0cnVjdCB4el9kZWNfbHptYTIgKnMpCit7CisJdWludDE2X3QgKnByb2JzOworCXNpemVfdCBpOworCisJcy0+bHptYS5zdGF0ZSA9IFNUQVRFX0xJVF9MSVQ7CisJcy0+bHptYS5yZXAwID0gMDsKKwlzLT5sem1hLnJlcDEgPSAwOworCXMtPmx6bWEucmVwMiA9IDA7CisJcy0+bHptYS5yZXAzID0gMDsKKworCS8qCisJICogQWxsIHByb2JhYmlsaXRpZXMgYXJlIGluaXRpYWxpemVkIHRvIHRoZSBzYW1lIHZhbHVlLiBUaGlzIGhhY2sKKwkgKiBtYWtlcyB0aGUgY29kZSBzbWFsbGVyIGJ5IGF2b2lkaW5nIGEgc2VwYXJhdGUgbG9vcCBmb3IgZWFjaAorCSAqIHByb2JhYmlsaXR5IGFycmF5LgorCSAqCisJICogVGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgc28gdGhhdCBvbmx5IHRoYXQgcGFydCBvZiBsaXRlcmFsCisJICogcHJvYmFiaWxpdGllcyB0aGF0IGFyZSBhY3R1YWxseSByZXF1aXJlZC4gSW4gdGhlIGNvbW1vbiBjYXNlCisJICogd2Ugd291bGQgd3JpdGUgMTIgS2lCIGxlc3MuCisJICovCisJcHJvYnMgPSBzLT5sem1hLmlzX21hdGNoWzBdOworCWZvciAoaSA9IDA7IGkgPCBQUk9CU19UT1RBTDsgKytpKQorCQlwcm9ic1tpXSA9IFJDX0JJVF9NT0RFTF9UT1RBTCAvIDI7CisKKwlyY19yZXNldCgmcy0+cmMpOworfQorCisvKgorICogRGVjb2RlIGFuZCB2YWxpZGF0ZSBMWk1BIHByb3BlcnRpZXMgKGxjL2xwL3BiKSBhbmQgY2FsY3VsYXRlIHRoZSBiaXQgbWFza3MKKyAqIGZyb20gdGhlIGRlY29kZWQgbHAgYW5kIHBiIHZhbHVlcy4gT24gc3VjY2VzcywgdGhlIExaTUEgZGVjb2RlciBzdGF0ZSBpcworICogcmVzZXQgYW5kIHRydWUgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBib29sIGx6bWFfcHJvcHMoc3RydWN0IHh6X2RlY19sem1hMiAqcywgdWludDhfdCBwcm9wcykKK3sKKwlpZiAocHJvcHMgPiAoNCAqIDUgKyA0KSAqIDkgKyA4KQorCQlyZXR1cm4gZmFsc2U7CisKKwlzLT5sem1hLnBvc19tYXNrID0gMDsKKwl3aGlsZSAocHJvcHMgPj0gOSAqIDUpIHsKKwkJcHJvcHMgLT0gOSAqIDU7CisJCSsrcy0+bHptYS5wb3NfbWFzazsKKwl9CisKKwlzLT5sem1hLnBvc19tYXNrID0gKDEgPDwgcy0+bHptYS5wb3NfbWFzaykgLSAxOworCisJcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrID0gMDsKKwl3aGlsZSAocHJvcHMgPj0gOSkgeworCQlwcm9wcyAtPSA5OworCQkrK3MtPmx6bWEubGl0ZXJhbF9wb3NfbWFzazsKKwl9CisKKwlzLT5sem1hLmxjID0gcHJvcHM7CisKKwlpZiAocy0+bHptYS5sYyArIHMtPmx6bWEubGl0ZXJhbF9wb3NfbWFzayA+IDQpCisJCXJldHVybiBmYWxzZTsKKworCXMtPmx6bWEubGl0ZXJhbF9wb3NfbWFzayA9ICgxIDw8IHMtPmx6bWEubGl0ZXJhbF9wb3NfbWFzaykgLSAxOworCisJbHptYV9yZXNldChzKTsKKworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqCisgKiBMWk1BMiAqCisgKioqKioqKioqLworCisvKgorICogVGhlIExaTUEgZGVjb2RlciBhc3N1bWVzIHRoYXQgaWYgdGhlIGlucHV0IGxpbWl0IChzLT5yYy5pbl9saW1pdCkgaGFzbid0CisgKiBiZWVuIGV4Y2VlZGVkLCBpdCBpcyBzYWZlIHRvIHJlYWQgdXAgdG8gTFpNQV9JTl9SRVFVSVJFRCBieXRlcy4gVGhpcworICogd3JhcHBlciBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIG1ha2luZyB0aGUgTFpNQSBkZWNvZGVyJ3MgYXNzdW1wdGlvbiBzYWZlLgorICoKKyAqIEFzIGxvbmcgYXMgdGhlcmUgaXMgcGxlbnR5IG9mIGlucHV0IGxlZnQgdG8gYmUgZGVjb2RlZCBpbiB0aGUgY3VycmVudCBMWk1BCisgKiBjaHVuaywgd2UgZGVjb2RlIGRpcmVjdGx5IGZyb20gdGhlIGNhbGxlci1zdXBwbGllZCBpbnB1dCBidWZmZXIgdW50aWwKKyAqIHRoZXJlJ3MgTFpNQV9JTl9SRVFVSVJFRCBieXRlcyBsZWZ0LiBUaG9zZSByZW1haW5pbmcgYnl0ZXMgYXJlIGNvcGllZCBpbnRvCisgKiBzLT50ZW1wLmJ1Ziwgd2hpY2ggKGhvcGVmdWxseSkgZ2V0cyBmaWxsZWQgb24gdGhlIG5leHQgY2FsbCB0byB0aGlzCisgKiBmdW5jdGlvbi4gV2UgZGVjb2RlIGEgZmV3IGJ5dGVzIGZyb20gdGhlIHRlbXBvcmFyeSBidWZmZXIgc28gdGhhdCB3ZSBjYW4KKyAqIGNvbnRpbnVlIGRlY29kaW5nIGZyb20gdGhlIGNhbGxlci1zdXBwbGllZCBpbnB1dCBidWZmZXIgYWdhaW4uCisgKi8KK3N0YXRpYyBib29sIGx6bWEyX2x6bWEoc3RydWN0IHh6X2RlY19sem1hMiAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgaW5fYXZhaWw7CisJdWludDMyX3QgdG1wOworCisJaW5fYXZhaWwgPSBiLT5pbl9zaXplIC0gYi0+aW5fcG9zOworCWlmIChzLT50ZW1wLnNpemUgPiAwIHx8IHMtPmx6bWEyLmNvbXByZXNzZWQgPT0gMCkgeworCQl0bXAgPSAyICogTFpNQV9JTl9SRVFVSVJFRCAtIHMtPnRlbXAuc2l6ZTsKKwkJaWYgKHRtcCA+IHMtPmx6bWEyLmNvbXByZXNzZWQgLSBzLT50ZW1wLnNpemUpCisJCQl0bXAgPSBzLT5sem1hMi5jb21wcmVzc2VkIC0gcy0+dGVtcC5zaXplOworCQlpZiAodG1wID4gaW5fYXZhaWwpCisJCQl0bXAgPSBpbl9hdmFpbDsKKworCQltZW1jcHkocy0+dGVtcC5idWYgKyBzLT50ZW1wLnNpemUsIGItPmluICsgYi0+aW5fcG9zLCB0bXApOworCisJCWlmIChzLT50ZW1wLnNpemUgKyB0bXAgPT0gcy0+bHptYTIuY29tcHJlc3NlZCkgeworCQkJbWVtemVybyhzLT50ZW1wLmJ1ZiArIHMtPnRlbXAuc2l6ZSArIHRtcCwKKwkJCQkJc2l6ZW9mKHMtPnRlbXAuYnVmKQorCQkJCQkJLSBzLT50ZW1wLnNpemUgLSB0bXApOworCQkJcy0+cmMuaW5fbGltaXQgPSBzLT50ZW1wLnNpemUgKyB0bXA7CisJCX0gZWxzZSBpZiAocy0+dGVtcC5zaXplICsgdG1wIDwgTFpNQV9JTl9SRVFVSVJFRCkgeworCQkJcy0+dGVtcC5zaXplICs9IHRtcDsKKwkJCWItPmluX3BvcyArPSB0bXA7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXMtPnJjLmluX2xpbWl0ID0gcy0+dGVtcC5zaXplICsgdG1wIC0gTFpNQV9JTl9SRVFVSVJFRDsKKwkJfQorCisJCXMtPnJjLmluID0gcy0+dGVtcC5idWY7CisJCXMtPnJjLmluX3BvcyA9IDA7CisKKwkJaWYgKCFsem1hX21haW4ocykgfHwgcy0+cmMuaW5fcG9zID4gcy0+dGVtcC5zaXplICsgdG1wKQorCQkJcmV0dXJuIGZhbHNlOworCisJCXMtPmx6bWEyLmNvbXByZXNzZWQgLT0gcy0+cmMuaW5fcG9zOworCisJCWlmIChzLT5yYy5pbl9wb3MgPCBzLT50ZW1wLnNpemUpIHsKKwkJCXMtPnRlbXAuc2l6ZSAtPSBzLT5yYy5pbl9wb3M7CisJCQltZW1tb3ZlKHMtPnRlbXAuYnVmLCBzLT50ZW1wLmJ1ZiArIHMtPnJjLmluX3BvcywKKwkJCQkJcy0+dGVtcC5zaXplKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJYi0+aW5fcG9zICs9IHMtPnJjLmluX3BvcyAtIHMtPnRlbXAuc2l6ZTsKKwkJcy0+dGVtcC5zaXplID0gMDsKKwl9CisKKwlpbl9hdmFpbCA9IGItPmluX3NpemUgLSBiLT5pbl9wb3M7CisJaWYgKGluX2F2YWlsID49IExaTUFfSU5fUkVRVUlSRUQpIHsKKwkJcy0+cmMuaW4gPSBiLT5pbjsKKwkJcy0+cmMuaW5fcG9zID0gYi0+aW5fcG9zOworCisJCWlmIChpbl9hdmFpbCA+PSBzLT5sem1hMi5jb21wcmVzc2VkICsgTFpNQV9JTl9SRVFVSVJFRCkKKwkJCXMtPnJjLmluX2xpbWl0ID0gYi0+aW5fcG9zICsgcy0+bHptYTIuY29tcHJlc3NlZDsKKwkJZWxzZQorCQkJcy0+cmMuaW5fbGltaXQgPSBiLT5pbl9zaXplIC0gTFpNQV9JTl9SRVFVSVJFRDsKKworCQlpZiAoIWx6bWFfbWFpbihzKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpbl9hdmFpbCA9IHMtPnJjLmluX3BvcyAtIGItPmluX3BvczsKKwkJaWYgKGluX2F2YWlsID4gcy0+bHptYTIuY29tcHJlc3NlZCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlzLT5sem1hMi5jb21wcmVzc2VkIC09IGluX2F2YWlsOworCQliLT5pbl9wb3MgPSBzLT5yYy5pbl9wb3M7CisJfQorCisJaW5fYXZhaWwgPSBiLT5pbl9zaXplIC0gYi0+aW5fcG9zOworCWlmIChpbl9hdmFpbCA8IExaTUFfSU5fUkVRVUlSRUQpIHsKKwkJaWYgKGluX2F2YWlsID4gcy0+bHptYTIuY29tcHJlc3NlZCkKKwkJCWluX2F2YWlsID0gcy0+bHptYTIuY29tcHJlc3NlZDsKKworCQltZW1jcHkocy0+dGVtcC5idWYsIGItPmluICsgYi0+aW5fcG9zLCBpbl9hdmFpbCk7CisJCXMtPnRlbXAuc2l6ZSA9IGluX2F2YWlsOworCQliLT5pbl9wb3MgKz0gaW5fYXZhaWw7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBUYWtlIGNhcmUgb2YgdGhlIExaTUEyIGNvbnRyb2wgbGF5ZXIsIGFuZCBmb3J3YXJkIHRoZSBqb2Igb2YgYWN0dWFsIExaTUEKKyAqIGRlY29kaW5nIG9yIGNvcHlpbmcgb2YgdW5jb21wcmVzc2VkIGNodW5rcyB0byBvdGhlciBmdW5jdGlvbnMuCisgKi8KK1haX0VYVEVSTiBlbnVtIHh6X3JldCB4el9kZWNfbHptYTJfcnVuKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsCisJCQkJICAgICAgIHN0cnVjdCB4el9idWYgKmIpCit7CisJdWludDMyX3QgdG1wOworCisJd2hpbGUgKGItPmluX3BvcyA8IGItPmluX3NpemUgfHwgcy0+bHptYTIuc2VxdWVuY2UgPT0gU0VRX0xaTUFfUlVOKSB7CisJCXN3aXRjaCAocy0+bHptYTIuc2VxdWVuY2UpIHsKKwkJY2FzZSBTRVFfQ09OVFJPTDoKKwkJCS8qCisJCQkgKiBMWk1BMiBjb250cm9sIGJ5dGUKKwkJCSAqCisJCQkgKiBFeGFjdCB2YWx1ZXM6CisJCQkgKiAgIDB4MDAgICBFbmQgbWFya2VyCisJCQkgKiAgIDB4MDEgICBEaWN0aW9uYXJ5IHJlc2V0IGZvbGxvd2VkIGJ5CisJCQkgKiAgICAgICAgICBhbiB1bmNvbXByZXNzZWQgY2h1bmsKKwkJCSAqICAgMHgwMiAgIFVuY29tcHJlc3NlZCBjaHVuayAobm8gZGljdGlvbmFyeSByZXNldCkKKwkJCSAqCisJCQkgKiBIaWdoZXN0IHRocmVlIGJpdHMgKHMtPmNvbnRyb2wgJiAweEUwKToKKwkJCSAqICAgMHhFMCAgIERpY3Rpb25hcnkgcmVzZXQsIG5ldyBwcm9wZXJ0aWVzIGFuZCBzdGF0ZQorCQkJICogICAgICAgICAgcmVzZXQsIGZvbGxvd2VkIGJ5IExaTUEgY29tcHJlc3NlZCBjaHVuaworCQkJICogICAweEMwICAgTmV3IHByb3BlcnRpZXMgYW5kIHN0YXRlIHJlc2V0LCBmb2xsb3dlZAorCQkJICogICAgICAgICAgYnkgTFpNQSBjb21wcmVzc2VkIGNodW5rIChubyBkaWN0aW9uYXJ5CisJCQkgKiAgICAgICAgICByZXNldCkKKwkJCSAqICAgMHhBMCAgIFN0YXRlIHJlc2V0IHVzaW5nIG9sZCBwcm9wZXJ0aWVzLAorCQkJICogICAgICAgICAgZm9sbG93ZWQgYnkgTFpNQSBjb21wcmVzc2VkIGNodW5rIChubworCQkJICogICAgICAgICAgZGljdGlvbmFyeSByZXNldCkKKwkJCSAqICAgMHg4MCAgIExaTUEgY2h1bmsgKG5vIGRpY3Rpb25hcnkgb3Igc3RhdGUgcmVzZXQpCisJCQkgKgorCQkJICogRm9yIExaTUEgY29tcHJlc3NlZCBjaHVua3MsIHRoZSBsb3dlc3QgZml2ZSBiaXRzCisJCQkgKiAocy0+Y29udHJvbCAmIDFGKSBhcmUgdGhlIGhpZ2hlc3QgYml0cyBvZiB0aGUKKwkJCSAqIHVuY29tcHJlc3NlZCBzaXplIChiaXRzIDE2LTIwKS4KKwkJCSAqCisJCQkgKiBBIG5ldyBMWk1BMiBzdHJlYW0gbXVzdCBiZWdpbiB3aXRoIGEgZGljdGlvbmFyeQorCQkJICogcmVzZXQuIFRoZSBmaXJzdCBMWk1BIGNodW5rIG11c3Qgc2V0IG5ldworCQkJICogcHJvcGVydGllcyBhbmQgcmVzZXQgdGhlIExaTUEgc3RhdGUuCisJCQkgKgorCQkJICogVmFsdWVzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55dGhpbmcgZGVzY3JpYmVkIGFib3ZlCisJCQkgKiBhcmUgaW52YWxpZCBhbmQgd2UgcmV0dXJuIFhaX0RBVEFfRVJST1IuCisJCQkgKi8KKwkJCXRtcCA9IGItPmluW2ItPmluX3BvcysrXTsKKworCQkJaWYgKHRtcCA9PSAweDAwKQorCQkJCXJldHVybiBYWl9TVFJFQU1fRU5EOworCisJCQlpZiAodG1wID49IDB4RTAgfHwgdG1wID09IDB4MDEpIHsKKwkJCQlzLT5sem1hMi5uZWVkX3Byb3BzID0gdHJ1ZTsKKwkJCQlzLT5sem1hMi5uZWVkX2RpY3RfcmVzZXQgPSBmYWxzZTsKKwkJCQlkaWN0X3Jlc2V0KCZzLT5kaWN0LCBiKTsKKwkJCX0gZWxzZSBpZiAocy0+bHptYTIubmVlZF9kaWN0X3Jlc2V0KSB7CisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisJCQl9CisKKwkJCWlmICh0bXAgPj0gMHg4MCkgeworCQkJCXMtPmx6bWEyLnVuY29tcHJlc3NlZCA9ICh0bXAgJiAweDFGKSA8PCAxNjsKKwkJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9VTkNPTVBSRVNTRURfMTsKKworCQkJCWlmICh0bXAgPj0gMHhDMCkgeworCQkJCQkvKgorCQkJCQkgKiBXaGVuIHRoZXJlIGFyZSBuZXcgcHJvcGVydGllcywKKwkJCQkJICogc3RhdGUgcmVzZXQgaXMgZG9uZSBhdAorCQkJCQkgKiBTRVFfUFJPUEVSVElFUy4KKwkJCQkJICovCisJCQkJCXMtPmx6bWEyLm5lZWRfcHJvcHMgPSBmYWxzZTsKKwkJCQkJcy0+bHptYTIubmV4dF9zZXF1ZW5jZQorCQkJCQkJCT0gU0VRX1BST1BFUlRJRVM7CisKKwkJCQl9IGVsc2UgaWYgKHMtPmx6bWEyLm5lZWRfcHJvcHMpIHsKKwkJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCQl9IGVsc2UgeworCQkJCQlzLT5sem1hMi5uZXh0X3NlcXVlbmNlCisJCQkJCQkJPSBTRVFfTFpNQV9QUkVQQVJFOworCQkJCQlpZiAodG1wID49IDB4QTApCisJCQkJCQlsem1hX3Jlc2V0KHMpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRtcCA+IDB4MDIpCisJCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfQ09NUFJFU1NFRF8wOworCQkJCXMtPmx6bWEyLm5leHRfc2VxdWVuY2UgPSBTRVFfQ09QWTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfVU5DT01QUkVTU0VEXzE6CisJCQlzLT5sem1hMi51bmNvbXByZXNzZWQKKwkJCQkJKz0gKHVpbnQzMl90KWItPmluW2ItPmluX3BvcysrXSA8PCA4OworCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfVU5DT01QUkVTU0VEXzI7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9VTkNPTVBSRVNTRURfMjoKKwkJCXMtPmx6bWEyLnVuY29tcHJlc3NlZAorCQkJCQkrPSAodWludDMyX3QpYi0+aW5bYi0+aW5fcG9zKytdICsgMTsKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTVBSRVNTRURfMDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0NPTVBSRVNTRURfMDoKKwkJCXMtPmx6bWEyLmNvbXByZXNzZWQKKwkJCQkJPSAodWludDMyX3QpYi0+aW5bYi0+aW5fcG9zKytdIDw8IDg7CisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9DT01QUkVTU0VEXzE7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9DT01QUkVTU0VEXzE6CisJCQlzLT5sem1hMi5jb21wcmVzc2VkCisJCQkJCSs9ICh1aW50MzJfdCliLT5pbltiLT5pbl9wb3MrK10gKyAxOworCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBzLT5sem1hMi5uZXh0X3NlcXVlbmNlOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfUFJPUEVSVElFUzoKKwkJCWlmICghbHptYV9wcm9wcyhzLCBiLT5pbltiLT5pbl9wb3MrK10pKQorCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9MWk1BX1BSRVBBUkU7CisKKwkJY2FzZSBTRVFfTFpNQV9QUkVQQVJFOgorCQkJaWYgKHMtPmx6bWEyLmNvbXByZXNzZWQgPCBSQ19JTklUX0JZVEVTKQorCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQlpZiAoIXJjX3JlYWRfaW5pdCgmcy0+cmMsIGIpKQorCQkJCXJldHVybiBYWl9PSzsKKworCQkJcy0+bHptYTIuY29tcHJlc3NlZCAtPSBSQ19JTklUX0JZVEVTOworCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfTFpNQV9SVU47CisKKwkJY2FzZSBTRVFfTFpNQV9SVU46CisJCQkvKgorCQkJICogU2V0IGRpY3Rpb25hcnkgbGltaXQgdG8gaW5kaWNhdGUgaG93IG11Y2ggd2Ugd2FudAorCQkJICogdG8gYmUgZW5jb2RlZCBhdCBtYXhpbXVtLiBEZWNvZGUgbmV3IGRhdGEgaW50byB0aGUKKwkJCSAqIGRpY3Rpb25hcnkuIEZsdXNoIHRoZSBuZXcgZGF0YSBmcm9tIGRpY3Rpb25hcnkgdG8KKwkJCSAqIGItPm91dC4gQ2hlY2sgaWYgd2UgZmluaXNoZWQgZGVjb2RpbmcgdGhpcyBjaHVuay4KKwkJCSAqIEluIGNhc2UgdGhlIGRpY3Rpb25hcnkgZ290IGZ1bGwgYnV0IHdlIGRpZG4ndCBmaWxsCisJCQkgKiB0aGUgb3V0cHV0IGJ1ZmZlciB5ZXQsIHdlIG1heSBydW4gdGhpcyBsb29wCisJCQkgKiBtdWx0aXBsZSB0aW1lcyB3aXRob3V0IGNoYW5naW5nIHMtPmx6bWEyLnNlcXVlbmNlLgorCQkJICovCisJCQlkaWN0X2xpbWl0KCZzLT5kaWN0LCBtaW5fdChzaXplX3QsCisJCQkJCWItPm91dF9zaXplIC0gYi0+b3V0X3BvcywKKwkJCQkJcy0+bHptYTIudW5jb21wcmVzc2VkKSk7CisJCQlpZiAoIWx6bWEyX2x6bWEocywgYikpCisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCXMtPmx6bWEyLnVuY29tcHJlc3NlZCAtPSBkaWN0X2ZsdXNoKCZzLT5kaWN0LCBiKTsKKworCQkJaWYgKHMtPmx6bWEyLnVuY29tcHJlc3NlZCA9PSAwKSB7CisJCQkJaWYgKHMtPmx6bWEyLmNvbXByZXNzZWQgPiAwIHx8IHMtPmx6bWEubGVuID4gMAorCQkJCQkJfHwgIXJjX2lzX2ZpbmlzaGVkKCZzLT5yYykpCisJCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQkJcmNfcmVzZXQoJnMtPnJjKTsKKwkJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9DT05UUk9MOworCisJCQl9IGVsc2UgaWYgKGItPm91dF9wb3MgPT0gYi0+b3V0X3NpemUKKwkJCQkJfHwgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplCisJCQkJCQkmJiBzLT50ZW1wLnNpemUKKwkJCQkJCTwgcy0+bHptYTIuY29tcHJlc3NlZCkpIHsKKwkJCQlyZXR1cm4gWFpfT0s7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0NPUFk6CisJCQlkaWN0X3VuY29tcHJlc3NlZCgmcy0+ZGljdCwgYiwgJnMtPmx6bWEyLmNvbXByZXNzZWQpOworCQkJaWYgKHMtPmx6bWEyLmNvbXByZXNzZWQgPiAwKQorCQkJCXJldHVybiBYWl9PSzsKKworCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfQ09OVFJPTDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIFhaX09LOworfQorCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlY19sem1hMiAqeHpfZGVjX2x6bWEyX2NyZWF0ZShlbnVtIHh6X21vZGUgbW9kZSwKKwkJCQkJCSAgIHVpbnQzMl90IGRpY3RfbWF4KQoreworCXN0cnVjdCB4el9kZWNfbHptYTIgKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmIChzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcy0+ZGljdC5tb2RlID0gbW9kZTsKKwlzLT5kaWN0LnNpemVfbWF4ID0gZGljdF9tYXg7CisKKwlpZiAoREVDX0lTX1BSRUFMTE9DKG1vZGUpKSB7CisJCXMtPmRpY3QuYnVmID0gdm1hbGxvYyhkaWN0X21heCk7CisJCWlmIChzLT5kaWN0LmJ1ZiA9PSBOVUxMKSB7CisJCQlrZnJlZShzKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfSBlbHNlIGlmIChERUNfSVNfRFlOQUxMT0MobW9kZSkpIHsKKwkJcy0+ZGljdC5idWYgPSBOVUxMOworCQlzLT5kaWN0LmFsbG9jYXRlZCA9IDA7CisJfQorCisJcmV0dXJuIHM7Cit9CisKK1haX0VYVEVSTiBlbnVtIHh6X3JldCB4el9kZWNfbHptYTJfcmVzZXQoc3RydWN0IHh6X2RlY19sem1hMiAqcywgdWludDhfdCBwcm9wcykKK3sKKwkvKiBUaGlzIGxpbWl0cyBkaWN0aW9uYXJ5IHNpemUgdG8gMyBHaUIgdG8ga2VlcCBwYXJzaW5nIHNpbXBsZXIuICovCisJaWYgKHByb3BzID4gMzkpCisJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJcy0+ZGljdC5zaXplID0gMiArIChwcm9wcyAmIDEpOworCXMtPmRpY3Quc2l6ZSA8PD0gKHByb3BzID4+IDEpICsgMTE7CisKKwlpZiAoREVDX0lTX01VTFRJKHMtPmRpY3QubW9kZSkpIHsKKwkJaWYgKHMtPmRpY3Quc2l6ZSA+IHMtPmRpY3Quc2l6ZV9tYXgpCisJCQlyZXR1cm4gWFpfTUVNTElNSVRfRVJST1I7CisKKwkJcy0+ZGljdC5lbmQgPSBzLT5kaWN0LnNpemU7CisKKwkJaWYgKERFQ19JU19EWU5BTExPQyhzLT5kaWN0Lm1vZGUpKSB7CisJCQlpZiAocy0+ZGljdC5hbGxvY2F0ZWQgPCBzLT5kaWN0LnNpemUpIHsKKwkJCQl2ZnJlZShzLT5kaWN0LmJ1Zik7CisJCQkJcy0+ZGljdC5idWYgPSB2bWFsbG9jKHMtPmRpY3Quc2l6ZSk7CisJCQkJaWYgKHMtPmRpY3QuYnVmID09IE5VTEwpIHsKKwkJCQkJcy0+ZGljdC5hbGxvY2F0ZWQgPSAwOworCQkJCQlyZXR1cm4gWFpfTUVNX0VSUk9SOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXMtPmx6bWEubGVuID0gMDsKKworCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTlRST0w7CisJcy0+bHptYTIubmVlZF9kaWN0X3Jlc2V0ID0gdHJ1ZTsKKworCXMtPnRlbXAuc2l6ZSA9IDA7CisKKwlyZXR1cm4gWFpfT0s7Cit9CisKK1haX0VYVEVSTiB2b2lkIHh6X2RlY19sem1hMl9lbmQoc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwlpZiAoREVDX0lTX01VTFRJKHMtPmRpY3QubW9kZSkpCisJCXZmcmVlKHMtPmRpY3QuYnVmKTsKKworCWtmcmVlKHMpOworfQpkaWZmIC0tZ2l0IGEvbHptYS94ei1lbWJlZGRlZC94el9kZWNfc3RyZWFtLmMgYi9sem1hL3h6LWVtYmVkZGVkL3h6X2RlY19zdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjUyNTUwCi0tLSAvZGV2L251bGwKKysrIGIvbHptYS94ei1lbWJlZGRlZC94el9kZWNfc3RyZWFtLmMKQEAgLTAsMCArMSw4NDcgQEAKKy8qCisgKiAueHogU3RyZWFtIGRlY29kZXIKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworI2luY2x1ZGUgInh6X3ByaXZhdGUuaCIKKyNpbmNsdWRlICJ4el9zdHJlYW0uaCIKKworI2lmZGVmIFhaX1VTRV9DUkM2NAorIwlkZWZpbmUgSVNfQ1JDNjQoY2hlY2tfdHlwZSkgKChjaGVja190eXBlKSA9PSBYWl9DSEVDS19DUkM2NCkKKyNlbHNlCisjCWRlZmluZSBJU19DUkM2NChjaGVja190eXBlKSBmYWxzZQorI2VuZGlmCisKKy8qIEhhc2ggdXNlZCB0byB2YWxpZGF0ZSB0aGUgSW5kZXggZmllbGQgKi8KK3N0cnVjdCB4el9kZWNfaGFzaCB7CisJdmxpX3R5cGUgdW5wYWRkZWQ7CisJdmxpX3R5cGUgdW5jb21wcmVzc2VkOworCXVpbnQzMl90IGNyYzMyOworfTsKKworc3RydWN0IHh6X2RlYyB7CisJLyogUG9zaXRpb24gaW4gZGVjX21haW4oKSAqLworCWVudW0geworCQlTRVFfU1RSRUFNX0hFQURFUiwKKwkJU0VRX0JMT0NLX1NUQVJULAorCQlTRVFfQkxPQ0tfSEVBREVSLAorCQlTRVFfQkxPQ0tfVU5DT01QUkVTUywKKwkJU0VRX0JMT0NLX1BBRERJTkcsCisJCVNFUV9CTE9DS19DSEVDSywKKwkJU0VRX0lOREVYLAorCQlTRVFfSU5ERVhfUEFERElORywKKwkJU0VRX0lOREVYX0NSQzMyLAorCQlTRVFfU1RSRUFNX0ZPT1RFUgorCX0gc2VxdWVuY2U7CisKKwkvKiBQb3NpdGlvbiBpbiB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMgYW5kIENoZWNrIGZpZWxkcyAqLworCXVpbnQzMl90IHBvczsKKworCS8qIFZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGRlY29kZWQgYnkgZGVjX3ZsaSgpICovCisJdmxpX3R5cGUgdmxpOworCisJLyogU2F2ZWQgaW5fcG9zIGFuZCBvdXRfcG9zICovCisJc2l6ZV90IGluX3N0YXJ0OworCXNpemVfdCBvdXRfc3RhcnQ7CisKKyNpZmRlZiBYWl9VU0VfQ1JDNjQKKwkvKiBDUkMzMiBvciBDUkM2NCB2YWx1ZSBpbiBCbG9jayBvciBDUkMzMiB2YWx1ZSBpbiBJbmRleCAqLworCXVpbnQ2NF90IGNyYzsKKyNlbHNlCisJLyogQ1JDMzIgdmFsdWUgaW4gQmxvY2sgb3IgSW5kZXggKi8KKwl1aW50MzJfdCBjcmM7CisjZW5kaWYKKworCS8qIFR5cGUgb2YgdGhlIGludGVncml0eSBjaGVjayBjYWxjdWxhdGVkIGZyb20gdW5jb21wcmVzc2VkIGRhdGEgKi8KKwllbnVtIHh6X2NoZWNrIGNoZWNrX3R5cGU7CisKKwkvKiBPcGVyYXRpb24gbW9kZSAqLworCWVudW0geHpfbW9kZSBtb2RlOworCisJLyoKKwkgKiBUcnVlIGlmIHRoZSBuZXh0IGNhbGwgdG8geHpfZGVjX3J1bigpIGlzIGFsbG93ZWQgdG8gcmV0dXJuCisJICogWFpfQlVGX0VSUk9SLgorCSAqLworCWJvb2wgYWxsb3dfYnVmX2Vycm9yOworCisJLyogSW5mb3JtYXRpb24gc3RvcmVkIGluIEJsb2NrIEhlYWRlciAqLworCXN0cnVjdCB7CisJCS8qCisJCSAqIFZhbHVlIHN0b3JlZCBpbiB0aGUgQ29tcHJlc3NlZCBTaXplIGZpZWxkLCBvcgorCQkgKiBWTElfVU5LTk9XTiBpZiBDb21wcmVzc2VkIFNpemUgaXMgbm90IHByZXNlbnQuCisJCSAqLworCQl2bGlfdHlwZSBjb21wcmVzc2VkOworCisJCS8qCisJCSAqIFZhbHVlIHN0b3JlZCBpbiB0aGUgVW5jb21wcmVzc2VkIFNpemUgZmllbGQsIG9yCisJCSAqIFZMSV9VTktOT1dOIGlmIFVuY29tcHJlc3NlZCBTaXplIGlzIG5vdCBwcmVzZW50LgorCQkgKi8KKwkJdmxpX3R5cGUgdW5jb21wcmVzc2VkOworCisJCS8qIFNpemUgb2YgdGhlIEJsb2NrIEhlYWRlciBmaWVsZCAqLworCQl1aW50MzJfdCBzaXplOworCX0gYmxvY2tfaGVhZGVyOworCisJLyogSW5mb3JtYXRpb24gY29sbGVjdGVkIHdoZW4gZGVjb2RpbmcgQmxvY2tzICovCisJc3RydWN0IHsKKwkJLyogT2JzZXJ2ZWQgY29tcHJlc3NlZCBzaXplIG9mIHRoZSBjdXJyZW50IEJsb2NrICovCisJCXZsaV90eXBlIGNvbXByZXNzZWQ7CisKKwkJLyogT2JzZXJ2ZWQgdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIGN1cnJlbnQgQmxvY2sgKi8KKwkJdmxpX3R5cGUgdW5jb21wcmVzc2VkOworCisJCS8qIE51bWJlciBvZiBCbG9ja3MgZGVjb2RlZCBzbyBmYXIgKi8KKwkJdmxpX3R5cGUgY291bnQ7CisKKwkJLyoKKwkJICogSGFzaCBjYWxjdWxhdGVkIGZyb20gdGhlIEJsb2NrIHNpemVzLiBUaGlzIGlzIHVzZWQgdG8KKwkJICogdmFsaWRhdGUgdGhlIEluZGV4IGZpZWxkLgorCQkgKi8KKwkJc3RydWN0IHh6X2RlY19oYXNoIGhhc2g7CisJfSBibG9jazsKKworCS8qIFZhcmlhYmxlcyBuZWVkZWQgd2hlbiB2ZXJpZnlpbmcgdGhlIEluZGV4IGZpZWxkICovCisJc3RydWN0IHsKKwkJLyogUG9zaXRpb24gaW4gZGVjX2luZGV4KCkgKi8KKwkJZW51bSB7CisJCQlTRVFfSU5ERVhfQ09VTlQsCisJCQlTRVFfSU5ERVhfVU5QQURERUQsCisJCQlTRVFfSU5ERVhfVU5DT01QUkVTU0VECisJCX0gc2VxdWVuY2U7CisKKwkJLyogU2l6ZSBvZiB0aGUgSW5kZXggaW4gYnl0ZXMgKi8KKwkJdmxpX3R5cGUgc2l6ZTsKKworCQkvKiBOdW1iZXIgb2YgUmVjb3JkcyAobWF0Y2hlcyBibG9jay5jb3VudCBpbiB2YWxpZCBmaWxlcykgKi8KKwkJdmxpX3R5cGUgY291bnQ7CisKKwkJLyoKKwkJICogSGFzaCBjYWxjdWxhdGVkIGZyb20gdGhlIFJlY29yZHMgKG1hdGNoZXMgYmxvY2suaGFzaCBpbgorCQkgKiB2YWxpZCBmaWxlcykuCisJCSAqLworCQlzdHJ1Y3QgeHpfZGVjX2hhc2ggaGFzaDsKKwl9IGluZGV4OworCisJLyoKKwkgKiBUZW1wb3JhcnkgYnVmZmVyIG5lZWRlZCB0byBob2xkIFN0cmVhbSBIZWFkZXIsIEJsb2NrIEhlYWRlciwKKwkgKiBhbmQgU3RyZWFtIEZvb3Rlci4gVGhlIEJsb2NrIEhlYWRlciBpcyB0aGUgYmlnZ2VzdCAoMSBLaUIpCisJICogc28gd2UgcmVzZXJ2ZSBzcGFjZSBhY2NvcmRpbmcgdG8gdGhhdC4gYnVmW10gaGFzIHRvIGJlIGFsaWduZWQKKwkgKiB0byBhIG11bHRpcGxlIG9mIGZvdXIgYnl0ZXM7IHRoZSBzaXplX3QgdmFyaWFibGVzIGJlZm9yZSBpdAorCSAqIHNob3VsZCBndWFyYW50ZWUgdGhpcy4KKwkgKi8KKwlzdHJ1Y3QgeworCQlzaXplX3QgcG9zOworCQlzaXplX3Qgc2l6ZTsKKwkJdWludDhfdCBidWZbMTAyNF07CisJfSB0ZW1wOworCisJc3RydWN0IHh6X2RlY19sem1hMiAqbHptYTI7CisKKyNpZmRlZiBYWl9ERUNfQkNKCisJc3RydWN0IHh6X2RlY19iY2ogKmJjajsKKwlib29sIGJjal9hY3RpdmU7CisjZW5kaWYKK307CisKKyNpZmRlZiBYWl9ERUNfQU5ZX0NIRUNLCisvKiBTaXplcyBvZiB0aGUgQ2hlY2sgZmllbGQgd2l0aCBkaWZmZXJlbnQgQ2hlY2sgSURzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBjaGVja19zaXplc1sxNl0gPSB7CisJMCwKKwk0LCA0LCA0LAorCTgsIDgsIDgsCisJMTYsIDE2LCAxNiwKKwkzMiwgMzIsIDMyLAorCTY0LCA2NCwgNjQKK307CisjZW5kaWYKKworLyoKKyAqIEZpbGwgcy0+dGVtcCBieSBjb3B5aW5nIGRhdGEgc3RhcnRpbmcgZnJvbSBiLT5pbltiLT5pbl9wb3NdLiBDYWxsZXIKKyAqIG11c3QgaGF2ZSBzZXQgcy0+dGVtcC5wb3MgdG8gaW5kaWNhdGUgaG93IG11Y2ggZGF0YSB3ZSBhcmUgc3VwcG9zZWQKKyAqIHRvIGNvcHkgaW50byBzLT50ZW1wLmJ1Zi4gUmV0dXJuIHRydWUgb25jZSBzLT50ZW1wLnBvcyBoYXMgcmVhY2hlZAorICogcy0+dGVtcC5zaXplLgorICovCitzdGF0aWMgYm9vbCBmaWxsX3RlbXAoc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgY29weV9zaXplID0gbWluX3Qoc2l6ZV90LAorCQkJYi0+aW5fc2l6ZSAtIGItPmluX3Bvcywgcy0+dGVtcC5zaXplIC0gcy0+dGVtcC5wb3MpOworCisJbWVtY3B5KHMtPnRlbXAuYnVmICsgcy0+dGVtcC5wb3MsIGItPmluICsgYi0+aW5fcG9zLCBjb3B5X3NpemUpOworCWItPmluX3BvcyArPSBjb3B5X3NpemU7CisJcy0+dGVtcC5wb3MgKz0gY29weV9zaXplOworCisJaWYgKHMtPnRlbXAucG9zID09IHMtPnRlbXAuc2l6ZSkgeworCQlzLT50ZW1wLnBvcyA9IDA7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyogRGVjb2RlIGEgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgKGxpdHRsZS1lbmRpYW4gYmFzZS0xMjggZW5jb2RpbmcpICovCitzdGF0aWMgZW51bSB4el9yZXQgZGVjX3ZsaShzdHJ1Y3QgeHpfZGVjICpzLCBjb25zdCB1aW50OF90ICppbiwKKwkJCSAgIHNpemVfdCAqaW5fcG9zLCBzaXplX3QgaW5fc2l6ZSkKK3sKKwl1aW50OF90IGJ5dGU7CisKKwlpZiAocy0+cG9zID09IDApCisJCXMtPnZsaSA9IDA7CisKKwl3aGlsZSAoKmluX3BvcyA8IGluX3NpemUpIHsKKwkJYnl0ZSA9IGluWyppbl9wb3NdOworCQkrKyppbl9wb3M7CisKKwkJcy0+dmxpIHw9ICh2bGlfdHlwZSkoYnl0ZSAmIDB4N0YpIDw8IHMtPnBvczsKKworCQlpZiAoKGJ5dGUgJiAweDgwKSA9PSAwKSB7CisJCQkvKiBEb24ndCBhbGxvdyBub24tbWluaW1hbCBlbmNvZGluZ3MuICovCisJCQlpZiAoYnl0ZSA9PSAwICYmIHMtPnBvcyAhPSAwKQorCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQlzLT5wb3MgPSAwOworCQkJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7CisJCX0KKworCQlzLT5wb3MgKz0gNzsKKwkJaWYgKHMtPnBvcyA9PSA3ICogVkxJX0JZVEVTX01BWCkKKwkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCX0KKworCXJldHVybiBYWl9PSzsKK30KKworLyoKKyAqIERlY29kZSB0aGUgQ29tcHJlc3NlZCBEYXRhIGZpZWxkIGZyb20gYSBCbG9jay4gVXBkYXRlIGFuZCB2YWxpZGF0ZQorICogdGhlIG9ic2VydmVkIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBzaXplcyBvZiB0aGUgQmxvY2sgc28gdGhhdAorICogdGhleSBkb24ndCBleGNlZWQgdGhlIHZhbHVlcyBwb3NzaWJseSBzdG9yZWQgaW4gdGhlIEJsb2NrIEhlYWRlcgorICogKHZhbGlkYXRpb24gYXNzdW1lcyB0aGF0IG5vIGludGVnZXIgb3ZlcmZsb3cgb2NjdXJzLCBzaW5jZSB2bGlfdHlwZQorICogaXMgbm9ybWFsbHkgdWludDY0X3QpLiBVcGRhdGUgdGhlIENSQzMyIG9yIENSQzY0IHZhbHVlIGlmIHByZXNlbmNlIG9mCisgKiB0aGUgQ1JDMzIgb3IgQ1JDNjQgZmllbGQgd2FzIGluZGljYXRlZCBpbiBTdHJlYW0gSGVhZGVyLgorICoKKyAqIE9uY2UgdGhlIGRlY29kaW5nIGlzIGZpbmlzaGVkLCB2YWxpZGF0ZSB0aGF0IHRoZSBvYnNlcnZlZCBzaXplcyBtYXRjaAorICogdGhlIHNpemVzIHBvc3NpYmx5IHN0b3JlZCBpbiB0aGUgQmxvY2sgSGVhZGVyLiBVcGRhdGUgdGhlIGhhc2ggYW5kCisgKiBCbG9jayBjb3VudCwgd2hpY2ggYXJlIGxhdGVyIHVzZWQgdG8gdmFsaWRhdGUgdGhlIEluZGV4IGZpZWxkLgorICovCitzdGF0aWMgZW51bSB4el9yZXQgZGVjX2Jsb2NrKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJZW51bSB4el9yZXQgcmV0OworCisJcy0+aW5fc3RhcnQgPSBiLT5pbl9wb3M7CisJcy0+b3V0X3N0YXJ0ID0gYi0+b3V0X3BvczsKKworI2lmZGVmIFhaX0RFQ19CQ0oKKwlpZiAocy0+YmNqX2FjdGl2ZSkKKwkJcmV0ID0geHpfZGVjX2Jjal9ydW4ocy0+YmNqLCBzLT5sem1hMiwgYik7CisJZWxzZQorI2VuZGlmCisJCXJldCA9IHh6X2RlY19sem1hMl9ydW4ocy0+bHptYTIsIGIpOworCisJcy0+YmxvY2suY29tcHJlc3NlZCArPSBiLT5pbl9wb3MgLSBzLT5pbl9zdGFydDsKKwlzLT5ibG9jay51bmNvbXByZXNzZWQgKz0gYi0+b3V0X3BvcyAtIHMtPm91dF9zdGFydDsKKworCS8qCisJICogVGhlcmUgaXMgbm8gbmVlZCB0byBzZXBhcmF0ZWx5IGNoZWNrIGZvciBWTElfVU5LTk9XTiwgc2luY2UKKwkgKiB0aGUgb2JzZXJ2ZWQgc2l6ZXMgYXJlIGFsd2F5cyBzbWFsbGVyIHRoYW4gVkxJX1VOS05PV04uCisJICovCisJaWYgKHMtPmJsb2NrLmNvbXByZXNzZWQgPiBzLT5ibG9ja19oZWFkZXIuY29tcHJlc3NlZAorCQkJfHwgcy0+YmxvY2sudW5jb21wcmVzc2VkCisJCQkJPiBzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCWlmIChzLT5jaGVja190eXBlID09IFhaX0NIRUNLX0NSQzMyKQorCQlzLT5jcmMgPSB4el9jcmMzMihiLT5vdXQgKyBzLT5vdXRfc3RhcnQsCisJCQkJYi0+b3V0X3BvcyAtIHMtPm91dF9zdGFydCwgcy0+Y3JjKTsKKyNpZmRlZiBYWl9VU0VfQ1JDNjQKKwllbHNlIGlmIChzLT5jaGVja190eXBlID09IFhaX0NIRUNLX0NSQzY0KQorCQlzLT5jcmMgPSB4el9jcmM2NChiLT5vdXQgKyBzLT5vdXRfc3RhcnQsCisJCQkJYi0+b3V0X3BvcyAtIHMtPm91dF9zdGFydCwgcy0+Y3JjKTsKKyNlbmRpZgorCisJaWYgKHJldCA9PSBYWl9TVFJFQU1fRU5EKSB7CisJCWlmIChzLT5ibG9ja19oZWFkZXIuY29tcHJlc3NlZCAhPSBWTElfVU5LTk9XTgorCQkJCSYmIHMtPmJsb2NrX2hlYWRlci5jb21wcmVzc2VkCisJCQkJCSE9IHMtPmJsb2NrLmNvbXByZXNzZWQpCisJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQlpZiAocy0+YmxvY2tfaGVhZGVyLnVuY29tcHJlc3NlZCAhPSBWTElfVU5LTk9XTgorCQkJCSYmIHMtPmJsb2NrX2hlYWRlci51bmNvbXByZXNzZWQKKwkJCQkJIT0gcy0+YmxvY2sudW5jb21wcmVzc2VkKQorCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJcy0+YmxvY2suaGFzaC51bnBhZGRlZCArPSBzLT5ibG9ja19oZWFkZXIuc2l6ZQorCQkJCSsgcy0+YmxvY2suY29tcHJlc3NlZDsKKworI2lmZGVmIFhaX0RFQ19BTllfQ0hFQ0sKKwkJcy0+YmxvY2suaGFzaC51bnBhZGRlZCArPSBjaGVja19zaXplc1tzLT5jaGVja190eXBlXTsKKyNlbHNlCisJCWlmIChzLT5jaGVja190eXBlID09IFhaX0NIRUNLX0NSQzMyKQorCQkJcy0+YmxvY2suaGFzaC51bnBhZGRlZCArPSA0OworCQllbHNlIGlmIChJU19DUkM2NChzLT5jaGVja190eXBlKSkKKwkJCXMtPmJsb2NrLmhhc2gudW5wYWRkZWQgKz0gODsKKyNlbmRpZgorCisJCXMtPmJsb2NrLmhhc2gudW5jb21wcmVzc2VkICs9IHMtPmJsb2NrLnVuY29tcHJlc3NlZDsKKwkJcy0+YmxvY2suaGFzaC5jcmMzMiA9IHh6X2NyYzMyKAorCQkJCShjb25zdCB1aW50OF90ICopJnMtPmJsb2NrLmhhc2gsCisJCQkJc2l6ZW9mKHMtPmJsb2NrLmhhc2gpLCBzLT5ibG9jay5oYXNoLmNyYzMyKTsKKworCQkrK3MtPmJsb2NrLmNvdW50OworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIFVwZGF0ZSB0aGUgSW5kZXggc2l6ZSBhbmQgdGhlIENSQzMyIHZhbHVlLiAqLworc3RhdGljIHZvaWQgaW5kZXhfdXBkYXRlKHN0cnVjdCB4el9kZWMgKnMsIGNvbnN0IHN0cnVjdCB4el9idWYgKmIpCit7CisJc2l6ZV90IGluX3VzZWQgPSBiLT5pbl9wb3MgLSBzLT5pbl9zdGFydDsKKwlzLT5pbmRleC5zaXplICs9IGluX3VzZWQ7CisJcy0+Y3JjID0geHpfY3JjMzIoYi0+aW4gKyBzLT5pbl9zdGFydCwgaW5fdXNlZCwgcy0+Y3JjKTsKK30KKworLyoKKyAqIERlY29kZSB0aGUgTnVtYmVyIG9mIFJlY29yZHMsIFVucGFkZGVkIFNpemUsIGFuZCBVbmNvbXByZXNzZWQgU2l6ZQorICogZmllbGRzIGZyb20gdGhlIEluZGV4IGZpZWxkLiBUaGF0IGlzLCBJbmRleCBQYWRkaW5nIGFuZCBDUkMzMiBhcmUgbm90CisgKiBkZWNvZGVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKgorICogVGhpcyBjYW4gcmV0dXJuIFhaX09LIChtb3JlIGlucHV0IG5lZWRlZCksIFhaX1NUUkVBTV9FTkQgKGV2ZXJ5dGhpbmcKKyAqIHN1Y2Nlc3NmdWxseSBkZWNvZGVkKSwgb3IgWFpfREFUQV9FUlJPUiAoaW5wdXQgaXMgY29ycnVwdCkuCisgKi8KK3N0YXRpYyBlbnVtIHh6X3JldCBkZWNfaW5kZXgoc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwllbnVtIHh6X3JldCByZXQ7CisKKwlkbyB7CisJCXJldCA9IGRlY192bGkocywgYi0+aW4sICZiLT5pbl9wb3MsIGItPmluX3NpemUpOworCQlpZiAocmV0ICE9IFhaX1NUUkVBTV9FTkQpIHsKKwkJCWluZGV4X3VwZGF0ZShzLCBiKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlzd2l0Y2ggKHMtPmluZGV4LnNlcXVlbmNlKSB7CisJCWNhc2UgU0VRX0lOREVYX0NPVU5UOgorCQkJcy0+aW5kZXguY291bnQgPSBzLT52bGk7CisKKwkJCS8qCisJCQkgKiBWYWxpZGF0ZSB0aGF0IHRoZSBOdW1iZXIgb2YgUmVjb3JkcyBmaWVsZAorCQkJICogaW5kaWNhdGVzIHRoZSBzYW1lIG51bWJlciBvZiBSZWNvcmRzIGFzCisJCQkgKiB0aGVyZSB3ZXJlIEJsb2NrcyBpbiB0aGUgU3RyZWFtLgorCQkJICovCisJCQlpZiAocy0+aW5kZXguY291bnQgIT0gcy0+YmxvY2suY291bnQpCisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCXMtPmluZGV4LnNlcXVlbmNlID0gU0VRX0lOREVYX1VOUEFEREVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfSU5ERVhfVU5QQURERUQ6CisJCQlzLT5pbmRleC5oYXNoLnVucGFkZGVkICs9IHMtPnZsaTsKKwkJCXMtPmluZGV4LnNlcXVlbmNlID0gU0VRX0lOREVYX1VOQ09NUFJFU1NFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0lOREVYX1VOQ09NUFJFU1NFRDoKKwkJCXMtPmluZGV4Lmhhc2gudW5jb21wcmVzc2VkICs9IHMtPnZsaTsKKwkJCXMtPmluZGV4Lmhhc2guY3JjMzIgPSB4el9jcmMzMigKKwkJCQkJKGNvbnN0IHVpbnQ4X3QgKikmcy0+aW5kZXguaGFzaCwKKwkJCQkJc2l6ZW9mKHMtPmluZGV4Lmhhc2gpLAorCQkJCQlzLT5pbmRleC5oYXNoLmNyYzMyKTsKKwkJCS0tcy0+aW5kZXguY291bnQ7CisJCQlzLT5pbmRleC5zZXF1ZW5jZSA9IFNFUV9JTkRFWF9VTlBBRERFRDsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAocy0+aW5kZXguY291bnQgPiAwKTsKKworCXJldHVybiBYWl9TVFJFQU1fRU5EOworfQorCisvKgorICogVmFsaWRhdGUgdGhhdCB0aGUgbmV4dCBmb3VyIG9yIGVpZ2h0IGlucHV0IGJ5dGVzIG1hdGNoIHRoZSB2YWx1ZQorICogb2Ygcy0+Y3JjLiBzLT5wb3MgbXVzdCBiZSB6ZXJvIHdoZW4gc3RhcnRpbmcgdG8gdmFsaWRhdGUgdGhlIGZpcnN0IGJ5dGUuCisgKiBUaGUgImJpdHMiIGFyZ3VtZW50IGFsbG93cyB1c2luZyB0aGUgc2FtZSBjb2RlIGZvciBib3RoIENSQzMyIGFuZCBDUkM2NC4KKyAqLworc3RhdGljIGVudW0geHpfcmV0IGNyY192YWxpZGF0ZShzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiLAorCQkJCXVpbnQzMl90IGJpdHMpCit7CisJZG8geworCQlpZiAoYi0+aW5fcG9zID09IGItPmluX3NpemUpCisJCQlyZXR1cm4gWFpfT0s7CisKKwkJaWYgKCgocy0+Y3JjID4+IHMtPnBvcykgJiAweEZGKSAhPSBiLT5pbltiLT5pbl9wb3MrK10pCisJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQlzLT5wb3MgKz0gODsKKworCX0gd2hpbGUgKHMtPnBvcyA8IGJpdHMpOworCisJcy0+Y3JjID0gMDsKKwlzLT5wb3MgPSAwOworCisJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7Cit9CisKKyNpZmRlZiBYWl9ERUNfQU5ZX0NIRUNLCisvKgorICogU2tpcCBvdmVyIHRoZSBDaGVjayBmaWVsZCB3aGVuIHRoZSBDaGVjayBJRCBpcyBub3Qgc3VwcG9ydGVkLgorICogUmV0dXJucyB0cnVlIG9uY2UgdGhlIHdob2xlIENoZWNrIGZpZWxkIGhhcyBiZWVuIHNraXBwZWQgb3Zlci4KKyAqLworc3RhdGljIGJvb2wgY2hlY2tfc2tpcChzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXdoaWxlIChzLT5wb3MgPCBjaGVja19zaXplc1tzLT5jaGVja190eXBlXSkgeworCQlpZiAoYi0+aW5fcG9zID09IGItPmluX3NpemUpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJKytiLT5pbl9wb3M7CisJCSsrcy0+cG9zOworCX0KKworCXMtPnBvcyA9IDA7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCisvKiBEZWNvZGUgdGhlIFN0cmVhbSBIZWFkZXIgZmllbGQgKHRoZSBmaXJzdCAxMiBieXRlcyBvZiB0aGUgLnh6IFN0cmVhbSkuICovCitzdGF0aWMgZW51bSB4el9yZXQgZGVjX3N0cmVhbV9oZWFkZXIoc3RydWN0IHh6X2RlYyAqcykKK3sKKwlpZiAoIW1lbWVxKHMtPnRlbXAuYnVmLCBIRUFERVJfTUFHSUMsIEhFQURFUl9NQUdJQ19TSVpFKSkKKwkJcmV0dXJuIFhaX0ZPUk1BVF9FUlJPUjsKKworCWlmICh4el9jcmMzMihzLT50ZW1wLmJ1ZiArIEhFQURFUl9NQUdJQ19TSVpFLCAyLCAwKQorCQkJIT0gZ2V0X2xlMzIocy0+dGVtcC5idWYgKyBIRUFERVJfTUFHSUNfU0laRSArIDIpKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCWlmIChzLT50ZW1wLmJ1ZltIRUFERVJfTUFHSUNfU0laRV0gIT0gMCkKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwkvKgorCSAqIE9mIGludGVncml0eSBjaGVja3MsIHdlIHN1cHBvcnQgbm9uZSAoQ2hlY2sgSUQgPSAwKSwKKwkgKiBDUkMzMiAoQ2hlY2sgSUQgPSAxKSwgYW5kIG9wdGlvbmFsbHkgQ1JDNjQgKENoZWNrIElEID0gNCkuCisJICogSG93ZXZlciwgaWYgWFpfREVDX0FOWV9DSEVDSyBpcyBkZWZpbmVkLCB3ZSB3aWxsIGFjY2VwdCBvdGhlcgorCSAqIGNoZWNrIHR5cGVzIHRvbywgYnV0IHRoZW4gdGhlIGNoZWNrIHdvbid0IGJlIHZlcmlmaWVkIGFuZAorCSAqIGEgd2FybmluZyAoWFpfVU5TVVBQT1JURURfQ0hFQ0spIHdpbGwgYmUgZ2l2ZW4uCisJICovCisJcy0+Y2hlY2tfdHlwZSA9IHMtPnRlbXAuYnVmW0hFQURFUl9NQUdJQ19TSVpFICsgMV07CisKKyNpZmRlZiBYWl9ERUNfQU5ZX0NIRUNLCisJaWYgKHMtPmNoZWNrX3R5cGUgPiBYWl9DSEVDS19NQVgpCisJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJaWYgKHMtPmNoZWNrX3R5cGUgPiBYWl9DSEVDS19DUkMzMiAmJiAhSVNfQ1JDNjQocy0+Y2hlY2tfdHlwZSkpCisJCXJldHVybiBYWl9VTlNVUFBPUlRFRF9DSEVDSzsKKyNlbHNlCisJaWYgKHMtPmNoZWNrX3R5cGUgPiBYWl9DSEVDS19DUkMzMiAmJiAhSVNfQ1JDNjQocy0+Y2hlY2tfdHlwZSkpCisJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworI2VuZGlmCisKKwlyZXR1cm4gWFpfT0s7Cit9CisKKy8qIERlY29kZSB0aGUgU3RyZWFtIEZvb3RlciBmaWVsZCAodGhlIGxhc3QgMTIgYnl0ZXMgb2YgdGhlIC54eiBTdHJlYW0pICovCitzdGF0aWMgZW51bSB4el9yZXQgZGVjX3N0cmVhbV9mb290ZXIoc3RydWN0IHh6X2RlYyAqcykKK3sKKwlpZiAoIW1lbWVxKHMtPnRlbXAuYnVmICsgMTAsIEZPT1RFUl9NQUdJQywgRk9PVEVSX01BR0lDX1NJWkUpKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCWlmICh4el9jcmMzMihzLT50ZW1wLmJ1ZiArIDQsIDYsIDApICE9IGdldF9sZTMyKHMtPnRlbXAuYnVmKSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkvKgorCSAqIFZhbGlkYXRlIEJhY2t3YXJkIFNpemUuIE5vdGUgdGhhdCB3ZSBuZXZlciBhZGRlZCB0aGUgc2l6ZSBvZiB0aGUKKwkgKiBJbmRleCBDUkMzMiBmaWVsZCB0byBzLT5pbmRleC5zaXplLCB0aHVzIHdlIHVzZSBzLT5pbmRleC5zaXplIC8gNAorCSAqIGluc3RlYWQgb2Ygcy0+aW5kZXguc2l6ZSAvIDQgLSAxLgorCSAqLworCWlmICgocy0+aW5kZXguc2l6ZSA+PiAyKSAhPSBnZXRfbGUzMihzLT50ZW1wLmJ1ZiArIDQpKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCWlmIChzLT50ZW1wLmJ1Zls4XSAhPSAwIHx8IHMtPnRlbXAuYnVmWzldICE9IHMtPmNoZWNrX3R5cGUpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJLyoKKwkgKiBVc2UgWFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFhaX09LIHRvIGJlIG1vcmUgY29udmVuaWVudAorCSAqIGZvciB0aGUgY2FsbGVyLgorCSAqLworCXJldHVybiBYWl9TVFJFQU1fRU5EOworfQorCisvKiBEZWNvZGUgdGhlIEJsb2NrIEhlYWRlciBhbmQgaW5pdGlhbGl6ZSB0aGUgZmlsdGVyIGNoYWluLiAqLworc3RhdGljIGVudW0geHpfcmV0IGRlY19ibG9ja19oZWFkZXIoc3RydWN0IHh6X2RlYyAqcykKK3sKKwllbnVtIHh6X3JldCByZXQ7CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBDUkMzMi4gV2Uga25vdyB0aGF0IHRoZSB0ZW1wIGJ1ZmZlciBpcyBhdCBsZWFzdAorCSAqIGVpZ2h0IGJ5dGVzIHNvIHRoaXMgaXMgc2FmZS4KKwkgKi8KKwlzLT50ZW1wLnNpemUgLT0gNDsKKwlpZiAoeHpfY3JjMzIocy0+dGVtcC5idWYsIHMtPnRlbXAuc2l6ZSwgMCkKKwkJCSE9IGdldF9sZTMyKHMtPnRlbXAuYnVmICsgcy0+dGVtcC5zaXplKSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwlzLT50ZW1wLnBvcyA9IDI7CisKKwkvKgorCSAqIENhdGNoIHVuc3VwcG9ydGVkIEJsb2NrIEZsYWdzLiBXZSBzdXBwb3J0IG9ubHkgb25lIG9yIHR3byBmaWx0ZXJzCisJICogaW4gdGhlIGNoYWluLCBzbyB3ZSBjYXRjaCB0aGF0IHdpdGggdGhlIHNhbWUgdGVzdC4KKwkgKi8KKyNpZmRlZiBYWl9ERUNfQkNKCisJaWYgKHMtPnRlbXAuYnVmWzFdICYgMHgzRSkKKyNlbHNlCisJaWYgKHMtPnRlbXAuYnVmWzFdICYgMHgzRikKKyNlbmRpZgorCQlyZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKworCS8qIENvbXByZXNzZWQgU2l6ZSAqLworCWlmIChzLT50ZW1wLmJ1ZlsxXSAmIDB4NDApIHsKKwkJaWYgKGRlY192bGkocywgcy0+dGVtcC5idWYsICZzLT50ZW1wLnBvcywgcy0+dGVtcC5zaXplKQorCQkJCQkhPSBYWl9TVFJFQU1fRU5EKQorCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJcy0+YmxvY2tfaGVhZGVyLmNvbXByZXNzZWQgPSBzLT52bGk7CisJfSBlbHNlIHsKKwkJcy0+YmxvY2tfaGVhZGVyLmNvbXByZXNzZWQgPSBWTElfVU5LTk9XTjsKKwl9CisKKwkvKiBVbmNvbXByZXNzZWQgU2l6ZSAqLworCWlmIChzLT50ZW1wLmJ1ZlsxXSAmIDB4ODApIHsKKwkJaWYgKGRlY192bGkocywgcy0+dGVtcC5idWYsICZzLT50ZW1wLnBvcywgcy0+dGVtcC5zaXplKQorCQkJCSE9IFhaX1NUUkVBTV9FTkQpCisJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQlzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkID0gcy0+dmxpOworCX0gZWxzZSB7CisJCXMtPmJsb2NrX2hlYWRlci51bmNvbXByZXNzZWQgPSBWTElfVU5LTk9XTjsKKwl9CisKKyNpZmRlZiBYWl9ERUNfQkNKCisJLyogSWYgdGhlcmUgYXJlIHR3byBmaWx0ZXJzLCB0aGUgZmlyc3Qgb25lIG11c3QgYmUgYSBCQ0ogZmlsdGVyLiAqLworCXMtPmJjal9hY3RpdmUgPSBzLT50ZW1wLmJ1ZlsxXSAmIDB4MDE7CisJaWYgKHMtPmJjal9hY3RpdmUpIHsKKwkJaWYgKHMtPnRlbXAuc2l6ZSAtIHMtPnRlbXAucG9zIDwgMikKKwkJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJCXJldCA9IHh6X2RlY19iY2pfcmVzZXQocy0+YmNqLCBzLT50ZW1wLmJ1ZltzLT50ZW1wLnBvcysrXSk7CisJCWlmIChyZXQgIT0gWFpfT0spCisJCQlyZXR1cm4gcmV0OworCisJCS8qCisJCSAqIFdlIGRvbid0IHN1cHBvcnQgY3VzdG9tIHN0YXJ0IG9mZnNldCwKKwkJICogc28gU2l6ZSBvZiBQcm9wZXJ0aWVzIG11c3QgYmUgemVyby4KKwkJICovCisJCWlmIChzLT50ZW1wLmJ1ZltzLT50ZW1wLnBvcysrXSAhPSAweDAwKQorCQkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisJfQorI2VuZGlmCisKKwkvKiBWYWxpZCBGaWx0ZXIgRmxhZ3MgYWx3YXlzIHRha2UgYXQgbGVhc3QgdHdvIGJ5dGVzLiAqLworCWlmIChzLT50ZW1wLnNpemUgLSBzLT50ZW1wLnBvcyA8IDIpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJLyogRmlsdGVyIElEID0gTFpNQTIgKi8KKwlpZiAocy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10gIT0gMHgyMSkKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwkvKiBTaXplIG9mIFByb3BlcnRpZXMgPSAxLWJ5dGUgRmlsdGVyIFByb3BlcnRpZXMgKi8KKwlpZiAocy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10gIT0gMHgwMSkKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwkvKiBGaWx0ZXIgUHJvcGVydGllcyBjb250YWlucyBMWk1BMiBkaWN0aW9uYXJ5IHNpemUuICovCisJaWYgKHMtPnRlbXAuc2l6ZSAtIHMtPnRlbXAucG9zIDwgMSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwlyZXQgPSB4el9kZWNfbHptYTJfcmVzZXQocy0+bHptYTIsIHMtPnRlbXAuYnVmW3MtPnRlbXAucG9zKytdKTsKKwlpZiAocmV0ICE9IFhaX09LKQorCQlyZXR1cm4gcmV0OworCisJLyogVGhlIHJlc3QgbXVzdCBiZSBIZWFkZXIgUGFkZGluZy4gKi8KKwl3aGlsZSAocy0+dGVtcC5wb3MgPCBzLT50ZW1wLnNpemUpCisJCWlmIChzLT50ZW1wLmJ1ZltzLT50ZW1wLnBvcysrXSAhPSAweDAwKQorCQkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwlzLT50ZW1wLnBvcyA9IDA7CisJcy0+YmxvY2suY29tcHJlc3NlZCA9IDA7CisJcy0+YmxvY2sudW5jb21wcmVzc2VkID0gMDsKKworCXJldHVybiBYWl9PSzsKK30KKworc3RhdGljIGVudW0geHpfcmV0IGRlY19tYWluKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJZW51bSB4el9yZXQgcmV0OworCisJLyoKKwkgKiBTdG9yZSB0aGUgc3RhcnQgcG9zaXRpb24gZm9yIHRoZSBjYXNlIHdoZW4gd2UgYXJlIGluIHRoZSBtaWRkbGUKKwkgKiBvZiB0aGUgSW5kZXggZmllbGQuCisJICovCisJcy0+aW5fc3RhcnQgPSBiLT5pbl9wb3M7CisKKwl3aGlsZSAodHJ1ZSkgeworCQlzd2l0Y2ggKHMtPnNlcXVlbmNlKSB7CisJCWNhc2UgU0VRX1NUUkVBTV9IRUFERVI6CisJCQkvKgorCQkJICogU3RyZWFtIEhlYWRlciBpcyBjb3BpZWQgdG8gcy0+dGVtcCwgYW5kIHRoZW4KKwkJCSAqIGRlY29kZWQgZnJvbSB0aGVyZS4gVGhpcyB3YXkgaWYgdGhlIGNhbGxlcgorCQkJICogZ2l2ZXMgdXMgb25seSBsaXR0bGUgaW5wdXQgYXQgYSB0aW1lLCB3ZSBjYW4KKwkJCSAqIHN0aWxsIGtlZXAgdGhlIFN0cmVhbSBIZWFkZXIgZGVjb2RpbmcgY29kZQorCQkJICogc2ltcGxlLiBTaW1pbGFyIGFwcHJvYWNoIGlzIHVzZWQgaW4gbWFueSBwbGFjZXMKKwkJCSAqIGluIHRoaXMgZmlsZS4KKwkJCSAqLworCQkJaWYgKCFmaWxsX3RlbXAocywgYikpCisJCQkJcmV0dXJuIFhaX09LOworCisJCQkvKgorCQkJICogSWYgZGVjX3N0cmVhbV9oZWFkZXIoKSByZXR1cm5zCisJCQkgKiBYWl9VTlNVUFBPUlRFRF9DSEVDSywgaXQgaXMgc3RpbGwgcG9zc2libGUKKwkJCSAqIHRvIGNvbnRpbnVlIGRlY29kaW5nIGlmIHdvcmtpbmcgaW4gbXVsdGktY2FsbAorCQkJICogbW9kZS4gVGh1cywgdXBkYXRlIHMtPnNlcXVlbmNlIGJlZm9yZSBjYWxsaW5nCisJCQkgKiBkZWNfc3RyZWFtX2hlYWRlcigpLgorCQkJICovCisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9CTE9DS19TVEFSVDsKKworCQkJcmV0ID0gZGVjX3N0cmVhbV9oZWFkZXIocyk7CisJCQlpZiAocmV0ICE9IFhaX09LKQorCQkJCXJldHVybiByZXQ7CisKKwkJY2FzZSBTRVFfQkxPQ0tfU1RBUlQ6CisJCQkvKiBXZSBuZWVkIG9uZSBieXRlIG9mIGlucHV0IHRvIGNvbnRpbnVlLiAqLworCQkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKQorCQkJCXJldHVybiBYWl9PSzsKKworCQkJLyogU2VlIGlmIHRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgSW5kZXggZmllbGQuICovCisJCQlpZiAoYi0+aW5bYi0+aW5fcG9zXSA9PSAwKSB7CisJCQkJcy0+aW5fc3RhcnQgPSBiLT5pbl9wb3MrKzsKKwkJCQlzLT5zZXF1ZW5jZSA9IFNFUV9JTkRFWDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgQmxvY2sgSGVhZGVyIGFuZAorCQkJICogcHJlcGFyZSB0byBkZWNvZGUgaXQuCisJCQkgKi8KKwkJCXMtPmJsb2NrX2hlYWRlci5zaXplCisJCQkJPSAoKHVpbnQzMl90KWItPmluW2ItPmluX3Bvc10gKyAxKSAqIDQ7CisKKwkJCXMtPnRlbXAuc2l6ZSA9IHMtPmJsb2NrX2hlYWRlci5zaXplOworCQkJcy0+dGVtcC5wb3MgPSAwOworCQkJcy0+c2VxdWVuY2UgPSBTRVFfQkxPQ0tfSEVBREVSOworCisJCWNhc2UgU0VRX0JMT0NLX0hFQURFUjoKKwkJCWlmICghZmlsbF90ZW1wKHMsIGIpKQorCQkJCXJldHVybiBYWl9PSzsKKworCQkJcmV0ID0gZGVjX2Jsb2NrX2hlYWRlcihzKTsKKwkJCWlmIChyZXQgIT0gWFpfT0spCisJCQkJcmV0dXJuIHJldDsKKworCQkJcy0+c2VxdWVuY2UgPSBTRVFfQkxPQ0tfVU5DT01QUkVTUzsKKworCQljYXNlIFNFUV9CTE9DS19VTkNPTVBSRVNTOgorCQkJcmV0ID0gZGVjX2Jsb2NrKHMsIGIpOworCQkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKQorCQkJCXJldHVybiByZXQ7CisKKwkJCXMtPnNlcXVlbmNlID0gU0VRX0JMT0NLX1BBRERJTkc7CisKKwkJY2FzZSBTRVFfQkxPQ0tfUEFERElORzoKKwkJCS8qCisJCQkgKiBTaXplIG9mIENvbXByZXNzZWQgRGF0YSArIEJsb2NrIFBhZGRpbmcKKwkJCSAqIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBmb3VyLiBXZSBkb24ndCBuZWVkCisJCQkgKiBzLT5ibG9jay5jb21wcmVzc2VkIGZvciBhbnl0aGluZyBlbHNlCisJCQkgKiBhbnltb3JlLCBzbyB3ZSB1c2UgaXQgaGVyZSB0byB0ZXN0IHRoZSBzaXplCisJCQkgKiBvZiB0aGUgQmxvY2sgUGFkZGluZyBmaWVsZC4KKwkJCSAqLworCQkJd2hpbGUgKHMtPmJsb2NrLmNvbXByZXNzZWQgJiAzKSB7CisJCQkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKQorCQkJCQlyZXR1cm4gWFpfT0s7CisKKwkJCQlpZiAoYi0+aW5bYi0+aW5fcG9zKytdICE9IDApCisJCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQkJKytzLT5ibG9jay5jb21wcmVzc2VkOworCQkJfQorCisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9CTE9DS19DSEVDSzsKKworCQljYXNlIFNFUV9CTE9DS19DSEVDSzoKKwkJCWlmIChzLT5jaGVja190eXBlID09IFhaX0NIRUNLX0NSQzMyKSB7CisJCQkJcmV0ID0gY3JjX3ZhbGlkYXRlKHMsIGIsIDMyKTsKKwkJCQlpZiAocmV0ICE9IFhaX1NUUkVBTV9FTkQpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQllbHNlIGlmIChJU19DUkM2NChzLT5jaGVja190eXBlKSkgeworCQkJCXJldCA9IGNyY192YWxpZGF0ZShzLCBiLCA2NCk7CisJCQkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorI2lmZGVmIFhaX0RFQ19BTllfQ0hFQ0sKKwkJCWVsc2UgaWYgKCFjaGVja19za2lwKHMsIGIpKSB7CisJCQkJcmV0dXJuIFhaX09LOworCQkJfQorI2VuZGlmCisKKwkJCXMtPnNlcXVlbmNlID0gU0VRX0JMT0NLX1NUQVJUOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfSU5ERVg6CisJCQlyZXQgPSBkZWNfaW5kZXgocywgYik7CisJCQlpZiAocmV0ICE9IFhaX1NUUkVBTV9FTkQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJcy0+c2VxdWVuY2UgPSBTRVFfSU5ERVhfUEFERElORzsKKworCQljYXNlIFNFUV9JTkRFWF9QQURESU5HOgorCQkJd2hpbGUgKChzLT5pbmRleC5zaXplICsgKGItPmluX3BvcyAtIHMtPmluX3N0YXJ0KSkKKwkJCQkJJiAzKSB7CisJCQkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKSB7CisJCQkJCWluZGV4X3VwZGF0ZShzLCBiKTsKKwkJCQkJcmV0dXJuIFhaX09LOworCQkJCX0KKworCQkJCWlmIChiLT5pbltiLT5pbl9wb3MrK10gIT0gMCkKKwkJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisJCQl9CisKKwkJCS8qIEZpbmlzaCB0aGUgQ1JDMzIgdmFsdWUgYW5kIEluZGV4IHNpemUuICovCisJCQlpbmRleF91cGRhdGUocywgYik7CisKKwkJCS8qIENvbXBhcmUgdGhlIGhhc2hlcyB0byB2YWxpZGF0ZSB0aGUgSW5kZXggZmllbGQuICovCisJCQlpZiAoIW1lbWVxKCZzLT5ibG9jay5oYXNoLCAmcy0+aW5kZXguaGFzaCwKKwkJCQkJc2l6ZW9mKHMtPmJsb2NrLmhhc2gpKSkKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJcy0+c2VxdWVuY2UgPSBTRVFfSU5ERVhfQ1JDMzI7CisKKwkJY2FzZSBTRVFfSU5ERVhfQ1JDMzI6CisJCQlyZXQgPSBjcmNfdmFsaWRhdGUocywgYiwgMzIpOworCQkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKQorCQkJCXJldHVybiByZXQ7CisKKwkJCXMtPnRlbXAuc2l6ZSA9IFNUUkVBTV9IRUFERVJfU0laRTsKKwkJCXMtPnNlcXVlbmNlID0gU0VRX1NUUkVBTV9GT09URVI7CisKKwkJY2FzZSBTRVFfU1RSRUFNX0ZPT1RFUjoKKwkJCWlmICghZmlsbF90ZW1wKHMsIGIpKQorCQkJCXJldHVybiBYWl9PSzsKKworCQkJcmV0dXJuIGRlY19zdHJlYW1fZm9vdGVyKHMpOworCQl9CisJfQorCisJLyogTmV2ZXIgcmVhY2hlZCAqLworfQorCisvKgorICogeHpfZGVjX3J1bigpIGlzIGEgd3JhcHBlciBmb3IgZGVjX21haW4oKSB0byBoYW5kbGUgc29tZSBzcGVjaWFsIGNhc2VzIGluCisgKiBtdWx0aS1jYWxsIGFuZCBzaW5nbGUtY2FsbCBkZWNvZGluZy4KKyAqCisgKiBJbiBtdWx0aS1jYWxsIG1vZGUsIHdlIG11c3QgcmV0dXJuIFhaX0JVRl9FUlJPUiB3aGVuIGl0IHNlZW1zIGNsZWFyIHRoYXQgd2UKKyAqIGFyZSBub3QgZ29pbmcgdG8gbWFrZSBhbnkgcHJvZ3Jlc3MgYW55bW9yZS4gVGhpcyBpcyB0byBwcmV2ZW50IHRoZSBjYWxsZXIKKyAqIGZyb20gY2FsbGluZyB1cyBpbmZpbml0ZWx5IHdoZW4gdGhlIGlucHV0IGZpbGUgaXMgdHJ1bmNhdGVkIG9yIG90aGVyd2lzZQorICogY29ycnVwdC4gU2luY2UgemxpYi1zdHlsZSBBUEkgYWxsb3dzIHRoYXQgdGhlIGNhbGxlciBmaWxscyB0aGUgaW5wdXQgYnVmZmVyCisgKiBvbmx5IHdoZW4gdGhlIGRlY29kZXIgZG9lc24ndCBwcm9kdWNlIGFueSBuZXcgb3V0cHV0LCB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwKKyAqIHRvIGF2b2lkIHJldHVybmluZyBYWl9CVUZfRVJST1IgdG9vIGVhc2lseTogWFpfQlVGX0VSUk9SIGlzIHJldHVybmVkIG9ubHkKKyAqIGFmdGVyIHRoZSBzZWNvbmQgY29uc2VjdXRpdmUgY2FsbCB0byB4el9kZWNfcnVuKCkgdGhhdCBtYWtlcyBubyBwcm9ncmVzcy4KKyAqCisgKiBJbiBzaW5nbGUtY2FsbCBtb2RlLCBpZiB3ZSBjb3VsZG4ndCBkZWNvZGUgZXZlcnl0aGluZyBhbmQgbm8gZXJyb3IKKyAqIG9jY3VycmVkLCBlaXRoZXIgdGhlIGlucHV0IGlzIHRydW5jYXRlZCBvciB0aGUgb3V0cHV0IGJ1ZmZlciBpcyB0b28gc21hbGwuCisgKiBTaW5jZSB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgaW5wdXQgYnl0ZSBuZXZlciBwcm9kdWNlcyBhbnkgb3V0cHV0LCB3ZSBrbm93CisgKiB0aGF0IGlmIGFsbCB0aGUgaW5wdXQgd2FzIGNvbnN1bWVkIGFuZCBkZWNvZGluZyB3YXNuJ3QgZmluaXNoZWQsIHRoZSBmaWxlCisgKiBtdXN0IGJlIGNvcnJ1cHQuIE90aGVyd2lzZSB0aGUgb3V0cHV0IGJ1ZmZlciBoYXMgdG8gYmUgdG9vIHNtYWxsIG9yIHRoZQorICogZmlsZSBpcyBjb3JydXB0IGluIGEgd2F5IHRoYXQgZGVjb2RpbmcgaXQgcHJvZHVjZXMgdG9vIGJpZyBvdXRwdXQuCisgKgorICogSWYgc2luZ2xlLWNhbGwgZGVjb2RpbmcgZmFpbHMsIHdlIHJlc2V0IGItPmluX3BvcyBhbmQgYi0+b3V0X3BvcyBiYWNrIHRvCisgKiB0aGVpciBvcmlnaW5hbCB2YWx1ZXMuIFRoaXMgaXMgYmVjYXVzZSB3aXRoIHNvbWUgZmlsdGVyIGNoYWlucyB0aGVyZSB3b24ndAorICogYmUgYW55IHZhbGlkIHVuY29tcHJlc3NlZCBkYXRhIGluIHRoZSBvdXRwdXQgYnVmZmVyIHVubGVzcyB0aGUgZGVjb2RpbmcKKyAqIGFjdHVhbGx5IHN1Y2NlZWRzICh0aGF0J3MgdGhlIHByaWNlIHRvIHBheSBvZiB1c2luZyB0aGUgb3V0cHV0IGJ1ZmZlciBhcworICogdGhlIHdvcmtzcGFjZSkuCisgKi8KK1haX0VYVEVSTiBlbnVtIHh6X3JldCB4el9kZWNfcnVuKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJc2l6ZV90IGluX3N0YXJ0OworCXNpemVfdCBvdXRfc3RhcnQ7CisJZW51bSB4el9yZXQgcmV0OworCisJaWYgKERFQ19JU19TSU5HTEUocy0+bW9kZSkpCisJCXh6X2RlY19yZXNldChzKTsKKworCWluX3N0YXJ0ID0gYi0+aW5fcG9zOworCW91dF9zdGFydCA9IGItPm91dF9wb3M7CisJcmV0ID0gZGVjX21haW4ocywgYik7CisKKwlpZiAoREVDX0lTX1NJTkdMRShzLT5tb2RlKSkgeworCQlpZiAocmV0ID09IFhaX09LKQorCQkJcmV0ID0gYi0+aW5fcG9zID09IGItPmluX3NpemUKKwkJCQkJPyBYWl9EQVRBX0VSUk9SIDogWFpfQlVGX0VSUk9SOworCisJCWlmIChyZXQgIT0gWFpfU1RSRUFNX0VORCkgeworCQkJYi0+aW5fcG9zID0gaW5fc3RhcnQ7CisJCQliLT5vdXRfcG9zID0gb3V0X3N0YXJ0OworCQl9CisKKwl9IGVsc2UgaWYgKHJldCA9PSBYWl9PSyAmJiBpbl9zdGFydCA9PSBiLT5pbl9wb3MKKwkJCSYmIG91dF9zdGFydCA9PSBiLT5vdXRfcG9zKSB7CisJCWlmIChzLT5hbGxvd19idWZfZXJyb3IpCisJCQlyZXQgPSBYWl9CVUZfRVJST1I7CisKKwkJcy0+YWxsb3dfYnVmX2Vycm9yID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlzLT5hbGxvd19idWZfZXJyb3IgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlYyAqeHpfZGVjX2luaXQoZW51bSB4el9tb2RlIG1vZGUsIHVpbnQzMl90IGRpY3RfbWF4KQoreworCXN0cnVjdCB4el9kZWMgKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmIChzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcy0+bW9kZSA9IG1vZGU7CisKKyNpZmRlZiBYWl9ERUNfQkNKCisJcy0+YmNqID0geHpfZGVjX2Jjal9jcmVhdGUoREVDX0lTX1NJTkdMRShtb2RlKSk7CisJaWYgKHMtPmJjaiA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2JjajsKKyNlbmRpZgorCisJcy0+bHptYTIgPSB4el9kZWNfbHptYTJfY3JlYXRlKG1vZGUsIGRpY3RfbWF4KTsKKwlpZiAocy0+bHptYTIgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9sem1hMjsKKworCXh6X2RlY19yZXNldChzKTsKKwlyZXR1cm4gczsKKworZXJyb3JfbHptYTI6CisjaWZkZWYgWFpfREVDX0JDSgorCXh6X2RlY19iY2pfZW5kKHMtPmJjaik7CitlcnJvcl9iY2o6CisjZW5kaWYKKwlrZnJlZShzKTsKKwlyZXR1cm4gTlVMTDsKK30KKworWFpfRVhURVJOIHZvaWQgeHpfZGVjX3Jlc2V0KHN0cnVjdCB4el9kZWMgKnMpCit7CisJcy0+c2VxdWVuY2UgPSBTRVFfU1RSRUFNX0hFQURFUjsKKwlzLT5hbGxvd19idWZfZXJyb3IgPSBmYWxzZTsKKwlzLT5wb3MgPSAwOworCXMtPmNyYyA9IDA7CisJbWVtemVybygmcy0+YmxvY2ssIHNpemVvZihzLT5ibG9jaykpOworCW1lbXplcm8oJnMtPmluZGV4LCBzaXplb2Yocy0+aW5kZXgpKTsKKwlzLT50ZW1wLnBvcyA9IDA7CisJcy0+dGVtcC5zaXplID0gU1RSRUFNX0hFQURFUl9TSVpFOworfQorCitYWl9FWFRFUk4gdm9pZCB4el9kZWNfZW5kKHN0cnVjdCB4el9kZWMgKnMpCit7CisJaWYgKHMgIT0gTlVMTCkgeworCQl4el9kZWNfbHptYTJfZW5kKHMtPmx6bWEyKTsKKyNpZmRlZiBYWl9ERUNfQkNKCisJCXh6X2RlY19iY2pfZW5kKHMtPmJjaik7CisjZW5kaWYKKwkJa2ZyZWUocyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbHptYS94ei1lbWJlZGRlZC94el9kZWNfc3ltcy5jIGIvbHptYS94ei1lbWJlZGRlZC94el9kZWNfc3ltcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZWIzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL3h6LWVtYmVkZGVkL3h6X2RlY19zeW1zLmMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIFhaIGRlY29kZXIgbW9kdWxlIGluZm9ybWF0aW9uCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC94ei5oPgorCitFWFBPUlRfU1lNQk9MKHh6X2RlY19pbml0KTsKK0VYUE9SVF9TWU1CT0woeHpfZGVjX3Jlc2V0KTsKK0VYUE9SVF9TWU1CT0woeHpfZGVjX3J1bik7CitFWFBPUlRfU1lNQk9MKHh6X2RlY19lbmQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlhaIGRlY29tcHJlc3NvciIpOworTU9EVUxFX1ZFUlNJT04oIjEuMCIpOworTU9EVUxFX0FVVEhPUigiTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+IGFuZCBJZ29yIFBhdmxvdiIpOworCisvKgorICogVGhpcyBjb2RlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBidXQgaW4gTGludXggaXQncyBzaW1wbGVzdCB0byBqdXN0CisgKiBzYXkgaXQncyBHUEwgYW5kIGNvbnNpZGVyIHRoZSBhdXRob3JzIGFzIHRoZSBjb3B5cmlnaHQgaG9sZGVycy4KKyAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbHptYS94ei1lbWJlZGRlZC94el9kZWNfdGVzdC5jIGIvbHptYS94ei1lbWJlZGRlZC94el9kZWNfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMjhhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL3h6LWVtYmVkZGVkL3h6X2RlY190ZXN0LmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBYWiBkZWNvZGVyIHRlc3RlcgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC94ei5oPgorCisvKiBNYXhpbXVtIHN1cHBvcnRlZCBkaWN0aW9uYXJ5IHNpemUgKi8KKyNkZWZpbmUgRElDVF9NQVggKDEgPDwgMjApCisKKy8qIERldmljZSBuYW1lIHRvIHBhc3MgdG8gcmVnaXN0ZXJfY2hyZGV2KCkuICovCisjZGVmaW5lIERFVklDRV9OQU1FICJ4el9kZWNfdGVzdCIKKworLyogRHluYW1pY2FsbHkgYWxsb2NhdGVkIGRldmljZSBtYWpvciBudW1iZXIgKi8KK3N0YXRpYyBpbnQgZGV2aWNlX21ham9yOworCisvKgorICogV2UgcmV1c2UgdGhlIHNhbWUgZGVjb2RlciBzdGF0ZSwgYW5kIHRodXMgY2FuIGRlY29kZSBvbmx5IG9uZQorICogZmlsZSBhdCBhIHRpbWUuCisgKi8KK3N0YXRpYyBib29sIGRldmljZV9pc19vcGVuOworCisvKiBYWiBkZWNvZGVyIHN0YXRlICovCitzdGF0aWMgc3RydWN0IHh6X2RlYyAqc3RhdGU7CisKKy8qCisgKiBSZXR1cm4gdmFsdWUgb2YgeHpfZGVjX3J1bigpLiBXZSBuZWVkIHRvIGF2b2lkIGNhbGxpbmcgeHpfZGVjX3J1bigpIGFmdGVyCisgKiBpdCBoYXMgcmV0dXJuZWQgWFpfU1RSRUFNX0VORCwgc28gd2UgbWFrZSB0aGlzIHN0YXRpYy4KKyAqLworc3RhdGljIGVudW0geHpfcmV0IHJldDsKKworLyoKKyAqIElucHV0IGFuZCBvdXRwdXQgYnVmZmVycy4gVGhlIGlucHV0IGJ1ZmZlciBpcyB1c2VkIGFzIGEgdGVtcG9yYXJ5IHNhZmUKKyAqIHBsYWNlIGZvciB0aGUgZGF0YSBjb21pbmcgZnJvbSB0aGUgdXNlcnNwYWNlLgorICovCitzdGF0aWMgdWludDhfdCBidWZmZXJfaW5bMTAyNF07CitzdGF0aWMgdWludDhfdCBidWZmZXJfb3V0WzEwMjRdOworCisvKgorICogU3RydWN0dXJlIHRvIHBhc3MgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyB0byB0aGUgWFogZGVjb2Rlci4KKyAqIEEgZmV3IG9mIHRoZSBmaWVsZHMgYXJlIG5ldmVyIG1vZGlmaWVkIHNvIHdlIGluaXRpYWxpemUgdGhlbSBoZXJlLgorICovCitzdGF0aWMgc3RydWN0IHh6X2J1ZiBidWZmZXJzID0geworCS5pbiA9IGJ1ZmZlcl9pbiwKKwkub3V0ID0gYnVmZmVyX291dCwKKwkub3V0X3NpemUgPSBzaXplb2YoYnVmZmVyX291dCkKK307CisKKy8qCisgKiBDUkMzMiBvZiB1bmNvbXByZXNzZWQgZGF0YS4gVGhpcyBpcyB1c2VkIHRvIGdpdmUgdGhlIHVzZXIgYSBzaW1wbGUgd2F5CisgKiB0byBjaGVjayB0aGF0IHRoZSBkZWNvZGVyIHByb2R1Y2VzIGNvcnJlY3Qgb3V0cHV0LgorICovCitzdGF0aWMgdWludDMyX3QgY3JjOworCitzdGF0aWMgaW50IHh6X2RlY190ZXN0X29wZW4oc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZmlsZSAqZikKK3sKKwlpZiAoZGV2aWNlX2lzX29wZW4pCisJCXJldHVybiAtRUJVU1k7CisKKwlkZXZpY2VfaXNfb3BlbiA9IHRydWU7CisKKwl4el9kZWNfcmVzZXQoc3RhdGUpOworCXJldCA9IFhaX09LOworCWNyYyA9IDB4RkZGRkZGRkY7CisKKwlidWZmZXJzLmluX3BvcyA9IDA7CisJYnVmZmVycy5pbl9zaXplID0gMDsKKwlidWZmZXJzLm91dF9wb3MgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBvcGVuZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHh6X2RlY190ZXN0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZmlsZSAqZikKK3sKKwlkZXZpY2VfaXNfb3BlbiA9IGZhbHNlOworCisJaWYgKHJldCA9PSBYWl9PSykKKwkJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBpbnB1dCB3YXMgdHJ1bmNhdGVkXG4iKTsKKworCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogY2xvc2VkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlY29kZSB0aGUgZGF0YSBnaXZlbiB0byB1cyBmcm9tIHRoZSB1c2Vyc3BhY2UuIENSQzMyIG9mIHRoZSB1bmNvbXByZXNzZWQKKyAqIGRhdGEgaXMgY2FsY3VsYXRlZCBhbmQgaXMgcHJpbnRlZCBhdCB0aGUgZW5kIG9mIHN1Y2Nlc3NmdWwgZGVjb2RpbmcuIFRoZQorICogdW5jb21wcmVzc2VkIGRhdGEgaXNuJ3Qgc3RvcmVkIGFueXdoZXJlIGZvciBmdXJ0aGVyIHVzZS4KKyAqCisgKiBUaGUgLnh6IGZpbGUgbXVzdCBoYXZlIGV4YWN0bHkgb25lIFN0cmVhbSBhbmQgbm8gU3RyZWFtIFBhZGRpbmcuIFRoZSBkYXRhCisgKiBhZnRlciB0aGUgZmlyc3QgU3RyZWFtIGlzIGNvbnNpZGVyZWQgdG8gYmUgZ2FyYmFnZS4KKyAqLworc3RhdGljIHNzaXplX3QgeHpfZGVjX3Rlc3Rfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJIHNpemVfdCBzaXplLCBsb2ZmX3QgKnBvcykKK3sKKwlzaXplX3QgcmVtYWluaW5nOworCisJaWYgKHJldCAhPSBYWl9PSykgeworCQlpZiAoc2l6ZSA+IDApCisJCQlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6ICV6dSBieXRlcyBvZiAiCisJCQkJCSJnYXJiYWdlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGVcbiIsCisJCQkJCXNpemUpOworCisJCXJldHVybiAtRU5PU1BDOworCX0KKworCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogZGVjb2RpbmcgJXp1IGJ5dGVzIG9mIGlucHV0XG4iLAorCQkJc2l6ZSk7CisKKwlyZW1haW5pbmcgPSBzaXplOworCXdoaWxlICgocmVtYWluaW5nID4gMCB8fCBidWZmZXJzLm91dF9wb3MgPT0gYnVmZmVycy5vdXRfc2l6ZSkKKwkJCSYmIHJldCA9PSBYWl9PSykgeworCQlpZiAoYnVmZmVycy5pbl9wb3MgPT0gYnVmZmVycy5pbl9zaXplKSB7CisJCQlidWZmZXJzLmluX3BvcyA9IDA7CisJCQlidWZmZXJzLmluX3NpemUgPSBtaW4ocmVtYWluaW5nLCBzaXplb2YoYnVmZmVyX2luKSk7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmZmVyX2luLCBidWYsIGJ1ZmZlcnMuaW5fc2l6ZSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWJ1ZiArPSBidWZmZXJzLmluX3NpemU7CisJCQlyZW1haW5pbmcgLT0gYnVmZmVycy5pbl9zaXplOworCQl9CisKKwkJYnVmZmVycy5vdXRfcG9zID0gMDsKKwkJcmV0ID0geHpfZGVjX3J1bihzdGF0ZSwgJmJ1ZmZlcnMpOworCQljcmMgPSBjcmMzMihjcmMsIGJ1ZmZlcl9vdXQsIGJ1ZmZlcnMub3V0X3Bvcyk7CisJfQorCisJc3dpdGNoIChyZXQpIHsKKwljYXNlIFhaX09LOgorCQlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6IFhaX09LXG4iKTsKKwkJcmV0dXJuIHNpemU7CisKKwljYXNlIFhaX1NUUkVBTV9FTkQ6CisJCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogWFpfU1RSRUFNX0VORCwgIgorCQkJCSJDUkMzMiA9IDB4JTA4WFxuIiwgfmNyYyk7CisJCXJldHVybiBzaXplIC0gcmVtYWluaW5nIC0gKGJ1ZmZlcnMuaW5fc2l6ZSAtIGJ1ZmZlcnMuaW5fcG9zKTsKKworCWNhc2UgWFpfTUVNTElNSVRfRVJST1I6CisJCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogWFpfTUVNTElNSVRfRVJST1JcbiIpOworCQlicmVhazsKKworCWNhc2UgWFpfRk9STUFUX0VSUk9SOgorCQlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6IFhaX0ZPUk1BVF9FUlJPUlxuIik7CisJCWJyZWFrOworCisJY2FzZSBYWl9PUFRJT05TX0VSUk9SOgorCQlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6IFhaX09QVElPTlNfRVJST1JcbiIpOworCQlicmVhazsKKworCWNhc2UgWFpfREFUQV9FUlJPUjoKKwkJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBYWl9EQVRBX0VSUk9SXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFhaX0JVRl9FUlJPUjoKKwkJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBYWl9CVUZfRVJST1JcbiIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogQnVnIGRldGVjdGVkIVxuIik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRUlPOworfQorCisvKiBBbGxvY2F0ZSB0aGUgWFogZGVjb2RlciBzdGF0ZSBhbmQgcmVnaXN0ZXIgdGhlIGNoYXJhY3RlciBkZXZpY2UuICovCitzdGF0aWMgaW50IF9faW5pdCB4el9kZWNfdGVzdF9pbml0KHZvaWQpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmlsZW9wcyA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vcGVuID0gJnh6X2RlY190ZXN0X29wZW4sCisJCS5yZWxlYXNlID0gJnh6X2RlY190ZXN0X3JlbGVhc2UsCisJCS53cml0ZSA9ICZ4el9kZWNfdGVzdF93cml0ZQorCX07CisKKwlzdGF0ZSA9IHh6X2RlY19pbml0KFhaX1BSRUFMTE9DLCBESUNUX01BWCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2aWNlX21ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsIERFVklDRV9OQU1FLCAmZmlsZW9wcyk7CisJaWYgKGRldmljZV9tYWpvciA8IDApIHsKKwkJeHpfZGVjX2VuZChzdGF0ZSk7CisJCXJldHVybiBkZXZpY2VfbWFqb3I7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBtb2R1bGUgbG9hZGVkXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6IENyZWF0ZSBhIGRldmljZSBub2RlIHdpdGggIgorCQkJIidta25vZCAiIERFVklDRV9OQU1FICIgYyAlZCAwJyBhbmQgd3JpdGUgLnh6IGZpbGVzICIKKwkJCSJ0byBpdC5cbiIsIGRldmljZV9tYWpvcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4el9kZWNfdGVzdF9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9jaHJkZXYoZGV2aWNlX21ham9yLCBERVZJQ0VfTkFNRSk7CisJeHpfZGVjX2VuZChzdGF0ZSk7CisJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBtb2R1bGUgdW5sb2FkZWRcbiIpOworfQorCittb2R1bGVfaW5pdCh4el9kZWNfdGVzdF9pbml0KTsKK21vZHVsZV9leGl0KHh6X2RlY190ZXN0X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlhaIGRlY29tcHJlc3NvciB0ZXN0ZXIiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjAiKTsKK01PRFVMRV9BVVRIT1IoIkxhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPiIpOworCisvKgorICogVGhpcyBjb2RlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBidXQgaW4gTGludXggaXQncyBzaW1wbGVzdCB0byBqdXN0CisgKiBzYXkgaXQncyBHUEwgYW5kIGNvbnNpZGVyIHRoZSBhdXRob3JzIGFzIHRoZSBjb3B5cmlnaHQgaG9sZGVycy4KKyAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbHptYS94ei1lbWJlZGRlZC94el9sem1hMi5oIGIvbHptYS94ei1lbWJlZGRlZC94el9sem1hMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MWQ2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL3h6LWVtYmVkZGVkL3h6X2x6bWEyLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBMWk1BMiBkZWZpbml0aW9ucworICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworI2lmbmRlZiBYWl9MWk1BMl9ICisjZGVmaW5lIFhaX0xaTUEyX0gKKworLyogUmFuZ2UgY29kZXIgY29uc3RhbnRzICovCisjZGVmaW5lIFJDX1NISUZUX0JJVFMgOAorI2RlZmluZSBSQ19UT1BfQklUUyAyNAorI2RlZmluZSBSQ19UT1BfVkFMVUUgKDEgPDwgUkNfVE9QX0JJVFMpCisjZGVmaW5lIFJDX0JJVF9NT0RFTF9UT1RBTF9CSVRTIDExCisjZGVmaW5lIFJDX0JJVF9NT0RFTF9UT1RBTCAoMSA8PCBSQ19CSVRfTU9ERUxfVE9UQUxfQklUUykKKyNkZWZpbmUgUkNfTU9WRV9CSVRTIDUKKworLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIHBvc2l0aW9uIHN0YXRlcy4gQSBwb3NpdGlvbiBzdGF0ZSBpcyB0aGUgbG93ZXN0IHBiCisgKiBudW1iZXIgb2YgYml0cyBvZiB0aGUgY3VycmVudCB1bmNvbXByZXNzZWQgb2Zmc2V0LiBJbiBzb21lIHBsYWNlcyB0aGVyZQorICogYXJlIGRpZmZlcmVudCBzZXRzIG9mIHByb2JhYmlsaXRpZXMgZm9yIGRpZmZlcmVudCBwb3NpdGlvbiBzdGF0ZXMuCisgKi8KKyNkZWZpbmUgUE9TX1NUQVRFU19NQVggKDEgPDwgNCkKKworLyoKKyAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIHRyYWNrIHdoaWNoIExaTUEgc3ltYm9scyBoYXZlIG9jY3VycmVkIG1vc3QgcmVjZW50bHkKKyAqIGFuZCBpbiB3aGljaCBvcmRlci4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByZWRpY3QgdGhlIG5leHQgc3ltYm9sLgorICoKKyAqIFN5bWJvbHM6CisgKiAgLSBMaXRlcmFsOiBPbmUgOC1iaXQgYnl0ZQorICogIC0gTWF0Y2g6IFJlcGVhdCBhIGNodW5rIG9mIGRhdGEgYXQgc29tZSBkaXN0YW5jZQorICogIC0gTG9uZyByZXBlYXQ6IE11bHRpLWJ5dGUgbWF0Y2ggYXQgYSByZWNlbnRseSBzZWVuIGRpc3RhbmNlCisgKiAgLSBTaG9ydCByZXBlYXQ6IE9uZS1ieXRlIHJlcGVhdCBhdCBhIHJlY2VudGx5IHNlZW4gZGlzdGFuY2UKKyAqCisgKiBUaGUgc3ltYm9sIG5hbWVzIGFyZSBpbiBmcm9tIFNUQVRFX29sZGVzdF9vbGRlcl9wcmV2aW91cy4gUkVQIG1lYW5zCisgKiBlaXRoZXIgc2hvcnQgb3IgbG9uZyByZXBlYXRlZCBtYXRjaCwgYW5kIE5PTkxJVCBtZWFucyBhbnkgbm9uLWxpdGVyYWwuCisgKi8KK2VudW0gbHptYV9zdGF0ZSB7CisJU1RBVEVfTElUX0xJVCwKKwlTVEFURV9NQVRDSF9MSVRfTElULAorCVNUQVRFX1JFUF9MSVRfTElULAorCVNUQVRFX1NIT1JUUkVQX0xJVF9MSVQsCisJU1RBVEVfTUFUQ0hfTElULAorCVNUQVRFX1JFUF9MSVQsCisJU1RBVEVfU0hPUlRSRVBfTElULAorCVNUQVRFX0xJVF9NQVRDSCwKKwlTVEFURV9MSVRfTE9OR1JFUCwKKwlTVEFURV9MSVRfU0hPUlRSRVAsCisJU1RBVEVfTk9OTElUX01BVENILAorCVNUQVRFX05PTkxJVF9SRVAKK307CisKKy8qIFRvdGFsIG51bWJlciBvZiBzdGF0ZXMgKi8KKyNkZWZpbmUgU1RBVEVTIDEyCisKKy8qIFRoZSBsb3dlc3QgNyBzdGF0ZXMgaW5kaWNhdGUgdGhhdCB0aGUgcHJldmlvdXMgc3RhdGUgd2FzIGEgbGl0ZXJhbC4gKi8KKyNkZWZpbmUgTElUX1NUQVRFUyA3CisKKy8qIEluZGljYXRlIHRoYXQgdGhlIGxhdGVzdCBzeW1ib2wgd2FzIGEgbGl0ZXJhbC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsem1hX3N0YXRlX2xpdGVyYWwoZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKwlpZiAoKnN0YXRlIDw9IFNUQVRFX1NIT1JUUkVQX0xJVF9MSVQpCisJCSpzdGF0ZSA9IFNUQVRFX0xJVF9MSVQ7CisJZWxzZSBpZiAoKnN0YXRlIDw9IFNUQVRFX0xJVF9TSE9SVFJFUCkKKwkJKnN0YXRlIC09IDM7CisJZWxzZQorCQkqc3RhdGUgLT0gNjsKK30KKworLyogSW5kaWNhdGUgdGhhdCB0aGUgbGF0ZXN0IHN5bWJvbCB3YXMgYSBtYXRjaC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsem1hX3N0YXRlX21hdGNoKGVudW0gbHptYV9zdGF0ZSAqc3RhdGUpCit7CisJKnN0YXRlID0gKnN0YXRlIDwgTElUX1NUQVRFUyA/IFNUQVRFX0xJVF9NQVRDSCA6IFNUQVRFX05PTkxJVF9NQVRDSDsKK30KKworLyogSW5kaWNhdGUgdGhhdCB0aGUgbGF0ZXN0IHN0YXRlIHdhcyBhIGxvbmcgcmVwZWF0ZWQgbWF0Y2guICovCitzdGF0aWMgaW5saW5lIHZvaWQgbHptYV9zdGF0ZV9sb25nX3JlcChlbnVtIGx6bWFfc3RhdGUgKnN0YXRlKQoreworCSpzdGF0ZSA9ICpzdGF0ZSA8IExJVF9TVEFURVMgPyBTVEFURV9MSVRfTE9OR1JFUCA6IFNUQVRFX05PTkxJVF9SRVA7Cit9CisKKy8qIEluZGljYXRlIHRoYXQgdGhlIGxhdGVzdCBzeW1ib2wgd2FzIGEgc2hvcnQgbWF0Y2guICovCitzdGF0aWMgaW5saW5lIHZvaWQgbHptYV9zdGF0ZV9zaG9ydF9yZXAoZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKwkqc3RhdGUgPSAqc3RhdGUgPCBMSVRfU1RBVEVTID8gU1RBVEVfTElUX1NIT1JUUkVQIDogU1RBVEVfTk9OTElUX1JFUDsKK30KKworLyogVGVzdCBpZiB0aGUgcHJldmlvdXMgc3ltYm9sIHdhcyBhIGxpdGVyYWwuICovCitzdGF0aWMgaW5saW5lIGJvb2wgbHptYV9zdGF0ZV9pc19saXRlcmFsKGVudW0gbHptYV9zdGF0ZSBzdGF0ZSkKK3sKKwlyZXR1cm4gc3RhdGUgPCBMSVRfU1RBVEVTOworfQorCisvKiBFYWNoIGxpdGVyYWwgY29kZXIgaXMgZGl2aWRlZCBpbiB0aHJlZSBzZWN0aW9uczoKKyAqICAgLSAweDAwMS0weDBGRjogV2l0aG91dCBtYXRjaCBieXRlCisgKiAgIC0gMHgxMDEtMHgxRkY6IFdpdGggbWF0Y2ggYnl0ZTsgbWF0Y2ggYml0IGlzIDAKKyAqICAgLSAweDIwMS0weDJGRjogV2l0aCBtYXRjaCBieXRlOyBtYXRjaCBiaXQgaXMgMQorICoKKyAqIE1hdGNoIGJ5dGUgaXMgdXNlZCB3aGVuIHRoZSBwcmV2aW91cyBMWk1BIHN5bWJvbCB3YXMgc29tZXRoaW5nIGVsc2UgdGhhbgorICogYSBsaXRlcmFsICh0aGF0IGlzLCBpdCB3YXMgc29tZSBraW5kIG9mIG1hdGNoKS4KKyAqLworI2RlZmluZSBMSVRFUkFMX0NPREVSX1NJWkUgMHgzMDAKKworLyogTWF4aW11bSBudW1iZXIgb2YgbGl0ZXJhbCBjb2RlcnMgKi8KKyNkZWZpbmUgTElURVJBTF9DT0RFUlNfTUFYICgxIDw8IDQpCisKKy8qIE1pbmltdW0gbGVuZ3RoIG9mIGEgbWF0Y2ggaXMgdHdvIGJ5dGVzLiAqLworI2RlZmluZSBNQVRDSF9MRU5fTUlOIDIKKworLyogTWF0Y2ggbGVuZ3RoIGlzIGVuY29kZWQgd2l0aCA0LCA1LCBvciAxMCBiaXRzLgorICoKKyAqIExlbmd0aCAgIEJpdHMKKyAqICAyLTkgICAgICA0ID0gQ2hvaWNlPTAgKyAzIGJpdHMKKyAqIDEwLTE3ICAgICA1ID0gQ2hvaWNlPTEgKyBDaG9pY2UyPTAgKyAzIGJpdHMKKyAqIDE4LTI3MyAgIDEwID0gQ2hvaWNlPTEgKyBDaG9pY2UyPTEgKyA4IGJpdHMKKyAqLworI2RlZmluZSBMRU5fTE9XX0JJVFMgMworI2RlZmluZSBMRU5fTE9XX1NZTUJPTFMgKDEgPDwgTEVOX0xPV19CSVRTKQorI2RlZmluZSBMRU5fTUlEX0JJVFMgMworI2RlZmluZSBMRU5fTUlEX1NZTUJPTFMgKDEgPDwgTEVOX01JRF9CSVRTKQorI2RlZmluZSBMRU5fSElHSF9CSVRTIDgKKyNkZWZpbmUgTEVOX0hJR0hfU1lNQk9MUyAoMSA8PCBMRU5fSElHSF9CSVRTKQorI2RlZmluZSBMRU5fU1lNQk9MUyAoTEVOX0xPV19TWU1CT0xTICsgTEVOX01JRF9TWU1CT0xTICsgTEVOX0hJR0hfU1lNQk9MUykKKworLyoKKyAqIE1heGltdW0gbGVuZ3RoIG9mIGEgbWF0Y2ggaXMgMjczIHdoaWNoIGlzIGEgcmVzdWx0IG9mIHRoZSBlbmNvZGluZworICogZGVzY3JpYmVkIGFib3ZlLgorICovCisjZGVmaW5lIE1BVENIX0xFTl9NQVggKE1BVENIX0xFTl9NSU4gKyBMRU5fU1lNQk9MUyAtIDEpCisKKy8qCisgKiBEaWZmZXJlbnQgc2V0cyBvZiBwcm9iYWJpbGl0aWVzIGFyZSB1c2VkIGZvciBtYXRjaCBkaXN0YW5jZXMgdGhhdCBoYXZlCisgKiB2ZXJ5IHNob3J0IG1hdGNoIGxlbmd0aDogTGVuZ3RocyBvZiAyLCAzLCBhbmQgNCBieXRlcyBoYXZlIGEgc2VwYXJhdGUKKyAqIHNldCBvZiBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIGxlbmd0aC4gVGhlIG1hdGNoZXMgd2l0aCBsb25nZXIgbGVuZ3RoCisgKiB1c2UgYSBzaGFyZWQgc2V0IG9mIHByb2JhYmlsaXRpZXMuCisgKi8KKyNkZWZpbmUgRElTVF9TVEFURVMgNAorCisvKgorICogR2V0IHRoZSBpbmRleCBvZiB0aGUgYXBwcm9wcmlhdGUgcHJvYmFiaWxpdHkgYXJyYXkgZm9yIGRlY29kaW5nCisgKiB0aGUgZGlzdGFuY2Ugc2xvdC4KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBsem1hX2dldF9kaXN0X3N0YXRlKHVpbnQzMl90IGxlbikKK3sKKwlyZXR1cm4gbGVuIDwgRElTVF9TVEFURVMgKyBNQVRDSF9MRU5fTUlOCisJCQk/IGxlbiAtIE1BVENIX0xFTl9NSU4gOiBESVNUX1NUQVRFUyAtIDE7Cit9CisKKy8qCisgKiBUaGUgaGlnaGVzdCB0d28gYml0cyBvZiBhIDMyLWJpdCBtYXRjaCBkaXN0YW5jZSBhcmUgZW5jb2RlZCB1c2luZyBzaXggYml0cy4KKyAqIFRoaXMgc2l4LWJpdCB2YWx1ZSBpcyBjYWxsZWQgYSBkaXN0YW5jZSBzbG90LiBUaGlzIHdheSBlbmNvZGluZyBhIDMyLWJpdAorICogdmFsdWUgdGFrZXMgNi0zNiBiaXRzLCBsYXJnZXIgdmFsdWVzIHRha2luZyBtb3JlIGJpdHMuCisgKi8KKyNkZWZpbmUgRElTVF9TTE9UX0JJVFMgNgorI2RlZmluZSBESVNUX1NMT1RTICgxIDw8IERJU1RfU0xPVF9CSVRTKQorCisvKiBNYXRjaCBkaXN0YW5jZXMgdXAgdG8gMTI3IGFyZSBmdWxseSBlbmNvZGVkIHVzaW5nIHByb2JhYmlsaXRpZXMuIFNpbmNlCisgKiB0aGUgaGlnaGVzdCB0d28gYml0cyAoZGlzdGFuY2Ugc2xvdCkgYXJlIGFsd2F5cyBlbmNvZGVkIHVzaW5nIHNpeCBiaXRzLAorICogdGhlIGRpc3RhbmNlcyAwLTMgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBiaXRzIHRvIGVuY29kZSwgc2luY2UgdGhlCisgKiBkaXN0YW5jZSBzbG90IGl0c2VsZiBpcyB0aGUgc2FtZSBhcyB0aGUgYWN0dWFsIGRpc3RhbmNlLiBESVNUX01PREVMX1NUQVJUCisgKiBpbmRpY2F0ZXMgdGhlIGZpcnN0IGRpc3RhbmNlIHNsb3Qgd2hlcmUgYXQgbGVhc3Qgb25lIGFkZGl0aW9uYWwgYml0IGlzCisgKiBuZWVkZWQuCisgKi8KKyNkZWZpbmUgRElTVF9NT0RFTF9TVEFSVCA0CisKKy8qCisgKiBNYXRjaCBkaXN0YW5jZXMgZ3JlYXRlciB0aGFuIDEyNyBhcmUgZW5jb2RlZCBpbiB0aHJlZSBwaWVjZXM6CisgKiAgIC0gZGlzdGFuY2Ugc2xvdDogdGhlIGhpZ2hlc3QgdHdvIGJpdHMKKyAqICAgLSBkaXJlY3QgYml0czogMi0yNiBiaXRzIGJlbG93IHRoZSBoaWdoZXN0IHR3byBiaXRzCisgKiAgIC0gYWxpZ25tZW50IGJpdHM6IGZvdXIgbG93ZXN0IGJpdHMKKyAqCisgKiBEaXJlY3QgYml0cyBkb24ndCB1c2UgYW55IHByb2JhYmlsaXRpZXMuCisgKgorICogVGhlIGRpc3RhbmNlIHNsb3QgdmFsdWUgb2YgMTQgaXMgZm9yIGRpc3RhbmNlcyAxMjgtMTkxLgorICovCisjZGVmaW5lIERJU1RfTU9ERUxfRU5EIDE0CisKKy8qIERpc3RhbmNlIHNsb3RzIHRoYXQgaW5kaWNhdGUgYSBkaXN0YW5jZSA8PSAxMjcuICovCisjZGVmaW5lIEZVTExfRElTVEFOQ0VTX0JJVFMgKERJU1RfTU9ERUxfRU5EIC8gMikKKyNkZWZpbmUgRlVMTF9ESVNUQU5DRVMgKDEgPDwgRlVMTF9ESVNUQU5DRVNfQklUUykKKworLyoKKyAqIEZvciBtYXRjaCBkaXN0YW5jZXMgZ3JlYXRlciB0aGFuIDEyNywgb25seSB0aGUgaGlnaGVzdCB0d28gYml0cyBhbmQgdGhlCisgKiBsb3dlc3QgZm91ciBiaXRzIChhbGlnbm1lbnQpIGlzIGVuY29kZWQgdXNpbmcgcHJvYmFiaWxpdGllcy4KKyAqLworI2RlZmluZSBBTElHTl9CSVRTIDQKKyNkZWZpbmUgQUxJR05fU0laRSAoMSA8PCBBTElHTl9CSVRTKQorI2RlZmluZSBBTElHTl9NQVNLIChBTElHTl9TSVpFIC0gMSkKKworLyogVG90YWwgbnVtYmVyIG9mIGFsbCBwcm9iYWJpbGl0eSB2YXJpYWJsZXMgKi8KKyNkZWZpbmUgUFJPQlNfVE9UQUwgKDE4NDYgKyBMSVRFUkFMX0NPREVSU19NQVggKiBMSVRFUkFMX0NPREVSX1NJWkUpCisKKy8qCisgKiBMWk1BIHJlbWVtYmVycyB0aGUgZm91ciBtb3N0IHJlY2VudCBtYXRjaCBkaXN0YW5jZXMuIFJldXNpbmcgdGhlc2UKKyAqIGRpc3RhbmNlcyB0ZW5kcyB0byB0YWtlIGxlc3Mgc3BhY2UgdGhhbiByZS1lbmNvZGluZyB0aGUgYWN0dWFsCisgKiBkaXN0YW5jZSB2YWx1ZS4KKyAqLworI2RlZmluZSBSRVBTIDQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sem1hL3h6LWVtYmVkZGVkL3h6X3ByaXZhdGUuaCBiL2x6bWEveHotZW1iZWRkZWQveHpfcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmI5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9sem1hL3h6LWVtYmVkZGVkL3h6X3ByaXZhdGUuaApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIFByaXZhdGUgaW5jbHVkZXMgYW5kIGRlZmluaXRpb25zCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfUFJJVkFURV9ICisjZGVmaW5lIFhaX1BSSVZBVEVfSAorCisjaWZkZWYgX19LRVJORUxfXworIwlpbmNsdWRlIDxsaW51eC94ei5oPgorIwlpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyMJaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCS8qIFhaX1BSRUJPT1QgbWF5IGJlIGRlZmluZWQgb25seSB2aWEgZGVjb21wcmVzc191bnh6LmMuICovCisjCWlmbmRlZiBYWl9QUkVCT09UCisjCQlpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjCQlpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjCQlpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyMJCWlmZGVmIENPTkZJR19YWl9ERUNfWDg2CisjCQkJZGVmaW5lIFhaX0RFQ19YODYKKyMJCWVuZGlmCisjCQlpZmRlZiBDT05GSUdfWFpfREVDX1BPV0VSUEMKKyMJCQlkZWZpbmUgWFpfREVDX1BPV0VSUEMKKyMJCWVuZGlmCisjCQlpZmRlZiBDT05GSUdfWFpfREVDX0lBNjQKKyMJCQlkZWZpbmUgWFpfREVDX0lBNjQKKyMJCWVuZGlmCisjCQlpZmRlZiBDT05GSUdfWFpfREVDX0FSTQorIwkJCWRlZmluZSBYWl9ERUNfQVJNCisjCQllbmRpZgorIwkJaWZkZWYgQ09ORklHX1haX0RFQ19BUk1USFVNQgorIwkJCWRlZmluZSBYWl9ERUNfQVJNVEhVTUIKKyMJCWVuZGlmCisjCQlpZmRlZiBDT05GSUdfWFpfREVDX1NQQVJDCisjCQkJZGVmaW5lIFhaX0RFQ19TUEFSQworIwkJZW5kaWYKKyMJCWRlZmluZSBtZW1lcShhLCBiLCBzaXplKSAobWVtY21wKGEsIGIsIHNpemUpID09IDApCisjCQlkZWZpbmUgbWVtemVybyhidWYsIHNpemUpIG1lbXNldChidWYsIDAsIHNpemUpCisjCWVuZGlmCisjCWRlZmluZSBnZXRfbGUzMihwKSBsZTMyX3RvX2NwdXAoKGNvbnN0IHVpbnQzMl90ICopKHApKQorI2Vsc2UKKwkvKgorCSAqIEZvciB1c2Vyc3BhY2UgYnVpbGRzLCB1c2UgYSBzZXBhcmF0ZSBoZWFkZXIgdG8gZGVmaW5lIHRoZSByZXF1aXJlZAorCSAqIG1hY3JvcyBhbmQgZnVuY3Rpb25zLiBUaGlzIG1ha2VzIGl0IGVhc2llciB0byBhZGFwdCB0aGUgY29kZSBpbnRvCisJICogZGlmZmVyZW50IGVudmlyb25tZW50cyBhbmQgYXZvaWRzIGNsdXR0ZXIgaW4gdGhlIExpbnV4IGtlcm5lbCB0cmVlLgorCSAqLworIwlpbmNsdWRlICJ4el9jb25maWcuaCIKKyNlbmRpZgorCisvKiBJZiBubyBzcGVjaWZpYyBkZWNvZGluZyBtb2RlIGlzIHJlcXVlc3RlZCwgZW5hYmxlIHN1cHBvcnQgZm9yIGFsbCBtb2Rlcy4gKi8KKyNpZiAhZGVmaW5lZChYWl9ERUNfU0lOR0xFKSAmJiAhZGVmaW5lZChYWl9ERUNfUFJFQUxMT0MpIFwKKwkJJiYgIWRlZmluZWQoWFpfREVDX0RZTkFMTE9DKQorIwlkZWZpbmUgWFpfREVDX1NJTkdMRQorIwlkZWZpbmUgWFpfREVDX1BSRUFMTE9DCisjCWRlZmluZSBYWl9ERUNfRFlOQUxMT0MKKyNlbmRpZgorCisvKgorICogVGhlIERFQ19JU19mb28obW9kZSkgbWFjcm9zIGFyZSB1c2VkIGluICJpZiIgc3RhdGVtZW50cy4gSWYgb25seSBzb21lCisgKiBvZiB0aGUgc3VwcG9ydGVkIG1vZGVzIGFyZSBlbmFibGVkLCB0aGVzZSBtYWNyb3Mgd2lsbCBldmFsdWF0ZSB0byB0cnVlIG9yCisgKiBmYWxzZSBhdCBjb21waWxlIHRpbWUgYW5kIHRodXMgYWxsb3cgdGhlIGNvbXBpbGVyIHRvIG9taXQgdW5uZWVkZWQgY29kZS4KKyAqLworI2lmZGVmIFhaX0RFQ19TSU5HTEUKKyMJZGVmaW5lIERFQ19JU19TSU5HTEUobW9kZSkgKChtb2RlKSA9PSBYWl9TSU5HTEUpCisjZWxzZQorIwlkZWZpbmUgREVDX0lTX1NJTkdMRShtb2RlKSAoZmFsc2UpCisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19QUkVBTExPQworIwlkZWZpbmUgREVDX0lTX1BSRUFMTE9DKG1vZGUpICgobW9kZSkgPT0gWFpfUFJFQUxMT0MpCisjZWxzZQorIwlkZWZpbmUgREVDX0lTX1BSRUFMTE9DKG1vZGUpIChmYWxzZSkKKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX0RZTkFMTE9DCisjCWRlZmluZSBERUNfSVNfRFlOQUxMT0MobW9kZSkgKChtb2RlKSA9PSBYWl9EWU5BTExPQykKKyNlbHNlCisjCWRlZmluZSBERUNfSVNfRFlOQUxMT0MobW9kZSkgKGZhbHNlKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChYWl9ERUNfU0lOR0xFKQorIwlkZWZpbmUgREVDX0lTX01VTFRJKG1vZGUpICh0cnVlKQorI2VsaWYgZGVmaW5lZChYWl9ERUNfUFJFQUxMT0MpIHx8IGRlZmluZWQoWFpfREVDX0RZTkFMTE9DKQorIwlkZWZpbmUgREVDX0lTX01VTFRJKG1vZGUpICgobW9kZSkgIT0gWFpfU0lOR0xFKQorI2Vsc2UKKyMJZGVmaW5lIERFQ19JU19NVUxUSShtb2RlKSAoZmFsc2UpCisjZW5kaWYKKworLyoKKyAqIElmIGFueSBvZiB0aGUgQkNKIGZpbHRlciBkZWNvZGVycyBhcmUgd2FudGVkLCBkZWZpbmUgWFpfREVDX0JDSi4KKyAqIFhaX0RFQ19CQ0ogaXMgdXNlZCB0byBlbmFibGUgZ2VuZXJpYyBzdXBwb3J0IGZvciBCQ0ogZGVjb2RlcnMuCisgKi8KKyNpZm5kZWYgWFpfREVDX0JDSgorIwlpZiBkZWZpbmVkKFhaX0RFQ19YODYpIHx8IGRlZmluZWQoWFpfREVDX1BPV0VSUEMpIFwKKwkJCXx8IGRlZmluZWQoWFpfREVDX0lBNjQpIHx8IGRlZmluZWQoWFpfREVDX0FSTSkgXAorCQkJfHwgZGVmaW5lZChYWl9ERUNfQVJNKSB8fCBkZWZpbmVkKFhaX0RFQ19BUk1USFVNQikgXAorCQkJfHwgZGVmaW5lZChYWl9ERUNfU1BBUkMpCisjCQlkZWZpbmUgWFpfREVDX0JDSgorIwllbmRpZgorI2VuZGlmCisKKy8qCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIExaTUEyIGRlY29kZXIuIHh6X2RlY19sem1hMl9yZXNldCgpIG11c3QgYmUgdXNlZAorICogYmVmb3JlIGNhbGxpbmcgeHpfZGVjX2x6bWEyX3J1bigpLgorICovCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlY19sem1hMiAqeHpfZGVjX2x6bWEyX2NyZWF0ZShlbnVtIHh6X21vZGUgbW9kZSwKKwkJCQkJCSAgIHVpbnQzMl90IGRpY3RfbWF4KTsKKworLyoKKyAqIERlY29kZSB0aGUgTFpNQTIgcHJvcGVydGllcyAob25lIGJ5dGUpIGFuZCByZXNldCB0aGUgZGVjb2Rlci4gUmV0dXJuCisgKiBYWl9PSyBvbiBzdWNjZXNzLCBYWl9NRU1MSU1JVF9FUlJPUiBpZiB0aGUgcHJlYWxsb2NhdGVkIGRpY3Rpb25hcnkgaXMgbm90CisgKiBiaWcgZW5vdWdoLCBhbmQgWFpfT1BUSU9OU19FUlJPUiBpZiBwcm9wcyBpbmRpY2F0ZXMgc29tZXRoaW5nIHRoYXQgdGhpcworICogZGVjb2RlciBkb2Vzbid0IHN1cHBvcnQuCisgKi8KK1haX0VYVEVSTiBlbnVtIHh6X3JldCB4el9kZWNfbHptYTJfcmVzZXQoc3RydWN0IHh6X2RlY19sem1hMiAqcywKKwkJCQkJIHVpbnQ4X3QgcHJvcHMpOworCisvKiBEZWNvZGUgcmF3IExaTUEyIHN0cmVhbSBmcm9tIGItPmluIHRvIGItPm91dC4gKi8KK1haX0VYVEVSTiBlbnVtIHh6X3JldCB4el9kZWNfbHptYTJfcnVuKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsCisJCQkJICAgICAgIHN0cnVjdCB4el9idWYgKmIpOworCisvKiBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgTFpNQTIgZGVjb2Rlci4gKi8KK1haX0VYVEVSTiB2b2lkIHh6X2RlY19sem1hMl9lbmQoc3RydWN0IHh6X2RlY19sem1hMiAqcyk7CisKKyNpZmRlZiBYWl9ERUNfQkNKCisvKgorICogQWxsb2NhdGUgbWVtb3J5IGZvciBCQ0ogZGVjb2RlcnMuIHh6X2RlY19iY2pfcmVzZXQoKSBtdXN0IGJlIHVzZWQgYmVmb3JlCisgKiBjYWxsaW5nIHh6X2RlY19iY2pfcnVuKCkuCisgKi8KK1haX0VYVEVSTiBzdHJ1Y3QgeHpfZGVjX2JjaiAqeHpfZGVjX2Jjal9jcmVhdGUoYm9vbCBzaW5nbGVfY2FsbCk7CisKKy8qCisgKiBEZWNvZGUgdGhlIEZpbHRlciBJRCBvZiBhIEJDSiBmaWx0ZXIuIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndAorICogc3VwcG9ydCBjdXN0b20gc3RhcnQgb2Zmc2V0cywgc28gbm8gZGVjb2Rpbmcgb2YgRmlsdGVyIFByb3BlcnRpZXMKKyAqIGlzIG5lZWRlZC4gUmV0dXJucyBYWl9PSyBpZiB0aGUgZ2l2ZW4gRmlsdGVyIElEIGlzIHN1cHBvcnRlZC4KKyAqIE90aGVyd2lzZSBYWl9PUFRJT05TX0VSUk9SIGlzIHJldHVybmVkLgorICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgeHpfZGVjX2Jjal9yZXNldChzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCBpZCk7CisKKy8qCisgKiBEZWNvZGUgcmF3IEJDSiArIExaTUEyIHN0cmVhbS4gVGhpcyBtdXN0IGJlIHVzZWQgb25seSBpZiB0aGVyZSBhY3R1YWxseSBpcworICogYSBCQ0ogZmlsdGVyIGluIHRoZSBjaGFpbi4gSWYgdGhlIGNoYWluIGhhcyBvbmx5IExaTUEyLCB4el9kZWNfbHptYTJfcnVuKCkKKyAqIG11c3QgYmUgY2FsbGVkIGRpcmVjdGx5LgorICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgeHpfZGVjX2Jjal9ydW4oc3RydWN0IHh6X2RlY19iY2ogKnMsCisJCQkJICAgICBzdHJ1Y3QgeHpfZGVjX2x6bWEyICpsem1hMiwKKwkJCQkgICAgIHN0cnVjdCB4el9idWYgKmIpOworCisvKiBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgQkNKIGZpbHRlcnMuICovCisjZGVmaW5lIHh6X2RlY19iY2pfZW5kKHMpIGtmcmVlKHMpCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9sem1hL3h6LWVtYmVkZGVkL3h6X3N0cmVhbS5oIGIvbHptYS94ei1lbWJlZGRlZC94el9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmNiNWE3Ci0tLSAvZGV2L251bGwKKysrIGIvbHptYS94ei1lbWJlZGRlZC94el9zdHJlYW0uaApAQCAtMCwwICsxLDYyIEBACisvKgorICogRGVmaW5pdGlvbnMgZm9yIGhhbmRsaW5nIHRoZSAueHogZmlsZSBmb3JtYXQKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworI2lmbmRlZiBYWl9TVFJFQU1fSAorI2RlZmluZSBYWl9TVFJFQU1fSAorCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhWFpfSU5URVJOQUxfQ1JDMzIKKyMJaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyMJdW5kZWYgY3JjMzIKKyMJZGVmaW5lIHh6X2NyYzMyKGJ1Ziwgc2l6ZSwgY3JjKSBcCisJCSh+Y3JjMzJfbGUofih1aW50MzJfdCkoY3JjKSwgYnVmLCBzaXplKSkKKyNlbmRpZgorCisvKgorICogU2VlIHRoZSAueHogZmlsZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBhdAorICogaHR0cDovL3R1a2Fhbmkub3JnL3h6L3h6LWZpbGUtZm9ybWF0LnR4dAorICogdG8gdW5kZXJzdGFuZCB0aGUgY29udGFpbmVyIGZvcm1hdC4KKyAqLworCisjZGVmaW5lIFNUUkVBTV9IRUFERVJfU0laRSAxMgorCisjZGVmaW5lIEhFQURFUl9NQUdJQyAiXDM3NTd6WFoiCisjZGVmaW5lIEhFQURFUl9NQUdJQ19TSVpFIDYKKworI2RlZmluZSBGT09URVJfTUFHSUMgIllaIgorI2RlZmluZSBGT09URVJfTUFHSUNfU0laRSAyCisKKy8qCisgKiBWYXJpYWJsZS1sZW5ndGggaW50ZWdlciBjYW4gaG9sZCBhIDYzLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIG9yIGEgc3BlY2lhbAorICogdmFsdWUgaW5kaWNhdGluZyB0aGF0IHRoZSB2YWx1ZSBpcyB1bmtub3duLgorICoKKyAqIEV4cGVyaW1lbnRhbDogdmxpX3R5cGUgY2FuIGJlIGRlZmluZWQgdG8gdWludDMyX3QgdG8gc2F2ZSBhIGZldyBieXRlcworICogaW4gY29kZSBzaXplIChubyBlZmZlY3Qgb24gc3BlZWQpLiBEb2luZyBzbyBsaW1pdHMgdGhlIHVuY29tcHJlc3NlZCBhbmQKKyAqIGNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgZmlsZSB0byBsZXNzIHRoYW4gMjU2IE1pQiBhbmQgbWF5IGFsc28gd2Vha2VuCisgKiBlcnJvciBkZXRlY3Rpb24gc2xpZ2h0bHkuCisgKi8KK3R5cGVkZWYgdWludDY0X3QgdmxpX3R5cGU7CisKKyNkZWZpbmUgVkxJX01BWCAoKHZsaV90eXBlKS0xIC8gMikKKyNkZWZpbmUgVkxJX1VOS05PV04gKCh2bGlfdHlwZSktMSkKKworLyogTWF4aW11bSBlbmNvZGVkIHNpemUgb2YgYSBWTEkgKi8KKyNkZWZpbmUgVkxJX0JZVEVTX01BWCAoc2l6ZW9mKHZsaV90eXBlKSAqIDggLyA3KQorCisvKiBJbnRlZ3JpdHkgQ2hlY2sgdHlwZXMgKi8KK2VudW0geHpfY2hlY2sgeworCVhaX0NIRUNLX05PTkUgPSAwLAorCVhaX0NIRUNLX0NSQzMyID0gMSwKKwlYWl9DSEVDS19DUkM2NCA9IDQsCisJWFpfQ0hFQ0tfU0hBMjU2ID0gMTAKK307CisKKy8qIE1heGltdW0gcG9zc2libGUgQ2hlY2sgSUQgKi8KKyNkZWZpbmUgWFpfQ0hFQ0tfTUFYIDE1CisKKyNlbmRpZgo=