From octave-sources-request at bevo dot che dot wisc dot edu Thu Jan 27 01:07:12 2000 Subject: Revised HDF5 patch for Octave (added struct i/o support) From: "Steven G. Johnson" To: octave-sources at bevo dot che dot wisc dot edu Date: Thu, 27 Jan 2000 02:06:05 -0500 (EST) This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime at docserver dot cac dot washington dot edu for more info. --1041390082-413262111-948956765=:27833 Content-Type: TEXT/PLAIN; charset=US-ASCII Dear Octave Users and Developers, Attached is a revised version of my HDF5 patch for Octave (produced by cvs diff -u against the latest sources). This version adds support for saving and loading Octave structures. I believe that my patch is currently the only way to save and load structures (and lists) in Octave. See also my previous posts for more information. Technical note: I save both structures and lists as HDF5 "groups", which support arbitrary nesting of arbitrary datatypes, tagged with names just like Octave structure members. Lists are distinguished by an additional OCTAVE_LIST attribute attached to the group. This means that groups in foreign HDF5 datasets are imported as structures, not lists; this seemed sensible since structures preserve more information (the element names). For anyone using my previous patch, note that this patch is therefore incompatible with my previous patches (which read all groups as lists). Let me know if you have any questions or comments. Cordially, Steven G. Johnson --1041390082-413262111-948956765=:27833 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="diff.out" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="diff.out" SW5kZXg6IGFjY29uZmlnLmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJD UyBmaWxlOiAvY3ZzL29jdGF2ZS9hY2NvbmZpZy5oLHYNCnJldHJpZXZpbmcg cmV2aXNpb24gMS40Mw0KZGlmZiAtdSAtcjEuNDMgYWNjb25maWcuaA0KLS0t IGFjY29uZmlnLmgJMTk5OC8xMS8xOSAyMjoxNDowNwkxLjQzDQorKysgYWNj b25maWcuaAkyMDAwLzAxLzI3IDA2OjUyOjM3DQpAQCAtNDMsNiArNDMsOSBA QA0KIC8qIERlZmluZSBpZiB5b3VyIHN5c3RlbSdzIHN0cnVjdCBncm91cCBo YXMgYSBncl9wYXNzd2QgZmllbGQuICovDQogI3VuZGVmIEhBVkVfR1JfUEFT U1dEDQogDQorLyogRGVmaW5lIGlmIHlvdSBoYXZlIChhbmQgYXJlIHVzaW5n KSB0aGUgSERGNSBsaWJyYXJ5IGFuZCBoZWFkZXJzLiAqLw0KKyN1bmRlZiBI QVZFX0hERjUNCisNCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgaXNpbmYoKS4g Ki8NCiAjdW5kZWYgSEFWRV9JU0lORg0KIA0KSW5kZXg6IGNvbmZpZ3VyZS5p bg0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9jdnMvb2N0 YXZlL2NvbmZpZ3VyZS5pbix2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMzIy DQpkaWZmIC11IC1yMS4zMjIgY29uZmlndXJlLmluDQotLS0gY29uZmlndXJl LmluCTIwMDAvMDEvMjUgMjE6MjM6MDcJMS4zMjINCisrKyBjb25maWd1cmUu aW4JMjAwMC8wMS8yNyAwNjo1MjozNw0KQEAgLTMxMyw2ICszMTMsMTggQEAN CiAgIDs7DQogZXNhYw0KIA0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQ0KKyMgQ2hlY2sgZm9yIEhERjUgbGlicmFyeQ0KK0FDX0FSR19XSVRIKGhk ZjUsIFsgIC0td2l0aG91dC1oZGY1ICAgICAgICAgIGRvbid0IHVzZSBIREY1 IG91dHB1dF0sIG9rPSR3aXRodmFsLCBvaz15ZXMpDQoraWYgdGVzdCAiJG9r IiA9ICJ5ZXMiOyB0aGVuDQorCUFDX0NIRUNLX0xJQih6LCBkZWZsYXRlKQ0K KwlBQ19DSEVDS19MSUIoaGRmNSwgSDVQY3JlYXRlLCBbDQorCQlBQ19DSEVD S19IRUFERVJTKGhkZjUuaCwgW0xJQlM9Ii1saGRmNSAkTElCUyINCisJCQkg ICAgICAgICAgICAgICAgICBBQ19ERUZJTkUoSEFWRV9IREY1KV0pXSkNCitm aQ0KKw0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KICMjIyBX ZSBuZWVkIHRoZXNlIGJlZm9yZSB0cnlpbmcgdG8gZmluZCBsaWJmMmMuDQog DQogT0NUQVZFX1BST0dfQVINCkluZGV4OiBzcmMvbG9hZC1zYXZlLmNjDQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL2N2cy9vY3RhdmUv c3JjL2xvYWQtc2F2ZS5jYyx2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTA5 DQpkaWZmIC11IC1yMS4xMDkgbG9hZC1zYXZlLmNjDQotLS0gbG9hZC1zYXZl LmNjCTIwMDAvMDEvMjEgMDc6NDg6MjgJMS4xMDkNCisrKyBsb2FkLXNhdmUu Y2MJMjAwMC8wMS8yNyAwNjo1Mjo0OQ0KQEAgLTM1LDYgKzM1LDEwIEBADQog I2luY2x1ZGUgPGZzdHJlYW0uaD4NCiAjaW5jbHVkZSA8c3Ryc3RyZWFtLmg+ DQogDQorI2lmZGVmIEhBVkVfSERGNQ0KKyMgIGluY2x1ZGUgPGhkZjUuaD4N CisjZW5kaWYNCisNCiAjaW5jbHVkZSAiYnl0ZS1zd2FwLmgiDQogI2luY2x1 ZGUgImRhdGEtY29udi5oIg0KICNpbmNsdWRlICJmaWxlLW9wcy5oIg0KQEAg LTUwLDYgKzU0LDcgQEANCiAjaW5jbHVkZSAiZ3JpcGVzLmgiDQogI2luY2x1 ZGUgImxvYWQtc2F2ZS5oIg0KICNpbmNsdWRlICJvY3Qtb2JqLmgiDQorI2lu Y2x1ZGUgIm9jdC1tYXAuaCINCiAjaW5jbHVkZSAicGFnZXIuaCINCiAjaW5j bHVkZSAicHQtZXhwLmgiDQogI2luY2x1ZGUgInN5bXRhYi5oIg0KQEAgLTYy LDggKzY3LDggQEANCiAvLyBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRz IHRvIHVzZSB3aGVuIHdyaXRpbmcgYXNjaWkgZGF0YS4NCiBzdGF0aWMgYm9v bCBWY3Jhc2hfZHVtcHNfb2N0YXZlX2NvcmU7DQogDQotLy8gVGhlIGRlZmF1 bHQgb3V0cHV0IGZvcm1hdC4gIE1heSBiZSBvbmUgb2YgImJpbmFyeSIsICJ0 ZXh0Iiwgb3INCi0vLyAibWF0LWJpbmFyeSIuDQorLy8gVGhlIGRlZmF1bHQg b3V0cHV0IGZvcm1hdC4gIE1heSBiZSBvbmUgb2YgImJpbmFyeSIsICJ0ZXh0 IiwNCisvLyAibWF0LWJpbmFyeSIsIG9yICJoZGY1Ii4NCiBzdGF0aWMgc3Ry aW5nIFZkZWZhdWx0X3NhdmVfZm9ybWF0Ow0KIA0KIC8vIFRoZSBudW1iZXIg b2YgZGVjaW1hbCBkaWdpdHMgdG8gdXNlIHdoZW4gd3JpdGluZyBhc2NpaSBk YXRhLg0KQEAgLTgxLDYgKzg2LDkgQEANCiAgICAgTFNfQklOQVJZLA0KICAg ICBMU19NQVRfQVNDSUksDQogICAgIExTX01BVF9CSU5BUlksDQorI2lmZGVm IEhBVkVfSERGNQ0KKyAgICBMU19IREY1LA0KKyNlbmRpZiAvKiBIQVZFX0hE RjUgKi8NCiAgICAgTFNfVU5LTk9XTiwNCiAgIH07DQogDQpAQCAtMTA1LDYg KzExMywxOCBAQA0KICAgcmV0dXJuIHZhbGlkX2lkZW50aWZpZXIgKHMuY19z dHIgKCkpOw0KIH0NCiANCisjaWZkZWYgSEFWRV9IREY1ICAvLyB0aGlzIGlz IG9ubHkgdXNlZCBmb3IgSERGNSBpbXBvcnQNCisvLyB0cnkgdG8gY29udmVy dCBzIGludG8gYSB2YWxpZCBpZGVudGlmaWVyLCByZXBsYWNpbmcgaW52YWxp ZCBjaGFycyB3aXRoICJfIjoNCitzdGF0aWMgdm9pZCBtYWtlX3ZhbGlkX2lk ZW50aWZpZXIgKGNoYXIgKnMpDQorew0KKyAgaWYgKHMpIHsNCisgICAgZm9y ICg7ICpzOyArK3MpDQorICAgICAgaWYgKCEgKGlzYWxudW0gKCpzKSB8fCAq cyA9PSAnXycpKQ0KKwkqcyA9ICdfJzsNCisgIH0NCit9DQorI2VuZGlmIC8q IEhBVkVfSERGNSAqLw0KKw0KIC8vIFhYWCBGSVhNRSBYWFggLS0gc2hvdWxk bid0IHRoaXMgYmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2Ygb3RoZXINCiAv LyBmdW5jdGlvbnMgdGhhdCBhcmUgYWxyZWFkeSBhdmFpbGFibGU/DQogDQpA QCAtMzMwLDcgKzM1MCw3IEBADQogCSAgY2hhciAqcHRyID0gcmV0dmFsICsg bGVuIC0gMTsNCiAJICB3aGlsZSAoKnB0ciA9PSAnICcgfHwgKnB0ciA9PSAn XHQnKQ0KIAkgICAgcHRyLS07DQotCSAgKihwdHIrMSkgPSAnXDAnOw0KKwkg ICogKHB0cisxKSA9ICdcMCc7DQogCX0NCiAgICAgfQ0KIA0KQEAgLTY0Miw3 ICs2NjIsNyBAQA0KIAl9DQogICAgICAgZWxzZSBpZiAoc3RybmNtcCAocHRy LCAicmFuZ2UiLCA1KSA9PSAwKQ0KIAl7DQotCSAgLy8gIyBiYXNlLCBsaW1p dCwgcmFuZ2UgY29tbWVudCBhZGRlZCBieSBzYXZlKCkuDQorCSAgLy8gIyBi YXNlLCBsaW1pdCwgcmFuZ2UgY29tbWVudCBhZGRlZCBieSBzYXZlICgpLg0K IA0KIAkgIHNraXBfY29tbWVudHMgKGlzKTsNCiAJICBSYW5nZSB0bXA7DQpA QCAtOTQ2LDYgKzk2Niw2MzkgQEANCiAgIHJldHVybiBuYW1lOw0KIH0NCiAN CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisvLyBIREY1IGlu cHV0L291dHB1dA0KKw0KKyNpZmRlZiBIQVZFX0hERjUNCisNCisvLyBEZWZp bmUgdGhpcyB0byAxIGlmL3doZW4gSERGNSBzdXBwb3J0cyBhdXRvbWF0aWMg Y29udmVyc2lvbiBiZXR3ZWVuDQorLy8gaW50ZWdlciBhbmQgZmxvYXRpbmct cG9pbnQgYmluYXJ5IGRhdGE6DQorI2RlZmluZSBIQVZFX0hERjVfSU5UMkZM T0FUX0NPTlZFUlNJT05TIDANCisNCisvLyBmaXJzdCwgd2UgbmVlZCB0byBk ZWZpbmUgb3VyIG93biBkdW1teSBzdHJlYW0gc3ViY2xhc3MsIHNpbmNlDQor Ly8gSERGNSBuZWVkcyB0byBkbyBpdHMgb3duIGZpbGUgaS9vDQorDQorLy8g aGRmNV9mc3RyZWFtYmFzZSBpcyB1c2VkIGZvciBib3RoIGlucHV0IGFuZCBv dXRwdXQgc3RyZWFtcywgbW9kZWxlZA0KKy8vIG9uIHRoZSBmc3RyZWFtYmFz ZSBjbGFzcyBpbiA8ZnN0cmVhbS5oPg0KK2NsYXNzIGhkZjVfZnN0cmVhbWJh c2UgOiB2aXJ0dWFsIHB1YmxpYyBpb3Mgew0KK3B1YmxpYzoNCisgIGhpZF90 IGZpbGVfaWQ7ICAvLyBIREY1IHVzZXMgYW4gImlkIiB0byByZWZlciB0byBh biBvcGVuIGZpbGUNCisgIGludCBjdXJyZW50X2l0ZW07ICAvLyBrZWVwIHRy YWNrIG9mIGN1cnJlbnQgaXRlbSBpbmRleCBpbiB0aGUgZmlsZQ0KKw0KKyAg aGRmNV9mc3RyZWFtYmFzZSAoKSB7IGZpbGVfaWQgPSAtMTsgfQ0KKw0KKyAg aGRmNV9mc3RyZWFtYmFzZSAoY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUs IGludCBwcm90PTApDQorICAgIHsNCisgICAgICBpZiAobW9kZSA9PSBpb3M6 OmluKQ0KKwlmaWxlX2lkID0gSDVGb3BlbiAobmFtZSwgSDVGX0FDQ19SRE9O TFksIEg1UF9ERUZBVUxUKTsNCisgICAgICBlbHNlIGlmIChtb2RlID09IGlv czo6b3V0KQ0KKwlmaWxlX2lkID0gSDVGY3JlYXRlIChuYW1lLCBINUZfQUND X1RSVU5DLCBINVBfREVGQVVMVCwgSDVQX0RFRkFVTFQpOw0KKyAgICAgIGlm IChmaWxlX2lkIDwgMCkNCisJc2V0IChpb3M6OmJhZGJpdCk7DQorICAgICAg Y3VycmVudF9pdGVtID0gMDsNCisgICAgfQ0KKw0KKyAgdm9pZCBjbG9zZSAo KSB7IA0KKyAgICBpZiAoZmlsZV9pZCA+PSAwKSB7IA0KKyAgICAgIGlmIChI NUZjbG9zZSAoZmlsZV9pZCkgPCAwKQ0KKwlzZXQgKGlvczo6YmFkYml0KTsN CisgICAgICBmaWxlX2lkID0gLTE7DQorICAgIH0gDQorICB9DQorDQorICB2 b2lkIG9wZW4gKGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlLCBpbnQgcHJv dD0wKQ0KKyAgICB7DQorICAgICAgY2xlYXIgKCk7DQorICAgICAgaWYgKG1v ZGUgPT0gaW9zOjppbikNCisJZmlsZV9pZCA9IEg1Rm9wZW4gKG5hbWUsIEg1 Rl9BQ0NfUkRPTkxZLCBINVBfREVGQVVMVCk7DQorICAgICAgZWxzZSBpZiAo bW9kZSA9PSBpb3M6Om91dCkNCisJZmlsZV9pZCA9IEg1RmNyZWF0ZSAobmFt ZSwgSDVGX0FDQ19UUlVOQywgSDVQX0RFRkFVTFQsIEg1UF9ERUZBVUxUKTsN CisgICAgICBpZiAoZmlsZV9pZCA8IDApDQorCXNldCAoaW9zOjpiYWRiaXQp Ow0KKyAgICAgIGN1cnJlbnRfaXRlbSA9IDA7DQorICAgIH0NCit9Ow0KKw0K Ky8vIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcywgc3ViY2xhc3NpbmcgaXN0 cmVhbSBhbmQgb3N0cmVhbQ0KKy8vIHNvIHRoYXQgd2UgY2FuIHBhc3MgdGhl bSBmb3Igc3RyZWFtIHBhcmFtZXRlcnMgaW4gdGhlIGZ1bmN0aW9ucyBiZWxv dy4NCitjbGFzcyBoZGY1X2lmc3RyZWFtIDogcHVibGljIGhkZjVfZnN0cmVh bWJhc2UsIHB1YmxpYyBpc3RyZWFtIHsNCitwdWJsaWM6DQorICBoZGY1X2lm c3RyZWFtICgpIDogaGRmNV9mc3RyZWFtYmFzZSAoKSB7IH0NCisgIGhkZjVf aWZzdHJlYW0gKGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlPWlvczo6aW4s IGludCBwcm90PTApDQorICAgIDogaGRmNV9mc3RyZWFtYmFzZSAobmFtZSwg bW9kZSwgcHJvdCkgeyB9DQorICB2b2lkIG9wZW4gKGNvbnN0IGNoYXIgKm5h bWUsIGludCBtb2RlPWlvczo6aW4sIGludCBwcm90PTApDQorICAgIHsgaGRm NV9mc3RyZWFtYmFzZTo6b3BlbiAobmFtZSwgbW9kZSwgcHJvdCk7IH0NCit9 Ow0KKw0KK2NsYXNzIGhkZjVfb2ZzdHJlYW0gOiBwdWJsaWMgaGRmNV9mc3Ry ZWFtYmFzZSwgcHVibGljIG9zdHJlYW0gew0KK3B1YmxpYzoNCisgIGhkZjVf b2ZzdHJlYW0gKCkgOiBoZGY1X2ZzdHJlYW1iYXNlICgpIHsgfQ0KKyAgaGRm NV9vZnN0cmVhbSAoY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGU9aW9zOjpv dXQsIGludCBwcm90PTApDQorICAgIDogaGRmNV9mc3RyZWFtYmFzZSAobmFt ZSwgbW9kZSwgcHJvdCkgeyB9DQorICB2b2lkIG9wZW4gKGNvbnN0IGNoYXIg Km5hbWUsIGludCBtb2RlPWlvczo6b3V0LCBpbnQgcHJvdD0wKQ0KKyAgICB7 IGhkZjVfZnN0cmVhbWJhc2U6Om9wZW4gKG5hbWUsIG1vZGUsIHByb3QpOyB9 DQorfTsNCisNCisvKiBnaXZlbiB0d28gY29tcG91bmQgdHlwZXMgdDEgYW5k IHQyLCBkZXRlcm1pbmUgd2hldGhlciB0aGV5IA0KKyAgIGFyZSBjb21wYXRp YmxlIGZvciByZWFkaW5nL3dyaXRpbmcuICBUaGlzIGZ1bmN0aW9uIG9ubHkN CisgICB3b3JrcyBmb3Igbm9uLW5lc3RlZCB0eXBlcyBjb21wb3NlZCBvZiBz aW1wbGUgZWxlbWVudHMgKGludHMsIGZsb2F0cy4uLiksDQorICAgd2hpY2gg aXMgYWxsIHdlIG5lZWQgaXQgZm9yICovDQorYm9vbCBoZGY1X3R5cGVzX2Nv bXBhdGlibGUgKGhpZF90IHQxLCBoaWRfdCB0MikNCit7DQorICBpbnQgbjsN CisgIGlmICggKG4gPSBINVRnZXRfbm1lbWJlcnMgKHQxKSkgIT0gSDVUZ2V0 X25tZW1iZXJzICh0MikpDQorICAgIHJldHVybiAwOw0KKyAgZm9yIChpbnQg aSA9IDA7IGkgPCBuOyArK2kpIHsNCisgICAgaGlkX3QgbXQxID0gSDVUZ2V0 X21lbWJlcl90eXBlICh0MSwgaSk7DQorICAgIGhpZF90IG10MiA9IEg1VGdl dF9tZW1iZXJfdHlwZSAodDIsIGkpOw0KKyAgICBpZiAoSDVUZ2V0X2NsYXNz IChtdDEpICE9IEg1VGdldF9jbGFzcyAobXQyKSkNCisgICAgICByZXR1cm4g MDsNCisgICAgSDVUY2xvc2UgKG10Mik7DQorICAgIEg1VGNsb3NlIChtdDEp Ow0KKyAgfQ0KKyAgcmV0dXJuIDE7DQorfQ0KKw0KKy8qIEltcG9ydCBhIG11 bHRpZGltZW5zaW9uYWwgKHJhbmsgPj0gMykgZGF0YXNldCB3aG9zZSBpZCBp cyBkYXRhX2lkLCBpbnRvIHRjLg0KKyAgIFRoaXMgd29ya3MgYnkgY2FsbGlu ZyBpdHNlbGYgcmVjdXJzaXZlbHksIGJ1aWxkaW5nIHVwIGxpc3RzIG9mIGxp c3RzDQorICAgb2YgbGlzdHMgLi4uIG9mIDJkIG1hdHJpY2VzLiAgcmFuayBh bmQgZGltcyBhcmUgdGhlIHJhbmsgYW5kIGRpbWVuc2lvbnMNCisgICBvZiB0 aGUgZGF0YXNldC4gIHR5cGVfaWQgaXMgdGhlIGRhdGF0eXBlIHRvIHJlYWQg aW50by4gIElmIGl0IGlzDQorICAgSDVUX05BVElWRV9ET1VCTEUsIHdlIGFy ZSByZWFkaW5nIGEgcmVhbCBtYXRyaXguICBPdGhlcndpc2UsIHR5cGVfaWQN CisgICBpcyBhc3N1bWVkIHRvIGJlIGEgY29tcGxleCB0eXBlIGZvciByZWFk aW5nIGEgY29tcGxleCBtYXRyaXguDQorDQorICAgVXBvbiBlbnRyeSwgd2Ug c2hvdWxkIGhhdmUgY3VyZGltID0gcmFuayAtIDEsIHN0YXJ0ID0gYW4gYXJy YXkNCisgICBvZiBsZW5ndGggcmFuayA9IGFsbCB6ZXJvcywgYW5kIGNvdW50 ID0gYW4gYXJyYXkgb2YgbGVuZ3RoIHJhbmsgPQ0KKyAgIGFsbCBvbmVzIGV4 Y2VwdCBmb3IgdGhlIGZpcnN0IHR3byBkaW1lbnNpb25zIHdoaWNoIGVxdWFs IHRoZSBjb3JyZXNwb25kaW5nDQorICAgZW50cmllcyBpbiBkaW1zW10uIA0K Kw0KKyAgIE5vdGUgdGhhdCB3ZSBwcm9jZXNzIHRoZSBkaW1lbnNpb25zIGlu IHJldmVyc2Ugb3JkZXIsIHJlZmxlY3RpbmcNCisgICB0aGUgZmFjdCB0aGF0 IE9jdGF2ZSBpcyB1c2VzIGNvbHVtbi1tYWpvciAoRm9ydHJhbi1vcmRlcikg ZGF0YSB3aGlsZQ0KKyAgIEhERjUgaXMgcm93LW1ham9yLiAgVGhpcyBtZWFu cyB0aGF0IHRoZSBIREY1IGZpbGUgaXMgcmVhZA0KKyAgIG5vbi1jb250aWd1 b3VzbHksIGJ1dCBvbiB0aGUgb3RoZXIgaGFuZCBtZWFucyB0aGF0IGZvciBh IDNkIGFycmF5DQorICAgd2UgZ2V0IGEgbGlzdCBvZiB4eS1wbGFuZSBzbGlj ZXMsIHdoaWNoIHNlZW1zIG5pY2UuICBXZSBjb3VsZCBjaGFuZ2UNCisgICB0 aGlzIGJlaGF2aW9yIHdpdGhvdXQgbXVjaCB0cm91YmxlOyB3aGF0IGlzIHRo ZSBiZXN0IHRoaW5nIHRvIGRvPw0KKw0KKyAgIFJldHVybnMgYSBwb3NpdGl2 ZSB2YWx1ZSB1cG9uIHN1Y2Nlc3MuICovDQorc3RhdGljIGhlcnJfdCBoZGY1 X2ltcG9ydF9tdWx0aWRpbSAoaGlkX3QgZGF0YV9pZCwgaGlkX3Qgc3BhY2Vf aWQsIA0KKwkJCQkgICBoc2l6ZV90IHJhbmssIGNvbnN0IGhzaXplX3QgKmRp bXMsDQorCQkJCSAgIGhzaXplX3QgY3VyZGltLA0KKwkJCQkgICBoc3NpemVf dCAqc3RhcnQsIGNvbnN0IGhzaXplX3QgKmNvdW50LA0KKwkJCQkgICBoaWRf dCB0eXBlX2lkLCBvY3RhdmVfdmFsdWUgJnRjKQ0KK3sNCisgIGhlcnJfdCBy ZXR2YWwgPSAxOw0KKw0KKyAgaWYgKHJhbmsgPCAzIHx8IGN1cmRpbSA8IDEg fHwgY3VyZGltID49IHJhbmspDQorICAgIHJldHVybiAtMTsNCisNCisgIGlm IChjdXJkaW0gPT0gMSkgeyAgLy8gaW1wb3J0IDJkIGRhdGFzZXQgZm9yIDFz dCAyIGRpbXMgZGlyZWN0bHkgYXMgYSBtYXRyaXgNCisgICAgaW50IG5yLCBu YzsgIC8vIHJvd3MgYW5kIGNvbHVtbnMNCisgICAgbmMgPSBkaW1zWzBdOyAg Ly8gb2N0YXZlIHVzZXMgY29sdW1uLW1ham9yICYgSERGNSB1c2VzIHJvdy1t YWpvcg0KKyAgICBuciA9IGRpbXNbMV07DQorDQorICAgIGhpZF90IG1lbV9z cGFjZV9pZCA9IEg1U2NyZWF0ZV9zaW1wbGUgKDIsIGRpbXMsIE5VTEwpOw0K KyAgICBpZiAobWVtX3NwYWNlX2lkIDwgMCkNCisgICAgICByZXR1cm4gLTE7 DQorICAgIGlmIChINVNzZWxlY3RfYWxsIChtZW1fc3BhY2VfaWQpIDwgMCkN CisgICAgICByZXR1cm4gLTE7DQorICAgIA0KKyAgICBpZiAoSDVTc2VsZWN0 X2h5cGVyc2xhYiAoc3BhY2VfaWQsIEg1U19TRUxFQ1RfU0VULA0KKwkJCSAg ICBzdGFydCwgTlVMTCwgY291bnQsIE5VTEwpIDwgMCkgew0KKyAgICAgIEg1 U2Nsb3NlIChtZW1fc3BhY2VfaWQpOw0KKyAgICAgIHJldHVybiAtMTsNCisg ICAgfQ0KKyAgICANCisgICAgaWYgKHR5cGVfaWQgPT0gSDVUX05BVElWRV9E T1VCTEUpIHsNCisgICAgICAvLyByZWFsIG1hdHJpeA0KKyAgICAgIE1hdHJp eCBtIChuciwgbmMpOw0KKyAgICAgIGRvdWJsZSAqcmUgPSBtLmZvcnRyYW5f dmVjICgpOw0KKyAgICAgIGlmIChINURyZWFkIChkYXRhX2lkLCB0eXBlX2lk LCBtZW1fc3BhY2VfaWQsIHNwYWNlX2lkLCBINVBfREVGQVVMVCwNCisJCSAg KHZvaWQgKikgcmUpIDwgMCkNCisJcmV0dmFsID0gLTE7ICAvLyBlcnJvcg0K KyAgICAgIGVsc2UNCisJdGMgPSBtOw0KKyAgICB9DQorICAgIGVsc2UgeyAg Ly8gYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nIGNvbXBsZXggbnVtYmVycw0K KyAgICAgIC8vIGNvbXBsZXggbWF0cml4DQorICAgICAgQ29tcGxleE1hdHJp eCBtIChuciwgbmMpOw0KKyAgICAgIENvbXBsZXggKnJlaW0gPSBtLmZvcnRy YW5fdmVjICgpOw0KKyAgICAgIGlmIChINURyZWFkIChkYXRhX2lkLCB0eXBl X2lkLCBtZW1fc3BhY2VfaWQsIHNwYWNlX2lkLCBINVBfREVGQVVMVCwNCisJ CSAgKHZvaWQgKikgWF9DQVNUIChkb3VibGUgKiwgcmVpbSkpIDwgMCkNCisJ cmV0dmFsID0gLTE7ICAvLyBlcnJvcg0KKyAgICAgIGVsc2UNCisJdGMgPSBt Ow0KKyAgICB9DQorICAgIA0KKyAgICBINVNjbG9zZSAobWVtX3NwYWNlX2lk KTsNCisgIH0NCisgIGVsc2Ugew0KKyAgICBvY3RhdmVfdmFsdWVfbGlzdCBs c3Q7DQorDQorICAgIGZvciAoaHNpemVfdCBpID0gMDsgaSA8IGRpbXNbY3Vy ZGltXTsgKytpKSB7DQorICAgICAgb2N0YXZlX3ZhbHVlIHNsaWNlOw0KKyAg ICAgIHN0YXJ0W2N1cmRpbV0gPSBpOw0KKyAgICAgIHJldHZhbCA9IGhkZjVf aW1wb3J0X211bHRpZGltIChkYXRhX2lkLCBzcGFjZV9pZCwgcmFuaywgZGlt cywNCisJCQkJICAgIGN1cmRpbS0xLCBzdGFydCwgY291bnQsIHR5cGVfaWQs IHNsaWNlKTsNCisgICAgICBpZiAocmV0dmFsIDwgMCkNCisJYnJlYWs7DQor ICAgICAgbHN0LmFwcGVuZCAoc2xpY2UpOw0KKyAgICB9DQorDQorICAgIGlm IChyZXR2YWwgPiAwKQ0KKyAgICAgIHRjID0gbHN0Ow0KKyAgfQ0KKw0KKyAg cmV0dXJuIHJldHZhbDsNCit9DQorDQorLyogUmV0dXJucyB0cnVlIGlmIGxv Y19pZCBoYXMgdGhlIGF0dHJpYnV0ZSBuYW1lZCBhdHRyX25hbWUsIGFuZCBm YWxzZQ0KKyAgIG90aGVyd2lzZS4gKi8NCitib29sIGhkZjVfY2hlY2tfYXR0 cihoaWRfdCBsb2NfaWQsIGNvbnN0IGNoYXIgKmF0dHJfbmFtZSkNCit7DQor ICAgICBib29sIHJldHZhbCA9IDA7DQorDQorICAgICAvKiB3ZSBoYXZlIHRv IHB1bGwgc29tZSBzaGVuYW5pZ2FucyBoZXJlIHRvIG1ha2Ugc3VyZQ0KKwlI REY1IGRvZXNuJ3QgcHJpbnQgb3V0IGFsbCBzb3J0cyBvZiBlcnJvciBtZXNz YWdlcyBpZiB3ZQ0KKwljYWxsIEg1QW9wZW4gZm9yIGEgbm9uLWV4aXN0aW5n IGF0dHJpYnV0ZSAqLw0KKyAgICAgSDVFX2F1dG9fdCBlcnJfZnVuYzsNCisg ICAgIHZvaWQgKmVycl9mdW5jX2RhdGE7DQorDQorICAgICAvKiB0dXJuIG9m ZiBlcnJvciByZXBvcnRpbmcgdGVtcG9yYXJpbHksIGJ1dCBzYXZlIHRoZSBl cnJvcg0KKwlyZXBvcnRpbmcgZnVuY3Rpb246ICovDQorICAgICBINUVnZXRf YXV0bygmZXJyX2Z1bmMsICZlcnJfZnVuY19kYXRhKTsNCisgICAgIEg1RXNl dF9hdXRvKE5VTEwsIE5VTEwpOw0KKw0KKyAgICAgaGlkX3QgYXR0cl9pZCA9 IEg1QW9wZW5fbmFtZShsb2NfaWQsIGF0dHJfbmFtZSk7DQorICAgICBpZiAo YXR0cl9pZCA+PSAwKSB7ICAvKiBzdWNjZXNzZnVsICovDQorCSAgcmV0dmFs ID0gMTsNCisJICBINUFjbG9zZShhdHRyX2lkKTsNCisgICAgIH0NCisNCisg ICAgIC8qIHJlc3RvcmUgZXJyb3IgcmVwb3J0aW5nOiAqLw0KKyAgICAgSDVF c2V0X2F1dG8oZXJyX2Z1bmMsIGVycl9mdW5jX2RhdGEpOw0KKw0KKyAgICAg cmV0dXJuIHJldHZhbDsNCit9DQorDQorLyogQ2FsbGJhY2sgZGF0YSBzdHJ1 Y3R1cmUgZm9yIHBhc3NpbmcgZGF0YSB0byBoZGY1X3JlYWRfbmV4dF9kYXRh LCBiZWxvdy4gKi8NCit0eXBlZGVmIHN0cnVjdCB7DQorICAvLyB0aGUgZm9s bG93aW5nIGZpZWxkcyBhcmUgc2V0IGJ5IGhkZjVfcmVhZF9kYXRhIG9uIHN1 Y2Nlc3NmdWwgcmV0dXJuOg0KKyAgY2hhciAqbmFtZTsgIC8vIHRoZSBuYW1l IG9mIHRoZSB2YXJpYWJsZQ0KKyAgYm9vbCBnbG9iYWw7IC8vIHdoZXRoZXIg aXQgaXMgZ2xvYmFsDQorICBvY3RhdmVfdmFsdWUgdGM7ICAvLyB0aGUgdmFs dWUgb2YgdGhlIHZhcmlhYmxlLCBpbiBPY3RhdmUgZm9ybQ0KKyAgY2hhciAq ZG9jOyAgIC8vIGEgZG9jdW1lbnRhdGlvbiBzdHJpbmcgKE5VTEwgaWYgbm9u ZSkNCisgIC8vIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBpbnB1dCB0byBo ZGY1X3JlYWRfZGF0YToNCisgIGhpZF90IGNvbXBsZXhfdHlwZSwgcmFuZ2Vf dHlwZTsgIC8vIEhERjUgcmVwJ3Mgb2YgY29tcGxleCBhbmQgcmFuZ2UgdHlw ZQ0KKyAgYm9vbCBpbXBvcnQ7IC8vIHdoZXRoZXIgdG8gdHJ5IGV4dHJhIGhh cmQgdG8gaW1wb3J0ICJmb3JlaWduIiBkYXRhDQorfSBoZGY1X2NhbGxiYWNr X2RhdGE7DQorDQorLyogVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBi ZSBwYXNzZWQgdG8gSDVHaXRlcmF0ZSwgd2hpY2ggY2FsbHMgaXQNCisgICBv biBlYWNoIGRhdGEgaXRlbSBpbiBhbiBIREY1IGZpbGUuICBGb3IgdGhlIGl0 ZW0gd2hvc2UgbmFtZSBpcyBOQU1FIGluDQorICAgdGhlIGdyb3VwIEdST1VQ X0lELCB0aGlzIGZ1bmN0aW9uIHNldHMgZHYtPnRjIHRvIGFuIE9jdGF2ZSBy ZXByZXNlbnRhdGlvbg0KKyAgIG9mIHRoYXQgaXRlbS4gIChkdiBtdXN0IGJl IGEgcG9pbnRlciB0byBoZGY1X2NhbGxiYWNrX2RhdGEuKSAgKEl0IGFsc28N CisgICBzZXRzIHRoZSBvdGhlciBmaWVsZHMgb2YgZHYpLg0KKw0KKyAgIEl0 IHJldHVybnMgMSBvbiBzdWNjZXNzIChpbiB3aGljaCBjYXNlIEg1R2l0ZXJh dGUgc3RvcHMgYW5kIHJldHVybnMpLA0KKyAgIC0xIG9uIGVycm9yLCBhbmQg MCB0byB0ZWxsIEg1R2l0ZXJhdGUgdG8gY29udGludWUgb24gdG8gdGhlIG5l eHQgaXRlbQ0KKyAgIChlLmcuIGlmIE5BTUUgd2FzIGEgZGF0YSB0eXBlIHdl IGRvbid0IHJlY29nbml6ZSkuICovDQorc3RhdGljIGhlcnJfdCBoZGY1X3Jl YWRfbmV4dF9kYXRhIChoaWRfdCBncm91cF9pZCwgY29uc3QgY2hhciAqbmFt ZSwgdm9pZCAqZHYpDQorew0KKyAgaGRmNV9jYWxsYmFja19kYXRhICpkID0g KGhkZjVfY2FsbGJhY2tfZGF0YSAqKSBkdjsNCisgIEg1R19zdGF0X3QgaW5m bzsNCisgIGhlcnJfdCByZXR2YWwgPSAwOw0KKyAgYm9vbCBpZGVudF92YWxp ZCA9IHZhbGlkX2lkZW50aWZpZXIgKG5hbWUpOw0KKyAgY2hhciAqdm5hbWU7 DQorDQorICB2bmFtZSA9IG5ldyBjaGFyW3N0cmxlbiAobmFtZSkgKyAxXTsN CisgIHN0cmNweSAodm5hbWUsIG5hbWUpOw0KKyAgaWYgKCFpZGVudF92YWxp ZCAmJiBkLT5pbXBvcnQpIHsNCisgICAgLy8gZml4IHRoZSBpZGVudGlmaWVy LCByZXBsYWNpbmcgaW52YWxpZCBjaGFycyB3aXRoIHVuZGVyc2NvcmVzDQor ICAgIG1ha2VfdmFsaWRfaWRlbnRpZmllciAodm5hbWUpOw0KKyAgICAvLyBj aGVjayBhZ2FpbiAoaW4gY2FzZSB2bmFtZSB3YXMgbnVsbCwgZW1wdHksIG9y IHNvbWUgc3VjaCB0aGluZyk6DQorICAgIGlkZW50X3ZhbGlkID0gdmFsaWRf aWRlbnRpZmllciAodm5hbWUpOyANCisgIH0NCisNCisgIEg1R2dldF9vYmpp bmZvIChncm91cF9pZCwgbmFtZSwgMSwgJmluZm8pOw0KKyAgaWYgKGluZm8u dHlwZSA9PSBINUdfREFUQVNFVCAmJiBpZGVudF92YWxpZCkgew0KKyAgICBy ZXR2YWwgPSAxOw0KKw0KKyAgICBoaWRfdCBkYXRhX2lkID0gSDVEb3BlbiAo Z3JvdXBfaWQsIG5hbWUpOw0KKyAgICBpZiAoZGF0YV9pZCA8IDApIHsNCisg ICAgICByZXR2YWwgPSBkYXRhX2lkOw0KKyAgICAgIGdvdG8gZG9uZTsNCisg ICAgfQ0KKw0KKyAgICBoaWRfdCB0eXBlX2lkID0gSDVEZ2V0X3R5cGUgKGRh dGFfaWQpOw0KKyAgICBoaWRfdCB0eXBlX2NsYXNzX2lkID0gSDVUZ2V0X2Ns YXNzICh0eXBlX2lkKTsNCisjaWYgSEFWRV9IREY1X0lOVDJGTE9BVF9DT05W RVJTSU9OUw0KKyAgICBpZiAodHlwZV9jbGFzc19pZCA9PSBINVRfSU5URUdF UiB8fCB0eXBlX2NsYXNzX2lkID09IEg1VF9GTE9BVCkgew0KKyNlbHNlDQor ICAgIC8vIGhkZjUgZG9lc24ndCAoeWV0KSBzdXBwb3J0IGF1dG9tYXRpYyBm bG9hdC9pbnRlZ2VyIGNvbnZlcnNpb25zDQorICAgIGlmICh0eXBlX2NsYXNz X2lkID09IEg1VF9GTE9BVCkgew0KKyNlbmRpZg0KKyAgICAgIC8vIHJlYWQg cmVhbCBtYXRyaXggb3Igc2NhbGFyIHZhcmlhYmxlDQorDQorICAgICAgaGlk X3Qgc3BhY2VfaWQgPSBINURnZXRfc3BhY2UgKGRhdGFfaWQpOw0KKyAgICAg IGhzaXplX3QgcmFuayA9IEg1U2dldF9zaW1wbGVfZXh0ZW50X25kaW1zIChz cGFjZV9pZCk7DQorDQorICAgICAgaWYgKHJhbmsgPT0gMCkgew0KKwkvLyBy ZWFsIHNjYWxhcjoNCisJZG91YmxlIGR0bXA7DQorCWlmIChINURyZWFkIChk YXRhX2lkLCBINVRfTkFUSVZFX0RPVUJMRSwgSDVTX0FMTCwgSDVTX0FMTCwg DQorCQkgICAgSDVQX0RFRkFVTFQsICh2b2lkICopICZkdG1wKSA8IDApDQor CSAgcmV0dmFsID0gLTE7ICAvLyBlcnJvcg0KKwllbHNlDQorCSAgZC0+dGMg PSBkdG1wOw0KKyAgICAgIH0NCisgICAgICBlbHNlIGlmIChyYW5rID4gMCAm JiByYW5rIDw9IDIpIHsNCisJLy8gcmVhbCBtYXRyaXgNCisJaHNpemVfdCAq ZGltcyA9IG5ldyBoc2l6ZV90W3JhbmtdLCAqbWF4ZGltcyA9IG5ldyBoc2l6 ZV90W3JhbmtdOw0KKwlINVNnZXRfc2ltcGxlX2V4dGVudF9kaW1zIChzcGFj ZV9pZCwgZGltcywgbWF4ZGltcyk7DQorCWludCBuciwgbmM7ICAvLyByb3dz IGFuZCBjb2x1bW5zDQorCW5jID0gZGltc1swXTsgIC8vIG9jdGF2ZSB1c2Vz IGNvbHVtbi1tYWpvciAmIEhERjUgdXNlcyByb3ctbWFqb3INCisJbnIgPSBy YW5rID4gMSA/IGRpbXNbMV0gOiAxOw0KKwlkZWxldGUgW10gZGltczsJZGVs ZXRlIFtdIG1heGRpbXM7DQorCU1hdHJpeCBtIChuciwgbmMpOw0KKwlkb3Vi bGUgKnJlID0gbS5mb3J0cmFuX3ZlYyAoKTsNCisJaWYgKEg1RHJlYWQgKGRh dGFfaWQsIEg1VF9OQVRJVkVfRE9VQkxFLCBINVNfQUxMLCBINVNfQUxMLCAN CisJCSAgICBINVBfREVGQVVMVCwgKHZvaWQgKikgcmUpIDwgMCkNCisJICBy ZXR2YWwgPSAtMTsgIC8vIGVycm9yDQorCWVsc2UNCisJICBkLT50YyA9IG07 DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKHJhbmsgPj0gMyAmJiBkLT5p bXBvcnQpIHsNCisJaHNpemVfdCAqZGltcyA9IG5ldyBoc2l6ZV90W3Jhbmtd LCAqbWF4ZGltcyA9IG5ldyBoc2l6ZV90W3JhbmtdOw0KKwlINVNnZXRfc2lt cGxlX2V4dGVudF9kaW1zIChzcGFjZV9pZCwgZGltcywgbWF4ZGltcyk7DQor CWhzc2l6ZV90ICpzdGFydCA9IG5ldyBoc3NpemVfdFtyYW5rXTsNCisJaHNp emVfdCAqY291bnQgPSBuZXcgaHNpemVfdFtyYW5rXTsNCisJZm9yIChoc2l6 ZV90IGkgPSAwOyBpIDwgcmFuazsgKytpKSB7DQorCSAgc3RhcnRbaV0gPSAw Ow0KKwkgIGNvdW50W2ldID0gMTsNCisJfQ0KKwljb3VudFswXSA9IGRpbXNb MF07DQorCWNvdW50WzFdID0gZGltc1sxXTsNCisJcmV0dmFsID0gaGRmNV9p bXBvcnRfbXVsdGlkaW0gKGRhdGFfaWQsIHNwYWNlX2lkLCByYW5rLCBkaW1z LA0KKwkJCQkgICAgICByYW5rLTEsIHN0YXJ0LCBjb3VudCwNCisJCQkJICAg ICAgSDVUX05BVElWRV9ET1VCTEUsIGQtPnRjKTsNCisJZGVsZXRlIFtdIGNv dW50OyBkZWxldGUgW10gc3RhcnQ7DQorCWRlbGV0ZSBbXSBkaW1zOwlkZWxl dGUgW10gbWF4ZGltczsNCisgICAgICB9DQorICAgICAgZWxzZSB7DQorCXdh cm5pbmcgKCJsb2FkOiBjYW4ndCByZWFkICVkLWRpbS4gaGRmNSBkYXRhc2V0 ICVzIiwgcmFuaywgbmFtZSk7DQorCXJldHZhbCA9IDA7ICAvLyBza2lwOyB3 ZSBjYW4ndCByZWFkIDMrIGRpbWVuc2lvbmFsIGRhdGFzZXRzDQorICAgICAg fQ0KKw0KKw0KKyAgICAgIEg1U2Nsb3NlIChzcGFjZV9pZCk7DQorICAgIH0N CisgICAgZWxzZSBpZiAodHlwZV9jbGFzc19pZCA9PSBINVRfU1RSSU5HKSB7 DQorICAgICAgLy8gcmVhZCBzdHJpbmcgdmFyaWFibGUNCisgICAgICBoaWRf dCBzcGFjZV9pZCA9IEg1RGdldF9zcGFjZSAoZGF0YV9pZCk7DQorICAgICAg aHNpemVfdCByYW5rID0gSDVTZ2V0X3NpbXBsZV9leHRlbnRfbmRpbXMgKHNw YWNlX2lkKTsNCisNCisgICAgICBpZiAocmFuayA9PSAwKSB7DQorCS8vIGEg c2luZ2xlIHN0cmluZzoNCisJaW50IHNsZW4gPSBINVRnZXRfc2l6ZSAodHlw ZV9pZCk7DQorCWlmIChzbGVuIDwgMCkNCisJICByZXR2YWwgPSAtMTsgIC8v IGVycm9yDQorCWVsc2Ugew0KKwkgIGNoYXIgKnMgPSBuZXcgY2hhciBbc2xl bl07DQorCSAgLy8gY3JlYXRlIGRhdGF0eXBlIGZvciAobnVsbC10ZXJtaW5h dGVkKSBzdHJpbmcgdG8gcmVhZCBpbnRvOg0KKwkgIGhpZF90IHN0X2lkID0g SDVUY29weSAoSDVUX0NfUzEpOyBINVRzZXRfc2l6ZSAoc3RfaWQsIHNsZW4p Ow0KKwkgIGlmIChINURyZWFkIChkYXRhX2lkLCBzdF9pZCwgSDVTX0FMTCwg SDVTX0FMTCwgDQorCQkgICAgICBINVBfREVGQVVMVCwgKHZvaWQgKikgcykg PCAwKSB7DQorCSAgICBkZWxldGUgW10gczsNCisJICAgIHJldHZhbCA9IC0x OyAgLy8gZXJyb3INCisJICB9DQorCSAgZWxzZQ0KKwkgICAgZC0+dGMgPSBz Ow0KKwkgIEg1VGNsb3NlIChzdF9pZCk7DQorCX0NCisgICAgICB9DQorICAg ICAgZWxzZSBpZiAocmFuayA9PSAxKSB7DQorCS8vIHN0cmluZyB2ZWN0b3IN CisJaHNpemVfdCBlbGVtZW50cywgbWF4ZGltOw0KKwlINVNnZXRfc2ltcGxl X2V4dGVudF9kaW1zIChzcGFjZV9pZCwgJmVsZW1lbnRzLCAmbWF4ZGltKTsN CisJaW50IHNsZW4gPSBINVRnZXRfc2l6ZSAodHlwZV9pZCk7DQorCWlmIChz bGVuIDwgMCkNCisJICByZXR2YWwgPSAtMTsgIC8vIGVycm9yDQorCWVsc2Ug ew0KKwkgIC8vIGhkZjUgc3RyaW5nIGFycmF5cyBzdG9yZSBzdHJpbmdzIG9m IGFsbCB0aGUgc2FtZSBwaHlzaWNhbCBsZW5ndGgNCisJICAvLyAoSSB0aGlu ayksIHdoaWNoIGlzIHNsaWdodGx5IHdhc3RlZnVsLCBidXQgb2ggd2VsbC4N CisJICBjaGFyICpzID0gbmV3IGNoYXIgW2VsZW1lbnRzICogc2xlbl07DQor CSAgLy8gY3JlYXRlIGRhdGF0eXBlIGZvciAobnVsbC10ZXJtaW5hdGVkKSBz dHJpbmcgdG8gcmVhZCBpbnRvOg0KKwkgIGhpZF90IHN0X2lkID0gSDVUY29w eSAoSDVUX0NfUzEpOyBINVRzZXRfc2l6ZSAoc3RfaWQsIHNsZW4pOw0KKw0K KwkgIGlmIChINURyZWFkIChkYXRhX2lkLCBzdF9pZCwgSDVTX0FMTCwgSDVT X0FMTCwgDQorCQkgICAgICBINVBfREVGQVVMVCwgKHZvaWQgKikgcykgPCAw KQ0KKwkgICAgcmV0dmFsID0gLTE7ICAvLyBlcnJvcg0KKwkgIGVsc2Ugew0K KwkgICAgY2hhck1hdHJpeCBjaG0gKGVsZW1lbnRzLCBzbGVuIC0gMSk7DQor CSAgICBmb3IgKGhzaXplX3QgaSA9IDA7IGkgPCBlbGVtZW50czsgKytpKSB7 DQorCSAgICAgIGNobS5pbnNlcnQgKHMgKyBpKnNsZW4sIGksIDApOw0KKwkg ICAgfQ0KKwkgICAgZC0+dGMgPSBvY3RhdmVfdmFsdWUgKGNobSwgdHJ1ZSk7 DQorCSAgfQ0KKwkgIGRlbGV0ZSBbXSBzOw0KKwkgIEg1VGNsb3NlIChzdF9p ZCk7DQorCX0NCisgICAgICB9DQorICAgICAgZWxzZSB7DQorICAgCXdhcm5p bmcgKCJsb2FkOiBjYW4ndCByZWFkICVkLWRpbS4gaGRmNSBzdHJpbmcgdmVj dG9yICVzIiwgcmFuaywgbmFtZSk7DQorCXJldHZhbCA9IDA7ICAvLyBza2lw OyB3ZSBjYW4ndCByZWFkIGhpZ2hlci1kaW1lbnNpb25hbCBzdHJpbmcgdmVj dG9ycw0KKyAgICAgIH0NCisNCisgICAgfQ0KKyAgICBlbHNlIGlmICh0eXBl X2NsYXNzX2lkID09IEg1VF9DT01QT1VORCkgew0KKyAgICAgIC8vIGNoZWNr IGZvciBjb21wbGV4IG9yIHJhbmdlIGRhdGE6DQorDQorICAgICAgaWYgKGhk ZjVfdHlwZXNfY29tcGF0aWJsZSAodHlwZV9pZCwgZC0+Y29tcGxleF90eXBl KSkgewkNCisJLy8gcmVhZCBjb21wbGV4IG1hdHJpeCBvciBzY2FsYXIgdmFy aWFibGUNCisJDQorCWhpZF90IHNwYWNlX2lkID0gSDVEZ2V0X3NwYWNlIChk YXRhX2lkKTsNCisJaHNpemVfdCByYW5rID0gSDVTZ2V0X3NpbXBsZV9leHRl bnRfbmRpbXMgKHNwYWNlX2lkKTsNCisJDQorCWlmIChyYW5rID09IDApIHsN CisJICAvLyBjb21wbGV4IHNjYWxhcjoNCisJICBDb21wbGV4IGN0bXA7DQor CSAgaWYgKEg1RHJlYWQgKGRhdGFfaWQsIGQtPmNvbXBsZXhfdHlwZSwgSDVT X0FMTCwgSDVTX0FMTCwgDQorCQkgICAgICBINVBfREVGQVVMVCwgKHZvaWQg KikgWF9DQVNUIChkb3VibGUgKiwgJmN0bXApKSA8IDApDQorCSAgICByZXR2 YWwgPSAtMTsgIC8vIGVycm9yDQorCSAgZWxzZQ0KKwkgICAgZC0+dGMgPSBj dG1wOw0KKwl9DQorCWVsc2UgaWYgKHJhbmsgPiAwICYmIHJhbmsgPD0gMikg ew0KKwkgIC8vIGNvbXBsZXggbWF0cml4DQorCSAgaHNpemVfdCAqZGltcyA9 IG5ldyBoc2l6ZV90W3JhbmtdLCAqbWF4ZGltcyA9IG5ldyBoc2l6ZV90W3Jh bmtdOw0KKwkgIEg1U2dldF9zaW1wbGVfZXh0ZW50X2RpbXMgKHNwYWNlX2lk LCBkaW1zLCBtYXhkaW1zKTsNCisJICBpbnQgbnIsIG5jOyAgLy8gcm93cyBh bmQgY29sdW1ucw0KKwkgIG5jID0gZGltc1swXTsgIC8vIG9jdGF2ZSB1c2Vz IGNvbHVtbi1tYWpvciAmIEhERjUgdXNlcyByb3ctbWFqb3INCisJICBuciA9 IHJhbmsgPiAxID8gZGltc1sxXSA6IDE7DQorCSAgZGVsZXRlIFtdIGRpbXM7 IGRlbGV0ZSBbXSBtYXhkaW1zOw0KKwkgIENvbXBsZXhNYXRyaXggbSAobnIs IG5jKTsNCisJICBDb21wbGV4ICpyZWltID0gbS5mb3J0cmFuX3ZlYyAoKTsN CisJICBpZiAoSDVEcmVhZCAoZGF0YV9pZCwgZC0+Y29tcGxleF90eXBlLCBI NVNfQUxMLCBINVNfQUxMLCANCisJCSAgICAgIEg1UF9ERUZBVUxULCAodm9p ZCAqKSBYX0NBU1QgKGRvdWJsZSAqLCByZWltKSkgPCAwKQ0KKwkgICAgcmV0 dmFsID0gLTE7ICAvLyBlcnJvcg0KKwkgIGVsc2UNCisJICAgIGQtPnRjID0g bTsNCisJfQ0KKwllbHNlIGlmIChyYW5rID49IDMgJiYgZC0+aW1wb3J0KSB7 DQorCSAgaHNpemVfdCAqZGltcyA9IG5ldyBoc2l6ZV90W3JhbmtdLCAqbWF4 ZGltcyA9IG5ldyBoc2l6ZV90W3JhbmtdOw0KKwkgIEg1U2dldF9zaW1wbGVf ZXh0ZW50X2RpbXMgKHNwYWNlX2lkLCBkaW1zLCBtYXhkaW1zKTsNCisJICBo c3NpemVfdCAqc3RhcnQgPSBuZXcgaHNzaXplX3RbcmFua107DQorCSAgaHNp emVfdCAqY291bnQgPSBuZXcgaHNpemVfdFtyYW5rXTsNCisJICBmb3IgKGhz aXplX3QgaSA9IDA7IGkgPCByYW5rOyArK2kpIHsNCisJICAgIHN0YXJ0W2ld ID0gMDsNCisJICAgIGNvdW50W2ldID0gMTsNCisJICB9DQorCSAgY291bnRb MF0gPSBkaW1zWzBdOw0KKwkgIGNvdW50WzFdID0gZGltc1sxXTsNCisJICBy ZXR2YWwgPSBoZGY1X2ltcG9ydF9tdWx0aWRpbSAoZGF0YV9pZCwgc3BhY2Vf aWQsIHJhbmssIGRpbXMsDQorCQkJCQlyYW5rLTEsIHN0YXJ0LCBjb3VudCwN CisJCQkJCWQtPmNvbXBsZXhfdHlwZSwgZC0+dGMpOw0KKwkgIGRlbGV0ZSBb XSBjb3VudDsgZGVsZXRlIFtdIHN0YXJ0Ow0KKwkgIGRlbGV0ZSBbXSBkaW1z OyBkZWxldGUgW10gbWF4ZGltczsNCisJfQ0KKwllbHNlIHsNCisJICB3YXJu aW5nICgibG9hZDogY2FuJ3QgcmVhZCAlZC1kaW0uIGhkZjUgZGF0YXNldCAl cyIsIHJhbmssIG5hbWUpOw0KKwkgIHJldHZhbCA9IDA7ICAvLyBza2lwOyB3 ZSBjYW4ndCByZWFkIDMrIGRpbWVuc2lvbmFsIGRhdGFzZXRzDQorCX0NCisJ DQorCUg1U2Nsb3NlIChzcGFjZV9pZCk7DQorICAgICAgfQ0KKyAgICAgIGVs c2UgaWYgKGhkZjVfdHlwZXNfY29tcGF0aWJsZSAodHlwZV9pZCwgZC0+cmFu Z2VfdHlwZSkpIHsNCisJLy8gcmVhZCByYW5nZSB2YXJpYWJsZToNCisJaGlk X3Qgc3BhY2VfaWQgPSBINURnZXRfc3BhY2UgKGRhdGFfaWQpOw0KKwloc2l6 ZV90IHJhbmsgPSBINVNnZXRfc2ltcGxlX2V4dGVudF9uZGltcyAoc3BhY2Vf aWQpOw0KKwlpZiAocmFuayA9PSAwKSB7DQorCSAgZG91YmxlIHJhbmdldmFs c1szXTsNCisJICBpZiAoSDVEcmVhZCAoZGF0YV9pZCwgZC0+cmFuZ2VfdHlw ZSwgSDVTX0FMTCwgSDVTX0FMTCwgDQorCQkgICAgICBINVBfREVGQVVMVCwg KHZvaWQgKikgcmFuZ2V2YWxzKSA8IDApDQorCSAgICByZXR2YWwgPSAtMTsg IC8vIGVycm9yDQorCSAgZWxzZSB7DQorCSAgICBSYW5nZSByIChyYW5nZXZh bHNbMF0sIHJhbmdldmFsc1sxXSwgcmFuZ2V2YWxzWzJdKTsNCisJICAgIGQt PnRjID0gcjsNCisJICB9DQorCX0NCisJZWxzZSB7DQorICAgICAgICAgIHdh cm5pbmcgKCJsb2FkOiBjYW4ndCByZWFkIHJhbmdlIGFycmF5IGAlcycgaW4g aGRmNSBmaWxlIiwgbmFtZSk7DQorCSAgcmV0dmFsID0gMDsgIC8vIHNraXA7 IHdlIGNhbid0IHJlYWQgYXJyYXlzIG9mIHJhbmdlIHZhcmlhYmxlcw0KKwl9 DQorCUg1U2Nsb3NlIChzcGFjZV9pZCk7DQorICAgICAgfQ0KKyAgICAgIGVs c2Ugew0KKwl3YXJuaW5nICgibG9hZDogY2FuJ3QgcmVhZCBgJXMnICh1bmtu b3duIGNvbXBvdW5kIGRhdGF0eXBlKSIsIG5hbWUpOw0KKwlyZXR2YWwgPSAw OyAvLyB1bmtub3duIGRhdGF0eXBlOyBza2lwLg0KKyAgICAgIH0NCisgICAg fQ0KKyAgICBlbHNlIHsNCisJd2FybmluZyAoImxvYWQ6IGNhbid0IHJlYWQg YCVzJyAodW5rbm93biBkYXRhdHlwZSkiLCBuYW1lKTsNCisJcmV0dmFsID0g MDsgLy8gdW5rbm93biBkYXRhdHlwZTsgc2tpcA0KKyAgICB9DQorDQorICAg IEg1VGNsb3NlICh0eXBlX2lkKTsNCisNCisgICAgLy8gY2hlY2sgZm9yIE9D VEFWRV9HTE9CQUwgYXR0cmlidXRlOg0KKyAgICBkLT5nbG9iYWwgPSBoZGY1 X2NoZWNrX2F0dHIoZGF0YV9pZCwgIk9DVEFWRV9HTE9CQUwiKTsNCisNCisg ICAgSDVEY2xvc2UgKGRhdGFfaWQpOw0KKyAgfQ0KKyAgZWxzZSBpZiAoaW5m by50eXBlID09IEg1R19HUk9VUCAmJiBpZGVudF92YWxpZCkgew0KKyAgICAv LyByZWFkIGluIGdyb3VwIGFzIGEgbGlzdCBvciBhIHN0cnVjdHVyZQ0KKyAg ICByZXR2YWwgPSAxOw0KKw0KKyAgICBoaWRfdCBzdWJncm91cF9pZCA9IEg1 R29wZW4gKGdyb3VwX2lkLCBuYW1lKTsNCisgICAgaWYgKHN1Ymdyb3VwX2lk IDwgMCkgew0KKyAgICAgIHJldHZhbCA9IHN1Ymdyb3VwX2lkOw0KKyAgICAg IGdvdG8gZG9uZTsNCisgICAgfQ0KKw0KKyAgICAvKiBhbiBIREY1IGdyb3Vw IGlzIHRyZWF0ZWQgYXMgYW4gb2N0YXZlIHN0cnVjdHVyZSBieSBkZWZhdWx0 IChzaW5jZQ0KKyAgICAgICB0aGF0IHByZXNlcnZlcyBuYW1lIGluZm9ybWF0 aW9uKSwgYW5kIGFuIG9jdGF2ZSBsaXN0IG90aGVyd2lzZS4gKi8NCisgICAg Ym9vbCBpc19saXN0ID0gaGRmNV9jaGVja19hdHRyKHN1Ymdyb3VwX2lkLCAi T0NUQVZFX0xJU1QiKTsNCisNCisgICAgaGRmNV9jYWxsYmFja19kYXRhIGRz dWI7DQorICAgIGRzdWIubmFtZSA9IGRzdWIuZG9jID0gKGNoYXIqKSBOVUxM Ow0KKyAgICBkc3ViLmdsb2JhbCA9IDA7DQorICAgIGRzdWIuY29tcGxleF90 eXBlID0gZC0+Y29tcGxleF90eXBlOw0KKyAgICBkc3ViLnJhbmdlX3R5cGUg PSBkLT5yYW5nZV90eXBlOw0KKyAgICBkc3ViLmltcG9ydCA9IGQtPmltcG9y dDsNCisNCisgICAgaGVycl90IHJldHZhbDI7DQorICAgIG9jdGF2ZV92YWx1 ZV9saXN0IGxzdDsNCisgICAgT2N0YXZlX21hcCBtOw0KKyAgICBpbnQgY3Vy cmVudF9pdGVtID0gMDsNCisgICAgd2hpbGUgKCAocmV0dmFsMiA9IEg1R2l0 ZXJhdGUgKGdyb3VwX2lkLCBuYW1lLCAmY3VycmVudF9pdGVtLA0KKwkJCQkg ICBoZGY1X3JlYWRfbmV4dF9kYXRhLCAmZHN1YikpID4gMCkgew0KKyAgICAg IGlmIChpc19saXN0KQ0KKwlsc3QuYXBwZW5kIChkc3ViLnRjKTsNCisgICAg ICBlbHNlDQorCW0gWyBkc3ViLm5hbWUgXSA9IGRzdWIudGM7DQorICAgICAg aWYgKGRzdWIubmFtZSkNCisJZGVsZXRlIFtdIGRzdWIubmFtZTsNCisgICAg ICBpZiAoZHN1Yi5kb2MpDQorCWRlbGV0ZSBbXSBkc3ViLmRvYzsNCisgICAg ICBjdXJyZW50X2l0ZW0rKzsgIC8vIEg1R2l0ZXJhdGUgcmV0dXJuZWQgdGhl IGxhc3QgaW5kZXggcHJvY2Vzc2VkDQorICAgIH0NCisgICAgaWYgKHJldHZh bDIgPCAwKQ0KKyAgICAgIHJldHZhbCA9IHJldHZhbDI7DQorICAgIGVsc2Ug ew0KKyAgICAgIGQtPmdsb2JhbCA9IGhkZjVfY2hlY2tfYXR0cihncm91cF9p ZCwgIk9DVEFWRV9HTE9CQUwiKTsNCisgICAgICBpZiAoaXNfbGlzdCkNCisJ ZC0+dGMgPSBsc3Q7DQorICAgICAgZWxzZQ0KKwlkLT50YyA9IG07DQorICAg IH0NCisNCisgICAgSDVHY2xvc2UgKHN1Ymdyb3VwX2lkKTsNCisgIH0NCisg IGVsc2UgaWYgKCFpZGVudF92YWxpZCkgew0KKyAgICAvLyBzaG91bGQgd2Ug YXR0ZW1wdCB0byBoYW5kbGUgaW52YWxpZCBpZGVudGlmaWVycyBieSBjb252 ZXJ0aW5nDQorICAgIC8vIGJhZCBjaGFyYWN0ZXJzIHRvICdfJywgc2F5Pw0K KyAgICB3YXJuaW5nICgibG9hZDogc2tpcHBpbmcgaW52YWxpZCBpZGVudGlm aWVyIGAlcycgaW4gaGRmNSBmaWxlIiwgbmFtZSk7DQorICB9DQorDQorIGRv bmU6DQorICBpZiAocmV0dmFsIDwgMCkgew0KKyAgICBlcnJvciAoImxvYWQ6 IGVycm9yIHdoaWxlIHJlYWRpbmcgaGRmNSBpdGVtICVzIiwgbmFtZSk7DQor ICB9DQorICBpZiAocmV0dmFsID4gMCkgew0KKyAgICAvLyBnZXQgZG9jdW1l bnRhdGlvbiBzdHJpbmcsIGlmIGFueToNCisgICAgaW50IGNvbW1lbnRfbGVu Z3RoID0gSDVHZ2V0X2NvbW1lbnQgKGdyb3VwX2lkLCBuYW1lLCAwLCBOVUxM KTsNCisgICAgaWYgKGNvbW1lbnRfbGVuZ3RoID4gMSkgew0KKyAgICAgIGQt PmRvYyA9IG5ldyBjaGFyW2NvbW1lbnRfbGVuZ3RoXTsNCisgICAgICBINUdn ZXRfY29tbWVudCAoZ3JvdXBfaWQsIG5hbWUsIGNvbW1lbnRfbGVuZ3RoLCBk LT5kb2MpOw0KKyAgICB9DQorICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwg dm5hbWUpICE9IDApIHsNCisgICAgICAvLyB0aGUgbmFtZSB3YXMgY2hhbmdl ZCBieSBpbXBvcnQ7IHN0b3JlIHRoZSBvcmlnaW5hbCBuYW1lDQorICAgICAg Ly8gYXMgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nOg0KKyAgICAgIGQtPmRv YyA9IG5ldyBjaGFyW3N0cmxlbiAobmFtZSkgKyAxXTsNCisgICAgICBzdHJj cHkgKGQtPmRvYywgbmFtZSk7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAg IGQtPmRvYyA9IChjaGFyICopIE5VTEw7DQorDQorICAgIC8vIGNvcHkgbmFt ZSAoYWN0dWFsbHksIHZuYW1lKToNCisgICAgZC0+bmFtZSA9IG5ldyBjaGFy W3N0cmxlbiAodm5hbWUpICsgMV07DQorICAgIHN0cmNweSAoZC0+bmFtZSwg dm5hbWUpOw0KKyAgfQ0KKyAgZGVsZXRlIFtdIHZuYW1lOw0KKyAgcmV0dXJu IHJldHZhbDsNCit9DQorDQorLyogVGhlIGZvbGxvd2luZyB0d28gc3Vicm91 dGluZXMgY3JlYXRlIEhERjUgcmVwcmVzZW50YXRpb25zIG9mIHRoZSB3YXkN CisgICB3ZSB3aWxsIHN0b3JlIE9jdGF2ZSBjb21wbGV4IGFuZCByYW5nZSB0 eXBlcyAocGFpcnMgYW5kIHRyaXBsZXRzIG9mDQorICAgZmxvYXRpbmctcG9p bnQgbnVtYmVycywgcmVzcGVjdGl2ZWx5KS4gIE5VTV9UWVBFIGlzIHRoZSBI REY1IG51bWVyaWMNCisgICB0eXBlIHRvIHVzZSBmb3Igc3RvcmFnZSAoZS5n LiBINVRfTkFUSVZFX0RPVUJMRSB0byBzYXZlIGFzICdkb3VibGUnKS4NCisg ICBOb3RlIHRoYXQgYW55IG5lY2Vzc2FyeSBjb252ZXJzaW9ucyBhcmUgaGFu ZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IEhERjUuICovDQorDQorc3RhdGljIGhp ZF90IGhkZjVfbWFrZV9jb21wbGV4X3R5cGUgKGhpZF90IG51bV90eXBlKQ0K K3sNCisgIGhpZF90IHR5cGVfaWQgPSBINVRjcmVhdGUgKEg1VF9DT01QT1VO RCwgc2l6ZW9mIChkb3VibGUpICogMik7DQorICBINVRpbnNlcnQgKHR5cGVf aWQsICJyZWFsIiwgMCAqIHNpemVvZiAoZG91YmxlKSwgbnVtX3R5cGUpOw0K KyAgSDVUaW5zZXJ0ICh0eXBlX2lkLCAiaW1hZyIsIDEgKiBzaXplb2YgKGRv dWJsZSksIG51bV90eXBlKTsNCisgIHJldHVybiB0eXBlX2lkOw0KK30NCisN CitzdGF0aWMgaGlkX3QgaGRmNV9tYWtlX3JhbmdlX3R5cGUgKGhpZF90IG51 bV90eXBlKQ0KK3sNCisgIGhpZF90IHR5cGVfaWQgPSBINVRjcmVhdGUgKEg1 VF9DT01QT1VORCwgc2l6ZW9mIChkb3VibGUpICogMyk7DQorICBINVRpbnNl cnQgKHR5cGVfaWQsICJiYXNlIiwgMCAqIHNpemVvZiAoZG91YmxlKSwgbnVt X3R5cGUpOw0KKyAgSDVUaW5zZXJ0ICh0eXBlX2lkLCAibGltaXQiLCAxICog c2l6ZW9mIChkb3VibGUpLCBudW1fdHlwZSk7DQorICBINVRpbnNlcnQgKHR5 cGVfaWQsICJpbmNyZW1lbnQiLCAyICogc2l6ZW9mIChkb3VibGUpLCBudW1f dHlwZSk7DQorICByZXR1cm4gdHlwZV9pZDsNCit9DQorDQorLyogUmVhZCB0 aGUgbmV4dCBPY3RhdmUgdmFyaWFibGUgZnJvbSB0aGUgc3RyZWFtIElTLCB3 aGljaCBtdXN0IHJlYWxseSBiZQ0KKyAgIGFuIGhkZjVfaWZzdHJlYW0uICBS ZXR1cm4gdGhlIHZhcmlhYmxlIHZhbHVlIGluIHRjLCBpdHMgZG9jIHN0cmlu Zw0KKyAgIGluIGRvYywgYW5kIHdoZXRoZXIgaXQgaXMgZ2xvYmFsIGluIGds b2JhbC4gIFRoZSByZXR1cm4gdmFsdWUgaXMNCisgICB0aGUgbmFtZSBvZiB0 aGUgdmFyaWFibGUsIG9yIE5VTEwgaWYgbm9uZSB3ZXJlIGZvdW5kIG9yIHRo ZXJlIHdhcw0KKyAgIGFuZCBlcnJvci4gIElmIGltcG9ydCBpcyB0cnVlLCB3 ZSB0cnkgZXh0cmEgaGFyZCB0byBpbXBvcnQgImZvcmVpZ24iDQorICAgZGF0 YXNldHMgKG5vdCBjcmVhdGVkIGJ5IE9jdGF2ZSksIGFsdGhvdWdoIHdlIHVz dWFsbHkgZG8gYSByZWFzb25hYmxlDQorICAgam9iIGFueXdheS4gIChjLmYu IGxvYWQgLWltcG9ydCBkb2N1bWVudGF0aW9uLikgICovDQorc3RhdGljIGNo YXIgKg0KK3JlYWRfaGRmNV9kYXRhIChpc3RyZWFtJiBpcywNCisJCWNvbnN0 IHN0cmluZyYgZmlsZW5hbWUsIGJvb2wmIGdsb2JhbCwNCisJCW9jdGF2ZV92 YWx1ZSYgdGMsIGNoYXIgKiZkb2MsIGJvb2wgaW1wb3J0KQ0KK3sNCisgIGhk ZjVfaWZzdHJlYW0mIGhzID0gKGhkZjVfaWZzdHJlYW0mKSBpczsNCisgIGhk ZjVfY2FsbGJhY2tfZGF0YSBkOw0KKw0KKyAgZC5uYW1lID0gKGNoYXIgKikg TlVMTDsNCisgIGQuZ2xvYmFsID0gMDsNCisgIGQuZG9jID0gKGNoYXIgKikg TlVMTDsNCisgIGQuY29tcGxleF90eXBlID0gaGRmNV9tYWtlX2NvbXBsZXhf dHlwZSAoSDVUX05BVElWRV9ET1VCTEUpOw0KKyAgZC5yYW5nZV90eXBlID0g aGRmNV9tYWtlX3JhbmdlX3R5cGUgKEg1VF9OQVRJVkVfRE9VQkxFKTsNCisg IGQuaW1wb3J0ID0gaW1wb3J0Ow0KKw0KKyAgaGVycl90IHJldHZhbCA9IEg1 R2l0ZXJhdGUgKGhzLmZpbGVfaWQsICIvIiwgJmhzLmN1cnJlbnRfaXRlbSwN CisJCQkgICAgIGhkZjVfcmVhZF9uZXh0X2RhdGEsICZkKTsNCisNCisgIC8v IEg1R2l0ZXJhdGUgc2V0cyBjdXJyZW50X2l0ZW0gdG8gdGhlIGxhc3QgaXRl bSBwcm9jZXNzZWQ7IHdlIHdhbnQNCisgIC8vIHRoZSBpbmRleCBvZiB0aGUg bmV4dCBpdGVtIChmb3IgdGhlIG5leHQgY2FsbCB0byByZWFkX2hkZjVfZGF0 YSkNCisgIGhzLmN1cnJlbnRfaXRlbSsrOw0KKw0KKyAgaWYgKHJldHZhbCA+ IDApIHsNCisgICAgZ2xvYmFsID0gZC5nbG9iYWw7DQorICAgIHRjID0gZC50 YzsNCisgICAgZG9jID0gZC5kb2M7DQorICB9DQorICBlbHNlIHsgLy8gYW4g ZXJyb3Igb2NjdXJyZWQgKHJldHZhbCA8IDApIG9yIHRoZXJlIGFyZSBubyBt b3JlIGRhdGFzZXRzIA0KKyAgICAvLyBwcmludCBhbiBlcnJvciBtZXNzYWdl IGlmIHJldHZhbCA8IDA/DQorICAgIC8vIGhkZjVfcmVhZF9uZXh0X2RhdGEg YWxyZWFkeSBwcmludGVkIG9uZSwgcHJvYmFibHkuDQorICB9DQorDQorICBI NVRjbG9zZSAoZC5jb21wbGV4X3R5cGUpOw0KKyAgSDVUY2xvc2UgKGQucmFu Z2VfdHlwZSk7DQorDQorICByZXR1cm4gZC5uYW1lOw0KK30NCisNCisjZW5k aWYgLyogSEFWRV9IREY1ICovDQorDQorLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiovDQorDQogc3RhdGljIHN0cmluZw0KIGdldF9tYXRfZGF0YV9pbnB1 dF9saW5lIChpc3RyZWFtJiBpcykNCiB7DQpAQCAtMTUwMCw2ICsyMTUzLDEx IEBADQogew0KICAgbG9hZF9zYXZlX2Zvcm1hdCByZXR2YWwgPSBMU19VTktO T1dOOw0KIA0KKyNpZmRlZiBIQVZFX0hERjUNCisgIGlmIChINUZpc19oZGY1 IChmbmFtZS5jX3N0ciAoKSkgPiAwKSAvLyBjaGVjayB0aGlzIGJlZm9yZSB3 ZSBvcGVuIHRoZSBmaWxlDQorICAgIHJldHVybiBMU19IREY1Ow0KKyNlbmRp ZiAvKiBIQVZFX0hERjUgKi8NCisNCiAgIGlmc3RyZWFtIGZpbGUgKGZuYW1l LmNfc3RyICgpKTsNCiANCiAgIGlmICghIGZpbGUpDQpAQCAtMTU0Miw3ICsy MjAwLDcgQEANCiAJICAgICAgLy8gVHJ5IHJlYWRpbmcgdGhlIGZpbGUgYXMg bnVtYmVycyBvbmx5LCBkZXRlcm1pbmluZyB0aGUNCiAJICAgICAgLy8gbnVt YmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgZnJvbSB0aGUgZGF0YS4gIFdlIGRv bid0DQogCSAgICAgIC8vIGV2ZW4gYm90aGVyIHRvIGNoZWNrIHRvIHNlZSBp ZiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUNCi0JICAgICAgLy8gZmlsZSBpcyBh IG51bWJlciwgc28gdGhhdCBnZXRfY29tcGxldGVfbGluZSgpIGNhbg0KKwkg ICAgICAvLyBmaWxlIGlzIGEgbnVtYmVyLCBzbyB0aGF0IGdldF9jb21wbGV0 ZV9saW5lICgpIGNhbg0KIAkgICAgICAvLyBza2lwIGFueSBjb21tZW50cyB0 aGF0IG1pZ2h0IGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZQ0KIAkgICAgICAv LyBmaWxlLg0KIA0KQEAgLTE1NjMsOCArMjIyMSw4IEBADQogc3RhdGljIG9j dGF2ZV92YWx1ZV9saXN0DQogZG9fbG9hZCAoaXN0cmVhbSYgc3RyZWFtLCBj b25zdCBzdHJpbmcmIG9yaWdfZm5hbWUsIGJvb2wgZm9yY2UsDQogCSBsb2Fk X3NhdmVfZm9ybWF0IGZvcm1hdCwgb2N0X21hY2hfaW5mbzo6ZmxvYXRfZm9y bWF0IGZsdF9mbXQsDQotCSBib29sIGxpc3Rfb25seSwgYm9vbCBzd2FwLCBi b29sIHZlcmJvc2UsIGNvbnN0IHN0cmluZ192ZWN0b3ImIGFyZ3YsDQotCSBp bnQgYXJndl9pZHgsIGludCBhcmdjLCBpbnQgbmFyZ291dCkNCisJIGJvb2wg bGlzdF9vbmx5LCBib29sIHN3YXAsIGJvb2wgdmVyYm9zZSwgYm9vbCBpbXBv cnQsDQorCSBjb25zdCBzdHJpbmdfdmVjdG9yJiBhcmd2LCBpbnQgYXJndl9p ZHgsIGludCBhcmdjLCBpbnQgbmFyZ291dCkNCiB7DQogICBvY3RhdmVfdmFs dWVfbGlzdCByZXR2YWw7DQogDQpAQCAtMTU5Nyw2ICsyMjU1LDEzIEBADQog CSAgbmFtZSA9IHJlYWRfbWF0X2JpbmFyeV9kYXRhIChzdHJlYW0sIG9yaWdf Zm5hbWUsIHRjKTsNCiAJICBicmVhazsNCiANCisjaWZkZWYgSEFWRV9IREY1 DQorCWNhc2UgTFNfSERGNToNCisJICBuYW1lID0gcmVhZF9oZGY1X2RhdGEg KHN0cmVhbSwgb3JpZ19mbmFtZSwNCisJCQkJIGdsb2JhbCwgdGMsIGRvYywg aW1wb3J0KTsNCisJICBicmVhazsNCisjZW5kaWYgLyogSEFWRV9IREY1ICov DQorDQogCWRlZmF1bHQ6DQogCSAgZ3JpcGVfdW5yZWNvZ25pemVkX2RhdGFf Zm10ICgibG9hZCIpOw0KIAkgIGJyZWFrOw0KQEAgLTE2MTUsNyArMjI4MCw3 IEBADQogCSAgICB7DQogCSAgICAgIGlmIChmb3JtYXQgPT0gTFNfTUFUX0FT Q0lJICYmIGFyZ3ZfaWR4IDwgYXJnYykNCiAJCXdhcm5pbmcgKCJsb2FkOiBs b2FkZWQgQVNDSUkgZmlsZSBgJXMnIC0tIGlnbm9yaW5nIGV4dHJhIGFyZ3Mi LA0KLQkJCSBvcmlnX2ZuYW1lLmNfc3RyKCkpOw0KKwkJCSBvcmlnX2ZuYW1l LmNfc3RyICgpKTsNCiANCiAJICAgICAgaWYgKGZvcm1hdCA9PSBMU19NQVRf QVNDSUkNCiAJCSAgfHwgYXJndl9pZHggPT0gYXJnYw0KQEAgLTE2ODgsNiAr MjM1MywxOCBAQA0KICAgcmV0dXJuIHJldHZhbDsNCiB9DQogDQorLyogSERG NSBsb2FkL3NhdmUgZG9jdW1lbnRhdGlvbiBpcyBpbmNsdWRlZCBpbiB0aGUg T2N0YXZlIG1hbnVhbA0KKyAgIHJlZ2FyZGxlc3MsIGJ1dCBpZiBIREY1IGlz IG5vdCBsaW5rZWQgaW4gd2UgYWxzbyBpbmNsdWRlIGENCisgICBzZW50ZW5j ZSBub3RpbmcgdGhpcywgc28gdGhlIHVzZXIgdW5kZXJzdGFuZHMgdGhhdCB0 aGUgZmVhdHVyZXMNCisgICBhcmVuJ3QgYXZhaWxhYmxlLiAgRGVmaW5lIGEg bWFjcm8gZm9yIHRoaXMgc2VudGVuY2U6ICovDQorI2lmZGVmIEhBVkVfSERG NQ0KKyMgIGRlZmluZSBIQVZFX0hERjVfSEVMUF9TVFJJTkcgIiINCisjZWxz ZSAvKiAhIEhBVkVfSERGNSAqLw0KKyMgIGRlZmluZSBIQVZFX0hERjVfSEVM UF9TVFJJTkcgIlxuXA0KK0hERjUgbG9hZCBhbmQgc2F2ZSBhcmUgbm90IGF2 YWlsYWJsZSwgYXMgdGhpcyBPY3RhdmUgZXhlY3V0YWJsZSB3YXNcblwNCitu b3QgbGlua2VkIHdpdGggdGhlIEhERjUgbGlicmFyeS4iDQorI2VuZGlmIC8q ICEgSEFWRSBIREY1ICovDQorDQogREVGVU5fVEVYVCAobG9hZCwgYXJncywg bmFyZ291dCwNCiAgICItKi0gdGV4aW5mbyAtKi1cblwNCiBAZGVmZm4ge0Nv bW1hbmR9IGxvYWQgb3B0aW9ucyBmaWxlIHYxIHYyIEBkb3Rze31cblwNCkBA IC0xNzMyLDYgKzI0MDksMjYgQEANCiBcblwNCiBAaXRlbSAtbWF0LWJpbmFy eVxuXA0KIEZvcmNlIE9jdGF2ZSB0byBhc3N1bWUgdGhlIGZpbGUgaXMgaW4g QHNje01hdGxhYn0ncyBiaW5hcnkgZm9ybWF0LlxuXA0KK1xuXA0KK0BpdGVt IC1oZGY1XG5cDQorRm9yY2UgT2N0YXZlIHRvIGFzc3VtZSB0aGUgZmlsZSBp cyBpbiBIREY1IGZvcm1hdC5cblwNCisoSERGNSBpcyBhIGZyZWUsIHBvcnRh YmxlIGJpbmFyeSBmb3JtYXQgZGV2ZWxvcGVkIGJ5IHRoZSBOYXRpb25hbFxu XA0KK0NlbnRlciBmb3IgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zIGF0 IHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzLilcblwNCitOb3RlIHRoYXQg T2N0YXZlIGNhbiByZWFkIEhERjUgZmlsZXMgbm90IGNyZWF0ZWQgYnkgaXRz ZWxmLCBidXQgbWF5XG5cDQorc2tpcCBzb21lIGRhdGFzZXRzIGluIGZvcm1h dHMgdGhhdCBpdCBjYW5ub3Qgc3VwcG9ydC4gIEluIHBhcnRpY3VsYXIsXG5c DQoraXQgd2lsbCBza2lwIGRhdGFzZXRzIG9mIGRhdGEgdHlwZXMgdGhhdCBp dCBkb2VzIG5vdCByZWNvZ25pemUsIHdpdGhcblwNCitkaW1lbnNpb25hbGl0 eSA+IDIsIG9yIHdpdGggbmFtZXMgdGhhdCBhcmVuJ3QgdmFsaWQgT2N0YXZl IGlkZW50aWZpZXJzXG5cDQorU2VlLCBob3dldmVyLCB0aGUgQHNhbXB7LWlt cG9ydH0gb3B0aW9uIHRvIGFtZWxpb3JhdGUgdGhpcyBzb21ld2hhdC5cbiIN CisNCitIQVZFX0hERjVfSEVMUF9TVFJJTkcNCisNCisiXG5cDQorQGl0ZW0g LWltcG9ydFxuXA0KK01ha2UgYSBzdHJvbmdlciBhdHRlbXB0IHRvIGltcG9y dCBmb3JlaWduIGRhdGFzZXRzLiAgQ3VycmVudGx5LCB0aGlzIG1lYW5zXG5c DQordGhhdCBmb3IgSERGNSBmaWxlcywgaW52YWxpZCBjaGFyYWN0ZXJzIGlu IG5hbWVzIGFyZSBjb252ZXJ0ZWQgdG8gQHNhbXB7X30sXG5cDQorYW5kIGRh dGFzZXRzIHdpdGggZGltZW5zaW9uYWxpdHkgPiAyIGFyZSBpbXBvcnRlZCBh cyBsaXN0cyBvZiBtYXRyaWNlcyAob3JcblwNCitsaXN0cyBvZiBsaXN0cyBv ZiBtYXRyaWNlcywgb3IgLi4uKS5cblwNCitcblwNCiBAZW5kIHRhYmxlXG5c DQogQGVuZCBkZWZmbiIpDQogew0KQEAgLTE3NTMsNiArMjQ1MCw3IEBADQog ICBib29sIGZvcmNlID0gZmFsc2U7DQogICBib29sIGxpc3Rfb25seSA9IGZh bHNlOw0KICAgYm9vbCB2ZXJib3NlID0gZmFsc2U7DQorICBib29sIGltcG9y dCA9IGZhbHNlOw0KIA0KICAgaW50IGk7DQogICBmb3IgKGkgPSAxOyBpIDwg YXJnYzsgaSsrKQ0KQEAgLTE3ODEsNiArMjQ3OSwxOSBAQA0KIAl7DQogCSAg Zm9ybWF0ID0gTFNfTUFUX0JJTkFSWTsNCiAJfQ0KKyAgICAgIGVsc2UgaWYg KGFyZ3ZbaV0gPT0gIi1oZGY1IiB8fCBhcmd2W2ldID09ICItaCIpDQorCXsN CisjaWZkZWYgSEFWRV9IREY1DQorCSAgZm9ybWF0ID0gTFNfSERGNTsNCisj ZWxzZSAvKiAhIEhBVkVfSERGNSAqLw0KKwkgIGVycm9yICgibG9hZDogb2N0 YXZlIGV4ZWN1dGFibGUgd2FzIG5vdCBsaW5rZWQgd2l0aCBIREY1IGxpYnJh cnkiKTsNCisJICByZXR1cm4gcmV0dmFsOw0KKyNlbmRpZiAvKiAhIEhBVkVf SERGNSAqLw0KKwl9DQorICAgICAgZWxzZSBpZiAoYXJndltpXSA9PSAiLWlt cG9ydCIgfHwgYXJndltpXSA9PSAiLWkiKQ0KKwl7DQorCSAgaW1wb3J0ID0g dHJ1ZTsNCisJfQ0KICAgICAgIGVsc2UNCiAJYnJlYWs7DQogICAgIH0NCkBA IC0xODAxLDYgKzI1MTIsMTEgQEANCiAgICAgew0KICAgICAgIGkrKzsNCiAN CisjaWZkZWYgSEFWRV9IREY1DQorICAgICAgaWYgKGZvcm1hdCA9PSBMU19I REY1KQ0KKwllcnJvciAoImxvYWQ6IGNhbm5vdCByZWFkIEhERjUgZm9ybWF0 IGZyb20gc3RkaW4iKTsNCisgICAgICBlbHNlDQorI2VuZGlmIC8qIEhBVkVf SERGNSAqLw0KICAgICAgIGlmIChmb3JtYXQgIT0gTFNfVU5LTk9XTikNCiAJ ew0KIAkgIC8vIFhYWCBGSVhNRSBYWFggLS0gaWYgd2UgaGF2ZSBhbHJlYWR5 IHNlZW4gRU9GIG9uIGENCkBAIC0xODA5LDcgKzI1MjUsNyBAQA0KIAkgIC8v IGZpeCB0aGlzIHVzaW5nIGNpbiBvbmx5Lg0KIA0KIAkgIHJldHZhbCA9IGRv X2xvYWQgKGNpbiwgb3JpZ19mbmFtZSwgZm9yY2UsIGZvcm1hdCwgZmx0X2Zt dCwNCi0JCQkgICAgbGlzdF9vbmx5LCBzd2FwLCB2ZXJib3NlLCBhcmd2LCBp LCBhcmdjLA0KKwkJCSAgICBsaXN0X29ubHksIHN3YXAsIHZlcmJvc2UsIGlt cG9ydCwgYXJndiwgaSwgYXJnYywNCiAJCQkgICAgbmFyZ291dCk7DQogCX0N CiAgICAgICBlbHNlDQpAQCAtMTgyMiw2ICsyNTM4LDI0IEBADQogICAgICAg aWYgKGZvcm1hdCA9PSBMU19VTktOT1dOKQ0KIAlmb3JtYXQgPSBnZXRfZmls ZV9mb3JtYXQgKGZuYW1lLCBvcmlnX2ZuYW1lKTsNCiANCisjaWZkZWYgSEFW RV9IREY1DQorICAgICAgaWYgKGZvcm1hdCA9PSBMU19IREY1KSB7DQorCWkr KzsNCisJaGRmNV9pZnN0cmVhbSBoZGY1X2ZpbGUgKGZuYW1lLmNfc3RyICgp KTsNCisJaWYgKGhkZjVfZmlsZS5maWxlX2lkID49IDApIHsNCisJICByZXR2 YWwgPSBkb19sb2FkIChoZGY1X2ZpbGUsIG9yaWdfZm5hbWUsIGZvcmNlLCBm b3JtYXQsDQorCQkJICAgIGZsdF9mbXQsIGxpc3Rfb25seSwgc3dhcCwgdmVy Ym9zZSwgaW1wb3J0LA0KKwkJCSAgICBhcmd2LCBpLCBhcmdjLCBuYXJnb3V0 KTsNCisJICBoZGY1X2ZpbGUuY2xvc2UgKCk7DQorCX0NCisJZWxzZQ0KKwkg ICAgZXJyb3IgKCJsb2FkOiBjb3VsZG4ndCBvcGVuIGlucHV0IGZpbGUgYCVz JyIsDQorCQkgICBvcmlnX2ZuYW1lLmNfc3RyICgpKTsNCisgICAgICB9DQor ICAgICAgZWxzZQ0KKyNlbmRpZiAvKiBIQVZFX0hERjUgKi8NCisJLy8gZG9u J3QgaW5zZXJ0IGFueSBzdGF0ZW1lbnRzIGhlcmU7IHRoZSAiZWxzZSIgYWJv dmUgaGFzIHRvDQorCS8vIGdvIHdpdGggdGhlICJpZiIgYmVsb3chISEhIQ0K ICAgICAgIGlmIChmb3JtYXQgIT0gTFNfVU5LTk9XTikNCiAJew0KIAkgIGkr KzsNCkBAIC0xODQ0LDkgKzI1NzgsOCBAQA0KIAkJfQ0KIA0KIAkgICAgICBy ZXR2YWwgPSBkb19sb2FkIChmaWxlLCBvcmlnX2ZuYW1lLCBmb3JjZSwgZm9y bWF0LA0KLQkJCQlmbHRfZm10LCBsaXN0X29ubHksIHN3YXAsIHZlcmJvc2Us DQorCQkJCWZsdF9mbXQsIGxpc3Rfb25seSwgc3dhcCwgdmVyYm9zZSwgaW1w b3J0LA0KIAkJCQlhcmd2LCBpLCBhcmdjLCBuYXJnb3V0KTsNCi0NCiAJICAg ICAgZmlsZS5jbG9zZSAoKTsNCiAJICAgIH0NCiAJICBlbHNlDQpAQCAtMjA2 MCw2ICsyNzkzLDMxOSBAQA0KICAgcmV0dXJuIG9zOw0KIH0NCiANCisjaWZk ZWYgSEFWRV9IREY1DQorDQorLy8gQWRkIGFuIGF0dHJpYnV0ZSBuYW1lZCBh dHRyX25hbWUgdG8gbG9jX2lkIChhIHNpbXBsZSBzY2FsYXINCisvLyBhdHRy aWJ1dGUgd2l0aCB2YWx1ZSAxKS4gIFJldHVybiB2YWx1ZSBpcyA+PSAwIG9u IHN1Y2Nlc3MuDQorc3RhdGljIGhlcnJfdCBoZGY1X2FkZF9hdHRyKGhpZF90 IGxvY19pZCwgY29uc3QgY2hhciAqYXR0cl9uYW1lKQ0KK3sNCisgIGhlcnJf dCByZXR2YWwgPSAwOw0KKyAgaGlkX3QgYXNfaWQgPSBINVNjcmVhdGUgKEg1 U19TQ0FMQVIpOw0KKyAgaWYgKGFzX2lkID49IDApIHsNCisgICAgaGlkX3Qg YV9pZCA9IEg1QWNyZWF0ZSAobG9jX2lkLCBhdHRyX25hbWUsDQorCQkJICAg IEg1VF9OQVRJVkVfVUNIQVIsIGFzX2lkLCBINVBfREVGQVVMVCk7DQorICAg IGlmIChhX2lkID49IDApIHsNCisgICAgICB1bnNpZ25lZCBjaGFyIGF0dHJf dmFsID0gMTsNCisgICAgICByZXR2YWwgPSBINUF3cml0ZSAoYV9pZCwgSDVU X05BVElWRV9VQ0hBUiwgKHZvaWQqKSAmYXR0cl92YWwpOw0KKyAgICAgIEg1 QWNsb3NlIChhX2lkKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgcmV0 dmFsID0gYV9pZDsNCisgICAgSDVTY2xvc2UgKGFzX2lkKTsNCisgIH0NCisg IGVsc2UNCisgICAgcmV0dmFsID0gYXNfaWQ7DQorICByZXR1cm4gcmV0dmFs Ow0KK30NCisNCisNCisvLyBzYXZlX3R5cGVfdG9faGRmNSBpcyBub3QgY3Vy cmVudGx5IHVzZWQsIHNpbmNlIGhkZjUgZG9lc24ndCB5ZXQgc3VwcG9ydA0K Ky8vIGF1dG9tYXRpYyBmbG9hdDwtPmludGVnZXIgY29udmVyc2lvbnM6DQor I2lmIEhBVkVfSERGNV9JTlQyRkxPQVRfQ09OVkVSU0lPTlMNCisvKiByZXR1 cm4gdGhlIEhERjUgdHlwZSBpZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBPY3Rh dmUgc2F2ZV90eXBlICovDQorc3RhdGljIGhpZF90IHNhdmVfdHlwZV90b19o ZGY1IChzYXZlX3R5cGUgc3QpDQorew0KKyAgc3dpdGNoIChzdCkgew0KKyAg ICAgIGNhc2UgTFNfVV9DSEFSOg0KKwkgICByZXR1cm4gSDVUX05BVElWRV9V Q0hBUjsNCisgICAgICBjYXNlIExTX1VfU0hPUlQ6DQorCSAgIHJldHVybiBI NVRfTkFUSVZFX1VTSE9SVDsNCisgICAgICBjYXNlIExTX1VfSU5UOg0KKwkg ICByZXR1cm4gSDVUX05BVElWRV9VSU5UOw0KKyAgICAgIGNhc2UgTFNfQ0hB UjoNCisJICAgcmV0dXJuIEg1VF9OQVRJVkVfQ0hBUjsNCisgICAgICBjYXNl IExTX1NIT1JUOg0KKwkgICByZXR1cm4gSDVUX05BVElWRV9TSE9SVDsNCisg ICAgICBjYXNlIExTX0lOVDoNCisJICAgcmV0dXJuIEg1VF9OQVRJVkVfSU5U Ow0KKyAgICAgIGNhc2UgTFNfRkxPQVQ6DQorCSAgIHJldHVybiBINVRfTkFU SVZFX0ZMT0FUOw0KKyAgICAgIGNhc2UgTFNfRE9VQkxFOg0KKyAgICAgIGRl ZmF1bHQ6DQorCSAgIHJldHVybiBINVRfTkFUSVZFX0RPVUJMRTsNCisgIH0N Cit9DQorI2VuZGlmIC8qIEhBVkVfSERGNV9JTlQyRkxPQVRfQ09OVkVSU0lP TlMgKi8NCisNCisvKiBBZGQgdGhlIGRhdGEgZnJvbSBUQyB0byB0aGUgSERG NSBsb2NhdGlvbiBsb2NfaWQsIHdoaWNoIGNvdWxkDQorICAgYmUgZWl0aGVy IGEgZmlsZSBvciBhIGdyb3VwIHdpdGhpbiBhIGZpbGUuICBSZXR1cm4gdHJ1 ZSBpZiBzdWNjZXNzZnVsLg0KKyAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgaXRz ZWxmIHJlY3Vyc2l2ZWx5IGZvciBsaXN0cyAoc3RvcmVkIGFzIEhERjUgZ3Jv dXBzKS4gKi8NCitzdGF0aWMgYm9vbCBhZGRfaGRmNV9kYXRhIChoaWRfdCBs b2NfaWQsIGNvbnN0IG9jdGF2ZV92YWx1ZSYgdGMsDQorCQkJICBjb25zdCBz dHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgZG9jLA0KKwkJCSAgYm9vbCBt YXJrX2FzX2dsb2JhbCwgYm9vbCBzYXZlX2FzX2Zsb2F0cykNCit7DQorICBo c2l6ZV90IGRpbXNbM107DQorICBoaWRfdCB0eXBlX2lkID0gLTEsIHNwYWNl X2lkID0gLTEsIGRhdGFfaWQgPSAtMTsNCisgIGJvb2wgZGF0YV9pc19ncm91 cCA9IDA7DQorICBib29sIHJldHZhbCA9IDA7DQorDQorICBpZiAodGMuaXNf c3RyaW5nICgpKSB7DQorICAgIGludCBuciA9IHRjLnJvd3MgKCk7DQorICAg IGNoYXJNYXRyaXggY2htID0gdGMuY2hhcl9tYXRyaXhfdmFsdWUgKCk7DQor ICAgIGludCBuYyA9IGNobS5jb2xzICgpOw0KKyAgICAvLyBjcmVhdGUgZGF0 YXR5cGUgZm9yIChudWxsLXRlcm1pbmF0ZWQpIHN0cmluZyB0byB3cml0ZSBm cm9tOg0KKyAgICB0eXBlX2lkID0gSDVUY29weSAoSDVUX0NfUzEpOyBINVRz ZXRfc2l6ZSAodHlwZV9pZCwgbmMgKyAxKTsNCisgICAgaWYgKHR5cGVfaWQg PCAwKSBnb3RvIGVycm9yX2NsZWFudXA7DQorDQorICAgIGRpbXNbMF0gPSBu cjsNCisgICAgc3BhY2VfaWQgPSBINVNjcmVhdGVfc2ltcGxlIChuciA+IDAg PyAxIDogMCwgZGltcywgKGhzaXplX3QqKSBOVUxMKTsNCisgICAgaWYgKHNw YWNlX2lkIDwgMCkgZ290byBlcnJvcl9jbGVhbnVwOw0KKw0KKyAgICBkYXRh X2lkID0gSDVEY3JlYXRlIChsb2NfaWQsIG5hbWUuY19zdHIgKCksIA0KKwkJ CXR5cGVfaWQsIHNwYWNlX2lkLCBINVBfREVGQVVMVCk7DQorICAgIGlmIChk YXRhX2lkIDwgMCkgZ290byBlcnJvcl9jbGVhbnVwOw0KKw0KKyAgICBjaGFy ICpzID0gbmV3IGNoYXJbbnIgKiAobmMgKyAxKV07DQorICAgIGZvciAoaW50 IGkgPSAwOyBpIDwgbnI7ICsraSkgew0KKyAgICAgIHN0cmluZyB0c3RyID0g Y2htLnJvd19hc19zdHJpbmcgKGkpOw0KKyAgICAgIHN0cmNweSAocyArIGkg KiAobmMrMSksIHRzdHIuY19zdHIgKCkpOw0KKyAgICB9DQorDQorICAgIGlm IChINUR3cml0ZSAoZGF0YV9pZCwgdHlwZV9pZCwgSDVTX0FMTCwgSDVTX0FM TCwgSDVQX0RFRkFVTFQsDQorCQkgKHZvaWQqKSBzKSA8IDApIHsNCisgICAg ICBkZWxldGUgW10gczsNCisgICAgICBnb3RvIGVycm9yX2NsZWFudXA7DQor ICAgIH0NCisNCisgICAgZGVsZXRlIFtdIHM7DQorICB9DQorICBlbHNlIGlm ICh0Yy5pc19yYW5nZSAoKSkgew0KKyAgICBzcGFjZV9pZCA9IEg1U2NyZWF0 ZV9zaW1wbGUgKDAsIGRpbXMsIChoc2l6ZV90KikgTlVMTCk7DQorICAgIGlm IChzcGFjZV9pZCA8IDApIGdvdG8gZXJyb3JfY2xlYW51cDsNCisNCisgICAg dHlwZV9pZCA9IGhkZjVfbWFrZV9yYW5nZV90eXBlIChINVRfTkFUSVZFX0RP VUJMRSk7DQorICAgIGlmICh0eXBlX2lkIDwgMCkgZ290byBlcnJvcl9jbGVh bnVwOw0KKw0KKyAgICBkYXRhX2lkID0gSDVEY3JlYXRlIChsb2NfaWQsIG5h bWUuY19zdHIgKCksIA0KKwkJCXR5cGVfaWQsIHNwYWNlX2lkLCBINVBfREVG QVVMVCk7DQorICAgIGlmIChkYXRhX2lkIDwgMCkgZ290byBlcnJvcl9jbGVh bnVwOw0KKyAgICANCisgICAgUmFuZ2UgciA9IHRjLnJhbmdlX3ZhbHVlICgp Ow0KKyAgICBkb3VibGUgcmFuZ2VfdmFsc1szXTsNCisgICAgcmFuZ2VfdmFs c1swXSA9IHIuYmFzZSAoKTsNCisgICAgcmFuZ2VfdmFsc1sxXSA9IHIubGlt aXQgKCk7DQorICAgIHJhbmdlX3ZhbHNbMl0gPSByLmluYyAoKTsNCisNCisg ICAgaWYgKEg1RHdyaXRlIChkYXRhX2lkLCB0eXBlX2lkLCBINVNfQUxMLCBI NVNfQUxMLCBINVBfREVGQVVMVCwNCisJCSAodm9pZCopIHJhbmdlX3ZhbHMp IDwgMCkNCisgICAgICBnb3RvIGVycm9yX2NsZWFudXA7DQorICB9DQorICBl bHNlIGlmICh0Yy5pc19yZWFsX3NjYWxhciAoKSkgew0KKyAgICBzcGFjZV9p ZCA9IEg1U2NyZWF0ZV9zaW1wbGUgKDAsIGRpbXMsIChoc2l6ZV90KikgTlVM TCk7DQorICAgIGlmIChzcGFjZV9pZCA8IDApIGdvdG8gZXJyb3JfY2xlYW51 cDsNCisNCisgICAgZGF0YV9pZCA9IEg1RGNyZWF0ZSAobG9jX2lkLCBuYW1l LmNfc3RyICgpLCANCisJCQlINVRfTkFUSVZFX0RPVUJMRSwgc3BhY2VfaWQs IEg1UF9ERUZBVUxUKTsNCisgICAgaWYgKGRhdGFfaWQgPCAwKSBnb3RvIGVy cm9yX2NsZWFudXA7DQorDQorICAgIGRvdWJsZSB0bXAgPSB0Yy5kb3VibGVf dmFsdWUgKCk7DQorICAgIGlmIChINUR3cml0ZSAoZGF0YV9pZCwgSDVUX05B VElWRV9ET1VCTEUsIEg1U19BTEwsIEg1U19BTEwsIEg1UF9ERUZBVUxULA0K KwkJICh2b2lkKikgJnRtcCkgPCAwKQ0KKyAgICAgIGdvdG8gZXJyb3JfY2xl YW51cDsNCisgIH0NCisgIGVsc2UgaWYgKHRjLmlzX3JlYWxfbWF0cml4ICgp KSB7DQorICAgIE1hdHJpeCBtID0gdGMubWF0cml4X3ZhbHVlICgpOw0KKyAg ICBkaW1zWzFdID0gbS5yb3dzICgpOyAgICAvLyBPY3RhdmUgdXNlcyBjb2x1 bW4tbWFqb3IsIHdoaWxlDQorICAgIGRpbXNbMF0gPSBtLmNvbHVtbnMgKCk7 IC8vIEhERjUgdXNlcyByb3ctbWFqb3Igb3JkZXJpbmcNCisNCisgICAgc3Bh Y2VfaWQgPSBINVNjcmVhdGVfc2ltcGxlIChkaW1zWzFdID4gMSA/MjoxLCBk aW1zLCAoaHNpemVfdCopIE5VTEwpOw0KKyAgICBpZiAoc3BhY2VfaWQgPCAw KSBnb3RvIGVycm9yX2NsZWFudXA7DQorDQorICAgIGhpZF90IHNhdmVfdHlw ZV9pZCA9IEg1VF9OQVRJVkVfRE9VQkxFOw0KKyAgICBpZiAoc2F2ZV9hc19m bG9hdHMpIHsNCisgICAgICBpZiAobS50b29fbGFyZ2VfZm9yX2Zsb2F0ICgp KSB7DQorCXdhcm5pbmcgKCJzYXZlOiBzb21lIHZhbHVlcyB0b28gbGFyZ2Ug dG8gc2F2ZSBhcyBmbG9hdHMgLS0iKTsNCisJd2FybmluZyAoInNhdmU6IHNh dmluZyBhcyBkb3VibGVzIGluc3RlYWQiKTsNCisgICAgICB9DQorICAgICAg ZWxzZQ0KKwlzYXZlX3R5cGVfaWQgPSBINVRfTkFUSVZFX0ZMT0FUOw0KKyAg ICB9DQorI2lmIEhBVkVfSERGNV9JTlQyRkxPQVRfQ09OVkVSU0lPTlMNCisg IC8vIGhkZjUgY3VycmVudGx5IGRvZXNuJ3Qgc3VwcG9ydCBmbG9hdC9pbnRl Z2VyIGNvbnZlcnNpb25zDQorICAgIGVsc2Ugew0KKyAgICAgIGRvdWJsZSBt YXhfdmFsLCBtaW5fdmFsOw0KKyAgICAgIGlmIChtLmFsbF9pbnRlZ2VycyAo bWF4X3ZhbCwgbWluX3ZhbCkpDQorCXNhdmVfdHlwZV9pZCA9IHNhdmVfdHlw ZV90b19oZGY1IChnZXRfc2F2ZV90eXBlIChtYXhfdmFsLCBtaW5fdmFsKSk7 DQorICAgIH0NCisjZW5kaWYgLyogSEFWRV9IREY1X0lOVDJGTE9BVF9DT05W RVJTSU9OUyAqLw0KKw0KKyAgICBkYXRhX2lkID0gSDVEY3JlYXRlIChsb2Nf aWQsIG5hbWUuY19zdHIgKCksIA0KKwkJCXNhdmVfdHlwZV9pZCwgc3BhY2Vf aWQsIEg1UF9ERUZBVUxUKTsNCisgICAgaWYgKGRhdGFfaWQgPCAwKSBnb3Rv IGVycm9yX2NsZWFudXA7DQorICAgIA0KKyAgICBkb3VibGUgKm10bXAgPSBt LmZvcnRyYW5fdmVjICgpOw0KKyAgICBpZiAoSDVEd3JpdGUgKGRhdGFfaWQs IEg1VF9OQVRJVkVfRE9VQkxFLCBINVNfQUxMLCBINVNfQUxMLCBINVBfREVG QVVMVCwNCisJCSAodm9pZCopIG10bXApIDwgMCkNCisgICAgICBnb3RvIGVy cm9yX2NsZWFudXA7DQorICB9DQorICBlbHNlIGlmICh0Yy5pc19jb21wbGV4 X3NjYWxhciAoKSkgew0KKyAgICBzcGFjZV9pZCA9IEg1U2NyZWF0ZV9zaW1w bGUgKDAsIGRpbXMsIChoc2l6ZV90KikgTlVMTCk7DQorICAgIGlmIChzcGFj ZV9pZCA8IDApIGdvdG8gZXJyb3JfY2xlYW51cDsNCisNCisgICAgdHlwZV9p ZCA9IGhkZjVfbWFrZV9jb21wbGV4X3R5cGUgKEg1VF9OQVRJVkVfRE9VQkxF KTsNCisgICAgaWYgKHR5cGVfaWQgPCAwKSBnb3RvIGVycm9yX2NsZWFudXA7 DQorDQorICAgIGRhdGFfaWQgPSBINURjcmVhdGUgKGxvY19pZCwgbmFtZS5j X3N0ciAoKSwgDQorCQkJdHlwZV9pZCwgc3BhY2VfaWQsIEg1UF9ERUZBVUxU KTsNCisgICAgaWYgKGRhdGFfaWQgPCAwKSBnb3RvIGVycm9yX2NsZWFudXA7 DQorDQorICAgIENvbXBsZXggdG1wID0gdGMuY29tcGxleF92YWx1ZSAoKTsN CisgICAgaWYgKEg1RHdyaXRlIChkYXRhX2lkLCB0eXBlX2lkLCBINVNfQUxM LCBINVNfQUxMLCBINVBfREVGQVVMVCwNCisJCSAodm9pZCopIFhfQ0FTVCAo ZG91YmxlKiwgJnRtcCkpIDwgMCkNCisgICAgICBnb3RvIGVycm9yX2NsZWFu dXA7DQorICB9DQorICBlbHNlIGlmICh0Yy5pc19jb21wbGV4X21hdHJpeCAo KSkgew0KKyAgICBDb21wbGV4TWF0cml4IG0gPSB0Yy5jb21wbGV4X21hdHJp eF92YWx1ZSAoKTsNCisgICAgZGltc1sxXSA9IG0ucm93cyAoKTsgICAgLy8g T2N0YXZlIHVzZXMgY29sdW1uLW1ham9yLCB3aGlsZQ0KKyAgICBkaW1zWzBd ID0gbS5jb2x1bW5zICgpOyAvLyBIREY1IHVzZXMgcm93LW1ham9yIG9yZGVy aW5nDQorDQorICAgIHNwYWNlX2lkID0gSDVTY3JlYXRlX3NpbXBsZSAoZGlt c1sxXSA+IDEgPzI6MSwgZGltcywgKGhzaXplX3QqKSBOVUxMKTsNCisgICAg aWYgKHNwYWNlX2lkIDwgMCkgZ290byBlcnJvcl9jbGVhbnVwOw0KKw0KKyAg ICBoaWRfdCBzYXZlX3R5cGVfaWQgPSBINVRfTkFUSVZFX0RPVUJMRTsNCisg ICAgaWYgKHNhdmVfYXNfZmxvYXRzKSB7DQorICAgICAgaWYgKG0udG9vX2xh cmdlX2Zvcl9mbG9hdCAoKSkgew0KKwl3YXJuaW5nICgic2F2ZTogc29tZSB2 YWx1ZXMgdG9vIGxhcmdlIHRvIHNhdmUgYXMgZmxvYXRzIC0tIik7DQorCXdh cm5pbmcgKCJzYXZlOiBzYXZpbmcgYXMgZG91YmxlcyBpbnN0ZWFkIik7DQor ICAgICAgfQ0KKyAgICAgIGVsc2UNCisJc2F2ZV90eXBlX2lkID0gSDVUX05B VElWRV9GTE9BVDsNCisgICAgfQ0KKyNpZiBIQVZFX0hERjVfSU5UMkZMT0FU X0NPTlZFUlNJT05TDQorICAgIC8vIGhkZjUgY3VycmVudGx5IGRvZXNuJ3Qg c3VwcG9ydCBmbG9hdC9pbnRlZ2VyIGNvbnZlcnNpb25zDQorICAgIGVsc2Ug ew0KKyAgICAgIGRvdWJsZSBtYXhfdmFsLCBtaW5fdmFsOw0KKyAgICAgIGlm IChtLmFsbF9pbnRlZ2VycyAobWF4X3ZhbCwgbWluX3ZhbCkpDQorCXNhdmVf dHlwZV9pZCA9IHNhdmVfdHlwZV90b19oZGY1IChnZXRfc2F2ZV90eXBlICht YXhfdmFsLCBtaW5fdmFsKSk7DQorICAgIH0NCisjZW5kaWYgLyogSEFWRV9I REY1X0lOVDJGTE9BVF9DT05WRVJTSU9OUyAqLw0KKw0KKyAgICB0eXBlX2lk ID0gaGRmNV9tYWtlX2NvbXBsZXhfdHlwZSAoc2F2ZV90eXBlX2lkKTsNCisg ICAgaWYgKHR5cGVfaWQgPCAwKSBnb3RvIGVycm9yX2NsZWFudXA7DQorDQor ICAgIGRhdGFfaWQgPSBINURjcmVhdGUgKGxvY19pZCwgbmFtZS5jX3N0ciAo KSwgDQorCQkJdHlwZV9pZCwgc3BhY2VfaWQsIEg1UF9ERUZBVUxUKTsNCisg ICAgaWYgKGRhdGFfaWQgPCAwKSBnb3RvIGVycm9yX2NsZWFudXA7DQorICAg IA0KKyAgICBoaWRfdCBjb21wbGV4X3R5cGVfaWQgPSBoZGY1X21ha2VfY29t cGxleF90eXBlIChINVRfTkFUSVZFX0RPVUJMRSk7DQorICAgIGlmIChjb21w bGV4X3R5cGVfaWQgPCAwKSBnb3RvIGVycm9yX2NsZWFudXA7DQorICAgIENv bXBsZXggKm10bXAgPSBtLmZvcnRyYW5fdmVjICgpOw0KKyAgICBpZiAoSDVE d3JpdGUgKGRhdGFfaWQsIGNvbXBsZXhfdHlwZV9pZCwgSDVTX0FMTCwgSDVT X0FMTCwgSDVQX0RFRkFVTFQsDQorCQkgKHZvaWQqKSBYX0NBU1QgKGRvdWJs ZSAqLCBtdG1wKSkgPCAwKSB7DQorICAgICAgSDVUY2xvc2UgKGNvbXBsZXhf dHlwZV9pZCk7DQorICAgICAgZ290byBlcnJvcl9jbGVhbnVwOw0KKyAgICB9 DQorICAgIEg1VGNsb3NlIChjb21wbGV4X3R5cGVfaWQpOw0KKyAgfQ0KKyAg ZWxzZSBpZiAodGMuaXNfbGlzdCAoKSkgew0KKyAgICAgICBkYXRhX2lkID0g SDVHY3JlYXRlIChsb2NfaWQsIG5hbWUuY19zdHIgKCksIDApOw0KKyAgICAg ICBpZiAoZGF0YV9pZCA8IDApIGdvdG8gZXJyb3JfY2xlYW51cDsNCisgICAg ICAgZGF0YV9pc19ncm91cCA9IDE7DQorDQorICAgICAgIC8vIHJlY3Vyc2l2 ZWx5IGFkZCBlYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QgdG8gdGhpcyBncm91 cA0KKyAgICAgICBvY3RhdmVfdmFsdWVfbGlzdCBsc3QgPSB0Yy5saXN0X3Zh bHVlICgpOw0KKyAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxzdC5sZW5n dGggKCk7ICsraSkgew0KKwkgICAgLy8gc2hvdWxkIHdlIHVzZSBsc3QubmFt ZV90YWdzICgpIHRvIGxhYmVsIHRoZSBlbGVtZW50cz8NCisJICAgIGNoYXIg c1syMF07DQorCSAgICBzcHJpbnRmIChzLCAiJWQiLCBpKTsNCisJICAgIGJv b2wgcmV0dmFsMiA9IGFkZF9oZGY1X2RhdGEgKGRhdGFfaWQsIGxzdCAoaSks IHMsICIiLA0KKwkJCQkJIGZhbHNlLCBzYXZlX2FzX2Zsb2F0cyk7DQorCSAg ICBpZiAoIXJldHZhbDIpDQorCQkgZ290byBlcnJvcl9jbGVhbnVwOw0KKyAg ICAgICB9DQorDQorICAgICAgIC8vIG1hcmsgd2l0aCBhbiBhdHRyaWJ1dGUg Ik9DVEFWRV9MSVNUIiB3aXRoIHZhbHVlIDENCisgICAgICAgLy8gdG8gZGlz dGluZ3Vpc2ggZnJvbSBzdHJ1Y3R1cmVzIChhbHNvIHN0b3JlZCBhcyBIREY1 IGdyb3Vwcyk6DQorICAgICAgIGlmIChoZGY1X2FkZF9hdHRyKGRhdGFfaWQs ICJPQ1RBVkVfTElTVCIpIDwgMCkNCisJIGdvdG8gZXJyb3JfY2xlYW51cDsN CisgIH0NCisgIGVsc2UgaWYgKHRjLmlzX21hcCAoKSkgeyAvKiBhbiBPY3Rh dmUgc3RydWN0dXJlICovDQorICAgICAgIGRhdGFfaWQgPSBINUdjcmVhdGUg KGxvY19pZCwgbmFtZS5jX3N0ciAoKSwgMCk7DQorICAgICAgIGlmIChkYXRh X2lkIDwgMCkgZ290byBlcnJvcl9jbGVhbnVwOw0KKyAgICAgICBkYXRhX2lz X2dyb3VwID0gMTsNCisNCisgICAgICAgLy8gcmVjdXJzaXZlbHkgYWRkIGVh Y2ggZWxlbWVudCBvZiB0aGUgc3RydWN0dXJlIHRvIHRoaXMgZ3JvdXANCisg ICAgICAgT2N0YXZlX21hcCBtID0gdGMubWFwX3ZhbHVlICgpOw0KKyAgICAg ICBQaXggaSA9IG0uZmlyc3QgKCk7DQorICAgICAgIHdoaWxlIChpKSB7DQor CSAgICBib29sIHJldHZhbDIgPSBhZGRfaGRmNV9kYXRhIChkYXRhX2lkLCAN CisJCQkJCSAgbS5jb250ZW50cyAoaSksIG0ua2V5IChpKSwgIiIsDQorCQkJ CQkgIGZhbHNlLCBzYXZlX2FzX2Zsb2F0cyk7DQorCSAgICBpZiAoIXJldHZh bDIpDQorCQkgZ290byBlcnJvcl9jbGVhbnVwOw0KKwkgICAgbS5uZXh0IChp KTsgLyogYWR2YW5jZSBpIHRvIG5leHQgZWxlbWVudCwgb3IgMCAqLw0KKyAg ICAgICB9DQorICB9DQorICBlbHNlIHsNCisgICAgZ3JpcGVfd3JvbmdfdHlw ZV9hcmcgKCJzYXZlIiwgdGMsIGZhbHNlKTsNCisgICAgZ290byBlcnJvcl9j bGVhbnVwOw0KKyAgfQ0KKw0KKyAgLy8gYXR0YWNoIGRvYyBzdHJpbmcgYXMg Y29tbWVudDoNCisgIGlmIChkb2MubGVuZ3RoICgpID4gMCAmJg0KKyAgICAg IEg1R3NldF9jb21tZW50IChsb2NfaWQsIG5hbWUuY19zdHIgKCksIGRvYy5j X3N0ciAoKSkgPCAwKQ0KKyAgICBnb3RvIGVycm9yX2NsZWFudXA7DQorDQor ICByZXR2YWwgPSAxOw0KKw0KKyAgLy8gaWYgaXQncyBnbG9iYWwsIGFkZCBh biBhdHRyaWJ1dGUgIk9DVEFWRV9HTE9CQUwiIHdpdGggdmFsdWUgMQ0KKyAg aWYgKG1hcmtfYXNfZ2xvYmFsKSB7DQorICAgIHJldHZhbCA9IGhkZjVfYWRk X2F0dHIoZGF0YV9pZCwgIk9DVEFWRV9HTE9CQUwiKSA+PSAwOw0KKyAgfQ0K Kw0KKyBlcnJvcl9jbGVhbnVwOg0KKyAgaWYgKCFyZXR2YWwpIHsNCisgICAg ICAgZXJyb3IgKCJzYXZlOiBlcnJvciB3aGlsZSB3cml0aW5nIGAlcycgdG8g aGRmNSBmaWxlIiwgbmFtZS5jX3N0ciAoKSk7DQorICB9DQorDQorICBpZiAo ZGF0YV9pZCA+PSAwKSB7DQorICAgICAgIGlmIChkYXRhX2lzX2dyb3VwKQ0K KwkgICAgSDVHY2xvc2UgKGRhdGFfaWQpOw0KKyAgICAgICBlbHNlDQorCSAg ICBINURjbG9zZSAoZGF0YV9pZCk7DQorICB9DQorICBpZiAoc3BhY2VfaWQg Pj0gMCkNCisgICAgSDVTY2xvc2UgKHNwYWNlX2lkKTsNCisgIGlmICh0eXBl X2lkID49IDApDQorICAgIEg1VGNsb3NlICh0eXBlX2lkKTsNCisNCisgIHJl dHVybiByZXR2YWw7DQorfQ0KKw0KKy8vIFdyaXRlIGRhdGEgZnJvbSBUQyBp biBIREY1IChiaW5hcnkpIGZvcm1hdCB0byB0aGUgc3RyZWFtIE9TLA0KKy8v IHdoaWNoIG11c3QgYmUgYW4gaGRmNV9vZnN0cmVhbSwgcmV0dXJuaW5nIHRy dWUgb24gc3VjY2Vzcy4NCitzdGF0aWMgYm9vbA0KK3NhdmVfaGRmNV9kYXRh IChvc3RyZWFtJiBvcywgY29uc3Qgb2N0YXZlX3ZhbHVlJiB0YywNCisJCWNv bnN0IHN0cmluZyYgbmFtZSwgY29uc3Qgc3RyaW5nJiBkb2MsDQorCQlib29s IG1hcmtfYXNfZ2xvYmFsLCBib29sIHNhdmVfYXNfZmxvYXRzKQ0KK3sNCisg IGhkZjVfb2ZzdHJlYW0mIGhzID0gKGhkZjVfb2ZzdHJlYW0mKSBvczsNCisg IHJldHVybiBhZGRfaGRmNV9kYXRhIChocy5maWxlX2lkLCB0YywgbmFtZSwg ZG9jLA0KKwkJICAgICAgIG1hcmtfYXNfZ2xvYmFsLCBzYXZlX2FzX2Zsb2F0 cyk7DQorfQ0KKw0KKyNlbmRpZiAvKiBIQVZFX0hERjUgKi8NCisNCiAvLyBT YXZlIHRoZSBkYXRhIGZyb20gVEMgYWxvbmcgd2l0aCB0aGUgY29ycmVzcG9u ZGluZyBOQU1FIG9uIHN0cmVhbSBPUyANCiAvLyBpbiB0aGUgTWF0TGFiIGJp bmFyeSBmb3JtYXQuDQogDQpAQCAtMjEzNiw5ICszMTgyLDkgQEANCiAgIGVs c2UgaWYgKHRjLmlzX2NvbXBsZXhfbWF0cml4ICgpKQ0KICAgICB7DQogICAg ICAgQ29tcGxleE1hdHJpeCBtX2NtcGx4ID0gdGMuY29tcGxleF9tYXRyaXhf dmFsdWUgKCk7DQotICAgICAgTWF0cml4IG0gPSA6OnJlYWwobV9jbXBseCk7 DQorICAgICAgTWF0cml4IG0gPSA6OnJlYWwgKG1fY21wbHgpOw0KICAgICAg IG9zLndyaXRlIChtLmRhdGEgKCksIDggKiBsZW4pOw0KLSAgICAgIG0gPSA6 OmltYWcobV9jbXBseCk7DQorICAgICAgbSA9IDo6aW1hZyAobV9jbXBseCk7 DQogICAgICAgb3Mud3JpdGUgKG0uZGF0YSAoKSwgOCAqIGxlbik7DQogICAg IH0NCiAgIGVsc2UNCkBAIC0yNDAwLDYgKzM0NDYsMTIgQEANCiAgICAgICBz YXZlX21hdF9iaW5hcnlfZGF0YSAob3MsIHRjLCBuYW1lKTsNCiAgICAgICBi cmVhazsNCiANCisjaWZkZWYgSEFWRV9IREY1DQorICAgIGNhc2UgTFNfSERG NToNCisgICAgICBzYXZlX2hkZjVfZGF0YSAob3MsIHRjLCBuYW1lLCBoZWxw LCBnbG9iYWwsIHNhdmVfYXNfZmxvYXRzKTsNCisgICAgICBicmVhazsNCisj ZW5kaWYgLyogSEFWRV9IREY1ICovDQorDQogICAgIGRlZmF1bHQ6DQogICAg ICAgZ3JpcGVfdW5yZWNvZ25pemVkX2RhdGFfZm10ICgic2F2ZSIpOw0KICAg ICAgIGJyZWFrOw0KQEAgLTI0MjEsNyArMzQ3Myw3IEBADQogDQogICBmb3Ig KGludCBpID0gMDsgaSA8IHNhdmVkOyBpKyspDQogICAgIHsNCi0gICAgICBk b19zYXZlIChvcywgdmFycyhpKSwgZm10LCBzYXZlX2FzX2Zsb2F0cyk7DQor ICAgICAgZG9fc2F2ZSAob3MsIHZhcnMgKGkpLCBmbXQsIHNhdmVfYXNfZmxv YXRzKTsNCiANCiAgICAgICBpZiAoZXJyb3Jfc3RhdGUpDQogCWJyZWFrOw0K QEAgLTI0MzgsNyArMzQ5MCw3IEBADQogDQogICAgICAgZm9yIChpbnQgaSA9 IDA7IGkgPCBjb3VudDsgaSsrKQ0KIAl7DQotCSAgZG9fc2F2ZSAob3MsIHZh cnMoaSksIGZtdCwgc2F2ZV9hc19mbG9hdHMpOw0KKwkgIGRvX3NhdmUgKG9z LCB2YXJzIChpKSwgZm10LCBzYXZlX2FzX2Zsb2F0cyk7DQogDQogCSAgaWYg KGVycm9yX3N0YXRlKQ0KIAkgICAgYnJlYWs7DQpAQCAtMjQ1OSw2ICszNTEx LDEwIEBADQogICAgIHJldHZhbCA9IExTX0JJTkFSWTsNCiAgIGVsc2UgaWYg KGZtdCA9PSAibWF0LWJpbmFyeSIgfHwgZm10ID09Im1hdF9iaW5hcnkiKQ0K ICAgICByZXR2YWwgPSBMU19NQVRfQklOQVJZOw0KKyNpZmRlZiBIQVZFX0hE RjUNCisgIGVsc2UgaWYgKGZtdCA9PSAiaGRmNSIpDQorICAgIHJldHZhbCA9 IExTX0hERjU7DQorI2VuZGlmIC8qIEhBVkVfSERGNSAqLw0KICAgICAgIA0K ICAgcmV0dXJuIHJldHZhbDsNCiB9DQpAQCAtMjQ4MiwxOSArMzUzOCw0MiBA QA0KICAgICAgIH0NCiAgICAgYnJlYWs7DQogDQorI2lmZGVmIEhBVkVfSERG NQ0KKyAgICBjYXNlIExTX0hERjU6DQorI2VuZGlmIC8qIEhBVkVfSERGNSAq Lw0KICAgICBjYXNlIExTX0FTQ0lJOg0KICAgICAgIHsNCiAJb2N0YXZlX2dt dGltZSBub3c7DQogCXN0cmluZyB0aW1lX3N0cmluZyA9IG5vdy5hc2N0aW1l ICgpOw0KIAl0aW1lX3N0cmluZyA9IHRpbWVfc3RyaW5nLnN1YnN0ciAoMCwg dGltZV9zdHJpbmcubGVuZ3RoICgpIC0gMSk7DQotDQotCW9zIDw8ICIjIENy ZWF0ZWQgYnkgT2N0YXZlICIgT0NUQVZFX1ZFUlNJT04gIiwgIg0KKwlvc3Ry ZWFtICpzID0gJm9zOw0KKyNpZmRlZiBIQVZFX0hERjUNCisJLy8gZm9yIEhE RjUsIHdyaXRlIGRhdGEgdG8gYSBzdHJpbmcgaW5zdGVhZCBvZiB0byBvcywN CisJLy8gYW5kIHRoZW4gc2F2ZSB0aGUgc3RyaW5nIGFzIHRoZSBIREY1IGZp bGUncyAiY29tbWVudCIgZmllbGQuDQorCW9zdHJzdHJlYW0gc3M7DQorCWlm IChmb3JtYXQgPT0gTFNfSERGNSkNCisJICAgICBzID0gJnNzOw0KKyNlbmRp ZiAvKiBIQVZFX0hERjUgKi8NCisJDQorCSpzIDw8ICIjIENyZWF0ZWQgYnkg T2N0YXZlICIgT0NUQVZFX1ZFUlNJT04gIiwgIg0KIAkgICA8PCB0aW1lX3N0 cmluZw0KIAkgICA8PCAiIDwiDQogCSAgIDw8IG9jdGF2ZV9lbnY6OmdldF91 c2VyX25hbWUgKCkNCiAJICAgPDwgIkAiDQogCSAgIDw8IG9jdGF2ZV9lbnY6 OmdldF9ob3N0X25hbWUgKCkNCi0JICAgPDwgIj4iIDw8ICJcbiI7DQorCSAg IDw8ICI+IjsNCisJDQorI2lmZGVmIEhBVkVfSERGNQ0KKwlpZiAoZm9ybWF0 ICE9IExTX0hERjUpICAvLyBkb24ndCBhcHBlbmQgbmV3bGluZSBmb3IgSERG NQ0KKyNlbmRpZiAvKiBIQVZFX0hERjUgKi8NCisJICAqcyA8PCAiXG4iOw0K Kw0KKyNpZmRlZiBIQVZFX0hERjUNCisJaWYgKGZvcm1hdCA9PSBMU19IREY1 KSB7DQorCSAgaGRmNV9vZnN0cmVhbSYgaHMgPSAoaGRmNV9vZnN0cmVhbSYp IG9zOw0KKwkgIEg1R3NldF9jb21tZW50IChocy5maWxlX2lkLCAiLyIsIHNz LnN0ciAoKSk7DQorCX0NCisjZW5kaWYgLyogSEFWRV9IREY1ICovDQogICAg ICAgfQ0KICAgICBicmVhazsNCiANCkBAIC0yNTQ0LDE1ICszNjIzLDM1IEBA DQogICAgICAgaWYgKGZvcm1hdCA9PSBMU19CSU5BUlkgfHwgZm9ybWF0ID09 IExTX01BVF9CSU5BUlkpDQogCW1vZGUgfD0gaW9zOjpiaW47DQogDQotICAg ICAgb2ZzdHJlYW0gZmlsZSAoZm5hbWUsIG1vZGUpOw0KLQ0KLSAgICAgIGlm IChmaWxlKQ0KLQl7DQotCSAgc2F2ZV92YXJzIChzdHJpbmdfdmVjdG9yICgp LCAwLCAwLCBmaWxlLCBmYWxzZSwgZm9ybWF0LCBmYWxzZSwgdHJ1ZSk7DQor I2lmZGVmIEhBVkVfSERGNQ0KKyAgICAgIGlmIChmb3JtYXQgPT0gTFNfSERG NSkgew0KKwloZGY1X29mc3RyZWFtIGZpbGUgKGZuYW1lKTsNCisJaWYgKGZp bGUuZmlsZV9pZCA+PSAwKSB7DQorCSAgc2F2ZV92YXJzIChzdHJpbmdfdmVj dG9yICgpLCAwLCAwLCBmaWxlLA0KKwkJICAgICBmYWxzZSwgZm9ybWF0LCBm YWxzZSwgdHJ1ZSk7DQogCSAgbWVzc2FnZSAoMCwgInNhdmUgdG8gYCVzJyBj b21wbGV0ZSIsIGZuYW1lKTsNCisJICBmaWxlLmNsb3NlICgpOw0KIAl9DQog ICAgICAgZWxzZQ0KIAl3YXJuaW5nICgidW5hYmxlIHRvIG9wZW4gYCVzJyBm b3Igd3JpdGluZy4uLiIsIGZuYW1lKTsNCisgICAgICB9DQorICAgICAgZWxz ZQ0KKyNlbmRpZiAvKiBIQVZFX0hERjUgKi8NCisJLy8gZG9uJ3QgaW5zZXJ0 IGFueSBjb21tYW5kcyBoZXJlISAgVGhlIG9wZW4gYnJhY2UgYmVsb3cgbXVz dA0KKwkvLyBnbyB3aXRoIHRoZSBlbHNlIGFib3ZlIQ0KKwl7DQorCSAgb2Zz dHJlYW0gZmlsZSAoZm5hbWUsIG1vZGUpOw0KKwkgIA0KKwkgIGlmIChmaWxl KQ0KKwkgICAgew0KKwkgICAgICBzYXZlX3ZhcnMgKHN0cmluZ192ZWN0b3Ig KCksIDAsIDAsIGZpbGUsDQorCQkJIGZhbHNlLCBmb3JtYXQsIGZhbHNlLCB0 cnVlKTsNCisJICAgICAgbWVzc2FnZSAoMCwgInNhdmUgdG8gYCVzJyBjb21w bGV0ZSIsIGZuYW1lKTsNCisJICAgICAgZmlsZS5jbG9zZSAoKTsNCisJICAg IH0NCisJICBlbHNlDQorCSAgICB3YXJuaW5nICgidW5hYmxlIHRvIG9wZW4g YCVzJyBmb3Igd3JpdGluZy4uLiIsIGZuYW1lKTsNCisJfQ0KICAgICB9DQog fQ0KIA0KQEAgLTI1ODIsNiArMzY4MSwxOSBAQA0KIEBpdGVtIC1tYXQtYmlu YXJ5XG5cDQogU2F2ZSB0aGUgZGF0YSBpbiBAc2N7TWF0bGFifSdzIGJpbmFy eSBkYXRhIGZvcm1hdC5cblwNCiBcblwNCitAaXRlbSAtaGRmNVxuXA0KK1Nh dmUgdGhlIGRhdGEgaW4gSERGNSBmb3JtYXQuXG5cDQorKEhERjUgaXMgYSBm cmVlLCBwb3J0YWJsZSBiaW5hcnkgZm9ybWF0IGRldmVsb3BlZCBieSB0aGUg TmF0aW9uYWxcblwNCitDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxp Y2F0aW9ucyBhdCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcy4pXG4iDQor DQorSEFWRV9IREY1X0hFTFBfU1RSSU5HDQorDQorIlxuXA0KK0BpdGVtIC1m bG9hdC1oZGY1XG5cDQorU2F2ZSB0aGUgZGF0YSBpbiBIREY1IGZvcm1hdCBi dXQgb25seSB1c2luZyBzaW5nbGUgcHJlY2lzaW9uLlxuXA0KK1lvdSBzaG91 bGQgdXNlIHRoaXMgZm9ybWF0IG9ubHkgaWYgeW91IGtub3cgdGhhdCBhbGwg dGhlXG5cDQordmFsdWVzIHRvIGJlIHNhdmVkIGNhbiBiZSByZXByZXNlbnRl ZCBpbiBzaW5nbGUgcHJlY2lzaW9uLlxuXA0KK1xuXA0KIEBpdGVtIC1zYXZl LWJ1aWx0aW5zXG5cDQogRm9yY2UgT2N0YXZlIHRvIHNhdmUgdGhlIHZhbHVl cyBvZiBidWlsdC1pbiB2YXJpYWJsZXMgdG9vLiAgQnkgZGVmYXVsdCxcblwN CiBPY3RhdmUgZG9lcyBub3Qgc2F2ZSBidWlsdC1pbiB2YXJpYWJsZXMuXG5c DQpAQCAtMjY1NCw2ICszNzY2LDE1IEBADQogCXsNCiAJICBmb3JtYXQgPSBM U19CSU5BUlk7DQogCX0NCisgICAgICBlbHNlIGlmIChhcmd2W2ldID09ICIt aGRmNSIgfHwgYXJndltpXSA9PSAiLWgiKQ0KKwl7DQorI2lmZGVmIEhBVkVf SERGNQ0KKwkgIGZvcm1hdCA9IExTX0hERjU7DQorI2Vsc2UgLyogISBIQVZF X0hERjUgKi8NCisJICBlcnJvciAoInNhdmU6IG9jdGF2ZSBleGVjdXRhYmxl IHdhcyBub3QgbGlua2VkIHdpdGggSERGNSBsaWJyYXJ5Iik7DQorCSAgcmV0 dXJuIHJldHZhbDsNCisjZW5kaWYgLyogISBIQVZFX0hERjUgKi8NCisJfQ0K ICAgICAgIGVsc2UgaWYgKGFyZ3ZbaV0gPT0gIi1tYXQtYmluYXJ5IiB8fCBh cmd2W2ldID09ICItbSIpDQogCXsNCiAJICBmb3JtYXQgPSBMU19NQVRfQklO QVJZOw0KQEAgLTI2NjMsNiArMzc4NCwxNiBAQA0KIAkgIGZvcm1hdCA9IExT X0JJTkFSWTsNCiAJICBzYXZlX2FzX2Zsb2F0cyA9IHRydWU7DQogCX0NCisg ICAgICBlbHNlIGlmIChhcmd2W2ldID09ICItZmxvYXQtaGRmNSIpDQorCXsN CisjaWZkZWYgSEFWRV9IREY1DQorCSAgZm9ybWF0ID0gTFNfSERGNTsNCisJ ICBzYXZlX2FzX2Zsb2F0cyA9IHRydWU7DQorI2Vsc2UgLyogISBIQVZFX0hE RjUgKi8NCisJICBlcnJvciAoInNhdmU6IG9jdGF2ZSBleGVjdXRhYmxlIHdh cyBub3QgbGlua2VkIHdpdGggSERGNSBsaWJyYXJ5Iik7DQorCSAgcmV0dXJu IHJldHZhbDsNCisjZW5kaWYgLyogISBIQVZFX0hERjUgKi8NCisJfQ0KICAg ICAgIGVsc2UgaWYgKGFyZ3ZbaV0gPT0gIi1zYXZlLWJ1aWx0aW5zIikNCiAJ ew0KIAkgIHNhdmVfYnVpbHRpbnMgPSB0cnVlOw0KQEAgLTI2ODcsMTEgKzM4 MTgsMjAgQEANCiAgICAgew0KICAgICAgIGkrKzsNCiANCi0gICAgICAvLyBY WFggRklYTUUgWFhYIC0tIHNob3VsZCB0aGluZ3MgaW50ZW5kZWQgZm9yIHRo ZSBzY3JlZW4gZW5kIHVwDQotICAgICAgLy8gaW4gYSBvY3RhdmVfdmFsdWUg KHN0cmluZyk/DQotDQotICAgICAgc2F2ZV92YXJzIChhcmd2LCBpLCBhcmdj LCBvY3RhdmVfc3Rkb3V0LCBzYXZlX2J1aWx0aW5zLCBmb3JtYXQsDQotCQkg c2F2ZV9hc19mbG9hdHMsIHRydWUpOw0KKyNpZmRlZiBIQVZFX0hERjUNCisg ICAgICBpZiAoZm9ybWF0ID09IExTX0hERjUpDQorICAgICAgICBlcnJvciAo ImxvYWQ6IGNhbm5vdCB3cml0ZSBIREY1IGZvcm1hdCB0byBzdGRvdXQiKTsN CisgICAgICBlbHNlDQorI2VuZGlmIC8qIEhBVkVfSERGNSAqLw0KKwkvLyBk b24ndCBpbnNlcnQgYW55IGNvbW1hbmRzIGhlcmUhICB0aGUgYnJhY2UgYmVs b3cgbXVzdCBnbw0KKwkvLyB3aXRoIHRoZSAiZWxzZSIgYWJvdmUhDQorCXsN CisJICAvLyBYWFggRklYTUUgWFhYIC0tIHNob3VsZCB0aGluZ3MgaW50ZW5k ZWQgZm9yIHRoZSBzY3JlZW4gZW5kIHVwDQorCSAgLy8gaW4gYSBvY3RhdmVf dmFsdWUgKHN0cmluZyk/DQorCSAgDQorCSAgc2F2ZV92YXJzIChhcmd2LCBp LCBhcmdjLCBvY3RhdmVfc3Rkb3V0LCBzYXZlX2J1aWx0aW5zLCBmb3JtYXQs DQorCQkgICAgIHNhdmVfYXNfZmxvYXRzLCB0cnVlKTsNCisJfQ0KICAgICB9 DQogDQogICAvLyBHdWFyZCBhZ2FpbnN0IHRoaW5ncyBsaWtlIGBzYXZlIGEq Jywgd2hpY2ggYXJlIHByb2JhYmx5IG1pc3Rha2VzLi4uDQpAQCAtMjcxMiwy MSArMzg1Miw0MCBAQA0KIAltb2RlIHw9IGlvczo6YmluOw0KIA0KICAgICAg IG1vZGUgfD0gYXBwZW5kID8gaW9zOjphdGUgOiBpb3M6OnRydW5jOw0KLQ0K LSAgICAgIG9mc3RyZWFtIGZpbGUgKGZuYW1lLmNfc3RyICgpLCBtb2RlKTsN CiANCi0gICAgICBpZiAoZmlsZSkNCi0Jew0KLQkgIGJvb2wgd3JpdGVfaGVh ZGVyX2luZm8NCi0JICAgID0gKChmaWxlLnJkYnVmICgpKS0+c2Vla29mZiAo MCwgaW9zOjpjdXIpID09IDApOw0KLQ0KLQkgIHNhdmVfdmFycyAoYXJndiwg aSwgYXJnYywgZmlsZSwgc2F2ZV9idWlsdGlucywgZm9ybWF0LA0KLQkJICAg ICBzYXZlX2FzX2Zsb2F0cywgd3JpdGVfaGVhZGVyX2luZm8pOw0KKyNpZmRl ZiBIQVZFX0hERjUNCisgICAgICBpZiAoZm9ybWF0ID09IExTX0hERjUpIHsN CisgICAgICAgIGhkZjVfb2ZzdHJlYW0gaGRmNV9maWxlIChmbmFtZS5jX3N0 ciAoKSk7DQorCWlmIChoZGY1X2ZpbGUuZmlsZV9pZCA+PSAwKSB7DQorCSAg c2F2ZV92YXJzIChhcmd2LCBpLCBhcmdjLCBoZGY1X2ZpbGUsIHNhdmVfYnVp bHRpbnMsIGZvcm1hdCwNCisJCSAgICAgc2F2ZV9hc19mbG9hdHMsIHRydWUp Ow0KKwkgIGhkZjVfZmlsZS5jbG9zZSAoKTsNCiAJfQ0KLSAgICAgIGVsc2UN Ci0Jew0KKwllbHNlIHsNCiAJICBlcnJvciAoInNhdmU6IGNvdWxkbid0IG9w ZW4gb3V0cHV0IGZpbGUgYCVzJyIsIGZuYW1lLmNfc3RyICgpKTsNCiAJICBy ZXR1cm4gcmV0dmFsOw0KKwl9DQorICAgICAgfQ0KKyAgICAgIGVsc2UNCisj ZW5kaWYgLyogSEFWRV9IREY1ICovDQorCS8vIGRvbid0IGluc2VydCBhbnkg c3RhdGVtZW50cyBoZXJlISAgVGhlIGJyYWNlIGJlbG93IG11c3QgZ28NCisJ Ly8gd2l0aCB0aGUgImVsc2UiIGFib3ZlIQ0KKwl7DQorCSAgb2ZzdHJlYW0g ZmlsZSAoZm5hbWUuY19zdHIgKCksIG1vZGUpOw0KKwkgIA0KKwkgIGlmIChm aWxlKQ0KKwkgICAgew0KKwkgICAgICBib29sIHdyaXRlX2hlYWRlcl9pbmZv DQorCQk9ICggKGZpbGUucmRidWYgKCkpLT5zZWVrb2ZmICgwLCBpb3M6OmN1 cikgPT0gMCk7DQorCSAgICAgIA0KKwkgICAgICBzYXZlX3ZhcnMgKGFyZ3Ys IGksIGFyZ2MsIGZpbGUsIHNhdmVfYnVpbHRpbnMsIGZvcm1hdCwNCisJCQkg c2F2ZV9hc19mbG9hdHMsIHdyaXRlX2hlYWRlcl9pbmZvKTsNCisJICAgIH0N CisJICBlbHNlDQorCSAgICB7DQorCSAgICAgIGVycm9yICgic2F2ZTogY291 bGRuJ3Qgb3BlbiBvdXRwdXQgZmlsZSBgJXMnIiwgZm5hbWUuY19zdHIgKCkp Ow0KKwkgICAgICByZXR1cm4gcmV0dmFsOw0KKwkgICAgfQ0KIAl9DQogICAg IH0NCiANCg== --1041390082-413262111-948956765=:27833--